浏览代码

增加定时任务处理订单收货和完成

baolei 4 月之前
父节点
当前提交
7fe45bcad1

+ 9 - 0
08.src/Xingxi/xingxi-quartz/pom.xml

@@ -34,6 +34,15 @@
             <groupId>com.xingxi</groupId>
             <artifactId>xingxi-common</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.xingxi</groupId>
+            <artifactId>xingxi-system</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>provided</scope>
+        </dependency>
 
     </dependencies>
 

+ 22 - 0
08.src/Xingxi/xingxi-quartz/src/main/java/com/xingxi/quartz/mapper/OrderDeliveryExprTaskVoMapper.java

@@ -0,0 +1,22 @@
+package com.xingxi.quartz.mapper;
+
+import com.xingxi.business.Order.domain.OrderDeliveryExpr;
+import com.xingxi.business.Order.mapper.OrderDeliveryExprMapper;
+
+import java.util.List;
+
+/**
+ * 订单商品快递明细Mapper接口
+ *
+ * @author xingxi
+ * @date 2025-03-06
+ */
+public interface OrderDeliveryExprTaskVoMapper extends OrderDeliveryExprMapper {
+
+    /**
+     * 查询未确认订单商品快递明细列表
+     *
+     * @return 订单商品快递明细集合
+     */
+    List<OrderDeliveryExpr> selectUnConfirmedOrders();
+}

+ 34 - 0
08.src/Xingxi/xingxi-quartz/src/main/java/com/xingxi/quartz/mapper/OrderDetailTaskMapper.java

@@ -0,0 +1,34 @@
+package com.xingxi.quartz.mapper;
+
+import com.xingxi.business.Order.domain.OrderDetail;
+import com.xingxi.business.Order.mapper.OrderDetailMapper;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * 订单明细Mapper接口
+ * 
+ * @author biandan
+ * @date 2022-02-23
+ */
+@Repository
+public interface OrderDetailTaskMapper extends OrderDetailMapper
+{
+
+    /**
+     * 校验订单是否完成
+     *
+     * @param orderId
+     * @return
+     */
+    public int checkOrderFinished(Long orderId);
+
+    /**
+     * 未完成订单
+     *
+     * @return 订单详细信息Vo集合
+     */
+    public List<OrderDetail> selectUnFinishedOrders();
+
+}

+ 11 - 0
08.src/Xingxi/xingxi-quartz/src/main/java/com/xingxi/quartz/task/BaseTask.java

@@ -0,0 +1,11 @@
+package com.xingxi.quartz.task;
+
+public abstract class BaseTask {
+
+    abstract public void run();
+
+    protected boolean notNull(Long id) {
+        return id != null && !id.equals(0L);
+    }
+
+}

+ 94 - 0
08.src/Xingxi/xingxi-quartz/src/main/java/com/xingxi/quartz/task/order/OrderConfirmReceiptTask.java

@@ -0,0 +1,94 @@
+package com.xingxi.quartz.task.order;
+
+import com.xingxi.business.Order.domain.OrderDeliveryExpr;
+import com.xingxi.business.Order.domain.OrderDetail;
+import com.xingxi.business.Order.mapper.OrderDetailMapper;
+import com.xingxi.common.enums.EConfigKeys;
+import com.xingxi.common.enums.EOrderDetailStatus;
+import com.xingxi.common.utils.DateUtils;
+import com.xingxi.quartz.mapper.OrderDeliveryExprTaskVoMapper;
+import com.xingxi.quartz.task.BaseTask;
+import com.xingxi.system.service.ISysConfigService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @program: 扁担
+ * @description: 已发货的订单商品,从发货日开始,到时未确认收货的订单变成收货
+ * @author: baolei
+ * @create: 2022-03-22
+ */
+@Slf4j
+@Component
+public class OrderConfirmReceiptTask extends BaseTask
+{
+
+    @Resource
+    private ISysConfigService configService;
+
+    @Autowired
+    private OrderDetailMapper orderDetailMapper;
+
+    @Autowired
+    private OrderDeliveryExprTaskVoMapper orderDeliveryExprTaskVoMapper;
+
+    @Override
+    public void run() {
+
+        log.info("订单确认收货处理开始===============>");
+
+        int period = Integer.parseInt(configService.selectConfigByKey(EConfigKeys.ORDER_CONFIRM_RECEIPT_PERIOD.getVal()));
+
+        // 查询超过7天没有收货的数据
+        List<OrderDeliveryExpr> list = orderDeliveryExprTaskVoMapper.selectUnConfirmedOrders();
+
+        // 按照订单分组
+        Map<Long, List<OrderDeliveryExpr>> orderMap = list.stream().collect(Collectors.groupingBy(item -> item.getOrderDetailId()));
+
+        // 按照订单分组
+        for (Map.Entry<Long, List<OrderDeliveryExpr>> orderEntry : orderMap.entrySet()) {
+            Long detailId = orderEntry.getKey();
+            List<OrderDeliveryExpr> details = orderEntry.getValue();
+
+            Date nowDate = DateUtils.getNowDate();
+
+            boolean bAllConfirmed = true;
+
+            for (OrderDeliveryExpr detail : details) {
+                Date sendTime = detail.getDeliveryTime();
+                sendTime = DateUtils.addDays(sendTime,period);
+
+                if(nowDate.after(sendTime)) {
+                    OrderDeliveryExpr uode = new OrderDeliveryExpr();
+                    uode.setId(detail.getId());
+                    // 更新确认时间
+                    uode.setConfirmTime(nowDate);
+                    uode.setUpdateUser("OrderConfirmReceiptTask");
+                    uode.setUpdateTime(nowDate);
+                    orderDeliveryExprTaskVoMapper.updateOrderDeliveryExpr(uode);
+                } else {
+                    bAllConfirmed = false;
+                }
+            }
+
+            if(bAllConfirmed) {
+                OrderDetail uod = new OrderDetail();
+                uod.setOrderDetailId(detailId);
+                uod.setConfirmTime(nowDate);
+                uod.setOrderDetailStatus(EOrderDetailStatus.RECEIVED.getVal());
+                uod.setUpdateUser("OrderConfirmReceiptTask");
+                uod.setUpdateTime(nowDate);
+                orderDetailMapper.updateOrderDetail(uod);
+            }
+        }
+
+        log.info("订单确认收货处理结束===============>");
+    }
+}

+ 107 - 0
08.src/Xingxi/xingxi-quartz/src/main/java/com/xingxi/quartz/task/order/OrderFinishedTask.java

@@ -0,0 +1,107 @@
+package com.xingxi.quartz.task.order;
+
+import com.xingxi.business.Order.domain.Order;
+import com.xingxi.business.Order.domain.OrderDetail;
+import com.xingxi.business.Order.mapper.OrderDetailMapper;
+import com.xingxi.business.Order.mapper.OrderMapper;
+import com.xingxi.business.PaymentInfo.domain.PaymentInfo;
+import com.xingxi.common.enums.EConfigKeys;
+import com.xingxi.common.enums.EOrderDetailStatus;
+import com.xingxi.common.enums.EOrderStatus;
+import com.xingxi.common.mq.bo.order.OrderFinishedBO;
+import com.xingxi.common.mq.publisher.order.OrderFinishedMqPublisher;
+import com.xingxi.common.utils.DateUtils;
+import com.xingxi.quartz.mapper.OrderDetailTaskMapper;
+import com.xingxi.quartz.task.BaseTask;
+import com.xingxi.system.service.ISysConfigService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @program: 扁担
+ * @description: 已收货的订单商品,从收货日开始,超过无理由售后的的订单变成完成
+ * @author: baolei
+ * @create: 2022-03-22
+ */
+@Slf4j
+@Component
+public class OrderFinishedTask extends BaseTask {
+
+    @Resource
+    private ISysConfigService configService;
+
+    @Autowired
+    private OrderMapper orderMapper;
+
+    @Autowired
+    private OrderDetailMapper orderDetailMapper;
+
+    @Autowired
+    private OrderDetailTaskMapper orderDetailTaskMapper;
+
+    @Autowired
+    private OrderFinishedMqPublisher orderFinishedMqPublisher;
+
+    @Override
+    public void run() {
+
+        log.info("订单确认完成处理开始===============>");
+
+        int period = Integer.parseInt(configService.selectConfigByKey(EConfigKeys.ORDER_FINISHED_PERIOD.getVal()));
+
+        Date nowDate = DateUtils.getNowDate();
+
+        // 查询收货超过7天的数据
+        List<OrderDetail> list = orderDetailTaskMapper.selectUnFinishedOrders();
+
+        // 按照订单分组
+        Map<Long, List<OrderDetail>> orderMap = list.stream().collect(Collectors.groupingBy(item -> item.getOrderId()));
+
+        // 按照订单分组
+        for (Map.Entry<Long, List<OrderDetail>> orderEntry : orderMap.entrySet()) {
+            Long orderId = orderEntry.getKey();
+            List<OrderDetail> details = orderEntry.getValue();
+
+            for (OrderDetail detail : details) {
+                Date confirmTime = detail.getConfirmTime();
+                confirmTime = DateUtils.addDays(confirmTime, period);
+
+                if(nowDate.after(confirmTime)) {
+                    OrderDetail uod = new OrderDetail();
+                    uod.setOrderDetailId(detail.getOrderDetailId());
+                    // 更新完成时间
+                    uod.setFinishTime(nowDate);
+                    uod.setOrderDetailStatus(EOrderDetailStatus.FINISHED.getVal());
+                    uod.setUpdateUser("OrderFinishedTask");
+                    uod.setUpdateTime(nowDate);
+                    orderDetailMapper.updateOrderDetail(uod);
+
+                    OrderFinishedBO orderFinishedBO = new OrderFinishedBO();
+                    orderFinishedBO.setOrderId(detail.getOrderId());
+                    orderFinishedBO.setOrderDetailId(detail.getOrderDetailId());
+                    orderFinishedBO.setProdId(detail.getProdId());
+                    orderFinishedBO.setPprId(detail.getProdAttrId());
+                    orderFinishedMqPublisher.sendMessage(orderFinishedBO);
+                }
+            }
+
+            // 明细全完成的情况,主订单也更新完成状态
+            if(orderDetailTaskMapper.checkOrderFinished(orderId) <= 0) {
+                Order uco = new Order();
+                uco.setOrderId(orderId);
+                uco.setOrderStatus(EOrderStatus.FINISHED.getVal());
+                uco.setUpdateTime(nowDate);
+                uco.setUpdateUser("OrderFinishedTask");
+                orderMapper.updateOrder(uco);
+            }
+        }
+        log.info("订单确认完成处理结束===============>");
+    }
+}

+ 33 - 0
08.src/Xingxi/xingxi-quartz/src/main/resources/mapper/order/OrderDeliveryExprTaskVoMapper.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xingxi.quartz.mapper.OrderDeliveryExprTaskVoMapper">
+    
+    <resultMap type="OrderDeliveryExpr" id="OrderDetailExprVoResult">
+        <result property="id"    column="id"    />
+        <result property="orderDetailId"    column="orderDetailId"    />
+        <result property="orderDeliveryId"    column="orderDeliveryId"    />
+        <result property="expressNo"    column="expressNo"    />
+        <result property="deliveryTime"    column="deliveryTime"    />
+        <result property="confirmTime"    column="confirmTime"    />
+        <result property="delFlag"    column="delFlag"    />
+        <result property="createUser"    column="createUser"    />
+        <result property="createTime"    column="createTime"    />
+        <result property="updateUser"    column="updateUser"    />
+        <result property="updateTime"    column="updateTime"    />
+    </resultMap>
+
+    <sql id="selectOrderDetailExprVo">
+        select id, orderDetailId, orderDeliveryId, expressNo, deliveryTime, confirmTime, delFlag, createUser, createTime, updateUser, updateTime from t_order_delivery_expr
+    </sql>
+
+    <select id="selectUnConfirmedOrders" resultMap="OrderDetailExprVoResult">
+        <include refid="selectOrderDetailExprVo"/>
+        <![CDATA[
+            where delFlag = '0'
+                and confirmTime is null
+        ]]>
+    </select>
+
+</mapper>

+ 52 - 0
08.src/Xingxi/xingxi-quartz/src/main/resources/mapper/order/OrderDetailTaskMapper.xml

@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xingxi.quartz.mapper.OrderDetailTaskMapper">
+    
+    <resultMap type="OrderDetail" id="OrderDetailVoResult">
+        <result property="orderDetailId"    column="orderDetailId"    />
+        <result property="orderId"    column="orderId"    />
+        <result property="orderDetailStatus"    column="orderDetailStatus"    />
+        <result property="prodId"    column="prodId"    />
+        <result property="prodName"    column="prodName"    />
+        <result property="prodAttrId"    column="prodAttrId"    />
+        <result property="prodAttrName"    column="prodAttrName"    />
+        <result property="vendorId"    column="vendorId"    />
+        <result property="quantity"    column="quantity"    />
+        <result property="afterSalesQty"    column="afterSalesQty"    />
+        <result property="refundQty"    column="refundQty"    />
+        <result property="price"    column="price"    />
+        <result property="orderAmount"    column="orderAmount"    />
+        <result property="payAmount"    column="payAmount"    />
+        <result property="confirmTime"    column="confirmTime"    />
+        <result property="finishTime"    column="finishTime"    />
+        <result property="delFlag"    column="delFlag"    />
+        <result property="createUser"    column="createUser"    />
+        <result property="createTime"    column="createTime"    />
+        <result property="updateUser"    column="updateUser"    />
+        <result property="updateTime"    column="updateTime"    />
+    </resultMap>
+
+    <sql id="selectOrderDetail">
+        select
+            orderDetailId, orderId, orderDetailStatus, prodId, prodName, prodAttrId, prodAttrName, vendorId, quantity, afterSalesQty, refundQty, price, orderAmount, payAmount, confirmTime, finishTime, delFlag, createUser, createTime, updateUser, updateTime
+        from t_order_detail
+    </sql>
+
+    <select id="checkOrderFinished" resultType="int">
+		select count(1) from t_order_detail
+		where orderId = #{orderId}
+            and orderDetailStatus not in ('CANCELLED', 'REJECTED', 'FINISHED')
+	</select>
+
+    <select id="selectUnFinishedOrders" resultMap="OrderDetailVoResult">
+        <include refid="selectOrderDetail"/>
+        where confirmTime is not null and finishTime is null
+    </select>
+
+<!--    <select id="selectOderByOrderId" parameterType="Long" resultType="OrderTaskVo">-->
+<!--        select * from t_order where orderId = #{orderId}-->
+<!--    </select>-->
+
+</mapper>