#!/usr/bin/env python3 """ 为现有规则补充内容定位配置(locatorType、chapterTitle、reviewCode、prompt) """ import requests, json BASE = "http://47.108.80.98:8001" PROJECT_ID = 10 # ── 1. 登录 ───────────────────────────────────────────────── r = requests.post(f"{BASE}/api/v1/auth/login", json={"username": "admin", "password": "admin123"}) TOKEN = r.json()["data"]["accessToken"] HDR = {"Authorization": f"Bearer {TOKEN}", "Content-Type": "application/json"} # ── 2. 规则配置补充 ────────────────────────────────────────── # 格式: elementKey -> { locatorType, chapterTitle, reviewCode, tableSelector, prompt } RULE_CONFIGS = { # ═══════════════════════════════════════════════ # 工作方案 (001008) → 全文提取 # ═══════════════════════════════════════════════ "project.reviewObject": { "locatorType": "full_text", "prompt": """你是一个专业的文档信息提取助手。请阅读以下内容,提取评审对象公司的全称。 提取规则: 1. 提取封面或标题第一行的受检单位全称 2. 通常在"一、工作目的"中出现,如"XXX公司(以下简称:XXX)" 3. 只输出公司全称,不要其他内容 输出格式:直接输出公司全称文本""" }, "project.reviewObjectAlias": { "locatorType": "chapter", "chapterTitle": "工作目的", "prompt": """从内容中提取评审对象公司的简称。 提取规则: 1. 寻找"以下简称"或"简称"后面的内容 2. 例如"中国电建集团成都勘测设计研究院有限公司(以下简称:成都院)",简称为"成都院" 3. 只输出简称,不要其他内容""" }, "project.workStartAt": { "locatorType": "chapter", "chapterTitle": "工作时间", "prompt": """从内容中提取评审工作开始日期。 提取规则: 1. 寻找"工作时间阶段"或"评审时间"相关内容 2. 格式通常为"yyyy年M月d日至yyyy年M月d日" 3. 提取开始日期,格式为:yyyy年M月d日""" }, "project.workEndAt": { "locatorType": "chapter", "chapterTitle": "工作时间", "prompt": """从内容中提取评审工作结束日期。 提取规则: 1. 寻找"工作时间阶段"或"评审时间"相关内容 2. 格式通常为"yyyy年M月d日至yyyy年M月d日" 3. 提取结束日期,格式为:yyyy年M月d日""" }, "project.reviewRange": { "locatorType": "chapter", "chapterTitle": "查评范围", "prompt": """从内容中提取复审范围,包括所有复审项目(单位和在建项目)。 提取规则: 1. 提取所有被评审的单位和项目名称 2. 按类型排序:先单位后项目 3. 格式如:成都院本部、大邑地勘项目(简称:大邑项目)""" }, "project.workProcess": { "locatorType": "full_text", "prompt": """根据工作方案内容,生成复审工作过程描述。 包含以下内容: 1. 评审组工作会议召开情况 2. 现场评审安排 3. 具体评审时间表 4. 评审组成员分工 输出格式:按时间顺序描述复审工作过程""" }, # ═══════════════════════════════════════════════ # 核心要素评审记录表 (001001) → 评审代码定位 # ═══════════════════════════════════════════════ "project.resultScore": { "locatorType": "table", "tableSelector": "核心要素评审情况记录表", "prompt": """从表格中提取各评审项的标准分和实得分,计算总评审得分。 计算公式:总实得分/总标准分×100 输出格式:保留一位小数的分数,如 92.5""" }, "project.resultLevel": { "locatorType": "table", "tableSelector": "核心要素评审情况记录表", "prompt": """根据评审得分判定评审结论级别。 判定规则: - ≥90分为一级 - ≥80分为二级 - <80分为三级 输出格式:一级/二级/三级""" }, "project.target": { "locatorType": "review_code", "reviewCode": "5.1.1", "prompt": """从评审代码5.1.1.1~5.1.1.3的评审意见中,总结生成目标描述。 要求: 1. 提取各子项的评审意见(remark) 2. 综合分析,生成100字以内的目标描述 3. 突出企业安全生产目标的制定和落实情况""" }, "project.duty": { "locatorType": "review_code", "reviewCode": "5.1.2.1", "prompt": """从评审代码5.1.2.1的评审意见中,总结生成职责描述。 要求: 1. 提取评审意见(remark) 2. 生成100字以内的职责描述 3. 突出安全生产责任制的建立和落实情况""" }, "project.fullParticipation": { "locatorType": "review_code", "reviewCode": "5.1.3", "prompt": """从评审代码5.1.3的评审意见中,总结生成全员参与描述。 要求: 1. 提取评审意见(remark) 2. 生成100字以内的全员参与描述 3. 突出全员安全生产参与机制""" }, "project.safetyInvestment": { "locatorType": "review_code", "reviewCode": "5.1.4", "prompt": """从评审代码5.1.4的评审意见中,总结生成安全投入描述。 要求: 1. 提取评审意见(remark) 2. 生成100字以内的安全投入描述 3. 突出安全生产费用的提取和使用情况""" }, "project.safetyCulture": { "locatorType": "review_code", "reviewCode": "5.1.5", "prompt": """从评审代码5.1.5的评审意见中,总结生成安全文化描述。 要求: 1. 提取评审意见(remark) 2. 生成100字以内的安全文化描述 3. 突出企业安全文化建设情况""" }, "project.systematicManagement": { "locatorType": "review_code", "reviewCode": "5.2", "prompt": """从评审代码5.2.*的评审意见中,总结生成体系化管理描述。 要求: 1. 提取5.2下所有子项的评审意见 2. 综合分析,生成150字以内的体系化管理描述 3. 突出安全管理体系的建设和运行情况""" }, "project.employeeTraining": { "locatorType": "review_code", "reviewCode": "5.3.2", "prompt": """从评审代码5.3.2.*的评审意见中,总结生成人员教育培训描述。 要求: 1. 提取5.3.2下所有子项的评审意见 2. 综合分析,生成100字以内的人员教育培训描述 3. 突出安全教育培训的开展情况""" }, "project.assetManagement": { "locatorType": "review_code", "reviewCode": "5.4.1", "prompt": """从评审代码5.4.1.*的评审意见中,总结生成设备设施管理描述。 要求: 1. 提取5.4.1下所有子项的评审意见 2. 综合分析,生成100字以内的设备设施管理描述 3. 突出设备设施的安全管理情况""" }, "project.jobSafety": { "locatorType": "review_code", "reviewCode": "5.4.2.1", "prompt": """从评审代码5.4.2.1的评审意见中,总结生成作业安全描述。 要求: 1. 提取评审意见(remark) 2. 生成100字以内的作业安全描述 3. 突出作业现场安全管理情况""" }, "project.positionQualified": { "locatorType": "review_code", "reviewCode": "5.4.2.3", "prompt": """从评审代码5.4.2.3的评审意见中,总结生成岗位达标描述。 要求: 1. 提取评审意见(remark) 2. 生成100字以内的岗位达标描述 3. 突出岗位安全达标情况""" }, "project.partner": { "locatorType": "review_code", "reviewCode": "5.4.2.4", "prompt": """从评审代码5.4.2.4的评审意见中,总结生成相关方管理描述。 要求: 1. 提取评审意见(remark) 2. 生成100字以内的相关方管理描述 3. 突出相关方安全管理情况""" }, "project.occupationalHealth": { "locatorType": "review_code", "reviewCode": "5.4.3.1", "prompt": """从评审代码5.4.3.1的评审意见中,总结生成职业健康描述。 要求: 1. 提取评审意见(remark) 2. 生成100字以内的职业健康描述 3. 突出职业健康管理情况""" }, "project.riskAssessment": { "locatorType": "review_code", "reviewCode": "5.5.1", "prompt": """从评审代码5.5.1.1和5.5.1.2的评审意见中,总结生成风险辨识与评价描述。 要求: 1. 提取5.5.1.1和5.5.1.2的评审意见 2. 综合分析,生成100字以内的风险辨识与评价描述 3. 突出风险辨识和评价工作开展情况""" }, "project.majorHazardManagement": { "locatorType": "review_code", "reviewCode": "5.5.2.1", "prompt": """从评审代码5.5.2.1的评审意见中,总结生成重大危险源管理描述。 要求: 1. 提取评审意见(remark) 2. 生成100字以内的重大危险源管理描述 3. 突出重大危险源辨识和管控情况""" }, "project.hazardInspection": { "locatorType": "review_code", "reviewCode": "5.5.3.1", "prompt": """从评审代码5.5.3.1的评审意见中,总结生成隐患排查描述。 要求: 1. 提取评审意见(remark) 2. 生成100字以内的隐患排查描述 3. 突出隐患排查治理工作开展情况""" }, "project.changeManagement": { "locatorType": "review_code", "reviewCode": "5.5.1.4", "prompt": """从评审代码5.5.1.4的评审意见中,总结生成变更管理描述。 要求: 1. 提取评审意见(remark) 2. 生成100字以内的变更管理描述 3. 突出变更管理制度和执行情况""" }, "project.earlyWarning": { "locatorType": "review_code", "reviewCode": "5.5.4", "prompt": """从评审代码5.5.4的评审意见中,总结生成预测预警描述。 要求: 1. 提取评审意见(remark) 2. 生成100字以内的预测预警描述 3. 突出预测预警机制建设情况""" }, "project.emergencyResponse": { "locatorType": "review_code", "reviewCode": "5.6.1.1", "prompt": """从评审代码5.6.1.1的评审意见中,总结生成应急救援描述。 要求: 1. 提取评审意见(remark) 2. 生成100字以内的应急救援描述 3. 突出应急预案和应急演练情况""" }, "project.incidentManagement": { "locatorType": "review_code", "reviewCode": "5.7.1", "prompt": """从评审代码5.7.1的评审意见中,总结生成事故管理描述。 要求: 1. 提取评审意见(remark) 2. 生成100字以内的事故管理描述 3. 突出事故报告和调查处理情况""" }, "project.continuousImprovement": { "locatorType": "review_code", "reviewCode": "5.8.2", "prompt": """从评审代码5.8.2.*的评审意见中,总结生成持续改进描述。 要求: 1. 提取5.8.2下所有子项的评审意见 2. 综合分析,生成100字以内的持续改进描述 3. 突出安全生产标准化持续改进情况""" }, "project.safetyStandardizationStatus": { "locatorType": "review_code", "reviewCode": "5.8", "prompt": """从评审代码5.8.1.*和5.8.2.*的评审意见中,总结生成标准化建设运行情况描述。 要求: 1. 提取5.8下所有子项的评审意见 2. 综合分析,生成150字以内的标准化建设运行情况描述 3. 突出安全生产标准化体系的建设和运行情况""" }, "project.safetyHighlight": { "locatorType": "review_code", "reviewCode": "5.1", "prompt": """综合评审代码5.1下各子项的评审意见,提炼安全生产管理亮点。 要求: 1. 提取5.1下所有子项的评审意见 2. 分析提炼企业安全生产管理的亮点和特色 3. 生成150字以内的亮点描述""" }, # ═══════════════════════════════════════════════ # 安全生产标准化复审实施方案 (001003) # ═══════════════════════════════════════════════ "project.reviewObjectSelfAssessmentProcess": { "locatorType": "full_text", "prompt": """从安全生产标准化复审实施方案中,总结自评过程内容。 包含以下6个阶段: 1. 前期策划 2. 专题培训 3. 自查自纠 4. 内审整改 5. 报告撰写 6. 持续改进 输出格式:按阶段描述自评过程,每个阶段50-100字""" }, "project.moreWorkReference": { "locatorType": "chapter", "chapterTitle": "工作依据", "prompt": """从内容中提取其他工作依据文件。 提取规则: 1. 寻找文件编号和文件名称 2. 格式如:《xxx管理办法》(蓉设安质〔2024〕20号) 3. 多个文件用换行分隔""" }, } # ── 3. 获取现有规则并更新 ────────────────────────────────────── print("获取现有规则...") resp = requests.get(f"{BASE}/api/v1/projects/{PROJECT_ID}/rules", headers=HDR) if resp.status_code != 200: print(f"获取规则失败: {resp.status_code} {resp.text}") exit(1) rules = resp.json().get("data", []) print(f"共 {len(rules)} 条规则\n") # ── 4. 更新规则配置 ────────────────────────────────────────── ok, skip, fail = 0, 0, 0 for rule in rules: rule_id = rule.get("id") element_key = rule.get("elementKey") rule_name = rule.get("ruleName") if element_key not in RULE_CONFIGS: print(f" ⏭️ [{rule_id:>5}] {element_key:50s} - 无配置,跳过") skip += 1 continue config = RULE_CONFIGS[element_key] # 合并现有 actionConfig existing_config = {} if rule.get("actionConfig"): try: existing_config = json.loads(rule["actionConfig"]) if isinstance(rule["actionConfig"], str) else rule["actionConfig"] except: pass # 更新配置 new_config = {**existing_config, **config} payload = { "elementKey": element_key, "ruleName": rule_name, "actionConfig": json.dumps(new_config, ensure_ascii=False), } resp = requests.put(f"{BASE}/api/v1/rules/{rule_id}", headers=HDR, json=payload) if resp.status_code == 200 and resp.json().get("code") == 200: print(f" ✅ [{rule_id:>5}] {element_key:50s} - locatorType={config.get('locatorType')}") ok += 1 else: print(f" ❌ [{rule_id:>5}] {element_key:50s} → {resp.status_code} {resp.text[:100]}") fail += 1 print(f"\n完成:成功 {ok},跳过 {skip},失败 {fail}")