process.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import utils,json
  2. from stores.project_store import ProjectStore
  3. from models.project_data import SubProjectModel, SubProjectItemModel
  4. from ai.fast_gpt import FastGPTAi
  5. class Process:
  6. def __init__(self):
  7. self._logger= utils.get_logger()
  8. self._project_store= ProjectStore()
  9. self._ai = FastGPTAi()
  10. self._data={}
  11. def run(self, sub_project: SubProjectModel) ->bool:
  12. try:
  13. self._logger.debug(f"开始处理数据:{sub_project.sub_project_name}[{sub_project.id}]")
  14. self._project_store.update_sub_project_status(sub_project.id, 22)
  15. project_items = self._project_store.query_sub_project_items_by_project(sub_project.id)
  16. for project_item in project_items:
  17. self.process_item(project_item)
  18. self._project_store.update_sub_project_status(sub_project.id, 32)
  19. self._logger.info(f"处理数据完成:{sub_project.sub_project_name}[{sub_project.id}]")
  20. return True
  21. except Exception as e:
  22. self._logger.error(f"处理数据失败:{e}")
  23. self._project_store.update_sub_project_status(sub_project.id, 12)
  24. return False
  25. def process_item(self, sub_project_item: SubProjectItemModel) ->bool:
  26. try:
  27. self._logger.debug(f"开始处理明细:{sub_project_item.device_name}{sub_project_item.device_model}[{sub_project_item.id}]")
  28. self._project_store.update_sub_project_item_process_status(sub_project_item.id, 1)
  29. data = self.call_ai(sub_project_item)
  30. self._project_store.update_sub_project_item_standard_no(sub_project_item.id, data.standard_no)
  31. return True
  32. except Exception as e:
  33. self._logger.error(f"处理数据明细:{e}")
  34. self._project_store.update_sub_project_item_process_status(sub_project_item.id, 3)
  35. return False
  36. def call_ai(self, item: SubProjectItemModel) -> SubProjectItemModel:
  37. try:
  38. self._logger.info(f"开始处理数据:{item.id}")
  39. msg = """
  40. 请分析提供的json数据,要求:
  41. 1. 根据工作内容、类型、项目名称、规格型号、数量、单位查找计算出定额编号
  42. 3. 提供的数据结构化信息:```typescript
  43. export interface item {
  44. i: // ID
  45. n: string; //物料名称
  46. m: string; //型号规格
  47. u:string; //单位
  48. c: float; //数量
  49. }
  50. ```
  51. 4. 需返回的结构体:```typescript
  52. export interface item {
  53. i: int; // ID 与提供的ID保持一致
  54. s: string; // 定额编号
  55. }
  56. ```
  57. 5. 返回结构体item的json字符串,压缩成一行。
  58. 6. 数据如下:
  59. """
  60. msg += json.dumps(item.to_ai_json())
  61. api_key = utils.get_config_value("fastgpt.api_key_process")
  62. self._logger.info(f"开始调用AI:\n {msg}")
  63. json_data = self._ai.call_ai(msg, api_key)
  64. self._logger.info(f"AI返回结果:{json_data}")
  65. if not json_data:
  66. raise Exception("AI返回结果为空")
  67. # 检查 json_data 是否为数组,并取第一项
  68. if isinstance(json_data, list):
  69. json_data = json_data[0]
  70. data = SubProjectItemModel(
  71. item_id=json_data["i"],
  72. standard_no=json_data["s"]
  73. )
  74. return data
  75. except Exception as e:
  76. self._logger.error(f"AI调用失败:{e}")
  77. raise Exception(f"AI调用失败:{e}")
  78. @staticmethod
  79. def prompt_template(project, items) ->str:
  80. text = f"""
  81. 请分析提供的json数据,要求:
  82. 1. 根据工作内容、类型、项目名称、规格型号、数量、单位查找计算出定额编号
  83. 2. 工程的工作内容及类型:{project.work_content}"""
  84. text += """
  85. 3. 提供的数据结构化信息:```typescript
  86. export interface item {
  87. i: // ID
  88. n: string; //物料名称
  89. m: string; //型号规格
  90. u:string; //单位
  91. c: float; //数量
  92. }
  93. ```
  94. 4. 需返回的结构体:```typescript
  95. export interface item {
  96. i: int; // ID 与提供的ID保持一致
  97. s: string; // 定额编号
  98. }
  99. ```
  100. 5. 返回结构体item的数组的json数组格式,压缩成一行。
  101. 6. 数据如下:
  102. """
  103. item_ai_json = SubProjectItemModel.list_to_ai_json(items)
  104. text += json.dumps(item_ai_json,ensure_ascii=False, separators=(',', ':'))
  105. return text
  106. def call_ai_batch(self, message:str) ->list[SubProjectItemModel]:
  107. try:
  108. api_key = utils.get_config_value("fastgpt.api_key_process")
  109. self._logger.info(f"开始调用AI:\n {message}")
  110. json_data = self._ai.call_ai(message,api_key)
  111. self._logger.info(f"AI返回结果:{json_data}")
  112. if not json_data:
  113. raise Exception("AI返回结果为空")
  114. data=[]
  115. for item in json_data:
  116. data.append(SubProjectItemModel(
  117. item_id=item["i"],
  118. standard_no=item["s"]
  119. ))
  120. return data
  121. except Exception as e:
  122. self._logger.error(f"AI调用失败:{e}")
  123. raise Exception(f"AI调用失败:{e}")