From 1cae057f4be15fc6422801788726059d4bee3766 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=8E=89=E4=B8=9C?= <129883742+liyudong2018@users.noreply.github.com> Date: Fri, 19 Sep 2025 20:26:28 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E6=8C=87=E6=A0=87=E5=AD=90=E9=9B=86?= =?UTF-8?q?=E6=98=A0=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 2 +- attachment/Clipboard_2025-09-07-20-38-36.png | Bin 0 -> 34786 bytes attachment/Clipboard_2025-09-15-21-58-50.png | Bin 0 -> 34438 bytes attachment/Clipboard_2025-09-15-21-59-14.png | Bin 0 -> 100761 bytes attachment/Clipboard_2025-09-15-21-59-44.png | Bin 0 -> 137442 bytes attachment/Clipboard_2025-09-15-22-00-21.png | Bin 0 -> 239445 bytes attachment/Clipboard_2025-09-15-22-04-15.png | Bin 0 -> 142806 bytes attachment/Clipboard_2025-09-15-22-05-54.png | Bin 0 -> 92170 bytes attachment/Clipboard_2025-09-15-22-06-13.png | Bin 0 -> 65044 bytes attachment/Clipboard_2025-09-15-22-06-29.png | Bin 0 -> 62160 bytes manager-admin/pom.xml | 12 +- manager-admin/src/main/demo.html | 140 ------- .../config/DefaultIndicatorSetConfig.java | 67 ++++ .../java/com/hshh/config/IndicatorConfig.java | 29 ++ .../hshh/data/controller/DataController.java | 15 +- .../hshh/data/service/DataRecordService.java | 1 + .../service/impl/DataRecordServiceImpl.java | 21 + .../EvaluationProjectController.java | 37 +- .../EvaluationTemplateController.java | 23 +- .../service/EvaluationCsvDataService.java | 2 + .../service/EvaluationHistoryService.java | 3 + .../service/EvaluationProjectService.java | 2 + .../impl/CoreEvaluationServiceImpl.java | 36 +- .../impl/EvaluationCsvDataServiceImpl.java | 15 + .../impl/EvaluationHistoryServiceImpl.java | 28 ++ .../impl/EvaluationProjectServiceImpl.java | 83 ++-- ...ionTemplateIndicatorWeightServiceImpl.java | 3 +- .../EvaluationTemplateWeightServiceImpl.java | 3 +- .../controller/EvaluationController.java | 9 +- .../controller/IndicatorController.java | 94 ++++- .../controller/IndicatorSetController.java | 29 +- .../com/hshh/indicator/entity/Indicator.java | 5 +- .../indicator/mapper/IndicatorMapper.java | 11 + .../IndicatorBottomFormMapperService.java | 1 + .../service/IndicatorFromMapperService.java | 1 + .../indicator/service/IndicatorService.java | 36 +- .../IndicatorBottomMapperServiceImpl.java | 7 + .../impl/IndicatorFormMapperServiceImpl.java | 7 + .../service/impl/IndicatorServiceImpl.java | 152 +++++-- .../controller/ModelDefineController.java | 16 +- .../model/service/FormFieldConfigService.java | 1 + .../hshh/model/service/FormValueService.java | 1 + .../model/service/ModelDefineService.java | 4 +- .../impl/FormFieldConfigServiceImpl.java | 7 + .../service/impl/FormValueServiceImpl.java | 8 + .../service/impl/ModelDefineServiceImpl.java | 27 ++ .../src/main/resources/application.yaml | 17 +- .../src/main/resources/indicator_set.yaml | 26 ++ .../mapper/EvaluationProjectMapper.xml | 7 +- .../mapper/EvaluationTemplateMapper.xml | 7 +- .../main/resources/mapper/IndicatorMapper.xml | 11 +- .../resources/static/img/help/root_add.png | Bin 0 -> 32927 bytes .../resources/static/img/help/root_add_1.png | Bin 0 -> 24893 bytes .../resources/static/img/help/root_add_2.png | Bin 0 -> 32096 bytes .../static/img/undraw_bug_fixing_oc7a.svg | 1 - .../resources/static/img/undraw_logistics.svg | 85 ---- .../static/img/undraw_personal-goals_f9bb.svg | 50 +++ .../src/main/resources/templates/faq.html | 91 +++++ .../resources/templates/fragments/header.html | 6 +- .../src/main/resources/templates/home.html | 375 +++++++++++++----- .../templates/indicator/add_indicator.html | 7 +- .../templates/indicator/evaluation_list.html | 10 +- .../templates/indicator/indicator_mapper.html | 165 +++++--- .../resources/templates/indicator/list.html | 204 +++++++--- .../templates/model/add_model_field.html | 6 +- .../main/resources/templates/model/list.html | 40 +- .../main/resources/templates/project/add.html | 10 +- .../templates/project/datasource_csv.html | 8 +- .../templates/project/datasource_db.html | 2 +- .../templates/project/datasource_select.html | 31 +- .../templates/project/evaluation_history.html | 9 +- .../templates/project/evaluation_report.html | 66 ++- .../resources/templates/project/list.html | 62 ++- .../system/indicator/indicator_set.html | 177 ++++++--- .../resources/templates/system/log/list.html | 4 +- .../resources/templates/system/user/add.html | 2 +- manager-system/pom.xml | 9 +- .../system/algorithm/ahp/AhpTreeCompute.java | 9 - .../algorithm/fuzzy/EvaluationLevel.java | 6 +- .../fuzzy/FuzzyEvaluationService.java | 53 +-- .../algorithm/fuzzy/FuzzyEvaluationTest.java | 30 +- .../fuzzy/GlobalMembershipFunction.java | 11 +- .../system/algorithm/fuzzy/GradeRange.java | 15 +- .../system/algorithm/fuzzy/IndicatorNode.java | 5 +- .../LeafFullTriangularMembershipFunction.java | 120 +++--- .../fuzzy/LeafHybridMembershipFunction.java | 169 ++++---- .../algorithm/fuzzy/MembershipFunction.java | 8 +- .../system/aspect/LogOperationAspect.java | 52 ++- .../auth/controller/LoginController.java | 2 + .../auth/controller/ThirdLoginController.java | 104 +++++ .../system/base/controller/FaqController.java | 22 + .../base/controller/UserController.java | 7 +- .../com/hshh/system/base/entity/Users.java | 9 +- .../base/service/TableRelationsService.java | 5 + .../system/common/enums/ErrorMessage.java | 2 +- .../com/hshh/system/common/util/FileUtil.java | 68 ++++ .../hshh/system/common/util/StringTool.java | 90 +++++ .../hshh/system/config/SecurityConfig.java | 9 +- ...pointConfig.java => WsEndpointConfig.java} | 2 +- .../exception/ApiGlobalExceptionHandler.java | 6 +- .../system/filter/MultiReadRequestFilter.java | 13 +- pom.xml | 21 +- readme.md | 15 + todo | 3 + 104 files changed, 2201 insertions(+), 1081 deletions(-) create mode 100644 attachment/Clipboard_2025-09-07-20-38-36.png create mode 100644 attachment/Clipboard_2025-09-15-21-58-50.png create mode 100644 attachment/Clipboard_2025-09-15-21-59-14.png create mode 100644 attachment/Clipboard_2025-09-15-21-59-44.png create mode 100644 attachment/Clipboard_2025-09-15-22-00-21.png create mode 100644 attachment/Clipboard_2025-09-15-22-04-15.png create mode 100644 attachment/Clipboard_2025-09-15-22-05-54.png create mode 100644 attachment/Clipboard_2025-09-15-22-06-13.png create mode 100644 attachment/Clipboard_2025-09-15-22-06-29.png delete mode 100644 manager-admin/src/main/demo.html create mode 100644 manager-admin/src/main/java/com/hshh/config/DefaultIndicatorSetConfig.java create mode 100644 manager-admin/src/main/java/com/hshh/config/IndicatorConfig.java create mode 100644 manager-admin/src/main/resources/indicator_set.yaml create mode 100644 manager-admin/src/main/resources/static/img/help/root_add.png create mode 100644 manager-admin/src/main/resources/static/img/help/root_add_1.png create mode 100644 manager-admin/src/main/resources/static/img/help/root_add_2.png delete mode 100644 manager-admin/src/main/resources/static/img/undraw_bug_fixing_oc7a.svg delete mode 100644 manager-admin/src/main/resources/static/img/undraw_logistics.svg create mode 100644 manager-admin/src/main/resources/static/img/undraw_personal-goals_f9bb.svg create mode 100644 manager-admin/src/main/resources/templates/faq.html create mode 100644 manager-system/src/main/java/com/hshh/system/auth/controller/ThirdLoginController.java create mode 100644 manager-system/src/main/java/com/hshh/system/base/controller/FaqController.java create mode 100644 manager-system/src/main/java/com/hshh/system/common/util/FileUtil.java create mode 100644 manager-system/src/main/java/com/hshh/system/common/util/StringTool.java rename manager-system/src/main/java/com/hshh/system/config/{EndpointConfig.java => WsEndpointConfig.java} (92%) create mode 100644 readme.md create mode 100644 todo diff --git a/.idea/misc.xml b/.idea/misc.xml index 4246b5e..2a08422 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -12,7 +12,7 @@ - + \ No newline at end of file diff --git a/attachment/Clipboard_2025-09-07-20-38-36.png b/attachment/Clipboard_2025-09-07-20-38-36.png new file mode 100644 index 0000000000000000000000000000000000000000..af4628f095b8257825532f83762b4ed018a324e5 GIT binary patch literal 34786 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�O$kmo1@BEbkhReQ7 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 E02X#>cK`qY literal 0 HcmV?d00001 diff --git a/attachment/Clipboard_2025-09-15-21-58-50.png b/attachment/Clipboard_2025-09-15-21-58-50.png new file mode 100644 index 0000000000000000000000000000000000000000..6da93eda6b9ff83208e5490d617dc0b42b631bc8 GIT binary patch literal 34438 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 F{|k;JGCu$S literal 0 HcmV?d00001 diff --git a/attachment/Clipboard_2025-09-15-21-59-14.png b/attachment/Clipboard_2025-09-15-21-59-14.png new file mode 100644 index 0000000000000000000000000000000000000000..d03a460eceb78fe644be930ce9f8f198c1c62be7 GIT binary patch literal 100761 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

qG+H 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 literal 0 HcmV?d00001 diff --git a/attachment/Clipboard_2025-09-15-21-59-44.png b/attachment/Clipboard_2025-09-15-21-59-44.png new file mode 100644 index 0000000000000000000000000000000000000000..5e8dbe17e1b90642d1464d5750c0038cf9c902ae GIT binary patch literal 137442 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%0AgnlR&s519cL0dL`h*Y$D!UcCb|j1r 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/manager-admin/src/main/resources/static/img/undraw_personal-goals_f9bb.svg b/manager-admin/src/main/resources/static/img/undraw_personal-goals_f9bb.svg new file mode 100644 index 0000000..c3c2baf --- /dev/null +++ b/manager-admin/src/main/resources/static/img/undraw_personal-goals_f9bb.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/manager-admin/src/main/resources/templates/faq.html b/manager-admin/src/main/resources/templates/faq.html new file mode 100644 index 0000000..346c2b1 --- /dev/null +++ b/manager-admin/src/main/resources/templates/faq.html @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + +

+ + + \ No newline at end of file diff --git a/manager-admin/src/main/resources/templates/fragments/header.html b/manager-admin/src/main/resources/templates/fragments/header.html index 0479786..f1c860d 100644 --- a/manager-admin/src/main/resources/templates/fragments/header.html +++ b/manager-admin/src/main/resources/templates/fragments/header.html @@ -6,11 +6,13 @@
-
+
+
+ - \ No newline at end of file + diff --git a/manager-admin/src/main/resources/templates/home.html b/manager-admin/src/main/resources/templates/home.html index 6145147..d113a03 100644 --- a/manager-admin/src/main/resources/templates/home.html +++ b/manager-admin/src/main/resources/templates/home.html @@ -12,94 +12,117 @@ + - + @@ -245,9 +395,14 @@
+
+ empty +

+
+
@@ -258,6 +413,11 @@
+ + + + + @@ -271,17 +431,25 @@ diff --git a/manager-admin/src/main/resources/templates/indicator/add_indicator.html b/manager-admin/src/main/resources/templates/indicator/add_indicator.html index 16aa86a..ec00f4d 100644 --- a/manager-admin/src/main/resources/templates/indicator/add_indicator.html +++ b/manager-admin/src/main/resources/templates/indicator/add_indicator.html @@ -12,12 +12,7 @@
-
- - -
-
+ diff --git a/manager-admin/src/main/resources/templates/indicator/evaluation_list.html b/manager-admin/src/main/resources/templates/indicator/evaluation_list.html index 7cf4506..23cb0bd 100644 --- a/manager-admin/src/main/resources/templates/indicator/evaluation_list.html +++ b/manager-admin/src/main/resources/templates/indicator/evaluation_list.html @@ -6,7 +6,7 @@
- +
@@ -76,8 +76,8 @@ 等级名 - 上限 - 下限 + 上限(包含) + 下限(不包含) 等于 @@ -195,6 +195,7 @@ let topTd = document.createElement("td"); let topInput = document.createElement("input"); topInput.type = "number"; + topInput.value=0 topInput.style.width = "8ch"; topInput.addEventListener("change", function () { inputChange(); @@ -207,6 +208,7 @@ let bottomTd = document.createElement("td"); let bottomInput = document.createElement("input"); bottomInput.type = "number"; + bottomInput.value = 0; bottomInput.style.width = "8ch"; bottomInput.addEventListener("change", function () { inputChange() @@ -224,7 +226,7 @@ equalValueInput.addEventListener("change", function () { inputChange(); }); - if (historyMap.get(equalValueTd.textContent)) { + if (historyMap.get(td.textContent)) { equalValueInput.value = historyMap.get(td.textContent).equalValue; } equalValueTd.appendChild(equalValueInput); diff --git a/manager-admin/src/main/resources/templates/indicator/indicator_mapper.html b/manager-admin/src/main/resources/templates/indicator/indicator_mapper.html index ce67b17..46d1a48 100644 --- a/manager-admin/src/main/resources/templates/indicator/indicator_mapper.html +++ b/manager-admin/src/main/resources/templates/indicator/indicator_mapper.html @@ -37,18 +37,22 @@
1. 选择指标(根指标)
+
选择根指标后,再选择设施与 CSV + 以建立映射。 +
-
-
选择根指标后,再选择设施与 CSV 以建立映射。
+
@@ -81,10 +85,10 @@
3. 上传 CSV 文件
- +
上传文件,根据表头对应指标
- 未选择文件 - + +
上次上传文件: @@ -104,10 +108,21 @@
4. 子指标映射设置
+ +
+
+ 说明:为每个子指标选择表单字段或 CSV 列,系统会保存映射关系用于后续处理。 +
- +
@@ -117,14 +132,16 @@ - + - +
#
+
-
- 说明:为每个子指标选择表单字段或 CSV 列,系统会保存映射关系用于后续处理。 -
+
@@ -162,6 +178,33 @@ \ No newline at end of file diff --git a/manager-admin/src/main/resources/templates/system/indicator/indicator_set.html b/manager-admin/src/main/resources/templates/system/indicator/indicator_set.html index 5757039..4ccb442 100644 --- a/manager-admin/src/main/resources/templates/system/indicator/indicator_set.html +++ b/manager-admin/src/main/resources/templates/system/indicator/indicator_set.html @@ -30,66 +30,102 @@ 等级名 代表分 + 代表值 - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -99,7 +135,7 @@
-
+
2.全局默认隶属函数设置
@@ -110,9 +146,9 @@
@@ -122,7 +158,7 @@
@@ -133,7 +169,7 @@
@@ -143,7 +179,7 @@
@@ -152,6 +188,31 @@
+
+
+
3.模糊运算方式
+
+
+
+
+
+ +
+ +
+
+ +
+
+
+
@@ -168,23 +229,31 @@ function saveIndicatorGlobalSet(){ let levelGradeList = []; let levelNames = document.getElementsByName("_level"); let grades = document.getElementsByName("_score"); + let equalValues = document.getElementsByName("_equalValue"); for (let i = 0; i < levelNames.length; i++) { let level = {}; level.levelName = levelNames[i].value; - level.indicatorTopId = parseInt(obj.indicatorTopId); level.grade = parseInt(grades[i].value); + level.equalValue = (equalValues[i].value); levelGradeList.push(level); } - obj.topLevel = levelGradeList; - //获取顶级指标隶属函数设置 + //评价集设置 + obj.levels = levelGradeList; + let membership = {}; - membership.indicatorTopId = obj.indicatorTopId; + membership.membershipFunc = document.getElementById("_membershipFunc").value; membership.softEdgeS = document.getElementById("softEdgeS").value; membership.triangleOverlapRatio = document.getElementById("triangleOverlapRatio").value; membership.trianglePeakRatio = document.getElementById("trianglePeakRatio").value; + membership.method = document.getElementById("_method").value; + //级指标隶属函数设置 obj.topSet = membership; - + let url = document.getElementById("_rootPath").value+"indicatorSet/save" + let http = new HttpClient(); + http.post(url, obj,function (error,res,xhr) { + showAlert("success","保存成功") + },null,null) } \ No newline at end of file diff --git a/manager-admin/src/main/resources/templates/system/log/list.html b/manager-admin/src/main/resources/templates/system/log/list.html index 6a02b07..7343eb7 100644 --- a/manager-admin/src/main/resources/templates/system/log/list.html +++ b/manager-admin/src/main/resources/templates/system/log/list.html @@ -58,7 +58,7 @@
- +
@@ -82,7 +82,7 @@ - + diff --git a/manager-admin/src/main/resources/templates/system/user/add.html b/manager-admin/src/main/resources/templates/system/user/add.html index 2e28942..402588c 100644 --- a/manager-admin/src/main/resources/templates/system/user/add.html +++ b/manager-admin/src/main/resources/templates/system/user/add.html @@ -48,7 +48,7 @@
-
昵称
+
昵称
diff --git a/manager-system/pom.xml b/manager-system/pom.xml index 1377e24..5459fd3 100644 --- a/manager-system/pom.xml +++ b/manager-system/pom.xml @@ -79,16 +79,21 @@ org.springframework.boot spring-boot-starter-websocket - + org.springframework.boot spring-boot-starter-aop - + org.springframework spring-context-support + + com + dmjdbc + + diff --git a/manager-system/src/main/java/com/hshh/system/algorithm/ahp/AhpTreeCompute.java b/manager-system/src/main/java/com/hshh/system/algorithm/ahp/AhpTreeCompute.java index 8321683..a2291cf 100644 --- a/manager-system/src/main/java/com/hshh/system/algorithm/ahp/AhpTreeCompute.java +++ b/manager-system/src/main/java/com/hshh/system/algorithm/ahp/AhpTreeCompute.java @@ -52,16 +52,7 @@ public class AhpTreeCompute { * 打印树(缩进展示),显示局部/全局权重与一致性 */ static void printTree(AhpNode node, int depth) { - String indent = " ".repeat(depth); - String info = String.format("%s- %s (global=%.4f)", indent, node.name, - Double.isNaN(node.globalWeight) ? 0.0 : node.globalWeight); - - - - for (AhpNode c : node.children) { - printTree(c, depth + 1); - } } // ---------------- 完整示例 ---------------- diff --git a/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/EvaluationLevel.java b/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/EvaluationLevel.java index 2252209..35c9c0b 100644 --- a/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/EvaluationLevel.java +++ b/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/EvaluationLevel.java @@ -12,11 +12,15 @@ package com.hshh.system.algorithm.fuzzy; // 评价等级定义类 public class EvaluationLevel { private String levelName; + //分值 private double score; + //相等值 + private String equalValue; - public EvaluationLevel(String levelName, double score) { + public EvaluationLevel(String levelName, double score, String equalValue) { this.levelName = levelName; this.score = score; + this.equalValue = equalValue; } public String getLevelName() { return levelName; } diff --git a/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/FuzzyEvaluationService.java b/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/FuzzyEvaluationService.java index b5774c7..d5bf988 100644 --- a/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/FuzzyEvaluationService.java +++ b/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/FuzzyEvaluationService.java @@ -15,6 +15,7 @@ import java.util.Map; * @since 2025/7/22 */ public class FuzzyEvaluationService { + private GlobalEvaluationConfig globalConfig; public FuzzyEvaluationService(GlobalEvaluationConfig globalConfig) { @@ -37,8 +38,15 @@ public class FuzzyEvaluationService { calculateScore(node); } + /** + * 计算叶子界的点的隶属度. + * + * @param node 叶子节点 + */ private void calculateLeafNodeMembership(IndicatorNode node) { + if (node.getActualValue() != null && node.getMembershipFunction() != null) { + Map membership = node.getMembershipFunction() .calculateMembership(node.getActualValue()); node.setMembershipDegrees(membership); @@ -69,7 +77,8 @@ public class FuzzyEvaluationService { } // 修正:添加归一化处理 - if (operator == FuzzyOperator.MIN_BOUNDED_SUM || operator == FuzzyOperator.PRODUCT_BOUNDED_SUM) { + if (operator == FuzzyOperator.MIN_BOUNDED_SUM + || operator == FuzzyOperator.PRODUCT_BOUNDED_SUM) { normalizeMembership(combinedMembership); } @@ -146,47 +155,9 @@ public class FuzzyEvaluationService { } public void printEvaluationResult(IndicatorNode root) { - System.out.println("=== 模糊综合评价结果 ==="); - System.out.println("全局评价等级和代表分:"); - for (EvaluationLevel level : globalConfig.getEvaluationLevels()) { - System.out.println(" " + level.getLevelName() + ": " + level.getScore()); - } - System.out.println(); - printNodeResult(root, 0); + + } - private void printNodeResult(IndicatorNode node, int level) { - String indent = " ".repeat(level); - System.out.println(indent + "节点: " + node.getName() + " (ID: " + node.getId() + ")"); - if (node.getWeight() != null) { - System.out.println(indent + "权重: " + String.format("%.4f", node.getWeight())); - } - if (node.getActualValue() != null) { - System.out.println(indent + "实际值: " + node.getActualValue()); - } - if (node.getMembershipFunction() != null) { - System.out.println(indent + "隶属函数类型: " + node.getMembershipFunction().getType()); - } - - System.out.println(indent + "隶属度: "); - // 修正:显示隶属度总和用于调试 - double totalMembership = 0.0; - for (String levelName : globalConfig.getAllLevelNames()) { - double degree = node.getMembershipDegrees().getOrDefault(levelName, 0.0); - totalMembership += degree; - System.out.println(indent + " " + levelName + ": " + String.format("%.4f", degree)); - } - System.out.println(indent + " 总和: " + String.format("%.4f", totalMembership)); - - if (node.getScore() != null) { - System.out.println(indent + "综合分值: " + String.format("%.2f", node.getScore())); - } - - System.out.println(indent + "---"); - - for (IndicatorNode child : node.getChildren()) { - printNodeResult(child, level + 1); - } - } } diff --git a/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/FuzzyEvaluationTest.java b/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/FuzzyEvaluationTest.java index 69f105e..9510291 100644 --- a/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/FuzzyEvaluationTest.java +++ b/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/FuzzyEvaluationTest.java @@ -14,11 +14,11 @@ public class FuzzyEvaluationTest { public static void main(String[] args) { // 创建全局评价配置 List evaluationLevels = Arrays.asList( - new EvaluationLevel("差", 40.0), - new EvaluationLevel("及格", 60.0), - new EvaluationLevel("中", 70.0), - new EvaluationLevel("良", 80.0), - new EvaluationLevel("优", 90.0) + new EvaluationLevel("差", 40.0,""), + new EvaluationLevel("及格", 60.0,""), + new EvaluationLevel("中", 70.0,""), + new EvaluationLevel("良", 80.0,""), + new EvaluationLevel("优", 90.0,"") ); GlobalEvaluationConfig globalConfig = new GlobalEvaluationConfig(evaluationLevels); @@ -75,19 +75,19 @@ public class FuzzyEvaluationTest { // 修正:调整底部指标的评价区间,使其更合理 List chineseRanges = Arrays.asList( - new GradeRange("差", 0, 60), - new GradeRange("及格", 60, 70), - new GradeRange("中", 70, 80), // 调整回原来的区间 - new GradeRange("良", 80, 90), // 88分应该在这个区间有较高隶属度 - new GradeRange("优", 90, 100) + new GradeRange("差", 0, 60,""), + new GradeRange("及格", 60, 70,""), + new GradeRange("中", 70, 80,""), // 调整回原来的区间 + new GradeRange("良", 80, 90,""), // 88分应该在这个区间有较高隶属度 + new GradeRange("优", 90, 100,"") ); List englishRanges = Arrays.asList( - new GradeRange("差", 0, 60), - new GradeRange("及格", 60, 70), - new GradeRange("中", 70, 80), // 调整回原来的区间 - new GradeRange("良", 80, 90), // 88分应该在这个区间有较高隶属度 - new GradeRange("优", 90, 100) + new GradeRange("差", 0, 60,""), + new GradeRange("及格", 60, 70,""), + new GradeRange("中", 70, 80,""), // 调整回原来的区间 + new GradeRange("良", 80, 90,""), // 88分应该在这个区间有较高隶属度 + new GradeRange("优", 90, 100,"") ); diff --git a/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/GlobalMembershipFunction.java b/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/GlobalMembershipFunction.java index 366eb4b..e01ca63 100644 --- a/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/GlobalMembershipFunction.java +++ b/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/GlobalMembershipFunction.java @@ -14,6 +14,7 @@ import java.util.Map; * @since 2025/7/22 */ public class GlobalMembershipFunction implements MembershipFunction { + private String functionType; private double overlapRatio; private double peakRatio; @@ -31,7 +32,7 @@ public class GlobalMembershipFunction implements MembershipFunction { } @Override - public Map calculateMembership(double value) { + public Map calculateMembership(Object value) { Map membership = new HashMap<>(); List levelNames = globalConfig.getAllLevelNames(); @@ -42,14 +43,14 @@ public class GlobalMembershipFunction implements MembershipFunction { if ("TRAP_TRI".equals(functionType)) { if (i == 0) { - degree = calculateLeftTrapezoid(value, scores, i); + degree = calculateLeftTrapezoid((Double) value, scores, i); } else if (i == levelNames.size() - 1) { - degree = calculateRightTrapezoid(value, scores, i); + degree = calculateRightTrapezoid((Double) value, scores, i); } else { - degree = calculateTriangle(value, scores, i); + degree = calculateTriangle((Double) value, scores, i); } } else { - degree = calculateTriangle(value, scores, i); + degree = calculateTriangle((Double) value, scores, i); } membership.put(levelNames.get(i), Math.max(0.0, Math.min(1.0, degree))); diff --git a/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/GradeRange.java b/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/GradeRange.java index 5ec7ce9..8809f29 100644 --- a/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/GradeRange.java +++ b/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/GradeRange.java @@ -1,5 +1,7 @@ package com.hshh.system.algorithm.fuzzy; +import lombok.Data; + /** * [类的简要说明] *

@@ -9,21 +11,18 @@ package com.hshh.system.algorithm.fuzzy; * @author LiDongYU * @since 2025/7/22 */ +@Data public class GradeRange { private String gradeName; private double lowerBound; private double upperBound; - - public GradeRange(String gradeName, double lowerBound, double upperBound) { + private String equalVal; + public GradeRange(String gradeName, double lowerBound, double upperBound, String equalVal) { this.gradeName = gradeName; this.lowerBound = lowerBound; this.upperBound = upperBound; + this.equalVal = equalVal; } - public String getGradeName() { return gradeName; } - public double getLowerBound() { return lowerBound; } - public double getUpperBound() { return upperBound; } - public void setGradeName(String gradeName) { this.gradeName = gradeName; } - public void setLowerBound(double lowerBound) { this.lowerBound = lowerBound; } - public void setUpperBound(double upperBound) { this.upperBound = upperBound; } + } diff --git a/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/IndicatorNode.java b/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/IndicatorNode.java index 8d25a76..a61da85 100644 --- a/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/IndicatorNode.java +++ b/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/IndicatorNode.java @@ -21,7 +21,7 @@ public class IndicatorNode { private String id; private String name; private Double weight; - private Double actualValue; + private Object actualValue; private MembershipFunction membershipFunction; private List children; private IndicatorNode parent; @@ -34,11 +34,14 @@ public class IndicatorNode { private String logicName; private int projectId; + + public IndicatorNode(String id, String name) { this.id = id; this.name = name; this.children = new ArrayList<>(); this.membershipDegrees = new HashMap<>(); + } diff --git a/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/LeafFullTriangularMembershipFunction.java b/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/LeafFullTriangularMembershipFunction.java index 439f650..5f436b9 100644 --- a/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/LeafFullTriangularMembershipFunction.java +++ b/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/LeafFullTriangularMembershipFunction.java @@ -14,6 +14,7 @@ import java.util.Map; * @since 2025/7/22 */ public class LeafFullTriangularMembershipFunction implements MembershipFunction { + private List gradeRanges; private double overlapRatio; private double peakRatio; @@ -36,76 +37,63 @@ public class LeafFullTriangularMembershipFunction implements MembershipFunction List globalLevels = globalConfig.getAllLevelNames(); for (GradeRange range : gradeRanges) { if (!globalLevels.contains(range.getGradeName())) { - throw new IllegalArgumentException("评价等级名称 '" + range.getGradeName() + "' 不在全局定义中"); + throw new IllegalArgumentException( + "评价等级名称 '" + range.getGradeName() + "' 不在全局定义中"); } } } @Override - public Map calculateMembership(double value) { - System.out.println("\n🔍 ===== ALL_TRI算法开始计算隶属度 ====="); - System.out.println("输入值: " + value); - System.out.println("重叠比例: " + overlapRatio); - System.out.println("峰值比例: " + peakRatio); - System.out.println("软边界: " + softEdge); - System.out.println("等级数量: " + gradeRanges.size()); - + public Map calculateMembership(Object value) { Map membership = new HashMap<>(); // 初始化所有全局等级的隶属度为0 for (String levelName : globalConfig.getAllLevelNames()) { membership.put(levelName, 0.0); } - - System.out.println("\n📊 开始逐个计算等级隶属度:"); - - for (int i = 0; i < gradeRanges.size(); i++) { - GradeRange range = gradeRanges.get(i); - - System.out.println("\n--- 第" + (i+1) + "个等级: " + range.getGradeName() + " ---"); - System.out.println("原始区间: [" + range.getLowerBound() + ", " + range.getUpperBound() + "]"); - - double degree = calculateTriangle(value, range, i); - degree = Math.max(0.0, Math.min(1.0, degree)); - membership.put(range.getGradeName(), degree); - - System.out.println("最终隶属度: " + degree); - } - - System.out.println("\n📈 归一化前的隶属度:"); - double totalBefore = 0.0; - for (Map.Entry entry : membership.entrySet()) { - System.out.println(" " + entry.getKey() + ": " + String.format("%.6f", entry.getValue())); - totalBefore += entry.getValue(); - } - System.out.println("归一化前总和: " + String.format("%.6f", totalBefore)); - - // 🔥 关键修复:添加归一化处理 - if (totalBefore > 0 && Math.abs(totalBefore - 1.0) > 0.001) { - System.out.println("\n🔄 开始归一化处理:"); - - for (String key : membership.keySet()) { - if (membership.get(key) > 0) { - double originalValue = membership.get(key); - double normalizedValue = originalValue / totalBefore; - membership.put(key, normalizedValue); - System.out.println(" " + key + ": " + String.format("%.6f", originalValue) + " → " + String.format("%.6f", normalizedValue)); + if (!isNumber(value.toString())) { + for (GradeRange range : gradeRanges) { + if (range.getEqualVal().equals(value)) { + if (membership.get(range.getGradeName()) != null) { + membership.put(range.getGradeName(), 1.0); + break; + } } } - - double totalAfter = membership.values().stream().mapToDouble(Double::doubleValue).sum(); - System.out.println("归一化后总和: " + String.format("%.6f", totalAfter)); - } else { - System.out.println("\n✅ 无需归一化 (总和已接近1.0)"); } - System.out.println("\n📋 最终隶属度结果:"); - for (Map.Entry entry : membership.entrySet()) { - if (entry.getValue() > 0) { - System.out.println(" " + entry.getKey() + ": " + String.format("%.6f", entry.getValue())); + if (isNumber(value.toString())) { + for (int i = 0; i < gradeRanges.size(); i++) { + GradeRange range = gradeRanges.get(i); + + double degree = calculateTriangle(Double.parseDouble(value.toString()) , range, i); + degree = Math.max(0.0, Math.min(1.0, degree)); + membership.put(range.getGradeName(), degree); + + + } + + double totalBefore = 0.0; + for (Map.Entry entry : membership.entrySet()) { + + totalBefore += entry.getValue(); + } + + // 🔥 关键修复:添加归一化处理 + if (totalBefore > 0 && Math.abs(totalBefore - 1.0) > 0.001) { + + for (String key : membership.keySet()) { + if (membership.get(key) > 0) { + double originalValue = membership.get(key); + double normalizedValue = originalValue / totalBefore; + membership.put(key, normalizedValue); + + } + } + + } } - System.out.println("===== ALL_TRI算法计算完成 =====\n"); return membership; } @@ -142,37 +130,27 @@ public class LeafFullTriangularMembershipFunction implements MembershipFunction System.out.println(" 最后一个等级,右边界大幅延伸: " + rightBoundary); } - System.out.println(" 区间宽度: " + rangeWidth); - System.out.println(" 重叠距离: " + overlap); - System.out.println(" 扩展后区间: [" + leftBoundary + ", " + rightBoundary + "]"); - double result; if (value <= leftBoundary || value >= rightBoundary) { - System.out.println(" 判断: value 在扩展区间外 → 返回 0.0"); + result = 0.0; } else if (Math.abs(value - peakPoint) < 0.0001) { // 处理浮点数比较 - System.out.println(" 判断: value 等于峰值点 → 返回 1.0"); + result = 1.0; } else if (value <= peakPoint) { // 上升边 double slope = 1.0 / (peakPoint - leftBoundary); double basicDegree = (value - leftBoundary) * slope; - System.out.println(" 判断: 上升边计算"); - System.out.println(" 上升边区间: [" + leftBoundary + ", " + peakPoint + "]"); - System.out.println(" 斜率: " + slope); - System.out.println(" 基础隶属度: " + basicDegree); + result = applySoftEdge(basicDegree); - System.out.println(" 软边界处理后: " + result); + } else { // 下降边 double slope = 1.0 / (rightBoundary - peakPoint); double basicDegree = (rightBoundary - value) * slope; - System.out.println(" 判断: 下降边计算"); - System.out.println(" 下降边区间: [" + peakPoint + ", " + rightBoundary + "]"); - System.out.println(" 斜率: " + slope); - System.out.println(" 基础隶属度: " + basicDegree); + result = applySoftEdge(basicDegree); - System.out.println(" 软边界处理后: " + result); + } return result; @@ -180,11 +158,11 @@ public class LeafFullTriangularMembershipFunction implements MembershipFunction private double applySoftEdge(double degree) { if (softEdge <= 0) { - System.out.println(" 软边界处理: softEdge <= 0,直接返回原值"); + return degree; } else { double result = 1.0 / (1.0 + Math.exp(-softEdge * (degree - 0.5))); - System.out.println(" 软边界处理: sigmoid函数," + degree + " → " + result); + return result; } } diff --git a/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/LeafHybridMembershipFunction.java b/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/LeafHybridMembershipFunction.java index a2f1883..8fd09c3 100644 --- a/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/LeafHybridMembershipFunction.java +++ b/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/LeafHybridMembershipFunction.java @@ -14,6 +14,7 @@ import java.util.Map; * @since 2025/7/22 */ public class LeafHybridMembershipFunction implements MembershipFunction { + private List gradeRanges; private double overlapRatio; private double peakRatio; @@ -36,14 +37,14 @@ public class LeafHybridMembershipFunction implements MembershipFunction { List globalLevels = globalConfig.getAllLevelNames(); for (GradeRange range : gradeRanges) { if (!globalLevels.contains(range.getGradeName())) { - throw new IllegalArgumentException("评价等级名称 '" + range.getGradeName() + "' 不在全局定义中"); + throw new IllegalArgumentException( + "评价等级名称 '" + range.getGradeName() + "' 不在全局定义中"); } } } @Override - public Map calculateMembership(double value) { - + public Map calculateMembership(Object value) { Map membership = new HashMap<>(); @@ -52,68 +53,63 @@ public class LeafHybridMembershipFunction implements MembershipFunction { membership.put(levelName, 0.0); } - System.out.println("\n📊 开始逐个计算等级隶属度:"); - - // 计算每个自定义区间的隶属度 - for (int i = 0; i < gradeRanges.size(); i++) { - GradeRange range = gradeRanges.get(i); - - System.out.println("\n--- 第" + (i+1) + "个等级: " + range.getGradeName() + " ---"); - System.out.println("原始区间: [" + range.getLowerBound() + ", " + range.getUpperBound() + "]"); - - double degree = 0.0; - - if (i == 0) { - System.out.println("类型: 左梯形 (第一个等级)"); - degree = calculateLeftTrapezoid(value, range, i); - } else if (i == gradeRanges.size() - 1) { - System.out.println("类型: 右梯形 (最后一个等级)"); - degree = calculateRightTrapezoid(value, range, i); - } else { - System.out.println("类型: 三角形 (中间等级)"); - degree = calculateTriangle(value, range, i); - } - - degree = Math.max(0.0, Math.min(1.0, degree)); - membership.put(range.getGradeName(), degree); - - System.out.println("最终隶属度: " + degree); - } - - System.out.println("\n📈 归一化前的隶属度:"); - double totalBefore = 0.0; - for (Map.Entry entry : membership.entrySet()) { - System.out.println(" " + entry.getKey() + ": " + String.format("%.6f", entry.getValue())); - totalBefore += entry.getValue(); - } - System.out.println("归一化前总和: " + String.format("%.6f", totalBefore)); - - // 归一化处理(修正版) - if (totalBefore > 0 && Math.abs(totalBefore - 1.0) > 0.001) { - System.out.println("\n🔄 开始归一化处理:"); - - for (String key : membership.keySet()) { - if (membership.get(key) > 0) { - double originalValue = membership.get(key); - double normalizedValue = originalValue / totalBefore; - membership.put(key, normalizedValue); - System.out.println(" " + key + ": " + String.format("%.6f", originalValue) + " → " + String.format("%.6f", normalizedValue)); + if (!isNumber(value.toString())) { + for (GradeRange range : gradeRanges) { + if (range.getEqualVal().equals(value)) { + if (membership.get(range.getGradeName()) != null) { + membership.put(range.getGradeName(), 1.0); + break; + } } } - - double totalAfter = membership.values().stream().mapToDouble(Double::doubleValue).sum(); - System.out.println("归一化后总和: " + String.format("%.6f", totalAfter)); - } else { - System.out.println("\n✅ 无需归一化 (总和已接近1.0)"); } - System.out.println("\n📋 最终隶属度结果:"); - for (Map.Entry entry : membership.entrySet()) { - if (entry.getValue() > 0) { - System.out.println(" " + entry.getKey() + ": " + String.format("%.6f", entry.getValue())); + if (isNumber(value.toString())) { + + // 计算每个自定义区间的隶属度 + for (int i = 0; i < gradeRanges.size(); i++) { + GradeRange range = gradeRanges.get(i); + + double degree = 0.0; + + if (i == 0) { + + degree = calculateLeftTrapezoid(Double.parseDouble(value.toString()), range, i); + } else if (i == gradeRanges.size() - 1) { + + degree = calculateRightTrapezoid(Double.parseDouble(value.toString()), range, i); + } else { + + degree = calculateTriangle(Double.parseDouble(value.toString()), range, i); + } + + degree = Math.max(0.0, Math.min(1.0, degree)); + membership.put(range.getGradeName(), degree); + + + } + + double totalBefore = 0.0; + for (Map.Entry entry : membership.entrySet()) { + + totalBefore += entry.getValue(); + } + + // 归一化处理(修正版) + if (totalBefore > 0 && Math.abs(totalBefore - 1.0) > 0.001) { + + for (String key : membership.keySet()) { + if (membership.get(key) > 0) { + double originalValue = membership.get(key); + double normalizedValue = originalValue / totalBefore; + membership.put(key, normalizedValue); + + } + } + + } } - System.out.println("===== 隶属度计算完成 =====\n"); return membership; } @@ -125,27 +121,22 @@ public class LeafHybridMembershipFunction implements MembershipFunction { double nextLowerBound = index + 1 < gradeRanges.size() ? gradeRanges.get(index + 1).getLowerBound() : plateauEnd; - System.out.println(" 平台区间: [" + plateauStart + ", " + plateauEnd + "]"); - System.out.println(" 下一等级下界: " + nextLowerBound); - double result; if (value <= plateauStart) { - System.out.println(" 判断: value <= plateauStart → 返回 1.0"); + result = 1.0; } else if (value <= plateauEnd) { - System.out.println(" 判断: plateauStart < value <= plateauEnd → 返回 1.0"); + result = 1.0; } else if (value >= nextLowerBound) { - System.out.println(" 判断: value >= nextLowerBound → 返回 0.0"); + result = 0.0; } else { double slope = 1.0 / (nextLowerBound - plateauEnd); double basicDegree = (nextLowerBound - value) * slope; - System.out.println(" 判断: 下降边计算"); - System.out.println(" 斜率: " + slope); - System.out.println(" 基础隶属度: " + basicDegree); + result = applySoftEdge(basicDegree); - System.out.println(" 软边界处理后: " + result); + } return result; @@ -160,11 +151,6 @@ public class LeafHybridMembershipFunction implements MembershipFunction { double overlap = rangeWidth * overlapRatio; double leftExtend = plateauStart - overlap; - System.out.println(" 平台区间: [" + plateauStart + ", " + plateauEnd + "]"); - System.out.println(" 区间宽度: " + rangeWidth); - System.out.println(" 重叠距离: " + overlap); - System.out.println(" 左扩展点: " + leftExtend); - double result; if (value <= leftExtend) { System.out.println(" 判断: value <= leftExtend → 返回 0.0"); @@ -172,13 +158,11 @@ public class LeafHybridMembershipFunction implements MembershipFunction { } else if (value <= plateauStart) { double slope = 1.0 / (plateauStart - leftExtend); double basicDegree = (value - leftExtend) * slope; - System.out.println(" 判断: 上升边计算"); - System.out.println(" 斜率: " + slope); - System.out.println(" 基础隶属度: " + basicDegree); + result = applySoftEdge(basicDegree); - System.out.println(" 软边界处理后: " + result); + } else { - System.out.println(" 判断: value > plateauStart → 返回 1.0"); + result = 1.0; } @@ -196,36 +180,25 @@ public class LeafHybridMembershipFunction implements MembershipFunction { double leftBoundary = lowerBound - overlap / 2; double rightBoundary = upperBound + overlap / 2; - System.out.println(" 区间宽度: " + rangeWidth); - System.out.println(" 重叠距离: " + overlap); - System.out.println(" 峰值点: " + peakPoint); - System.out.println(" 扩展后区间: [" + leftBoundary + ", " + rightBoundary + "]"); - double result; if (value <= leftBoundary || value >= rightBoundary) { - System.out.println(" 判断: value 在扩展区间外 → 返回 0.0"); + result = 0.0; } else if (Math.abs(value - peakPoint) < 0.0001) { // 处理浮点数比较 - System.out.println(" 判断: value 等于峰值点 → 返回 1.0"); + result = 1.0; } else if (value < peakPoint) { double slope = 1.0 / (peakPoint - leftBoundary); double basicDegree = (value - leftBoundary) * slope; - System.out.println(" 判断: 上升边计算"); - System.out.println(" 上升边区间: [" + leftBoundary + ", " + peakPoint + "]"); - System.out.println(" 斜率: " + slope); - System.out.println(" 基础隶属度: " + basicDegree); + result = applySoftEdge(basicDegree); - System.out.println(" 软边界处理后: " + result); + } else { double slope = 1.0 / (rightBoundary - peakPoint); double basicDegree = (rightBoundary - value) * slope; - System.out.println(" 判断: 下降边计算"); - System.out.println(" 下降边区间: [" + peakPoint + ", " + rightBoundary + "]"); - System.out.println(" 斜率: " + slope); - System.out.println(" 基础隶属度: " + basicDegree); + result = applySoftEdge(basicDegree); - System.out.println(" 软边界处理后: " + result); + } return result; @@ -233,11 +206,11 @@ public class LeafHybridMembershipFunction implements MembershipFunction { private double applySoftEdge(double degree) { if (softEdge <= 0) { - System.out.println(" 软边界处理: softEdge <= 0,直接返回原值"); + return degree; } else { double result = 1.0 / (1.0 + Math.exp(-softEdge * (degree - 0.5))); - System.out.println(" 软边界处理: sigmoid函数," + degree + " → " + result); + return result; } } diff --git a/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/MembershipFunction.java b/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/MembershipFunction.java index 411876e..237f6fe 100644 --- a/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/MembershipFunction.java +++ b/manager-system/src/main/java/com/hshh/system/algorithm/fuzzy/MembershipFunction.java @@ -12,6 +12,12 @@ import java.util.Map; * @since 2025/7/22 */ public interface MembershipFunction { - Map calculateMembership(double value); + + Map calculateMembership(Object value); + String getType(); + + default boolean isNumber(String str) { + return str != null && str.matches("^\\d+(\\.\\d+)?$"); + } } diff --git a/manager-system/src/main/java/com/hshh/system/aspect/LogOperationAspect.java b/manager-system/src/main/java/com/hshh/system/aspect/LogOperationAspect.java index f1d957d..1ad3da0 100644 --- a/manager-system/src/main/java/com/hshh/system/aspect/LogOperationAspect.java +++ b/manager-system/src/main/java/com/hshh/system/aspect/LogOperationAspect.java @@ -3,6 +3,7 @@ package com.hshh.system.aspect; import com.hshh.system.Global; import com.hshh.system.annotation.LogOperation; import com.hshh.system.base.entity.Logs; +import com.hshh.system.common.Strings.StringUtil; import com.hshh.system.common.jwt.JwtUtil; import com.hshh.system.common.util.IpUtil; import java.time.LocalDateTime; @@ -37,23 +38,48 @@ public class LogOperationAspect { public void logPointcut() { } - @SuppressWarnings("checkstyle:VariableDeclarationUsageDistance") + @Before("logPointcut()") public void before(JoinPoint joinPoint) { + try { + HttpServletRequest request = getCurrentRequest(); + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + LogOperation logOperation = signature.getMethod().getAnnotation(LogOperation.class); + Object[] args = joinPoint.getArgs(); + String ip = getCurrentUserIp(); + String userName = JwtUtil.getCurrentUsername(); + Logs logs = new Logs(); + logs.setIp(ip); + logs.setOperator(userName); + logs.setType("BIZ"); + if (request != null) { + logs.setUrl(request.getRequestURL().toString()); + logs.setParams(StringUtil.getParamsAsJson(request)); + } - MethodSignature signature = (MethodSignature) joinPoint.getSignature(); - LogOperation logOperation = signature.getMethod().getAnnotation(LogOperation.class); - String ip = getCurrentUserIp(); - String userName = JwtUtil.getCurrentUsername(); - Logs logs = new Logs(); - logs.setIp(ip); - logs.setOperator(userName); - logs.setType("BIZ"); - logs.setCreateTime(LocalDateTime.now()); - if (logOperation != null) { - logs.setMsg(logOperation.value()); + logs.setCreateTime(LocalDateTime.now()); + if (logOperation != null) { + logs.setMsg(logOperation.value()); + } + Global.logQueue.offer(logs); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + + /** + * 获取当前请求的HttpServletRequest. + */ + private HttpServletRequest getCurrentRequest() { + try { + ServletRequestAttributes attributes = + (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); + return attributes.getRequest(); + } catch (IllegalStateException e) { + log.warn("无法获取当前请求上下文"); + return null; } - Global.logQueue.offer(logs); } /** diff --git a/manager-system/src/main/java/com/hshh/system/auth/controller/LoginController.java b/manager-system/src/main/java/com/hshh/system/auth/controller/LoginController.java index 40d9a93..fad36bc 100644 --- a/manager-system/src/main/java/com/hshh/system/auth/controller/LoginController.java +++ b/manager-system/src/main/java/com/hshh/system/auth/controller/LoginController.java @@ -169,6 +169,8 @@ public class LoginController { if (extendUserDetails.isAdmin()) { request.setAttribute("menus", menusService.getRootMenus()); + } else { + request.setAttribute("menus", menusService.getUserMenus(extendUserDetails.getId())); } return "home"; } diff --git a/manager-system/src/main/java/com/hshh/system/auth/controller/ThirdLoginController.java b/manager-system/src/main/java/com/hshh/system/auth/controller/ThirdLoginController.java new file mode 100644 index 0000000..75aa6ce --- /dev/null +++ b/manager-system/src/main/java/com/hshh/system/auth/controller/ThirdLoginController.java @@ -0,0 +1,104 @@ +package com.hshh.system.auth.controller; + +import com.hshh.system.auth.bean.ExtendUserDetails; +import com.hshh.system.base.entity.Users; +import com.hshh.system.base.service.ConfigSetService; +import com.hshh.system.base.service.MenusService; +import com.hshh.system.base.service.UsersService; +import javax.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.web.context.HttpSessionSecurityContextRepository; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +/** + * [类的简要说明] + *

+ * [详细描述,可选] + *

+ * + * @author LiDongYU + * @since 2025/7/22 + */ +@Controller +@RequestMapping("/thirdLogin") +@Slf4j +public class ThirdLoginController { + + + private final AuthenticationManager authenticationManager; + + //系统配置参数服务类 + private final ConfigSetService configSetService; + private final MenusService menusService; + private final UsersService usersService; + //第三方页面登录时统一分配简单密码,用于访问功能 + private static final String defaultPassword = "123456"; + + public ThirdLoginController(AuthenticationManager authenticationManager, + + ConfigSetService configSetService, MenusService menusService, UsersService usersService) { + this.authenticationManager = authenticationManager; + + this.configSetService = configSetService; + this.menusService = menusService; + this.usersService = usersService; + + } + + /** + * 外部调用直接进入评估系统页面. + * + * @param username 用户名 + * @param model 容器 + * @param request 请求 + * @return home.html + */ + @GetMapping("/thirdLoginPage") + public String thirdLoginPage(String username, Model model, + HttpServletRequest request) { + try { + Users exitUser = usersService.getUserByUsername(username); + if (exitUser == null) { + //建立新用户 + Users user = new Users(); + user.setUsername(username); + user.setNickName(username); + user.setAdmin(true); + user.setHashedPassword(new BCryptPasswordEncoder().encode(defaultPassword)); + usersService.saveUsers(user); + } + //查询用户名是否存在,如果存在,直接登录;如果不存在,新建用户 + UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken( + username, defaultPassword); + //验证 + Authentication authentication = authenticationManager.authenticate(token); + //结果放入 + SecurityContextHolder.getContext().setAuthentication(authentication); + //放入session中 + request.getSession() + .setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, + SecurityContextHolder.getContext()); + ExtendUserDetails extendUserDetails = (ExtendUserDetails) authentication.getPrincipal(); + //用户信息 + request.setAttribute("user", extendUserDetails); + //获取菜单 + if (extendUserDetails.isAdmin()) { + request.setAttribute("menus", menusService.getRootMenus()); + + } + model.addAttribute("systemTitle", configSetService.getTitle()); + + } catch (Exception e) { + log.error(e.getMessage()); + } + return "home"; + } +} diff --git a/manager-system/src/main/java/com/hshh/system/base/controller/FaqController.java b/manager-system/src/main/java/com/hshh/system/base/controller/FaqController.java new file mode 100644 index 0000000..ccc6a79 --- /dev/null +++ b/manager-system/src/main/java/com/hshh/system/base/controller/FaqController.java @@ -0,0 +1,22 @@ +package com.hshh.system.base.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +/** + * [类的简要说明] + *

+ * [详细描述,可选] + *

+ * + * @author LiDongYU + * @since 2025/7/22 + */ +@Controller +public class FaqController { + + @GetMapping("faq") + public String faq() { + return "faq"; + } +} diff --git a/manager-system/src/main/java/com/hshh/system/base/controller/UserController.java b/manager-system/src/main/java/com/hshh/system/base/controller/UserController.java index 13bacb0..89f9f2d 100644 --- a/manager-system/src/main/java/com/hshh/system/base/controller/UserController.java +++ b/manager-system/src/main/java/com/hshh/system/base/controller/UserController.java @@ -13,11 +13,11 @@ import com.hshh.system.common.bean.BaseController; import com.hshh.system.common.bean.ErrorField; import com.hshh.system.common.bean.OperateResult; import com.hshh.system.common.bean.PaginationBean; -import com.hshh.system.common.bean.TableRowsResult; import com.hshh.system.common.enums.ErrorCode; import com.hshh.system.common.enums.ErrorMessage; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.Collections; import java.util.List; import javax.annotation.Resource; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @@ -125,9 +125,10 @@ public class UserController extends BaseController { private OperateResult handleUserSave(Users user) { //检查确认密码和密码是否一致 - if (!user.getHashedPassword().equalsIgnoreCase(user.getConfirmHashedPassword())) { + if (user.getHashedPassword() != null && user.getConfirmHashedPassword() != null + && !user.getHashedPassword().equalsIgnoreCase(user.getConfirmHashedPassword())) { ErrorField errorField = new ErrorField("confirmHashedPassword", "确认密码和密码不一致"); - List errorFieldList = List.of(errorField); + List errorFieldList = Collections.singletonList(errorField); return OperateResult.error(null, "", ErrorCode.PARAM_FORMAT.getCode(), errorFieldList); } if (user.getHashedPassword() != null && !user.getHashedPassword().equalsIgnoreCase("")) { diff --git a/manager-system/src/main/java/com/hshh/system/base/entity/Users.java b/manager-system/src/main/java/com/hshh/system/base/entity/Users.java index 6da1f72..be3ffd1 100644 --- a/manager-system/src/main/java/com/hshh/system/base/entity/Users.java +++ b/manager-system/src/main/java/com/hshh/system/base/entity/Users.java @@ -31,8 +31,8 @@ public class Users extends BaseBean { private String username; @NotBlank(message = "密码不能为空", groups = {CreateUser.class}) @Pattern( - regexp = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[\\W_]).{6,}$", - message = "密码不少于6位,且至少包含大写字母、小写字母、数字和特殊符号", + regexp = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d).{6,}$", + message = "密码不少于6位,且至少包含大写字母、小写字母、数字", groups = {CreateUser.class, UpdateUser.class} ) @@ -42,8 +42,8 @@ public class Users extends BaseBean { @Setter @NotBlank(message = "确认密码不能为空", groups = {CreateUser.class}) @Pattern( - regexp = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[\\W_]).{6,}$", - message = "确认密码密码不少于6位,且至少包含大写字母、小写字母、数字和特殊符号", + regexp = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d).{6,}$", + message = "确认密码密码不少于6位,且至少包含大写字母、小写字母、数字", groups = {CreateUser.class, UpdateUser.class} ) private String confirmHashedPassword; @@ -90,6 +90,7 @@ public class Users extends BaseBean { /** * 昵称. */ + @NotBlank(message = "昵称不能为空") @Size(max = 50, message = "昵称不能超过50字符") private String nickName; diff --git a/manager-system/src/main/java/com/hshh/system/base/service/TableRelationsService.java b/manager-system/src/main/java/com/hshh/system/base/service/TableRelationsService.java index f491193..bdb651f 100644 --- a/manager-system/src/main/java/com/hshh/system/base/service/TableRelationsService.java +++ b/manager-system/src/main/java/com/hshh/system/base/service/TableRelationsService.java @@ -10,6 +10,7 @@ import java.util.List; * @author liDongYu * @since 2025-07-29 */ +@Deprecated public interface TableRelationsService extends IService { /** @@ -19,6 +20,7 @@ public interface TableRelationsService extends IService { * @param dstTable 引用表 * @return 查询结果 */ + @Deprecated List queryRel(Integer id, String dstTable); /** @@ -28,6 +30,7 @@ public interface TableRelationsService extends IService { * @param srcTable 原表名称 * @param dstTable 目标表名称 */ + @Deprecated void removeRel(Integer srcId, String srcTable, String dstTable); /** @@ -38,6 +41,7 @@ public interface TableRelationsService extends IService { * @param dstId 目标表ID * @param dstTable 目标表名称 */ + @Deprecated void removeRel(Integer srcId, String srcTable, Integer dstId, String dstTable); /** @@ -48,6 +52,7 @@ public interface TableRelationsService extends IService { * @param dstIdList 引用表ID集合 * @param dstTable 引用表 */ + @Deprecated void addRel(Integer srcId, String srcTable, List dstIdList, String dstTable); } diff --git a/manager-system/src/main/java/com/hshh/system/common/enums/ErrorMessage.java b/manager-system/src/main/java/com/hshh/system/common/enums/ErrorMessage.java index 43bb545..2c6b0af 100644 --- a/manager-system/src/main/java/com/hshh/system/common/enums/ErrorMessage.java +++ b/manager-system/src/main/java/com/hshh/system/common/enums/ErrorMessage.java @@ -11,7 +11,7 @@ import lombok.Getter; @Getter public enum ErrorMessage { NAME_OR_CODE_EXIT("名称或者编码已经存在"), - + NAME_EXIT("名称或者编码已经存在"), ID_NOT_EXIT("记录不存在"), SUCCESS("操作成功"), diff --git a/manager-system/src/main/java/com/hshh/system/common/util/FileUtil.java b/manager-system/src/main/java/com/hshh/system/common/util/FileUtil.java new file mode 100644 index 0000000..c9907f6 --- /dev/null +++ b/manager-system/src/main/java/com/hshh/system/common/util/FileUtil.java @@ -0,0 +1,68 @@ +package com.hshh.system.common.util; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import org.springframework.web.multipart.MultipartFile; + +/** + * [类的简要说明] + *

+ * [详细描述,可选] + *

+ * + * @author LiDongYU + * @since 2025/7/22 + */ +public class FileUtil { + + // 从InputStream解析CSV + public static List> parseCsvFromInputStream(MultipartFile file) throws IOException { + List> result = new ArrayList<>(); + + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(file.getInputStream(), StandardCharsets.UTF_8))) { + String line; + while ((line = reader.readLine()) != null) { + if (!line.trim().isEmpty()) { + result.add(parseCsvLine(line)); + } + } + } + + return result; + } + + // 解析单行CSV + private static List parseCsvLine(String line) { + List fields = new ArrayList<>(); + StringBuilder currentField = new StringBuilder(); + boolean inQuotes = false; + + for (int i = 0; i < line.length(); i++) { + char currentChar = line.charAt(i); + char nextChar = (i + 1 < line.length()) ? line.charAt(i + 1) : '\0'; + + if (currentChar == '"') { + if (inQuotes && nextChar == '"') { + currentField.append('"'); + i++; + } else { + inQuotes = !inQuotes; + } + } else if (currentChar == ',' && !inQuotes) { + fields.add(currentField.toString()); + currentField.setLength(0); + } else { + currentField.append(currentChar); + } + } + + fields.add(currentField.toString()); + return fields; + } +} diff --git a/manager-system/src/main/java/com/hshh/system/common/util/StringTool.java b/manager-system/src/main/java/com/hshh/system/common/util/StringTool.java new file mode 100644 index 0000000..d4d703a --- /dev/null +++ b/manager-system/src/main/java/com/hshh/system/common/util/StringTool.java @@ -0,0 +1,90 @@ +package com.hshh.system.common.util; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * [类的简要说明] + *

+ * [详细描述,可选] + *

+ * + * @author LiDongYU + * @since 2025/7/22 + */ +public class StringTool { + + public static Set checkDuplicates(String content, String split) { + + // 按 , ; 换行 分割 + String[] childTextArray = content.split(split); + + // 用于去重和判断重复 + Set set = new HashSet<>(); + Set duplicates = new HashSet<>(); + + for (String name : childTextArray) { + name = name.trim(); + if (name.isEmpty()) { + continue; + } + if (!set.add(name)) { + duplicates.add(name); + } + } + + return duplicates; + } + + public static List> parseCSV(String csvText) { + List> rows = new ArrayList<>(); + List currentRow = new ArrayList<>(); + StringBuilder currentField = new StringBuilder(); + boolean inQuotes = false; + + for (int i = 0; i < csvText.length(); i++) { + char currentChar = csvText.charAt(i); + char nextChar = (i + 1 < csvText.length()) ? csvText.charAt(i + 1) : '\0'; + + if (currentChar == '"') { + if (inQuotes && nextChar == '"') { + // 处理双引号转义 + currentField.append('"'); + i++; // 跳过下一个引号 + } else { + // 切换引号状态 + inQuotes = !inQuotes; + } + } else if (currentChar == ',' && !inQuotes) { + // 字段分隔符 + currentRow.add(currentField.toString()); + currentField.setLength(0); + } else if ((currentChar == '\n' || currentChar == '\r') && !inQuotes) { + // 行结束 + if (currentField.length() > 0 || !currentRow.isEmpty()) { + currentRow.add(currentField.toString()); + rows.add(new ArrayList<>(currentRow)); + currentRow.clear(); + currentField.setLength(0); + } + // 跳过 \r\n 中的 \n + if (currentChar == '\r' && nextChar == '\n') { + i++; + } + } else { + // 普通字符 + currentField.append(currentChar); + } + } + + // 处理最后一行 + if (currentField.length() > 0 || !currentRow.isEmpty()) { + currentRow.add(currentField.toString()); + rows.add(currentRow); + } + + return rows; + } +} diff --git a/manager-system/src/main/java/com/hshh/system/config/SecurityConfig.java b/manager-system/src/main/java/com/hshh/system/config/SecurityConfig.java index f6f3373..20013a0 100644 --- a/manager-system/src/main/java/com/hshh/system/config/SecurityConfig.java +++ b/manager-system/src/main/java/com/hshh/system/config/SecurityConfig.java @@ -19,7 +19,7 @@ import org.springframework.security.crypto.password.PasswordEncoder; @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { - @Resource (name="userAuthService") + @Resource(name = "userAuthService") private UserDetailsService userAuthService; @Bean @@ -34,9 +34,11 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { - http + //允许iframe + http.headers().frameOptions().disable().and() .authorizeRequests() .antMatchers("/login", "/css/**", "/js/**", "/img/**", "/libs/**", "/captcha", "/toAuth", + "/thirdLogin/**", "/ws/**", "/swagger-ui.html", "/swagger-ui/**", "/webfonts/**", @@ -77,6 +79,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { } public static void main(String[] args) { - System.out.println( new BCryptPasswordEncoder().encode("123456")); ; + System.out.println(new BCryptPasswordEncoder().encode("123456")); + ; } } diff --git a/manager-system/src/main/java/com/hshh/system/config/EndpointConfig.java b/manager-system/src/main/java/com/hshh/system/config/WsEndpointConfig.java similarity index 92% rename from manager-system/src/main/java/com/hshh/system/config/EndpointConfig.java rename to manager-system/src/main/java/com/hshh/system/config/WsEndpointConfig.java index b80b640..4e65d46 100644 --- a/manager-system/src/main/java/com/hshh/system/config/EndpointConfig.java +++ b/manager-system/src/main/java/com/hshh/system/config/WsEndpointConfig.java @@ -11,7 +11,7 @@ import org.springframework.web.socket.server.standard.ServerEndpointExporter; * @since 2025/7/22 */ @Configuration -public class EndpointConfig { +public class WsEndpointConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { diff --git a/manager-system/src/main/java/com/hshh/system/exception/ApiGlobalExceptionHandler.java b/manager-system/src/main/java/com/hshh/system/exception/ApiGlobalExceptionHandler.java index ad64170..0a76403 100644 --- a/manager-system/src/main/java/com/hshh/system/exception/ApiGlobalExceptionHandler.java +++ b/manager-system/src/main/java/com/hshh/system/exception/ApiGlobalExceptionHandler.java @@ -1,5 +1,6 @@ package com.hshh.system.exception; +import com.hshh.system.Global; import com.hshh.system.base.entity.Logs; import com.hshh.system.common.Strings.StringUtil; import com.hshh.system.common.bean.OperateResult; @@ -33,7 +34,7 @@ public class ApiGlobalExceptionHandler { */ @ExceptionHandler(Exception.class) public OperateResult handleAll(Exception ex, HttpServletRequest req) { - + log.error("error happened", ex); recordLog(ex, req); String msg = ex.getMessage(); return OperateResult.error(null, msg, ErrorCode.BUSINESS_ERROR.getCode()); @@ -42,7 +43,7 @@ public class ApiGlobalExceptionHandler { private void recordLog(Exception ex, HttpServletRequest req) { try { Logs logs = new Logs(); - logs.setMsg(ex.getMessage()); + logs.setMsg(ex.getLocalizedMessage()); logs.setType("ERROR"); //来源IP logs.setIp(IpUtil.getClientIpAddress(req)); @@ -58,6 +59,7 @@ public class ApiGlobalExceptionHandler { logs.setHttpMethod(req.getMethod()); //请求的参数 logs.setParams(StringUtil.getParamsAsJson(req)); + Global.logQueue.add(logs); log.error("error::", ex); } catch (Exception e) { log.error("error::", e); diff --git a/manager-system/src/main/java/com/hshh/system/filter/MultiReadRequestFilter.java b/manager-system/src/main/java/com/hshh/system/filter/MultiReadRequestFilter.java index 05ae88e..a2970ef 100644 --- a/manager-system/src/main/java/com/hshh/system/filter/MultiReadRequestFilter.java +++ b/manager-system/src/main/java/com/hshh/system/filter/MultiReadRequestFilter.java @@ -32,13 +32,16 @@ public class MultiReadRequestFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - // 只包装HttpServletRequest if (request instanceof HttpServletRequest) { HttpServletRequest httpRequest = (HttpServletRequest) request; - // 用包装类包装原始request - MultiReadHttpServletRequest multiReadRequest = new MultiReadHttpServletRequest(httpRequest); - // 传递包装后的request - chain.doFilter(multiReadRequest, response); + String contentType = httpRequest.getContentType(); + // 跳过 multipart/form-data 请求,避免包装 + if (contentType != null && contentType.toLowerCase().startsWith("multipart/")) { + chain.doFilter(request, response); + } else { + MultiReadHttpServletRequest multiReadRequest = new MultiReadHttpServletRequest(httpRequest); + chain.doFilter(multiReadRequest, response); + } } else { chain.doFilter(request, response); } diff --git a/pom.xml b/pom.xml index 8c1932b..78ff88d 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,8 @@ 8.0.33 2.6.13 1.11.0 - 3.1.8 + 2.9.3 + 8 @@ -128,8 +129,26 @@ caffeine ${caffeine.version} + + com + dmjdbc + ${dmjdbc.version} + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 8 + 8 + + + + diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..7bee6fa --- /dev/null +++ b/readme.md @@ -0,0 +1,15 @@ +## 1.登录 +![登录](attachment/Clipboard_2025-09-15-21-58-50.png) +## 2. 主页面 +![](attachment/Clipboard_2025-09-15-21-59-14.png) +## 3. 指标建立页面 +![](attachment/Clipboard_2025-09-15-21-59-44.png) +## 权重设计页面 +![](attachment/Clipboard_2025-09-15-22-00-21.png) +## 评价集 +![](attachment/Clipboard_2025-09-15-22-04-15.png) +## 映射集 +![](attachment/Clipboard_2025-09-15-22-05-54.png) +## 开始评估 +![](attachment/Clipboard_2025-09-15-22-06-29.png) +## diff --git a/todo b/todo new file mode 100644 index 0000000..45a0df3 --- /dev/null +++ b/todo @@ -0,0 +1,3 @@ + +2. 报告导出额问题 +3. csv表头解析问题