Browse Source

新增订单自动确认收货逻辑

codingliang 2 years ago
parent
commit
f20bb57341

+ 43 - 0
src/main/java/com/study/mall/scheduler/OrderScheduler.java

@@ -0,0 +1,43 @@
+package com.study.mall.scheduler;
+
+import com.study.mall.service.OrderInfoService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+/**
+ * 订单定时服务
+ *
+ * @auther: codingliang
+ * @date: 2023-12-14 17:19
+ * @description: 订单定时服务
+ */
+@Slf4j
+@Async
+@Component
+@RequiredArgsConstructor
+public class OrderScheduler {
+
+    private final OrderInfoService orderInfoService;
+    private final RedissonClient redissonClient;
+    private final static String ORDER_AUTO_DELIVERY_LOCK = "cloud:mall:lock:order:auto-delivery";
+    /**
+     * 订单自动确认收货
+     * 每天23:59:59运行
+     */
+    @Scheduled(cron = "59 59 23 * * ? ")
+    public void autoDelivery() {
+        RLock lock = redissonClient.getLock(ORDER_AUTO_DELIVERY_LOCK);
+        lock.lock();
+        try {
+            log.info("订单自动签收...");
+            orderInfoService.autoDelivery();
+        } finally {
+            lock.unlock();
+        }
+    }
+}

+ 8 - 0
src/main/java/com/study/mall/service/OrderExpressInfoService.java

@@ -8,6 +8,7 @@ import com.study.mall.entity.OrderExpressInfoEntity;
 import com.study.mall.vo.OrderExpressInfoVO;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 
 /**
  * 订单物流信息
@@ -36,5 +37,12 @@ public interface OrderExpressInfoService extends IService<OrderExpressInfoEntity
      * 查询快递状态
      */
     void queryExpress();
+
+    /**
+     * 查询orderIds已签收的订单
+     * @param orderIds
+     * @return 已签收的订单id
+     */
+    List<Long> getFinishIdsByOrderIds(List<Long> orderIds);
 }
 

+ 5 - 0
src/main/java/com/study/mall/service/OrderInfoService.java

@@ -98,5 +98,10 @@ public interface OrderInfoService extends IService<OrderInfoEntity> {
      * @return
      */
     OrderStatisticsVO orderStatistics(OrderStatisticsQueryDTO queryDTO);
+
+    /**
+     * 订单自动签收
+     */
+    void autoDelivery();
 }
 

+ 13 - 0
src/main/java/com/study/mall/service/impl/OrderExpressInfoServiceImpl.java

@@ -35,6 +35,7 @@ import org.springframework.util.StringUtils;
 import javax.servlet.http.HttpServletRequest;
 import java.time.LocalDateTime;
 import java.util.List;
+import java.util.stream.Collectors;
 
 @Slf4j
 @Service("orderExpressInfoService")
@@ -217,6 +218,18 @@ public class OrderExpressInfoServiceImpl extends ServiceImpl<OrderExpressInfoDao
         }
     }
 
+    @Override
+    public List<Long> getFinishIdsByOrderIds(List<Long> orderIds) {
+        LambdaQueryWrapper<OrderExpressInfoEntity> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(OrderExpressInfoEntity::getState, "3");
+        queryWrapper.in(OrderExpressInfoEntity::getOrderId, orderIds);
+
+        // 查询7天前数据
+        queryWrapper.le(OrderExpressInfoEntity::getLastQueryTime, LocalDateTime.now().minusDays(7));
+        List<OrderExpressInfoEntity> list = this.list(queryWrapper);
+        return list.stream().map(OrderExpressInfoEntity::getOrderId).collect(Collectors.toList());
+    }
+
     /**
      * 检测物流公司
      * @param orderExpressInfo

+ 28 - 0
src/main/java/com/study/mall/service/impl/OrderInfoServiceImpl.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.study.mall.common.exception.BizCodeEnum;
 import com.study.mall.common.exception.RRException;
@@ -34,6 +35,7 @@ import com.study.mall.service.GoodsService;
 import com.study.mall.service.GoodsSkuService;
 import com.study.mall.service.OrderConsigneeInfoService;
 import com.study.mall.service.OrderDetailService;
+import com.study.mall.service.OrderExpressInfoService;
 import com.study.mall.service.OrderInfoService;
 import com.study.mall.service.PayOrderService;
 import com.study.mall.service.UserAddressService;
@@ -66,6 +68,7 @@ import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -80,6 +83,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoDao, OrderInfoEnt
     private final GoodsService goodsService;
     private final GoodsSkuService goodsSkuService;
     private final UserAddressService userAddressService;
+    private final OrderExpressInfoService orderExpressInfoService;
     private final StringRedisTemplate redisTemplate;
     private final RabbitTemplate rabbitTemplate;
 
@@ -480,6 +484,30 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoDao, OrderInfoEnt
                 .build();
     }
 
+    @Override
+    public void autoDelivery() {
+        LambdaQueryWrapper<OrderInfoEntity> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(OrderInfoEntity::getState, "3");
+        List<OrderInfoEntity> orderInfoList = list(queryWrapper);
+
+        if (orderInfoList.size() > 0) {
+            // 查询物流信息
+            List<Long> finishIds = orderExpressInfoService.getFinishIdsByOrderIds(orderInfoList.stream().map(OrderInfoEntity::getId).collect(Collectors.toList()));
+
+            Map<Long, OrderInfoEntity> ordersMap = orderInfoList.stream().collect(Collectors.toMap(OrderInfoEntity::getId, Function.identity()));
+
+            List<OrderInfoEntity> deliveryOrders = finishIds.stream().map(orderId -> {
+                OrderInfoEntity orderInfo = ordersMap.get(orderId);
+                orderInfo.setState("4");
+                return orderInfo;
+            }).collect(Collectors.toList());
+
+            if (deliveryOrders.size() > 0) {
+                updateBatchById(deliveryOrders);
+            }
+        }
+    }
+
     /**
      * 创建订单
      * @param dto