schedule.py 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206
  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, FileResponse,StreamingResponse
  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 common.db import db_dept
  12. from common.db import db_czrz
  13. from exceptions import AppException, HmacException
  14. from database import get_db
  15. from typing import List
  16. from models import *
  17. from utils import *
  18. from utils.ry_system_util import *
  19. from utils.video_util import *
  20. import traceback
  21. import os
  22. import json
  23. router = APIRouter()
  24. def name_get_user_id(db,keywords):
  25. query = db.query(EmergencyContactUser)
  26. query = query.filter(EmergencyContactUser.del_flag != '2')
  27. query = query.filter(EmergencyContactUser.name.like(f"%{keywords}%"))
  28. data = query.all()
  29. return [info.id for info in data]
  30. def user_id_get_duty_id(db,user_id_list):
  31. query = db.query(DutyPersonnelArrangement)
  32. query = query.filter(DutyPersonnelArrangement.del_flag != '2')
  33. query = query.filter(DutyPersonnelArrangement.personnel_id.in_(user_id_list))
  34. data = query.all()
  35. return [info.duty_id for info in data]
  36. def duty_id_get_user_id(db,duty_id):
  37. query = db.query(DutyPersonnelArrangement)
  38. query = query.filter(DutyPersonnelArrangement.del_flag != '2')
  39. query = query.filter(DutyPersonnelArrangement.duty_id==duty_id)
  40. data = query.all()
  41. return data
  42. def user_id_get_info(db,user_id):
  43. query = db.query(EmergencyContactUser)
  44. query = query.filter(EmergencyContactUser.del_flag != '2')
  45. query = query.filter(EmergencyContactUser.id==user_id)
  46. data = query.first()
  47. return data
  48. def get_duty_unit_id_list(db):
  49. query = db.query(SysDictData)
  50. query = query.filter(SysDictData.del_flag != '2')
  51. query = query.filter(SysDictData.dict_type=='duty_unit')
  52. data = query.all()
  53. return [int(i.dict_value) for i in data]
  54. def dept_id_get_duty_unit_id(db,dept_id,duty_unit_id_list):
  55. if dept_id == 0:
  56. return 0
  57. if dept_id in duty_unit_id_list:
  58. return dept_id
  59. query = db.query(EmergencyContactDepartment)
  60. query = query.filter(EmergencyContactDepartment.del_flag != '2')
  61. query = query.filter(EmergencyContactDepartment.id==dept_id)
  62. data = query.first()
  63. if data:
  64. dept_id_get_duty_unit_id(db, data.parent_department_id, duty_unit_id_list)
  65. else:
  66. return 0
  67. def mobile_phone_get_dept_id(db,mobile_phone,duty_unit_id_list):
  68. query = db.query(EmergencyContactUser)
  69. query = query.filter(EmergencyContactUser.del_flag != '2')
  70. query = query.filter(EmergencyContactUser.mobile_phone==mobile_phone)
  71. data = query.first()
  72. if data:
  73. dept_id = data.department_id
  74. dept_id = dept_id_get_duty_unit_id(db, dept_id, duty_unit_id_list)
  75. return dept_id
  76. else:
  77. return 0
  78. @router.get('/list')
  79. async def get_dict_data_by_type(
  80. keywords:str =Query(None),
  81. duty_type:str =Query(None),
  82. start_time:str =Query(None),
  83. end_time:str =Query(None),
  84. duty_unit:int =Query(None),
  85. page: int = Query(1, gt=0),
  86. pageSize: int = Query(10, gt=0),
  87. db: Session = Depends(get_db),
  88. body = Depends(remove_xss_json),
  89. user_id = Depends(valid_access_token)
  90. ):
  91. try:
  92. # 根据 dict_type 查询字典数据
  93. # dict_data = db.query(SysDictData).filter_by(dict_type=dictType).all()
  94. query = db.query(DutySchedule)
  95. query = query.filter(DutySchedule.del_flag != '2')
  96. # 添加查询条件
  97. if keywords:
  98. user_list= name_get_user_id(db,keywords)
  99. duty_list = user_id_get_duty_id(db,user_list)
  100. query = query.filter(DutySchedule.id.in_(duty_list))
  101. if duty_type:
  102. query = query.filter(DutySchedule.duty_type==duty_type)
  103. if start_time:
  104. start_time = datetime.strptime(start_time, "%Y-%m-%d").date()
  105. query = query.filter(DutySchedule.duty_date>=start_time)
  106. if end_time:
  107. end_time = datetime.strptime(end_time, "%Y-%m-%d").date()
  108. query = query.filter(DutySchedule.duty_date<=end_time)
  109. if duty_unit:
  110. query = query.filter(DutySchedule.duty_unit==duty_unit)
  111. # 计算总记录数
  112. total_count = query.count()
  113. # 计算分页
  114. offset = (page - 1) * pageSize
  115. query = query.order_by(DutySchedule.update_time.desc())
  116. duty_data = query.offset(offset).limit(pageSize).all()
  117. # 转换为字典
  118. data_list = []
  119. for d in duty_data:
  120. user_data = []
  121. user_list = duty_id_get_user_id(db,d.id)
  122. for user_info in user_list:
  123. contact_info = user_id_get_info(db, user_info.personnel_id)
  124. user_data.append({"position_id":user_info.position_id,
  125. "personnel_id":user_info.personnel_id,
  126. "name":contact_info.name,
  127. "position":contact_info.position,
  128. "mobile_phone":contact_info.mobile_phone,
  129. "office_phone":contact_info.office_phone,
  130. "department_id":contact_info.department_id,
  131. "yzy_userid":contact_info.userid})
  132. data_list.append({
  133. "id": d.id,
  134. "start_time": d.start_time.strftime('%Y-%m-%d %H:%M:%S') if d.start_time else '',
  135. "end_time":d.end_time.strftime('%Y-%m-%d %H:%M:%S') if d.end_time else '',
  136. "duty_date": d.duty_date,
  137. "shift_type":d.shift_type,
  138. "duty_unit": d.duty_unit,
  139. "duty_type": d.duty_type,
  140. "createTime": d.create_time.strftime('%Y-%m-%d %H:%M:%S') if d.create_time else '',
  141. "user_data":user_data
  142. })
  143. # 构建返回结果
  144. result = {
  145. "total": total_count,
  146. "page": page,
  147. "pageSize": pageSize,
  148. "totalPages": (total_count + pageSize - 1) // pageSize,
  149. "data": data_list,
  150. "code": 200,
  151. "msg": "查询成功"
  152. }
  153. return result
  154. except Exception as e:
  155. # 处理异常
  156. traceback.print_exc()
  157. return JSONResponse(status_code=404, content={
  158. 'code': 404,
  159. 'msg': str(e)
  160. })
  161. @router.get('/latest_by_group')
  162. async def get_dict_data_by_type(
  163. keywords:str =Query(None),
  164. start_time:str =Query(None),
  165. end_time:str =Query(None),
  166. duty_unit:int =Query(None),
  167. page: int = Query(1, gt=0),
  168. pageSize: int = Query(10, gt=0),
  169. db: Session = Depends(get_db),
  170. body = Depends(remove_xss_json),
  171. user_id = Depends(valid_access_token)
  172. ):
  173. try:
  174. # 根据 dict_type 查询字典数据
  175. # dict_data = db.query(SysDictData).filter_by(dict_type=dictType).all()
  176. query = db.query(DutySchedule)
  177. query = query.filter(DutySchedule.del_flag != '2')
  178. # 添加查询条件
  179. if keywords:
  180. user_list= name_get_user_id(db,keywords)
  181. duty_list = user_id_get_duty_id(db,user_list)
  182. query = query.filter(DutySchedule.id.in_(duty_list))
  183. if start_time:
  184. start_time = datetime.strptime(start_time, "%Y-%m-%d").date()
  185. query = query.filter(DutySchedule.duty_date>=start_time)
  186. if end_time:
  187. end_time = datetime.strptime(end_time, "%Y-%m-%d").date()
  188. query = query.filter(DutySchedule.duty_date<=end_time)
  189. if duty_unit:
  190. query = query.filter(DutySchedule.duty_unit==duty_unit)
  191. else:
  192. now_user_info=user_id_get_user_info(db,user_id)
  193. print(user_id,now_user_info.phonenumber,get_duty_unit_id_list(db))
  194. if now_user_info:
  195. 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)))
  196. else:
  197. return {
  198. "total": 0,
  199. "page": page,
  200. "pageSize": pageSize,
  201. "totalPages": (0 + pageSize - 1) // pageSize,
  202. "data": [],
  203. "code": 200,
  204. "msg": "查询成功"
  205. }
  206. subquery = db.query(
  207. DutySchedule.duty_date,
  208. DutySchedule.shift_type,
  209. func.max(DutySchedule.update_time).label("latest_create_time")
  210. ).filter(DutySchedule.del_flag != '2').group_by(
  211. DutySchedule.duty_date,
  212. DutySchedule.shift_type
  213. ).subquery()
  214. query = query.join(
  215. subquery,
  216. and_(
  217. DutySchedule.duty_date == subquery.c.duty_date,
  218. DutySchedule.shift_type == subquery.c.shift_type,
  219. DutySchedule.update_time == subquery.c.latest_create_time
  220. )
  221. )
  222. # 计算总记录数
  223. total_count = query.count()
  224. # 计算分页
  225. offset = (page - 1) * pageSize
  226. query = query.order_by(DutySchedule.update_time.desc())
  227. print(query)
  228. duty_data = query.offset(offset).limit(pageSize).all()
  229. # 转换为字典
  230. data_list = []
  231. for d in duty_data:
  232. user_data = []
  233. user_list = duty_id_get_user_id(db,d.id)
  234. for user_info in user_list:
  235. contact_info = user_id_get_info(db, user_info.personnel_id)
  236. user_data.append({"position_id":user_info.position_id,
  237. "personnel_id":user_info.personnel_id,
  238. "name":contact_info.name,
  239. "position":contact_info.position,
  240. "mobile_phone":contact_info.mobile_phone,
  241. "office_phone":contact_info.office_phone,
  242. "department_id":contact_info.department_id,
  243. "yzy_userid":contact_info.userid})
  244. data_list.append({
  245. "id": d.id,
  246. "start_time": d.start_time.strftime('%Y-%m-%d %H:%M:%S') if d.start_time else '',
  247. "end_time":d.end_time.strftime('%Y-%m-%d %H:%M:%S') if d.end_time else '',
  248. "duty_date": d.duty_date,
  249. "shift_type":d.shift_type,
  250. "duty_unit": d.duty_unit,
  251. "duty_type": d.duty_type,
  252. "createTime": d.create_time.strftime('%Y-%m-%d %H:%M:%S') if d.create_time else '',
  253. "user_data":user_data
  254. })
  255. # 构建返回结果
  256. result = {
  257. "total": total_count,
  258. "page": page,
  259. "pageSize": pageSize,
  260. "totalPages": (total_count + pageSize - 1) // pageSize,
  261. "data": data_list,
  262. "code": 200,
  263. "msg": "查询成功"
  264. }
  265. return result
  266. except Exception as e:
  267. # 处理异常
  268. traceback.print_exc()
  269. return JSONResponse(status_code=404, content={
  270. 'code': 404,
  271. 'msg': str(e)
  272. })
  273. @router.get('/info/{id}')
  274. async def get_dict_data_by_type(
  275. id: str ,
  276. db: Session = Depends(get_db),
  277. body = Depends(remove_xss_json),
  278. user_id = Depends(valid_access_token)
  279. ):
  280. try:
  281. # 根据 dict_type 查询字典数据
  282. # dict_data = dict_type_get_dict_data_info(db,'three_proofing')
  283. query = db.query(DutySchedule)
  284. # 添加查询条件
  285. # if dictType:
  286. query = query.filter(DutySchedule.id==id)
  287. query = query.filter(DutySchedule.del_flag != '2')
  288. d = query.first()
  289. user_data = []
  290. user_list = duty_id_get_user_id(db, d.id)
  291. for user_info in user_list:
  292. contact_info = user_id_get_info(db, user_info.personnel_id)
  293. user_data.append({"position_id": user_info.position_id,
  294. "personnel_id": user_info.personnel_id,
  295. "name": contact_info.name,
  296. "position": contact_info.position,
  297. "mobile_phone": contact_info.mobile_phone,
  298. "office_phone": contact_info.office_phone,
  299. "department_id": contact_info.department_id,
  300. "yzy_userid": contact_info.userid})
  301. data_list={
  302. "id": d.id,
  303. "start_time": d.start_time,
  304. "end_time": d.end_time,
  305. "duty_date": d.duty_date,
  306. "shift_type": d.shift_type,
  307. "duty_unit": d.duty_unit,
  308. "duty_type": d.duty_type,
  309. "createTime": d.create_time.strftime('%Y-%m-%d %H:%M:%S') if d.create_time else '',
  310. "user_data": user_data
  311. }
  312. # 构建返回结果
  313. result = {
  314. "data": data_list,
  315. "code": 200,
  316. "msg": "查询成功"
  317. }
  318. return result
  319. except Exception as e:
  320. # 处理异常
  321. traceback.print_exc()
  322. return JSONResponse(status_code=404, content={
  323. 'code': 404,
  324. 'msg': str(e)
  325. })
  326. @router.post('/create')
  327. async def create_dict_data(
  328. db: Session = Depends(get_db),
  329. body = Depends(remove_xss_json),
  330. user_id = Depends(valid_access_token)
  331. ):
  332. try:
  333. # 创建一个新的 SysDictData 实例
  334. user_data = body['user_data']
  335. if len(user_data)==0:
  336. return JSONResponse(status_code=404, content={
  337. 'errcode': 404,
  338. 'errmsg': '值班人员不能为空'
  339. })
  340. new_duty_data = DutySchedule(
  341. start_time=body['start_time'],
  342. end_time=body['end_time'],
  343. duty_date=body['duty_date'],
  344. shift_type=body['shift_type'],
  345. duty_unit=body['duty_unit'],
  346. duty_type=body['duty_type'],
  347. create_by=user_id
  348. )
  349. # 添加到会话并提交
  350. db.add(new_duty_data)
  351. db.commit()
  352. db.refresh(new_duty_data)
  353. user_list = []
  354. for user_info in user_data:
  355. user_list.append( DutyPersonnelArrangement(
  356. duty_id=new_duty_data.id,
  357. position_id=user_info['position_id'],
  358. personnel_id=user_info['personnel_id'],
  359. create_by=user_id
  360. ))
  361. db.add_all(user_list)
  362. db.commit()
  363. # 构建返回结果
  364. result = {
  365. "code": 200,
  366. "msg": "操作成功",
  367. "data": None
  368. }
  369. return result
  370. except Exception as e:
  371. # 处理异常
  372. traceback.print_exc()
  373. return JSONResponse(status_code=404, content={
  374. 'code': 404,
  375. 'msg': str(e)
  376. })
  377. @router.post('/list_create')
  378. async def create_dict_data(
  379. db: Session = Depends(get_db),
  380. body = Depends(remove_xss_json),
  381. user_id = Depends(valid_access_token)
  382. ):
  383. try:
  384. # 创建一个新的 SysDictData 实例
  385. if isinstance(body,list) == False:
  386. return JSONResponse(status_code=500,content={'msg':"请求体非列表","code":500})
  387. for data in body:
  388. user_data = data['user_data']
  389. if len(user_data)==0:
  390. return JSONResponse(status_code=404, content={
  391. 'errcode': 404,
  392. 'errmsg': '值班人员不能为空'
  393. })
  394. new_duty_data = DutySchedule(
  395. start_time=data['start_time'],
  396. end_time=data['end_time'],
  397. duty_date=data['duty_date'],
  398. shift_type=data['shift_type'],
  399. duty_unit=data['duty_unit'],
  400. duty_type=data['duty_type'],
  401. create_by=user_id
  402. )
  403. # 添加到会话并提交
  404. db.add(new_duty_data)
  405. db.commit()
  406. db.refresh(new_duty_data)
  407. user_list = []
  408. for user_info in user_data:
  409. user_list.append( DutyPersonnelArrangement(
  410. duty_id=new_duty_data.id,
  411. position_id=user_info['position_id'],
  412. personnel_id=user_info['personnel_id'],
  413. create_by=user_id
  414. ))
  415. db.add_all(user_list)
  416. db.commit()
  417. # 构建返回结果
  418. result = {
  419. "code": 200,
  420. "msg": "操作成功",
  421. "data": None
  422. }
  423. return result
  424. except Exception as e:
  425. # 处理异常
  426. traceback.print_exc()
  427. return JSONResponse(status_code=404, content={
  428. 'code': 404,
  429. 'msg': str(e)
  430. })
  431. @router.put("/update")
  432. async def updata_dict_type(
  433. db: Session = Depends(get_db),
  434. body = Depends(remove_xss_json),
  435. user_id = Depends(valid_access_token)
  436. ):
  437. try:
  438. # 从请求数据创建一个新的 SysDictType 实例
  439. query = db.query(DutySchedule)
  440. query = query.filter(DutySchedule.id == body['id'])
  441. query = query.filter(DutySchedule.del_flag != '2')
  442. # query = db.query(SysDictData).filter(SysDictData.dict_code == form_data.dictCode)
  443. # query = db.query(SysDictData).filter(SysDictData.del_flag != '2')
  444. duty_data = query.first()
  445. old_user_list = duty_id_get_user_id(db,duty_data.id)
  446. for info in old_user_list:
  447. info.del_flag = '2'
  448. db.commit()
  449. user_data = body['user_data']
  450. if len(user_data)==0:
  451. return JSONResponse(status_code=404, content={
  452. 'errcode': 404,
  453. 'errmsg': '值班人员不能为空'
  454. })
  455. user_list = []
  456. for user_info in user_data:
  457. user_list.append(DutyPersonnelArrangement(
  458. duty_id=duty_data.id,
  459. position_id=user_info['position_id'],
  460. personnel_id=user_info['personnel_id'],
  461. create_by=user_id
  462. ))
  463. db.add_all(user_list)
  464. if not duty_data:
  465. return JSONResponse(status_code=404, content={
  466. 'errcode': 404,
  467. 'errmsg': '值班不存在'
  468. })
  469. duty_data.start_time=body['start_time']
  470. duty_data.end_time = body['end_time']
  471. duty_data.duty_date = body['duty_date']
  472. duty_data.shift_type=body['shift_type']
  473. duty_data.duty_unit = body['duty_unit']
  474. duty_data.duty_type = body['duty_type']
  475. duty_data.update_by = user_id
  476. # 添加到数据库会话并提交
  477. db.commit()
  478. # db.refresh(new_dict_type) # 可选,如果需要刷新实例状态
  479. # 构建并返回响应
  480. return {
  481. "code": 200,
  482. "msg": "操作成功",
  483. "data": None # 根据你的响应示例,data 为 null
  484. }
  485. except Exception as e:
  486. # 处理异常
  487. traceback.print_exc()
  488. return JSONResponse(status_code=404, content={
  489. 'code': 404,
  490. 'msg': str(e)
  491. })
  492. @router.delete("/delete/{id}") # 使用 ID 来标识要删除的接口
  493. async def delete_dict_data(
  494. id: str,
  495. db: Session = Depends(get_db),
  496. body = Depends(remove_xss_json),
  497. user_id = Depends(valid_access_token)
  498. ):
  499. try:
  500. # 从数据库中获取要删除的 OneShareApiEntity 实例
  501. query = db.query(DutySchedule)
  502. query = query.filter(DutySchedule.id == id)
  503. query = query.filter(DutySchedule.del_flag != '2')
  504. position_data = query.first()
  505. # dict_data = db.query(SysDictData).filter(SysDictData.dict_code == dictCode and SysDictData.del_flag != '2').first()
  506. if not position_data:
  507. return JSONResponse(status_code=404, content={
  508. 'code': 404,
  509. 'msg': '值班不存在'
  510. })
  511. position_data.del_flag = '2'
  512. # 删除实例
  513. # db.delete(api)
  514. db.commit()
  515. # 构建并返回响应
  516. return {
  517. "code": 200,
  518. "msg": "操作成功",
  519. "data": None
  520. }
  521. except Exception as e:
  522. traceback.print_exc()
  523. return JSONResponse(status_code=404, content={
  524. 'code': 404,
  525. 'msg': str(e)
  526. })
  527. @router.delete("/delete_list/{id_list}") # 使用 ID 来标识要删除的接口
  528. async def delete_dict_data(
  529. id_list: str,
  530. db: Session = Depends(get_db),
  531. body = Depends(remove_xss_json),
  532. user_id = Depends(valid_access_token)
  533. ):
  534. try:
  535. # 从数据库中获取要删除的 OneShareApiEntity 实例
  536. id_list = [int(i) for i in id_list.split(',')]
  537. query = db.query(DutySchedule)
  538. query = query.filter(DutySchedule.id.in_(id_list))
  539. query = query.filter(DutySchedule.del_flag != '2')
  540. position_data = query.all()
  541. # dict_data = db.query(SysDictData).filter(SysDictData.dict_code == dictCode and SysDictData.del_flag != '2').first()
  542. if not position_data:
  543. return JSONResponse(status_code=404, content={
  544. 'code': 404,
  545. 'msg': '值班不存在'
  546. })
  547. for info in position_data:
  548. info.del_flag = '2'
  549. # 删除实例
  550. # db.delete(api)
  551. db.commit()
  552. # 构建并返回响应
  553. return {
  554. "code": 200,
  555. "msg": "操作成功",
  556. "data": None
  557. }
  558. except Exception as e:
  559. traceback.print_exc()
  560. return JSONResponse(status_code=404, content={
  561. 'code': 404,
  562. 'msg': str(e)
  563. })
  564. # 值班排班 导入
  565. @router.post('/zbpb/createImport')
  566. async def create_contact(
  567. request: Request,
  568. background_tasks: BackgroundTasks,
  569. db: Session = Depends(get_db),
  570. body=Depends(remove_xss_json),
  571. auth_user: AuthUser = Depends(find_auth_user),
  572. user_id=Depends(valid_access_token)
  573. ):
  574. try:
  575. # 提取请求数据
  576. filename = body['filename']
  577. file_name_desc = body['file_name_desc']
  578. duty_unit = body['duty_unit']
  579. if len(filename) == 0:
  580. raise Exception()
  581. file_path = f'/data/upload/mergefile/uploads/{filename}'
  582. # 检查文件是否存在
  583. if not os.path.isfile(file_path):
  584. return JSONResponse(status_code=404, content={
  585. 'errcode': 404,
  586. 'errmsg': f'{filename}不存在'
  587. })
  588. # new_file = ThreeProofingResponsiblePersonImportFileStatus(
  589. # file_uuid=filename,
  590. # file_name=file_name_desc,
  591. # status='1',
  592. # remark='',
  593. # user_id=user_id
  594. # )
  595. # db.add(new_file)
  596. # db.commit()
  597. # background_tasks.add_task(import_data, db, file_path, user_id, new_file)
  598. #
  599. # db_czrz.log(db, auth_user, "系统管理", f"后台管理导入三防责任人管理人员信息成功", request.client.host)
  600. # 返回创建成功的响应
  601. return {
  602. "code": 200,
  603. "msg": "成功",
  604. "data": None
  605. }
  606. except AppException as e:
  607. return {
  608. "code": 500,
  609. "msg": e.msg
  610. }
  611. except Exception as e:
  612. traceback.print_exc()
  613. # 处理异常
  614. db.rollback()
  615. raise HTTPException(status_code=500, detail=str(e))
  616. # 值班排班 导出
  617. @router.get("/zbpb/export")
  618. async def download_file(keywords:str =Query(None),
  619. duty_type:str =Query(None),
  620. start_time:str =Query(None),
  621. end_time:str =Query(None),
  622. duty_unit:int =Query(None),
  623. db: Session = Depends(get_db),
  624. body = Depends(remove_xss_json),
  625. user_id = Depends(valid_access_token)):
  626. """
  627. 根据提供的文件名下载文件。
  628. :param filename: 要下载的文件的名称。
  629. """
  630. try:
  631. query = db.query(DutySchedule)
  632. query = query.filter(DutySchedule.del_flag != '2')
  633. # 添加查询条件
  634. if keywords:
  635. user_list = name_get_user_id(db, keywords)
  636. duty_list = user_id_get_duty_id(db, user_list)
  637. query = query.filter(DutySchedule.id.in_(duty_list))
  638. if duty_type:
  639. query = query.filter(DutySchedule.duty_type == duty_type)
  640. if start_time:
  641. start_time = datetime.strptime(start_time, "%Y-%m-%d").date()
  642. query = query.filter(DutySchedule.duty_date >= start_time)
  643. if end_time:
  644. end_time = datetime.strptime(end_time, "%Y-%m-%d").date()
  645. query = query.filter(DutySchedule.duty_date <= end_time)
  646. if duty_unit:
  647. query = query.filter(DutySchedule.duty_unit == duty_unit)
  648. query = query.order_by(DutySchedule.update_time.desc())
  649. duty_data = query.all()
  650. # 转换为字典
  651. data_list = []
  652. for d in duty_data:
  653. user_data = []
  654. user_list = duty_id_get_user_id(db, d.id)
  655. for user_info in user_list:
  656. contact_info = user_id_get_info(db, user_info.personnel_id)
  657. user_data.append({"position_id": user_info.position_id,
  658. "personnel_id": user_info.personnel_id,
  659. "name": contact_info.name,
  660. "position": contact_info.position,
  661. "mobile_phone": contact_info.mobile_phone,
  662. "office_phone": contact_info.office_phone,
  663. "department_id": contact_info.department_id,
  664. "yzy_userid": contact_info.userid})
  665. data_list.append({
  666. "id": d.id,
  667. "start_time": d.start_time.strftime('%Y-%m-%d %H:%M:%S') if d.start_time else '',
  668. "end_time": d.end_time.strftime('%Y-%m-%d %H:%M:%S') if d.end_time else '',
  669. "duty_date": d.duty_date,
  670. "shift_type": d.shift_type,
  671. "duty_unit": d.duty_unit,
  672. "duty_type": d.duty_type,
  673. "createTime": d.create_time.strftime('%Y-%m-%d %H:%M:%S') if d.create_time else '',
  674. "user_data": user_data
  675. })
  676. # 构造文件的完整路径
  677. import pandas as pd
  678. from io import BytesIO
  679. # 将查询结果转换为 DataFrame
  680. df = pd.DataFrame(data_list)
  681. # 将 DataFrame 导出为 Excel 文件
  682. output = BytesIO()
  683. with pd.ExcelWriter(output, engine='openpyxl') as writer:
  684. df.to_excel(writer, index=False)
  685. # 设置响应头
  686. output.seek(0)
  687. from urllib.parse import quote
  688. encoded_filename = f'值班排班{datetime.now().strftime("%Y%m%d%H%mi%s")}.xlsx'
  689. encoded_filename = quote(encoded_filename, encoding='utf-8')
  690. headers = {
  691. 'Content-Disposition': f'attachment; filename*=UTF-8\'\'{encoded_filename}',
  692. 'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  693. }
  694. # 返回文件流
  695. return StreamingResponse(output, headers=headers)
  696. except HTTPException as e:
  697. raise e
  698. except Exception as e:
  699. # 处理其他异常情况
  700. raise HTTPException(status_code=500, detail=str(e))
  701. # 自定义排班 导出
  702. @router.post('/zdypb/createImport')
  703. async def create_contact(
  704. request: Request,
  705. background_tasks: BackgroundTasks,
  706. db: Session = Depends(get_db),
  707. body=Depends(remove_xss_json),
  708. auth_user: AuthUser = Depends(find_auth_user),
  709. user_id=Depends(valid_access_token)
  710. ):
  711. try:
  712. # 提取请求数据
  713. filename = body['filename']
  714. file_name_desc = body['file_name_desc']
  715. duty_unit = body['duty_unit']
  716. if len(filename) == 0:
  717. raise Exception()
  718. file_path = f'/data/upload/mergefile/uploads/{filename}'
  719. # 检查文件是否存在
  720. if not os.path.isfile(file_path):
  721. return JSONResponse(status_code=404, content={
  722. 'errcode': 404,
  723. 'errmsg': f'{filename}不存在'
  724. })
  725. # new_file = ThreeProofingResponsiblePersonImportFileStatus(
  726. # file_uuid=filename,
  727. # file_name=file_name_desc,
  728. # status='1',
  729. # remark='',
  730. # user_id=user_id
  731. # )
  732. # db.add(new_file)
  733. # db.commit()
  734. # background_tasks.add_task(import_data, db, file_path, user_id, new_file)
  735. #
  736. # db_czrz.log(db, auth_user, "系统管理", f"后台管理导入三防责任人管理人员信息成功", request.client.host)
  737. # 返回创建成功的响应
  738. return {
  739. "code": 200,
  740. "msg": "成功",
  741. "data": None
  742. }
  743. except AppException as e:
  744. return {
  745. "code": 500,
  746. "msg": e.msg
  747. }
  748. except Exception as e:
  749. traceback.print_exc()
  750. # 处理异常
  751. db.rollback()
  752. raise HTTPException(status_code=500, detail=str(e))
  753. # 本单位值班 导出
  754. @router.get("/bdwzb/export")
  755. async def download_file(keywords:str =Query(None),
  756. start_time:str =Query(None),
  757. end_time:str =Query(None),
  758. duty_unit:int =Query(None),
  759. db: Session = Depends(get_db),
  760. body = Depends(remove_xss_json),
  761. user_id = Depends(valid_access_token)):
  762. """
  763. 根据提供的文件名下载文件。
  764. :param filename: 要下载的文件的名称。
  765. """
  766. try:
  767. query = db.query(DutySchedule)
  768. query = query.filter(DutySchedule.del_flag != '2')
  769. # 添加查询条件
  770. if keywords:
  771. user_list = name_get_user_id(db, keywords)
  772. duty_list = user_id_get_duty_id(db, user_list)
  773. query = query.filter(DutySchedule.id.in_(duty_list))
  774. if start_time:
  775. start_time = datetime.strptime(start_time, "%Y-%m-%d").date()
  776. query = query.filter(DutySchedule.duty_date >= start_time)
  777. if end_time:
  778. end_time = datetime.strptime(end_time, "%Y-%m-%d").date()
  779. query = query.filter(DutySchedule.duty_date <= end_time)
  780. if duty_unit:
  781. query = query.filter(DutySchedule.duty_unit == duty_unit)
  782. else:
  783. now_user_info = user_id_get_user_info(db, user_id)
  784. print(user_id, now_user_info.phonenumber, get_duty_unit_id_list(db))
  785. if now_user_info:
  786. query = query.filter(
  787. DutySchedule.duty_unit == mobile_phone_get_dept_id(db, mpfun.dec_data(now_user_info.phonenumber),
  788. get_duty_unit_id_list(db)))
  789. else:
  790. return {
  791. "data": [],
  792. "code": 200,
  793. "msg": "查询成功"
  794. }
  795. subquery = db.query(
  796. DutySchedule.duty_date,
  797. DutySchedule.shift_type,
  798. func.max(DutySchedule.update_time).label("latest_create_time")
  799. ).filter(DutySchedule.del_flag != '2').group_by(
  800. DutySchedule.duty_date,
  801. DutySchedule.shift_type
  802. ).subquery()
  803. query = query.join(
  804. subquery,
  805. and_(
  806. DutySchedule.duty_date == subquery.c.duty_date,
  807. DutySchedule.shift_type == subquery.c.shift_type,
  808. DutySchedule.update_time == subquery.c.latest_create_time
  809. )
  810. )
  811. query = query.order_by(DutySchedule.update_time.desc())
  812. duty_data = query.all()
  813. # 转换为字典
  814. data_list = []
  815. for d in duty_data:
  816. user_data = []
  817. user_list = duty_id_get_user_id(db, d.id)
  818. for user_info in user_list:
  819. contact_info = user_id_get_info(db, user_info.personnel_id)
  820. user_data.append({"position_id": user_info.position_id,
  821. "personnel_id": user_info.personnel_id,
  822. "name": contact_info.name,
  823. "position": contact_info.position,
  824. "mobile_phone": contact_info.mobile_phone,
  825. "office_phone": contact_info.office_phone,
  826. "department_id": contact_info.department_id,
  827. "yzy_userid": contact_info.userid})
  828. data_list.append({
  829. "id": d.id,
  830. "start_time": d.start_time.strftime('%Y-%m-%d %H:%M:%S') if d.start_time else '',
  831. "end_time": d.end_time.strftime('%Y-%m-%d %H:%M:%S') if d.end_time else '',
  832. "duty_date": d.duty_date,
  833. "shift_type": d.shift_type,
  834. "duty_unit": d.duty_unit,
  835. "duty_type": d.duty_type,
  836. "createTime": d.create_time.strftime('%Y-%m-%d %H:%M:%S') if d.create_time else '',
  837. "user_data": user_data
  838. })
  839. # 构造文件的完整路径
  840. import pandas as pd
  841. from io import BytesIO
  842. # 将查询结果转换为 DataFrame
  843. df = pd.DataFrame(data_list)
  844. # 将 DataFrame 导出为 Excel 文件
  845. output = BytesIO()
  846. with pd.ExcelWriter(output, engine='openpyxl') as writer:
  847. df.to_excel(writer, index=False)
  848. # 设置响应头
  849. output.seek(0)
  850. from urllib.parse import quote
  851. encoded_filename = f'值班排班{datetime.now().strftime("%Y%m%d%H%mi%s")}.xlsx'
  852. encoded_filename = quote(encoded_filename, encoding='utf-8')
  853. headers = {
  854. 'Content-Disposition': f'attachment; filename*=UTF-8\'\'{encoded_filename}',
  855. 'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  856. }
  857. # 返回文件流
  858. return StreamingResponse(output, headers=headers)
  859. except HTTPException as e:
  860. raise e
  861. except Exception as e:
  862. # 处理其他异常情况
  863. raise HTTPException(status_code=500, detail=str(e))
  864. # 各级单位值班表 导出
  865. @router.get("/gjdwzbb/export")
  866. async def download_file(keywords:str =Query(None),
  867. start_time:str =Query(None),
  868. end_time:str =Query(None),
  869. duty_unit:int =Query(None),
  870. db: Session = Depends(get_db),
  871. body = Depends(remove_xss_json),
  872. user_id = Depends(valid_access_token)):
  873. """
  874. 根据提供的文件名下载文件。
  875. :param filename: 要下载的文件的名称。
  876. """
  877. try:
  878. query = db.query(DutySchedule)
  879. query = query.filter(DutySchedule.del_flag != '2')
  880. # 添加查询条件
  881. if keywords:
  882. user_list = name_get_user_id(db, keywords)
  883. duty_list = user_id_get_duty_id(db, user_list)
  884. query = query.filter(DutySchedule.id.in_(duty_list))
  885. if start_time:
  886. start_time = datetime.strptime(start_time, "%Y-%m-%d").date()
  887. query = query.filter(DutySchedule.duty_date >= start_time)
  888. if end_time:
  889. end_time = datetime.strptime(end_time, "%Y-%m-%d").date()
  890. query = query.filter(DutySchedule.duty_date <= end_time)
  891. if duty_unit:
  892. query = query.filter(DutySchedule.duty_unit == duty_unit)
  893. else:
  894. now_user_info = user_id_get_user_info(db, user_id)
  895. print(user_id, now_user_info.phonenumber, get_duty_unit_id_list(db))
  896. if now_user_info:
  897. query = query.filter(
  898. DutySchedule.duty_unit == mobile_phone_get_dept_id(db, mpfun.dec_data(now_user_info.phonenumber),
  899. get_duty_unit_id_list(db)))
  900. else:
  901. return {
  902. "data": [],
  903. "code": 200,
  904. "msg": "查询成功"
  905. }
  906. subquery = db.query(
  907. DutySchedule.duty_date,
  908. DutySchedule.shift_type,
  909. func.max(DutySchedule.update_time).label("latest_create_time")
  910. ).filter(DutySchedule.del_flag != '2').group_by(
  911. DutySchedule.duty_date,
  912. DutySchedule.shift_type
  913. ).subquery()
  914. query = query.join(
  915. subquery,
  916. and_(
  917. DutySchedule.duty_date == subquery.c.duty_date,
  918. DutySchedule.shift_type == subquery.c.shift_type,
  919. DutySchedule.update_time == subquery.c.latest_create_time
  920. )
  921. )
  922. query = query.order_by(DutySchedule.update_time.desc())
  923. duty_data = query.all()
  924. # 转换为字典
  925. data_list = []
  926. for d in duty_data:
  927. user_data = []
  928. user_list = duty_id_get_user_id(db, d.id)
  929. for user_info in user_list:
  930. contact_info = user_id_get_info(db, user_info.personnel_id)
  931. user_data.append({"position_id": user_info.position_id,
  932. "personnel_id": user_info.personnel_id,
  933. "name": contact_info.name,
  934. "position": contact_info.position,
  935. "mobile_phone": contact_info.mobile_phone,
  936. "office_phone": contact_info.office_phone,
  937. "department_id": contact_info.department_id,
  938. "yzy_userid": contact_info.userid})
  939. data_list.append({
  940. "id": d.id,
  941. "start_time": d.start_time.strftime('%Y-%m-%d %H:%M:%S') if d.start_time else '',
  942. "end_time": d.end_time.strftime('%Y-%m-%d %H:%M:%S') if d.end_time else '',
  943. "duty_date": d.duty_date,
  944. "shift_type": d.shift_type,
  945. "duty_unit": d.duty_unit,
  946. "duty_type": d.duty_type,
  947. "createTime": d.create_time.strftime('%Y-%m-%d %H:%M:%S') if d.create_time else '',
  948. "user_data": user_data
  949. })
  950. # 构造文件的完整路径
  951. import pandas as pd
  952. from io import BytesIO
  953. # 将查询结果转换为 DataFrame
  954. df = pd.DataFrame(data_list)
  955. # 将 DataFrame 导出为 Excel 文件
  956. output = BytesIO()
  957. with pd.ExcelWriter(output, engine='openpyxl') as writer:
  958. df.to_excel(writer, index=False)
  959. # 设置响应头
  960. output.seek(0)
  961. from urllib.parse import quote
  962. encoded_filename = f'值班排班{datetime.now().strftime("%Y%m%d%H%mi%s")}.xlsx'
  963. encoded_filename = quote(encoded_filename, encoding='utf-8')
  964. headers = {
  965. 'Content-Disposition': f'attachment; filename*=UTF-8\'\'{encoded_filename}',
  966. 'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  967. }
  968. # 返回文件流
  969. return StreamingResponse(output, headers=headers)
  970. except HTTPException as e:
  971. raise e
  972. except Exception as e:
  973. # 处理其他异常情况
  974. raise HTTPException(status_code=500, detail=str(e))
  975. # 各级单位值班人 导出
  976. @router.get("/gjdwzbr/export")
  977. async def download_file(keywords:str =Query(None),
  978. start_time:str =Query(None),
  979. end_time:str =Query(None),
  980. duty_unit:int =Query(None),
  981. db: Session = Depends(get_db),
  982. body = Depends(remove_xss_json),
  983. user_id = Depends(valid_access_token)):
  984. """
  985. 根据提供的文件名下载文件。
  986. :param filename: 要下载的文件的名称。
  987. """
  988. try:
  989. query = db.query(DutySchedule)
  990. query = query.filter(DutySchedule.del_flag != '2')
  991. # 添加查询条件
  992. if keywords:
  993. user_list = name_get_user_id(db, keywords)
  994. duty_list = user_id_get_duty_id(db, user_list)
  995. query = query.filter(DutySchedule.id.in_(duty_list))
  996. if start_time:
  997. start_time = datetime.strptime(start_time, "%Y-%m-%d").date()
  998. query = query.filter(DutySchedule.duty_date >= start_time)
  999. if end_time:
  1000. end_time = datetime.strptime(end_time, "%Y-%m-%d").date()
  1001. query = query.filter(DutySchedule.duty_date <= end_time)
  1002. if duty_unit:
  1003. query = query.filter(DutySchedule.duty_unit == duty_unit)
  1004. else:
  1005. now_user_info = user_id_get_user_info(db, user_id)
  1006. print(user_id, now_user_info.phonenumber, get_duty_unit_id_list(db))
  1007. if now_user_info:
  1008. query = query.filter(
  1009. DutySchedule.duty_unit == mobile_phone_get_dept_id(db, mpfun.dec_data(now_user_info.phonenumber),
  1010. get_duty_unit_id_list(db)))
  1011. else:
  1012. return {
  1013. "data": [],
  1014. "code": 200,
  1015. "msg": "查询成功"
  1016. }
  1017. subquery = db.query(
  1018. DutySchedule.duty_date,
  1019. DutySchedule.shift_type,
  1020. func.max(DutySchedule.update_time).label("latest_create_time")
  1021. ).filter(DutySchedule.del_flag != '2').group_by(
  1022. DutySchedule.duty_date,
  1023. DutySchedule.shift_type
  1024. ).subquery()
  1025. query = query.join(
  1026. subquery,
  1027. and_(
  1028. DutySchedule.duty_date == subquery.c.duty_date,
  1029. DutySchedule.shift_type == subquery.c.shift_type,
  1030. DutySchedule.update_time == subquery.c.latest_create_time
  1031. )
  1032. )
  1033. query = query.order_by(DutySchedule.update_time.desc())
  1034. duty_data = query.all()
  1035. # 转换为字典
  1036. data_list = []
  1037. for d in duty_data:
  1038. user_data = []
  1039. user_list = duty_id_get_user_id(db, d.id)
  1040. for user_info in user_list:
  1041. contact_info = user_id_get_info(db, user_info.personnel_id)
  1042. user_data.append({"position_id": user_info.position_id,
  1043. "personnel_id": user_info.personnel_id,
  1044. "name": contact_info.name,
  1045. "position": contact_info.position,
  1046. "mobile_phone": contact_info.mobile_phone,
  1047. "office_phone": contact_info.office_phone,
  1048. "department_id": contact_info.department_id,
  1049. "yzy_userid": contact_info.userid})
  1050. data_list.append({
  1051. "id": d.id,
  1052. "start_time": d.start_time.strftime('%Y-%m-%d %H:%M:%S') if d.start_time else '',
  1053. "end_time": d.end_time.strftime('%Y-%m-%d %H:%M:%S') if d.end_time else '',
  1054. "duty_date": d.duty_date,
  1055. "shift_type": d.shift_type,
  1056. "duty_unit": d.duty_unit,
  1057. "duty_type": d.duty_type,
  1058. "createTime": d.create_time.strftime('%Y-%m-%d %H:%M:%S') if d.create_time else '',
  1059. "user_data": user_data
  1060. })
  1061. # 构造文件的完整路径
  1062. import pandas as pd
  1063. from io import BytesIO
  1064. # 将查询结果转换为 DataFrame
  1065. df = pd.DataFrame(data_list)
  1066. # 将 DataFrame 导出为 Excel 文件
  1067. output = BytesIO()
  1068. with pd.ExcelWriter(output, engine='openpyxl') as writer:
  1069. df.to_excel(writer, index=False)
  1070. # 设置响应头
  1071. output.seek(0)
  1072. from urllib.parse import quote
  1073. encoded_filename = f'值班排班{datetime.now().strftime("%Y%m%d%H%mi%s")}.xlsx'
  1074. encoded_filename = quote(encoded_filename, encoding='utf-8')
  1075. headers = {
  1076. 'Content-Disposition': f'attachment; filename*=UTF-8\'\'{encoded_filename}',
  1077. 'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  1078. }
  1079. # 返回文件流
  1080. return StreamingResponse(output, headers=headers)
  1081. except HTTPException as e:
  1082. raise e
  1083. except Exception as e:
  1084. # 处理其他异常情况
  1085. raise HTTPException(status_code=500, detail=str(e))