__init__.py 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. import json
  2. import random
  3. from sqlalchemy import create_engine, select
  4. from utils.StripTagsHTMLParser import *
  5. from sqlalchemy.orm import Session
  6. import traceback
  7. from models import *
  8. from common.db import db_task
  9. from common.security import valid_access_token
  10. from datetime import datetime, timedelta
  11. from fastapi import APIRouter, Depends, HTTPException, Response, Query
  12. from database import get_db
  13. from pydantic import BaseModel
  14. from utils import *
  15. from common.db import db_event_management
  16. router = APIRouter()
  17. @router.post('/create')
  18. async def create_task(
  19. request: Request,
  20. db: Session = Depends(get_db),
  21. body=Depends(remove_xss_json),
  22. user_id=Depends(valid_access_token)):
  23. try:
  24. # 验证必需的字段
  25. required_fields = ['task_description', 'unit_name', 'registrar','event_code']
  26. missing_fields = [field for field in required_fields if field not in body]
  27. if missing_fields:
  28. raise HTTPException(status_code=401, detail=f"Missing required fields: {', '.join(missing_fields)}")
  29. event_code = db.query(EventBase).filter(EventBase.event_code == body.get('event_code')).first()
  30. if not event_code:
  31. return Response(content="事件不存在", status_code=400)
  32. task_id = db_task.get_next_event_id(db)
  33. task_base = TaskRegistration(
  34. **body,
  35. task_id=task_id
  36. )
  37. db.add(task_base)
  38. db.commit()
  39. return {
  40. "code": 200,
  41. "msg": "任务创建成功",
  42. "data": task_id
  43. }
  44. except Exception as e:
  45. db.rollback()
  46. traceback.print_exc()
  47. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  48. class TaskQuery(BaseModel):
  49. task_id: str = None
  50. task_description: str = None
  51. unit_name: str = None
  52. registrar: str = None
  53. creation_time: str = None
  54. processing_status: str = None
  55. @router.post('/select')
  56. @router.get('/select')
  57. async def select_tasks(
  58. request: Request,
  59. db: Session = Depends(get_db),
  60. query: TaskQuery = Depends(),
  61. sortBy: str = Query(None, description="排序字段"),
  62. sortOrder: str = Query(None, description="排序顺序"),
  63. user_id=Depends(valid_access_token),
  64. pageNum: int = Query(1, gt=0, description="页码"),
  65. event_code: str = Query(None, description="事件ID"),
  66. pageSize: int = Query(10, gt=0, le=100, description="每页大小")):
  67. try:
  68. missing_event_code = db.query(EventBase).filter(EventBase.event_code == event_code).first()
  69. # print(missing_event_code)
  70. if not missing_event_code:
  71. return Response(content="事件不存在", status_code=400)
  72. data_query = db.query(TaskRegistration).filter(TaskRegistration.del_flag != '2')
  73. data_query = data_query.filter(TaskRegistration.event_code == event_code)
  74. # 应用过滤条件
  75. if query.task_id:
  76. data_query = data_query.filter(TaskRegistration.task_id == query.task_id)
  77. if query.task_description:
  78. data_query = data_query.filter(TaskRegistration.task_description == query.task_description)
  79. if query.unit_name:
  80. data_query = data_query.filter(TaskRegistration.unit_name == query.unit_name)
  81. if query.registrar:
  82. data_query = data_query.filter(TaskRegistration.registrar == query.registrar)
  83. if query.creation_time:
  84. data_query = data_query.filter(TaskRegistration.creation_time == query.creation_time)
  85. if query.processing_status:
  86. data_query = data_query.filter(TaskRegistration.processing_status == query.processing_status)
  87. # print(TaskRegistration,sortBy)
  88. if sortBy:
  89. if hasattr(TaskRegistration, sortBy):
  90. print("xx")
  91. sort_attr = getattr(TaskRegistration, sortBy)
  92. data_query = data_query.order_by(sort_attr.asc() if sortOrder == 'asc' else sort_attr.desc())
  93. total_count = data_query.count()
  94. offset = (pageNum - 1) * pageSize
  95. data_query = data_query.offset(offset).limit(pageSize)
  96. tasks = data_query.all()
  97. return {
  98. "code": 200,
  99. "msg": "任务查询成功",
  100. "data": tasks,
  101. "total": total_count,
  102. "pages": (total_count + pageSize - 1) // pageSize,
  103. "current_page": pageNum,
  104. "page_size": pageSize
  105. }
  106. except Exception as e:
  107. db.rollback()
  108. traceback.print_exc()
  109. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  110. @router.put('/update')
  111. async def update_task_status(
  112. request: Request,
  113. db: Session = Depends(get_db),
  114. user_id=Depends(valid_access_token)):
  115. body = await request.json()
  116. task_id_to_use = body.get('task_id')
  117. processing_status = body.get('processing_status')
  118. event_code = db.query(EventBase).filter(EventBase.event_code == body.get('event_code')).first()
  119. if not event_code:
  120. return Response(content="事件不存在", status_code=400)
  121. if not task_id_to_use:
  122. return Response(content="Missing required parameter 'task_id'", status_code=400)
  123. if processing_status not in ['已完成', '处理中', '待处理','未完成']:
  124. return Response(content="processing_status must be '已完成' or '处理中' or '待处理' or '未完成'", status_code=400)
  125. task_entry = (db.query(TaskRegistration)
  126. .filter(TaskRegistration.del_flag != '2')
  127. .filter(TaskRegistration.task_id == task_id_to_use))
  128. task_entry = task_entry.first()
  129. if not task_entry:
  130. raise HTTPException(status_code=404, detail="任务不存在")
  131. task_entry.processing_status = processing_status
  132. task_entry.update_time = datetime.now()
  133. try:
  134. db.commit()
  135. return {
  136. "code": 200,
  137. "msg": "任务状态更新成功",
  138. "data": {
  139. "task_id": task_id_to_use,
  140. "processing_status": task_entry.processing_status,
  141. "update_time": task_entry.update_time.isoformat()
  142. }
  143. }
  144. except Exception as e:
  145. db.rollback()
  146. raise HTTPException(status_code=500, detail=str(e))
  147. @router.delete('/delete')
  148. async def delete_task(
  149. request: Request,
  150. db: Session = Depends(get_db),
  151. user_id=Depends(valid_access_token)):
  152. try:
  153. body = await request.json()
  154. task_id_to_use = body.get('taskID')
  155. if not task_id_to_use:
  156. raise HTTPException(status_code=400, detail="Missing required parameter 'taskID'")
  157. event_code = db.query(EventBase).filter(EventBase.event_code == body.get('event_code')).first()
  158. if not event_code:
  159. return Response(content="事件不存在", status_code=400)
  160. task_entry = db.query(TaskRegistration).filter(TaskRegistration.task_id == task_id_to_use).first()
  161. if not task_entry:
  162. raise HTTPException(status_code=404, detail="任务不存在")
  163. task_entry.del_flag = '2'
  164. try:
  165. db.commit()
  166. return {
  167. "code": 200,
  168. "msg": "任务删除成功",
  169. "data": {
  170. "task_id": task_entry.task_id
  171. }
  172. }
  173. except Exception as e:
  174. db.rollback()
  175. raise HTTPException(status_code=500, detail=f"An error occurred while deleting the task: {str(e)}")
  176. except HTTPException as e:
  177. raise e
  178. except Exception as e:
  179. db.rollback()
  180. raise HTTPException(status_code=500, detail=f"An unexpected error occurred: {str(e)}")
  181. @router.get('/selectUnit')
  182. async def select_unit(
  183. request: Request,
  184. db: Session = Depends(get_db),
  185. query: TaskQuery = Depends(),
  186. user_id=Depends(valid_access_token),
  187. ):
  188. try:
  189. data_query = db.query(TaskUnit).filter(TaskUnit.id != '2').all()
  190. return {
  191. "code": 200,
  192. "msg": "查询成功",
  193. "data": data_query
  194. }
  195. except HTTPException as e:
  196. raise e
  197. except Exception as e:
  198. db.rollback()
  199. raise HTTPException(status_code=500, detail=f"An unexpected error occurred: {str(e)}")
  200. #
  201. # 小屏专用,不敢搞大屏相关代码
  202. #
  203. @router.get('/list')
  204. async def select_tasks(
  205. request: Request,
  206. task_type: str = Query(None),
  207. processing_status: str = Query(None),
  208. task_description: str = Query(None),
  209. page: int = Query(1, gt=0, description="页码"),
  210. page_size: int = Query(10, gt=0, le=100, description="每页大小"),
  211. db: Session = Depends(get_db)):
  212. try:
  213. data_query = db.query(TaskRegistration).filter(TaskRegistration.del_flag != '2').filter(TaskRegistration.event_code is not None)
  214. # 应用过滤条件
  215. if task_type is not None:
  216. data_query = data_query.filter(TaskRegistration.task_type == task_type)
  217. if task_description is not None:
  218. data_query = data_query.filter(TaskRegistration.task_description == task_description)
  219. if processing_status is not None:
  220. data_query = data_query.filter(TaskRegistration.processing_status == processing_status)
  221. total_count = data_query.count()
  222. offset = (page - 1) * page_size
  223. data_query = data_query.order_by(TaskRegistration.creation_time.desc()).offset(offset).limit(page_size)
  224. data = []
  225. tasks = data_query.all()
  226. for n in tasks:
  227. task = get_model_dict(n)
  228. task['creation_time'] = get_datetime_str(task['creation_time'])
  229. task['event_name'] = db_event_management.get_event_title(db, n.event_code)
  230. data.append(task)
  231. return {
  232. "code": 200,
  233. "msg": "任务查询成功",
  234. "data": data,
  235. "total": total_count
  236. }
  237. except Exception as e:
  238. traceback.print_exc()
  239. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")