_mock_rules_v2.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. #!/usr/bin/env python3
  2. """
  3. 根据 anyuan_docs_maker 的 Dataset001Parser 真实逻辑,
  4. 为 lingyue project 10 创建准确的规则映射。
  5. """
  6. import requests, json
  7. BASE = "http://47.108.80.98:8001"
  8. PROJECT_ID = 10
  9. # ── 1. 登录 ─────────────────────────────────────────────────
  10. r = requests.post(f"{BASE}/api/v1/auth/login", json={"username": "admin", "password": "admin123"})
  11. TOKEN = r.json()["data"]["accessToken"]
  12. HDR = {"Authorization": f"Bearer {TOKEN}", "Content-Type": "application/json"}
  13. # ── 2. lingyue 附件 ID 映射 ──────────────────────────────────
  14. # anyuan 附件编号 → lingyue attachment id + 名称
  15. ATT = {
  16. "001001": (400, "核心要素评审情况记录表"),
  17. "001002": (401, "现场评审分工表"),
  18. "001003": (402, "安全生产标准化复审实施方案"),
  19. "001004": (403, "材料真实性说明"),
  20. "001005": (404, "在建项目一览表"),
  21. "001006": (405, "安全管理制度清单"),
  22. "001007": (406, "现场评审末次会签到表"),
  23. "001008": (407, "工作方案"),
  24. "001010": (408, "复审问题建议表"),
  25. }
  26. def inp(code):
  27. """构建 inputs 数组"""
  28. aid, name = ATT[code]
  29. return [{"sourceNodeId": str(aid), "inputKey": "attachment", "inputType": "ATTACHMENT", "inputName": name}]
  30. def inps(*codes):
  31. """多来源"""
  32. result = []
  33. for c in codes:
  34. aid, name = ATT[c]
  35. result.append({"sourceNodeId": str(aid), "inputKey": "attachment", "inputType": "ATTACHMENT", "inputName": name})
  36. return result
  37. # ── 3. 规则定义(按 Dataset001Parser 解析阶段) ────────────────
  38. # 格式: (elementKey, ruleName, actionType, dslContent/描述, 来源附件编号列表)
  39. RULES = [
  40. # ═══════════════════════════════════════════════
  41. # 阶段2: 工作方案 (001008) → 评审对象、简称、日期、人员等
  42. # ═══════════════════════════════════════════════
  43. ("project.reviewObject",
  44. "评审对象全称", "summary",
  45. "从工作方案PDF中通过AI提取评审对象全称。解析工作方案的每个PDF文件,从中识别被评审企业的完整名称。",
  46. ["001008"]),
  47. ("project.reviewObjectAlias",
  48. "评审对象简称", "summary",
  49. "从工作方案PDF中通过AI提取评审对象简称。例如「中国电建集团成都勘测设计研究院有限公司」简称「成都院」。",
  50. ["001008"]),
  51. ("project.workStartAt",
  52. "评审开始日期", "quote",
  53. "从工作方案PDF中直接提取评审工作开始日期。格式为:yyyy年M月d日。多个工作方案时取最早的开始日期。",
  54. ["001008"]),
  55. ("project.workEndAt",
  56. "评审结束日期", "quote",
  57. "从工作方案PDF中直接提取评审工作结束日期。格式为:yyyy年M月d日。多个工作方案时取最晚的结束日期。",
  58. ["001008"]),
  59. ("project.reviewRange",
  60. "复审范围", "summary",
  61. "从工作方案PDF中提取所有复审项目(单位和在建项目),按类型排序后拼接。格式如:成都院本部、大邑地勘项目(简称:大邑项目)。",
  62. ["001008"]),
  63. ("project.workProcess",
  64. "复审工作过程", "summary",
  65. "根据工作方案中提取的评审开始/结束日期、评审对象简称、复审项目列表,按固定模板生成复审工作过程描述。包含评审组工作会议、现场评审、具体评审时间表等内容。",
  66. ["001008"]),
  67. ("+SPSRRReviewProject",
  68. "现场复审项目", "table_extract",
  69. "从工作方案PDF中提取复审项目列表,包含项目名称、简称、类型(单位/在建项目)、排序等信息。",
  70. ["001008"]),
  71. ("+SPSRRReviewer",
  72. "现场复审人员", "table_extract",
  73. "从工作方案PDF中提取评审人员列表,包含姓名、专业分工等。多个工作方案中的同名人员会合并专业。",
  74. ["001008"]),
  75. # ═══════════════════════════════════════════════
  76. # 阶段4: 核心要素评审记录表 (001001) → 各核心要素得分与评审意见
  77. # ═══════════════════════════════════════════════
  78. ("project.resultScore",
  79. "评审得分", "table_extract",
  80. "从核心要素评审情况记录表(docx)中提取各评审项的标准分和实得分,汇总计算总评审得分。公式:总实得分/总标准分×100。",
  81. ["001001"]),
  82. ("project.resultLevel",
  83. "评审结论级别", "table_extract",
  84. "根据评审得分自动判定。≥90分为一级,≥80分为二级。",
  85. ["001001"]),
  86. ("project.target",
  87. "目标", "summary",
  88. "从核心要素评审记录表中提取评审代码5.1.1.1~5.1.1.3的评审意见(remark),经AI总结生成目标描述。",
  89. ["001001"]),
  90. ("project.duty",
  91. "职责", "summary",
  92. "从核心要素评审记录表中提取评审代码5.1.2.1的评审意见(remark),经AI总结生成职责描述。",
  93. ["001001"]),
  94. ("project.fullParticipation",
  95. "全员参与", "summary",
  96. "从核心要素评审记录表中提取评审代码5.1.3的评审意见(remark),经AI总结生成全员参与描述。",
  97. ["001001"]),
  98. ("project.safetyInvestment",
  99. "安全投入", "summary",
  100. "从核心要素评审记录表中提取评审代码5.1.4的评审意见(remark),经AI总结生成安全投入描述。",
  101. ["001001"]),
  102. ("project.safetyCulture",
  103. "安全文化", "summary",
  104. "从核心要素评审记录表中提取评审代码5.1.5的评审意见(remark),经AI总结生成安全文化描述。",
  105. ["001001"]),
  106. ("project.systematicManagement",
  107. "体系化管理", "summary",
  108. "从核心要素评审记录表中提取评审代码5.2.*的评审意见(remark),经AI总结生成体系化管理描述。",
  109. ["001001"]),
  110. ("project.employeeTraining",
  111. "人员教育培训", "summary",
  112. "从核心要素评审记录表中提取评审代码5.3.2.*的评审意见(remark),经AI总结生成人员教育培训描述。",
  113. ["001001"]),
  114. ("project.assetManagement",
  115. "设备设施管理", "summary",
  116. "从核心要素评审记录表中提取评审代码5.4.1.*的评审意见(remark),经AI总结生成设备设施管理描述。",
  117. ["001001"]),
  118. ("project.jobSafety",
  119. "作业安全", "summary",
  120. "从核心要素评审记录表中提取评审代码5.4.2.1的评审意见(remark),经AI总结生成作业安全描述。",
  121. ["001001"]),
  122. ("project.positionQualified",
  123. "岗位达标", "summary",
  124. "从核心要素评审记录表中提取评审代码5.4.2.3的评审意见(remark),经AI总结生成岗位达标描述。",
  125. ["001001"]),
  126. ("project.partner",
  127. "相关方", "summary",
  128. "从核心要素评审记录表中提取评审代码5.4.2.4的评审意见(remark),经AI总结生成相关方管理描述。",
  129. ["001001"]),
  130. ("project.occupationalHealth",
  131. "职业健康", "summary",
  132. "从核心要素评审记录表中提取评审代码5.4.3.1的评审意见(remark),经AI总结生成职业健康描述。",
  133. ["001001"]),
  134. ("project.riskAssessment",
  135. "风险辨识与评价", "summary",
  136. "从核心要素评审记录表中提取评审代码5.5.1.1和5.5.1.2的评审意见(remark),经AI总结生成风险辨识与评价描述。",
  137. ["001001"]),
  138. ("project.majorHazardManagement",
  139. "重大危险源管理", "summary",
  140. "从核心要素评审记录表中提取评审代码5.5.2.1的评审意见(remark),经AI总结生成重大危险源管理描述。",
  141. ["001001"]),
  142. ("project.hazardInspection",
  143. "隐患排查", "summary",
  144. "从核心要素评审记录表中提取评审代码5.5.3.1的评审意见(remark),经AI总结生成隐患排查描述。",
  145. ["001001"]),
  146. ("project.changeManagement",
  147. "变更管理", "summary",
  148. "从核心要素评审记录表中提取评审代码5.5.1.4的评审意见(remark),经AI总结生成变更管理描述。",
  149. ["001001"]),
  150. ("project.earlyWarning",
  151. "预测预警", "summary",
  152. "从核心要素评审记录表中提取评审代码5.5.4的评审意见(remark),经AI总结生成预测预警描述。",
  153. ["001001"]),
  154. ("project.emergencyResponse",
  155. "应急救援", "summary",
  156. "从核心要素评审记录表中提取评审代码5.6.1.1的评审意见(remark),经AI总结生成应急救援描述。",
  157. ["001001"]),
  158. ("project.incidentManagement",
  159. "事故管理", "summary",
  160. "从核心要素评审记录表中提取评审代码5.7.1的评审意见(remark),经AI总结生成事故管理描述。",
  161. ["001001"]),
  162. ("project.continuousImprovement",
  163. "持续改进", "summary",
  164. "从核心要素评审记录表中提取评审代码5.8.2.*的评审意见(remark),经AI总结生成持续改进描述。",
  165. ["001001"]),
  166. ("project.safetyStandardizationStatus",
  167. "标准化建设运行情况", "summary",
  168. "从核心要素评审记录表中提取评审代码5.8.1.*和5.8.2.*的评审意见(remark),经AI总结生成标准化建设运行情况描述。",
  169. ["001001"]),
  170. ("project.safetyHighlight",
  171. "安全生产管理亮点", "summary",
  172. "综合核心要素评审记录表中目标职责(5.1)各子项的评审意见,经AI提炼安全生产管理亮点。",
  173. ["001001"]),
  174. ("+target_responsibility",
  175. "目标职责详情", "table_extract",
  176. "从核心要素评审记录表中筛选评审代码为5.1.*的所有检查项,按模板渲染目标职责章节详情。包含各子项的评审标准、标准分、实得分、存在问题及扣分情况。",
  177. ["001001"]),
  178. ("+institutionalized_management",
  179. "制度化管理详情", "table_extract",
  180. "从核心要素评审记录表中筛选评审代码为5.2.*的所有检查项,按模板渲染制度化管理章节详情。",
  181. ["001001"]),
  182. ("+review_status",
  183. "现场复审情况", "table_extract",
  184. "从核心要素评审记录表中汇总所有8个核心要素的评审结果,渲染现场复审情况总览表。",
  185. ["001001"]),
  186. ("+review_result",
  187. "复审结果", "table_extract",
  188. "根据核心要素评审记录表的评分汇总,按8个核心要素计算实际评审项数、标准分、实得分、扣分项数等,生成复审结果表。",
  189. ["001001"]),
  190. ("+site_reaudit_score_analysis",
  191. "现场复审得分分析", "table_extract",
  192. "根据核心要素评审记录表的评分结果,计算各核心要素的得分率(实得分/标准分×100),生成得分分析表和分析文字描述。",
  193. ["001001"]),
  194. # ═══════════════════════════════════════════════
  195. # 阶段6: 复审问题建议表 (001010) → 整改建议
  196. # ═══════════════════════════════════════════════
  197. ("+SPSRRSuggestion",
  198. "现场复审发现的问题及整改", "table_extract",
  199. "主体数据从核心要素评审记录表(001001)中提取有扣分的检查项(问题描述),整改建议从复审问题建议表(001010)中按评审代码匹配补充。",
  200. ["001001", "001010"]),
  201. # ═══════════════════════════════════════════════
  202. # 阶段7: 安全生产标准化复审实施方案 (001003) → 自评过程、工作依据
  203. # ═══════════════════════════════════════════════
  204. ("project.reviewObjectSelfAssessmentProcess",
  205. "自评过程", "summary",
  206. "从安全生产标准化复审实施方案(PDF)中OCR提取全文,通过AI按参考模板总结自评过程内容。包含前期策划、专题培训、自查自纠、内审整改、报告撰写、持续改进6个阶段。",
  207. ["001003"]),
  208. ("project.moreWorkReference",
  209. "其他工作依据", "quote",
  210. "从安全生产标准化复审实施方案(PDF)中OCR提取文件编号和文件名称。格式如:《xxx管理办法》(蓉设安质〔2024〕20号)。",
  211. ["001003"]),
  212. # ═══════════════════════════════════════════════
  213. # 用户输入字段(来源为用户手工填写的元数据,不依赖附件)
  214. # ═══════════════════════════════════════════════
  215. ("basicInfo.projectCode",
  216. "项目编号", "use_entity_value",
  217. "用户手工输入的项目编号,如 PRJ-2024-001。",
  218. []),
  219. ("basicInfo.requestLevel",
  220. "申请级别", "use_entity_value",
  221. "用户手工输入的申请标准化复审级别,如「一级」。",
  222. []),
  223. ("basicInfo.applyAt",
  224. "复审申请日期", "use_entity_value",
  225. "用户手工输入的复审申请日期。格式为:yyyy年M月d日。",
  226. []),
  227. ("basicInfo.reviewObjectCertificateGetAt",
  228. "获证日期", "use_entity_value",
  229. "用户手工输入的电力安全生产标准化企业证书获取日期。格式为:yyyy年M月d日。",
  230. []),
  231. ("basicInfo.reviewObjectCertificateCode",
  232. "证书编号", "use_entity_value",
  233. "用户手工输入的电力安全生产标准化企业证书编号。",
  234. []),
  235. ("basicInfo.reviewObjectCertificate2GetAt",
  236. "通过评审日期", "use_entity_value",
  237. "用户手工输入的国家能源局安全生产标准化达标证书获取日期。",
  238. []),
  239. # ═══════════════════════════════════════════════
  240. # 渲染阶段:附件直接嵌入(附件1~7的原始内容嵌入到报告附录)
  241. # ═══════════════════════════════════════════════
  242. # 这些不需要创建规则,因为是直接将附件内容渲染到报告末尾
  243. ]
  244. # ── 4. 批量创建 ──────────────────────────────────────────────
  245. print(f"共 {len(RULES)} 条规则待创建:\n")
  246. ok, fail = 0, 0
  247. for elem_key, rule_name, action_type, dsl, att_codes in RULES:
  248. inputs = []
  249. for c in att_codes:
  250. aid, name = ATT[c]
  251. inputs.append({"sourceNodeId": str(aid), "inputKey": "attachment", "inputType": "ATTACHMENT", "inputName": name})
  252. payload = {
  253. "elementKey": elem_key,
  254. "ruleName": rule_name,
  255. "ruleType": "auto",
  256. "actionType": action_type,
  257. "actionConfig": json.dumps({"description": dsl[:200]}, ensure_ascii=False),
  258. "dslContent": dsl,
  259. "description": f"来源:{', '.join(ATT[c][1] for c in att_codes) if att_codes else '用户输入'}",
  260. "inputs": inputs,
  261. }
  262. resp = requests.post(f"{BASE}/api/v1/projects/{PROJECT_ID}/rules", headers=HDR, json=payload)
  263. if resp.status_code == 200 and resp.json().get("code") == 200:
  264. rid = resp.json()["data"].get("id", "?")
  265. print(f" ✅ [{rid:>5}] {action_type:18s} {elem_key:50s} ← {', '.join(ATT[c][1] for c in att_codes) if att_codes else '用户输入'}")
  266. ok += 1
  267. else:
  268. print(f" ❌ {elem_key:50s} → {resp.status_code} {resp.text[:120]}")
  269. fail += 1
  270. print(f"\n完成:成功 {ok},失败 {fail}")