task.py 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003
  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. nick_name = None
  59. if create_by:
  60. nick_name=create_by.nick_name
  61. task_info = {
  62. "id": task.id,
  63. "task_number": task.task_number,
  64. "business": task.inspection_business,
  65. "task_time": '%s-%s'%(task.start_time.strftime('%Y/%m/%d'),task.end_time.strftime('%Y/%m/%d')),
  66. "cycle": task.inspection_cycle,
  67. "corn_query":task.corn_query,
  68. "inspection_range": task.inspection_range,
  69. "task_status": task_status,
  70. "create_by":nick_name,
  71. "create_time": task.create_time.strftime('%Y-%m-%d')
  72. }
  73. InspectionTasks_list.append(task_info)
  74. # 返回结果
  75. return {
  76. "code": 200,
  77. "msg": "成功",
  78. "data": InspectionTasks_list,
  79. "total": total_items,
  80. "page": page,
  81. "pageSize": pageSize,
  82. "totalPages": (total_items + pageSize - 1) // pageSize
  83. }
  84. except Exception as e:
  85. # 处理异常
  86. traceback.print_exc()
  87. raise HTTPException(status_code=500, detail=str(e))
  88. @router.get('/{id}')
  89. async def get_inspection_task(
  90. id: str ,
  91. db: Session = Depends(get_db),
  92. user_id = Depends(valid_access_token)
  93. ):
  94. try:
  95. # 构建查询
  96. query = db.query(RiskManagementInspectionTask)
  97. query = query.filter(RiskManagementInspectionTask.del_flag != '2')
  98. # 应用查询条件
  99. if id:
  100. query = query.filter(RiskManagementInspectionTask.id == id)
  101. # 执行查询
  102. task = query.first()
  103. if not task:
  104. detail = "巡查任务不存在"
  105. raise HTTPException(status_code=404, detail="巡查任务不存在")
  106. # 将查询结果转换为列表形式的字典
  107. if task.task_status == '3':
  108. task_status = '3' # '已完结'
  109. else:
  110. if datetime.now() < task.start_time:
  111. task_status = '0' # '未开始'
  112. elif task.start_time <= datetime.now() <= task.end_time:
  113. task_status = '1' # '进行中'
  114. else:
  115. task_status = '2' # '未完成'
  116. create_by = task.create_by
  117. create_by = db.query(SysUser).filter(SysUser.user_id == create_by).first()
  118. nick_name = None
  119. if create_by:
  120. nick_name = create_by.nick_name
  121. inspection_task_result = {
  122. "id": task.id,
  123. "task_number": task.task_number,
  124. "business": task.inspection_business,
  125. "task_time": '%s-%s'%(task.start_time.strftime('%Y/%m/%d'),task.end_time.strftime('%Y/%m/%d')),
  126. "start_time":task.start_time.strftime('%Y-%m-%d'),
  127. "end_time":task.end_time.strftime('%Y-%m-%d'),
  128. "cycle": task.inspection_cycle,
  129. "inspection_range": task.inspection_range,
  130. "corn_query":task.corn_query,
  131. "task_status": task_status,
  132. "create_by":nick_name,
  133. "create_time": task.create_time.strftime('%Y-%m-%d')
  134. }
  135. # 返回结果
  136. return {
  137. "code": 200,
  138. "msg": "成功",
  139. "data": inspection_task_result
  140. }
  141. except Exception as e:
  142. # 处理异常
  143. traceback.print_exc()
  144. if str(e)=='':
  145. e = detail
  146. raise HTTPException(status_code=500, detail=str(e))
  147. @router.post('/create')
  148. async def create_inspection_task(
  149. background_tasks: BackgroundTasks,
  150. db: Session = Depends(get_db),
  151. body = Depends(remove_xss_json),
  152. user_id = Depends(valid_access_token)
  153. ):
  154. try:
  155. cycle = body['cycle']
  156. # 0每年、1每月、2每周、3每日、4一次
  157. corn_query = body['corn_query']
  158. if cycle=='0':
  159. corn=f'0 0 {corn_query} *'
  160. elif cycle=='1':
  161. corn=f'0 0 {corn_query} * *'
  162. elif cycle == '2':
  163. corn = f'0 0 * * {corn_query}'
  164. elif cycle == '3':
  165. corn = f'0 0 * * *'
  166. else:
  167. corn=''
  168. # 创建新的预案记录
  169. start_time = body['start_time']
  170. if start_time =='':
  171. start_time = body['end_time']
  172. end_time = body['end_time']
  173. if end_time =='':
  174. end_time= body['start_time']
  175. if start_time == '' and end_time=='':
  176. start_time = end_time = datetime.now().strftime("%Y-%m-%d 00:00:00")
  177. new_task = RiskManagementInspectionTask(
  178. inspection_business=body['business'],
  179. start_time = start_time,
  180. end_time = end_time,
  181. inspection_cycle = cycle,
  182. corn_expression = corn,
  183. inspection_range = body['inspection_range'],
  184. task_status = '-1',
  185. create_by = user_id
  186. )
  187. # 添加到数据库会话并提交
  188. db.add(new_task)
  189. db.commit()
  190. db.refresh(new_task) # 可选,如果需要刷新实例状态
  191. new_task.task_number = f'YJXC{str(new_task.id).zfill(10)}'
  192. db.commit()
  193. # 返回创建成功的响应
  194. background_tasks.add_task(create_children_task,db,new_task,corn_query)
  195. return {
  196. "code": 200,
  197. "msg": "成功",
  198. "data": None
  199. }
  200. except Exception as e:
  201. # 处理异常
  202. traceback.print_exc()
  203. raise HTTPException(status_code=500, detail=str(e))
  204. @router.put('/update')
  205. async def update_inspection_task(
  206. db: Session = Depends(get_db),
  207. body = Depends(remove_xss_json),
  208. user_id = Depends(valid_access_token)
  209. ):
  210. try:
  211. # 提取请求数据
  212. query = db.query(RiskManagementInspectionTask)
  213. query = query.filter(RiskManagementInspectionTask.id == body['id'])
  214. query = query.filter(RiskManagementInspectionTask.del_flag != '2')
  215. task = query.first()
  216. if not task:
  217. detail = "任务不存在"
  218. raise HTTPException(status_code=404, detail="任务不存在")
  219. # if 'cycle' in body:
  220. # cycle = body['cycle']
  221. # # 0每年、1每月、2每周、3每日、4一次
  222. # corn_query = body['corn_query']
  223. # if cycle == '0':
  224. # corn = f'0 0 {corn_query} *'
  225. # elif cycle == '1':
  226. # corn = f'0 0 {corn_query} * *'
  227. # elif cycle == '2':
  228. # corn = f'0 0 * * {corn_query}'
  229. # elif cycle == '3':
  230. # corn = f'0 0 * * *'
  231. # else:
  232. # corn = ''
  233. # task.inspection_cycle = cycle
  234. # task.corn_expression = corn
  235. if 'business' in body:
  236. task.inspection_business = body['business']
  237. # if 'start_time' in body:
  238. # task.start_time = body['start_time']
  239. # if 'end_time' in body:
  240. # task.end_time = body['end_time']
  241. if 'inspection_range' in body:
  242. task.inspection_range = body['inspection_range']
  243. if 'task_status' in body:
  244. task.task_status = body['task_status']
  245. if user_id:
  246. task.update_by = user_id
  247. # 更新到数据库会话并提交
  248. db.commit()
  249. db.refresh(task) # 可选,如果需要刷新实例状态
  250. # 返回创建成功的响应
  251. return {
  252. "code": 200,
  253. "msg": "成功",
  254. "data": None
  255. }
  256. except Exception as e:
  257. # 处理异常
  258. if str(e)=='':
  259. e = detail
  260. raise HTTPException(status_code=500, detail=str(e))
  261. @router.delete('/delete')
  262. async def delete_inspection_tasks(
  263. taskIds: list,
  264. db: Session = Depends(get_db),
  265. body = Depends(remove_xss_json),
  266. user_id = Depends(valid_access_token)
  267. ):
  268. try:
  269. # 提取请求数据
  270. query = db.query(RiskManagementInspectionTask)
  271. query = query.filter(RiskManagementInspectionTask.del_flag != '2')
  272. query = query.filter(RiskManagementInspectionTask.id.in_(taskIds))
  273. tasks = query.all()
  274. if not tasks:
  275. detail = "任务不存在"
  276. raise HTTPException(status_code=404, detail="任务不存在")
  277. for task in tasks:
  278. task.del_flag = '2'
  279. task.update_by=user_id
  280. # 更新到数据库会话并提交
  281. db.commit()
  282. # 返回创建成功的响应
  283. return {
  284. "code": 200,
  285. "msg": "删除成功",
  286. "data": None
  287. }
  288. except Exception as e:
  289. # 处理异常
  290. traceback.print_exc()
  291. if str(e) == '':
  292. e = detail
  293. raise HTTPException(status_code=500, detail=str(e))
  294. @router.delete('/delete/{userId}')
  295. async def delete_inspection_task(
  296. userId: str,
  297. db: Session = Depends(get_db),
  298. body = Depends(remove_xss_json),
  299. user_id = Depends(valid_access_token)
  300. ):
  301. try:
  302. # 提取请求数据
  303. query = db.query(RiskManagementInspectionTask)
  304. query = query.filter(RiskManagementInspectionTask.del_flag != '2')
  305. query = query.filter(RiskManagementInspectionTask.id==userId)
  306. task = query.first()
  307. if not task:
  308. detail = "巡查任务不存在"
  309. raise HTTPException(status_code=404, detail="巡查任务不存在")
  310. task.del_flag = '2'
  311. task.update_by = user_id
  312. # 更新到数据库会话并提交
  313. db.commit()
  314. db.refresh(task) # 可选,如果需要刷新实例状态
  315. # 返回创建成功的响应
  316. return {
  317. "code": 200,
  318. "msg": "删除成功",
  319. "data": None
  320. }
  321. except Exception as e:
  322. # 处理异常
  323. traceback.print_exc()
  324. if str(e) == '':
  325. e = detail
  326. raise HTTPException(status_code=500, detail=str(e))
  327. ####小屏子任务查询
  328. @router.get('/children/task/list')
  329. async def get_inspection_task_list(
  330. search_keyword: str =Query(None, description='任务名称'),
  331. type: str =Query(None, description='类型'),
  332. page: int = Query(1, gt=0, description='页码'),
  333. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  334. db: Session = Depends(get_db),
  335. user_id = Depends(valid_access_token)
  336. ):
  337. try:
  338. # 构建查询
  339. # 查询用户负责层级
  340. task_range = user_id_get_task_range(db,user_id)
  341. #查询未办结巡查任务列表
  342. Task_list = db.query(RiskManagementInspectionTask).filter(RiskManagementInspectionTask.del_flag!='2').filter(RiskManagementInspectionTask.inspection_range.in_(task_range)).filter(RiskManagementInspectionTask.task_status!='3').all()
  343. #获取所有巡查任务id
  344. task_ids = [i.id for i in Task_list]
  345. #用户所有负责的区域
  346. user_area_code_list = db.query(RiskManagementInspectionUser).filter(RiskManagementInspectionUser.del_flag!='2').filter(RiskManagementInspectionUser.user_id==user_id).all()
  347. user_area_codes = [i.area_code for i in user_area_code_list]
  348. #查询子任务
  349. query = db.query(RiskManagementInspectionTaskChildrenTask)
  350. query = query.filter(RiskManagementInspectionTaskChildrenTask.del_flag != '2')
  351. # 应用查询条件
  352. # 查询小于今天
  353. query = query.filter(RiskManagementInspectionTaskChildrenTask.tsak_time <=datetime.now())
  354. # 查询层级、未办结子任务
  355. query = query.filter(RiskManagementInspectionTaskChildrenTask.task_range.in_(task_range))
  356. query = query.filter(RiskManagementInspectionTaskChildrenTask.task_id.in_(task_ids))
  357. # 计算总条目数
  358. if type:
  359. query = query.filter(RiskManagementInspectionTaskChildrenTask.type==type)
  360. total_items = query.count()
  361. # 排序
  362. query = query.order_by(RiskManagementInspectionTaskChildrenTask.tsak_time.asc())
  363. # 执行分页查询
  364. InspectionTasks = query.offset((page - 1) * pageSize).limit(pageSize).all()
  365. # 将查询结果转换为列表形式的字典
  366. InspectionTasks_list = []
  367. for task in InspectionTasks:
  368. # 判断这个任务该user_id完成了没
  369. tasklog = db.query(RiskManagementInspectionTaskChildrenTaskLog).\
  370. filter(RiskManagementInspectionTaskChildrenTaskLog.del_flag!='2').\
  371. filter(RiskManagementInspectionTaskChildrenTaskLog.children_task_id==task.id).\
  372. filter(RiskManagementInspectionTaskChildrenTaskLog.area_code.in_(user_area_codes)).all()
  373. task_area_code_list = [i.area_code for i in tasklog]
  374. query = db.query(RiskManagementInspectionUser).filter(RiskManagementInspectionUser.del_flag!='2').filter(RiskManagementInspectionUser.user_id==user_id)
  375. if task.task_range == '0' and '440900000000' not in task_area_code_list:
  376. user_range_area_codes= ['440900000000']
  377. elif task.task_range == '1':
  378. query = query.filter(
  379. and_(RiskManagementInspectionUser.area_code.like('%000000'), RiskManagementInspectionUser.area_code.notlike('%00000000'),~RiskManagementInspectionUser.area_code.in_(task_area_code_list)))
  380. user_range_area_codes= list({i.area_code for i in query.all()})
  381. elif task.task_range == '2':
  382. query = query.filter(and_(RiskManagementInspectionUser.area_code.like('%000'), RiskManagementInspectionUser.area_code.notlike('%000000'),~RiskManagementInspectionUser.area_code.in_(task_area_code_list)))
  383. user_range_area_codes= list({i.area_code for i in query.all()})
  384. elif task.task_range == '3':
  385. query = query.filter(RiskManagementInspectionUser.area_code.notlike('%000'),~RiskManagementInspectionUser.area_code.in_(task_area_code_list))
  386. user_range_area_codes= list({i.area_code for i in query.all()})
  387. else:
  388. user_range_area_codes= []
  389. for area_code in user_range_area_codes:
  390. task_info = {
  391. "id": task.id,
  392. "business": task.type,
  393. "task_range": task.task_range,
  394. "cycle": task.cycle,
  395. "area_code":area_code,
  396. "area": area_code_get_ancestors_names(db,area_code_get_area_info(db,area_code)),
  397. "task_time": task.tsak_time.strftime('%Y-%m-%d'),
  398. "create_time": task.create_time.strftime('%Y-%m-%d')
  399. }
  400. InspectionTasks_list.append(task_info)
  401. # 返回结果
  402. return {
  403. "code": 200,
  404. "msg": "成功",
  405. "data": InspectionTasks_list,
  406. "total": total_items,
  407. "page": page,
  408. "pageSize": pageSize,
  409. "totalPages": (total_items + pageSize - 1) // pageSize
  410. }
  411. except Exception as e:
  412. # 处理异常
  413. traceback.print_exc()
  414. raise HTTPException(status_code=500, detail=str(e))
  415. ##日历
  416. @router.get('/children/task/calendar/list')
  417. async def get_inspection_task_list(
  418. year_1: int =Query(None, description='年份'),
  419. month_1: int =Query(None, description='月份'),
  420. # page: int = Query(1, gt=0, description='页码'),
  421. # pageSize: int = Query(10, gt=0, description='每页条目数量'),
  422. db: Session = Depends(get_db),
  423. user_id = Depends(valid_access_token)
  424. ):
  425. try:
  426. # 构建查询
  427. import datetime as datetime_1
  428. task_range = user_id_get_task_range(db,user_id)
  429. Task_list = db.query(RiskManagementInspectionTask).filter(RiskManagementInspectionTask.del_flag!='2').filter(RiskManagementInspectionTask.inspection_range.in_(task_range)).all() #.filter(RiskManagementInspectionTask.task_status!='3')
  430. task_ids = [i.id for i in Task_list]
  431. user_area_code_list = db.query(RiskManagementInspectionUser).filter(RiskManagementInspectionUser.del_flag!='2').filter(RiskManagementInspectionUser.user_id==user_id).all()
  432. user_area_codes = [i.area_code for i in user_area_code_list]
  433. query = db.query(RiskManagementInspectionTaskChildrenTask)
  434. query = query.filter(RiskManagementInspectionTaskChildrenTask.del_flag != '2')
  435. # 应用查询条件
  436. current_date = datetime.today()
  437. if year_1 is None:
  438. year_1 =current_date.year
  439. if month_1 is None:
  440. month_1 = current_date.month
  441. if month_1==12:
  442. query = query.filter(RiskManagementInspectionTaskChildrenTask.tsak_time < datetime_1.date(year_1+1, 1, 1))
  443. else:
  444. query = query.filter(RiskManagementInspectionTaskChildrenTask.tsak_time < datetime_1.date(year_1, month_1 + 1, 1))
  445. query = query.filter(RiskManagementInspectionTaskChildrenTask.tsak_time >= datetime_1.date(year_1, month_1, 1))
  446. # query = query.filter(RiskManagementInspectionTaskChildrenTask.tsak_time <=datetime.now())
  447. query = query.filter(RiskManagementInspectionTaskChildrenTask.task_range.in_(task_range))
  448. query = query.filter(RiskManagementInspectionTaskChildrenTask.task_id.in_(task_ids))
  449. # 计算总条目数
  450. total_items = query.count()
  451. print(total_items)
  452. result = []
  453. # 获取指定月份的第一天是周几
  454. # first_day = datetime.date(yaer_1, month_1, 1)
  455. # 计算该月的天数
  456. if month_1 == 12:
  457. number_of_days = (datetime_1.date(year_1+1, 1, 1) - datetime_1.timedelta(days=1)).day
  458. else:
  459. number_of_days = (datetime_1.date(year_1, month_1 + 1, 1) - datetime_1.timedelta(days=1)).day
  460. # 遍历该月的每一天
  461. for day in range(1, number_of_days + 1):
  462. # 创建日期对象
  463. date_obj = datetime_1.date(year_1, month_1, day)
  464. # 获取星期(0是周一,6是周日)
  465. week_day = date_obj.weekday()
  466. # 将星期转换为中文
  467. week_day_cn = "一二三四五六日"[week_day]
  468. data = {"day":day,"date":f"{year_1}-{month_1}-{day}","week":f'周{week_day_cn}',"status":0}
  469. if date_obj==datetime_1.date.today():
  470. data['status']=4
  471. # 排序
  472. # total_items = query.count()
  473. # print( '前',total_items)
  474. # print(datetime_1.date(year_1, month_1, day))
  475. query_1 = query.filter(
  476. RiskManagementInspectionTaskChildrenTask.tsak_time == datetime_1.date(year_1, month_1, day))
  477. # query = query.order_by(RiskManagementInspectionTaskChildrenTask.tsak_time.asc())
  478. # total_items = query_1.count()
  479. # print( '后',total_items)
  480. InspectionTasks = query_1.all()
  481. # 将查询结果转换为列表形式的字典
  482. InspectionTasks_list = []
  483. for task in InspectionTasks:
  484. # 判断这个任务该user_id完成了没
  485. # tasklog = db.query(RiskManagementInspectionTaskChildrenTaskLog).\
  486. # filter(RiskManagementInspectionTaskChildrenTaskLog.del_flag!='2').\
  487. # filter(RiskManagementInspectionTaskChildrenTaskLog.children_task_id==task.id).\
  488. # filter(RiskManagementInspectionTaskChildrenTaskLog.area_code.in_(user_area_codes)).all()
  489. # task_area_code_list = [i.area_code for i in tasklog]
  490. query_2 = db.query(RiskManagementInspectionUser).filter(RiskManagementInspectionUser.del_flag!='2').filter(RiskManagementInspectionUser.user_id==user_id)
  491. if task.task_range == '0':
  492. user_range_area_codes= ['440900000000']
  493. elif task.task_range == '1':
  494. query_2 = query_2.filter(
  495. and_(RiskManagementInspectionUser.area_code.like('%000000'), RiskManagementInspectionUser.area_code.notlike('%00000000')))
  496. user_range_area_codes= list({i.area_code for i in query_2.all()})
  497. elif task.task_range == '2':
  498. query_2 = query_2.filter(and_(RiskManagementInspectionUser.area_code.like('%000'), RiskManagementInspectionUser.area_code.notlike('%000000')))
  499. user_range_area_codes= list({i.area_code for i in query_2.all()})
  500. elif task.task_range == '3':
  501. query_2 = query_2.filter(RiskManagementInspectionUser.area_code.notlike('%000'))
  502. user_range_area_codes= list({i.area_code for i in query_2.all()})
  503. else:
  504. user_range_area_codes= []
  505. print(task.task_range)
  506. print(user_range_area_codes)
  507. for area_code in user_range_area_codes:
  508. tasklog = db.query(RiskManagementInspectionTaskChildrenTaskLog). \
  509. filter(RiskManagementInspectionTaskChildrenTaskLog.del_flag != '2'). \
  510. filter(RiskManagementInspectionTaskChildrenTaskLog.children_task_id == task.id). \
  511. filter(RiskManagementInspectionTaskChildrenTaskLog.area_code==area_code).first()
  512. task_info = {
  513. "id": task.id,
  514. "business": task.type,
  515. "task_range": task.task_range,
  516. "cycle": task.cycle,
  517. "area_code":area_code,
  518. "area": area_code_get_ancestors_names(db,area_code_get_area_info(db,area_code)),
  519. "task_status": tasklog is not None,
  520. "task_time": task.tsak_time.strftime('%Y-%m-%d'),
  521. "create_time": task.create_time.strftime('%Y-%m-%d %H:%M')
  522. }
  523. if tasklog :
  524. task_info['create_time'] = tasklog.create_time.strftime('%Y-%m-%d %H:%M')
  525. if task.tsak_time<datetime.today() and data['status']<1:
  526. data['status'] = 1 #有事已完成
  527. # elif tasklog.tsak_time > datetime.today():
  528. # data['status'] = 3 # 未来有事
  529. else:
  530. if task.tsak_time < datetime.today() and data['status'] < 2:
  531. data['status'] = 2 # 有事未完成
  532. elif task.tsak_time > datetime.today():
  533. data['status'] = 3 # 未来有事
  534. InspectionTasks_list.append(task_info)
  535. data['task_list']=InspectionTasks_list
  536. result.append(data)
  537. # 返回结果
  538. return {
  539. "code": 200,
  540. "msg": "成功",
  541. "data": result
  542. }
  543. except Exception as e:
  544. # 处理异常
  545. traceback.print_exc()
  546. raise HTTPException(status_code=500, detail=str(e))
  547. @router.get('/children/task/records')
  548. async def get_children_task_records_list(
  549. search_keyword: str =Query(None, description='任务名称'),
  550. type: str =Query(None, description='类型'),
  551. page: int = Query(1, gt=0, description='页码'),
  552. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  553. db: Session = Depends(get_db),
  554. user_id = Depends(valid_access_token)
  555. ):
  556. try:
  557. # 获取子任务id
  558. query = db.query(RiskManagementInspectionTaskChildrenTask)
  559. query = query.filter(RiskManagementInspectionTaskChildrenTask.del_flag != '2')
  560. if type:
  561. query = query.filter(RiskManagementInspectionTaskChildrenTask.type==type)
  562. children_ids = [i.id for i in query.all()]
  563. print(children_ids)
  564. # 构建查询
  565. query = db.query(RiskManagementInspectionTaskChildrenTaskLog)
  566. query = query.filter(RiskManagementInspectionTaskChildrenTaskLog.del_flag != '2')
  567. query = query.filter(RiskManagementInspectionTaskChildrenTaskLog.user_id == user_id)
  568. query = query.filter(RiskManagementInspectionTaskChildrenTaskLog.children_task_id.in_(children_ids))
  569. total_items = query.count()
  570. # 排序
  571. query = query.order_by(RiskManagementInspectionTaskChildrenTaskLog.create_time.desc())
  572. # 执行分页查询
  573. InspectionTasks = query.offset((page - 1) * pageSize).limit(pageSize).all()
  574. # 将查询结果转换为列表形式的字典
  575. InspectionTasks_list = []
  576. for task in InspectionTasks:
  577. children_task = inspection_task_children_task_id_get_inspection_task_children_task_info(db,task.children_task_id)
  578. task_info = {
  579. "id": task.children_task_id,
  580. "business": children_task.type,
  581. "task_range": children_task.task_range,
  582. "cycle": children_task.cycle,
  583. "area_code": task.area_code,
  584. "area": area_code_get_ancestors_names(db, area_code_get_area_info(db, task.area_code)),
  585. "task_time": children_task.tsak_time.strftime('%Y-%m-%d'),
  586. "create_time": task.create_time.strftime('%Y-%m-%d %H:%M')
  587. }
  588. InspectionTasks_list.append(task_info)
  589. # 返回结果
  590. return {
  591. "code": 200,
  592. "msg": "成功",
  593. "data": InspectionTasks_list,
  594. "total": total_items,
  595. "page": page,
  596. "pageSize": pageSize,
  597. "totalPages": (total_items + pageSize - 1) // pageSize
  598. }
  599. except Exception as e:
  600. # 处理异常
  601. traceback.print_exc()
  602. raise HTTPException(status_code=500, detail=str(e))
  603. @router.get('/children/task/result/{children_task_id}')
  604. async def get_children_task_result(
  605. children_task_id: str ,
  606. db: Session = Depends(get_db),
  607. page: int = Query(1, gt=0, description='页码'),
  608. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  609. user_id = Depends(valid_access_token)
  610. ):
  611. try:
  612. # 构建查询
  613. query = db.query(RiskManagementInspectionTaskChildrenTaskResult)
  614. query = query.filter(RiskManagementInspectionTaskChildrenTaskResult.del_flag != '2')
  615. # 应用查询条件
  616. query = query.filter(RiskManagementInspectionTaskChildrenTaskResult.children_task_id == children_task_id)
  617. # 计算总条目数
  618. total_items = query.count()
  619. # 排序
  620. query = query.order_by(RiskManagementInspectionTaskChildrenTaskResult.create_time.desc())
  621. # 执行分页查询
  622. InspectionTasks = query.offset((page - 1) * pageSize).limit(pageSize).all()
  623. InspectionTasks_list = []
  624. for task in InspectionTasks:
  625. area_code = task.area_code
  626. area = area_code_get_area_info(db, area_code)
  627. area = area_code_get_ancestors_names(db, area)
  628. task_info = {
  629. "id": task.id,
  630. # "children_task_id": task.children_task_id,
  631. "type":inspection_task_children_task_id_get_inspection_task_children_task_info(db,task.children_task_id).type,
  632. "inspection_point_name": task.inspection_point_name,
  633. # "area": area,
  634. # "create_time": task.create_time.strftime('%Y-%m-%d'),
  635. # "nick_name": task.nick_name,
  636. "inspection_result": task.inspection_result,
  637. "remark": task.remark,
  638. "fileList": get_file_query_fun(db=db, from_scenario='RiskManagementInspectionTaskChildrenTaskResult',
  639. foreign_key=task.id)
  640. }
  641. InspectionTasks_list.append(task_info)
  642. # 返回结果
  643. return {
  644. "code": 200,
  645. "msg": "成功",
  646. "data": InspectionTasks_list,
  647. "total": total_items,
  648. "page": page,
  649. "pageSize": pageSize,
  650. "totalPages": (total_items + pageSize - 1) // pageSize
  651. }
  652. except Exception as e:
  653. # 处理异常
  654. traceback.print_exc()
  655. raise HTTPException(status_code=500, detail=str(e))
  656. @router.post('/children/task/result/create')
  657. async def create_inspection_task(
  658. db: Session = Depends(get_db),
  659. body = Depends(remove_xss_json),
  660. user_id = Depends(valid_access_token)
  661. ):
  662. try:
  663. children_task_id = body['children_task_id']
  664. result = body['result']
  665. area_code = body['area_code']
  666. area =area_code_get_ancestors_names(db, area_code_get_area_info(db, area_code))
  667. # task_time = body['task_time']
  668. # 创建新的
  669. new_task_log = RiskManagementInspectionTaskChildrenTaskLog(
  670. id=new_guid(),
  671. children_task_id=children_task_id,
  672. area_code = area_code,
  673. area = area,
  674. task_status = '1',
  675. user_id = user_id,
  676. nick_name = user_id_get_user_info(db,user_id).nick_name,
  677. create_by = user_id
  678. )
  679. for info in result:
  680. new_file_list = info['fileList']
  681. inspection_point_name= info['inspection_point_name']
  682. inspection_result = info['inspection_result']
  683. remark = info['remark']
  684. new_task_result = RiskManagementInspectionTaskChildrenTaskResult(
  685. id=new_guid(),
  686. children_task_id=children_task_id,
  687. inspection_point_name=inspection_point_name,
  688. area_code=area_code,
  689. inspection_result=inspection_result,
  690. remark = remark,
  691. user_id = user_id,
  692. nick_name = user_id_get_user_info(db,user_id).nick_name,
  693. create_by = user_id
  694. )
  695. db.add(new_task_result)
  696. for file in new_file_list:
  697. file_name = file['file_name']
  698. file_name_desc = file['file_name_desc']
  699. status = file['status']
  700. new_file = RiskManagementFile(
  701. file_id=new_guid(),
  702. foreign_key=new_task_result.id,
  703. from_scenario='RiskManagementInspectionTaskChildrenTaskResult',
  704. file_name=file_name,
  705. file_name_desc=file_name_desc,
  706. status=status
  707. )
  708. db.add(new_file)
  709. # 添加到数据库会话并提交
  710. db.add(new_task_log)
  711. db.commit()
  712. # 标记消息已读
  713. child_task_info = db.query(RiskManagementInspectionTaskChildrenTask).filter(RiskManagementInspectionTaskChildrenTask.id == children_task_id).first()
  714. if child_task_info is not None:
  715. logger.info("标记[隐患巡查任务]已读 {}", str(child_task_info.task_id))
  716. db_msg_center.update_msg_read(db, user_id, "隐患巡查", str(child_task_info.task_id))
  717. # 返回创建成功的响应
  718. return {
  719. "code": 200,
  720. "msg": "成功",
  721. "data": None
  722. }
  723. except Exception as e:
  724. # 处理异常
  725. traceback.print_exc()
  726. raise HTTPException(status_code=500, detail=str(e))
  727. ####中屏子任务
  728. @router.get('/children/task/{task_id}/list')
  729. async def get_inspection_task_list(
  730. task_id: str ,
  731. page: int = Query(1, gt=0, description='页码'),
  732. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  733. db: Session = Depends(get_db),
  734. user_id = Depends(valid_access_token)
  735. ):
  736. try:
  737. # 构建查询
  738. query = db.query(RiskManagementInspectionTaskChildrenTask)
  739. query = query.filter(RiskManagementInspectionTaskChildrenTask.del_flag != '2')
  740. # 应用查询条件
  741. query = query.filter(RiskManagementInspectionTaskChildrenTask.task_id == task_id)
  742. # 计算总条目数
  743. total_items = query.count()
  744. # 排序
  745. query = query.order_by(RiskManagementInspectionTaskChildrenTask.tsak_time.asc())
  746. # 执行分页查询
  747. InspectionTasks = query.offset((page - 1) * pageSize).limit(pageSize).all()
  748. # 将查询结果转换为列表形式的字典
  749. InspectionTasks_list = []
  750. for task in InspectionTasks:
  751. task_num=task.task_num
  752. completed_num = db.query(RiskManagementInspectionTaskChildrenTaskLog)\
  753. .filter(RiskManagementInspectionTaskChildrenTaskLog.del_flag!='2')\
  754. .filter(RiskManagementInspectionTaskChildrenTaskLog.children_task_id==task.id).count()
  755. incomplete_num = task_num-completed_num
  756. task_info = {
  757. "id": task.id,
  758. "task_id":task.task_id,
  759. "task_number": task.task_number,
  760. "business": task.type,
  761. "task_time": task.tsak_time.strftime('%Y-%m-%d'),
  762. "cycle": task.cycle,
  763. "inspection_range": task.task_range,
  764. "completed_num": completed_num,
  765. "incomplete_num": incomplete_num,
  766. "create_time": task.create_time.strftime('%Y-%m-%d')
  767. }
  768. InspectionTasks_list.append(task_info)
  769. # 返回结果
  770. return {
  771. "code": 200,
  772. "msg": "成功",
  773. "data": InspectionTasks_list,
  774. "total": total_items,
  775. "page": page,
  776. "pageSize": pageSize,
  777. "totalPages": (total_items + pageSize - 1) // pageSize
  778. }
  779. except Exception as e:
  780. # 处理异常
  781. traceback.print_exc()
  782. raise HTTPException(status_code=500, detail=str(e))
  783. @router.get('/children/task/log/{children_task_id}/{status}/list')
  784. async def get_inspection_task_list(
  785. children_task_id: str ,
  786. status:str,
  787. area_code: str = Query(None, description='区划编码'),
  788. page: int = Query(1, gt=0, description='页码'),
  789. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  790. db: Session = Depends(get_db),
  791. user_id = Depends(valid_access_token)
  792. ):
  793. try:
  794. # 构建查询
  795. total_items= 0
  796. InspectionTasks_list = []
  797. if status=='completed':
  798. query = db.query(RiskManagementInspectionTaskChildrenTaskLog)
  799. query = query.filter(RiskManagementInspectionTaskChildrenTaskLog.del_flag != '2')
  800. # 应用查询条件
  801. query = query.filter(RiskManagementInspectionTaskChildrenTaskLog.children_task_id == children_task_id)
  802. if area_code:
  803. query = query.filter(RiskManagementInspectionTaskChildrenTaskLog.area_code == area_code)
  804. # 计算总条目数
  805. total_items = query.count()
  806. # 排序
  807. query = query.order_by(RiskManagementInspectionTaskChildrenTaskLog.create_time.desc())
  808. # 执行分页查询
  809. InspectionTasks = query.offset((page - 1) * pageSize).limit(pageSize).all()
  810. # 将查询结果转换为列表形式的字典
  811. for task in InspectionTasks:
  812. task_info = {
  813. "id": task.id,
  814. "children_task_id":children_task_id,
  815. "area_code": task.area_code,
  816. "area": task.area,
  817. "task_status": task.task_status,
  818. "user_id": task.user_id,
  819. "nick_name": task.nick_name,
  820. "create_time": task.create_time.strftime('%Y-%m-%d')
  821. }
  822. InspectionTasks_list.append(task_info)
  823. # 返回结果
  824. elif status == 'incomplete':
  825. children_task = inspection_task_children_task_id_get_inspection_task_children_task_info(db,children_task_id)
  826. if children_task:
  827. task = inspection_task_id_get_inspection_task_info(db,children_task.task_id)
  828. if task:
  829. 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)]
  830. # area_code_list1 = get_area_code_exclude_list(db,task.inspection_range,complete_area_code_list)
  831. if area_code:# and area_code in area_code_list:
  832. area_code_list = area_code_rang_get_area_children_list(db,children_task.task_range,area_code,complete_area_code_list)#[area_code]
  833. # print(area_code_list)
  834. # elif area_code and area_code not in area_code_list:
  835. # area_code_list = []
  836. else:
  837. area_code_list = get_area_code_exclude_list(db, task.inspection_range, complete_area_code_list)
  838. for area_code in area_code_list:
  839. # if area_code in area_code_list1:
  840. task_info = {
  841. "id": new_guid(),
  842. "children_task_id": children_task_id,
  843. "area_code": area_code,
  844. "area": area_code_get_ancestors_names(db,area_code_get_area_info(db,area_code)),
  845. "task_status": '0',
  846. "user_id": '',
  847. "nick_name": '',
  848. "create_time": children_task.tsak_time.strftime('%Y-%m-%d')
  849. }
  850. InspectionTasks_list.append(task_info)
  851. return {
  852. "code": 200,
  853. "msg": "成功",
  854. "data": InspectionTasks_list,
  855. "total": total_items,
  856. "page": page,
  857. "pageSize": pageSize,
  858. "totalPages": (total_items + pageSize - 1) // pageSize
  859. }
  860. except Exception as e:
  861. # 处理异常
  862. traceback.print_exc()
  863. raise HTTPException(status_code=500, detail=str(e))
  864. @router.get('/children/task/result/{children_task_id}/list')
  865. async def get_inspection_task_list(
  866. children_task_id: str ,
  867. area_code: str = Query(None, description='区划编码'),
  868. inspection_result: str = Query(None, description='巡查结果'),
  869. nick_name: str = Query(None, description='姓名'),
  870. page: int = Query(1, gt=0, description='页码'),
  871. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  872. db: Session = Depends(get_db),
  873. user_id = Depends(valid_access_token)
  874. ):
  875. try:
  876. # 构建查询
  877. query = db.query(RiskManagementInspectionTaskChildrenTaskResult)
  878. query = query.filter(RiskManagementInspectionTaskChildrenTaskResult.del_flag != '2')
  879. query = query.filter(RiskManagementInspectionTaskChildrenTaskResult.children_task_id == children_task_id)
  880. # 应用查询条件
  881. if area_code:
  882. query = query.filter(RiskManagementInspectionTaskChildrenTaskResult.area_code == area_code)
  883. if inspection_result:
  884. query = query.filter(RiskManagementInspectionTaskChildrenTaskResult.inspection_result == inspection_result)
  885. if nick_name:
  886. query = query.filter(RiskManagementInspectionTaskChildrenTaskResult.nick_name.like(f'%{nick_name}%') )
  887. # 计算总条目数
  888. total_items = query.count()
  889. # 排序
  890. query = query.order_by(RiskManagementInspectionTaskChildrenTaskResult.create_time.desc())
  891. # 执行分页查询
  892. InspectionTasks = query.offset((page - 1) * pageSize).limit(pageSize).all()
  893. # 将查询结果转换为列表形式的字典
  894. InspectionTasks_list = []
  895. for task in InspectionTasks:
  896. area_code = task.area_code
  897. area = area_code_get_area_info(db, area_code)
  898. area = area_code_get_ancestors_names(db, area)
  899. task_info = {
  900. "id": task.id,
  901. "children_task_id": task.children_task_id,
  902. "inspection_point_name":task.inspection_point_name,
  903. "area": area,
  904. "create_time": task.create_time.strftime('%Y-%m-%d'),
  905. "nick_name": task.nick_name,
  906. "inspection_result": task.inspection_result,
  907. "fileList": get_file_query_fun(db=db,from_scenario='RiskManagementInspectionTaskChildrenTaskResult', foreign_key=task.id),
  908. "remark":task.remark
  909. }
  910. InspectionTasks_list.append(task_info)
  911. # 返回结果
  912. return {
  913. "code": 200,
  914. "msg": "成功",
  915. "data": InspectionTasks_list,
  916. "total": total_items,
  917. "page": page,
  918. "pageSize": pageSize,
  919. "totalPages": (total_items + pageSize - 1) // pageSize
  920. }
  921. except Exception as e:
  922. # 处理异常
  923. traceback.print_exc()
  924. raise HTTPException(status_code=500, detail=str(e))