task.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534
  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. raise HTTPException(status_code=500, detail=str(e))
  161. @router.get('/{id}')
  162. async def get_inspection_task(
  163. id: str ,
  164. db: Session = Depends(get_db),
  165. user_id = Depends(valid_access_token)
  166. ):
  167. try:
  168. # 构建查询
  169. query = db.query(RiskManagementInspectionTask)
  170. query = query.filter(RiskManagementInspectionTask.del_flag != '2')
  171. # 应用查询条件
  172. if id:
  173. query = query.filter(RiskManagementInspectionTask.id == id)
  174. # 执行查询
  175. task = query.first()
  176. if not task:
  177. detail = "巡查任务不存在"
  178. raise HTTPException(status_code=404, detail="巡查任务不存在")
  179. # 将查询结果转换为列表形式的字典
  180. if task.task_status == '3':
  181. task_status = '3' # '已完结'
  182. else:
  183. if datetime.now() < task.start_time:
  184. task_status = '0' # '未开始'
  185. elif task.start_time <= datetime.now() <= task.end_time:
  186. task_status = '1' # '进行中'
  187. else:
  188. task_status = '2' # '未完成'
  189. create_by = task.create_by
  190. create_by = db.query(SysUser).filter(SysUser.user_id == create_by).first()
  191. inspection_task_result = {
  192. "id": task.id,
  193. "task_number": task.task_number,
  194. "business": task.inspection_business,
  195. "task_time": '%s-%s'%(task.start_time.strftime('%Y/%m/%d'),task.end_time.strftime('%Y/%m/%d')),
  196. "cycle": task.inspection_cycle,
  197. "inspection_range": task.inspection_range,
  198. "task_status": task_status,
  199. "create_by":create_by.nick_name,
  200. "create_time": task.create_time.strftime('%Y-%m-%d')
  201. }
  202. # 返回结果
  203. return {
  204. "code": 200,
  205. "msg": "成功",
  206. "data": inspection_task_result
  207. }
  208. except Exception as e:
  209. # 处理异常
  210. if str(e)=='':
  211. e = detail
  212. raise HTTPException(status_code=500, detail=str(e))
  213. @router.post('/create')
  214. async def create_inspection_task(
  215. background_tasks: BackgroundTasks,
  216. db: Session = Depends(get_db),
  217. body = Depends(remove_xss_json),
  218. user_id = Depends(valid_access_token)
  219. ):
  220. try:
  221. cycle = body['cycle']
  222. # 0每年、1每月、2每周、3每日、4一次
  223. corn_query = body['corn_query']
  224. if cycle=='0':
  225. corn=f'0 0 {corn_query} *'
  226. elif cycle=='1':
  227. corn=f'0 0 {corn_query} * *'
  228. elif cycle == '2':
  229. corn = f'0 0 * * {corn_query}'
  230. elif cycle == '3':
  231. corn = f'0 0 * * *'
  232. else:
  233. corn=''
  234. # 创建新的预案记录
  235. new_task = RiskManagementInspectionTask(
  236. inspection_business=body['business'],
  237. start_time = body['start_time'],
  238. end_time = body['end_time'],
  239. inspection_cycle = cycle,
  240. corn_expression = corn,
  241. inspection_range = body['inspection_range'],
  242. task_status = '-1',
  243. create_by = user_id
  244. )
  245. # 添加到数据库会话并提交
  246. db.add(new_task)
  247. db.commit()
  248. db.refresh(new_task) # 可选,如果需要刷新实例状态
  249. new_task.task_number = f'YJXC{str(new_task.id).zfill(10)}'
  250. db.commit()
  251. # 返回创建成功的响应
  252. background_tasks.add_task(create_children_task,db,new_task,corn_query)
  253. return {
  254. "code": 200,
  255. "msg": "成功",
  256. "data": None
  257. }
  258. except Exception as e:
  259. # 处理异常
  260. raise HTTPException(status_code=500, detail=str(e))
  261. @router.put('/update')
  262. async def update_inspection_task(
  263. db: Session = Depends(get_db),
  264. body = Depends(remove_xss_json),
  265. user_id = Depends(valid_access_token)
  266. ):
  267. try:
  268. # 提取请求数据
  269. query = db.query(RiskManagementInspectionTask)
  270. query = query.filter(RiskManagementInspectionTask.id == body['id'])
  271. query = query.filter(RiskManagementInspectionTask.del_flag != '2')
  272. task = query.first()
  273. if not task:
  274. detail = "任务不存在"
  275. raise HTTPException(status_code=404, detail="任务不存在")
  276. if 'cycle' in body:
  277. cycle = body['cycle']
  278. # 0每年、1每月、2每周、3每日、4一次
  279. corn_query = body['corn_query']
  280. if cycle == '0':
  281. corn = f'0 0 {corn_query} *'
  282. elif cycle == '1':
  283. corn = f'0 0 {corn_query} * *'
  284. elif cycle == '2':
  285. corn = f'0 0 * * {corn_query}'
  286. elif cycle == '3':
  287. corn = f'0 0 * * *'
  288. else:
  289. corn = ''
  290. task.inspection_cycle = cycle
  291. task.corn_expression = corn
  292. if 'business' in body:
  293. task.inspection_business = body['business']
  294. if 'start_time' in body:
  295. task.start_time = body['start_time']
  296. if 'end_time' in body:
  297. task.end_time = body['end_time']
  298. if 'inspection_range' in body:
  299. task.inspection_range = body['inspection_range']
  300. if 'task_status' in body:
  301. task.task_status = body['task_status']
  302. if user_id:
  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. if str(e)=='':
  316. e = detail
  317. raise HTTPException(status_code=500, detail=str(e))
  318. @router.delete('/delete')
  319. async def delete_inspection_tasks(
  320. taskIds: list,
  321. db: Session = Depends(get_db),
  322. body = Depends(remove_xss_json),
  323. user_id = Depends(valid_access_token)
  324. ):
  325. try:
  326. # 提取请求数据
  327. query = db.query(RiskManagementInspectionTask)
  328. query = query.filter(RiskManagementInspectionTask.del_flag != '2')
  329. query = query.filter(RiskManagementInspectionTask.id.in_(taskIds))
  330. tasks = query.all()
  331. if not tasks:
  332. detail = "任务不存在"
  333. raise HTTPException(status_code=404, detail="任务不存在")
  334. for task in tasks:
  335. task.del_flag = '2'
  336. task.update_by=user_id
  337. # 更新到数据库会话并提交
  338. db.commit()
  339. # 返回创建成功的响应
  340. return {
  341. "code": 200,
  342. "msg": "删除成功",
  343. "data": None
  344. }
  345. except Exception as e:
  346. # 处理异常
  347. if str(e) == '':
  348. e = detail
  349. raise HTTPException(status_code=500, detail=str(e))
  350. @router.delete('/delete/{userId}')
  351. async def delete_inspection_task(
  352. userId: str,
  353. db: Session = Depends(get_db),
  354. body = Depends(remove_xss_json),
  355. user_id = Depends(valid_access_token)
  356. ):
  357. try:
  358. # 提取请求数据
  359. query = db.query(RiskManagementInspectionTask)
  360. query = query.filter(RiskManagementInspectionTask.del_flag != '2')
  361. query = query.filter(RiskManagementInspectionTask.id==userId)
  362. task = query.first()
  363. if not task:
  364. detail = "巡查任务不存在"
  365. raise HTTPException(status_code=404, detail="巡查任务不存在")
  366. task.del_flag = '2'
  367. task.update_by = user_id
  368. # 更新到数据库会话并提交
  369. db.commit()
  370. db.refresh(task) # 可选,如果需要刷新实例状态
  371. # 返回创建成功的响应
  372. return {
  373. "code": 200,
  374. "msg": "删除成功",
  375. "data": None
  376. }
  377. except Exception as e:
  378. # 处理异常
  379. if str(e) == '':
  380. e = detail
  381. raise HTTPException(status_code=500, detail=str(e))
  382. @router.get('/children/task/{task_id}/list')
  383. async def get_inspection_task_list(
  384. task_id: str ,
  385. page: int = Query(1, gt=0, description='页码'),
  386. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  387. db: Session = Depends(get_db),
  388. user_id = Depends(valid_access_token)
  389. ):
  390. try:
  391. # 构建查询
  392. query = db.query(RiskManagementInspectionTaskChildrenTask)
  393. query = query.filter(RiskManagementInspectionTaskChildrenTask.del_flag != '2')
  394. # 应用查询条件
  395. query = query.filter(RiskManagementInspectionTaskChildrenTask.task_id == task_id)
  396. # 计算总条目数
  397. total_items = query.count()
  398. # 排序
  399. query = query.order_by(RiskManagementInspectionTaskChildrenTask.tsak_time.asc())
  400. # 执行分页查询
  401. InspectionTasks = query.offset((page - 1) * pageSize).limit(pageSize).all()
  402. # 将查询结果转换为列表形式的字典
  403. InspectionTasks_list = []
  404. for task in InspectionTasks:
  405. task_num=task.task_num
  406. completed_num = db.query(RiskManagementInspectionTaskChildrenTaskLog)\
  407. .filter(RiskManagementInspectionTaskChildrenTaskLog.del_flag!='2')\
  408. .filter(RiskManagementInspectionTaskChildrenTaskLog.children_task_id==task.id).count()
  409. incomplete_num = task_num-completed_num
  410. task_info = {
  411. "id": task.id,
  412. "task_id":task.task_id,
  413. "task_number": task.task_number,
  414. "business": task.type,
  415. "task_time": task.tsak_time.strftime('%Y-%m-%d'),
  416. "cycle": task.cycle,
  417. "inspection_range": task.task_range,
  418. "completed_num": completed_num,
  419. "incomplete_num": incomplete_num,
  420. "create_time": task.create_time.strftime('%Y-%m-%d')
  421. }
  422. InspectionTasks_list.append(task_info)
  423. # 返回结果
  424. return {
  425. "code": 200,
  426. "msg": "成功",
  427. "data": InspectionTasks_list,
  428. "total": total_items,
  429. "page": page,
  430. "pageSize": pageSize,
  431. "totalPages": (total_items + pageSize - 1) // pageSize
  432. }
  433. except Exception as e:
  434. # 处理异常
  435. raise HTTPException(status_code=500, detail=str(e))
  436. @router.get('/children/task/log/{children_task_id}/list')
  437. async def get_inspection_task_list(
  438. children_task_id: str ,
  439. area_code: str = Query(None, description='区划编码'),
  440. page: int = Query(1, gt=0, description='页码'),
  441. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  442. db: Session = Depends(get_db),
  443. user_id = Depends(valid_access_token)
  444. ):
  445. try:
  446. # 构建查询
  447. query = db.query(RiskManagementInspectionTaskChildrenTaskLog)
  448. query = query.filter(RiskManagementInspectionTaskChildrenTaskLog.del_flag != '2')
  449. # 应用查询条件
  450. query = query.filter(RiskManagementInspectionTaskChildrenTaskLog.children_task_id == children_task_id)
  451. if area_code:
  452. query = query.filter(RiskManagementInspectionTaskChildrenTaskLog.area_code == area_code)
  453. # 计算总条目数
  454. total_items = query.count()
  455. # 排序
  456. query = query.order_by(RiskManagementInspectionTaskChildrenTaskLog.create_time.desc())
  457. # 执行分页查询
  458. InspectionTasks = query.offset((page - 1) * pageSize).limit(pageSize).all()
  459. # 将查询结果转换为列表形式的字典
  460. InspectionTasks_list = []
  461. for task in InspectionTasks:
  462. task_info = {
  463. "id": task.id,
  464. "children_task_id":task.children_task_id,
  465. "area_code": task.area_code,
  466. "area": task.area,
  467. "task_status": task.task_status,
  468. "user_id": task.user_id,
  469. "nick_name": task.nick_name,
  470. "create_time": task.create_time.strftime('%Y-%m-%d')
  471. }
  472. InspectionTasks_list.append(task_info)
  473. # 返回结果
  474. return {
  475. "code": 200,
  476. "msg": "成功",
  477. "data": InspectionTasks_list,
  478. "total": total_items,
  479. "page": page,
  480. "pageSize": pageSize,
  481. "totalPages": (total_items + pageSize - 1) // pageSize
  482. }
  483. except Exception as e:
  484. # 处理异常
  485. raise HTTPException(status_code=500, detail=str(e))