From beef2f79449317e1ab667e11e2eefe892d340df8 Mon Sep 17 00:00:00 2001 From: mashuai Date: Mon, 7 Jul 2025 19:14:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SysDeptServiceImpl.java | 310 ++++++++++-------- .../material/equipment/SysDeptMapper.xml | 122 ++++--- 2 files changed, 233 insertions(+), 199 deletions(-) diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/equipment/service/impl/SysDeptServiceImpl.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/equipment/service/impl/SysDeptServiceImpl.java index eb9f197..0261c84 100644 --- a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/equipment/service/impl/SysDeptServiceImpl.java +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/equipment/service/impl/SysDeptServiceImpl.java @@ -25,6 +25,7 @@ import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; +import java.util.function.Function; import javax.annotation.Resource; import java.util.stream.Collectors; @@ -74,164 +75,180 @@ public class SysDeptServiceImpl implements ISysDeptService { @Override public List selectDeptConfigRatePivot(DeptConfigRateSummary entity) { - // 1. 查询配置率项(每条代表一个公司+设备+评分项) - List configList = mapper.selectDeptConfigRatePivot(entity); + // 1. 查询配置率项(每条代表一个公司+设备+评分项) + List configList = mapper.selectDeptConfigRatePivot(entity); - // 2. 查询 ma_own_manage 表中原始设备数据 - List ownListFromManage = ownerMapper.list(null); + // 2. 查询 ma_own_manage 表中原始设备数据 + List ownListFromManage = ownerMapper.list(null); - // 3. 查询 ma_dev_info 表中聚合后的设备数据(包含公司名) - List ownListFromDevInfo = ownerMapper.listGrouped(); + // 3. 查询 ma_dev_info 表中聚合后的设备数据(包含公司名) + List ownListFromDevInfo = ownerMapper.listGrouped(); - // 4. 构建设备索引 Map<公司ID_设备名, List> - Map> ownIndex = new HashMap<>(); + // 4. 构建设备索引 Map<公司ID_设备名, List> + Map> ownIndex = new HashMap<>(); - for (Ownerdomin device : ownListFromManage) { - String key = device.getCompanyId() + "_" + device.getMaName(); - System.err.println("初始化的key:" + key+"-----------"+device.toString()); - ownIndex.computeIfAbsent(key, k -> new ArrayList<>()).add(device); - } - - for (NewOwnerdomin dev : ownListFromDevInfo) { - String key = dev.getCompanyId() + "_" + dev.getMaName(); - List existList = ownIndex.get(key); - System.err.println("existList:" + existList); - System.err.println("key:" + key+"-----------"+dev.getCompanyName()); - if (existList != null && !existList.isEmpty()) { - for (Ownerdomin device : existList) { - /*是否需要累加 待验证*/ - device.setMaNum(device.getMaNum() ); - device.setType("2"); - } - } else { - Ownerdomin newDevice = new Ownerdomin(); - newDevice.setCompanyId((long) dev.getCompanyId()); - newDevice.setMaName(dev.getMaName()); - newDevice.setType("2"); - newDevice.setMaNum(dev.getMaNum()); - ownIndex.computeIfAbsent(key, k -> new ArrayList<>()).add(newDevice); - } - } - - // 5. 构建公司 → 汇总对象 Map - Map companyMap = new LinkedHashMap<>(); - - for (DeptConfigRateSummary config : configList) { - String company = config.getCompanyName(); - System.err.println( company); - String type = config.getConfigType().toPlainString(); // 0:线路 1:电缆 2:变电 - String maName = config.getDeptName(); - BigDecimal orderCount = config.getOrderCount(); - Long configCompanyId = config.getCompanyId(); - - String key = configCompanyId + "_" + maName; - List sameCompanyDevices = ownIndex.getOrDefault(key, Collections.emptyList()); - BigDecimal score = computeScoreByMaName(orderCount, sameCompanyDevices, config); - - DeptConfigRateSummary dto = companyMap.computeIfAbsent(company, k -> { - DeptConfigRateSummary d = new DeptConfigRateSummary(); - d.setDeptName(config.getDeptName()); - d.setCompanyId(configCompanyId); - d.setCompanyName(company); - d.setValueA(BigDecimal.ZERO); - d.setValueB(BigDecimal.ZERO); - d.setValueC(BigDecimal.ZERO); - return d; - }); - - switch (type) { - case "0": - dto.setValueA(dto.getValueA().add(score)); - break; - case "1": - dto.setValueB(dto.getValueB().add(score)); - break; - case "2": - dto.setValueC(dto.getValueC().add(score)); - break; - } - } - - // 5.x:补充未出现在 configList 的公司/设备项 - Set configKeys = configList.stream() - .map(c -> c.getCompanyId() + "_" + c.getDeptName()) - .collect(Collectors.toSet()); - - for (Map.Entry> entry : ownIndex.entrySet()) { - String key = entry.getKey(); - if (configKeys.contains(key)) continue; - - List devices = entry.getValue(); - if (devices == null || devices.isEmpty()) continue; - - Ownerdomin first = devices.get(0); - Long companyId = first.getCompanyId(); - String maName = first.getMaName(); - - // 从 devInfo 中找公司名称 - Optional matchDev = ownListFromDevInfo.stream() - .filter(d -> d.getCompanyId()==(new Long(companyId).intValue()) && d.getMaName().equals(maName)) - .findFirst(); - - String companyName = matchDev.map(NewOwnerdomin::getCompanyName).orElse("未知公司"); - System.err.println("有关问题公司查看 "+companyName); - DeptConfigRateSummary dto = companyMap.computeIfAbsent(companyName, k -> { - DeptConfigRateSummary d = new DeptConfigRateSummary(); - d.setDeptName(companyName); - d.setCompanyId(companyId); - d.setCompanyName(companyName); - d.setValueA(BigDecimal.ZERO); - d.setValueB(BigDecimal.ZERO); - d.setValueC(BigDecimal.ZERO); - return d; - }); - - // 默认作为线路设备记入 valueA,或根据 maName 判断类型再分类(可拓展) - BigDecimal score = computeScoreByMaName(BigDecimal.ZERO, devices, null); - dto.setValueA(dto.getValueA().add(score)); - } - - // 6. 返回汇总结果 - return new ArrayList<>(companyMap.values()); - - } - - -private BigDecimal computeScoreByMaName(BigDecimal ordercount,List owns, DeptConfigRateSummary config) { - if (config == null || owns == null || owns.isEmpty()) return BigDecimal.ZERO; - - BigDecimal ownedTotal = BigDecimal.ZERO; - BigDecimal leasedTotal = BigDecimal.ZERO; - - for (Ownerdomin own : owns) { - BigDecimal num = new BigDecimal(own.getMaNum()); - if ("2".equals(own.getType())) { - ownedTotal = ownedTotal.add(num); // 自有 - } else if("1".equals(own.getType())) { - leasedTotal = leasedTotal.add(num); // 租赁 + for (Ownerdomin device : ownListFromManage) { + String key = device.getCompanyId() + "_" + device.getMaName(); + System.err.println("初始化的key:" + key+"-----------"+device.toString()); + ownIndex.computeIfAbsent(key, k -> new ArrayList<>()).add(device); } + + for (NewOwnerdomin dev : ownListFromDevInfo) { + String key = dev.getCompanyId() + "_" + dev.getMaName(); + List existList = ownIndex.get(key); + System.err.println("existList:" + existList); + System.err.println("key:" + key+"-----------"+dev.getCompanyName()); + if (existList != null && !existList.isEmpty()) { + for (Ownerdomin device : existList) { + /*是否需要累加 待验证*/ + device.setMaNum(device.getMaNum() ); + device.setType("2"); + } + } else { + Ownerdomin newDevice = new Ownerdomin(); + newDevice.setCompanyId((long) dev.getCompanyId()); + newDevice.setMaName(dev.getMaName()); + newDevice.setType("2"); + newDevice.setMaNum(dev.getMaNum()); + ownIndex.computeIfAbsent(key, k -> new ArrayList<>()).add(newDevice); + } + } + + // 5. 构建公司 → 汇总对象 Map + Map companyMap = new LinkedHashMap<>(); + + for (DeptConfigRateSummary config : configList) { + String company = config.getCompanyName(); + System.err.println( company); + String type = config.getConfigType().toPlainString(); // 0:线路 1:电缆 2:变电 + String maName = config.getDeptName(); + BigDecimal orderCount = config.getOrderCount(); + Long configCompanyId = config.getCompanyId(); + + String key = configCompanyId + "_" + maName; + List sameCompanyDevices = ownIndex.getOrDefault(key, Collections.emptyList()); + BigDecimal score = computeScoreByMaName(orderCount, sameCompanyDevices, config,type); + + DeptConfigRateSummary dto = companyMap.computeIfAbsent(company, k -> { + DeptConfigRateSummary d = new DeptConfigRateSummary(); + d.setDeptName(config.getDeptName()); + d.setCompanyId(configCompanyId); + d.setCompanyName(company); + d.setValueA(BigDecimal.ZERO); + d.setValueB(BigDecimal.ZERO); + d.setValueC(BigDecimal.ZERO); + return d; + }); + + switch (type) { + case "0": + case "3": + dto.setValueA(dto.getValueA().add(score)); + break; + case "1": + case "4": + dto.setValueB(dto.getValueB().add(score)); + break; + case "2": + case "5": + dto.setValueC(dto.getValueC().add(score)); + break; + } + } + + // 5.x:补充未出现在 configList 的公司/设备项 + Set configKeys = configList.stream() + .map(c -> c.getCompanyId() + "_" + c.getDeptName()) + .collect(Collectors.toSet()); + + for (Map.Entry> entry : ownIndex.entrySet()) { + String key = entry.getKey(); + if (configKeys.contains(key)) continue; + + List devices = entry.getValue(); + if (devices == null || devices.isEmpty()) continue; + + Ownerdomin first = devices.get(0); + Long companyId = first.getCompanyId(); + String maName = first.getMaName(); + + // 从 devInfo 中找公司名称 + Optional matchDev = ownListFromDevInfo.stream() + .filter(d -> d.getCompanyId()==(new Long(companyId).intValue()) && d.getMaName().equals(maName)) + .findFirst(); + + String companyName = matchDev.map(NewOwnerdomin::getCompanyName).orElse("未知公司"); + //System.err.println("有关问题公司查看 "+companyName); + DeptConfigRateSummary dto = companyMap.computeIfAbsent(companyName, k -> { + DeptConfigRateSummary d = new DeptConfigRateSummary(); + d.setDeptName(companyName); + d.setCompanyId(companyId); + d.setCompanyName(companyName); + d.setValueA(BigDecimal.ZERO); + d.setValueB(BigDecimal.ZERO); + d.setValueC(BigDecimal.ZERO); + return d; + }); + + // 默认作为线路设备记入 valueA,或根据 maName 判断类型再分类(可拓展) + BigDecimal score = computeScoreByMaName(BigDecimal.ZERO, devices, null, "0"); + dto.setValueA(dto.getValueA().add(score)); + } + + // 6. 返回汇总结果 + return new ArrayList<>(companyMap.values()); + } - BigDecimal base = config.getConfigValue(); // 基本配置数量 - BigDecimal score = config.getConfigRate(); // 满分值 - if (base == null || base.compareTo(BigDecimal.ZERO) == 0) return BigDecimal.ZERO; + private BigDecimal computeScoreByMaName(BigDecimal ordercount,List owns, DeptConfigRateSummary config,String type) { + if (config == null || owns == null || owns.isEmpty()) return BigDecimal.ZERO; + BigDecimal ownedTotal = BigDecimal.ZERO; + BigDecimal leasedTotal = BigDecimal.ZERO; + boolean limitedType = false; // 是否是 3/4/5 类型 - // 计算比例 = (自有 + 租赁×0.6 + 订单×0.9) / 基本配置数 - BigDecimal rate = ownedTotal - .add(leasedTotal.multiply(new BigDecimal("0.6"))) - .add(ordercount.multiply(new BigDecimal("0.9"))) - .divide(base, 4, RoundingMode.HALF_UP); + for (Ownerdomin own : owns) { + BigDecimal num = new BigDecimal(own.getMaNum()); + // 判断是否为限制分数的类型 + if ("3".equals(own.getType()) || "4".equals(own.getType()) || "5".equals(own.getType())) { + limitedType = true; + } + + if ("2".equals(own.getType())) { + ownedTotal = ownedTotal.add(num); // 自有 + } else if ("1".equals(own.getType())) { + leasedTotal = leasedTotal.add(num); // 租赁 + } + } + + BigDecimal base = config.getConfigValue(); // 基本配置数量 + BigDecimal score = config.getConfigRate(); // 满分值 + + if (base == null || base.compareTo(BigDecimal.ZERO) == 0) return BigDecimal.ZERO; + +// 计算比例 = (自有 + 租赁×0.6 + 订单×0.9) / 基本配置数 + BigDecimal rate = ownedTotal + .add(leasedTotal.multiply(new BigDecimal("0.6"))) + .add(ordercount.multiply(new BigDecimal("0.9"))) + .divide(base, 4, RoundingMode.HALF_UP); + +// 计算原始得分 + BigDecimal result = rate.multiply(score).setScale(2, RoundingMode.HALF_UP); + +// 限制得分不超过满分,且如果是 3/4/5 类型,不能超过 20 + if (rate.compareTo(BigDecimal.ONE) > 0) { + result = score.setScale(2, RoundingMode.HALF_UP); + } + + if (limitedType && result.compareTo(new BigDecimal("20")) > 0) { + result = new BigDecimal("20.00"); + } + + return result; -// 判断是否超过满分 - if (rate.compareTo(BigDecimal.ONE) > 0) { - return score.setScale(2, RoundingMode.HALF_UP); - } else { - return rate.multiply(score).setScale(2, RoundingMode.HALF_UP); } -} @Override public List selectDeptConfigTypeSummary(DeptConfigTypeSummary entity) { @@ -250,6 +267,7 @@ private BigDecimal computeScoreByMaName(BigDecimal ordercount,List o Map indexMap = new LinkedHashMap<>(); for (EquipmentDetail item : equipmentDetails) { String key = item.getCompanyId() + "_" + item.getName(); + System.err.println("估计出错"+key); indexMap.put(key, item); } @@ -259,6 +277,7 @@ private BigDecimal computeScoreByMaName(BigDecimal ordercount,List o EquipmentDetail existing = indexMap.get(key); if (existing != null) { + System.err.println("已存在"+key); // 已存在,累加自有数量 own if (existing.getOwn() == null) { existing.setOwn(devItem.getOwnCount()); @@ -355,3 +374,4 @@ private BigDecimal computeScoreByMaName(BigDecimal ordercount,List o return getChildList(list, t).size() > 0 ? true : false; } } + diff --git a/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/equipment/SysDeptMapper.xml b/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/equipment/SysDeptMapper.xml index 58e0865..f96ff18 100644 --- a/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/equipment/SysDeptMapper.xml +++ b/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/equipment/SysDeptMapper.xml @@ -43,7 +43,9 @@ - + - +