__init__.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439
  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. from sqlalchemy import text, exists, and_, or_, not_
  7. import traceback
  8. from models import *
  9. from common.db import db_task
  10. from common.security import valid_access_token
  11. from datetime import datetime, timedelta
  12. from fastapi import APIRouter, Depends, HTTPException, Response, Query
  13. from database import get_db
  14. from pydantic import BaseModel
  15. from utils import *
  16. import copy
  17. from common.db import db_event_management, db_user
  18. router = APIRouter()
  19. @router.post('/create')
  20. async def create_task(
  21. request: Request,
  22. db: Session = Depends(get_db),
  23. body=Depends(remove_xss_json),
  24. user_id=Depends(valid_access_token)):
  25. try:
  26. # 验证必需的字段
  27. required_fields = ['task_description', 'unit_name', 'registrar','event_code']
  28. missing_fields = [field for field in required_fields if field not in body]
  29. if missing_fields:
  30. raise HTTPException(status_code=401, detail=f"Missing required fields: {', '.join(missing_fields)}")
  31. event_code = db.query(EventBase).filter(EventBase.event_code == body.get('event_code')).first()
  32. if not event_code:
  33. return Response(content="事件不存在", status_code=400)
  34. task_id = db_task.get_next_event_id(db)
  35. task_base = TaskRegistration(
  36. **body,
  37. task_id=task_id
  38. )
  39. db.add(task_base)
  40. db.commit()
  41. return {
  42. "code": 200,
  43. "msg": "任务创建成功",
  44. "data": task_id
  45. }
  46. except Exception as e:
  47. db.rollback()
  48. traceback.print_exc()
  49. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  50. class TaskQuery(BaseModel):
  51. task_id: str = None
  52. task_description: str = None
  53. unit_name: str = None
  54. registrar: str = None
  55. creation_time: str = None
  56. processing_status: str = None
  57. @router.post('/select')
  58. @router.get('/select')
  59. async def select_tasks(
  60. request: Request,
  61. db: Session = Depends(get_db),
  62. query: TaskQuery = Depends(),
  63. sortBy: str = Query(None, description="排序字段"),
  64. sortOrder: str = Query(None, description="排序顺序"),
  65. user_id=Depends(valid_access_token),
  66. pageNum: int = Query(1, gt=0, description="页码"),
  67. event_code: str = Query(None, description="事件ID"),
  68. pageSize: int = Query(10, gt=0, le=100, description="每页大小")):
  69. try:
  70. missing_event_code = db.query(EventBase).filter(EventBase.event_code == event_code).first()
  71. # print(missing_event_code)
  72. if not missing_event_code:
  73. return Response(content="事件不存在", status_code=400)
  74. data_query = db.query(TaskRegistration).filter(TaskRegistration.del_flag != '2')
  75. data_query = data_query.filter(TaskRegistration.event_code == event_code)
  76. # 应用过滤条件
  77. if query.task_id:
  78. data_query = data_query.filter(TaskRegistration.task_id == query.task_id)
  79. if query.task_description:
  80. data_query = data_query.filter(TaskRegistration.task_description == query.task_description)
  81. if query.unit_name:
  82. data_query = data_query.filter(TaskRegistration.unit_name == query.unit_name)
  83. if query.registrar:
  84. data_query = data_query.filter(TaskRegistration.registrar == query.registrar)
  85. if query.creation_time:
  86. data_query = data_query.filter(TaskRegistration.creation_time == query.creation_time)
  87. if query.processing_status:
  88. data_query = data_query.filter(TaskRegistration.processing_status == query.processing_status)
  89. # print(TaskRegistration,sortBy)
  90. if sortBy:
  91. if hasattr(TaskRegistration, sortBy):
  92. print("xx")
  93. sort_attr = getattr(TaskRegistration, sortBy)
  94. data_query = data_query.order_by(sort_attr.asc() if sortOrder == 'asc' else sort_attr.desc())
  95. total_count = data_query.count()
  96. offset = (pageNum - 1) * pageSize
  97. data_query = data_query.offset(offset).limit(pageSize)
  98. tasks = data_query.all()
  99. return {
  100. "code": 200,
  101. "msg": "任务查询成功",
  102. "data": tasks,
  103. "total": total_count,
  104. "pages": (total_count + pageSize - 1) // pageSize,
  105. "current_page": pageNum,
  106. "page_size": pageSize
  107. }
  108. except Exception as e:
  109. db.rollback()
  110. traceback.print_exc()
  111. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  112. @router.put('/update')
  113. async def update_task_status(
  114. request: Request,
  115. db: Session = Depends(get_db),
  116. user_id=Depends(valid_access_token)):
  117. body = await request.json()
  118. task_id_to_use = body.get('task_id')
  119. processing_status = body.get('processing_status')
  120. event_code = db.query(EventBase).filter(EventBase.event_code == body.get('event_code')).first()
  121. if not event_code:
  122. return Response(content="事件不存在", status_code=400)
  123. if not task_id_to_use:
  124. return Response(content="Missing required parameter 'task_id'", status_code=400)
  125. if processing_status not in ['已完成', '处理中', '待处理','未完成']:
  126. return Response(content="processing_status must be '已完成' or '处理中' or '待处理' or '未完成'", status_code=400)
  127. task_entry = (db.query(TaskRegistration)
  128. .filter(TaskRegistration.del_flag != '2')
  129. .filter(TaskRegistration.task_id == task_id_to_use))
  130. task_entry = task_entry.first()
  131. if not task_entry:
  132. raise HTTPException(status_code=404, detail="任务不存在")
  133. task_entry.processing_status = processing_status
  134. task_entry.update_time = datetime.now()
  135. try:
  136. db.commit()
  137. return {
  138. "code": 200,
  139. "msg": "任务状态更新成功",
  140. "data": {
  141. "task_id": task_id_to_use,
  142. "processing_status": task_entry.processing_status,
  143. "update_time": task_entry.update_time.isoformat()
  144. }
  145. }
  146. except Exception as e:
  147. db.rollback()
  148. raise HTTPException(status_code=500, detail=str(e))
  149. @router.delete('/delete')
  150. async def delete_task(
  151. request: Request,
  152. db: Session = Depends(get_db),
  153. user_id=Depends(valid_access_token)):
  154. try:
  155. body = await request.json()
  156. task_id_to_use = body.get('taskID')
  157. if not task_id_to_use:
  158. raise HTTPException(status_code=400, detail="Missing required parameter 'taskID'")
  159. event_code = db.query(EventBase).filter(EventBase.event_code == body.get('event_code')).first()
  160. if not event_code:
  161. return Response(content="事件不存在", status_code=400)
  162. task_entry = db.query(TaskRegistration).filter(TaskRegistration.task_id == task_id_to_use).first()
  163. if not task_entry:
  164. raise HTTPException(status_code=404, detail="任务不存在")
  165. task_entry.del_flag = '2'
  166. try:
  167. db.commit()
  168. return {
  169. "code": 200,
  170. "msg": "任务删除成功",
  171. "data": {
  172. "task_id": task_entry.task_id
  173. }
  174. }
  175. except Exception as e:
  176. db.rollback()
  177. raise HTTPException(status_code=500, detail=f"An error occurred while deleting the task: {str(e)}")
  178. except HTTPException as e:
  179. raise e
  180. except Exception as e:
  181. db.rollback()
  182. raise HTTPException(status_code=500, detail=f"An unexpected error occurred: {str(e)}")
  183. @router.get('/selectUnit')
  184. async def select_unit(
  185. request: Request,
  186. db: Session = Depends(get_db),
  187. query: TaskQuery = Depends(),
  188. user_id=Depends(valid_access_token),
  189. ):
  190. try:
  191. data_query = db.query(TaskUnit).filter(TaskUnit.id != '2').all()
  192. return {
  193. "code": 200,
  194. "msg": "查询成功",
  195. "data": data_query
  196. }
  197. except HTTPException as e:
  198. raise e
  199. except Exception as e:
  200. db.rollback()
  201. raise HTTPException(status_code=500, detail=f"An unexpected error occurred: {str(e)}")
  202. #
  203. # 小屏专用,不敢搞大屏相关代码
  204. #
  205. @router.get('/list')
  206. async def select_tasks(
  207. request: Request,
  208. task_type: str = Query(None),
  209. processing_status: str = Query(None),
  210. task_description: str = Query(None),
  211. page: int = Query(1, gt=0, description="页码"),
  212. page_size: int = Query(10, gt=0, le=100, description="每页大小"),
  213. db: Session = Depends(get_db)):
  214. try:
  215. data_query = db.query(TaskRegistration).filter(TaskRegistration.del_flag != '2').filter(TaskRegistration.event_code is not None)
  216. # 应用过滤条件
  217. if task_type is not None:
  218. data_query = data_query.filter(TaskRegistration.task_type == task_type)
  219. if task_description is not None:
  220. data_query = data_query.filter(TaskRegistration.task_description == task_description)
  221. if processing_status is not None:
  222. data_query = data_query.filter(TaskRegistration.processing_status == processing_status)
  223. total_count = data_query.count()
  224. offset = (page - 1) * page_size
  225. data_query = data_query.order_by(TaskRegistration.creation_time.desc()).offset(offset).limit(page_size)
  226. data = []
  227. tasks = data_query.all()
  228. for n in tasks:
  229. task = get_model_dict(n)
  230. task['creation_time'] = get_datetime_str(task['creation_time'])
  231. task['event_name'] = db_event_management.get_event_title(db, n.event_code)
  232. data.append(task)
  233. return {
  234. "code": 200,
  235. "msg": "任务查询成功",
  236. "data": data,
  237. "total": total_count
  238. }
  239. except Exception as e:
  240. traceback.print_exc()
  241. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  242. @router.post("/leader_request")
  243. async def leader_request(
  244. request: Request,
  245. db: Session = Depends(get_db),
  246. body = Depends(remove_xss_json),
  247. user_id = Depends(valid_access_token)
  248. ):
  249. try:
  250. task_id = body['task_id']
  251. processing_status = body['processing_status']
  252. new_feeback = TaskFeeback(
  253. **body,
  254. recorded_by=user_id
  255. )
  256. db.add(new_feeback)
  257. db.commit()
  258. db.query(TaskRegistration).filter(TaskRegistration.task_id == task_id).update({"processing_status": processing_status, "update_time": datetime.now()})
  259. db.commit()
  260. return {
  261. "code": 200,
  262. "msg": "请示领导保存成功"
  263. }
  264. except Exception as e:
  265. # 处理异常
  266. db.rollback()
  267. traceback.print_exc()
  268. raise HTTPException(status_code=500, detail=str(e))
  269. @router.post("/feeback")
  270. async def feeback(
  271. request: Request,
  272. db: Session = Depends(get_db),
  273. body = Depends(remove_xss_json),
  274. user_id = Depends(valid_access_token)
  275. ):
  276. try:
  277. feeback_user = get_req_param_optional(body, 'feeback_user')
  278. task_id = body['task_id']
  279. processing_status = body['processing_status']
  280. new_file_list = []
  281. if 'fileList' in body:
  282. new_file_list = copy.deepcopy(body['fileList'])
  283. del body['fileList']
  284. if feeback_user == '':
  285. feeback_user = db_user.get_user_info(db, user_id).nick_name
  286. if 'feeback_user' in body:
  287. del body['feeback_user']
  288. new_feeback = TaskFeeback(
  289. **body,
  290. feeback_user=feeback_user,
  291. recorded_by=user_id
  292. )
  293. db.add(new_feeback)
  294. db.commit()
  295. db.refresh(new_feeback)
  296. print(new_file_list)
  297. for file in new_file_list:
  298. file_name = file['file_name']
  299. file_name_desc = file['file_name_desc']
  300. status = file['status']
  301. new_file = TaskFile(
  302. file_id=new_guid(),
  303. foreign_key=new_feeback.id,
  304. from_scenario='task_feeback',
  305. file_name=file_name,
  306. file_name_desc=file_name_desc,
  307. status=status
  308. )
  309. db.add(new_file)
  310. db.commit()
  311. db.query(TaskRegistration).filter(TaskRegistration.task_id == task_id).update({"processing_status": processing_status, "update_time": datetime.now()})
  312. db.commit()
  313. return {
  314. "code": 200,
  315. "msg": "任务反馈保存成功"
  316. }
  317. except Exception as e:
  318. # 处理异常
  319. db.rollback()
  320. traceback.print_exc()
  321. raise HTTPException(status_code=500, detail=str(e))
  322. @router.get('/detail')
  323. async def get_task_detail(
  324. request: Request,
  325. task_id: str = Query(None, description='任务编号'),
  326. db: Session = Depends(get_db)):
  327. print('task_id:',task_id)
  328. try:
  329. # 构建查询
  330. rows = db.query(TaskFeeback).filter(and_(TaskFeeback.task_id == task_id, TaskFeeback.feeback_type == '0')).all()
  331. feebacks = []
  332. for row in rows:
  333. fileList = []
  334. feebacks.append({
  335. "content": row.content,
  336. "create_time": get_datetime_str(row.create_time),
  337. 'fileList': fileList,
  338. "fileCount": len(fileList)
  339. })
  340. query = db.query(TaskRegistration)
  341. query = query.filter(TaskRegistration.task_id == task_id)
  342. # 执行查询
  343. row = query.first()
  344. if row is not None:
  345. return {
  346. "code": 200,
  347. "msg": "查询成功",
  348. "data": {
  349. "id": row.id,
  350. "task_id": row.task_id,
  351. "task_type": row.task_type,
  352. "event_code": row.event_code,
  353. "event_name": db_event_management.get_event_title(db, row.event_code),
  354. "processing_status": row.processing_status,
  355. "expire_time": get_datetime_str(row.expire_time),
  356. "update_time": get_datetime_str(row.update_time),
  357. "feeback_user": row.feeback_user,
  358. "task_description": row.task_description,
  359. "feebacks": feebacks
  360. }
  361. }
  362. else:
  363. return {
  364. "code": 500,
  365. "msg": "查询失败"
  366. }
  367. except Exception as e:
  368. # 处理异常
  369. traceback.print_exc()
  370. raise HTTPException(status_code=500, detail=str(e))