订单优化

pull/1121/head
梁宇奇 2025-11-22 16:36:09 +08:00
parent 0386d78377
commit 080603909e
6 changed files with 131 additions and 8 deletions

View File

@ -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<Long> 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<Long> 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() {

View File

@ -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;
}

View File

@ -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<StoreOrder> {
List<StoreOrder> listNeedAutoCompleteOrder(@Param("deliveryBeforeTime") Date deliveryBeforeTime);
List<StoreOrder> listNeedAutoRefundOrder();
List<StoreOrder> listNeedAutoCheckCompletePendingShipmentOrders();
List<StoreOrderDetailStatusDTO> listOrderDetailStatusByOrderIds(@Param("orderIds") Collection<Long> orderIds);
}

View File

@ -322,4 +322,11 @@ public interface IStoreOrderService {
* @param storeOrderId
*/
void completeRefundByUser(Long storeOrderId);
/**
*
*
* @return
*/
List<Long> listNeedAutoCompletePendingShipmentOrderIds();
}

View File

@ -1784,6 +1784,45 @@ public class StoreOrderServiceImpl implements IStoreOrderService {
new Date());
}
@Override
public List<Long> listNeedAutoCompletePendingShipmentOrderIds() {
List<StoreOrder> orders = storeOrderMapper.listNeedAutoCheckCompletePendingShipmentOrders();
if (CollUtil.isEmpty(orders)) {
return ListUtil.empty();
}
Set<Long> orderIds = orders.stream().map(SimpleEntity::getId).collect(Collectors.toSet());
Map<Long, List<StoreOrderDetailStatusDTO>> detailMap = storeOrderMapper.listOrderDetailStatusByOrderIds(orderIds)
.stream()
.collect(Collectors.groupingBy(StoreOrderDetailStatusDTO::getOrderId));
List rtn = new ArrayList();
long currentTimeMillis = System.currentTimeMillis();
for (StoreOrder order : orders) {
List<StoreOrderDetailStatusDTO> 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;
}
/**
*
*

View File

@ -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)
</select>
<select id="listNeedAutoCheckCompletePendingShipmentOrders" resultType="com.ruoyi.xkt.domain.StoreOrder">
SELECT DISTINCT
so2.*
FROM
store_order so1
JOIN store_order so2 ON so1.origin_order_id = so2.id
WHERE
so1.order_status = 24
AND so2.order_status = 12
AND so2.del_flag = '0'
</select>
<select id="listOrderDetailStatusByOrderIds"
resultType="com.ruoyi.xkt.dto.order.StoreOrderDetailStatusDTO">
SELECT
sod1.store_order_id AS order_id,
sod1.id AS detail_id,
sod1.detail_status,
sod2.id AS refund_detail_id,
sod2.detail_status AS refund_detail_status
FROM
store_order_detail sod1
LEFT JOIN store_order_detail sod2 ON sod1.id = sod2.origin_order_detail_id
WHERE
sod1.del_flag = '0'
AND sod1.store_order_id IN
<foreach collection="orderIds" item="obj" open="(" close=")" separator=",">
#{obj}
</foreach>
</select>
</mapper>