diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/config/ExecutorConfig.java b/blade-service/logpm-report/src/main/java/com/logpm/report/config/ExecutorConfig.java index 195483452..ca10e8311 100644 --- a/blade-service/logpm-report/src/main/java/com/logpm/report/config/ExecutorConfig.java +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/config/ExecutorConfig.java @@ -1,5 +1,6 @@ package com.logpm.report.config; +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; import lombok.extern.slf4j.Slf4j; import org.slf4j.MDC; import org.springblade.core.secure.utils.AuthUtil; @@ -63,9 +64,9 @@ public class ExecutorConfig { MDC.setContextMap(mdcMap); } RequestContextHolder.setRequestAttributes(context); - String tenantId1 = AuthUtil.getTenantId(); - + DynamicDataSourceContextHolder.push(AuthUtil.getTenantId()); runnable.run(); + DynamicDataSourceContextHolder.poll(); } finally { RequestContextHolder.resetRequestAttributes(); all.clear(); diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/AsyncServiceImpl.java b/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/AsyncServiceImpl.java index 7e55ba191..5f0552320 100644 --- a/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/AsyncServiceImpl.java +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/AsyncServiceImpl.java @@ -15,6 +15,7 @@ import com.logpm.report.vo.ReportDetailVO; import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.formula.functions.T; import org.springblade.common.annotations.LogpmAsync; +import org.springblade.core.secure.utils.AuthUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -91,14 +92,15 @@ public class AsyncServiceImpl implements IAsyncService { } @Override - @LogpmAsync("asyncExecutor") + // @LogpmAsync("asyncExecutor") public List getDeliveryTrainLoadSacnInvnByIds(List idBatch) { return reportDeliverMapeer.getDeliveryTrainLoadSacnInvnByIds(idBatch); } @Override - @LogpmAsync("asyncExecutor") + // @LogpmAsync("asyncExecutor") public List getDeliveryTrainLoadSacnByIds(List idBatch) { + String tenantId = AuthUtil.getTenantId(); return reportDeliverMapeer.getDeliveryTrainLoadSacnByIds(idBatch); } diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/ReportDeliverServiceImpl.java b/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/ReportDeliverServiceImpl.java index ddd7b4c4a..8c4d7cff3 100644 --- a/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/ReportDeliverServiceImpl.java +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/ReportDeliverServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -31,15 +32,24 @@ import com.logpm.report.vo.ReportDevilerVO; import com.logpm.report.vo.StockOrderVO; import lombok.AllArgsConstructor; import org.apache.poi.ss.formula.functions.T; +import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.support.Condition; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; +import java.util.stream.Collectors; /** * @author zhaoqiaobo @@ -60,6 +70,10 @@ public class ReportDeliverServiceImpl implements ReportDeliverService { private final ReportExcelUtil reportExcelUtil; private final IAsyncService anAsyncService; + @Autowired + @Qualifier("asyncExecutor") + private Executor asyncExecutor; + @Override public IPage deliveryTrainPage(ReportDevilerVO vo, ReportDevilerQuery query) { // 校验时间 @@ -75,10 +89,86 @@ public class ReportDeliverServiceImpl implements ReportDeliverService { // 2 用户页面没有选择仓库,但是切换了仓库,按切换的仓库查 // 3 用户没有选择仓库,也没有切换仓库,按用户当前所有仓查询 ReportUtil.buildReportWarehouseAuth(vo.getWarehouseName(), query.getWarehouseNameRange(), queryWrapper, warehouseClient); - List deliveryTrainPage = reportDataService.getReportDevilerVOList(page, queryWrapper); + // List deliveryTrainPage = reportDataService.getReportDevilerVOList(page, queryWrapper); + // 查询数据 + List deliveryTrainPage = reportDeliverMapeer.getDeliveryTrainPage(page, queryWrapper); + // 异步组装统计数据 + asyncBuildDeliveryTrainPage(deliveryTrainPage); return page.setRecords(deliveryTrainPage); } + private void asyncBuildDeliveryTrainPage(List deliveryTrainPage) { + List ids = deliveryTrainPage.stream().map(ReportDevilerVO::getId).collect(Collectors.toList()); + // 异步查询扫描装车和异常扫描装车数据 + if (CollUtil.isNotEmpty(ids)) { + // 每5000个提交一次查询 + List> partitionedIds = CollUtil.split(ids, 5000); + List>> futures = new ArrayList<>(); + for (List idBatch : partitionedIds) { + futures.add(getTrainLoadedScanFuture(idBatch, deliveryTrainPage)); + futures.add(getTrainLoadedScanInvnFuture(idBatch, deliveryTrainPage)); + } + try { + CompletableFuture allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])); + allFutures.join(); + } catch (Exception e) { + log.error("系统异常:{}", e); + } + } + } + + private @NotNull CompletableFuture> getTrainLoadedScanInvnFuture(List idBatch, List deliveryTrainPage) { + CompletableFuture> future = CompletableFuture.supplyAsync(() -> + anAsyncService.getDeliveryTrainLoadSacnInvnByIds(idBatch), (ThreadPoolTaskExecutor) asyncExecutor); + future.thenAccept(list -> { + if (CollUtil.isNotEmpty(list)) { + // list 封装为map deliveryId为key + Map loadedScanDTOMap = new HashMap<>(); + list.forEach(dto -> loadedScanDTOMap.put(dto.getDeliveryId(), dto)); + List collect = deliveryTrainPage.stream().filter(reportDevilerVO -> idBatch.contains(reportDevilerVO.getId())).collect(Collectors.toList()); + for (ReportDevilerVO reportDevilerVO : collect) { + if (loadedScanDTOMap.containsKey(reportDevilerVO.getId())) { + DeliveryTrainLoadedScanDTO dto = loadedScanDTOMap.get(reportDevilerVO.getId()); + reportDevilerVO.setInvnLoadedNum(StrUtil.isNotEmpty(dto.getLoadedNum()) ? dto.getLoadedNum() : "0"); + reportDevilerVO.setInvnReNum(StrUtil.isNotEmpty(dto.getReNum()) ? dto.getReNum() : "0"); + } else { + reportDevilerVO.setInvnLoadedNum("0"); + reportDevilerVO.setInvnReNum("0"); + } + } + } + }); + return future; + } + + private @NotNull CompletableFuture> getTrainLoadedScanFuture(List idBatch, List deliveryTrainPage) { + CompletableFuture> future = CompletableFuture.supplyAsync(() -> + anAsyncService.getDeliveryTrainLoadSacnByIds(idBatch), (ThreadPoolTaskExecutor) asyncExecutor); + future.thenAccept(list -> { + if (CollUtil.isNotEmpty(list)) { + // list 封装为map deliveryId为key + Map loadedScanDTOMap = new HashMap<>(); + list.forEach(dto -> loadedScanDTOMap.put(dto.getDeliveryId(), dto)); + List collect = deliveryTrainPage.stream().filter(reportDevilerVO -> idBatch.contains(reportDevilerVO.getId())).collect(Collectors.toList()); + for (ReportDevilerVO reportDevilerVO : collect) { + if (loadedScanDTOMap.containsKey(reportDevilerVO.getId())) { + DeliveryTrainLoadedScanDTO dto = loadedScanDTOMap.get(reportDevilerVO.getId()); + reportDevilerVO.setLoadedNum(StrUtil.isNotEmpty(dto.getLoadedNum()) ? dto.getLoadedNum() : "0"); + reportDevilerVO.setReNum(StrUtil.isNotEmpty(dto.getReNum()) ? dto.getReNum() : "0"); + reportDevilerVO.setExLoadedNum(StrUtil.isNotEmpty(dto.getExLoadedNum()) ? dto.getExLoadedNum() : "0"); + reportDevilerVO.setExReNum(StrUtil.isNotEmpty(dto.getExReNum()) ? dto.getExReNum() : "0"); + } else { + reportDevilerVO.setLoadedNum("0"); + reportDevilerVO.setReNum("0"); + reportDevilerVO.setExLoadedNum("0"); + reportDevilerVO.setExReNum("0"); + } + } + } + }); + return future; + } + private void trainCustomQuery(ReportDevilerQuery query, QueryWrapper queryWrapper) { // 配送时间开始 QueryUtil.timeGe("task_time", query.getStartTaskTime(), queryWrapper);