schedule.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561
  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.put("/update")
  374. async def updata_dict_type(
  375. db: Session = Depends(get_db),
  376. body = Depends(remove_xss_json),
  377. user_id = Depends(valid_access_token)
  378. ):
  379. try:
  380. # 从请求数据创建一个新的 SysDictType 实例
  381. query = db.query(DutySchedule)
  382. query = query.filter(DutySchedule.id == body['id'])
  383. query = query.filter(DutySchedule.del_flag != '2')
  384. # query = db.query(SysDictData).filter(SysDictData.dict_code == form_data.dictCode)
  385. # query = db.query(SysDictData).filter(SysDictData.del_flag != '2')
  386. duty_data = query.first()
  387. old_user_list = duty_id_get_user_id(db,duty_data.id)
  388. for info in old_user_list:
  389. info.del_flag = '2'
  390. db.commit()
  391. user_data = body['user_data']
  392. if len(user_data)==0:
  393. return JSONResponse(status_code=404, content={
  394. 'errcode': 404,
  395. 'errmsg': '值班人员不能为空'
  396. })
  397. user_list = []
  398. for user_info in user_data:
  399. user_list.append(DutyPersonnelArrangement(
  400. duty_id=duty_data.id,
  401. position_id=user_info['position_id'],
  402. personnel_id=user_info['personnel_id'],
  403. create_by=user_id
  404. ))
  405. db.add_all(user_list)
  406. if not dutyn_data:
  407. return JSONResponse(status_code=404, content={
  408. 'errcode': 404,
  409. 'errmsg': '值班不存在'
  410. })
  411. duty_data.start_time=body['start_time']
  412. duty_data.end_time = body['end_time']
  413. duty_data.duty_date = body['duty_date']
  414. duty_data.shift_type=body['shift_type']
  415. duty_data.duty_unit = body['duty_unit']
  416. duty_data.duty_type = body['duty_type']
  417. duty_data.update_by = user_id
  418. # 添加到数据库会话并提交
  419. db.commit()
  420. # db.refresh(new_dict_type) # 可选,如果需要刷新实例状态
  421. # 构建并返回响应
  422. return {
  423. "code": 200,
  424. "msg": "操作成功",
  425. "data": None # 根据你的响应示例,data 为 null
  426. }
  427. except Exception as e:
  428. # 处理异常
  429. traceback.print_exc()
  430. return JSONResponse(status_code=404, content={
  431. 'code': 404,
  432. 'msg': str(e)
  433. })
  434. @router.delete("/delete/{id}") # 使用 ID 来标识要删除的接口
  435. async def delete_dict_data(
  436. id: str,
  437. db: Session = Depends(get_db),
  438. body = Depends(remove_xss_json),
  439. user_id = Depends(valid_access_token)
  440. ):
  441. try:
  442. # 从数据库中获取要删除的 OneShareApiEntity 实例
  443. query = db.query(DutySchedule)
  444. query = query.filter(DutySchedule.id == id)
  445. query = query.filter(DutySchedule.del_flag != '2')
  446. position_data = query.first()
  447. # dict_data = db.query(SysDictData).filter(SysDictData.dict_code == dictCode and SysDictData.del_flag != '2').first()
  448. if not position_data:
  449. return JSONResponse(status_code=404, content={
  450. 'code': 404,
  451. 'msg': '值班不存在'
  452. })
  453. position_data.del_flag = '2'
  454. # 删除实例
  455. # db.delete(api)
  456. db.commit()
  457. # 构建并返回响应
  458. return {
  459. "code": 200,
  460. "msg": "操作成功",
  461. "data": None
  462. }
  463. except Exception as e:
  464. traceback.print_exc()
  465. return JSONResponse(status_code=404, content={
  466. 'code': 404,
  467. 'msg': str(e)
  468. })
  469. @router.delete("/delete_list/{id_list}") # 使用 ID 来标识要删除的接口
  470. async def delete_dict_data(
  471. id_list: str,
  472. db: Session = Depends(get_db),
  473. body = Depends(remove_xss_json),
  474. user_id = Depends(valid_access_token)
  475. ):
  476. try:
  477. # 从数据库中获取要删除的 OneShareApiEntity 实例
  478. id_list = [int(i) for i in id_list.split(',')]
  479. query = db.query(DutySchedule)
  480. query = query.filter(DutySchedule.id.in_(id_list))
  481. query = query.filter(DutySchedule.del_flag != '2')
  482. position_data = query.all()
  483. # dict_data = db.query(SysDictData).filter(SysDictData.dict_code == dictCode and SysDictData.del_flag != '2').first()
  484. if not position_data:
  485. return JSONResponse(status_code=404, content={
  486. 'code': 404,
  487. 'msg': '值班不存在'
  488. })
  489. for info in position_data:
  490. info.del_flag = '2'
  491. # 删除实例
  492. # db.delete(api)
  493. db.commit()
  494. # 构建并返回响应
  495. return {
  496. "code": 200,
  497. "msg": "操作成功",
  498. "data": None
  499. }
  500. except Exception as e:
  501. traceback.print_exc()
  502. return JSONResponse(status_code=404, content={
  503. 'code': 404,
  504. 'msg': str(e)
  505. })