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