|
|
@@ -4,20 +4,27 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import org.apache.dubbo.config.annotation.DubboService;
|
|
|
import org.dromara.common.core.constant.CacheNames;
|
|
|
+import org.dromara.common.core.constant.SystemConstants;
|
|
|
import org.dromara.common.core.utils.DateUtils;
|
|
|
import org.dromara.order.api.RemoteSubOrderService;
|
|
|
import org.dromara.order.api.domain.vo.RemoteSubOrderVo;
|
|
|
+import org.dromara.order.api.enums.*;
|
|
|
+import org.dromara.order.domain.SysOrderSetting;
|
|
|
import org.dromara.order.domain.SysSubOrder;
|
|
|
-import org.dromara.order.api.enums.OrderStatusEnum;
|
|
|
+import org.dromara.order.domain.SysSubOrderLog;
|
|
|
+import org.dromara.order.mapper.SysSubOrderLogMapper;
|
|
|
import org.dromara.order.mapper.SysSubOrderMapper;
|
|
|
+import org.dromara.order.service.ISysOrderSettingService;
|
|
|
import org.springframework.cache.annotation.Cacheable;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.Collections;
|
|
|
-import java.util.Date;
|
|
|
-import java.util.List;
|
|
|
+import java.time.Duration;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.time.ZoneId;
|
|
|
+import java.util.*;
|
|
|
import java.util.concurrent.atomic.AtomicLong;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
@DubboService
|
|
|
@RequiredArgsConstructor
|
|
|
@@ -25,6 +32,9 @@ import java.util.concurrent.atomic.AtomicLong;
|
|
|
public class RemoteSubOrderServiceImpl implements RemoteSubOrderService {
|
|
|
|
|
|
private final SysSubOrderMapper baseMapper;
|
|
|
+ private final SysSubOrderLogMapper subOrderLogMapper;
|
|
|
+
|
|
|
+ private final ISysOrderSettingService sysOrderSettingService;
|
|
|
|
|
|
@Override
|
|
|
public List<Long> getIdsByCode(String code) {
|
|
|
@@ -291,4 +301,92 @@ public class RemoteSubOrderServiceImpl implements RemoteSubOrderService {
|
|
|
|
|
|
return vos;
|
|
|
}
|
|
|
+
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @Override
|
|
|
+ public boolean timeoutCancel() {
|
|
|
+
|
|
|
+ SysOrderSetting setting = sysOrderSettingService.getById(1L);
|
|
|
+ long timeout = setting.getTimeoutCancelTime();
|
|
|
+
|
|
|
+ List<SysSubOrder> orders = baseMapper.selectList(
|
|
|
+ Wrappers.lambdaQuery(SysSubOrder.class)
|
|
|
+ .eq(SysSubOrder::getStatus, OrderStatusEnum.PENDING_ACCEPT.getValue())
|
|
|
+ );
|
|
|
+ if (orders.isEmpty()) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ List<Long> orderIds = new ArrayList<>();
|
|
|
+ orders.forEach(e -> orderIds.add(e.getId()));
|
|
|
+ Map<Long, List<SysSubOrderLog>> logMap = subOrderLogMapper.selectList(
|
|
|
+ Wrappers.lambdaQuery(SysSubOrderLog.class)
|
|
|
+ .in(SysSubOrderLog::getSubOrderId, orderIds)
|
|
|
+ .eq(SysSubOrderLog::getActionerType, OrderLogActionerTypeEnum.SYS_USER.getValue())
|
|
|
+ .eq(SysSubOrderLog::getStep, OrderLogSystemStepEnum.DISPATCH.getStep())
|
|
|
+ .orderByDesc(SysSubOrderLog::getId)
|
|
|
+ ).stream()
|
|
|
+ .collect(Collectors.groupingBy(SysSubOrderLog::getSubOrderId));
|
|
|
+
|
|
|
+ List<SysSubOrder> cancels = new ArrayList<>();
|
|
|
+
|
|
|
+ for (SysSubOrder order : orders) {
|
|
|
+
|
|
|
+ List<SysSubOrderLog> logs = logMap.get(order.getId());
|
|
|
+
|
|
|
+ if (logs == null || logs.isEmpty()) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ SysSubOrderLog log = logs.get(0);
|
|
|
+ if (log.getCreateTime() != null) {
|
|
|
+ Date createTime = log.getCreateTime();
|
|
|
+
|
|
|
+ LocalDateTime time = createTime.toInstant()
|
|
|
+ .atZone(ZoneId.systemDefault())
|
|
|
+ .toLocalDateTime();
|
|
|
+
|
|
|
+ long mins = Duration.between(time, LocalDateTime.now()).toMinutes();
|
|
|
+
|
|
|
+ if (mins > timeout) {
|
|
|
+ order.setStatus(OrderStatusEnum.CANCELLED.getValue());
|
|
|
+ cancels.add(order);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!cancels.isEmpty()) {
|
|
|
+
|
|
|
+ List<SysSubOrderLog> logs = new ArrayList<>();
|
|
|
+ cancels.forEach(order -> {
|
|
|
+ SysSubOrderLog log = new SysSubOrderLog();
|
|
|
+ log.setSubOrderId(order.getId());
|
|
|
+ log.setActioner(SystemConstants.SUPER_ADMIN_ID);
|
|
|
+ log.setActionerType(OrderLogActionerTypeEnum.SYS_USER.getValue());
|
|
|
+ log.setLogType(OrderLogTypeEnum.ORDER.getValue());
|
|
|
+ log.setStep(OrderLogSystemStepEnum.CANCEL.getStep());
|
|
|
+ log.setTitle("超时取消");
|
|
|
+ log.setContent("履约者超过" + timeout + "分钟未结单,系统自动取消");
|
|
|
+ log.setTenantId(order.getTenantId());
|
|
|
+ log.setCreateBy(SystemConstants.SUPER_ADMIN_ID);
|
|
|
+ log.setCreateTime(new Date());
|
|
|
+ logs.add(log);
|
|
|
+ });
|
|
|
+
|
|
|
+ boolean orderFlag = baseMapper.updateBatchById(cancels);
|
|
|
+ if (!orderFlag) {
|
|
|
+ throw new RuntimeException("批量修改状态失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ boolean logFlag = subOrderLogMapper.insertBatch(logs);
|
|
|
+ if (!logFlag) {
|
|
|
+ throw new RuntimeException("批量新增日志失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
}
|