task.py 42 KB

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