project_task.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  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.enum import TaskStatusEnum
  7. from core.models import ProjectTaskModel
  8. from core.user_session import UserSession
  9. class ProjectTaskStore:
  10. def __init__(self):
  11. # self._database= None
  12. self._database = 'Iwb_RailwayCosting'
  13. self._current_user = None
  14. @property
  15. def current_user(self):
  16. if self._current_user is None:
  17. self._current_user = UserSession.get_current_user()
  18. return self._current_user
  19. def get_tasks_paginated(
  20. self,
  21. project_id: str,
  22. item_code: str,
  23. page: int = 1,
  24. page_size: int = 10,
  25. keyword: Optional[str] = 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. process_status: 处理状态
  37. send_status: 发送状态
  38. Returns:
  39. """
  40. with (db_helper.sqlserver_query_session(self._database) as db_session):
  41. query = db_session.query(ProjectTaskModel)
  42. # 构建查询条件
  43. conditions = [
  44. ProjectTaskModel.is_del == 0,
  45. ProjectTaskModel.project_id == project_id,
  46. # ProjectTaskModel.budget_id == budget_id,
  47. ProjectTaskModel.item_code.like(f"{item_code}%")
  48. ]
  49. if keyword:
  50. conditions.append(ProjectTaskModel.task_name.like(f'%{keyword}%'))
  51. if process_status is not None:
  52. conditions.append(ProjectTaskModel.process_status == process_status)
  53. if send_status is not None:
  54. conditions.append(ProjectTaskModel.send_status == send_status)
  55. query = query.filter(and_(*conditions))
  56. # 计算总数
  57. total_count = query.count()
  58. # 分页
  59. query = query.order_by(ProjectTaskModel.task_sort.desc())\
  60. .order_by(ProjectTaskModel.created_at.desc())\
  61. .offset((page - 1) * page_size).limit(page_size)
  62. tasks = query.all()
  63. return {
  64. 'total': total_count,
  65. 'data': tasks
  66. }
  67. def get_task(self, task_id: int) -> Optional[ProjectTaskModel]:
  68. with db_helper.sqlserver_query_session(self._database) as db_session:
  69. task = db_session.query(ProjectTaskModel).filter(
  70. and_(
  71. ProjectTaskModel.id == task_id,
  72. ProjectTaskModel.is_del == 0
  73. )).first()
  74. return task
  75. def get_task_dto(self, task_id: int) -> Optional[ProjectTaskDto]:
  76. """根据ID查询任务
  77. Args:
  78. task_id: 任务ID
  79. Returns:
  80. Optional[ProjectTaskDto]
  81. """
  82. task_dto = self.get_task(task_id)
  83. return ProjectTaskDto.from_model(task_dto) if task_dto else None
  84. def get_wait_tasks(self,project_id:str=None):
  85. """查询待处理的任务
  86. Args:
  87. project_id: 项目编号
  88. Returns:
  89. """
  90. with db_helper.sqlserver_query_session(self._database) as db_session:
  91. query = db_session.query(ProjectTaskModel)
  92. query = query.filter(
  93. and_(
  94. ProjectTaskModel.is_del == 0,
  95. ProjectTaskModel.process_status == TaskStatusEnum.WAIT.value))
  96. if project_id:
  97. query = query.filter(ProjectTaskModel.project_id == project_id)
  98. query.order_by(ProjectTaskModel.task_sort.desc())
  99. tasks = query.all()
  100. return [ProjectTaskDto.from_model(task) for task in tasks]
  101. def create_task(self, task_dto: ProjectTaskDto) -> ProjectTaskDto:
  102. """创建任务
  103. Args:
  104. task_dto: 任务DTO
  105. Returns:
  106. ProjectTaskDto
  107. """
  108. task = ProjectTaskModel(
  109. task_name=task_dto.task_name,
  110. task_desc=task_dto.task_desc,
  111. task_sort=task_dto.task_sort,
  112. project_id=task_dto.project_id,
  113. budget_id=task_dto.budget_id,
  114. item_id=task_dto.item_id,
  115. item_code=task_dto.item_code,
  116. file_path=task_dto.file_path,
  117. created_by=self.current_user.username,
  118. created_at=datetime.now(),
  119. )
  120. with db_helper.sqlserver_session(self._database) as db_session:
  121. db_session.add(task)
  122. db_session.flush()
  123. return ProjectTaskDto.from_model(task)
  124. def update_task(self, task_dto: ProjectTaskDto) -> Optional[ProjectTaskDto]:
  125. """更新任务
  126. Args:
  127. task_dto: 任务DTO
  128. Returns:
  129. Optional[ProjectTaskDto]
  130. """
  131. task = self.get_task(task_dto.id)
  132. if not task:
  133. return None
  134. with db_helper.sqlserver_session(self._database) as db_session:
  135. task.task_name = task_dto.task_name
  136. task.task_desc = task_dto.task_desc
  137. task.task_sort = task_dto.task_sort
  138. task.budget_id = task_dto.budget_id
  139. # task.project_id = task_dto.project_id
  140. # task.item_id = task_dto.item_id
  141. # task.item_code = task_dto.item_code
  142. # task.file_path = task_dto.file_path
  143. task.updated_by=self.current_user.username
  144. task.updated_at=datetime.now()
  145. task = db_session.merge(task)
  146. return ProjectTaskDto.from_model(task)
  147. def update_task_files(self, task_id: int,files: str):
  148. task = self.get_task(task_id)
  149. if not task:
  150. return None
  151. with db_helper.sqlserver_session(self._database) as db_session:
  152. task.file_path = files
  153. if task.process_status != 0:
  154. task.process_status = 4
  155. if task.send_status != 0:
  156. task.send_status = 4
  157. task.updated_by=self.current_user.username
  158. task.updated_at=datetime.now()
  159. task = db_session.merge(task)
  160. return ProjectTaskDto.from_model(task)
  161. def delete_task(self, task_id: int) -> bool:
  162. """删除任务
  163. Args:
  164. task_id: 任务ID
  165. Returns:
  166. bool
  167. """
  168. task = self.get_task(task_id)
  169. if not task:
  170. return False
  171. with db_helper.sqlserver_session(self._database) as db_session:
  172. task.is_del = 1
  173. task.deleted_by = self.current_user.username
  174. task.deleted_at = datetime.now()
  175. db_session.merge(task)
  176. return True
  177. def update_task_status(self,task_id:int, status:int, err:str = None):
  178. task = self.get_task(task_id)
  179. if not task:
  180. return False
  181. with db_helper.sqlserver_session(self._database) as db_session:
  182. task.process_status = status
  183. if err:
  184. task.process_error = err
  185. task.process_time = datetime.now()
  186. db_session.merge(task)
  187. return True
  188. def update_process_status(self,task_id:int, status:int, err:str = None):
  189. task = self.get_task(task_id)
  190. if not task:
  191. return False
  192. with db_helper.sqlserver_session(self._database) as db_session:
  193. task.process_status = status
  194. if err:
  195. task.process_error = err
  196. task.process_time = datetime.now()
  197. db_session.merge(task)
  198. return True
  199. def update_send_status(self,task_id:int, status:int, err:str = None):
  200. task = self.get_task(task_id)
  201. if not task:
  202. return False
  203. with db_helper.sqlserver_session(self._database) as db_session:
  204. task.send_status = status
  205. if err:
  206. task.send_error = err
  207. task.send_time = datetime.now()
  208. db_session.merge(task)
  209. return True