document_business_templates.py 93 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558
  1. from __future__ import annotations
  2. import re
  3. from pathlib import Path
  4. from sqlalchemy import select
  5. from sqlalchemy.orm import Session
  6. from app.core.errors import APIError
  7. from app.db.models.document import DocumentExtractionTemplate
  8. SUPPORTED_FILE_EXTENSIONS = {
  9. ".pdf": "pdf",
  10. ".doc": "word",
  11. ".docx": "word",
  12. ".xls": "excel",
  13. ".xlsx": "excel",
  14. ".csv": "excel",
  15. }
  16. LEGACY_GENERIC_TEMPLATES = [
  17. {
  18. "code": "ground_main_fan_inspection_report",
  19. "name": "地面主通风机检验报告",
  20. "document_type": "ground_main_fan_inspection_report",
  21. "description": "抽取地面主通风机检验报告的报告信息、检测项目、风机基本参数和电机基本参数。",
  22. "prompt": (
  23. "你是一名矿山通防业务资料抽取专家。请从地面主通风机检验报告中"
  24. "提取报告基本信息、检测项目结果、风机基本参数和电机基本参数。"
  25. "数值必须保留原单位和原文含义,找不到时填 null,不得编造。"
  26. "本轮不提取特性曲线数据。"
  27. ),
  28. "extraction_schema": {
  29. "match_keywords": [
  30. "地面主通风机检验报告",
  31. "主通风机检验报告",
  32. "主要通风机检验报告",
  33. ],
  34. "groups": [
  35. {
  36. "key": "report_info",
  37. "name": "报告基本信息",
  38. "fields": [
  39. {"key": "report_issuer", "name": "报告出具单位", "type": "text"},
  40. {"key": "qualification_status", "name": "资质情况", "type": "text"},
  41. {"key": "report_date", "name": "报告时间", "type": "date"},
  42. {"key": "expiry_date", "name": "到期时间", "type": "date"},
  43. ],
  44. },
  45. {
  46. "key": "inspection_items",
  47. "name": "检测项目",
  48. "fields": [
  49. {"key": "basic_requirements", "name": "基本要求", "type": "text"},
  50. {"key": "appearance_structure", "name": "外观及结构", "type": "text"},
  51. {"key": "installation_configuration", "name": "安装及配置", "type": "text"},
  52. {"key": "surge_check", "name": "喘振", "type": "text"},
  53. {"key": "airflow_pressure_comparison", "name": "风量、压力", "type": "object"},
  54. {"key": "fan_efficiency", "name": "通风机运行效率", "type": "number"},
  55. {"key": "motor_operating_power", "name": "电动机运行功率", "type": "number"},
  56. {"key": "noise", "name": "噪声", "type": "number"},
  57. {"key": "vibration_velocity_rms", "name": "振动速度有效值", "type": "number"},
  58. {"key": "motor_temperature", "name": "电动机轴承、定子温度", "type": "object"},
  59. {"key": "motor_cold_insulation_resistance", "name": "电动机冷态绝缘电阻", "type": "number"},
  60. {"key": "grounding_resistance", "name": "接地电阻值", "type": "number"},
  61. {"key": "blade_clearance", "name": "叶片与机壳(保护圈)的单侧间隙值", "type": "number"},
  62. ],
  63. },
  64. {
  65. "key": "fan_parameters",
  66. "name": "风机基本参数",
  67. "fields": [
  68. {"key": "fan_model", "name": "风机型号", "type": "text"},
  69. {"key": "fan_explosion_grade", "name": "风机防爆等级", "type": "text"},
  70. {"key": "fan_airflow_range", "name": "风量范围", "type": "text"},
  71. {"key": "fan_pressure_range", "name": "风压范围", "type": "text"},
  72. {"key": "fan_motor_power", "name": "电机功率", "type": "number"},
  73. {"key": "friction_spark_certificate", "name": "摩擦火花安全检验合格证号", "type": "text"},
  74. {"key": "safety_mark_certificate", "name": "安全标志准用证号", "type": "text"},
  75. {"key": "explosion_proof_certificate", "name": "防爆合格证号", "type": "text"},
  76. {"key": "fan_factory_serial", "name": "出厂编号", "type": "text"},
  77. {"key": "fan_manufacturer", "name": "生产厂家", "type": "text"},
  78. ],
  79. },
  80. {
  81. "key": "motor_parameters",
  82. "name": "电机基本参数",
  83. "fields": [
  84. {"key": "motor_model", "name": "电机型号", "type": "text"},
  85. {"key": "motor_explosion_grade", "name": "电机防爆等级", "type": "text"},
  86. {"key": "motor_rated_power", "name": "额定功率", "type": "number"},
  87. {"key": "motor_rated_voltage", "name": "额定电压", "type": "number"},
  88. {"key": "motor_rated_current", "name": "额定电流", "type": "number"},
  89. {"key": "motor_rated_frequency", "name": "额定频率", "type": "number"},
  90. {"key": "motor_rated_speed", "name": "额定转速", "type": "number"},
  91. {"key": "motor_insulation_class", "name": "绝缘等级", "type": "text"},
  92. {"key": "motor_safety_mark_certificate", "name": "电机安标证号", "type": "text"},
  93. {"key": "motor_explosion_proof_certificate", "name": "电机防爆合格证号", "type": "text"},
  94. ],
  95. },
  96. ],
  97. },
  98. },
  99. {
  100. "code": "main_fan_external_leakage_rate_report",
  101. "name": "主要通风机外部漏风率测定报告",
  102. "document_type": "main_fan_external_leakage_rate_report",
  103. "description": "抽取主要通风机外部漏风率测定的基础数据、风量结果、漏风率和合规结论。",
  104. "prompt": (
  105. "你是一名矿山主要通风机外部漏风率审查专家。请从报告中提取测定日期、"
  106. "组织安排、仪器、测定基础数据、南风井和北风井的排风量、总回风量、漏风量、"
  107. "漏风率以及标准限值符合性。"
  108. "summary 只输出分析结果:南风井漏风率及结论、北风井漏风率及结论、"
  109. "最大漏风率、是否超过 5% 限值和总体结论;不要写证据原文或过程说明。"
  110. ),
  111. "extraction_schema": {
  112. "match_keywords": [
  113. "主要通风机外部漏风率测定报告",
  114. "外部漏风率测定报告",
  115. "主要通风机外部漏风率",
  116. ],
  117. "groups": [
  118. {
  119. "key": "report_info",
  120. "name": "报告基本信息",
  121. "order": 1,
  122. "fields": [
  123. {"key": "report_title", "name": "报告名称", "type": "text"},
  124. {"key": "mine_name", "name": "矿井名称", "type": "text"},
  125. {"key": "measurement_date", "name": "测定日期", "type": "date"},
  126. {"key": "report_date", "name": "报告日期", "type": "date"},
  127. {"key": "issuing_department", "name": "出具部门", "type": "text"},
  128. {"key": "regulation_basis", "name": "依据文件", "type": "text"},
  129. ],
  130. },
  131. {
  132. "key": "measurement_plan",
  133. "name": "测定组织与仪器",
  134. "order": 2,
  135. "fields": [
  136. {"key": "measurement_groups", "name": "测定分组和人员", "type": "list"},
  137. {"key": "measurement_instruments", "name": "使用仪器", "type": "list"},
  138. {"key": "measurement_time", "name": "测定时间段", "type": "text"},
  139. {"key": "repeat_count", "name": "测量次数", "type": "number"},
  140. {"key": "allowed_error", "name": "允许误差", "type": "number"},
  141. ],
  142. },
  143. {
  144. "key": "base_measurements",
  145. "name": "测定基础数据",
  146. "order": 3,
  147. "fields": [
  148. {"key": "measurement_locations", "name": "测点基础数据", "type": "list"},
  149. ],
  150. },
  151. {
  152. "key": "leakage_results",
  153. "name": "漏风率测定结果",
  154. "order": 4,
  155. "fields": [
  156. {"key": "south_fan_exhaust_airflow", "name": "南风井主扇排风量", "type": "number"},
  157. {"key": "south_total_return_airflow", "name": "南风井总回风量", "type": "number"},
  158. {"key": "south_leakage_airflow", "name": "南风井漏风量", "type": "number"},
  159. {"key": "south_leakage_rate", "name": "南风井漏风率", "type": "number"},
  160. {"key": "north_fan_exhaust_airflow", "name": "北风井主扇排风量", "type": "number"},
  161. {"key": "north_total_return_airflow", "name": "北风井总回风量", "type": "number"},
  162. {"key": "north_leakage_airflow", "name": "北风井漏风量", "type": "number"},
  163. {"key": "north_leakage_rate", "name": "北风井漏风率", "type": "number"},
  164. ],
  165. },
  166. {
  167. "key": "conclusion",
  168. "name": "结论",
  169. "order": 5,
  170. "fields": [
  171. {"key": "standard_limit", "name": "标准限值", "type": "number"},
  172. {"key": "maximum_leakage_rate", "name": "最大漏风率", "type": "number"},
  173. {"key": "compliance_status", "name": "是否符合规定", "type": "text"},
  174. {"key": "conclusion_text", "name": "结论", "type": "text"},
  175. ],
  176. },
  177. ],
  178. },
  179. },
  180. ]
  181. DEFAULT_BUSINESS_TEMPLATES = [
  182. {
  183. "code": "ground_main_fan_inspection_report",
  184. "name": "地面主通风机检验报告",
  185. "document_type": "ground_main_fan_inspection_report",
  186. "description": "分析两台主通风机的报告合规性、资质、证书、检验项目和能力差异。",
  187. "prompt": (
  188. "你是一名矿山主通风机检验报告审查专家。报告通常包含 1#、2# 两台风机,"
  189. "每台风机都有风机参数、电机参数和检验项目。请重点完成以下分析:\n"
  190. "1. 检查报告有效期是否满足 5 年、2 年要求,过期报警,剩余 3 个月预警。\n"
  191. "2. 比较两台风机能力和功率是否相同。\n"
  192. "3. 检查检验单位资质及报告是否在资质有效期内。\n"
  193. "4. 检查授权签字人是否具备授权范围和签字资格。\n"
  194. "5. 检查检验仪器是否在有效期内。\n"
  195. "6. 检查特性曲线数量是否完整。\n"
  196. "7. 检查摩擦火花安全检验合格证号、安全标志准用证号、防爆合格证号是否缺失;"
  197. "缺失一项即报警,安标证号必须进入人工安标网站核验状态。\n"
  198. "8. 比较两台风机工况风量、风压,差异较大时判定能力不同。\n"
  199. "summary 必须严格按上述 1-8 项逐条输出,格式为“序号. 项目:结果”。"
  200. "每项只写分析结果和风险等级,不写证据、原文引用、过程说明或长句解释;"
  201. "每项不超过 30 个汉字,整体不超过 260 个汉字。"
  202. ),
  203. "extraction_schema": {
  204. "match_keywords": [
  205. "地面主通风机检验报告",
  206. "主通风机检验报告",
  207. "主要通风机检验报告",
  208. ],
  209. "groups": [
  210. {
  211. "key": "compliance_analysis",
  212. "name": "报告合规分析",
  213. "order": 8,
  214. "analysis_only": True,
  215. "fields": [
  216. {"key": "validity_5y_status", "name": "5年有效期结论", "type": "text"},
  217. {"key": "validity_2y_status", "name": "2年有效期结论", "type": "text"},
  218. {"key": "validity_alert_level", "name": "有效期预警等级", "type": "text"},
  219. {"key": "validity_basis", "name": "有效期判定依据", "type": "text"},
  220. {"key": "fans_same_capability", "name": "两台风机能力是否相同", "type": "text"},
  221. {"key": "fans_same_power", "name": "两台风机功率是否相同", "type": "text"},
  222. {"key": "agency_qualification_valid", "name": "单位资质是否有效", "type": "text"},
  223. {"key": "report_in_agency_qualification", "name": "报告是否在资质有效期内", "type": "text"},
  224. {"key": "authorized_signatory", "name": "授权签字人", "type": "text"},
  225. {"key": "signatory_compliance", "name": "授权签字人是否合规", "type": "text"},
  226. {"key": "instruments_valid", "name": "仪器是否均在有效期内", "type": "text"},
  227. {"key": "invalid_instruments", "name": "过期仪器明细", "type": "list"},
  228. {"key": "characteristic_curve_count", "name": "特性曲线数量", "type": "number"},
  229. {"key": "characteristic_curve_check", "name": "特性曲线检查结论", "type": "text"},
  230. {"key": "friction_spark_certificate_missing", "name": "摩擦火花证是否缺失", "type": "text"},
  231. {"key": "safety_mark_certificate_missing", "name": "安标证是否缺失", "type": "text"},
  232. {"key": "explosion_proof_certificate_missing", "name": "防爆合格证是否缺失", "type": "text"},
  233. {"key": "certificate_lookup_status", "name": "安标证核验状态", "type": "text"},
  234. {"key": "certificate_alert_level", "name": "证书缺失报警等级", "type": "text"},
  235. {"key": "fan1_operating_airflow", "name": "1#工况风量", "type": "number"},
  236. {"key": "fan1_operating_pressure", "name": "1#工况风压", "type": "number"},
  237. {"key": "fan2_operating_airflow", "name": "2#工况风量", "type": "number"},
  238. {"key": "fan2_operating_pressure", "name": "2#工况风压", "type": "number"},
  239. {"key": "airflow_difference_percent", "name": "风量差异百分比", "type": "number"},
  240. {"key": "pressure_difference_percent", "name": "风压差异百分比", "type": "number"},
  241. {"key": "capability_comparison_result", "name": "能力对比结论", "type": "text"},
  242. ],
  243. },
  244. {
  245. "key": "report_info",
  246. "name": "报告基本信息",
  247. "order": 1,
  248. "fields": [
  249. {"key": "report_issuer", "name": "报告出具单位", "type": "text", "aliases": ["委托单位", "受检单位", "检验机构"]},
  250. {"key": "report_code", "name": "报告编号", "type": "text"},
  251. {"key": "inspection_category", "name": "检验类别", "type": "text"},
  252. {"key": "inspection_standard", "name": "检验依据", "type": "text"},
  253. {"key": "report_date", "name": "报告时间", "type": "date"},
  254. {"key": "expiry_date", "name": "到期时间", "type": "date"},
  255. {"key": "qualification_status", "name": "资质情况", "type": "text"},
  256. ],
  257. },
  258. {
  259. "key": "fan1_parameters",
  260. "name": "1#风机基本参数",
  261. "order": 2,
  262. "fields": [
  263. {"key": "fan1_model", "name": "1#风机型号", "type": "text", "aliases": ["型号"]},
  264. {"key": "fan1_explosion_grade", "name": "1#防爆等级", "type": "text"},
  265. {"key": "fan1_airflow_range", "name": "1#风量范围", "type": "text", "aliases": ["风量范围"]},
  266. {"key": "fan1_pressure_range", "name": "1#风压范围", "type": "text", "aliases": ["风压范围"]},
  267. {"key": "fan1_motor_power", "name": "1#电机功率", "type": "number", "aliases": ["电机功率"]},
  268. {"key": "fan1_friction_spark_certificate", "name": "1#摩擦火花安全检验合格证号", "type": "text", "aliases": ["摩擦火花安全检验合格证号"]},
  269. {"key": "fan1_safety_mark_certificate", "name": "1#安全标志准用证号", "type": "text", "aliases": ["安全标志准用证号", "安标证号"]},
  270. {"key": "fan1_explosion_proof_certificate", "name": "1#防爆合格证号", "type": "text", "aliases": ["防爆合格证号"]},
  271. {"key": "fan1_factory_serial", "name": "1#出厂编号", "type": "text", "aliases": ["出厂编号"]},
  272. {"key": "fan1_manufacturer", "name": "1#生产厂家", "type": "text", "aliases": ["生产厂家"]},
  273. ],
  274. },
  275. {
  276. "key": "fan1_motor_parameters",
  277. "name": "1#电机基本参数",
  278. "order": 3,
  279. "fields": [
  280. {"key": "fan1_motor_model", "name": "1#电机型号", "type": "text", "aliases": ["电机型号"]},
  281. {"key": "fan1_motor_explosion_grade", "name": "1#电机防爆等级", "type": "text", "aliases": ["防爆等级"]},
  282. {"key": "fan1_motor_rated_power", "name": "1#额定功率", "type": "number", "aliases": ["额定功率"]},
  283. {"key": "fan1_motor_rated_voltage", "name": "1#额定电压", "type": "number", "aliases": ["额定电压"]},
  284. {"key": "fan1_motor_rated_current", "name": "1#额定电流", "type": "number", "aliases": ["额定电流"]},
  285. {"key": "fan1_motor_rated_frequency", "name": "1#额定频率", "type": "number", "aliases": ["额定频率"]},
  286. {"key": "fan1_motor_rated_speed", "name": "1#额定转速", "type": "number", "aliases": ["额定转速"]},
  287. {"key": "fan1_motor_insulation_class", "name": "1#绝缘等级", "type": "text", "aliases": ["绝缘等级"]},
  288. {"key": "fan1_motor_safety_mark_certificate", "name": "1#电机安标证号", "type": "text", "aliases": ["安标证号"]},
  289. {"key": "fan1_motor_explosion_proof_certificate", "name": "1#电机防爆合格证号", "type": "text", "aliases": ["防爆合格证号"]},
  290. ],
  291. },
  292. {
  293. "key": "fan1_inspection_items",
  294. "name": "1#检验项目",
  295. "order": 4,
  296. "fields": [
  297. {"key": "fan1_basic_requirements", "name": "1#基本要求", "type": "text"},
  298. {"key": "fan1_appearance_structure", "name": "1#外观及结构", "type": "text"},
  299. {"key": "fan1_installation_configuration", "name": "1#安装及配置", "type": "text"},
  300. {"key": "fan1_surge_check", "name": "1#喘振", "type": "text"},
  301. {"key": "fan1_fan_efficiency", "name": "1#通风机运行效率", "type": "number"},
  302. {"key": "fan1_motor_operating_power", "name": "1#电动机运行功率", "type": "number"},
  303. {"key": "fan1_noise", "name": "1#噪声", "type": "number"},
  304. {"key": "fan1_vibration_velocity_rms", "name": "1#振动速度有效值", "type": "number"},
  305. {"key": "fan1_motor_temperature", "name": "1#电动机轴承、定子温度", "type": "object"},
  306. {"key": "fan1_motor_cold_insulation_resistance", "name": "1#电动机冷态绝缘电阻", "type": "number"},
  307. {"key": "fan1_grounding_resistance", "name": "1#接地电阻值", "type": "number"},
  308. {"key": "fan1_blade_clearance", "name": "1#叶片与机壳单侧间隙值", "type": "number"},
  309. ],
  310. },
  311. {
  312. "key": "fan2_parameters",
  313. "name": "2#风机基本参数",
  314. "order": 5,
  315. "fields": [
  316. {"key": "fan2_model", "name": "2#风机型号", "type": "text", "aliases": ["型号"]},
  317. {"key": "fan2_explosion_grade", "name": "2#防爆等级", "type": "text"},
  318. {"key": "fan2_airflow_range", "name": "2#风量范围", "type": "text", "aliases": ["风量范围"]},
  319. {"key": "fan2_pressure_range", "name": "2#风压范围", "type": "text", "aliases": ["风压范围"]},
  320. {"key": "fan2_motor_power", "name": "2#电机功率", "type": "number", "aliases": ["电机功率"]},
  321. {"key": "fan2_friction_spark_certificate", "name": "2#摩擦火花安全检验合格证号", "type": "text"},
  322. {"key": "fan2_safety_mark_certificate", "name": "2#安全标志准用证号", "type": "text"},
  323. {"key": "fan2_explosion_proof_certificate", "name": "2#防爆合格证号", "type": "text"},
  324. {"key": "fan2_factory_serial", "name": "2#出厂编号", "type": "text"},
  325. {"key": "fan2_manufacturer", "name": "2#生产厂家", "type": "text"},
  326. ],
  327. },
  328. {
  329. "key": "fan2_motor_parameters",
  330. "name": "2#电机基本参数",
  331. "order": 6,
  332. "fields": [
  333. {"key": "fan2_motor_model", "name": "2#电机型号", "type": "text"},
  334. {"key": "fan2_motor_explosion_grade", "name": "2#电机防爆等级", "type": "text"},
  335. {"key": "fan2_motor_rated_power", "name": "2#额定功率", "type": "number"},
  336. {"key": "fan2_motor_rated_voltage", "name": "2#额定电压", "type": "number"},
  337. {"key": "fan2_motor_rated_current", "name": "2#额定电流", "type": "number"},
  338. {"key": "fan2_motor_rated_frequency", "name": "2#额定频率", "type": "number"},
  339. {"key": "fan2_motor_rated_speed", "name": "2#额定转速", "type": "number"},
  340. {"key": "fan2_motor_insulation_class", "name": "2#绝缘等级", "type": "text"},
  341. {"key": "fan2_motor_safety_mark_certificate", "name": "2#电机安标证号", "type": "text"},
  342. {"key": "fan2_motor_explosion_proof_certificate", "name": "2#电机防爆合格证号", "type": "text"},
  343. ],
  344. },
  345. {
  346. "key": "fan2_inspection_items",
  347. "name": "2#检验项目",
  348. "order": 7,
  349. "fields": [
  350. {"key": "fan2_basic_requirements", "name": "2#基本要求", "type": "text"},
  351. {"key": "fan2_appearance_structure", "name": "2#外观及结构", "type": "text"},
  352. {"key": "fan2_installation_configuration", "name": "2#安装及配置", "type": "text"},
  353. {"key": "fan2_surge_check", "name": "2#喘振", "type": "text"},
  354. {"key": "fan2_fan_efficiency", "name": "2#通风机运行效率", "type": "number"},
  355. {"key": "fan2_motor_operating_power", "name": "2#电动机运行功率", "type": "number"},
  356. {"key": "fan2_noise", "name": "2#噪声", "type": "number"},
  357. {"key": "fan2_vibration_velocity_rms", "name": "2#振动速度有效值", "type": "number"},
  358. {"key": "fan2_motor_temperature", "name": "2#电动机轴承、定子温度", "type": "object"},
  359. {"key": "fan2_motor_cold_insulation_resistance", "name": "2#电动机冷态绝缘电阻", "type": "number"},
  360. {"key": "fan2_grounding_resistance", "name": "2#接地电阻值", "type": "number"},
  361. {"key": "fan2_blade_clearance", "name": "2#叶片与机壳单侧间隙值", "type": "number"},
  362. ],
  363. },
  364. ],
  365. },
  366. },
  367. ]
  368. DEFAULT_BUSINESS_TEMPLATES.append(
  369. next(
  370. item
  371. for item in LEGACY_GENERIC_TEMPLATES
  372. if item["code"] == "main_fan_external_leakage_rate_report"
  373. )
  374. )
  375. DEFAULT_BUSINESS_TEMPLATES.append(
  376. {
  377. "code": "monthly_air_distribution_plan",
  378. "name": "月度配风计划",
  379. "document_type": "monthly_air_distribution_plan",
  380. "description": "抽取月度配风计划的通风系统参数、南北风井需风量计算、用风地点明细和结论。",
  381. "prompt": (
  382. "你是一名矿井通风配风审查专家。请从月度配风计划中提取矿井通风方式、"
  383. "主通风机参数、采掘布局、南北风井各用风地点需风量、风量合计、"
  384. "总需风量和现有回风量对比。summary 只输出简短结果:"
  385. "北风井需风量与可用风量及结论、南风井需风量与可用风量及结论、"
  386. "全矿井总需风量与总回风量及结论。不要写计算过程、公式和原文证据。"
  387. ),
  388. "extraction_schema": {
  389. "match_keywords": [
  390. "配风计划",
  391. "月度配风计划",
  392. "矿井配风计划",
  393. ],
  394. "groups": [
  395. {
  396. "key": "report_info",
  397. "name": "报告基本信息",
  398. "order": 1,
  399. "fields": [
  400. {"key": "plan_title", "name": "配风计划名称", "type": "text"},
  401. {"key": "mine_name", "name": "矿井名称", "type": "text"},
  402. {"key": "plan_month", "name": "计划月份", "type": "text"},
  403. {"key": "issuing_department", "name": "编制单位", "type": "text"},
  404. {"key": "prepared_by", "name": "编制人", "type": "text"},
  405. {"key": "reviewer", "name": "审核人", "type": "text"},
  406. {"key": "chief_engineer", "name": "总工程师", "type": "text"},
  407. {"key": "plan_date", "name": "编制日期", "type": "date"},
  408. ],
  409. },
  410. {
  411. "key": "ventilation_system",
  412. "name": "矿井通风系统",
  413. "order": 2,
  414. "fields": [
  415. {"key": "ventilation_method", "name": "通风方法", "type": "text"},
  416. {"key": "ventilation_mode", "name": "通风方式", "type": "text"},
  417. {"key": "intake_shaft_count", "name": "进风井数量", "type": "number"},
  418. {"key": "intake_shaft_names", "name": "进风井名称", "type": "list"},
  419. {"key": "return_shaft_count", "name": "回风井数量", "type": "number"},
  420. {"key": "return_shaft_names", "name": "回风井名称", "type": "list"},
  421. {"key": "mine_total_return_airflow", "name": "矿井总回风量", "type": "number"},
  422. {"key": "north_return_airflow", "name": "北风井回风量", "type": "number"},
  423. {"key": "south_return_airflow", "name": "南风井回风量", "type": "number"},
  424. {"key": "equivalent_orifice", "name": "矿井等积孔", "type": "number"},
  425. {"key": "north_fan_model", "name": "北风井主通风机型号", "type": "text"},
  426. {"key": "north_fan_blade_angle", "name": "北风井叶片角度", "type": "text"},
  427. {"key": "north_fan_motor_mode", "name": "北风井电机运行方式", "type": "text"},
  428. {"key": "north_fan_exhaust_airflow", "name": "北风井排风量", "type": "number"},
  429. {"key": "north_fan_negative_pressure", "name": "北风井负压", "type": "number"},
  430. {"key": "south_fan_model", "name": "南风井主通风机型号", "type": "text"},
  431. {"key": "south_fan_blade_angle", "name": "南风井叶片角度", "type": "text"},
  432. {"key": "south_fan_motor_mode", "name": "南风井电机运行方式", "type": "text"},
  433. {"key": "south_fan_exhaust_airflow", "name": "南风井排风量", "type": "number"},
  434. {"key": "south_fan_negative_pressure", "name": "南风井负压", "type": "number"},
  435. ],
  436. },
  437. {
  438. "key": "mining_layout",
  439. "name": "采掘布局",
  440. "order": 3,
  441. "fields": [
  442. {"key": "layout_summary", "name": "采掘布局概述", "type": "text"},
  443. {"key": "fully_mechanized_faces", "name": "综采工作面", "type": "list"},
  444. {"key": "standby_faces", "name": "备采工作面", "type": "list"},
  445. {"key": "heading_faces", "name": "掘进工作面", "type": "list"},
  446. {"key": "north_load_areas", "name": "北风井负荷区域", "type": "list"},
  447. {"key": "south_load_areas", "name": "南风井负荷区域", "type": "list"},
  448. ],
  449. },
  450. {
  451. "key": "airflow_results",
  452. "name": "风量计算结果",
  453. "order": 4,
  454. "fields": [
  455. {"key": "north_coal_airflow", "name": "北风井采煤面需风量", "type": "number"},
  456. {"key": "north_standby_airflow", "name": "北风井备采面需风量", "type": "number"},
  457. {"key": "north_heading_airflow", "name": "北风井掘进面需风量", "type": "number"},
  458. {"key": "north_chamber_airflow", "name": "北风井硐室需风量", "type": "number"},
  459. {"key": "north_other_airflow", "name": "北风井其他巷道需风量", "type": "number"},
  460. {"key": "north_ventilation_factor", "name": "北风井通风系数", "type": "number"},
  461. {"key": "north_required_airflow", "name": "北风井总需风量", "type": "number"},
  462. {"key": "north_available_airflow", "name": "北风井可用总回风量", "type": "number"},
  463. {"key": "north_capacity_status", "name": "北风井能力结论", "type": "text"},
  464. {"key": "south_coal_airflow", "name": "南风井采煤面需风量", "type": "number"},
  465. {"key": "south_standby_airflow", "name": "南风井备采面需风量", "type": "number"},
  466. {"key": "south_heading_airflow", "name": "南风井掘进面需风量", "type": "number"},
  467. {"key": "south_chamber_airflow", "name": "南风井硐室需风量", "type": "number"},
  468. {"key": "south_other_airflow", "name": "南风井其他巷道需风量", "type": "number"},
  469. {"key": "south_ventilation_factor", "name": "南风井通风系数", "type": "number"},
  470. {"key": "south_required_airflow", "name": "南风井总需风量", "type": "number"},
  471. {"key": "south_available_airflow", "name": "南风井可用总回风量", "type": "number"},
  472. {"key": "south_capacity_status", "name": "南风井能力结论", "type": "text"},
  473. {"key": "mine_required_airflow", "name": "全矿井总需风量", "type": "number"},
  474. {"key": "mine_available_airflow", "name": "全矿井总回风量", "type": "number"},
  475. {"key": "mine_capacity_status", "name": "全矿井能力结论", "type": "text"},
  476. ],
  477. },
  478. {
  479. "key": "location_details",
  480. "name": "用风地点明细",
  481. "order": 5,
  482. "fields": [
  483. {"key": "workface_airflow_details", "name": "采掘工作面配风明细", "type": "list"},
  484. {"key": "other_roadway_airflow_details", "name": "其他巷道配风明细", "type": "list"},
  485. {"key": "local_fan_details", "name": "局部通风机配置", "type": "list"},
  486. ],
  487. },
  488. {
  489. "key": "conclusion",
  490. "name": "结论",
  491. "order": 6,
  492. "fields": [
  493. {"key": "north_conclusion", "name": "北风井结论", "type": "text"},
  494. {"key": "south_conclusion", "name": "南风井结论", "type": "text"},
  495. {"key": "mine_conclusion", "name": "全矿井结论", "type": "text"},
  496. {"key": "overall_pass", "name": "是否满足需风要求", "type": "text"},
  497. ],
  498. },
  499. ],
  500. },
  501. }
  502. )
  503. DEFAULT_BUSINESS_TEMPLATES.append(
  504. {
  505. "code": "mine_ventilation_resistance_report",
  506. "name": "矿井通风阻力测定报告",
  507. "document_type": "mine_ventilation_resistance_report",
  508. "description": "抽取矿井通风阻力测定路线、测点参数、阻力结果、等积孔、有效风量率和结论。",
  509. "prompt": (
  510. "你是一名矿井通风阻力测定审查专家。请从报告中提取报告信息、通风系统参数、"
  511. "测定路线、主要和次要路线阻力、相对误差、自然风压、等积孔、有效风量率、"
  512. "三区阻力分布和结论建议。summary 只输出结果:主要路线阻力及误差、"
  513. "次要路线阻力及误差、等积孔及通风难易程度、有效风量率及是否合格、总体结论。"
  514. "summary 必须严格输出 5 条:1.主要路线;2.次要路线;3.等积孔;"
  515. "4.有效风量率;5.总体结论。每条不超过 35 个汉字,不写公式、原文引用和计算过程。"
  516. ),
  517. "extraction_schema": {
  518. "match_keywords": [
  519. "矿井通风阻力测定报告",
  520. "通风阻力测定报告",
  521. "通风阻力测定",
  522. ],
  523. "groups": [
  524. {
  525. "key": "report_info",
  526. "name": "报告基本信息",
  527. "order": 1,
  528. "fields": [
  529. {"key": "project_name", "name": "项目名称", "type": "text"},
  530. {"key": "report_code", "name": "报告编号", "type": "text"},
  531. {"key": "mine_name", "name": "矿井名称", "type": "text"},
  532. {"key": "client_name", "name": "委托单位", "type": "text"},
  533. {"key": "testing_organization", "name": "测定单位", "type": "text"},
  534. {"key": "measurement_start_date", "name": "测定开始日期", "type": "date"},
  535. {"key": "measurement_end_date", "name": "测定结束日期", "type": "date"},
  536. {"key": "report_date", "name": "报告日期", "type": "date"},
  537. {"key": "standard_basis", "name": "测定依据", "type": "text"},
  538. {"key": "environment_conditions", "name": "测试环境条件", "type": "object"},
  539. {"key": "instruments", "name": "使用仪器", "type": "list"},
  540. ],
  541. },
  542. {
  543. "key": "ventilation_system",
  544. "name": "矿井通风系统",
  545. "order": 2,
  546. "fields": [
  547. {"key": "ventilation_method", "name": "通风方法", "type": "text"},
  548. {"key": "ventilation_mode", "name": "通风方式", "type": "text"},
  549. {"key": "intake_shafts", "name": "进风井", "type": "list"},
  550. {"key": "return_shafts", "name": "回风井", "type": "list"},
  551. {"key": "total_return_airflow", "name": "矿井总回风量", "type": "number"},
  552. {"key": "main_fan_model", "name": "主通风机型号", "type": "text"},
  553. {"key": "main_fan_blade_angle", "name": "叶片角度", "type": "text"},
  554. {"key": "main_fan_exhaust_airflow", "name": "主通风机排风量", "type": "number"},
  555. {"key": "main_fan_negative_pressure", "name": "主通风机负压", "type": "number"},
  556. {"key": "gas_grade", "name": "瓦斯等级", "type": "text"},
  557. {"key": "coal_dust_risk", "name": "煤尘爆炸危险性", "type": "text"},
  558. {"key": "spontaneous_combustion_tendency", "name": "煤层自燃倾向性", "type": "text"},
  559. ],
  560. },
  561. {
  562. "key": "measurement_design",
  563. "name": "测定路线与测点",
  564. "order": 3,
  565. "fields": [
  566. {"key": "measurement_method", "name": "测定方法", "type": "text"},
  567. {"key": "main_route_name", "name": "主要测定路线", "type": "text"},
  568. {"key": "secondary_route_name", "name": "次要测定路线", "type": "text"},
  569. {"key": "planned_point_count", "name": "计划测点数量", "type": "number"},
  570. {"key": "effective_point_count", "name": "结果表测点数量", "type": "number"},
  571. {"key": "route_coverage", "name": "路线覆盖范围", "type": "text"},
  572. ],
  573. },
  574. {
  575. "key": "resistance_results",
  576. "name": "阻力测定结果",
  577. "order": 4,
  578. "fields": [
  579. {"key": "fan_house_water_column", "name": "风机房水柱计读数", "type": "number"},
  580. {"key": "fan_house_velocity_pressure", "name": "风硐平均动压", "type": "number"},
  581. {"key": "natural_ventilation_pressure", "name": "自然风压", "type": "number"},
  582. {"key": "main_route_theoretical_resistance", "name": "主要路线理论阻力", "type": "number"},
  583. {"key": "main_route_measured_resistance", "name": "主要路线实测阻力", "type": "number"},
  584. {"key": "main_route_absolute_error", "name": "主要路线绝对误差", "type": "number"},
  585. {"key": "main_route_relative_error", "name": "主要路线相对误差", "type": "number"},
  586. {"key": "secondary_route_theoretical_resistance", "name": "次要路线理论阻力", "type": "number"},
  587. {"key": "secondary_route_measured_resistance", "name": "次要路线实测阻力", "type": "number"},
  588. {"key": "secondary_route_absolute_error", "name": "次要路线绝对误差", "type": "number"},
  589. {"key": "secondary_route_relative_error", "name": "次要路线相对误差", "type": "number"},
  590. {"key": "maximum_resistance_route", "name": "最大阻力路线", "type": "text"},
  591. {"key": "measurement_accuracy_pass", "name": "测定精度是否合格", "type": "text"},
  592. ],
  593. },
  594. {
  595. "key": "analysis_results",
  596. "name": "通风系统分析",
  597. "order": 5,
  598. "fields": [
  599. {"key": "equivalent_orifice", "name": "矿井等积孔", "type": "number"},
  600. {"key": "ventilation_difficulty", "name": "通风难易程度", "type": "text"},
  601. {"key": "three_zone_distribution", "name": "三区阻力分布", "type": "object"},
  602. {"key": "three_zone_conclusion", "name": "三区分布结论", "type": "text"},
  603. {"key": "intake_airflow", "name": "矿井总进风量", "type": "number"},
  604. {"key": "effective_airflow", "name": "有效风量", "type": "number"},
  605. {"key": "effective_airflow_rate", "name": "有效风量率", "type": "number"},
  606. {"key": "effective_airflow_rate_pass", "name": "有效风量率是否合格", "type": "text"},
  607. {"key": "resistance_coefficient_details", "name": "主要巷道摩擦阻力系数", "type": "list"},
  608. ],
  609. },
  610. {
  611. "key": "conclusion",
  612. "name": "结论与建议",
  613. "order": 6,
  614. "fields": [
  615. {"key": "conclusions", "name": "结论", "type": "list"},
  616. {"key": "recommendations", "name": "建议", "type": "list"},
  617. {"key": "overall_assessment", "name": "总体评价", "type": "text"},
  618. ],
  619. },
  620. ],
  621. },
  622. }
  623. )
  624. DEFAULT_BUSINESS_TEMPLATES.append(
  625. {
  626. "code": "ventilation_capacity_verification_report",
  627. "name": "矿井通风能力核定报告",
  628. "document_type": "ventilation_capacity_verification_report",
  629. "description": "抽取通风能力核定结果、通风系统参数、南北风井需风量、生产能力计算和验证结论。",
  630. "prompt": (
  631. "你是一名矿井通风能力核定审查专家。请从报告中提取核定依据、通风能力核定结果、"
  632. "矿井通风系统、瓦斯和煤尘情况、2025年采掘布局、北南风井需风量、"
  633. "矿井总需风量、生产能力计算和实测验证结果。"
  634. "summary 只输出简短结果:核定通风能力、北风井需风量与可用风量、"
  635. "南风井需风量与可用风量、全矿井需风量与总回风量、有效风量率及结论。"
  636. "不要写公式、原文引用和冗长计算过程。"
  637. ),
  638. "extraction_schema": {
  639. "match_keywords": [
  640. "通风能力核定报告",
  641. "矿井通风能力核定",
  642. "通风能力核定",
  643. ],
  644. "groups": [
  645. {
  646. "key": "report_info",
  647. "name": "报告基本信息",
  648. "order": 1,
  649. "fields": [
  650. {"key": "report_title", "name": "报告名称", "type": "text"},
  651. {"key": "mine_name", "name": "矿井名称", "type": "text"},
  652. {"key": "prepared_by", "name": "编制人", "type": "text"},
  653. {"key": "reviewer", "name": "审核人", "type": "text"},
  654. {"key": "issuing_unit", "name": "编制单位", "type": "text"},
  655. {"key": "report_date", "name": "报告日期", "type": "date"},
  656. {"key": "compilation_personnel", "name": "编制人员", "type": "list"},
  657. {"key": "verification_basis", "name": "核定依据", "type": "list"},
  658. ],
  659. },
  660. {
  661. "key": "capacity_result",
  662. "name": "通风能力核定结果",
  663. "order": 2,
  664. "fields": [
  665. {"key": "verified_year", "name": "核定年度", "type": "number"},
  666. {"key": "ventilation_capacity", "name": "通风能力", "type": "number"},
  667. {"key": "capacity_unit", "name": "能力单位", "type": "text"},
  668. {"key": "capacity_result_text", "name": "核定结果", "type": "text"},
  669. ],
  670. },
  671. {
  672. "key": "mine_overview",
  673. "name": "矿井及通风概况",
  674. "order": 3,
  675. "fields": [
  676. {"key": "mine_area", "name": "井田面积", "type": "number"},
  677. {"key": "remaining_reserves", "name": "剩余可采储量", "type": "number"},
  678. {"key": "service_years", "name": "剩余服务年限", "type": "number"},
  679. {"key": "design_capacity", "name": "设计生产能力", "type": "number"},
  680. {"key": "previous_verified_capacity", "name": "最近核定生产能力", "type": "number"},
  681. {"key": "ventilation_method", "name": "通风方法", "type": "text"},
  682. {"key": "ventilation_mode", "name": "通风方式", "type": "text"},
  683. {"key": "intake_return_layout", "name": "进回风井布局", "type": "text"},
  684. {"key": "intake_shafts", "name": "进风井", "type": "list"},
  685. {"key": "return_shafts", "name": "回风井", "type": "list"},
  686. {"key": "intake_airflow", "name": "矿井总进风量", "type": "number"},
  687. {"key": "return_airflow", "name": "矿井总回风量", "type": "number"},
  688. {"key": "north_return_airflow", "name": "北风井回风量", "type": "number"},
  689. {"key": "south_return_airflow", "name": "南风井回风量", "type": "number"},
  690. {"key": "equivalent_orifice", "name": "全矿井等积孔", "type": "number"},
  691. {"key": "north_fan_model", "name": "北风井主通风机型号", "type": "text"},
  692. {"key": "north_fan_blade_angle", "name": "北风井叶片角度", "type": "text"},
  693. {"key": "north_fan_exhaust_airflow", "name": "北风井排风量", "type": "number"},
  694. {"key": "north_fan_negative_pressure", "name": "北风井负压", "type": "number"},
  695. {"key": "south_fan_model", "name": "南风井主通风机型号", "type": "text"},
  696. {"key": "south_fan_blade_angle", "name": "南风井叶片角度", "type": "text"},
  697. {"key": "south_fan_exhaust_airflow", "name": "南风井排风量", "type": "number"},
  698. {"key": "south_fan_negative_pressure", "name": "南风井负压", "type": "number"},
  699. ],
  700. },
  701. {
  702. "key": "gas_dust_conditions",
  703. "name": "瓦斯煤尘及自燃情况",
  704. "order": 4,
  705. "fields": [
  706. {"key": "gas_grade", "name": "瓦斯等级", "type": "text"},
  707. {"key": "absolute_gas_emission", "name": "绝对瓦斯涌出量", "type": "number"},
  708. {"key": "relative_gas_emission", "name": "相对瓦斯涌出量", "type": "number"},
  709. {"key": "absolute_co2_emission", "name": "绝对二氧化碳涌出量", "type": "number"},
  710. {"key": "relative_co2_emission", "name": "相对二氧化碳涌出量", "type": "number"},
  711. {"key": "coal_dust_explosive", "name": "煤尘是否具有爆炸性", "type": "text"},
  712. {"key": "spontaneous_combustion_grade", "name": "自燃倾向性等级", "type": "text"},
  713. {"key": "shortest_ignition_period", "name": "最短自然发火期", "type": "object"},
  714. ],
  715. },
  716. {
  717. "key": "airflow_verification",
  718. "name": "风量核定结果",
  719. "order": 5,
  720. "fields": [
  721. {"key": "max_demand_period", "name": "最大需风量时期", "type": "text"},
  722. {"key": "north_coal_airflow", "name": "北风井采煤面需风量", "type": "number"},
  723. {"key": "north_standby_airflow", "name": "北风井备采面需风量", "type": "number"},
  724. {"key": "north_heading_airflow", "name": "北风井掘进面需风量", "type": "number"},
  725. {"key": "north_chamber_airflow", "name": "北风井硐室需风量", "type": "number"},
  726. {"key": "north_other_airflow", "name": "北风井其他巷道需风量", "type": "number"},
  727. {"key": "north_required_airflow", "name": "北风井总需风量", "type": "number"},
  728. {"key": "north_available_airflow", "name": "北风井实际回风量", "type": "number"},
  729. {"key": "north_capacity_status", "name": "北风井是否满足", "type": "text"},
  730. {"key": "south_required_airflow", "name": "南风井总需风量", "type": "number"},
  731. {"key": "south_available_airflow", "name": "南风井实际回风量", "type": "number"},
  732. {"key": "south_capacity_status", "name": "南风井是否满足", "type": "text"},
  733. {"key": "mine_required_airflow", "name": "全矿井总需风量", "type": "number"},
  734. {"key": "mine_available_airflow", "name": "全矿井实际总回风量", "type": "number"},
  735. {"key": "mine_capacity_status", "name": "全矿井是否满足", "type": "text"},
  736. ],
  737. },
  738. {
  739. "key": "capacity_calculation",
  740. "name": "生产能力核定",
  741. "order": 6,
  742. "fields": [
  743. {"key": "calculation_method", "name": "核定方法", "type": "text"},
  744. {"key": "coalface_capacity_details", "name": "采煤工作面生产能力", "type": "list"},
  745. {"key": "heading_capacity_details", "name": "掘进工作面生产能力", "type": "list"},
  746. {"key": "north_region_capacity", "name": "北风井区域生产能力", "type": "number"},
  747. {"key": "south_region_capacity", "name": "南风井区域生产能力", "type": "number"},
  748. {"key": "final_capacity", "name": "最终核定通风能力", "type": "number"},
  749. ],
  750. },
  751. {
  752. "key": "verification_conclusion",
  753. "name": "实测验证与结论",
  754. "order": 7,
  755. "fields": [
  756. {"key": "measured_intake_airflow", "name": "实测总进风量", "type": "number"},
  757. {"key": "measured_return_airflow", "name": "实测总回风量", "type": "number"},
  758. {"key": "effective_airflow", "name": "有效风量", "type": "number"},
  759. {"key": "effective_airflow_rate", "name": "有效风量率", "type": "number"},
  760. {"key": "measured_equivalent_orifice", "name": "实测等积孔", "type": "number"},
  761. {"key": "other_roadway_airflow", "name": "其他巷道需风量", "type": "number"},
  762. {"key": "other_roadway_ratio", "name": "其他巷道需风量占比", "type": "number"},
  763. {"key": "conclusions", "name": "核定结论", "type": "list"},
  764. {"key": "recommendations", "name": "建议", "type": "list"},
  765. ],
  766. },
  767. ],
  768. },
  769. }
  770. )
  771. DEFAULT_BUSINESS_TEMPLATES.append(
  772. {
  773. "code": "airflow_measurement_decadal_report",
  774. "name": "风量实测旬报表",
  775. "document_type": "airflow_measurement_decadal_report",
  776. "description": "抽取测风旬报的风井主扇参数、矿井通风总量、有效风量率和测点明细。",
  777. "prompt": (
  778. "你是一名矿井测风数据审查专家。请从风量实测旬报表中提取报表日期、"
  779. "北风井和南风井主扇运行参数、矿井总回风量、总排风量、总进风量、"
  780. "有效风量、有效风量率和全部测点明细。"
  781. "summary 只输出简短结果:报表日期;北风井总回风/总排风/负压;"
  782. "南风井总回风/总排风/负压;矿井总回风/总进风/有效风量率及是否合格;"
  783. "测点数量及异常点数。不要写公式和原文引用。"
  784. ),
  785. "extraction_schema": {
  786. "match_keywords": [
  787. "风量实测旬报表",
  788. "测风旬报表",
  789. "测风旬报",
  790. ],
  791. "groups": [
  792. {
  793. "key": "report_info",
  794. "name": "报表基本信息",
  795. "order": 1,
  796. "fields": [
  797. {"key": "report_title", "name": "报表名称", "type": "text"},
  798. {"key": "mine_name", "name": "矿井名称", "type": "text"},
  799. {"key": "measurement_date", "name": "测风日期", "type": "date"},
  800. {"key": "weather", "name": "气候", "type": "text"},
  801. {"key": "atmospheric_pressure", "name": "大气压力", "type": "number"},
  802. {"key": "total_equivalent_orifice", "name": "总等积孔", "type": "number"},
  803. {"key": "ground_temperature", "name": "地面温度", "type": "number"},
  804. ],
  805. },
  806. {
  807. "key": "fan_operation",
  808. "name": "主扇运行参数",
  809. "order": 2,
  810. "fields": [
  811. {"key": "north_return_airflow", "name": "北风井总回风量", "type": "number"},
  812. {"key": "north_exhaust_airflow", "name": "北风井总排风量", "type": "number"},
  813. {"key": "north_fan_model", "name": "北风井风机型号", "type": "text"},
  814. {"key": "north_operating_fan", "name": "北风井运行主扇", "type": "text"},
  815. {"key": "north_blade_angle", "name": "北风井叶片角度", "type": "number"},
  816. {"key": "north_negative_pressure", "name": "北风井负压", "type": "number"},
  817. {"key": "north_motor_power", "name": "北风井电机功率", "type": "number"},
  818. {"key": "north_fan_power", "name": "北风井风机功率", "type": "number"},
  819. {"key": "north_efficiency", "name": "北风井效率", "type": "number"},
  820. {"key": "north_power_factor", "name": "北风井功率因数", "type": "number"},
  821. {"key": "north_voltage", "name": "北风井电压", "type": "number"},
  822. {"key": "north_current", "name": "北风井电流", "type": "number"},
  823. {"key": "south_return_airflow", "name": "南风井总回风量", "type": "number"},
  824. {"key": "south_exhaust_airflow", "name": "南风井总排风量", "type": "number"},
  825. {"key": "south_fan_model", "name": "南风井风机型号", "type": "text"},
  826. {"key": "south_operating_fan", "name": "南风井运行主扇", "type": "text"},
  827. {"key": "south_blade_angle", "name": "南风井叶片角度", "type": "number"},
  828. {"key": "south_negative_pressure", "name": "南风井负压", "type": "number"},
  829. {"key": "south_motor_power", "name": "南风井电机功率", "type": "number"},
  830. {"key": "south_fan_power", "name": "南风井风机功率", "type": "number"},
  831. {"key": "south_efficiency", "name": "南风井效率", "type": "number"},
  832. {"key": "south_power_factor", "name": "南风井功率因数", "type": "number"},
  833. {"key": "south_voltage", "name": "南风井电压", "type": "number"},
  834. {"key": "south_current", "name": "南风井电流", "type": "number"},
  835. ],
  836. },
  837. {
  838. "key": "mine_totals",
  839. "name": "矿井通风总量",
  840. "order": 3,
  841. "fields": [
  842. {"key": "mine_total_return_airflow", "name": "矿井总回风量", "type": "number"},
  843. {"key": "mine_total_exhaust_airflow", "name": "矿井总排风量", "type": "number"},
  844. {"key": "mine_total_intake_airflow", "name": "矿井总进风量", "type": "number"},
  845. {"key": "effective_airflow", "name": "有效风量", "type": "number"},
  846. {"key": "effective_airflow_rate", "name": "有效风量率", "type": "number"},
  847. ],
  848. },
  849. {
  850. "key": "measurement_points",
  851. "name": "测点明细",
  852. "order": 4,
  853. "fields": [
  854. {"key": "measurement_point_count", "name": "测点数量", "type": "number"},
  855. {"key": "measurement_point_details", "name": "测点数据明细", "type": "list"},
  856. {"key": "insufficient_airflow_points", "name": "风量不足测点", "type": "list"},
  857. {"key": "gas_anomaly_points", "name": "瓦斯异常测点", "type": "list"},
  858. ],
  859. },
  860. {
  861. "key": "analysis",
  862. "name": "分析结论",
  863. "order": 5,
  864. "fields": [
  865. {"key": "effective_airflow_rate_pass", "name": "有效风量率是否合格", "type": "text"},
  866. {"key": "north_fan_status", "name": "北风井运行状态", "type": "text"},
  867. {"key": "south_fan_status", "name": "南风井运行状态", "type": "text"},
  868. {"key": "overall_conclusion", "name": "总体结论", "type": "text"},
  869. ],
  870. },
  871. ],
  872. },
  873. }
  874. )
  875. DEFAULT_BUSINESS_TEMPLATES.append(
  876. {
  877. "code": "gas_grade_appraisal_report",
  878. "name": "瓦斯等级鉴定报告",
  879. "document_type": "gas_grade_appraisal_report",
  880. "description": "抽取瓦斯等级鉴定报告的瓦斯和二氧化碳涌出量、测点结果、鉴定等级和结论。",
  881. "prompt": (
  882. "你是一名矿井瓦斯等级鉴定审查专家。请从报告中提取报告信息、矿井瓦斯和"
  883. "二氧化碳涌出量、通风系统参数、鉴定测点、井巷风流瓦斯数据、历史等级和最终结论。"
  884. "summary 只输出简短结果:本年度瓦斯等级;绝对和相对瓦斯涌出量;"
  885. "二氧化碳绝对和相对涌出量;采煤面和掘进面最大绝对瓦斯涌出量;"
  886. "是否存在瓦斯突出、喷出及总体结论。不要写公式和原文引用。"
  887. ),
  888. "extraction_schema": {
  889. "match_keywords": [
  890. "瓦斯等级鉴定报告",
  891. "矿井瓦斯等级鉴定",
  892. "瓦斯等级鉴定",
  893. ],
  894. "groups": [
  895. {
  896. "key": "report_info",
  897. "name": "报告基本信息",
  898. "order": 1,
  899. "fields": [
  900. {"key": "report_title", "name": "报告名称", "type": "text"},
  901. {"key": "report_code", "name": "报告编号", "type": "text"},
  902. {"key": "mine_name", "name": "矿井名称", "type": "text"},
  903. {"key": "appraisal_year", "name": "鉴定年度", "type": "text"},
  904. {"key": "appraisal_organization", "name": "鉴定单位", "type": "text"},
  905. {"key": "report_date", "name": "编制日期", "type": "date"},
  906. {"key": "appraisal_personnel", "name": "鉴定人员", "type": "list"},
  907. ],
  908. },
  909. {
  910. "key": "mine_overview",
  911. "name": "矿井基本情况",
  912. "order": 2,
  913. "fields": [
  914. {"key": "mine_area", "name": "井田面积", "type": "number"},
  915. {"key": "geological_reserves", "name": "地质储量", "type": "number"},
  916. {"key": "recoverable_reserves", "name": "可采储量", "type": "number"},
  917. {"key": "verified_capacity", "name": "核定生产能力", "type": "number"},
  918. {"key": "main_coal_seams", "name": "主要可采煤层", "type": "list"},
  919. {"key": "coal_quality", "name": "煤质情况", "type": "text"},
  920. {"key": "historical_gas_grade", "name": "历史瓦斯等级", "type": "text"},
  921. ],
  922. },
  923. {
  924. "key": "ventilation_system",
  925. "name": "矿井通风概况",
  926. "order": 3,
  927. "fields": [
  928. {"key": "ventilation_method", "name": "通风方法", "type": "text"},
  929. {"key": "ventilation_mode", "name": "通风方式", "type": "text"},
  930. {"key": "intake_shafts", "name": "进风井", "type": "list"},
  931. {"key": "return_shafts", "name": "回风井", "type": "list"},
  932. {"key": "total_intake_airflow", "name": "总进风量", "type": "number"},
  933. {"key": "north_return_airflow", "name": "北回风井回风量", "type": "number"},
  934. {"key": "north_blade_angle", "name": "北回风井叶片角度", "type": "number"},
  935. {"key": "north_negative_pressure", "name": "北回风井负压", "type": "number"},
  936. {"key": "south_return_airflow", "name": "南回风井回风量", "type": "number"},
  937. {"key": "south_blade_angle", "name": "南回风井叶片角度", "type": "number"},
  938. {"key": "south_negative_pressure", "name": "南回风井负压", "type": "number"},
  939. {"key": "effective_airflow_rate", "name": "有效风量率", "type": "number"},
  940. {"key": "equivalent_orifice", "name": "矿井等积孔", "type": "number"},
  941. {"key": "north_fan_model", "name": "北回风井主通风机型号", "type": "text"},
  942. {"key": "north_fan_power", "name": "北回风井主通风机额定功率", "type": "text"},
  943. {"key": "south_fan_model", "name": "南回风井主通风机型号", "type": "text"},
  944. {"key": "south_fan_power", "name": "南回风井主通风机额定功率", "type": "text"},
  945. ],
  946. },
  947. {
  948. "key": "gas_results",
  949. "name": "瓦斯和二氧化碳鉴定结果",
  950. "order": 4,
  951. "fields": [
  952. {"key": "absolute_gas_emission", "name": "矿井绝对瓦斯涌出量", "type": "number"},
  953. {"key": "relative_gas_emission", "name": "矿井相对瓦斯涌出量", "type": "number"},
  954. {"key": "absolute_co2_emission", "name": "二氧化碳绝对涌出量", "type": "number"},
  955. {"key": "relative_co2_emission", "name": "二氧化碳相对涌出量", "type": "number"},
  956. {"key": "coalface_max_gas_emission", "name": "综采面最大绝对瓦斯涌出量", "type": "number"},
  957. {"key": "coalface_max_co2_emission", "name": "综采面二氧化碳涌出量", "type": "number"},
  958. {"key": "heading_max_gas_emission", "name": "掘进面最大绝对瓦斯涌出量", "type": "number"},
  959. {"key": "heading_max_co2_emission", "name": "掘进面二氧化碳涌出量", "type": "number"},
  960. {"key": "gas_grade", "name": "本年度瓦斯等级", "type": "text"},
  961. {"key": "previous_gas_grade", "name": "上年度瓦斯等级", "type": "text"},
  962. {"key": "gas_outburst_status", "name": "瓦斯突出情况", "type": "text"},
  963. {"key": "gas_blowout_status", "name": "瓦斯喷出情况", "type": "text"},
  964. {"key": "production_status", "name": "鉴定月生产状况", "type": "text"},
  965. ],
  966. },
  967. {
  968. "key": "measurement_results",
  969. "name": "测点鉴定结果",
  970. "order": 5,
  971. "fields": [
  972. {"key": "measurement_point_count", "name": "鉴定测点数量", "type": "number"},
  973. {"key": "measurement_point_results", "name": "各测点瓦斯和二氧化碳结果", "type": "list"},
  974. {"key": "historical_results", "name": "历年鉴定结果", "type": "list"},
  975. ],
  976. },
  977. {
  978. "key": "conclusion",
  979. "name": "结论与建议",
  980. "order": 6,
  981. "fields": [
  982. {"key": "gas_grade_conclusion", "name": "瓦斯等级结论", "type": "text"},
  983. {"key": "comparison_with_previous", "name": "与上年度对比", "type": "text"},
  984. {"key": "conclusions", "name": "结论", "type": "list"},
  985. {"key": "recommendations", "name": "建议", "type": "list"},
  986. ],
  987. },
  988. ],
  989. },
  990. }
  991. )
  992. DEFAULT_BUSINESS_TEMPLATES.append(
  993. {
  994. "code": "coal_dust_explosion_spontaneous_combustion_report",
  995. "name": "煤尘爆炸性、自燃倾向性鉴定报告",
  996. "document_type": "coal_dust_explosion_spontaneous_combustion_report",
  997. "description": "抽取煤尘爆炸性、自燃倾向性、工业分析、吸氧量和鉴定结论。",
  998. "prompt": (
  999. "你是一名煤矿火灾防治资料审查专家。请从煤尘爆炸性和自燃倾向性鉴定报告中"
  1000. "提取报告信息、样品信息、检验环境、仪器设备、煤尘爆炸性、自燃倾向性、"
  1001. "工业分析指标和最终结论。summary 只输出简短结果:煤尘是否有爆炸性;"
  1002. "自燃倾向性等级;吸氧量和水灰挥发分等关键指标;报告有效期及状态;总体结论。"
  1003. "不要写公式和原文引用。"
  1004. ),
  1005. "extraction_schema": {
  1006. "match_keywords": [
  1007. "煤尘爆炸性",
  1008. "自燃倾向性",
  1009. "煤尘爆炸性、自燃倾向性鉴定报告",
  1010. "煤自燃倾向性鉴定",
  1011. ],
  1012. "groups": [
  1013. {
  1014. "key": "report_info",
  1015. "name": "报告基本信息",
  1016. "order": 1,
  1017. "fields": [
  1018. {"key": "report_title", "name": "报告名称", "type": "text"},
  1019. {"key": "controlled_code", "name": "受控编号", "type": "text"},
  1020. {"key": "report_code", "name": "报告编号", "type": "text"},
  1021. {"key": "client_name", "name": "委托单位", "type": "text"},
  1022. {"key": "mine_name", "name": "矿井名称", "type": "text"},
  1023. {"key": "testing_organization", "name": "检测检验机构", "type": "text"},
  1024. {"key": "inspection_category", "name": "检验类别", "type": "text"},
  1025. {"key": "inspection_date", "name": "检验日期", "type": "date"},
  1026. {"key": "valid_until", "name": "有效期至", "type": "date"},
  1027. ],
  1028. },
  1029. {
  1030. "key": "sample_info",
  1031. "name": "样品信息",
  1032. "order": 2,
  1033. "fields": [
  1034. {"key": "sample_name", "name": "设备或样品名称", "type": "text"},
  1035. {"key": "coal_seam", "name": "煤层名称", "type": "text"},
  1036. {"key": "sample_code", "name": "样品编号", "type": "text"},
  1037. {"key": "contract_code", "name": "合同编号", "type": "text"},
  1038. {"key": "submitter", "name": "送样人", "type": "text"},
  1039. {"key": "coal_type", "name": "煤的类别", "type": "text"},
  1040. {"key": "sampling_location", "name": "取样地点", "type": "text"},
  1041. {"key": "sampling_coal_seam", "name": "取样煤层", "type": "text"},
  1042. {"key": "sampling_date", "name": "取样日期", "type": "date"},
  1043. {"key": "sample_mass", "name": "样品质量", "type": "number"},
  1044. {"key": "sample_status", "name": "样品状态", "type": "text"},
  1045. ],
  1046. },
  1047. {
  1048. "key": "testing_conditions",
  1049. "name": "检验环境与仪器",
  1050. "order": 3,
  1051. "fields": [
  1052. {"key": "temperature", "name": "检验环境温度", "type": "number"},
  1053. {"key": "humidity", "name": "相对湿度", "type": "number"},
  1054. {"key": "pressure", "name": "大气压力", "type": "number"},
  1055. {"key": "testing_basis", "name": "检验依据", "type": "list"},
  1056. {"key": "instruments", "name": "检验用主要仪器设备", "type": "list"},
  1057. ],
  1058. },
  1059. {
  1060. "key": "explosion_test",
  1061. "name": "煤尘爆炸性鉴定",
  1062. "order": 4,
  1063. "fields": [
  1064. {"key": "dust_explosion_result", "name": "煤尘爆炸性结论", "type": "text"},
  1065. {"key": "flame_length", "name": "火焰长度", "type": "number"},
  1066. {"key": "minimum_rock_dust", "name": "最低岩粉用量", "type": "number"},
  1067. {"key": "dust_explosion_judgement", "name": "单项判定", "type": "text"},
  1068. ],
  1069. },
  1070. {
  1071. "key": "spontaneous_combustion",
  1072. "name": "自燃倾向性鉴定",
  1073. "order": 5,
  1074. "fields": [
  1075. {"key": "moisture", "name": "水分 Mad", "type": "number"},
  1076. {"key": "ash", "name": "灰分 Aad", "type": "number"},
  1077. {"key": "ash_dry", "name": "灰分 Ad", "type": "number"},
  1078. {"key": "volatile", "name": "挥发分 Vad", "type": "number"},
  1079. {"key": "volatile_dry", "name": "挥发分 Vd", "type": "number"},
  1080. {"key": "volatile_daf", "name": "干燥无灰基挥发分 Vdaf", "type": "number"},
  1081. {"key": "total_sulfur", "name": "煤中全硫", "type": "number"},
  1082. {"key": "true_density", "name": "真相对密度", "type": "number"},
  1083. {"key": "oxygen_adsorption", "name": "吸氧量", "type": "number"},
  1084. {"key": "spontaneous_combustion_grade", "name": "自燃倾向性等级", "type": "text"},
  1085. ],
  1086. },
  1087. {
  1088. "key": "conclusion",
  1089. "name": "结论与签署",
  1090. "order": 6,
  1091. "fields": [
  1092. {"key": "inspection_conclusion", "name": "检验结论", "type": "text"},
  1093. {"key": "approver", "name": "批准人", "type": "text"},
  1094. {"key": "reviewer", "name": "审核人", "type": "text"},
  1095. {"key": "inspector", "name": "检验人", "type": "text"},
  1096. {"key": "preparer", "name": "编制人", "type": "text"},
  1097. {"key": "issue_date", "name": "签发日期", "type": "date"},
  1098. ],
  1099. },
  1100. ],
  1101. },
  1102. }
  1103. )
  1104. DEFAULT_BUSINESS_TEMPLATES.append(
  1105. {
  1106. "code": "safety_monitoring_system_ledger",
  1107. "name": "安全监控系统台账",
  1108. "document_type": "safety_monitoring_system_ledger",
  1109. "description": "抽取安全监控系统分站、传感器、测点状态、报警值、断电值和复电值。",
  1110. "prompt": (
  1111. "你是一名煤矿安全监控系统台账审查专家。请从安全监控系统台账中提取"
  1112. "台账名称、矿井、编制单位、数据来源、工作表结构、分站数量和位置、"
  1113. "传感器类型和数量、测点字段、报警值、断电值、复电值和断电范围。"
  1114. "对于数据量很大的明细,请按分站和传感器类型汇总,同时保留关键甲烷、"
  1115. "一氧化碳、风速、温度、烟雾、风门和局扇测点。"
  1116. "summary 只输出结果:台账版本;分站和传感器数量;主要传感器类型;"
  1117. "甲烷、一氧化碳、温度、风速报警及断电要求;总体完整性结论。"
  1118. "不要写公式和原文引用。"
  1119. ),
  1120. "extraction_schema": {
  1121. "match_keywords": [
  1122. "安全监控系统台账",
  1123. "安全监控系统",
  1124. "安全监测系统设备台账",
  1125. "监控系统台账",
  1126. ],
  1127. "groups": [
  1128. {
  1129. "key": "ledger_info",
  1130. "name": "台账基本信息",
  1131. "order": 1,
  1132. "fields": [
  1133. {"key": "ledger_title", "name": "台账名称", "type": "text"},
  1134. {"key": "mine_name", "name": "矿井名称", "type": "text"},
  1135. {"key": "department", "name": "编制单位", "type": "text"},
  1136. {"key": "ledger_version", "name": "台账版本或月份", "type": "text"},
  1137. {"key": "sheet_names", "name": "工作表结构", "type": "list"},
  1138. {"key": "data_source", "name": "数据来源系统", "type": "text"},
  1139. ],
  1140. },
  1141. {
  1142. "key": "system_structure",
  1143. "name": "系统结构汇总",
  1144. "order": 2,
  1145. "fields": [
  1146. {"key": "substation_count", "name": "分站数量", "type": "number"},
  1147. {"key": "sensor_count", "name": "传感器或测点数量", "type": "number"},
  1148. {"key": "substation_details", "name": "分站清单", "type": "list"},
  1149. {"key": "sensor_type_counts", "name": "传感器类型数量", "type": "object"},
  1150. {"key": "monitored_parameters", "name": "监测参数", "type": "list"},
  1151. ],
  1152. },
  1153. {
  1154. "key": "sensor_definitions",
  1155. "name": "传感器与测点定义",
  1156. "order": 3,
  1157. "fields": [
  1158. {"key": "sensor_fields", "name": "台账字段", "type": "list"},
  1159. {"key": "critical_sensor_details", "name": "关键传感器明细", "type": "list"},
  1160. {"key": "gas_sensor_count", "name": "甲烷传感器数量", "type": "number"},
  1161. {"key": "co_sensor_count", "name": "一氧化碳传感器数量", "type": "number"},
  1162. {"key": "airflow_sensor_count", "name": "风速传感器数量", "type": "number"},
  1163. {"key": "temperature_sensor_count", "name": "温度传感器数量", "type": "number"},
  1164. {"key": "smoke_sensor_count", "name": "烟雾传感器数量", "type": "number"},
  1165. {"key": "door_sensor_count", "name": "风门传感器数量", "type": "number"},
  1166. {"key": "fan_sensor_count", "name": "局扇测点数量", "type": "number"},
  1167. ],
  1168. },
  1169. {
  1170. "key": "alarm_settings",
  1171. "name": "报警与断电设置",
  1172. "order": 4,
  1173. "fields": [
  1174. {"key": "gas_alarm_thresholds", "name": "甲烷报警阈值", "type": "list"},
  1175. {"key": "co_alarm_thresholds", "name": "一氧化碳报警阈值", "type": "list"},
  1176. {"key": "temperature_alarm_thresholds", "name": "温度报警阈值", "type": "list"},
  1177. {"key": "airflow_alarm_thresholds", "name": "风速报警阈值", "type": "list"},
  1178. {"key": "power_cut_rules", "name": "断电控制规则", "type": "list"},
  1179. {"key": "power_restore_rules", "name": "复电控制规则", "type": "list"},
  1180. ],
  1181. },
  1182. {
  1183. "key": "analysis",
  1184. "name": "台账完整性分析",
  1185. "order": 5,
  1186. "fields": [
  1187. {"key": "ledger_complete", "name": "台账是否完整", "type": "text"},
  1188. {"key": "missing_items", "name": "缺失项", "type": "list"},
  1189. {"key": "abnormal_settings", "name": "异常设置", "type": "list"},
  1190. {"key": "overall_conclusion", "name": "总体结论", "type": "text"},
  1191. ],
  1192. },
  1193. ],
  1194. },
  1195. }
  1196. )
  1197. DEFAULT_BUSINESS_TEMPLATES.append(
  1198. {
  1199. "code": "dust_dispersion_free_silica_monitoring_ledger",
  1200. "name": "采掘作业场所粉尘分散度、游离二氧化硅含量监测台账",
  1201. "document_type": "dust_dispersion_free_silica_monitoring_ledger",
  1202. "description": "抽取采掘作业场所粉尘分散度、游离二氧化硅含量监测计划或台账的矿井、采样时间、检测地点、检测项目、频次、联系人和检测日期。",
  1203. "prompt": (
  1204. "你是一名煤矿粉尘防治资料审查专家。请从采掘作业场所粉尘分散度、"
  1205. "游离二氧化硅含量监测计划表或监测台账中提取标题、监测年度、覆盖矿井、"
  1206. "采样时间、检测地点、检测项目、频次周期、联系人及电话、备注、计划检测日期和"
  1207. "实际检测日期。请按矿井逐条整理计划记录,不得把计划时间当作实际检测时间,"
  1208. "空值保留为 null。summary 只输出结果:监测年度;覆盖矿井数量;检测项目;"
  1209. "频次要求;计划记录数量;计划日期和实际日期的完整情况;总体结论。"
  1210. "不要写公式和原文引用。"
  1211. ),
  1212. "extraction_schema": {
  1213. "match_keywords": [
  1214. "粉尘分散度、游离二氧化硅含量监测",
  1215. "粉尘分散度",
  1216. "游离二氧化硅",
  1217. "采掘作业场所粉尘",
  1218. "粉尘检测计划表",
  1219. "粉尘分散度监测台账",
  1220. ],
  1221. "groups": [
  1222. {
  1223. "key": "ledger_info",
  1224. "name": "台账基本信息",
  1225. "order": 1,
  1226. "fields": [
  1227. {"key": "monitoring_title", "name": "监测计划或台账名称", "type": "text"},
  1228. {"key": "monitoring_year", "name": "监测年度", "type": "text"},
  1229. {"key": "document_kind", "name": "资料性质", "type": "text"},
  1230. {"key": "applicable_scope", "name": "适用范围", "type": "text"},
  1231. {"key": "sheet_names", "name": "工作表结构", "type": "list"},
  1232. ],
  1233. },
  1234. {
  1235. "key": "plan_summary",
  1236. "name": "监测计划汇总",
  1237. "order": 2,
  1238. "fields": [
  1239. {"key": "mine_count", "name": "覆盖矿井数量", "type": "number"},
  1240. {"key": "plan_record_count", "name": "监测计划记录数量", "type": "number"},
  1241. {"key": "mine_names", "name": "覆盖矿井", "type": "list"},
  1242. {"key": "monitoring_items", "name": "检测项目", "type": "list"},
  1243. {"key": "frequency_cycle", "name": "检测频次或周期", "type": "list"},
  1244. {"key": "coverage_requirements", "name": "覆盖和抽样要求", "type": "list"},
  1245. ],
  1246. },
  1247. {
  1248. "key": "mine_plan_records",
  1249. "name": "各矿井监测计划",
  1250. "order": 3,
  1251. "fields": [
  1252. {"key": "mine_plan_records", "name": "逐矿计划记录", "type": "list"},
  1253. ],
  1254. },
  1255. {
  1256. "key": "schedule",
  1257. "name": "检测时间安排",
  1258. "order": 4,
  1259. "fields": [
  1260. {"key": "planned_detection_dates", "name": "计划检测时间", "type": "list"},
  1261. {"key": "actual_detection_dates", "name": "实际检测日期", "type": "list"},
  1262. {"key": "missing_planned_dates", "name": "缺少计划日期的矿井", "type": "list"},
  1263. {"key": "missing_actual_dates", "name": "缺少实际日期的矿井", "type": "list"},
  1264. ],
  1265. },
  1266. {
  1267. "key": "contacts",
  1268. "name": "联系人信息",
  1269. "order": 5,
  1270. "fields": [
  1271. {"key": "primary_contacts", "name": "矿方联系人及电话", "type": "list"},
  1272. {"key": "onsite_contacts", "name": "现场检测联系人及电话", "type": "list"},
  1273. {"key": "contact_phone_map", "name": "联系人电话映射", "type": "object"},
  1274. ],
  1275. },
  1276. {
  1277. "key": "analysis",
  1278. "name": "计划完整性分析",
  1279. "order": 6,
  1280. "fields": [
  1281. {"key": "plan_complete", "name": "计划信息是否完整", "type": "text"},
  1282. {"key": "missing_items", "name": "缺失项", "type": "list"},
  1283. {"key": "overall_conclusion", "name": "总体结论", "type": "text"},
  1284. ],
  1285. },
  1286. ],
  1287. },
  1288. }
  1289. )
  1290. DEFAULT_BUSINESS_TEMPLATES.append(
  1291. {
  1292. "code": "vehicle_air_door_inspection_record",
  1293. "name": "行车风门检查记录",
  1294. "document_type": "vehicle_air_door_inspection_record",
  1295. "description": "抽取出行车风门台账、风门编号、类型、性质、材料、规格、数量以及检查问题、整改措施和整改状态。",
  1296. "prompt": (
  1297. "你是一名煤矿通风设施检查资料审查专家。请从行车风门检查记录中提取"
  1298. "资料名称、矿井名称、年度、台账名称、风门台账明细、分区统计、检查月份、"
  1299. "检查时间、各风门检查记录、存在问题、整改措施、是否整改及备注。"
  1300. "风门台账需要逐条保留序号、属地、风门地点、风门编号、风门类型、风门性质、"
  1301. "风门材料、数量和风门规格。检查记录需要按安装地点、风门性质、检查时间、"
  1302. "存在问题、整改措施、是否整改和备注逐条整理。"
  1303. "如果 OCR 将矿井名称识别为“上海煤矿”,应结合文件信息纠正为“上湾煤矿”。"
  1304. "summary 只输出结果:年度和月份;风门台账数量;自动/手动风门数量;"
  1305. "主要规格;检查风门数量;发现问题数量和整改情况;总体结论。"
  1306. "不要写公式和原文引用。"
  1307. ),
  1308. "extraction_schema": {
  1309. "match_keywords": [
  1310. "行车风门检查记录",
  1311. "行车风门台账",
  1312. "行车风门",
  1313. "风门检查记录",
  1314. ],
  1315. "groups": [
  1316. {
  1317. "key": "document_info",
  1318. "name": "资料基本信息",
  1319. "order": 1,
  1320. "fields": [
  1321. {"key": "record_title", "name": "检查记录名称", "type": "text"},
  1322. {"key": "mine_name", "name": "矿井名称", "type": "text"},
  1323. {"key": "record_year", "name": "检查年度", "type": "text"},
  1324. {"key": "ledger_name", "name": "风门台账名称", "type": "text"},
  1325. {"key": "inspection_month", "name": "检查月份", "type": "text"},
  1326. {"key": "page_count", "name": "资料页数", "type": "number"},
  1327. ],
  1328. },
  1329. {
  1330. "key": "inventory_summary",
  1331. "name": "行车风门台账汇总",
  1332. "order": 2,
  1333. "fields": [
  1334. {"key": "district_count", "name": "涉及盘区或区域数量", "type": "number"},
  1335. {"key": "air_door_record_count", "name": "风门台账记录数量", "type": "number"},
  1336. {"key": "total_door_sets", "name": "风门总套数", "type": "number"},
  1337. {"key": "automatic_door_count", "name": "自动风门数量", "type": "number"},
  1338. {"key": "manual_door_count", "name": "手动风门数量", "type": "number"},
  1339. {"key": "inactive_door_count", "name": "停用或常开风门数量", "type": "number"},
  1340. {"key": "common_specifications", "name": "常见风门规格", "type": "list"},
  1341. ],
  1342. },
  1343. {
  1344. "key": "air_door_inventory",
  1345. "name": "行车风门台账明细",
  1346. "order": 3,
  1347. "fields": [
  1348. {"key": "air_door_records", "name": "逐条风门台账", "type": "list"},
  1349. ],
  1350. },
  1351. {
  1352. "key": "inspection_summary",
  1353. "name": "检查结果汇总",
  1354. "order": 4,
  1355. "fields": [
  1356. {"key": "inspection_dates", "name": "检查时间", "type": "list"},
  1357. {"key": "inspected_door_count", "name": "检查风门数量", "type": "number"},
  1358. {"key": "problem_door_count", "name": "存在问题的风门数量", "type": "number"},
  1359. {"key": "rectified_count", "name": "已完成整改数量", "type": "number"},
  1360. {"key": "unrectified_count", "name": "未完成整改数量", "type": "number"},
  1361. {"key": "rectification_rate", "name": "整改率", "type": "number"},
  1362. ],
  1363. },
  1364. {
  1365. "key": "inspection_records",
  1366. "name": "风门检查明细",
  1367. "order": 5,
  1368. "fields": [
  1369. {"key": "inspection_records", "name": "逐条检查记录", "type": "list"},
  1370. ],
  1371. },
  1372. {
  1373. "key": "analysis",
  1374. "name": "问题与结论",
  1375. "order": 6,
  1376. "fields": [
  1377. {"key": "problem_records", "name": "存在问题的记录", "type": "list"},
  1378. {"key": "problem_types", "name": "问题类型", "type": "list"},
  1379. {"key": "rectification_measures", "name": "整改措施", "type": "list"},
  1380. {"key": "overall_conclusion", "name": "总体结论", "type": "text"},
  1381. ],
  1382. },
  1383. ],
  1384. },
  1385. }
  1386. )
  1387. LEGACY_TEMPLATE_CODES = {
  1388. "pdf_document_v1",
  1389. "word_document_v1",
  1390. "excel_document_v1",
  1391. }
  1392. def detect_file_format(file_ext: str | None) -> str:
  1393. extension = Path(file_ext or "").suffix.lower()
  1394. if not extension:
  1395. extension = f".{str(file_ext or '').strip().lstrip('.').lower()}"
  1396. if extension not in SUPPORTED_FILE_EXTENSIONS:
  1397. supported = "、".join(sorted(SUPPORTED_FILE_EXTENSIONS))
  1398. raise APIError(
  1399. 422,
  1400. "unsupported_file_format",
  1401. f"暂不支持该文件格式,可用扩展名:{supported}",
  1402. )
  1403. return SUPPORTED_FILE_EXTENSIONS[extension]
  1404. def _active_template_schema(item: dict) -> dict:
  1405. schema = item["extraction_schema"]
  1406. return {
  1407. **schema,
  1408. "groups": [
  1409. group
  1410. for group in schema.get("groups", [])
  1411. if not group.get("analysis_only")
  1412. ],
  1413. }
  1414. def ensure_default_templates(db: Session) -> None:
  1415. default_codes = {item["code"] for item in DEFAULT_BUSINESS_TEMPLATES}
  1416. for item in DEFAULT_BUSINESS_TEMPLATES:
  1417. template_data = {
  1418. **item,
  1419. "extraction_schema": _active_template_schema(item),
  1420. }
  1421. template = db.scalar(
  1422. select(DocumentExtractionTemplate).where(
  1423. DocumentExtractionTemplate.code == item["code"]
  1424. )
  1425. )
  1426. if template is None:
  1427. db.add(DocumentExtractionTemplate(**template_data))
  1428. else:
  1429. template.name = template_data["name"]
  1430. template.document_type = template_data["document_type"]
  1431. template.description = template_data["description"]
  1432. template.prompt = template_data["prompt"]
  1433. template.extraction_schema = template_data["extraction_schema"]
  1434. template.enabled = True
  1435. legacy_templates = db.scalars(
  1436. select(DocumentExtractionTemplate).where(
  1437. DocumentExtractionTemplate.code.in_(LEGACY_TEMPLATE_CODES - default_codes)
  1438. )
  1439. ).all()
  1440. for template in legacy_templates:
  1441. template.enabled = False
  1442. db.commit()
  1443. def get_template_by_id(
  1444. db: Session,
  1445. template_id: str,
  1446. ) -> DocumentExtractionTemplate:
  1447. template = db.get(DocumentExtractionTemplate, template_id)
  1448. if template is None or not template.enabled:
  1449. raise APIError(404, "extraction_template_not_found", "抽取模板不存在或未启用")
  1450. return template
  1451. def resolve_document_template(
  1452. db: Session,
  1453. *,
  1454. title: str,
  1455. template_id: str | None = None,
  1456. ) -> DocumentExtractionTemplate:
  1457. if template_id:
  1458. return get_template_by_id(db, template_id)
  1459. templates = db.scalars(
  1460. select(DocumentExtractionTemplate)
  1461. .where(DocumentExtractionTemplate.enabled.is_(True))
  1462. .order_by(DocumentExtractionTemplate.updated_at.desc())
  1463. ).all()
  1464. raw_title = title.strip()
  1465. normalized_title = re.sub(
  1466. r"[\s\-_—–()()\[\]【】..]+",
  1467. "",
  1468. raw_title.lower(),
  1469. )
  1470. matched: list[tuple[int, DocumentExtractionTemplate]] = []
  1471. for template in templates:
  1472. schema = template.extraction_schema or {}
  1473. keywords = [str(item).lower() for item in schema.get("match_keywords", [])]
  1474. score = 0
  1475. normalized_name = re.sub(
  1476. r"[\s\-_—–()()\[\]【】..]+",
  1477. "",
  1478. template.name.lower(),
  1479. )
  1480. normalized_code = re.sub(r"[\s\-_—–()()\[\]【】..]+", "", template.code.lower())
  1481. if normalized_name and normalized_name in normalized_title:
  1482. score += 100
  1483. if normalized_code and normalized_code in normalized_title:
  1484. score += 80
  1485. for keyword in keywords:
  1486. normalized_keyword = re.sub(
  1487. r"[\s\-_—–()()\[\]【】..]+",
  1488. "",
  1489. keyword,
  1490. )
  1491. if normalized_keyword and normalized_keyword in normalized_title:
  1492. score += 50 + len(normalized_keyword)
  1493. if score:
  1494. matched.append((score, template))
  1495. if matched:
  1496. matched.sort(key=lambda item: item[0], reverse=True)
  1497. return matched[0][1]
  1498. raise APIError(
  1499. 422,
  1500. "extraction_template_required",
  1501. "请选择资料对应的业务抽取模板",
  1502. )
  1503. def template_field_definitions(
  1504. template: DocumentExtractionTemplate,
  1505. ) -> list[dict]:
  1506. schema = template.extraction_schema or {}
  1507. definitions: list[dict] = []
  1508. for group in sorted(
  1509. schema.get("groups", []),
  1510. key=lambda item: int(item.get("order", 999)),
  1511. ):
  1512. for field_order, field in enumerate(group.get("fields", [])):
  1513. definitions.append(
  1514. {
  1515. **field,
  1516. "group_key": group.get("key", ""),
  1517. "group_name": group.get("name", ""),
  1518. "group_order": group.get("order", 999),
  1519. "field_order": field_order,
  1520. }
  1521. )
  1522. if definitions:
  1523. return definitions
  1524. return list(schema.get("fields", []))