__init__.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543
  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. del body['complete_time']
  36. task_base = TaskRegistration(
  37. **body,
  38. task_id=task_id
  39. )
  40. db.add(task_base)
  41. db.commit()
  42. return {
  43. "code": 200,
  44. "msg": "任务创建成功",
  45. "data": task_id
  46. }
  47. except Exception as e:
  48. db.rollback()
  49. traceback.print_exc()
  50. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  51. class TaskQuery(BaseModel):
  52. task_id: str = None
  53. task_description: str = None
  54. unit_name: str = None
  55. registrar: str = None
  56. creation_time: str = None
  57. processing_status: str = None
  58. @router.post('/select')
  59. @router.get('/select')
  60. async def select_tasks(
  61. request: Request,
  62. db: Session = Depends(get_db),
  63. query: TaskQuery = Depends(),
  64. sortBy: str = Query(None, description="排序字段"),
  65. sortOrder: str = Query(None, description="排序顺序"),
  66. user_id=Depends(valid_access_token),
  67. pageNum: int = Query(1, gt=0, description="页码"),
  68. event_code: str = Query(None, description="事件ID"),
  69. pageSize: int = Query(10, gt=0, le=100, description="每页大小")):
  70. try:
  71. missing_event_code = db.query(EventBase).filter(EventBase.event_code == event_code).first()
  72. # print(missing_event_code)
  73. if not missing_event_code:
  74. return Response(content="事件不存在", status_code=400)
  75. data_query = db.query(TaskRegistration).filter(TaskRegistration.del_flag != '2')
  76. data_query = data_query.filter(TaskRegistration.event_code == event_code)
  77. # 应用过滤条件
  78. if query.task_id:
  79. data_query = data_query.filter(TaskRegistration.task_id == query.task_id)
  80. if query.task_description:
  81. data_query = data_query.filter(TaskRegistration.task_description == query.task_description)
  82. if query.unit_name:
  83. data_query = data_query.filter(TaskRegistration.unit_name == query.unit_name)
  84. if query.registrar:
  85. data_query = data_query.filter(TaskRegistration.registrar == query.registrar)
  86. if query.creation_time:
  87. data_query = data_query.filter(TaskRegistration.creation_time == query.creation_time)
  88. if query.processing_status:
  89. data_query = data_query.filter(TaskRegistration.processing_status == query.processing_status)
  90. # print(TaskRegistration,sortBy)
  91. if sortBy:
  92. if hasattr(TaskRegistration, sortBy):
  93. print("xx")
  94. sort_attr = getattr(TaskRegistration, sortBy)
  95. data_query = data_query.order_by(sort_attr.asc() if sortOrder == 'asc' else sort_attr.desc())
  96. total_count = data_query.count()
  97. offset = (pageNum - 1) * pageSize
  98. data_query = data_query.offset(offset).limit(pageSize)
  99. tasks = data_query.all()
  100. return {
  101. "code": 200,
  102. "msg": "任务查询成功",
  103. "data": tasks,
  104. "total": total_count,
  105. "pages": (total_count + pageSize - 1) // pageSize,
  106. "current_page": pageNum,
  107. "page_size": pageSize
  108. }
  109. except Exception as e:
  110. db.rollback()
  111. traceback.print_exc()
  112. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  113. @router.put('/update')
  114. async def update_task_status(
  115. request: Request,
  116. db: Session = Depends(get_db),
  117. user_id=Depends(valid_access_token)):
  118. body = await request.json()
  119. task_id_to_use = body.get('task_id')
  120. processing_status = body.get('processing_status')
  121. event_code = db.query(EventBase).filter(EventBase.event_code == body.get('event_code')).first()
  122. if not event_code:
  123. return Response(content="事件不存在", status_code=400)
  124. if not task_id_to_use:
  125. return Response(content="Missing required parameter 'task_id'", status_code=400)
  126. if processing_status not in ['已完成', '处理中', '待处理','未完成']:
  127. return Response(content="processing_status must be '已完成' or '处理中' or '待处理' or '未完成'", status_code=400)
  128. task_entry = (db.query(TaskRegistration)
  129. .filter(TaskRegistration.del_flag != '2')
  130. .filter(TaskRegistration.task_id == task_id_to_use))
  131. task_entry = task_entry.first()
  132. if not task_entry:
  133. raise HTTPException(status_code=404, detail="任务不存在")
  134. task_entry.processing_status = processing_status
  135. task_entry.update_time = datetime.now()
  136. try:
  137. db.commit()
  138. return {
  139. "code": 200,
  140. "msg": "任务状态更新成功",
  141. "data": {
  142. "task_id": task_id_to_use,
  143. "processing_status": task_entry.processing_status,
  144. "update_time": task_entry.update_time.isoformat()
  145. }
  146. }
  147. except Exception as e:
  148. db.rollback()
  149. raise HTTPException(status_code=500, detail=str(e))
  150. @router.delete('/delete')
  151. async def delete_task(
  152. request: Request,
  153. db: Session = Depends(get_db),
  154. user_id=Depends(valid_access_token)):
  155. try:
  156. body = await request.json()
  157. task_id_to_use = body.get('taskID')
  158. if not task_id_to_use:
  159. raise HTTPException(status_code=400, detail="Missing required parameter 'taskID'")
  160. event_code = db.query(EventBase).filter(EventBase.event_code == body.get('event_code')).first()
  161. if not event_code:
  162. return Response(content="事件不存在", status_code=400)
  163. task_entry = db.query(TaskRegistration).filter(TaskRegistration.task_id == task_id_to_use).first()
  164. if not task_entry:
  165. raise HTTPException(status_code=404, detail="任务不存在")
  166. task_entry.del_flag = '2'
  167. try:
  168. db.commit()
  169. return {
  170. "code": 200,
  171. "msg": "任务删除成功",
  172. "data": {
  173. "task_id": task_entry.task_id
  174. }
  175. }
  176. except Exception as e:
  177. db.rollback()
  178. raise HTTPException(status_code=500, detail=f"An error occurred while deleting the task: {str(e)}")
  179. except HTTPException as e:
  180. raise e
  181. except Exception as e:
  182. db.rollback()
  183. raise HTTPException(status_code=500, detail=f"An unexpected error occurred: {str(e)}")
  184. @router.get('/selectUnit')
  185. async def select_unit(
  186. request: Request,
  187. db: Session = Depends(get_db),
  188. query: TaskQuery = Depends(),
  189. user_id=Depends(valid_access_token),
  190. ):
  191. try:
  192. data_query = db.query(TaskUnit).filter(TaskUnit.id != '2').all()
  193. return {
  194. "code": 200,
  195. "msg": "查询成功",
  196. "data": data_query
  197. }
  198. except HTTPException as e:
  199. raise e
  200. except Exception as e:
  201. db.rollback()
  202. raise HTTPException(status_code=500, detail=f"An unexpected error occurred: {str(e)}")
  203. #
  204. # 小屏专用,不敢搞大屏相关代码
  205. #
  206. @router.get('/list')
  207. async def select_tasks(
  208. request: Request,
  209. task_type: str = Query(None),
  210. processing_status: str = Query(None),
  211. search_keyword: str = Query(None),
  212. page: int = Query(1, gt=0, description="页码"),
  213. page_size: int = Query(10, gt=0, le=100, description="每页大小"),
  214. db: Session = Depends(get_db)):
  215. try:
  216. data_query = db.query(TaskRegistration).filter(TaskRegistration.del_flag != '2').filter(TaskRegistration.event_code is not None)
  217. # 应用过滤条件
  218. if task_type is not None:
  219. data_query = data_query.filter(TaskRegistration.task_type == task_type)
  220. if search_keyword is not None:
  221. data_query = data_query.filter(TaskRegistration.task_description.like('%{}%'.format(search_keyword)))
  222. if processing_status is not None:
  223. data_query = data_query.filter(TaskRegistration.processing_status == processing_status)
  224. total_count = data_query.count()
  225. offset = (page - 1) * page_size
  226. data_query = data_query.order_by(TaskRegistration.creation_time.desc()).offset(offset).limit(page_size)
  227. data = []
  228. tasks = data_query.all()
  229. for n in tasks:
  230. task = get_model_dict(n)
  231. task['creation_time'] = get_datetime_str(task['creation_time'])
  232. task['event_name'] = db_event_management.get_event_title(db, n.event_code)
  233. data.append(task)
  234. return {
  235. "code": 200,
  236. "msg": "任务查询成功",
  237. "data": data,
  238. "total": total_count
  239. }
  240. except Exception as e:
  241. traceback.print_exc()
  242. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  243. @router.post("/leader_request")
  244. async def leader_request(
  245. request: Request,
  246. db: Session = Depends(get_db),
  247. body = Depends(remove_xss_json),
  248. user_id = Depends(valid_access_token)
  249. ):
  250. try:
  251. task_id = body['task_id']
  252. processing_status = body['processing_status']
  253. new_feeback = TaskFeeback(
  254. **body,
  255. recorded_by=user_id
  256. )
  257. db.add(new_feeback)
  258. db.commit()
  259. db.query(TaskRegistration).filter(TaskRegistration.task_id == task_id).update({"processing_status": processing_status, "update_time": datetime.now()})
  260. db.commit()
  261. return {
  262. "code": 200,
  263. "msg": "请示领导保存成功"
  264. }
  265. except Exception as e:
  266. # 处理异常
  267. db.rollback()
  268. traceback.print_exc()
  269. raise HTTPException(status_code=500, detail=str(e))
  270. @router.post("/feeback")
  271. async def feeback(
  272. request: Request,
  273. db: Session = Depends(get_db),
  274. body = Depends(remove_xss_json),
  275. user_id = Depends(valid_access_token)
  276. ):
  277. try:
  278. feeback_user = get_req_param_optional(body, 'feeback_user')
  279. task_id = body['task_id']
  280. processing_status = body['processing_status']
  281. new_file_list = []
  282. if 'fileList' in body:
  283. new_file_list = copy.deepcopy(body['fileList'])
  284. del body['fileList']
  285. if feeback_user == '':
  286. feeback_user = db_user.get_user_info(db, user_id).nick_name
  287. if 'feeback_user' in body:
  288. del body['feeback_user']
  289. new_feeback = TaskFeeback(
  290. **body,
  291. feeback_user=feeback_user,
  292. recorded_by=user_id
  293. )
  294. db.add(new_feeback)
  295. db.commit()
  296. db.refresh(new_feeback)
  297. print(new_file_list)
  298. for file in new_file_list:
  299. file_name = file['file_name']
  300. file_name_desc = file['file_name_desc']
  301. status = file['status']
  302. new_file = TaskFile(
  303. file_id=new_guid(),
  304. foreign_key=new_feeback.id,
  305. from_scenario='task_feeback',
  306. file_name=file_name,
  307. file_name_desc=file_name_desc,
  308. status=status
  309. )
  310. db.add(new_file)
  311. db.commit()
  312. db.query(TaskRegistration).filter(TaskRegistration.task_id == task_id).update({"processing_status": processing_status, "update_time": datetime.now()})
  313. db.commit()
  314. return {
  315. "code": 200,
  316. "msg": "任务反馈保存成功"
  317. }
  318. except Exception as e:
  319. # 处理异常
  320. db.rollback()
  321. traceback.print_exc()
  322. raise HTTPException(status_code=500, detail=str(e))
  323. @router.get('/detail')
  324. async def get_task_detail(
  325. request: Request,
  326. task_id: str = Query(None, description='任务编号'),
  327. db: Session = Depends(get_db)):
  328. print('task_id:',task_id)
  329. try:
  330. # 构建查询
  331. rows = db.query(TaskFeeback).filter(and_(TaskFeeback.task_id == task_id)).all()
  332. feebacks = []
  333. for row in rows:
  334. fileList = []
  335. # 附件
  336. rows = db.query(TaskFile).filter(and_(TaskFile.from_scenario=="task_feeback", TaskFile.foreign_key == row.id, InfoPublishFile.del_flag == '0')).all()
  337. fileList = [
  338. {
  339. "name": row.file_name,
  340. "url": row.storage_file_name
  341. }
  342. for row in rows
  343. ]
  344. info = get_model_dict(row)
  345. info['create_time'] = get_datetime_str(row.create_time)
  346. info['approval_time'] = get_datetime_str(row.approval_time)
  347. info['fileList'] = fileList
  348. info['fileCount'] = len(fileList)
  349. feebacks.append(info)
  350. query = db.query(TaskRegistration)
  351. query = query.filter(TaskRegistration.task_id == task_id)
  352. # 执行查询
  353. row = query.first()
  354. if row is not None:
  355. return {
  356. "code": 200,
  357. "msg": "查询成功",
  358. "data": {
  359. "id": row.id,
  360. "task_id": row.task_id,
  361. "task_type": row.task_type,
  362. "event_code": row.event_code,
  363. "event_name": db_event_management.get_event_title(db, row.event_code),
  364. "processing_status": row.processing_status,
  365. "expire_time": get_datetime_str(row.expire_time),
  366. "update_time": get_datetime_str(row.update_time),
  367. "feeback_user": row.feeback_user,
  368. "task_description": row.task_description,
  369. "feebacks": feebacks
  370. }
  371. }
  372. else:
  373. return {
  374. "code": 500,
  375. "msg": "查询失败"
  376. }
  377. except Exception as e:
  378. # 处理异常
  379. traceback.print_exc()
  380. raise HTTPException(status_code=500, detail=str(e))
  381. # 请示列表
  382. @router.get('/request/list')
  383. async def select_tasks(
  384. request: Request,
  385. task_type: str = Query(None),
  386. processing_status: str = Query(None),
  387. search_keyword: str = Query(None),
  388. page: int = Query(1, gt=0, description="页码"),
  389. page_size: int = Query(10, gt=0, le=100, description="每页大小"),
  390. db: Session = Depends(get_db)):
  391. try:
  392. data_query = db.query(TaskFeeback).filter(TaskFeeback.feeback_type == '1')
  393. # 应用过滤条件
  394. if task_type is not None:
  395. subquery = db.query(TaskRegistration.task_id).filter(and_(TaskRegistration.del_flag == '0', TaskRegistration.task_type == task_type)).subquery()
  396. data_query = data_query.filter(TaskFeeback.task_id == subquery.c.task_id)
  397. if processing_status is not None:
  398. data_query = data_query.filter(TaskFeeback.processing_status == processing_status)
  399. if search_keyword is not None:
  400. data_query = data_query.filter(TaskFeeback.content.like('%{}%'.format(search_keyword)))
  401. total_count = data_query.count()
  402. offset = (page - 1) * page_size
  403. data_query = data_query.order_by(TaskFeeback.create_time.desc()).offset(offset).limit(page_size)
  404. data = []
  405. tasks = data_query.all()
  406. for n in tasks:
  407. task = get_model_dict(n)
  408. task['nick_name'] = db_user.get_nick_name_by_id(db, task['recorded_by'])
  409. task['create_time'] = get_datetime_str(task['create_time'])
  410. task['approval_time'] = get_datetime_str(task['approval_time'])
  411. task['update_time'] = task['create_time']
  412. if task['approval_time'] != None:
  413. task['update_time'] = task['approval_time']
  414. task['event_name'] = ''
  415. task_id = task['task_id']
  416. reg_info = db.query(TaskRegistration).filter(TaskRegistration.task_id == task_id).first()
  417. if reg_info is not None:
  418. reg_info = get_model_dict(reg_info)
  419. task['event_name'] = db_event_management.get_event_title(db, reg_info['event_code'])
  420. data.append(task)
  421. return {
  422. "code": 200,
  423. "msg": "请示查询成功",
  424. "data": data,
  425. "total": total_count
  426. }
  427. except Exception as e:
  428. traceback.print_exc()
  429. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  430. # 请示批复
  431. @router.post("/approval")
  432. async def approval(
  433. request: Request,
  434. db: Session = Depends(get_db),
  435. body = Depends(remove_xss_json),
  436. user_id = Depends(valid_access_token)
  437. ):
  438. try:
  439. feeback_id = get_req_param(body, "feeback_id")
  440. approval_content = get_req_param_optional(body, 'approval_content')
  441. row = db.query(TaskFeeback).filter(TaskFeeback.id == feeback_id).first()
  442. if row is None:
  443. return {
  444. "code": 500,
  445. "msg": "请示不存在"
  446. }
  447. row.approval_content = approval_content
  448. row.approval_time = datetime.now()
  449. row.processing_status = '已完成'
  450. db.commit()
  451. return {
  452. "code": 200,
  453. "msg": "请示批复保存成功"
  454. }
  455. except Exception as e:
  456. # 处理异常
  457. db.rollback()
  458. traceback.print_exc()
  459. raise HTTPException(status_code=500, detail=str(e))