代码提交

This commit is contained in:
liang.chao 2025-07-07 10:06:32 +08:00
parent 3c694f2fd9
commit 5bd24cec66
2 changed files with 146 additions and 141 deletions

View File

@ -25,7 +25,6 @@ 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;
@ -75,164 +74,164 @@ public class SysDeptServiceImpl implements ISysDeptService {
@Override
public List<DeptConfigRateSummary> selectDeptConfigRatePivot(DeptConfigRateSummary entity) {
// 1. 查询配置率项每条代表一个公司+设备+评分项
List<DeptConfigRateSummary> configList = mapper.selectDeptConfigRatePivot(entity);
// 1. 查询配置率项每条代表一个公司+设备+评分项
List<DeptConfigRateSummary> configList = mapper.selectDeptConfigRatePivot(entity);
// 2. 查询 ma_own_manage 表中原始设备数据
List<Ownerdomin> ownListFromManage = ownerMapper.list(null);
// 2. 查询 ma_own_manage 表中原始设备数据
List<Ownerdomin> ownListFromManage = ownerMapper.list(null);
// 3. 查询 ma_dev_info 表中聚合后的设备数据包含公司名
List<NewOwnerdomin> ownListFromDevInfo = ownerMapper.listGrouped();
// 3. 查询 ma_dev_info 表中聚合后的设备数据包含公司名
List<NewOwnerdomin> ownListFromDevInfo = ownerMapper.listGrouped();
// 4. 构建设备索引 Map<公司ID_设备名, List<Ownerdomin>>
Map<String, List<Ownerdomin>> ownIndex = new HashMap<>();
// 4. 构建设备索引 Map<公司ID_设备名, List<Ownerdomin>>
Map<String, List<Ownerdomin>> 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 (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<Ownerdomin> 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");
for (NewOwnerdomin dev : ownListFromDevInfo) {
String key = dev.getCompanyId() + "_" + dev.getMaName();
List<Ownerdomin> 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);
}
} 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>
Map<String, DeptConfigRateSummary> companyMap = new LinkedHashMap<>();
// 5. 构建公司 汇总对象 Map<String, DeptConfigRateSummary>
Map<String, DeptConfigRateSummary> 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();
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<Ownerdomin> sameCompanyDevices = ownIndex.getOrDefault(key, Collections.emptyList());
BigDecimal score = computeScoreByMaName(orderCount, sameCompanyDevices, config);
String key = configCompanyId + "_" + maName;
List<Ownerdomin> 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;
});
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;
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<String> configKeys = configList.stream()
.map(c -> c.getCompanyId() + "_" + c.getDeptName())
.collect(Collectors.toSet());
// 5.x补充未出现在 configList 的公司/设备项
Set<String> configKeys = configList.stream()
.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;
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;
List<Ownerdomin> devices = entry.getValue();
if (devices == null || devices.isEmpty()) continue;
Ownerdomin first = devices.get(0);
Long companyId = first.getCompanyId();
String maName = first.getMaName();
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();
// 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();
d.setDeptName(companyName);
d.setCompanyId(companyId);
d.setCompanyName(companyName);
d.setValueA(BigDecimal.ZERO);
d.setValueB(BigDecimal.ZERO);
d.setValueC(BigDecimal.ZERO);
return d;
});
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));
}
// 默认作为线路设备记入 valueA或根据 maName 判断类型再分类可拓展
BigDecimal score = computeScoreByMaName(BigDecimal.ZERO, devices, null);
dto.setValueA(dto.getValueA().add(score));
}
// 6. 返回汇总结果
return new ArrayList<>(companyMap.values());
// 6. 返回汇总结果
return new ArrayList<>(companyMap.values());
}
private BigDecimal computeScoreByMaName(BigDecimal ordercount,List<Ownerdomin> owns, DeptConfigRateSummary config) {
if (config == null || owns == null || owns.isEmpty()) return BigDecimal.ZERO;
private BigDecimal computeScoreByMaName(BigDecimal ordercount,List<Ownerdomin> owns, DeptConfigRateSummary config) {
if (config == null || owns == null || owns.isEmpty()) return BigDecimal.ZERO;
BigDecimal ownedTotal = BigDecimal.ZERO;
BigDecimal leasedTotal = 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 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); // 租赁
}
}
BigDecimal base = config.getConfigValue(); // 基本配置数量
BigDecimal score = config.getConfigRate(); // 满分值
BigDecimal base = config.getConfigValue(); // 基本配置数量
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) / 基本配置数
BigDecimal rate = ownedTotal
.add(leasedTotal.multiply(new BigDecimal("0.6")))
.add(ordercount.multiply(new BigDecimal("0.9")))
.divide(base, 4, RoundingMode.HALF_UP);
// 计算比例 = (自有 + 租赁×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);
// 判断是否超过满分
if (rate.compareTo(BigDecimal.ONE) > 0) {
return score.setScale(2, RoundingMode.HALF_UP);
} else {
return rate.multiply(score).setScale(2, RoundingMode.HALF_UP);
}
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<DeptConfigTypeSummary> selectDeptConfigTypeSummary(DeptConfigTypeSummary entity) {
@ -356,4 +355,3 @@ public class SysDeptServiceImpl implements ISysDeptService {
return getChildList(list, t).size() > 0 ? true : false;
}
}

View File

@ -43,9 +43,7 @@
<result property="adminUserId" column="admin_user_id" />
<result property="initPassword" column="init_password" />
</resultMap>
<select id="selectDeptTree">
SELECT * FROM sys_dept WHERE del_flag = '0' ORDER BY parent_id, order_num
</select>
<select id="selectDeptList" parameterType="com.bonus.system.api.domain.SysDept" resultMap="SysDeptResult">
<include refid="selectDeptVo"/>
where d.del_flag = '0'
@ -106,15 +104,24 @@
SELECT
my.type_name AS deptName,
sd.dept_name AS companyName,
mdc.dept_id AS companyId,
mdc.config_type AS configType,
mdc.config_value AS configValue,
mdc.config_rate AS configRate,
grouped.dept_id AS companyId,
grouped.config_type AS configType,
grouped.config_value AS configValue,
grouped.config_rate AS configRate,
IFNULL(order_stat.order_count, 0) AS orderCount
FROM
ma_dept_config mdc
LEFT JOIN sys_dept sd ON sd.dept_id = mdc.dept_id
LEFT JOIN ma_type my ON my.type_id = mdc.type_id
(
SELECT
dept_id,
type_id,
config_type,
SUM(config_value) AS config_value,
SUM(config_rate) AS config_rate
FROM ma_dept_config
GROUP BY dept_id, type_id, config_type
) grouped
LEFT JOIN sys_dept sd ON sd.dept_id = grouped.dept_id
LEFT JOIN ma_type my ON my.type_id = grouped.type_id
-- 设备订单数量子查询
LEFT JOIN (
@ -131,12 +138,9 @@
LEFT JOIN sys_dept sd ON moi.buyer_company = sd.dept_id
GROUP BY sd.dept_id, mt2.type_id
) order_stat
ON order_stat.dept_id = mdc.dept_id
AND order_stat.parent_type_id = mdc.type_id
ON order_stat.dept_id = grouped.dept_id
AND order_stat.parent_type_id = grouped.type_id
WHERE 1 = 1
</select>
<select id="selectDeptConfigTypeSummary"
resultType="com.bonus.material.equipment.domain.DeptConfigTypeSummary">
@ -154,7 +158,7 @@
d.dept_id AS companyId,
mt.type_name AS NAME,
d.config_description as `desc`,
SUM(CAST(d.config_rate AS DECIMAL(10, 2))) AS `value`,
d.config_rate AS `value`,
(
SELECT
CASE WHEN COUNT(1) > 0 THEN 1 ELSE 0 END
@ -207,7 +211,7 @@
GROUP BY
d.dept_id,
d.config_type,
d.type_id;
d.type_id
</select>
<select id="listFromDevInfo" resultType="com.bonus.material.equipment.domain.NewmydevInfo">
SELECT
@ -226,6 +230,9 @@
GROUP BY
mt.type_id
</select>
<select id="selectDeptTree" resultType="com.bonus.material.equipment.domain.SysDept">
SELECT * FROM sys_dept WHERE del_flag = '0' ORDER BY parent_id, order_num
</select>
</mapper>