From 0548cc15e54656285baf36b3494f9456b16f975f Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期二, 08 九月 2026 17:14:40 +0800
Subject: [PATCH] fix: 8条整改落地——数据查看滚动加载/规则阈值联动通用化/旅客运政导入兼容.xls/审核月报弹窗删企业解释列/汇总大表导出无筛选自适应/报表Tab重组/筛选栏与月份年份顺序 + 测试报告与工作日结
---
traffic-audit-server/src/main/java/com/trafficaudit/rulemanage/controller/RuleManageController.java | 91 +++++++++++++++++++++++++++++++++++++++------
1 files changed, 78 insertions(+), 13 deletions(-)
diff --git a/traffic-audit-server/src/main/java/com/trafficaudit/rulemanage/controller/RuleManageController.java b/traffic-audit-server/src/main/java/com/trafficaudit/rulemanage/controller/RuleManageController.java
index b55fea1..e4087de 100644
--- a/traffic-audit-server/src/main/java/com/trafficaudit/rulemanage/controller/RuleManageController.java
+++ b/traffic-audit-server/src/main/java/com/trafficaudit/rulemanage/controller/RuleManageController.java
@@ -55,29 +55,94 @@
if (body.getThreshold() != null) rule.setThreshold(body.getThreshold());
if (body.getAlertLevel() != null) rule.setAlertLevel(body.getAlertLevel());
if (body.getDescription() != null) rule.setDescription(body.getDescription());
- // 闃堝�煎彉鍖栨椂鍚屾瑙勫垯鍚嶇О涓庤鏄庯紙鍚嶇О/璇存槑閲岀殑 卤N% 鎸夋柊闃堝�兼敼鍐欙級锛屽苟闅忎繚瀛樻寔涔呭寲
+ // 闃堝�煎彉鍖栨椂鍚屾瑙勫垯鍚嶇О涓庤鏄庯紙鍚嶇О/璇存槑閲屼笌鏃ч槇鍊煎搴旂殑 N% 鐗囨鎸夋柊闃堝�兼敼鍐欙級锛屽苟闅忎繚瀛樻寔涔呭寲
if (body.getThreshold() != null && !body.getThreshold().equals(oldThreshold)) {
- syncThresholdText(rule);
+ syncThresholdText(rule, oldThreshold);
}
rule.setUpdatedAt(LocalDateTime.now());
ruleMapper.updateById(rule);
return Result.ok("宸蹭繚瀛�");
}
- /** 卤N% 瀛楁牱鍖归厤锛堝悕绉�/璇存槑涓殢闃堝�煎姩鎬佸彉鍖栫殑鐗囨锛� */
- private static final Pattern PCT_TOKEN = Pattern.compile("卤\\s*\\d+(?:\\.\\d+)?\\s*%");
+ /** % 鍓嶇殑鏁板�硷紙鍚嶇О/璇存槑涓殢闃堝�煎姩鎬佸彉鍖栫殑鐗囨锛�% 鍓嶅彲鑳芥槸 卤銆�>銆佽秴杩囥�侀珮鍑� 绛夋弿杩拌瘝锛屼粎鏇挎崲鏁板瓧鏈韩锛� */
+ private static final Pattern PCT_NUM = Pattern.compile("\\d+(?:\\.\\d+)?(?=%)");
- /** 鎶婃枃鏈腑鐨� 卤N% 鏇挎崲涓� 卤threshold%锛堝惈宸插甫 卤 鐨勫墠缂�锛岄伩鍏嶅弻 卤锛� */
- private String decorateThresholdText(String text, String threshold) {
- if (text == null || text.trim().isEmpty() || threshold == null || threshold.trim().isEmpty()) return text;
- String token = "卤" + threshold.trim() + "%";
- return PCT_TOKEN.matcher(text).replaceAll(Matcher.quoteReplacement(token));
+ /** 瑙f瀽闃堝�煎瓧绗︿覆涓涓�涓暟鍊硷紱鏃犳硶瑙f瀽杩斿洖 null */
+ private Double parseThresholdNum(String threshold) {
+ if (threshold == null || threshold.trim().isEmpty()) return null;
+ java.util.regex.Matcher m = Pattern.compile("\\d+(?:\\.\\d+)?").matcher(threshold.trim());
+ if (!m.find()) return null;
+ try {
+ return Double.parseDouble(m.group());
+ } catch (Exception e) {
+ return null;
+ }
}
- /** 鍚嶇О/璇存槑闅忛槇鍊煎悓姝ワ紙璇诲垪琛ㄦ椂涔熷姩鎬佹牎姝o紝DB 涓棫鏂囨湰涓嶉樆濉炴樉绀猴級 */
- private void syncThresholdText(AuditRule rule) {
+ /** 鏁板�煎睍绀猴細鏁存暟鍘绘帀灏忔暟浣嶏紝鍏朵綑淇濈暀鍘熺簿搴� */
+ private String fmtNum(double v) {
+ long l = Math.round(v);
+ if (Math.abs(v - l) < 1e-9) return Long.toString(l);
+ return new java.math.BigDecimal(String.valueOf(v)).stripTrailingZeros().toPlainString();
+ }
+
+ /** 鐢遍槇鍊兼暟鍊兼帹瀵尖�滆鏄庢枃瀛楅噷鍐欑殑鏄櫨鍒嗕箣鍑犫�濈殑鍊欓�夊彛寰勶細
+ * 鈶� 闃堝�兼湰韬氨鏄櫨鍒嗘暟锛堝 20 鈫� 卤20%锛夛紱
+ * 鈶� 闃堝�兼槸灏忔暟姣斾緥锛堝 0.02 鈫� 2%銆�0.5 鈫� 50%锛夛紱姝ゆ椂 <1 鎵嶅惎鐢紱
+ * 鈶� 闃堝�兼槸姣斿�硷紙濡� 1.3 鈫� 楂樺嚭30%锛夛紱姝ゆ椂 >1 鎵嶅惎鐢ㄣ�� */
+ private double[] thresholdPercentCandidates(double v) {
+ double[] cands;
+ if (v > 0 && v < 1) {
+ cands = new double[]{v, v * 100};
+ } else if (v > 1) {
+ cands = new double[]{v, (v - 1) * 100};
+ } else {
+ cands = new double[]{v};
+ }
+ return cands;
+ }
+
+ /** 鎸夋棫闃堝�煎尮閰嶆枃鏈腑宸叉湁鐨勭櫨鍒嗘瘮鐗囨锛屼粎鏇挎崲鈥滀笌鏃ч槇鍊煎寰椾笂鈥濈殑鏁板瓧涓烘柊闃堝�煎搴旀暟瀛楋紱瀵逛笉涓婄殑鏁板瓧锛堝璇存槑閲屼笌闃堝�兼棤鍏崇殑鏁板�硷級淇濇寔涓嶅姩 */
+ private String decorateThresholdText(String text, String oldThreshold, String newThreshold) {
+ if (text == null || text.trim().isEmpty()) return text;
+ Double oldNum = parseThresholdNum(oldThreshold);
+ Double newNum = parseThresholdNum(newThreshold);
+ if (oldNum == null || newNum == null) return text;
+ double[] oldCands = thresholdPercentCandidates(oldNum);
+ double[] newCands = thresholdPercentCandidates(newNum);
+ if (oldCands.length != newCands.length) return text;
+ java.util.regex.Matcher m = PCT_NUM.matcher(text);
+ StringBuffer sb = new StringBuffer();
+ while (m.find()) {
+ double token;
+ try {
+ token = Double.parseDouble(m.group());
+ } catch (Exception e) {
+ continue;
+ }
+ String repl = null;
+ for (int i = 0; i < oldCands.length; i++) {
+ if (Math.abs(oldCands[i] - token) < 1e-9) {
+ repl = fmtNum(newCands[i]);
+ break;
+ }
+ }
+ if (repl == null) continue;
+ m.appendReplacement(sb, Matcher.quoteReplacement(repl));
+ }
+ m.appendTail(sb);
+ return sb.toString();
+ }
+
+ /** 鍚嶇О/璇存槑闅忛槇鍊煎悓姝ワ紙update 鏃舵寜 鏃р啋鏂� 鏀瑰啓骞舵寔涔呭寲锛� */
+ private void syncThresholdText(AuditRule rule, String oldThreshold) {
if (rule == null || rule.getThreshold() == null) return;
- rule.setRuleName(decorateThresholdText(rule.getRuleName(), rule.getThreshold()));
- rule.setDescription(decorateThresholdText(rule.getDescription(), rule.getThreshold()));
+ rule.setRuleName(decorateThresholdText(rule.getRuleName(), oldThreshold, rule.getThreshold()));
+ rule.setDescription(decorateThresholdText(rule.getDescription(), oldThreshold, rule.getThreshold()));
+ }
+
+ /** 璇诲垪琛ㄦ椂鑷剤锛氫粎褰撴枃鏈墖娈典笌褰撳墠闃堝�煎搴旀椂鎵嶆敼鍐欙紙骞傜瓑锛屼笉璇激涓庨槇鍊兼棤鍏崇殑鏁板瓧锛� */
+ private void syncThresholdText(AuditRule rule) {
+ syncThresholdText(rule, rule == null ? null : rule.getThreshold());
}
}
\ No newline at end of file
--
Gitblit v1.9.1