From 031313fa1bc6dbad93d952cdb08c61ffa9a31466 Mon Sep 17 00:00:00 2001 From: zhaoqiaobo <583671871@qq.com> Date: Fri, 14 Jun 2024 10:49:09 +0800 Subject: [PATCH] =?UTF-8?q?feat(all):=20=E4=BF=AE=E6=94=B9=E6=8A=A5?= =?UTF-8?q?=E8=A1=A8=E6=9F=A5=E8=AF=A2=E6=96=B9=E5=BC=8F=EF=BC=8C=E6=8F=90?= =?UTF-8?q?=E5=8D=87=E6=9F=A5=E8=AF=A2=E6=95=88=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/DeliveryTrainLoadedScanDTO.java | 19 +++ .../report/mapper/ReportDeliverMapeer.java | 5 + .../report/mapper/ReportDeliverMapper.xml | 129 ++++++++++++++++++ .../impl/ReportDeliverServiceImpl.java | 114 +++++++++++++++- .../com/logpm/report/util/CheckDataUtil.java | 41 ++++++ .../com/logpm/report/util/ThreadPoolUtil.java | 1 + .../com/logpm/report/vo/ReportDevilerVO.java | 5 + 7 files changed, 313 insertions(+), 1 deletion(-) create mode 100644 blade-service/logpm-report/src/main/java/com/logpm/report/dto/DeliveryTrainLoadedScanDTO.java create mode 100644 blade-service/logpm-report/src/main/java/com/logpm/report/util/CheckDataUtil.java diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/dto/DeliveryTrainLoadedScanDTO.java b/blade-service/logpm-report/src/main/java/com/logpm/report/dto/DeliveryTrainLoadedScanDTO.java new file mode 100644 index 000000000..b8970c5dd --- /dev/null +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/dto/DeliveryTrainLoadedScanDTO.java @@ -0,0 +1,19 @@ +package com.logpm.report.dto; + +import lombok.Data; + +/** + * 配送车次报表扫描装车 + * @Author: zqb + * @Date: 2024/6/13 + */ +@Data +public class DeliveryTrainLoadedScanDTO { + + private Long deliveryId; + private String loadedNum; + private String reNum; + private String exLoadedNum; + private String exReNum; + +} diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/mapper/ReportDeliverMapeer.java b/blade-service/logpm-report/src/main/java/com/logpm/report/mapper/ReportDeliverMapeer.java index 25c228aac..412cb0955 100644 --- a/blade-service/logpm-report/src/main/java/com/logpm/report/mapper/ReportDeliverMapeer.java +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/mapper/ReportDeliverMapeer.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.logpm.report.dto.DeliveryTrainLoadedScanDTO; import com.logpm.report.vo.ReportCustomerVO; import com.logpm.report.vo.ReportDetailVO; import com.logpm.report.vo.ReportDevilerVO; @@ -64,4 +65,8 @@ public interface ReportDeliverMapeer extends BaseMapper { */ List getDetailsZeroPage(IPage page,@Param("ew") QueryWrapper queryWrapper); Long getDetailsZeroPageCount(@Param("ew") QueryWrapper queryWrapper); + + List getDeliveryTrainLoadSacnByIds(@Param("idBatch") List idBatch); + + List getDeliveryTrainLoadSacnInvnByIds(@Param("idBatch") List idBatch); } diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/mapper/ReportDeliverMapper.xml b/blade-service/logpm-report/src/main/java/com/logpm/report/mapper/ReportDeliverMapper.xml index 2b4200dac..1012644b8 100644 --- a/blade-service/logpm-report/src/main/java/com/logpm/report/mapper/ReportDeliverMapper.xml +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/mapper/ReportDeliverMapper.xml @@ -3,6 +3,90 @@ + + + + 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 f97714c54..81e5b2b4f 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 @@ -1,8 +1,14 @@ package com.logpm.report.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.logpm.basicdata.entity.BasicdataWarehouseEntity; +import com.logpm.basicdata.feign.IBasicdataWarehouseClient; +import com.logpm.report.dto.DeliveryTrainLoadedScanDTO; import com.logpm.report.mapper.ReportDeliverMapeer; import com.logpm.report.query.DevilerDetailsQuery; import com.logpm.report.query.ReportCustomerQuery; @@ -13,6 +19,7 @@ import com.logpm.report.reader.DeliveryDetailReader; import com.logpm.report.reader.DeliveryTrainReader; import com.logpm.report.reader.StockOrderReader; import com.logpm.report.service.ReportDeliverService; +import com.logpm.report.util.CheckDataUtil; import com.logpm.report.util.QueryUtil; import com.logpm.report.util.ReportExcelUtil; import com.logpm.report.vo.ReportCustomerVO; @@ -20,11 +27,19 @@ import com.logpm.report.vo.ReportDetailVO; import com.logpm.report.vo.ReportDevilerVO; import com.logpm.report.vo.StockOrderVO; import lombok.AllArgsConstructor; +import org.jetbrains.annotations.NotNull; +import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.support.Condition; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; /** * @author zhaoqiaobo @@ -39,14 +54,110 @@ public class ReportDeliverServiceImpl implements ReportDeliverService { private final DeliveryCustomerReader deliveryCustomerReader; private final DeliveryDetailReader deliveryDetailReader; private final StockOrderReader stockOrderReader; + private final IBasicdataWarehouseClient warehouseClient; @Override public IPage deliveryTrainPage(ReportDevilerVO vo, ReportDevilerQuery query) { + // 校验时间 + dateIsWithinOneMonth(vo.getTaskTime(), query.getStartTaskTime(), query.getEndTaskTime()); IPage page = Condition.getPage(query); QueryWrapper queryWrapper = QueryUtil.buildQueryWrapper(vo, ReportDevilerVO.class); // 自定义 sql 查询条件 trainCustomQuery(query, queryWrapper); - return page.setRecords(reportDeliverMapeer.getDeliveryTrainPage(page, queryWrapper)); + // 用户仓库权限 + // 1 如果用户页面选择了仓库,按选择的仓库查询。 + // 2 用户页面没有选择仓库,但是切换了仓库,按切换的仓库查 + // 3 用户没有选择仓库,也没有切换仓库,按用户当前所有仓查询 + if (StrUtil.isEmpty(vo.getWarehouseName())) { + BasicdataWarehouseEntity myCurrentWarehouse = warehouseClient.getMyCurrentWarehouse(); + if (ObjectUtil.isNotEmpty(myCurrentWarehouse)) { + queryWrapper.eq("warehouse_id", myCurrentWarehouse.getId()); + } else { + List warehouseEntities = warehouseClient.getMyWarehouseList(); + queryWrapper.in("warehouse_id", warehouseEntities.stream().map(BasicdataWarehouseEntity::getId).collect(Collectors.toList())); + } + } + + List deliveryTrainPage = reportDeliverMapeer.getDeliveryTrainPage(page, queryWrapper); + 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) { + + } + } + return page.setRecords(deliveryTrainPage); + } + + private @NotNull CompletableFuture> getTrainLoadedScanInvnFuture(List idBatch, List deliveryTrainPage) { + CompletableFuture> future = CompletableFuture.supplyAsync(() -> + reportDeliverMapeer.getDeliveryTrainLoadSacnInvnByIds(idBatch)); + 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(() -> + reportDeliverMapeer.getDeliveryTrainLoadSacnByIds(idBatch)); + 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 static void dateIsWithinOneMonth(String taskTime, Date startTaskTime, Date endTaskTime) { + if (ObjectUtil.isEmpty(taskTime)) { + boolean withinOneMonth = CheckDataUtil.isWithinOneMonth(startTaskTime, endTaskTime); + if (!withinOneMonth) { + throw new ServiceException("日期必选且日期只能选择一个月"); + } + } } private void trainCustomQuery(ReportDevilerQuery query, QueryWrapper queryWrapper) { @@ -68,6 +179,7 @@ public class ReportDeliverServiceImpl implements ReportDeliverService { @Override public void exportTrain(HttpServletResponse response, ReportDevilerVO vo, ReportDevilerQuery query) { + dateIsWithinOneMonth(vo.getTaskTime(), query.getStartTaskTime(), query.getEndTaskTime()); QueryWrapper queryWrapper = QueryUtil.buildQueryWrapper(vo, ReportDevilerVO.class); trainCustomQuery(query, queryWrapper); new ReportExcelUtil().export(response, deliveryTrainReader, ReportDevilerVO.class, queryWrapper, "配送车次维度报表"); diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/util/CheckDataUtil.java b/blade-service/logpm-report/src/main/java/com/logpm/report/util/CheckDataUtil.java new file mode 100644 index 000000000..7aaea6eb3 --- /dev/null +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/util/CheckDataUtil.java @@ -0,0 +1,41 @@ +package com.logpm.report.util; + +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; + +import java.util.Date; + +/** + * 数据校验工具类 + * + * @Author zqb + * @Date 2024/6/13 + **/ +public class CheckDataUtil { + + /** + * 校验两个时间相差不超过 30 天 + * 如果不跨月则返回 true + * 如果跨月则不超过 30 天 + * + * @Param start 开始时间 + * @Param end 解释时间 + * @Return boolean + * @Author zqb 2024/6/13 + **/ + public static boolean isWithinOneMonth(Date start, Date end) { + // 检查输入是否为null + if (start == null || end == null) { + return false; + } + + // 是否跨月,不跨越则直接返回true + if (DateUtil.year(start) == DateUtil.year(end) && DateUtil.month(start) == DateUtil.month(end)) { + return true; + } + + // 跨越则判断两个日期是否相差超过30天 + return DateUtil.between(start, end, DateUnit.DAY) <= 30; + } + +} diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/util/ThreadPoolUtil.java b/blade-service/logpm-report/src/main/java/com/logpm/report/util/ThreadPoolUtil.java index f380ba860..381bfbe8e 100644 --- a/blade-service/logpm-report/src/main/java/com/logpm/report/util/ThreadPoolUtil.java +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/util/ThreadPoolUtil.java @@ -29,6 +29,7 @@ public class ThreadPoolUtil { executor.shutdownNow(); } executor = ExecutorBuilder.create() + // 设置核心线程 .setCorePoolSize(8) .setMaxPoolSize(20) .setThreadFactory(ThreadFactoryBuilder.create().setNamePrefix("logpm-report-").build()) diff --git a/blade-service/logpm-report/src/main/java/com/logpm/report/vo/ReportDevilerVO.java b/blade-service/logpm-report/src/main/java/com/logpm/report/vo/ReportDevilerVO.java index fd1713602..ff6bf6c64 100644 --- a/blade-service/logpm-report/src/main/java/com/logpm/report/vo/ReportDevilerVO.java +++ b/blade-service/logpm-report/src/main/java/com/logpm/report/vo/ReportDevilerVO.java @@ -1,5 +1,6 @@ package com.logpm.report.vo; +import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.alibaba.excel.annotation.write.style.ContentRowHeight; @@ -25,6 +26,10 @@ public class ReportDevilerVO implements Serializable { private static final long serialVersionUID = 1L; + @ApiModelProperty(value = "配送id") + @ExcelIgnore + private Long id; + @ApiModelProperty(value = "车次") @ExcelProperty("车次") private String trainNumber;