主订单未派单超时

This commit is contained in:
Hawking 2023-05-10 20:14:07 +08:00
parent 6013517d26
commit f64296dec7
6 changed files with 96 additions and 25 deletions

View File

@ -118,4 +118,9 @@ public class OrderMaster extends BaseEntity {
* 是否超时 1= 0=
*/
private Integer timeout;
/**
* 超时扣款次数
*/
private Integer timeoutFineTimes;
}

View File

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

View File

@ -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
*

View File

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

View File

@ -9,7 +9,7 @@
<result property="deptId" column="dept_id"/>
<result property="code" column="code"/>
<result property="customerId" column="customer_id"/>
<result property="addressId" column="address_id"/>
<result property="addressId" column="address_id"/>
<result property="orderType" column="order_type"/>
<result property="orderStatus" column="order_status"/>
<result property="payType" column="pay_type"/>
@ -25,9 +25,10 @@
<result property="updateTime" column="update_time"/>
<result property="remark" column="remark"/>
<result property="goodsId" column="goods_id"/>
<result property="allSelfAssigned" column="all_self_assigned"/>
<result property="hasDispatchedAll" column="has_dispatched_all"/>
<result property="allSelfAssigned" column="all_self_assigned"/>
<result property="hasDispatchedAll" column="has_dispatched_all"/>
<result property="timeout" column="timeout_"/>
<result property="timeoutFineTimes" column="timeout_fine_times"/>
</resultMap>
<sql id="selectOrderMaster">
@ -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
</sql>
<sql id="selectOrderMasterMoreInfo">
@ -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 id="updateTimeout">
UPDATE order_master
SET timeout_ = #{timeout}
<if test="timeoutFineTimes != null">,timeout_fine_times = #{timeoutFineTimes}</if>
WHERE id = #{id}
</update>

View File

@ -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<Integer> timeoutOrderStatus;
private static final List<Integer> orderMasterTimeoutStatus = Arrays.asList(0, 1);
@Resource
private ThreadPoolTaskExecutor executor;
@ -62,7 +65,7 @@ public class OrderServiceImpl implements OrderService {
return;
}
// 查询待接单状态的主单
List<OrderMaster> orderMasters = orderMasterService.selectByStatus(Collections.singletonList(0));
List<OrderMaster> 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);
}
}
}
}