Browse Source

add:定时任务超时未支付取消订单

ct 4 days ago
parent
commit
7de5241bfe

+ 89 - 1
fs-admin/src/main/java/com/fs/his/task/Task.java

@@ -21,6 +21,7 @@ import com.fs.company.vo.RedPacketMoneyVO;
 import com.fs.course.dto.BatchSendCourseAllDTO;
 import com.fs.course.mapper.FsCourseRedPacketLogMapper;
 import com.fs.course.service.IFsCourseWatchLogService;
+import com.fs.course.service.IFsUserCourseOrderService;
 import com.fs.course.service.ITencentCloudCosService;
 import com.fs.erp.domain.ErpDeliverys;
 import com.fs.erp.domain.ErpOrder;
@@ -49,6 +50,7 @@ import com.fs.his.enums.FsStoreOrderLogEnum;
 import com.fs.his.enums.FsStoreOrderStatusEnum;
 import com.fs.his.mapper.*;
 import com.fs.his.param.FsInquiryOrderFinishParam;
+import com.fs.his.param.FsPackageOrderCancelParam;
 import com.fs.his.service.*;
 import com.fs.his.service.impl.FsPackageOrderServiceImpl;
 import com.fs.his.utils.ConfigUtil;
@@ -65,6 +67,7 @@ import com.fs.sop.domain.QwSopTempVoice;
 import com.fs.sop.service.IQwSopTempVoiceService;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
+import com.fs.system.service.ISysConfigService;
 import com.google.gson.Gson;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -73,12 +76,14 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Component;
 
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
+import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -140,7 +145,7 @@ public class Task {
     @Autowired
     private CompanyVoiceLogsMapper companyVoiceLogsMapper;
     @Autowired
-    FsPackageOrderServiceImpl packageOrderService;
+    IFsPackageOrderService packageOrderService;
     @Autowired
     private IFsStoreOrderLogsService fsStoreOrderLogsService;
     org.slf4j.Logger logger = LoggerFactory.getLogger(getClass());
@@ -200,6 +205,14 @@ public class Task {
     @Autowired
     private IFsStorePaymentService fsStorePaymentService;
 
+    @Autowired
+    private IFsStoreOrderService orderService;
+    @Autowired
+    private ISysConfigService sysConfigService;
+
+    @Autowired
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+
     /**
      * sop任务token消耗统计
      */
@@ -1538,5 +1551,80 @@ public class Task {
         fsStorePaymentService.synchronizePayStatus();
     }
 
+    /**
+     * 超时取消订单
+     */
+    public void cancelOrder(){
+        //查询超时订单
+        SysConfig sysConfig= sysConfigService.selectConfigByConfigKey("his.store");
+        StoreConfig config= JSONUtil.toBean(sysConfig.getConfigValue(),StoreConfig.class);
+        Integer unPayTime = config.getUnPayTime(); //分钟
+        if (unPayTime == null){
+            return ;
+        }
+        //1.处方订单
+        //查询超时未支付订单
+        List<FsStoreOrder> orderList = orderService.selectOutTimeOrderList(unPayTime);
+        //取消订单
+        List<CompletableFuture<Void>> orderFutures = cancelOrdersAsync(orderList, order -> {
+            orderService.cancelOrder(order.getOrderId());
+        });
+
+//        //2.课程订单
+//        //查询超时未支付订单
+//        List<FsUserCourseOrder> courseOrderlist = userCourseOrderService.selectOutTimeOrderList(unPayTime);
+//        //取消订单
+//        courseOrderlist.forEach(order->{
+//            userCourseOrderService.cancelOrder(order.getOrderId());
+//        });
+        //3.服务包订单
+        //查询超时未支付订单
+        List<FsPackageOrder> packageOrderList = packageOrderService.selectOutTimeOrderList(unPayTime);
+        //取消订单
+        List<CompletableFuture<Void>> packageOrderFutures = cancelOrdersAsync(packageOrderList, order -> {
+            FsPackageOrderCancelParam param = new FsPackageOrderCancelParam();
+            param.setOrderId(order.getOrderId());
+            packageOrderService.cancel(param);
+        });
+
+        // 等待所有任务完成
+        waitForAllTasksToComplete(orderFutures);
+        waitForAllTasksToComplete(packageOrderFutures);
+    }
+
+    /**
+     * 异步取消订单
+     * @param orders 订单列表
+     * @param cancelAction 取消订单的逻辑
+     * @param <T> 订单类型
+     * @return CompletableFuture列表
+     */
+    private <T> List<CompletableFuture<Void>> cancelOrdersAsync(List<T> orders, Consumer<T> cancelAction) {
+        List<CompletableFuture<Void>> futures = new ArrayList<>();
+        for (T order : orders) {
+            CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
+                try {
+                    cancelAction.accept(order);
+                } catch (Exception e) {
+                    // 记录异常日志
+                    System.err.println("Failed to cancel order: " + order + ", Error: " + e.getMessage());
+                }
+            }, threadPoolTaskExecutor);
+            futures.add(future);
+        }
+        return futures;
+    }
+
+    /**
+     * 等待所有任务完成
+     * @param futures CompletableFuture列表
+     */
+    private void waitForAllTasksToComplete(List<CompletableFuture<Void>> futures) {
+        CompletableFuture<Void> allFutures = CompletableFuture.allOf(
+                futures.toArray(new CompletableFuture[0])
+        );
+        allFutures.join(); // 等待所有任务完成
+    }
+
 
 }

+ 2 - 0
fs-service/src/main/java/com/fs/his/mapper/FsPackageOrderMapper.java

@@ -239,4 +239,6 @@ public interface FsPackageOrderMapper
     FsPackage selectFsPackageByOrderId(Long packageOrderId);
 
     List<PackageOrderDTO> getNewOrder();
+
+    List<FsPackageOrder> selectOutTimeOrderList(@Param("unPayTime") Integer unPayTime);
 }

+ 2 - 0
fs-service/src/main/java/com/fs/his/mapper/FsStoreOrderMapper.java

@@ -1194,4 +1194,6 @@ public interface FsStoreOrderMapper
     List<Report> selectOrderByCustomerIds(@Param("map") ReportParam param);
 
     FsStoreOrderAmountStatsVo selectFsStoreOrderAmountStats(FsStoreOrderAmountStatsQueryDto queryDto);
+
+    List<FsStoreOrder> selectOutTimeOrderList(@Param("unPayTime")Integer unPayTime);
 }

+ 2 - 0
fs-service/src/main/java/com/fs/his/service/IFsPackageOrderService.java

@@ -142,4 +142,6 @@ public interface IFsPackageOrderService
 
 
     R getPackageOrder(String createOrderKey);
+
+    List<FsPackageOrder> selectOutTimeOrderList(Integer unPayTime);
 }

+ 2 - 0
fs-service/src/main/java/com/fs/his/service/IFsStoreOrderService.java

@@ -276,4 +276,6 @@ public interface IFsStoreOrderService
     FsStoreOrderScrm selectFsStoreOrderScrmByOrderCode(String soId);
 
     FsStoreOrder confirmOrder(FsPackageOrder packageOrder,Long doctorId);
+
+    List<FsStoreOrder> selectOutTimeOrderList(Integer unPayTime);
 }

+ 7 - 2
fs-service/src/main/java/com/fs/his/service/impl/FsPackageOrderServiceImpl.java

@@ -358,7 +358,7 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
         if (param.getUserCouponId() != null && param.getUserCouponId() > 0l) {
             FsUserCoupon userCoupon = userCouponService.selectFsUserCouponById(param.getUserCouponId());
             if (userCoupon != null) {
-                if (userCoupon.getStatus() == 0) {
+                if (Objects.equals(userCoupon.getBusinessId(), param.getOrderId()) || userCoupon.getStatus() == 0) {
                     FsCoupon coupon = couponService.selectFsCouponByCouponId(userCoupon.getCouponId());
                     if (coupon.getCouponType().equals(1)) {
                         if (coupon.getMinPrice().compareTo(orderPrice) <=0) {
@@ -500,7 +500,7 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
         FsPatient patient=null;
         FsDoctor doctor=null;
         FsPackage fsPackage=fsPackageMapper.selectFsPackageByPackageId(param.getPackageId());
-        if(fsPackage.getProductType()==1 || fsPackage.getProductType()==2){
+        if(fsPackage.getProductType()!= null &&(fsPackage.getProductType()==1 || fsPackage.getProductType()==2)){
             if(param.getPatientId()!=null){
                 patient=fsPatientMapper.selectFsPatientByPatientId(param.getPatientId());
                 if (patient==null){
@@ -1830,4 +1830,9 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
         }
         return R.ok().put("package", fsPackage).put("money", money).put("payType", payType);
     }
+
+    @Override
+    public List<FsPackageOrder> selectOutTimeOrderList(Integer unPayTime) {
+        return fsPackageOrderMapper.selectOutTimeOrderList(unPayTime);
+    }
 }

+ 5 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsStoreOrderServiceImpl.java

@@ -4407,4 +4407,9 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
         return order;
     }
 
+    @Override
+    public List<FsStoreOrder> selectOutTimeOrderList(Integer unPayTime) {
+        return fsStoreOrderMapper.selectOutTimeOrderList(unPayTime);
+    }
+
 }

+ 3 - 0
fs-service/src/main/resources/mapper/his/FsPackageOrderMapper.xml

@@ -317,4 +317,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             LEFT JOIN fs_package P ON O.package_id = P.package_id
         where O.is_pay = 1 ORDER BY RAND() desc LIMIT 20
     </select>
+    <select id="selectOutTimeOrderList" resultType="com.fs.his.domain.FsPackageOrder">
+        select * from fs_package_order  where status = 1 AND NOW() &gt; DATE_ADD(create_time, INTERVAL ${unPayTime} MINUTE)
+    </select>
 </mapper>

+ 4 - 0
fs-service/src/main/resources/mapper/his/FsStoreOrderMapper.xml

@@ -2133,5 +2133,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             AND company_user_id = #{companyUserId}
         </if>
     </select>
+    <select id="selectOutTimeOrderList" resultType="com.fs.his.domain.FsStoreOrder">
+        <include refid="selectFsStoreOrderVo"/>
+        where is_del = 0 and status = 1 and NOW() &gt; DATE_ADD(create_time, INTERVAL ${unPayTime} MINUTE)
+    </select>
 
 </mapper>