diff --git a/.gitignore b/.gitignore index 12e0ef0c..e2395e16 100644 --- a/.gitignore +++ b/.gitignore @@ -53,4 +53,7 @@ rebel.xml CLAUDE.md docs/ data/ -.m2 \ No newline at end of file +.m2 + +# Windows 保留设备名误生成的真实文件(在 Git Bash 里把 2>nul 当成丢弃报错的写法,会真的建出名为 nul 的文件) +nul \ No newline at end of file diff --git a/detection/src/main/java/com/njcn/gather/report/pojo/enums/AffectEnum.java b/detection/src/main/java/com/njcn/gather/report/pojo/enums/AffectEnum.java index 8908344f..b588f4a4 100644 --- a/detection/src/main/java/com/njcn/gather/report/pojo/enums/AffectEnum.java +++ b/detection/src/main/java/com/njcn/gather/report/pojo/enums/AffectEnum.java @@ -12,18 +12,32 @@ import lombok.Getter; public enum AffectEnum { - BASE("base", "额定工作条件下的检测"), - VOL("vol", "电压对XX测量的影响"), - FREQ("freq", "频率对XX测量的影响"), - HARM("harm", "谐波对XX测量的影响"); + // 第三个参数 sort 为报告小节排序档位:额定=1、单影响量=2、多影响量=3(同档内再按 Script_Index 升序) + BASE("Base", "额定条件XX准确度测试", 1), + VOL("VOL", "电压幅值对XX测量的影响", 2), + FREQ("Freq", "频率变化对XX测量的影响", 2), + HARM("Harm", "谐波对XX测量的影响", 2), + // Single / Many 是检测树的分组标题,不会作为叶子 Script_SubType 落到设备数据上 + SINGLE("Single", "单影响量下XX准确度测试", 2), + MANY("Many", "多影响量下XX准确度测试", 3), + // 以下为真实的多影响量组合 Script_SubType(报告与检测树共用同一份文案) + MANY_VOL_HARM_INHARM("Many-Vol-Harm-InHarm", "电压和谐波和间谐波对XX的影响", 3), + MANY_IMBV_HARM_INHARM("Many-IMBV-Harm-InHarm", "三项电压不平衡和谐波和间谐波对XX的影响", 3), + MANY_FREQ_HARM_INHARM("Many-Freq-Harm-InHarm", "频率和谐波和间谐波对XX的影响", 3); private String key; private String desc; - AffectEnum(String key, String desc) { + /** + * 报告小节排序档位:额定=1、单影响量=2、多影响量=3;同档内再按 Script_Index 升序 + */ + private int sort; + + AffectEnum(String key, String desc, int sort) { this.key = key; this.desc = desc; + this.sort = sort; } /** diff --git a/detection/src/main/java/com/njcn/gather/result/service/impl/ResultServiceImpl.java b/detection/src/main/java/com/njcn/gather/result/service/impl/ResultServiceImpl.java index e795ce9d..61aad3cf 100644 --- a/detection/src/main/java/com/njcn/gather/result/service/impl/ResultServiceImpl.java +++ b/detection/src/main/java/com/njcn/gather/result/service/impl/ResultServiceImpl.java @@ -327,16 +327,11 @@ public class ResultServiceImpl implements IResultService { List dictTreeById = dictTreeService.getDictTreeById(new ArrayList<>(dtlsSortMap.keySet())); Map dictTreeMap = dictTreeById.stream().collect(Collectors.toMap(DictTree::getId, Function.identity())); - Map subName = new LinkedHashMap<>(); - subName.put("Base", "额定条件XX准确度测试"); - subName.put("VOL", "电压幅值对XX测量的影响"); - subName.put("Freq", "频率变化对XX测量的影响"); - subName.put("Harm", "谐波对XX测量的影响"); - subName.put("Single", "单影响量下XX准确度测试"); - subName.put("Many", "多影响量下XX准确度测试"); - subName.put("Many-Vol-Harm-InHarm", "电压和谐波和间谐波对XX的影响"); - subName.put("Many-IMBV-Harm-InHarm", "三项电压不平衡和谐波和间谐波对XX的影响"); - subName.put("Many-Freq-Harm-InHarm", "频率和谐波和间谐波对XX的影响"); + // 影响量文案统一由 AffectEnum 提供;大小写不敏感 Map,兼容 Script_SubType 的大小写差异 + Map subName = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + for (AffectEnum affectEnum : AffectEnum.values()) { + subName.put(affectEnum.getKey(), affectEnum.getDesc()); + } Boolean isValueType = scriptMapper.selectScriptIsValueType(param.getScriptId()); List infoVOS = new ArrayList<>(); @@ -353,7 +348,7 @@ public class ResultServiceImpl implements IResultService { //额定条件下频率准确度测试 LinkedHashMap> subTypeMap = value.stream() .sorted(Comparator.comparing(PqScriptDtls::getScriptIndex)) - .filter(x -> "Base".equals(x.getScriptSubType())) + .filter(x -> "Base".equalsIgnoreCase(x.getScriptSubType())) .collect(Collectors.groupingBy(PqScriptDtls::getScriptSubType, LinkedHashMap::new, Collectors.toList())); subTypeMap.forEach((subKey, subValue) -> { if (!"VOLTAGE".equals(dictTree.getCode())) { @@ -392,7 +387,7 @@ public class ResultServiceImpl implements IResultService { //单影响量下频率准确度测试 LinkedHashMap> subSingleTypeMap = value.stream() .sorted(Comparator.comparing(PqScriptDtls::getScriptIndex)) - .filter(x -> !"Base".equals(x.getScriptSubType()) && !x.getScriptSubType().contains("Many")) + .filter(x -> !"Base".equalsIgnoreCase(x.getScriptSubType()) && !StrUtil.containsIgnoreCase(x.getScriptSubType(), "Many")) .collect(Collectors.groupingBy(PqScriptDtls::getScriptSubType, LinkedHashMap::new, Collectors.toList())); if (CollUtil.isNotEmpty(subSingleTypeMap)) { TreeDataVO subType = new TreeDataVO(); @@ -414,13 +409,13 @@ public class ResultServiceImpl implements IResultService { dtlType.setIndex(index); dtlType.setScriptType(scriptDtlIndexList.get(0).getScriptType()); dtlType.setScriptTypeCode(subKey); - if ("Harm".equals(subKey)) { + if ("Harm".equalsIgnoreCase(subKey)) { harmScriptTypeName(scriptDtlIndexList, dictTree, isValueType, dtlType); } - if ("VOL".equals(subKey)) { + if ("VOL".equalsIgnoreCase(subKey)) { volScriptTypeName(scriptDtlIndexList, dictTree, isValueType, dtlType); } - if ("Freq".equals(subKey)) { + if ("Freq".equalsIgnoreCase(subKey)) { freqScriptTypeName(scriptDtlIndexList, dictTree, isValueType, dtlType); } dtlType.setSourceDesc(ScriptDtlsDesc.getStringBuffer(scriptDtlIndexList, false, isValueType).toString()); @@ -442,7 +437,7 @@ public class ResultServiceImpl implements IResultService { //多影响量下xx LinkedHashMap> subManyTypeMap = value.stream() .sorted(Comparator.comparing(PqScriptDtls::getScriptIndex)) - .filter(x -> x.getScriptSubType().contains("Many")) + .filter(x -> StrUtil.containsIgnoreCase(x.getScriptSubType(), "Many")) .collect(Collectors.groupingBy(PqScriptDtls::getScriptSubType, LinkedHashMap::new, Collectors.toList())); if (CollUtil.isNotEmpty(subManyTypeMap)) { TreeDataVO subType = new TreeDataVO(); @@ -464,13 +459,13 @@ public class ResultServiceImpl implements IResultService { dtlType.setIndex(index); dtlType.setScriptType(scriptDtlIndexList.get(0).getScriptType()); dtlType.setScriptTypeCode(subKey); - if ("Many-Vol-Harm-InHarm".equals(subKey)) { + if ("Many-Vol-Harm-InHarm".equalsIgnoreCase(subKey)) { volAndHarmAndInHarmScriptTypeName(scriptDtlIndexList, dictTree, isValueType, dtlType); } - if ("Many-IMBV-Harm-InHarm".equals(subKey)) { + if ("Many-IMBV-Harm-InHarm".equalsIgnoreCase(subKey)) { imbvAndHarmAndInHarmScriptTypeName(scriptDtlIndexList, dictTree, isValueType, dtlType); } - if ("Many-Freq-Harm-InHarm".equals(subKey)) { + if ("Many-Freq-Harm-InHarm".equalsIgnoreCase(subKey)) { freqAndHarmAndInHarmScriptTypeName(scriptDtlIndexList, dictTree, isValueType, dtlType); } dtlType.setSourceDesc(ScriptDtlsDesc.getStringBuffer(scriptDtlIndexList, false, isValueType).toString()); @@ -1431,10 +1426,19 @@ public class ResultServiceImpl implements IResultService { @Override public SingleTestResult getFinalContent(List dtlDataVOList, String planCode, String devId, Integer lineNo, List tableKeys) { SingleTestResult singleTestResult = new SingleTestResult(); - Map>>>> finalContent = new HashMap<>(); + // 用 LinkedHashMap 保住下方按 AffectEnum.sort + Script_Index 排好的影响量小节顺序,一路保到下游 fillContentInTemplate 按 entrySet 顺序消费 + Map>>>> finalContent = new LinkedHashMap<>(); if (CollUtil.isNotEmpty(dtlDataVOList)) { - // 首先区分测试条件 - Map> subTypeMap = dtlDataVOList.stream().collect(Collectors.groupingBy(PqScriptDtlDataVO::getScriptSubType)); + // 首先区分测试条件;分组前先按 AffectEnum.sort(额定→单影响→多影响)排序,同档内再按 Script_Index 升序, + // 收进 LinkedHashMap,使各影响量小节顺序固定为:额定、单影响量、多影响量 + Map> subTypeMap = dtlDataVOList.stream() + .sorted(Comparator + .comparingInt((PqScriptDtlDataVO v) -> { + AffectEnum ae = AffectEnum.getByKey(v.getScriptSubType()); + return ae == null ? Integer.MAX_VALUE : ae.getSort(); // 识别不了的 subType 沉底 + }) + .thenComparingInt(v -> v.getScriptIndex() == null ? Integer.MAX_VALUE : v.getScriptIndex())) + .collect(Collectors.groupingBy(PqScriptDtlDataVO::getScriptSubType, LinkedHashMap::new, Collectors.toList())); subTypeMap.forEach((subType, scriptDtlDataVOList) -> { AffectEnum affectEnum = AffectEnum.getByKey(subType); if (Objects.nonNull(affectEnum)) {