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);
+ }
}
}
}