services_project.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. import threading,utils,os
  2. from models.project_data import ProjectModel,SubProjectModel, SubProjectItemModel
  3. from stores.project_store import ProjectStore
  4. import data_process,data_send
  5. class ProjectService:
  6. def __init__(self):
  7. self._project_store = ProjectStore()
  8. self._logger = utils.get_logger()
  9. def get_all_project_paginated(self, page: int, per_page: int, keyword: str = None) ->(list[ProjectModel], int):
  10. sub_project_list, total_count = self._project_store.query_project_all_paginated(page, per_page, keyword)
  11. return sub_project_list, total_count
  12. def get_project_by_id(self ,project_id:int):
  13. project = self._project_store.query_project_by_id(project_id)
  14. return project
  15. def add_project(self, project:ProjectModel):
  16. try:
  17. project.create_by = 'admin' if project.create_by is None else project.create_by
  18. self._project_store.insert_project(project)
  19. return True, ''
  20. except Exception as e:
  21. self._logger.error(f"添加项目失败:{e}")
  22. return False, '添加项目失败'
  23. def update_project(self, project:ProjectModel):
  24. project = self._project_store.query_project_by_id(project.id)
  25. if project:
  26. self._project_store.update_project(project)
  27. return True, ''
  28. else:
  29. return False, '项目不存在'
  30. def delete_project(self, project_id:int):
  31. project = self._project_store.query_project_by_id(project_id)
  32. if project:
  33. self._project_store.delete_project(project_id)
  34. return True,''
  35. else:
  36. return False, '项目不存在'
  37. def get_all_sub_project_paginated(self, project_id: int, page: int, per_page: int, keyword: str = None, status: int = None) ->(list[SubProjectModel], int):
  38. sub_project_list, total_count = self._project_store.query_sub_project_all_paginated(project_id, page, per_page, keyword, status)
  39. return sub_project_list, total_count
  40. def get_all_sub_project(self) ->list[SubProjectModel]:
  41. sub_project_list = self._project_store.query_sub_project_all()
  42. return sub_project_list
  43. def get_sub_project_by_id(self, sub_project_id:int) ->SubProjectModel:
  44. project = self._project_store.query_sub_project(sub_project_id)
  45. return project
  46. def save_sub_project(self, sub_project:SubProjectModel, project_files: list, delete_old: bool):
  47. if sub_project.id:
  48. sub_data = self._project_store.query_sub_project(sub_project.id)
  49. if not sub_data:
  50. return False, '子项目不存在'
  51. sub_data.sub_project_name = sub_project.sub_project_name
  52. sub_data.standard_version = sub_project.standard_version
  53. sub_data.work_catalog = sub_project.work_catalog
  54. sub_data.work_content = sub_project.work_content
  55. sub_data.status = 0
  56. self.update_sub_project(sub_data)
  57. else:
  58. sub_data = SubProjectModel(
  59. project_id=sub_project.project_id,
  60. sub_project_name=sub_project.sub_project_name,
  61. standard_version=sub_project.standard_version,
  62. work_catalog=sub_project.work_catalog,
  63. work_content=sub_project.work_content,
  64. file_paths="",
  65. status=0
  66. )
  67. new_id = self.add_sub_project(sub_data)
  68. sub_data.id = new_id
  69. try:
  70. # 处理文件上传逻辑
  71. if project_files:
  72. file_paths = self._process_file_upload(sub_data, project_files, delete_old)
  73. self.update_sub_project_file_paths(sub_data.id, file_paths)
  74. elif delete_old:
  75. return False,"请上传项目数据文件"
  76. return True, ''
  77. except ValueError as ve:
  78. return False,str(ve)
  79. except Exception as e:
  80. return False,f'服务器错误: {str(e)}'
  81. def _process_file_upload(self,sub_project: SubProjectModel, files: list, delete_old: bool) -> str:
  82. """处理文件上传流程"""
  83. base_path = utils.get_config_value('file.source_path', './temp_files')
  84. sub_project_dir = os.path.join(base_path, f'{sub_project.get_path()}')
  85. os.makedirs(sub_project_dir, exist_ok=True)
  86. self._logger.info(f"保存处理文件,项目ID:{sub_project.project_id},子项目ID:{sub_project.id}")
  87. if delete_old:
  88. if os.path.exists(sub_project_dir):
  89. for filename in os.listdir(sub_project_dir):
  90. file_path = os.path.join(sub_project_dir, filename)
  91. if os.path.isfile(file_path):
  92. os.remove(file_path)
  93. file_paths =[] if delete_old or not sub_project.file_paths else sub_project.file_paths.split(',')
  94. for file in files:
  95. if not file.filename:
  96. continue
  97. allowed_ext = {'xlsx', 'xls', 'csv'}
  98. ext = file.filename.rsplit('.', 1)[-1].lower()
  99. if ext not in allowed_ext:
  100. continue
  101. file_path = os.path.join(sub_project_dir, file.filename)
  102. file_path = file_path.replace('\\', '/')
  103. file.save(file_path)
  104. file_paths.append(file_path)
  105. return ','.join(file_paths)
  106. def add_sub_project(self, sub_project:SubProjectModel):
  107. return self._project_store.insert_sub_project(sub_project)
  108. def update_sub_project(self, sub_project:SubProjectModel):
  109. self._project_store.update_sub_project(sub_project)
  110. def update_sub_project_file_paths(self, sub_project_id: int, paths: str):
  111. self._project_store.update_sub_project_file_path(sub_project_id, paths)
  112. def start_sub_project_task(self, sub_project_id: int) -> (bool, str):
  113. data = self._project_store.query_sub_project(sub_project_id)
  114. if data:
  115. if data.status == 21 or data.status == 31:
  116. return False, '正在采集数据中'
  117. if data.status == 22 or data.status == 32:
  118. return False, '正在分析处理中'
  119. if data.status == 32 or data.status == 33:
  120. return False, '正在上传数据中'
  121. thread = threading.Thread(target = self._process_and_send_sub_project, args=(data,))
  122. thread.start()
  123. return True, ''
  124. else:
  125. return False, '项目不存在'
  126. def _process_and_send_sub_project(self, sub_project: SubProjectModel) :
  127. # 启动分析处理
  128. if data_process.process_project(sub_project):
  129. # 更新远程数据
  130. data_send.send_project_data(sub_project)
  131. self._project_store.update_sub_project_status(sub_project.id, 5)
  132. def process_sub_project(self, sub_project_id:int):
  133. data = self._project_store.query_sub_project(sub_project_id)
  134. if data:
  135. if data.status == 21 or data.status == 31:
  136. return False, '正在采集数据中'
  137. if data.status == 22 or data.status == 32:
  138. return False, '正在分析处理中'
  139. if data.status == 32 or data.status == 33:
  140. return False, '正在上传数据中'
  141. thread = threading.Thread(target=self._process_sub_project, args=(data,))
  142. thread.start()
  143. return True, ''
  144. else:
  145. return False, '项目不存在'
  146. def _process_sub_project(self, sub_project: SubProjectModel):
  147. if data_process.process_data(sub_project):
  148. return True, ''
  149. else:
  150. self._logger.error(f"分析处理失败:{sub_project.sub_project_name}")
  151. return False, '分析处理失败'
  152. def start_send_sub_project(self, sub_project_id: int) -> (bool, str):
  153. data = self._project_store.query_sub_project(sub_project_id)
  154. if data:
  155. if data.status == 21 or data.status == 31:
  156. return False, '正在采集数据中'
  157. if data.status == 22 or data.status == 32:
  158. return False, '正在分析处理中'
  159. if data.status == 32 or data.status == 33:
  160. return False, '正在上传数据中'
  161. thread = threading.Thread(target=self._send_sub_project_data, args=(data,))
  162. thread.start()
  163. def _send_sub_project_data(self, project: SubProjectModel):
  164. if data_send.send_project_data(project):
  165. self._project_store.update_sub_project_status(project.id, 5)
  166. return True, ''
  167. else:
  168. return False, '上传数据失败'
  169. def delete_sub_project(self, sub_project_id:int):
  170. project = self._project_store.query_sub_project(sub_project_id)
  171. if project:
  172. self._project_store.delete_sub_project(sub_project_id)
  173. return True,''
  174. else:
  175. return False, '项目不存在'
  176. def get_sub_project_item_list_by_sub_project_paginated(self, project_id: int, page: int, per_page: int, keyword: str = None, process_status:int = None, send_status:int=None) -> (list[SubProjectItemModel], int):
  177. return self._project_store.query_sub_project_items_by_project_paginated(project_id, page, per_page, keyword, process_status, send_status)
  178. def get_sub_project_item_list_by_sub_project_id(self, project_id:int) ->list[SubProjectItemModel]:
  179. return self._project_store.query_sub_project_items_by_project(project_id)
  180. def get_sub_project_item_by_id(self, item_id: int):
  181. return self._project_store.query_sub_project_item_by_id(item_id)
  182. def add_sub_project_item(self, item:SubProjectItemModel):
  183. project = self._project_store.query_sub_project(item.sub_project_id)
  184. project_item = SubProjectItemModel(
  185. project_id=project.project_id,
  186. sub_project_id=item.sub_project_id,
  187. device_name=item.device_name,
  188. device_model=item.device_model,
  189. device_unit=item.device_unit,
  190. standard_version=project.standard_version,
  191. standard_no=item.standard_no,
  192. )
  193. return self._project_store.insert_sub_project_item(project_item)
  194. def update_sub_project_item(self, item:SubProjectItemModel):
  195. project_item = self._project_store.query_sub_project_item_by_id(item.id)
  196. if project_item:
  197. project_item.device_name = item.device_name
  198. project_item.device_model = item.device_model
  199. project_item.device_unit = item.device_unit
  200. project_item.device_count = float(item.device_count)
  201. project_item.standard_no = item.standard_no
  202. self._project_store.update_sub_project_item(project_item)
  203. return True
  204. else:
  205. return False
  206. def delete_sub_project_item(self, item_id:int):
  207. project_item = self._project_store.query_sub_project_item_by_id(item_id)
  208. if project_item:
  209. self._project_store.delete_sub_project_item_by_id(project_item.id)
  210. return True
  211. else:
  212. return False
  213. def start_process_item(self, item_id:int):
  214. project_item = self._project_store.query_sub_project_item_by_id(item_id)
  215. if not project_item:
  216. return False, '项目不存在'
  217. thread = threading.Thread(target=self._process_sub_project_item, args=(project_item,))
  218. thread.start()
  219. return True,""
  220. def _process_sub_project_item(self, sub_project_item:SubProjectItemModel):
  221. if data_process.process_item(sub_project_item):
  222. return data_send.send_item_data(sub_project_item),""
  223. else:
  224. self._logger.error(f"分析处理失败:{sub_project_item.device_name}")
  225. return False, '分析处理失败'
  226. def start_send_item(self, item_id:int):
  227. project_item = self._project_store.query_sub_project_item_by_id(item_id)
  228. if not project_item:
  229. return False, '项目不存在'
  230. thread = threading.Thread(target=self._send_sub_project_item, args=(project_item,))
  231. thread.start()
  232. return True,""
  233. def _send_sub_project_item(self, sub_project_item:SubProjectItemModel):
  234. if data_send.send_item_data(sub_project_item):
  235. return True, ''
  236. else:
  237. self._logger.error(f"上传失败:{sub_project_item.device_name}")
  238. return False, '上传数据失败'