From 080603909e4e82500cb117a5cca51de3b696d292 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E5=AE=87=E5=A5=87?= Date: Sat, 22 Nov 2025 16:36:09 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ruoyi/quartz/task/XktTask.java | 23 +++++++++-- .../dto/order/StoreOrderDetailStatusDTO.java | 31 +++++++++++++++ .../ruoyi/xkt/mapper/StoreOrderMapper.java | 10 +++-- .../ruoyi/xkt/service/IStoreOrderService.java | 7 ++++ .../service/impl/StoreOrderServiceImpl.java | 39 +++++++++++++++++++ .../resources/mapper/StoreOrderMapper.xml | 29 ++++++++++++++ 6 files changed, 131 insertions(+), 8 deletions(-) create mode 100644 xkt/src/main/java/com/ruoyi/xkt/dto/order/StoreOrderDetailStatusDTO.java diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/XktTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/XktTask.java index 38f07a717..636cbefb9 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/XktTask.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/XktTask.java @@ -1111,7 +1111,7 @@ public class XktTask { } public void autoCompleteStoreOrder() { - log.info("-------------自动完成订单开始-------------"); + log.info("-------------自动完成已发货订单开始-------------"); Integer batchCount = 20; Date beforeDate = DateUtil.offset(new Date(), DateField.DAY_OF_YEAR, -15); List storeOrderIds = storeOrderService.listNeedAutoCompleteOrder(beforeDate, batchCount); @@ -1120,11 +1120,26 @@ public class XktTask { try { storeOrderService.completeOrder(storeOrderId, -1L); } catch (Exception e) { - log.error("自动完成订单异常", e); - fsNotice.sendMsg2DefaultChat("自动完成订单异常", "订单ID:" + storeOrderId); + log.error("自动完成已发货订单异常", e); + fsNotice.sendMsg2DefaultChat("自动完成已发货订单异常", "订单ID:" + storeOrderId); } } - log.info("-------------自动完成订单结束-------------"); + log.info("-------------自动完成已发货订单结束-------------"); + } + + public void autoCompletePendingShipmentStoreOrder() { + log.info("-------------自动完成待发货订单开始-------------"); + List storeOrderIds = storeOrderService.listNeedAutoCompletePendingShipmentOrderIds(); + for (Long storeOrderId : storeOrderIds) { + log.info("开始处理: {}", storeOrderId); + try { + storeOrderService.completeOrder(storeOrderId, -1L); + } catch (Exception e) { + log.error("自动完成待发货订单异常", e); + fsNotice.sendMsg2DefaultChat("自动完成待发货订单异常", "订单ID:" + storeOrderId); + } + } + log.info("-------------自动完成待发货订单结束-------------"); } public void autoRefundStoreOrder() { diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/order/StoreOrderDetailStatusDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/order/StoreOrderDetailStatusDTO.java new file mode 100644 index 000000000..a357c7b4f --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/order/StoreOrderDetailStatusDTO.java @@ -0,0 +1,31 @@ +package com.ruoyi.xkt.dto.order; + +import lombok.Data; + +/** + * @author liangyq + * @date 2025-11-22 + */ +@Data +public class StoreOrderDetailStatusDTO { + /** + * 订单ID + */ + private Long orderId; + /** + * 订单明细ID + */ + private Long detailId; + /** + * 订单明细状态(同订单状态)[10:已取消 11:待付款 12:待发货 13:已发货 14:已完成 21:售后中 22:售后拒绝 23:平台介入 24:售后完成] + */ + private Integer detailStatus; + /** + * 退货订单明细ID + */ + private Long refundDetailId; + /** + * 退货订单明细状态(同订单状态)[10:已取消 11:待付款 12:待发货 13:已发货 14:已完成 21:售后中 22:售后拒绝 23:平台介入 24:售后完成] + */ + private Integer refundDetailStatus; +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreOrderMapper.java b/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreOrderMapper.java index 17a2d0346..ecfe8d63a 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreOrderMapper.java +++ b/xkt/src/main/java/com/ruoyi/xkt/mapper/StoreOrderMapper.java @@ -2,13 +2,11 @@ package com.ruoyi.xkt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.xkt.domain.StoreOrder; -import com.ruoyi.xkt.dto.order.StoreOrderCountDTO; -import com.ruoyi.xkt.dto.order.StoreOrderCountQueryDTO; -import com.ruoyi.xkt.dto.order.StoreOrderPageItemDTO; -import com.ruoyi.xkt.dto.order.StoreOrderQueryDTO; +import com.ruoyi.xkt.dto.order.*; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; +import java.util.Collection; import java.util.Date; import java.util.List; @@ -28,4 +26,8 @@ public interface StoreOrderMapper extends BaseMapper { List listNeedAutoCompleteOrder(@Param("deliveryBeforeTime") Date deliveryBeforeTime); List listNeedAutoRefundOrder(); + + List listNeedAutoCheckCompletePendingShipmentOrders(); + + List listOrderDetailStatusByOrderIds(@Param("orderIds") Collection orderIds); } diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/IStoreOrderService.java b/xkt/src/main/java/com/ruoyi/xkt/service/IStoreOrderService.java index 2dac16609..403619d09 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/IStoreOrderService.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/IStoreOrderService.java @@ -322,4 +322,11 @@ public interface IStoreOrderService { * @param storeOrderId */ void completeRefundByUser(Long storeOrderId); + + /** + * 获取需要自动完成的待发货订单 + * + * @return + */ + List listNeedAutoCompletePendingShipmentOrderIds(); } diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreOrderServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreOrderServiceImpl.java index 65dd31ff5..066b9fe87 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreOrderServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreOrderServiceImpl.java @@ -1784,6 +1784,45 @@ public class StoreOrderServiceImpl implements IStoreOrderService { new Date()); } + @Override + public List listNeedAutoCompletePendingShipmentOrderIds() { + List orders = storeOrderMapper.listNeedAutoCheckCompletePendingShipmentOrders(); + if (CollUtil.isEmpty(orders)) { + return ListUtil.empty(); + } + Set orderIds = orders.stream().map(SimpleEntity::getId).collect(Collectors.toSet()); + Map> detailMap = storeOrderMapper.listOrderDetailStatusByOrderIds(orderIds) + .stream() + .collect(Collectors.groupingBy(StoreOrderDetailStatusDTO::getOrderId)); + List rtn = new ArrayList(); + long currentTimeMillis = System.currentTimeMillis(); + for (StoreOrder order : orders) { + List details = detailMap.get(order.getId()); + if (CollUtil.isEmpty(details)) { + log.warn("订单数据异常:{}", order); + continue; + } + boolean autoComplete = true; + long createTimeMillis = order.getCreateTime().getTime(); + for (StoreOrderDetailStatusDTO detail : details) { + if (EOrderStatus.PENDING_SHIPMENT.getValue().equals(detail.getDetailStatus()) + && !EOrderStatus.AFTER_SALE_COMPLETED.getValue().equals(detail.getRefundDetailStatus())) { + //明细=待发货 & 明细售后≠已完成 + autoComplete = false; + } + if (EOrderStatus.SHIPPED.getValue().equals(detail.getDetailStatus()) + && ((currentTimeMillis - createTimeMillis) < 31 * 24 * 60 * 60 * 1000L)) { + //明细=已发货 & 当前时间 - 订单创建时间 < 31d + autoComplete = false; + } + } + if (autoComplete) { + rtn.add(order.getId()); + } + } + return rtn; + } + /** * 检查:若存在已完成售后的订单明细则报错 * diff --git a/xkt/src/main/resources/mapper/StoreOrderMapper.xml b/xkt/src/main/resources/mapper/StoreOrderMapper.xml index da49b30c8..ef14df35a 100644 --- a/xkt/src/main/resources/mapper/StoreOrderMapper.xml +++ b/xkt/src/main/resources/mapper/StoreOrderMapper.xml @@ -143,4 +143,33 @@ AND NOT EXISTS (SELECT 1 FROM store_order rso WHERE rso.origin_order_id = so.id AND rso.del_flag = '0' AND rso.order_type = 2) AND NOT EXISTS (SELECT 1 FROM store_order_detail sod WHERE so.id = sod.store_order_id AND sod.del_flag = '0' AND sod.detail_status != 12) + + \ No newline at end of file