__init__.py 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779
  1. import json
  2. import random
  3. from sqlalchemy import create_engine, select
  4. from utils.StripTagsHTMLParser import *
  5. from sqlalchemy.orm import Session
  6. from sqlalchemy import text, exists, and_, or_, not_
  7. import traceback
  8. from models import *
  9. from common.db import db_task
  10. from common.security import valid_access_token
  11. from datetime import datetime, timedelta
  12. from fastapi import APIRouter, Depends, HTTPException, Response, Query
  13. from database import get_db
  14. from pydantic import BaseModel
  15. from utils import *
  16. import copy
  17. from config import settings
  18. from common import YzyApi
  19. from common.db import db_event_management, db_user, db_msg_center, db_yzy, db_dept, db_czrz
  20. from common.enc import mpfun
  21. router = APIRouter()
  22. @router.post('/create')
  23. async def create_task(
  24. request: Request,
  25. db: Session = Depends(get_db),
  26. body=Depends(remove_xss_json),
  27. user_id=Depends(valid_access_token)):
  28. try:
  29. # 验证必需的字段
  30. required_fields = ['task_description', 'unit_name', 'registrar','event_code']
  31. missing_fields = [field for field in required_fields if field not in body]
  32. if missing_fields:
  33. raise HTTPException(status_code=401, detail=f"Missing required fields: {', '.join(missing_fields)}")
  34. event_code = db.query(EventBase).filter(EventBase.event_code == body.get('event_code')).first()
  35. if not event_code:
  36. return Response(content="事件不存在", status_code=400)
  37. unit_id = db_dept.get_dept_id_by_name(db, body['unit_name'])
  38. task_id = db_task.get_next_event_id(db)
  39. imgList = []
  40. if 'imgList' in body:
  41. imgList = body['imgList']
  42. del body['imgList']
  43. fileList = []
  44. if 'fileList' in body:
  45. fileList = body['fileList']
  46. del body['fileList']
  47. task_base = TaskRegistration(
  48. **body,
  49. task_id = task_id,
  50. unit_id = unit_id,
  51. registrar_id = user_id
  52. )
  53. db.add(task_base)
  54. db.commit()
  55. db.refresh(task_base)
  56. for file in imgList:
  57. file_name = file['url']
  58. file_name_desc = file['name']
  59. status = file['status']
  60. new_file = TaskFile(
  61. file_id=new_guid(),
  62. foreign_key=task_base.id,
  63. from_scenario='task_img',
  64. file_name=file_name,
  65. file_name_desc=file_name_desc,
  66. status=status
  67. )
  68. db.add(new_file)
  69. db.commit()
  70. for file in fileList:
  71. file_name = file['url']
  72. file_name_desc = file['name']
  73. status = file['status']
  74. new_file = TaskFile(
  75. file_id=new_guid(),
  76. foreign_key=task_base.id,
  77. from_scenario='task_file',
  78. file_name=file_name,
  79. file_name_desc=file_name_desc,
  80. status=status
  81. )
  82. db.add(new_file)
  83. db.commit()
  84. # 发送粤政易消息
  85. send_yzy_msg(db, task_base, user_id)
  86. try:
  87. user_info = db_user.get_user_info(db, user_id)
  88. db_czrz.log_username(db, user_id, mpfun.dec_data(user_info.user_name), user_info.nick_name, "应急一张图", "任务下达", request.client.host)
  89. except:
  90. traceback.print_exc()
  91. return {
  92. "code": 200,
  93. "msg": "任务创建成功",
  94. "data": task_id
  95. }
  96. except Exception as e:
  97. db.rollback()
  98. traceback.print_exc()
  99. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  100. # 发送粤政易消息
  101. def send_yzy_msg(db: Session, task_base: TaskRegistration, recorded_by: int) -> None:
  102. to_user_id = task_base.executor_id
  103. user_info = db_user.get_user_info(db, to_user_id)
  104. yzy_account = user_info.yzy_account
  105. yzy_userid = db_yzy.get_userid_by_account(db, yzy_account)
  106. event_title = db_event_management.get_event_title(db, task_base.event_code)
  107. create_time = get_datetime_str(task_base.creation_time)
  108. detail_url = "{}{}".format(settings.YZY_WEB_ROOT, "/yjxp/")
  109. description = "事件名称: " + event_title + "\n发布时间:" + create_time + "\n任务内容: "+task_base.task_description
  110. data = {
  111. "yzy_userid": yzy_userid,
  112. "mobile": yzy_account,
  113. "content": description,
  114. "recorded_by": recorded_by,
  115. "detail_url": detail_url,
  116. "foreign_key": task_base.task_id,
  117. "from_scenario": "task_registrations",
  118. "title": f"{event_title}任务"
  119. }
  120. YzyApi.add_to_msg_queue(db, data)
  121. db_msg_center.add_message(db, "任务消息", to_user_id, f"{event_title}任务", task_base.task_description, task_base.task_id, 'task_registrations')
  122. class TaskQuery(BaseModel):
  123. task_id: str = None
  124. task_description: str = None
  125. unit_name: str = None
  126. registrar: str = None
  127. creation_time: str = None
  128. processing_status: str = None
  129. @router.post('/select')
  130. @router.get('/select')
  131. async def select_tasks(
  132. request: Request,
  133. db: Session = Depends(get_db),
  134. query: TaskQuery = Depends(),
  135. sortBy: str = Query(None, description="排序字段"),
  136. sortOrder: str = Query(None, description="排序顺序"),
  137. user_id=Depends(valid_access_token),
  138. pageNum: int = Query(1, gt=0, description="页码"),
  139. event_code: str = Query(None, description="事件ID"),
  140. pageSize: int = Query(10, gt=0, le=100, description="每页大小")):
  141. try:
  142. missing_event_code = db.query(EventBase).filter(EventBase.event_code == event_code).first()
  143. # print(missing_event_code)
  144. if not missing_event_code:
  145. return {
  146. "code": 500,
  147. "msg": "事件不存在"
  148. }
  149. data_query = db.query(TaskRegistration).filter(TaskRegistration.del_flag != '2')
  150. data_query = data_query.filter(TaskRegistration.event_code == event_code)
  151. # 应用过滤条件
  152. if query.task_id:
  153. data_query = data_query.filter(TaskRegistration.task_id == query.task_id)
  154. if query.task_description:
  155. data_query = data_query.filter(TaskRegistration.task_description == query.task_description)
  156. if query.unit_name:
  157. data_query = data_query.filter(TaskRegistration.unit_name == query.unit_name)
  158. if query.registrar:
  159. data_query = data_query.filter(TaskRegistration.registrar == query.registrar)
  160. if query.creation_time:
  161. data_query = data_query.filter(TaskRegistration.creation_time == query.creation_time)
  162. if query.processing_status:
  163. data_query = data_query.filter(TaskRegistration.processing_status == query.processing_status)
  164. # print(TaskRegistration,sortBy)
  165. if sortBy:
  166. if hasattr(TaskRegistration, sortBy):
  167. print("xx")
  168. sort_attr = getattr(TaskRegistration, sortBy)
  169. data_query = data_query.order_by(sort_attr.asc() if sortOrder == 'asc' else sort_attr.desc())
  170. total_count = data_query.count()
  171. offset = (pageNum - 1) * pageSize
  172. data_query = data_query.offset(offset).limit(pageSize)
  173. rows = data_query.all()
  174. data = []
  175. for row in rows:
  176. info = get_model_dict(row)
  177. info['expire_time'] = get_date_str(info['expire_time'])
  178. info['imgList'] = db_task.get_image_file_list(db, info['task_id'])
  179. info['fileList'] = db_task.get_task_file_list(db, info['task_id'])
  180. info['feebacks'] = db_task.get_task_feebacks(db, info['task_id'])
  181. # # 任务发布后半个小时内没反馈记录就需要alert
  182. info['need_alert'] = db_task.need_task_alert(db, info['task_id'])
  183. data.append(info)
  184. return {
  185. "code": 200,
  186. "msg": "任务查询成功",
  187. "data": data,
  188. "total": total_count,
  189. "pages": (total_count + pageSize - 1) // pageSize,
  190. "current_page": pageNum,
  191. "page_size": pageSize
  192. }
  193. except Exception as e:
  194. db.rollback()
  195. traceback.print_exc()
  196. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  197. @router.put('/update')
  198. async def update_task_status(
  199. request: Request,
  200. body = Depends(remove_xss_json),
  201. db: Session = Depends(get_db),
  202. user_id=Depends(valid_access_token)):
  203. try:
  204. task_id_to_use = get_req_param(body, 'task_id')
  205. processing_status = get_req_param(body, 'processing_status')
  206. feedback_content = get_req_param_optional(body, 'feedback_content')
  207. work_station = get_req_param_optional(body, 'work_station')
  208. address = get_req_param_optional(body, 'address')
  209. attachList = None
  210. if 'fileList'in body:
  211. attachList = get_req_param(body, 'fileList')
  212. longitude = latitude = None
  213. if 'lnglat' in body:
  214. if len(body['lnglat']) > 1:
  215. longitude = body['lnglat'][0]
  216. latitude = body['lnglat'][1]
  217. else:
  218. longitude = latitude = 0
  219. if not task_id_to_use:
  220. return Response(content="Missing required parameter 'task_id'", status_code=400)
  221. if processing_status not in ['已完成', '处理中', '待处理','未完成']:
  222. return Response(content="processing_status must be '已完成' or '处理中' or '待处理' or '未完成'", status_code=400)
  223. task_entry = (db.query(TaskRegistration)
  224. .filter(TaskRegistration.del_flag != '2')
  225. .filter(TaskRegistration.task_id == task_id_to_use))
  226. task_entry = task_entry.first()
  227. if not task_entry:
  228. raise HTTPException(status_code=404, detail="任务不存在")
  229. new_feeback = TaskFeeback(
  230. task_id = task_id_to_use,
  231. feeback_user = task_entry.registrar,
  232. content = feedback_content,
  233. processing_status = processing_status,
  234. create_time = datetime.now(),
  235. feeback_type = "0",
  236. leader_unit = "",
  237. leader_name = "",
  238. approval_content = "",
  239. recorded_by=user_id,
  240. longitude = longitude,
  241. latitude = latitude,
  242. address = address,
  243. work_station = work_station
  244. )
  245. db.add(new_feeback)
  246. db.commit()
  247. task_entry.processing_status = processing_status
  248. task_entry.update_time = datetime.now()
  249. db.commit()
  250. if attachList is not None:
  251. for file in attachList:
  252. file_name = file['url']
  253. file_name_desc = file['name']
  254. status = file['status']
  255. new_file = TaskFile(
  256. file_id=new_guid(),
  257. foreign_key=task_id_to_use,
  258. from_scenario='task_feeback',
  259. file_name=file_name,
  260. file_name_desc=file_name_desc,
  261. status=status
  262. )
  263. db.add(new_file)
  264. db.commit()
  265. return {
  266. "code": 200,
  267. "msg": "任务状态更新成功",
  268. "data": {
  269. "task_id": task_id_to_use,
  270. "processing_status": task_entry.processing_status,
  271. "update_time": task_entry.update_time.isoformat()
  272. }
  273. }
  274. except Exception as e:
  275. traceback.print_exc()
  276. raise HTTPException(status_code=500, detail=str(e))
  277. @router.delete('/delete')
  278. async def delete_task(
  279. request: Request,
  280. db: Session = Depends(get_db),
  281. user_id=Depends(valid_access_token)):
  282. try:
  283. body = await request.json()
  284. task_id_to_use = body.get('taskID')
  285. if not task_id_to_use:
  286. raise HTTPException(status_code=400, detail="Missing required parameter 'taskID'")
  287. event_code = db.query(EventBase).filter(EventBase.event_code == body.get('event_code')).first()
  288. if not event_code:
  289. return Response(content="事件不存在", status_code=400)
  290. task_entry = db.query(TaskRegistration).filter(TaskRegistration.task_id == task_id_to_use).first()
  291. if not task_entry:
  292. raise HTTPException(status_code=404, detail="任务不存在")
  293. task_entry.del_flag = '2'
  294. try:
  295. db.commit()
  296. return {
  297. "code": 200,
  298. "msg": "任务删除成功",
  299. "data": {
  300. "task_id": task_entry.task_id
  301. }
  302. }
  303. except Exception as e:
  304. db.rollback()
  305. raise HTTPException(status_code=500, detail=f"An error occurred while deleting the task: {str(e)}")
  306. except HTTPException as e:
  307. raise e
  308. except Exception as e:
  309. db.rollback()
  310. raise HTTPException(status_code=500, detail=f"An unexpected error occurred: {str(e)}")
  311. @router.get('/selectUnit')
  312. async def select_unit(
  313. request: Request,
  314. db: Session = Depends(get_db),
  315. query: TaskQuery = Depends(),
  316. user_id=Depends(valid_access_token),
  317. ):
  318. try:
  319. # 应该换表,暂时先这样
  320. # update task_unit inner join emergency_contact_info on task_unit.unit_name = emergency_contact_info.unit_name set task_unit.unit_id = emergency_contact_info.unit_id where emergency_contact_info.del_flag = '0' ;
  321. data_query = db.query(TaskUnit).filter(TaskUnit.id != '2').all()
  322. return {
  323. "code": 200,
  324. "msg": "查询成功",
  325. "data": data_query
  326. }
  327. except HTTPException as e:
  328. raise e
  329. except Exception as e:
  330. db.rollback()
  331. raise HTTPException(status_code=500, detail=f"An unexpected error occurred: {str(e)}")
  332. #
  333. # 小屏专用,不敢搞大屏相关代码
  334. #
  335. @router.get('/list')
  336. async def select_tasks(
  337. request: Request,
  338. task_type: str = Query(None),
  339. processing_status: str = Query(None),
  340. search_keyword: str = Query(None),
  341. page: int = Query(1, gt=0, description="页码"),
  342. page_size: int = Query(10, gt=0, le=100, description="每页大小"),
  343. db: Session = Depends(get_db)):
  344. try:
  345. data_query = db.query(TaskRegistration).filter(TaskRegistration.del_flag != '2').filter(TaskRegistration.event_code is not None)
  346. # 应用过滤条件
  347. if task_type is not None:
  348. data_query = data_query.filter(TaskRegistration.task_type == task_type)
  349. if search_keyword is not None:
  350. data_query = data_query.filter(TaskRegistration.task_description.like('%{}%'.format(search_keyword)))
  351. if processing_status is not None:
  352. data_query = data_query.filter(TaskRegistration.processing_status == processing_status)
  353. total_count = data_query.count()
  354. offset = (page - 1) * page_size
  355. data_query = data_query.order_by(TaskRegistration.creation_time.desc()).offset(offset).limit(page_size)
  356. data = []
  357. tasks = data_query.all()
  358. for n in tasks:
  359. task = get_model_dict(n)
  360. if task['processing_status'] == '':
  361. task['processing_status'] = '处理中'
  362. task['creation_time'] = get_datetime_str(task['creation_time'])
  363. task['event_name'] = db_event_management.get_event_title(db, n.event_code)
  364. data.append(task)
  365. return {
  366. "code": 200,
  367. "msg": "任务查询成功",
  368. "data": data,
  369. "total": total_count
  370. }
  371. except Exception as e:
  372. traceback.print_exc()
  373. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  374. @router.post("/leader_request")
  375. async def leader_request(
  376. request: Request,
  377. db: Session = Depends(get_db),
  378. body = Depends(remove_xss_json),
  379. user_id = Depends(valid_access_token)
  380. ):
  381. try:
  382. task_id = body['task_id']
  383. processing_status = body['processing_status']
  384. new_feeback = TaskFeeback(
  385. **body,
  386. recorded_by=user_id
  387. )
  388. db.add(new_feeback)
  389. db.commit()
  390. db.query(TaskRegistration).filter(TaskRegistration.task_id == task_id).update(
  391. {
  392. #"processing_status": processing_status,
  393. "update_time": datetime.now()}
  394. )
  395. db.commit()
  396. return {
  397. "code": 200,
  398. "msg": "请示领导保存成功"
  399. }
  400. except Exception as e:
  401. # 处理异常
  402. db.rollback()
  403. traceback.print_exc()
  404. raise HTTPException(status_code=500, detail=str(e))
  405. @router.post("/feeback")
  406. async def feeback(
  407. request: Request,
  408. db: Session = Depends(get_db),
  409. body = Depends(remove_xss_json),
  410. user_id = Depends(valid_access_token)
  411. ):
  412. try:
  413. feeback_user = get_req_param_optional(body, 'feeback_user')
  414. task_id = body['task_id']
  415. processing_status = body['processing_status']
  416. new_file_list = []
  417. if 'fileList' in body:
  418. new_file_list = copy.deepcopy(body['fileList'])
  419. del body['fileList']
  420. if feeback_user == '':
  421. feeback_user = db_user.get_user_info(db, user_id).nick_name
  422. if 'feeback_user' in body:
  423. del body['feeback_user']
  424. new_feeback = TaskFeeback(
  425. **body,
  426. feeback_user=feeback_user,
  427. recorded_by=user_id
  428. )
  429. db.add(new_feeback)
  430. db.commit()
  431. db.refresh(new_feeback)
  432. print(new_file_list)
  433. for file in new_file_list:
  434. file_name = file['file_name']
  435. file_name_desc = file['file_name_desc']
  436. status = file['status']
  437. new_file = TaskFile(
  438. file_id=new_guid(),
  439. foreign_key=new_feeback.id,
  440. from_scenario='task_feeback',
  441. file_name=file_name,
  442. file_name_desc=file_name_desc,
  443. status=status
  444. )
  445. db.add(new_file)
  446. db.commit()
  447. db.query(TaskRegistration).filter(TaskRegistration.task_id == task_id).update({"processing_status": processing_status, "update_time": datetime.now()})
  448. db.commit()
  449. return {
  450. "code": 200,
  451. "msg": "任务反馈保存成功"
  452. }
  453. except Exception as e:
  454. # 处理异常
  455. db.rollback()
  456. traceback.print_exc()
  457. raise HTTPException(status_code=500, detail=str(e))
  458. @router.get('/detail')
  459. async def get_task_detail(
  460. request: Request,
  461. task_id: str = Query(None, description='任务编号'),
  462. db: Session = Depends(get_db)):
  463. print('task_id:',task_id)
  464. try:
  465. # 构建查询
  466. rows = db.query(TaskFeeback).filter(and_(TaskFeeback.task_id == task_id)).all()
  467. feebacks = []
  468. for row in rows:
  469. fileList = []
  470. # 附件
  471. rows = db.query(TaskFile).filter(and_(TaskFile.from_scenario=="task_feeback", TaskFile.foreign_key == row.id, InfoPublishFile.del_flag == '0')).all()
  472. fileList = [
  473. {
  474. "name": row.file_name,
  475. "url": row.storage_file_name
  476. }
  477. for row in rows
  478. ]
  479. info = get_model_dict(row)
  480. info['create_time'] = get_datetime_str(row.create_time)
  481. info['approval_time'] = get_datetime_str(row.approval_time)
  482. info['fileList'] = fileList
  483. info['fileCount'] = len(fileList)
  484. feebacks.append(info)
  485. query = db.query(TaskRegistration)
  486. query = query.filter(TaskRegistration.task_id == task_id)
  487. # 执行查询
  488. row = query.first()
  489. if row is not None:
  490. return {
  491. "code": 200,
  492. "msg": "查询成功",
  493. "data": {
  494. "id": row.id,
  495. "task_id": row.task_id,
  496. "task_type": row.task_type,
  497. "event_code": row.event_code,
  498. "event_name": db_event_management.get_event_title(db, row.event_code),
  499. "processing_status": row.processing_status,
  500. "expire_time": get_datetime_str(row.expire_time),
  501. "update_time": get_datetime_str(row.update_time),
  502. "feeback_user": row.feeback_user,
  503. "task_description": row.task_description,
  504. "feebacks": feebacks
  505. }
  506. }
  507. else:
  508. return {
  509. "code": 500,
  510. "msg": "查询失败"
  511. }
  512. except Exception as e:
  513. # 处理异常
  514. traceback.print_exc()
  515. raise HTTPException(status_code=500, detail=str(e))
  516. # 请示列表
  517. @router.get('/request/list')
  518. async def select_tasks(
  519. request: Request,
  520. task_type: str = Query(None),
  521. processing_status: str = Query(None),
  522. search_keyword: str = Query(None),
  523. page: int = Query(1, gt=0, description="页码"),
  524. page_size: int = Query(10, gt=0, le=100, description="每页大小"),
  525. db: Session = Depends(get_db)):
  526. try:
  527. data_query = db.query(TaskFeeback).filter(TaskFeeback.feeback_type == '1')
  528. # 应用过滤条件
  529. if task_type is not None:
  530. subquery = db.query(TaskRegistration.task_id).filter(and_(TaskRegistration.del_flag == '0', TaskRegistration.task_type == task_type)).subquery()
  531. data_query = data_query.filter(TaskFeeback.task_id == subquery.c.task_id)
  532. if processing_status is not None:
  533. data_query = data_query.filter(TaskFeeback.processing_status == processing_status)
  534. if search_keyword is not None:
  535. data_query = data_query.filter(TaskFeeback.content.like('%{}%'.format(search_keyword)))
  536. total_count = data_query.count()
  537. offset = (page - 1) * page_size
  538. data_query = data_query.order_by(TaskFeeback.create_time.desc()).offset(offset).limit(page_size)
  539. data = []
  540. tasks = data_query.all()
  541. for n in tasks:
  542. task = get_model_dict(n)
  543. task['nick_name'] = db_user.get_nick_name_by_id(db, task['recorded_by'])
  544. task['create_time'] = get_datetime_str(task['create_time'])
  545. task['approval_time'] = get_datetime_str(task['approval_time'])
  546. task['update_time'] = task['create_time']
  547. if task['approval_time'] != None:
  548. task['update_time'] = task['approval_time']
  549. task['event_name'] = ''
  550. task_id = task['task_id']
  551. reg_info = db.query(TaskRegistration).filter(TaskRegistration.task_id == task_id).first()
  552. if reg_info is not None:
  553. reg_info = get_model_dict(reg_info)
  554. task['event_name'] = db_event_management.get_event_title(db, reg_info['event_code'])
  555. data.append(task)
  556. return {
  557. "code": 200,
  558. "msg": "请示查询成功",
  559. "data": data,
  560. "total": total_count
  561. }
  562. except Exception as e:
  563. traceback.print_exc()
  564. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  565. # 请示批复
  566. @router.post("/approval")
  567. async def approval(
  568. request: Request,
  569. db: Session = Depends(get_db),
  570. body = Depends(remove_xss_json),
  571. user_id = Depends(valid_access_token)
  572. ):
  573. try:
  574. feeback_id = get_req_param(body, "feeback_id")
  575. approval_content = get_req_param_optional(body, 'approval_content')
  576. row = db.query(TaskFeeback).filter(TaskFeeback.id == feeback_id).first()
  577. if row is None:
  578. return {
  579. "code": 500,
  580. "msg": "请示不存在"
  581. }
  582. row.approval_content = approval_content
  583. row.approval_time = datetime.now()
  584. row.processing_status = '已完成'
  585. db.commit()
  586. return {
  587. "code": 200,
  588. "msg": "请示批复保存成功"
  589. }
  590. except Exception as e:
  591. # 处理异常
  592. db.rollback()
  593. traceback.print_exc()
  594. raise HTTPException(status_code=500, detail=str(e))
  595. # 手机工作台任务反馈查询
  596. @router.get('/feeback_by_mobile_station')
  597. async def feeback_by_mobile_station(
  598. request: Request,
  599. mobile_id: str,
  600. event_code: str = Query(None, description="事件ID"),
  601. db: Session = Depends(get_db),
  602. user_id: int = Depends(valid_access_token),
  603. pageNum: int = Query(1, gt=0, description="页码"),
  604. pageSize: int = Query(10, gt=0, le=100, description="每页大小")):
  605. try:
  606. def get_img_list_by_task_id(task_id):
  607. return db_task.get_image_file_list(db, task_id)
  608. def get_file_list_by_task_id(task_id):
  609. task_file_list = db_task.get_task_file_list(db, task_id)
  610. task_feeback_file_list = db_task.get_task_feeback_file_list(db, task_id)
  611. return task_file_list + task_feeback_file_list
  612. missing_event_code = db.query(EventBase).filter(EventBase.event_code == event_code).first()
  613. # print(missing_event_code)
  614. if not missing_event_code:
  615. return {
  616. "code": 500,
  617. "msg": "事件不存在"
  618. }
  619. # 匹配所有事件相关任务
  620. data_query = db.query(TaskRegistration, TaskFeeback).join(TaskFeeback, TaskRegistration.task_id == TaskFeeback.task_id)
  621. data_query = data_query.filter(TaskRegistration.del_flag != '2').filter(TaskRegistration.event_code == event_code).filter(TaskFeeback.feeback_type == '0')
  622. data_query = data_query.filter(TaskFeeback.work_station == mobile_id)
  623. total_count = data_query.count()
  624. offset = (pageNum - 1) * pageSize
  625. data_query = data_query.offset(offset).limit(pageSize)
  626. rows = data_query.all()
  627. data = []
  628. for register, feeback in rows:
  629. print('register.task_id', register.task_id)
  630. info = {
  631. "task_id": register.task_id,
  632. "unit_name": register.unit_name,
  633. "task_description": register.task_description,
  634. "registrar": register.registrar,
  635. "executor": register.executor,
  636. "content": feeback.content,
  637. "update_time": feeback.create_time,
  638. "address": feeback.address,
  639. "longitude": feeback.longitude,
  640. "latitude": feeback.latitude,
  641. 'imgList': get_img_list_by_task_id(register.task_id),
  642. 'fileList': get_file_list_by_task_id(register.task_id),
  643. "img_name": "",
  644. "img_url": "",
  645. "file_name": "",
  646. "file_url": "",
  647. }
  648. if len(info['imgList']) > 0:
  649. n = len(info['imgList']) - 1
  650. info['img_name'] = info['imgList'][n]['name']
  651. info['img_url'] = info['imgList'][n]['url']
  652. if len(info['fileList']) > 0:
  653. n = len(info['fileList']) - 1
  654. info['file_name'] = info['fileList'][n]['name']
  655. info['file_url'] = info['fileList'][n]['url']
  656. data.append(info)
  657. return {
  658. "code": 200,
  659. "msg": "任务查询成功",
  660. "data": data,
  661. "total": total_count
  662. }
  663. except Exception as e:
  664. db.rollback()
  665. traceback.print_exc()
  666. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")