project_task.py 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. from sqlalchemy import and_
  2. from datetime import datetime
  3. from typing import Optional
  4. import tools.db_helper as db_helper
  5. from core.dtos import ProjectTaskDto
  6. from core.models import ProjectTaskModel
  7. from core.user_session import UserSession
  8. class ProjectTaskStore:
  9. def __init__(self):
  10. # self._database= None
  11. self._database = 'Iwb_RailwayCosting'
  12. self._current_user = None
  13. @property
  14. def current_user(self):
  15. if self._current_user is None:
  16. self._current_user = UserSession.get_current_user()
  17. return self._current_user
  18. def get_tasks_paginated(
  19. self,
  20. project_id: str,
  21. item_code: str,
  22. page: int = 1,
  23. page_size: int = 10,
  24. keyword: Optional[str] = None,
  25. collect_status: Optional[int] = None,
  26. process_status: Optional[int] = None,
  27. send_status: Optional[int] = None,
  28. ) :
  29. """分页查询任务列表
  30. Args:
  31. page: 页码,从1开始
  32. page_size: 每页数量
  33. project_id: 项目编号
  34. item_code: 条目编号
  35. keyword: 关键字
  36. collect_status: 采集状态
  37. process_status: 处理状态
  38. send_status: 发送状态
  39. Returns:
  40. """
  41. with (db_helper.sqlserver_query_session(self._database) as db_session):
  42. query = db_session.query(ProjectTaskModel)
  43. # 构建查询条件
  44. conditions = [
  45. ProjectTaskModel.is_del == 0,
  46. ProjectTaskModel.project_id == project_id,
  47. # ProjectTaskModel.budget_id == budget_id,
  48. ProjectTaskModel.item_code.like(f"{item_code}%")
  49. ]
  50. if keyword:
  51. conditions.append(ProjectTaskModel.task_name.like(f'%{keyword}%'))
  52. if collect_status is not None:
  53. conditions.append(ProjectTaskModel.collect_status == collect_status)
  54. if process_status is not None:
  55. conditions.append(ProjectTaskModel.process_status == process_status)
  56. if send_status is not None:
  57. conditions.append(ProjectTaskModel.send_status == send_status)
  58. query = query.filter(and_(*conditions))
  59. # 计算总数
  60. total_count = query.count()
  61. # 分页
  62. query = query.order_by(ProjectTaskModel.created_at.desc())\
  63. .offset((page - 1) * page_size).limit(page_size)
  64. tasks = query.all()
  65. return {
  66. 'total': total_count,
  67. 'data': tasks
  68. }
  69. def get_tasks_paginated_bk(
  70. self,
  71. budget_id: int,
  72. project_id: str,
  73. item_code: str,
  74. page: int = 1,
  75. page_size: int = 10,
  76. keyword: Optional[str] = None,
  77. collect_status: Optional[int] = None,
  78. process_status: Optional[int] = None,
  79. send_status: Optional[int] = None,
  80. ) :
  81. """分页查询任务列表
  82. Args:
  83. page: 页码,从1开始
  84. page_size: 每页数量
  85. project_id: 项目编号
  86. budget_id: 概算序号
  87. item_code: 条目编号
  88. keyword: 关键字
  89. collect_status: 采集状态
  90. process_status: 处理状态
  91. send_status: 发送状态
  92. Returns:
  93. """
  94. with db_helper.sqlserver_query_session(self._database) as db_session:
  95. query = db_session.query(ProjectTaskModel)
  96. # 构建查询条件
  97. conditions = [
  98. ProjectTaskModel.is_del == 0,
  99. ProjectTaskModel.project_id == project_id,
  100. ProjectTaskModel.budget_id == budget_id,
  101. ProjectTaskModel.item_code.like(f"{item_code}%")
  102. ]
  103. if keyword:
  104. conditions.append(ProjectTaskModel.task_name.like(f'%{keyword}%'))
  105. if collect_status is not None:
  106. conditions.append(ProjectTaskModel.collect_status == collect_status)
  107. if process_status is not None:
  108. conditions.append(ProjectTaskModel.process_status == process_status)
  109. if send_status is not None:
  110. conditions.append(ProjectTaskModel.send_status == send_status)
  111. query = query.filter(and_(*conditions))
  112. # 计算总数
  113. total_count = query.count()
  114. # 分页
  115. query = query.order_by(ProjectTaskModel.created_at.desc()).offset((page - 1) * page_size).limit(page_size)
  116. tasks = query.all()
  117. return {
  118. 'total': total_count,
  119. 'data': tasks
  120. }
  121. def get_task(self, task_id: int) -> Optional[ProjectTaskModel]:
  122. with db_helper.sqlserver_query_session(self._database) as db_session:
  123. task = db_session.query(ProjectTaskModel).filter(
  124. and_(
  125. ProjectTaskModel.id == task_id,
  126. ProjectTaskModel.is_del == 0
  127. )).first()
  128. return task
  129. def get_task_dto(self, task_id: int) -> Optional[ProjectTaskDto]:
  130. """根据ID查询任务
  131. Args:
  132. task_id: 任务ID
  133. Returns:
  134. Optional[ProjectTaskDto]
  135. """
  136. task_dto = self.get_task(task_id)
  137. return ProjectTaskDto.from_model(task_dto) if task_dto else None
  138. def create_task(self, task_dto: ProjectTaskDto) -> ProjectTaskDto:
  139. """创建任务
  140. Args:
  141. task_dto: 任务DTO
  142. Returns:
  143. ProjectTaskDto
  144. """
  145. task = ProjectTaskModel(
  146. task_name=task_dto.task_name,
  147. task_desc=task_dto.task_desc,
  148. project_id=task_dto.project_id,
  149. budget_id=task_dto.budget_id,
  150. item_id=task_dto.item_id,
  151. item_code=task_dto.item_code,
  152. file_path=task_dto.file_path,
  153. created_by=self.current_user.username,
  154. created_at=datetime.now(),
  155. )
  156. with db_helper.sqlserver_session(self._database) as db_session:
  157. db_session.add(task)
  158. db_session.flush()
  159. return ProjectTaskDto.from_model(task)
  160. def update_task(self, task_dto: ProjectTaskDto) -> Optional[ProjectTaskDto]:
  161. """更新任务
  162. Args:
  163. task_dto: 任务DTO
  164. Returns:
  165. Optional[ProjectTaskDto]
  166. """
  167. task = self.get_task(task_dto.id)
  168. if not task:
  169. return None
  170. with db_helper.sqlserver_session(self._database) as db_session:
  171. task.task_name = task_dto.task_name
  172. task.task_desc = task_dto.task_desc
  173. # task.project_id = task_dto.project_id
  174. # task.budget_id = task_dto.budget_id
  175. # task.item_id = task_dto.item_id
  176. # task.item_code = task_dto.item_code
  177. # task.file_path = task_dto.file_path
  178. task.updated_by=self.current_user.username
  179. task.updated_at=datetime.now()
  180. task = db_session.merge(task)
  181. return ProjectTaskDto.from_model(task)
  182. def update_task_files(self, task_id: int,files: str):
  183. task = self.get_task(task_id)
  184. if not task:
  185. return None
  186. with db_helper.sqlserver_session(self._database) as db_session:
  187. task.file_path = files
  188. if task.collect_status != 0:
  189. task.collect_status = 4
  190. if task.process_status != 0:
  191. task.process_status = 4
  192. if task.send_status != 0:
  193. task.send_status = 4
  194. task.updated_by=self.current_user.username
  195. task.updated_at=datetime.now()
  196. task = db_session.merge(task)
  197. return ProjectTaskDto.from_model(task)
  198. def delete_task(self, task_id: int) -> bool:
  199. """删除任务
  200. Args:
  201. task_id: 任务ID
  202. Returns:
  203. bool
  204. """
  205. task = self.get_task(task_id)
  206. if not task:
  207. return False
  208. with db_helper.sqlserver_session(self._database) as db_session:
  209. task.is_del = 1
  210. task.deleted_by = self.current_user.username
  211. task.deleted_at = datetime.now()
  212. db_session.merge(task)
  213. return True
  214. def update_collect_status(self,task_id:int, status:int, err:str = None):
  215. task = self.get_task(task_id)
  216. if not task:
  217. return False
  218. with db_helper.sqlserver_session(self._database) as db_session:
  219. task.collect_status = status
  220. if err:
  221. task.collect_error = err
  222. task.collect_time = datetime.now()
  223. db_session.merge(task)
  224. return True
  225. def update_process_status(self,task_id:int, status:int, err:str = None):
  226. task = self.get_task(task_id)
  227. if not task:
  228. return False
  229. with db_helper.sqlserver_session(self._database) as db_session:
  230. task.process_status = status
  231. if err:
  232. task.process_error = err
  233. task.process_time = datetime.now()
  234. db_session.merge(task)
  235. return True
  236. def update_send_status(self,task_id:int, status:int, err:str = None):
  237. task = self.get_task(task_id)
  238. if not task:
  239. return False
  240. with db_helper.sqlserver_session(self._database) as db_session:
  241. task.send_status = status
  242. if err:
  243. task.send_error = err
  244. task.send_time = datetime.now()
  245. db_session.merge(task)
  246. return True