12 Комити c16f5589cc ... 927e84d375

Аутор SHA1 Порука Датум
  xgo 927e84d375 fix(sgsc-目录缺失模块-xth): 修复目录缺失检查 UnboundLocalError 及匹配逻辑错误 пре 2 недеља
  LingMin 4dd0db1fe3 Merge branch 'dev_lingmin' of CRBC-MaaS-Platform-Project/LQAgentPlatform into dev пре 2 недеља
  lingmin_package@163.com aa58c429df feat(时效性):添加时效性测试 пре 2 недеља
  lingmin_package@163.com 9c71165d2d fix(dev分支合并):分支合并 пре 2 недеља
  WangXuMing 321ef2cb80 Merge branch 'dev_sgsc_wxm' of CRBC-MaaS-Platform-Project/LQAgentPlatform into dev пре 2 недеља
  WangXuMing 0bd380f464 feat(ocr): 添加YOLO目录检测、OCR提取及Embedding配置优化 пре 2 недеља
  WangXuMing 78bcae0dcb Merge branch 'dev' of http://47.109.151.80:15030/CRBC-MaaS-Platform-Project/LQAgentPlatform into dev_sgsc_wxm пре 2 недеља
  WangXuMing a33ee5e5d9 feat(toc): YOLO目录检测与OCR提取功能 пре 2 недеља
  LingMin 3ed71eb2fb Merge branch 'dev_sgsc_xth' of CRBC-MaaS-Platform-Project/LQAgentPlatform into dev пре 2 недеља
  LingMin 1ba49879f1 Merge branch 'dev_sgsc_lpl' of CRBC-MaaS-Platform-Project/LQAgentPlatform into dev пре 2 недеља
  suhua31 d8bb54cfe3 Merge branch 'dev' into dev_sgsc_lpl пре 2 недеља
  suhua31 27dde599c3 fix(sgsc-时效性审查模型-xth): 修复纯数字导致的误判bug - 新增判断返回json пре 2 недеља
36 измењених фајлова са 3838 додато и 238 уклоњено
  1. 1 1
      Dockerfile
  2. 2 2
      config/config.ini
  3. 2 2
      config/model_setting.yaml
  4. BIN
      config/yolo/best.pt
  5. 60 32
      core/construction_review/component/ai_review_engine.py
  6. 149 172
      core/construction_review/component/doc_worker/config/StandardCategoryTable.csv
  7. 10 1
      core/construction_review/component/doc_worker/models/document_structure.py
  8. 52 3
      core/construction_review/component/minimal_pipeline/pdf_extractor.py
  9. 13 5
      core/construction_review/component/minimal_pipeline/simple_processor.py
  10. 584 0
      core/construction_review/component/minimal_pipeline/toc_detector.py
  11. 26 4
      core/construction_review/component/outline_catalogue_matcher.py
  12. 2 2
      core/construction_review/component/reviewers/reference_basis_reviewer.py
  13. 44 2
      core/construction_review/component/reviewers/standard_timeliness_reviewer.py
  14. 4 0
      core/construction_review/component/reviewers/timeliness_basis_reviewer.py
  15. 3 0
      core/construction_review/component/reviewers/timeliness_content_reviewer.py
  16. 2 1
      core/construction_review/component/reviewers/utils/llm_content_classifier_v2/category_loaders.py
  17. 11 2
      core/construction_review/component/reviewers/utils/llm_content_classifier_v2/content_classifier.py
  18. 1 0
      core/construction_review/component/reviewers/utils/llm_content_classifier_v2/models.py
  19. 6 1
      core/construction_review/component/reviewers/utils/llm_content_classifier_v2/prompt.py
  20. 1 1
      core/construction_review/component/standard_matching/standard_dao.py
  21. 7 2
      core/construction_review/component/standard_matching/standard_service.py
  22. 2 2
      data_pipeline/milvus_inbound_script/milvus_vector.py
  23. 29 2
      foundation/ai/models/model_handler.py
  24. BIN
      requirements.txt
  25. 542 0
      utils_test/API_key/api_key_generator.py
  26. 166 0
      utils_test/standard_new_Test/README.md
  27. 255 0
      utils_test/standard_new_Test/TEST_CASES.md
  28. 49 0
      utils_test/standard_new_Test/standard_dao.py
  29. 674 0
      utils_test/standard_new_Test/standard_service.py
  30. 163 0
      utils_test/standard_new_Test/standard_timeliness_new.md
  31. 221 0
      utils_test/standard_new_Test/test_app.py
  32. 207 0
      utils_test/standard_new_Test/test_standard_matching.py
  33. 417 0
      utils_test/standard_new_Test/test_standard_matching_rules.py
  34. 125 0
      utils_test/standard_new_Test/test_user_standards.py
  35. 0 0
      utils_test/standard_new_Test/施工方案审查流程图.svg
  36. 8 1
      views/construction_review/file_upload.py

+ 1 - 1
Dockerfile

@@ -49,7 +49,7 @@ ENV PATH="/venv/bin:$PATH"
 
 # 先复制 requirements 文件安装依赖(利用缓存)
 COPY requirements.txt /tmp/
-RUN /venv/bin/pip config set global.index-url https://mirrors.aliyun.com/pypi/simple \
+RUN /venv/bin/pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple \
     && /venv/bin/pip config set install.trusted-host mirrors.aliyun.com \
     && /venv/bin/pip --default-timeout=1800 install -r /tmp/requirements.txt \
     && rm -rf /root/.cache

+ 2 - 2
config/config.ini

@@ -3,8 +3,8 @@
 [model]
 # 注意:模型配置已迁移到 model_setting.yaml
 # 请通过 config/model_config_loader.py 获取模型配置
-# Embedding模型类型选择: lq_qwen3_8b_emd, siliconflow_embed
-EMBEDDING_MODEL_TYPE=lq_qwen3_8b_emd
+# Embedding模型类型选择: lq_qwen3_8b_emd, siliconflow_embed, shutian_qwen3_embed
+EMBEDDING_MODEL_TYPE=shutian_qwen3_embed
 
 # Rerank模型类型选择: bge_rerank_model, lq_rerank_model, silicoflow_rerank_model
 RERANK_MODEL_TYPE=lq_rerank_model

+ 2 - 2
config/model_setting.yaml

@@ -120,8 +120,8 @@ model_settings:
 
   # Embedding 模型(用于相似度计算)
   embedding:
-    model: lq_qwen3_8b_emd
-    description: "文本Embedding向量生成"
+    model: shutian_qwen3_embed # 或 lq_qwen3_8b_emd 
+    description: "文本Embedding向量生成(蜀天)"
 
 # 默认配置(当功能未指定时使用)
 default:

BIN
config/yolo/best.pt


+ 60 - 32
core/construction_review/component/ai_review_engine.py

@@ -1030,58 +1030,86 @@ class AIReviewEngine(BaseReviewer):
                 'construction_plan_standards.csv'
             )
 
-            # 从 outline_data 或 state 中获取 chapters 列表
+            # 获取 catalog(YOLO+OCR提取的原始目录)和 outline(分类后的结构)
+            catalog_chapters = []
             outline_chapters = []
+
             if outline_data and isinstance(outline_data, dict):
-                outline_raw = outline_data.get('outline') or outline_data
+                # 从 outline_data 获取 catalog(优先)
+                catalog_raw = outline_data.get('catalog')
+                if catalog_raw and isinstance(catalog_raw, dict):
+                    catalog_chapters = catalog_raw.get('chapters', [])
+                # 获取 outline(用于分类代码映射)
+                outline_raw = outline_data.get('outline')
                 if isinstance(outline_raw, dict):
                     outline_chapters = outline_raw.get('chapters', [])
                 elif isinstance(outline_raw, list):
                     outline_chapters = outline_raw
 
-            if not outline_chapters and state and isinstance(state, dict):
+            # 从 state 回退获取
+            if state and isinstance(state, dict):
                 structured = state.get('structured_content', {})
-                outline_raw = structured.get('outline', {})
-                if isinstance(outline_raw, dict):
-                    outline_chapters = outline_raw.get('chapters', [])
-                elif isinstance(outline_raw, list):
-                    outline_chapters = outline_raw
 
-            # 🆕 提取一级和二级标题(用于独立模糊匹配)
-            # 结构:{first_code: {'title': '章节标题', 'subsections': ['二级标题1', '二级标题2']}}
-            outline_by_first: Dict[str, Dict] = {}
-            
+                # 获取 catalog
+                if not catalog_chapters:
+                    catalog_raw = structured.get('catalog')
+                    if catalog_raw and isinstance(catalog_raw, dict):
+                        catalog_chapters = catalog_raw.get('chapters', [])
+
+                # 获取 outline
+                if not outline_chapters:
+                    outline_raw = structured.get('outline', {})
+                    if isinstance(outline_raw, dict):
+                        outline_chapters = outline_raw.get('chapters', [])
+                    elif isinstance(outline_raw, list):
+                        outline_chapters = outline_raw
+
+            logger.info(f"[{name}] catalog: {len(catalog_chapters)} 章, outline: {len(outline_chapters)} 章")
+
+            # 使用模糊匹配器
+            matcher = OutlineCatalogueMatcher(csv_path, raw_content_csv)
+
+            # 🆕 构建 match_catalogue_by_title 需要的 outline_by_first 结构
+            # outline: [{"chapter_classification": "basis", "title": "第一章 编制依据", "subsections": [...]}]
+            outline_by_first = {}
+
             for chapter in outline_chapters:
                 if not isinstance(chapter, dict):
                     continue
-                
                 first_code = chapter.get('chapter_classification', '')
                 first_title = chapter.get('title', '')
                 
+                # 如果code为空但有title,用title的hash作为临时key
+                if not first_code and first_title:
+                    import hashlib
+                    first_code = f"__title_{hashlib.md5(first_title.encode()).hexdigest()[:8]}"
+                    logger.debug(f"[{name}] 一级code为空,使用临时key: {first_code} -> {first_title}")
+                
                 if not first_code:
                     continue
-                
-                if first_code not in outline_by_first:
-                    outline_by_first[first_code] = {
-                        'title': first_title,
-                        'subsections': []
-                    }
-                
-                # 提取二级标题列表
+
+                # 收集二级标题
+                subsections = []
                 for sub in chapter.get('subsections', []):
-                    if not isinstance(sub, dict):
-                        continue
-                    sub_title = sub.get('title', '')
-                    if sub_title:
-                        outline_by_first[first_code]['subsections'].append(sub_title)
-            
-            logger.info(f"[{name}] 获取到 {len(outline_by_first)} 个一级章节")
-            
-            # 使用模糊匹配(基于标题)
-            matcher = OutlineCatalogueMatcher(csv_path, raw_content_csv)
+                    if isinstance(sub, dict):
+                        sub_title = sub.get('title', '')
+                        if sub_title:
+                            subsections.append(sub_title)
+                    elif isinstance(sub, str):
+                        if sub:
+                            subsections.append(sub)
+
+                outline_by_first[first_code] = {
+                    'title': first_title,
+                    'subsections': subsections
+                }
+
+            logger.info(f"[{name}] 提取到 {len(outline_by_first)} 个一级目录")
+
+            # 执行标准目录匹配检查
             match_result = matcher.match_catalogue_by_title(
                 outline_by_first=outline_by_first,
-                threshold=0.6  # 阈值0.6
+                threshold=0.6
             )
             
             catalogue_result = {

+ 149 - 172
core/construction_review/component/doc_worker/config/StandardCategoryTable.csv

@@ -1,172 +1,149 @@
-first_seq,first_code,first_name,second_seq,second_code,second_name,second_focus,third_seq,third_code,third_name,third_focus,keywords
-1,basis,编制依据,1,LawsAndRegulations,法律法规,NULL,1,NationalLawsAndRegulations,国家政府发布的法律法规与规章制度,国家级、法律、法规、规章、强制力、普遍适用、基础框架、顶层设计、行业准则、合规性、统一标准、权威性、强制性条文、基本要求。,国家法律;法规;规章;强制性条文;国务院令;住房城乡建设部;中华人民共和国
-1,basis,编制依据,1,LawsAndRegulations,法律法规,NULL,2,ProvincialLawsAndRegulationsOfProjectLocation,工程所在地省级政府发布的法律法规与规章制度,地方性、区域性、细化补充、因地制宜、执行细则、地方特色、适应性要求、属地管理、动态调整、配套政策、本地化实施。,省级;地方法规;省政府;地方规章;属地管理;四川省;省人民政府
-1,basis,编制依据,2,StandardsAndSpecifications,标准规范,NULL,1,IndustryStandards,行业标准,需符合国家/行业强制或推荐性标准(如GB/T、JTG等)、时效性强(需跟踪最新版)、覆盖全生命周期(设计→施工→运维)、是定义工程项目的最低技术要求、质量验收准则、安全红线。,GB/T;JTG;CJJ;行业标准;国家标准;推荐性标准;GB 5;TB;HJ;DL
-1,basis,编制依据,2,StandardsAndSpecifications,标准规范,NULL,2,TechnicalRegulations,技术规程,操作流程标准化、工艺参数、量化风险管控、节点设备使用、规范施工验收细则、人员资质要求、应急预案模板、数字化交付标准、BIM协同规则、绿色施工指标、强制性条款需100%执行(如安全操作规范)、包含可视化元素(图表、流程图、三维模型指引)、与BIM技术深度融合(4D进度模拟、5D成本控制)。,Q/CR;技术规程;操作规程;工艺规程;施工规范;企业标准
-1,basis,编制依据,3,DocumentSystems,文件制度,NULL,1,SichuanRoadAndBridgeDocumentSystemsAndmanagementProcedures,四川路桥下发的文件制度和管理程序文件,需包含集团级BIM实施标准、EPC总承包管理模式细则、强制要求下属单位接入集团统一的数字化管理平台(如PM系统)、设置科技创新成果转化的量化考核指标。,四川公路桥梁建设集团;四川公路桥梁;SCQJ;SCQJT;四川路桥总公司
-1,basis,编制依据,3,DocumentSystems,文件制度,NULL,2,RoadAndBridgeGroupDocumentSystemsAndmanagementProcedures,路桥集团下发的文件制度和管理程序文件,区域化管理细则、属地化政策适配、项目分级管控、应急响应机制、分包商信用评价、农民工工资支付、保障绿色施工区域、标准智慧工地建设指南、隐蔽工程验收流程、工程变更索赔指引。,路桥集团;路桥股份;四川路桥集团有限公司;四川路桥集团;四川路桥集团超危大;川路桥〔;路桥〔;集团下发;集团公司文件
-1,basis,编制依据,3,DocumentSystems,文件制度,NULL,3,BridgeCompanyDocumentSystemsAndmanagementProcedures,桥梁公司下发的文件制度和管理程序文件,专业技术标准、工艺工法创新、特种设备管理、试验检测规程、安全生产责任制、班前安全教育工程、质量三检制技术交底、标准化竣工资料归档、规范创优工程培育计划。,桥梁公司;桥梁分公司;桥梁工程公司;四川路桥桥梁公司;公司下发;公司管理制度
-1,basis,编制依据,3,DocumentSystems,文件制度,NULL,4,ConstructionUnitDocumentSystemsAndmanagementProcedures,建设单位下发的文件制度和管理程序文件,项目合同履约、工程款支付管理、设计变更审批、竣工验收标准、运营移交协议、保修期责任划分、参建单位考核评价、档案管理实施细则、信息沟通机制、争议解决程序。,建设单位;业主;甲方文件;建设方;建设单位下发;业主要求
-1,basis,编制依据,4,CompilationPrinciples,编制原则,NULL,1,NationalPoliciesStandardsAndDesignDocument,国家方针、政策、标准和设计文件,需动态更新(如新版《公路工程技术标准》实施后同步调整)、涉及多部门联合审查(发改委、住建部、生态环境部)。,国家方针;政策;设计文件;国家政策;设计规范;设计图纸;施工图
-1,basis,编制依据,4,CompilationPrinciples,编制原则,NULL,2,BasicConstructionProcedures,基本建设程序,法定程序刚性、四阶段闭环管理、审批链条完整性、阶段成果验收、逆程序风险管控、数字化流程跟踪。,基本建设程序;建设程序;立项;可研;审批手续;报批;批准
-1,basis,编制依据,4,CompilationPrinciples,编制原则,NULL,3,ProjectFunctionImplementation,工程项目功能实现,需求匹配度、全功能交付、使用效能保障、用户需求反演、系统集成测试、缺陷责任期追溯。,功能实现;使用功能;工程功能;满足功能;功能要求;使用要求
-1,basis,编制依据,4,CompilationPrinciples,编制原则,NULL,4,ContractPerformance,合同履约,契约精神、权利义务对等、支付节点刚性、变更索赔闭环、信用评价联动、争议解决机制,合同;履约;合同条款;合同要求;履行合同;合同约定;合同文件
-1,basis,编制依据,4,CompilationPrinciples,编制原则,NULL,5,ConstructionForceConcentration,施工力量集中,资源集约化、专业化、班组机械配置标准化、劳动力调度、算法工序穿插优化、进度风险预警,施工力量;资源集中;人员集中;机械集中;劳动力集中;人员集结
-1,basis,编制依据,4,CompilationPrinciples,编制原则,NULL,6,ProcessControl,工序控制,工序逻辑链、工艺标准化、交接检验制度化、关键线路动态监测、平行检验机制、隐蔽工程追溯,工序控制;工艺控制;工序衔接;施工工序;工序质量;过程管控
-1,basis,编制依据,5,CompilationScope,编制范围,NULL,1,ProjectCoverage,填写完整涵盖本方案包含的所有工程,项目范围完整性、子项划分颗粒度、工程量清单闭合性、专业界面划分、变更管理阈值、风险识别矩阵价、值工程分析、可施工性评审、全生命周期覆盖、涉密工程隔离。,编制范围;工程范围;施工范围;工程内容;本方案涵盖;方案范围
-1,basis,编制依据,5,CompilationScope,编制范围,NULL,2,ConstructionTechnology,部分工程可简要说明采取的施工工艺,工艺标准化体系、工法创新等级、质量控制关键点、机械化作业率、绿色施工技术、BIM协同设计、装配式构件应用、智能监测覆盖率、特殊环境适应性、非遗工艺传承。,施工工艺;施工方法;简要说明;施工技术;采用工艺
-2,overview,工程概况,1,DesignSummary,设计概况,关注名称类、具体数值类、量化单位类、技术标准需引用国家或行业规范、关注标准号数字类、各类年限、等级数值、量化单位。,1,ProjectIntroduction,工程简介,工程名称、工程类型(如住宅、桥梁、隧道)、建设规模(如建筑面积、长度、高度)、工程地址、投资额、工程性质(新建/改建/扩建)、设计单位、设计依据(如合同编号)、工程范围(如施工边界坐标)。,工程名称;工程概况;工程简介;工程性质;建设规模;工程类型;项目名称
-2,overview,工程概况,1,DesignSummary,设计概况,关注名称类、具体数值类、量化单位类、技术标准需引用国家或行业规范、关注标准号数字类、各类年限、等级数值、量化单位。,2,MainTechnicalStandards,主要技术标准,技术规范编号(如GB50021-2001《岩土工程勘察规范》)、设计使用年限、荷载标准(如活荷载、恒荷载)、抗震设防烈度、防火等级、环保标准(如绿色建筑认证)、材料标准(如混凝土强度等级C30)、施工工艺标准。,技术标准;设计使用年限;荷载等级;抗震设防;防火等级;混凝土强度;技术规范编号
-2,overview,工程概况,2,GeologyWeather,工程地质与水文气象,关注地名类、具体水位数值类、量化单位类、关注记录降雨量、水位、气温等数值量化单位类。,1,HydrologicalConditions,水文状况,地下水位(历史最高水位、当前水位)、含水层类型(孔隙水、裂隙水、承压水)、隔水层厚度、渗透系数(K值)、给水度、水质腐蚀性(如pH值、氯离子含量)、补径排条件(补给源、径流方向)、水文地质参数(如越流系数)、地下水动态监测数据。,水文;地下水;水位;地下水位;含水层;渗透系数;水文地质;补径排
-2,overview,工程概况,2,GeologyWeather,工程地质与水文气象,关注地名类、具体水位数值类、量化单位类、关注记录降雨量、水位、气温等数值量化单位类。,2,ClimaticConditions,气候条件,气候类型(如亚热带季风气候)、年平均气温、极端气温、年降水量、降雨强度(如小时最大降雨量)、蒸发量、湿度、主导风向、风速、冰冻期、台风频率、气象数据来源(如当地气象站)。,气候;气温;降水量;降雨;风速;气象;年降水;极端气温;蒸发量;冰冻期
-2,overview,工程概况,3,Surroundings,周边环境,周边环境需分析地形地貌名词、建筑分布名词及交通状况道路名词、相关量化单位、相关数字数值、各类专业性名词、建筑物名词、米或毫米等单位类。,1,PositionalRelationship,位置关系,相邻建(构)筑物(如住宅楼、桥梁)、距离(米)、方位角、山体坡度(°)、边坡稳定性(如安全系数)、河谷宽度、深基坑深度(米)、道路等级(如城市主干道)、高压电电压(kV)、地下管线类型(给水、燃气、电缆)、埋深(米)、保护距离。,位置关系;周边环境;相邻建筑;距离;管线;高压线;河道;构筑物;方位
-2,overview,工程概况,3,Surroundings,周边环境,周边环境需分析地形地貌名词、建筑分布名词及交通状况道路名词、相关量化单位、相关数字数值、各类专业性名词、建筑物名词、米或毫米等单位类。,2,StructuralDimensions,结构尺寸,建筑物高度/层数、山体海拔、边坡坡比(如1:1.5)、河谷断面尺寸、深基坑支护结构(如桩径、墙厚)、道路宽度(米)、高压电塔高度、地下管线段径(如DN100)。,建筑高度;层数;坡比;宽度;断面尺寸;坡度;桩径;墙厚;海拔
-2,overview,工程概况,4,LayoutPlan,施工平面及立面布置,场地名词、数值类、量化单位类、名称类、数值类、量化单位类。,1,TemporaryFacilityLocation,临时设施位置,拌和站坐标(如X、Y)、钢筋加工场距工程距离(米)、材料堆码区域面积(㎡)、临时占地红线、与工程最近点距离、场地利用率(%)。,拌和站;钢筋加工;材料堆放;临时设施;临时占地;材料堆场
-2,overview,工程概况,4,LayoutPlan,施工平面及立面布置,场地名词、数值类、量化单位类、名称类、数值类、量化单位类。,2,ConstructionWorkPlatform,施工作业平台与便道参数,作业平台尺寸(长×宽、米)、地面形式(混凝土硬化、砂石铺垫)、施工便道长度(米)、宽度(米)、路面形式(沥青、碎石)、最小弯曲半径(米)、坡度(%)、承载力(kPa)。,施工平台;作业平台;施工便道;便道长度;平台尺寸;通道宽度
-2,overview,工程概况,4,LayoutPlan,施工平面及立面布置,场地名词、数值类、量化单位类、名称类、数值类、量化单位类。,3,TemporaryWaterAndElectricityArrangement,临时水电布置,临时用水源(市政管网、地下水井)、管径(如DN100)、管线布置图(走向、节点距离)、供水压力(MPa)、变压器容量(kVA)、配电箱位置、线路走向(架空/埋地)、敷设方式(直埋、穿管)、电缆规格(如YJV22)。,临时用水;临时用电;供水管径;配电箱;水电布置;临时电缆
-2,overview,工程概况,5,RequirementsTech,施工要求和技术保证条件,名称类、日期类。名称类、量化单位类、数值类。,1,DurationTarget,工期目标,开工日期(年月日)、竣工日期、总工期(天)、关键节点工期(如基础完工期)、进度计划(甘特图编号)、工期保证措施(如资源调配)。,工期;开工日期;竣工日期;总工期;工期目标;关键节点;工期保证
-2,overview,工程概况,5,RequirementsTech,施工要求和技术保证条件,名称类、日期类。名称类、量化单位类、数值类。,2,QualityTarget,质量目标,质量目标(如合格率100%、鲁班奖)、合同条款编号、业主具体要求(如绿色施工认证)。,质量目标;合格率;质量标准;鲁班奖;优质工程;质量等级
-2,overview,工程概况,5,RequirementsTech,施工要求和技术保证条件,名称类、日期类。名称类、量化单位类、数值类。,3,SecurityGoals,安全目标,安全目标(如零死亡事故、隐患整改率)、合同条款编号、业主具体要求(如绿色施工认证)。,安全目标;零伤亡;安全事故;安全指标;安全生产目标
-2,overview,工程概况,5,RequirementsTech,施工要求和技术保证条件,名称类、日期类。名称类、量化单位类、数值类。,4,EnvironmentalGoals,环境目标,环境目标(如扬尘控制、噪声限值)、合同条款编号、业主具体要求(如绿色施工认证)。,环境目标;扬尘控制;噪声限值;绿色施工指标;文明施工目标
-2,overview,工程概况,6,RiskLevel,风险辨别与分级,危害隐患性词汇类、法规名称类、标准编号类。风险等级相关专业性词汇、属于、标准编号或其它编号、部门名称类、数值类、量化单位类。名称类、数值类。,1,DangerSource,危险源,地质灾害(地面沉降、滑坡)、水文风险(管涌、流砂)、施工风险(坍塌、触电)、环境风险(污染、火灾)、机械伤害(塔吊倾覆)、法律法规依据(如《安全生产法》)。,危险源;风险源;危害因素;安全隐患;事故隐患;危险因素;风险点
-2,overview,工程概况,6,RiskLevel,风险辨别与分级,危害隐患性词汇类、法规名称类、标准编号类。风险等级相关专业性词汇、属于、标准编号或其它编号、部门名称类、数值类、量化单位类。名称类、数值类。,2,ClassificationAndResponseMeasures,分级与应对措施,风险等级(重大、较大、一般)、分级标准(如LEC法)、应对措施(监测、支护、疏散)、应急预案编号、责任部门、监控频率。,风险等级;重大风险;较大风险;一般风险;应对措施;LEC;风险分级;风险评估
-2,overview,工程概况,7,Stakeholders,参建各方责任主体单位,名称类、数值类。,1,UnitType,单位类型,建设单位(业主)、设计单位、监理单位、施工单位(总包)、监控单位(监测机构)、专业分包单位(如桩基分包)、统一社会信用代码、项目负责人。,建设单位;设计单位;监理单位;施工单位;参建单位;总承包;社会信用代码
-3,plan,施工计划,1,Schedule,施工进度计划,工序作业时间分析、关键工程节点安排、施工进度计划横道图、进度控制点、里程碑事件、工序搭接关系、工期延误风险、进度调整机制、施工流水节拍、网络计划技术(如双代号网络图),1,ProcessOperationTimeAnalysis,工序作业时间分析,需明确各工序的持续时间、逻辑关系及资源需求、是进度计划的基础;,工序持续时间;工序时间分析;作业时间;持续时间;时间分析
-3,plan,施工计划,1,Schedule,施工进度计划,工序作业时间分析、关键工程节点安排、施工进度计划横道图、进度控制点、里程碑事件、工序搭接关系、工期延误风险、进度调整机制、施工流水节拍、网络计划技术(如双代号网络图),2,KeyProjectNodeArrangement,关键工程(工序)节点安排,主要工程(工序)节点的起止时间和持续时间、聚焦影响总工期的关键工序(如基础浇筑、主体封顶)、是进度控制的核心;,关键节点;里程碑;关键工序;主要节点;节点工期;关键线路
-3,plan,施工计划,1,Schedule,施工进度计划,工序作业时间分析、关键工程节点安排、施工进度计划横道图、进度控制点、里程碑事件、工序搭接关系、工期延误风险、进度调整机制、施工流水节拍、网络计划技术(如双代号网络图),3,ConstructionScheduleGanttChart,施工进度计划横道图等,直观展示进度安排的标准工具、需包含主要工序名称、起始时间、截止时间、持续时间、时间横道、责任人等信息;,横道图;进度横道;施工进度计划;甘特图;进度安排;时间计划
-3,plan,施工计划,2,Materials,施工材料计划,名称类、规格类、数值类、数值单位类,1,ListOfConstructionMeasuresAndMaterials,施工措施材料清单,排除主题工程材料、施工措施材料应包含如临时支撑结构材料、辅助施工材料、非主体工程的挡防措施、作业平台处理、模板配置、人员上下通道、安全防护措施和安全防护用品等、详细列出材料名称、规格、数量、重量及来源(如厂家、经销商)、是材料计划的核心输出,措施材料;临时支撑材料;辅助材料;安全防护材料;模板;脚手架材料
-3,plan,施工计划,3,Equipment,施工设备计划,设备名称类、规格类、数值类、数值单位类、时间日期类,1,MainConstructionMachineryAndEquipment,主要施工机械设备,列出关键设备(如起重吊装设备、混凝土浇筑设备、张拉压浆设备、人员升降设备、钻孔设备、隧道专用设备、监测监控设备、质量检查验收设备等)、明确其设备名称、规格(如额定功率)、数量及来源(自有或租赁);,施工机械;机械设备;起重机;泵车;钻机;吊装设备;设备清单;主要机械
-3,plan,施工计划,4,Workforce,劳动力计划,工种名称类、时间日期类、数值类、数值单位类,1,WorkforceAllocationPlan,劳动力配置计划,明确工种投入(如木工、钢筋工等)情况、按施工阶段(如基础、主体、装饰)列出各工种(如模板工、混凝土工)的投入数量、确保劳动力与进度匹配;,劳动力;工种投入;工人配置;班组;劳动力计划;人员配置计划
-3,plan,施工计划,4,Workforce,劳动力计划,工种名称类、时间日期类、数值类、数值单位类,2,StageLaborDemand,阶段劳动力需求,明确周/旬/月的劳动力峰值及低谷、优化人员调度;,劳动力峰值;阶段用工;月劳动力;劳动力需求;用工高峰
-3,plan,施工计划,5,SafetyCost,安全生产费用使用计划,名称类、金额类、货币数值类、货币单位类、不能将项目总的安全生产费用列入,1,CategoryOfSafetyProductionExpenses,安全生产费用类别,符合《企业安全生产费用提取和使用管理办法》(财资〔2022〕136号)及地方规定(如广东省水利厅2025年办法)、如安全防护设施、应急救援等;,安全费用类别;安全生产费用;安全投入;安全经费;财资〔2022〕136号
-3,plan,施工计划,5,SafetyCost,安全生产费用使用计划,名称类、金额类、货币数值类、货币单位类、不能将项目总的安全生产费用列入,2,SecurityFeeName,安全费用名称,具体(如“施工现场临时用电系统改造”“应急救援器材采购”)、避免模糊表述;,安全费用名称;安全防护费;应急救援费;临时用电改造;安全器材采购
-3,plan,施工计划,5,SafetyCost,安全生产费用使用计划,名称类、金额类、货币数值类、货币单位类、不能将项目总的安全生产费用列入,3,SingleInvestmentAmount,单项投入金额,明确每项费用的具体数值(如“临时防护栏杆采购:5万元”)、确保费用可量化;,单项金额;费用金额;万元;单项投入;单项安全费
-3,plan,施工计划,5,SafetyCost,安全生产费用使用计划,名称类、金额类、货币数值类、货币单位类、不能将项目总的安全生产费用列入,4,TotalSafetyProductionExpenses,安全生产费用总额,根据工程规模、风险等级计算、确保足额投入,安全费用总额;总金额;安全投入合计;安全费总计
-4,technology,施工工艺技术,1,MethodsOverview,主要施工方法概述,工艺名称类、施工专业词汇类、规格类、数值类、数值单位类,1,ConstructionTechnologySelection,施工工艺选择,需明确工程采用的核心工艺(如“现浇混凝土框架工艺”“装配式构件安装工艺”)、是施工方法概述的基础;,工艺选择;施工工艺;核心工艺;施工方法选择;工法
-4,technology,施工工艺技术,1,MethodsOverview,主要施工方法概述,工艺名称类、施工专业词汇类、规格类、数值类、数值单位类,2,MainConstructionMethods,主要施工方法,需概括各分部分项工程的关键做法(如“基础采用旋挖钻孔灌注桩施工”“主体采用铝模板体系施工”);,施工方法;主要施工方法;关键做法;灌注桩;现浇;装配式;施工工法
-4,technology,施工工艺技术,1,MethodsOverview,主要施工方法概述,工艺名称类、施工专业词汇类、规格类、数值类、数值单位类,3,TemplateConfigurationQuantity,模板配置数量,需根据施工进度和构件尺寸计算(如“柱模板配置20套”“梁模板配置15套”)、是模板管理的关键指标;,模板配置;模板数量;模板套数;模板配备
-4,technology,施工工艺技术,2,TechParams,技术参数,工程材料类名词、规格类、数值类、数值单位类、时间日期类、重量单位类,1,MaterialType,材料类型,需明确主要材料的类别(如“钢筋”“混凝土”“防水卷材”)、是技术参数的基础;,材料类型;钢筋;混凝土;防水材料;钢材;主要材料
-4,technology,施工工艺技术,2,TechParams,技术参数,工程材料类名词、规格类、数值类、数值单位类、时间日期类、重量单位类,2,MaterialSpecifications,材料规格,需细化材料的尺寸、型号(如“钢筋HRB400EΦ16”“混凝土C30P6”)、直接影响工程质量;,材料规格;型号;HRB400;C30;规格型号;材料尺寸
-4,technology,施工工艺技术,2,TechParams,技术参数,工程材料类名词、规格类、数值类、数值单位类、时间日期类、重量单位类,3,DeviceName,设备名称,需列出关键设备的全称(如“挖掘机”“塔式起重机”“混凝土泵车”)、是设备管理的核心;,设备名称;挖掘机;起重机;塔吊;泵车;钻机
-4,technology,施工工艺技术,2,TechParams,技术参数,工程材料类名词、规格类、数值类、数值单位类、时间日期类、重量单位类,4,DeviceModel,设备型号,需明确设备的规格型号(如“徐工XE200挖掘机”“中联重科TC6013塔式起重机”)、用于设备的采购和维护;,设备型号;型号规格;机械型号;设备规格
-4,technology,施工工艺技术,2,TechParams,技术参数,工程材料类名词、规格类、数值类、数值单位类、时间日期类、重量单位类,5,EquipmentManufacturingTime,设备出厂时间,需包含设备的出厂时间,出厂时间;出厂日期;生产日期;出厂年份
-4,technology,施工工艺技术,2,TechParams,技术参数,工程材料类名词、规格类、数值类、数值单位类、时间日期类、重量单位类,6,EquipmentPerformanceParameters,设备性能参数,需包含设备的额定功率、工作效率等(如“塔式起重机最大起重量8t”“混凝土泵车输送量60m³/h”)、是设备选型的依据;,性能参数;额定功率;最大起重量;输送量;工作效率
-4,technology,施工工艺技术,2,TechParams,技术参数,工程材料类名词、规格类、数值类、数值单位类、时间日期类、重量单位类,7,EquipmentWeight,设备自重,需记录设备的自身重量(如“塔式起重机自重50t”)、用于基础设计和运输规划。,设备自重;自重;重量;整机重量
-4,technology,施工工艺技术,3,PrepWork,施工准备,名称类、数值类、规格类、数值单位类、岗位名称类、时间日期类、工程设备类,1,MeasurementAndStakeout,测量放样,需明确测量的基准点、控制网设置(如“建立施工平面控制网”“放出建筑物轴线”)、是施工定位的关键;,测量放样;控制网;轴线;基准点;放线;测量基准;坐标
-4,technology,施工工艺技术,3,PrepWork,施工准备,名称类、数值类、规格类、数值单位类、岗位名称类、时间日期类、工程设备类,2,TemporaryWaterAndElectricityConsumption,临时水电用量,需计算施工期间的用水、用电量(如“临时用水管径DN100”“临时用电容量500kW”)、用于临时设施的设计;,临时用水量;临时用电量;用水量;用电量;水电用量
-4,technology,施工工艺技术,3,PrepWork,施工准备,名称类、数值类、规格类、数值单位类、岗位名称类、时间日期类、工程设备类,3,TheSiteIsFlat,场地平整,需明确平整的范围、标高(如“平整场地至设计标高±0.000”“压实度达到90%”)、是施工场地准备的基础;,场地平整;整平场地;标高;压实度;平整
-4,technology,施工工艺技术,3,PrepWork,施工准备,名称类、数值类、规格类、数值单位类、岗位名称类、时间日期类、工程设备类,4,Staffing,人员配置,需列出各岗位的人员数量(如“项目经理1名”“施工员2名”“钢筋工10名”)、是劳动力管理的核心;,人员配置;岗位人员;项目经理;施工员;人员配备;人员分工
-4,technology,施工工艺技术,3,PrepWork,施工准备,名称类、数值类、规格类、数值单位类、岗位名称类、时间日期类、工程设备类,5,SafetyProtectionFacilities,安全防护措施,需列出现场的安全设施(如“安全网”“防护栏杆”“消防栓”)、是安全保障的基础;,安全防护;安全网;防护栏杆;消防设施;安全设施;防护措施
-4,technology,施工工艺技术,3,PrepWork,施工准备,名称类、数值类、规格类、数值单位类、岗位名称类、时间日期类、工程设备类,6,PersonnelAccess,人员上下通道,需明确通道的形式、位置(如“楼梯间通道”“脚手架斜道”)、是人员通行的安全保障。,人员通道;上下通道;楼梯通道;斜道;人员上下;通道布置
-4,technology,施工工艺技术,4,Process,工艺流程,工序专业名称类、工程名称类、数值类、数值单位类,1,ConstructionProcess,施工工序,需列出工程的主要工序(如“地基处理→基础浇筑→主体结构→装饰装修”)、是工艺流程的核心;,施工工序;主要工序;工序流程;施工顺序;工艺步骤
-4,technology,施工工艺技术,4,Process,工艺流程,工序专业名称类、工程名称类、数值类、数值单位类,2,ProcessSequence,工艺顺序,需明确工序的先后逻辑(如“先绑扎钢筋后支模板”“先浇筑混凝土后养护”)、是流程执行的关键;,工艺顺序;施工顺序;先后顺序;工序逻辑;工序衔接关系
-4,technology,施工工艺技术,4,Process,工艺流程,工序专业名称类、工程名称类、数值类、数值单位类,3,ProcessFlowDiagram,工艺流程框图,需用图形展示工序的衔接(如“地基处理流程图”“主体结构施工流程图”)、是流程可视化的工具;,流程图;工艺流程图;施工流程框图;工序框图
-4,technology,施工工艺技术,5,Operations,施工方法及操作要求,施工流程名称类、数值类、数值单位类,1,ConstructionProcessOperations,施工工序描述操作,需详细描述各工序的操作步骤(如“钢筋绑扎操作流程”“模板安装操作步骤”)、是操作指导的核心;,操作步骤;操作流程;施工步骤;操作方法;操作要求
-4,technology,施工工艺技术,5,Operations,施工方法及操作要求,施工流程名称类、数值类、数值单位类,2,ConstructionPoints,施工要点,需明确工序的关键要求(如“钢筋绑扎需保证间距均匀”“模板安装需保证垂直度”)、是质量控制的关键;,施工要点;关键要求;质量关键;工艺要点;控制要点
-4,technology,施工工艺技术,5,Operations,施工方法及操作要求,施工流程名称类、数值类、数值单位类,3,FAQPrevention,常见问题及预防,需列出工序的常见问题及预防措施(如“预防混凝土蜂窝麻面:控制混凝土坍落度”“预防模板漏浆:密封模板缝隙”)、是风险防控的重点 ,常见问题;质量通病;预防措施;防治措施;常见缺陷;预防对策
-4,technology,施工工艺技术,5,Operations,施工方法及操作要求,施工流程名称类、数值类、数值单位类,4,ProblemSolvingMeasures,问题处理措施,需明确问题的解决方法(如“混凝土蜂窝处理:剔除松散部分、用高一等级混凝土填补”“模板漏浆处理:用海绵条密封缝隙”)、是问题解决的指南;,问题处理;处理措施;整改措施;修复方法;缺陷处理
-4,technology,施工工艺技术,6,Inspection,检查要求,材料进场检验、构配件抽查、工序检查内容、工序检查标准、隐蔽工程验收,1,MaterialInspectionUponArrival,材料进场质量检验,需明确材料的检验项目(如“钢筋的屈服强度检验”“混凝土的抗压强度检验”)、是材料质量控制的基础;,材料进场检验;进场检验;三证一检;复检;材料验收;进场质量检验
-4,technology,施工工艺技术,6,Inspection,检查要求,材料进场检验、构配件抽查、工序检查内容、工序检查标准、隐蔽工程验收,2,RandomInspectionOfIncomingComponents,构配件进场质量抽查,需明确构配件的抽查比例(如“构配件抽查比例为10%”“每批抽查5件”)、是构配件质量控制的手段;,构配件抽查;进场抽检;抽查比例;构件抽检
-4,technology,施工工艺技术,6,Inspection,检查要求,材料进场检验、构配件抽查、工序检查内容、工序检查标准、隐蔽工程验收,3,ProcessInspectionContent,工序检查内容,需列出各工序的检查项目(如“钢筋绑扎的检查内容:间距、数量、锚固长度”“模板安装的检查内容:垂直度、平整度、支撑稳定性”)、是工序检查的核心;,工序检查;检查内容;检查项目;工序检验;检查清单
-4,technology,施工工艺技术,6,Inspection,检查要求,材料进场检验、构配件抽查、工序检查内容、工序检查标准、隐蔽工程验收,4,ProcessInspectionStandards,工序检查标准,需明确检查的合格标准(如“钢筋间距允许偏差±10mm”“模板垂直度允许偏差5mm”)、是工序验收的依据;,检查标准;验收标准;允许偏差;检查合格;偏差限值
-5,safety,安全保证措施,1,SafetySystem,安全保证体系,流程体系类名词、标准文书类、标标准编号编码数字类,1,SafetyProductionAssuranceSystemFrameworkDiagram,安全生产保证体系框图,安全保证体系的视觉化呈现、需明确体系的核心要素(如组织机构、制度流程、资源保障)及逻辑关系、是公司标准体系的具象化载体;,安全保证体系;安全体系框图;安全管理体系框图;安全组织体系
-5,safety,安全保证措施,1,SafetySystem,安全保证体系,流程体系类名词、标准文书类、标标准编号编码数字类,2,CompanyStandardSystemReference,公司标准体系引用,强调安全保证体系需承接公司现有标准(如《公司安全生产管理办法》《公司安全技术规程》)、确保体系的一致性与延续性;,公司标准体系;公司安全管理办法;公司安全技术规程;标准体系引用
-5,safety,安全保证措施,2,Organization,组织保证措施,名词类、人名类、岗位名称类、制度名词类,1,SafetymanagementOrganization,安全管理组织机构,基于项目经理为组长的安全工作领导小组、关注岗位组织架构名称类、部门名称类、关系结构类名词;,安全管理组织;安全领导小组;安全管理机构;安全管理组织机构
-5,safety,安全保证措施,2,Organization,组织保证措施,名词类、人名类、岗位名称类、制度名词类,2,PersonnelSafetyResponsibilities,人员安全职责,关注岗位名称类、人名类、责任制度名词类、岗位职责名词类、安全制度名词类;,安全职责;人员安全责任;岗位安全;安全责任制
-5,safety,安全保证措施,3,TechMeasures,技术保证措施,施工专业名词类、工序名称类 、施工设备名称类、施工材料名称类、施工场地名称类、岗位名称类,1,OverallSecurityMeasures,总体安全措施,包含保证施工过程中主要工序的人员、材料、机械设备安全所采取的技术措施、以及材料运输、吊装、施工作业区域的临边、临空、洞口安全防护设施、安全母绳布置、人员上下(横向)通道布置等、是针对项目整体的安全技术规划(如“施工现场临时用电总体方案”“高空作业总体防护措施”)、需覆盖所有施工环节;,总体安全措施;临边防护;洞口防护;安全母绳;安全防护设施布置
-5,safety,安全保证措施,3,TechMeasures,技术保证措施,施工专业名词类、工序名称类 、施工设备名称类、施工材料名称类、施工场地名称类、岗位名称类,2,SafetyAssuranceMeasuresForKeyProcesses,主要工序安全措施,是针对关键工序的具体安全要求(如“深基坑开挖支护措施”“模板安装拆除安全规范”)、需明确每一步操作的安全要点;,主要工序安全;关键工序安全;工序安全措施;专项安全措施
-5,safety,安全保证措施,4,Monitoring,监测监控措施,组织机构名称类、施工区域名称类、监测专业名词类、施工场地名称类、设备名称类、数值类、数值单位类、岗位名称类,1,MonitoringOrganization,监测组织机构,监测监控的责任主体、需明确监测人员的资质(如注册安全工程师、监测技术员)及职责(如数据采集、分析、报告)、确保监测工作的专业性;,监测机构;监测人员;监测责任;监测组织机构;监测负责人
-5,safety,安全保证措施,4,Monitoring,监测监控措施,组织机构名称类、施工区域名称类、监测专业名词类、施工场地名称类、设备名称类、数值类、数值单位类、岗位名称类,2,MonitoringRange,监测范围,需覆盖施工区域内的所有风险点(如深基坑周边、高支模体系、临时用电线路)、避免遗漏;,监测范围;监测区域;监测覆盖范围;监测对象
-5,safety,安全保证措施,4,Monitoring,监测监控措施,组织机构名称类、施工区域名称类、监测专业名词类、施工场地名称类、设备名称类、数值类、数值单位类、岗位名称类,3,MonitoringItems,监测项目,需明确监测的具体内容(如深基坑的水平位移、高支模的立杆轴力、临时用电的电压电流)、是监测的核心;,监测项目;监测内容;水平位移;沉降监测;监测指标
-5,safety,安全保证措施,4,Monitoring,监测监控措施,组织机构名称类、施工区域名称类、监测专业名词类、施工场地名称类、设备名称类、数值类、数值单位类、岗位名称类,4,MonitoringPointSettings,监测点设置,需根据风险点的分布确定(如深基坑每10米设置一个位移监测点)、需符合《建筑基坑支护技术规程》(JGJ 120-2012)等行业标准;,监测点;测点布置;监测布点;测点位置
-5,safety,安全保证措施,4,Monitoring,监测监控措施,组织机构名称类、施工区域名称类、监测专业名词类、施工场地名称类、设备名称类、数值类、数值单位类、岗位名称类,5,MonitoringInstrumentsAndEquipment,监测仪器设备,需明确仪器的名称(如全站仪、测斜仪、应力传感器)、型号(如徕卡TS60全站仪)及精度(如0.5秒级)、确保数据的准确性;,监测仪器;全站仪;测斜仪;应力传感器;监测设备;仪器型号
-5,safety,安全保证措施,4,Monitoring,监测监控措施,组织机构名称类、施工区域名称类、监测专业名词类、施工场地名称类、设备名称类、数值类、数值单位类、岗位名称类,6,MonitoringMethods,监测方法,需明确数据采集的方式(如人工读数、自动采集)、及数据处理方法(如统计分析、趋势预测)、是监测的关键环节;,监测方法;数据采集;人工读数;自动采集;数据处理
-5,safety,安全保证措施,4,Monitoring,监测监控措施,组织机构名称类、施工区域名称类、监测专业名词类、施工场地名称类、设备名称类、数值类、数值单位类、岗位名称类,7,MonitoringFrequency,监测频率,需明确监测频率、(如深基坑每天一次、高支模每周两次)。,监测频率;监测周期;每天一次;每周两次;监测时间间隔
-5,safety,安全保证措施,4,Monitoring,监测监控措施,组织机构名称类、施工区域名称类、监测专业名词类、施工场地名称类、设备名称类、数值类、数值单位类、岗位名称类,8,WarningValuesAndControlValues,预警值及控制值,需根据设计文件及行业标准确定(如深基坑水平位移预警值为30mm、控制值为50mm)、是判断风险的重要依据;,预警值;控制值;报警值;监测阈值;预警指标;预警控制
-5,safety,安全保证措施,4,Monitoring,监测监控措施,组织机构名称类、施工区域名称类、监测专业名词类、施工场地名称类、设备名称类、数值类、数值单位类、岗位名称类,9,InformationFeedbackMechanism,信息反馈机制,监测数据的传递流程(如监测人员→项目安全部→项目经理→公司总部)、需明确反馈的时间要求(如实时反馈、每日汇总)、确保风险及时处理。,信息反馈;监测报告;数据反馈;反馈流程;监测信息传递
-5,safety,安全保证措施,5,Emergency,应急处置措施,事故名称类、救援器材类、机构名称类、数字类、数值单位类。,1,EmergencyProcedures,应急处置程序,应采用公司标准应急处理程序图(附件16)、应急响应的步骤流程(如“事故报告→现场警戒→人员疏散→救援实施→善后处理”)、需明确每一步的责任部门及时间要求、确保响应及时;,应急程序;应急流程;应急响应;应急处置程序;处置步骤
-5,safety,安全保证措施,5,Emergency,应急处置措施,事故名称类、救援器材类、机构名称类、数字类、数值单位类。,2,EmergencyMeasures,应急处置措施,应根据方案实施过程潜在的危险源、判断出可能造成的伤害类型、制定出有针对性的救援措施、保证在事故发生后伤者能得到有效和及时的救治、如触电、有毒有害气体中毒、高处坠落、物体打击、施工现场及驻地火灾等事故、针对不同类型事故的具体处理方法(如“火灾事故使用干粉灭火器扑救”“坍塌事故使用千斤顶支撑”)、需明确操作要点(如灭火器的使用方法、千斤顶的支撑位置)、确保救援有效;,应急措施;救援措施;应急处置;紧急处置;事故救援;触电;中毒;坍塌
-5,safety,安全保证措施,5,Emergency,应急处置措施,事故名称类、救援器材类、机构名称类、数字类、数值单位类。,3,EmergencySuppliesAndEquipmentSupport,应急物资及设备保障,应根据事故的不同、以表格的形式说明救援的物品名称、规格型号、单位、数量、监管人、联系电话等内容、应急处置的物质基础、需明确物资的名称(如灭火器、急救箱、千斤顶)、数量(如每100平方米配备2个灭火器)、存放位置(如施工现场入口处)及维护要求(如每月检查一次灭火器压力)、确保物资随时可用;,应急物资;应急设备;救援器材;灭火器;急救箱;应急保障
-5,safety,安全保证措施,5,Emergency,应急处置措施,事故名称类、救援器材类、机构名称类、数字类、数值单位类。,4,TrafficmanagementAndMedicalRescue,交通疏导与医疗救援,应以表格的形式明确施工工点附近的医疗救援机构名称、联系电话、距离等、并附应急救援线路图;,医疗救援;交通疏导;救援线路;医院联系;急救电话;应急救援路线
-5,safety,安全保证措施,5,Emergency,应急处置措施,事故名称类、救援器材类、机构名称类、数字类、数值单位类。,5,PostDisposal,后期处置,包括善后处理、调查与评估、恢复生产等三个方面、事故后的恢复工作、需明确善后处理(如伤亡人员家属安抚、财产损失统计)、事故调查(如原因分析、责任认定评估)及整改措施(如完善安全制度、加强培训)、避免事故重复发生;,后期处置;善后处理;事故调查;恢复生产;善后工作;事故评估
-6,quality,质量保证措施,1,QualitySystem,质量保证体系,组织机构名称类、岗位名称类、岗位职责词汇类。,1,QualityAssuranceSystemFramework,质量管理组织机构,应引用公司标准体系框图、质量体系的视觉化呈现、需明确体系的核心要素(如组织机构、制度流程、资源保障)及逻辑关系、是体系落地的框架基础;,质量保证体系;质量体系框图;质量管理体系;质量管理组织机构
-6,quality,质量保证措施,1,QualitySystem,质量保证体系,组织机构名称类、岗位名称类、岗位职责词汇类。,2,QualitymanagementOrganization,人员职责,基于项目经理为组长的工作领导小组、小组中包括项目经理、项目总工、质量总监、工程部门、质检部门、专业分包单位(协作队伍)项目负责人和项目技术负责人等、需明确层级(如公司级、项目级、班组级)及组成部门(如质量部、工程部、技术部)、形成“横向到边、纵向到底”的管理网络;,质量管理组织;质量领导小组;质检人员;质量总监;质量体系组织
-6,quality,质量保证措施,1,QualitySystem,质量保证体系,组织机构名称类、岗位名称类、岗位职责词汇类。,3,PersonnelResponsibilities,质量保证体系框图,需细化每个岗位的质量责任(如项目经理的“第一责任人”职责、质量员的“现场监督”职责)、避免职责模糊导致的管理漏洞;,质量职责;质量责任制;岗位质量责任;质量保证体系框图
-6,quality,质量保证措施,2,QualityGoals,质量目标,目标标准词汇类、合同条款类、具体工程名称类、量化数值类、数值单位类。,1,DecompositionOfQualityObjectives,质量目标分解,根据施工合同和业主要求填写、需将总目标拆解为分部(基础、主体、装饰)、分项工程的具体目标(如“主体结构混凝土强度合格率100%”)、是目标落地的关键;,质量目标分解;分项质量;质量指标;质量目标分项
-6,quality,质量保证措施,3,Excellence,工程创优规划,工程创优总体计划、技术准备(BIM/新技术应用)、过程控制(关键工序精品打造)、细部处理(节点优化)、精品工程创建、新技术推广(四新技术)、申报资料编制、工程资料归档、创优考核机制,1,OverallPlanForEngineeringExcellence,工程创优总体计划,需明确创优的阶段目标(如“基础工程创优”“主体工程创优”)及关键节点、是创优工作的路线图;,创优计划;精品工程;优质工程;工程创优;创优目标
-6,quality,质量保证措施,3,Excellence,工程创优规划,工程创优总体计划、技术准备(BIM/新技术应用)、过程控制(关键工序精品打造)、细部处理(节点优化)、精品工程创建、新技术推广(四新技术)、申报资料编制、工程资料归档、创优考核机制,2,TechnicalPreparation,技术准备,需涵盖BIM技术应用、施工方案优化等、为创优提供技术支撑;,技术准备;BIM技术;新技术应用;技术支撑;技术创新
-6,quality,质量保证措施,3,Excellence,工程创优规划,工程创优总体计划、技术准备(BIM/新技术应用)、过程控制(关键工序精品打造)、细部处理(节点优化)、精品工程创建、新技术推广(四新技术)、申报资料编制、工程资料归档、创优考核机制,3,ProcessControl,过程控制,需聚焦关键工序(如“大体积混凝土浇筑”“钢结构安装”)、打造精品工序;,过程控制;关键工序精品;精品工序;质量控制过程;工程创优过程
-6,quality,质量保证措施,3,Excellence,工程创优规划,工程创优总体计划、技术准备(BIM/新技术应用)、过程控制(关键工序精品打造)、细部处理(节点优化)、精品工程创建、新技术推广(四新技术)、申报资料编制、工程资料归档、创优考核机制,4,DetailedTreatment,细部处理,需优化节点做法(如“墙面抹灰阴阳角顺直”“防水卷材搭接严密”)、提升工程观感质量;,细部处理;节点优化;节点做法;细部质量;细部工艺
-6,quality,质量保证措施,3,Excellence,工程创优规划,工程创优总体计划、技术准备(BIM/新技术应用)、过程控制(关键工序精品打造)、细部处理(节点优化)、精品工程创建、新技术推广(四新技术)、申报资料编制、工程资料归档、创优考核机制,5,NewTechnologyPromotion,新技术推广,需应用“四新技术”(新技术、新材料、新工艺、新设备)、提升创优的技术含量;,四新技术;新技术推广;新工艺;新材料;新设备;技术创新应用
-6,quality,质量保证措施,3,Excellence,工程创优规划,工程创优总体计划、技术准备(BIM/新技术应用)、过程控制(关键工序精品打造)、细部处理(节点优化)、精品工程创建、新技术推广(四新技术)、申报资料编制、工程资料归档、创优考核机制,6,PreparationOfApplicationMaterials,申报资料编制,需整理创优所需的资料(如工程质量报告、技术创新成果)、是创优申报的核心材料;,申报资料;创优申报;工程质量报告;申报材料
-6,quality,质量保证措施,3,Excellence,工程创优规划,工程创优总体计划、技术准备(BIM/新技术应用)、过程控制(关键工序精品打造)、细部处理(节点优化)、精品工程创建、新技术推广(四新技术)、申报资料编制、工程资料归档、创优考核机制,7,EngineeringDataArchiving,工程资料归档,需确保资料真实、完整、符合创优评审要求。,工程资料归档;档案管理;竣工资料;资料归档
-6,quality,质量保证措施,4,QualityControl,质量控制程序与具体措施,原材料检查验收(三证一检)、实体工程质量验收(分项/分部工程验收)、质量通病防治(墙面空鼓/屋面渗漏)、季节性施工质量控制(冬期混凝土保温/雨期防水)、工序质量控制点、质量检查程序(自检/互检/专检)、质量问题整改(闭环管理),1,RawMaterialInspection,原材料检查验收,需执行“三证一检”(合格证、质检报告、生产许可证+进场复检)、确保材料质量;,原材料进场;三证一检;材料检验;复检报告;进场材料质量
-6,quality,质量保证措施,4,QualityControl,质量控制程序与具体措施,原材料检查验收(三证一检)、实体工程质量验收(分项/分部工程验收)、质量通病防治(墙面空鼓/屋面渗漏)、季节性施工质量控制(冬期混凝土保温/雨期防水)、工序质量控制点、质量检查程序(自检/互检/专检)、质量问题整改(闭环管理),2,PhysicalProjectQualityAcceptance,实体工程质量验收,需按分项(如“钢筋绑扎”)、分部工程(如“基础工程”)进行验收、符合规范要求;,实体验收;分项验收;分部验收;实体工程验收;工程质量验收
-6,quality,质量保证措施,4,QualityControl,质量控制程序与具体措施,原材料检查验收(三证一检)、实体工程质量验收(分项/分部工程验收)、质量通病防治(墙面空鼓/屋面渗漏)、季节性施工质量控制(冬期混凝土保温/雨期防水)、工序质量控制点、质量检查程序(自检/互检/专检)、质量问题整改(闭环管理),3,PreventionAndControlOfCommonQualityDefectsInProcesses,工序质量通病防治,需针对常见问题(如“墙面空鼓”“屋面渗漏”)制定专项措施(如“抹灰前基层凿毛”“防水附加层施工”)、减少质量缺陷;,质量通病;空鼓;渗漏;裂缝;蜂窝麻面;防治措施;通病防治
-6,quality,质量保证措施,4,QualityControl,质量控制程序与具体措施,原材料检查验收(三证一检)、实体工程质量验收(分项/分部工程验收)、质量通病防治(墙面空鼓/屋面渗漏)、季节性施工质量控制(冬期混凝土保温/雨期防水)、工序质量控制点、质量检查程序(自检/互检/专检)、质量问题整改(闭环管理),4,SeasonalConstructionQualityAssuranceMeasures,季节性施工质量保证措施,需针对冬期(混凝土保温)、雨期(防水加强)、高温(混凝土保湿)制定专项措施、确保施工质量;,季节性施工;冬期施工;雨期施工;高温施工;夏季施工;冬季混凝土
-7,environment,环境保证措施,1,EnvSystem,环境保证体系,环境保证体系框图、公司标准体系引用,1,BlockDiagramOfEnvironmentalAssuranceSystem,环境保证体系框图,环境保证体系的视觉化呈现、需明确体系的核心要素(如组织机构、制度流程、资源保障)及逻辑关系、是公司标准体系的具象化载体;,环境保证体系;环境管理体系框图;环境保证体系框图
-7,environment,环境保证措施,1,EnvSystem,环境保证体系,环境保证体系框图、公司标准体系引用,2,CompanyStandardSystemReference,公司标准体系引用,应引用公司标准体系框图、强调环境保证体系需承接公司现有标准(如《公司环境管理体系手册》《公司环境保护管理办法》)、确保体系的一致性与延续性;,环境管理体系;环境保护管理办法;公司环境标准;环境体系引用
-7,environment,环境保证措施,2,EnvOrg,环境保护组织机构,环境保护组织架构、管理人员姓名、管理人员职务、管理人员职责、环境管理岗位责任、责任考核机制、环境管理职责分工、环境管理人员资质、环境管理沟通机制,1,EnvironmentalAssuranceSystemFramework,环境保护组织架构,包含管理人员姓名、职务、职责、环境管理的责任主体、基于项目经理为组长的工作领导小组、小组中包括项目经理、项目副经理、项目总工、工程部门、质检部门、安全环保部门、专业分包单位(协作队伍)项目负责人和项目技术负责人等、需明确机构的层级(如公司级、项目级、班组级)及组成部门(如环境部、工程部、技术部)、形成“横向到边、纵向到底”的管理网络;,环境保护组织;环境管理机构;环境管理组织架构;环境领导小组
-7,environment,环境保证措施,2,EnvOrg,环境保护组织机构,环境保护组织架构、管理人员姓名、管理人员职务、管理人员职责、环境管理岗位责任、责任考核机制、环境管理职责分工、环境管理人员资质、环境管理沟通机制,2,EnvironmentalmanagementJobResponsibilities,环境管理岗位责任,需明确各岗位的环境责任(如项目经理的“环境第一责任人”职责、环境专员的“现场巡查”职责)、是组织保证的基石;,环境职责;环保岗位;环境管理责任;环保责任
-7,environment,环境保证措施,2,EnvOrg,环境保护组织机构,环境保护组织架构、管理人员姓名、管理人员职务、管理人员职责、环境管理岗位责任、责任考核机制、环境管理职责分工、环境管理人员资质、环境管理沟通机制,3,ResponsibilityAssessmentMechanism,责任考核机制,对环境职责履行情况的评价方式(如月度考核、年度评优)、需与环境绩效挂钩(如奖金发放、晋升晋级)、强化责任意识。,考核机制;责任考核;环境考核;月度考核;绩效考核;考核评价
-7,environment,环境保证措施,3,EnvProtection,环境保护及文明施工措施,办公生活区环境卫生管理、生活垃圾分类处置、卫生防疫措施、饮用水安全保障、施工区域水土流失防治、截排水系统设计、边坡防护工程、沉沙池设置、噪声排放监测、低噪声设备选型、隔音屏障设置、施工时间管控、污水沉淀处理、油污隔离措施、废水检测达标、扬尘控制、废气净化处理、清洁能源使用、裸土覆盖、车辆冲洗设施。,1,EnvironmentalSanitationGuaranteeMeasuresForOfficeAndLivingAreas,办公生活区环境卫生保证措施,需明确责任分工(如保洁人员配置、卫生区域划分)及管理流程(如每日清扫、每周检查)、确保环境整洁;,环境卫生;生活区;办公区;生活垃圾;卫生防疫;饮用水
-7,environment,环境保证措施,3,EnvProtection,环境保护及文明施工措施,办公生活区环境卫生管理、生活垃圾分类处置、卫生防疫措施、饮用水安全保障、施工区域水土流失防治、截排水系统设计、边坡防护工程、沉沙池设置、噪声排放监测、低噪声设备选型、隔音屏障设置、施工时间管控、污水沉淀处理、油污隔离措施、废水检测达标、扬尘控制、废气净化处理、清洁能源使用、裸土覆盖、车辆冲洗设施。,2,SoilAndWaterConservationMeasuresInTheConstructionArea,施工区域水土流失防治措施,需通过“截(截水沟)、排(排水沟)、拦(拦挡坝)、护(边坡防护)”综合措施、减少雨水对裸露土壤的冲刷;,水土流失;边坡防护;截排水;沉沙池;水土保持;拦挡
-7,environment,环境保证措施,3,EnvProtection,环境保护及文明施工措施,办公生活区环境卫生管理、生活垃圾分类处置、卫生防疫措施、饮用水安全保障、施工区域水土流失防治、截排水系统设计、边坡防护工程、沉沙池设置、噪声排放监测、低噪声设备选型、隔音屏障设置、施工时间管控、污水沉淀处理、油污隔离措施、废水检测达标、扬尘控制、废气净化处理、清洁能源使用、裸土覆盖、车辆冲洗设施。,3,NoiseEmissionMonitoring,噪声排放监测,需按照《建筑施工场界环境噪声排放标准》(GB 12523-2011)要求、在施工现场边界设置监测点、每日监测1次、记录等效声级(Leq)和最大声级(Lmax);,噪声监测;噪声排放;等效声级;噪音控制;GB 12523;声级
-7,environment,环境保证措施,3,EnvProtection,环境保护及文明施工措施,办公生活区环境卫生管理、生活垃圾分类处置、卫生防疫措施、饮用水安全保障、施工区域水土流失防治、截排水系统设计、边坡防护工程、沉沙池设置、噪声排放监测、低噪声设备选型、隔音屏障设置、施工时间管控、污水沉淀处理、油污隔离措施、废水检测达标、扬尘控制、废气净化处理、清洁能源使用、裸土覆盖、车辆冲洗设施。,4,WaterPollutionPreventionAndControlMeasures,水污染防治措施,需在搅拌机、运输车清洗处设置沉淀池、施工废水经沉淀后回用(如洒水降尘)、避免直接排入市政管网;,水污染;废水处理;污水沉淀;沉淀池;废水排放;污水处理
-7,environment,环境保证措施,3,EnvProtection,环境保护及文明施工措施,办公生活区环境卫生管理、生活垃圾分类处置、卫生防疫措施、饮用水安全保障、施工区域水土流失防治、截排水系统设计、边坡防护工程、沉沙池设置、噪声排放监测、低噪声设备选型、隔音屏障设置、施工时间管控、污水沉淀处理、油污隔离措施、废水检测达标、扬尘控制、废气净化处理、清洁能源使用、裸土覆盖、车辆冲洗设施。,5,AirPollutionPreventionAndControlMeasures,大气污染防治措施,需采取“洒水降尘、裸土覆盖、车辆冲洗、道路硬化”等措施、确保施工现场目测扬尘高度小于1.5m(土方作业阶段)或0.5m(结构施工阶段)。,扬尘;大气污染;尘土;车辆冲洗;裸土覆盖;废气排放;扬尘控制
-8,management,施工管理及作业人员配备与分工,1,Managers,施工管理人员,施工管理人员名单、岗位职责清单、管理职责分解、管理权限划分、管理流程衔接。,1,ConstructionmanagementPersonnelList,施工管理人员名单,需以表格形式明确项目管理人员(如项目经理、项目书记、项目总工、项目副经理、质量总监、安全总监、各职能部门、主管技术员、测量员、质检员、以及专业分包单位(协作队伍)项目负责人和项目技术负责人等)的姓名、岗位及联系方式、是人员管理的基础台账;,管理人员名单;项目经理;项目总工;施工管理人员;人员信息表
-8,management,施工管理及作业人员配备与分工,1,Managers,施工管理人员,施工管理人员名单、岗位职责清单、管理职责分解、管理权限划分、管理流程衔接。,2,JobResponsibilitiesList,岗位职责清单,需细化每个管理岗位的职责(如项目经理的“项目全面管理”职责、技术负责人的“技术方案审核”职责)、避免职责模糊导致的管理漏洞;,岗位职责;职责清单;管理岗位职责;岗位分工;职责分解
-8,management,施工管理及作业人员配备与分工,2,SafetyStaff,专职安全生产管理人员,专职安全生产管理人员名单、安全生产考核合格证书、证书编号、证书有效期、安全岗位职责、安全责任追究。,1,ListOfFullTimeSafetyProductionmanagementPersonnel,专职安全生产管理人员名单,需以表格形式明确专职安全员(如项目安全总监、专职安全员)的姓名、岗位及联系方式、是安全管理的核心台账;,专职安全员;专职安全管理人员;安全员名单;安全管理人员名单
-8,management,施工管理及作业人员配备与分工,2,SafetyStaff,专职安全生产管理人员,专职安全生产管理人员名单、安全生产考核合格证书、证书编号、证书有效期、安全岗位职责、安全责任追究。,2,SafetyProductionQualificationCertificate,安全生产考核合格证书,需明确证书类型(如“建筑施工企业专职安全生产管理人员证书”)、编号及有效期、是上岗的必备资质;,安全生产考核合格证;安全证书;证书编号;证书有效期;安全资质
-8,management,施工管理及作业人员配备与分工,2,SafetyStaff,专职安全生产管理人员,专职安全生产管理人员名单、安全生产考核合格证书、证书编号、证书有效期、安全岗位职责、安全责任追究。,3,SafetyProductionmanagementJobResponsibilities,安全生产管理岗位职责,需细化专职安全员的职责(如“现场安全检查”“隐患整改监督”“安全培训实施”)、确保安全管理工作落地;,安全生产管理职责;专职安全员职责;安全管理岗位职责
-8,management,施工管理及作业人员配备与分工,3,SpecialWorkers,特种作业人员,特种作业人员名单、特种作业操作资格证书、证书编号、证书有效期、特种作业工种、岗位职责、证书延期复核、违章作业记录。,1,ListOfSecialOperationsPersonnel,特种作业人员名单,需以表格形式明确特种作业人员(如建筑电工、建筑架子工、建筑起重机械司机等)的姓名、工种及联系方式、是特种作业管理的基础台账;,特种作业人员;特种作业;电工;架子工;起重机司机;焊工;特种人员名单
-8,management,施工管理及作业人员配备与分工,3,SpecialWorkers,特种作业人员,特种作业人员名单、特种作业操作资格证书、证书编号、证书有效期、特种作业工种、岗位职责、证书延期复核、违章作业记录。,2,SpecialOperationsQualificationCertificate,特种作业操作资格证书,需明确证书类型(如“建筑施工特种作业操作资格证书”)、编号及有效期、是上岗的必备资质;,特种作业资格证;操作资格证书;特种证书;上岗证
-8,management,施工管理及作业人员配备与分工,3,SpecialWorkers,特种作业人员,特种作业人员名单、特种作业操作资格证书、证书编号、证书有效期、特种作业工种、岗位职责、证书延期复核、违章作业记录。,3,SpecialOperationsJobResponsibilities,特种作业岗位职责,需明确作业人员从事的具体工种(如“塔式起重机司机”“高处作业吊篮安装拆卸工”)、细化特种作业人员的职责是工种管理的关键;,特种作业职责;工种职责;特种岗位职责;作业人员职责
-8,management,施工管理及作业人员配备与分工,4,OtherWorkers,其它作业人员,专业分包单位管理人员数量、不同工种作业人员数量、作业人员台账、工种分类统计。,1,NumberOfmanagementPersonnelInProfessionalSubcontractingUnits,专业分包单位管理人员数量,需明确分包单位(如劳务分包、专业分包)的管理人员(如分包项目经理、技术负责人)数量、是分包管理的基础;,分包管理人员;专业分包;劳务分包;分包单位人员
-8,management,施工管理及作业人员配备与分工,4,OtherWorkers,其它作业人员,专业分包单位管理人员数量、不同工种作业人员数量、作业人员台账、工种分类统计。,2,NumberOfWorkersInDifferentJobCategories,不同工种作业人员数量,需以表格形式明确各工种(如木工、钢筋工、混凝土工、砌筑工等)的作业人员数量、是劳动力调配的依据;,工种数量;作业人员数量;不同工种;工种统计;人员统计
-8,management,施工管理及作业人员配备与分工,4,OtherWorkers,其它作业人员,专业分包单位管理人员数量、不同工种作业人员数量、作业人员台账、工种分类统计。,3,WorkersLlog,作业人员台账,需记录作业人员的姓名、工种、身份证号、联系方式等信息、是人员管理的重要档案;,作业人员台账;工人信息;人员档案;实名制;人员登记
-9,acceptance,验收要求,1,Standards,验收标准,国家验收规范(如《公路工程质量检验评定标准》JTG F80/1-2017、《桥梁工程施工质量验收标准》GB 50205-2020)、行业标准(如《公路桥涵施工技术规范》JTG_T 3650-2020)、企业管理办法(如《四川路桥施工验收管理办法》《路桥集团专项施工方案验收条件》)、操作规程(如《桥梁施工安全操作规程》),1,NationalStandardsSpecificationsAndOperatingProcedures,国家标准、规范、操作规程,是验收的基础依据、需明确具体规范名称(如JTG F80/1-2017)、避免使用“国家规范”等泛化表述;,国家标准;操作规程;JTG F80;GB 50205;验收规范;国家规范
-9,acceptance,验收要求,1,Standards,验收标准,国家验收规范(如《公路工程质量检验评定标准》JTG F80/1-2017、《桥梁工程施工质量验收标准》GB 50205-2020)、行业标准(如《公路桥涵施工技术规范》JTG_T 3650-2021)、企业管理办法(如《四川路桥施工验收管理办法》《路桥集团专项施工方案验收条件》)、操作规程(如《桥梁施工安全操作规程》),2,IndustryStandardOperatingProcedures,行业标准、规范、操作规程,需指向具体行业的内部文件(如行业标准(如《公路桥涵施工技术规范》JTG_T 3650-2020)、体现行业管理要求;,行业标准;行业规范;行业操作规程;JTG_T 3650;行业内部文件
-9,acceptance,验收要求,1,Standards,验收标准,国家验收规范(如《公路工程质量检验评定标准》JTG F80/1-2017、《桥梁工程施工质量验收标准》GB 50205-2020)、行业标准(如《公路桥涵施工技术规范》JTG_T 3650-2022)、企业管理办法(如《四川路桥施工验收管理办法》《路桥集团专项施工方案验收条件》)、操作规程(如《桥梁施工安全操作规程》),3,SichuanRoadAndBridgemanagementRegulations,四川路桥的管理办法,需关联企业管理办法(如《四川路桥施工验收管理办法》)、体现企业特色和企业管理要求;,四川路桥施工验收;四川路桥管理办法;川路桥管理;四川路桥验收
-9,acceptance,验收要求,1,Standards,验收标准,国家验收规范(如《公路工程质量检验评定标准》JTG F80/1-2017、《桥梁工程施工质量验收标准》GB 50205-2020)、行业标准(如《公路桥涵施工技术规范》JTG_T 3650-2023)、企业管理办法(如《四川路桥施工验收管理办法》《路桥集团专项施工方案验收条件》)、操作规程(如《桥梁施工安全操作规程》),4,managementRegulationsOfLuqiaoGroup,路桥集团的管理办法,需关联集团管理办法(如《路桥集团专项施工方案验收条件》)、体现集团特色和集团管理要求;,路桥集团专项施工方案验收;路桥集团管理办法;路桥集团验收条件;四川路桥集团验收;四川路桥集团管理办法;四川路桥集团专项施工方案
-9,acceptance,验收要求,1,Standards,验收标准,国家验收规范(如《公路工程质量检验评定标准》JTG F80/1-2017、《桥梁工程施工质量验收标准》GB 50205-2020)、行业标准(如《公路桥涵施工技术规范》JTG_T 3650-2024)、企业管理办法(如《四川路桥施工验收管理办法》《路桥集团专项施工方案验收条件》)、操作规程(如《桥梁施工安全操作规程》),5,managementRegulationsOfBridgeCompany,桥梁公司的管理办法,需关联桥梁施工管理办法(如《桥梁施工安全操作规程》)、体现桥梁施工重点 focus:和桥梁施工标准管理要求;,桥梁公司管理办法;桥梁施工管理;桥梁安全操作规程;桥梁公司验收;四川路桥桥梁公司管理办法;四川路桥桥梁公司验收
-9,acceptance,验收要求,2,Procedure,验收程序,进场验收(材料/设备进场检验)、过程验收(工序/隐蔽工程验收)、阶段验收(基础/主体/装饰阶段验收)、完工验收(工程竣工预验收),1,OnsiteAcceptance,进场验收,需明确验收对象(如“钢筋进场验收”“塔式起重机进场验收”)、是质量控制的第一道防线;,进场验收;材料进场;设备进场验收;进场检验
-9,acceptance,验收要求,2,Procedure,验收程序,进场验收(材料/设备进场检验)、过程验收(工序/隐蔽工程验收)、阶段验收(基础/主体/装饰阶段验收)、完工验收(工程竣工预验收),2,ProcessAcceptance,过程验收,需关联施工工序(如“混凝土浇筑过程验收”“钢筋绑扎过程验收”)、强调动态管控;,过程验收;施工过程验收;工序验收;隐蔽工程验收
-9,acceptance,验收要求,2,Procedure,验收程序,进场验收(材料/设备进场检验)、过程验收(工序/隐蔽工程验收)、阶段验收(基础/主体/装饰阶段验收)、完工验收(工程竣工预验收),3,StageAcceptance,阶段验收,需对应工程阶段(如“基础工程阶段验收”“主体结构阶段验收”)、是阶段性成果确认的关键;,阶段验收;基础工程验收;主体验收;结构验收;阶段性验收
-9,acceptance,验收要求,2,Procedure,验收程序,进场验收(材料/设备进场检验)、过程验收(工序/隐蔽工程验收)、阶段验收(基础/主体/装饰阶段验收)、完工验收(工程竣工预验收),4,CompletionAcceptance,完工验收,需明确验收内容(如“工程竣工预验收”“专项施工方案完工验收”)、是竣工验收的前提。,完工验收;竣工验收;竣工预验收;完工后验收
-9,acceptance,验收要求,3,Content,验收内容,安全生产条件验收(安全防护设施验收、临时用电验收)、资源配置验收(人员配置验收、设备配置验收)、施工工艺验收(模板安装工艺验收、混凝土浇筑工艺验收)、机械设备验收(塔式起重机验收、混凝土泵车验收)、临时支撑结构验收(脚手架验收、满堂支架验收)、人员操作平台验收(高空作业平台验收、操作脚手架验收)、安全防护设施验收(安全网验收、防护栏杆验收),1,SafetyProductionConditionAcceptance,安全生产条件验收,验收表格中要明确项目的具体验收标准、验收标准应尽量量化到具体参数或标准、需细化具体内容(如“安全防护设施验收”包括“安全网张挂验收”“防护栏杆安装验收”)、避免“安全生产验收”等泛化表述;,安全生产条件验收;安全验收;安全防护验收;临时用电验收
-9,acceptance,验收要求,3,Content,验收内容,安全生产条件验收(安全防护设施验收、临时用电验收)、资源配置验收(人员配置验收、设备配置验收)、施工工艺验收(模板安装工艺验收、混凝土浇筑工艺验收)、机械设备验收(塔式起重机验收、混凝土泵车验收)、临时支撑结构验收(脚手架验收、满堂支架验收)、人员操作平台验收(高空作业平台验收、操作脚手架验收)、安全防护设施验收(安全网验收、防护栏杆验收),2,ResourceAllocationAcceptance,资源配置验收,验收表格中要明确项目的具体验收标准、验收标准应尽量量化到具体参数或标准、需关联资源类型(如“人员配置验收”包括“特种作业人员资质验收”“管理人员到位验收”)、体现资源的针对性;,资源配置验收;人员配置验收;设备配置验收;资源验收
-9,acceptance,验收要求,3,Content,验收内容,安全生产条件验收(安全防护设施验收、临时用电验收)、资源配置验收(人员配置验收、设备配置验收)、施工工艺验收(模板安装工艺验收、混凝土浇筑工艺验收)、机械设备验收(塔式起重机验收、混凝土泵车验收)、临时支撑结构验收(脚手架验收、满堂支架验收)、人员操作平台验收(高空作业平台验收、操作脚手架验收)、安全防护设施验收(安全网验收、防护栏杆验收),3,ConstructionProcessAcceptance,施工工艺验收,验收表格中要明确项目的具体验收标准、验收标准应尽量量化到具体参数或标准、需明确工艺环节(如“模板安装工艺验收”包括“模板垂直度验收”“模板拼接缝验收”)、强调工艺的标准化;,施工工艺验收;模板安装验收;工艺验收;施工技术验收
-9,acceptance,验收要求,3,Content,验收内容,安全生产条件验收(安全防护设施验收、临时用电验收)、资源配置验收(人员配置验收、设备配置验收)、施工工艺验收(模板安装工艺验收、混凝土浇筑工艺验收)、机械设备验收(塔式起重机验收、混凝土泵车验收)、临时支撑结构验收(脚手架验收、满堂支架验收)、人员操作平台验收(高空作业平台验收、操作脚手架验收)、安全防护设施验收(安全网验收、防护栏杆验收),4,AcceptanceOfMechanicalEquipment,机械设备验收,验收表格中要明确项目的具体验收标准、验收标准应尽量量化到具体参数或标准、需指向具体设备(如“塔式起重机验收”包括“设备型号验收”“安全装置验收”)、确保设备符合施工要求。,机械设备验收;设备验收;起重机验收;机械验收
-9,acceptance,验收要求,3,Content,验收内容,安全生产条件验收(安全防护设施验收、临时用电验收)、资源配置验收(人员配置验收、设备配置验收)、施工工艺验收(模板安装工艺验收、混凝土浇筑工艺验收)、机械设备验收(塔式起重机验收、混凝土泵车验收)、临时支撑结构验收(脚手架验收、满堂支架验收)、人员操作平台验收(高空作业平台验收、操作脚手架验收)、安全防护设施验收(安全网验收、防护栏杆验收),5,TemporarySupportStructure,临时支撑结构验收,验收表格中要明确项目的具体验收标准、验收标准应尽量量化到具体参数或标准、专项施工方案及审批记录、技术交底记录、构配件质量证明文件(合格证/检测报告)、地基承载力报告、搭设过程检查记录、荷载试验报告(高支模/大跨度)、验收记录表(含实测数据/影像资料)、整改复查记录。,临时支撑验收;脚手架验收;满堂支架验收;支架验收;临时结构验收
-9,acceptance,验收要求,3,Content,验收内容,安全生产条件验收(安全防护设施验收、临时用电验收)、资源配置验收(人员配置验收、设备配置验收)、施工工艺验收(模板安装工艺验收、混凝土浇筑工艺验收)、机械设备验收(塔式起重机验收、混凝土泵车验收)、临时支撑结构验收(脚手架验收、满堂支架验收)、人员操作平台验收(高空作业平台验收、操作脚手架验收)、安全防护设施验收(安全网验收、防护栏杆验收),6,PersonnelOperationPlatform,人员操作平台验收,验收表格中要明确项目的具体验收标准、验收标准应尽量量化到具体参数或标准、架体材质(如钢管无裂纹、弯曲、型钢无开焊);架体构造(立杆间距、剪刀撑设置、连墙件固定);稳定性(移动式平台刹车装置、落地式平台基础坚实度);荷载限制(平台荷载不超过设计值、悬挂限载标志);防护栏杆(高度≥1.2m、竖向栏杆间距≤1.5m、底部设挡脚板);平台铺板(满铺、固定、无空隙);登高扶梯(防滑、固定、与平台连接牢固);安全网(平台周边设置密目网或安全平网)。,操作平台验收;人员平台;高空作业平台验收;施工平台验收
-9,acceptance,验收要求,3,Content,验收内容,安全生产条件验收(安全防护设施验收、临时用电验收)、资源配置验收(人员配置验收、设备配置验收)、施工工艺验收(模板安装工艺验收、混凝土浇筑工艺验收)、机械设备验收(塔式起重机验收、混凝土泵车验收)、临时支撑结构验收(脚手架验收、满堂支架验收)、人员操作平台验收(高空作业平台验收、操作脚手架验收)、安全防护设施验收(安全网验收、防护栏杆验收),7,SafetyProtectionFacilities,安全防护措施验收,验收表格中要明确项目的具体验收标准、验收标准应尽量量化到具体参数或标准、需结合场景需求(如建筑施工中的基坑临边防护、电梯井防护门)、功能定位(如预防事故的防护栏杆、减少事故影响的安全网)、技术要求(如材质、构造、固定方式)。其核心逻辑是“隔离危险、承接冲击、提醒注意”,安全防护验收;防护设施验收;安全网验收;防护栏杆验收
-9,acceptance,验收要求,4,Timing,验收时间,专项施工方案验收时间(如《专项施工方案验收条件一览表》预估时间)、验收时间调整(根据实际进度调整验收时间)、验收条件触发时间(具备验收条件后15日内组织验收),1,AcceptanceTimeOfSpecialConstructionPlan,专项施工方案验收时间,需关联具体表格(如“《专项施工方案验收条件一览表》预估时间”)、体现时间的可追溯性;,验收时间;专项方案验收时间;验收时间表;预估验收时间
-9,acceptance,验收要求,4,Timing,验收时间,专项施工方案验收时间(如《专项施工方案验收条件一览表》预估时间)、验收时间调整(根据实际进度调整验收时间)、验收条件触发时间(具备验收条件后16日内组织验收),2,AcceptanceTimeAdjustment,验收时间调整,需明确调整依据(如“根据施工进度调整验收时间”)、避免“时间调整”等泛化表述;,验收时间调整;进度调整验收;时间调整说明
-9,acceptance,验收要求,4,Timing,验收时间,专项施工方案验收时间(如《专项施工方案验收条件一览表》预估时间)、验收时间调整(根据实际进度调整验收时间)、验收条件触发时间(具备验收条件后17日内组织验收),3,AcceptanceConditionTriggerTime,验收条件触发时间,需明确时间节点(如“具备验收条件后15日内组织验收”)、强调时效性。,验收条件触发;15日内;具备验收条件;组织验收时间
-9,acceptance,验收要求,5,Personnel,验收人员,建设单位验收人员(如建设单位项目负责人、建设单位技术负责人)、设计单位验收人员(如设计单位项目负责人、设计单位专业工程师)、施工单位验收人员(如施工单位项目经理、施工单位技术负责人)、监理单位验收人员(如总监理工程师、专业监理工程师)、监测单位验收人员(如监测项目负责人、监测技术员),1,AcceptancePersonnelOfTheConstructionUnit,建设单位验收人员,需明确具体角色(如“建设单位项目负责人”)、避免“建设单位人员”等泛化表述;由施工作业班组在施工过程中自行对照方案自检、施工完成后由方案编制负责人、项目经理、项目副经理、项目技术负责人、安全环保处、工程处、机料处、合同处、专业分包单位(协作队伍)项目负责人和项目技术负责人等部门人员参加方案验收。,建设单位验收人员;业主验收;建设单位项目负责人;甲方验收
-9,acceptance,验收要求,5,Personnel,验收人员,建设单位验收人员(如建设单位项目负责人、建设单位技术负责人)、设计单位验收人员(如设计单位项目负责人、设计单位专业工程师)、施工单位验收人员(如施工单位项目经理、施工单位技术负责人)、监理单位验收人员(如总监理工程师、专业监理工程师)、监测单位验收人员(如监测项目负责人、监测技术员),2,DesignUnitAcceptancePersonnel,设计单位验收人员,需明确验收人员姓名、关联专业(如“设计单位专业工程师”)、体现设计的专业性;由施工作业班组在施工过程中自行对照方案自检、施工完成后由方案编制负责人、项目经理、项目副经理、项目技术负责人、安全环保处、工程处、机料处、合同处、专业分包单位(协作队伍)项目负责人和项目技术负责人等部门人员参加方案验收。,设计单位验收;设计单位人员;设计师验收;设计验收
-9,acceptance,验收要求,5,Personnel,验收人员,建设单位验收人员(如建设单位项目负责人、建设单位技术负责人)、设计单位验收人员(如设计单位项目负责人、设计单位专业工程师)、施工单位验收人员(如施工单位项目经理、施工单位技术负责人)、监理单位验收人员(如总监理工程师、专业监理工程师)、监测单位验收人员(如监测项目负责人、监测技术员),3,ConstructionUnitAcceptancePersonnel,施工单位验收人员,需明确验收人员姓名、指向管理岗位(如“施工单位项目经理”“施工单位技术负责人”)、强调施工单位的主体责任;由施工作业班组在施工过程中自行对照方案自检、施工完成后由方案编制负责人、项目经理、项目副经理、项目技术负责人、安全环保处、工程处、机料处、合同处、专业分包单位(协作队伍)项目负责人和项目技术负责人等部门人员参加方案验收。,施工单位验收;施工方验收;施工单位项目经理;施工验收人员
-9,acceptance,验收要求,5,Personnel,验收人员,建设单位验收人员(如建设单位项目负责人、建设单位技术负责人)、设计单位验收人员(如设计单位项目负责人、设计单位专业工程师)、施工单位验收人员(如施工单位项目经理、施工单位技术负责人)、监理单位验收人员(如总监理工程师、专业监理工程师)、监测单位验收人员(如监测项目负责人、监测技术员),4,InspectionPersonnelOfTheSupervisionUnit,监理单位验收人员,需明确验收人员姓名、监理角色(如“总监理工程师”“专业监理工程师”)、体现监理的监督职责;由施工作业班组在施工过程中自行对照方案自检、施工完成后由方案编制负责人、项目经理、项目副经理、项目技术负责人、安全环保处、工程处、机料处、合同处、专业分包单位(协作队伍)项目负责人和项目技术负责人等部门人员参加方案验收。,监理单位验收;总监理工程师;监理人员;监理验收
-9,acceptance,验收要求,5,Personnel,验收人员,建设单位验收人员(如建设单位项目负责人、建设单位技术负责人)、设计单位验收人员(如设计单位项目负责人、设计单位专业工程师)、施工单位验收人员(如施工单位项目经理、施工单位技术负责人)、监理单位验收人员(如总监理工程师、专业监理工程师)、监测单位验收人员(如监测项目负责人、监测技术员),5,MonitoringUnitAcceptancePersonnel,监测单位验收人员,需明确验收人员姓名、关联监测内容(如“监测项目负责人”“监测技术员”)、确保监测数据的准确性;由施工作业班组在施工过程中自行对照方案自检、施工完成后由方案编制负责人、项目经理、项目副经理、项目技术负责人、安全环保处、工程处、机料处、合同处、专业分包单位(协作队伍)项目负责人和项目技术负责人等部门人员参加方案验收。,监测单位验收;监测人员;监测项目负责人;监测验收
-10,other,其它资料,1,Calculations,计算书,编制依据、工程简况、方案简述、设计参数、主要工况计算、局部计算、结论及建议、应力分析结果、变形分析结果、反力分析结果、屈曲分析结果,1,ContentRequirements,内容要求,专项施工方案中包含承重结构、重要临时设施、设备选型、吊绳吊具受力计算;地基承载力等工作内容编制的专项计算书、内容应包含编制依据、工程简况、方案简述、设计参数、主要工况计算、局部计算、结论及建议。,计算书;编制依据;设计参数;主要工况;计算内容;结构计算
-10,other,其它资料,1,Calculations,计算书,编制依据、工程简况、方案简述、设计参数、主要工况计算、局部计算、结论及建议、应力分析结果、变形分析结果、反力分析结果、屈曲分析结果,2,CalculationOfMainWorkingConditions,主要工况计算,需针对关键施工工况(如“盖梁浇筑工况”“桩基础施工工况”)、包含“本工况描述”“应力/变形/反力/屈曲分析结果”、是计算书的核心内容;,主要工况计算;工况分析;应力分析;变形分析;反力分析;屈曲分析
-10,other,其它资料,1,Calculations,计算书,编制依据、工程简况、方案简述、设计参数、主要工况计算、局部计算、结论及建议、应力分析结果、变形分析结果、反力分析结果、屈曲分析结果,3,LocalCalculation,局部计算,需对于受力集中、结构复杂的局部重要节点进行细部分析(如“钢管桩与横梁连接节点”“模板支撑体系节点”)、确保结构安全;,局部计算;节点计算;细部计算;局部受力;复杂节点
-10,other,其它资料,2,Drawings,相关施工图纸,工程专业名词类、设备设施类、量化数值类、数值单位类、结构组件名称类、施工区域名称类,1,OverallLayoutPlan,总体平面布置图,需展示项目整体布局(如“施工便道”“材料堆放区”“临时设施”)、是施工部署的可视化基础;,总体平面布置图;总平面图;施工布局;总体布置
-10,other,其它资料,2,Drawings,相关施工图纸,工程专业名词类、设备设施类、量化数值类、数值单位类、结构组件名称类、施工区域名称类,2,ConstructionSiteLayoutPlan,施工工点平面布置图,需围绕“空间规划”“功能实现”“安全文明”三大核心、覆盖从边界界定到具体设施的全流程要素。,施工工点平面布置图;工点布置;场地布置图;施工场地平面
-10,other,其它资料,2,Drawings,相关施工图纸,工程专业名词类、设备设施类、量化数值类、数值单位类、结构组件名称类、施工区域名称类,3,LongitudinalElevationLayoutOfSupportingStructure,支撑结构纵立面布置图,需明确支撑体系(如“钢管桩支架”“满堂脚手架”)的纵向布置(如“桩长”“间距”“标高”)、是结构安全的关键依据;,支撑结构纵立面;纵立面布置;桩长;纵断面图;支撑纵立面
-10,other,其它资料,2,Drawings,相关施工图纸,工程专业名词类、设备设施类、量化数值类、数值单位类、结构组件名称类、施工区域名称类,4,CrossSectionalLayoutDiagram,支横断面布置图,需围绕“断面类型”“组成要素”“尺寸参数”“坡度设置”“附属设施”五大维度、覆盖道路、桥梁等工程的通用及专业要素。,横断面图;断面布置图;横断面布置;截面图
-10,other,其它资料,2,Drawings,相关施工图纸,工程专业名词类、设备设施类、量化数值类、数值单位类、结构组件名称类、施工区域名称类,5,FloorPlan,平面布置图,需围绕“空间布局”“功能分区”“施工支持”三大核心、覆盖从区域划分到具体设施的全流程要素。,平面布置图;功能分区;施工区域划分;平面图
-10,other,其它资料,2,Drawings,相关施工图纸,工程专业名词类、设备设施类、量化数值类、数值单位类、结构组件名称类、施工区域名称类,6,DetailedStructuralDiagram,细部构造图,需细化关键节点(如“模板拼接节点”“支撑体系连接节点”)、标注尺寸、材料及工艺要求、指导现场施工;,细部构造图;节点详图;构造详图;节点图
-10,other,其它资料,2,Drawings,相关施工图纸,工程专业名词类、设备设施类、量化数值类、数值单位类、结构组件名称类、施工区域名称类,7,FormworkLayoutDrawing,模板布置图,需明确模板的平面位置(如“柱模板”“梁模板”)、尺寸及支撑方式、确保模板安装符合设计要求。,模板布置图;模板平面图;模板位置
-10,other,其它资料,2,Drawings,相关施工图纸,工程专业名词类、设备设施类、量化数值类、数值单位类、结构组件名称类、施工区域名称类,8,TemplateConstructionDiagram,模板构造图,需覆盖模板体系组成、构造细节、支撑系统、节点处理及精度控制等全流程要素。,模板构造图;模板体系图;支撑系统图;模板结构图
-10,other,其它资料,3,Tables,附图附表,工序名称类、施工危险因素词汇类、安全设备设施类、资质证照名称类、标准文书类、数值类、时间时期类、数值单位类,1,ConstructionScheduleNetworkDiagram,施工进度计划网络图,需用节点表示工序逻辑关系(如“桩基础施工→承台施工→盖梁施工”)、是进度控制的核心工具;,网络图;施工进度网络图;工序网络;双代号网络图
-10,other,其它资料,3,Tables,附图附表,工序名称类、施工危险因素词汇类、安全设备设施类、资质证照名称类、标准文书类、数值类、时间时期类、数值单位类,2,ConstructionScheduleGanttChart,施工进度计划横道图,围绕“时间维度”“任务要素”“进度关系”“调整控制”四大核心、覆盖从计划编制到动态监控的全流程。,施工进度横道图;横道图附表;进度计划横道;甘特图附表
-10,other,其它资料,3,Tables,附图附表,工序名称类、施工危险因素词汇类、安全设备设施类、资质证照名称类、标准文书类、数值类、时间时期类、数值单位类,3,HazardAnalysisAndResponseMeasuresTable,危险源分析和应对措施表,需识别施工中的危险源(如“高处坠落”“物体打击”)、制定针对性应对措施(如“设置防护栏杆”“佩戴安全带”)、是安全保障的关键文档;,危险源分析表;应对措施表;危险源表;风险分析表
-10,other,其它资料,3,Tables,附图附表,工序名称类、施工危险因素词汇类、安全设备设施类、资质证照名称类、标准文书类、数值类、时间时期类、数值单位类,4,ScannedCopyOfTheCertificateOfFulltimSafetymanagementPersonnel,专职安全管理人员证件扫描件,需包含“安全生产考核合格证书”“证书编号”“有效期”、确保管理人员资质符合要求;,安全证件扫描;专职安全考核证;安全证书扫描件
-10,other,其它资料,3,Tables,附图附表,工序名称类、施工危险因素词汇类、安全设备设施类、资质证照名称类、标准文书类、数值类、时间时期类、数值单位类,5,ScannedCopyOfSpecialOperationsPersonnelsCertificate,特种作业人员证件扫描件,需围绕“信息真实性”“管理规范性”“使用便捷性”三大核心、覆盖证件内容、“证书编号”、“有效期”、法规标准四大维度,特种作业证件扫描;特种证书扫描件;操作证扫描
-10,other,其它资料,3,Tables,附图附表,工序名称类、施工危险因素词汇类、安全设备设施类、资质证照名称类、标准文书类、数值类、时间时期类、数值单位类,6,ScannedCopyOfProfessionalSubcontractorsQualifications,专业分包单位资质扫描件,需包含“营业执照”“资质证书”“安全生产许可证”、确保分包单位具备施工能力。,分包资质扫描;营业执照扫描;资质证书扫描;分包证件
-10,other,其它资料,4,Team,编制及审核人员情况,专项施工方案验收条件一览表、编制人员信息、复核人员信息、审核人员信息、审批人员信息、姓名、职务、职称,1,ListOfAcceptanceConditionsForSpecialConstructionSchemes,专项施工方案验收条件一览表,需明确验收的前提条件(如“计算书完成”“设计图审核通过”)、是验收的流程依据;,验收条件一览表;专项施工方案验收条件;验收前提条件
-10,other,其它资料,4,Team,编制及审核人员情况,专项施工方案验收条件一览表、编制人员信息、复核人员信息、审核人员信息、审批人员信息、姓名、职务、职称,2,PreparePersonnelInformation,编制人员信息,需包含“姓名”“职务”“职称”(如“张三 技术员 助理工程师”)、确保编制人员具备专业能力;,编制人员;编制人信息;方案编制者;编制人
-10,other,其它资料,4,Team,编制及审核人员情况,专项施工方案验收条件一览表、编制人员信息、复核人员信息、审核人员信息、审批人员信息、姓名、职务、职称,3,ReviewerInformation,审核人员信息,需包含“姓名”“职务”“职称”(如“李四 项目技术负责人 工程师”)、确保审核流程的严谨性;,审核人员;复核人员;审核信息;审核人;复核人
-10,other,其它资料,4,Team,编制及审核人员情况,专项施工方案验收条件一览表、编制人员信息、复核人员信息、审核人员信息、审批人员信息、姓名、职务、职称,4,ApprovalPersonnelInformation,审批人员信息,需包含“姓名”“职务”“职称”(如“王五 项目经理 高级工程师”)、确保方案符合项目整体要求,审批人员;批准人;审批信息;审批签字;项目经理审批
+first_seq,first_code,first_name,second_seq,second_code,second_name,second_focus,third_seq,third_code,third_name,third_focus,keywords,extra_prompt
+1,basis,编制依据,1,LawsAndRegulations,法律法规,NULL,1,NationalLawsAndRegulations,国家政府发布的法律法规与规章制度,国家级、法律、法规、规章、强制力、普遍适用、基础框架、顶层设计、行业准则、合规性、统一标准、权威性、强制性条文、基本要求。,国家法律;法规;规章;强制性条文;国务院令;住房城乡建设部;中华人民共和国,
+1,basis,编制依据,1,LawsAndRegulations,法律法规,NULL,2,ProvincialLawsAndRegulationsOfProjectLocation,工程所在地省级政府发布的法律法规与规章制度,地方性、区域性、细化补充、因地制宜、执行细则、地方特色、适应性要求、属地管理、动态调整、配套政策、本地化实施。,省级;地方法规;省政府;地方规章;属地管理;四川省;省人民政府,
+1,basis,编制依据,2,StandardsAndSpecifications,标准规范,NULL,1,IndustryStandards,行业标准,需符合国家/行业强制或推荐性标准(如GB/T、JTG等)、时效性强(需跟踪最新版)、覆盖全生命周期(设计→施工→运维)、是定义工程项目的最低技术要求、质量验收准则、安全红线。,GB/T;JTG;CJJ;行业标准;国家标准;推荐性标准;GB 5;TB;HJ;DL,
+1,basis,编制依据,3,DocumentSystems,文件制度,NULL,1,SichuanRoadAndBridgeDocumentSystemsAndmanagementProcedures,四川路桥下发的文件制度和管理程序文件,四川路桥下发的文件制度和管理程序文件,与四川路桥相关的文件制度和管理程序文件,视为符合,包含四川公路桥梁建设集团;四川公路桥梁;SCQJ;SCQJT;四川路桥总公司;四川路桥等关键字视为符合,四川公路桥梁建设集团;四川公路桥梁;SCQJ;SCQJT;四川路桥总公司,
+1,basis,编制依据,3,DocumentSystems,文件制度,NULL,2,RoadAndBridgeGroupDocumentSystemsAndmanagementProcedures,路桥集团下发的文件制度和管理程序文件,路桥集团下发的文件制度和管理程序文件,与路桥集团相关的文件制度和管理程序文件,视为符合,包含路桥集团;路桥股份;四川路桥集团有限公司;四川路桥集团;四川路桥集团超危大;川路桥〔;路桥〔;集团下发;集团公司文件等关键字视为符合,路桥集团;路桥股份;四川路桥集团有限公司;四川路桥集团;四川路桥集团超危大;川路桥〔;路桥〔;集团下发;集团公司文件,
+1,basis,编制依据,3,DocumentSystems,文件制度,NULL,3,BridgeCompanyDocumentSystemsAndmanagementProcedures,桥梁公司下发的文件制度和管理程序文件,桥梁公司下发的文件制度和管理程序文件,与桥梁公司相关的文件制度和管理程序文件,视为符合,包含桥梁公司;桥梁分公司;桥梁工程公司;四川路桥桥梁公司;公司下发;公司管理制度等关键字视为符合,桥梁公司;桥梁分公司;桥梁工程公司;四川路桥桥梁公司;公司下发;公司管理制度,
+1,basis,编制依据,3,DocumentSystems,文件制度,NULL,4,ConstructionUnitDocumentSystemsAndmanagementProcedures,建设单位下发的文件制度和管理程序文件,建设单位下发的文件制度和管理程序文件,与建设单位相关的文件制度和管理程序文件,视为符合,包含建设单位;业主;甲方文件;建设方;建设单位下发;业主要求等关键字视为符合,建设单位;业主;甲方文件;建设方;建设单位下发;业主要求,
+1,basis,编制依据,4,CompilationPrinciples,编制原则,NULL,1,NationalPoliciesStandardsAndDesignDocument,编制原则细则,"编制原则应认真贯彻执行国家方针、政策、标准和设计文件,严格执行基本建
+设程序,实现工程项目的全部功能;全面履行工程合同,满足建设单位要求,有效
+地集中施工力量,按期完成;按照工序关系,合理安排施工顺序,统筹考虑。",国家方针;政策;设计文件;国家政策;设计规范;设计图纸;施工图,
+1,basis,编制依据,5,CompilationScope,编制范围,NULL,1,ProjectCoverage,填写完整涵盖本方案包含的所有工程,"编制范围应填写完整,涵盖本方案包含的所有工程,部分工程可简要说明采取
+的施工工艺。",编制范围;工程范围;施工范围;工程内容;本方案涵盖;方案范围,
+2,overview,工程概况,1,DesignSummary,设计概况,关注名称类、具体数值类、量化单位类、技术标准需引用国家或行业规范、关注标准号数字类、各类年限、等级数值、量化单位。,1,ProjectIntroduction,工程简介,工程名称、工程类型(如住宅、桥梁、隧道)、建设规模(如建筑面积、长度、高度)、工程地址、投资额、工程性质(新建/改建/扩建)、设计单位、设计依据(如合同编号)、工程范围(如施工边界坐标)。,工程名称;工程概况;工程简介;工程性质;建设规模;工程类型;项目名称,
+2,overview,工程概况,1,DesignSummary,设计概况,关注名称类、具体数值类、量化单位类、技术标准需引用国家或行业规范、关注标准号数字类、各类年限、等级数值、量化单位。,2,MainTechnicalStandards,主要技术标准,技术规范编号、设计使用年限、荷载标准(如活荷载、恒荷载)、抗震设防烈度、防火等级、环保标准(如绿色建筑认证)、材料标准(如混凝土强度等级C30)、施工工艺标准。,技术标准;设计使用年限;荷载等级;抗震设防;防火等级;混凝土强度;技术规范编号,
+2,overview,工程概况,2,GeologyWeather,工程地质与水文气象,关注地名类、具体水位数值类、量化单位类、关注记录降雨量、水位、气温等数值量化单位类。,1,HydrologicalConditions,水文状况,地下水位(历史最高水位、当前水位)、含水层类型(孔隙水、裂隙水、承压水)、隔水层厚度、渗透系数(K值)、给水度、水质腐蚀性(如pH值、氯离子含量)、补径排条件(补给源、径流方向)、水文地质参数(如越流系数)、地下水动态监测数据。,水文;地下水;水位;地下水位;含水层;渗透系数;水文地质;补径排,
+2,overview,工程概况,2,GeologyWeather,工程地质与水文气象,关注地名类、具体水位数值类、量化单位类、关注记录降雨量、水位、气温等数值量化单位类。,2,ClimaticConditions,气候条件,气候类型(如亚热带季风气候)、年平均气温、极端气温、年降水量、降雨强度(如小时最大降雨量)、蒸发量、湿度、主导风向、风速、冰冻期、台风频率、气象数据来源(如当地气象站)。,气候;气温;降水量;降雨;风速;气象;年降水;极端气温;蒸发量;冰冻期,
+2,overview,工程概况,3,Surroundings,周边环境,周边环境需分析地形地貌名词、建筑分布名词及交通状况道路名词、相关量化单位、相关数字数值、各类专业性名词、建筑物名词、米或毫米等单位类。,1,PositionalRelationship,周边环境,"周边环境主要包括与该工程有关的主要建(构)筑物、山体、边坡、河谷、深
+基坑、道路、高压电、地下管线的位置关系、结构尺寸等情况,并在《施工平面布
+置图》中绘制,标注距离和尺寸。",位置关系;周边环境;相邻建筑;距离;管线;高压线;河道;构筑物;方位,
+2,overview,工程概况,4,LayoutPlan,施工平面及立面布置,场地名词、数值类、量化单位类、名称类、数值类、量化单位类。,1,TemporaryFacilityLocation,临时设施位置,拌和站坐标(如X、Y)、钢筋加工场距工程距离(米)、材料堆码区域面积(㎡)、临时占地红线、与工程最近点距离、场地利用率(%)。,拌和站;钢筋加工;材料堆放;临时设施;临时占地;材料堆场,
+2,overview,工程概况,4,LayoutPlan,施工平面及立面布置,场地名词、数值类、量化单位类、名称类、数值类、量化单位类。,2,ConstructionWorkPlatform,施工作业平台与便道参数,作业平台尺寸(长×宽、米)、地面形式(混凝土硬化、砂石铺垫)、施工便道长度(米)、宽度(米)、路面形式(沥青、碎石)、最小弯曲半径(米)、坡度(%)、承载力(kPa)。,施工平台;作业平台;施工便道;便道长度;平台尺寸;通道宽度,
+2,overview,工程概况,4,LayoutPlan,施工平面及立面布置,场地名词、数值类、量化单位类、名称类、数值类、量化单位类。,3,TemporaryWaterAndElectricityArrangement,临时水电布置,临时用水源(市政管网、地下水井)、管径(如DN100)、管线布置图(走向、节点距离)、供水压力(MPa)、变压器容量(kVA)、配电箱位置、线路走向(架空/埋地)、敷设方式(直埋、穿管)、电缆规格(如YJV22)。,临时用水;临时用电;供水管径;配电箱;水电布置;临时电缆,
+2,overview,工程概况,5,RequirementsTech,施工要求和技术保证条件,名称类、日期类。名称类、量化单位类、数值类。,1,DurationTarget,工期目标,工期目标包括本项目的总体工期和本工程的工期,仅需说明起止时间和持续时间,工期;开工日期;竣工日期;总工期;工期目标;关键节点;工期保证,
+2,overview,工程概况,5,RequirementsTech,施工要求和技术保证条件,名称类、日期类。名称类、量化单位类、数值类。,2,QualityTarget,质量目标,质量目标、合同条款编号、业主具体要求(如绿色施工认证)。,质量目标;合格率;质量标准;鲁班奖;优质工程;质量等级,
+2,overview,工程概况,5,RequirementsTech,施工要求和技术保证条件,名称类、日期类。名称类、量化单位类、数值类。,3,SecurityGoals,安全目标,安全目标(如零死亡事故、隐患整改率)、合同条款编号、业主具体要求(如绿色施工认证)。,安全目标;零伤亡;安全事故;安全指标;安全生产目标,
+2,overview,工程概况,5,RequirementsTech,施工要求和技术保证条件,名称类、日期类。名称类、量化单位类、数值类。,4,EnvironmentalGoals,环境目标,环境目标(如扬尘控制、噪声限值)或业主具体要求(如绿色施工认证)。,环境目标;扬尘控制;噪声限值;绿色施工指标;文明施工目标,
+2,overview,工程概况,6,RiskLevel,风险辨识与分级,危害隐患性词汇类、法规名称类、标准编号类。风险等级相关专业性词汇、属于、标准编号或其它编号、部门名称类、数值类、量化单位类。名称类、数值类。,1,DangerSource,危险源,"风险辨识与分级包含在施工过程中所有的危险源,并按照法律法规的要求对其
+进行分级,并说明其应对措施。如果页面采用横向布置,本章保留标题,",危险源;风险源;危害因素;安全隐患;事故隐患;危险因素;风险点,
+2,overview,工程概况,6,RiskLevel,风险辨识与分级,危害隐患性词汇类、法规名称类、标准编号类。风险等级相关专业性词汇、属于、标准编号或其它编号、部门名称类、数值类、量化单位类。名称类、数值类。,2,ClassificationAndResponseMeasures,分级与应对措施,"风险辨识与分级包含在施工过程中所有的危险源,并按照法律法规的要求对其
+进行分级,并说明其应对措施。如果页面采用横向布置,本章保留标题,",风险等级;重大风险;较大风险;一般风险;应对措施;LEC;风险分级;风险评估,
+2,overview,工程概况,7,Stakeholders,参建各方责任主体单位,名称类、数值类。,1,UnitType,单位类型,"参建各方责任主体单位主要描述该项目的建设单位、设计单位、监理单位、施
+工单位、监控单位、专业分包单位的名称。",建设单位;设计单位;监理单位;施工单位;参建单位;总承包;社会信用代码,
+3,plan,施工计划,1,Schedule,施工进度计划,关键工程节点安排、施工进度计划横道图、进度控制点、里程碑事件、工序搭接关系、工期延误风险、进度调整机制、施工流水节拍、网络计划技术(如双代号网络图),2,KeyProjectNodeArrangement,关键工程(工序)节点安排,主要工程(工序)节点的起止时间和持续时间、聚焦影响总工期的关键工序(如基础浇筑、主体封顶)、是进度控制的核心;,关键节点;里程碑;关键工序;主要节点;节点工期;关键线路,
+3,plan,施工计划,1,Schedule,施工进度计划,、关键工程节点安排、施工进度计划横道图、进度控制点、里程碑事件、工序搭接关系、工期延误风险、进度调整机制、施工流水节拍、网络计划技术(如双代号网络图),3,ConstructionScheduleGanttChart,施工进度计划横道图等,施工进度计划横道图,包含施工进度计划横道图相关名词视为符合,直观展示进度安排的标准工具、需包含主要工序名称、起始时间、截止时间、持续时间、时间横道、责任人等信息;,横道图;进度横道;施工进度计划;甘特图;进度安排;时间计划,
+3,plan,施工计划,2,Materials,施工材料计划,名称类、规格类、数值类、数值单位类,1,ListOfConstructionMeasuresAndMaterials,施工措施材料清单,排除主题工程材料、施工措施材料应包含如临时支撑结构材料、辅助施工材料、非主体工程的挡防措施、作业平台处理、模板配置、人员上下通道、安全防护措施和安全防护用品等、详细列出材料名称、规格、数量、重量及来源(如厂家、经销商)、是材料计划的核心输出,措施材料;临时支撑材料;辅助材料;安全防护材料;模板;脚手架材料,
+3,plan,施工计划,3,Equipment,施工设备计划,设备名称类、规格类、数值类、数值单位类、时间日期类,1,MainConstructionMachineryAndEquipment,主要施工机械设备,列出关键设备(如起重吊装设备、混凝土浇筑设备、张拉压浆设备、人员升降设备、钻孔设备、隧道专用设备、监测监控设备、质量检查验收设备等)、明确其设备名称、规格(如额定功率)、数量及来源(自有或租赁);,施工机械;机械设备;起重机;泵车;钻机;吊装设备;设备清单;主要机械,
+3,plan,施工计划,4,Workforce,劳动力计划,工种名称类、时间日期类、数值类、数值单位类,1,WorkforceAllocationPlan,劳动力配置计划,【工种与人数维度】:文本或表格中必须按不同的技术工种(如操作手、电工、普工等)列出对应的人员数量。,劳动力;工种投入;工人配置;班组;劳动力计划;人员配置计划,
+3,plan,施工计划,4,Workforce,劳动力计划,工种名称类、时间日期类、数值类、数值单位类,2,StageLaborDemand,阶段劳动力需求,【时间阶段拆解维度(核心红线)】:人员的投入计划必须与项目的推进时间轴挂钩。文本或表格中必须明确体现“各阶段”的劳动力分布情况(特征词:第X月、X季度、上旬/下旬、前期/中期/后期、或具体的年/月时间段)。仅列出工种总人数而无任何阶段划分的,直接判定为严重缺失。,劳动力峰值;阶段用工;月劳动力;劳动力需求;用工高峰,
+3,plan,施工计划,5,SafetyCost,安全生产费用使用计划,名称类、金额类、货币数值类、货币单位类、不能将项目总的安全生产费用列入,1,CategoryOfSafetyProductionExpenses,安全生产费用类别,"1. 【明细要素完整】:文本或表格中必须明确列出费用的“名称”、“类别”以及量化的“单项投入金额”。
+2. 【总额汇总】:必须包含明确的“安全生产费用总额”或“合计金额”。
+3. 【范围合规界定】:提取的费用必须是针对“本方案/本工序”的局部投入。如果文本中明确出现了“本项目总计”、“标段安全总费用”等将整个工程宏观安全费用混入的词汇,视为严重违规。
+4. 【金额防伪校验(彩蛋任务)】:请在提取数据的同时,简单核对各单项金额相加的总和,与文本填写的“合计总额”在数量级上是否发生严重背离(如少写/多写一个零)。",安全费用类别;安全生产费用;安全投入;安全经费;财资〔2022〕136号,
+3,plan,施工计划,5,SafetyCost,安全生产费用使用计划,名称类、金额类、货币数值类、货币单位类、不能将项目总的安全生产费用列入,2,SecurityFeeName,安全费用名称,安全费用名称具体(如“施工现场临时用电系统改造”“应急救援器材采购”)、避免模糊表述;,安全费用名称;安全防护费;应急救援费;临时用电改造;安全器材采购,
+3,plan,施工计划,5,SafetyCost,安全生产费用使用计划,名称类、金额类、货币数值类、货币单位类、不能将项目总的安全生产费用列入,3,SingleInvestmentAmount,单项投入金额,单项投入金额即每项费用的具体数值(如“临时防护栏杆采购:5万元”)、确保费用可量化;,单项金额;费用金额;万元;单项投入;单项安全费,
+3,plan,施工计划,5,SafetyCost,安全生产费用使用计划,名称类、金额类、货币数值类、货币单位类、不能将项目总的安全生产费用列入,4,TotalSafetyProductionExpenses,安全生产费用总额,根据工程规模、风险等级计算、确保足额投入,安全费用总额;总金额;安全投入合计;安全费总计,
+4,technology,施工工艺技术,1,MethodsOverview,主要施工方法概述,工艺名称类、施工专业词汇类、规格类、数值类、数值单位类,1,ConstructionTechnologySelection,施工工艺选择,主要施工方法概述应简要说明采取的主要施工工艺和施工方法,或为见附表,见附录,见详情类似表述视为符合,工艺选择;施工工艺;核心工艺;施工方法选择;工法,"当内容仅含""详见附表""、""详见另册""、""见附表""、""见另册""、""专详见另册""等通用索引说明时,视为本分类已有依据。"
+4,technology,施工工艺技术,1,MethodsOverview,主要施工方法概述,工艺名称类、施工专业词汇类、规格类、数值类、数值单位类,2,MainConstructionMethods,主要施工方法,"主要施工方法概述应简要说明采取的主要施工工艺和施工方法,或为见附表,见附录,见详情类似表述视为符合",施工方法;主要施工方法;关键做法;灌注桩;现浇;装配式;施工工法,"当内容仅含""详见附表""、""详见另册""、""见附表""、""见另册""、""专详见另册""等通用索引说明时,视为本分类已有依据。"
+4,technology,施工工艺技术,2,TechParams,技术参数,工程材料类名词、规格类、数值类、数值单位类、时间日期类、重量单位类,1,MaterialType,材料类型规格,术参数主要包含使用材料的类型、规格,材料类型;钢筋;混凝土;防水材料;钢材;主要材料,
+4,technology,施工工艺技术,2,TechParams,技术参数,工程材料类名词、规格类、数值类、数值单位类、时间日期类、重量单位类,2,MaterialSpecifications,主要设备名称,本参数主要设备的名称、型号、出厂时间、性能参数、自重等。,材料规格;型号;HRB400;C30;规格型号;材料尺寸,
+4,technology,施工工艺技术,3,PrepWork,施工准备,名称类、数值类、规格类、数值单位类、岗位名称类、时间日期类、工程设备类,1,MeasurementAndStakeout,测量放样,需明确测量的基准点、控制网设置、是施工定位的关键;,测量放样;控制网;轴线;基准点;放线;测量基准;坐标,
+4,technology,施工工艺技术,3,PrepWork,施工准备,名称类、数值类、规格类、数值单位类、岗位名称类、时间日期类、工程设备类,2,TemporaryWaterAndElectricityConsumption,临时水电用量,需计算施工期间的用水、用电量、,临时用水量;临时用电量;用水量;用电量;水电用量,
+4,technology,施工工艺技术,3,PrepWork,施工准备,名称类、数值类、规格类、数值单位类、岗位名称类、时间日期类、工程设备类,4,Staffing,人员,需列出各岗位的人员数量、是劳动力管理的核心;,人员配置;岗位人员;项目经理;施工员;人员配备;人员分工,
+4,technology,施工工艺技术,3,PrepWork,施工准备,名称类、数值类、规格类、数值单位类、岗位名称类、时间日期类、工程设备类,5,SafetyProtectionFacilities,安全防护措施,需列出现场的安全设施、是安全保障的基础;,安全防护;安全网;防护栏杆;消防设施;安全设施;防护措施,
+4,technology,施工工艺技术,3,PrepWork,施工准备,名称类、数值类、规格类、数值单位类、岗位名称类、时间日期类、工程设备类,5,Area,场地,需列出施工场地等介绍;,安全防护;安全网;防护栏杆;消防设施;安全设施;防护措施,
+4,technology,施工工艺技术,3,PrepWork,施工准备,名称类、数值类、规格类、数值单位类、岗位名称类、时间日期类、工程设备类,5,Equipment,设备,需列出施工设备等介绍;,安全防护;安全网;防护栏杆;消防设施;安全设施;防护措施,
+4,technology,施工工艺技术,3,PrepWork,施工准备,名称类、数值类、规格类、数值单位类、岗位名称类、时间日期类、工程设备类,6,PersonnelAccess,人员上下通道,需明确通道的形式、位置、是人员通行的安全保障。,人员通道;上下通道;楼梯通道;斜道;人员上下;通道布置,
+4,technology,施工工艺技术,4,Process,工艺流程,工序专业名称类、工程名称类、数值类、数值单位类,1,ConstructionProcess,工艺流程,"工艺流程包含整个方案的主要施工工序,按照施工的先后顺序,建议采用金山
+软件流程图或微软Visio进行绘制,工艺流程图采用无颜色填充,字体为五号或小
+五号。",施工工序;主要工序;工序流程;施工顺序;工艺步骤,
+4,technology,施工工艺技术,5,Operations,施工方法及操作要求,施工流程名称类、数值类、数值单位类,1,ConstructionProcessOperations,施工工序描述操作,需详细描述各工序的操作步骤、是操作指导的核心;,操作步骤;操作流程;施工步骤;操作方法;操作要求,
+4,technology,施工工艺技术,5,Operations,施工方法及操作要求,施工流程名称类、数值类、数值单位类,2,ConstructionPoints,施工要点,需明确工序的关键要求、是质量控制的关键;,施工要点;关键要求;质量关键;工艺要点;控制要点,
+4,technology,施工工艺技术,5,Operations,施工方法及操作要求,施工流程名称类、数值类、数值单位类,3,FAQPrevention,常见问题及预防,需列出工序的常见问题及预防措施、是风险防控的重点 ,常见问题;质量通病;预防措施;防治措施;常见缺陷;预防对策,
+4,technology,施工工艺技术,5,Operations,施工方法及操作要求,施工流程名称类、数值类、数值单位类,4,ProblemSolvingMeasures,问题处理措施,需明确问题的解决方法、是问题解决的指南;,问题处理;处理措施;整改措施;修复方法;缺陷处理,
+4,technology,施工工艺技术,6,Inspection,检查要求,工序检查内容、工序检查标准,3,ProcessInspectionContent,工序检查内容,【施工工序检查维度】:文本必须涵盖该方案主要施工步骤(如安装、浇筑、张拉等)的过程检查内容。,工序检查;检查内容;检查项目;工序检验;检查清单,
+4,technology,施工工艺技术,6,Inspection,检查要求,工序检查内容、工序检查标准,4,ProcessInspectionStandards,工序检查标准,【量化标准有效性(红线)】:针对上述检查内容,文本必须提供具体的“检查标准”。特征表现为明确的量化允许偏差(如±Xmm)、强度指标(如100%)、或明确引用的国家/行业验收规范条款编号。,检查标准;验收标准;允许偏差;检查合格;偏差限值,
+5,safety,安全保证措施,1,SafetySystem,安全保证体系,流程体系类名词、标准文书类、标标准编号编码数字类,1,SafetyProductionAssuranceSystemFrameworkDiagram,安全生产保证体系框图,含安全生产保证体系框图关键字,及类似表述,视为符合,类似出现这种;见附表,详情,详见附表,专详见另册及类似描述视为符合! 这种表述视为符合,安全保证体系;安全体系框图;安全管理体系框图;安全组织体系,"当内容仅含""详见附表""、""详见另册""、""见附表""、""见另册""、""专详见另册""等通用索引说明时,视为本分类已有依据。"
+5,safety,安全保证措施,2,Organization,组织保证措施,名词类、人名类、岗位名称类、制度名词类,1,SafetymanagementOrganization,安全管理组织机构,基于项目经理为组长的安全工作领导小组、关注岗位组织架构名称类、部门名称类、关系结构类名词;,安全管理组织;安全领导小组;安全管理机构;安全管理组织机构,
+5,safety,安全保证措施,2,Organization,组织保证措施,名词类、人名类、岗位名称类、制度名词类,2,PersonnelSafetyResponsibilities,人员安全职责,关注岗位名称类、人名类、责任制度名词类、岗位职责名词类、安全制度名词类;,安全职责;人员安全责任;岗位安全;安全责任制,
+5,safety,安全保证措施,3,TechMeasures,技术保证措施,施工专业名词类、工序名称类 、施工设备名称类、施工材料名称类、施工场地名称类、岗位名称类,1,OverallSecurityMeasures,总体安全措施,"总体安全措施按主要工序的安全保证措施进行梳理和说明,
+包含保证施工过程中主要工序的人员、材料、机械设备安全所采取的技术措施,以
+及材料运输、吊装,施工作业区域的临边、临空、洞口安全防护设施、安全母绳布
+置,人员上下(横向)通道布置等。",总体安全措施;临边防护;洞口防护;安全母绳;安全防护设施布置,
+5,safety,安全保证措施,4,Monitoring,监测监控措施,组织机构名称类、施工区域名称类、监测专业名词类、施工场地名称类、设备名称类、数值类、数值单位类、岗位名称类,1,MonitoringOrganization,监测组织机构,监测监控的责任主体、需明确监测人员的资质(如注册安全工程师、监测技术员)及职责(如数据采集、分析、报告)、确保监测工作的专业性;,监测机构;监测人员;监测责任;监测组织机构;监测负责人,
+5,safety,安全保证措施,4,Monitoring,监测监控措施,组织机构名称类、施工区域名称类、监测专业名词类、施工场地名称类、设备名称类、数值类、数值单位类、岗位名称类,2,MonitoringRange,监测范围,需覆盖施工区域内的所有风险点(如深基坑周边、高支模体系、临时用电线路)、避免遗漏;,监测范围;监测区域;监测覆盖范围;监测对象,
+5,safety,安全保证措施,4,Monitoring,监测监控措施,组织机构名称类、施工区域名称类、监测专业名词类、施工场地名称类、设备名称类、数值类、数值单位类、岗位名称类,3,MonitoringItems,监测项目,需明确监测的具体内容(如深基坑的水平位移、高支模的立杆轴力、临时用电的电压电流)、是监测的核心;,监测项目;监测内容;水平位移;沉降监测;监测指标,
+5,safety,安全保证措施,4,Monitoring,监测监控措施,组织机构名称类、施工区域名称类、监测专业名词类、施工场地名称类、设备名称类、数值类、数值单位类、岗位名称类,4,MonitoringPointSettings,监测点设置,需根据风险点的分布确定(如深基坑每10米设置一个位移监测点)、需符合《建筑基坑支护技术规程》(JGJ 120-2012)等行业标准;,监测点;测点布置;监测布点;测点位置,
+5,safety,安全保证措施,4,Monitoring,监测监控措施,组织机构名称类、施工区域名称类、监测专业名词类、施工场地名称类、设备名称类、数值类、数值单位类、岗位名称类,5,MonitoringInstrumentsAndEquipment,监测仪器设备,需明确仪器的名称(如全站仪、测斜仪、应力传感器)、型号(如徕卡TS60全站仪)及精度(如0.5秒级)、确保数据的准确性;,监测仪器;全站仪;测斜仪;应力传感器;监测设备;仪器型号,
+5,safety,安全保证措施,4,Monitoring,监测监控措施,组织机构名称类、施工区域名称类、监测专业名词类、施工场地名称类、设备名称类、数值类、数值单位类、岗位名称类,6,MonitoringMethods,监测方法,需明确数据采集的方式(如人工读数、自动采集)、及数据处理方法(如统计分析、趋势预测)、是监测的关键环节;,监测方法;数据采集;人工读数;自动采集;数据处理,
+5,safety,安全保证措施,4,Monitoring,监测监控措施,组织机构名称类、施工区域名称类、监测专业名词类、施工场地名称类、设备名称类、数值类、数值单位类、岗位名称类,7,MonitoringFrequency,监测频率,需明确监测频率、(如深基坑每天一次、高支模每周两次)。,监测频率;监测周期;每天一次;每周两次;监测时间间隔,
+5,safety,安全保证措施,4,Monitoring,监测监控措施,组织机构名称类、施工区域名称类、监测专业名词类、施工场地名称类、设备名称类、数值类、数值单位类、岗位名称类,8,WarningValuesAndControlValues,预警值及控制值,需根据设计文件及行业标准确定(如深基坑水平位移预警值为30mm、控制值为50mm)、是判断风险的重要依据;,预警值;控制值;报警值;监测阈值;预警指标;预警控制,
+5,safety,安全保证措施,4,Monitoring,监测监控措施,组织机构名称类、施工区域名称类、监测专业名词类、施工场地名称类、设备名称类、数值类、数值单位类、岗位名称类,9,InformationFeedbackMechanism,信息反馈机制,监测数据的传递流程(如监测人员→项目安全部→项目经理→公司总部)、需明确反馈的时间要求(如实时反馈、每日汇总)、确保风险及时处理。,信息反馈;监测报告;数据反馈;反馈流程;监测信息传递,
+5,safety,安全保证措施,5,Emergency,应急处置措施,事故名称类、救援器材类、机构名称类、数字类、数值单位类。,1,EmergencyProcedures,应急处置程序,应采用公司标准应急处理程序图(附件16)、应急响应的步骤流程(如“事故报告→现场警戒→人员疏散→救援实施→善后处理”)、需明确每一步的责任部门及时间要求、确保响应及时;,应急程序;应急流程;应急响应;应急处置程序;处置步骤,
+5,safety,安全保证措施,5,Emergency,应急处置措施,事故名称类、救援器材类、机构名称类、数字类、数值单位类。,2,EmergencyMeasures,应急处置措施,应根据方案实施过程潜在的危险源、判断出可能造成的伤害类型、制定出有针对性的救援措施、保证在事故发生后伤者能得到有效和及时的救治、如触电、有毒有害气体中毒、高处坠落、物体打击、施工现场及驻地火灾等事故、针对不同类型事故的具体处理方法(如“火灾事故使用干粉灭火器扑救”“坍塌事故使用千斤顶支撑”)、需明确操作要点(如灭火器的使用方法、千斤顶的支撑位置)、确保救援有效;,应急措施;救援措施;应急处置;紧急处置;事故救援;触电;中毒;坍塌,
+5,safety,安全保证措施,5,Emergency,应急处置措施,事故名称类、救援器材类、机构名称类、数字类、数值单位类。,3,EmergencySuppliesAndEquipmentSupport,应急物资及设备保障,应根据事故的不同、以表格的形式说明救援的物品名称、规格型号、单位、数量、监管人、联系电话等内容、应急处置的物质基础、需明确物资的名称(如灭火器、急救箱、千斤顶)、数量(如每100平方米配备2个灭火器)、存放位置(如施工现场入口处)及维护要求(如每月检查一次灭火器压力)、确保物资随时可用;,应急物资;应急设备;救援器材;灭火器;急救箱;应急保障,
+5,safety,安全保证措施,5,Emergency,应急处置措施,事故名称类、救援器材类、机构名称类、数字类、数值单位类。,4,TrafficmanagementAndMedicalRescue,交通疏导与医疗救援,应以表格的形式明确施工工点附近的医疗救援机构名称、联系电话、距离等、并附应急救援线路图;,医疗救援;交通疏导;救援线路;医院联系;急救电话;应急救援路线,
+5,safety,安全保证措施,5,Emergency,应急处置措施,事故名称类、救援器材类、机构名称类、数字类、数值单位类。,5,PostDisposal,后期处置,包括善后处理、调查与评估、恢复生产等三个方面、事故后的恢复工作、需明确善后处理(如伤亡人员家属安抚、财产损失统计)、事故调查(如原因分析、责任认定评估)及整改措施(如完善安全制度、加强培训)、避免事故重复发生;,后期处置;善后处理;事故调查;恢复生产;善后工作;事故评估,
+6,quality,质量保证措施,1,QualitySystem,质量保证体系,组织机构名称类、岗位名称类、岗位职责词汇类。,2,QualitymanagementOrganization,人员职责,基于项目经理为组长的工作领导小组、小组中包括项目经理、项目总工、质量总监、工程部门、质检部门、专业分包单位(协作队伍)项目负责人和项目技术负责人等、需明确层级(如公司级、项目级、班组级)及组成部门(如质量部、工程部、技术部)、形成“横向到边、纵向到底”的管理网络;,质量管理组织;质量领导小组;质检人员;质量总监;质量体系组织,
+6,quality,质量保证措施,1,QualitySystem,质量保证体系,组织机构名称类、岗位名称类、岗位职责词汇类。,3,PersonnelResponsibilities,质量保证体系框图,含质量保证体系框图关键字,及类似表述,视为符合,类似出现这种;见附表,详情,详见附表,专详见另册及类似描述视为符合! 这种表述视为符合,质量职责;质量责任制;岗位质量责任;质量保证体系框图,"当内容仅含""详见附表""、""详见另册""、""见附表""、""见另册""、""专详见另册""等通用索引说明时,视为本分类已有依据。"
+6,quality,质量保证措施,2,QualityGoals,质量目标,目标标准词汇类、合同条款类、具体工程名称类、量化数值类、数值单位类。,1,DecompositionOfQualityObjectives,质量目标分解,根据施工合同和业主要求填写、需将总目标拆解为分部(基础、主体、装饰)、分项工程的具体目标(如“主体结构混凝土强度合格率100%”)、是目标落地的关键;,质量目标分解;分项质量;质量指标;质量目标分项,
+6,quality,质量保证措施,3,Excellence,工程创优规划,工程创优总体计划、技术准备(BIM/新技术应用)、过程控制(关键工序精品打造)、细部处理(节点优化)、精品工程创建、新技术推广(四新技术)、申报资料编制、工程资料归档、创优考核机制,7,EngineeringDataArchiving,工程创优规划要求,"1、广泛开展QC小组及创优质样板工程活动,通过广泛的论证、分析和研究,确保工程质量得到有效控制。 
+2、在施工前,组织有关人员认真学习新技术、新工艺、新材料、新设备、新测试方法的技术要点,并认真进行技术交底,确保在施工中正确应用,提高工程质量。
+3、施工后总结评比。使广大技术人员熟悉和掌握有关的施工规范、规程和质量标准。在施工中,加强质量监督和技术指导,确保工程质量。",工程资料归档;档案管理;竣工资料;资料归档,
+6,quality,质量保证措施,4,QualityControl,质量控制程序与具体措施,原材料检查验收(三证一检)、实体工程质量验收(分项/分部工程验收)、质量通病防治(墙面空鼓/屋面渗漏)、季节性施工质量控制(冬期混凝土保温/雨期防水)、工序质量控制点、质量检查程序(自检/互检/专检)、质量问题整改(闭环管理),1,RawMaterialInspection,原材料检查验收,需执行“三证一检”(合格证、质检报告、生产许可证+进场复检)、确保材料质量;,原材料进场;三证一检;材料检验;复检报告;进场材料质量,
+6,quality,质量保证措施,4,QualityControl,质量控制程序与具体措施,原材料检查验收(三证一检)、实体工程质量验收(分项/分部工程验收)、质量通病防治(墙面空鼓/屋面渗漏)、季节性施工质量控制(冬期混凝土保温/雨期防水)、工序质量控制点、质量检查程序(自检/互检/专检)、质量问题整改(闭环管理),2,PhysicalProjectQualityAcceptance,实体工程质量验收,需按分项(如“钢筋绑扎”)、分部工程(如“基础工程”)进行验收、符合规范要求;,实体验收;分项验收;分部验收;实体工程验收;工程质量验收,
+6,quality,质量保证措施,4,QualityControl,质量控制程序与具体措施,原材料检查验收(三证一检)、实体工程质量验收(分项/分部工程验收)、质量通病防治(墙面空鼓/屋面渗漏)、季节性施工质量控制(冬期混凝土保温/雨期防水)、工序质量控制点、质量检查程序(自检/互检/专检)、质量问题整改(闭环管理),3,PreventionAndControlOfCommonQualityDefectsInProcesses,工序质量通病防治,需针对常见问题(如“墙面空鼓”“屋面渗漏”)制定专项措施(如“抹灰前基层凿毛”“防水附加层施工”)、减少质量缺陷;,质量通病;空鼓;渗漏;裂缝;蜂窝麻面;防治措施;通病防治,
+6,quality,质量保证措施,4,QualityControl,质量控制程序与具体措施,原材料检查验收(三证一检)、实体工程质量验收(分项/分部工程验收)、质量通病防治(墙面空鼓/屋面渗漏)、季节性施工质量控制(冬期混凝土保温/雨期防水)、工序质量控制点、质量检查程序(自检/互检/专检)、质量问题整改(闭环管理),4,SeasonalConstructionQualityAssuranceMeasures,季节性施工质量保证措施,需针对冬期(混凝土保温)、雨期(防水加强)、高温(混凝土保湿)制定专项措施、确保施工质量;,季节性施工;冬期施工;雨期施工;高温施工;夏季施工;冬季混凝土,
+7,environment,环境保证措施,1,EnvSystem,环境保证体系,环境保证体系框图、公司标准体系引用,1,BlockDiagramOfEnvironmentalAssuranceSystem,环境保证体系框图,含环境保证体系框图关键字,及类似表述,视为符合,类似出现这种;见附表,详情,详见附表,专详见另册及类似描述视为符合! 这种表述视为符合,环境保证体系;环境管理体系框图;环境保证体系框图,"当内容仅含""详见附表""、""详见另册""、""见附表""、""见另册""、""专详见另册""等通用索引说明时,视为本分类已有依据。"
+7,environment,环境保证措施,2,EnvOrg,环境保护组织机构,环境保护组织架构、管理人员姓名、管理人员职务、管理人员职责、环境管理岗位责任、责任考核机制、环境管理职责分工、环境管理人员资质、环境管理沟通机制,1,EnvironmentalAssuranceSystemFramework,环境保护组织架构,"环境保护组织机构包含管理人员姓名、职务、职责。环境管理组织机构基于项
+目经理为组长的工作领导小组,小组中包括项目经理、项目副经理、项目总工、工
+程部门、质检部门、安全环保部门、专业分包单位(协作队伍)项目负责人和项目
+技术负责人等。",环境保护组织;环境管理机构;环境管理组织架构;环境领导小组,
+7,environment,环境保证措施,2,EnvOrg,环境保护组织机构,环境保护组织架构、管理人员姓名、管理人员职务、管理人员职责、环境管理岗位责任、责任考核机制、环境管理职责分工、环境管理人员资质、环境管理沟通机制,2,EnvironmentalmanagementJobResponsibilities,环境管理岗位责任,"环境保护组织机构包含管理人员姓名、职务、职责。环境管理组织机构基于项
+目经理为组长的工作领导小组,小组中包括项目经理、项目副经理、项目总工、工
+程部门、质检部门、安全环保部门、专业分包单位(协作队伍)项目负责人和项目
+技术负责人等。",环境职责;环保岗位;环境管理责任;环保责任,
+7,environment,环境保证措施,3,EnvProtection,环境保护及文明施工措施,办公生活区环境卫生管理、生活垃圾分类处置、卫生防疫措施、饮用水安全保障、施工区域水土流失防治、截排水系统设计、边坡防护工程、沉沙池设置、噪声排放监测、低噪声设备选型、隔音屏障设置、施工时间管控、污水沉淀处理、油污隔离措施、废水检测达标、扬尘控制、废气净化处理、清洁能源使用、裸土覆盖、车辆冲洗设施。,1,EnvironmentalSanitationGuaranteeMeasuresForOfficeAndLivingAreas,办公生活区环境卫生保证措施,需明确责任分工(如保洁人员配置、卫生区域划分)及管理流程(如每日清扫、每周检查)、确保环境整洁;,环境卫生;生活区;办公区;生活垃圾;卫生防疫;饮用水,
+7,environment,环境保证措施,3,EnvProtection,环境保护及文明施工措施,办公生活区环境卫生管理、生活垃圾分类处置、卫生防疫措施、饮用水安全保障、施工区域水土流失防治、截排水系统设计、边坡防护工程、沉沙池设置、噪声排放监测、低噪声设备选型、隔音屏障设置、施工时间管控、污水沉淀处理、油污隔离措施、废水检测达标、扬尘控制、废气净化处理、清洁能源使用、裸土覆盖、车辆冲洗设施。,2,SoilAndWaterConservationMeasuresInTheConstructionArea,施工区域水土流失防治措施,需通过“截(截水沟)、排(排水沟)、拦(拦挡坝)、护(边坡防护)”综合措施、减少雨水对裸露土壤的冲刷;,水土流失;边坡防护;截排水;沉沙池;水土保持;拦挡,
+7,environment,环境保证措施,3,EnvProtection,环境保护及文明施工措施,办公生活区环境卫生管理、生活垃圾分类处置、卫生防疫措施、饮用水安全保障、施工区域水土流失防治、截排水系统设计、边坡防护工程、沉沙池设置、噪声排放监测、低噪声设备选型、隔音屏障设置、施工时间管控、污水沉淀处理、油污隔离措施、废水检测达标、扬尘控制、废气净化处理、清洁能源使用、裸土覆盖、车辆冲洗设施。,3,NoiseEmissionMonitoring,噪声排放监测,需在施工现场边界设置监测点、每日监测1次、记录等效声级(Leq)和最大声级(Lmax);,噪声监测;噪声排放;等效声级;噪音控制;GB 12523;声级,
+7,environment,环境保证措施,3,EnvProtection,环境保护及文明施工措施,办公生活区环境卫生管理、生活垃圾分类处置、卫生防疫措施、饮用水安全保障、施工区域水土流失防治、截排水系统设计、边坡防护工程、沉沙池设置、噪声排放监测、低噪声设备选型、隔音屏障设置、施工时间管控、污水沉淀处理、油污隔离措施、废水检测达标、扬尘控制、废气净化处理、清洁能源使用、裸土覆盖、车辆冲洗设施。,4,WaterPollutionPreventionAndControlMeasures,水污染防治措施,需在搅拌机、运输车清洗处设置沉淀池、施工废水经沉淀后回用(如洒水降尘)、避免直接排入市政管网;,水污染;废水处理;污水沉淀;沉淀池;废水排放;污水处理,
+7,environment,环境保证措施,3,EnvProtection,环境保护及文明施工措施,办公生活区环境卫生管理、生活垃圾分类处置、卫生防疫措施、饮用水安全保障、施工区域水土流失防治、截排水系统设计、边坡防护工程、沉沙池设置、噪声排放监测、低噪声设备选型、隔音屏障设置、施工时间管控、污水沉淀处理、油污隔离措施、废水检测达标、扬尘控制、废气净化处理、清洁能源使用、裸土覆盖、车辆冲洗设施。,5,AirPollutionPreventionAndControlMeasures,大气污染防治措施,需采取“洒水降尘、裸土覆盖、车辆冲洗、道路硬化”等措施、确保施工现场目测扬尘高度小于1.5m(土方作业阶段)或0.5m(结构施工阶段)。,扬尘;大气污染;尘土;车辆冲洗;裸土覆盖;废气排放;扬尘控制,
+8,management,施工管理及作业人员配备与分工,1,Managers,施工管理人员,施工管理人员名单、岗位职责清单、管理职责分解、管理权限划分、管理流程衔接。,1,ConstructionmanagementPersonnelList,施工管理人员名单,"以表格的形式说明管理人员名单及岗位职责,如项目经理、项目
+书记、项目总工、项目副经理、质量总监、安全总监、各职能部门、主管技术员、
+测量员、质检员,以及专业分包单位(协作队伍)项目负责人和项目技术负责人等。 这种表述视为符合,下面条件",管理人员名单;项目经理;项目总工;施工管理人员;人员信息表,
+8,management,施工管理及作业人员配备与分工,1,Managers,施工管理人员,施工管理人员名单、岗位职责清单、管理职责分解、管理权限划分、管理流程衔接。,2,JobResponsibilitiesList,施工管理人员岗位职责,需细化每个管理岗位的职责(如项目经理的“项目全面管理”职责、技术负责人的“技术方案审核”职责)、避免职责模糊导致的管理漏洞;,岗位职责;职责清单;管理岗位职责;岗位分工;职责分解,
+8,management,施工管理及作业人员配备与分工,2,SafetyStaff,专职安全生产管理人员,专职安全生产管理人员名单、安全生产考核合格证书、证书编号、证书有效期、安全岗位职责、安全责任追究。,1,ListOfFullTimeSafetyProductionmanagementPersonnel,专职安全生产管理人员名单,专职安全生产管理人员、特种作业人员均以表格的形式说明人员姓名、证书类型、证书编号、有效期、岗位职责等内容,,专职安全员;专职安全管理人员;安全员名单;安全管理人员名单,
+8,management,施工管理及作业人员配备与分工,3,SpecialWorkers,特种作业人员,特种作业人员名单、特种作业操作资格证书、证书编号、证书有效期、特种作业工种、岗位职责、证书延期复核、违章作业记录。,1,ListOfSecialOperationsPersonnel,特种作业人员名单,需以表格形式明确特种作业人员(如建筑电工、建筑架子工、建筑起重机械司机等)的姓名、工种及联系方式、是特种作业管理的基础台账;,特种作业人员;特种作业;电工;架子工;起重机司机;焊工;特种人员名单,
+8,management,施工管理及作业人员配备与分工,4,OtherWorkers,其它作业人员,专业分包单位管理人员数量、不同工种作业人员数量、作业人员台账、工种分类统计。,3,WorkersLlog,其它作业人员名单,其他作业人员包含专业分包单位(协作队伍)管理人员数量,不同工种(班组、区域)的作业人员数量等。,作业人员台账;工人信息;人员档案;实名制;人员登记,
+9,acceptance,验收要求,3,Content,验收内容,安全生产条件验收(安全防护设施验收、临时用电验收)、资源配置验收(人员配置验收、设备配置验收)、施工工艺验收(模板安装工艺验收、混凝土浇筑工艺验收)、机械设备验收(塔式起重机验收、混凝土泵车验收)、临时支撑结构验收(脚手架验收、满堂支架验收)、人员操作平台验收(高空作业平台验收、操作脚手架验收)、安全防护设施验收(安全网验收、防护栏杆验收),1,SafetyProductionConditionAcceptance,安全生产条件验收,验收表格中要明确项目的具体验收标准、验收标准应尽量量化到具体参数或标准、需细化具体内容(如“安全防护设施验收”包括“安全网张挂验收”“防护栏杆安装验收”)、避免“安全生产验收”等泛化表述;,安全生产条件验收;安全验收;安全防护验收;临时用电验收,
+9,acceptance,验收要求,3,Content,验收内容,安全生产条件验收(安全防护设施验收、临时用电验收)、资源配置验收(人员配置验收、设备配置验收)、施工工艺验收(模板安装工艺验收、混凝土浇筑工艺验收)、机械设备验收(塔式起重机验收、混凝土泵车验收)、临时支撑结构验收(脚手架验收、满堂支架验收)、人员操作平台验收(高空作业平台验收、操作脚手架验收)、安全防护设施验收(安全网验收、防护栏杆验收),2,ResourceAllocationAcceptance,资源配置验收,验收表格中要明确项目的具体验收标准、验收标准应尽量量化到具体参数或标准、需关联资源类型(如“人员配置验收”包括“特种作业人员资质验收”“管理人员到位验收”)、体现资源的针对性;,资源配置验收;人员配置验收;设备配置验收;资源验收,
+9,acceptance,验收要求,3,Content,验收内容,安全生产条件验收(安全防护设施验收、临时用电验收)、资源配置验收(人员配置验收、设备配置验收)、施工工艺验收(模板安装工艺验收、混凝土浇筑工艺验收)、机械设备验收(塔式起重机验收、混凝土泵车验收)、临时支撑结构验收(脚手架验收、满堂支架验收)、人员操作平台验收(高空作业平台验收、操作脚手架验收)、安全防护设施验收(安全网验收、防护栏杆验收),3,ConstructionProcessAcceptance,施工工艺验收,验收表格中要明确项目的具体验收标准、验收标准应尽量量化到具体参数或标准、需明确工艺环节(如“模板安装工艺验收”包括“模板垂直度验收”“模板拼接缝验收”)、强调工艺的标准化;,施工工艺验收;模板安装验收;工艺验收;施工技术验收,
+9,acceptance,验收要求,3,Content,验收内容,安全生产条件验收(安全防护设施验收、临时用电验收)、资源配置验收(人员配置验收、设备配置验收)、施工工艺验收(模板安装工艺验收、混凝土浇筑工艺验收)、机械设备验收(塔式起重机验收、混凝土泵车验收)、临时支撑结构验收(脚手架验收、满堂支架验收)、人员操作平台验收(高空作业平台验收、操作脚手架验收)、安全防护设施验收(安全网验收、防护栏杆验收),4,AcceptanceOfMechanicalEquipment,机械设备验收,验收表格中要明确项目的具体验收标准、验收标准应尽量量化到具体参数或标准、需指向具体设备(如“塔式起重机验收”包括“设备型号验收”“安全装置验收”)、确保设备符合施工要求。,机械设备验收;设备验收;起重机验收;机械验收,
+9,acceptance,验收要求,3,Content,验收内容,安全生产条件验收(安全防护设施验收、临时用电验收)、资源配置验收(人员配置验收、设备配置验收)、施工工艺验收(模板安装工艺验收、混凝土浇筑工艺验收)、机械设备验收(塔式起重机验收、混凝土泵车验收)、临时支撑结构验收(脚手架验收、满堂支架验收)、人员操作平台验收(高空作业平台验收、操作脚手架验收)、安全防护设施验收(安全网验收、防护栏杆验收),5,TemporarySupportStructure,临时支撑结构验收,验收表格中要明确项目的具体验收标准、验收标准应尽量量化到具体参数或标准、专项施工方案及审批记录、技术交底记录、构配件质量证明文件(合格证/检测报告)、地基承载力报告、搭设过程检查记录、荷载试验报告(高支模/大跨度)、验收记录表(含实测数据/影像资料)、整改复查记录。,临时支撑验收;脚手架验收;满堂支架验收;支架验收;临时结构验收,
+9,acceptance,验收要求,3,Content,验收内容,安全生产条件验收(安全防护设施验收、临时用电验收)、资源配置验收(人员配置验收、设备配置验收)、施工工艺验收(模板安装工艺验收、混凝土浇筑工艺验收)、机械设备验收(塔式起重机验收、混凝土泵车验收)、临时支撑结构验收(脚手架验收、满堂支架验收)、人员操作平台验收(高空作业平台验收、操作脚手架验收)、安全防护设施验收(安全网验收、防护栏杆验收),6,PersonnelOperationPlatform,人员操作平台验收,验收表格中要明确项目的具体验收标准、验收标准应尽量量化到具体参数或标准、架体材质(如钢管无裂纹、弯曲、型钢无开焊);架体构造(立杆间距、剪刀撑设置、连墙件固定);稳定性(移动式平台刹车装置、落地式平台基础坚实度);荷载限制(平台荷载不超过设计值、悬挂限载标志);防护栏杆(高度≥1.2m、竖向栏杆间距≤1.5m、底部设挡脚板);平台铺板(满铺、固定、无空隙);登高扶梯(防滑、固定、与平台连接牢固);安全网(平台周边设置密目网或安全平网)。,操作平台验收;人员平台;高空作业平台验收;施工平台验收,
+9,acceptance,验收要求,3,Content,验收内容,安全生产条件验收(安全防护设施验收、临时用电验收)、资源配置验收(人员配置验收、设备配置验收)、施工工艺验收(模板安装工艺验收、混凝土浇筑工艺验收)、机械设备验收(塔式起重机验收、混凝土泵车验收)、临时支撑结构验收(脚手架验收、满堂支架验收)、人员操作平台验收(高空作业平台验收、操作脚手架验收)、安全防护设施验收(安全网验收、防护栏杆验收),7,SafetyProtectionFacilities,安全防护措施验收,验收表格中要明确项目的具体验收标准、验收标准应尽量量化到具体参数或标准、需结合场景需求(如建筑施工中的基坑临边防护、电梯井防护门)、功能定位(如预防事故的防护栏杆、减少事故影响的安全网)、技术要求(如材质、构造、固定方式)。其核心逻辑是“隔离危险、承接冲击、提醒注意”,安全防护验收;防护设施验收;安全网验收;防护栏杆验收,
+9,acceptance,验收要求,5,Personnel,验收人员,建设单位验收人员(如建设单位项目负责人、建设单位技术负责人)、设计单位验收人员(如设计单位项目负责人、设计单位专业工程师)、施工单位验收人员(如施工单位项目经理、施工单位技术负责人)、监理单位验收人员(如总监理工程师、专业监理工程师)、监测单位验收人员(如监测项目负责人、监测技术员),1,AcceptancePersonnelOfTheConstructionUnit,建设单位验收人员,需明确具体角色(如“建设单位项目负责人”)、避免“建设单位人员”等泛化表述;由施工作业班组在施工过程中自行对照方案自检、施工完成后由方案编制负责人、项目经理、项目副经理、项目技术负责人、安全环保处、工程处、机料处、合同处、专业分包单位(协作队伍)项目负责人和项目技术负责人等部门人员参加方案验收。,建设单位验收人员;业主验收;建设单位项目负责人;甲方验收,
+9,acceptance,验收要求,5,Personnel,验收人员,建设单位验收人员(如建设单位项目负责人、建设单位技术负责人)、设计单位验收人员(如设计单位项目负责人、设计单位专业工程师)、施工单位验收人员(如施工单位项目经理、施工单位技术负责人)、监理单位验收人员(如总监理工程师、专业监理工程师)、监测单位验收人员(如监测项目负责人、监测技术员),2,DesignUnitAcceptancePersonnel,设计单位验收人员,需明确验收人员姓名、关联专业(如“设计单位专业工程师”)、体现设计的专业性;由施工作业班组在施工过程中自行对照方案自检、施工完成后由方案编制负责人、项目经理、项目副经理、项目技术负责人、安全环保处、工程处、机料处、合同处、专业分包单位(协作队伍)项目负责人和项目技术负责人等部门人员参加方案验收。,设计单位验收;设计单位人员;设计师验收;设计验收,
+9,acceptance,验收要求,5,Personnel,验收人员,建设单位验收人员(如建设单位项目负责人、建设单位技术负责人)、设计单位验收人员(如设计单位项目负责人、设计单位专业工程师)、施工单位验收人员(如施工单位项目经理、施工单位技术负责人)、监理单位验收人员(如总监理工程师、专业监理工程师)、监测单位验收人员(如监测项目负责人、监测技术员),3,ConstructionUnitAcceptancePersonnel,施工单位验收人员,需明确验收人员姓名、指向管理岗位(如“施工单位项目经理”“施工单位技术负责人”)、强调施工单位的主体责任;由施工作业班组在施工过程中自行对照方案自检、施工完成后由方案编制负责人、项目经理、项目副经理、项目技术负责人、安全环保处、工程处、机料处、合同处、专业分包单位(协作队伍)项目负责人和项目技术负责人等部门人员参加方案验收。,施工单位验收;施工方验收;施工单位项目经理;施工验收人员,
+9,acceptance,验收要求,5,Personnel,验收人员,建设单位验收人员(如建设单位项目负责人、建设单位技术负责人)、设计单位验收人员(如设计单位项目负责人、设计单位专业工程师)、施工单位验收人员(如施工单位项目经理、施工单位技术负责人)、监理单位验收人员(如总监理工程师、专业监理工程师)、监测单位验收人员(如监测项目负责人、监测技术员),4,InspectionPersonnelOfTheSupervisionUnit,监理单位验收人员,需明确验收人员姓名、监理角色(如“总监理工程师”“专业监理工程师”)、体现监理的监督职责;由施工作业班组在施工过程中自行对照方案自检、施工完成后由方案编制负责人、项目经理、项目副经理、项目技术负责人、安全环保处、工程处、机料处、合同处、专业分包单位(协作队伍)项目负责人和项目技术负责人等部门人员参加方案验收。,监理单位验收;总监理工程师;监理人员;监理验收,
+9,acceptance,验收要求,5,Personnel,验收人员,建设单位验收人员(如建设单位项目负责人、建设单位技术负责人)、设计单位验收人员(如设计单位项目负责人、设计单位专业工程师)、施工单位验收人员(如施工单位项目经理、施工单位技术负责人)、监理单位验收人员(如总监理工程师、专业监理工程师)、监测单位验收人员(如监测项目负责人、监测技术员),5,MonitoringUnitAcceptancePersonnel,监测单位验收人员,需明确验收人员姓名、关联监测内容(如“监测项目负责人”“监测技术员”)、确保监测数据的准确性;由施工作业班组在施工过程中自行对照方案自检、施工完成后由方案编制负责人、项目经理、项目副经理、项目技术负责人、安全环保处、工程处、机料处、合同处、专业分包单位(协作队伍)项目负责人和项目技术负责人等部门人员参加方案验收。,监测单位验收;监测人员;监测项目负责人;监测验收,
+10,other,其它资料,1,Calculations,计算书,编制依据、工程简况、方案简述、设计参数、主要工况计算、局部计算、结论及建议、应力分析结果、变形分析结果、反力分析结果、屈曲分析结果,1,ContentRequirements,内容要求,专项施工方案中包含承重结构、重要临时设施、设备选型、吊绳吊具受力计算;地基承载力等工作内容编制的专项计算书、内容应包含编制依据、工程简况、方案简述、设计参数、主要工况计算、局部计算、结论及建议。,计算书;编制依据;设计参数;主要工况;计算内容;结构计算,
+10,other,其它资料,2,Drawings,相关施工图纸,工程专业名词类、设备设施类、量化数值类、数值单位类、结构组件名称类、施工区域名称类,1,OverallLayoutPlan,总体平面布置图,含总体平面布置图关键字,及类似表述,视为符合,类似出现这种;见附表,详情,详见附表,专详见另册及类似描述视为符合! 这种表述视为符合,总体平面布置图;总平面图;施工布局;总体布置,"当内容仅含""详见附表""、""详见另册""、""见附表""、""见另册""、""专详见另册""等通用索引说明时,视为本分类已有依据。"
+10,other,其它资料,2,Drawings,相关施工图纸,工程专业名词类、设备设施类、量化数值类、数值单位类、结构组件名称类、施工区域名称类,2,ConstructionSiteLayoutPlan,施工工点平面布置图,含施工工点平面布置图关键字,及类似表述,视为符合,类似出现这种;见附表,详情,详见附表,专详见另册及类似描述视为符合! 这种表述视为符合,施工工点平面布置图;工点布置;场地布置图;施工场地平面,"当内容仅含""详见附表""、""详见另册""、""见附表""、""见另册""、""专详见另册""等通用索引说明时,视为本分类已有依据。"
+10,other,其它资料,2,Drawings,相关施工图纸,工程专业名词类、设备设施类、量化数值类、数值单位类、结构组件名称类、施工区域名称类,3,LongitudinalElevationLayoutOfSupportingStructure,支撑结构纵立面布置图,含支撑结构纵立面布置图关键字,及类似表述,视为符合,类似出现这种;见附表,详情,详见附表,专详见另册及类似描述视为符合! 这种表述视为符合,支撑结构纵立面;纵立面布置;桩长;纵断面图;支撑纵立面,"当内容仅含""详见附表""、""详见另册""、""见附表""、""见另册""、""专详见另册""等通用索引说明时,视为本分类已有依据。"
+10,other,其它资料,2,Drawings,相关施工图纸,工程专业名词类、设备设施类、量化数值类、数值单位类、结构组件名称类、施工区域名称类,4,CrossSectionalLayoutDiagram,支横断面布置图,含支横断面布置图图关键字,及类似表述,视为符合,类似出现这种;见附表,详情,详见附表,专详见另册及类似描述视为符合! 这种表述视为符合,横断面图;断面布置图;横断面布置;截面图,"当内容仅含""详见附表""、""详见另册""、""见附表""、""见另册""、""专详见另册""等通用索引说明时,视为本分类已有依据。"
+10,other,其它资料,2,Drawings,相关施工图纸,工程专业名词类、设备设施类、量化数值类、数值单位类、结构组件名称类、施工区域名称类,5,FloorPlan,平面布置图,含平面布置图关键字,及类似表述,视为符合,类似出现这种;见附表,详情,详见附表,专详见另册及类似描述视为符合! 这种表述视为符合,平面布置图;功能分区;施工区域划分;平面图,"当内容仅含""详见附表""、""详见另册""、""见附表""、""见另册""、""专详见另册""等通用索引说明时,视为本分类已有依据。"
+10,other,其它资料,2,Drawings,相关施工图纸,工程专业名词类、设备设施类、量化数值类、数值单位类、结构组件名称类、施工区域名称类,6,DetailedStructuralDiagram,细部构造图,含细部构造图关键字,及类似表述,视为符合,类似出现这种;见附表,详情,详见附表,专详见另册及类似描述视为符合! 这种表述视为符合,细部构造图;节点详图;构造详图;节点图,"当内容仅含""详见附表""、""详见另册""、""见附表""、""见另册""、""专详见另册""等通用索引说明时,视为本分类已有依据。"
+10,other,其它资料,2,Drawings,相关施工图纸,工程专业名词类、设备设施类、量化数值类、数值单位类、结构组件名称类、施工区域名称类,7,FormworkLayoutDrawing,模板布置图,含模板布置图关键字,及类似表述,视为符合,类似出现这种;见附表,详情,详见附表,专详见另册及类似描述视为符合! 这种表述视为符合,模板布置图;模板平面图;模板位置,"当内容仅含""详见附表""、""详见另册""、""见附表""、""见另册""、""专详见另册""等通用索引说明时,视为本分类已有依据。"
+10,other,其它资料,2,Drawings,相关施工图纸,工程专业名词类、设备设施类、量化数值类、数值单位类、结构组件名称类、施工区域名称类,8,TemplateConstructionDiagram,模板构造图,含模板构造图关键字,及类似表述,视为符合,类似出现这种;见附表,详情,详见附表,专详见另册及类似描述视为符合! 这种表述视为符合,模板构造图;模板体系图;支撑系统图;模板结构图,"当内容仅含""详见附表""、""详见另册""、""见附表""、""见另册""、""专详见另册""等通用索引说明时,视为本分类已有依据。"
+10,other,其它资料,3,Tables,附图附表,工序名称类、施工危险因素词汇类、安全设备设施类、资质证照名称类、标准文书类、数值类、时间时期类、数值单位类,1,ConstructionScheduleNetworkDiagram,施工进度计划网络图,含施工进度计划网络图关键字,及类似表述,视为符合,类似出现这种;见附表,详情,详见附表,专详见另册及类似描述视为符合! 这种表述视为符合,网络图;施工进度网络图;工序网络;双代号网络图,"当内容仅含""详见附表""、""详见另册""、""见附表""、""见另册""、""专详见另册""等通用索引说明时,视为本分类已有依据。"
+10,other,其它资料,3,Tables,附图附表,工序名称类、施工危险因素词汇类、安全设备设施类、资质证照名称类、标准文书类、数值类、时间时期类、数值单位类,2,ConstructionScheduleGanttChart,施工进度计划横道图,含施工进度计划横道图关键字,及类似表述,视为符合,类似出现这种;见附表,详情,详见附表,专详见另册及类似描述视为符合! 这种表述视为符合,施工进度横道图;横道图附表;进度计划横道;甘特图附表,"当内容仅含""详见附表""、""详见另册""、""见附表""、""见另册""、""专详见另册""等通用索引说明时,视为本分类已有依据。"
+10,other,其它资料,3,Tables,附图附表,工序名称类、施工危险因素词汇类、安全设备设施类、资质证照名称类、标准文书类、数值类、时间时期类、数值单位类,3,HazardAnalysisAndResponseMeasuresTable,危险源分析和应对措施表,含危险源分析和应对措施表关键字,及类似表述,视为符合,类似出现这种;见附表,详情,详见附表,专详见另册及类似描述视为符合! 这种表述视为符合,危险源分析表;应对措施表;危险源表;风险分析表,"当内容仅含""详见附表""、""详见另册""、""见附表""、""见另册""、""专详见另册""等通用索引说明时,视为本分类已有依据。"
+10,other,其它资料,3,Tables,附图附表,工序名称类、施工危险因素词汇类、安全设备设施类、资质证照名称类、标准文书类、数值类、时间时期类、数值单位类,4,ScannedCopyOfTheCertificateOfFulltimSafetymanagementPersonnel,专职安全管理人员证件扫描件,含专职安全管理人员证件扫描件关键字,及类似表述,视为符合,类似出现这种;见附表,详情,详见附表,专详见另册及类似描述视为符合! 这种表述视为符合,安全证件扫描;专职安全考核证;安全证书扫描件,"当内容仅含""详见附表""、""详见另册""、""见附表""、""见另册""、""专详见另册""等通用索引说明时,视为本分类已有依据。"
+10,other,其它资料,3,Tables,附图附表,工序名称类、施工危险因素词汇类、安全设备设施类、资质证照名称类、标准文书类、数值类、时间时期类、数值单位类,5,ScannedCopyOfSpecialOperationsPersonnelsCertificate,特种作业人员证件扫描件,含特种作业人员证件扫描件关键字,及类似表述,视为符合,类似出现这种;见附表,详情,详见附表,专详见另册及类似描述视为符合! 这种表述视为符合,特种作业证件扫描;特种证书扫描件;操作证扫描,"当内容仅含""详见附表""、""详见另册""、""见附表""、""见另册""、""专详见另册""等通用索引说明时,视为本分类已有依据。"
+10,other,其它资料,3,Tables,附图附表,工序名称类、施工危险因素词汇类、安全设备设施类、资质证照名称类、标准文书类、数值类、时间时期类、数值单位类,6,ScannedCopyOfProfessionalSubcontractorsQualifications,专业分包单位资质扫描件,含专业分包单位资质扫描件关键字,及类似表述,视为符合,类似出现这种;见附表,详情,详见附表,专详见另册及类似描述视为符合! 这种表述视为符合,分包资质扫描;营业执照扫描;资质证书扫描;分包证件,"当内容仅含""详见附表""、""详见另册""、""见附表""、""见另册""、""专详见另册""等通用索引说明时,视为本分类已有依据。"
+10,other,其它资料,4,Team,编制及审核人员情况,专项施工方案验收条件一览表、编制人员信息、复核人员信息、审核人员信息、审批人员信息、姓名、职务、职称,1,ListOfAcceptanceConditionsForSpecialConstructionSchemes,专项施工方案验收条件一览表,含专项施工方案验收条件一览表关键字,及类似表述,视为符合,类似出现这种;见附表,详情,详见附表,专详见另册及类似描述视为符合! 这种表述视为符合,验收条件一览表;专项施工方案验收条件;验收前提条件,"当内容仅含""详见附表""、""详见另册""、""见附表""、""见另册""、""专详见另册""等通用索引说明时,视为本分类已有依据。"
+10,other,其它资料,4,Team,编制及审核人员情况,专项施工方案验收条件一览表、编制人员信息、复核人员信息、审核人员信息、审批人员信息、姓名、职务、职称,2,PreparePersonnelInformation,编制人员信息,需包含“姓名”“职务”“职称”(如“张三 技术员 助理工程师”)、确保编制人员具备专业能力;,编制人员;编制人信息;方案编制者;编制人,
+10,other,其它资料,4,Team,编制及审核人员情况,专项施工方案验收条件一览表、编制人员信息、复核人员信息、审核人员信息、审批人员信息、姓名、职务、职称,3,ReviewerInformation,审核人员信息,需包含“姓名”“职务”“职称”(如“李四 项目技术负责人 工程师”)、确保审核流程的严谨性;,审核人员;复核人员;审核信息;审核人;复核人,
+10,other,其它资料,4,Team,编制及审核人员情况,专项施工方案验收条件一览表、编制人员信息、复核人员信息、审核人员信息、审批人员信息、姓名、职务、职称,4,ApprovalPersonnelInformation,审批人员信息,需包含“姓名”“职务”“职称”(如“王五 项目经理 高级工程师”)、确保方案符合项目整体要求,审批人员;批准人;审批信息;审批签字;项目经理审批,

+ 10 - 1
core/construction_review/component/doc_worker/models/document_structure.py

@@ -191,6 +191,9 @@ class UnifiedDocumentStructure:
     # ========== 文档大纲 ==========
     outline: Outline = field(default_factory=Outline)
 
+    # ========== 目录结构(YOLO检测+OCR提取) ==========
+    catalog: Optional[Dict[str, Any]] = None
+
     # ========== 原始数据(可选) ==========
     raw_metadata: Dict[str, Any] = field(default_factory=dict)
 
@@ -467,7 +470,7 @@ class UnifiedDocumentStructure:
 
         outline_chapters = list(chapters_map.values())
 
-        return {
+        result = {
             "document_id": self.document_id,
             "document_name": self.document_name,
             "total_pages": self.total_pages,
@@ -485,3 +488,9 @@ class UnifiedDocumentStructure:
                 "tertiary_count": self.tertiary_count,
             }
         }
+
+        # 添加目录结构(如果存在)
+        if self.catalog:
+            result["catalog"] = self.catalog
+
+        return result

+ 52 - 3
core/construction_review/component/minimal_pipeline/pdf_extractor.py

@@ -69,6 +69,8 @@ class PdfStructureExtractor:
         ocr_api_url: str = "http://183.220.37.46:25429/v1/chat/completions",
         ocr_timeout: int = 600,
         ocr_api_key: str = "",
+        detect_toc: bool = True,
+        toc_model_path: str = "config/yolo/best.pt",
     ):
         self.clip_top = clip_top
         self.clip_bottom = clip_bottom
@@ -80,6 +82,11 @@ class PdfStructureExtractor:
         self.ocr_api_key = ocr_api_key
         self._layout_engine: Optional[Any] = None
 
+        # 目录检测配置
+        self.detect_toc = detect_toc
+        self.toc_model_path = toc_model_path
+        self._toc_extractor = None
+
         if use_ocr and not RAPID_LAYOUT_AVAILABLE:
             logger.warning("RapidLayout 未安装,OCR 功能不可用")
 
@@ -105,17 +112,59 @@ class PdfStructureExtractor:
                         "一、xxx": {"content": "...", "page_start": 2, "page_end": 3},
                     }
                 },
-                "total_pages": N
+                "total_pages": N,
+                "catalog": {  # 目录结构(YOLO检测+OCR提取)
+                    "chapters": [...],
+                    "total_chapters": N
+                }
             }
         """
+        result = {"chapters": {}, "total_pages": 0, "catalog": None}
+
+        # === 阶段0: 目录页检测与提取(如果启用)===
+        if self.detect_toc:
+            try:
+                catalog = self._extract_catalog(file_content, progress_callback)
+                if catalog:
+                    result["catalog"] = catalog
+                    logger.info(f"[PDF提取] 目录提取完成: {catalog.get('total_chapters', 0)} 章")
+            except Exception as e:
+                logger.warning(f"[PDF提取] 目录提取失败: {e}")
+
+        # === 阶段1-3: 文档结构提取 ===
         doc = fitz.open(stream=file_content)
         try:
             structure = self._extract_from_doc(doc, progress_callback)
-            structure["total_pages"] = len(doc)
-            return structure
+            result["chapters"] = structure.get("chapters", {})
+            result["total_pages"] = len(doc)
+            return result
         finally:
             doc.close()
 
+    def _extract_catalog(self, file_content: bytes, progress_callback=None) -> Optional[Dict[str, Any]]:
+        """
+        提取目录结构(YOLO检测 + OCR识别)
+
+        Returns:
+            {"chapters": [...], "total_chapters": N} 或 None
+        """
+        # 延迟导入避免循环依赖
+        try:
+            from .toc_detector import TOCCatalogExtractor
+        except ImportError:
+            logger.warning("[PDF提取] toc_detector 模块未找到,跳过目录检测")
+            return None
+
+        if self._toc_extractor is None:
+            self._toc_extractor = TOCCatalogExtractor(
+                model_path=self.toc_model_path,
+                ocr_api_url=self.ocr_api_url,
+                ocr_api_key=self.ocr_api_key,
+                ocr_timeout=self.ocr_timeout,
+            )
+
+        return self._toc_extractor.detect_and_extract(file_content, progress_callback)
+
     def _extract_from_doc(self, doc: fitz.Document, progress_callback=None) -> Dict[str, Any]:
         """提取文档结构(支持 OCR 异步并发)"""
 

+ 13 - 5
core/construction_review/component/minimal_pipeline/simple_processor.py

@@ -68,12 +68,14 @@ class SimpleDocumentProcessor:
         处理 PDF 文档,返回 UnifiedDocumentStructure。
         这是 document_processor 的主要入口。
         """
-        structure, primary_result, secondary_result, chunks = await self._run_pipeline(
+        structure, primary_result, secondary_result, chunks, catalog = await self._run_pipeline(
             file_content, file_name, progress_callback
         )
 
         if not chunks:
-            return self._build_empty_unified(file_name, structure.get("total_pages", 0))
+            empty_result = self._build_empty_unified(file_name, structure.get("total_pages", 0))
+            empty_result.catalog = catalog
+            return empty_result
 
         return self._build_unified_doc(
             structure=structure,
@@ -81,6 +83,7 @@ class SimpleDocumentProcessor:
             secondary_result=secondary_result,
             chunks=chunks,
             document_name=file_name,
+            catalog=catalog,
         )
 
     async def process(
@@ -100,8 +103,8 @@ class SimpleDocumentProcessor:
         file_content: bytes,
         file_name: str,
         progress_callback: Optional[callable],
-    ) -> Tuple[Dict[str, Any], Dict[str, Any], Dict[str, Any], List[Dict[str, Any]]]:
-        """执行核心流程,返回 (structure, primary_result, secondary_result, chunks)。"""
+    ) -> Tuple[Dict[str, Any], Dict[str, Any], Dict[str, Any], List[Dict[str, Any]], Optional[Dict[str, Any]]]:
+        """执行核心流程,返回 (structure, primary_result, secondary_result, chunks, catalog)。"""
         logger.info(f"[SimpleProcessor] 开始处理文档: {file_name}")
 
         # 1. PDF 结构提取(带进度回调)
@@ -118,6 +121,7 @@ class SimpleDocumentProcessor:
                     pass
 
         structure = self.pdf_extractor.extract(file_content, progress_callback=_extraction_progress)
+        catalog = structure.get("catalog")  # 获取YOLO检测+OCR提取的目录
         await self._emit_progress(progress_callback, "文档提取", 10, "PDF结构提取完成")
 
         # 2. 一级分类
@@ -154,7 +158,7 @@ class SimpleDocumentProcessor:
         logger.info("[SimpleProcessor] 三级分类完成")
         await self._emit_progress(progress_callback, "文档分类", 90, "三级分类完成")
 
-        return structure, primary_result, secondary_result, chunks
+        return structure, primary_result, secondary_result, chunks, catalog
 
     async def _emit_progress(
         self,
@@ -179,6 +183,7 @@ class SimpleDocumentProcessor:
         secondary_result: Dict[str, Any],
         chunks: List[Dict[str, Any]],
         document_name: str,
+        catalog: Optional[Dict[str, Any]] = None,
     ) -> UnifiedDocumentStructure:
         """构建 UnifiedDocumentStructure 并合并三级分类结果。"""
         unified = build_unified_structure(
@@ -220,6 +225,9 @@ class SimpleDocumentProcessor:
             }
         }
 
+        # 设置目录结构(YOLO检测+OCR提取)
+        unified.catalog = catalog
+
         return unified
 
     def _merge_tertiary_to_unified(

+ 584 - 0
core/construction_review/component/minimal_pipeline/toc_detector.py

@@ -0,0 +1,584 @@
+"""
+YOLO 目录页检测与 OCR 提取模块
+
+用于在文档处理流程早期检测目录页并提取目录内容,
+输出结构与 outline 保持一致,便于后续进行目录完整性检查。
+"""
+
+import io
+import os
+import re
+from dataclasses import dataclass
+from typing import Dict, Any, List, Optional, Tuple
+from pathlib import Path
+
+import fitz
+import numpy as np
+
+from foundation.observability.logger.loggering import review_logger as logger
+
+# 尝试导入 YOLO 相关库
+try:
+    from ultralytics import YOLO
+    YOLO_AVAILABLE = True
+except ImportError:
+    YOLO_AVAILABLE = False
+
+try:
+    from PIL import Image
+    PIL_AVAILABLE = True
+except ImportError:
+    PIL_AVAILABLE = False
+
+
+@dataclass
+class CatalogItem:
+    """目录项结构"""
+    index: int           # 章节序号(1-based)
+    title: str           # 章节标题
+    page: str            # 页码(字符串)
+    original: str        # 原始文本
+    level: int = 1       # 层级(1=章,2=节)
+    parent_title: str = ""  # 父章节标题(用于二级)
+
+
+@dataclass
+class CatalogSection:
+    """目录节结构(对应二级目录)"""
+    title: str
+    page: str
+    level: int
+    original: str
+
+
+@dataclass
+class CatalogChapter:
+    """目录章结构(对应一级目录)"""
+    index: int
+    title: str
+    page: str
+    original: str
+    subsections: List[CatalogSection]
+
+
+class TOCCatalogExtractor:
+    """
+    目录页检测与内容提取器
+
+    使用 YOLO 模型检测目录页,使用 GLM-OCR 提取目录文本,
+    解析为结构化数据,输出格式与 outline 保持一致。
+    """
+
+    # YOLO 配置
+    DEFAULT_MODEL_PATH = "config/yolo/best.pt"
+    CONF_THRESHOLD = 0.25
+    MAX_CHECK_PAGES = 50
+    DPI = 150
+
+    # OCR 配置(目录页使用更低DPI避免请求过大)
+    OCR_DPI = 150
+    MAX_SHORT_EDGE = 800
+    JPEG_QUALITY = 85
+    MAX_IMAGE_SIZE_MB = 5
+
+    def __init__(
+        self,
+        model_path: str = None,
+        ocr_api_url: str = "http://183.220.37.46:25429/v1/chat/completions",
+        ocr_api_key: str = "",
+        ocr_timeout: int = 600,
+    ):
+        self.model_path = model_path or self.DEFAULT_MODEL_PATH
+        self.ocr_api_url = ocr_api_url
+        self.ocr_api_key = ocr_api_key
+        self.ocr_timeout = ocr_timeout
+
+        self._model = None
+        self._yolo_available = YOLO_AVAILABLE and PIL_AVAILABLE
+
+    def _load_model(self) -> bool:
+        """加载 YOLO 模型"""
+        if not self._yolo_available:
+            logger.debug("[TOC检测] YOLO库未安装,跳过目录检测")
+            return False
+
+        if not os.path.exists(self.model_path):
+            logger.debug(f"[TOC检测] 模型文件不存在: {self.model_path}")
+            return False
+
+        if self._model is None:
+            try:
+                logger.info(f"[TOC检测] 正在加载YOLO模型: {self.model_path}")
+                self._model = YOLO(self.model_path)
+                return True
+            except Exception as e:
+                logger.warning(f"[TOC检测] 模型加载失败: {e}")
+                return False
+        return True
+
+    def detect_and_extract(
+        self,
+        file_content: bytes,
+        progress_callback=None
+    ) -> Optional[Dict[str, Any]]:
+        """
+        检测目录页并提取目录内容
+
+        Args:
+            file_content: PDF文件字节流
+            progress_callback: 进度回调函数
+
+        Returns:
+            目录结构字典,格式与 outline 保持一致:
+            {
+                "chapters": [...],
+                "total_chapters": N
+            }
+        """
+        if not self._load_model():
+            return None
+
+        doc = fitz.open(stream=file_content)
+        try:
+            # 1. 检测目录页范围
+            toc_pages = self._detect_toc_pages(doc, progress_callback)
+            if not toc_pages:
+                logger.info("[TOC检测] 未检测到目录页")
+                return None
+
+            logger.info(f"[TOC检测] 检测到目录页: 第{toc_pages[0]+1}页 - 第{toc_pages[-1]+1}页")
+
+            # 2. OCR 提取目录页内容
+            if progress_callback:
+                progress_callback("目录识别", 10, f"检测到{len(toc_pages)}页目录,开始OCR识别...")
+
+            toc_text = self._ocr_toc_pages(doc, toc_pages, progress_callback)
+
+            if not toc_text:
+                return None
+
+            # 3. 解析目录文本为结构化数据
+            if progress_callback:
+                progress_callback("目录识别", 80, "解析目录结构...")
+
+            catalog = self._parse_toc_text(toc_text)
+
+            if progress_callback:
+                progress_callback("目录识别", 100, f"目录提取完成,共{catalog['total_chapters']}章")
+
+            return catalog
+
+        finally:
+            doc.close()
+
+    def _detect_toc_pages(
+        self,
+        doc: fitz.Document,
+        progress_callback=None
+    ) -> List[int]:
+        """
+        使用 YOLO 检测目录页范围
+
+        Returns:
+            目录页索引列表(0-based)
+        """
+        toc_pages = []
+        total_pages = len(doc)
+        pages_to_check = min(total_pages, self.MAX_CHECK_PAGES)
+
+        for page_idx in range(pages_to_check):
+            page = doc.load_page(page_idx)
+
+            # 渲染页面
+            zoom = self.DPI / 72
+            mat = fitz.Matrix(zoom, zoom)
+            pix = page.get_pixmap(matrix=mat)
+
+            # 转换为 numpy 数组
+            img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
+            img_array = np.array(img)
+
+            # YOLO 检测
+            results = self._model(img_array, conf=self.CONF_THRESHOLD, verbose=False)
+
+            # 检查是否检测到 catalogs 类别
+            has_catalogs = False
+            for result in results:
+                if result.boxes is not None:
+                    for box in result.boxes:
+                        cls_id = int(box.cls.item())
+                        class_name = self._model.names.get(cls_id, f"class_{cls_id}")
+                        if class_name == 'catalogs':
+                            has_catalogs = True
+                            break
+                if has_catalogs:
+                    break
+
+            if has_catalogs:
+                toc_pages.append(page_idx)
+                logger.debug(f"  第{page_idx + 1:3d}页: 检测到目录")
+            else:
+                logger.debug(f"  第{page_idx + 1:3d}页: 未检测到目录")
+                # 如果已经检测到目录,且现在没有检测到,认为目录结束
+                if toc_pages:
+                    break
+
+            if progress_callback and (page_idx + 1) % 5 == 0:
+                progress = int((page_idx + 1) / pages_to_check * 10)
+                progress_callback("目录识别", progress, f"扫描页面 {page_idx + 1}/{pages_to_check}")
+
+        return toc_pages
+
+    def _ocr_toc_pages(
+        self,
+        doc: fitz.Document,
+        toc_pages: List[int],
+        progress_callback=None
+    ) -> str:
+        """
+        对目录页进行 OCR 识别
+
+        Returns:
+            合并后的目录文本
+        """
+        import base64
+        import io
+        import requests
+        import time
+
+        all_texts = []
+        total = len(toc_pages)
+
+        for idx, page_idx in enumerate(toc_pages):
+            page = doc.load_page(page_idx)
+
+            try:
+                # 渲染页面(使用较低DPI避免图片过大)
+                pix = page.get_pixmap(dpi=self.OCR_DPI)
+                img_bytes = pix.tobytes("jpeg")
+
+                # 压缩图片
+                compressed = self._compress_image(img_bytes)
+                img_size_mb = len(compressed) / (1024 * 1024)
+                logger.debug(f"  第{page_idx + 1}页图片大小: {img_size_mb:.2f}MB")
+
+                # 检查图片大小
+                if img_size_mb > self.MAX_IMAGE_SIZE_MB:
+                    logger.warning(f"  第{page_idx + 1}页图片过大({img_size_mb:.2f}MB),尝试进一步压缩")
+                    # 再次压缩
+                    compressed = self._compress_image(compressed, force_smaller=True)
+                    img_size_mb = len(compressed) / (1024 * 1024)
+                    logger.debug(f"  压缩后大小: {img_size_mb:.2f}MB")
+
+                img_base64 = base64.b64encode(compressed).decode('utf-8')
+
+                # 请求 OCR
+                payload = {
+                    "model": "GLM-OCR",
+                    "messages": [
+                        {
+                            "role": "user",
+                            "content": [
+                                {
+                                    "type": "text",
+                                    "text": "识别目录内容,按原文格式输出。保留章节层级和页码。"
+                                },
+                                {
+                                    "type": "image_url",
+                                    "image_url": {"url": f"data:image/jpeg;base64,{img_base64}"}
+                                }
+                            ]
+                        }
+                    ],
+                    "max_tokens": 2048,
+                    "temperature": 0.1
+                }
+
+                headers = {"Content-Type": "application/json"}
+                if self.ocr_api_key:
+                    headers["Authorization"] = f"Bearer {self.ocr_api_key}"
+
+                # 指数退避重试
+                max_retries = 3
+                for attempt in range(max_retries):
+                    try:
+                        response = requests.post(
+                            self.ocr_api_url,
+                            headers=headers,
+                            json=payload,
+                            timeout=self.ocr_timeout
+                        )
+
+                        # 记录响应状态
+                        if response.status_code != 200:
+                            logger.error(f"  第{page_idx + 1}页OCR请求失败: HTTP {response.status_code}, 响应: {response.text[:200]}")
+                            response.raise_for_status()
+
+                        result = response.json()
+
+                        content = ""
+                        if "choices" in result and result["choices"]:
+                            content = result["choices"][0].get("message", {}).get("content", "")
+
+                        if content:
+                            all_texts.append(content)
+                            logger.info(f"  第{page_idx + 1}页目录OCR成功")
+                        break
+
+                    except requests.exceptions.HTTPError as e:
+                        if response.status_code == 400:
+                            logger.error(f"  第{page_idx + 1}页OCR请求格式错误(400),可能是图片过大")
+                            break  # 400错误不需要重试
+                        if attempt < max_retries - 1:
+                            wait_time = 2 ** (attempt + 1)
+                            logger.warning(f"  第{page_idx + 1}页目录OCR失败,{wait_time}秒后重试...")
+                            time.sleep(wait_time)
+                        else:
+                            logger.error(f"  第{page_idx + 1}页目录OCR最终失败: {e}")
+                    except Exception as e:
+                        if attempt < max_retries - 1:
+                            wait_time = 2 ** (attempt + 1)
+                            logger.warning(f"  第{page_idx + 1}页目录OCR失败,{wait_time}秒后重试...")
+                            time.sleep(wait_time)
+                        else:
+                            logger.error(f"  第{page_idx + 1}页目录OCR最终失败: {e}")
+
+                if progress_callback:
+                    progress = 10 + int((idx + 1) / total * 60)
+                    progress_callback("目录识别", progress, f"OCR识别中 {idx + 1}/{total}")
+
+            except Exception as e:
+                logger.error(f"  第{page_idx + 1}页OCR处理出错: {e}")
+
+        return "\n".join(all_texts)
+
+    def _compress_image(self, img_bytes: bytes, force_smaller: bool = False) -> bytes:
+        """
+        压缩图片
+
+        Args:
+            img_bytes: 图片字节
+            force_smaller: 是否强制更小的尺寸(用于处理过大的图片)
+        """
+        try:
+            from PIL import Image
+            img = Image.open(io.BytesIO(img_bytes))
+
+            if img.mode in ('RGBA', 'LA', 'P'):
+                background = Image.new('RGB', img.size, (255, 255, 255))
+                if img.mode == 'P':
+                    img = img.convert('RGBA')
+                if img.mode in ('RGBA', 'LA'):
+                    background.paste(img, mask=img.split()[-1])
+                img = background
+            elif img.mode != 'RGB':
+                img = img.convert('RGB')
+
+            # 计算目标尺寸
+            max_edge = self.MAX_SHORT_EDGE
+            if force_smaller:
+                max_edge = 640  # 强制小尺寸
+
+            min_edge = min(img.size)
+            if min_edge > max_edge:
+                ratio = max_edge / min_edge
+                new_size = (int(img.width * ratio), int(img.height * ratio))
+                img = img.resize(new_size, Image.Resampling.LANCZOS)
+
+            buffer = io.BytesIO()
+            quality = self.JPEG_QUALITY if not force_smaller else 75
+            img.save(buffer, format='JPEG', quality=quality, optimize=True)
+            return buffer.getvalue()
+
+        except Exception as e:
+            logger.warning(f"[TOC检测] 图片压缩失败,使用原图: {e}")
+            return img_bytes
+
+    def _parse_toc_text(self, text: str) -> Dict[str, Any]:
+        """
+        解析目录文本为结构化数据
+
+        支持格式:
+        - 第一章 XXX...................1
+        - 一、XXX......................2
+        - 1. XXX ......................3
+
+        Returns:
+            {"chapters": [...], "total_chapters": N}
+        """
+        lines = text.strip().split('\n')
+        chapters = []
+        current_chapter = None
+
+        # 正则表达式模式
+        chapter_pattern = re.compile(
+            r'第\s*([一二三四五六七八九十百0-9]+)\s*章\s*[\s\.]*(.+?)\s*[\.\s]*(\d+)\s*$',
+            re.IGNORECASE
+        )
+        section_pattern = re.compile(
+            r'([一二三四五六七八九十]+)\s*[、\.\s]+\s*(.+?)\s*[\.\s]*(\d+)\s*$'
+        )
+        generic_pattern = re.compile(
+            r'([0-9]+)[\.\s]+(.+?)\s*[\.\s]+(\d+)\s*$'
+        )
+
+        for line in lines:
+            line = line.strip()
+            if not line or len(line) < 3:
+                continue
+
+            # 移除 Markdown 表格符号
+            line = re.sub(r'^[\|\s]+|[\|\s]+$', '', line)
+            line = line.replace('|', ' ')
+
+            # 尝试匹配章
+            chapter_match = chapter_pattern.search(line)
+            if chapter_match:
+                chapter_num = chapter_match.group(1)
+                title = chapter_match.group(2).strip()
+                page = chapter_match.group(3).strip()
+
+                # 保存上一个章
+                if current_chapter:
+                    chapters.append(current_chapter)
+
+                current_chapter = {
+                    "index": self._chinese_to_number(chapter_num) if not chapter_num.isdigit() else int(chapter_num),
+                    "title": f"第{chapter_num}章 {title}",
+                    "page": page,
+                    "original": line,
+                    "subsections": []
+                }
+                continue
+
+            # 尝试匹配节(二级)
+            section_match = section_pattern.search(line)
+            if section_match and current_chapter:
+                section_num = section_match.group(1)
+                title = section_match.group(2).strip()
+                page = section_match.group(3).strip()
+
+                current_chapter["subsections"].append({
+                    "title": f"{section_num}、{title}",
+                    "page": page,
+                    "level": 2,
+                    "original": line
+                })
+                continue
+
+            # 尝试通用匹配(数字开头)
+            generic_match = generic_pattern.search(line)
+            if generic_match and current_chapter:
+                title = generic_match.group(2).strip()
+                page = generic_match.group(3).strip()
+
+                # 判断是章还是节(根据缩进或内容特征)
+                if any(kw in title for kw in ['编制依据', '工程概况', '施工计划', '施工工艺',
+                                               '安全保证', '质量保证', '环境保证', '人员配备',
+                                               '验收要求']):
+                    # 可能是章标题(没有"第X章"前缀的变体)
+                    chapters.append(current_chapter)
+                    current_chapter = {
+                        "index": len(chapters) + 1,
+                        "title": title,
+                        "page": page,
+                        "original": line,
+                        "subsections": []
+                    }
+                else:
+                    # 作为节
+                    current_chapter["subsections"].append({
+                        "title": title,
+                        "page": page,
+                        "level": 2,
+                        "original": line
+                    })
+
+        # 添加最后一个章
+        if current_chapter:
+            chapters.append(current_chapter)
+
+        # 如果没有匹配到章,尝试按空行或缩进分割
+        if not chapters and lines:
+            chapters = self._fallback_parse(lines)
+
+        return {
+            "chapters": chapters,
+            "total_chapters": len(chapters)
+        }
+
+    def _fallback_parse(self, lines: List[str]) -> List[Dict[str, Any]]:
+        """
+        降级解析策略:当正则无法匹配时使用启发式方法
+        """
+        chapters = []
+        idx = 0
+
+        for line in lines:
+            line = line.strip()
+            if not line:
+                continue
+
+            # 检查是否包含页码(行尾数字)
+            page_match = re.search(r'(\d+)\s*$', line)
+            if not page_match:
+                continue
+
+            page = page_match.group(1)
+            title = re.sub(r'[\.\s]+\d+\s*$', '', line).strip()
+
+            # 根据内容特征判断层级
+            is_chapter = any(kw in title for kw in ['编制依据', '工程概况', '施工计划',
+                                                       '施工工艺', '安全保证', '质量保证',
+                                                       '环境保证', '人员配备', '验收'])
+
+            if is_chapter or len(chapters) == 0:
+                idx += 1
+                chapters.append({
+                    "index": idx,
+                    "title": title,
+                    "page": page,
+                    "original": line,
+                    "subsections": []
+                })
+            else:
+                # 作为上一章的节
+                if chapters:
+                    chapters[-1]["subsections"].append({
+                        "title": title,
+                        "page": page,
+                        "level": 2,
+                        "original": line
+                    })
+
+        return chapters
+
+    def _chinese_to_number(self, chinese: str) -> int:
+        """中文数字转阿拉伯数字"""
+        chinese_nums = {
+            '一': 1, '二': 2, '三': 3, '四': 4, '五': 5,
+            '六': 6, '七': 7, '八': 8, '九': 9, '十': 10,
+            '十一': 11, '十二': 12
+        }
+        return chinese_nums.get(chinese, 0)
+
+
+def extract_catalog_from_pdf(
+    file_content: bytes,
+    model_path: str = None,
+    ocr_api_url: str = "http://183.220.37.46:25429/v1/chat/completions",
+    ocr_api_key: str = "",
+    progress_callback=None
+) -> Optional[Dict[str, Any]]:
+    """
+    便捷函数:从 PDF 提取目录结构
+
+    Returns:
+        {"chapters": [...], "total_chapters": N} 或 None
+    """
+    extractor = TOCCatalogExtractor(
+        model_path=model_path,
+        ocr_api_url=ocr_api_url,
+        ocr_api_key=ocr_api_key
+    )
+    return extractor.detect_and_extract(file_content, progress_callback)

+ 26 - 4
core/construction_review/component/outline_catalogue_matcher.py

@@ -11,8 +11,6 @@ import difflib
 import logging
 import re
 from typing import Dict, List, Optional, Set, Tuple, Any
-from collections import defaultdict
-from pathlib import Path
 
 import pandas as pd
 
@@ -129,10 +127,28 @@ class OutlineCatalogueMatcher:
             pass  # 加载失败不影响主功能
     
     def _normalize_text(self, text: str) -> str:
-        """文本标准化"""
+        """文本标准化 - 清洗序号、标点、空格"""
         if not text:
             return ""
+        
+        # 1. 去除章节序号(如"一、" "5.1 " "(1)" "第1章"等)
+        # "第X章/节"格式
+        text = re.sub(r'^第[一二三四五六七八九十百千\d]+[章节][、.\s]*', '', text)
+        # 中文序号:一、二、三...,(一)、(二)...
+        text = re.sub(r'^[((]?[一二三四五六七八九十百千]+[))]?[、.\s]*', '', text)
+        # 多级数字序号:1.1.1、5.1、1.1.2等(循环处理多级)
+        while re.match(r'^\d+[..]', text):
+            text = re.sub(r'^\d+[..]', '', text)
+        # 括号数字:(1)、[1]、(1)
+        text = re.sub(r'^[((\[]\d+[))\]][、.\s]*', '', text)
+        # 单个数字+标点/空格:1)、1]、1】
+        text = re.sub(r'^\d+[))\]】][、.\s]*', '', text)
+        # 纯数字+空格(如"5 ")
+        text = re.sub(r'^\d+\s+', '', text)
+        
+        # 2. 去除标点符号
         text = re.sub(r'[\s\n\r\t.,;:!?,。;:!?、""''()()【】\[\]《》<>]', '', text)
+        
         return text.lower().strip()
     
     def _calculate_similarity(self, text1: str, text2: str) -> float:
@@ -284,11 +300,14 @@ class OutlineCatalogueMatcher:
         
         matched_first = set()
         missing_first = []
+        # 🆕 建立标准code到实际code的映射(用于二级匹配时找到正确的subsections)
+        first_code_mapping: Dict[str, str] = {}  # {标准req_code: 实际outline_code}
         
         for req_code, req_name in self.first_names.items():
             # 优先:直接用code精确匹配,因为一级分类通常较准
             if req_code in actual_first_titles:
                 matched_first.add(req_code)
+                first_code_mapping[req_code] = req_code  # 精确匹配,映射到自己
                 logger.debug(f"[一级匹配] {req_name}: 存在")
             else:
                 # 尝试用标题模糊匹配
@@ -302,6 +321,7 @@ class OutlineCatalogueMatcher:
                     for code, title in actual_first_titles.items():
                         if title == matched_title:
                             matched_first.add(req_code)
+                            first_code_mapping[req_code] = code  # 记录映射关系
                             logger.debug(f"[一级模糊匹配] {req_name} -> {matched_title} ({score:.3f})")
                             break
                 else:
@@ -331,7 +351,9 @@ class OutlineCatalogueMatcher:
             first_code, second_code = req_key
             
             # 🆕 步骤1:优先在同一一级下匹配
-            same_group_titles = outline_by_first.get(first_code, {}).get('subsections', [])
+            # 使用映射找到实际的code(处理一级模糊匹配后的映射关系)
+            actual_first_code = first_code_mapping.get(first_code, first_code)
+            same_group_titles = outline_by_first.get(actual_first_code, {}).get('subsections', [])
             best_score_same = 0.0
             best_match_same = None
             

+ 2 - 2
core/construction_review/component/reviewers/reference_basis_reviewer.py

@@ -43,8 +43,8 @@ class BasisSearchEngine:
             self.user = config_handler.get('milvus', 'MILVUS_USER')
             self.password = config_handler.get('milvus', 'MILVUS_PASSWORD')
 
-            # 初始化嵌入模型
-            self.emdmodel = mh._get_lq_qwen3_8b_emd()
+            # 初始化嵌入模型(从配置获取)
+            self.emdmodel = mh.get_embedding_model()
             logger.info("嵌入模型初始化成功")
 
         except Exception as e:

+ 44 - 2
core/construction_review/component/reviewers/standard_timeliness_reviewer.py

@@ -26,6 +26,10 @@
         results = reviewer.review_standards(standards_list)
 """
 import asyncio
+import json
+import os
+import threading
+from datetime import datetime
 from typing import List, Dict, Any, Optional
 from dataclasses import dataclass, asdict
 
@@ -67,13 +71,14 @@ class StandardTimelinessReviewer:
     对标准列表进行时效性审查。
     """
 
-    def __init__(self, db_pool=None, standard_service: Optional[StandardMatchingService] = None):
+    def __init__(self, db_pool=None, standard_service: Optional[StandardMatchingService] = None, callback_task_id: Optional[str] = None):
         """
         初始化审查器
 
         Args:
             db_pool: 数据库连接池,用于初始化 StandardMatchingService(如未提供standard_service则必填)
             standard_service: 已初始化的 StandardMatchingService 实例(优先级高于 db_pool)
+            callback_task_id: 回调任务ID,用于持久化判定结果
 
         Raises:
             RuntimeError: 当db_pool和standard_service都为None时抛出异常
@@ -86,6 +91,8 @@ class StandardTimelinessReviewer:
         self.db_pool = db_pool
         self._service = standard_service
         self._own_service = False  # 标记是否由本实例创建 service
+        self.callback_task_id = callback_task_id
+        self._log_lock = threading.Lock()
 
     async def __aenter__(self):
         """异步上下文管理器入口"""
@@ -102,6 +109,38 @@ class StandardTimelinessReviewer:
             await self._service.close()
         return False
 
+    def _log_determination_results(self, review_results: List["TimelinessReviewResult"]) -> None:
+        """将时效性判定结果持久化到JSON文件,不影响主逻辑"""
+        if not self.callback_task_id:
+            return
+        try:
+            with self._log_lock:
+                log_dir = os.path.join("temp", "construction_review", "timeliness_result")
+                os.makedirs(log_dir, exist_ok=True)
+                log_path = os.path.join(log_dir, f"{self.callback_task_id}.json")
+
+                records = []
+                if os.path.exists(log_path):
+                    try:
+                        with open(log_path, "r", encoding="utf-8") as f:
+                            records = json.load(f)
+                            if not isinstance(records, list):
+                                records = []
+                    except Exception:
+                        records = []
+
+                for result in review_results:
+                    records.append({
+                        "timestamp": datetime.now().isoformat(),
+                        "callback_task_id": self.callback_task_id,
+                        **result.to_dict()
+                    })
+
+                with open(log_path, "w", encoding="utf-8") as f:
+                    json.dump(records, f, ensure_ascii=False, indent=2)
+        except Exception as e:
+            logger.warning(f"记录时效性判定结果失败: {e}")
+
     def review_standards(self, standards: List[Dict[str, str]]) -> List[TimelinessReviewResult]:
         """
         审查标准列表的时效性
@@ -128,6 +167,7 @@ class StandardTimelinessReviewer:
                 review_result = self._convert_match_to_review_result(match_result)
                 review_results.append(review_result)
 
+        self._log_determination_results(review_results)
         return review_results
 
     def review_single(self, standard_name: str, standard_number: str, seq_no: int = 1) -> Optional[TimelinessReviewResult]:
@@ -150,7 +190,9 @@ class StandardTimelinessReviewer:
         # 如果 match 返回 None(文件名为空),则返回 None
         if match_result is None:
             return None
-        return self._convert_match_to_review_result(match_result)
+        review_result = self._convert_match_to_review_result(match_result)
+        self._log_determination_results([review_result])
+        return review_result
 
     def _convert_match_to_review_result(self, match_result: StandardMatchResult) -> TimelinessReviewResult:
         """

+ 4 - 0
core/construction_review/component/reviewers/timeliness_basis_reviewer.py

@@ -388,6 +388,10 @@ class BasisReviewService:
 
         start_time = time.time()
         total_batches = (len(items) + 2) // 3  # 计算总批次数
+
+        # 绑定 callback_task_id 到时效性审查器,用于记录判定结果
+        if self._timeliness_reviewer and callback_task_id:
+            self._timeliness_reviewer.callback_task_id = callback_task_id
         
         # 发送开始审查的SSE推送(使用独立命名空间,避免与主流程进度冲突)
         if progress_manager and callback_task_id:

+ 3 - 0
core/construction_review/component/reviewers/timeliness_content_reviewer.py

@@ -276,6 +276,9 @@ class ContentTimelinessReviewer:
 
         try:
             async with self._semaphore:
+                # 绑定 callback_task_id,用于记录判定结果
+                if callback_task_id:
+                    self._timeliness_reviewer.callback_task_id = callback_task_id
                 # 执行规则匹配审查
                 review_results = self._timeliness_reviewer.review_standards(standards_list)
 

+ 2 - 1
core/construction_review/component/reviewers/utils/llm_content_classifier_v2/category_loaders.py

@@ -111,7 +111,8 @@ class CategoryStandardLoader:
                     third_name=row.get('third_name', ''),
                     third_seq=int(row.get('third_seq', '0') or 0),
                     third_focus=row.get('third_focus', ''),
-                    keywords=row.get('keywords', '')
+                    keywords=row.get('keywords', ''),
+                    extra_prompt=row.get('extra_prompt', '')
                 ))
 
     def get_standards_by_second_code(self, second_code: str) -> List[CategoryStandard]:

+ 11 - 2
core/construction_review/component/reviewers/utils/llm_content_classifier_v2/content_classifier.py

@@ -774,10 +774,19 @@ class ContentClassifierClient:
         verification_info = []  # 保存对应的 std 和 hit_lines 信息
 
         for std in section.category_standards:
-            if std.third_code in found_codes or not std.keywords:
+            if std.third_code in found_codes:
+                continue
+            if not std.keywords and not std.extra_prompt:
                 continue
 
             keywords = [k.strip() for k in std.keywords.split(';') if k.strip()]
+            # 同时从 extra_prompt 的引号内容中提取补充信号词,用于触发验证
+            extra_signals = []
+            if std.extra_prompt:
+                import re
+                quoted = re.findall(r'[""""]([^""""]+)[""""]', std.extra_prompt)
+                extra_signals.extend([q.strip() for q in quoted if len(q.strip()) >= 2])
+            scan_signals = keywords + extra_signals
 
             if is_table:
                 # 表格路径:整个 section 行范围提交 LLM 验证
@@ -793,7 +802,7 @@ class ContentClassifierClient:
                 hit_lines, matched_kws = [], []
                 for i, line_text in enumerate(section.lines):
                     line_num = section.line_number_map[i] if section.line_number_map else (i + 1)
-                    for kw in keywords:
+                    for kw in scan_signals:
                         if kw in line_text and line_num not in hit_lines:
                             hit_lines.append(line_num)
                             if kw not in matched_kws:

+ 1 - 0
core/construction_review/component/reviewers/utils/llm_content_classifier_v2/models.py

@@ -23,6 +23,7 @@ class CategoryStandard:
     third_seq: int  # 三级序号
     third_focus: str
     keywords: str = ""
+    extra_prompt: str = ""
 
 
 @dataclass

+ 6 - 1
core/construction_review/component/reviewers/utils/llm_content_classifier_v2/prompt.py

@@ -114,9 +114,10 @@ def build_classify_prompt(section: SectionContent, is_chunk: bool = False) -> st
     standards_desc = []
     for i, std in enumerate(section.category_standards, 1):
         focus_content = std.third_focus if std.third_focus else "(无具体关注要点)"
+        extra_hint = f"\n   【特别说明】{std.extra_prompt}" if std.extra_prompt else ""
         standards_desc.append(
             f"{i}. {std.third_name}\n"
-            f"   【识别要点】{focus_content}"
+            f"   【识别要点】{focus_content}{extra_hint}"
         )
 
     # 添加非标准项作为兜底分类(索引0)
@@ -180,6 +181,9 @@ def build_classify_prompt(section: SectionContent, is_chunk: bool = False) -> st
 3. **语义相关**:即使没有精确关键词,只要语义相关,也应归类
 4. **非标准项谨慎使用**:只有当内容完全不符合任何标准分类时,才使用"非标准项"
 
+### 通用索引说明归类规则(重要)
+当文档内容仅包含"详见附表"、"详见另册"、"见附表"、"见另册"、"专详见另册"等通用索引说明,且某三级分类的【特别说明】明确允许此类表述视为符合时,必须将该内容同时归类到这些三级分类中,禁止标记为"非标准项"。
+
 ### 分类示例
 - 看到"验收内容"、"验收标准"、"验收程序"等内容 → 归类到对应的三级分类
 - 看到"检验方法"、"检查内容"等 → 可能属于"检查要求"或"验收内容"
@@ -350,6 +354,7 @@ def build_supplement_verify_prompt(
 【待确认的分类】
 分类名称:{std.third_name}
 识别说明:{std.third_focus}
+{f'特别说明:{std.extra_prompt}' if std.extra_prompt else ''}
 
 【触发原因】
 {trigger}

+ 1 - 1
core/construction_review/component/standard_matching/standard_dao.py

@@ -12,7 +12,7 @@ class StandardDAO:
 
     def __init__(self, db_pool):
         self.db_pool = db_pool
-        self.table_name = "t_samp_standard_base_info"
+        self.table_name = "t_samp_standard_base_info_status"
 
     async def load_all_standards(self) -> List[Dict]:
         """

+ 7 - 2
core/construction_review/component/standard_matching/standard_service.py

@@ -369,8 +369,13 @@ class StandardMatcher:
         exact_match = self._find_exact_name_match(name_matches, result.normalized_name)
 
         if exact_match:
-            # 找到名称匹配的记录
-            return self._handle_fuzzy_name_match(result, 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)
 
         # 名称完全不匹配,但标准号已匹配成功
         # 说明该标准存在于库中,应返回不匹配而非不存在

+ 2 - 2
data_pipeline/milvus_inbound_script/milvus_vector.py

@@ -56,10 +56,10 @@ class MilvusVectorManager(BaseVectorDB):
         self.user = config_handler.get('milvus', 'MILVUS_USER')
         self.password = config_handler.get('milvus', 'MILVUS_PASSWORD')
         
-        # 初始化文本向量化模型
+        # 初始化文本向量化模型(从配置获取)
         mh = _get_model_handler()
         if mh:
-            self.emdmodel = mh._get_lq_qwen3_8b_emd()
+            self.emdmodel = mh.get_embedding_model()
         else:
             raise ImportError("无法导入model_handler,无法初始化嵌入模型")
 

+ 29 - 2
foundation/ai/models/model_handler.py

@@ -387,7 +387,22 @@ class ModelHandler:
             支持的模型类型:lq_qwen3_8b_emd, siliconflow_embed
             默认返回本地 lq_qwen3_8b_emd 模型
         """
-        embedding_model_type = self.config.get("model", "EMBEDDING_MODEL_TYPE", "lq_qwen3_8b_emd")
+        # 优先从 model_setting.yaml 读取embedding配置
+        embedding_model_type = None
+        try:
+            from .model_config_loader import model_config_loader
+            settings = model_config_loader._config.get("model_settings", {})
+            embedding_config = settings.get("embedding", {})
+            if embedding_config and "model" in embedding_config:
+                embedding_model_type = embedding_config["model"]
+                logger.debug(f"从 model_setting.yaml 读取embedding模型: {embedding_model_type}")
+        except Exception as e:
+            logger.debug(f"从 model_setting.yaml 读取embedding配置失败: {e}")
+
+        # 回退到 config.ini
+        if not embedding_model_type:
+            embedding_model_type = self.config.get("model", "EMBEDDING_MODEL_TYPE", "lq_qwen3_8b_emd")
+
         logger.info(f"正在初始化Embedding模型,模型类型: {embedding_model_type}")
 
         # 检查缓存
@@ -417,7 +432,19 @@ class ModelHandler:
             else:
                 raise ModelAPIError(f"Embedding模型初始化返回None: {embedding_model_type}")
 
-        except Exception as e:
+        except (ModelConnectionError, Exception) as e:
+            # 如果配置的模型是本地模型且连接失败,自动回退到蜀天Embedding
+            if embedding_model_type == "lq_qwen3_8b_emd":
+                logger.warning(f"本地Embedding模型连接失败,自动回退到蜀天Embedding: {e}")
+                try:
+                    model = self._get_shutian_qwen3_embed()
+                    if model:
+                        self._model_cache["embed_shutian_qwen3_embed"] = model
+                        logger.info("Embedding模型回退成功: shutian_qwen3_embed")
+                        return model
+                except Exception as fallback_e:
+                    logger.error(f"回退到蜀天Embedding也失败: {fallback_e}")
+
             logger.error(f"获取Embedding模型失败 [{embedding_model_type}]: {e}")
             raise ModelConnectionError(f"无法初始化Embedding模型服务: {e}")
 


+ 542 - 0
utils_test/API_key/api_key_generator.py

@@ -0,0 +1,542 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+大模型部署 API Key 生成器
+
+特性:
+- 生成加密安全的随机 API Key
+- 支持多种格式(UUID、随机字符串、JWT 风格)
+- 包含前缀标识(便于区分用途和环境)
+- 支持校验和验证(防止篡改)
+- 可配置 Key 长度和复杂度
+
+使用示例:
+    # 生成标准 API Key
+    key = generate_api_key(prefix="sk-prod")
+
+    # 生成带有项目标识的 Key
+    key = generate_api_key(prefix="sk-dev", project_id="proj_123")
+
+    # 验证 API Key 格式
+    is_valid = validate_api_key(key, prefix="sk-prod")
+"""
+
+import secrets
+import hashlib
+import base64
+import re
+import json
+import hmac
+from datetime import datetime, timedelta
+from typing import Optional, Tuple, Dict, Any
+from dataclasses import dataclass
+from enum import Enum
+
+
+class KeyFormat(Enum):
+    """API Key 格式类型"""
+    STANDARD = "standard"      # 标准格式: prefix_xxxxxxxxx
+    UUID = "uuid"              # UUID 格式
+    JWT_STYLE = "jwt_style"    # JWT 风格: xxxxx.yyyyy.zzzzz
+    BASE64 = "base64"          # Base64 编码
+    HEX = "hex"                # 十六进制
+
+
+@dataclass
+class APIKeyConfig:
+    """API Key 配置"""
+    prefix: str = "sk"                 # 前缀,如 sk, pk, dk(secret key, public key, dev key)
+    environment: str = "prod"          # 环境:prod, dev, test
+    length: int = 32                   # 随机部分长度
+    include_checksum: bool = True      # 是否包含校验和
+    include_timestamp: bool = False    # 是否包含时间戳
+    project_id: Optional[str] = None   # 项目标识
+    secret_key: Optional[str] = None   # 用于签名(HMAC)
+
+
+class APIKeyGenerator:
+    """API Key 生成器"""
+
+    # 推荐的密钥长度(字节)
+    RECOMMENDED_LENGTHS = {
+        "low": 16,      # 128 bit
+        "medium": 24,   # 192 bit
+        "high": 32,     # 256 bit
+        "maximum": 48   # 384 bit
+    }
+
+    def __init__(self, config: Optional[APIKeyConfig] = None):
+        self.config = config or APIKeyConfig()
+
+    def generate(self, format_type: KeyFormat = KeyFormat.STANDARD) -> str:
+        """
+        生成 API Key
+
+        Args:
+            format_type: Key 格式类型
+
+        Returns:
+            str: 生成的 API Key
+        """
+        generators = {
+            KeyFormat.STANDARD: self._generate_standard,
+            KeyFormat.UUID: self._generate_uuid,
+            KeyFormat.JWT_STYLE: self._generate_jwt_style,
+            KeyFormat.BASE64: self._generate_base64,
+            KeyFormat.HEX: self._generate_hex,
+        }
+
+        generator = generators.get(format_type, self._generate_standard)
+        return generator()
+
+    def _generate_standard(self) -> str:
+        """生成标准格式 API Key: prefix_env_xxxxxxxxx_checksum"""
+        # 构建前缀
+        prefix_parts = [self.config.prefix]
+        if self.config.environment:
+            prefix_parts.append(self.config.environment)
+        if self.config.project_id:
+            prefix_parts.append(self.config.project_id)
+
+        prefix = "_".join(prefix_parts)
+
+        # 生成随机部分
+        random_bytes = secrets.token_bytes(self.config.length)
+        random_part = base64.urlsafe_b64encode(random_bytes).decode('ascii').rstrip('=')
+
+        # 可选:添加时间戳
+        if self.config.include_timestamp:
+            timestamp = hex(int(datetime.utcnow().timestamp()))[2:]
+            random_part = f"{timestamp}_{random_part[:24]}"
+
+        # 构建基础 key
+        base_key = f"{prefix}_{random_part[:self.config.length]}"
+
+        # 可选:添加校验和
+        if self.config.include_checksum:
+            checksum = self._calculate_checksum(base_key)
+            return f"{base_key}_{checksum}"
+
+        return base_key
+
+    def _generate_uuid(self) -> str:
+        """生成 UUID 风格 API Key"""
+        # 生成 16 字节随机数
+        random_bytes = secrets.token_bytes(16)
+
+        # 转换为 UUID 格式
+        hex_str = random_bytes.hex()
+        uuid_format = f"{hex_str[:8]}-{hex_str[8:12]}-{hex_str[12:16]}-{hex_str[16:20]}-{hex_str[20:32]}"
+
+        prefix = f"{self.config.prefix}-{self.config.environment}" if self.config.environment else self.config.prefix
+        return f"{prefix}-{uuid_format}"
+
+    def _generate_jwt_style(self) -> str:
+        """生成 JWT 风格 API Key: header.payload.signature"""
+        # Header
+        header = {
+            "alg": "HS256" if self.config.secret_key else "none",
+            "typ": "API-KEY",
+            "env": self.config.environment,
+            "prefix": self.config.prefix
+        }
+        header_b64 = base64.urlsafe_b64encode(
+            json.dumps(header, separators=(',', ':')).encode()
+        ).decode().rstrip('=')
+
+        # Payload(随机数据 + 时间戳)
+        payload_data = secrets.token_hex(16)
+        payload = {
+            "rnd": payload_data,
+            "iat": int(datetime.utcnow().timestamp()),
+            "project": self.config.project_id or "default"
+        }
+        payload_b64 = base64.urlsafe_b64encode(
+            json.dumps(payload, separators=(',', ':')).encode()
+        ).decode().rstrip('=')
+
+        # Signature
+        if self.config.secret_key:
+            message = f"{header_b64}.{payload_b64}"
+            signature = hmac.new(
+                self.config.secret_key.encode(),
+                message.encode(),
+                hashlib.sha256
+            ).digest()
+            signature_b64 = base64.urlsafe_b64encode(signature).decode().rstrip('=')[:16]
+        else:
+            signature_b64 = secrets.token_urlsafe(16).rstrip('=')
+
+        return f"{header_b64}.{payload_b64}.{signature_b64}"
+
+    def _generate_base64(self) -> str:
+        """生成 Base64 编码 API Key"""
+        random_bytes = secrets.token_bytes(self.config.length)
+        encoded = base64.urlsafe_b64encode(random_bytes).decode('ascii').rstrip('=')
+        prefix = f"{self.config.prefix}_{self.config.environment}_" if self.config.environment else f"{self.config.prefix}_"
+        return f"{prefix}{encoded}"
+
+    def _generate_hex(self) -> str:
+        """生成十六进制 API Key"""
+        random_bytes = secrets.token_bytes(self.config.length)
+        hex_str = random_bytes.hex()
+        prefix = f"{self.config.prefix}_{self.config.environment}_" if self.config.environment else f"{self.prefix}_"
+        return f"{prefix}{hex_str}"
+
+    def _calculate_checksum(self, data: str) -> str:
+        """计算校验和(前 8 位)"""
+        hash_obj = hashlib.sha256(data.encode())
+        return hash_obj.hexdigest()[:8]
+
+    @staticmethod
+    def validate(api_key: str, prefix: Optional[str] = None,
+                 secret_key: Optional[str] = None) -> Tuple[bool, Optional[Dict[str, Any]]]:
+        """
+        验证 API Key 格式
+
+        Args:
+            api_key: 要验证的 API Key
+            prefix: 期望的前缀(可选)
+            secret_key: 用于验证签名的密钥(可选)
+
+        Returns:
+            Tuple[bool, Optional[Dict]]: (是否有效, 解析后的信息)
+        """
+        if not api_key or len(api_key) < 16:
+            return False, None
+
+        info = {"raw": api_key}
+
+        # 检查前缀
+        if prefix and not api_key.startswith(prefix):
+            return False, info
+
+        # 尝试解析 JWT 风格
+        if '.' in api_key and api_key.count('.') == 2:
+            return APIKeyGenerator._validate_jwt_style(api_key, secret_key, info)
+
+        # 尝试解析标准格式(检查校验和)
+        if '_' in api_key:
+            return APIKeyGenerator._validate_standard(api_key, info)
+
+        return True, info
+
+    @staticmethod
+    def _validate_jwt_style(api_key: str, secret_key: Optional[str],
+                            info: Dict) -> Tuple[bool, Dict]:
+        """验证 JWT 风格 Key"""
+        parts = api_key.split('.')
+        if len(parts) != 3:
+            return False, info
+
+        try:
+            # 解码 header
+            header_padding = '=' * (4 - len(parts[0]) % 4)
+            header_json = base64.urlsafe_b64decode(parts[0] + header_padding)
+            header = json.loads(header_json)
+            info["header"] = header
+
+            # 解码 payload
+            payload_padding = '=' * (4 - len(parts[1]) % 4)
+            payload_json = base64.urlsafe_b64decode(parts[1] + payload_padding)
+            payload = json.loads(payload_json)
+            info["payload"] = payload
+
+            # 验证签名(如果提供了 secret_key)
+            if secret_key and header.get("alg") == "HS256":
+                message = f"{parts[0]}.{parts[1]}"
+                expected_sig = hmac.new(
+                    secret_key.encode(),
+                    message.encode(),
+                    hashlib.sha256
+                ).digest()
+                expected_sig_b64 = base64.urlsafe_b64encode(expected_sig).decode().rstrip('=')[:16]
+
+                if not hmac.compare_digest(parts[2], expected_sig_b64):
+                    return False, info
+
+            return True, info
+
+        except Exception:
+            return False, info
+
+    @staticmethod
+    def _validate_standard(api_key: str, info: Dict) -> Tuple[bool, Dict]:
+        """验证标准格式 Key(带校验和)"""
+        parts = api_key.split('_')
+
+        # 如果有校验和部分(最后一部分是 8 位十六进制)
+        if len(parts) >= 2 and len(parts[-1]) == 8 and all(c in '0123456789abcdef' for c in parts[-1]):
+            # 提取基础 key 和校验和
+            checksum = parts[-1]
+            base_key = '_'.join(parts[:-1])
+
+            # 验证校验和
+            expected_checksum = hashlib.sha256(base_key.encode()).hexdigest()[:8]
+
+            if checksum != expected_checksum:
+                return False, info
+
+            info["checksum_valid"] = True
+            info["parts"] = parts[:-1]  # 排除校验和部分
+        else:
+            info["parts"] = parts
+
+        return True, info
+
+
+# ========== 便捷函数 ==========
+
+def generate_api_key(
+    prefix: str = "sk",
+    environment: str = "prod",
+    length: int = 32,
+    format_type: KeyFormat = KeyFormat.STANDARD,
+    include_checksum: bool = True,
+    project_id: Optional[str] = None,
+    secret_key: Optional[str] = None
+) -> str:
+    """
+    便捷函数:生成 API Key
+
+    Args:
+        prefix: 前缀(如 sk, pk, dk)
+        environment: 环境(prod, dev, test)
+        length: 随机部分长度
+        format_type: 格式类型
+        include_checksum: 是否包含校验和
+        project_id: 项目标识
+        secret_key: 用于签名的密钥
+
+    Returns:
+        str: 生成的 API Key
+
+    Examples:
+        >>> generate_api_key()
+        'sk_prod_xxxxxxxxxxxxxxxx_xxxxxxxx'
+
+        >>> generate_api_key(prefix="sk-dev", environment="test")
+        'sk-dev_test_xxxxxxxxxxxxxxxx_xxxxxxxx'
+
+        >>> generate_api_key(format_type=KeyFormat.UUID)
+        'sk-prod-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
+    """
+    config = APIKeyConfig(
+        prefix=prefix,
+        environment=environment,
+        length=length,
+        include_checksum=include_checksum,
+        project_id=project_id,
+        secret_key=secret_key
+    )
+    generator = APIKeyGenerator(config)
+    return generator.generate(format_type)
+
+
+def validate_api_key(
+    api_key: str,
+    prefix: Optional[str] = None,
+    secret_key: Optional[str] = None
+) -> bool:
+    """
+    便捷函数:验证 API Key 格式
+
+    Args:
+        api_key: 要验证的 Key
+        prefix: 期望的前缀(可选)
+        secret_key: 用于验证签名的密钥(可选)
+
+    Returns:
+        bool: 是否有效
+    """
+    is_valid, _ = APIKeyGenerator.validate(api_key, prefix, secret_key)
+    return is_valid
+
+
+def parse_api_key(api_key: str) -> Optional[Dict[str, Any]]:
+    """
+    解析 API Key,提取其中的信息
+
+    Args:
+        api_key: API Key
+
+    Returns:
+        Optional[Dict]: 解析出的信息,无效返回 None
+    """
+    is_valid, info = APIKeyGenerator.validate(api_key)
+    return info if is_valid else None
+
+
+# ========== 批量生成工具 ==========
+
+def generate_api_keys_batch(
+    count: int = 10,
+    prefix: str = "sk",
+    environment: str = "prod",
+    format_type: KeyFormat = KeyFormat.STANDARD,
+    save_to_file: Optional[str] = None
+) -> list:
+    """
+    批量生成 API Key
+
+    Args:
+        count: 生成数量
+        prefix: 前缀
+        environment: 环境
+        format_type: 格式
+        save_to_file: 保存到文件路径(可选)
+
+    Returns:
+        list: API Key 列表
+    """
+    config = APIKeyConfig(prefix=prefix, environment=environment)
+    generator = APIKeyGenerator(config)
+
+    keys = [generator.generate(format_type) for _ in range(count)]
+
+    if save_to_file:
+        with open(save_to_file, 'w', encoding='utf-8') as f:
+            f.write("# Generated API Keys\n")
+            f.write(f"# Count: {count}\n")
+            f.write(f"# Format: {format_type.value}\n")
+            f.write(f"# Environment: {environment}\n")
+            f.write("-" * 50 + "\n")
+            for i, key in enumerate(keys, 1):
+                f.write(f"{i}. {key}\n")
+        print(f"Keys saved to: {save_to_file}")
+
+    return keys
+
+
+# ========== 主程序 ==========
+
+if __name__ == "__main__":
+    print("=" * 60)
+    print("大模型部署 API Key 生成器")
+    print("=" * 60)
+
+    # 演示各种格式的 API Key
+    formats = [
+        ("标准格式", KeyFormat.STANDARD),
+        ("UUID 格式", KeyFormat.UUID),
+        ("JWT 风格", KeyFormat.JWT_STYLE),
+        ("Base64 格式", KeyFormat.BASE64),
+        ("十六进制格式", KeyFormat.HEX),
+    ]
+
+    print("\n1. 不同格式的 API Key 示例:")
+    print("-" * 60)
+
+    for name, fmt in formats:
+        key = generate_api_key(format_type=fmt)
+        print(f"\n{name}:")
+        print(f"  {key}")
+
+    # 不同环境的 Key
+    print("\n\n2. 不同环境的 API Key:")
+    print("-" * 60)
+
+    for env in ["prod", "dev", "test"]:
+        key = generate_api_key(environment=env)
+        print(f"\n{env.upper()}:")
+        print(f"  {key}")
+
+    # 带校验和的 Key
+    print("\n\n3. 带校验和的 Key(可验证完整性):")
+    print("-" * 60)
+
+    key_with_checksum = generate_api_key(include_checksum=True)
+    print(f"\n生成: {key_with_checksum}")
+
+    is_valid = validate_api_key(key_with_checksum)
+    print(f"验证: {'✓ 有效' if is_valid else '✗ 无效'}")
+
+    # 验证被篡改的 Key
+    tampered_key = key_with_checksum[:-8] + "12345678"
+    print(f"\n篡改: {tampered_key}")
+    is_valid = validate_api_key(tampered_key)
+    print(f"验证: {'✓ 有效' if is_valid else '✗ 无效(校验和不匹配)'}")
+
+    # 带项目标识的 Key
+    print("\n\n4. 带项目标识的 Key:")
+    print("-" * 60)
+
+    key_with_project = generate_api_key(
+        prefix="sk",
+        environment="prod",
+        project_id="proj_chatbot"
+    )
+    print(f"\n{key_with_project}")
+
+    # 批量生成
+    print("\n\n5. 批量生成(10 个测试 Key):")
+    print("-" * 60)
+
+    test_keys = generate_api_keys_batch(
+        count=5,
+        prefix="sk-test",
+        environment="dev",
+        format_type=KeyFormat.STANDARD
+    )
+    for i, key in enumerate(test_keys, 1):
+        print(f"  {i}. {key}")
+
+    # 带签名的 JWT 风格 Key
+    print("\n\n6. 带 HMAC 签名的 JWT 风格 Key:")
+    print("-" * 60)
+
+    secret = "your-secret-key-here-keep-it-safe"
+    jwt_key = generate_api_key(
+        format_type=KeyFormat.JWT_STYLE,
+        secret_key=secret,
+        environment="prod",
+        project_id="llm-api"
+    )
+    print(f"\n生成: {jwt_key}")
+
+    # 验证签名
+    is_valid, info = APIKeyGenerator.validate(jwt_key, secret_key=secret)
+    print(f"签名验证: {'✓ 有效' if is_valid else '✗ 无效'}")
+    if info and "payload" in info:
+        print(f"解析信息:")
+        for k, v in info["payload"].items():
+            print(f"  {k}: {v}")
+
+    print("\n" + "=" * 60)
+    print("使用说明:")
+    print("=" * 60)
+    print("""
+建议的生产环境使用方式:
+
+1. 生成高安全级别的 Key:
+   key = generate_api_key(
+       prefix="sk",
+       environment="prod",
+       length=32,
+       include_checksum=True
+   )
+
+2. 使用带项目标识的 Key 便于管理:
+   key = generate_api_key(
+       prefix="sk",
+       project_id="your_project_id"
+   )
+
+3. 使用 HMAC 签名防止篡改:
+   key = generate_api_key(
+       format_type=KeyFormat.JWT_STYLE,
+       secret_key=your_secret_key
+   )
+
+4. 批量生成并保存到文件:
+   keys = generate_api_keys_batch(
+       count=100,
+       save_to_file="api_keys.txt"
+   )
+
+安全建议:
+- 在生产环境使用 32 字节(256 bit)以上的密钥长度
+- 妥善保管 secret_key,不要硬编码在代码中
+- 定期轮换 API Key
+- 使用环境变量或密钥管理系统存储敏感信息
+""")

+ 166 - 0
utils_test/standard_new_Test/README.md

@@ -0,0 +1,166 @@
+# 标准库匹配规则系统 - 内存处理版本
+
+基于 `standard_timeliness_new.md` 文档实现的标准库时效性审查系统,采用**内存数据处理**架构。
+
+## 架构设计
+
+```
+┌─────────────────────────────────────────────────────────────┐
+│                    StandardMatchingService                   │
+│                      (对外服务接口)                           │
+└───────────────────────┬─────────────────────────────────────┘
+                        │
+        ┌───────────────┴───────────────┐
+        │                               │
+┌───────▼────────┐            ┌────────▼────────┐
+│StandardRepository│          │ StandardMatcher │
+│   (数据仓库)    │            │   (匹配逻辑)     │
+└───────┬────────┘            └─────────────────┘
+        │
+┌───────▼────────┐
+│   MySQL DAO    │
+│  (一次性加载)   │
+└────────────────┘
+```
+
+### 核心组件
+
+| 组件 | 职责 | 说明 |
+|------|------|------|
+| `StandardRepository` | 内存数据存储和索引 | 加载数据后建立多索引加速查询 |
+| `StandardMatcher` | 匹配规则逻辑 | 纯内存匹配,无数据库访问 |
+| `StandardMatchingService` | 对外服务接口 | 统一入口,管理数据加载 |
+| `StandardDAO` | 数据库访问 | 只负责一次性加载所有数据 |
+
+## 文件结构
+
+```
+utils_test/standard_new_Test/
+├── standard_dao.py              # 数据访问层(一次性加载)
+├── standard_service.py          # 核心业务逻辑(内存处理)
+│   ├── StandardRepository       # 数据仓库类
+│   ├── StandardMatcher          # 匹配器类
+│   └── StandardMatchingService  # 服务类
+├── test_app.py                  # 实际调用测试
+├── test_standard_matching.py    # 单元测试
+└── README.md                    # 说明文档
+```
+
+## 标准库数据结构
+
+| 字段 | 说明 |
+|------|------|
+| id | 序号 |
+| standard_number | 标准号 |
+| standard_name (chinese_name) | 标准名称 |
+| validity | 时效性 (XH-现行, SX-试行, FZ-废止) |
+
+## 五种匹配结果状态
+
+| 情况 | 条件 | process_result | status_code | final_result |
+|------|------|----------------|-------------|--------------|
+| 1 | 名称+标准号都匹配,现行/试行 | 状态正常 | OK | 无问题 |
+| 2 | 名称+标准号都匹配,废止,有现行替代 | 状态被替代 | SUBSTITUTED | 《标准》(号)已废止,替代《标准》(号) |
+| 3 | 名称+标准号都匹配,废止,无替代 | 状态废止无现行 | ABOLISHED | 《标准》(号)已废止,无现行状态 |
+| 4 | 名称或标准号只有一个匹配 | 不匹配 | MISMATCH | 《提取》(号)与实际《标准》(号)不匹配 |
+| 5 | 都不匹配 | 标准库不存在 | NOT_FOUND | 《标准》(号)标准库不存在,请确认 |
+
+## 使用方法
+
+### 1. 初始化服务(一次性加载数据到内存)
+
+```python
+from utils_test.standard_new_Test.standard_service import StandardMatchingService
+
+# Mock 模式(无需数据库)
+service = StandardMatchingService(db_pool=None)
+await service.initialize()
+
+# 真实数据库模式
+from foundation.database.base.sql.async_mysql_conn_pool import AsyncMySQLPool
+db_pool = AsyncMySQLPool()
+await db_pool.initialize()
+service = StandardMatchingService(db_pool=db_pool)
+await service.initialize()  # 从MySQL加载所有数据到内存
+```
+
+### 2. 单个标准检查
+
+```python
+result = service.check_single(
+    seq_no=1,
+    standard_name="铁路桥涵设计规范",
+    standard_number="TB 10002-2017"
+)
+
+print(f"状态: {result.status_code}")  # OK
+print(f"结果: {result.final_result}")  # 无问题
+```
+
+### 3. 批量检查
+
+```python
+standards = [
+    {"standard_name": "铁路桥涵设计规范", "standard_number": "TB 10002-2017"},
+    {"standard_name": "缆索起重机", "standard_number": "GB/T 28756-2012"},
+]
+
+results = service.check_standards(standards)
+
+for r in results:
+    print(f"{r.seq_no}. {r.original_name} ({r.original_number})")
+    print(f"   状态: {r.status_code}")
+    print(f"   结果: {r.final_result}")
+    if r.substitute_number:
+        print(f"   替代: {r.substitute_name} ({r.substitute_number})")
+```
+
+## 运行测试
+
+```bash
+# 运行实际调用测试
+cd utils_test/standard_new_Test
+python test_app.py
+
+# 运行单元测试
+python -m pytest test_standard_matching.py -v
+```
+
+## 代码设计特点
+
+### 1. 内存数据处理
+- 服务初始化时一次性从MySQL加载所有数据到内存
+- 后续匹配操作完全在内存中进行,无数据库访问
+- 适合标准库数据量不大但需要高频查询的场景
+
+### 2. 可维护性优化
+- **分层架构**:Repository(数据)+ Matcher(逻辑)+ Service(接口)
+- **单一职责**:每个方法只做一件事,如 `_set_ok_result()`、`_handle_abolished()`
+- **索引优化**:标准号、名称多索引加速内存查询
+
+### 3. 匹配规则实现
+匹配流程拆分为多个独立方法:
+```
+match()
+├── _handle_number_matched()      # 标准号匹配
+│   ├── _handle_full_match()      # 名称也匹配
+│   │   ├── _set_ok_result()      # 现行/试行
+│   │   └── _handle_abolished()   # 废止
+│   └── _handle_name_mismatch()   # 名称不匹配
+└── _handle_number_not_matched()  # 标准号不匹配
+    ├── _check_name_in_records()
+    └── _search_by_name_only()
+```
+
+## 数据表结构
+
+```sql
+CREATE TABLE t_samp_standard_base_info (
+    id INT PRIMARY KEY AUTO_INCREMENT,
+    chinese_name VARCHAR(500) COMMENT '标准名称',
+    standard_number VARCHAR(100) COMMENT '标准编号',
+    validity VARCHAR(10) COMMENT '时效性 (XH-现行, SX-试行, FZ-废止)',
+    INDEX idx_number (standard_number),
+    INDEX idx_name (chinese_name)
+) COMMENT='标准库基础信息表';
+```

+ 255 - 0
utils_test/standard_new_Test/TEST_CASES.md

@@ -0,0 +1,255 @@
+# 标准库匹配规则测试案例文档
+
+> 根据 `standard_timeliness_new.md` 文档生成
+> 文件位置: `utils_test/standard_new_Test/test_standard_matching_rules.py`
+
+## 测试案例统计
+
+| 类别 | 测试数量 | 说明 |
+|------|---------|------|
+| 情况1-正常(OK) | 5 | 名称+标准号都匹配,现行/试行 |
+| 情况2-被替代(SUBSTITUTED) | 2 | 名称+标准号都匹配,废止,有现行替代 |
+| 情况3-废止无替代(ABOLISHED) | 3 | 名称+标准号都匹配,废止,无替代 |
+| 情况4-不匹配(MISMATCH) | 6 | 名称或标准号只有一个匹配,现行状态 |
+| 情况5-不存在(NOT_FOUND) | 3 | 名称和标准号都不匹配 |
+| 边界情况 | 5 | 特殊场景测试 |
+| 批量测试 | 1 | 混合场景批量验证 |
+| **总计** | **25** | |
+
+---
+
+## 详细测试案例
+
+### 情况1: 正常(OK)- 5个案例
+
+测试类: `TestCaseOK`
+
+| 编号 | 测试名称 | 输入标准名称 | 输入标准号 | 库中状态 | 预期结果 |
+|------|---------|-------------|-----------|---------|---------|
+| TC-OK-01 | 基本匹配 | 铁路桥涵设计规范 | TB 10002-2017 | XH | OK |
+| TC-OK-02 | 输入带书名号 | 《铁路桥涵设计规范》 | TB 10002-2017 | XH | OK |
+| TC-OK-03 | 试行状态 | 混凝土结构耐久性设计标准 | GB/T 50476-2019 | SX | OK |
+| TC-OK-04 | 带空格名称 | 铁路混凝土工程施工质量验收标准 | TB 10424-2018 | XH | OK |
+| TC-OK-05 | 库中带书名号 | 铁路工程抗震设计规范 | GB 50111-2006 | XH | OK |
+
+**验证规则**:
+- 名称和标准号完全匹配
+- 支持书名号变体(输入/库中带或不带)
+- 支持空格差异
+- 现行(XH)和试行(SX)都返回OK
+
+---
+
+### 情况2: 被替代(SUBSTITUTED)- 2个案例
+
+测试类: `TestCaseSubstituted`
+
+| 编号 | 测试名称 | 输入标准名称 | 输入标准号 | 库中状态 | 替代标准 | 预期结果 |
+|------|---------|-------------|-----------|---------|---------|---------|
+| TC-SUB-01 | 单条替代 | 起重机 钢丝绳 保养、维护、检验和报废 | GB/T 5972-2016 | FZ→XH | GB/T 5972-2023 | SUBSTITUTED |
+| TC-SUB-02 | 带书名号输入 | 《起重机 钢丝绳 保养、维护、检验和报废》 | GB/T 5972-2016 | FZ→XH | GB/T 5972-2023 | SUBSTITUTED |
+
+**验证规则**:
+- 输入标准已废止(FZ)
+- 库中有同名现行替代标准
+- 返回最新版本的替代标准信息
+- 消息包含"已废止"和"替代"关键词
+
+---
+
+### 情况3: 废止无替代(ABOLISHED)- 3个案例
+
+测试类: `TestCaseAbolished`
+
+| 编号 | 测试名称 | 输入标准名称 | 输入标准号 | 库中状态 | 是否有替代 | 预期结果 |
+|------|---------|-------------|-----------|---------|-----------|---------|
+| TC-ABOL-01 | 缆索起重机 | 缆索起重机 | GB/T 28756-2012 | FZ | 无 | ABOLISHED |
+| TC-ABOL-02 | 电力高处作业防坠器 | 电力高处作业防坠器 | DL/T 1147-2009 | FZ | 无 | ABOLISHED |
+| TC-ABOL-03 | 多版本废止 | 旧版施工规范 | TB 10001-2000 | FZ(多个) | 无 | ABOLISHED |
+
+**验证规则**:
+- 输入标准已废止(FZ)
+- 库中没有同名现行替代标准
+- 返回"废止无现行"状态
+- 消息包含"已废止,无现行状态"
+
+---
+
+### 情况4: 不匹配(MISMATCH)- 6个案例
+
+测试类: `TestCaseMismatch`
+
+| 编号 | 测试名称 | 输入标准名称 | 输入标准号 | 库中匹配记录 | 预期结果 |
+|------|---------|-------------|-----------|-------------|---------|
+| TC-MIS-01 | 年份不匹配 | 公路水运危险性较大工程专项施工方案编制审查规程 | JT/T 1495-2023 | 名称同, JT/T 1495-2024 XH | MISMATCH |
+| TC-MIS-02 | 带书名号年份不匹配 | 《公路水运危险性较大工程专项施工方案编制审查规程》 | JT/T 1495-2023 | 名称同, JT/T 1495-2024 XH | MISMATCH |
+| TC-MIS-03 | 名称匹配年份错误 | 铁路桥涵设计规范 | TB 10002-2020 | 名称同, TB 10002-2017 XH | MISMATCH |
+| TC-MIS-04 | 前缀匹配名称模糊 | 钢结构设计标准 | GB 50017-2010 | 钢结构设计标准, GB 50017-2017 XH | MISMATCH/NOT_FOUND |
+| TC-MIS-05 | 标准号匹配名称不匹配(现行) | 铁路桥涵设计 | TB 10002-2017 | 铁路桥涵设计规范, TB 10002-2017 XH | MISMATCH |
+| TC-MIS-06 | 标准号匹配名称不匹配(废止) | 某个错误名称 | GB/T 28756-2012 | 缆索起重机, GB/T 28756-2012 FZ | ABOLISHED |
+
+**验证规则**:
+- 标准号匹配但名称不匹配,或反之
+- 现行状态返回MISMATCH
+- 废止状态按废止逻辑处理(ABOLISHED或SUBSTITUTED)
+- 返回实际库中的标准信息
+
+---
+
+### 情况5: 不存在(NOT_FOUND)- 3个案例
+
+测试类: `TestCaseNotFound`
+
+| 编号 | 测试名称 | 输入标准名称 | 输入标准号 | 库中是否存在 | 预期结果 |
+|------|---------|-------------|-----------|-------------|---------|
+| TC-NF-01 | 完全不存在 | 完全不存在的标准名称 | GB/T 99999-9999 | 不存在 | NOT_FOUND |
+| TC-NF-02 | 格式正确但不存在 | 某个规范 | TB 88888-2099 | 不存在 | NOT_FOUND |
+| TC-NF-03 | 名称部分相似 | 桥涵设计 | TB 10002-2017 | 不匹配 | NOT_FOUND/MISMATCH |
+
+**验证规则**:
+- 名称和标准号都无法在库中找到匹配
+- 返回"标准库不存在"状态
+- 消息提示用户确认
+
+---
+
+### 边界情况 - 5个案例
+
+测试类: `TestCaseEdgeCases`
+
+| 编号 | 测试名称 | 输入 | 说明 | 预期结果 |
+|------|---------|------|------|---------|
+| TC-EDGE-01 | 多版本选择最新 | 多版本标准测试, GB/T 99999-2015 | 库中有2015(FZ), 2020(XH), 2023(XH) | SUBSTITUTED, 返回2023版 |
+| TC-EDGE-02 | 空标准号 | 无标准号规范, "" | 仅按名称查询 | MISMATCH/NOT_FOUND |
+| TC-EDGE-03 | 特殊字符 | 《特殊(字符)》规范, Q/CR 9001-2020 | 名称含特殊字符 | OK |
+| TC-EDGE-04 | 全角空格 | 铁路桥涵 设计规范, TB 10002-2017 | 名称含全角空格 | OK |
+| TC-EDGE-05 | 空名称 | "", TB 10002-2017 | 名称为空字符串 | NOT_FOUND/MISMATCH |
+
+---
+
+### 批量测试 - 1个案例
+
+测试类: `TestCaseBatch`
+
+| 编号 | 测试名称 | 输入列表 | 预期结果 |
+|------|---------|---------|---------|
+| TC-BATCH-01 | 混合标准批量测试 | [OK, SUBSTITUTED, ABOLISHED, MISMATCH, NOT_FOUND] | 按顺序返回对应状态码 |
+
+**验证规则**:
+- 批量处理多个标准
+- 每个标准返回对应的状态
+- 保持输入顺序
+
+---
+
+## 测试数据构造
+
+### Mock数据定义
+
+```python
+def build_mock_data():
+    return [
+        # 情况1: 正常
+        {"id": 1, "standard_name": "铁路桥涵设计规范", "standard_number": "TB 10002-2017", "validity": "XH"},
+        {"id": 2, "standard_name": "《铁路工程抗震设计规范》", "standard_number": "GB 50111-2006", "validity": "XH"},
+        {"id": 3, "standard_name": "混凝土结构耐久性设计标准", "standard_number": "GB/T 50476-2019", "validity": "SX"},
+        {"id": 4, "standard_name": "铁路混凝土工程施工质量验收标准", "standard_number": "TB 10424-2018", "validity": "XH"},
+
+        # 情况2: 被替代
+        {"id": 5, "standard_name": "起重机 钢丝绳 保养、维护、检验和报废", "standard_number": "GB/T 5972-2016", "validity": "FZ"},
+        {"id": 6, "standard_name": "起重机 钢丝绳 保养、维护、检验和报废", "standard_number": "GB/T 5972-2023", "validity": "XH"},
+
+        # 情况3: 废止无替代
+        {"id": 7, "standard_name": "缆索起重机", "standard_number": "GB/T 28756-2012", "validity": "FZ"},
+        {"id": 8, "standard_name": "电力高处作业防坠器", "standard_number": "DL/T 1147-2009", "validity": "FZ"},
+        {"id": 9, "standard_name": "旧版施工规范", "standard_number": "TB 10001-2000", "validity": "FZ"},
+        {"id": 10, "standard_name": "旧版施工规范", "standard_number": "TB 10001-2005", "validity": "FZ"},
+
+        # 情况4: 不匹配
+        {"id": 11, "standard_name": "公路水运危险性较大工程专项施工方案编制审查规程", "standard_number": "JT/T 1495-2024", "validity": "XH"},
+        {"id": 12, "standard_name": "建筑地基基础设计规范", "standard_number": "GB 50007-2011", "validity": "XH"},
+        {"id": 13, "standard_name": "钢结构设计标准", "standard_number": "GB 50017-2017", "validity": "XH"},
+
+        # 边界: 多版本
+        {"id": 14, "standard_name": "多版本标准测试", "standard_number": "GB/T 99999-2015", "validity": "FZ"},
+        {"id": 15, "standard_name": "多版本标准测试", "standard_number": "GB/T 99999-2020", "validity": "XH"},
+        {"id": 16, "standard_name": "多版本标准测试", "standard_number": "GB/T 99999-2023", "validity": "XH"},
+
+        # 边界: 其他
+        {"id": 17, "standard_name": "无标准号规范", "standard_number": "DB 51/T 9999-2020", "validity": "XH"},
+        {"id": 18, "standard_name": "《特殊(字符)》规范", "standard_number": "Q/CR 9001-2020", "validity": "XH"},
+    ]
+```
+
+---
+
+## 运行测试
+
+```bash
+# 运行所有测试
+cd utils_test/standard_new_Test
+python -m pytest test_standard_matching_rules.py -v
+
+# 运行特定类别的测试
+python -m pytest test_standard_matching_rules.py::TestCaseOK -v
+python -m pytest test_standard_matching_rules.py::TestCaseSubstituted -v
+python -m pytest test_standard_matching_rules.py::TestCaseMismatch -v
+
+# 生成HTML报告
+python -m pytest test_standard_matching_rules.py --html=report.html
+```
+
+---
+
+## 状态码说明
+
+| 状态码 | 说明 | 消息格式 |
+|--------|------|---------|
+| OK | 正常 | 无问题 |
+| SUBSTITUTED | 被替代 | 《标准》(号)已废止,替代《标准》(号) |
+| ABOLISHED | 废止无现行 | 《标准》(号)已废止,无现行状态 |
+| MISMATCH | 不匹配 | 《提取》(号)与 实际《标准》(号)不匹配 |
+| NOT_FOUND | 不存在 | 《标准》(号)标准库不存在,请确认 |
+
+---
+
+## 匹配规则流程图(文字版)
+
+```
+开始
+│
+├─► 标准号精确匹配?
+│   │
+│   ├─► 是 ► 名称匹配?
+│   │   │
+│   │   ├─► 是 ► 时效性检查
+│   │   │   │
+│   │   │   ├─► 现行/试行 ► OK
+│   │   │   └─► 废止 ► 查找替代 ► 有则SUBSTITUTED, 无则ABOLISHED
+│   │   │
+│   │   └─► 否 ► 名称模糊匹配?
+│   │       │
+│   │       ├─► 是 ► 时效性检查 ► MISMATCH(现行) 或 废止处理
+│   │       └─► 否 ► NOT_FOUND
+│   │
+│   └─► 否 ► 标准号模糊匹配?
+│       │
+│       ├─► 是 ► 名称匹配?
+│       │   │
+│       │   ├─► 是 ► 时效性检查 ► MISMATCH(现行) 或 废止处理
+│       │   └─► 否 ► NOT_FOUND
+│       │
+│       └─► 否 ► 名称模糊匹配?
+│           │
+│           ├─► 是 ► 名称精确匹配?
+│           │   │
+│           │   ├─► 是 ► 时效性检查 ► MISMATCH(现行) 或 NOT_FOUND(废止)
+│           │   └─► 否 ► NOT_FOUND
+│           │
+│           └─► 否 ► NOT_FOUND
+```
+
+---
+
+*文档生成时间: 2026-03-30*
+*配套代码: test_standard_matching_rules.py*

+ 49 - 0
utils_test/standard_new_Test/standard_dao.py

@@ -0,0 +1,49 @@
+"""
+标准库数据访问对象
+用于从MySQL一次性加载所有标准数据到内存
+"""
+import sys
+import os
+# 添加项目根目录到 Python 路径
+current_dir = os.path.dirname(os.path.abspath(__file__))
+project_root = os.path.dirname(os.path.dirname(current_dir))
+if project_root not in sys.path:
+    sys.path.insert(0, project_root)
+
+from typing import List, Dict, Optional
+
+
+class StandardDAO:
+    """标准库数据访问对象 - 负责从数据库加载数据"""
+
+    def __init__(self, db_pool):
+        self.db_pool = db_pool
+        self.table_name = "t_samp_standard_base_info"
+
+    async def load_all_standards(self) -> List[Dict]:
+        """
+        一次性从MySQL加载所有标准数据到内存
+
+        Returns:
+            标准列表,每个标准包含:
+                - id: 序号
+                - standard_name: 标准名称(chinese_name)
+                - standard_number: 标准号
+                - validity: 时效性(XH/SX/FZ)
+        """
+        query = f"""
+            SELECT
+                id,
+                chinese_name AS standard_name,
+                standard_number,
+                validity
+            FROM {self.table_name}
+        """
+        try:
+            async with self.db_pool.get_cursor() as cursor:
+                await cursor.execute(query)
+                results = await cursor.fetchall()
+                return [dict(row) for row in results] if results else []
+        except Exception as e:
+            print(f"加载标准库数据失败: {e}")
+            raise

+ 674 - 0
utils_test/standard_new_Test/standard_service.py

@@ -0,0 +1,674 @@
+"""
+标准库匹配规则服务 - 内存处理版本
+实现施工方案审查-时效性审查的匹配逻辑
+
+架构:
+- StandardRepository: 内存数据存储和索引
+- StandardMatcher: 匹配规则逻辑
+- StandardMatchingService: 对外服务接口
+"""
+import sys
+import os
+# 添加项目根目录到 Python 路径
+current_dir = os.path.dirname(os.path.abspath(__file__))
+project_root = os.path.dirname(os.path.dirname(current_dir))
+if project_root not in sys.path:
+    sys.path.insert(0, project_root)
+
+from typing import List, Dict, Optional, Set
+from dataclasses import dataclass, field
+from enum import Enum
+
+
+class ValidityStatus(Enum):
+    """时效性状态"""
+    CURRENT = "XH"      # 现行
+    TRIAL = "SX"        # 试行
+    ABOLISHED = "FZ"    # 废止
+
+
+class MatchResultCode(Enum):
+    """匹配结果状态码"""
+    OK = "OK"                       # 正常
+    SUBSTITUTED = "SUBSTITUTED"     # 被替代
+    ABOLISHED = "ABOLISHED"         # 废止无现行
+    MISMATCH = "MISMATCH"           # 不匹配
+    NOT_FOUND = "NOT_FOUND"         # 标准库不存在
+
+
+@dataclass
+class StandardMatchResult:
+    """标准匹配结果数据结构"""
+    seq_no: int = 0                             # 序号
+    original_name: str = ""                      # 原始标准名称
+    original_number: str = ""                    # 原始标准号
+    substitute_number: Optional[str] = None      # 替代标准号(如果有)
+    substitute_name: Optional[str] = None        # 替代标准名称(如果有)
+    process_result: str = ""                     # 处理结果状态
+    status_code: str = ""                        # 状态码
+    final_result: str = ""                       # 最终结果消息
+
+
+@dataclass
+class StandardRecord:
+    """标准记录数据结构"""
+    id: int
+    standard_name: str
+    standard_number: str
+    validity: str
+
+
+class StandardRepository:
+    """
+    标准库内存数据仓库
+    负责加载和索引标准数据,支持快速查询
+    """
+
+    def __init__(self):
+        # 原始数据列表
+        self._records: List[StandardRecord] = []
+
+        # 索引结构,加速查询
+        self._number_index: Dict[str, StandardRecord] = {}  # 标准号 -> 记录
+        self._name_index: Dict[str, List[StandardRecord]] = {}  # 名称 -> 记录列表
+        self._current_records: List[StandardRecord] = []  # 现行/试行标准列表
+
+    def load_data(self, raw_data: List[Dict]):
+        """
+        加载原始数据到内存并建立索引
+
+        Args:
+            raw_data: 从数据库查询的原始标准数据列表
+        """
+        self._records = []
+        self._number_index = {}
+        self._name_index = {}
+        self._current_records = []
+
+        for item in raw_data:
+            # 跳过无效数据
+            standard_number = item.get("standard_number")
+            standard_name = item.get("standard_name")
+            if not standard_number or not standard_name:
+                continue
+
+            record = StandardRecord(
+                id=item.get("id", 0),
+                standard_name=standard_name,
+                standard_number=standard_number,
+                validity=item.get("validity", "")
+            )
+            self._records.append(record)
+
+            # 建立标准号索引
+            self._number_index[record.standard_number] = record
+
+            # 建立名称索引(一个名称可能对应多个标准号)
+            if record.standard_name not in self._name_index:
+                self._name_index[record.standard_name] = []
+            self._name_index[record.standard_name].append(record)
+
+            # 收集现行/试行标准
+            if record.validity in [ValidityStatus.CURRENT.value, ValidityStatus.TRIAL.value]:
+                self._current_records.append(record)
+
+        # 对现行标准按标准号降序排序(用于找最新替代标准)
+        # 处理可能的 None 值
+        self._current_records.sort(
+            key=lambda r: r.standard_number or "",
+            reverse=True
+        )
+        print(f"self._records={len(self._records)}")
+
+    def find_by_number_exact(self, standard_number: str) -> Optional[StandardRecord]:
+        """精确匹配标准号"""
+        return self._number_index.get(standard_number)
+
+    def find_by_name_exact(self, standard_name: str) -> Optional[StandardRecord]:
+        """精确匹配标准名称(返回第一个)"""
+        records = self._name_index.get(standard_name, [])
+        return records[0] if records else None
+
+    def find_by_name_fuzzy(self, standard_name: str) -> List[StandardRecord]:
+        """模糊匹配标准名称"""
+        results = []
+        for name, records in self._name_index.items():
+            if standard_name in name or name in standard_name:
+                results.extend(records)
+        return results
+
+    def find_by_number_fuzzy(self, standard_number: str) -> List[StandardRecord]:
+        """模糊匹配标准号"""
+        results = []
+        # 提取前缀(如 GB/T 5972)
+        parts = standard_number.split("-")
+        prefix = parts[0] if parts else standard_number
+
+        for number, record in self._number_index.items():
+            # 前缀匹配
+            if number.startswith(prefix):
+                results.append(record)
+        return results
+
+    def find_current_by_name(self, standard_name: str) -> List[StandardRecord]:
+        """查询指定名称的现行/试行标准(支持模糊匹配)"""
+        results = []
+        for record in self._current_records:
+            # 精确匹配
+            if record.standard_name == standard_name:
+                results.append(record)
+            # 模糊匹配(忽略空格、书名号等)
+            elif self._is_name_fuzzy_match_for_repo(record.standard_name, standard_name):
+                results.append(record)
+        return results
+
+    def _is_name_fuzzy_match_for_repo(self, name1: str, name2: str) -> bool:
+        """判断两个标准名称是否模糊匹配"""
+        clean1 = name1.replace("《", "").replace("》", "").replace(" ", "").replace(" ", "")
+        clean2 = name2.replace("《", "").replace("》", "").replace(" ", "").replace(" ", "")
+        return clean1 == clean2
+
+    def get_all_records(self) -> List[StandardRecord]:
+        """获取所有记录"""
+        return self._records.copy()
+
+
+class StandardMatcher:
+    """
+    标准匹配器
+    实现标准库匹配规则的核心逻辑
+    """
+
+    def __init__(self, repository: StandardRepository):
+        self.repo = repository
+
+    def match(self, seq_no: int, input_name: str, input_number: str) -> StandardMatchResult:
+        """
+        执行标准匹配
+
+        匹配流程:
+        1. 标准号精确匹配
+        2. 根据匹配结果进入不同分支处理
+        """
+        # 去除前后空格
+        input_name = input_name.strip() if input_name else input_name
+        input_number = input_number.strip() if input_number else input_number
+
+        # 清洗书名号和括号
+        input_name = self._clean_brackets_and_booknames(input_name)
+        input_number = self._clean_brackets_and_booknames(input_number)
+
+        result = StandardMatchResult(
+            seq_no=seq_no,
+            original_name=input_name,
+            original_number=input_number
+        )
+
+        # 步骤1: 精确匹配标准号
+        match_by_number = self.repo.find_by_number_exact(input_number)
+
+        if match_by_number:
+            # 分支A: 标准号匹配成功
+            return self._handle_number_matched(result, match_by_number, input_name)
+        else:
+            # 分支B: 标准号未匹配
+            return self._handle_number_not_matched(result, input_name, input_number)
+
+    def _handle_number_matched(
+        self,
+        result: StandardMatchResult,
+        db_record: StandardRecord,
+        input_name: str
+    ) -> StandardMatchResult:
+        """处理标准号匹配成功的情况"""
+        # 检查名称是否匹配
+        if db_record.standard_name == input_name:
+            # 名称也匹配
+            return self._handle_full_match(result, db_record)
+        else:
+            # 名称不匹配
+            return self._handle_name_mismatch(result, db_record, input_name)
+
+    def _handle_full_match(
+        self,
+        result: StandardMatchResult,
+        db_record: StandardRecord
+    ) -> StandardMatchResult:
+        """处理名称和标准号都完全匹配的情况"""
+        if db_record.validity in [ValidityStatus.CURRENT.value, ValidityStatus.TRIAL.value]:
+            # 情况1: 现行或试行 - 状态正常
+            return self._set_ok_result(result)
+        else:
+            # 废止状态 - 查找替代标准
+            return self._handle_abolished(result, db_record)
+
+    def _handle_name_mismatch(
+        self,
+        result: StandardMatchResult,
+        db_record: StandardRecord,
+        input_name: str
+    ) -> StandardMatchResult:
+        """处理标准号匹配但名称不匹配的情况"""
+        # 首先检查是否是名称模糊匹配(忽略空格、书名号等)
+        if self._is_name_fuzzy_match(db_record.standard_name, input_name):
+            # 名称模糊匹配成功,按完全匹配处理
+            return self._handle_full_match(result, db_record)
+
+        # 尝试用输入的名称模糊匹配
+        name_matches = self.repo.find_by_name_fuzzy(input_name)
+
+        # 查找精确名称匹配
+        exact_match = self._find_exact_name_match(name_matches, input_name)
+
+        if exact_match:
+            # 找到名称匹配的记录
+            return self._handle_fuzzy_name_match(result, exact_match)
+
+        # 尝试在模糊匹配结果中查找模糊名称匹配
+        for match in name_matches:
+            if self._is_name_fuzzy_match(match.standard_name, input_name):
+                return self._handle_fuzzy_name_match(result, match)
+
+        # 名称完全不匹配,但标准号已匹配成功
+        # 说明该标准存在于库中,应返回不匹配而非不存在
+        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)
+
+    def _handle_number_not_matched(
+        self,
+        result: StandardMatchResult,
+        input_name: str,
+        input_number: str
+    ) -> StandardMatchResult:
+        """处理标准号未匹配的情况"""
+        # 尝试模糊匹配标准号
+        fuzzy_number_matches = self.repo.find_by_number_fuzzy(input_number)
+
+        if fuzzy_number_matches:
+            # 检查名称是否匹配
+            return self._check_name_in_records(result, fuzzy_number_matches, input_name)
+        else:
+            # 尝试直接按名称查询
+            return self._search_by_name_only(result, input_name)
+
+    def _check_name_in_records(
+        self,
+        result: StandardMatchResult,
+        records: List[StandardRecord],
+        input_name: str
+    ) -> StandardMatchResult:
+        """在一批记录中查找名称匹配"""
+        # 首先尝试精确匹配
+        for record in records:
+            if record.standard_name == input_name:
+                # 名称匹配,检查状态
+                if record.validity in [ValidityStatus.CURRENT.value, ValidityStatus.TRIAL.value]:
+                    return self._set_mismatch_result(result, record)
+                elif record.validity == ValidityStatus.ABOLISHED.value:
+                    return self._handle_abolished(result, record)
+
+        # 尝试模糊名称匹配(忽略空格和书名号)
+        for record in records:
+            if self._is_name_fuzzy_match(record.standard_name, input_name):
+                # 名称模糊匹配成功
+                if record.validity in [ValidityStatus.CURRENT.value, ValidityStatus.TRIAL.value]:
+                    return self._set_mismatch_result(result, record)
+                elif record.validity == ValidityStatus.ABOLISHED.value:
+                    return self._handle_abolished(result, record)
+
+        # 名称不匹配
+        return self._set_not_found_result(result)
+
+    def _search_by_name_only(
+        self,
+        result: StandardMatchResult,
+        input_name: str
+    ) -> StandardMatchResult:
+        """仅通过名称查询"""
+        # 精确匹配名称
+        name_match = self.repo.find_by_name_exact(input_name)
+
+        if name_match:
+            if name_match.validity in [ValidityStatus.CURRENT.value, ValidityStatus.TRIAL.value]:
+                return self._set_mismatch_result(result, name_match)
+            elif name_match.validity == ValidityStatus.ABOLISHED.value:
+                return self._set_not_found_result(result)
+
+        # 模糊匹配名称
+        fuzzy_matches = self.repo.find_by_name_fuzzy(input_name)
+
+        # 首先尝试精确匹配
+        exact_match = self._find_exact_name_match(fuzzy_matches, input_name)
+        if exact_match:
+            if exact_match.validity in [ValidityStatus.CURRENT.value, ValidityStatus.TRIAL.value]:
+                return self._set_mismatch_result(result, exact_match)
+
+        # 尝试模糊名称匹配(忽略空格、书名号等)
+        for match in fuzzy_matches:
+            if self._is_name_fuzzy_match(match.standard_name, input_name):
+                if match.validity in [ValidityStatus.CURRENT.value, ValidityStatus.TRIAL.value]:
+                    return self._set_mismatch_result(result, match)
+                elif match.validity == ValidityStatus.ABOLISHED.value:
+                    return self._handle_abolished(result, match)
+
+        return self._set_not_found_result(result)
+
+    def _handle_fuzzy_name_match(
+        self,
+        result: StandardMatchResult,
+        match_record: StandardRecord
+    ) -> StandardMatchResult:
+        """处理模糊名称匹配成功的情况"""
+        if match_record.validity in [ValidityStatus.CURRENT.value, ValidityStatus.TRIAL.value]:
+            return self._set_mismatch_result(result, match_record)
+        elif match_record.validity == ValidityStatus.ABOLISHED.value:
+            return self._handle_abolished(result, match_record)
+        return self._set_not_found_result(result)
+
+    def _handle_abolished(
+        self,
+        result: StandardMatchResult,
+        abolished_record: StandardRecord
+    ) -> StandardMatchResult:
+        """处理已废止标准的情况"""
+        # 查询同名现行标准作为替代
+        substitutes = self.repo.find_current_by_name(abolished_record.standard_name)
+
+        if substitutes:
+            # 有替代标准,取最新的(已按标准号降序)
+            latest = substitutes[0]
+            return self._set_substituted_result(result, latest)
+        else:
+            # 无替代标准
+            return self._set_abolished_result(result)
+
+    # ========== 格式化方法 ==========
+
+    def _format_standard_name(self, name: str) -> str:
+        """格式化标准名称,确保只有一个《》包裹"""
+        if not name:
+            return name
+        name = name.strip()
+        # 去除已有的书名号
+        while name.startswith('《'):
+            name = name[1:]
+        while name.endswith('》'):
+            name = name[:-1]
+        return f"《{name}》"
+
+    def _format_standard_number(self, number: str) -> str:
+        """格式化标准编号,确保用()包裹"""
+        if not number:
+            return number
+        number = number.strip()
+        # 去除已有的括号
+        if number.startswith('(') or number.startswith('('):
+            number = number[1:]
+        if number.endswith(')') or number.endswith(')'):
+            number = number[:-1]
+        return f"({number})"
+
+    # ========== 结果设置方法(每个方法职责单一) ==========
+
+    def _set_ok_result(self, result: StandardMatchResult) -> StandardMatchResult:
+        """设置状态正常的结果"""
+        result.process_result = "正常"
+        result.status_code = MatchResultCode.OK.value
+        result.final_result = "无问题"
+        return result
+
+    def _set_substituted_result(
+        self,
+        result: StandardMatchResult,
+        substitute: StandardRecord
+    ) -> StandardMatchResult:
+        """设置被替代的结果"""
+        result.substitute_name = self._format_standard_name(substitute.standard_name)
+        result.substitute_number = self._format_standard_number(substitute.standard_number)
+        result.process_result = "被替代"
+        result.status_code = MatchResultCode.SUBSTITUTED.value
+        result.final_result = (
+            f"{self._format_standard_name(result.original_name)}"
+            f"{self._format_standard_number(result.original_number)}已废止,"
+            f"替代{self._format_standard_name(substitute.standard_name)}"
+            f"{self._format_standard_number(substitute.standard_number)}"
+        )
+        return result
+
+    def _set_abolished_result(self, result: StandardMatchResult) -> StandardMatchResult:
+        """设置废止无替代的结果"""
+        result.process_result = "废止无现行"
+        result.status_code = MatchResultCode.ABOLISHED.value
+        result.final_result = (
+            f"{self._format_standard_name(result.original_name)}"
+            f"{self._format_standard_number(result.original_number)}已废止,无现行状态"
+        )
+        return result
+
+    def _set_mismatch_result(
+        self,
+        result: StandardMatchResult,
+        actual: StandardRecord
+    ) -> StandardMatchResult:
+        """设置不匹配的结果"""
+        result.substitute_name = self._format_standard_name(actual.standard_name)
+        result.substitute_number = self._format_standard_number(actual.standard_number)
+        result.process_result = "不匹配"
+        result.status_code = MatchResultCode.MISMATCH.value
+        result.final_result = (
+            f"{self._format_standard_name(result.original_name)}"
+            f"{self._format_standard_number(result.original_number)}"
+            f"与实际{self._format_standard_name(actual.standard_name)}"
+            f"{self._format_standard_number(actual.standard_number)}不匹配"
+        )
+        return result
+
+    def _set_not_found_result(self, result: StandardMatchResult) -> StandardMatchResult:
+        """设置不存在的结果"""
+        result.process_result = "标准库不存在"
+        result.status_code = MatchResultCode.NOT_FOUND.value
+        result.final_result = (
+            f"{self._format_standard_name(result.original_name)}"
+            f"{self._format_standard_number(result.original_number)}标准库不存在,请确认"
+        )
+        return result
+
+    # ========== 工具方法 ==========
+
+    def _is_name_fuzzy_match(self, name1: str, name2: str) -> bool:
+        """
+        判断两个标准名称是否模糊匹配
+        只去除书名号,保留中间空格(中间空格属于名称的一部分)
+        """
+        # 清理书名号,但保留中间空格
+        clean1 = name1.replace("《", "").replace("》", "")
+        clean2 = name2.replace("《", "").replace("》", "")
+        return clean1 == clean2
+
+    def _clean_brackets_and_booknames(self, text: str) -> str:
+        """
+        清洗字符串前后的书名号和括号
+        包括:《》()()
+        """
+        if not text:
+            return text
+
+        # 循环去除前后的书名号和括号,直到没有变化
+        changed = True
+        while changed:
+            changed = False
+            original = text
+
+            # 去除前导的书名号和括号
+            if text.startswith("《"):
+                text = text[1:]
+                changed = True
+            if text.startswith("》"):
+                text = text[1:]
+                changed = True
+            if text.startswith("("):
+                text = text[1:]
+                changed = True
+            if text.startswith(")"):
+                text = text[1:]
+                changed = True
+            if text.startswith("("):
+                text = text[1:]
+                changed = True
+            if text.startswith(")"):
+                text = text[1:]
+                changed = True
+
+            # 去除尾随的书名号和括号
+            if text.endswith("《"):
+                text = text[:-1]
+                changed = True
+            if text.endswith("》"):
+                text = text[:-1]
+                changed = True
+            if text.endswith("("):
+                text = text[:-1]
+                changed = True
+            if text.endswith(")"):
+                text = text[:-1]
+                changed = True
+            if text.endswith("("):
+                text = text[:-1]
+                changed = True
+            if text.endswith(")"):
+                text = text[:-1]
+                changed = True
+
+            # 如果文本变空了,停止循环
+            if not text:
+                break
+
+        return text
+
+    def _find_exact_name_match(
+        self,
+        records: List[StandardRecord],
+        target_name: str
+    ) -> Optional[StandardRecord]:
+        """在记录列表中查找精确名称匹配"""
+        for record in records:
+            if record.standard_name == target_name:
+                return record
+        return None
+
+
+class StandardMatchingService:
+    """
+    标准库匹配服务
+    对外暴露的统一接口
+    """
+
+    def __init__(self, db_pool=None):
+        """
+        初始化服务
+
+        Args:
+            db_pool: 数据库连接池,如果为None则使用Mock数据
+        """
+        self.db_pool = db_pool
+        self.repository = StandardRepository()
+        self.matcher = StandardMatcher(self.repository)
+        self._initialized = False
+
+    async def initialize(self):
+        """
+        初始化:从数据库加载数据到内存
+        只需要执行一次
+        """
+        if self._initialized:
+            return
+
+        if self.db_pool:
+            # 从真实数据库加载
+            from utils_test.standard_new_Test.standard_dao import StandardDAO
+            dao = StandardDAO(self.db_pool)
+            raw_data = await dao.load_all_standards()
+            print(f"raw_data={len(raw_data)}")
+        else:
+            # 使用Mock数据
+            raw_data = self._get_mock_data()
+
+        self.repository.load_data(raw_data)
+        self._initialized = True
+
+    async def close(self):
+        """关闭服务,清理资源"""
+        if self.db_pool:
+            await self.db_pool.close()
+        self._initialized = False
+
+    def check_standards(self, standards: List[Dict[str, str]]) -> List[StandardMatchResult]:
+        """
+        批量检查标准列表
+
+        Args:
+            standards: 标准列表,每个元素包含:
+                - standard_name: 标准名称(原始)
+                - standard_number: 标准号(原始)
+
+        Returns:
+            List[StandardMatchResult]: 匹配结果列表
+        """
+        if not self._initialized:
+            raise RuntimeError("服务未初始化,请先调用 initialize()")
+
+        results = []
+        for idx, std in enumerate(standards, start=1):
+            result = self.matcher.match(
+                seq_no=idx,
+                input_name=std.get("standard_name", ""),
+                input_number=std.get("standard_number", "")
+            )
+            results.append(result)
+        return results
+
+    def check_single(
+        self,
+        seq_no: int,
+        standard_name: str,
+        standard_number: str
+    ) -> StandardMatchResult:
+        """
+        检查单个标准
+
+        Args:
+            seq_no: 序号
+            standard_name: 标准名称
+            standard_number: 标准号
+
+        Returns:
+            StandardMatchResult: 匹配结果
+        """
+        if not self._initialized:
+            raise RuntimeError("服务未初始化,请先调用 initialize()")
+
+        return self.matcher.match(seq_no, standard_name, standard_number)
+
+    def _get_mock_data(self) -> List[Dict]:
+        """获取Mock数据 - 文档中的7个测试案例"""
+        return [
+            # 情况1: 正常现行标准
+            {"id": 1, "standard_name": "铁路桥涵设计规范", "standard_number": "TB 10002-2017", "validity": "XH"},
+            {"id": 2, "standard_name": "铁路工程抗震设计规范", "standard_number": "GB 50111-2006", "validity": "XH"},
+            {"id": 3, "standard_name": "铁路混凝土工程施工质量验收标准", "standard_number": "TB 10424-2018", "validity": "XH"},
+
+            # 情况4: 不匹配(年份错误)- 输入2023,实际2024
+            {"id": 4, "standard_name": "公路水运危险性较大工程专项施工方案编制审查规程", "standard_number": "JT/T 1495-2024", "validity": "XH"},
+
+            # 情况2: 被替代(废止+有现行替代)
+            {"id": 5, "standard_name": "起重机 钢丝绳 保养、维护、检验和报废", "standard_number": "GB/T 5972-2016", "validity": "FZ"},
+            {"id": 6, "standard_name": "起重机 钢丝绳 保养、维护、检验和报废", "standard_number": "GB/T 5972-2023", "validity": "XH"},
+
+            # 情况3: 废止无替代
+            {"id": 7, "standard_name": "缆索起重机", "standard_number": "GB/T 28756-2012", "validity": "FZ"},
+            {"id": 8, "standard_name": "电力高处作业防坠器", "standard_number": "DL/T 1147-2009", "validity": "FZ"},
+        ]

+ 163 - 0
utils_test/standard_new_Test/standard_timeliness_new.md

@@ -0,0 +1,163 @@
+conda activate lq_agent
+
+conda activate lq_agent
+
+### 施工方案审查-时效性审查设计
+   - 1、标准库数据结构 
+      - 序号
+      - 标准号 
+      - 标准名称
+      - 时效性 (XH  现行、试行  SX、 废止 FZ)
+  
+    - 2、标准数据来源
+      - 数据库查询(MySQL),可以一次查询所有 或 筛选
+      - 通过搜索引擎查询,再让大模型整理为标准库数据结构
+  
+    - 3、根据数据结构制定查询规则
+      - 查询规则
+        - 处理流程图规则 ,参考【标准库匹配规则】
+      - 查询入参结构定义 list
+        - 标准名称 (原始)
+        - 标准号 (原始)
+      - 查询返回结构定义
+       - 输出结构说明 list
+        - 序号
+        - 标准名称(原始的)
+        - 标准号(原始的)
+        - 替代标准号(如果有)
+        - 替代标准名称(如果有)
+        - 处理结果状态(五种情况:参考 查询处理状态定义)
+        - 处理结果消息提示:(五种情况:参考 查询处理状态定义)
+      - 查询处理状态定义
+         - 标准名称和标准号的匹配情况,现行状态 ,状态正常, 提示 "正常" 
+         - 标准名称和标准号的匹配情况,废止状态,有现行状态 , 状态被替代 , 提示 "《标准名称》(标准号)已废止,替代《标准名称》(标准号)"
+         - 标准名称和标准号的匹配情况,废止状态,无现行状态 , 状态废止无现行  , 提示 "《标准名称》(标准号)已废止,无现行状态"
+         - 标准名称 或 标准号 其中一个匹配情况,现行状态 , 状态不匹配 , 提示 "《标准名称》(标准号) 与 实际《标准名称》(标准号)不匹配"
+         - 标准名称 或 标准号 都不匹配 , 状态不存在, 提示 "《标准名称》(标准号)标准库不存在"
+  
+          ┌──────┬─────────────────────────────────────┬────────────────┬─────────────┬───────────────────────────────────────────┐
+          │ 情况 │                条件                  │ process_result │ status_code │               final_result                │
+          ├──────┼─────────────────────────────────────┼────────────────┼─────────────┼───────────────────────────────────────────┤
+          │ 1    │ 名称+标准号都匹配,现行/试行          │ 状态正常        │ OK          │ 无问题                                     │
+          ├──────┼─────────────────────────────────────┼────────────────┼─────────────┼───────────────────────────────────────────┤
+          │ 2    │ 名称+标准号都匹配,废止,有现行替代    │ 状态被替代      │ SUBSTITUTED │ 《标准》(号)已废止,替代《标准》(号)      │
+          ├──────┼─────────────────────────────────────┼────────────────┼─────────────┼───────────────────────────────────────────┤
+          │ 3    │ 名称+标准号都匹配,废止,无替代        │ 状态废止无现行  │ ABOLISHED   │ 《标准》(号)已废止,无现行状态             │
+          ├──────┼─────────────────────────────────────┼────────────────┼─────────────┼───────────────────────────────────────────┤
+          │ 4    │ 名称或标准号只有一个匹配              │ 不匹配          │ MISMATCH    │ 《提取》(号)与 实际《标准》(号)不匹配    │
+          ├──────┼─────────────────────────────────────┼────────────────┼─────────────┼───────────────────────────────────────────┤
+          │ 5    │ 都不匹配                             │ 标准库不存在    │ NOT_FOUND   │ 《标准》(号)标准库不存在,请确认           │
+          └──────┴─────────────────────────────────────┴────────────────┴─────────────┴───────────────────────────────────────────┘
+
+    - 4、
+  
+#### 标准库匹配规则
+  **1. 开始**
+  *   **动作**:查询标准库信息
+  *   **判断**:标准号全匹配?
+
+      *   **分支 A:存在 (Yes)**
+          *   **判断**:名称全匹配?
+              *   **分支 A1:存在 (Yes)**
+                  *   **判断**:验证时效性?
+                      *   **情况 1**:现行、试行 -> **结果**:返回正常
+                      *   **情况 2**:废止
+                          *   **动作**:根据名称查询最新标准(返回可能多条)
+                          *   **动作**:遍历每个最新标准记录
+                              *   **判断**:是否存在?
+                                  *   **情况 1**:不存在 -> **结果**:返回废止,无现行
+                                  *   **情况 2**:存在
+                                      *   **判断**:验证时效性?
+                                          *   **情况 1**:废止都没有找到 -> **结果**:返回废止,无现行
+                                          *   **情况 2**:现行、试行 -> **结果**:被替代,新的标准号、标准名称
+              *   **分支 A2:不存在 (No)**
+                  *   **判断**:名称模糊匹配?
+                      *   **情况 1**:不匹配 -> **结果**:标准号与名称不存在
+                      *   **情况 2**:匹配
+                          *   **判断**:验证时效性?
+                              *   **情况 1**:现行、试行 -> **结果**:标准号与名称不匹配,返回最新标准号与名称
+                              *   **情况 2**:废止 -> **动作**:查询被替代子流程
+
+      *   **分支 B:不存在 (No)**
+          *   **判断**:标准号模糊查询?
+              *   **分支 B1:存在 (Yes)**
+                  *   **判断**:名称全匹配?
+                      *   **情况 1**:不匹配 -> **结果**:标准号与名称不存在
+                      *   **情况 2**:匹配
+                          *   **判断**:验证时效性?
+                              *   **情况 1**:现行、试行 -> **结果**:标准号与名称不匹配,返回最新标准号与名称
+                              *   **情况 2**:废止 -> **动作**:查询被替代子流程
+              *   **分支 B2:不存在 (No)**
+                  *   **判断**:名称模糊查询?
+                      *   **情况 1**:不存在 -> **结果**:返回不存在
+                      *   **情况 2**:存在
+                          *   **判断**:名称全匹配?
+                              *   **情况 1**:不匹配 -> **结果**:标准号与名称不存在
+                              *   **情况 2**:匹配
+                                  *   **判断**:验证时效性?
+                                      *   **情况 1**:现行、试行 -> **结果**:标准号与名称不匹配(名称匹配,标准不匹配)
+                                      *   **情况 2**:废止 -> **结果**:标准号与名称不存在
+
+
+
+#### 废止数据
+  《电力高处作业防坠器》(DL/T 1147-2009)      FZ
+  《缆索起重机》(GB/T 28756-2012)							FZ
+
+#### 被替代标准名称和标准号的逻辑说明
+  - 1、首先根据标准名称和标准号查询状态,如果是废止状态,则根据标准名称查询状态为现行的,则此条标准名称和标准号为被替代标准名称和标准号,并返回被替代标准名称和标准号
+  - 2、根据标准名称查询时 返回多条标准名称和标准号,再代码里面进行逻辑判断
+  - 3、根据标准号查询时,返回标准名称,再根据标准名称查询 返回多条标准名称和标准号,再代码里面进行逻辑判断
+  - 4、类似如下数据:
+      《起重机 钢丝绳 保养、维护、检验和报废》GB/T 5972-2016				   FZ
+      《起重机 钢丝绳 保养、维护、检验和报废》GB/T 5972-2023					 XZ
+
+
+#### 目前测试的编制依据状态
+
+    (1)《铁路桥涵设计规范》 (TB 10002-2017)                  正常 
+    (2)《铁路工程抗震设计规范》 (GB 50111-2006)              正常 
+    (3)《铁路混凝土工程施工质量验收标准》 (TB 10424-2018)     正常 
+    (4)《公路水运危险性较大工程专项施工方案编制审查规程》(JT/T 1495-2023) 不匹配 《公路水运危险性较大工程专项施工方案编制审查规程》(JT/T 1495-2024)
+    (5)《起重机 钢丝绳 保养、维护、检验和报废》(GB/T 5972-2016)  被替代  《起重机 钢丝绳 保养、维护、检验和报废》(GB/T 5972-2023)
+    (6)《缆索起重机》(GB/T 28756-2012)	                    废止
+    (7)《电力高处作业防坠器》(DL/T 1147-2009)                废止
+
+
+
+
+
+
+#### 实现逻辑
+  - 1、查询数据源,目前从MySQL数据库一次查询到所有数据 保存到【标准库数据结构】
+    - select id  , chinese_name , standard_number , validity  t_samp_standard_base_info
+    - sql说明 chinese_name 标准名称, standard_number 标准编号, validity 时效性 (XH  现行、试行  SX、 废止 FZ)
+    - 
+
+  - 2、目前主程序中公共组件
+      - 2.1、代码先临时生成到 utils_test/standard_new_Test目录下,先做单元测试
+        - dao 数据库操作类
+        - service 业务操作
+        - test 单元测试
+      - 2.2、Mysql 查询公共组件 foundation.database.base.sql.async_mysql_conn_pool.py  公共继承 foundation.database.base.sql.async_mysql_base_dao.py AsyncBaseDAO
+
+
+
+
+#### 修正目前的问题
+   - 1、标准库数据结构 
+      - 序号
+      - 标准号 
+      - 标准名称
+      - 时效性 (XH  现行、试行  SX、 废止 FZ)
+  
+    - 2、标准数据来源
+      - 数据库查询(MySQL),可以一次查询所有 或 筛选
+
+    - 3、标准库数据处理在内存中初始化数据结构,通过MySQL一次查询所有数据,然后进行数据处理,处理结果保存在内存中,然后进行数据查询。
+    - 4、标准库匹配规则 是通过代码匹配标准库数据结构来实现的,而非通过数据库查询来实现,请调整代码逻辑,注意标准库匹配规则的逻辑实现 可维护性,不要在一个函数中写太多的逻辑代码
+
+
+ -- 存在问题的记录	
+	DL/T1147-2018  电力高处作业防坠器    DL/T 1147-2018  《电力高处作业防坠器》
+	DL/T1147-2009	《电力高处作业防坠器》  DL/T 1147-2009	《电力高处作业防坠器》

+ 221 - 0
utils_test/standard_new_Test/test_app.py

@@ -0,0 +1,221 @@
+"""
+标准库匹配规则 - 实际调用测试
+展示如何实际调用 StandardMatchingService 进行标准检查
+
+使用说明:
+1. MOCK_MODE = True:  使用模拟数据,无需数据库
+2. MOCK_MODE = False: 使用真实数据库,需要确保 config/config.ini 配置正确
+"""
+
+import sys
+import os
+
+# ==================== 配置区域 ====================
+# 设置为 True 使用 Mock 模式(无需数据库),False 使用真实数据库
+MOCK_MODE = False
+
+# ==================== 路径设置 ====================
+CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))
+PROJECT_ROOT = os.path.dirname(os.path.dirname(CURRENT_DIR))
+sys.path.insert(0, PROJECT_ROOT)
+
+# 真实模式下需要修改工作目录以读取配置文件
+if not MOCK_MODE:
+    os.chdir(PROJECT_ROOT)
+
+import asyncio
+import json
+from utils_test.standard_new_Test.standard_service import (
+    StandardMatchingService,
+    MatchResultCode
+)
+
+
+# ==================== 服务创建 ====================
+
+async def create_service():
+    """创建并初始化服务实例"""
+    if MOCK_MODE:
+        print("[Mock 模式] 使用模拟数据,无需数据库连接")
+        service = StandardMatchingService(db_pool=None)
+        await service.initialize()
+        return service
+    else:
+        print("[真实模式] 连接数据库并加载标准数据...")
+        # 延迟导入,避免 Mock 模式下也需要安装依赖
+        from foundation.database.base.sql.async_mysql_conn_pool import AsyncMySQLPool
+        db_pool = AsyncMySQLPool()
+        await db_pool.initialize()
+
+        service = StandardMatchingService(db_pool=db_pool)
+        await service.initialize()
+        return service
+
+
+# ==================== 测试函数 ====================
+
+async def test_single_standard(service: StandardMatchingService):
+    """测试单个标准检查"""
+    print("\n" + "=" * 60)
+    print("【测试1】单个标准检查")
+    print("=" * 60)
+
+    result = service.check_single(
+        seq_no=1,
+        standard_name="铁路桥涵设计规范",
+        standard_number="TB 10002-2017"
+    )
+
+    print(f"\n序号: {result.seq_no}")
+    print(f"原始标准: 《{result.original_name}》({result.original_number})")
+    print(f"处理结果: {result.process_result}")
+    print(f"状态码: {result.status_code}")
+    print(f"结果消息: {result.final_result}")
+    if result.substitute_number:
+        print(f"替代标准: 《{result.substitute_name}》({result.substitute_number})")
+
+
+async def test_batch_check(service: StandardMatchingService):
+    """测试批量标准检查 - 文档中的7个示例"""
+    print("\n" + "=" * 60)
+    print("【测试2】批量标准检查 - 文档中的7个示例")
+    print("=" * 60)
+
+    standards = [
+        {"standard_name": "铁路桥涵设计规范", "standard_number": "TB 10002-2017"},
+        {"standard_name": "铁路工程抗震设计规范", "standard_number": "GB 50111-2006"},
+        {"standard_name": "铁路混凝土工程施工质量验收标准", "standard_number": "TB 10424-2018"},
+        {"standard_name": "公路水运危险性较大工程专项施工方案编制审查规程", "standard_number": "JT/T 1495-2023"},
+        {"standard_name": "起重机 钢丝绳 保养、维护、检验和报废", "standard_number": "GB/T 5972-2016"},
+        {"standard_name": "缆索起重机", "standard_number": "GB/T 28756-2012"},
+        {"standard_name": "电力高处作业防坠器", "standard_number": "DL/T 1147-2009"},
+
+
+    #    {"standard_name": "铁路桥涵设计", "standard_number": "TB 10002-2017"},
+    #    {"standard_name": "铁路桥涵设计规范", "standard_number": "TB 10002"},
+    #    {"standard_name": "铁路桥涵设计", "standard_number": "TB 10002"},
+    #    {"standard_name": "《铁路桥涵设计规范》", "standard_number": " (TB 10002-2017)"},
+    #     {"standard_name": "《铁路桥涵设计规范》", "standard_number": "(TB 10002-2017)"},
+    #    {"standard_name": " 铁路桥涵设计规范 ", "standard_number": "  TB 10002-2017 "},
+    #    {"standard_name": "铁路桥涵 设计规范", "standard_number": "TB 10002  -2017"},
+    #     {"standard_name": "铁路桥涵设计规范", "standard_number": "TB 10002  -2017"},
+    #      {"standard_name": "铁路桥涵 设计规范", "standard_number": "TB 10002-2017"},
+    ]
+
+    results = service.check_standards(standards)
+
+    print("\n检查结果汇总:")
+    print("-" * 80)
+    print(f"{'序号':<4} {'标准名称':<40} {'标准号':<20} {'状态':<12}")
+    print("-" * 80)
+
+    for r in results:
+        print(f"{r.seq_no:<4} {r.original_name:<40} {r.original_number:<20} {r.status_code:<12}")
+
+    print("\n" + "=" * 80)
+    print("详细结果:")
+    print("=" * 80)
+
+    for r in results:
+        print(f"\n【{r.seq_no}】{r.original_name}")
+        print(f"    标准号: {r.original_number}")
+        print(f"    状态: {r.process_result} ({r.status_code})")
+        print(f"    结果: {r.final_result}")
+        if r.substitute_number:
+            print(f"    ↳ 替代: 《{r.substitute_name}》({r.substitute_number})")
+
+
+async def test_various_cases(service: StandardMatchingService):
+    """测试各种边界情况"""
+    print("\n" + "=" * 60)
+    print("【测试3】各种边界情况测试")
+    print("=" * 60)
+
+    test_cases = [
+        {"name": "测试现行标准", "standard_name": "铁路桥涵设计规范", "standard_number": "TB 10002-2017"},
+        {"name": "测试被替代", "standard_name": "起重机 钢丝绳 保养、维护、检验和报废", "standard_number": "GB/T 5972-2016"},
+        {"name": "测试废止无替代", "standard_name": "缆索起重机", "standard_number": "GB/T 28756-2012"},
+        {"name": "测试不匹配", "standard_name": "公路水运危险性较大工程专项施工方案编制审查规程", "standard_number": "JT/T 1495-2023"},
+        {"name": "测试不存在", "standard_name": "不存在的标准", "standard_number": "GB/T 99999-9999"},
+    ]
+
+    for case in test_cases:
+        result = service.check_single(
+            seq_no=1,
+            standard_name=case["standard_name"],
+            standard_number=case["standard_number"]
+        )
+        print(f"\n--- {case['name']} ---")
+        print(f"输入: 《{result.original_name}》({result.original_number})")
+        print(f"输出: [{result.status_code}] {result.final_result}")
+
+
+async def export_results_to_json(service: StandardMatchingService, filename: str = "standard_check_results.json"):
+    """导出检查结果为JSON文件"""
+    print("\n" + "=" * 60)
+    print("【测试4】导出结果为JSON")
+    print("=" * 60)
+
+    standards = [
+        {"standard_name": "铁路桥涵设计规范", "standard_number": "TB 10002-2017"},
+        {"standard_name": "铁路混凝土工程施工质量验收标准", "standard_number": "TB 10424-2018"},
+        {"standard_name": "公路水运危险性较大工程专项施工方案编制审查规程", "standard_number": "JT/T 1495-2023"},
+        {"standard_name": "起重机 钢丝绳 保养、维护、检验和报废", "standard_number": "GB/T 5972-2016"},
+    ]
+
+    results = service.check_standards(standards)
+
+    output = []
+    for r in results:
+        output.append({
+            "seq_no": r.seq_no,
+            "original_name": r.original_name,
+            "original_number": r.original_number,
+            "substitute_name": r.substitute_name,
+            "substitute_number": r.substitute_number,
+            "process_result": r.process_result,
+            "status_code": r.status_code,
+            "final_result": r.final_result
+        })
+
+    with open(filename, "w", encoding="utf-8") as f:
+        json.dump(output, f, ensure_ascii=False, indent=2)
+
+    print(f"\n结果已导出到: {filename}")
+    print(json.dumps(output, ensure_ascii=False, indent=2))
+
+
+# ==================== 主函数 ====================
+
+async def main():
+    """主函数"""
+    print("=" * 80)
+    print("标准库匹配规则 - 实际调用测试(内存处理版本)")
+    print("=" * 80)
+    print(f"\n当前模式: {'Mock 测试模式(无需数据库)' if MOCK_MODE else '真实数据库模式'}")
+    print("-" * 80)
+
+    service = None
+    try:
+        # 创建并初始化服务
+        service = await create_service()
+        print(f"服务初始化成功! 数据已加载到内存\n")
+
+        # 执行测试
+        await test_single_standard(service)
+        await test_batch_check(service)
+        await test_various_cases(service)
+        # await export_results_to_json(service)  # 取消注释以测试JSON导出
+
+        print("\n" + "=" * 80)
+        print("所有测试执行完毕!")
+        print("=" * 80)
+
+    except Exception as e:
+        print(f"\n错误: {e}")
+        import traceback
+        traceback.print_exc()
+
+
+if __name__ == "__main__":
+    asyncio.run(main())

+ 207 - 0
utils_test/standard_new_Test/test_standard_matching.py

@@ -0,0 +1,207 @@
+"""
+标准库匹配规则单元测试 - 内存处理版本
+测试文档中定义的5种匹配情况
+"""
+import sys
+import os
+# 添加项目根目录到 Python 路径
+current_dir = os.path.dirname(os.path.abspath(__file__))
+project_root = os.path.dirname(os.path.dirname(current_dir))
+if project_root not in sys.path:
+    sys.path.insert(0, project_root)
+
+import pytest
+import asyncio
+from utils_test.standard_new_Test.standard_service import (
+    StandardRepository,
+    StandardMatcher,
+    StandardMatchingService,
+    MatchResultCode,
+    ValidityStatus,
+    StandardRecord
+)
+
+
+@pytest.fixture
+def mock_repository():
+    """创建模拟的数据仓库"""
+    repo = StandardRepository()
+    mock_data = [
+        # 情况1: 正常现行标准
+        {"id": 1, "standard_name": "铁路桥涵设计规范", "standard_number": "TB 10002-2017", "validity": "XH"},
+        {"id": 2, "standard_name": "铁路工程抗震设计规范", "standard_number": "GB 50111-2006", "validity": "XH"},
+        {"id": 3, "standard_name": "铁路混凝土工程施工质量验收标准", "standard_number": "TB 10424-2018", "validity": "XH"},
+
+        # 情况4: 不匹配(年份错误)- 输入2023,实际2024
+        {"id": 4, "standard_name": "公路水运危险性较大工程专项施工方案编制审查规程", "standard_number": "JT/T 1495-2024", "validity": "XH"},
+
+        # 情况2: 被替代(废止+有现行替代)
+        {"id": 5, "standard_name": "起重机 钢丝绳 保养、维护、检验和报废", "standard_number": "GB/T 5972-2016", "validity": "FZ"},
+        {"id": 6, "standard_name": "起重机 钢丝绳 保养、维护、检验和报废", "standard_number": "GB/T 5972-2023", "validity": "XH"},
+
+        # 情况3: 废止无替代
+        {"id": 7, "standard_name": "缆索起重机", "standard_number": "GB/T 28756-2012", "validity": "FZ"},
+        {"id": 8, "standard_name": "电力高处作业防坠器", "standard_number": "DL/T 1147-2009", "validity": "FZ"},
+    ]
+    repo.load_data(mock_data)
+    return repo
+
+
+@pytest.fixture
+def matcher(mock_repository):
+    """创建匹配器实例"""
+    return StandardMatcher(mock_repository)
+
+
+@pytest.fixture
+def mock_service():
+    """创建使用Mock数据的服务"""
+    service = StandardMatchingService(db_pool=None)
+    # 同步初始化(测试时使用event loop)
+    loop = asyncio.get_event_loop()
+    loop.run_until_complete(service.initialize())
+    return service
+
+
+class TestStandardRepository:
+    """测试数据仓库"""
+
+    def test_load_data(self, mock_repository):
+        """测试数据加载"""
+        assert len(mock_repository.get_all_records()) == 8
+
+    def test_find_by_number_exact(self, mock_repository):
+        """测试精确匹配标准号"""
+        result = mock_repository.find_by_number_exact("TB 10002-2017")
+        assert result is not None
+        assert result.standard_name == "铁路桥涵设计规范"
+
+    def test_find_by_name_exact(self, mock_repository):
+        """测试精确匹配名称"""
+        result = mock_repository.find_by_name_exact("铁路桥涵设计规范")
+        assert result is not None
+        assert result.standard_number == "TB 10002-2017"
+
+    def test_find_current_by_name(self, mock_repository):
+        """测试查询现行标准"""
+        results = mock_repository.find_current_by_name("起重机 钢丝绳 保养、维护、检验和报废")
+        assert len(results) == 1
+        assert results[0].standard_number == "GB/T 5972-2023"
+
+
+class TestStandardMatcher:
+    """测试匹配器"""
+
+    def test_case1_ok(self, matcher):
+        """情况1: 状态正常"""
+        result = matcher.match(1, "铁路桥涵设计规范", "TB 10002-2017")
+        assert result.status_code == MatchResultCode.OK.value
+        assert result.final_result == "无问题"
+
+    def test_case2_substituted(self, matcher):
+        """情况2: 被替代"""
+        result = matcher.match(1, "起重机 钢丝绳 保养、维护、检验和报废", "GB/T 5972-2016")
+        assert result.status_code == MatchResultCode.SUBSTITUTED.value
+        assert result.substitute_number == "GB/T 5972-2023"
+        assert "已废止" in result.final_result
+
+    def test_case3_abolished(self, matcher):
+        """情况3: 废止无替代"""
+        result = matcher.match(1, "缆索起重机", "GB/T 28756-2012")
+        assert result.status_code == MatchResultCode.ABOLISHED.value
+        assert "无现行状态" in result.final_result
+
+    def test_case4_mismatch(self, matcher):
+        """情况4: 不匹配"""
+        result = matcher.match(1, "公路水运危险性较大工程专项施工方案编制审查规程", "JT/T 1495-2023")
+        assert result.status_code == MatchResultCode.MISMATCH.value
+        assert result.substitute_number == "JT/T 1495-2024"
+
+    def test_case5_not_found(self, matcher):
+        """情况5: 不存在"""
+        result = matcher.match(1, "不存在的标准", "GB/T 99999-9999")
+        assert result.status_code == MatchResultCode.NOT_FOUND.value
+
+
+class TestStandardMatchingService:
+    """测试服务类"""
+
+    def test_check_single(self, mock_service):
+        """测试单个检查"""
+        result = mock_service.check_single(1, "铁路桥涵设计规范", "TB 10002-2017")
+        assert result.status_code == MatchResultCode.OK.value
+
+    def test_check_standards_batch(self, mock_service):
+        """测试批量检查"""
+        standards = [
+            {"standard_name": "铁路桥涵设计规范", "standard_number": "TB 10002-2017"},
+            {"standard_name": "缆索起重机", "standard_number": "GB/T 28756-2012"},
+            {"standard_name": "不存在的标准", "standard_number": "GB/T 99999-9999"},
+        ]
+        results = mock_service.check_standards(standards)
+        assert len(results) == 3
+        assert results[0].status_code == MatchResultCode.OK.value
+        assert results[1].status_code == MatchResultCode.ABOLISHED.value
+        assert results[2].status_code == MatchResultCode.NOT_FOUND.value
+
+
+class TestDocumentExamples:
+    """测试文档中列出的7个示例"""
+
+    @pytest.fixture
+    def doc_matcher(self):
+        """文档测试专用匹配器"""
+        repo = StandardRepository()
+        mock_data = [
+            {"id": 1, "standard_name": "铁路桥涵设计规范", "standard_number": "TB 10002-2017", "validity": "XH"},
+            {"id": 2, "standard_name": "铁路工程抗震设计规范", "standard_number": "GB 50111-2006", "validity": "XH"},
+            {"id": 3, "standard_name": "铁路混凝土工程施工质量验收标准", "standard_number": "TB 10424-2018", "validity": "XH"},
+            {"id": 4, "standard_name": "公路水运危险性较大工程专项施工方案编制审查规程", "standard_number": "JT/T 1495-2024", "validity": "XH"},
+            {"id": 5, "standard_name": "起重机 钢丝绳 保养、维护、检验和报废", "standard_number": "GB/T 5972-2016", "validity": "FZ"},
+            {"id": 6, "standard_name": "起重机 钢丝绳 保养、维护、检验和报废", "standard_number": "GB/T 5972-2023", "validity": "XH"},
+            {"id": 7, "standard_name": "缆索起重机", "standard_number": "GB/T 28756-2012", "validity": "FZ"},
+            {"id": 8, "standard_name": "电力高处作业防坠器", "standard_number": "DL/T 1147-2009", "validity": "FZ"},
+        ]
+        repo.load_data(mock_data)
+        return StandardMatcher(repo)
+
+    def test_example_1_railway_bridge(self, doc_matcher):
+        """(1)《铁路桥涵设计规范》(TB 10002-2017) - 正常"""
+        result = doc_matcher.match(1, "铁路桥涵设计规范", "TB 10002-2017")
+        assert result.status_code == MatchResultCode.OK.value
+
+    def test_example_2_seismic_design(self, doc_matcher):
+        """(2)《铁路工程抗震设计规范》(GB 50111-2006) - 正常"""
+        result = doc_matcher.match(1, "铁路工程抗震设计规范", "GB 50111-2006")
+        assert result.status_code == MatchResultCode.OK.value
+
+    def test_example_3_concrete(self, doc_matcher):
+        """(3)《铁路混凝土工程施工质量验收标准》(TB 10424-2018) - 正常"""
+        result = doc_matcher.match(1, "铁路混凝土工程施工质量验收标准", "TB 10424-2018")
+        assert result.status_code == MatchResultCode.OK.value
+
+    def test_example_4_highway_mismatch(self, doc_matcher):
+        """(4)年份不匹配 - 应为2024"""
+        result = doc_matcher.match(1, "公路水运危险性较大工程专项施工方案编制审查规程", "JT/T 1495-2023")
+        assert result.status_code == MatchResultCode.MISMATCH.value
+        assert result.substitute_number == "JT/T 1495-2024"
+
+    def test_example_5_crane_wire_substituted(self, doc_matcher):
+        """(5)被替代 GB/T 5972-2016 -> GB/T 5972-2023"""
+        result = doc_matcher.match(1, "起重机 钢丝绳 保养、维护、检验和报废", "GB/T 5972-2016")
+        assert result.status_code == MatchResultCode.SUBSTITUTED.value
+        assert result.substitute_number == "GB/T 5972-2023"
+
+    def test_example_6_cable_crane_abolished(self, doc_matcher):
+        """(6)废止无替代"""
+        result = doc_matcher.match(1, "缆索起重机", "GB/T 28756-2012")
+        assert result.status_code == MatchResultCode.ABOLISHED.value
+
+    def test_example_7_safety_device_abolished(self, doc_matcher):
+        """(7)废止无替代"""
+        result = doc_matcher.match(1, "电力高处作业防坠器", "DL/T 1147-2009")
+        assert result.status_code == MatchResultCode.ABOLISHED.value
+
+
+if __name__ == "__main__":
+    pytest.main([__file__, "-v"])

+ 417 - 0
utils_test/standard_new_Test/test_standard_matching_rules.py

@@ -0,0 +1,417 @@
+"""
+标准库匹配规则测试案例
+根据 standard_timeliness_new.md 文档中的匹配规则生成
+
+测试案例编号规则:
+- TC-OK-XX: 正常情况
+- TC-SUB-XX: 被替代情况
+- TC-ABOL-XX: 废止无替代情况
+- TC-MIS-XX: 不匹配情况
+- TC-NF-XX: 不存在情况
+"""
+
+import sys
+import os
+import pytest
+import asyncio
+
+# 添加项目根目录到 Python 路径
+current_dir = os.path.dirname(os.path.abspath(__file__))
+project_root = os.path.dirname(os.path.dirname(current_dir))
+if project_root not in sys.path:
+    sys.path.insert(0, project_root)
+
+from utils_test.standard_new_Test.standard_service import (
+    StandardRepository,
+    StandardMatcher,
+    StandardMatchingService,
+    MatchResultCode,
+    ValidityStatus,
+    StandardRecord
+)
+
+
+# ========================================
+# 测试数据构造
+# ========================================
+
+def build_mock_data():
+    """
+    构建测试数据集,覆盖所有匹配规则分支
+    """
+    return [
+        # ========== 情况1: 名称+标准号都匹配,现行/试行 ==========
+        # TC-OK-01: 标准格式
+        {"id": 1, "standard_name": "铁路桥涵设计规范", "standard_number": "TB 10002-2017", "validity": "XH"},
+        # TC-OK-02: 带书名号存储(测试名称清洗)
+        {"id": 2, "standard_name": "《铁路工程抗震设计规范》", "standard_number": "GB 50111-2006", "validity": "XH"},
+        # TC-OK-03: 试行状态
+        {"id": 3, "standard_name": "混凝土结构耐久性设计标准", "standard_number": "GB/T 50476-2019", "validity": "SX"},
+        # TC-OK-04: 带空格名称
+        {"id": 4, "standard_name": "铁路混凝土工程施工质量验收标准", "standard_number": "TB 10424-2018", "validity": "XH"},
+
+        # ========== 情况2: 名称+标准号都匹配,废止,有现行替代 ==========
+        # TC-SUB-01: 单条替代
+        {"id": 5, "standard_name": "起重机 钢丝绳 保养、维护、检验和报废", "standard_number": "GB/T 5972-2016", "validity": "FZ"},
+        {"id": 6, "standard_name": "起重机 钢丝绳 保养、维护、检验和报废", "standard_number": "GB/T 5972-2023", "validity": "XH"},
+
+        # ========== 情况3: 名称+标准号都匹配,废止,无替代 ==========
+        # TC-ABOL-01
+        {"id": 7, "standard_name": "缆索起重机", "standard_number": "GB/T 28756-2012", "validity": "FZ"},
+        # TC-ABOL-02
+        {"id": 8, "standard_name": "电力高处作业防坠器", "standard_number": "DL/T 1147-2009", "validity": "FZ"},
+        # TC-ABOL-03: 多版本废止
+        {"id": 9, "standard_name": "旧版施工规范", "standard_number": "TB 10001-2000", "validity": "FZ"},
+        {"id": 10, "standard_name": "旧版施工规范", "standard_number": "TB 10001-2005", "validity": "FZ"},
+
+        # ========== 情况4: 名称或标准号只有一个匹配(现行状态)==========
+        # TC-MIS-01: 标准号匹配,名称不匹配(年份错误)
+        {"id": 11, "standard_name": "公路水运危险性较大工程专项施工方案编制审查规程", "standard_number": "JT/T 1495-2024", "validity": "XH"},
+
+        # TC-MIS-02: 名称匹配,标准号不匹配
+        {"id": 12, "standard_name": "建筑地基基础设计规范", "standard_number": "GB 50007-2011", "validity": "XH"},
+
+        # TC-MIS-03: 标准号前缀匹配,名称模糊匹配
+        {"id": 13, "standard_name": "钢结构设计标准", "standard_number": "GB 50017-2017", "validity": "XH"},
+
+        # ========== 情况5: 都不匹配 ==========
+        # 数据库中没有以下标准,用于测试 NOT_FOUND
+        # TC-NF-01: 完全不存在的标准
+        # TC-NF-02: 标准号格式正确但不存在
+        # TC-NF-03: 名称部分匹配但不够相似
+
+        # ========== 边界情况 ==========
+        # TC-EDGE-01: 同一标准名称多个版本(选择最新现行)
+        {"id": 14, "standard_name": "多版本标准测试", "standard_number": "GB/T 99999-2015", "validity": "FZ"},
+        {"id": 15, "standard_name": "多版本标准测试", "standard_number": "GB/T 99999-2020", "validity": "XH"},
+        {"id": 16, "standard_name": "多版本标准测试", "standard_number": "GB/T 99999-2023", "validity": "XH"},
+
+        # TC-EDGE-02: 空标准号情况
+        {"id": 17, "standard_name": "无标准号规范", "standard_number": "DB 51/T 9999-2020", "validity": "XH"},
+
+        # TC-EDGE-03: 特殊字符名称
+        {"id": 18, "standard_name": "《特殊(字符)》规范", "standard_number": "Q/CR 9001-2020", "validity": "XH"},
+    ]
+
+
+@pytest.fixture
+def repository():
+    """创建并加载测试数据的仓库"""
+    repo = StandardRepository()
+    repo.load_data(build_mock_data())
+    return repo
+
+
+@pytest.fixture
+def matcher(repository):
+    """创建匹配器实例"""
+    return StandardMatcher(repository)
+
+
+# ========================================
+# 情况1: 正常(OK)
+# ========================================
+
+class TestCaseOK:
+    """
+    测试情况1: 名称+标准号都匹配,现行/试行
+    期望结果: status_code = OK, process_result = 正常
+    """
+
+    def test_tc_ok_01_basic_match(self, matcher):
+        """TC-OK-01: 基本匹配 - 名称和标准号完全匹配"""
+        result = matcher.match(1, "铁路桥涵设计规范", "TB 10002-2017")
+        assert result.status_code == MatchResultCode.OK.value
+        assert result.process_result == "正常"
+        assert result.final_result == "无问题"
+
+    def test_tc_ok_02_with_bookname_input(self, matcher):
+        """TC-OK-02: 输入带书名号,库中不带书名号"""
+        result = matcher.match(1, "《铁路桥涵设计规范》", "TB 10002-2017")
+        assert result.status_code == MatchResultCode.OK.value
+
+    def test_tc_ok_03_trial_status(self, matcher):
+        """TC-OK-03: 试行状态也返回正常"""
+        result = matcher.match(1, "混凝土结构耐久性设计标准", "GB/T 50476-2019")
+        assert result.status_code == MatchResultCode.OK.value
+        assert result.process_result == "正常"
+
+    def test_tc_ok_04_with_spaces(self, matcher):
+        """TC-OK-04: 名称带空格匹配"""
+        result = matcher.match(1, "铁路混凝土工程施工质量验收标准", "TB 10424-2018")
+        assert result.status_code == MatchResultCode.OK.value
+
+    def test_tc_ok_05_fuzzy_name_match(self, matcher):
+        """TC-OK-05: 名称模糊匹配(忽略书名号和空格)"""
+        # 库中带书名号,输入不带
+        result = matcher.match(1, "铁路工程抗震设计规范", "GB 50111-2006")
+        assert result.status_code == MatchResultCode.OK.value
+
+
+# ========================================
+# 情况2: 被替代(SUBSTITUTED)
+# ========================================
+
+class TestCaseSubstituted:
+    """
+    测试情况2: 名称+标准号都匹配,废止,有现行替代
+    期望结果: status_code = SUBSTITUTED, 返回替代标准信息
+    """
+
+    def test_tc_sub_01_single_replacement(self, matcher):
+        """TC-SUB-01: 单条替代标准"""
+        result = matcher.match(1, "起重机 钢丝绳 保养、维护、检验和报废", "GB/T 5972-2016")
+        assert result.status_code == MatchResultCode.SUBSTITUTED.value
+        assert result.process_result == "被替代"
+        assert result.substitute_number == "GB/T 5972-2023"
+        assert "已废止" in result.final_result
+        assert "替代" in result.final_result
+
+    def test_tc_sub_02_db_has_bookname(self, matcher):
+        """TC-SUB-02: 输入带书名号,测试名称匹配"""
+        result = matcher.match(1, "《起重机 钢丝绳 保养、维护、检验和报废》", "GB/T 5972-2016")
+        assert result.status_code == MatchResultCode.SUBSTITUTED.value
+
+
+# ========================================
+# 情况3: 废止无替代(ABOLISHED)
+# ========================================
+
+class TestCaseAbolished:
+    """
+    测试情况3: 名称+标准号都匹配,废止,无现行替代
+    期望结果: status_code = ABOLISHED, process_result = 废止无现行
+    """
+
+    def test_tc_abol_01_no_replacement(self, matcher):
+        """TC-ABOL-01: 缆索起重机,废止无替代"""
+        result = matcher.match(1, "缆索起重机", "GB/T 28756-2012")
+        assert result.status_code == MatchResultCode.ABOLISHED.value
+        assert result.process_result == "废止无现行"
+        assert "已废止,无现行状态" in result.final_result
+
+    def test_tc_abol_02_safety_device(self, matcher):
+        """TC-ABOL-02: 电力高处作业防坠器,废止无替代"""
+        result = matcher.match(1, "电力高处作业防坠器", "DL/T 1147-2009")
+        assert result.status_code == MatchResultCode.ABOLISHED.value
+        assert result.process_result == "废止无现行"
+
+    def test_tc_abol_03_multi_abolished(self, matcher):
+        """TC-ABOL-03: 多版本废止,无现行"""
+        result = matcher.match(1, "旧版施工规范", "TB 10001-2000")
+        assert result.status_code == MatchResultCode.ABOLISHED.value
+        assert "无现行状态" in result.final_result
+
+
+# ========================================
+# 情况4: 不匹配(MISMATCH)
+# ========================================
+
+class TestCaseMismatch:
+    """
+    测试情况4: 名称或标准号只有一个匹配,现行状态
+    期望结果: status_code = MISMATCH, 返回实际标准信息
+    """
+
+    def test_tc_mis_01_number_mismatch_year(self, matcher):
+        """TC-MIS-01: 标准号年份不匹配(2023 vs 2024)"""
+        result = matcher.match(1, "公路水运危险性较大工程专项施工方案编制审查规程", "JT/T 1495-2023")
+        assert result.status_code == MatchResultCode.MISMATCH.value
+        assert result.process_result == "不匹配"
+        assert result.substitute_number == "JT/T 1495-2024"
+        assert "与实际" in result.final_result
+
+    def test_tc_mis_02_number_mismatch_with_book(self, matcher):
+        """TC-MIS-02: 带书名号输入,标准号年份不匹配"""
+        result = matcher.match(1, "《公路水运危险性较大工程专项施工方案编制审查规程》", "JT/T 1495-2023")
+        assert result.status_code == MatchResultCode.MISMATCH.value
+        assert result.substitute_number == "JT/T 1495-2024"
+
+    def test_tc_mis_03_name_match_number_wrong(self, matcher):
+        """TC-MIS-03: 名称匹配,标准号完全错误"""
+        # 输入错误的年份
+        result = matcher.match(1, "铁路桥涵设计规范", "TB 10002-2020")
+        assert result.status_code == MatchResultCode.MISMATCH.value
+        assert result.substitute_number == "TB 10002-2017"
+
+    def test_tc_mis_05_number_match_name_mismatch_current(self, matcher):
+        """TC-MIS-05: 标准号匹配,名称完全不匹配,但标准为现行状态
+
+        用户场景:输入 "铁路桥涵设计" + "TB 10002-2017"
+        数据库有:"TB 10002-2017" + "铁路桥涵设计规范"(现行)
+        期望:返回 MISMATCH(不匹配),而不是 NOT_FOUND(标准库不存在)
+        """
+        result = matcher.match(1, "铁路桥涵设计", "TB 10002-2017")
+        # 标准号存在且现行,应该返回 MISMATCH 而非 NOT_FOUND
+        assert result.status_code == MatchResultCode.MISMATCH.value
+        assert result.process_result == "不匹配"
+        assert result.substitute_number == "TB 10002-2017"
+        assert "铁路桥涵设计规范" in result.substitute_name
+
+    def test_tc_mis_06_number_match_name_mismatch_abolished(self, matcher):
+        """TC-MIS-06: 标准号匹配,名称完全不匹配,但标准已废止"""
+        # 使用已废止的标准号但输入不同的名称
+        result = matcher.match(1, "某个错误名称", "GB/T 28756-2012")
+        # 标准号存在但已废止,应该返回 ABOLISHED
+        assert result.status_code == MatchResultCode.ABOLISHED.value
+        assert result.process_result == "废止无现行"
+
+
+# ========================================
+# 情况5: 不存在(NOT_FOUND)
+# ========================================
+
+class TestCaseNotFound:
+    """
+    测试情况5: 名称和标准号都不匹配
+    期望结果: status_code = NOT_FOUND
+    """
+
+    def test_tc_nf_01_completely_not_exist(self, matcher):
+        """TC-NF-01: 完全不存在的标准"""
+        result = matcher.match(1, "完全不存在的标准名称", "GB/T 99999-9999")
+        assert result.status_code == MatchResultCode.NOT_FOUND.value
+        assert result.process_result == "标准库不存在"
+        assert "标准库不存在,请确认" in result.final_result
+
+    def test_tc_nf_02_number_format_valid_but_not_exist(self, matcher):
+        """TC-NF-02: 标准号格式正确但不存在"""
+        result = matcher.match(1, "某个规范", "TB 88888-2099")
+        assert result.status_code == MatchResultCode.NOT_FOUND.value
+
+    def test_tc_nf_03_name_partial_no_match(self, matcher):
+        """TC-NF-03: 名称部分相似但不够匹配"""
+        result = matcher.match(1, "桥涵设计", "TB 10002-2017")
+        # 模糊匹配可能能找到,但精确匹配失败
+        # 根据实现可能返回 MISMATCH 或 NOT_FOUND
+        assert result.status_code in [MatchResultCode.NOT_FOUND.value, MatchResultCode.MISMATCH.value]
+
+
+# ========================================
+# 边界情况测试
+# ========================================
+
+class TestCaseEdgeCases:
+    """
+    边界情况测试
+    """
+
+    def test_tc_edge_01_multi_version_select_latest(self, matcher):
+        """TC-EDGE-01: 多版本废止,选择最新现行替代"""
+        result = matcher.match(1, "多版本标准测试", "GB/T 99999-2015")
+        assert result.status_code == MatchResultCode.SUBSTITUTED.value
+        # 应该返回最新的现行版本 2023
+        assert result.substitute_number == "GB/T 99999-2023"
+
+    def test_tc_edge_02_empty_number_then_search_by_name(self, matcher):
+        """TC-EDGE-02: 空标准号,按名称查询应该能找到"""
+        # 空标准号时,应该按名称查询
+        # 由于名称为"无标准号规范"在库中存在,应该能匹配到
+        result = matcher.match(1, "无标准号规范", "")
+        # 名称为"无标准号规范"在库中有记录,应该能匹配到(返回 MISMATCH 因为没有标准号)
+        # 或者返回 NOT_FOUND 如果空字符串不被处理
+        assert result.status_code in [MatchResultCode.MISMATCH.value, MatchResultCode.NOT_FOUND.value]
+
+    def test_tc_edge_03_special_chars_in_name(self, matcher):
+        """TC-EDGE-03: 特殊字符名称匹配"""
+        result = matcher.match(1, "《特殊(字符)》规范", "Q/CR 9001-2020")
+        assert result.status_code == MatchResultCode.OK.value
+
+    def test_tc_edge_04_input_with_fullwidth_space(self, matcher):
+        """TC-EDGE-04: 输入带中间全角空格 - 应视为不匹配"""
+        # 中间空格属于名称的一部分,应该视为不匹配
+        result = matcher.match(1, "铁路桥涵 设计规范", "TB 10002-2017")
+        # 数据库中是"铁路桥涵设计规范"(无空格),输入有全角空格,应视为不匹配
+        assert result.status_code == MatchResultCode.MISMATCH.value
+
+    def test_tc_edge_05_empty_name(self, matcher):
+        """TC-EDGE-05: 空名称输入"""
+        result = matcher.match(1, "", "TB 10002-2017")
+        # 名称为空,但标准号能匹配,返回结果取决于实现
+        assert result.status_code in [MatchResultCode.NOT_FOUND.value, MatchResultCode.MISMATCH.value]
+
+    def test_tc_edge_06_leading_trailing_spaces(self, matcher):
+        """TC-EDGE-06: 输入带前后空格(中间空格保留)"""
+        # 去除前后空格后,中间空格保留,与数据库不匹配
+        result = matcher.match(1, "  铁路桥涵 设计规范  ", "TB 10002-2017")
+        # 数据库中是"铁路桥涵设计规范"(无中间空格),输入"铁路桥涵 设计规范"(有中间空格),应视为不匹配
+        assert result.status_code == MatchResultCode.MISMATCH.value
+
+    def test_tc_edge_07_leading_trailing_spaces_in_number(self, matcher):
+        """TC-EDGE-07: 标准号带前后空格"""
+        result = matcher.match(1, "铁路桥涵设计规范", "  TB 10002-2017  ")
+        assert result.status_code == MatchResultCode.OK.value
+
+    def test_tc_edge_09_chinese_brackets_in_number(self, matcher):
+        """TC-EDGE-09: 标准号带中文括号(用户场景)"""
+        # 用户场景:标准号被中文括号包围
+        result = matcher.match(1, "铁路桥涵设计规范", "(TB 10002-2017)")
+        assert result.status_code == MatchResultCode.OK.value
+        assert result.final_result == "无问题"
+
+    def test_tc_edge_10_bookname_and_brackets(self, matcher):
+        """TC-EDGE-10: 标准名称带书名号和标准号带括号"""
+        # 用户场景:标准名称带书名号,标准号带中文括号
+        result = matcher.match(1, "《铁路桥涵设计规范》", "(TB 10002-2017)")
+        assert result.status_code == MatchResultCode.OK.value
+        assert result.final_result == "无问题"
+
+    def test_tc_edge_11_nested_brackets(self, matcher):
+        """TC-EDGE-11: 嵌套括号"""
+        result = matcher.match(1, "《《铁路桥涵设计规范》》", "((TB 10002-2017))")
+        assert result.status_code == MatchResultCode.OK.value
+
+    def test_tc_edge_12_english_brackets(self, matcher):
+        """TC-EDGE-12: 英文括号"""
+        result = matcher.match(1, "铁路桥涵设计规范", "(TB 10002-2017)")
+        assert result.status_code == MatchResultCode.OK.value
+
+
+# ========================================
+# 批量测试
+# ========================================
+
+class TestCaseBatch:
+    """
+    批量测试
+    """
+
+    @pytest.fixture
+    def mock_service(self):
+        """创建使用Mock数据的服务"""
+        service = StandardMatchingService(db_pool=None)
+        loop = asyncio.get_event_loop()
+        loop.run_until_complete(service.initialize())
+        return service
+
+    def test_batch_mixed_standards(self, mock_service):
+        """批量测试混合标准"""
+        standards = [
+            # OK
+            {"standard_name": "铁路桥涵设计规范", "standard_number": "TB 10002-2017"},
+            # SUBSTITUTED
+            {"standard_name": "起重机 钢丝绳 保养、维护、检验和报废", "standard_number": "GB/T 5972-2016"},
+            # ABOLISHED
+            {"standard_name": "缆索起重机", "standard_number": "GB/T 28756-2012"},
+            # MISMATCH
+            {"standard_name": "公路水运危险性较大工程专项施工方案编制审查规程", "standard_number": "JT/T 1495-2023"},
+            # NOT_FOUND
+            {"standard_name": "不存在的标准", "standard_number": "GB/T 99999-9999"},
+        ]
+
+        results = mock_service.check_standards(standards)
+        assert len(results) == 5
+
+        assert results[0].status_code == MatchResultCode.OK.value
+        assert results[1].status_code == MatchResultCode.SUBSTITUTED.value
+        assert results[2].status_code == MatchResultCode.ABOLISHED.value
+        assert results[3].status_code == MatchResultCode.MISMATCH.value
+        assert results[4].status_code == MatchResultCode.NOT_FOUND.value
+
+
+# ========================================
+# 运行测试
+# ========================================
+
+if __name__ == "__main__":
+    pytest.main([__file__, "-v", "--tb=short"])

+ 125 - 0
utils_test/standard_new_Test/test_user_standards.py

@@ -0,0 +1,125 @@
+"""
+测试用户提供的4个标准规范
+验证模糊名称匹配修复是否有效
+"""
+import asyncio
+import sys
+import os
+
+# 添加项目根目录到 Python 路径
+current_dir = os.path.dirname(os.path.abspath(__file__))
+project_root = os.path.dirname(os.path.dirname(current_dir))
+if project_root not in sys.path:
+    sys.path.insert(0, project_root)
+
+from utils_test.standard_new_Test.standard_service import (
+    StandardMatchingService,
+    MatchResultCode
+)
+
+
+async def test_user_standards():
+    """测试用户提供的4个标准"""
+    # 初始化服务(使用Mock数据)
+    service = StandardMatchingService(db_pool=None)
+    await service.initialize()
+
+    # 用户提供的4个标准
+    test_standards = [
+        {"standard_name": "铁路桥涵设计规范", "standard_number": "TB 10002-2017"},
+        {"standard_name": "铁路工程抗震设计规范", "standard_number": "GB 50111-2006"},
+        {"standard_name": "铁路混凝土工程施工质量验收标准", "standard_number": "TB 10424-2018"},
+        {"standard_name": "公路水运危险性较大工程专项施工方案编制审查规程", "standard_number": "JT/T 1495-2023"},
+    ]
+
+    print("=" * 80)
+    print("测试用户提供的4个标准(使用Mock数据)")
+    print("=" * 80)
+
+    results = service.check_standards(test_standards)
+
+    all_passed = True
+    for i, result in enumerate(results, 1):
+        print(f"\n【{i}】{result.original_name}")
+        print(f"    标准号: {result.original_number}")
+        print(f"    状态码: {result.status_code}")
+        print(f"    处理结果: {result.process_result}")
+        print(f"    最终结果: {result.final_result}")
+
+        # 验证预期结果
+        if i <= 3:
+            # 前3个应该是 OK
+            if result.status_code != MatchResultCode.OK.value:
+                print(f"    [失败] 期望 OK,实际 {result.status_code}")
+                all_passed = False
+            else:
+                print(f"    [通过]")
+        else:
+            # 第4个应该是 MISMATCH(因为Mock数据中是2024版)
+            if result.status_code != MatchResultCode.MISMATCH.value:
+                print(f"    [失败] 期望 MISMATCH,实际 {result.status_code}")
+                all_passed = False
+            else:
+                print(f"    [通过]")
+
+    print("\n" + "=" * 80)
+    if all_passed:
+        print("[成功] 所有测试通过!")
+    else:
+        print("[失败] 部分测试失败!")
+    print("=" * 80)
+
+    return all_passed
+
+
+def test_with_bookname_variations():
+    """测试书名号变体"""
+    from utils_test.standard_new_Test.standard_service import StandardRepository, StandardMatcher
+
+    print("\n" + "=" * 80)
+    print("测试书名号变体匹配")
+    print("=" * 80)
+
+    # 创建仓库并加载测试数据
+    repo = StandardRepository()
+    mock_data = [
+        {"id": 1, "standard_name": "铁路桥涵设计规范", "standard_number": "TB 10002-2017", "validity": "XH"},
+    ]
+    repo.load_data(mock_data)
+    matcher = StandardMatcher(repo)
+
+    # 测试各种名称变体
+    test_cases = [
+        ("铁路桥涵设计规范", "TB 10002-2017", "无书名号"),
+        ("《铁路桥涵设计规范》", "TB 10002-2017", "带书名号"),
+        ("铁路桥涵 设计规范", "TB 10002-2017", "带空格"),
+        ("《铁路桥涵 设计规范》", "TB 10002-2017", "带书名号和空格"),
+    ]
+
+    all_passed = True
+    for name, number, desc in test_cases:
+        result = matcher.match(1, name, number)
+        status = "[OK]" if result.status_code == MatchResultCode.OK.value else "[FAIL]"
+        print(f"\n{status} {desc}")
+        print(f"   输入名称: {name}")
+        print(f"   结果: {result.status_code}")
+        if result.status_code != MatchResultCode.OK.value:
+            all_passed = False
+
+    return all_passed
+
+
+if __name__ == "__main__":
+    # 运行异步测试
+    result1 = asyncio.run(test_user_standards())
+
+    # 运行书名号变体测试
+    result2 = test_with_bookname_variations()
+
+    print("\n" + "=" * 80)
+    if result1 and result2:
+        print("[成功] 所有测试通过!修复成功。")
+        sys.exit(0)
+    else:
+        print("[警告] 部分测试失败!")
+        sys.exit(1)

Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
utils_test/standard_new_Test/施工方案审查流程图.svg


+ 8 - 1
views/construction_review/file_upload.py

@@ -33,12 +33,19 @@ def _find_soffice_path() -> str:
         FileNotFoundError: 未找到 LibreOffice
     """
     import platform
+    import shutil
 
     # Linux/Docker 环境:直接使用 soffice
     if platform.system() != 'Windows':
         return 'soffice'
 
-    # Windows 环境:检测常见安装路径
+    # Windows 环境:首先从 PATH 中查找
+    soffice_in_path = shutil.which('soffice')
+    if soffice_in_path:
+        logger.info(f"从 PATH 找到 LibreOffice: {soffice_in_path}")
+        return soffice_in_path
+
+    # 备选:检测常见安装路径
     possible_paths = [
         r"C:\Program Files\LibreOffice\program\soffice.exe",
         r"C:\Program Files (x86)\LibreOffice\program\soffice.exe",

Неке датотеке нису приказане због велике количине промена