diff --git a/ghy-order/src/main/java/com/ghy/order/domain/OrderMaster.java b/ghy-order/src/main/java/com/ghy/order/domain/OrderMaster.java index 072c4992..10131a82 100644 --- a/ghy-order/src/main/java/com/ghy/order/domain/OrderMaster.java +++ b/ghy-order/src/main/java/com/ghy/order/domain/OrderMaster.java @@ -118,4 +118,9 @@ public class OrderMaster extends BaseEntity { * 是否超时 1=是 0=否 */ private Integer timeout; + + /** + * 超时扣款次数 + */ + private Integer timeoutFineTimes; } diff --git a/ghy-order/src/main/java/com/ghy/order/mapper/OrderMasterMapper.java b/ghy-order/src/main/java/com/ghy/order/mapper/OrderMasterMapper.java index a6416593..d8994451 100644 --- a/ghy-order/src/main/java/com/ghy/order/mapper/OrderMasterMapper.java +++ b/ghy-order/src/main/java/com/ghy/order/mapper/OrderMasterMapper.java @@ -93,11 +93,12 @@ public interface OrderMasterMapper { /** * 更新主订单超时状态 * - * @param id 主订单ID - * @param timeout 是否超时 + * @param id 主订单ID + * @param timeout 是否超时 + * @param timeoutFineTimes 超时罚款次数 * @return 1 */ - int updateTimeout(@Param("id") Long id, @Param("timeout") int timeout); + int updateTimeout(@Param("id") Long id, @Param("timeout") int timeout, @Param("timeoutFineTimes") Integer timeoutFineTimes); /** * 移除主订单的师傅ID diff --git a/ghy-order/src/main/java/com/ghy/order/service/OrderMasterService.java b/ghy-order/src/main/java/com/ghy/order/service/OrderMasterService.java index 9f36fd4e..7e12b7b1 100644 --- a/ghy-order/src/main/java/com/ghy/order/service/OrderMasterService.java +++ b/ghy-order/src/main/java/com/ghy/order/service/OrderMasterService.java @@ -145,6 +145,16 @@ public interface OrderMasterService { */ int updateTimeout(Long id, int timeout); + /** + * 更新子订单超时状态 + * + * @param id 子订单ID + * @param timeout 是否超时 + * @param timeoutFineTimes 超时罚款次数 + * @return 1 + */ + int updateTimeout(Long id, int timeout, int timeoutFineTimes); + /** * 移除主订单的师傅ID * diff --git a/ghy-order/src/main/java/com/ghy/order/service/impl/OrderMasterServiceImpl.java b/ghy-order/src/main/java/com/ghy/order/service/impl/OrderMasterServiceImpl.java index 9429ba0d..cdcb066e 100644 --- a/ghy-order/src/main/java/com/ghy/order/service/impl/OrderMasterServiceImpl.java +++ b/ghy-order/src/main/java/com/ghy/order/service/impl/OrderMasterServiceImpl.java @@ -478,7 +478,12 @@ public class OrderMasterServiceImpl implements OrderMasterService { @Override public int updateTimeout(Long id, int timeout) { - return orderMasterMapper.updateTimeout(id, timeout); + return orderMasterMapper.updateTimeout(id, timeout, null); + } + + @Override + public int updateTimeout(Long id, int timeout, int timeoutFineTimes) { + return orderMasterMapper.updateTimeout(id, timeout, timeoutFineTimes); } @Override diff --git a/ghy-order/src/main/resources/mapper/order/OrderMasterMapper.xml b/ghy-order/src/main/resources/mapper/order/OrderMasterMapper.xml index 277fd839..43b6fe85 100644 --- a/ghy-order/src/main/resources/mapper/order/OrderMasterMapper.xml +++ b/ghy-order/src/main/resources/mapper/order/OrderMasterMapper.xml @@ -9,7 +9,7 @@ - + @@ -25,9 +25,10 @@ - - + + + @@ -47,10 +48,12 @@ expect_time_end, create_by, create_time, + update_time, remark, all_self_assigned, goods_id, - timeout_ + timeout_, + timeout_fine_times FROM order_master @@ -70,10 +73,12 @@ om.expect_time_end, om.create_by, om.create_time, + om.update_time, om.remark, om.all_self_assigned, om.goods_id, - om.timeout_ + om.timeout_, + om.timeout_fine_times FROM order_master om LEFT JOIN customer_address ca ON ca.customer_address_id = om.address_id LEFT JOIN goods g ON g.goods_id = om.goods_id @@ -356,6 +361,7 @@ UPDATE order_master SET timeout_ = #{timeout} + ,timeout_fine_times = #{timeoutFineTimes} WHERE id = #{id} diff --git a/ghy-quartz/src/main/java/com/ghy/quartz/service/impl/OrderServiceImpl.java b/ghy-quartz/src/main/java/com/ghy/quartz/service/impl/OrderServiceImpl.java index 9e681a2f..a009fd57 100644 --- a/ghy-quartz/src/main/java/com/ghy/quartz/service/impl/OrderServiceImpl.java +++ b/ghy-quartz/src/main/java/com/ghy/quartz/service/impl/OrderServiceImpl.java @@ -31,7 +31,9 @@ import java.util.stream.Collectors; @Service public class OrderServiceImpl implements OrderService { + private static final Integer ZERO = 0; private static final Integer ONE = 1; + private static final Integer TWO = 2; /** * 需要超时扣款的订单状态 @@ -40,6 +42,7 @@ public class OrderServiceImpl implements OrderService { */ @Value("${order.timeout.status:-4,-3,-2,1,2,3}") private List timeoutOrderStatus; + private static final List orderMasterTimeoutStatus = Arrays.asList(0, 1); @Resource private ThreadPoolTaskExecutor executor; @@ -62,7 +65,7 @@ public class OrderServiceImpl implements OrderService { return; } // 查询待接单状态的主单 - List orderMasters = orderMasterService.selectByStatus(Collections.singletonList(0)); + List orderMasters = orderMasterService.selectByStatus(orderMasterTimeoutStatus); log.info("扫描到{}条未完成的主订单", orderMasters.size()); for (OrderMaster orderMaster : orderMasters) { executor.execute(() -> checkTimeout(orderMaster)); @@ -79,22 +82,63 @@ public class OrderServiceImpl implements OrderService { @Transactional(rollbackFor = Exception.class) void checkTimeout(OrderMaster order) { Date now = new Date(); - // 是否超时 - boolean timeout = ONE.equals(order.getTimeout()); - if (timeout) { - Date overTime = getOverTime(order.getCreateTime(), 60 * 60 * 1000); - if (overTime.before(now)) { - log.info("主订单[{}]超时60分钟", order.getId()); - // 已超时 60min后取消超时状态 清空workerId - orderMasterService.updateTimeout(order.getId(), 0); - orderMasterService.removeWorker(order.getId()); + // 待接单状态的超时逻辑 + if (ZERO.equals(order.getOrderStatus())) { + Date createTime = order.getCreateTime(); + Date overTime30min = getOverTime(createTime, 30 * 60 * 1000); + Date overTime1h = getOverTime(createTime, 60 * 60 * 1000); + // 是否已经超时 + boolean timeout = ONE.equals(order.getTimeout()); + if (!timeout) { + if (overTime30min.before(now) && overTime1h.after(now)) { + // 30min未接单为超时 + log.info("主订单[{}]超时30分钟", order.getId()); + orderMasterService.updateTimeout(order.getId(), 1); + timeout = true; + } } - } else { - Date overTime = getOverTime(order.getCreateTime(), 30 * 60 * 1000); - if (overTime.before(now)) { - // 30min未接单为超时 - log.info("主订单[{}]超时30分钟", order.getId()); - orderMasterService.updateTimeout(order.getId(), 1); + if (timeout) { + if (overTime1h.before(now)) { + log.info("主订单[{}]超时60分钟", order.getId()); + // 已超时 60min后取消超时状态 清空workerId + orderMasterService.updateTimeout(order.getId(), 0); + orderMasterService.removeWorker(order.getId()); + } + } + return; + } + + // 未派单状态的超时逻辑 + if (ONE.equals(order.getOrderStatus())) { + Date updateTime = order.getUpdateTime(); + Date overTime30min = getOverTime(updateTime, 30 * 60 * 1000); + Date overTime4h = getOverTime(updateTime, 4 * 60 * 60 * 1000); + Date overTime6h = getOverTime(updateTime, 6 * 60 * 60 * 1000); + // 是否已经超时 + boolean timeout = ONE.equals(order.getTimeout()); + Integer fineTimes = order.getTimeoutFineTimes(); + if (!timeout) { + if (overTime30min.before(now)) { + // 30min未接单为超时 + log.info("主订单[{}]超时30分钟", order.getId()); + orderMasterService.updateTimeout(order.getId(), 1); + timeout = true; + } + } + + if (timeout) { + if (overTime4h.before(now) && ZERO.equals(fineTimes)) { + log.info("主订单[{}]超时4小时", order.getId()); + // TODO 扣款 + orderMasterService.updateTimeout(order.getId(), 1, 1); + fineTimes = ONE; + } + + if (overTime6h.before(now) && ONE.equals(fineTimes)) { + log.info("主订单[{}]超时6小时", order.getId()); + // TODO 扣款 + orderMasterService.updateTimeout(order.getId(), 1, 2); + } } } }