project_task.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  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 = (
  60. query.order_by(ProjectTaskModel.task_sort.desc())
  61. .order_by(ProjectTaskModel.created_at.desc())
  62. .offset((page - 1) * page_size)
  63. .limit(page_size)
  64. )
  65. tasks = query.all()
  66. return {"total": total_count, "data": tasks}
  67. def get_task_template_paginated(
  68. self,
  69. project_name: str,
  70. page: int = 1,
  71. page_size: int = 10,
  72. keyword: Optional[str] = None,
  73. ):
  74. """分页查询任务列表
  75. Args:
  76. page: 页码,从1开始
  77. page_size: 每页数量
  78. project_name: 项目编号
  79. keyword: 关键字
  80. Returns:
  81. """
  82. with db_helper.sqlserver_query_session(self._database) as db_session:
  83. query = db_session.query(ProjectTaskModel)
  84. # 构建查询条件
  85. conditions = [
  86. ProjectTaskModel.is_del == 0,
  87. ProjectTaskModel.is_template == 1,
  88. ProjectTaskModel.project_name.like(f"%{project_name}%"),
  89. ]
  90. if keyword:
  91. conditions.append(ProjectTaskModel.task_name.like(f"%{keyword}%"))
  92. conditions.append(ProjectTaskModel.created_by.like(f"%{keyword}%"))
  93. query = query.filter(and_(*conditions))
  94. # 计算总数
  95. total_count = query.count()
  96. # 分页
  97. query = (
  98. query.order_by(ProjectTaskModel.task_sort.desc())
  99. .order_by(ProjectTaskModel.created_at.desc())
  100. .offset((page - 1) * page_size)
  101. .limit(page_size)
  102. )
  103. tasks = query.all()
  104. return {"total": total_count, "data": tasks}
  105. def get_task(self, task_id: int) -> Optional[ProjectTaskModel]:
  106. with db_helper.sqlserver_query_session(self._database) as db_session:
  107. task = (
  108. db_session.query(ProjectTaskModel)
  109. .filter(
  110. and_(ProjectTaskModel.id == task_id, ProjectTaskModel.is_del == 0)
  111. )
  112. .first()
  113. )
  114. return task
  115. def get_task_dto(self, task_id: int) -> Optional[ProjectTaskDto]:
  116. """根据ID查询任务
  117. Args:
  118. task_id: 任务ID
  119. Returns:
  120. Optional[ProjectTaskDto]
  121. """
  122. task_dto = self.get_task(task_id)
  123. return ProjectTaskDto.from_model(task_dto) if task_dto else None
  124. def get_wait_tasks(self, project_id: str = None):
  125. """查询待处理的任务
  126. Args:
  127. project_id: 项目编号
  128. Returns:
  129. """
  130. with db_helper.sqlserver_query_session(self._database) as db_session:
  131. query = db_session.query(ProjectTaskModel)
  132. query = query.filter(
  133. and_(
  134. ProjectTaskModel.is_del == 0,
  135. ProjectTaskModel.process_status == TaskStatusEnum.WAIT.value,
  136. )
  137. )
  138. if project_id:
  139. query = query.filter(ProjectTaskModel.project_id == project_id)
  140. query.order_by(ProjectTaskModel.task_sort.desc())
  141. tasks = query.all()
  142. return [ProjectTaskDto.from_model(task) for task in tasks]
  143. def get_tasks_by_status(self, status: int):
  144. """查询指定状态的任务"""
  145. with db_helper.sqlserver_query_session(self._database) as db_session:
  146. query = db_session.query(ProjectTaskModel)
  147. query = query.filter(
  148. and_(
  149. ProjectTaskModel.is_del == 0,
  150. ProjectTaskModel.process_status == status,
  151. )
  152. )
  153. query.order_by(ProjectTaskModel.task_sort.desc())
  154. tasks = query.all()
  155. return [ProjectTaskDto.from_model(task) for task in tasks]
  156. def create_task(self, task_dto: ProjectTaskDto) -> ProjectTaskDto:
  157. """创建任务
  158. Args:
  159. task_dto: 任务DTO
  160. Returns:
  161. ProjectTaskDto
  162. """
  163. task = ProjectTaskModel(
  164. task_name=task_dto.task_name,
  165. task_desc=task_dto.task_desc,
  166. task_type=task_dto.task_type,
  167. is_template=task_dto.is_template,
  168. task_sort=task_dto.task_sort,
  169. project_id=task_dto.project_id,
  170. project_name=task_dto.project_name,
  171. budget_id=task_dto.budget_id,
  172. item_id=task_dto.item_id,
  173. item_code=task_dto.item_code,
  174. file_path=task_dto.file_path,
  175. created_by=self.current_user.username,
  176. created_at=datetime.now(),
  177. )
  178. with db_helper.sqlserver_session(self._database) as db_session:
  179. db_session.add(task)
  180. db_session.flush()
  181. return ProjectTaskDto.from_model(task)
  182. def update_task(self, task_dto: ProjectTaskDto) -> Optional[ProjectTaskDto]:
  183. """更新任务
  184. Args:
  185. task_dto: 任务DTO
  186. Returns:
  187. Optional[ProjectTaskDto]
  188. """
  189. task = self.get_task(task_dto.id)
  190. if not task:
  191. return None
  192. with db_helper.sqlserver_session(self._database) as db_session:
  193. task.task_name = task_dto.task_name
  194. task.task_desc = task_dto.task_desc
  195. task.task_sort = task_dto.task_sort
  196. task.budget_id = task_dto.budget_id
  197. # task.project_id = task_dto.project_id
  198. # task.item_id = task_dto.item_id
  199. # task.item_code = task_dto.item_code
  200. # task.file_path = task_dto.file_path
  201. task.updated_by = self.current_user.username
  202. task.updated_at = datetime.now()
  203. task = db_session.merge(task)
  204. return ProjectTaskDto.from_model(task)
  205. def update_task_files(self, task_id: int, files: str):
  206. task = self.get_task(task_id)
  207. if not task:
  208. return None
  209. with db_helper.sqlserver_session(self._database) as db_session:
  210. task.file_path = files
  211. if task.process_status != 0:
  212. task.process_status = 4
  213. if task.send_status != 0:
  214. task.send_status = 4
  215. task.updated_by = self.current_user.username
  216. task.updated_at = datetime.now()
  217. task = db_session.merge(task)
  218. return ProjectTaskDto.from_model(task)
  219. def delete_task(self, task_id: int) -> bool:
  220. """删除任务
  221. Args:
  222. task_id: 任务ID
  223. Returns:
  224. bool
  225. """
  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.is_del = 1
  231. task.deleted_by = self.current_user.username
  232. task.deleted_at = datetime.now()
  233. db_session.merge(task)
  234. return True
  235. def update_task_status(self, task_id: int, status: int, err: str = None):
  236. task = self.get_task(task_id)
  237. if not task:
  238. return False
  239. with db_helper.sqlserver_session(self._database) as db_session:
  240. task.process_status = status
  241. if err:
  242. task.process_error = err
  243. task.process_time = datetime.now()
  244. db_session.merge(task)
  245. return True
  246. def update_process_status(self, task_id: int, status: int, err: str = None):
  247. task = self.get_task(task_id)
  248. if not task:
  249. return False
  250. with db_helper.sqlserver_session(self._database) as db_session:
  251. task.process_status = status
  252. if err:
  253. task.process_error = err
  254. task.process_time = datetime.now()
  255. db_session.merge(task)
  256. return True
  257. def update_send_status(self, task_id: int, status: int, err: str = None):
  258. task = self.get_task(task_id)
  259. if not task:
  260. return False
  261. with db_helper.sqlserver_session(self._database) as db_session:
  262. task.send_status = status
  263. if err:
  264. task.send_error = err
  265. task.send_time = datetime.now()
  266. db_session.merge(task)
  267. return True