From aed825e462985717dd89cf72137c3ed0a1d2b18d Mon Sep 17 00:00:00 2001 From: mashuai Date: Sun, 28 Sep 2025 23:33:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9D=90=E6=96=99=E7=AB=99=E4=BE=9B=E5=BA=94?= =?UTF-8?q?=E5=B9=B3=E8=A1=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clz/domain/vo/MaterialProvideNumInfo.java | 3 + .../vo/MaterialRetainedEquipmentInfo.java | 3 + .../impl/MaterialMachineServiceImpl.java | 60 ++++++++++++------- .../material/clz/MaterialMachineMapper.xml | 32 ++++++---- 4 files changed, 64 insertions(+), 34 deletions(-) diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/domain/vo/MaterialProvideNumInfo.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/domain/vo/MaterialProvideNumInfo.java index 5427a8db..7ceb76e5 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/domain/vo/MaterialProvideNumInfo.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/domain/vo/MaterialProvideNumInfo.java @@ -185,4 +185,7 @@ public class MaterialProvideNumInfo { private String endTime; private String unitValue; + + @ApiModelProperty(value = "协议id") + private String agreementIds; } diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/domain/vo/MaterialRetainedEquipmentInfo.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/domain/vo/MaterialRetainedEquipmentInfo.java index 7fd7d599..9032b6cf 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/domain/vo/MaterialRetainedEquipmentInfo.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/domain/vo/MaterialRetainedEquipmentInfo.java @@ -266,4 +266,7 @@ public class MaterialRetainedEquipmentInfo { @ApiModelProperty(value = "工程集合") private List proNameList; + + @ApiModelProperty(value = "协议id") + private String agreementIds; } diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/service/impl/MaterialMachineServiceImpl.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/service/impl/MaterialMachineServiceImpl.java index 1066c311..426e587d 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/service/impl/MaterialMachineServiceImpl.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/service/impl/MaterialMachineServiceImpl.java @@ -1328,39 +1328,57 @@ public class MaterialMachineServiceImpl implements MaterialMachineService { return recordList; } - // 1. 过滤数据(保留原逻辑,使用并行流加速大集合过滤) + // 1. 过滤数据(并行流加速大集合过滤) if (teamData != null) { - recordList = recordList.parallelStream() // 并行流适合大集合过滤 + recordList = recordList.parallelStream() .filter(item -> StringUtils.isBlank(item.getIdCard()) || username.equals(item.getIdCard())) .collect(Collectors.toList()); } - // 2. 提取批量查询的关键参数(工程ID + typeId),避免重复创建对象 + // 2. 转换参数:将agreementIds(逗号字符串)转为List List> queryParams = recordList.stream() .map(record -> { - Map param = new HashMap<>(2); + Map param = new HashMap<>(3); param.put("proId", record.getProId()); param.put("typeId", record.getTypeId()); + + // 逗号分隔的agreementIds转为List + String agreementIds = record.getAgreementIds(); + if (StringUtils.isNotBlank(agreementIds)) { + List agreementIdList = Arrays.asList(agreementIds.split(",")); + param.put("agreementIds", agreementIdList); + } else { + param.put("agreementIds", Collections.emptyList()); + } return param; }) .collect(Collectors.toList()); - // 3. 批量查询(核心优化:2次查询替代N次循环查询,减少99%+的数据库交互) - // 3.1 批量查询领料数据,构建映射(key=projectId_typeId,value=businessNum) - Map leaseBusinessMap = materialMachineMapper.batchQueryLeaseDemand(queryParams).stream() - .collect(Collectors.toMap( - info -> getCompositeKey(info.getProId(), info.getTypeId()), // 抽成方法,避免重复代码 - MaterialProvideNumInfo::getBusinessNum, - (existing, replacement) -> existing // 重复key保留第一个(按业务需求调整) - )); + // 3. 核心:分批处理查询参数(避免数据包过大) + int batchSize = 300; // 每批大小(根据实际测试调整,建议200-500) + Map leaseBusinessMap = new HashMap<>(); // 最终合并结果 + + // 计算总批次数 + int totalBatches = (int) Math.ceil((double) queryParams.size() / batchSize); + + for (int i = 0; i < totalBatches; i++) { + // 计算当前批次的起止索引 + int start = i * batchSize; + int end = Math.min(start + batchSize, queryParams.size()); + List> subParams = queryParams.subList(start, end); + + // 分批查询 + List batchResult = materialMachineMapper.batchQueryLeaseDemand(subParams); + + // 将当前批次结果合并到总Map中 + batchResult.stream() + .forEach(info -> { + String key = getCompositeKey(info.getProId(), info.getTypeId()); + // 若有重复key,保留第一个(与原逻辑一致) + leaseBusinessMap.putIfAbsent(key, info.getBusinessNum()); + }); + } - // 3.2 批量查询领用数据,构建映射 - Map publishBusinessMap = materialMachineMapper.batchQueryUseDemand(queryParams).stream() - .collect(Collectors.toMap( - info -> getCompositeKey(info.getProId(), info.getTypeId()), - MaterialProvideNumInfo::getBusinessNum, - (existing, replacement) -> existing - )); // 4. 并行流处理大集合,计算总和并设置record的businessNum(内存操作并行化) // 用数组存储四个总和(比对象更高效,减少gc) @@ -1370,9 +1388,7 @@ public class MaterialMachineServiceImpl implements MaterialMachineService { recordList.parallelStream().forEach(record -> { String key = getCompositeKey(record.getProId(), record.getTypeId()); // 从Map获取数据(默认0,避免null) - BigDecimal leaseNum = leaseBusinessMap.getOrDefault(key, BigDecimal.ZERO); - BigDecimal publishNum = publishBusinessMap.getOrDefault(key, BigDecimal.ZERO); - BigDecimal businessNum = leaseNum.add(publishNum); + BigDecimal businessNum = leaseBusinessMap.getOrDefault(key, BigDecimal.ZERO); // 设置record的businessNum(原逻辑保留) record.setBusinessNum(businessNum); diff --git a/bonus-modules/bonus-material/src/main/resources/mapper/material/clz/MaterialMachineMapper.xml b/bonus-modules/bonus-material/src/main/resources/mapper/material/clz/MaterialMachineMapper.xml index b3b9cfde..c775699b 100644 --- a/bonus-modules/bonus-material/src/main/resources/mapper/material/clz/MaterialMachineMapper.xml +++ b/bonus-modules/bonus-material/src/main/resources/mapper/material/clz/MaterialMachineMapper.xml @@ -2015,7 +2015,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" '安全工器具' ELSE '施工机具' - END jiJuType + END jiJuType, + subquery1.agreementId AS agreementIds FROM ma_type mt LEFT JOIN ( SELECT @@ -2034,7 +2035,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" bp.imp_unit AS impUnit, bu.bzz_idcard AS idCard, df.project_dept AS proCenter, - sd.dept_name AS departName + sd.dept_name AS departName, + GROUP_CONCAT(DISTINCT sai.agreement_id) AS agreementId FROM slt_agreement_info sai LEFT JOIN ma_type mt ON mt.type_id = sai.type_id @@ -2256,26 +2258,32 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"