task.py 42 KB

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