_update_rules_config.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. #!/usr/bin/env python3
  2. """
  3. 为现有规则补充内容定位配置(locatorType、chapterTitle、reviewCode、prompt)
  4. """
  5. import requests, json
  6. BASE = "http://47.108.80.98:8001"
  7. PROJECT_ID = 10
  8. # ── 1. 登录 ─────────────────────────────────────────────────
  9. r = requests.post(f"{BASE}/api/v1/auth/login", json={"username": "admin", "password": "admin123"})
  10. TOKEN = r.json()["data"]["accessToken"]
  11. HDR = {"Authorization": f"Bearer {TOKEN}", "Content-Type": "application/json"}
  12. # ── 2. 规则配置补充 ──────────────────────────────────────────
  13. # 格式: elementKey -> { locatorType, chapterTitle, reviewCode, tableSelector, prompt }
  14. RULE_CONFIGS = {
  15. # ═══════════════════════════════════════════════
  16. # 工作方案 (001008) → 全文提取
  17. # ═══════════════════════════════════════════════
  18. "project.reviewObject": {
  19. "locatorType": "full_text",
  20. "prompt": """你是一个专业的文档信息提取助手。请阅读以下内容,提取评审对象公司的全称。
  21. 提取规则:
  22. 1. 提取封面或标题第一行的受检单位全称
  23. 2. 通常在"一、工作目的"中出现,如"XXX公司(以下简称:XXX)"
  24. 3. 只输出公司全称,不要其他内容
  25. 输出格式:直接输出公司全称文本"""
  26. },
  27. "project.reviewObjectAlias": {
  28. "locatorType": "chapter",
  29. "chapterTitle": "工作目的",
  30. "prompt": """从内容中提取评审对象公司的简称。
  31. 提取规则:
  32. 1. 寻找"以下简称"或"简称"后面的内容
  33. 2. 例如"中国电建集团成都勘测设计研究院有限公司(以下简称:成都院)",简称为"成都院"
  34. 3. 只输出简称,不要其他内容"""
  35. },
  36. "project.workStartAt": {
  37. "locatorType": "chapter",
  38. "chapterTitle": "工作时间",
  39. "prompt": """从内容中提取评审工作开始日期。
  40. 提取规则:
  41. 1. 寻找"工作时间阶段"或"评审时间"相关内容
  42. 2. 格式通常为"yyyy年M月d日至yyyy年M月d日"
  43. 3. 提取开始日期,格式为:yyyy年M月d日"""
  44. },
  45. "project.workEndAt": {
  46. "locatorType": "chapter",
  47. "chapterTitle": "工作时间",
  48. "prompt": """从内容中提取评审工作结束日期。
  49. 提取规则:
  50. 1. 寻找"工作时间阶段"或"评审时间"相关内容
  51. 2. 格式通常为"yyyy年M月d日至yyyy年M月d日"
  52. 3. 提取结束日期,格式为:yyyy年M月d日"""
  53. },
  54. "project.reviewRange": {
  55. "locatorType": "chapter",
  56. "chapterTitle": "查评范围",
  57. "prompt": """从内容中提取复审范围,包括所有复审项目(单位和在建项目)。
  58. 提取规则:
  59. 1. 提取所有被评审的单位和项目名称
  60. 2. 按类型排序:先单位后项目
  61. 3. 格式如:成都院本部、大邑地勘项目(简称:大邑项目)"""
  62. },
  63. "project.workProcess": {
  64. "locatorType": "full_text",
  65. "prompt": """根据工作方案内容,生成复审工作过程描述。
  66. 包含以下内容:
  67. 1. 评审组工作会议召开情况
  68. 2. 现场评审安排
  69. 3. 具体评审时间表
  70. 4. 评审组成员分工
  71. 输出格式:按时间顺序描述复审工作过程"""
  72. },
  73. # ═══════════════════════════════════════════════
  74. # 核心要素评审记录表 (001001) → 评审代码定位
  75. # ═══════════════════════════════════════════════
  76. "project.resultScore": {
  77. "locatorType": "table",
  78. "tableSelector": "核心要素评审情况记录表",
  79. "prompt": """从表格中提取各评审项的标准分和实得分,计算总评审得分。
  80. 计算公式:总实得分/总标准分×100
  81. 输出格式:保留一位小数的分数,如 92.5"""
  82. },
  83. "project.resultLevel": {
  84. "locatorType": "table",
  85. "tableSelector": "核心要素评审情况记录表",
  86. "prompt": """根据评审得分判定评审结论级别。
  87. 判定规则:
  88. - ≥90分为一级
  89. - ≥80分为二级
  90. - <80分为三级
  91. 输出格式:一级/二级/三级"""
  92. },
  93. "project.target": {
  94. "locatorType": "review_code",
  95. "reviewCode": "5.1.1",
  96. "prompt": """从评审代码5.1.1.1~5.1.1.3的评审意见中,总结生成目标描述。
  97. 要求:
  98. 1. 提取各子项的评审意见(remark)
  99. 2. 综合分析,生成100字以内的目标描述
  100. 3. 突出企业安全生产目标的制定和落实情况"""
  101. },
  102. "project.duty": {
  103. "locatorType": "review_code",
  104. "reviewCode": "5.1.2.1",
  105. "prompt": """从评审代码5.1.2.1的评审意见中,总结生成职责描述。
  106. 要求:
  107. 1. 提取评审意见(remark)
  108. 2. 生成100字以内的职责描述
  109. 3. 突出安全生产责任制的建立和落实情况"""
  110. },
  111. "project.fullParticipation": {
  112. "locatorType": "review_code",
  113. "reviewCode": "5.1.3",
  114. "prompt": """从评审代码5.1.3的评审意见中,总结生成全员参与描述。
  115. 要求:
  116. 1. 提取评审意见(remark)
  117. 2. 生成100字以内的全员参与描述
  118. 3. 突出全员安全生产参与机制"""
  119. },
  120. "project.safetyInvestment": {
  121. "locatorType": "review_code",
  122. "reviewCode": "5.1.4",
  123. "prompt": """从评审代码5.1.4的评审意见中,总结生成安全投入描述。
  124. 要求:
  125. 1. 提取评审意见(remark)
  126. 2. 生成100字以内的安全投入描述
  127. 3. 突出安全生产费用的提取和使用情况"""
  128. },
  129. "project.safetyCulture": {
  130. "locatorType": "review_code",
  131. "reviewCode": "5.1.5",
  132. "prompt": """从评审代码5.1.5的评审意见中,总结生成安全文化描述。
  133. 要求:
  134. 1. 提取评审意见(remark)
  135. 2. 生成100字以内的安全文化描述
  136. 3. 突出企业安全文化建设情况"""
  137. },
  138. "project.systematicManagement": {
  139. "locatorType": "review_code",
  140. "reviewCode": "5.2",
  141. "prompt": """从评审代码5.2.*的评审意见中,总结生成体系化管理描述。
  142. 要求:
  143. 1. 提取5.2下所有子项的评审意见
  144. 2. 综合分析,生成150字以内的体系化管理描述
  145. 3. 突出安全管理体系的建设和运行情况"""
  146. },
  147. "project.employeeTraining": {
  148. "locatorType": "review_code",
  149. "reviewCode": "5.3.2",
  150. "prompt": """从评审代码5.3.2.*的评审意见中,总结生成人员教育培训描述。
  151. 要求:
  152. 1. 提取5.3.2下所有子项的评审意见
  153. 2. 综合分析,生成100字以内的人员教育培训描述
  154. 3. 突出安全教育培训的开展情况"""
  155. },
  156. "project.assetManagement": {
  157. "locatorType": "review_code",
  158. "reviewCode": "5.4.1",
  159. "prompt": """从评审代码5.4.1.*的评审意见中,总结生成设备设施管理描述。
  160. 要求:
  161. 1. 提取5.4.1下所有子项的评审意见
  162. 2. 综合分析,生成100字以内的设备设施管理描述
  163. 3. 突出设备设施的安全管理情况"""
  164. },
  165. "project.jobSafety": {
  166. "locatorType": "review_code",
  167. "reviewCode": "5.4.2.1",
  168. "prompt": """从评审代码5.4.2.1的评审意见中,总结生成作业安全描述。
  169. 要求:
  170. 1. 提取评审意见(remark)
  171. 2. 生成100字以内的作业安全描述
  172. 3. 突出作业现场安全管理情况"""
  173. },
  174. "project.positionQualified": {
  175. "locatorType": "review_code",
  176. "reviewCode": "5.4.2.3",
  177. "prompt": """从评审代码5.4.2.3的评审意见中,总结生成岗位达标描述。
  178. 要求:
  179. 1. 提取评审意见(remark)
  180. 2. 生成100字以内的岗位达标描述
  181. 3. 突出岗位安全达标情况"""
  182. },
  183. "project.partner": {
  184. "locatorType": "review_code",
  185. "reviewCode": "5.4.2.4",
  186. "prompt": """从评审代码5.4.2.4的评审意见中,总结生成相关方管理描述。
  187. 要求:
  188. 1. 提取评审意见(remark)
  189. 2. 生成100字以内的相关方管理描述
  190. 3. 突出相关方安全管理情况"""
  191. },
  192. "project.occupationalHealth": {
  193. "locatorType": "review_code",
  194. "reviewCode": "5.4.3.1",
  195. "prompt": """从评审代码5.4.3.1的评审意见中,总结生成职业健康描述。
  196. 要求:
  197. 1. 提取评审意见(remark)
  198. 2. 生成100字以内的职业健康描述
  199. 3. 突出职业健康管理情况"""
  200. },
  201. "project.riskAssessment": {
  202. "locatorType": "review_code",
  203. "reviewCode": "5.5.1",
  204. "prompt": """从评审代码5.5.1.1和5.5.1.2的评审意见中,总结生成风险辨识与评价描述。
  205. 要求:
  206. 1. 提取5.5.1.1和5.5.1.2的评审意见
  207. 2. 综合分析,生成100字以内的风险辨识与评价描述
  208. 3. 突出风险辨识和评价工作开展情况"""
  209. },
  210. "project.majorHazardManagement": {
  211. "locatorType": "review_code",
  212. "reviewCode": "5.5.2.1",
  213. "prompt": """从评审代码5.5.2.1的评审意见中,总结生成重大危险源管理描述。
  214. 要求:
  215. 1. 提取评审意见(remark)
  216. 2. 生成100字以内的重大危险源管理描述
  217. 3. 突出重大危险源辨识和管控情况"""
  218. },
  219. "project.hazardInspection": {
  220. "locatorType": "review_code",
  221. "reviewCode": "5.5.3.1",
  222. "prompt": """从评审代码5.5.3.1的评审意见中,总结生成隐患排查描述。
  223. 要求:
  224. 1. 提取评审意见(remark)
  225. 2. 生成100字以内的隐患排查描述
  226. 3. 突出隐患排查治理工作开展情况"""
  227. },
  228. "project.changeManagement": {
  229. "locatorType": "review_code",
  230. "reviewCode": "5.5.1.4",
  231. "prompt": """从评审代码5.5.1.4的评审意见中,总结生成变更管理描述。
  232. 要求:
  233. 1. 提取评审意见(remark)
  234. 2. 生成100字以内的变更管理描述
  235. 3. 突出变更管理制度和执行情况"""
  236. },
  237. "project.earlyWarning": {
  238. "locatorType": "review_code",
  239. "reviewCode": "5.5.4",
  240. "prompt": """从评审代码5.5.4的评审意见中,总结生成预测预警描述。
  241. 要求:
  242. 1. 提取评审意见(remark)
  243. 2. 生成100字以内的预测预警描述
  244. 3. 突出预测预警机制建设情况"""
  245. },
  246. "project.emergencyResponse": {
  247. "locatorType": "review_code",
  248. "reviewCode": "5.6.1.1",
  249. "prompt": """从评审代码5.6.1.1的评审意见中,总结生成应急救援描述。
  250. 要求:
  251. 1. 提取评审意见(remark)
  252. 2. 生成100字以内的应急救援描述
  253. 3. 突出应急预案和应急演练情况"""
  254. },
  255. "project.incidentManagement": {
  256. "locatorType": "review_code",
  257. "reviewCode": "5.7.1",
  258. "prompt": """从评审代码5.7.1的评审意见中,总结生成事故管理描述。
  259. 要求:
  260. 1. 提取评审意见(remark)
  261. 2. 生成100字以内的事故管理描述
  262. 3. 突出事故报告和调查处理情况"""
  263. },
  264. "project.continuousImprovement": {
  265. "locatorType": "review_code",
  266. "reviewCode": "5.8.2",
  267. "prompt": """从评审代码5.8.2.*的评审意见中,总结生成持续改进描述。
  268. 要求:
  269. 1. 提取5.8.2下所有子项的评审意见
  270. 2. 综合分析,生成100字以内的持续改进描述
  271. 3. 突出安全生产标准化持续改进情况"""
  272. },
  273. "project.safetyStandardizationStatus": {
  274. "locatorType": "review_code",
  275. "reviewCode": "5.8",
  276. "prompt": """从评审代码5.8.1.*和5.8.2.*的评审意见中,总结生成标准化建设运行情况描述。
  277. 要求:
  278. 1. 提取5.8下所有子项的评审意见
  279. 2. 综合分析,生成150字以内的标准化建设运行情况描述
  280. 3. 突出安全生产标准化体系的建设和运行情况"""
  281. },
  282. "project.safetyHighlight": {
  283. "locatorType": "review_code",
  284. "reviewCode": "5.1",
  285. "prompt": """综合评审代码5.1下各子项的评审意见,提炼安全生产管理亮点。
  286. 要求:
  287. 1. 提取5.1下所有子项的评审意见
  288. 2. 分析提炼企业安全生产管理的亮点和特色
  289. 3. 生成150字以内的亮点描述"""
  290. },
  291. # ═══════════════════════════════════════════════
  292. # 安全生产标准化复审实施方案 (001003)
  293. # ═══════════════════════════════════════════════
  294. "project.reviewObjectSelfAssessmentProcess": {
  295. "locatorType": "full_text",
  296. "prompt": """从安全生产标准化复审实施方案中,总结自评过程内容。
  297. 包含以下6个阶段:
  298. 1. 前期策划
  299. 2. 专题培训
  300. 3. 自查自纠
  301. 4. 内审整改
  302. 5. 报告撰写
  303. 6. 持续改进
  304. 输出格式:按阶段描述自评过程,每个阶段50-100字"""
  305. },
  306. "project.moreWorkReference": {
  307. "locatorType": "chapter",
  308. "chapterTitle": "工作依据",
  309. "prompt": """从内容中提取其他工作依据文件。
  310. 提取规则:
  311. 1. 寻找文件编号和文件名称
  312. 2. 格式如:《xxx管理办法》(蓉设安质〔2024〕20号)
  313. 3. 多个文件用换行分隔"""
  314. },
  315. }
  316. # ── 3. 获取现有规则并更新 ──────────────────────────────────────
  317. print("获取现有规则...")
  318. resp = requests.get(f"{BASE}/api/v1/projects/{PROJECT_ID}/rules", headers=HDR)
  319. if resp.status_code != 200:
  320. print(f"获取规则失败: {resp.status_code} {resp.text}")
  321. exit(1)
  322. rules = resp.json().get("data", [])
  323. print(f"共 {len(rules)} 条规则\n")
  324. # ── 4. 更新规则配置 ──────────────────────────────────────────
  325. ok, skip, fail = 0, 0, 0
  326. for rule in rules:
  327. rule_id = rule.get("id")
  328. element_key = rule.get("elementKey")
  329. rule_name = rule.get("ruleName")
  330. if element_key not in RULE_CONFIGS:
  331. print(f" ⏭️ [{rule_id:>5}] {element_key:50s} - 无配置,跳过")
  332. skip += 1
  333. continue
  334. config = RULE_CONFIGS[element_key]
  335. # 合并现有 actionConfig
  336. existing_config = {}
  337. if rule.get("actionConfig"):
  338. try:
  339. existing_config = json.loads(rule["actionConfig"]) if isinstance(rule["actionConfig"], str) else rule["actionConfig"]
  340. except:
  341. pass
  342. # 更新配置
  343. new_config = {**existing_config, **config}
  344. payload = {
  345. "elementKey": element_key,
  346. "ruleName": rule_name,
  347. "actionConfig": json.dumps(new_config, ensure_ascii=False),
  348. }
  349. resp = requests.put(f"{BASE}/api/v1/rules/{rule_id}", headers=HDR, json=payload)
  350. if resp.status_code == 200 and resp.json().get("code") == 200:
  351. print(f" ✅ [{rule_id:>5}] {element_key:50s} - locatorType={config.get('locatorType')}")
  352. ok += 1
  353. else:
  354. print(f" ❌ [{rule_id:>5}] {element_key:50s} → {resp.status_code} {resp.text[:100]}")
  355. fail += 1
  356. print(f"\n完成:成功 {ok},跳过 {skip},失败 {fail}")