主订单未派单超时
This commit is contained in:
parent
6013517d26
commit
f64296dec7
|
|
@ -118,4 +118,9 @@ public class OrderMaster extends BaseEntity {
|
||||||
* 是否超时 1=是 0=否
|
* 是否超时 1=是 0=否
|
||||||
*/
|
*/
|
||||||
private Integer timeout;
|
private Integer timeout;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 超时扣款次数
|
||||||
|
*/
|
||||||
|
private Integer timeoutFineTimes;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue