task.py 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973
  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. ####小屏子任务查询
  310. @router.get('/children/task/list')
  311. async def get_inspection_task_list(
  312. search_keyword: str =Query(None, description='任务名称'),
  313. type: str =Query(None, description='类型'),
  314. page: int = Query(1, gt=0, description='页码'),
  315. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  316. db: Session = Depends(get_db),
  317. user_id = Depends(valid_access_token)
  318. ):
  319. try:
  320. # 构建查询
  321. # 查询用户负责层级
  322. task_range = user_id_get_task_range(db,user_id)
  323. #查询未办结巡查任务列表
  324. Task_list = db.query(RiskManagementInspectionTask).filter(RiskManagementInspectionTask.del_flag!='2').filter(RiskManagementInspectionTask.inspection_range.in_(task_range)).filter(RiskManagementInspectionTask.task_status!='3').all()
  325. #获取所有巡查任务id
  326. task_ids = [i.id for i in Task_list]
  327. #用户所有负责的区域
  328. user_area_code_list = db.query(RiskManagementInspectionUser).filter(RiskManagementInspectionUser.del_flag!='2').filter(RiskManagementInspectionUser.user_id==user_id).all()
  329. user_area_codes = [i.area_code for i in user_area_code_list]
  330. #查询子任务
  331. query = db.query(RiskManagementInspectionTaskChildrenTask)
  332. query = query.filter(RiskManagementInspectionTaskChildrenTask.del_flag != '2')
  333. # 应用查询条件
  334. # 查询小于今天
  335. query = query.filter(RiskManagementInspectionTaskChildrenTask.tsak_time <=datetime.now())
  336. # 查询层级、未办结子任务
  337. query = query.filter(RiskManagementInspectionTaskChildrenTask.task_range.in_(task_range))
  338. query = query.filter(RiskManagementInspectionTaskChildrenTask.task_id.in_(task_ids))
  339. # 计算总条目数
  340. if type:
  341. query = query.filter(RiskManagementInspectionTaskChildrenTask.type==type)
  342. total_items = query.count()
  343. # 排序
  344. query = query.order_by(RiskManagementInspectionTaskChildrenTask.tsak_time.asc())
  345. # 执行分页查询
  346. InspectionTasks = query.offset((page - 1) * pageSize).limit(pageSize).all()
  347. # 将查询结果转换为列表形式的字典
  348. InspectionTasks_list = []
  349. for task in InspectionTasks:
  350. # 判断这个任务该user_id完成了没
  351. tasklog = db.query(RiskManagementInspectionTaskChildrenTaskLog).\
  352. filter(RiskManagementInspectionTaskChildrenTaskLog.del_flag!='2').\
  353. filter(RiskManagementInspectionTaskChildrenTaskLog.children_task_id==task.id).\
  354. filter(RiskManagementInspectionTaskChildrenTaskLog.area_code.in_(user_area_codes)).all()
  355. task_area_code_list = [i.area_code for i in tasklog]
  356. query = db.query(RiskManagementInspectionUser).filter(RiskManagementInspectionUser.del_flag!='2').filter(RiskManagementInspectionUser.user_id==user_id)
  357. if task.task_range == '0' and '440900000000' not in task_area_code_list:
  358. user_range_area_codes= ['440900000000']
  359. elif task.task_range == '1':
  360. query = query.filter(
  361. and_(RiskManagementInspectionUser.area_code.like('%000000'), RiskManagementInspectionUser.area_code.notlike('%00000000'),~RiskManagementInspectionUser.area_code.in_(task_area_code_list)))
  362. user_range_area_codes= list({i.area_code for i in query.all()})
  363. elif task.task_range == '2':
  364. query = query.filter(and_(RiskManagementInspectionUser.area_code.like('%000'), RiskManagementInspectionUser.area_code.notlike('%000000'),~RiskManagementInspectionUser.area_code.in_(task_area_code_list)))
  365. user_range_area_codes= list({i.area_code for i in query.all()})
  366. elif task.task_range == '3':
  367. query = query.filter(RiskManagementInspectionUser.area_code.notlike('%000'),~RiskManagementInspectionUser.area_code.in_(task_area_code_list))
  368. user_range_area_codes= list({i.area_code for i in query.all()})
  369. else:
  370. user_range_area_codes= []
  371. for area_code in user_range_area_codes:
  372. task_info = {
  373. "id": task.id,
  374. "business": task.type,
  375. "task_range": task.task_range,
  376. "cycle": task.cycle,
  377. "area_code":area_code,
  378. "area": area_code_get_ancestors_names(db,area_code_get_area_info(db,area_code)),
  379. "task_time": task.tsak_time.strftime('%Y-%m-%d'),
  380. "create_time": task.create_time.strftime('%Y-%m-%d')
  381. }
  382. InspectionTasks_list.append(task_info)
  383. # 返回结果
  384. return {
  385. "code": 200,
  386. "msg": "成功",
  387. "data": InspectionTasks_list,
  388. "total": total_items,
  389. "page": page,
  390. "pageSize": pageSize,
  391. "totalPages": (total_items + pageSize - 1) // pageSize
  392. }
  393. except Exception as e:
  394. # 处理异常
  395. traceback.print_exc()
  396. raise HTTPException(status_code=500, detail=str(e))
  397. ##日历
  398. @router.get('/children/task/calendar/list')
  399. async def get_inspection_task_list(
  400. year_1: int =Query(None, description='年份'),
  401. month_1: int =Query(None, description='月份'),
  402. # page: int = Query(1, gt=0, description='页码'),
  403. # pageSize: int = Query(10, gt=0, description='每页条目数量'),
  404. db: Session = Depends(get_db),
  405. user_id = Depends(valid_access_token)
  406. ):
  407. try:
  408. # 构建查询
  409. import datetime as datetime_1
  410. task_range = user_id_get_task_range(db,user_id)
  411. Task_list = db.query(RiskManagementInspectionTask).filter(RiskManagementInspectionTask.del_flag!='2').filter(RiskManagementInspectionTask.inspection_range.in_(task_range)).all() #.filter(RiskManagementInspectionTask.task_status!='3')
  412. task_ids = [i.id for i in Task_list]
  413. user_area_code_list = db.query(RiskManagementInspectionUser).filter(RiskManagementInspectionUser.del_flag!='2').filter(RiskManagementInspectionUser.user_id==user_id).all()
  414. user_area_codes = [i.area_code for i in user_area_code_list]
  415. query = db.query(RiskManagementInspectionTaskChildrenTask)
  416. query = query.filter(RiskManagementInspectionTaskChildrenTask.del_flag != '2')
  417. # 应用查询条件
  418. current_date = datetime.today()
  419. if year_1 is None:
  420. year_1 =current_date.year
  421. if month_1 is None:
  422. month_1 = current_date.month
  423. query = query.filter(RiskManagementInspectionTaskChildrenTask.tsak_time < datetime_1.date(year_1, month_1 + 1, 1))
  424. query = query.filter(RiskManagementInspectionTaskChildrenTask.tsak_time >= datetime_1.date(year_1, month_1, 1))
  425. # query = query.filter(RiskManagementInspectionTaskChildrenTask.tsak_time <=datetime.now())
  426. query = query.filter(RiskManagementInspectionTaskChildrenTask.task_range.in_(task_range))
  427. query = query.filter(RiskManagementInspectionTaskChildrenTask.task_id.in_(task_ids))
  428. # 计算总条目数
  429. total_items = query.count()
  430. print(total_items)
  431. result = []
  432. # 获取指定月份的第一天是周几
  433. # first_day = datetime.date(yaer_1, month_1, 1)
  434. # 计算该月的天数
  435. number_of_days = (datetime_1.date(year_1, month_1 + 1, 1) - datetime_1.timedelta(days=1)).day
  436. # 遍历该月的每一天
  437. for day in range(1, number_of_days + 1):
  438. # 创建日期对象
  439. date_obj = datetime_1.date(year_1, month_1, day)
  440. # 获取星期(0是周一,6是周日)
  441. week_day = date_obj.weekday()
  442. # 将星期转换为中文
  443. week_day_cn = "一二三四五六日"[week_day]
  444. data = {"day":day,"date":f"{year_1}-{month_1}-{day}","week":f'周{week_day_cn}',"status":0}
  445. if date_obj==datetime_1.date.today():
  446. data['status']=4
  447. # 排序
  448. # total_items = query.count()
  449. # print( '前',total_items)
  450. # print(datetime_1.date(year_1, month_1, day))
  451. query_1 = query.filter(
  452. RiskManagementInspectionTaskChildrenTask.tsak_time == datetime_1.date(year_1, month_1, day))
  453. # query = query.order_by(RiskManagementInspectionTaskChildrenTask.tsak_time.asc())
  454. # total_items = query_1.count()
  455. # print( '后',total_items)
  456. InspectionTasks = query_1.all()
  457. # 将查询结果转换为列表形式的字典
  458. InspectionTasks_list = []
  459. for task in InspectionTasks:
  460. # 判断这个任务该user_id完成了没
  461. # tasklog = db.query(RiskManagementInspectionTaskChildrenTaskLog).\
  462. # filter(RiskManagementInspectionTaskChildrenTaskLog.del_flag!='2').\
  463. # filter(RiskManagementInspectionTaskChildrenTaskLog.children_task_id==task.id).\
  464. # filter(RiskManagementInspectionTaskChildrenTaskLog.area_code.in_(user_area_codes)).all()
  465. # task_area_code_list = [i.area_code for i in tasklog]
  466. query_2 = db.query(RiskManagementInspectionUser).filter(RiskManagementInspectionUser.del_flag!='2').filter(RiskManagementInspectionUser.user_id==user_id)
  467. if task.task_range == '0':
  468. user_range_area_codes= ['440900000000']
  469. elif task.task_range == '1':
  470. query_2 = query_2.filter(
  471. and_(RiskManagementInspectionUser.area_code.like('%000000'), RiskManagementInspectionUser.area_code.notlike('%00000000')))
  472. user_range_area_codes= list({i.area_code for i in query_2.all()})
  473. elif task.task_range == '2':
  474. query_2 = query_2.filter(and_(RiskManagementInspectionUser.area_code.like('%000'), RiskManagementInspectionUser.area_code.notlike('%000000')))
  475. user_range_area_codes= list({i.area_code for i in query_2.all()})
  476. elif task.task_range == '3':
  477. query_2 = query_2.filter(RiskManagementInspectionUser.area_code.notlike('%000'))
  478. user_range_area_codes= list({i.area_code for i in query_2.all()})
  479. else:
  480. user_range_area_codes= []
  481. print(task.task_range)
  482. print(user_range_area_codes)
  483. for area_code in user_range_area_codes:
  484. tasklog = db.query(RiskManagementInspectionTaskChildrenTaskLog). \
  485. filter(RiskManagementInspectionTaskChildrenTaskLog.del_flag != '2'). \
  486. filter(RiskManagementInspectionTaskChildrenTaskLog.children_task_id == task.id). \
  487. filter(RiskManagementInspectionTaskChildrenTaskLog.area_code==area_code).first()
  488. task_info = {
  489. "id": task.id,
  490. "business": task.type,
  491. "task_range": task.task_range,
  492. "cycle": task.cycle,
  493. "area_code":area_code,
  494. "area": area_code_get_ancestors_names(db,area_code_get_area_info(db,area_code)),
  495. "task_status": tasklog is not None,
  496. "task_time": task.tsak_time.strftime('%Y-%m-%d'),
  497. "create_time": task.create_time.strftime('%Y-%m-%d %H:%M')
  498. }
  499. if tasklog :
  500. task_info['create_time'] = tasklog.create_time.strftime('%Y-%m-%d %H:%M')
  501. if task.tsak_time<datetime.today() and data['status']<1:
  502. data['status'] = 1 #有事已完成
  503. # elif tasklog.tsak_time > datetime.today():
  504. # data['status'] = 3 # 未来有事
  505. else:
  506. if task.tsak_time < datetime.today() and data['status'] < 2:
  507. data['status'] = 2 # 有事未完成
  508. elif task.tsak_time > datetime.today():
  509. data['status'] = 3 # 未来有事
  510. InspectionTasks_list.append(task_info)
  511. data['task_list']=InspectionTasks_list
  512. result.append(data)
  513. # 返回结果
  514. return {
  515. "code": 200,
  516. "msg": "成功",
  517. "data": result
  518. }
  519. except Exception as e:
  520. # 处理异常
  521. traceback.print_exc()
  522. raise HTTPException(status_code=500, detail=str(e))
  523. @router.get('/children/task/records')
  524. async def get_children_task_records_list(
  525. search_keyword: str =Query(None, description='任务名称'),
  526. type: str =Query(None, description='类型'),
  527. page: int = Query(1, gt=0, description='页码'),
  528. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  529. db: Session = Depends(get_db),
  530. user_id = Depends(valid_access_token)
  531. ):
  532. try:
  533. # 获取子任务id
  534. query = db.query(RiskManagementInspectionTaskChildrenTask)
  535. query = query.filter(RiskManagementInspectionTaskChildrenTask.del_flag != '2')
  536. if type:
  537. query = query.filter(RiskManagementInspectionTaskChildrenTask.type==type)
  538. children_ids = [i.id for i in query.all()]
  539. print(children_ids)
  540. # 构建查询
  541. query = db.query(RiskManagementInspectionTaskChildrenTaskLog)
  542. query = query.filter(RiskManagementInspectionTaskChildrenTaskLog.del_flag != '2')
  543. query = query.filter(RiskManagementInspectionTaskChildrenTaskLog.user_id == user_id)
  544. query = query.filter(RiskManagementInspectionTaskChildrenTaskLog.children_task_id.in_(children_ids))
  545. total_items = query.count()
  546. # 排序
  547. query = query.order_by(RiskManagementInspectionTaskChildrenTaskLog.create_time.desc())
  548. # 执行分页查询
  549. InspectionTasks = query.offset((page - 1) * pageSize).limit(pageSize).all()
  550. # 将查询结果转换为列表形式的字典
  551. InspectionTasks_list = []
  552. for task in InspectionTasks:
  553. children_task = inspection_task_children_task_id_get_inspection_task_children_task_info(db,task.children_task_id)
  554. task_info = {
  555. "id": task.children_task_id,
  556. "business": children_task.type,
  557. "task_range": children_task.task_range,
  558. "cycle": children_task.cycle,
  559. "area_code": task.area_code,
  560. "area": area_code_get_ancestors_names(db, area_code_get_area_info(db, task.area_code)),
  561. "task_time": children_task.tsak_time.strftime('%Y-%m-%d'),
  562. "create_time": task.create_time.strftime('%Y-%m-%d %H:%M')
  563. }
  564. InspectionTasks_list.append(task_info)
  565. # 返回结果
  566. return {
  567. "code": 200,
  568. "msg": "成功",
  569. "data": InspectionTasks_list,
  570. "total": total_items,
  571. "page": page,
  572. "pageSize": pageSize,
  573. "totalPages": (total_items + pageSize - 1) // pageSize
  574. }
  575. except Exception as e:
  576. # 处理异常
  577. traceback.print_exc()
  578. raise HTTPException(status_code=500, detail=str(e))
  579. @router.get('/children/task/result/{children_task_id}')
  580. async def get_children_task_result(
  581. children_task_id: str ,
  582. db: Session = Depends(get_db),
  583. page: int = Query(1, gt=0, description='页码'),
  584. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  585. user_id = Depends(valid_access_token)
  586. ):
  587. try:
  588. # 构建查询
  589. query = db.query(RiskManagementInspectionTaskChildrenTaskResult)
  590. query = query.filter(RiskManagementInspectionTaskChildrenTaskResult.del_flag != '2')
  591. # 应用查询条件
  592. query = query.filter(RiskManagementInspectionTaskChildrenTaskResult.children_task_id == children_task_id)
  593. # 计算总条目数
  594. total_items = query.count()
  595. # 排序
  596. query = query.order_by(RiskManagementInspectionTaskChildrenTaskResult.create_time.desc())
  597. # 执行分页查询
  598. InspectionTasks = query.offset((page - 1) * pageSize).limit(pageSize).all()
  599. InspectionTasks_list = []
  600. for task in InspectionTasks:
  601. area_code = task.area_code
  602. area = area_code_get_area_info(db, area_code)
  603. area = area_code_get_ancestors_names(db, area)
  604. task_info = {
  605. "id": task.id,
  606. # "children_task_id": task.children_task_id,
  607. "type":inspection_task_children_task_id_get_inspection_task_children_task_info(db,task.children_task_id).type,
  608. "inspection_point_name": task.inspection_point_name,
  609. # "area": area,
  610. # "create_time": task.create_time.strftime('%Y-%m-%d'),
  611. # "nick_name": task.nick_name,
  612. "inspection_result": task.inspection_result,
  613. "remark": task.remark,
  614. "fileList": get_file_query_fun(db=db, from_scenario='RiskManagementInspectionTaskChildrenTaskResult',
  615. foreign_key=task.id)
  616. }
  617. InspectionTasks_list.append(task_info)
  618. # 返回结果
  619. return {
  620. "code": 200,
  621. "msg": "成功",
  622. "data": InspectionTasks_list,
  623. "total": total_items,
  624. "page": page,
  625. "pageSize": pageSize,
  626. "totalPages": (total_items + pageSize - 1) // pageSize
  627. }
  628. except Exception as e:
  629. # 处理异常
  630. traceback.print_exc()
  631. raise HTTPException(status_code=500, detail=str(e))
  632. @router.post('/children/task/result/create')
  633. async def create_inspection_task(
  634. db: Session = Depends(get_db),
  635. body = Depends(remove_xss_json),
  636. user_id = Depends(valid_access_token)
  637. ):
  638. try:
  639. children_task_id = body['children_task_id']
  640. result = body['result']
  641. area_code = body['area_code']
  642. area =area_code_get_ancestors_names(db, area_code_get_area_info(db, area_code))
  643. # task_time = body['task_time']
  644. # 创建新的
  645. new_task_log = RiskManagementInspectionTaskChildrenTaskLog(
  646. id=new_guid(),
  647. children_task_id=children_task_id,
  648. area_code = area_code,
  649. area = area,
  650. task_status = '1',
  651. user_id = user_id,
  652. nick_name = user_id_get_user_info(db,user_id).nick_name,
  653. create_by = user_id
  654. )
  655. for info in result:
  656. new_file_list = info['fileList']
  657. inspection_point_name= info['inspection_point_name']
  658. inspection_result = info['inspection_result']
  659. remark = info['remark']
  660. new_task_result = RiskManagementInspectionTaskChildrenTaskResult(
  661. id=new_guid(),
  662. children_task_id=children_task_id,
  663. inspection_point_name=inspection_point_name,
  664. area_code=area_code,
  665. inspection_result=inspection_result,
  666. remark = remark,
  667. user_id = user_id,
  668. nick_name = user_id_get_user_info(db,user_id).nick_name,
  669. create_by = user_id
  670. )
  671. db.add(new_task_result)
  672. for file in new_file_list:
  673. file_name = file['file_name']
  674. file_name_desc = file['file_name_desc']
  675. status = file['status']
  676. new_file = RiskManagementFile(
  677. file_id=new_guid(),
  678. foreign_key=new_task_result.id,
  679. from_scenario='RiskManagementInspectionTaskChildrenTaskResult',
  680. file_name=file_name,
  681. file_name_desc=file_name_desc,
  682. status=status
  683. )
  684. db.add(new_file)
  685. # 添加到数据库会话并提交
  686. db.add(new_task_log)
  687. db.commit()
  688. # 返回创建成功的响应
  689. return {
  690. "code": 200,
  691. "msg": "成功",
  692. "data": None
  693. }
  694. except Exception as e:
  695. # 处理异常
  696. traceback.print_exc()
  697. raise HTTPException(status_code=500, detail=str(e))
  698. ####中屏子任务
  699. @router.get('/children/task/{task_id}/list')
  700. async def get_inspection_task_list(
  701. task_id: str ,
  702. page: int = Query(1, gt=0, description='页码'),
  703. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  704. db: Session = Depends(get_db),
  705. user_id = Depends(valid_access_token)
  706. ):
  707. try:
  708. # 构建查询
  709. query = db.query(RiskManagementInspectionTaskChildrenTask)
  710. query = query.filter(RiskManagementInspectionTaskChildrenTask.del_flag != '2')
  711. # 应用查询条件
  712. query = query.filter(RiskManagementInspectionTaskChildrenTask.task_id == task_id)
  713. # 计算总条目数
  714. total_items = query.count()
  715. # 排序
  716. query = query.order_by(RiskManagementInspectionTaskChildrenTask.tsak_time.asc())
  717. # 执行分页查询
  718. InspectionTasks = query.offset((page - 1) * pageSize).limit(pageSize).all()
  719. # 将查询结果转换为列表形式的字典
  720. InspectionTasks_list = []
  721. for task in InspectionTasks:
  722. task_num=task.task_num
  723. completed_num = db.query(RiskManagementInspectionTaskChildrenTaskLog)\
  724. .filter(RiskManagementInspectionTaskChildrenTaskLog.del_flag!='2')\
  725. .filter(RiskManagementInspectionTaskChildrenTaskLog.children_task_id==task.id).count()
  726. incomplete_num = task_num-completed_num
  727. task_info = {
  728. "id": task.id,
  729. "task_id":task.task_id,
  730. "task_number": task.task_number,
  731. "business": task.type,
  732. "task_time": task.tsak_time.strftime('%Y-%m-%d'),
  733. "cycle": task.cycle,
  734. "inspection_range": task.task_range,
  735. "completed_num": completed_num,
  736. "incomplete_num": incomplete_num,
  737. "create_time": task.create_time.strftime('%Y-%m-%d')
  738. }
  739. InspectionTasks_list.append(task_info)
  740. # 返回结果
  741. return {
  742. "code": 200,
  743. "msg": "成功",
  744. "data": InspectionTasks_list,
  745. "total": total_items,
  746. "page": page,
  747. "pageSize": pageSize,
  748. "totalPages": (total_items + pageSize - 1) // pageSize
  749. }
  750. except Exception as e:
  751. # 处理异常
  752. traceback.print_exc()
  753. raise HTTPException(status_code=500, detail=str(e))
  754. @router.get('/children/task/log/{children_task_id}/{status}/list')
  755. async def get_inspection_task_list(
  756. children_task_id: str ,
  757. status:str,
  758. area_code: str = Query(None, description='区划编码'),
  759. page: int = Query(1, gt=0, description='页码'),
  760. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  761. db: Session = Depends(get_db),
  762. user_id = Depends(valid_access_token)
  763. ):
  764. try:
  765. # 构建查询
  766. total_items= 0
  767. InspectionTasks_list = []
  768. if status=='completed':
  769. query = db.query(RiskManagementInspectionTaskChildrenTaskLog)
  770. query = query.filter(RiskManagementInspectionTaskChildrenTaskLog.del_flag != '2')
  771. # 应用查询条件
  772. query = query.filter(RiskManagementInspectionTaskChildrenTaskLog.children_task_id == children_task_id)
  773. if area_code:
  774. query = query.filter(RiskManagementInspectionTaskChildrenTaskLog.area_code == area_code)
  775. # 计算总条目数
  776. total_items = query.count()
  777. # 排序
  778. query = query.order_by(RiskManagementInspectionTaskChildrenTaskLog.create_time.desc())
  779. # 执行分页查询
  780. InspectionTasks = query.offset((page - 1) * pageSize).limit(pageSize).all()
  781. # 将查询结果转换为列表形式的字典
  782. for task in InspectionTasks:
  783. task_info = {
  784. "id": task.id,
  785. "children_task_id":children_task_id,
  786. "area_code": task.area_code,
  787. "area": task.area,
  788. "task_status": task.task_status,
  789. "user_id": task.user_id,
  790. "nick_name": task.nick_name,
  791. "create_time": task.create_time.strftime('%Y-%m-%d')
  792. }
  793. InspectionTasks_list.append(task_info)
  794. # 返回结果
  795. elif status == 'incomplete':
  796. children_task = inspection_task_children_task_id_get_inspection_task_children_task_info(db,children_task_id)
  797. if children_task:
  798. task = inspection_task_id_get_inspection_task_info(db,children_task.task_id)
  799. if task:
  800. 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)]
  801. # area_code_list1 = get_area_code_exclude_list(db,task.inspection_range,complete_area_code_list)
  802. if area_code:# and area_code in area_code_list:
  803. area_code_list = area_code_rang_get_area_children_list(db,children_task.task_range,area_code,complete_area_code_list)#[area_code]
  804. # print(area_code_list)
  805. # elif area_code and area_code not in area_code_list:
  806. # area_code_list = []
  807. else:
  808. area_code_list = get_area_code_exclude_list(db, task.inspection_range, complete_area_code_list)
  809. for area_code in area_code_list:
  810. # if area_code in area_code_list1:
  811. task_info = {
  812. "id": new_guid(),
  813. "children_task_id": children_task_id,
  814. "area_code": area_code,
  815. "area": area_code_get_ancestors_names(db,area_code_get_area_info(db,area_code)),
  816. "task_status": '0',
  817. "user_id": '',
  818. "nick_name": '',
  819. "create_time": children_task.tsak_time.strftime('%Y-%m-%d')
  820. }
  821. InspectionTasks_list.append(task_info)
  822. return {
  823. "code": 200,
  824. "msg": "成功",
  825. "data": InspectionTasks_list,
  826. "total": total_items,
  827. "page": page,
  828. "pageSize": pageSize,
  829. "totalPages": (total_items + pageSize - 1) // pageSize
  830. }
  831. except Exception as e:
  832. # 处理异常
  833. traceback.print_exc()
  834. raise HTTPException(status_code=500, detail=str(e))
  835. @router.get('/children/task/result/{children_task_id}/list')
  836. async def get_inspection_task_list(
  837. children_task_id: str ,
  838. area_code: str = Query(None, description='区划编码'),
  839. inspection_result: str = Query(None, description='巡查结果'),
  840. nick_name: str = Query(None, description='姓名'),
  841. page: int = Query(1, gt=0, description='页码'),
  842. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  843. db: Session = Depends(get_db),
  844. user_id = Depends(valid_access_token)
  845. ):
  846. try:
  847. # 构建查询
  848. query = db.query(RiskManagementInspectionTaskChildrenTaskResult)
  849. query = query.filter(RiskManagementInspectionTaskChildrenTaskResult.del_flag != '2')
  850. query = query.filter(RiskManagementInspectionTaskChildrenTaskResult.children_task_id == children_task_id)
  851. # 应用查询条件
  852. if area_code:
  853. query = query.filter(RiskManagementInspectionTaskChildrenTaskResult.area_code == area_code)
  854. if inspection_result:
  855. query = query.filter(RiskManagementInspectionTaskChildrenTaskResult.inspection_result == inspection_result)
  856. if nick_name:
  857. query = query.filter(RiskManagementInspectionTaskChildrenTaskResult.nick_name.like(f'%{nick_name}%') )
  858. # 计算总条目数
  859. total_items = query.count()
  860. # 排序
  861. query = query.order_by(RiskManagementInspectionTaskChildrenTaskResult.create_time.desc())
  862. # 执行分页查询
  863. InspectionTasks = query.offset((page - 1) * pageSize).limit(pageSize).all()
  864. # 将查询结果转换为列表形式的字典
  865. InspectionTasks_list = []
  866. for task in InspectionTasks:
  867. area_code = task.area_code
  868. area = area_code_get_area_info(db, area_code)
  869. area = area_code_get_ancestors_names(db, area)
  870. task_info = {
  871. "id": task.id,
  872. "children_task_id": task.children_task_id,
  873. "inspection_point_name":task.inspection_point_name,
  874. "area": area,
  875. "create_time": task.create_time.strftime('%Y-%m-%d'),
  876. "nick_name": task.nick_name,
  877. "inspection_result": task.inspection_result,
  878. "fileList": get_file_query_fun(db=db,from_scenario='RiskManagementInspectionTaskChildrenTaskResult', foreign_key=task.id),
  879. "remark":task.remark
  880. }
  881. InspectionTasks_list.append(task_info)
  882. # 返回结果
  883. return {
  884. "code": 200,
  885. "msg": "成功",
  886. "data": InspectionTasks_list,
  887. "total": total_items,
  888. "page": page,
  889. "pageSize": pageSize,
  890. "totalPages": (total_items + pageSize - 1) // pageSize
  891. }
  892. except Exception as e:
  893. # 处理异常
  894. traceback.print_exc()
  895. raise HTTPException(status_code=500, detail=str(e))