ソースを参照

扣除车票时长;将退款余额退金额

zoujiajian 2 年 前
コミット
ca0736afd6

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/RefundOrderDon.java

@@ -52,4 +52,10 @@ public class RefundOrderDon extends BaseEntity{
 	 * 退款方式
 	 */
 	private String refundMethod;
+
+	/**
+	 * 是否清空余额退款
+	 * 默认false
+	 */
+	private Boolean isClearBalance;
 }

+ 25 - 0
netflix-dao/src/main/java/com/cyksj/model/request/OrderBalanceRefundReq.java

@@ -0,0 +1,25 @@
+package com.cyksj.model.request;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: OrderBalanceRefundReq
+ * 创建者: JavaZou
+ * 创建时间:2023/11/29 14:05
+ */
+@Getter
+@Setter
+public class OrderBalanceRefundReq {
+	@NotNull(message = "退款订单id不为空")
+	private Long refundOrderId;
+
+	/**
+	 * 退款金额
+	 */
+	private BigDecimal refundMoney;
+}

+ 0 - 2
netflix-dao/src/main/java/com/cyksj/model/request/RenewTimeUpReq.java

@@ -3,7 +3,6 @@ package com.cyksj.model.request;
 import lombok.Getter;
 import lombok.Setter;
 
-import javax.validation.constraints.Min;
 import javax.validation.constraints.NotNull;
 
 /*
@@ -25,7 +24,6 @@ public class RenewTimeUpReq {
 	 * 增加天数
 	 */
 	@NotNull(message = "天数不为空")
-	@Min(value = 1)
 	private Integer days;
 
 	/**

+ 3 - 0
netflix-service/src/main/java/com/cyksj/service/mange/CmsOrderDonService.java

@@ -6,6 +6,7 @@ import com.cyksj.model.excel.ExcelOrderDonInfo;
 import com.cyksj.model.manage.request.ReqSetLogisticsPost;
 import com.cyksj.model.request.ChangeRelationReq;
 import com.cyksj.model.request.ClickOutReq;
+import com.cyksj.model.request.OrderBalanceRefundReq;
 import com.cyksj.model.request.OrderRefundReq;
 
 import java.math.BigDecimal;
@@ -54,4 +55,6 @@ public interface CmsOrderDonService extends IService<OrderDon> {
 	 * @param orderRefundReq
 	 */
 	void refundPriceDiffer(OrderRefundReq orderRefundReq) throws Exception;
+
+	void clearBalanceToRefundMoney(OrderBalanceRefundReq refundReq) throws Exception;
 }

+ 53 - 0
netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java

@@ -41,6 +41,7 @@ import com.cyksj.model.manage.request.ReqSetLogisticsPost;
 import com.cyksj.model.manage.views.GroupsRelationView;
 import com.cyksj.model.request.ChangeRelationReq;
 import com.cyksj.model.request.ClickOutReq;
+import com.cyksj.model.request.OrderBalanceRefundReq;
 import com.cyksj.model.request.OrderRefundReq;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.coupon.CouponFontService;
@@ -165,6 +166,7 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
 
     private final GroupRelationFrontService groupRelationFrontService;
 
+    private final UserMapper userMapper;
     private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance();
 
     @Override
@@ -985,6 +987,57 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
         orderDonMapper.updateById(orderDon);
     }
 
+    @Override
+    public void clearBalanceToRefundMoney(OrderBalanceRefundReq refundReq) throws Exception {
+        Long refundOrderId = refundReq.getRefundOrderId();
+        BigDecimal refundMoney = refundReq.getRefundMoney();
+        RefundOrderDon refundOrderDon = refundOrderDonMapper.selectById(refundOrderId);
+        if (!"balance".equals(refundOrderDon.getRefundMethod())) {
+            throw BusinessRuntimeException.getInstance("该记录不是余额退款类型");
+        }
+        Long orderId = refundOrderDon.getOrderId();
+        OrderDon orderDon = orderDonMapper.selectById(orderId);
+        if (orderDon.getMoney().compareTo(BigDecimal.ZERO) == 0) {
+            throw BusinessRuntimeException.getInstance("该记录对应的订单无实际支付金额");
+        }
+        BigDecimal refundFee = refundOrderDon.getRefundFee();
+        //默认退全部余额
+        if (refundMoney != null) {
+            refundFee = refundMoney;
+        }
+        BigDecimal money = orderDon.getMoney();
+        //若退款余额 大于退款金额 将退款余额至为 退款金额
+        if (refundFee.compareTo(money) > 0) {
+            refundFee = money;
+        }
+        User user = userMapper.selectById(orderDon.getUserId());
+        if (user.getBalance().compareTo(refundFee) < 0) {
+            throw BusinessRuntimeException.getInstance("用户余额不足,无法扣除对应退款余额");
+        }
+        int update = userMapper.update(null, Wrappers.lambdaUpdate(User.class)
+                .set(User::getBalance, user.getBalance().subtract(refundFee))
+                .eq(User::getId, user.getId())
+                .eq(User::getBalance, user.getBalance()));
+        if (update == 0) {
+            throw BusinessRuntimeException.getInstance("扣除用户退款余额失败,请重试...");
+        }
+        OrderRefundReq orderRefundReq = new OrderRefundReq();
+        orderRefundReq.setOrderId(orderId);
+        orderRefundReq.setRefundMoney(refundFee);
+        orderRefundReq.setRefundType("money");
+
+        String outNo = centerRefund(orderRefundReq, orderDon);
+
+        orderDon.setRefundBalance(orderDon.getRefundBalance().subtract(refundFee));
+        BigDecimal orderRefundMoney = Optional.ofNullable(orderDon.getRefundMoney()).orElse(BigDecimal.ZERO);
+        orderDon.setRefundMoney(orderRefundMoney.add(refundFee));
+        orderDonMapper.updateById(orderDon);
+
+        refundOrderDon.setOutRefundNo(outNo);
+        refundOrderDon.setIsClearBalance(true);
+        refundOrderDonMapper.updateById(refundOrderDon);
+    }
+
     /**
      * 寻找该车队空余车位
      */

+ 9 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java

@@ -675,4 +675,13 @@ public class CmsOrderController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
 
+	/**
+	 * 将余额清零 退款用户支付金额
+	 */
+	@PutMapping("/clear/balance/refundMoney")
+	public Result<String> clearBalanceToRefundMoney(@RequestBody @Validated OrderBalanceRefundReq refundReq) throws Exception {
+		cmsOrderDonService.clearBalanceToRefundMoney(refundReq);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
 }