From a500a5581d4b178b33dadd270a184b5d42852253 Mon Sep 17 00:00:00 2001 From: Hawking Date: Tue, 9 May 2023 19:53:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=BB=E5=8D=95=E8=B6=85=E6=97=B6=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ghy/order/domain/OrderMaster.java | 5 +++ .../ghy/order/mapper/OrderMasterMapper.java | 17 +++++++++ .../ghy/order/service/OrderMasterService.java | 17 +++++++++ .../service/impl/OrderMasterServiceImpl.java | 14 +++++++- .../mapper/order/OrderMasterMapper.xml | 19 ++++++++-- .../quartz/service/impl/OrderServiceImpl.java | 36 +++++++++++++++++-- 6 files changed, 103 insertions(+), 5 deletions(-) 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 6c313280..072c4992 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 @@ -113,4 +113,9 @@ public class OrderMaster extends BaseEntity { private Boolean shelveStatus; private List exceptOrderMasterIds; + + /** + * 是否超时 1=是 0=否 + */ + private Integer timeout; } 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 d29329d1..a6416593 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 @@ -89,4 +89,21 @@ public interface OrderMasterMapper { List selectByIds(@Param("orderMasterId") Collection orderMasterIds); int updatePayStatus(@Param("orderMasterId") Long orderMasterId, @Param("payStatus") Integer payStatus); + + /** + * 更新主订单超时状态 + * + * @param id 主订单ID + * @param timeout 是否超时 + * @return 1 + */ + int updateTimeout(@Param("id") Long id, @Param("timeout") int timeout); + + /** + * 移除主订单的师傅ID + * + * @param id 主订单ID + * @return 1 + */ + int removeWorker(Long 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 6cdc826d..9f36fd4e 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 @@ -135,4 +135,21 @@ public interface OrderMasterService { * @return true/false */ boolean isAllAssign(Long orderMasterId); + + /** + * 更新主订单超时状态 + * + * @param id 主订单ID + * @param timeout 是否超时 + * @return 1 + */ + int updateTimeout(Long id, int timeout); + + /** + * 移除主订单的师傅ID + * + * @param id 主订单ID + * @return 1 + */ + int removeWorker(Long 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 24448b3a..9429ba0d 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 @@ -367,7 +367,9 @@ public class OrderMasterServiceImpl implements OrderMasterService { @Override public List selectByStatus(List status) { - Assert.isTrue(!CollectionUtils.isEmpty(status), "订单状态为空"); + if (CollectionUtils.isEmpty(status)) { + return Collections.emptyList(); + } return orderMasterMapper.selectByStatus(status); } @@ -473,4 +475,14 @@ public class OrderMasterServiceImpl implements OrderMasterService { }).sum(); return masterCount == detailCount; } + + @Override + public int updateTimeout(Long id, int timeout) { + return orderMasterMapper.updateTimeout(id, timeout); + } + + @Override + public int removeWorker(Long id) { + return orderMasterMapper.removeWorker(id); + } } diff --git a/ghy-order/src/main/resources/mapper/order/OrderMasterMapper.xml b/ghy-order/src/main/resources/mapper/order/OrderMasterMapper.xml index 03d30e1b..277fd839 100644 --- a/ghy-order/src/main/resources/mapper/order/OrderMasterMapper.xml +++ b/ghy-order/src/main/resources/mapper/order/OrderMasterMapper.xml @@ -27,6 +27,7 @@ + @@ -48,7 +49,8 @@ create_time, remark, all_self_assigned, - goods_id + goods_id, + timeout_ FROM order_master @@ -70,7 +72,8 @@ om.create_time, om.remark, om.all_self_assigned, - om.goods_id + om.goods_id, + om.timeout_ 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 @@ -350,4 +353,16 @@ + + UPDATE order_master + SET timeout_ = #{timeout} + WHERE id = #{id} + + + + UPDATE order_master + SET worker_id = NULL + 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 f576b03e..6e7444d7 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 @@ -35,6 +35,8 @@ public class OrderServiceImpl implements OrderService { /** * 需要超时扣款的订单状态 + * + * @see OrderStatus */ @Value("${order.timeout.status:-4,-3,-2,1,2,3}") private List timeoutOrderStatus; @@ -59,14 +61,44 @@ public class OrderServiceImpl implements OrderService { if (nowT.getHour() < 8 || nowT.getHour() > 18) { return; } - // 查询符合超时的单 + // 查询待接单状态的主单 + List orderMasters = orderMasterService.selectByStatus(Collections.singletonList(0)); + log.info("扫描到{}条未完成的主订单", orderMasters.size()); + for (OrderMaster orderMaster : orderMasters) { + executor.execute(() -> checkTimeout(orderMaster)); + } + + // 查询符合超时的子单 List orders = orderDetailService.selectByStatus(timeoutOrderStatus); - log.info("扫描到{}条未完成的订单", orders.size()); + log.info("扫描到{}条未完成的子订单", orders.size()); for (OrderDetail order : orders) { executor.execute(() -> checkTimeout(order)); } } + @Transactional(rollbackFor = Exception.class) + void checkTimeout(OrderMaster order) { + Date now = new Date(); + // 是否超时 + boolean timeout = ONE.equals(order.getTimeout()); + if (timeout) { + Date overTime = getOverTime(order.getUpdateTime(), 60 * 60 * 1000); + if (overTime.before(now)) { + log.info("主订单[{}]超时60分钟", order.getId()); + // 已超时 60min后取消超时状态 清空workerId + orderMasterService.updateTimeout(order.getId(), 0); + orderMasterService.removeWorker(order.getId()); + } + } else { + Date overTime = getOverTime(order.getUpdateTime(), 30 * 60 * 1000); + if (overTime.before(now)) { + // 30min未接单为超时 + log.info("主订单[{}]超时30分钟", order.getId()); + orderMasterService.updateTimeout(order.getId(), 1); + } + } + } + /** * 判断是否超时 *