rescue_resources.py 50 KB

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