task.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from fastapi import APIRouter, Request, Depends,Query, HTTPException, status,BackgroundTasks
  4. from common.security import valid_access_token
  5. from fastapi.responses import JSONResponse
  6. from sqlalchemy.orm import Session
  7. from sqlalchemy import and_, or_
  8. from pydantic import BaseModel
  9. from datetime import datetime, timedelta
  10. from dateutil.relativedelta import relativedelta
  11. from database import get_db
  12. from typing import List
  13. from models import *
  14. from utils import *
  15. import json
  16. import traceback
  17. router = APIRouter()
  18. def get_area_num(db,rang):
  19. query = db.query(GovdataArea)
  20. if rang=='0':
  21. return 1
  22. elif rang=='1':
  23. query = query.filter(and_(GovdataArea.area_code.like('%000000'),GovdataArea.area_code.notlike('%00000000')))
  24. return query.count()
  25. elif rang=='2':
  26. query = query.filter(and_(GovdataArea.area_code.like('%000'),GovdataArea.area_code.notlike('%000000')))
  27. return query.count()
  28. elif rang=='3':
  29. query = query.filter(GovdataArea.area_code.notlike('%000'))
  30. return query.count()
  31. else:
  32. return 0
  33. def get_task_date_list(cycle,start_date,end_date,corn_query):
  34. # 生成日期列表
  35. date_list = []
  36. if cycle=='4': #仅一次,返回当天
  37. date_list.append(datetime.today())
  38. return date_list
  39. elif cycle=='3': #每天
  40. current_date = start_date
  41. while current_date <= end_date:
  42. # 将日期添加到列表中
  43. date_list.append(current_date)
  44. # 增加一天
  45. current_date += timedelta(days=1)
  46. return date_list
  47. elif cycle=='2': #每周
  48. days_ahead = (7+int(corn_query) - start_date.weekday()) % 7
  49. current_date = start_date + timedelta(days=days_ahead)
  50. while current_date <= end_date:
  51. # 将日期添加到列表中
  52. date_list.append(current_date)
  53. # 增加七天
  54. current_date += timedelta(days=7)
  55. return date_list
  56. elif cycle=='1': #每月
  57. days_ahead = datetime.strptime(start_date.strftime("%Y-%m-")+corn_query, "%Y-%m-%d")
  58. if days_ahead>start_date:
  59. current_date = days_ahead
  60. else:
  61. current_date = days_ahead+relativedelta(months=1)
  62. while current_date <= end_date:
  63. # 将日期添加到列表中
  64. date_list.append(current_date)
  65. # 增加七天
  66. current_date += relativedelta(months=1)
  67. return date_list
  68. elif cycle=='0': #每月
  69. d,m = corn_query.split()
  70. days_ahead = datetime.strptime(start_date.strftime("%Y-")+m+'-'+d, "%Y-%m-%d")
  71. if days_ahead>start_date:
  72. current_date = days_ahead
  73. else:
  74. current_date = days_ahead+relativedelta(years=1)
  75. while current_date <= end_date:
  76. # 将日期添加到列表中
  77. date_list.append(current_date)
  78. # 增加七天
  79. current_date += relativedelta(years=1)
  80. return date_list
  81. def create_children_task(db,task_info,corn_query):
  82. cycle = task_info.inspection_cycle
  83. task_range = task_info.inspection_range
  84. for t in get_task_date_list(cycle,task_info.start_time,task_info.end_time,corn_query):
  85. new_children_task = RiskManagementInspectionTaskChildrenTask(
  86. id = new_guid(),
  87. task_id= task_info.id,
  88. task_number= task_info.task_number,
  89. type = task_info.inspection_business,
  90. tsak_time = t,
  91. cycle=cycle,
  92. task_range = task_range,
  93. task_num=get_area_num(db,task_range),
  94. create_by=task_info.create_by
  95. )
  96. db.add(new_children_task)
  97. db.commit()
  98. @router.get('/list')
  99. async def get_inspection_task_list(
  100. business: str = Query(None, description='巡查业务'),
  101. cycle :str = Query(None, description='巡查周期'),
  102. page: int = Query(1, gt=0, description='页码'),
  103. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  104. db: Session = Depends(get_db),
  105. user_id = Depends(valid_access_token)
  106. ):
  107. try:
  108. # 构建查询
  109. query = db.query(RiskManagementInspectionTask)
  110. query = query.filter(RiskManagementInspectionTask.del_flag != '2')
  111. # 应用查询条件
  112. if business:
  113. query = query.filter(RiskManagementInspectionTask.inspection_business == business)
  114. if cycle:
  115. query = query.filter(RiskManagementInspectionTask.inspection_cycle == cycle)
  116. # 计算总条目数
  117. total_items = query.count()
  118. # 排序
  119. query = query.order_by(RiskManagementInspectionTask.create_time.desc())
  120. # 执行分页查询
  121. InspectionTasks = query.offset((page - 1) * pageSize).limit(pageSize).all()
  122. # 将查询结果转换为列表形式的字典
  123. InspectionTasks_list = []
  124. for task in InspectionTasks:
  125. if task.task_status=='3':
  126. task_status = '3' #'已完结'
  127. else:
  128. if datetime.now()<task.start_time:
  129. task_status = '0' #'未开始'
  130. elif task.start_time<=datetime.now()<=task.end_time:
  131. task_status = '1' #'进行中'
  132. else:
  133. task_status = '2' #'未完成'
  134. create_by = task.create_by
  135. create_by = db.query(SysUser).filter(SysUser.user_id==create_by).first()
  136. task_info = {
  137. "id": task.id,
  138. "task_number": task.task_number,
  139. "business": task.inspection_business,
  140. "task_time": '%s-%s'%(task.start_time.strftime('%Y/%m/%d'),task.end_time.strftime('%Y/%m/%d')),
  141. "cycle": task.inspection_cycle,
  142. "inspection_range": task.inspection_range,
  143. "task_status": task_status,
  144. "create_by":create_by.nick_name,
  145. "create_time": task.create_time.strftime('%Y-%m-%d')
  146. }
  147. InspectionTasks_list.append(task_info)
  148. # 返回结果
  149. return {
  150. "code": 200,
  151. "msg": "成功",
  152. "data": InspectionTasks_list,
  153. "total": total_items,
  154. "page": page,
  155. "pageSize": pageSize,
  156. "totalPages": (total_items + pageSize - 1) // pageSize
  157. }
  158. except Exception as e:
  159. # 处理异常
  160. traceback.print_exc()
  161. raise HTTPException(status_code=500, detail=str(e))
  162. @router.get('/{id}')
  163. async def get_inspection_task(
  164. id: str ,
  165. db: Session = Depends(get_db),
  166. user_id = Depends(valid_access_token)
  167. ):
  168. try:
  169. # 构建查询
  170. query = db.query(RiskManagementInspectionTask)
  171. query = query.filter(RiskManagementInspectionTask.del_flag != '2')
  172. # 应用查询条件
  173. if id:
  174. query = query.filter(RiskManagementInspectionTask.id == id)
  175. # 执行查询
  176. task = query.first()
  177. if not task:
  178. detail = "巡查任务不存在"
  179. raise HTTPException(status_code=404, detail="巡查任务不存在")
  180. # 将查询结果转换为列表形式的字典
  181. if task.task_status == '3':
  182. task_status = '3' # '已完结'
  183. else:
  184. if datetime.now() < task.start_time:
  185. task_status = '0' # '未开始'
  186. elif task.start_time <= datetime.now() <= task.end_time:
  187. task_status = '1' # '进行中'
  188. else:
  189. task_status = '2' # '未完成'
  190. create_by = task.create_by
  191. create_by = db.query(SysUser).filter(SysUser.user_id == create_by).first()
  192. inspection_task_result = {
  193. "id": task.id,
  194. "task_number": task.task_number,
  195. "business": task.inspection_business,
  196. "task_time": '%s-%s'%(task.start_time.strftime('%Y/%m/%d'),task.end_time.strftime('%Y/%m/%d')),
  197. "cycle": task.inspection_cycle,
  198. "inspection_range": task.inspection_range,
  199. "task_status": task_status,
  200. "create_by":create_by.nick_name,
  201. "create_time": task.create_time.strftime('%Y-%m-%d')
  202. }
  203. # 返回结果
  204. return {
  205. "code": 200,
  206. "msg": "成功",
  207. "data": inspection_task_result
  208. }
  209. except Exception as e:
  210. # 处理异常
  211. traceback.print_exc()
  212. if str(e)=='':
  213. e = detail
  214. raise HTTPException(status_code=500, detail=str(e))
  215. @router.post('/create')
  216. async def create_inspection_task(
  217. background_tasks: BackgroundTasks,
  218. db: Session = Depends(get_db),
  219. body = Depends(remove_xss_json),
  220. user_id = Depends(valid_access_token)
  221. ):
  222. try:
  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. # 创建新的预案记录
  237. new_task = RiskManagementInspectionTask(
  238. inspection_business=body['business'],
  239. start_time = body['start_time'],
  240. end_time = body['end_time'],
  241. inspection_cycle = cycle,
  242. corn_expression = corn,
  243. inspection_range = body['inspection_range'],
  244. task_status = '-1',
  245. create_by = user_id
  246. )
  247. # 添加到数据库会话并提交
  248. db.add(new_task)
  249. db.commit()
  250. db.refresh(new_task) # 可选,如果需要刷新实例状态
  251. new_task.task_number = f'YJXC{str(new_task.id).zfill(10)}'
  252. db.commit()
  253. # 返回创建成功的响应
  254. background_tasks.add_task(create_children_task,db,new_task,corn_query)
  255. return {
  256. "code": 200,
  257. "msg": "成功",
  258. "data": None
  259. }
  260. except Exception as e:
  261. # 处理异常
  262. traceback.print_exc()
  263. raise HTTPException(status_code=500, detail=str(e))
  264. @router.put('/update')
  265. async def update_inspection_task(
  266. db: Session = Depends(get_db),
  267. body = Depends(remove_xss_json),
  268. user_id = Depends(valid_access_token)
  269. ):
  270. try:
  271. # 提取请求数据
  272. query = db.query(RiskManagementInspectionTask)
  273. query = query.filter(RiskManagementInspectionTask.id == body['id'])
  274. query = query.filter(RiskManagementInspectionTask.del_flag != '2')
  275. task = query.first()
  276. if not task:
  277. detail = "任务不存在"
  278. raise HTTPException(status_code=404, detail="任务不存在")
  279. if 'cycle' in body:
  280. cycle = body['cycle']
  281. # 0每年、1每月、2每周、3每日、4一次
  282. corn_query = body['corn_query']
  283. if cycle == '0':
  284. corn = f'0 0 {corn_query} *'
  285. elif cycle == '1':
  286. corn = f'0 0 {corn_query} * *'
  287. elif cycle == '2':
  288. corn = f'0 0 * * {corn_query}'
  289. elif cycle == '3':
  290. corn = f'0 0 * * *'
  291. else:
  292. corn = ''
  293. task.inspection_cycle = cycle
  294. task.corn_expression = corn
  295. if 'business' in body:
  296. task.inspection_business = body['business']
  297. if 'start_time' in body:
  298. task.start_time = body['start_time']
  299. if 'end_time' in body:
  300. task.end_time = body['end_time']
  301. if 'inspection_range' in body:
  302. task.inspection_range = body['inspection_range']
  303. if 'task_status' in body:
  304. task.task_status = body['task_status']
  305. if user_id:
  306. task.update_by = user_id
  307. # 更新到数据库会话并提交
  308. db.commit()
  309. db.refresh(task) # 可选,如果需要刷新实例状态
  310. # 返回创建成功的响应
  311. return {
  312. "code": 200,
  313. "msg": "成功",
  314. "data": None
  315. }
  316. except Exception as e:
  317. # 处理异常
  318. if str(e)=='':
  319. e = detail
  320. raise HTTPException(status_code=500, detail=str(e))
  321. @router.delete('/delete')
  322. async def delete_inspection_tasks(
  323. taskIds: list,
  324. db: Session = Depends(get_db),
  325. body = Depends(remove_xss_json),
  326. user_id = Depends(valid_access_token)
  327. ):
  328. try:
  329. # 提取请求数据
  330. query = db.query(RiskManagementInspectionTask)
  331. query = query.filter(RiskManagementInspectionTask.del_flag != '2')
  332. query = query.filter(RiskManagementInspectionTask.id.in_(taskIds))
  333. tasks = query.all()
  334. if not tasks:
  335. detail = "任务不存在"
  336. raise HTTPException(status_code=404, detail="任务不存在")
  337. for task in tasks:
  338. task.del_flag = '2'
  339. task.update_by=user_id
  340. # 更新到数据库会话并提交
  341. db.commit()
  342. # 返回创建成功的响应
  343. return {
  344. "code": 200,
  345. "msg": "删除成功",
  346. "data": None
  347. }
  348. except Exception as e:
  349. # 处理异常
  350. traceback.print_exc()
  351. if str(e) == '':
  352. e = detail
  353. raise HTTPException(status_code=500, detail=str(e))
  354. @router.delete('/delete/{userId}')
  355. async def delete_inspection_task(
  356. userId: str,
  357. db: Session = Depends(get_db),
  358. body = Depends(remove_xss_json),
  359. user_id = Depends(valid_access_token)
  360. ):
  361. try:
  362. # 提取请求数据
  363. query = db.query(RiskManagementInspectionTask)
  364. query = query.filter(RiskManagementInspectionTask.del_flag != '2')
  365. query = query.filter(RiskManagementInspectionTask.id==userId)
  366. task = query.first()
  367. if not task:
  368. detail = "巡查任务不存在"
  369. raise HTTPException(status_code=404, detail="巡查任务不存在")
  370. task.del_flag = '2'
  371. task.update_by = user_id
  372. # 更新到数据库会话并提交
  373. db.commit()
  374. db.refresh(task) # 可选,如果需要刷新实例状态
  375. # 返回创建成功的响应
  376. return {
  377. "code": 200,
  378. "msg": "删除成功",
  379. "data": None
  380. }
  381. except Exception as e:
  382. # 处理异常
  383. traceback.print_exc()
  384. if str(e) == '':
  385. e = detail
  386. raise HTTPException(status_code=500, detail=str(e))
  387. @router.get('/children/task/{task_id}/list')
  388. async def get_inspection_task_list(
  389. task_id: str ,
  390. page: int = Query(1, gt=0, description='页码'),
  391. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  392. db: Session = Depends(get_db),
  393. user_id = Depends(valid_access_token)
  394. ):
  395. try:
  396. # 构建查询
  397. query = db.query(RiskManagementInspectionTaskChildrenTask)
  398. query = query.filter(RiskManagementInspectionTaskChildrenTask.del_flag != '2')
  399. # 应用查询条件
  400. query = query.filter(RiskManagementInspectionTaskChildrenTask.task_id == task_id)
  401. # 计算总条目数
  402. total_items = query.count()
  403. # 排序
  404. query = query.order_by(RiskManagementInspectionTaskChildrenTask.tsak_time.asc())
  405. # 执行分页查询
  406. InspectionTasks = query.offset((page - 1) * pageSize).limit(pageSize).all()
  407. # 将查询结果转换为列表形式的字典
  408. InspectionTasks_list = []
  409. for task in InspectionTasks:
  410. task_num=task.task_num
  411. completed_num = db.query(RiskManagementInspectionTaskChildrenTaskLog)\
  412. .filter(RiskManagementInspectionTaskChildrenTaskLog.del_flag!='2')\
  413. .filter(RiskManagementInspectionTaskChildrenTaskLog.children_task_id==task.id).count()
  414. incomplete_num = task_num-completed_num
  415. task_info = {
  416. "id": task.id,
  417. "task_id":task.task_id,
  418. "task_number": task.task_number,
  419. "business": task.type,
  420. "task_time": task.tsak_time.strftime('%Y-%m-%d'),
  421. "cycle": task.cycle,
  422. "inspection_range": task.task_range,
  423. "completed_num": completed_num,
  424. "incomplete_num": incomplete_num,
  425. "create_time": task.create_time.strftime('%Y-%m-%d')
  426. }
  427. InspectionTasks_list.append(task_info)
  428. # 返回结果
  429. return {
  430. "code": 200,
  431. "msg": "成功",
  432. "data": InspectionTasks_list,
  433. "total": total_items,
  434. "page": page,
  435. "pageSize": pageSize,
  436. "totalPages": (total_items + pageSize - 1) // pageSize
  437. }
  438. except Exception as e:
  439. # 处理异常
  440. traceback.print_exc()
  441. raise HTTPException(status_code=500, detail=str(e))
  442. @router.get('/children/task/log/{children_task_id}/list')
  443. async def get_inspection_task_list(
  444. children_task_id: str ,
  445. area_code: str = Query(None, description='区划编码'),
  446. page: int = Query(1, gt=0, description='页码'),
  447. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  448. db: Session = Depends(get_db),
  449. user_id = Depends(valid_access_token)
  450. ):
  451. try:
  452. # 构建查询
  453. query = db.query(RiskManagementInspectionTaskChildrenTaskLog)
  454. query = query.filter(RiskManagementInspectionTaskChildrenTaskLog.del_flag != '2')
  455. # 应用查询条件
  456. query = query.filter(RiskManagementInspectionTaskChildrenTaskLog.children_task_id == children_task_id)
  457. if area_code:
  458. query = query.filter(RiskManagementInspectionTaskChildrenTaskLog.area_code == area_code)
  459. # 计算总条目数
  460. total_items = query.count()
  461. # 排序
  462. query = query.order_by(RiskManagementInspectionTaskChildrenTaskLog.create_time.desc())
  463. # 执行分页查询
  464. InspectionTasks = query.offset((page - 1) * pageSize).limit(pageSize).all()
  465. # 将查询结果转换为列表形式的字典
  466. InspectionTasks_list = []
  467. for task in InspectionTasks:
  468. task_info = {
  469. "id": task.id,
  470. "children_task_id":task.children_task_id,
  471. "area_code": task.area_code,
  472. "area": task.area,
  473. "task_status": task.task_status,
  474. "user_id": task.user_id,
  475. "nick_name": task.nick_name,
  476. "create_time": task.create_time.strftime('%Y-%m-%d')
  477. }
  478. InspectionTasks_list.append(task_info)
  479. # 返回结果
  480. return {
  481. "code": 200,
  482. "msg": "成功",
  483. "data": InspectionTasks_list,
  484. "total": total_items,
  485. "page": page,
  486. "pageSize": pageSize,
  487. "totalPages": (total_items + pageSize - 1) // pageSize
  488. }
  489. except Exception as e:
  490. # 处理异常
  491. traceback.print_exc()
  492. raise HTTPException(status_code=500, detail=str(e))