|
|
@@ -3870,49 +3870,70 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.UPDATE_ORDER_STATUS)
|
|
|
@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
|
|
|
- public CommonResult<?> updateStatus(Long orderId, Integer status) {
|
|
|
- TradeOrderDO tradeOrderDO = tradeOrderMapper.selectById(orderId);
|
|
|
- if (tradeOrderDO == null) {
|
|
|
- return CommonResult.error(ORDER_NOT_EXIST);
|
|
|
+ public String updateStatus(List<Long> orderIds, Integer status) {
|
|
|
+ List<Long> distinctOrderIds = orderIds == null ? Collections.emptyList() : orderIds.stream()
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .distinct()
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ if (CollUtil.isEmpty(distinctOrderIds)) {
|
|
|
+ throw exception(ORDER_NOT_EXIST);
|
|
|
}
|
|
|
- Integer orderStatus = tradeOrderDO.getOrderStatus();
|
|
|
- // 延迟过期时间
|
|
|
- LocalDateTime delayExpireTime = tradeOrderDO.getDelayExpireTime();
|
|
|
- // 判断延迟过期时间是否过期
|
|
|
- LocalDateTime now = LocalDateTime.now();
|
|
|
- Boolean delayExpireFlag = true;
|
|
|
- if (ObjectUtil.isNotNull(delayExpireTime)) {
|
|
|
- // 过期时间晚于当前时间 = 未过期
|
|
|
- if (delayExpireTime.isAfter(now)) {
|
|
|
- delayExpireFlag = false;
|
|
|
- }
|
|
|
+ List<TradeOrderDO> tradeOrders = tradeOrderMapper.selectByIds(distinctOrderIds);
|
|
|
+ if (tradeOrders.size() != distinctOrderIds.size()) {
|
|
|
+ throw exception(ORDER_NOT_EXIST);
|
|
|
}
|
|
|
- tradeOrderMapper.update(Wrappers.<TradeOrderDO>lambdaUpdate()
|
|
|
- .set(TradeOrderDO::getOrderStatus, status)
|
|
|
- .set(TradeOrderDO::getUpdateTime, LocalDateTime.now())
|
|
|
- .eq(TradeOrderDO::getId, orderId)
|
|
|
- );
|
|
|
- // 如果改为留位,并且时间已过期
|
|
|
- if (status == TradeOrderStatusEnum.YD.getStatus() && delayExpireFlag) {
|
|
|
- log.info("订单修改为留位,orderId={}", orderId);
|
|
|
- // 查询配置信息,获取取消时间
|
|
|
- String autoClearTime = configApi.getPlatformConfigValueByKey("autoClearTimeoutParam.four_hours");
|
|
|
+
|
|
|
+ LocalDateTime now = LocalDateTime.now();
|
|
|
+ String autoClearTime = null;
|
|
|
+ Long delayMs = null;
|
|
|
+ if (Objects.equals(status, TradeOrderStatusEnum.YD.getStatus())) {
|
|
|
+ autoClearTime = configApi.getPlatformConfigValueByKey("autoClearTimeoutParam.four_hours");
|
|
|
if (StrUtil.isBlank(autoClearTime)) {
|
|
|
autoClearTime = "4";
|
|
|
}
|
|
|
double hours = Double.parseDouble(autoClearTime);
|
|
|
- long delayMs = (long) (hours * 60 * 60 * 1000);
|
|
|
- // 根据当前时间获取延迟队列到期时间
|
|
|
- LocalDateTime expireDateTime = LocalDateTime.now().plus(Duration.ofMillis(delayMs));
|
|
|
- tradePublishUtils.publishHoldOrderCancelDelayMsg(orderId.toString(), delayMs);
|
|
|
- log.info("订单修改为留位状态成功,已发送{}小时自动取消延迟消息:orderId={}", autoClearTime,orderId);
|
|
|
- tradeOrderMapper.update(new UpdateWrapper<TradeOrderDO>().set("delay_expire_time", expireDateTime).eq("id", orderId));
|
|
|
- }
|
|
|
- Map<String, Object> append = TradeOrderLogUtils.append("result", "修改订单状态成功");
|
|
|
- TradeOrderLogUtils.setOrderInfo(orderId, orderStatus, status, append);
|
|
|
- return CommonResult.success("修改成功");
|
|
|
+ delayMs = (long) (hours * 60 * 60 * 1000);
|
|
|
+ }
|
|
|
+
|
|
|
+ LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
|
|
|
+ for (TradeOrderDO tradeOrder : tradeOrders) {
|
|
|
+ Integer beforeStatus = tradeOrder.getOrderStatus();
|
|
|
+ tradeOrderMapper.update(Wrappers.<TradeOrderDO>lambdaUpdate()
|
|
|
+ .set(TradeOrderDO::getOrderStatus, status)
|
|
|
+ .set(TradeOrderDO::getUpdateTime, now)
|
|
|
+ .eq(TradeOrderDO::getId, tradeOrder.getId()));
|
|
|
+
|
|
|
+ LocalDateTime delayExpireTime = tradeOrder.getDelayExpireTime();
|
|
|
+ boolean delayExpired = delayExpireTime == null || !delayExpireTime.isAfter(now);
|
|
|
+ if (delayMs != null && delayExpired) {
|
|
|
+ LocalDateTime expireDateTime = now.plus(Duration.ofMillis(delayMs));
|
|
|
+ tradePublishUtils.publishHoldOrderCancelDelayMsg(tradeOrder.getId().toString(), delayMs);
|
|
|
+ log.info("订单修改为留位状态成功,已发送{}小时自动取消延迟消息:orderId={}",
|
|
|
+ autoClearTime, tradeOrder.getId());
|
|
|
+ tradeOrderMapper.update(new UpdateWrapper<TradeOrderDO>()
|
|
|
+ .set("delay_expire_time", expireDateTime)
|
|
|
+ .eq("id", tradeOrder.getId()));
|
|
|
+ }
|
|
|
+ insertUpdateStatusLog(loginUser, tradeOrder.getId(), beforeStatus, status);
|
|
|
+ }
|
|
|
+ return distinctOrderIds.size() > 1
|
|
|
+ ? "批量修改成功,共修改" + distinctOrderIds.size() + "个订单"
|
|
|
+ : "修改成功";
|
|
|
+ }
|
|
|
+
|
|
|
+ private void insertUpdateStatusLog(LoginUser loginUser, Long orderId,
|
|
|
+ Integer beforeStatus, Integer afterStatus) {
|
|
|
+ TradeOrderLogDO logDO = new TradeOrderLogDO();
|
|
|
+ logDO.setId(IdWorker.getId());
|
|
|
+ logDO.setOrderId(orderId);
|
|
|
+ logDO.setUserId(loginUser == null ? 0L : loginUser.getId());
|
|
|
+ logDO.setUserType(loginUser == null ? 0 : loginUser.getUserType());
|
|
|
+ logDO.setBeforeStatus(beforeStatus);
|
|
|
+ logDO.setAfterStatus(afterStatus);
|
|
|
+ logDO.setOperateType(TradeOrderOperateTypeEnum.UPDATE_ORDER_STATUS.getType());
|
|
|
+ logDO.setContent("修改内容:修改订单状态成功");
|
|
|
+ tradeOrderLogMapper.insert(logDO);
|
|
|
}
|
|
|
|
|
|
|