Browse Source

feat(all): 修改报表数据展示不完整问题

dist.1.3.0
zhaoqiaobo 9 months ago
parent
commit
5acb2d1a62
  1. 5
      blade-service/logpm-report/src/main/java/com/logpm/report/config/ExecutorConfig.java
  2. 6
      blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/AsyncServiceImpl.java
  3. 92
      blade-service/logpm-report/src/main/java/com/logpm/report/service/impl/ReportDeliverServiceImpl.java

5
blade-service/logpm-report/src/main/java/com/logpm/report/config/ExecutorConfig.java

@ -1,5 +1,6 @@
package com.logpm.report.config; package com.logpm.report.config;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC; import org.slf4j.MDC;
import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.secure.utils.AuthUtil;
@ -63,9 +64,9 @@ public class ExecutorConfig {
MDC.setContextMap(mdcMap); MDC.setContextMap(mdcMap);
} }
RequestContextHolder.setRequestAttributes(context); RequestContextHolder.setRequestAttributes(context);
String tenantId1 = AuthUtil.getTenantId(); DynamicDataSourceContextHolder.push(AuthUtil.getTenantId());
runnable.run(); runnable.run();
DynamicDataSourceContextHolder.poll();
} finally { } finally {
RequestContextHolder.resetRequestAttributes(); RequestContextHolder.resetRequestAttributes();
all.clear(); all.clear();

6
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 lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T; import org.apache.poi.ss.formula.functions.T;
import org.springblade.common.annotations.LogpmAsync; import org.springblade.common.annotations.LogpmAsync;
import org.springblade.core.secure.utils.AuthUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -91,14 +92,15 @@ public class AsyncServiceImpl implements IAsyncService {
} }
@Override @Override
@LogpmAsync("asyncExecutor") // @LogpmAsync("asyncExecutor")
public List<DeliveryTrainLoadedScanDTO> getDeliveryTrainLoadSacnInvnByIds(List<Long> idBatch) { public List<DeliveryTrainLoadedScanDTO> getDeliveryTrainLoadSacnInvnByIds(List<Long> idBatch) {
return reportDeliverMapeer.getDeliveryTrainLoadSacnInvnByIds(idBatch); return reportDeliverMapeer.getDeliveryTrainLoadSacnInvnByIds(idBatch);
} }
@Override @Override
@LogpmAsync("asyncExecutor") // @LogpmAsync("asyncExecutor")
public List<DeliveryTrainLoadedScanDTO> getDeliveryTrainLoadSacnByIds(List<Long> idBatch) { public List<DeliveryTrainLoadedScanDTO> getDeliveryTrainLoadSacnByIds(List<Long> idBatch) {
String tenantId = AuthUtil.getTenantId();
return reportDeliverMapeer.getDeliveryTrainLoadSacnByIds(idBatch); return reportDeliverMapeer.getDeliveryTrainLoadSacnByIds(idBatch);
} }

92
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.convert.Convert;
import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil; 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.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
@ -31,15 +32,24 @@ import com.logpm.report.vo.ReportDevilerVO;
import com.logpm.report.vo.StockOrderVO; import com.logpm.report.vo.StockOrderVO;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.apache.poi.ss.formula.functions.T; import org.apache.poi.ss.formula.functions.T;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springblade.core.log.exception.ServiceException; import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.support.Condition; 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 org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; 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 * @author zhaoqiaobo
@ -60,6 +70,10 @@ public class ReportDeliverServiceImpl implements ReportDeliverService {
private final ReportExcelUtil reportExcelUtil; private final ReportExcelUtil reportExcelUtil;
private final IAsyncService anAsyncService; private final IAsyncService anAsyncService;
@Autowired
@Qualifier("asyncExecutor")
private Executor asyncExecutor;
@Override @Override
public IPage<ReportDevilerVO> deliveryTrainPage(ReportDevilerVO vo, ReportDevilerQuery query) { public IPage<ReportDevilerVO> deliveryTrainPage(ReportDevilerVO vo, ReportDevilerQuery query) {
// 校验时间 // 校验时间
@ -75,10 +89,86 @@ public class ReportDeliverServiceImpl implements ReportDeliverService {
// 2 用户页面没有选择仓库,但是切换了仓库,按切换的仓库查 // 2 用户页面没有选择仓库,但是切换了仓库,按切换的仓库查
// 3 用户没有选择仓库,也没有切换仓库,按用户当前所有仓查询 // 3 用户没有选择仓库,也没有切换仓库,按用户当前所有仓查询
ReportUtil.buildReportWarehouseAuth(vo.getWarehouseName(), query.getWarehouseNameRange(), queryWrapper, warehouseClient); ReportUtil.buildReportWarehouseAuth(vo.getWarehouseName(), query.getWarehouseNameRange(), queryWrapper, warehouseClient);
List<ReportDevilerVO> deliveryTrainPage = reportDataService.getReportDevilerVOList(page, queryWrapper); // List<ReportDevilerVO> deliveryTrainPage = reportDataService.getReportDevilerVOList(page, queryWrapper);
// 查询数据
List<ReportDevilerVO> deliveryTrainPage = reportDeliverMapeer.getDeliveryTrainPage(page, queryWrapper);
// 异步组装统计数据
asyncBuildDeliveryTrainPage(deliveryTrainPage);
return page.setRecords(deliveryTrainPage); return page.setRecords(deliveryTrainPage);
} }
private void asyncBuildDeliveryTrainPage(List<ReportDevilerVO> deliveryTrainPage) {
List<Long> ids = deliveryTrainPage.stream().map(ReportDevilerVO::getId).collect(Collectors.toList());
// 异步查询扫描装车和异常扫描装车数据
if (CollUtil.isNotEmpty(ids)) {
// 每5000个提交一次查询
List<List<Long>> partitionedIds = CollUtil.split(ids, 5000);
List<CompletableFuture<List<DeliveryTrainLoadedScanDTO>>> futures = new ArrayList<>();
for (List<Long> idBatch : partitionedIds) {
futures.add(getTrainLoadedScanFuture(idBatch, deliveryTrainPage));
futures.add(getTrainLoadedScanInvnFuture(idBatch, deliveryTrainPage));
}
try {
CompletableFuture<Void> allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
allFutures.join();
} catch (Exception e) {
log.error("系统异常:{}", e);
}
}
}
private @NotNull CompletableFuture<List<DeliveryTrainLoadedScanDTO>> getTrainLoadedScanInvnFuture(List<Long> idBatch, List<ReportDevilerVO> deliveryTrainPage) {
CompletableFuture<List<DeliveryTrainLoadedScanDTO>> future = CompletableFuture.supplyAsync(() ->
anAsyncService.getDeliveryTrainLoadSacnInvnByIds(idBatch), (ThreadPoolTaskExecutor) asyncExecutor);
future.thenAccept(list -> {
if (CollUtil.isNotEmpty(list)) {
// list 封装为map deliveryId为key
Map<Long, DeliveryTrainLoadedScanDTO> loadedScanDTOMap = new HashMap<>();
list.forEach(dto -> loadedScanDTOMap.put(dto.getDeliveryId(), dto));
List<ReportDevilerVO> 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<List<DeliveryTrainLoadedScanDTO>> getTrainLoadedScanFuture(List<Long> idBatch, List<ReportDevilerVO> deliveryTrainPage) {
CompletableFuture<List<DeliveryTrainLoadedScanDTO>> future = CompletableFuture.supplyAsync(() ->
anAsyncService.getDeliveryTrainLoadSacnByIds(idBatch), (ThreadPoolTaskExecutor) asyncExecutor);
future.thenAccept(list -> {
if (CollUtil.isNotEmpty(list)) {
// list 封装为map deliveryId为key
Map<Long, DeliveryTrainLoadedScanDTO> loadedScanDTOMap = new HashMap<>();
list.forEach(dto -> loadedScanDTOMap.put(dto.getDeliveryId(), dto));
List<ReportDevilerVO> 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<ReportDevilerVO> queryWrapper) { private void trainCustomQuery(ReportDevilerQuery query, QueryWrapper<ReportDevilerVO> queryWrapper) {
// 配送时间开始 // 配送时间开始
QueryUtil.timeGe("task_time", query.getStartTaskTime(), queryWrapper); QueryUtil.timeGe("task_time", query.getStartTaskTime(), queryWrapper);

Loading…
Cancel
Save