From ac5ca6258debde4bda7538f4f6ff6005d1b64385 Mon Sep 17 00:00:00 2001 From: mashuai Date: Sun, 28 Sep 2025 21:36:20 +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 --- .../controller/MaterialMachineController.java | 77 +++++ .../clz/domain/vo/MaterialProvideNumInfo.java | 188 ++++++++++ .../vo/MaterialRetainedEquipmentInfo.java | 3 +- .../clz/domain/vo/MaterialSecondInfo.java | 173 +++++++++ .../clz/mapper/MaterialMachineMapper.java | 44 +++ .../clz/service/MaterialMachineService.java | 14 + .../impl/MaterialLeaseInfoServiceImpl.java | 8 - .../impl/MaterialMachineServiceImpl.java | 133 +++++++ .../material/clz/MaterialMachineMapper.xml | 327 ++++++++++++++++++ 9 files changed, 958 insertions(+), 9 deletions(-) create mode 100644 bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/domain/vo/MaterialProvideNumInfo.java create mode 100644 bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/domain/vo/MaterialSecondInfo.java diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/controller/MaterialMachineController.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/controller/MaterialMachineController.java index 39f22841..4e0243c8 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/controller/MaterialMachineController.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/controller/MaterialMachineController.java @@ -508,4 +508,81 @@ public class MaterialMachineController extends BaseController { ExcelUtil util = new ExcelUtil<>(MaterialStorageAndUseNumInfo.class); util.exportExcel(response, list, "综合查询--材料站设备保有量查询"); } + + /** + * 供需平衡数据查询 + * @param bean + * @return + */ + @ApiOperation(value = "综合查询--材料站供应需求平衡数据查询") + @GetMapping("/getDemandAndSupply") + public AjaxResult getDemandAndSupply(MaterialRetainedEquipmentInfo bean) { + bean.setIsExport(1); + Integer pageIndex = Convert.toInt(ServletUtils.getParameter("pageNum"), 1); + Integer pageSize = Convert.toInt(ServletUtils.getParameter("pageSize"), 10); + List list = materialMachineService.getDemandAndSupply(bean); + return AjaxResult.success(ListPagingUtil.paging(pageIndex, pageSize, list)); + } + + /** + * 供需平衡数据查询不带分页 + * @param bean + * @return + */ + @ApiOperation(value = "综合查询--材料站供应需求平衡数据查询不带分页") + @GetMapping("/getDemandAndSupplyNoPage") + public AjaxResult getDemandAndSupplyNoPage(MaterialRetainedEquipmentInfo bean) { + bean.setIsExport(0); + List list = materialMachineService.getDemandAndSupply(bean); + MaterialProvideNumInfo dto = new MaterialProvideNumInfo(); + if (CollectionUtils.isNotEmpty(list)) { + MaterialProvideNumInfo retainedEquipmentInfo = list.get(0); + dto.setBusinessNum(retainedEquipmentInfo.getBusinessNum()); + dto.setSupplyNum(retainedEquipmentInfo.getSupplyNum()); + dto.setStoreNum(retainedEquipmentInfo.getStoreNum()); + dto.setUseNum(retainedEquipmentInfo.getUseNum()); + } + return AjaxResult.success(dto); + } + + /** + * 导出材料站设备保有量查询 + * @param response + * @param bean + */ + @ApiOperation(value = "综合查询--材料站供应需求平衡数据查询") + @PostMapping("/exportDemandAndSupply") + public void exportDemandAndSupply(HttpServletResponse response, MaterialRetainedEquipmentInfo bean) { + bean.setIsExport(0); + List list = materialMachineService.getDemandAndSupply(bean); + ExcelUtil util = new ExcelUtil<>(MaterialProvideNumInfo.class); + util.exportExcel(response, list, "综合查询--材料站供应需求平衡数据查询"); + } + + /** + * 供需平衡数据在用二级页面查询 + * @param bean + * @return + */ + @ApiOperation(value = "综合查询--材料站供应需求平衡数据在用二级页面查询") + @GetMapping("/getUseDemandAndSupply") + public AjaxResult getUseDemandAndSupply(MaterialRetainedEquipmentInfo bean) { + startPage(); + List list = materialMachineService.getUseDemandAndSupply(bean); + return AjaxResult.success(getDataTable(list)); + } + + /** + * 导出供需平衡数据在用二级页面查询 + * @param response + * @param bean + */ + @ApiOperation(value = "综合查询--材料站供应需求平衡数据在用二级页面查询") + @PostMapping("/exportUseDemandAndSupply") + public void exportUseDemandAndSupply(HttpServletResponse response, MaterialRetainedEquipmentInfo bean) { + bean.setIsExport(0); + List list = materialMachineService.getUseDemandAndSupply(bean); + ExcelUtil util = new ExcelUtil<>(MaterialSecondInfo.class); + util.exportExcel(response, list, "综合查询--材料站供应需求平衡数据在用二级页面查询"); + } } 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 new file mode 100644 index 00000000..5427a8db --- /dev/null +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/domain/vo/MaterialProvideNumInfo.java @@ -0,0 +1,188 @@ +package com.bonus.material.clz.domain.vo; + +import com.bonus.common.core.annotation.Excel; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** +* @description 综合查询--材料站供应需求vo +* @author ma_sh +* @date 2024/2/26 14:51 +*/ +@ApiModel(description = "材料站供应需求vo") +@Data +public class MaterialProvideNumInfo { + + private static final long serialVersionUID = 2227217051604273598L; + + @ApiModelProperty(value = "是否app 0 是,1 否") + private Integer isApp; + + @ApiModelProperty(value = "是否导出 0 是,1 否") + private Integer isExport; + + @ApiModelProperty(value = "主键id") + private Integer id; + + @ApiModelProperty(value = "工程id") + private String proId; + + @ApiModelProperty(value = "分公司") + private String impUnitName; + + @ApiModelProperty(value = "项目部") + private String departName; + + @ApiModelProperty(value = "工程名称") + @Excel(name = "工程名称", width = 50) + private String proName; + + @ApiModelProperty(value = "施工类型") + private String constructionType; + + @ApiModelProperty(value = "物资类型") + private String materialType; + + @ApiModelProperty(value = "物资名称") + @Excel(name = "物资名称") + private String typeName; + + @ApiModelProperty(value = "规格ID") + private Integer typeId; + + @ApiModelProperty(value = "规格型号") + @Excel(name = "规格型号") + private String typeModelName; + + @ApiModelProperty(value = "机具类型") + private String jiJuType; + + @ApiModelProperty(value = "计量单位") + @Excel(name = "计量单位") + private String unit; + + @ApiModelProperty(value = "业务需求数量") + @Excel(name = "业务需求数量",align = HorizontalAlignment.RIGHT) + private BigDecimal businessNum; + + @ApiModelProperty(value = "实际供应数量") + @Excel(name = "实际供应数量",align = HorizontalAlignment.RIGHT) + private BigDecimal supplyNum; + + @ApiModelProperty(value = "在库数量") + @Excel(name = "在库数量",align = HorizontalAlignment.RIGHT) + private BigDecimal storeNum; + + @ApiModelProperty(value = "在用数量") + @Excel(name = "在用数量",align = HorizontalAlignment.RIGHT) + private BigDecimal useNum; + + @ApiModelProperty(value = "数量") + private BigDecimal allNum; + + @ApiModelProperty(value = "购置单价") + private BigDecimal buyPrice; + + @ApiModelProperty(value = "管理模式") + private String manageType; + + @ApiModelProperty(value = "创建者") + private String createBy; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + @ApiModelProperty(value = "更新者") + private String updateBy; + + @ApiModelProperty(value = "更新时间 ") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + @ApiModelProperty(value = "关键字") + private String keyWord; + + @ApiModelProperty(value = "一级类型id") + private Integer firstTypeId; + + @ApiModelProperty(value = "二级类型id") + private Integer secondTypeId; + + @ApiModelProperty(value = "三级类型id") + private Integer thirdTypeId; + + /** + * 是否伸展(APP) + */ + private boolean expanded = false; + + private String maCode; + + /** 本次检验日期 */ + @ApiModelProperty(value = "本次检验日期") + @DateTimeFormat(pattern="yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date thisCheckTime; + + /** 下次检验日期 */ + @ApiModelProperty(value = "下次检验日期") + @DateTimeFormat(pattern="yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date nextCheckTime; + + /** + * 状态(0 =正常,1= 3个月检测到期,2= 1个月检测到期,3= 已过期) + */ + private String status; + + @ApiModelProperty(value = "班组id") + private String teamId; + + /** + * 班组长账号 + */ + private String teamLeaderIdCard; + + @ApiModelProperty(value = "i8工程id") + private String externalId; + + @ApiModelProperty(value = "身份证号码") + private String idCard; + + @ApiModelProperty(value = "实施单位id") + private String impUnit; + + /** + * i8工程id集合 + */ + private List projectIdList; + + private Long maId; + + private Long deptId; + + @ApiModelProperty(value = "项目部名称") + private String proCenter; + + @ApiModelProperty(value = "物资类型") + private String materialName; + + @ApiModelProperty(value = "开始时间") + private String startTime; + + @ApiModelProperty(value = "结束时间") + private String endTime; + + private String unitValue; +} 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 c9c10d28..7fd7d599 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 @@ -73,7 +73,7 @@ public class MaterialRetainedEquipmentInfo { @Excel(name = "规格型号") private String typeModelName; - @ApiModelProperty(value = "机具类型") + @ApiModelProperty("机具类型(1机具,2安全工器具)") @Excel(name = "机具类型") private String jiJuType; @@ -250,6 +250,7 @@ public class MaterialRetainedEquipmentInfo { @ApiModelProperty(value = "结束时间") private String endTime; + @ApiModelProperty(value = "0整型 1小数") private String unitValue; private String unitType; diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/domain/vo/MaterialSecondInfo.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/domain/vo/MaterialSecondInfo.java new file mode 100644 index 00000000..77531821 --- /dev/null +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/domain/vo/MaterialSecondInfo.java @@ -0,0 +1,173 @@ +package com.bonus.material.clz.domain.vo; + +import com.bonus.common.core.annotation.Excel; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; + +/** +* @description 综合查询--供应在用二级页面查询 +* @author ma_sh +* @date 2024/2/26 14:51 +*/ +@ApiModel(description = "供应在用二级页面查询") +@Data +public class MaterialSecondInfo { + + private static final long serialVersionUID = 2227217051604273598L; + + @ApiModelProperty(value = "主键id") + private Integer id; + + @ApiModelProperty(value = "工程id") + private String proId; + + @ApiModelProperty(value = "分公司") + private String impUnitName; + + @ApiModelProperty(value = "项目部") + private String departName; + + @ApiModelProperty(value = "项目部id") + private String departId; + + @ApiModelProperty(value = "工程名称") + private String proName; + + @ApiModelProperty(value = "分包单位") + @Excel(name = "分包单位", width = 25) + private String subUnitName; + + @ApiModelProperty(value = "班组名称") + @Excel(name = "班组名称") + private String teamName; + + @ApiModelProperty(value = "物资名称") + @Excel(name = "物资名称") + private String typeName; + + @ApiModelProperty(value = "规格ID") + private Integer typeId; + + @ApiModelProperty(value = "规格型号") + @Excel(name = "规格型号") + private String typeModelName; + + @ApiModelProperty(value = "机具类型") + private String jiJuType; + + @ApiModelProperty(value = "计量单位") + private String unit; + + @ApiModelProperty(value = "领用数量") + @Excel(name = "领用数量", align = HorizontalAlignment.RIGHT) + private BigDecimal leaseNum; + + @ApiModelProperty(value = "退料数量") + @Excel(name = "退料数量", align = HorizontalAlignment.RIGHT) + private BigDecimal backNum; + + @ApiModelProperty(value = "在用数量") + @Excel(name = "在用数量", align = HorizontalAlignment.RIGHT) + private BigDecimal useNum; + + @ApiModelProperty(value = "购置单价") + private BigDecimal buyPrice; + + @ApiModelProperty(value = "管理模式") + private String manageType; + + @ApiModelProperty(value = "创建者") + private String createBy; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + @ApiModelProperty(value = "更新者") + private String updateBy; + + @ApiModelProperty(value = "更新时间 ") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + @ApiModelProperty(value = "关键字") + private String keyWord; + + @ApiModelProperty(value = "数据所属组织") + private Integer companyId; + + /** + * 是否伸展(APP) + */ + private boolean expanded = false; + + /** 本次检验日期 */ + @ApiModelProperty(value = "本次检验日期") + @DateTimeFormat(pattern="yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date thisCheckTime; + + /** 下次检验日期 */ + @ApiModelProperty(value = "下次检验日期") + @DateTimeFormat(pattern="yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date nextCheckTime; + + /** + * 状态(0 =正常,1= 3个月检测到期,2= 1个月检测到期,3= 已过期) + */ + private String status; + + @ApiModelProperty(value = "班组id") + private String teamId; + + /** + * 班组长账号 + */ + private String teamLeaderIdCard; + + @ApiModelProperty(value = "i8工程id") + private String externalId; + + @ApiModelProperty(value = "身份证号码") + private String idCard; + + @ApiModelProperty(value = "实施单位id") + private String impUnit; + + private Long maId; + + @ApiModelProperty(value = "领料人") + private String leasePerson; + + @ApiModelProperty(value = "协议id") + private Long agreementId; + + private Long deptId; + + @ApiModelProperty(value = "项目部名称") + private String proCenter; + + @ApiModelProperty(value = "物资类型") + private String materialName; + + @ApiModelProperty(value = "开始时间") + private String startTime; + + @ApiModelProperty(value = "结束时间") + private String endTime; + + private String unitValue; + + private String unitType; + +} diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/mapper/MaterialMachineMapper.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/mapper/MaterialMachineMapper.java index 08e4e76c..7f8a74db 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/mapper/MaterialMachineMapper.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/mapper/MaterialMachineMapper.java @@ -7,8 +7,10 @@ import com.bonus.material.clz.domain.vo.*; import com.bonus.material.ma.domain.Machine; import com.bonus.material.clz.domain.BmTeam; import com.bonus.material.clz.domain.machine.MaterialStorageInfo; +import org.apache.ibatis.annotations.Param; import java.util.List; +import java.util.Map; /** * @Author ma_sh @@ -262,4 +264,46 @@ public interface MaterialMachineMapper { List getStoreNumAndUseList(MaterialRetainedEquipmentInfo bean); List getPickDepartList(MaterialRetainedEquipmentInfo bean); + + /** + * 供需平衡数据查询 + * @param bean + * @return + */ + List getDemandAndSupply(MaterialRetainedEquipmentInfo bean); + + /** + * 获取领料需求量 + * @param record + * @return + */ + MaterialProvideNumInfo getLeaseDemandNum(MaterialProvideNumInfo record); + + /** + * 获取领用需求量 + * @param record + * @return + */ + MaterialProvideNumInfo getUseDemandNum(MaterialProvideNumInfo record); + + /** + * 供需平衡数据在用二级页面查询 + * @param bean + * @return + */ + List getUseDemandAndSupply(MaterialRetainedEquipmentInfo bean); + + /** + * 批量查询领料需求量 + * @param queryParams + * @return + */ + List batchQueryLeaseDemand(@Param("list") List> queryParams); + + /** + * 批量查询领用数据 + * @param queryParams + * @return + */ + List batchQueryUseDemand(@Param("list") List> queryParams); } diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/service/MaterialMachineService.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/service/MaterialMachineService.java index f5f61aa6..6dc15de7 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/service/MaterialMachineService.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/service/MaterialMachineService.java @@ -184,4 +184,18 @@ public interface MaterialMachineService { List getStoreNumAndUseList(MaterialRetainedEquipmentInfo bean); List getPickDepartList(MaterialRetainedEquipmentInfo bean); + + /** + * 供需平衡数据查询 + * @param bean + * @return + */ + List getDemandAndSupply(MaterialRetainedEquipmentInfo bean); + + /** + * 供需平衡数据在用二级页面查询 + * @param bean + * @return + */ + List getUseDemandAndSupply(MaterialRetainedEquipmentInfo bean); } diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/service/impl/MaterialLeaseInfoServiceImpl.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/service/impl/MaterialLeaseInfoServiceImpl.java index f692cac5..de7cbbd6 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/service/impl/MaterialLeaseInfoServiceImpl.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/clz/service/impl/MaterialLeaseInfoServiceImpl.java @@ -1120,14 +1120,6 @@ public class MaterialLeaseInfoServiceImpl implements MaterialLeaseInfoService { materialLeaseInfoMapper.deleteLeaseApplyDetailsByParentIds(id); // 业务逻辑代码,删除lease_out_details materialLeaseInfoMapper.deleteById(id); - /*for (MaterialLeaseApplyDetails leaseApplyDetails : leaseApplyRequestVo.getLeaseApplyDetailsList()) { - if (!CollectionUtils.isEmpty(leaseApplyDetails.getMaCodeList())) { - for (MaterialLeaseMaCodeDto leaseMaCodeDto : leaseApplyDetails.getMaCodeList()) { - // 根据maId将设备改为在库状态 - machineMapper.updateStatus(leaseMaCodeDto.getMaId(), MaMachineStatusEnum.IN_STORE.getStatus()); - } - } - }*/ insertPurchaseCheckDetails(createBy, leaseApplyInfo.getTaskId(), leaseApplyRequestVo.getLeaseApplyDetailsList(), leaseApplyInfo.getId(), leaseApplyRequestVo.getLeaseApplyInfo().getIsOut()); } 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 95d2cc9a..af41b34f 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 @@ -1130,6 +1130,139 @@ public class MaterialMachineServiceImpl implements MaterialMachineService { return materialMachineMapper.getPickDepartList(bean); } + /** + * 供需平衡数据查询 + * @param bean + * @return + */ + @Override + public List getDemandAndSupply(MaterialRetainedEquipmentInfo bean) { + BigDecimal totalBusinessNum = BigDecimal.ZERO.setScale(3, RoundingMode.HALF_UP); + BigDecimal totalSupplyNum = BigDecimal.ZERO.setScale(3, RoundingMode.HALF_UP); + BigDecimal totalStoreNum = BigDecimal.ZERO.setScale(3, RoundingMode.HALF_UP); + BigDecimal totalUseNum = BigDecimal.ZERO.setScale(3, RoundingMode.HALF_UP); + String username = SecurityUtils.getLoginUser().getUsername(); + // 根据用户名判断用户是否为班组长 + BmTeam teamData = materialMachineMapper.getTeamData(username); + Set userRoles = SecurityUtils.getLoginUser().getRoles(); + // 检查用户是否具有特殊角色 + boolean hasSpecialRole = hasSpecialRole(userRoles); + if (!hasSpecialRole) { + if (teamData == null) { + // 根据用户名查询项目部信息 + List departId = mapper.getDepartId(username); + if (CollectionUtils.isNotEmpty(departId)) { + // 根据项目部id查询工程信息 + List projectIdList = mapper.getProjectId(departId); + if (!org.springframework.util.CollectionUtils.isEmpty(projectIdList)) { + bean.setProjectIdList(projectIdList); + } + } + } + // 部门查询赋值 + extractedDept(bean); + } + List recordList = materialMachineMapper.getDemandAndSupply(bean); + if (CollectionUtils.isEmpty(recordList)) { + return recordList; + } + + // 1. 过滤数据(保留原逻辑,使用并行流加速大集合过滤) + if (teamData != null) { + recordList = recordList.parallelStream() // 并行流适合大集合过滤 + .filter(item -> StringUtils.isBlank(item.getIdCard()) || username.equals(item.getIdCard())) + .collect(Collectors.toList()); + } + + // 2. 提取批量查询的关键参数(工程ID + typeId),避免重复创建对象 + List> queryParams = recordList.stream() + .map(record -> { + Map param = new HashMap<>(2); + param.put("proId", record.getProId()); + param.put("typeId", record.getTypeId()); + 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.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) + BigDecimal[] totals = new BigDecimal[4]; + Arrays.fill(totals, BigDecimal.ZERO); + + 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); + + // 设置record的businessNum(原逻辑保留) + record.setBusinessNum(businessNum); + + // 累加总和(用同步块保证线程安全,并行流必加) + synchronized (totals) { + totals[0] = totals[0].add(businessNum); + totals[1] = totals[1].add(record.getSupplyNum()); + totals[2] = totals[2].add(record.getStoreNum()); + totals[3] = totals[3].add(record.getUseNum()); + } + }); + + // 5. 赋值最终结果 + totalBusinessNum = totals[0]; + totalSupplyNum = totals[1]; + totalStoreNum = totals[2]; + totalUseNum = totals[3]; + + if (bean.getIsExport() == 0) { + MaterialProvideNumInfo info = new MaterialProvideNumInfo(); + info.setBusinessNum(totalBusinessNum); + info.setSupplyNum(totalSupplyNum); + info.setStoreNum(totalStoreNum); + info.setUseNum(totalUseNum); + info.setUnit("合计"); + recordList.add(0, info); + } + return recordList; + } + + /** + * 工具方法:生成projectId_typeId的复合key(抽成方法,避免重复代码) + * @param projectId + * @param typeId + * @return + */ + private String getCompositeKey(Object projectId, Object typeId) { + return projectId + "_" + typeId; + } + + /** + * 供需平衡数据在用二级页面查询 + * @param bean + * @return + */ + @Override + public List getUseDemandAndSupply(MaterialRetainedEquipmentInfo bean) { + return materialMachineMapper.getUseDemandAndSupply(bean); + } + /** * 设置分公司名称(如果有) * @param impUnit 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 b8c1861e..7bf4ca72 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 @@ -1969,4 +1969,331 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" WHERE bp.external_id = #{proId} + + + + + + + + + + + +