risk_router.py 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from fastapi import APIRouter, Request, Depends,Query, HTTPException, status,BackgroundTasks
  4. from common.security import valid_access_token
  5. from fastapi.responses import JSONResponse
  6. from sqlalchemy.orm import Session
  7. from sqlalchemy import and_, or_
  8. from pydantic import BaseModel
  9. from datetime import datetime
  10. from database import get_db
  11. from typing import List
  12. from models import *
  13. from utils import *
  14. from utils.ry_system_util import *
  15. from utils.riskManagement_uitl import *
  16. import json
  17. import traceback
  18. router = APIRouter()
  19. @router.get('/list')
  20. async def get_inspection_task_list(
  21. type: str = Query(None, description='类型'),
  22. cycle :str = Query(None, description='周期'),
  23. page: int = Query(1, gt=0, description='页码'),
  24. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  25. db: Session = Depends(get_db),
  26. user_id = Depends(valid_access_token)
  27. ):
  28. try:
  29. # 构建查询
  30. query = db.query(RiskManagementRiskTask)
  31. query = query.filter(RiskManagementRiskTask.del_flag != '2')
  32. # 应用查询条件
  33. if type:
  34. query = query.filter(RiskManagementRiskTask.risk_type == type)
  35. if cycle:
  36. query = query.filter(RiskManagementRiskTask.task_cycle == cycle)
  37. # 计算总条目数
  38. total_items = query.count()
  39. # 排序
  40. query = query.order_by(RiskManagementRiskTask.create_time.desc())
  41. # 执行分页查询
  42. RiskTasks = query.offset((page - 1) * pageSize).limit(pageSize).all()
  43. # 将查询结果转换为列表形式的字典
  44. RiskTasks_list = []
  45. for task in RiskTasks:
  46. if task.task_status=='3':
  47. task_status = '3' #'已完结'
  48. else:
  49. if datetime.now()<task.start_time:
  50. task_status = '0' #'未开始'
  51. elif task.start_time<=datetime.now()<=task.end_time:
  52. task_status = '1' #'进行中'
  53. else:
  54. task_status = '2' #'未完成'
  55. create_by = task.create_by
  56. create_by = db.query(SysUser).filter(SysUser.user_id==create_by).first()
  57. task_info = {
  58. "id": task.id,
  59. "task_number": task.task_number,
  60. "type": task.risk_type,
  61. "task_time": '%s-%s'%(task.start_time.strftime('%Y/%m/%d'),task.end_time.strftime('%Y/%m/%d')),
  62. "cycle": task.task_cycle,
  63. "task_range": task.task_range,
  64. "task_status": task_status,
  65. "create_by":create_by.nick_name,
  66. "create_time": task.create_time#.strftime('%Y-%m-%d')
  67. }
  68. RiskTasks_list.append(task_info)
  69. # 返回结果
  70. return {
  71. "code": 200,
  72. "msg": "成功",
  73. "data": RiskTasks_list,
  74. "total": total_items,
  75. "page": page,
  76. "pageSize": pageSize,
  77. "totalPages": (total_items + pageSize - 1) // pageSize
  78. }
  79. except Exception as e:
  80. # 处理异常
  81. traceback.print_exc()
  82. raise HTTPException(status_code=500, detail=str(e))
  83. @router.get('/{id}')
  84. async def get_inspection_task(
  85. id: str ,
  86. db: Session = Depends(get_db),
  87. user_id = Depends(valid_access_token)
  88. ):
  89. try:
  90. # 构建查询
  91. query = db.query(RiskManagementRiskTask)
  92. query = query.filter(RiskManagementRiskTask.del_flag != '2')
  93. # 应用查询条件
  94. if id:
  95. query = query.filter(RiskManagementRiskTask.id == id)
  96. # 执行查询
  97. task = query.first()
  98. if not task:
  99. detail = "任务不存在"
  100. raise HTTPException(status_code=404, detail="任务不存在")
  101. # 将查询结果转换为列表形式的字典
  102. if task.task_status == '3':
  103. task_status = '3' # '已完结'
  104. else:
  105. if datetime.now() < task.start_time:
  106. task_status = '0' # '未开始'
  107. elif task.start_time <= datetime.now() <= task.end_time:
  108. task_status = '1' # '进行中'
  109. else:
  110. task_status = '2' # '未完成'
  111. create_by = task.create_by
  112. create_by = db.query(SysUser).filter(SysUser.user_id == create_by).first()
  113. risk_task_result = {
  114. "id": task.id,
  115. "task_number": task.task_number,
  116. "type": task.risk_type,
  117. "task_time": '%s-%s'%(task.start_time.strftime('%Y/%m/%d'),task.end_time.strftime('%Y/%m/%d')),
  118. "cycle": task.task_cycle,
  119. "task_range": task.task_range,
  120. "task_status": task_status,
  121. "create_by":create_by.nick_name,
  122. "create_time": task.create_time.strftime('%Y-%m-%d')
  123. }
  124. # 返回结果
  125. return {
  126. "code": 200,
  127. "msg": "成功",
  128. "data": risk_task_result
  129. }
  130. except Exception as e:
  131. # 处理异常
  132. traceback.print_exc()
  133. if str(e)=='':
  134. e = detail
  135. raise HTTPException(status_code=500, detail=str(e))
  136. @router.post('/create')
  137. async def create_inspection_task(
  138. background_tasks: BackgroundTasks,
  139. db: Session = Depends(get_db),
  140. body = Depends(remove_xss_json),
  141. user_id = Depends(valid_access_token)
  142. ):
  143. try:
  144. cycle = body['cycle']
  145. # 0每年、1每月、2每周、3每日、4一次
  146. corn_query = body['corn_query']
  147. if cycle=='0':
  148. corn=f'0 0 {corn_query} *'
  149. elif cycle=='1':
  150. corn=f'0 0 {corn_query} * *'
  151. elif cycle == '2':
  152. corn = f'0 0 * * {corn_query}'
  153. elif cycle == '3':
  154. corn = f'0 0 * * *'
  155. else:
  156. corn=''
  157. # 创建新的预案记录
  158. new_task = RiskManagementRiskTask(
  159. risk_type=body['type'],
  160. start_time = body['start_time'],
  161. end_time = body['end_time'],
  162. task_cycle = cycle,
  163. corn_expression = corn,
  164. task_range = body['task_range'],
  165. task_status = '-1',
  166. create_by = user_id
  167. )
  168. # 添加到数据库会话并提交
  169. db.add(new_task)
  170. db.commit()
  171. db.refresh(new_task) # 可选,如果需要刷新实例状态
  172. new_task.task_number = f'YJFX{str(new_task.id).zfill(10)}'
  173. db.commit()
  174. background_tasks.add_task(create_risk_children_task,db,new_task,corn_query)
  175. # 返回创建成功的响应
  176. return {
  177. "code": 200,
  178. "msg": "成功",
  179. "data": None
  180. }
  181. except Exception as e:
  182. # 处理异常
  183. traceback.print_exc()
  184. raise HTTPException(status_code=500, detail=str(e))
  185. @router.put('/update')
  186. async def update_inspection_task(
  187. db: Session = Depends(get_db),
  188. body = Depends(remove_xss_json),
  189. user_id = Depends(valid_access_token)
  190. ):
  191. try:
  192. # 提取请求数据
  193. query = db.query(RiskManagementRiskTask)
  194. query = query.filter(RiskManagementRiskTask.id == body['id'])
  195. query = query.filter(RiskManagementRiskTask.del_flag != '2')
  196. task = query.first()
  197. if not task:
  198. detail = "任务不存在"
  199. raise HTTPException(status_code=404, detail="任务不存在")
  200. # if 'cycle' in body:
  201. # cycle = body['cycle']
  202. # # 0每年、1每月、2每周、3每日、4一次
  203. # corn_query = body['corn_query']
  204. # if cycle == '0':
  205. # corn = f'0 0 {corn_query} *'
  206. # elif cycle == '1':
  207. # corn = f'0 0 {corn_query} * *'
  208. # elif cycle == '2':
  209. # corn = f'0 0 * * {corn_query}'
  210. # elif cycle == '3':
  211. # corn = f'0 0 * * *'
  212. # else:
  213. # corn = ''
  214. # task.inspection_cycle = cycle
  215. # task.corn_expression = corn
  216. if 'type' in body:
  217. task.risk_type = body['type']
  218. # if 'start_time' in body:
  219. # task.start_time = body['start_time']
  220. # if 'end_time' in body:
  221. # task.end_time = body['end_time']
  222. if 'task_range' in body:
  223. task.task_range = body['task_range']
  224. if 'task_status' in body:
  225. task.task_status = body['task_status']
  226. if user_id:
  227. task.update_by = user_id
  228. # 更新到数据库会话并提交
  229. db.commit()
  230. db.refresh(task) # 可选,如果需要刷新实例状态
  231. # 返回创建成功的响应
  232. return {
  233. "code": 200,
  234. "msg": "成功",
  235. "data": None
  236. }
  237. except Exception as e:
  238. # 处理异常
  239. traceback.print_exc()
  240. if str(e)=='':
  241. e = detail
  242. raise HTTPException(status_code=500, detail=str(e))
  243. @router.delete('/delete')
  244. async def delete_inspection_tasks(
  245. taskIds: list,
  246. db: Session = Depends(get_db),
  247. body = Depends(remove_xss_json),
  248. user_id = Depends(valid_access_token)
  249. ):
  250. try:
  251. # 提取请求数据
  252. query = db.query(RiskManagementRiskTask)
  253. query = query.filter(RiskManagementRiskTask.del_flag != '2')
  254. query = query.filter(RiskManagementRiskTask.id.in_(taskIds))
  255. tasks = query.all()
  256. if not tasks:
  257. detail = "任务不存在"
  258. raise HTTPException(status_code=404, detail="任务不存在")
  259. for task in tasks:
  260. task.del_flag = '2'
  261. task.update_by=user_id
  262. # 更新到数据库会话并提交
  263. db.commit()
  264. # 返回创建成功的响应
  265. return {
  266. "code": 200,
  267. "msg": "删除成功",
  268. "data": None
  269. }
  270. except Exception as e:
  271. # 处理异常
  272. if str(e) == '':
  273. e = detail
  274. raise HTTPException(status_code=500, detail=str(e))
  275. @router.delete('/delete/{userId}')
  276. async def delete_inspection_task(
  277. userId: str,
  278. db: Session = Depends(get_db),
  279. body = Depends(remove_xss_json),
  280. user_id = Depends(valid_access_token)
  281. ):
  282. try:
  283. # 提取请求数据
  284. query = db.query(RiskManagementRiskTask)
  285. query = query.filter(RiskManagementRiskTask.del_flag != '2')
  286. query = query.filter(RiskManagementRiskTask.id==userId)
  287. task = query.first()
  288. if not task:
  289. detail = "任务不存在"
  290. raise HTTPException(status_code=404, detail="任务不存在")
  291. task.del_flag = '2'
  292. task.update_by = user_id
  293. # 更新到数据库会话并提交
  294. db.commit()
  295. db.refresh(task) # 可选,如果需要刷新实例状态
  296. # 返回创建成功的响应
  297. return {
  298. "code": 200,
  299. "msg": "删除成功",
  300. "data": None
  301. }
  302. except Exception as e:
  303. # 处理异常
  304. traceback.print_exc()
  305. if str(e) == '':
  306. e = detail
  307. raise HTTPException(status_code=500, detail=str(e))
  308. @router.get('/children/task/{task_id}/list')
  309. async def get_inspection_task_list(
  310. task_id: str ,
  311. page: int = Query(1, gt=0, description='页码'),
  312. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  313. db: Session = Depends(get_db),
  314. user_id = Depends(valid_access_token)
  315. ):
  316. try:
  317. # 构建查询
  318. query = db.query(RiskManagementRiskTaskChildrenTask)
  319. query = query.filter(RiskManagementRiskTaskChildrenTask.del_flag != '2')
  320. # 应用查询条件
  321. query = query.filter(RiskManagementRiskTaskChildrenTask.task_id == task_id)
  322. # 计算总条目数
  323. total_items = query.count()
  324. # 排序
  325. query = query.order_by(RiskManagementRiskTaskChildrenTask.tsak_time.asc())
  326. # 执行分页查询
  327. InspectionTasks = query.offset((page - 1) * pageSize).limit(pageSize).all()
  328. # 将查询结果转换为列表形式的字典
  329. InspectionTasks_list = []
  330. for task in InspectionTasks:
  331. task_num=task.task_num
  332. completed_num = db.query(RiskManagementRiskTaskChildrenTaskLog)\
  333. .filter(RiskManagementRiskTaskChildrenTaskLog.del_flag!='2')\
  334. .filter(RiskManagementRiskTaskChildrenTaskLog.children_task_id==task.id).count()
  335. incomplete_num = task_num-completed_num
  336. task_info = {
  337. "id": task.id,
  338. "task_id":task.task_id,
  339. "task_number": task.task_number,
  340. "type": task.type,
  341. "task_time": task.tsak_time.strftime('%Y-%m-%d'),
  342. "cycle": task.cycle,
  343. "task_range": task.task_range,
  344. "completed_num": completed_num,
  345. "incomplete_num": incomplete_num,
  346. "create_time": task.create_time.strftime('%Y-%m-%d')
  347. }
  348. InspectionTasks_list.append(task_info)
  349. # 返回结果
  350. return {
  351. "code": 200,
  352. "msg": "成功",
  353. "data": InspectionTasks_list,
  354. "total": total_items,
  355. "page": page,
  356. "pageSize": pageSize,
  357. "totalPages": (total_items + pageSize - 1) // pageSize
  358. }
  359. except Exception as e:
  360. # 处理异常
  361. traceback.print_exc()
  362. raise HTTPException(status_code=500, detail=str(e))
  363. @router.get('/children/task/log/{children_task_id}/{status}/list')
  364. async def get_inspection_task_list(
  365. children_task_id: str ,
  366. status:str,
  367. area_code: str = Query(None, description='区划编码'),
  368. page: int = Query(1, gt=0, description='页码'),
  369. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  370. db: Session = Depends(get_db),
  371. user_id = Depends(valid_access_token)
  372. ):
  373. try:
  374. # 构建查询
  375. total_items= 0
  376. InspectionTasks_list = []
  377. if status=='completed':
  378. query = db.query(RiskManagementRiskTaskChildrenTaskLog)
  379. query = query.filter(RiskManagementRiskTaskChildrenTaskLog.del_flag != '2')
  380. # 应用查询条件
  381. query = query.filter(RiskManagementRiskTaskChildrenTaskLog.children_task_id == children_task_id)
  382. if area_code:
  383. query = query.filter(RiskManagementRiskTaskChildrenTaskLog.area_code == area_code)
  384. # 计算总条目数
  385. total_items = query.count()
  386. # 排序
  387. query = query.order_by(RiskManagementRiskTaskChildrenTaskLog.create_time.desc())
  388. # 执行分页查询
  389. InspectionTasks = query.offset((page - 1) * pageSize).limit(pageSize).all()
  390. # 将查询结果转换为列表形式的字典
  391. for task in InspectionTasks:
  392. task_info = {
  393. "id": task.id,
  394. "children_task_id":children_task_id,
  395. "area_code": task.area_code,
  396. "area": task.area,
  397. "task_status": task.task_status,
  398. "user_id": task.user_id,
  399. "nick_name": task.nick_name,
  400. "create_time": task.create_time.strftime('%Y-%m-%d')
  401. }
  402. InspectionTasks_list.append(task_info)
  403. # 返回结果
  404. elif status == 'incomplete':
  405. children_task = risk_task_children_task_id_get_risk_task_children_task_info(db,children_task_id)
  406. if children_task:
  407. task = risk_task_id_get_risk_task_info(db,children_task.task_id)
  408. if task:
  409. complete_area_code_list =[i.area_code for i in risk_task_children_task_id_get_risk_task_children_task_log_info(db,children_task_id)]
  410. area_code_list = get_area_code_exclude_list(db,task.task_range,complete_area_code_list)
  411. if area_code and area_code in area_code_list:
  412. area_code_list = [area_code_list]
  413. for area_code in area_code_list:
  414. task_info = {
  415. "id": new_guid(),
  416. "children_task_id": children_task_id,
  417. "area_code": area_code,
  418. "area": area_code_get_ancestors_names(db,area_code_get_area_info(db,area_code)),
  419. "task_status": '0',
  420. "user_id": '',
  421. "nick_name": '',
  422. "create_time": children_task.tsak_time.strftime('%Y-%m-%d')
  423. }
  424. InspectionTasks_list.append(task_info)
  425. return {
  426. "code": 200,
  427. "msg": "成功",
  428. "data": InspectionTasks_list,
  429. "total": total_items,
  430. "page": page,
  431. "pageSize": pageSize,
  432. "totalPages": (total_items + pageSize - 1) // pageSize
  433. }
  434. except Exception as e:
  435. # 处理异常
  436. traceback.print_exc()
  437. raise HTTPException(status_code=500, detail=str(e))
  438. @router.get('/children/task/result/{children_task_id}/list')
  439. async def get_inspection_task_list(
  440. children_task_id: str ,
  441. area_code: str = Query(None, description='区划编码'),
  442. result: str = Query(None, description='巡查结果'),
  443. nick_name: str = Query(None, description='姓名'),
  444. page: int = Query(1, gt=0, description='页码'),
  445. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  446. db: Session = Depends(get_db),
  447. user_id = Depends(valid_access_token)
  448. ):
  449. try:
  450. # 构建查询
  451. query = db.query(RiskManagementRiskTaskChildrenTaskResult)
  452. query = query.filter(RiskManagementRiskTaskChildrenTaskResult.del_flag != '2')
  453. query = query.filter(RiskManagementRiskTaskChildrenTaskResult.children_task_id == children_task_id)
  454. # 应用查询条件
  455. if area_code:
  456. query = query.filter(RiskManagementRiskTaskChildrenTaskResult.area_code == area_code)
  457. if result:
  458. query = query.filter(RiskManagementRiskTaskChildrenTaskResult.inspection_result == result)
  459. if nick_name:
  460. query = query.filter(RiskManagementRiskTaskChildrenTaskResult.nick_name.like(f'%{nick_name}%') )
  461. # 计算总条目数
  462. total_items = query.count()
  463. # 排序
  464. query = query.order_by(RiskManagementRiskTaskChildrenTaskResult.create_time.desc())
  465. # 执行分页查询
  466. InspectionTasks = query.offset((page - 1) * pageSize).limit(pageSize).all()
  467. # 将查询结果转换为列表形式的字典
  468. InspectionTasks_list = []
  469. for task in InspectionTasks:
  470. area_code = task.area_code
  471. area = area_code_get_area_info(db, area_code)
  472. area = area_code_get_ancestors_names(db, area)
  473. task_info = {
  474. "id": task.id,
  475. "children_task_id": task.children_task_id,
  476. "point_name":task.inspection_point_name,
  477. "area": area,
  478. "create_time": task.create_time.strftime('%Y-%m-%d'),
  479. "nick_name": task.nick_name,
  480. "result": task.inspection_result,
  481. "fileList": get_file_query_fun(db=db,from_scenario='RiskManagementRiskTaskChildrenTaskResult', foreign_key=task.id),
  482. "remark":task.remark
  483. }
  484. InspectionTasks_list.append(task_info)
  485. # 返回结果
  486. return {
  487. "code": 200,
  488. "msg": "成功",
  489. "data": InspectionTasks_list,
  490. "total": total_items,
  491. "page": page,
  492. "pageSize": pageSize,
  493. "totalPages": (total_items + pageSize - 1) // pageSize
  494. }
  495. except Exception as e:
  496. # 处理异常
  497. traceback.print_exc()
  498. raise HTTPException(status_code=500, detail=str(e))