主订单未派单超时

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= * 是否超时 1= 0=
*/ */
private Integer timeout; private Integer timeout;
/**
* 超时扣款次数
*/
private Integer timeoutFineTimes;
} }

View File

@ -93,11 +93,12 @@ public interface OrderMasterMapper {
/** /**
* 更新主订单超时状态 * 更新主订单超时状态
* *
* @param id 主订单ID * @param id 主订单ID
* @param timeout 是否超时 * @param timeout 是否超时
* @param timeoutFineTimes 超时罚款次数
* @return 1 * @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 * 移除主订单的师傅ID

View File

@ -145,6 +145,16 @@ public interface OrderMasterService {
*/ */
int updateTimeout(Long id, int timeout); int updateTimeout(Long id, int timeout);
/**
* 更新子订单超时状态
*
* @param id 子订单ID
* @param timeout 是否超时
* @param timeoutFineTimes 超时罚款次数
* @return 1
*/
int updateTimeout(Long id, int timeout, int timeoutFineTimes);
/** /**
* 移除主订单的师傅ID * 移除主订单的师傅ID
* *

View File

@ -478,7 +478,12 @@ public class OrderMasterServiceImpl implements OrderMasterService {
@Override @Override
public int updateTimeout(Long id, int timeout) { 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 @Override

View File

@ -9,7 +9,7 @@
<result property="deptId" column="dept_id"/> <result property="deptId" column="dept_id"/>
<result property="code" column="code"/> <result property="code" column="code"/>
<result property="customerId" column="customer_id"/> <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="orderType" column="order_type"/>
<result property="orderStatus" column="order_status"/> <result property="orderStatus" column="order_status"/>
<result property="payType" column="pay_type"/> <result property="payType" column="pay_type"/>
@ -25,9 +25,10 @@
<result property="updateTime" column="update_time"/> <result property="updateTime" column="update_time"/>
<result property="remark" column="remark"/> <result property="remark" column="remark"/>
<result property="goodsId" column="goods_id"/> <result property="goodsId" column="goods_id"/>
<result property="allSelfAssigned" column="all_self_assigned"/> <result property="allSelfAssigned" column="all_self_assigned"/>
<result property="hasDispatchedAll" column="has_dispatched_all"/> <result property="hasDispatchedAll" column="has_dispatched_all"/>
<result property="timeout" column="timeout_"/> <result property="timeout" column="timeout_"/>
<result property="timeoutFineTimes" column="timeout_fine_times"/>
</resultMap> </resultMap>
<sql id="selectOrderMaster"> <sql id="selectOrderMaster">
@ -47,10 +48,12 @@
expect_time_end, expect_time_end,
create_by, create_by,
create_time, create_time,
update_time,
remark, remark,
all_self_assigned, all_self_assigned,
goods_id, goods_id,
timeout_ timeout_,
timeout_fine_times
FROM order_master FROM order_master
</sql> </sql>
<sql id="selectOrderMasterMoreInfo"> <sql id="selectOrderMasterMoreInfo">
@ -70,10 +73,12 @@
om.expect_time_end, om.expect_time_end,
om.create_by, om.create_by,
om.create_time, om.create_time,
om.update_time,
om.remark, om.remark,
om.all_self_assigned, om.all_self_assigned,
om.goods_id, om.goods_id,
om.timeout_ om.timeout_,
om.timeout_fine_times
FROM order_master om FROM order_master om
LEFT JOIN customer_address ca ON ca.customer_address_id = om.address_id LEFT JOIN customer_address ca ON ca.customer_address_id = om.address_id
LEFT JOIN goods g ON g.goods_id = om.goods_id LEFT JOIN goods g ON g.goods_id = om.goods_id
@ -356,6 +361,7 @@
<update id="updateTimeout"> <update id="updateTimeout">
UPDATE order_master UPDATE order_master
SET timeout_ = #{timeout} SET timeout_ = #{timeout}
<if test="timeoutFineTimes != null">,timeout_fine_times = #{timeoutFineTimes}</if>
WHERE id = #{id} WHERE id = #{id}
</update> </update>

View File

@ -31,7 +31,9 @@ import java.util.stream.Collectors;
@Service @Service
public class OrderServiceImpl implements OrderService { public class OrderServiceImpl implements OrderService {
private static final Integer ZERO = 0;
private static final Integer ONE = 1; 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}") @Value("${order.timeout.status:-4,-3,-2,1,2,3}")
private List<Integer> timeoutOrderStatus; private List<Integer> timeoutOrderStatus;
private static final List<Integer> orderMasterTimeoutStatus = Arrays.asList(0, 1);
@Resource @Resource
private ThreadPoolTaskExecutor executor; private ThreadPoolTaskExecutor executor;
@ -62,7 +65,7 @@ public class OrderServiceImpl implements OrderService {
return; return;
} }
// 查询待接单状态的主单 // 查询待接单状态的主单
List<OrderMaster> orderMasters = orderMasterService.selectByStatus(Collections.singletonList(0)); List<OrderMaster> orderMasters = orderMasterService.selectByStatus(orderMasterTimeoutStatus);
log.info("扫描到{}条未完成的主订单", orderMasters.size()); log.info("扫描到{}条未完成的主订单", orderMasters.size());
for (OrderMaster orderMaster : orderMasters) { for (OrderMaster orderMaster : orderMasters) {
executor.execute(() -> checkTimeout(orderMaster)); executor.execute(() -> checkTimeout(orderMaster));
@ -79,22 +82,63 @@ public class OrderServiceImpl implements OrderService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
void checkTimeout(OrderMaster order) { void checkTimeout(OrderMaster order) {
Date now = new Date(); Date now = new Date();
// 是否超时 // 待接单状态的超时逻辑
boolean timeout = ONE.equals(order.getTimeout()); if (ZERO.equals(order.getOrderStatus())) {
if (timeout) { Date createTime = order.getCreateTime();
Date overTime = getOverTime(order.getCreateTime(), 60 * 60 * 1000); Date overTime30min = getOverTime(createTime, 30 * 60 * 1000);
if (overTime.before(now)) { Date overTime1h = getOverTime(createTime, 60 * 60 * 1000);
log.info("主订单[{}]超时60分钟", order.getId()); // 是否已经超时
// 已超时 60min后取消超时状态 清空workerId boolean timeout = ONE.equals(order.getTimeout());
orderMasterService.updateTimeout(order.getId(), 0); if (!timeout) {
orderMasterService.removeWorker(order.getId()); if (overTime30min.before(now) && overTime1h.after(now)) {
// 30min未接单为超时
log.info("主订单[{}]超时30分钟", order.getId());
orderMasterService.updateTimeout(order.getId(), 1);
timeout = true;
}
} }
} else { if (timeout) {
Date overTime = getOverTime(order.getCreateTime(), 30 * 60 * 1000); if (overTime1h.before(now)) {
if (overTime.before(now)) { log.info("主订单[{}]超时60分钟", order.getId());
// 30min未接单为超时 // 已超时 60min后取消超时状态 清空workerId
log.info("主订单[{}]超时30分钟", order.getId()); orderMasterService.updateTimeout(order.getId(), 0);
orderMasterService.updateTimeout(order.getId(), 1); 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);
}
} }
} }
} }