task.py 42 KB

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