Parcourir la source

feat(order):优化订单过期自动退款逻辑

- 修改订单查询条件,使用订单编号替代ID以提高准确性
- 新增订单过期自动退款功能,调用退款接口处理超时订单
- 更新退款表单类型注释,增加系统自动退款选项
- 完善微信支付服务中的退款类型判断逻辑
- 调整定时任务执行年份获取方式,确保数据时效性
-修复AppSiteMapper中手机号字段映射错误问题
- 强化商户支付配置校验,防止因缺少mch_id导致交易异常
wzq il y a 5 jours
Parent
commit
3445b81427

+ 1 - 1
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/form/RefundOrderForm.java

@@ -29,7 +29,7 @@ public class RefundOrderForm implements Serializable {
     private String reason = "无";
 
     /**
-     * 退款类型:1-买家申请 2-商家申请
+     * 退款类型:1-买家申请 2-商家申请 3-系统自动退款
      */
     private Integer type;
 }

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

@@ -462,7 +462,7 @@ public class WeChatPayService {
         String out_refund_no = generateOrderNumber(1);
         // 创建退款订单
         AppOrderRefundsInfo appOrderRefundsInfo = new AppOrderRefundsInfo();
-        if (type == 1){
+        if (type == 1 || type == 3){
             appOrderRefundsInfo.setOrderId(appOrder.getId());
             //项目只有单商品退款
             appOrderRefundsInfo.setOrderProInfoId(appOrderProInfoList.get(0).getId());

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

@@ -1308,7 +1308,7 @@ public class OrderServiceImpl extends ServiceImpl<AppOrderMapper, AppOrder> impl
 //            redissonDelayQueue.offerTask(task, 60 * 16);
 
             //发送延迟消息
-            delayedMessageService.sendOrderMessage(appOrder.getId());
+            delayedMessageService.sendOrderMessage(appOrder.getOrderCode());
         }
         return payForm;
     }
@@ -1459,7 +1459,7 @@ public class OrderServiceImpl extends ServiceImpl<AppOrderMapper, AppOrder> impl
             Map<String, String> result = payment(order.getId(),userOpenId);
             payForm.setParams(result);
             //发送延迟消息
-            delayedMessageService.sendOrderMessage(order.getId());
+            delayedMessageService.sendOrderMessage(order.getOrderCode());
         }
         return payForm;
     }
@@ -1496,6 +1496,10 @@ public class OrderServiceImpl extends ServiceImpl<AppOrderMapper, AppOrder> impl
         //查询商户信息
         String orgCode = appOrder.getOrgCode();
         SysDepart depart = sysDepartMapper.selectOne(Wrappers.lambdaQuery(SysDepart.class).eq(SysDepart::getOrgCode, orgCode).last("limit 1"));
+        String subMchId = depart.getMchId();
+        if(StrUtil.isBlank(subMchId)){
+            throw new JeecgBootException("商户未进行支付配置!请联系管理员");
+        }
         if (Objects.equals(appOrder.getOrderStatus(), CommonConstant.ORDER_STATUS_4)) {
             throw new JeecgBootException("当前订单已过期,请重新下单!");
         }
@@ -1509,7 +1513,7 @@ public class OrderServiceImpl extends ServiceImpl<AppOrderMapper, AppOrder> impl
         params.put("sp_appid", WechatConstants.WECHAT_SP_APPID); //服务商appid
         params.put("sp_mchid", WechatConstants.WECHAT_SP_MCH_ID);//服务商商户号
         params.put("sub_appid", WechatConstants.WECHAT_SUB_APPID); //小程序appid
-        params.put("sub_mchid", depart.getMchId()); //特约商户商户号
+        params.put("sub_mchid", subMchId); //特约商户商户号
 
         params.put("description", "全龄运动"); //商品描述
         params.put("out_trade_no", appOrder.getOrderCode()); //商户订单号

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

@@ -72,8 +72,8 @@ public class OrTeachingJobService {
     @Transactional(rollbackFor = Exception.class)
     public void execute() throws ParseException {
         log.info("开始执行定时任务");
-//        int year = DateUtils.getYear();
-        int year = 2024;
+        int year = DateUtils.getYear();
+//        int year = 2024;
         Map<String, List<String>> HolidayMap = HolidayUtil.getYearHoliday(String.valueOf(year));
         // 设置开始日期和结束日期
         Date beginDate = DateUtils.str2Date((year + 1) + "-01-01 00:00:00", new SimpleDateFormat("yyyy-MM-dd"));

+ 7 - 6
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/rabbitmq/DelayedMessageListener.java

@@ -52,18 +52,19 @@ public class DelayedMessageListener {
         }
     }
 
-    private void orderProcessMessage(String orderId) {
+    private void orderProcessMessage(String orderCode) {
         // 业务处理
-        log.info("处理订单消息:{}",orderId);
+        log.info("处理订单消息:{}",orderCode);
 
-        AppOrder appOrder = appOrderService.getById(orderId);
+        AppOrder appOrder = appOrderService.getOne(Wrappers.<AppOrder>lambdaQuery().eq(AppOrder::getOrderCode, orderCode).last("limit 1"));
         if(ObjectUtil.isNotEmpty(appOrder)){
-            if (Objects.equals(appOrder.getOrderStatus(), CommonConstant.ORDER_STATUS_0) && appOrder.getRevision() == 0) {
-                log.info("修改订单:{},支付状态为已取消", orderId);
+            if (Objects.equals(appOrder.getOrderStatus(), CommonConstant.ORDER_STATUS_0)) {
+                log.info("修改订单:{},支付状态为已取消", orderCode);
                 appOrder.setOrderStatus(CommonConstant.ORDER_STATUS_4);
                 appOrderService.updateById(appOrder);
                 //修改子订单状态
-                List<AppOrderProInfo> appOrderProInfoList = appOrderProInfoService.list(Wrappers.<AppOrderProInfo>lambdaQuery().eq(AppOrderProInfo::getOrderId, orderId));
+                List<AppOrderProInfo> appOrderProInfoList =
+                        appOrderProInfoService.list(Wrappers.<AppOrderProInfo>lambdaQuery().eq(AppOrderProInfo::getOrderId, appOrder.getId()));
                 if (CollUtil.isNotEmpty(appOrderProInfoList)){
                     for (AppOrderProInfo appOrderProInfo : appOrderProInfoList) {
                         appOrderProInfo.setOrderStatus(CommonConstant.ORDER_STATUS_4);

+ 17 - 2
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/rabbitmq/OrderExpireDelayedMessageListener.java

@@ -8,6 +8,8 @@ import com.rabbitmq.client.Channel;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.modules.app.form.RefundOrderForm;
+import org.jeecg.modules.app.service.IOrderService;
 import org.jeecg.modules.system.app.entity.AppOrder;
 import org.jeecg.modules.system.app.entity.AppOrderProInfo;
 import org.jeecg.modules.system.app.service.IAppOrderProInfoService;
@@ -17,6 +19,7 @@ import org.springframework.amqp.rabbit.annotation.RabbitListener;
 import org.springframework.stereotype.Component;
 
 import java.io.IOException;
+import java.text.ParseException;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
@@ -27,7 +30,7 @@ import java.util.stream.Collectors;
 @AllArgsConstructor
 public class OrderExpireDelayedMessageListener {
 
-    private final IAppOrderService appOrderService;
+    private final IOrderService appOrderService;
     private final IAppOrderProInfoService appOrderProInfoService;
 
     /**
@@ -54,7 +57,7 @@ public class OrderExpireDelayedMessageListener {
         }
     }
 
-    private void orderExpireMessage(String proOrderInfoId) {
+    private void orderExpireMessage(String proOrderInfoId) throws ParseException {
         // 业务处理
         log.info("处理订单消息:{}", proOrderInfoId);
 
@@ -67,6 +70,18 @@ public class OrderExpireDelayedMessageListener {
 
         if (ObjectUtil.isNotEmpty(appOrderProInfo)){
             if (Objects.equals(appOrderProInfo.getOrderStatus(), CommonConstant.ORDER_STATUS_1)) {
+
+                try {
+                    //过期退款
+                    RefundOrderForm refundOrderForm = new RefundOrderForm();
+                    refundOrderForm.setOrderCode(appOrderProInfo.getOrderCode());
+                    refundOrderForm.setOrderProInfoIds(appOrderProInfo.getId());
+                    refundOrderForm.setType(CommonConstant.NUMBER_3);
+                    refundOrderForm.setReason("订单已过期,自动退款!");
+                    appOrderService.refundOrder(refundOrderForm);
+                }catch (Exception e){
+                    log.error("修改子订单:{},支付状态为已过期,自动退款失败:{}", appOrderProInfo.getId(),e.getMessage());
+                }
                 log.info("修改子订单:{},支付状态为已过期", appOrderProInfo.getId());
                 appOrderProInfo.setOrderStatus(CommonConstant.ORDER_STATUS_3);
                 appOrderProInfoService.updateById(appOrderProInfo);

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

@@ -82,7 +82,8 @@
             a.no_teaching_day,
             a.start_time,
             a.end_time,
-            b.mobile AS phone,
+            a.phone,
+--             b.mobile AS phone,
             a.video,
             a.longitude,
             a.latitude,