main_fan_store.py 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. """主通风机文档识别缓存和确定性研判原件,存入本应用数据库。"""
  2. import json
  3. from db import db_conn
  4. CACHE_VERSION = "main-fan-facts-v4"
  5. def save_document(sha256, facts, method):
  6. key = f"{CACHE_VERSION}:{sha256}"
  7. content = json.dumps(facts, ensure_ascii=False, allow_nan=False)
  8. with db_conn.transaction():
  9. db_conn.execute("DELETE FROM main_fan_documents WHERE id = ?", (key,))
  10. db_conn.execute("INSERT INTO main_fan_documents (id, sha256, facts_json, method, created_at) VALUES (?, ?, ?, ?, ?)",
  11. (key, sha256, content, method, db_conn.fmt_dt()))
  12. def document(sha256, *, allow_manual=True):
  13. row = db_conn.query_one("SELECT * FROM main_fan_documents WHERE id = ?", (f"{CACHE_VERSION}:{sha256}",))
  14. if row and row["method"] == "manual_transcription" and not allow_manual:
  15. return None
  16. return json.loads(row["facts_json"]) if row else None
  17. def save_analysis(user_name, session_id, result):
  18. value = dict(result)
  19. value["analysis_id"] = db_conn.new_id()
  20. db_conn.execute("INSERT INTO main_fan_analyses (id, user_name, session_id, result_json, created_at) VALUES (?, ?, ?, ?, ?)",
  21. (value["analysis_id"], user_name, session_id,
  22. json.dumps(value, ensure_ascii=False, allow_nan=False), db_conn.fmt_dt()))
  23. return value
  24. def canonical_result(value, user_name, session_id):
  25. """正式筛查只接受本次用户/会话实际运行工具生成的原件。"""
  26. if not value.get("analysis_id"):
  27. if value.get("status") == "completed":
  28. raise ValueError("主通风机已完成结果缺少工具生成的 analysis_id")
  29. return value
  30. row = db_conn.query_one("SELECT * FROM main_fan_analyses WHERE id = ? AND user_name = ? AND session_id = ?",
  31. (value["analysis_id"], user_name, session_id))
  32. if not row:
  33. raise ValueError("主通风机研判原件不存在或不属于当前会话")
  34. # 用数据库原件替换模型转述,禁止模型改写数值/状态后对外推送。
  35. return json.loads(row["result_json"])
  36. def create_workflow(user_name, session_id, context, stages):
  37. identifier, now = db_conn.new_id(), db_conn.fmt_dt()
  38. db_conn.execute("INSERT INTO main_fan_workflows (id,user_name,session_id,context_json,stages_json,status,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?)",
  39. (identifier,user_name,session_id,json.dumps(context,ensure_ascii=False,allow_nan=False),
  40. json.dumps(stages,ensure_ascii=False,allow_nan=False),'running',now,now))
  41. return identifier
  42. def update_workflow(identifier, *, context=None, stages=None, result=None, status="running"):
  43. values = {"status":status,"updated_at":db_conn.fmt_dt()}
  44. for name, value in (("context_json",context),("stages_json",stages),("result_json",result)):
  45. if value is not None:
  46. values[name]=json.dumps(value,ensure_ascii=False,allow_nan=False)
  47. sql="UPDATE main_fan_workflows SET "+", ".join(key+" = ?" for key in values)+" WHERE id = ?"
  48. db_conn.execute(sql,(*values.values(),identifier))
  49. def workflow(identifier, user_name, session_id):
  50. row=db_conn.query_one("SELECT * FROM main_fan_workflows WHERE id = ? AND user_name = ? AND session_id = ?",
  51. (identifier,user_name,session_id))
  52. if not row:
  53. raise ValueError("研判流程不存在或不属于当前会话")
  54. return {**row,"context":json.loads(row["context_json"]),"stages":json.loads(row["stages_json"]),
  55. "result":json.loads(row["result_json"]) if row["result_json"] else None}