代码提交

This commit is contained in:
liang.chao 2025-07-07 08:52:02 +08:00
parent 9db8a043a9
commit 3c694f2fd9
3 changed files with 120 additions and 149 deletions

View File

@ -75,146 +75,108 @@ public class SysDeptServiceImpl implements ISysDeptService {
@Override @Override
public List<DeptConfigRateSummary> selectDeptConfigRatePivot(DeptConfigRateSummary entity) { public List<DeptConfigRateSummary> selectDeptConfigRatePivot(DeptConfigRateSummary entity) {
// 1. 查询配置率项每条代表一个公司+设备+评分项 // 1. 查询配置率项每条代表一个公司+设备+评分项
List<DeptConfigRateSummary> configList = mapper.selectDeptConfigRatePivot(entity); List<DeptConfigRateSummary> configList = mapper.selectDeptConfigRatePivot(entity);
// 2. 查询 ma_own_manage 表中原始设备数据 // 2. 查询 ma_own_manage 表中原始设备数据
List<Ownerdomin> ownListFromManage = ownerMapper.list(null); List<Ownerdomin> ownListFromManage = ownerMapper.list(null);
// 3. 查询 ma_dev_info 表中聚合后的设备数据包含公司名 // 3. 查询 ma_dev_info 表中聚合后的设备数据包含公司名
List<NewOwnerdomin> ownListFromDevInfo = ownerMapper.listGrouped(); List<NewOwnerdomin> ownListFromDevInfo = ownerMapper.listGrouped();
// 4. 构建设备索引 Map<公司ID_设备名, List<Ownerdomin>> // 4. 构建设备索引 Map<公司ID_设备名, List<Ownerdomin>>
Map<String, List<Ownerdomin>> ownIndex = new HashMap<>(); Map<String, List<Ownerdomin>> ownIndex = new HashMap<>();
for (Ownerdomin device : ownListFromManage) { for (Ownerdomin device : ownListFromManage) {
String key = device.getCompanyId() + "_" + device.getMaName(); String key = device.getCompanyId() + "_" + device.getMaName();
ownIndex.computeIfAbsent(key, k -> new ArrayList<>()).add(device); System.err.println("初始化的key:" + key+"-----------"+device.toString());
} ownIndex.computeIfAbsent(key, k -> new ArrayList<>()).add(device);
}
for (NewOwnerdomin dev : ownListFromDevInfo) { for (NewOwnerdomin dev : ownListFromDevInfo) {
String key = dev.getCompanyId() + "_" + dev.getMaName(); String key = dev.getCompanyId() + "_" + dev.getMaName();
List<Ownerdomin> existList = ownIndex.get(key); List<Ownerdomin> existList = ownIndex.get(key);
System.err.println("existList:" + existList);
if (existList != null && !existList.isEmpty()) { System.err.println("key:" + key+"-----------"+dev.getCompanyName());
for (Ownerdomin device : existList) { if (existList != null && !existList.isEmpty()) {
device.setMaNum(device.getMaNum() + dev.getMaNum()); for (Ownerdomin device : existList) {
} /*是否需要累加 待验证*/
} else { device.setMaNum(device.getMaNum() );
Ownerdomin newDevice = new Ownerdomin(); device.setType("2");
newDevice.setCompanyId((long) dev.getCompanyId());
newDevice.setMaName(dev.getMaName());
newDevice.setMaNum(dev.getMaNum());
ownIndex.computeIfAbsent(key, k -> new ArrayList<>()).add(newDevice);
} }
} 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<String, DeptConfigRateSummary> // 5. 构建公司 汇总对象 Map<String, DeptConfigRateSummary>
Map<String, DeptConfigRateSummary> companyMap = new LinkedHashMap<>(); Map<String, DeptConfigRateSummary> companyMap = new LinkedHashMap<>();
for (DeptConfigRateSummary config : configList) { for (DeptConfigRateSummary config : configList) {
String company = config.getCompanyName(); String company = config.getCompanyName();
String type = config.getConfigType().toPlainString(); // 0:线路 1:电缆 2:变电 System.err.println( company);
String maName = config.getDeptName(); String type = config.getConfigType().toPlainString(); // 0:线路 1:电缆 2:变电
BigDecimal orderCount = config.getOrderCount(); String maName = config.getDeptName();
Long configCompanyId = config.getCompanyId(); BigDecimal orderCount = config.getOrderCount();
Long configCompanyId = config.getCompanyId();
String key = configCompanyId + "_" + maName; String key = configCompanyId + "_" + maName;
List<Ownerdomin> sameCompanyDevices = ownIndex.getOrDefault(key, Collections.emptyList()); List<Ownerdomin> sameCompanyDevices = ownIndex.getOrDefault(key, Collections.emptyList());
BigDecimal score = computeScoreByMaName(orderCount, sameCompanyDevices, config); BigDecimal score = computeScoreByMaName(orderCount, sameCompanyDevices, config);
DeptConfigRateSummary dto = companyMap.computeIfAbsent(company, k -> { DeptConfigRateSummary dto = companyMap.computeIfAbsent(company, k -> {
DeptConfigRateSummary d = new DeptConfigRateSummary(); DeptConfigRateSummary d = new DeptConfigRateSummary();
d.setDeptName(company); d.setDeptName(config.getDeptName());
d.setCompanyId(configCompanyId); d.setCompanyId(configCompanyId);
d.setCompanyName(company); d.setCompanyName(company);
d.setValueA(BigDecimal.ZERO); d.setValueA(BigDecimal.ZERO);
d.setValueB(BigDecimal.ZERO); d.setValueB(BigDecimal.ZERO);
d.setValueC(BigDecimal.ZERO); d.setValueC(BigDecimal.ZERO);
return d; return d;
}); });
switch (type) { switch (type) {
case "0": case "0":
dto.setValueA(dto.getValueA().add(score)); dto.setValueA(dto.getValueA().add(score));
break; break;
case "1": case "1":
dto.setValueB(dto.getValueB().add(score)); dto.setValueB(dto.getValueB().add(score));
break; break;
case "2": case "2":
dto.setValueC(dto.getValueC().add(score)); dto.setValueC(dto.getValueC().add(score));
break; break;
}
} }
}
// 5.x补充未出现在 configList 的公司/设备项 // 5.x补充未出现在 configList 的公司/设备项
Set<String> configKeys = configList.stream() Set<String> configKeys = configList.stream()
.map(c -> c.getCompanyId() + "_" + c.getDeptName()) .map(c -> c.getCompanyId() + "_" + c.getDeptName())
.collect(Collectors.toSet());
for (Map.Entry<String, List<Ownerdomin>> entry : ownIndex.entrySet()) {
String key = entry.getKey();
if (configKeys.contains(key)) continue;
List<Ownerdomin> devices = entry.getValue();
if (devices == null || devices.isEmpty()) continue;
Ownerdomin first = devices.get(0);
Long companyId = first.getCompanyId();
String maName = first.getMaName();
// devInfo 中找公司名称
Optional<NewOwnerdomin> matchDev = ownListFromDevInfo.stream()
.filter(d -> d.getCompanyId()==(new Long(companyId).intValue()) && d.getMaName().equals(maName))
.findFirst();
String companyName = matchDev.map(NewOwnerdomin::getCompanyName).orElse("未知公司");
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 void addCompaniesWithoutConfig(List<DeptConfigRateSummary> configList,
Map<String, DeptConfigRateSummary> companyMap,
Map<String, List<Ownerdomin>> ownIndex) {
// 获取所有配置表中出现的公司ID
Set<Long> configCompanyIds = configList.stream()
.map(DeptConfigRateSummary::getCompanyId)
.collect(Collectors.toSet()); .collect(Collectors.toSet());
// 获取所有设备公司ID for (Map.Entry<String, List<Ownerdomin>> entry : ownIndex.entrySet()) {
Set<Long> deviceCompanyIds = ownIndex.keySet().stream() String key = entry.getKey();
.map(key -> Long.parseLong(key.split("_")[0])) if (configKeys.contains(key)) continue;
.collect(Collectors.toSet());
// 找出有设备但没配置的公司ID List<Ownerdomin> devices = entry.getValue();
Set<Long> missingCompanyIds = new HashSet<>(deviceCompanyIds); if (devices == null || devices.isEmpty()) continue;
missingCompanyIds.removeAll(configCompanyIds);
// 为这些公司创建空汇总对象 Ownerdomin first = devices.get(0);
for (Long companyId : missingCompanyIds) { Long companyId = first.getCompanyId();
// 获取公司名称需要查询或从设备中提取 String maName = first.getMaName();
String companyName = "未知公司"; // 实际应从设备数据中获取
companyMap.computeIfAbsent(companyName, k -> { // devInfo 中找公司名称
Optional<NewOwnerdomin> 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(); DeptConfigRateSummary d = new DeptConfigRateSummary();
d.setDeptName(companyName); d.setDeptName(companyName);
d.setCompanyId(companyId); d.setCompanyId(companyId);
@ -224,45 +186,53 @@ public class SysDeptServiceImpl implements ISysDeptService {
d.setValueC(BigDecimal.ZERO); d.setValueC(BigDecimal.ZERO);
return d; 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<Ownerdomin> owns, DeptConfigRateSummary config) { private BigDecimal computeScoreByMaName(BigDecimal ordercount,List<Ownerdomin> owns, DeptConfigRateSummary config) {
if (config == null || owns == null || owns.isEmpty()) return BigDecimal.ZERO; if (config == null || owns == null || owns.isEmpty()) return BigDecimal.ZERO;
BigDecimal ownedTotal = BigDecimal.ZERO; BigDecimal ownedTotal = BigDecimal.ZERO;
BigDecimal leasedTotal = BigDecimal.ZERO; BigDecimal leasedTotal = BigDecimal.ZERO;
for (Ownerdomin own : owns) { for (Ownerdomin own : owns) {
BigDecimal num = new BigDecimal(own.getMaNum()); BigDecimal num = new BigDecimal(own.getMaNum());
if ("2".equals(own.getType())) { if ("2".equals(own.getType())) {
ownedTotal = ownedTotal.add(num); // 自有 ownedTotal = ownedTotal.add(num); // 自有
} else { } else if("1".equals(own.getType())) {
leasedTotal = leasedTotal.add(num); // 租赁 leasedTotal = leasedTotal.add(num); // 租赁
}
} }
}
BigDecimal base = config.getConfigValue(); // 基本配置数量 BigDecimal base = config.getConfigValue(); // 基本配置数量
BigDecimal score = config.getConfigRate(); // 满分值 BigDecimal score = config.getConfigRate(); // 满分值
if (base == null || base.compareTo(BigDecimal.ZERO) == 0) return BigDecimal.ZERO; if (base == null || base.compareTo(BigDecimal.ZERO) == 0) return BigDecimal.ZERO;
// 计算比例 = (自有 + 租赁×0.6 + 订单×0.9) / 基本配置数 // 计算比例 = (自有 + 租赁×0.6 + 订单×0.9) / 基本配置数
BigDecimal rate = ownedTotal BigDecimal rate = ownedTotal
.add(leasedTotal.multiply(new BigDecimal("0.6"))) .add(leasedTotal.multiply(new BigDecimal("0.6")))
.add(ordercount.multiply(new BigDecimal("0.9"))) .add(ordercount.multiply(new BigDecimal("0.9")))
.divide(base, 4, RoundingMode.HALF_UP); .divide(base, 4, RoundingMode.HALF_UP);
// 判断是否超过满分 // 判断是否超过满分
if (rate.compareTo(BigDecimal.ONE) > 0) { if (rate.compareTo(BigDecimal.ONE) > 0) {
return score.setScale(2, RoundingMode.HALF_UP); return score.setScale(2, RoundingMode.HALF_UP);
} else { } else {
return rate.multiply(score).setScale(2, RoundingMode.HALF_UP); return rate.multiply(score).setScale(2, RoundingMode.HALF_UP);
}
} }
}
@Override @Override
public List<DeptConfigTypeSummary> selectDeptConfigTypeSummary(DeptConfigTypeSummary entity) { public List<DeptConfigTypeSummary> selectDeptConfigTypeSummary(DeptConfigTypeSummary entity) {
@ -300,7 +270,7 @@ private BigDecimal computeScoreByMaName(BigDecimal ordercount,List<Ownerdomin> o
} }
} else { } else {
// 不存在新增一条 EquipmentDetail赋值必要字段 /* // 不存在新增一条 EquipmentDetail赋值必要字段
EquipmentDetail newItem = new EquipmentDetail(); EquipmentDetail newItem = new EquipmentDetail();
newItem.setCompanyId(devItem.getCompanyId()); newItem.setCompanyId(devItem.getCompanyId());
newItem.setName(devItem.getTypeName()); newItem.setName(devItem.getTypeName());
@ -308,7 +278,7 @@ private BigDecimal computeScoreByMaName(BigDecimal ordercount,List<Ownerdomin> o
// 其他字段可根据业务决定是否赋默认值 // 其他字段可根据业务决定是否赋默认值
newItem.setDesc("来自装备配置管理"); newItem.setDesc("来自装备配置管理");
equipmentDetails.add(newItem); equipmentDetails.add(newItem);
indexMap.put(key, newItem); indexMap.put(key, newItem);*/
} }
} }
@ -386,3 +356,4 @@ private BigDecimal computeScoreByMaName(BigDecimal ordercount,List<Ownerdomin> o
return getChildList(list, t).size() > 0 ? true : false; return getChildList(list, t).size() > 0 ? true : false;
} }
} }

View File

@ -221,7 +221,7 @@
LEFT JOIN ma_type mt2 on mt.parent_id = mt2.type_id LEFT JOIN ma_type mt2 on mt.parent_id = mt2.type_id
WHERE WHERE
md.is_active = '1' md.is_active = '1'
AND md.own_co = 221 AND md.own_co = #{companyId}
GROUP BY GROUP BY
mt.type_id mt.type_id

View File

@ -75,6 +75,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
md.is_active = '1' md.is_active = '1'
GROUP BY GROUP BY
md.own_co, md.own_co,
mt.type_name mt2.type_id
</select> </select>
</mapper> </mapper>