task.py 40 KB

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