Prechádzať zdrojové kódy

fix(sgsc-时效性审查模型-xth): 修复特殊字符未处理bug

suhua31 1 týždeň pred
rodič
commit
6d44ae8265

+ 3 - 1
config/config.ini.template

@@ -242,5 +242,7 @@ MAX_CELERY_TASKS=1
 # 时效性审查中用于匹配前需要去除的符号(第二轮处理)
 # 这些符号会在基础规范化(去除空白、书名号、括号、HTML标签)之后去除
 # 包含各种连接符:半角连字符(-)、全角连接号(-)、全角破折号(—)
-REMOVE_SYMBOLS=),-,.,/,,:,[,],【,】,〔,〕,(,),-,—
+# 包含各种连接符:半角连字符(-)、全角连接号(-)、全角破折号(—)、水平线(―)、
+# 连字符(‐)、不换行连字符(‑)、数字线(‒)、短破折号(–)、减号(−)
+REMOVE_SYMBOLS=),-,.,/,,:,[,],【,】,〔,〕,(,),-,—,―,‐,‑,‒,–,−
 

+ 3 - 1
core/construction_review/component/reviewers/standard_timeliness_reviewer.py

@@ -320,7 +320,9 @@ class StandardTimelinessReviewer:
         text = text.replace('《', '').replace('》', '').replace('(', '').replace(')', '').replace('(', '').replace(')', '')
 
         # 第二轮:从 config.ini 读取并去除指定符号
-        default_symbols = '),-,.,/,,:,[,],【,】,〔,〕,(,),-,—'
+        # 包含各种连接符:半角连字符(-)、全角连接号(-)、全角破折号(—)、水平线(―)、
+        # 连字符(‐)、不换行连字符(‑)、数字线(‒)、短破折号(–)、减号(−)
+        default_symbols = '),-,.,/,,:,[,],【,】,〔,〕,(,),-,—,―,‐,‑,‒,–,−'
 
         # 尝试从配置读取
         symbols_str = default_symbols

+ 9 - 18
core/construction_review/component/standard_matching/standard_service.py

@@ -221,7 +221,9 @@ class StandardRepository:
         # ========== 第二轮:从配置读取并去除指定符号 ==========
         # 读取配置中的符号列表,默认使用常见符号
         # 包含各种连接符:半角连字符(-)、全角连接号(-)、全角破折号(—)
-        default_symbols = '),-,.,/,,:,[,],【,】,〔,〕,(,),-,—'
+        # 包含各种连接符:半角连字符(-)、全角连接号(-)、全角破折号(—)、水平线(―)、
+        # 连字符(‐)、不换行连字符(‑)、数字线(‒)、短破折号(–)、减号(−)
+        default_symbols = '),-,.,/,,:,[,],【,】,〔,〕,(,),-,—,―,‐,‑,‒,–,−'
 
         if _CONFIG_AVAILABLE and config_handler:
             try:
@@ -362,26 +364,15 @@ class StandardMatcher:
             # 名称规范化后匹配成功,按完全匹配处理
             return self._handle_full_match(result, db_record)
 
-        # 尝试用规范化名称模糊匹配
-        name_matches = self.repo.find_by_normalized_name(result.normalized_name)
-
-        # 查找精确名称匹配(使用规范化名称)
-        exact_match = self._find_exact_name_match(name_matches, result.normalized_name)
-
-        if exact_match:
-            # 找到名称匹配的记录,检查标准号是否一致
-            if result.normalized_number == exact_match.normalized_number:
-                # 标准号实质一致,按完全匹配处理
-                return self._handle_full_match(result, exact_match)
-            else:
-                # 名称匹配但标准号不一致 = 标准号错误
-                return self._set_mismatch_result(result, exact_match)
-
-        # 名称完全不匹配,但标准号已匹配成功
-        # 说明该标准存在于库中,应返回不匹配而非不存在
+        # 【关键修复】标准号已匹配成功,即使名称不完全匹配,
+        # 也不应该再通过名称去查找其他版本的记录。
+        # 因为这会导致:2017版(现行)→ 通过名称找到 → 2012版(废止)
+        # 应直接基于已匹配的记录返回结果。
         if db_record.validity in [ValidityStatus.CURRENT.value, ValidityStatus.TRIAL.value]:
+            # 现行/试行版本,返回不匹配,建议改为当前匹配的标准号
             return self._set_mismatch_result(result, db_record)
         elif db_record.validity == ValidityStatus.ABOLISHED.value:
+            # 废止版本,查找同名现行版本作为替代
             return self._handle_abolished(result, db_record)
 
         return self._set_not_found_result(result)