task.py 42 KB

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