فهرست منبع

fix (sgsc-完整性审查):接入主流程,修复部分

WangXuMing 3 هفته پیش
والد
کامیت
79551c0c8d

+ 29 - 66
core/construction_review/component/ai_review_engine.py

@@ -717,78 +717,41 @@ class AIReviewEngine(BaseReviewer):
             
             # 转换为字典
             result_dict = result_to_dict_lightweight(result)
-            
-            # 风险等级映射:英文转中文
-            risk_level_map = {
-                True: "高风险",   # is_key_point=True
-                False: "中风险"   # is_key_point=False
+
+            # 使用 recommendations 构建 response_items
+            # recommendations 已按 一级→二级→三级 层级判断,用 continue 阻断级联:
+            #   一级缺失 → 只报一级,不再向下检查
+            #   二级缺失 → 只报二级,不再检查其下三级
+            #   二级存在 → 才报三级缺失
+            _level_risk = {
+                "一级": ("高风险", "high"),
+                "二级": ("中风险", "medium"),
+                "三级": ("中风险", "medium"),
+                "一致性": ("低风险", "low"),
             }
-            
-            # 生成缺失项详情(用于前端展示)
-            missing_details = result_dict.get('tertiary_completeness', {}).get('missing_details', [])
-            
-            # 按二级分类分组统计缺失项
-            from collections import defaultdict
-            secondary_groups = defaultdict(list)
-            for item in missing_details:
-                secondary_key = (item.get('first_name', ''), item.get('secondary_name', ''))
-                secondary_groups[secondary_key].append(item)
-            
-            # 构建response列表(按二级分类分组输出)
             response_items = []
-            for (first_name, secondary_name), items in secondary_groups.items():
-                # 构建位置描述
-                location_str = f"{chapter_name or first_name} > {secondary_name}" if chapter_name else f"{first_name} > {secondary_name}"
-                
-                # 统计关键要点数量确定风险等级
-                has_key_point = any(item.get('is_key_point', False) for item in items)
-                risk_level = risk_level_map.get(has_key_point, "中风险")
-                
-                # 构建缺失要点列表
-                missing_count = len(items)
-                missing_list_str = "、".join([f"{i+1}.{item.get('tertiary_name', '')}" for i, item in enumerate(items)])
-                
-                # 构建check_result
-                issue_point = f"【内容不完整】{location_str} 部分缺少{missing_count}个要点"
-                
-                # 构建suggestion:列出具体缺失要点
-                suggestion_parts = []
-                reason_parts = []
-                review_refs = []
-                for i, item in enumerate(items, 1):
-                    tertiary_name = item.get('tertiary_name', '')
-                    focus = item.get('focus', '')
-                    suggestion_parts.append(f"{i}.{tertiary_name}")
-                    reason_parts.append(f"{i}.{tertiary_name}")
-                    if focus:
-                        review_refs.append(f"{i}.{tertiary_name}:{focus}")
-                    else:
-                        review_refs.append(f"{i}.{tertiary_name}")
-                
-                suggestion = f"请补充'{secondary_name}'以下{missing_count}个要点内容:" + ";".join(suggestion_parts)
-                
-                # 构建reason
-                reason = f"根据规范要求,'{secondary_name}' 应包含:{missing_list_str}。当前缺失:{missing_list_str}"
-                
-                # 构建review_references
-                review_references = ";".join(review_refs) if review_refs else f"'{secondary_name}' 应包含的内容要点"
-                
-                # 构建reference_source(使用一级分类名称作为参考来源)
-                reference_source = "《桥梁公司危险性较大工程管理实施细则(2025版)》"
-                
-                # 转换风险等级为英文(用于risk_info)
-                risk_level_en = "high" if "高" in risk_level else ("medium" if "中" in risk_level else "low")
-                
-                # 构建与参数合规审查格式一致的结果
+            for rec in result_dict.get('recommendations', []):
+                level = rec.get('level', '')
+                if level == '通过':
+                    continue
+                risk_level, risk_level_en = _level_risk.get(level, ("中风险", "medium"))
+                issue_point = rec.get('issue_point', '')
+                location = rec.get('location', '')
+                # 三级缺失:将 location 中的标准分类名替换为文档实际章节名,信息更直观
+                if level == '三级' and chapter_name and ' > ' in location:
+                    sec_part = location.split(' > ', 1)[1]
+                    new_location = f"{chapter_name} > {sec_part}"
+                    issue_point = issue_point.replace(location, new_location, 1)
+                    location = new_location
                 response_items.append({
                     "check_item": "completeness_check",
-                    "chapter_code": chapter_code if chapter_code != "all" else first_name,
-                    "check_item_code": f"{chapter_code if chapter_code != 'all' else first_name}_completeness_check",
+                    "chapter_code": chapter_code if chapter_code != "all" else "unknown",
+                    "check_item_code": f"{chapter_code if chapter_code != 'all' else 'unknown'}_completeness_check",
                     "check_result": {
                         "issue_point": issue_point,
-                        "location": location_str,
-                        "suggestion": suggestion,
-                        "reason": reason,
+                        "location": location,
+                        "suggestion": rec.get('suggestion', ''),
+                        "reason": rec.get('reason', ''),
                         "risk_level": risk_level
                     },
                     "exist_issue": True,

+ 2 - 2
core/construction_review/component/constants.py

@@ -15,7 +15,7 @@ class CategoryCode(Enum):
     SAFETY = "safety"                    # 安全保证措施
     QUALITY = "quality"                  # 质量保证措施
     ENVIRONMENT = "environment"          # 环境保证措施
-    MANAGEMENT = "management"            # 施工管理及作业人员配备与分工
+    management = "management"            # 施工管理及作业人员配备与分工
     ACCEPTANCE = "acceptance"            # 验收要求
     OTHER = "other"                      # 其他资料
     NON_STANDARD = "non_standard"        # 非标准项
@@ -49,7 +49,7 @@ CATEGORY_CN_MAPPING = {
     CategoryCode.SAFETY.value: "安全保证措施",
     CategoryCode.QUALITY.value: "质量保证措施",
     CategoryCode.ENVIRONMENT.value: "环境保证措施",
-    CategoryCode.MANAGEMENT.value: "施工管理及作业人员配备与分工",
+    CategoryCode.management.value: "施工管理及作业人员配备与分工",
     CategoryCode.ACCEPTANCE.value: "验收要求",
     CategoryCode.OTHER.value: "其他资料",
     CategoryCode.NON_STANDARD.value: "非标准项",

+ 23 - 23
core/construction_review/component/doc_worker/config/StandardCategoryTable.csv

@@ -3,10 +3,10 @@ basis,编制依据,LawsAndRegulations,法律法规,NULL,NationalLawsAndRegulatio
 basis,编制依据,LawsAndRegulations,法律法规,NULL,ProvincialLawsAndRegulationsOfProjectLocation,工程所在地省级政府发布的法律法规与规章制度,地方性、区域性、细化补充、因地制宜、执行细则、地方特色、适应性要求、属地管理、动态调整、配套政策、本地化实施。
 basis,编制依据,StandardsAndSpecifications,标准规范,NULL,IndustryStandards,行业标准,需符合国家/行业强制或推荐性标准(如GB/T、JTG等)、时效性强(需跟踪最新版)、覆盖全生命周期(设计→施工→运维)、是定义工程项目的最低技术要求、质量验收准则、安全红线。
 basis,编制依据,StandardsAndSpecifications,标准规范,NULL,TechnicalRegulations,技术规程,操作流程标准化、工艺参数、量化风险管控、节点设备使用、规范施工验收细则、人员资质要求、应急预案模板、数字化交付标准、BIM协同规则、绿色施工指标、强制性条款需100%执行(如安全操作规范)、包含可视化元素(图表、流程图、三维模型指引)、与BIM技术深度融合(4D进度模拟、5D成本控制)。
-basis,编制依据,DocumentSystems,文件制度,NULL,SichuanRoadAndBridgeDocumentSystemsAndManagementProcedures,四川路桥下发的文件制度和管理程序文件,需包含集团级BIM实施标准、EPC总承包管理模式细则、强制要求下属单位接入集团统一的数字化管理平台(如PM系统)、设置科技创新成果转化的量化考核指标。
-basis,编制依据,DocumentSystems,文件制度,NULL,RoadAndBridgeGroupDocumentSystemsAndManagementProcedures,路桥集团下发的文件制度和管理程序文件,区域化管理细则、属地化政策适配、项目分级管控、应急响应机制、分包商信用评价、农民工工资支付、保障绿色施工区域、标准智慧工地建设指南、隐蔽工程验收流程、工程变更索赔指引。
-basis,编制依据,DocumentSystems,文件制度,NULL,BridgeCompanyDocumentSystemsAndManagementProcedures,桥梁公司下发的文件制度和管理程序文件,专业技术标准、工艺工法创新、特种设备管理、试验检测规程、安全生产责任制、班前安全教育工程、质量三检制技术交底、标准化竣工资料归档、规范创优工程培育计划。
-basis,编制依据,DocumentSystems,文件制度,NULL,ConstructionUnitDocumentSystemsAndManagementProcedures,建设单位下发的文件制度和管理程序文件,项目合同履约、工程款支付管理、设计变更审批、竣工验收标准、运营移交协议、保修期责任划分、参建单位考核评价、档案管理实施细则、信息沟通机制、争议解决程序。
+basis,编制依据,DocumentSystems,文件制度,NULL,SichuanRoadAndBridgeDocumentSystemsAndmanagementProcedures,四川路桥下发的文件制度和管理程序文件,需包含集团级BIM实施标准、EPC总承包管理模式细则、强制要求下属单位接入集团统一的数字化管理平台(如PM系统)、设置科技创新成果转化的量化考核指标。
+basis,编制依据,DocumentSystems,文件制度,NULL,RoadAndBridgeGroupDocumentSystemsAndmanagementProcedures,路桥集团下发的文件制度和管理程序文件,区域化管理细则、属地化政策适配、项目分级管控、应急响应机制、分包商信用评价、农民工工资支付、保障绿色施工区域、标准智慧工地建设指南、隐蔽工程验收流程、工程变更索赔指引。
+basis,编制依据,DocumentSystems,文件制度,NULL,BridgeCompanyDocumentSystemsAndmanagementProcedures,桥梁公司下发的文件制度和管理程序文件,专业技术标准、工艺工法创新、特种设备管理、试验检测规程、安全生产责任制、班前安全教育工程、质量三检制技术交底、标准化竣工资料归档、规范创优工程培育计划。
+basis,编制依据,DocumentSystems,文件制度,NULL,ConstructionUnitDocumentSystemsAndmanagementProcedures,建设单位下发的文件制度和管理程序文件,项目合同履约、工程款支付管理、设计变更审批、竣工验收标准、运营移交协议、保修期责任划分、参建单位考核评价、档案管理实施细则、信息沟通机制、争议解决程序。
 basis,编制依据,CompilationPrinciples,编制原则,NULL,NationalPoliciesStandardsAndDesignDocument,国家方针、政策、标准和设计文件,需动态更新(如新版《公路工程技术标准》实施后同步调整)、涉及多部门联合审查(发改委、住建部、生态环境部)。
 basis,编制依据,CompilationPrinciples,编制原则,NULL,BasicConstructionProcedures,基本建设程序,法定程序刚性、四阶段闭环管理、审批链条完整性、阶段成果验收、逆程序风险管控、数字化流程跟踪。
 basis,编制依据,CompilationPrinciples,编制原则,NULL,ProjectFunctionImplementation,工程项目功能实现,需求匹配度、全功能交付、使用效能保障、用户需求反演、系统集成测试、缺陷责任期追溯。
@@ -72,7 +72,7 @@ technology,施工工艺技术,Inspection,检查要求,材料进场检验、构
 technology,施工工艺技术,Inspection,检查要求,材料进场检验、构配件抽查、工序检查内容、工序检查标准、隐蔽工程验收,ProcessInspectionStandards,工序检查标准,需明确检查的合格标准(如“钢筋间距允许偏差±10mm”“模板垂直度允许偏差5mm”)、是工序验收的依据;
 safety,安全保证措施,SafetySystem,安全保证体系,流程体系类名词、标准文书类、标标准编号编码数字类,SafetyProductionAssuranceSystemFrameworkDiagram,安全生产保证体系框图,安全保证体系的视觉化呈现、需明确体系的核心要素(如组织机构、制度流程、资源保障)及逻辑关系、是公司标准体系的具象化载体;
 safety,安全保证措施,SafetySystem,安全保证体系,流程体系类名词、标准文书类、标标准编号编码数字类,CompanyStandardSystemReference,公司标准体系引用,强调安全保证体系需承接公司现有标准(如《公司安全生产管理办法》《公司安全技术规程》)、确保体系的一致性与延续性;
-safety,安全保证措施,Organization,组织保证措施,名词类、人名类、岗位名称类、制度名词类,SafetyManagementOrganization,安全管理组织机构,基于项目经理为组长的安全工作领导小组、关注岗位组织架构名称类、部门名称类、关系结构类名词;
+safety,安全保证措施,Organization,组织保证措施,名词类、人名类、岗位名称类、制度名词类,SafetymanagementOrganization,安全管理组织机构,基于项目经理为组长的安全工作领导小组、关注岗位组织架构名称类、部门名称类、关系结构类名词;
 safety,安全保证措施,Organization,组织保证措施,名词类、人名类、岗位名称类、制度名词类,PersonnelSafetyResponsibilities,人员安全职责,关注岗位名称类、人名类、责任制度名词类、岗位职责名词类、安全制度名词类;
 safety,安全保证措施,TechMeasures,技术保证措施,施工专业名词类、工序名称类 、施工设备名称类、施工材料名称类、施工场地名称类、岗位名称类,OverallSecurityMeasures,总体安全措施,包含保证施工过程中主要工序的人员、材料、机械设备安全所采取的技术措施、以及材料运输、吊装、施工作业区域的临边、临空、洞口安全防护设施、安全母绳布置、人员上下(横向)通道布置等、是针对项目整体的安全技术规划(如“施工现场临时用电总体方案”“高空作业总体防护措施”)、需覆盖所有施工环节;
 safety,安全保证措施,TechMeasures,技术保证措施,施工专业名词类、工序名称类 、施工设备名称类、施工材料名称类、施工场地名称类、岗位名称类,SafetyAssuranceMeasuresForKeyProcesses,主要工序安全措施,是针对关键工序的具体安全要求(如“深基坑开挖支护措施”“模板安装拆除安全规范”)、需明确每一步操作的安全要点;
@@ -88,10 +88,10 @@ safety,安全保证措施,Monitoring,监测监控措施,组织机构名称类、
 safety,安全保证措施,Emergency,应急处置措施,事故名称类、救援器材类、机构名称类、数字类、数值单位类。,EmergencyProcedures,应急处置程序,应采用公司标准应急处理程序图(附件16)、应急响应的步骤流程(如“事故报告→现场警戒→人员疏散→救援实施→善后处理”)、需明确每一步的责任部门及时间要求、确保响应及时;
 safety,安全保证措施,Emergency,应急处置措施,事故名称类、救援器材类、机构名称类、数字类、数值单位类。,EmergencyMeasures,应急处置措施,应根据方案实施过程潜在的危险源、判断出可能造成的伤害类型、制定出有针对性的救援措施、保证在事故发生后伤者能得到有效和及时的救治、如触电、有毒有害气体中毒、高处坠落、物体打击、施工现场及驻地火灾等事故、针对不同类型事故的具体处理方法(如“火灾事故使用干粉灭火器扑救”“坍塌事故使用千斤顶支撑”)、需明确操作要点(如灭火器的使用方法、千斤顶的支撑位置)、确保救援有效;
 safety,安全保证措施,Emergency,应急处置措施,事故名称类、救援器材类、机构名称类、数字类、数值单位类。,EmergencySuppliesAndEquipmentSupport,应急物资及设备保障,应根据事故的不同、以表格的形式说明救援的物品名称、规格型号、单位、数量、监管人、联系电话等内容、应急处置的物质基础、需明确物资的名称(如灭火器、急救箱、千斤顶)、数量(如每100平方米配备2个灭火器)、存放位置(如施工现场入口处)及维护要求(如每月检查一次灭火器压力)、确保物资随时可用;
-safety,安全保证措施,Emergency,应急处置措施,事故名称类、救援器材类、机构名称类、数字类、数值单位类。,TrafficManagementAndMedicalRescue,交通疏导与医疗救援,应以表格的形式明确施工工点附近的医疗救援机构名称、联系电话、距离等、并附应急救援线路图;
+safety,安全保证措施,Emergency,应急处置措施,事故名称类、救援器材类、机构名称类、数字类、数值单位类。,TrafficmanagementAndMedicalRescue,交通疏导与医疗救援,应以表格的形式明确施工工点附近的医疗救援机构名称、联系电话、距离等、并附应急救援线路图;
 safety,安全保证措施,Emergency,应急处置措施,事故名称类、救援器材类、机构名称类、数字类、数值单位类。,PostDisposal,后期处置,包括善后处理、调查与评估、恢复生产等三个方面、事故后的恢复工作、需明确善后处理(如伤亡人员家属安抚、财产损失统计)、事故调查(如原因分析、责任认定评估)及整改措施(如完善安全制度、加强培训)、避免事故重复发生;
 quality,质量保证措施,QualitySystem,质量保证体系,组织机构名称类、岗位名称类、岗位职责词汇类。,QualityAssuranceSystemFramework,质量管理组织机构,应引用公司标准体系框图、质量体系的视觉化呈现、需明确体系的核心要素(如组织机构、制度流程、资源保障)及逻辑关系、是体系落地的框架基础;
-quality,质量保证措施,QualitySystem,质量保证体系,组织机构名称类、岗位名称类、岗位职责词汇类。,QualityManagementOrganization,人员职责,基于项目经理为组长的工作领导小组、小组中包括项目经理、项目总工、质量总监、工程部门、质检部门、专业分包单位(协作队伍)项目负责人和项目技术负责人等、需明确层级(如公司级、项目级、班组级)及组成部门(如质量部、工程部、技术部)、形成“横向到边、纵向到底”的管理网络;
+quality,质量保证措施,QualitySystem,质量保证体系,组织机构名称类、岗位名称类、岗位职责词汇类。,QualitymanagementOrganization,人员职责,基于项目经理为组长的工作领导小组、小组中包括项目经理、项目总工、质量总监、工程部门、质检部门、专业分包单位(协作队伍)项目负责人和项目技术负责人等、需明确层级(如公司级、项目级、班组级)及组成部门(如质量部、工程部、技术部)、形成“横向到边、纵向到底”的管理网络;
 quality,质量保证措施,QualitySystem,质量保证体系,组织机构名称类、岗位名称类、岗位职责词汇类。,PersonnelResponsibilities,质量保证体系框图,需细化每个岗位的质量责任(如项目经理的“第一责任人”职责、质量员的“现场监督”职责)、避免职责模糊导致的管理漏洞;
 quality,质量保证措施,QualityGoals,质量目标,目标标准词汇类、合同条款类、具体工程名称类、量化数值类、数值单位类。,DecompositionOfQualityObjectives,质量目标分解,根据施工合同和业主要求填写、需将总目标拆解为分部(基础、主体、装饰)、分项工程的具体目标(如“主体结构混凝土强度合格率100%”)、是目标落地的关键;
 quality,质量保证措施,Excellence,工程创优规划,工程创优总体计划、技术准备(BIM/新技术应用)、过程控制(关键工序精品打造)、细部处理(节点优化)、精品工程创建、新技术推广(四新技术)、申报资料编制、工程资料归档、创优考核机制,OverallPlanForEngineeringExcellence,工程创优总体计划,需明确创优的阶段目标(如“基础工程创优”“主体工程创优”)及关键节点、是创优工作的路线图;
@@ -108,29 +108,29 @@ quality,质量保证措施,QualityControl,质量控制程序与具体措施,原
 environment,环境保证措施,EnvSystem,环境保证体系,环境保证体系框图、公司标准体系引用,BlockDiagramOfEnvironmentalAssuranceSystem,环境保证体系框图,环境保证体系的视觉化呈现、需明确体系的核心要素(如组织机构、制度流程、资源保障)及逻辑关系、是公司标准体系的具象化载体;
 environment,环境保证措施,EnvSystem,环境保证体系,环境保证体系框图、公司标准体系引用,CompanyStandardSystemReference,公司标准体系引用,应引用公司标准体系框图、强调环境保证体系需承接公司现有标准(如《公司环境管理体系手册》《公司环境保护管理办法》)、确保体系的一致性与延续性;
 environment,环境保证措施,EnvOrg,环境保护组织机构,环境保护组织架构、管理人员姓名、管理人员职务、管理人员职责、环境管理岗位责任、责任考核机制、环境管理职责分工、环境管理人员资质、环境管理沟通机制,EnvironmentalAssuranceSystemFramework,环境保护组织架构,包含管理人员姓名、职务、职责、环境管理的责任主体、基于项目经理为组长的工作领导小组、小组中包括项目经理、项目副经理、项目总工、工程部门、质检部门、安全环保部门、专业分包单位(协作队伍)项目负责人和项目技术负责人等、需明确机构的层级(如公司级、项目级、班组级)及组成部门(如环境部、工程部、技术部)、形成“横向到边、纵向到底”的管理网络;
-environment,环境保证措施,EnvOrg,环境保护组织机构,环境保护组织架构、管理人员姓名、管理人员职务、管理人员职责、环境管理岗位责任、责任考核机制、环境管理职责分工、环境管理人员资质、环境管理沟通机制,EnvironmentalManagementJobResponsibilities,环境管理岗位责任,需明确各岗位的环境责任(如项目经理的“环境第一责任人”职责、环境专员的“现场巡查”职责)、是组织保证的基石;
+environment,环境保证措施,EnvOrg,环境保护组织机构,环境保护组织架构、管理人员姓名、管理人员职务、管理人员职责、环境管理岗位责任、责任考核机制、环境管理职责分工、环境管理人员资质、环境管理沟通机制,EnvironmentalmanagementJobResponsibilities,环境管理岗位责任,需明确各岗位的环境责任(如项目经理的“环境第一责任人”职责、环境专员的“现场巡查”职责)、是组织保证的基石;
 environment,环境保证措施,EnvOrg,环境保护组织机构,环境保护组织架构、管理人员姓名、管理人员职务、管理人员职责、环境管理岗位责任、责任考核机制、环境管理职责分工、环境管理人员资质、环境管理沟通机制,ResponsibilityAssessmentMechanism,责任考核机制,对环境职责履行情况的评价方式(如月度考核、年度评优)、需与环境绩效挂钩(如奖金发放、晋升晋级)、强化责任意识。
 environment,环境保证措施,EnvProtection,环境保护及文明施工措施,办公生活区环境卫生管理、生活垃圾分类处置、卫生防疫措施、饮用水安全保障、施工区域水土流失防治、截排水系统设计、边坡防护工程、沉沙池设置、噪声排放监测、低噪声设备选型、隔音屏障设置、施工时间管控、污水沉淀处理、油污隔离措施、废水检测达标、扬尘控制、废气净化处理、清洁能源使用、裸土覆盖、车辆冲洗设施。,EnvironmentalSanitationGuaranteeMeasuresForOfficeAndLivingAreas,办公生活区环境卫生保证措施,需明确责任分工(如保洁人员配置、卫生区域划分)及管理流程(如每日清扫、每周检查)、确保环境整洁;
 environment,环境保证措施,EnvProtection,环境保护及文明施工措施,办公生活区环境卫生管理、生活垃圾分类处置、卫生防疫措施、饮用水安全保障、施工区域水土流失防治、截排水系统设计、边坡防护工程、沉沙池设置、噪声排放监测、低噪声设备选型、隔音屏障设置、施工时间管控、污水沉淀处理、油污隔离措施、废水检测达标、扬尘控制、废气净化处理、清洁能源使用、裸土覆盖、车辆冲洗设施。,SoilAndWaterConservationMeasuresInTheConstructionArea,施工区域水土流失防治措施,需通过“截(截水沟)、排(排水沟)、拦(拦挡坝)、护(边坡防护)”综合措施、减少雨水对裸露土壤的冲刷;
 environment,环境保证措施,EnvProtection,环境保护及文明施工措施,办公生活区环境卫生管理、生活垃圾分类处置、卫生防疫措施、饮用水安全保障、施工区域水土流失防治、截排水系统设计、边坡防护工程、沉沙池设置、噪声排放监测、低噪声设备选型、隔音屏障设置、施工时间管控、污水沉淀处理、油污隔离措施、废水检测达标、扬尘控制、废气净化处理、清洁能源使用、裸土覆盖、车辆冲洗设施。,NoiseEmissionMonitoring,噪声排放监测,需按照《建筑施工场界环境噪声排放标准》(GB 12523-2011)要求、在施工现场边界设置监测点、每日监测1次、记录等效声级(Leq)和最大声级(Lmax);
 environment,环境保证措施,EnvProtection,环境保护及文明施工措施,办公生活区环境卫生管理、生活垃圾分类处置、卫生防疫措施、饮用水安全保障、施工区域水土流失防治、截排水系统设计、边坡防护工程、沉沙池设置、噪声排放监测、低噪声设备选型、隔音屏障设置、施工时间管控、污水沉淀处理、油污隔离措施、废水检测达标、扬尘控制、废气净化处理、清洁能源使用、裸土覆盖、车辆冲洗设施。,WaterPollutionPreventionAndControlMeasures,水污染防治措施,需在搅拌机、运输车清洗处设置沉淀池、施工废水经沉淀后回用(如洒水降尘)、避免直接排入市政管网;
 environment,环境保证措施,EnvProtection,环境保护及文明施工措施,办公生活区环境卫生管理、生活垃圾分类处置、卫生防疫措施、饮用水安全保障、施工区域水土流失防治、截排水系统设计、边坡防护工程、沉沙池设置、噪声排放监测、低噪声设备选型、隔音屏障设置、施工时间管控、污水沉淀处理、油污隔离措施、废水检测达标、扬尘控制、废气净化处理、清洁能源使用、裸土覆盖、车辆冲洗设施。,AirPollutionPreventionAndControlMeasures,大气污染防治措施,需采取“洒水降尘、裸土覆盖、车辆冲洗、道路硬化”等措施、确保施工现场目测扬尘高度小于1.5m(土方作业阶段)或0.5m(结构施工阶段)。
-Management,施工管理及作业人员配备与分工,Managers,施工管理人员,施工管理人员名单、岗位职责清单、管理职责分解、管理权限划分、管理流程衔接。,ConstructionManagementPersonnelList,施工管理人员名单,需以表格形式明确项目管理人员(如项目经理、项目书记、项目总工、项目副经理、质量总监、安全总监、各职能部门、主管技术员、测量员、质检员、以及专业分包单位(协作队伍)项目负责人和项目技术负责人等)的姓名、岗位及联系方式、是人员管理的基础台账;
-Management,施工管理及作业人员配备与分工,Managers,施工管理人员,施工管理人员名单、岗位职责清单、管理职责分解、管理权限划分、管理流程衔接。,JobResponsibilitiesList,岗位职责清单,需细化每个管理岗位的职责(如项目经理的“项目全面管理”职责、技术负责人的“技术方案审核”职责)、避免职责模糊导致的管理漏洞;
-Management,施工管理及作业人员配备与分工,SafetyStaff,专职安全生产管理人员,专职安全生产管理人员名单、安全生产考核合格证书、证书编号、证书有效期、安全岗位职责、安全责任追究。,ListOfFullTimeSafetyProductionManagementPersonnel,专职安全生产管理人员名单,需以表格形式明确专职安全员(如项目安全总监、专职安全员)的姓名、岗位及联系方式、是安全管理的核心台账;
-Management,施工管理及作业人员配备与分工,SafetyStaff,专职安全生产管理人员,专职安全生产管理人员名单、安全生产考核合格证书、证书编号、证书有效期、安全岗位职责、安全责任追究。,SafetyProductionQualificationCertificate,安全生产考核合格证书,需明确证书类型(如“建筑施工企业专职安全生产管理人员证书”)、编号及有效期、是上岗的必备资质;
-Management,施工管理及作业人员配备与分工,SafetyStaff,专职安全生产管理人员,专职安全生产管理人员名单、安全生产考核合格证书、证书编号、证书有效期、安全岗位职责、安全责任追究。,SafetyProductionManagementJobResponsibilities,安全生产管理岗位职责,需细化专职安全员的职责(如“现场安全检查”“隐患整改监督”“安全培训实施”)、确保安全管理工作落地;
-Management,施工管理及作业人员配备与分工,SpecialWorkers,特种作业人员,特种作业人员名单、特种作业操作资格证书、证书编号、证书有效期、特种作业工种、岗位职责、证书延期复核、违章作业记录。,ListOfSecialOperationsPersonnel,特种作业人员名单,需以表格形式明确特种作业人员(如建筑电工、建筑架子工、建筑起重机械司机等)的姓名、工种及联系方式、是特种作业管理的基础台账;
-Management,施工管理及作业人员配备与分工,SpecialWorkers,特种作业人员,特种作业人员名单、特种作业操作资格证书、证书编号、证书有效期、特种作业工种、岗位职责、证书延期复核、违章作业记录。,SpecialOperationsQualificationCertificate,特种作业操作资格证书,需明确证书类型(如“建筑施工特种作业操作资格证书”)、编号及有效期、是上岗的必备资质;
-Management,施工管理及作业人员配备与分工,SpecialWorkers,特种作业人员,特种作业人员名单、特种作业操作资格证书、证书编号、证书有效期、特种作业工种、岗位职责、证书延期复核、违章作业记录。,SpecialOperationsJobResponsibilities,特种作业岗位职责,需明确作业人员从事的具体工种(如“塔式起重机司机”“高处作业吊篮安装拆卸工”)、细化特种作业人员的职责是工种管理的关键;
-Management,施工管理及作业人员配备与分工,OtherWorkers,其它作业人员,专业分包单位管理人员数量、不同工种作业人员数量、作业人员台账、工种分类统计。,NumberOfManagementPersonnelInProfessionalSubcontractingUnits,专业分包单位管理人员数量,需明确分包单位(如劳务分包、专业分包)的管理人员(如分包项目经理、技术负责人)数量、是分包管理的基础;
-Management,施工管理及作业人员配备与分工,OtherWorkers,其它作业人员,专业分包单位管理人员数量、不同工种作业人员数量、作业人员台账、工种分类统计。,NumberOfWorkersInDifferentJobCategories,不同工种作业人员数量,需以表格形式明确各工种(如木工、钢筋工、混凝土工、砌筑工等)的作业人员数量、是劳动力调配的依据;
-Management,施工管理及作业人员配备与分工,OtherWorkers,其它作业人员,专业分包单位管理人员数量、不同工种作业人员数量、作业人员台账、工种分类统计。,WorkersLlog,作业人员台账,需记录作业人员的姓名、工种、身份证号、联系方式等信息、是人员管理的重要档案;
+management,施工管理及作业人员配备与分工,Managers,施工管理人员,施工管理人员名单、岗位职责清单、管理职责分解、管理权限划分、管理流程衔接。,ConstructionmanagementPersonnelList,施工管理人员名单,需以表格形式明确项目管理人员(如项目经理、项目书记、项目总工、项目副经理、质量总监、安全总监、各职能部门、主管技术员、测量员、质检员、以及专业分包单位(协作队伍)项目负责人和项目技术负责人等)的姓名、岗位及联系方式、是人员管理的基础台账;
+management,施工管理及作业人员配备与分工,Managers,施工管理人员,施工管理人员名单、岗位职责清单、管理职责分解、管理权限划分、管理流程衔接。,JobResponsibilitiesList,岗位职责清单,需细化每个管理岗位的职责(如项目经理的“项目全面管理”职责、技术负责人的“技术方案审核”职责)、避免职责模糊导致的管理漏洞;
+management,施工管理及作业人员配备与分工,SafetyStaff,专职安全生产管理人员,专职安全生产管理人员名单、安全生产考核合格证书、证书编号、证书有效期、安全岗位职责、安全责任追究。,ListOfFullTimeSafetyProductionmanagementPersonnel,专职安全生产管理人员名单,需以表格形式明确专职安全员(如项目安全总监、专职安全员)的姓名、岗位及联系方式、是安全管理的核心台账;
+management,施工管理及作业人员配备与分工,SafetyStaff,专职安全生产管理人员,专职安全生产管理人员名单、安全生产考核合格证书、证书编号、证书有效期、安全岗位职责、安全责任追究。,SafetyProductionQualificationCertificate,安全生产考核合格证书,需明确证书类型(如“建筑施工企业专职安全生产管理人员证书”)、编号及有效期、是上岗的必备资质;
+management,施工管理及作业人员配备与分工,SafetyStaff,专职安全生产管理人员,专职安全生产管理人员名单、安全生产考核合格证书、证书编号、证书有效期、安全岗位职责、安全责任追究。,SafetyProductionmanagementJobResponsibilities,安全生产管理岗位职责,需细化专职安全员的职责(如“现场安全检查”“隐患整改监督”“安全培训实施”)、确保安全管理工作落地;
+management,施工管理及作业人员配备与分工,SpecialWorkers,特种作业人员,特种作业人员名单、特种作业操作资格证书、证书编号、证书有效期、特种作业工种、岗位职责、证书延期复核、违章作业记录。,ListOfSecialOperationsPersonnel,特种作业人员名单,需以表格形式明确特种作业人员(如建筑电工、建筑架子工、建筑起重机械司机等)的姓名、工种及联系方式、是特种作业管理的基础台账;
+management,施工管理及作业人员配备与分工,SpecialWorkers,特种作业人员,特种作业人员名单、特种作业操作资格证书、证书编号、证书有效期、特种作业工种、岗位职责、证书延期复核、违章作业记录。,SpecialOperationsQualificationCertificate,特种作业操作资格证书,需明确证书类型(如“建筑施工特种作业操作资格证书”)、编号及有效期、是上岗的必备资质;
+management,施工管理及作业人员配备与分工,SpecialWorkers,特种作业人员,特种作业人员名单、特种作业操作资格证书、证书编号、证书有效期、特种作业工种、岗位职责、证书延期复核、违章作业记录。,SpecialOperationsJobResponsibilities,特种作业岗位职责,需明确作业人员从事的具体工种(如“塔式起重机司机”“高处作业吊篮安装拆卸工”)、细化特种作业人员的职责是工种管理的关键;
+management,施工管理及作业人员配备与分工,OtherWorkers,其它作业人员,专业分包单位管理人员数量、不同工种作业人员数量、作业人员台账、工种分类统计。,NumberOfmanagementPersonnelInProfessionalSubcontractingUnits,专业分包单位管理人员数量,需明确分包单位(如劳务分包、专业分包)的管理人员(如分包项目经理、技术负责人)数量、是分包管理的基础;
+management,施工管理及作业人员配备与分工,OtherWorkers,其它作业人员,专业分包单位管理人员数量、不同工种作业人员数量、作业人员台账、工种分类统计。,NumberOfWorkersInDifferentJobCategories,不同工种作业人员数量,需以表格形式明确各工种(如木工、钢筋工、混凝土工、砌筑工等)的作业人员数量、是劳动力调配的依据;
+management,施工管理及作业人员配备与分工,OtherWorkers,其它作业人员,专业分包单位管理人员数量、不同工种作业人员数量、作业人员台账、工种分类统计。,WorkersLlog,作业人员台账,需记录作业人员的姓名、工种、身份证号、联系方式等信息、是人员管理的重要档案;
 acceptance,验收要求,Standards,验收标准,国家验收规范(如《公路工程质量检验评定标准》JTG F80/1-2017、《桥梁工程施工质量验收标准》GB 50205-2020)、行业标准(如《公路桥涵施工技术规范》JTG_T 3650-2020)、企业管理办法(如《四川路桥施工验收管理办法》《路桥集团专项施工方案验收条件》)、操作规程(如《桥梁施工安全操作规程》),NationalStandardsSpecificationsAndOperatingProcedures,国家标准、规范、操作规程,是验收的基础依据、需明确具体规范名称(如JTG F80/1-2017)、避免使用“国家规范”等泛化表述;
 acceptance,验收要求,Standards,验收标准,国家验收规范(如《公路工程质量检验评定标准》JTG F80/1-2017、《桥梁工程施工质量验收标准》GB 50205-2020)、行业标准(如《公路桥涵施工技术规范》JTG_T 3650-2021)、企业管理办法(如《四川路桥施工验收管理办法》《路桥集团专项施工方案验收条件》)、操作规程(如《桥梁施工安全操作规程》),IndustryStandardOperatingProcedures,行业标准、规范、操作规程,需指向具体行业的内部文件(如行业标准(如《公路桥涵施工技术规范》JTG_T 3650-2020)、体现行业管理要求;
-acceptance,验收要求,Standards,验收标准,国家验收规范(如《公路工程质量检验评定标准》JTG F80/1-2017、《桥梁工程施工质量验收标准》GB 50205-2020)、行业标准(如《公路桥涵施工技术规范》JTG_T 3650-2022)、企业管理办法(如《四川路桥施工验收管理办法》《路桥集团专项施工方案验收条件》)、操作规程(如《桥梁施工安全操作规程》),SichuanRoadAndBridgeManagementRegulations,四川路桥的管理办法,需关联企业管理办法(如《四川路桥施工验收管理办法》)、体现企业特色和企业管理要求;
-acceptance,验收要求,Standards,验收标准,国家验收规范(如《公路工程质量检验评定标准》JTG F80/1-2017、《桥梁工程施工质量验收标准》GB 50205-2020)、行业标准(如《公路桥涵施工技术规范》JTG_T 3650-2023)、企业管理办法(如《四川路桥施工验收管理办法》《路桥集团专项施工方案验收条件》)、操作规程(如《桥梁施工安全操作规程》),ManagementRegulationsOfLuqiaoGroup,路桥集团的管理办法,需关联集团管理办法(如《路桥集团专项施工方案验收条件》)、体现集团特色和集团管理要求;
-acceptance,验收要求,Standards,验收标准,国家验收规范(如《公路工程质量检验评定标准》JTG F80/1-2017、《桥梁工程施工质量验收标准》GB 50205-2020)、行业标准(如《公路桥涵施工技术规范》JTG_T 3650-2024)、企业管理办法(如《四川路桥施工验收管理办法》《路桥集团专项施工方案验收条件》)、操作规程(如《桥梁施工安全操作规程》),ManagementRegulationsOfBridgeCompany,桥梁公司的管理办法,需关联桥梁施工管理办法(如《桥梁施工安全操作规程》)、体现桥梁施工重点 focus:和桥梁施工标准管理要求;
+acceptance,验收要求,Standards,验收标准,国家验收规范(如《公路工程质量检验评定标准》JTG F80/1-2017、《桥梁工程施工质量验收标准》GB 50205-2020)、行业标准(如《公路桥涵施工技术规范》JTG_T 3650-2022)、企业管理办法(如《四川路桥施工验收管理办法》《路桥集团专项施工方案验收条件》)、操作规程(如《桥梁施工安全操作规程》),SichuanRoadAndBridgemanagementRegulations,四川路桥的管理办法,需关联企业管理办法(如《四川路桥施工验收管理办法》)、体现企业特色和企业管理要求;
+acceptance,验收要求,Standards,验收标准,国家验收规范(如《公路工程质量检验评定标准》JTG F80/1-2017、《桥梁工程施工质量验收标准》GB 50205-2020)、行业标准(如《公路桥涵施工技术规范》JTG_T 3650-2023)、企业管理办法(如《四川路桥施工验收管理办法》《路桥集团专项施工方案验收条件》)、操作规程(如《桥梁施工安全操作规程》),managementRegulationsOfLuqiaoGroup,路桥集团的管理办法,需关联集团管理办法(如《路桥集团专项施工方案验收条件》)、体现集团特色和集团管理要求;
+acceptance,验收要求,Standards,验收标准,国家验收规范(如《公路工程质量检验评定标准》JTG F80/1-2017、《桥梁工程施工质量验收标准》GB 50205-2020)、行业标准(如《公路桥涵施工技术规范》JTG_T 3650-2024)、企业管理办法(如《四川路桥施工验收管理办法》《路桥集团专项施工方案验收条件》)、操作规程(如《桥梁施工安全操作规程》),managementRegulationsOfBridgeCompany,桥梁公司的管理办法,需关联桥梁施工管理办法(如《桥梁施工安全操作规程》)、体现桥梁施工重点 focus:和桥梁施工标准管理要求;
 acceptance,验收要求,Procedure,验收程序,进场验收(材料/设备进场检验)、过程验收(工序/隐蔽工程验收)、阶段验收(基础/主体/装饰阶段验收)、完工验收(工程竣工预验收),OnsiteAcceptance,进场验收,需明确验收对象(如“钢筋进场验收”“塔式起重机进场验收”)、是质量控制的第一道防线;
 acceptance,验收要求,Procedure,验收程序,进场验收(材料/设备进场检验)、过程验收(工序/隐蔽工程验收)、阶段验收(基础/主体/装饰阶段验收)、完工验收(工程竣工预验收),ProcessAcceptance,过程验收,需关联施工工序(如“混凝土浇筑过程验收”“钢筋绑扎过程验收”)、强调动态管控;
 acceptance,验收要求,Procedure,验收程序,进场验收(材料/设备进场检验)、过程验收(工序/隐蔽工程验收)、阶段验收(基础/主体/装饰阶段验收)、完工验收(工程竣工预验收),StageAcceptance,阶段验收,需对应工程阶段(如“基础工程阶段验收”“主体结构阶段验收”)、是阶段性成果确认的关键;
@@ -164,7 +164,7 @@ other,其它资料,Drawings,相关施工图纸,工程专业名词类、设备设
 other,其它资料,Tables,附图附表,工序名称类、施工危险因素词汇类、安全设备设施类、资质证照名称类、标准文书类、数值类、时间时期类、数值单位类,ConstructionScheduleNetworkDiagram,施工进度计划网络图,需用节点表示工序逻辑关系(如“桩基础施工→承台施工→盖梁施工”)、是进度控制的核心工具;
 other,其它资料,Tables,附图附表,工序名称类、施工危险因素词汇类、安全设备设施类、资质证照名称类、标准文书类、数值类、时间时期类、数值单位类,ConstructionScheduleGanttChart,施工进度计划横道图,围绕“时间维度”“任务要素”“进度关系”“调整控制”四大核心、覆盖从计划编制到动态监控的全流程。
 other,其它资料,Tables,附图附表,工序名称类、施工危险因素词汇类、安全设备设施类、资质证照名称类、标准文书类、数值类、时间时期类、数值单位类,HazardAnalysisAndResponseMeasuresTable,危险源分析和应对措施表,需识别施工中的危险源(如“高处坠落”“物体打击”)、制定针对性应对措施(如“设置防护栏杆”“佩戴安全带”)、是安全保障的关键文档;
-other,其它资料,Tables,附图附表,工序名称类、施工危险因素词汇类、安全设备设施类、资质证照名称类、标准文书类、数值类、时间时期类、数值单位类,ScannedCopyOfTheCertificateOfFulltimSafetyManagementPersonnel,专职安全管理人员证件扫描件,需包含“安全生产考核合格证书”“证书编号”“有效期”、确保管理人员资质符合要求;
+other,其它资料,Tables,附图附表,工序名称类、施工危险因素词汇类、安全设备设施类、资质证照名称类、标准文书类、数值类、时间时期类、数值单位类,ScannedCopyOfTheCertificateOfFulltimSafetymanagementPersonnel,专职安全管理人员证件扫描件,需包含“安全生产考核合格证书”“证书编号”“有效期”、确保管理人员资质符合要求;
 other,其它资料,Tables,附图附表,工序名称类、施工危险因素词汇类、安全设备设施类、资质证照名称类、标准文书类、数值类、时间时期类、数值单位类,ScannedCopyOfSpecialOperationsPersonnelsCertificate,特种作业人员证件扫描件,需围绕“信息真实性”“管理规范性”“使用便捷性”三大核心、覆盖证件内容、“证书编号”、“有效期”、法规标准四大维度
 other,其它资料,Tables,附图附表,工序名称类、施工危险因素词汇类、安全设备设施类、资质证照名称类、标准文书类、数值类、时间时期类、数值单位类,ScannedCopyOfProfessionalSubcontractorsQualifications,专业分包单位资质扫描件,需包含“营业执照”“资质证书”“安全生产许可证”、确保分包单位具备施工能力。
 other,其它资料,Team,编制及审核人员情况,专项施工方案验收条件一览表、编制人员信息、复核人员信息、审核人员信息、审批人员信息、姓名、职务、职称,ListOfAcceptanceConditionsForSpecialConstructionSchemes,专项施工方案验收条件一览表,需明确验收的前提条件(如“计算书完成”“设计图审核通过”)、是验收的流程依据;

+ 37 - 3
core/construction_review/component/document_processor.py

@@ -120,8 +120,8 @@ SECONDARY_CATEGORY_KEYWORDS = {
         "EnvOrg": ["环境保护组织机构"],  # 严格匹配
         "EnvProtection": ["环境保护及文明施工措施"],  # 严格匹配标准目录名
     },
-    # 施工管理及作业人员配备与分工 (Management)
-    "Management": {
+    # 施工管理及作业人员配备与分工 (management)
+    "management": {
         "Managers": ["施工管理人员"],  # 严格匹配
         "SafetyStaff": ["专职安全生产管理人员"],  # 严格匹配标准目录名
         "SpecialWorkers": ["特种作业人员"],  # 严格匹配
@@ -157,9 +157,14 @@ class DocumentProcessor:
     # 类级别共享的ChunkClassifier实例,避免重复创建LLM客户端
     _shared_chunk_classifier: Optional[ChunkClassifier] = None
 
-    def __init__(self):
+    def __init__(self, progress_manager=None, callback_task_id: str = None, progress_state: dict = None):
         self.supported_types = ['pdf', 'docx']
         self.config = default_config_provider
+        # SSE 进度推送(由 DocumentWorkflow 注入)
+        self._progress_manager = progress_manager
+        self._callback_task_id = callback_task_id
+        # 与心跳协程共享的状态字典,更新后心跳自动反映新阶段
+        self._progress_state = progress_state
 
         # 初始化各类型文档的处理组件
         self._components: Dict[str, DocumentComponents] = {
@@ -339,6 +344,11 @@ class DocumentProcessor:
     async def _classify_chunks_secondary(self, chunks: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
         """对chunks进行二级分类"""
         logger.info(f"{StageName.SECONDARY_CLASSIFICATION.value}: 对内容块进行二级分类")
+        await self._push_classification_progress(
+            stage="文档分类",
+            current=20,
+            message=f"正在进行二级分类,共 {len(chunks)} 个内容块..."
+        )
         try:
             chunk_classifier = self._get_chunk_classifier()
             chunks = await chunk_classifier.classify_chunks_secondary_async(chunks)
@@ -350,6 +360,11 @@ class DocumentProcessor:
     async def _classify_chunks_tertiary(self, chunks: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
         """对chunks进行三级分类"""
         logger.info(f"{StageName.TERTIARY_CLASSIFICATION.value}: 对内容块进行三级分类")
+        await self._push_classification_progress(
+            stage="文档分类",
+            current=60,
+            message=f"正在进行三级分类,共 {len(chunks)} 个内容块..."
+        )
         try:
             chunk_classifier = self._get_chunk_classifier()
             chunks = await chunk_classifier.classify_chunks_tertiary_async(chunks)
@@ -358,6 +373,25 @@ class DocumentProcessor:
             logger.warning(f"三级分类失败: {str(e)},跳过三级分类", exc_info=True)
         return chunks
 
+    async def _push_classification_progress(self, stage: str, current: int, message: str) -> None:
+        """推送分类阶段进度,并同步更新心跳共享状态"""
+        if self._progress_state is not None:
+            self._progress_state['current'] = current
+            self._progress_state['message'] = message
+            self._progress_state['stage'] = stage
+        if self._progress_manager and self._callback_task_id:
+            try:
+                await self._progress_manager.update_stage_progress(
+                    callback_task_id=self._callback_task_id,
+                    stage_name=stage,
+                    current=current,
+                    status="processing",
+                    message=message,
+                    event_type="processing"
+                )
+            except Exception as e:
+                logger.warning(f"分类进度推送失败: {e}")
+
     def _build_parse_result(
         self,
         file_type: str,

+ 25 - 16
core/construction_review/component/reviewers/completeness_reviewer.py

@@ -169,6 +169,15 @@ class LightweightCompletenessChecker:
         self.secondary_specs = self.spec_loader.get_secondary_items()
         self.secondary_names = self.spec_loader.get_secondary_names()
     
+    def _normalize_chapter_code(self, code: str) -> str:
+        """将章节分类码大小写归一化为与CSV一致(如 'management' -> 'management')"""
+        if not code:
+            return code
+        for k in self.spec_loader.first_names:
+            if k.lower() == code.lower():
+                return k
+        return code
+
     async def check(
         self,
         chunks: List[Dict],
@@ -177,19 +186,31 @@ class LightweightCompletenessChecker:
     ) -> LightweightCompletenessResult:
         """
         执行轻量级完整性检查
-        
+
         Args:
             chunks: 文档分块列表,每个chunk需包含tertiary_category_code
             outline: 目录结构(可选)
             chapter_classification: 一级章节分类代码(可选),如果提供则只检查该章节下的分类
-        
+
         Returns:
             LightweightCompletenessResult
         """
-        # 1. 提取正文实际分类(来自 chunks)
+        # 归一化章节分类码,消除大小写差异(如 'management' -> 'management')
+        if chapter_classification:
+            chapter_classification = self._normalize_chapter_code(chapter_classification)
+
+        # 1. 提取正文实际分类(来自 chunks),并同步归一化一级分类码
         actual_secondary = self._extract_secondary_from_chunks(chunks)
         actual_tertiary = self._extract_tertiary_from_chunks(chunks)
 
+        # 将 actual 中的一级分类码同步归一化(解决 'management' vs 'management' 等问题)
+        actual_secondary = {
+            (self._normalize_chapter_code(c1), c2) for c1, c2 in actual_secondary
+        }
+        actual_tertiary = {
+            (self._normalize_chapter_code(c1), c2, c3) for c1, c2, c3 in actual_tertiary
+        }
+
         # 2. 从目录页提取一级/二级(带原始标题)
         outline_first: Set[str] = set()
         outline_secondary: Dict[Tuple[str, str], str] = {}
@@ -252,18 +273,6 @@ class LightweightCompletenessChecker:
         1. 传统格式:每个 chunk 有 tertiary_category_code 字段(单分类)
         2. 增强格式:每个 chunk 有 tertiary_classification_details 字段(行级多分类)
         3. metadata 嵌套格式:字段在 metadata 子对象中
-
-        增强格式示例:
-            tertiary_classification_details: [
-                {
-                    "third_category_code": "LAWS_NATIONAL",
-                    "third_category_name": "国家法律法规",
-                    "start_line": 10,
-                    "end_line": 25,
-                    "content": "..."
-                },
-                ...
-            ]
         """
         actual = set()
 
@@ -698,7 +707,7 @@ class LightweightCompletenessChecker:
                 recommendations.append({
                     "level": "三级",
                     "issue_point": (
-                        f"【三级内容不完整】{first_name} > {second_name} 缺少{n}个要点"
+                        f"【三级内容缺失】{first_name} > {second_name} 缺少{n}个三级要点:{missing_str}"
                     ),
                     "location": f"{first_name} > {second_name}",
                     "suggestion": (

+ 71 - 56
core/construction_review/component/reviewers/utils/llm_content_classifier_v2.py

@@ -294,7 +294,7 @@ SECONDARY_CATEGORY_KEYWORDS = {
     "环境保护组织机构": ["环境保护组织机构", "环保组织", "环境组织"],
     "环境保护及文明施工措施": ["环境保护及文明施工措施", "环保措施", "文明施工", "环境保护", "环境措施"],
 
-    # 施工管理及作业人员配备与分工 (Management)
+    # 施工管理及作业人员配备与分工 (management)
     "施工管理人员": ["施工管理人员", "管理人员", "管理人员配备"],
     "专职安全生产管理人员": ["专职安全生产管理人员", "专职安全员", "安全管理人员", "安全员", "特种作业人员", "特种工"],
     "其他作业人员": ["其他作业人员", "其他人员", "作业人员"],
@@ -903,13 +903,12 @@ class ContentClassifierClient:
 1. 严格保持原始数据的完整性和内容,不要修改任何业务数据
 2. 只修复JSON语法错误(如缺少逗号、括号不匹配、引号问题等)
 3. 确保输出的是合法的JSON格式
-4. 【重要】分类名称和代码必须在原有分类范围内,禁止创造新的分类
+4. 【重要】category_index 必须是数字索引(0, 1, 2...),禁止输出文本名称或代码
 5. 输出必须严格符合以下结构:
 {{
     "classified_contents_list": [
         {{
-            "third_category_name": "分类名称",
-            "third_category_code": "分类代码",
+            "category_index": 数字索引号,
             "start_line": 数字,
             "end_line": 数字
         }}
@@ -924,10 +923,10 @@ class ContentClassifierClient:
 注意:
 - 只输出JSON,不要任何解释文字
 - 如果原始内容被截断,修复已提供的部分即可
-- 禁止创造新的分类名称和代码"""
+- category_index 只能是数字,如 0(非标准项)、1、2、3..."""
 
     def _build_prompt(self, section: SectionContent, is_chunk: bool = False) -> str:
-        """构建分类提示词(优化版)"""
+        """构建分类提示词(优化版)- 使用数字索引映射,避免模型输出复杂代码"""
 
         # 获取二级分类信息
         second_code = ""
@@ -940,24 +939,28 @@ class ContentClassifierClient:
             first_name = section.category_standards[0].first_name
             second_code = section.category_standards[0].second_code
 
-        # 构建三级分类标准描述(完整显示关注要点 - third_focus是最重要的分类依据
+        # 构建三级分类标准描述(使用数字索引,模型只需输出索引号
         standards_desc = []
         for i, std in enumerate(section.category_standards, 1):
             # 完整显示 third_focus,这是最重要的分类依据!
             focus_content = std.third_focus if std.third_focus else "(无具体关注要点)"
             standards_desc.append(
-                f"{i}. {std.third_name} (代码: {std.third_code})\n"
+                f"{i}. {std.third_name}\n"
                 f"   【识别要点】{focus_content}"
             )
 
-        # 添加非标准项作为兜底分类(放在最后,降低优先级)
-        standards_desc.append(
-            f"{len(section.category_standards) + 1}. 非标准项 (代码: no_standard)\n"
-            f"   识别要点: 仅当内容完全不符合以上任何分类时使用,如页眉页脚、纯表格分隔线、无关的广告语等"
-        )
+        # 添加非标准项作为兜底分类(索引0)
+        standards_desc.insert(0, "0. 非标准项\n   【识别要点】仅当内容完全不符合以上任何分类时使用,如页眉页脚、纯表格分隔线、无关的广告语等")
 
         standards_text = '\n\n'.join(standards_desc) if standards_desc else "无具体标准,请根据内容自行判断"
 
+        # 构建索引映射表(用于后处理转换)
+        index_mapping_lines = []
+        index_mapping_lines.append("0 -> 非标准项 (no_standard)")
+        for i, std in enumerate(section.category_standards, 1):
+            index_mapping_lines.append(f"{i} -> {std.third_name} ({std.third_code})")
+        index_mapping_text = "\n".join(index_mapping_lines)
+
         # 计算内容长度和分段提示
         content_length = len(section.numbered_content)
         max_content_length = 12000  # 增加内容长度限制
@@ -1027,12 +1030,14 @@ class ContentClassifierClient:
 - [ ] 分类名称是否与标准列表完全一致?
 - [ ] 包含多个主体的行是否已拆分为多条输出?
 
+## 索引映射表(用于后处理转换,你只需输出索引号)
+{index_mapping_text}
+
 ## 输出格式(严格JSON,不要任何其他文字)
 ```{{
     "classified_contents_list": [
         {{
-            "third_category_name": "三级分类名称(只写名称,不含代码)",
-            "third_category_code": "三级分类代码",
+            "category_index": 数字索引号,
             "start_line": 起始行号,
             "end_line": 结束行号
         }}
@@ -1041,22 +1046,23 @@ class ContentClassifierClient:
 ```
 
 ## 强制约束
-1. 分类名称必须与上述标准列表中的名称完全一致
-2. 分类代码必须使用标准列表中括号内的代码
-3. 行号范围: {section.line_number_map[0] if section.line_number_map else 1} - {section.line_number_map[-1] if section.line_number_map else len(section.lines)}
-4. 只输出JSON,禁止任何解释文字"""
+1. **category_index 必须是数字**(0, 1, 2, 3...),对应上述索引映射表
+2. 0 表示非标准项,1-{len(section.category_standards)} 对应各个三级分类
+3. **禁止输出文本名称或代码**,只输出数字索引
+4. 行号范围: {section.line_number_map[0] if section.line_number_map else 1} - {section.line_number_map[-1] if section.line_number_map else len(section.lines)}
+5. 只输出JSON,禁止任何解释文字"""
 
     async def _call_api(self, prompt: str) -> str:
         """调用API(带指数退避重试)"""
         system_prompt = """你是专业的施工方案文档分析专家。你的任务是:
 1. 仔细阅读文档内容,理解每行的语义
 2. 将内容归类到给定的三级分类标准中
-3. 【重要】优先使用标准分类,只有完全不符合时才使用"非标准项"
+3. 【重要】优先使用标准分类,只有完全不符合时才使用索引0(非标准项)
 4. 【重要】连续相同分类的多行必须合并为一个条目
 5. 【重要】当一行同时提及多个主体或类别(如"勘察、设计和监测单位"),必须为每个主体单独输出一条条目,行号相同
-5. 【重要】分类名称只写名称,不含代码。例如:写"验收内容"而不是"验收内容 (Content)"
-6. 必须在给定的三级分类标准范围内分类,禁止创造新的分类名称
-7. 只输出JSON格式结果,不要任何解释文字"""
+6. 【重要】输出格式:category_index必须是纯数字(0,1,2...),禁止输出文本名称或代码
+7. 必须在给定的三级分类标准范围内分类,禁止创造新的分类
+8. 只输出JSON格式结果,不要任何解释文字"""
 
         kwargs = {
             "model": self.model,
@@ -1167,29 +1173,37 @@ class ContentClassifierClient:
             # 支持两种键名: classified_contents 或 classified_contents_list
             items = data.get("classified_contents", []) or data.get("classified_contents_list", [])
 
-            # 获取有效的分类代码列表(从section的标准分类中)
-            valid_codes = set()
+            # 构建索引映射表:索引 -> (third_name, third_code)
+            index_mapping = {0: ("非标准项", "no_standard")}
             if section.category_standards:
-                for std in section.category_standards:
-                    valid_codes.add(std.third_code)
-            # 添加非标准项作为有效代码
-            valid_codes.add("no_standard")
+                for i, std in enumerate(section.category_standards, 1):
+                    index_mapping[i] = (std.third_name, std.third_code)
 
             for item in items:
                 start_line = item.get("start_line", 0)
                 end_line = item.get("end_line", 0)
-                category_code = item.get("third_category_code", "")
-                category_name = item.get("third_category_name", "")
 
-                # 清理分类名称格式:移除末尾的代码部分(如 "非标准项 (no_standard)" -> "非标准项")
-                if category_name and " (" in category_name and category_name.endswith(")"):
-                    category_name = re.sub(r'\s*\([^)]+\)\s*$', '', category_name).strip()
+                # 优先使用 category_index 进行映射
+                category_index = item.get("category_index")
+                if category_index is not None:
+                    # 通过索引映射获取标准名称和代码
+                    idx = int(category_index) if isinstance(category_index, (int, float, str)) else 0
+                    category_name, category_code = index_mapping.get(idx, ("非标准项", "no_standard"))
+                else:
+                    # 兼容旧格式:直接读取 third_category_code 和 third_category_name
+                    category_code = item.get("third_category_code", "")
+                    category_name = item.get("third_category_name", "")
+
+                    # 清理分类名称格式:移除末尾的代码部分
+                    if category_name and " (" in category_name and category_name.endswith(")"):
+                        category_name = re.sub(r'\s*\([^)]+\)\s*$', '', category_name).strip()
 
-                # 检查分类代码是否在有效列表中,如果不在则强制归为非标准项
-                if category_code not in valid_codes:
-                    print(f"    警告: 发现非标准分类 '{category_name}' ({category_code}),强制归为非标准项")
-                    category_code = "no_standard"
-                    category_name = "非标准项"
+                    # 验证分类代码是否在有效列表中
+                    valid_codes = set(v[1] for v in index_mapping.values())
+                    if category_code not in valid_codes:
+                        print(f"    警告: 发现非标准分类 '{category_name}' ({category_code}),强制归为非标准项")
+                        category_code = "no_standard"
+                        category_name = "非标准项"
 
                 # 根据行号从section中提取原文
                 content = self._extract_content_by_line_numbers(section, start_line, end_line)
@@ -1215,29 +1229,30 @@ class ContentClassifierClient:
                 # 支持两种键名: classified_contents 或 classified_contents_list
                 items = data.get("classified_contents", []) or data.get("classified_contents_list", [])
 
-                # 获取有效的分类代码列表(从section的标准分类中)
-                valid_codes = set()
+                # 构建索引映射表:索引 -> (third_name, third_code)
+                index_mapping = {0: ("非标准项", "no_standard")}
                 if section.category_standards:
-                    for std in section.category_standards:
-                        valid_codes.add(std.third_code)
-                # 添加非标准项作为有效代码
-                valid_codes.add("no_standard")
+                    for i, std in enumerate(section.category_standards, 1):
+                        index_mapping[i] = (std.third_name, std.third_code)
 
                 for item in items:
                     start_line = item.get("start_line", 0)
                     end_line = item.get("end_line", 0)
-                    category_code = item.get("third_category_code", "")
-                    category_name = item.get("third_category_name", "")
-
-                    # 清理分类名称格式:移除末尾的代码部分(如 "非标准项 (no_standard)" -> "非标准项")
-                    if category_name and " (" in category_name and category_name.endswith(")"):
-                        category_name = re.sub(r'\s*\([^)]+\)\s*$', '', category_name).strip()
 
-                    # 检查分类代码是否在有效列表中,如果不在则强制归为非标准项
-                    if category_code not in valid_codes:
-                        print(f"    警告: 发现非标准分类 '{category_name}' ({category_code}),强制归为非标准项")
-                        category_code = "no_standard"
-                        category_name = "非标准项"
+                    # 优先使用 category_index 进行映射
+                    category_index = item.get("category_index")
+                    if category_index is not None:
+                        idx = int(category_index) if isinstance(category_index, (int, float, str)) else 0
+                        category_name, category_code = index_mapping.get(idx, ("非标准项", "no_standard"))
+                    else:
+                        # 兼容旧格式
+                        category_code = item.get("third_category_code", "")
+                        category_name = item.get("third_category_name", "")
+                        valid_codes = set(v[1] for v in index_mapping.values())
+                        if category_code not in valid_codes:
+                            print(f"    警告: 发现非标准分类 '{category_name}' ({category_code}),强制归为非标准项")
+                            category_code = "no_standard"
+                            category_name = "非标准项"
 
                     # 根据行号从section中提取原文
                     content = self._extract_content_by_line_numbers(section, start_line, end_line)

+ 15 - 6
core/construction_review/workflows/document_workflow.py

@@ -32,7 +32,10 @@ class DocumentWorkflow:
 
         self.progress_manager = progress_manager
         self.redis_duplicate_checker = redis_duplicate_checker
-        self.document_processor = DocumentProcessor()
+        self.document_processor = DocumentProcessor(
+            progress_manager=progress_manager,
+            callback_task_id=task_file_info.callback_task_id
+        )
 
     async def _processing_heartbeat(self, progress_state: dict) -> None:
         """
@@ -44,15 +47,16 @@ class DocumentWorkflow:
             try:
                 current = progress_state.get('current', 0)
                 message = progress_state.get('message', 'OCR识别中,请耐心等待...')
+                stage = progress_state.get('stage', '文档解析')
                 await self.progress_manager.update_stage_progress(
                     callback_task_id=self.callback_task_id,
-                    stage_name="文档解析",
+                    stage_name=stage,
                     current=current,
                     status="processing",
                     message=message,
                     event_type="processing"
                 )
-                logger.debug(f"文档解析心跳推送 current={current},任务ID: {self.callback_task_id}")
+                logger.debug(f"文档解析心跳推送 stage={stage} current={current},任务ID: {self.callback_task_id}")
             except asyncio.CancelledError:
                 raise
             except Exception as e:
@@ -64,10 +68,13 @@ class DocumentWorkflow:
         try:
             logger.info(f"开始文档处理工作流,文件ID: {self.file_id}")
 
-            # 共享进度状态:由 hybrid_extractor 在线程中同步写入,心跳协程异步读取
-            progress_state = {'current': 0, 'message': '版面分析中...'}
+            # 共享进度状态:由 hybrid_extractor(线程)和 document_processor(异步)写入,心跳协程读取
+            # stage 字段决定心跳推送时使用的 stage_name,随处理阶段切换
+            progress_state = {'current': 0, 'message': '版面分析中...', 'stage': '文档解析'}
 
-            # 将进度状态注入到 PDF 提取器(仅 HybridFullTextExtractor 支持)
+            # 将进度状态同时注入到:
+            # 1. HybridFullTextExtractor(OCR线程中更新)
+            # 2. DocumentProcessor(分类阶段异步更新)
             try:
                 from ..component.doc_worker.pdf_worker.hybrid_extractor import HybridFullTextExtractor
                 pdf_extractor = self.document_processor._components.get('pdf')
@@ -76,6 +83,8 @@ class DocumentWorkflow:
                     if isinstance(extractor, HybridFullTextExtractor):
                         extractor._progress_state = progress_state
                         logger.debug("已将进度状态注入到 HybridFullTextExtractor")
+                self.document_processor._progress_state = progress_state
+                logger.debug("已将进度状态注入到 DocumentProcessor")
             except Exception as e:
                 logger.warning(f"注入进度状态失败,将使用固定提示: {e}")
 

+ 23 - 23
core/construction_write/component/prompt/keyword_rules_3.json

@@ -12,16 +12,16 @@
     "basis_StandardsAndSpecifications_TechnicalRegulations": "操作流程标准化,工艺参数,量化风险管控,节点设备使用,规范施工验收细则,人员资质要求,应急预案模板,数字化交付标准,BIM协同规则,绿色施工指标,强制性条款需100%执行(如安全操作规范),包含可视化元素(图表、流程图、三维模型指引),与BIM技术深度融合(4D进度模拟、5D成本控制)。"
   },
   {
-    "basis_DocumentSystems_SichuanRoadAndBridgeDocumentSystemsAndManagementProcedures": "需包含集团级BIM实施标准、EPC总承包管理模式细则,强制要求下属单位接入集团统一的数字化管理平台(如PM系统),设置科技创新成果转化的量化考核指标。"
+    "basis_DocumentSystems_SichuanRoadAndBridgeDocumentSystemsAndmanagementProcedures": "需包含集团级BIM实施标准、EPC总承包管理模式细则,强制要求下属单位接入集团统一的数字化管理平台(如PM系统),设置科技创新成果转化的量化考核指标。"
   },
   {
-    "basis_DocumentSystems_RoadAndBridgeGroupDocumentSystemsAndManagementProcedures": "区域化管理细则,属地化政策适配,项目分级管控,应急响应机制,分包商信用评价,农民工工资支付,保障绿色施工区域,标准智慧工地建设指南,隐蔽工程验收流程,工程变更索赔指引。"
+    "basis_DocumentSystems_RoadAndBridgeGroupDocumentSystemsAndmanagementProcedures": "区域化管理细则,属地化政策适配,项目分级管控,应急响应机制,分包商信用评价,农民工工资支付,保障绿色施工区域,标准智慧工地建设指南,隐蔽工程验收流程,工程变更索赔指引。"
   },
   {
-    "basis_DocumentSystems_BridgeCompanyDocumentSystemsAndManagementProcedures": "专业技术标准,工艺工法创新,特种设备管理,试验检测规程,安全生产责任制,班前安全教育工程,质量三检制技术交底,标准化竣工资料归档,规范创优工程培育计划。"
+    "basis_DocumentSystems_BridgeCompanyDocumentSystemsAndmanagementProcedures": "专业技术标准,工艺工法创新,特种设备管理,试验检测规程,安全生产责任制,班前安全教育工程,质量三检制技术交底,标准化竣工资料归档,规范创优工程培育计划。"
   },
   {
-    "basis_DocumentSystems_ConstructionUnitDocumentSystemsAndManagementProcedures": "项目合同履约,工程款支付管理,设计变更审批,竣工验收标准,运营移交协议,保修期责任划分,参建单位考核评价,档案管理实施细则,信息沟通机制,争议解决程序。"
+    "basis_DocumentSystems_ConstructionUnitDocumentSystemsAndmanagementProcedures": "项目合同履约,工程款支付管理,设计变更审批,竣工验收标准,运营移交协议,保修期责任划分,参建单位考核评价,档案管理实施细则,信息沟通机制,争议解决程序。"
   },
   {
     "basis_CompilationPrinciples_NationalPoliciesStandardsAndDesignDocument": "需动态更新(如新版《公路工程技术标准》实施后同步调整),涉及多部门联合审查(发改委、住建部、生态环境部)。\n**重点** focus:\n盖国家战略导向,法规强制性,设计文件权威性,技术基准统一合规性,底线政策更新,跟踪跨部门协同依据。"
@@ -219,7 +219,7 @@
     "safety_SafetySystem_CompanyStandardSystemReference": "强调安全保证体系需承接公司现有标准(如《公司安全生产管理办法》《公司安全技术规程》),确保体系的一致性与延续性;"
   },
   {
-    "safety_Organization_SafetyManagementOrganization": "基于项目经理为组长的安全工作领导小组,关注岗位组织架构名称类,部门名称类,关系结构类名词;"
+    "safety_Organization_SafetymanagementOrganization": "基于项目经理为组长的安全工作领导小组,关注岗位组织架构名称类,部门名称类,关系结构类名词;"
   },
   {
     "safety_Organization_PersonnelSafetyResponsibilities": "关注岗位名称类,人名类,责任制度名词类,岗位职责名词类,安全制度名词类;"
@@ -267,7 +267,7 @@
     "safety_Emergency_EmergencySuppliesAndEquipmentSupport": "应根据事故的不同,以表格的形式说明救援的物品名称、规格型号、单位、数量、监管人、联系电话等内容,应急处置的物质基础,需明确物资的名称(如灭火器、急救箱、千斤顶)、数量(如每100平方米配备2个灭火器)、存放位置(如施工现场入口处)及维护要求(如每月检查一次灭火器压力),确保物资随时可用;"
   },
   {
-    "safety_Emergency_TrafficManagementAndMedicalRescue": "应以表格的形式明确施工工点附近的医疗救援机构名称、联系电话、距离等,并附应急救援线路图;"
+    "safety_Emergency_TrafficmanagementAndMedicalRescue": "应以表格的形式明确施工工点附近的医疗救援机构名称、联系电话、距离等,并附应急救援线路图;"
   },
   {
     "safety_Emergency_Post-disposal": "包括善后处理、调查与评估、恢复生产等三个方面,事故后的恢复工作,需明确善后处理(如伤亡人员家属安抚、财产损失统计)、事故调查(如原因分析、责任认定评估)及整改措施(如完善安全制度、加强培训),避免事故重复发生;"
@@ -276,7 +276,7 @@
     "quality_QualitySystem_QualityAssuranceSystemFramework": "应引用公司标准体系框图,质量体系的视觉化呈现,需明确体系的核心要素(如组织机构、制度流程、资源保障)及逻辑关系,是体系落地的框架基础;"
   },
   {
-    "quality_QualitySystem_QualityManagementOrganization": "基于项目经理为组长的工作领导小组,小组中包括项目经理、项目总工、质量总监、工程部门、质检部门、专业分包单位(协作队伍)项目负责人和项目技术负责人等,需明确层级(如公司级、项目级、班组级)及组成部门(如质量部、工程部、技术部),形成“横向到边、纵向到底”的管理网络;"
+    "quality_QualitySystem_QualitymanagementOrganization": "基于项目经理为组长的工作领导小组,小组中包括项目经理、项目总工、质量总监、工程部门、质检部门、专业分包单位(协作队伍)项目负责人和项目技术负责人等,需明确层级(如公司级、项目级、班组级)及组成部门(如质量部、工程部、技术部),形成“横向到边、纵向到底”的管理网络;"
   },
   {
     "quality_QualitySystem_PersonnelResponsibilities": "需细化每个岗位的质量责任(如项目经理的“第一责任人”职责、质量员的“现场监督”职责),避免职责模糊导致的管理漏洞;"
@@ -327,7 +327,7 @@
     "environment_EnvOrg_EnvironmentalAssuranceSystemFramework": "包含管理人员姓名、职务、职责,环境管理的责任主体,基于项目经理为组长的工作领导小组,小组中包括项目经理、项目副经理、项目总工、工程部门、质检部门、安全环保部门、专业分包单位(协作队伍)项目负责人和项目技术负责人等,需明确机构的层级(如公司级、项目级、班组级)及组成部门(如环境部、工程部、技术部),形成“横向到边、纵向到底”的管理网络;"
   },
   {
-    "environment_EnvOrg_EnvironmentalManagementJobResponsibilities": "需明确各岗位的环境责任(如项目经理的“环境第一责任人”职责、环境专员的“现场巡查”职责),是组织保证的基石;"
+    "environment_EnvOrg_EnvironmentalmanagementJobResponsibilities": "需明确各岗位的环境责任(如项目经理的“环境第一责任人”职责、环境专员的“现场巡查”职责),是组织保证的基石;"
   },
   {
     "environment_EnvOrg_ResponsibilityAssessmentMechanism": "对环境职责履行情况的评价方式(如月度考核、年度评优),需与环境绩效挂钩(如奖金发放、晋升晋级),强化责任意识。"
@@ -348,37 +348,37 @@
     "environment_EnvProtection_AirPollutionPreventionAndControlMeasures": "需采取“洒水降尘、裸土覆盖、车辆冲洗、道路硬化”等措施,确保施工现场目测扬尘高度小于1.5m(土方作业阶段)或0.5m(结构施工阶段)。"
   },
   {
-    "Management_Managers_ConstructionManagementPersonnelList": "需以表格形式明确项目管理人员(如项目经理、项目书记、项目总工、项目副经理、质量总监、安全总监、各职能部门、主管技术员、测量员、质检员,以及专业分包单位(协作队伍)项目负责人和项目技术负责人等)的姓名、岗位及联系方式,是人员管理的基础台账;"
+    "management_Managers_ConstructionmanagementPersonnelList": "需以表格形式明确项目管理人员(如项目经理、项目书记、项目总工、项目副经理、质量总监、安全总监、各职能部门、主管技术员、测量员、质检员,以及专业分包单位(协作队伍)项目负责人和项目技术负责人等)的姓名、岗位及联系方式,是人员管理的基础台账;"
   },
   {
-    "Management_Managers_JobResponsibilitiesList": "需细化每个管理岗位的职责(如项目经理的“项目全面管理”职责、技术负责人的“技术方案审核”职责),避免职责模糊导致的管理漏洞;"
+    "management_Managers_JobResponsibilitiesList": "需细化每个管理岗位的职责(如项目经理的“项目全面管理”职责、技术负责人的“技术方案审核”职责),避免职责模糊导致的管理漏洞;"
   },
   {
-    "Management_SafetyStaff_ListOfFullTimeSafetyProductionManagementPersonnel": "需以表格形式明确专职安全员(如项目安全总监、专职安全员)的姓名、岗位及联系方式,是安全管理的核心台账;"
+    "management_SafetyStaff_ListOfFullTimeSafetyProductionmanagementPersonnel": "需以表格形式明确专职安全员(如项目安全总监、专职安全员)的姓名、岗位及联系方式,是安全管理的核心台账;"
   },
   {
-    "Management_SafetyStaff_SafetyProductionQualificationCertificate": "需明确证书类型(如“建筑施工企业专职安全生产管理人员证书”)、编号及有效期,是上岗的必备资质;"
+    "management_SafetyStaff_SafetyProductionQualificationCertificate": "需明确证书类型(如“建筑施工企业专职安全生产管理人员证书”)、编号及有效期,是上岗的必备资质;"
   },
   {
-    "Management_SafetyStaff_SafetyProductionManagementJobResponsibilities": "需细化专职安全员的职责(如“现场安全检查”“隐患整改监督”“安全培训实施”),确保安全管理工作落地;"
+    "management_SafetyStaff_SafetyProductionmanagementJobResponsibilities": "需细化专职安全员的职责(如“现场安全检查”“隐患整改监督”“安全培训实施”),确保安全管理工作落地;"
   },
   {
-    "Management_SpecialWorkers_ListOfSecialOperationsPersonnel": "需以表格形式明确特种作业人员(如建筑电工、建筑架子工、建筑起重机械司机等)的姓名、工种及联系方式,是特种作业管理的基础台账;"
+    "management_SpecialWorkers_ListOfSecialOperationsPersonnel": "需以表格形式明确特种作业人员(如建筑电工、建筑架子工、建筑起重机械司机等)的姓名、工种及联系方式,是特种作业管理的基础台账;"
   },
   {
-    "Management_SpecialWorkers_SpecialOperationsQualificationCertificate": "需明确证书类型(如“建筑施工特种作业操作资格证书”)、编号及有效期,是上岗的必备资质;"
+    "management_SpecialWorkers_SpecialOperationsQualificationCertificate": "需明确证书类型(如“建筑施工特种作业操作资格证书”)、编号及有效期,是上岗的必备资质;"
   },
   {
-    "Management_SpecialWorkers_SpecialOperationsJobResponsibilities": "需明确作业人员从事的具体工种(如“塔式起重机司机”“高处作业吊篮安装拆卸工”),细化特种作业人员的职责是工种管理的关键;"
+    "management_SpecialWorkers_SpecialOperationsJobResponsibilities": "需明确作业人员从事的具体工种(如“塔式起重机司机”“高处作业吊篮安装拆卸工”),细化特种作业人员的职责是工种管理的关键;"
   },
   {
-    "Management_OtherWorkers_NumberOfManagementPersonnelInProfessionalSubcontractingUnits": "需明确分包单位(如劳务分包、专业分包)的管理人员(如分包项目经理、技术负责人)数量,是分包管理的基础;"
+    "management_OtherWorkers_NumberOfmanagementPersonnelInProfessionalSubcontractingUnits": "需明确分包单位(如劳务分包、专业分包)的管理人员(如分包项目经理、技术负责人)数量,是分包管理的基础;"
   },
   {
-    "Management_OtherWorkers_NumberOfWorkersInDifferentJobCategories": "需以表格形式明确各工种(如木工、钢筋工、混凝土工、砌筑工等)的作业人员数量,是劳动力调配的依据;"
+    "management_OtherWorkers_NumberOfWorkersInDifferentJobCategories": "需以表格形式明确各工种(如木工、钢筋工、混凝土工、砌筑工等)的作业人员数量,是劳动力调配的依据;"
   },
   {
-    "Management_OtherWorkers_WorkersLlog": "需记录作业人员的姓名、工种、身份证号、联系方式等信息,是人员管理的重要档案;"
+    "management_OtherWorkers_WorkersLlog": "需记录作业人员的姓名、工种、身份证号、联系方式等信息,是人员管理的重要档案;"
   },
   {
     "acceptance_Standards_NationalStandardsSpecificationsAndOperatingProcedures": "是验收的基础依据,需明确具体规范名称(如JTG F80/1-2017),避免使用“国家规范”等泛化表述;"
@@ -387,13 +387,13 @@
     "acceptance_Standards_IndustryStandardOperatingProcedures": "需指向具体行业的内部文件(如行业标准(如《公路桥涵施工技术规范》JTG_T 3650-2020),体现行业管理要求;"
   },
   {
-    "acceptance_Standards_SichuanRoadAndBridgeManagementRegulations": "需关联企业管理办法(如《四川路桥施工验收管理办法》),体现企业特色和企业管理要求;"
+    "acceptance_Standards_SichuanRoadAndBridgemanagementRegulations": "需关联企业管理办法(如《四川路桥施工验收管理办法》),体现企业特色和企业管理要求;"
   },
   {
-    "acceptance_Standards_ManagementRegulationsOfLuqiaoGroup": "需关联集团管理办法(如《路桥集团专项施工方案验收条件》),体现集团特色和集团管理要求;"
+    "acceptance_Standards_managementRegulationsOfLuqiaoGroup": "需关联集团管理办法(如《路桥集团专项施工方案验收条件》),体现集团特色和集团管理要求;"
   },
   {
-    "acceptance_Standards_ManagementRegulationsOfBridgeCompany": "需关联桥梁施工管理办法(如《桥梁施工安全操作规程》),体现桥梁施工重点 focus:和桥梁施工标准管理要求;"
+    "acceptance_Standards_managementRegulationsOfBridgeCompany": "需关联桥梁施工管理办法(如《桥梁施工安全操作规程》),体现桥梁施工重点 focus:和桥梁施工标准管理要求;"
   },
   {
     "acceptance_Procedure_OnsiteAcceptance": "需明确验收对象(如“钢筋进场验收”“塔式起重机进场验收”),是质量控制的第一道防线;"
@@ -495,7 +495,7 @@
     "other_Tables_HazardAnalysisAndResponseMeasuresTable": "需识别施工中的危险源(如“高处坠落”“物体打击”),制定针对性应对措施(如“设置防护栏杆”“佩戴安全带”),是安全保障的关键文档;"
   },
   {
-    "other_Tables_ScannedCopyOfTheCertificateOfFulltimSafetyManagementPersonnel": "需包含“安全生产考核合格证书”“证书编号”“有效期”,确保管理人员资质符合要求;"
+    "other_Tables_ScannedCopyOfTheCertificateOfFulltimSafetymanagementPersonnel": "需包含“安全生产考核合格证书”“证书编号”“有效期”,确保管理人员资质符合要求;"
   },
   {
     "other_Tables_ScannedCopyOfSpecialOperationsPersonnelsCertificate": "需围绕“信息真实性”“管理规范性”“使用便捷性”三大核心,覆盖证件内容、“证书编号”、“有效期”、法规标准四大维度"

+ 4 - 4
utils_test/Completeness_Enhanced_Test/test_completeness_integration.py

@@ -48,10 +48,10 @@ def simulate_tertiary_classification(chunks: list) -> list:
             {"third_category_code": "TechnicalRegulations", "third_category_name": "技术规程"}
         ],
         "DocumentSystems": [
-            {"third_category_code": "SichuanRoadAndBridgeDocumentSystemsAndManagementProcedures", "third_category_name": "四川路桥下发的文件制度和管理程序文件"},
-            {"third_category_code": "RoadAndBridgeGroupDocumentSystemsAndManagementProcedures", "third_category_name": "路桥集团下发的文件制度和管理程序文件"},
-            {"third_category_code": "BridgeCompanyDocumentSystemsAndManagementProcedures", "third_category_name": "桥梁公司下发的文件制度和管理程序文件"},
-            {"third_category_code": "ConstructionUnitDocumentSystemsAndManagementProcedures", "third_category_name": "建设单位下发的文件制度和管理程序文件"}
+            {"third_category_code": "SichuanRoadAndBridgeDocumentSystemsAndmanagementProcedures", "third_category_name": "四川路桥下发的文件制度和管理程序文件"},
+            {"third_category_code": "RoadAndBridgeGroupDocumentSystemsAndmanagementProcedures", "third_category_name": "路桥集团下发的文件制度和管理程序文件"},
+            {"third_category_code": "BridgeCompanyDocumentSystemsAndmanagementProcedures", "third_category_name": "桥梁公司下发的文件制度和管理程序文件"},
+            {"third_category_code": "ConstructionUnitDocumentSystemsAndmanagementProcedures", "third_category_name": "建设单位下发的文件制度和管理程序文件"}
         ],
         "CompilationPrinciples": [
             {"third_category_code": "NationalPoliciesStandardsAndDesignDocument", "third_category_name": "国家方针、政策、标准和设计文件"},