task.py 51 KB

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