schedule.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from fastapi import APIRouter, Request, Depends, Query, HTTPException, status
  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 sqlalchemy.sql import func
  9. from common.auth_user import *
  10. from pydantic import BaseModel
  11. from database import get_db
  12. from typing import List
  13. from models import *
  14. from utils import *
  15. from utils.ry_system_util import *
  16. from utils.video_util import *
  17. import traceback
  18. import json
  19. router = APIRouter()
  20. def name_get_user_id(db,keywords):
  21. query = db.query(EmergencyContactUser)
  22. query = query.filter(EmergencyContactUser.del_flag != '2')
  23. query = query.filter(EmergencyContactUser.name.like(f"%{keywords}%"))
  24. data = query.all()
  25. return [info.id for info in data]
  26. def user_id_get_duty_id(db,user_id_list):
  27. query = db.query(DutyPersonnelArrangement)
  28. query = query.filter(DutyPersonnelArrangement.del_flag != '2')
  29. query = query.filter(DutyPersonnelArrangement.personnel_id.in_(user_id_list))
  30. data = query.all()
  31. return [info.duty_id for info in data]
  32. def duty_id_get_user_id(db,duty_id):
  33. query = db.query(DutyPersonnelArrangement)
  34. query = query.filter(DutyPersonnelArrangement.del_flag != '2')
  35. query = query.filter(DutyPersonnelArrangement.duty_id==duty_id)
  36. data = query.all()
  37. return data
  38. def user_id_get_info(db,user_id):
  39. query = db.query(EmergencyContactUser)
  40. query = query.filter(EmergencyContactUser.del_flag != '2')
  41. query = query.filter(EmergencyContactUser.id==user_id)
  42. data = query.first()
  43. return data
  44. def get_duty_unit_id_list(db):
  45. query = db.query(SysDictData)
  46. query = query.filter(SysDictData.del_flag != '2')
  47. query = query.filter(SysDictData.dict_type=='duty_unit')
  48. data = query.all()
  49. return [int(i.dict_value) for i in data]
  50. def dept_id_get_duty_unit_id(db,dept_id,duty_unit_id_list):
  51. if dept_id == 0:
  52. return 0
  53. if dept_id in duty_unit_id_list:
  54. return dept_id
  55. query = db.query(EmergencyContactDepartment)
  56. query = query.filter(EmergencyContactDepartment.del_flag != '2')
  57. query = query.filter(EmergencyContactDepartment.id==dept_id)
  58. data = query.first()
  59. if data:
  60. dept_id_get_duty_unit_id(db, data.parent_department_id, duty_unit_id_list)
  61. else:
  62. return 0
  63. def mobile_phone_get_dept_id(db,mobile_phone,duty_unit_id_list):
  64. query = db.query(EmergencyContactUser)
  65. query = query.filter(EmergencyContactUser.del_flag != '2')
  66. query = query.filter(EmergencyContactUser.mobile_phone==mobile_phone)
  67. data = query.first()
  68. if data:
  69. dept_id = data.department_id
  70. dept_id = dept_id_get_duty_unit_id(db, dept_id, duty_unit_id_list)
  71. return dept_id
  72. else:
  73. return 0
  74. @router.get('/list')
  75. async def get_dict_data_by_type(
  76. keywords:str =Query(None),
  77. duty_type:str =Query(None),
  78. start_time:str =Query(None),
  79. end_time:str =Query(None),
  80. duty_unit:int =Query(None),
  81. page: int = Query(1, gt=0),
  82. pageSize: int = Query(10, gt=0),
  83. db: Session = Depends(get_db),
  84. body = Depends(remove_xss_json),
  85. user_id = Depends(valid_access_token)
  86. ):
  87. try:
  88. # 根据 dict_type 查询字典数据
  89. # dict_data = db.query(SysDictData).filter_by(dict_type=dictType).all()
  90. query = db.query(DutySchedule)
  91. query = query.filter(DutySchedule.del_flag != '2')
  92. # 添加查询条件
  93. if keywords:
  94. user_list= name_get_user_id(db,keywords)
  95. duty_list = user_id_get_duty_id(db,user_list)
  96. query = query.filter(DutySchedule.id.in_(duty_list))
  97. if duty_type:
  98. query = query.filter(DutySchedule.duty_type==duty_type)
  99. if start_time:
  100. start_time = datetime.strptime(start_time, "%Y-%m-%d").date()
  101. query = query.filter(DutySchedule.duty_date>=start_time)
  102. if end_time:
  103. end_time = datetime.strptime(end_time, "%Y-%m-%d").date()
  104. query = query.filter(DutySchedule.duty_date<=end_time)
  105. if duty_unit:
  106. query = query.filter(DutySchedule.duty_unit==duty_unit)
  107. # 计算总记录数
  108. total_count = query.count()
  109. # 计算分页
  110. offset = (page - 1) * pageSize
  111. query = query.order_by(DutySchedule.update_time.desc())
  112. duty_data = query.offset(offset).limit(pageSize).all()
  113. # 转换为字典
  114. data_list = []
  115. for d in duty_data:
  116. user_data = []
  117. user_list = duty_id_get_user_id(db,d.id)
  118. for user_info in user_list:
  119. contact_info = user_id_get_info(db, user_info.personnel_id)
  120. user_data.append({"position_id":user_info.position_id,
  121. "personnel_id":user_info.personnel_id,
  122. "name":contact_info.name,
  123. "position":contact_info.position,
  124. "mobile_phone":contact_info.mobile_phone,
  125. "office_phone":contact_info.office_phone,
  126. "department_id":contact_info.department_id,
  127. "yzy_userid":contact_info.userid})
  128. data_list.append({
  129. "id": d.id,
  130. "start_time": d.start_time.strftime('%Y-%m-%d %H:%M:%S') if d.start_time else '',
  131. "end_time":d.end_time.strftime('%Y-%m-%d %H:%M:%S') if d.end_time else '',
  132. "duty_date": d.duty_date,
  133. "shift_type":d.shift_type,
  134. "duty_unit": d.duty_unit,
  135. "duty_type": d.duty_type,
  136. "createTime": d.create_time.strftime('%Y-%m-%d %H:%M:%S') if d.create_time else '',
  137. "user_data":user_data
  138. })
  139. # 构建返回结果
  140. result = {
  141. "total": total_count,
  142. "page": page,
  143. "pageSize": pageSize,
  144. "totalPages": (total_count + pageSize - 1) // pageSize,
  145. "data": data_list,
  146. "code": 200,
  147. "msg": "查询成功"
  148. }
  149. return result
  150. except Exception as e:
  151. # 处理异常
  152. traceback.print_exc()
  153. return JSONResponse(status_code=404, content={
  154. 'code': 404,
  155. 'msg': str(e)
  156. })
  157. @router.get('/latest_by_group')
  158. async def get_dict_data_by_type(
  159. keywords:str =Query(None),
  160. start_time:str =Query(None),
  161. end_time:str =Query(None),
  162. duty_unit:int =Query(None),
  163. page: int = Query(1, gt=0),
  164. pageSize: int = Query(10, gt=0),
  165. db: Session = Depends(get_db),
  166. body = Depends(remove_xss_json),
  167. user_id = Depends(valid_access_token)
  168. ):
  169. try:
  170. # 根据 dict_type 查询字典数据
  171. # dict_data = db.query(SysDictData).filter_by(dict_type=dictType).all()
  172. query = db.query(DutySchedule)
  173. query = query.filter(DutySchedule.del_flag != '2')
  174. # 添加查询条件
  175. if keywords:
  176. user_list= name_get_user_id(db,keywords)
  177. duty_list = user_id_get_duty_id(db,user_list)
  178. query = query.filter(DutySchedule.id.in_(duty_list))
  179. if start_time:
  180. start_time = datetime.strptime(start_time, "%Y-%m-%d").date()
  181. query = query.filter(DutySchedule.duty_date>=start_time)
  182. if end_time:
  183. end_time = datetime.strptime(end_time, "%Y-%m-%d").date()
  184. query = query.filter(DutySchedule.duty_date<=end_time)
  185. if duty_unit:
  186. query = query.filter(DutySchedule.duty_unit==duty_unit)
  187. else:
  188. now_user_info=user_id_get_user_info(db,user_id)
  189. print(user_id,now_user_info.phonenumber,get_duty_unit_id_list(db))
  190. if now_user_info:
  191. query = query.filter(DutySchedule.duty_unit==mobile_phone_get_dept_id(db,mpfun.dec_data(now_user_info.phonenumber),get_duty_unit_id_list(db)))
  192. else:
  193. return {
  194. "total": 0,
  195. "page": page,
  196. "pageSize": pageSize,
  197. "totalPages": (0 + pageSize - 1) // pageSize,
  198. "data": [],
  199. "code": 200,
  200. "msg": "查询成功"
  201. }
  202. subquery = db.query(
  203. DutySchedule.duty_date,
  204. DutySchedule.shift_type,
  205. func.max(DutySchedule.update_time).label("latest_create_time")
  206. ).filter(DutySchedule.del_flag != '2').group_by(
  207. DutySchedule.duty_date,
  208. DutySchedule.shift_type
  209. ).subquery()
  210. query = query.join(
  211. subquery,
  212. and_(
  213. DutySchedule.duty_date == subquery.c.duty_date,
  214. DutySchedule.shift_type == subquery.c.shift_type,
  215. DutySchedule.update_time == subquery.c.latest_create_time
  216. )
  217. )
  218. # 计算总记录数
  219. total_count = query.count()
  220. # 计算分页
  221. offset = (page - 1) * pageSize
  222. query = query.order_by(DutySchedule.update_time.desc())
  223. print(query)
  224. duty_data = query.offset(offset).limit(pageSize).all()
  225. # 转换为字典
  226. data_list = []
  227. for d in duty_data:
  228. user_data = []
  229. user_list = duty_id_get_user_id(db,d.id)
  230. for user_info in user_list:
  231. contact_info = user_id_get_info(db, user_info.personnel_id)
  232. user_data.append({"position_id":user_info.position_id,
  233. "personnel_id":user_info.personnel_id,
  234. "name":contact_info.name,
  235. "position":contact_info.position,
  236. "mobile_phone":contact_info.mobile_phone,
  237. "office_phone":contact_info.office_phone,
  238. "department_id":contact_info.department_id,
  239. "yzy_userid":contact_info.userid})
  240. data_list.append({
  241. "id": d.id,
  242. "start_time": d.start_time.strftime('%Y-%m-%d %H:%M:%S') if d.start_time else '',
  243. "end_time":d.end_time.strftime('%Y-%m-%d %H:%M:%S') if d.end_time else '',
  244. "duty_date": d.duty_date,
  245. "shift_type":d.shift_type,
  246. "duty_unit": d.duty_unit,
  247. "duty_type": d.duty_type,
  248. "createTime": d.create_time.strftime('%Y-%m-%d %H:%M:%S') if d.create_time else '',
  249. "user_data":user_data
  250. })
  251. # 构建返回结果
  252. result = {
  253. "total": total_count,
  254. "page": page,
  255. "pageSize": pageSize,
  256. "totalPages": (total_count + pageSize - 1) // pageSize,
  257. "data": data_list,
  258. "code": 200,
  259. "msg": "查询成功"
  260. }
  261. return result
  262. except Exception as e:
  263. # 处理异常
  264. traceback.print_exc()
  265. return JSONResponse(status_code=404, content={
  266. 'code': 404,
  267. 'msg': str(e)
  268. })
  269. @router.get('/info/{id}')
  270. async def get_dict_data_by_type(
  271. id: str ,
  272. db: Session = Depends(get_db),
  273. body = Depends(remove_xss_json),
  274. user_id = Depends(valid_access_token)
  275. ):
  276. try:
  277. # 根据 dict_type 查询字典数据
  278. # dict_data = dict_type_get_dict_data_info(db,'three_proofing')
  279. query = db.query(DutySchedule)
  280. # 添加查询条件
  281. # if dictType:
  282. query = query.filter(DutySchedule.id==id)
  283. query = query.filter(DutySchedule.del_flag != '2')
  284. d = query.first()
  285. user_data = []
  286. user_list = duty_id_get_user_id(db, d.id)
  287. for user_info in user_list:
  288. contact_info = user_id_get_info(db, user_info.personnel_id)
  289. user_data.append({"position_id": user_info.position_id,
  290. "personnel_id": user_info.personnel_id,
  291. "name": contact_info.name,
  292. "position": contact_info.position,
  293. "mobile_phone": contact_info.mobile_phone,
  294. "office_phone": contact_info.office_phone,
  295. "department_id": contact_info.department_id,
  296. "yzy_userid": contact_info.userid})
  297. data_list={
  298. "id": d.id,
  299. "start_time": d.start_time,
  300. "end_time": d.end_time,
  301. "duty_date": d.duty_date,
  302. "shift_type": d.shift_type,
  303. "duty_unit": d.duty_unit,
  304. "duty_type": d.duty_type,
  305. "createTime": d.create_time.strftime('%Y-%m-%d %H:%M:%S') if d.create_time else '',
  306. "user_data": user_data
  307. }
  308. # 构建返回结果
  309. result = {
  310. "data": data_list,
  311. "code": 200,
  312. "msg": "查询成功"
  313. }
  314. return result
  315. except Exception as e:
  316. # 处理异常
  317. traceback.print_exc()
  318. return JSONResponse(status_code=404, content={
  319. 'code': 404,
  320. 'msg': str(e)
  321. })
  322. @router.post('/create')
  323. async def create_dict_data(
  324. db: Session = Depends(get_db),
  325. body = Depends(remove_xss_json),
  326. user_id = Depends(valid_access_token)
  327. ):
  328. try:
  329. # 创建一个新的 SysDictData 实例
  330. user_data = body['user_data']
  331. if len(user_data)==0:
  332. return JSONResponse(status_code=404, content={
  333. 'errcode': 404,
  334. 'errmsg': '值班人员不能为空'
  335. })
  336. new_duty_data = DutySchedule(
  337. start_time=body['start_time'],
  338. end_time=body['end_time'],
  339. duty_date=body['duty_date'],
  340. shift_type=body['shift_type'],
  341. duty_unit=body['duty_unit'],
  342. duty_type=body['duty_type'],
  343. create_by=user_id
  344. )
  345. # 添加到会话并提交
  346. db.add(new_duty_data)
  347. db.commit()
  348. db.refresh(new_duty_data)
  349. user_list = []
  350. for user_info in user_data:
  351. user_list.append( DutyPersonnelArrangement(
  352. duty_id=new_duty_data.id,
  353. position_id=user_info['position_id'],
  354. personnel_id=user_info['personnel_id'],
  355. create_by=user_id
  356. ))
  357. db.add_all(user_list)
  358. db.commit()
  359. # 构建返回结果
  360. result = {
  361. "code": 200,
  362. "msg": "操作成功",
  363. "data": None
  364. }
  365. return result
  366. except Exception as e:
  367. # 处理异常
  368. traceback.print_exc()
  369. return JSONResponse(status_code=404, content={
  370. 'code': 404,
  371. 'msg': str(e)
  372. })
  373. @router.post('/list_create')
  374. async def create_dict_data(
  375. db: Session = Depends(get_db),
  376. body = Depends(remove_xss_json),
  377. user_id = Depends(valid_access_token)
  378. ):
  379. try:
  380. # 创建一个新的 SysDictData 实例
  381. if isinstance(body,list) == False:
  382. return JSONResponse(status_code=500,content={'msg':"请求体非列表","code":500})
  383. for data in body:
  384. user_data = data['user_data']
  385. if len(user_data)==0:
  386. return JSONResponse(status_code=404, content={
  387. 'errcode': 404,
  388. 'errmsg': '值班人员不能为空'
  389. })
  390. new_duty_data = DutySchedule(
  391. start_time=data['start_time'],
  392. end_time=data['end_time'],
  393. duty_date=data['duty_date'],
  394. shift_type=data['shift_type'],
  395. duty_unit=data['duty_unit'],
  396. duty_type=data['duty_type'],
  397. create_by=user_id
  398. )
  399. # 添加到会话并提交
  400. db.add(new_duty_data)
  401. db.commit()
  402. db.refresh(new_duty_data)
  403. user_list = []
  404. for user_info in user_data:
  405. user_list.append( DutyPersonnelArrangement(
  406. duty_id=new_duty_data.id,
  407. position_id=user_info['position_id'],
  408. personnel_id=user_info['personnel_id'],
  409. create_by=user_id
  410. ))
  411. db.add_all(user_list)
  412. db.commit()
  413. # 构建返回结果
  414. result = {
  415. "code": 200,
  416. "msg": "操作成功",
  417. "data": None
  418. }
  419. return result
  420. except Exception as e:
  421. # 处理异常
  422. traceback.print_exc()
  423. return JSONResponse(status_code=404, content={
  424. 'code': 404,
  425. 'msg': str(e)
  426. })
  427. @router.put("/update")
  428. async def updata_dict_type(
  429. db: Session = Depends(get_db),
  430. body = Depends(remove_xss_json),
  431. user_id = Depends(valid_access_token)
  432. ):
  433. try:
  434. # 从请求数据创建一个新的 SysDictType 实例
  435. query = db.query(DutySchedule)
  436. query = query.filter(DutySchedule.id == body['id'])
  437. query = query.filter(DutySchedule.del_flag != '2')
  438. # query = db.query(SysDictData).filter(SysDictData.dict_code == form_data.dictCode)
  439. # query = db.query(SysDictData).filter(SysDictData.del_flag != '2')
  440. duty_data = query.first()
  441. old_user_list = duty_id_get_user_id(db,duty_data.id)
  442. for info in old_user_list:
  443. info.del_flag = '2'
  444. db.commit()
  445. user_data = body['user_data']
  446. if len(user_data)==0:
  447. return JSONResponse(status_code=404, content={
  448. 'errcode': 404,
  449. 'errmsg': '值班人员不能为空'
  450. })
  451. user_list = []
  452. for user_info in user_data:
  453. user_list.append(DutyPersonnelArrangement(
  454. duty_id=duty_data.id,
  455. position_id=user_info['position_id'],
  456. personnel_id=user_info['personnel_id'],
  457. create_by=user_id
  458. ))
  459. db.add_all(user_list)
  460. if not dutyn_data:
  461. return JSONResponse(status_code=404, content={
  462. 'errcode': 404,
  463. 'errmsg': '值班不存在'
  464. })
  465. duty_data.start_time=body['start_time']
  466. duty_data.end_time = body['end_time']
  467. duty_data.duty_date = body['duty_date']
  468. duty_data.shift_type=body['shift_type']
  469. duty_data.duty_unit = body['duty_unit']
  470. duty_data.duty_type = body['duty_type']
  471. duty_data.update_by = user_id
  472. # 添加到数据库会话并提交
  473. db.commit()
  474. # db.refresh(new_dict_type) # 可选,如果需要刷新实例状态
  475. # 构建并返回响应
  476. return {
  477. "code": 200,
  478. "msg": "操作成功",
  479. "data": None # 根据你的响应示例,data 为 null
  480. }
  481. except Exception as e:
  482. # 处理异常
  483. traceback.print_exc()
  484. return JSONResponse(status_code=404, content={
  485. 'code': 404,
  486. 'msg': str(e)
  487. })
  488. @router.delete("/delete/{id}") # 使用 ID 来标识要删除的接口
  489. async def delete_dict_data(
  490. id: str,
  491. db: Session = Depends(get_db),
  492. body = Depends(remove_xss_json),
  493. user_id = Depends(valid_access_token)
  494. ):
  495. try:
  496. # 从数据库中获取要删除的 OneShareApiEntity 实例
  497. query = db.query(DutySchedule)
  498. query = query.filter(DutySchedule.id == id)
  499. query = query.filter(DutySchedule.del_flag != '2')
  500. position_data = query.first()
  501. # dict_data = db.query(SysDictData).filter(SysDictData.dict_code == dictCode and SysDictData.del_flag != '2').first()
  502. if not position_data:
  503. return JSONResponse(status_code=404, content={
  504. 'code': 404,
  505. 'msg': '值班不存在'
  506. })
  507. position_data.del_flag = '2'
  508. # 删除实例
  509. # db.delete(api)
  510. db.commit()
  511. # 构建并返回响应
  512. return {
  513. "code": 200,
  514. "msg": "操作成功",
  515. "data": None
  516. }
  517. except Exception as e:
  518. traceback.print_exc()
  519. return JSONResponse(status_code=404, content={
  520. 'code': 404,
  521. 'msg': str(e)
  522. })
  523. @router.delete("/delete_list/{id_list}") # 使用 ID 来标识要删除的接口
  524. async def delete_dict_data(
  525. id_list: str,
  526. db: Session = Depends(get_db),
  527. body = Depends(remove_xss_json),
  528. user_id = Depends(valid_access_token)
  529. ):
  530. try:
  531. # 从数据库中获取要删除的 OneShareApiEntity 实例
  532. id_list = [int(i) for i in id_list.split(',')]
  533. query = db.query(DutySchedule)
  534. query = query.filter(DutySchedule.id.in_(id_list))
  535. query = query.filter(DutySchedule.del_flag != '2')
  536. position_data = query.all()
  537. # dict_data = db.query(SysDictData).filter(SysDictData.dict_code == dictCode and SysDictData.del_flag != '2').first()
  538. if not position_data:
  539. return JSONResponse(status_code=404, content={
  540. 'code': 404,
  541. 'msg': '值班不存在'
  542. })
  543. for info in position_data:
  544. info.del_flag = '2'
  545. # 删除实例
  546. # db.delete(api)
  547. db.commit()
  548. # 构建并返回响应
  549. return {
  550. "code": 200,
  551. "msg": "操作成功",
  552. "data": None
  553. }
  554. except Exception as e:
  555. traceback.print_exc()
  556. return JSONResponse(status_code=404, content={
  557. 'code': 404,
  558. 'msg': str(e)
  559. })