Переглянути джерело

feat(order): 添加赛事订单退款功能并优化退款逻辑- 在 AppOrderMapper.xml 中添加 order_status 字段查询- 在 IOrderService 接口中新增 gameRefundOrder 方法
- 在 OrderController 中添加赛事订单退款接口 /gameRefundOrder
- 优化退款回调逻辑,排除特定类型子订单的处理
- 在 OrderPageVO 中添加订单状态字段及序列化支持
- 实现 gameRefundOrder 退款逻辑,区分保险支付金额
- 调整定时任务 TodayExpireOrderJobService 的执行时间- 在 WeChatPayService 中完善不同类型退款处理逻辑- 增加空值判断,避免退款时出现空指针异常

wzq 4 днів тому
батько
коміт
74b72ab94f

+ 18 - 3
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/controller/OrderController.java

@@ -241,6 +241,19 @@ public class OrderController {
         return Result.OK(appOrderService.refundOrder(refundOrderForm));
     }
 
+
+    /**
+     * 赛事订单退款
+     * @param orderCode
+     * @param reason
+     * @return
+     */
+    @Operation(summary = "赛事订单退款")
+    @GetMapping("/gameRefundOrder")
+    public Result<String> gameRefundOrder(@RequestParam(name = "orderCode", required = true) String orderCode,@RequestParam(name = "reason", required = true) String reason) {
+        return Result.OK(appOrderService.gameRefundOrder(orderCode, reason));
+    }
+
     /**
      * 订单退款回调
      *
@@ -272,8 +285,10 @@ public class OrderController {
                 AppOrder appOrder = appOrderService.getOne(Wrappers.lambdaQuery(AppOrder.class).eq(AppOrder::getOrderCode, refundData.getOrderNo()));
                 appOrder.setOrderStatus(CommonConstant.ORDER_STATUS_6).setAfterSaleStatus(CommonConstant.NUMBER_2);
                 appOrderService.updateById(appOrder);
-                List<AppOrderProInfo> orderProInfoList = appOrderProInfoService.list(Wrappers.<AppOrderProInfo>lambdaQuery().eq(AppOrderProInfo::getOrderId,
-                        appOrder.getId()));
+                List<AppOrderProInfo> orderProInfoList = appOrderProInfoService.list(Wrappers.<AppOrderProInfo>lambdaQuery()
+                        .eq(AppOrderProInfo::getOrderId, appOrder.getId())
+                        .ne(AppOrderProInfo::getType, CommonConstant.ORDER_PRO_INFO_TYPE_6)
+                );
 
                 for (AppOrderProInfo appOrderProInfo : orderProInfoList) {
                     appOrderProInfo.setOrderStatus(CommonConstant.ORDER_STATUS_6).setAfterSaleStatus(CommonConstant.NUMBER_2);
@@ -294,7 +309,7 @@ public class OrderController {
                 appOrder.setOrderStatus(CommonConstant.ORDER_STATUS_6).setAfterSaleStatus(CommonConstant.NUMBER_2);
                 appOrderService.updateById(appOrder);
 
-                List<AppOrderProInfo> orderProInfoList = appOrderProInfoService.list(Wrappers.<AppOrderProInfo>lambdaQuery().eq(AppOrderProInfo::getOrderId,
+                List<AppOrderProInfo> orderProInfoList = appOrderProInfoService.list(Wrappers.<AppOrderProInfo>lambdaQuery().ne(AppOrderProInfo::getType, CommonConstant.ORDER_PRO_INFO_TYPE_6).eq(AppOrderProInfo::getOrderId,
                         appOrder.getId()));
 
                 for (AppOrderProInfo appOrderProInfo : orderProInfoList) {

+ 2 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/IOrderService.java

@@ -98,6 +98,8 @@ public interface IOrderService extends IService<AppOrder>{
 
     String refundOrder(RefundOrderForm refundOrderForm);
 
+    String gameRefundOrder(String orderCode,String reason);
+
     Map<String, String> wechatPayNotify(HttpServletRequest request, HttpServletResponse response);
 
     UserPayForm payOrder(String appOrderId);

+ 48 - 32
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/WeChatPayService.java

@@ -441,16 +441,29 @@ public class WeChatPayService {
         String out_refund_no = generateOrderNumber(1);
         // 创建退款订单
         AppOrderRefundsInfo appOrderRefundsInfo = new AppOrderRefundsInfo();
-        appOrderRefundsInfo.setOrderId(appOrder.getId());
-        //项目只有单商品退款
-        appOrderRefundsInfo.setOrderProInfoId(appOrderProInfoList.get(0).getId());
-        appOrderRefundsInfo.setOrderCode(appOrder.getOrderCode());
-        appOrderRefundsInfo.setOutRefundNo(out_refund_no);
-        appOrderRefundsInfo.setTransactionId(appOrder.getTransactionId());
-        appOrderRefundsInfo.setReason(reason);
-        appOrderRefundsInfo.setAmount(refundAmount);
-        appOrderRefundsInfo.setType(type);
-        appOrderRefundsInfo.setCreateTime(new Date());
+        if (type == 1){
+            appOrderRefundsInfo.setOrderId(appOrder.getId());
+            //项目只有单商品退款
+            appOrderRefundsInfo.setOrderProInfoId(appOrderProInfoList.get(0).getId());
+            appOrderRefundsInfo.setOrderCode(appOrder.getOrderCode());
+            appOrderRefundsInfo.setOutRefundNo(out_refund_no);
+            appOrderRefundsInfo.setTransactionId(appOrder.getTransactionId());
+            appOrderRefundsInfo.setReason(reason);
+            appOrderRefundsInfo.setAmount(refundAmount);
+            appOrderRefundsInfo.setType(type);
+            appOrderRefundsInfo.setCreateTime(new Date());
+        }
+        if (type == 2){
+            appOrderRefundsInfo.setOrderId(appOrder.getId());
+            //项目只有单商品退款
+            appOrderRefundsInfo.setOrderCode(appOrder.getOrderCode());
+            appOrderRefundsInfo.setOutRefundNo(out_refund_no);
+            appOrderRefundsInfo.setTransactionId(appOrder.getTransactionId());
+            appOrderRefundsInfo.setReason(reason);
+            appOrderRefundsInfo.setAmount(refundAmount);
+            appOrderRefundsInfo.setType(type);
+            appOrderRefundsInfo.setCreateTime(new Date());
+        }
 
         JSONObject params = new JSONObject();
         params.put("sub_mchid", depart.getMchId());
@@ -477,10 +490,12 @@ public class WeChatPayService {
                 appOrder.setAfterSaleStatus(CommonConstant.NUMBER_1);
                 appOrder.setRefundType(CommonConstant.NUMBER_2);
                 appOrderMapper.updateById(appOrder);
-                for (AppOrderProInfo appOrderProInfo : appOrderProInfoList) {
-                    appOrderProInfo.setOrderStatus(CommonConstant.ORDER_STATUS_6);
-                    appOrderProInfo.setAfterSaleStatus(CommonConstant.NUMBER_2);
-                    appOrderProInfoMapper.updateById(appOrderProInfo);
+                if (ObjectUtil.isNotEmpty(appOrderProInfoList)){
+                    for (AppOrderProInfo appOrderProInfo : appOrderProInfoList) {
+                        appOrderProInfo.setOrderStatus(CommonConstant.ORDER_STATUS_6);
+                        appOrderProInfo.setAfterSaleStatus(CommonConstant.NUMBER_2);
+                        appOrderProInfoMapper.updateById(appOrderProInfo);
+                    }
                 }
                 break;
             case "CLOSED":
@@ -492,25 +507,26 @@ public class WeChatPayService {
                 appOrder.setAfterSaleStatus(CommonConstant.NUMBER_1);
                 appOrder.setRefundType(CommonConstant.NUMBER_2);
                 appOrderMapper.updateById(appOrder);
-                for (AppOrderProInfo appOrderProInfo : appOrderProInfoList) {
-                    appOrderProInfo.setOrderStatus(CommonConstant.ORDER_STATUS_5);
-                    appOrderProInfo.setAfterSaleStatus(CommonConstant.NUMBER_1);
-                    appOrderProInfoMapper.updateById(appOrderProInfo);
-                }
-
-                List<AppOrderProInfo> orderProInfoList =
-                        appOrderProInfoMapper.selectList(Wrappers.<AppOrderProInfo>lambdaQuery().eq(AppOrderProInfo::getOrderId, appOrder.getId()));
-                boolean isAllRefund = true;
-                for (AppOrderProInfo appOrderProInfo : orderProInfoList) {
-                    if (appOrderProInfo.getAfterSaleStatus() != 1) {
-                        isAllRefund = false;
-                        break;
+                if (ObjectUtil.isNotEmpty(appOrderProInfoList)){
+                    for (AppOrderProInfo appOrderProInfo : appOrderProInfoList) {
+                        appOrderProInfo.setOrderStatus(CommonConstant.ORDER_STATUS_5);
+                        appOrderProInfo.setAfterSaleStatus(CommonConstant.NUMBER_1);
+                        appOrderProInfoMapper.updateById(appOrderProInfo);
+                    }
+                    List<AppOrderProInfo> orderProInfoList =
+                            appOrderProInfoMapper.selectList(Wrappers.<AppOrderProInfo>lambdaQuery().eq(AppOrderProInfo::getOrderId, appOrder.getId()));
+                    boolean isAllRefund = true;
+                    for (AppOrderProInfo appOrderProInfo : orderProInfoList) {
+                        if (appOrderProInfo.getAfterSaleStatus() != 1) {
+                            isAllRefund = false;
+                            break;
+                        }
+                    }
+                    if (isAllRefund) {
+                        log.info("修改订单:{},支付状态为退款中", appOrder.getOrderCode());
+                        appOrder.setOrderStatus(CommonConstant.ORDER_STATUS_5);
+                        appOrderMapper.updateById(appOrder);
                     }
-                }
-                if (isAllRefund) {
-                    log.info("修改订单:{},支付状态为退款中", appOrder.getOrderCode());
-                    appOrder.setOrderStatus(CommonConstant.ORDER_STATUS_5);
-                    appOrderMapper.updateById(appOrder);
                 }
                 break;
             case "ABNORMAL":

+ 33 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/impl/OrderServiceImpl.java

@@ -1906,6 +1906,39 @@ public class OrderServiceImpl extends ServiceImpl<AppOrderMapper, AppOrder> impl
         return "申请成功,预计在3个工作日内处理!";
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String gameRefundOrder(String orderCode,String reason){
+        AppOrder appOrder = appOrderMapper.selectOne(Wrappers.<AppOrder>lambdaQuery().eq(AppOrder::getOrderCode, orderCode).last("limit 1"));
+
+        //保险支付金额
+        BigDecimal payAmount = BigDecimal.ZERO;
+        //退款金额
+        BigDecimal refundAmount = BigDecimal.ZERO;
+
+        List<AppOrderProInfo> appOrderProInfoList = appOrderProInfoMapper.selectList(Wrappers.<AppOrderProInfo>lambdaQuery()
+                .eq(AppOrderProInfo::getOrderId, appOrder.getId())
+                .eq(AppOrderProInfo::getType, CommonConstant.ORDER_PRO_INFO_TYPE_6)
+        );
+
+        if (ObjectUtil.isNotEmpty(appOrder)) {
+            if (appOrder.getProfitSharingStatus() > CommonConstant.NUMBER_0) {
+                throw new JeecgBootException("当前订单无法进行退款,请联系客服处理!");
+            }
+
+            //不进行退款金额统计(保险的子订单)
+            for (AppOrderProInfo appOrderProInfo : appOrderProInfoList) {
+                payAmount = payAmount.add(appOrderProInfo.getPrice());
+            }
+
+            refundAmount = appOrder.getPrice().subtract(payAmount);
+        }
+        //调用退款逻辑
+        weChatPayService.refundOrder(appOrder,null,refundAmount, reason,2);
+
+        return "申请成功,预计在3个工作日内处理!";
+    }
+
     /**
      * 支付回调
      * @param request

+ 1 - 2
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/quartz/job/TodayExpireOrderJobService.java

@@ -41,8 +41,7 @@ public class TodayExpireOrderJobService {
     /**
      * @Description 统计24小时内即将过期的订单,并发送过期订单延迟消息
      */
-//    @Scheduled(cron = "0 09 10 * * ?")
-    @Scheduled(fixedDelay = 60000)
+    @Scheduled(cron = "0 0 4 * * ?")
     @Transactional(rollbackFor = Exception.class)
     public void execute() {
         log.info("开始执行统计24小时内即将过期的订单,并发送过期订单延迟消息定时任务");

+ 1 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/xml/AppOrderMapper.xml

@@ -15,6 +15,7 @@
         o.amount,
         o.price,
         o.org_code,
+        o.order_status,
         GROUP_CONCAT( DISTINCT opi.user_phone ) userPhone
         FROM
         nm_order o

+ 5 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/vo/OrderPageVO.java

@@ -10,6 +10,7 @@ import lombok.experimental.Accessors;
 import org.jeecg.modules.system.app.entity.AppOrderProInfo;
 import org.springframework.format.annotation.DateTimeFormat;
 
+import java.io.Serial;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
@@ -22,6 +23,7 @@ import java.util.List;
 @NoArgsConstructor
 @Schema(description="订单分页列表响应对象")
 public class OrderPageVO implements Serializable {
+    @Serial
     private static final long serialVersionUID = 1L;
 
     @Schema(description = "ID")
@@ -33,6 +35,9 @@ public class OrderPageVO implements Serializable {
     @Schema(description = "平台名称")
     private Integer orderType;
 
+    @Schema(description = "订单状态 0-待付款 1-待使用 2-已使用 3-已到期 4-已取消 5-退款中 6已退款")
+    private Integer orderStatus;
+
     @JsonFormat(timezone = "GMT+8",shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
     @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
     @Schema(description = "创建时间")