rescue_resources.py 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203
  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. search_keyword = Query(None, description='关键字'),
  561. type: str =Query(None, description='类型'),
  562. page: int = Query(1, gt=0, description='页码'),
  563. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  564. db: Session = Depends(get_db),
  565. user_id = Depends(valid_access_token)
  566. ):
  567. try:
  568. # 获取子任务id
  569. query = db.query(RiskManagementRescueResourcesTaskChildrenTask)
  570. query = query.filter(RiskManagementRescueResourcesTaskChildrenTask.del_flag != '2')
  571. if search_keyword:
  572. logger.info("search_keyword: {}", search_keyword)
  573. tasknamedict = {"庇护场所采集任务":'0',"救援队伍采集任务":'1',"救援设备采集任务":'2'}
  574. tasktype = []
  575. for key,value in tasknamedict.items():
  576. if search_keyword in key:tasktype.append(value)
  577. query = query.filter(RiskManagementRescueResourcesTaskChildrenTask.type.in_(tasktype))
  578. if type:
  579. query = query.filter(RiskManagementRescueResourcesTaskChildrenTask.type==type)
  580. children_ids = [i.id for i in query.all()]
  581. print(children_ids)
  582. # 构建查询
  583. query = db.query(RiskManagementRescueResourcesTaskChildrenTaskLog)
  584. query = query.filter(RiskManagementRescueResourcesTaskChildrenTaskLog.del_flag != '2')
  585. query = query.filter(RiskManagementRescueResourcesTaskChildrenTaskLog.user_id == user_id)
  586. query = query.filter(RiskManagementRescueResourcesTaskChildrenTaskLog.children_task_id.in_(children_ids))
  587. total_items = query.count()
  588. # 排序
  589. query = query.order_by(RiskManagementRescueResourcesTaskChildrenTaskLog.create_time.desc())
  590. # 执行分页查询
  591. InspectionTasks = query.offset((page - 1) * pageSize).limit(pageSize).all()
  592. # 将查询结果转换为列表形式的字典
  593. InspectionTasks_list = []
  594. for task in InspectionTasks:
  595. children_task = resource_task_children_task_id_get_resource_task_children_task_info(db,task.children_task_id)
  596. task_info = {
  597. "id": task.children_task_id,
  598. "type": children_task.type,
  599. "task_range": children_task.task_range,
  600. "cycle": children_task.cycle,
  601. "area_code": task.area_code,
  602. "area": area_code_get_ancestors_names(db, area_code_get_area_info(db, task.area_code)),
  603. "task_time": children_task.tsak_time.strftime('%Y-%m-%d'),
  604. "create_time": task.create_time.strftime('%Y-%m-%d %H:%M')
  605. }
  606. InspectionTasks_list.append(task_info)
  607. # 返回结果
  608. return {
  609. "code": 200,
  610. "msg": "成功",
  611. "data": InspectionTasks_list,
  612. "total": total_items,
  613. "page": page,
  614. "pageSize": pageSize,
  615. "totalPages": (total_items + pageSize - 1) // pageSize
  616. }
  617. except Exception as e:
  618. # 处理异常
  619. traceback.print_exc()
  620. raise HTTPException(status_code=500, detail=str(e))
  621. @router.get('/children/task/result/{children_task_id}')
  622. async def get_children_task_result(
  623. children_task_id: str ,
  624. db: Session = Depends(get_db),
  625. page: int = Query(1, gt=0, description='页码'),
  626. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  627. user_id = Depends(valid_access_token)
  628. ):
  629. try:
  630. # 构建查询
  631. query = db.query(RiskManagementRescueResourcesTaskChildrenTaskResult)
  632. query = query.filter(RiskManagementRescueResourcesTaskChildrenTaskResult.del_flag != '2')
  633. # 应用查询条件
  634. query = query.filter(RiskManagementRescueResourcesTaskChildrenTaskResult.children_task_id == children_task_id)
  635. # 计算总条目数
  636. total_items = query.count()
  637. # 排序
  638. query = query.order_by(RiskManagementRescueResourcesTaskChildrenTaskResult.create_time.desc())
  639. # 执行分页查询
  640. InspectionTasks = query.offset((page - 1) * pageSize).limit(pageSize).all()
  641. InspectionTasks_list = []
  642. for task in InspectionTasks:
  643. area_code = task.area_code
  644. area = area_code_get_area_info(db, area_code)
  645. area = area_code_get_ancestors_names(db, area)
  646. task_info = {
  647. "id": task.id,
  648. # "children_task_id": task.children_task_id,
  649. "type":resource_task_children_task_id_get_resource_task_children_task_info(db,task.children_task_id).type,
  650. "point_name": task.inspection_point_name,
  651. # "area": area,
  652. # "create_time": task.create_time.strftime('%Y-%m-%d'),
  653. # "nick_name": task.nick_name,
  654. "task_result": task.inspection_result,
  655. "remark": task.remark,
  656. "fileList": get_file_query_fun(db=db, from_scenario='RiskManagementRescueResourcesTaskChildrenTaskResult',
  657. foreign_key=task.id)
  658. }
  659. InspectionTasks_list.append(task_info)
  660. # 返回结果
  661. return {
  662. "code": 200,
  663. "msg": "成功",
  664. "data": InspectionTasks_list,
  665. "total": total_items,
  666. "page": page,
  667. "pageSize": pageSize,
  668. "totalPages": (total_items + pageSize - 1) // pageSize
  669. }
  670. except Exception as e:
  671. # 处理异常
  672. traceback.print_exc()
  673. raise HTTPException(status_code=500, detail=str(e))
  674. @router.post('/children/task/result/create')
  675. async def create_inspection_task(
  676. db: Session = Depends(get_db),
  677. body = Depends(remove_xss_json),
  678. user_id = Depends(valid_access_token)
  679. ):
  680. try:
  681. children_task_id = body['children_task_id']
  682. result = body['result']
  683. area_code = body['area_code']
  684. area =area_code_get_ancestors_names(db, area_code_get_area_info(db, area_code))
  685. # task_time = body['task_time']
  686. # 创建新的
  687. new_task_log = RiskManagementRescueResourcesTaskChildrenTaskLog(
  688. id=new_guid(),
  689. children_task_id=children_task_id,
  690. area_code = area_code,
  691. area = area,
  692. task_status = '1',
  693. user_id = user_id,
  694. nick_name = user_id_get_user_info(db,user_id).nick_name,
  695. create_by = user_id
  696. )
  697. for info in result:
  698. new_file_list = info['fileList']
  699. inspection_point_name= info['point_name']
  700. inspection_result = info['task_result']
  701. remark = info['remark']
  702. new_task_result = RiskManagementRescueResourcesTaskChildrenTaskResult(
  703. id=new_guid(),
  704. children_task_id=children_task_id,
  705. inspection_point_name=inspection_point_name,
  706. area_code=area_code,
  707. inspection_result=inspection_result,
  708. remark = remark,
  709. user_id = user_id,
  710. nick_name = user_id_get_user_info(db,user_id).nick_name,
  711. create_by = user_id
  712. )
  713. db.add(new_task_result)
  714. for file in new_file_list:
  715. file_name = file['file_name']
  716. file_name_desc = file['file_name_desc']
  717. status = file['status']
  718. new_file = RiskManagementFile(
  719. file_id=new_guid(),
  720. foreign_key=new_task_result.id,
  721. from_scenario='RiskManagementRescueResourcesTaskChildrenTaskResult',
  722. file_name=file_name,
  723. file_name_desc=file_name_desc,
  724. status=status
  725. )
  726. db.add(new_file)
  727. # 添加到数据库会话并提交
  728. db.add(new_task_log)
  729. db.commit()
  730. # 标记消息已读
  731. child_task_info = db.query(RiskManagementRescueResourcesTaskChildrenTask).filter(RiskManagementRescueResourcesTaskChildrenTask.id == children_task_id).first()
  732. if child_task_info is not None:
  733. logger.info("标记[数据采集任务]已读 {}", str(child_task_info.task_id))
  734. db_msg_center.update_msg_read(db, user_id, "数据采集", str(child_task_info.task_id))
  735. # 返回创建成功的响应
  736. return {
  737. "code": 200,
  738. "msg": "成功",
  739. "data": None
  740. }
  741. except Exception as e:
  742. # 处理异常
  743. traceback.print_exc()
  744. raise HTTPException(status_code=500, detail=str(e))
  745. ####中屏子任务
  746. @router.get('/children/task/{task_id}/list')
  747. async def get_inspection_task_list(
  748. task_id: str ,
  749. page: int = Query(1, gt=0, description='页码'),
  750. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  751. db: Session = Depends(get_db),
  752. user_id = Depends(valid_access_token)
  753. ):
  754. try:
  755. # 构建查询
  756. query = db.query(RiskManagementRescueResourcesTaskChildrenTask)
  757. query = query.filter(RiskManagementRescueResourcesTaskChildrenTask.del_flag != '2')
  758. # 应用查询条件
  759. query = query.filter(RiskManagementRescueResourcesTaskChildrenTask.task_id == task_id)
  760. # 计算总条目数
  761. total_items = query.count()
  762. # 排序
  763. query = query.order_by(RiskManagementRescueResourcesTaskChildrenTask.tsak_time.asc())
  764. # 执行分页查询
  765. InspectionTasks = query.offset((page - 1) * pageSize).limit(pageSize).all()
  766. # 将查询结果转换为列表形式的字典
  767. InspectionTasks_list = []
  768. for task in InspectionTasks:
  769. task_num=task.task_num
  770. completed_num = db.query(RiskManagementRescueResourcesTaskChildrenTaskLog)\
  771. .filter(RiskManagementRescueResourcesTaskChildrenTaskLog.del_flag!='2')\
  772. .filter(RiskManagementRescueResourcesTaskChildrenTaskLog.children_task_id==task.id).count()
  773. incomplete_num = task_num-completed_num
  774. task_info = {
  775. "id": task.id,
  776. "task_id":task.task_id,
  777. "task_number": task.task_number,
  778. "type": task.type,
  779. "task_time": task.tsak_time.strftime('%Y-%m-%d'),
  780. "cycle": task.cycle,
  781. "task_range": task.task_range,
  782. "completed_num": completed_num,
  783. "incomplete_num": incomplete_num,
  784. "create_time": task.create_time.strftime('%Y-%m-%d')
  785. }
  786. InspectionTasks_list.append(task_info)
  787. # 返回结果
  788. return {
  789. "code": 200,
  790. "msg": "成功",
  791. "data": InspectionTasks_list,
  792. "total": total_items,
  793. "page": page,
  794. "pageSize": pageSize,
  795. "totalPages": (total_items + pageSize - 1) // pageSize
  796. }
  797. except Exception as e:
  798. # 处理异常
  799. traceback.print_exc()
  800. raise HTTPException(status_code=500, detail=str(e))
  801. @router.get('/children/task/log/{children_task_id}/{status}/export')
  802. async def get_inspection_task_list(
  803. request: Request,
  804. children_task_id: str ,
  805. status:str,
  806. area_code: str = Query(None, description='区划编码'),
  807. db: Session = Depends(get_db),
  808. user_id = Depends(valid_access_token),
  809. auth_user: AuthUser = Depends(find_auth_user),
  810. ):
  811. try:
  812. # 构建查询
  813. total_items= 0
  814. InspectionTasks_list = []
  815. status_cn = ''
  816. if status == 'completed':
  817. status_cn='已完成'
  818. query = db.query(RiskManagementRescueResourcesTaskChildrenTaskLog)
  819. query = query.filter(RiskManagementRescueResourcesTaskChildrenTaskLog.del_flag != '2')
  820. # 应用查询条件
  821. query = query.filter(RiskManagementRescueResourcesTaskChildrenTaskLog.children_task_id == children_task_id)
  822. if area_code:
  823. query = query.filter(RiskManagementRescueResourcesTaskChildrenTaskLog.area_code == area_code)
  824. # 计算总条目数
  825. total_items = query.count()
  826. # 排序
  827. query = query.order_by(RiskManagementRescueResourcesTaskChildrenTaskLog.create_time.desc())
  828. # 执行分页查询
  829. InspectionTasks = query.all()
  830. # 将查询结果转换为列表形式的字典
  831. for task in InspectionTasks:
  832. task_info = {
  833. "id": task.id,
  834. "子任务表id": children_task_id,
  835. "区划编码": task.area_code,
  836. "区划": task.area,
  837. "任务进展":"已完成",
  838. "采集人员id": task.user_id,
  839. "采集人员": task.nick_name,
  840. "创建时间": task.create_time.strftime('%Y-%m-%d')
  841. }
  842. InspectionTasks_list.append(task_info)
  843. # 返回结果
  844. elif status == 'incomplete':
  845. status_cn='未完成'
  846. children_task = resource_task_children_task_id_get_resource_task_children_task_info(db, children_task_id)
  847. if children_task:
  848. task = resource_task_id_get_resource_task_info(db, children_task.task_id)
  849. if task:
  850. complete_area_code_list = [i.area_code for i in
  851. resource_task_children_task_id_get_resource_task_children_task_log_info(
  852. db, children_task_id)]
  853. area_code_list = get_area_code_exclude_list(db, task.task_range, complete_area_code_list)
  854. if area_code:
  855. area_code_list = area_code_rang_get_area_children_list(db, children_task.task_range, area_code,
  856. complete_area_code_list)
  857. for area_code in area_code_list:
  858. task_info = {
  859. "id": new_guid(),
  860. "子任务表id": children_task_id,
  861. "区划编码": area_code,
  862. "区划": area_code_get_ancestors_names(db, area_code_get_area_info(db, area_code)),
  863. "任务进展": '未完成',
  864. "采集人员id": '',
  865. "采集人员": '',
  866. "创建时间": children_task.tsak_time.strftime('%Y-%m-%d')
  867. }
  868. InspectionTasks_list.append(task_info)
  869. import pandas as pd
  870. from io import BytesIO
  871. # 将查询结果转换为 DataFrame
  872. df = pd.DataFrame(InspectionTasks_list)
  873. # 将 DataFrame 导出为 Excel 文件
  874. output = BytesIO()
  875. with pd.ExcelWriter(output, engine='openpyxl') as writer:
  876. df.to_excel(writer, index=False)
  877. # 设置响应头
  878. output.seek(0)
  879. from urllib.parse import quote
  880. encoded_filename = f'救援资源要素{status_cn}{datetime.now().strftime("%Y%m%d%H%mi%s")}.xlsx'
  881. encoded_filename = quote(encoded_filename, encoding='utf-8')
  882. headers = {
  883. 'Content-Disposition': f'attachment; filename*=UTF-8\'\'{encoded_filename}',
  884. 'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  885. }
  886. db_czrz.log(db, auth_user, "救援资源要素管理", f"救援资源要素任务{status_cn}导出数据成功", request.client.host)
  887. # 返回文件流
  888. return StreamingResponse(output, headers=headers)
  889. except Exception as e:
  890. traceback.print_exc()
  891. return JSONResponse(status_code=500, content={"code": 500, "msg": f"Internal server error: {str(e)}"})
  892. @router.get('/children/task/log/{children_task_id}/{status}/list')
  893. async def get_inspection_task_list(
  894. children_task_id: str ,
  895. status:str,
  896. area_code: str = Query(None, description='区划编码'),
  897. page: int = Query(1, gt=0, description='页码'),
  898. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  899. db: Session = Depends(get_db),
  900. user_id = Depends(valid_access_token)
  901. ):
  902. try:
  903. # 构建查询
  904. total_items= 0
  905. InspectionTasks_list = []
  906. if status=='completed':
  907. query = db.query(RiskManagementRescueResourcesTaskChildrenTaskLog)
  908. query = query.filter(RiskManagementRescueResourcesTaskChildrenTaskLog.del_flag != '2')
  909. # 应用查询条件
  910. query = query.filter(RiskManagementRescueResourcesTaskChildrenTaskLog.children_task_id == children_task_id)
  911. if area_code:
  912. query = query.filter(RiskManagementRescueResourcesTaskChildrenTaskLog.area_code == area_code)
  913. # 计算总条目数
  914. total_items = query.count()
  915. # 排序
  916. query = query.order_by(RiskManagementRescueResourcesTaskChildrenTaskLog.create_time.desc())
  917. # 执行分页查询
  918. InspectionTasks = query.offset((page - 1) * pageSize).limit(pageSize).all()
  919. # 将查询结果转换为列表形式的字典
  920. for task in InspectionTasks:
  921. task_info = {
  922. "id": task.id,
  923. "children_task_id":children_task_id,
  924. "area_code": task.area_code,
  925. "area": task.area,
  926. "task_status": task.task_status,
  927. "user_id": task.user_id,
  928. "nick_name": task.nick_name,
  929. "create_time": task.create_time.strftime('%Y-%m-%d')
  930. }
  931. InspectionTasks_list.append(task_info)
  932. # 返回结果
  933. elif status == 'incomplete':
  934. children_task = resource_task_children_task_id_get_resource_task_children_task_info(db,children_task_id)
  935. if children_task:
  936. task = resource_task_id_get_resource_task_info(db,children_task.task_id)
  937. if task:
  938. 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)]
  939. area_code_list = get_area_code_exclude_list(db,task.task_range,complete_area_code_list)
  940. if area_code:
  941. area_code_list = area_code_rang_get_area_children_list(db, children_task.task_range, area_code,
  942. complete_area_code_list)
  943. for area_code in area_code_list:
  944. task_info = {
  945. "id": new_guid(),
  946. "children_task_id": children_task_id,
  947. "area_code": area_code,
  948. "area": area_code_get_ancestors_names(db,area_code_get_area_info(db,area_code)),
  949. "task_status": '0',
  950. "user_id": '',
  951. "nick_name": '',
  952. "create_time": children_task.tsak_time.strftime('%Y-%m-%d')
  953. }
  954. InspectionTasks_list.append(task_info)
  955. return {
  956. "code": 200,
  957. "msg": "成功",
  958. "data": InspectionTasks_list,
  959. "total": total_items,
  960. "page": page,
  961. "pageSize": pageSize,
  962. "totalPages": (total_items + pageSize - 1) // pageSize
  963. }
  964. except Exception as e:
  965. # 处理异常
  966. traceback.print_exc()
  967. raise HTTPException(status_code=500, detail=str(e))
  968. @router.get('/children/task/result/{children_task_id}/list')
  969. async def get_inspection_task_list(
  970. children_task_id: str ,
  971. area_code: str = Query(None, description='区划编码'),
  972. result: str = Query(None, description='巡查结果'),
  973. nick_name: str = Query(None, description='姓名'),
  974. page: int = Query(1, gt=0, description='页码'),
  975. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  976. db: Session = Depends(get_db),
  977. user_id = Depends(valid_access_token)
  978. ):
  979. try:
  980. # 构建查询
  981. query = db.query(RiskManagementRescueResourcesTaskChildrenTaskResult)
  982. query = query.filter(RiskManagementRescueResourcesTaskChildrenTaskResult.del_flag != '2')
  983. query = query.filter(RiskManagementRescueResourcesTaskChildrenTaskResult.children_task_id == children_task_id)
  984. # 应用查询条件
  985. if area_code:
  986. query = query.filter(RiskManagementRescueResourcesTaskChildrenTaskResult.area_code == area_code)
  987. if result:
  988. query = query.filter(RiskManagementRescueResourcesTaskChildrenTaskResult.inspection_result == result)
  989. if nick_name:
  990. query = query.filter(RiskManagementRescueResourcesTaskChildrenTaskResult.nick_name.like(f'%{nick_name}%') )
  991. # 计算总条目数
  992. total_items = query.count()
  993. # 排序
  994. query = query.order_by(RiskManagementRescueResourcesTaskChildrenTaskResult.create_time.desc())
  995. # 执行分页查询
  996. InspectionTasks = query.offset((page - 1) * pageSize).limit(pageSize).all()
  997. # 将查询结果转换为列表形式的字典
  998. InspectionTasks_list = []
  999. for task in InspectionTasks:
  1000. area_code = task.area_code
  1001. area = area_code_get_area_info(db, area_code)
  1002. area = area_code_get_ancestors_names(db, area)
  1003. task_info = {
  1004. "id": task.id,
  1005. "children_task_id": task.children_task_id,
  1006. "point_name":task.inspection_point_name,
  1007. "area": area,
  1008. "create_time": task.create_time.strftime('%Y-%m-%d'),
  1009. "nick_name": task.nick_name,
  1010. "result": task.inspection_result,
  1011. "fileList": get_file_query_fun(db=db,from_scenario='RiskManagementRescueResourcesTaskChildrenTaskResult', foreign_key=task.id),
  1012. "remark":task.remark
  1013. }
  1014. InspectionTasks_list.append(task_info)
  1015. # 返回结果
  1016. return {
  1017. "code": 200,
  1018. "msg": "成功",
  1019. "data": InspectionTasks_list,
  1020. "total": total_items,
  1021. "page": page,
  1022. "pageSize": pageSize,
  1023. "totalPages": (total_items + pageSize - 1) // pageSize
  1024. }
  1025. except Exception as e:
  1026. # 处理异常
  1027. traceback.print_exc()
  1028. raise HTTPException(status_code=500, detail=str(e))
  1029. @router.get('/children/task/result/{children_task_id}/export')
  1030. async def get_inspection_task_export(
  1031. request: Request,
  1032. children_task_id: str ,
  1033. area_code: str = Query(None, description='区划编码'),
  1034. result: str = Query(None, description='巡查结果'),
  1035. nick_name: str = Query(None, description='姓名'),
  1036. db: Session = Depends(get_db),
  1037. auth_user: AuthUser = Depends(find_auth_user),
  1038. user_id = Depends(valid_access_token)
  1039. ):
  1040. try:
  1041. # 构建查询
  1042. query = db.query(RiskManagementRescueResourcesTaskChildrenTaskResult)
  1043. query = query.filter(RiskManagementRescueResourcesTaskChildrenTaskResult.del_flag != '2')
  1044. query = query.filter(RiskManagementRescueResourcesTaskChildrenTaskResult.children_task_id == children_task_id)
  1045. # 应用查询条件
  1046. if area_code:
  1047. query = query.filter(RiskManagementRescueResourcesTaskChildrenTaskResult.area_code == area_code)
  1048. if result:
  1049. query = query.filter(RiskManagementRescueResourcesTaskChildrenTaskResult.inspection_result == result)
  1050. if nick_name:
  1051. query = query.filter(RiskManagementRescueResourcesTaskChildrenTaskResult.nick_name.like(f'%{nick_name}%') )
  1052. # 计算总条目数
  1053. total_items = query.count()
  1054. # 排序
  1055. query = query.order_by(RiskManagementRescueResourcesTaskChildrenTaskResult.create_time.desc())
  1056. # 执行分页查询
  1057. InspectionTasks = query.all()
  1058. # 将查询结果转换为列表形式的字典
  1059. InspectionTasks_list = []
  1060. for task in InspectionTasks:
  1061. area_code = task.area_code
  1062. area = area_code_get_area_info(db, area_code)
  1063. area = area_code_get_ancestors_names(db, area)
  1064. task_info = {
  1065. "id": task.id,
  1066. "子任务表id": task.children_task_id,
  1067. "经度":task.longitude,
  1068. "纬度":task.latitude,
  1069. "巡查点":task.inspection_point_name,
  1070. "区划": area,
  1071. "创建时间": task.create_time.strftime('%Y-%m-%d'),
  1072. "采集人员": task.nick_name,
  1073. "采集结果": task.inspection_result,
  1074. # "fileList": get_file_query_fun(db=db,from_scenario='RiskManagementRescueResourcesTaskChildrenTaskResult', foreign_key=task.id),
  1075. "备注":task.remark
  1076. }
  1077. InspectionTasks_list.append(task_info)
  1078. # 返回结果
  1079. import pandas as pd
  1080. from io import BytesIO
  1081. # 将查询结果转换为 DataFrame
  1082. df = pd.DataFrame(InspectionTasks_list)
  1083. # 将 DataFrame 导出为 Excel 文件
  1084. output = BytesIO()
  1085. with pd.ExcelWriter(output, engine='openpyxl') as writer:
  1086. df.to_excel(writer, index=False)
  1087. # 设置响应头
  1088. output.seek(0)
  1089. from urllib.parse import quote
  1090. encoded_filename = f'救援资源要素巡查结果{datetime.now().strftime("%Y%m%d%H%mi%s")}.xlsx'
  1091. encoded_filename = quote(encoded_filename, encoding='utf-8')
  1092. headers = {
  1093. 'Content-Disposition': f'attachment; filename*=UTF-8\'\'{encoded_filename}',
  1094. 'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  1095. }
  1096. db_czrz.log(db, auth_user, "救援资源要素管理", f"救援资源要素巡查结果导出数据成功", request.client.host)
  1097. # 返回文件流
  1098. return StreamingResponse(output, headers=headers)
  1099. except Exception as e:
  1100. # 处理异常
  1101. traceback.print_exc()
  1102. return JSONResponse(status_code=500, content={"code": 500, "msg": f"Internal server error: {str(e)}"})