back.py 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from fastapi import APIRouter, Request, Depends, HTTPException, Query
  4. from fastapi.responses import HTMLResponse, FileResponse
  5. from fastapi.responses import JSONResponse
  6. from database import get_db
  7. from sqlalchemy import text, exists, and_, or_, not_
  8. from sqlalchemy.orm import Session
  9. from models import *
  10. import json
  11. import os
  12. from sqlalchemy import create_engine, select
  13. from typing import Optional
  14. from utils.StripTagsHTMLParser import *
  15. from common.db import db_event_management, db_user, db_area, db_emergency_plan
  16. from common.security import valid_access_token
  17. import traceback
  18. from utils import *
  19. from datetime import datetime, timedelta
  20. from common import YzyApi
  21. from common.db import db_dict, db_msg_center
  22. from urllib.parse import quote
  23. import base64
  24. from config import settings
  25. from common.enc import mpfun
  26. router = APIRouter()
  27. EXAMINE_TYPE_DICT = {
  28. 0: "草稿",
  29. 10: "提交",
  30. 20: "领导审批",
  31. 30: "重新提交"
  32. }
  33. EXAMINE_SUB_TYPE_DICT = {
  34. 0: "草稿",
  35. 10: "提交",
  36. 20: "待审批",
  37. 21: "审批通过",
  38. 22: "审批不通过",
  39. 30: "重新提交"
  40. }
  41. # 信息发布创建
  42. @router.post('/create')
  43. async def create_emergency_plan(
  44. db: Session = Depends(get_db),
  45. body = Depends(remove_xss_json),
  46. user_id = Depends(valid_access_token)
  47. ):
  48. try:
  49. dept_id = 0
  50. dept_name = ''
  51. user_row = db.query(SysUser).filter(SysUser.user_id == user_id).first()
  52. user_name = user_row.user_name
  53. nick_name = user_row.nick_name
  54. dept_id = user_row.dept_id
  55. dept_row = db.query(SysDept).filter(SysDept.dept_id == dept_id).first()
  56. dept_name = dept_row.dept_name
  57. examine_user_row = db.query(SysUser).filter(SysUser.user_name == mpfun.enc_data(body['examine_user'])).first()
  58. if examine_user_row is None:
  59. return {
  60. "code": 500,
  61. "msg": "审批人员账号不存在"
  62. }
  63. examine_by = examine_user_row.user_id
  64. system_from = get_req_param_optional(body, 'system_from')
  65. new_publish = InfoPublishBase(
  66. title = body['title'],
  67. publish_group = body['publish_group'],
  68. template_id = body['template_id'],
  69. content = body['content'],
  70. recorded_by = user_id,
  71. del_flag = '0',
  72. dept_id = dept_id,
  73. dept_name = dept_name,
  74. add_time = datetime.now(),
  75. response_type = body['response_type'],
  76. publish_time = body['publish_time'],
  77. examine_by = examine_by,
  78. publish_status = 0,
  79. examine_status = 0,
  80. publish_channel = body['publish_channel'],
  81. user_count = body['user_count'],
  82. user_ok_count = 0,
  83. user_err_count = 0,
  84. user_sending_count = 0,
  85. info_type = body['info_type'],
  86. system_from = system_from
  87. )
  88. db.add(new_publish)
  89. db.commit()
  90. db.refresh(new_publish)
  91. new_publish_id = new_publish.id
  92. # 发送人员
  93. for u in body['users']:
  94. send_user_id = u['user_id']
  95. send_nick_name = u['nick_name']
  96. send_user_name = ''
  97. send_dept_name = ''
  98. send_yzy_account = ''
  99. user_row = db.query(SysUser).filter(SysUser.user_id == send_user_id).first()
  100. if user_row is not None:
  101. send_user_name = mpfun.dec_data(user_row.user_name)
  102. send_dept_row = db.query(SysDept).filter(SysDept.dept_id == user_row.dept_id).first()
  103. send_dept_name = send_dept_row.dept_name
  104. send_yzy_account = (user_row.yzy_account)
  105. if send_yzy_account is None or send_yzy_account == "":
  106. send_yzy_account = user_row.phonenumber
  107. new_resp = InfoPublishResponses(
  108. publish_id = new_publish_id,
  109. user_id = send_user_id,
  110. user_name = send_user_name,
  111. nick_name = send_nick_name,
  112. dept_name = send_dept_name,
  113. sent_status = 0,
  114. yzy_account = send_yzy_account,
  115. response_type = body['response_type'],
  116. publish_channel = body['publish_channel']
  117. )
  118. db.add(new_resp)
  119. db.commit()
  120. # 附件
  121. if 'attachs' in body:
  122. infopublish_files = [
  123. InfoPublishFile(
  124. file_name=fileName["name"],
  125. storage_file_name=fileName["url"],
  126. file_path=f'/data/upload/mergefile/uploads/{fileName["url"]}',
  127. file_size=os.path.getsize(f'/data/upload/mergefile/uploads/{fileName["url"]}'),
  128. foreign_key=str(new_publish_id),
  129. from_scenario="infopublish_attach_file",
  130. update_time=datetime.now(),
  131. create_time=datetime.now(),
  132. create_by=user_id,
  133. create_dept=dept_id,
  134. del_flag='0',
  135. status=0,
  136. )
  137. for fileName in body['attachs']
  138. ]
  139. db.add_all(infopublish_files)
  140. db.commit()
  141. # 审批附件
  142. if 'examine_attachs' in body:
  143. infopublish_files = [
  144. InfoPublishFile(
  145. file_name=fileName["name"],
  146. storage_file_name=fileName["url"],
  147. file_path=f'/data/upload/mergefile/uploads/{fileName["url"]}',
  148. file_size=os.path.getsize(f'/data/upload/mergefile/uploads/{fileName["url"]}'),
  149. foreign_key=str(new_publish_id),
  150. from_scenario="infopublish_examine_attach_file",
  151. update_time=datetime.now(),
  152. create_time=datetime.now(),
  153. create_by=user_id,
  154. create_dept=dept_id,
  155. del_flag='0',
  156. status=0,
  157. )
  158. for fileName in body['examine_attachs']
  159. ]
  160. db.add_all(infopublish_files)
  161. db.commit()
  162. # 审批记录
  163. infopublish_examine = InfoPublishExamine(
  164. publish_id = new_publish_id,
  165. examine_type = 10, # 提交
  166. examine_sub_type = 10, # 提交
  167. examine_time = datetime.now(),
  168. content = '',
  169. user_id = user_id,
  170. user_name = mpfun.dec_data(user_name),
  171. nick_name = nick_name,
  172. del_flag = '0'
  173. )
  174. db.add(infopublish_examine)
  175. db.commit()
  176. # 待审批状态
  177. infopublish_examine = InfoPublishExamine(
  178. publish_id = new_publish_id,
  179. examine_type = 20, # 审批
  180. examine_sub_type = 20, # 待审批
  181. examine_time = datetime.now() + timedelta(seconds=1),
  182. content = '',
  183. user_id = examine_by,
  184. user_name = mpfun.dec_data(examine_user_row.user_name),
  185. nick_name = examine_user_row.nick_name,
  186. del_flag = '0'
  187. )
  188. db.add(infopublish_examine)
  189. db.commit()
  190. # 改审核中、待审批状态
  191. db.query(InfoPublishBase).filter(InfoPublishBase.id == new_publish_id).update({"publish_status": 2, "examine_status": 1})
  192. db.commit()
  193. return {
  194. "code": 200,
  195. "msg": "信息创建成功",
  196. "data": new_publish_id
  197. }
  198. except Exception as e:
  199. traceback.print_exc()
  200. # 处理异常
  201. raise HTTPException(status_code=500, detail=str(e))
  202. # 信息发布分页查询
  203. @router.get('/list')
  204. async def get_publish_list(
  205. publish_group: str = Query('', description='发布单位'),
  206. publish_status: str = Query('', description='发布状态的字典键值'),
  207. examine_status: str = Query('', description='审批状态的字典键值'),
  208. dispose_status: str = Query('', description='处理状态的字典键值'),
  209. system_from: str = Query('', description='信息来源'),
  210. content: str = Query('', description='信息内容'),
  211. sort_by: str = Query('', description='排序字段'),
  212. sort_order: str = Query("asc", description='排序方式'),
  213. page: int = Query(1, gt=0, description='页码'),
  214. page_size: int = Query(10, gt=0, description='pageSize'),
  215. db: Session = Depends(get_db),
  216. user_id = Depends(valid_access_token)
  217. ):
  218. try:
  219. # 应用查询条件
  220. where = and_(InfoPublishBase.del_flag == '0')
  221. if content != '':
  222. where = and_(where, InfoPublishBase.content.like('%{}%'.format(content)))
  223. if publish_status not in ['', '0'] :
  224. where = and_(where, InfoPublishBase.publish_status == publish_status)
  225. if examine_status not in ['', '0'] :
  226. where = and_(where, InfoPublishBase.examine_status == examine_status)
  227. if publish_group != '':
  228. where = and_(where, InfoPublishBase.publish_group.like('%{}%'.format(publish_group)))
  229. if system_from != '':
  230. where = and_(where, InfoPublishBase.system_from == system_from)
  231. if dispose_status == '1' : # 1 待处理
  232. # 审核类型 20 待审批
  233. subquery = db.query(InfoPublishExamine.publish_id).filter(InfoPublishExamine.del_flag == "0").filter(InfoPublishExamine.user_id == user_id).filter(InfoPublishExamine.examine_sub_type == 20).subquery()
  234. where = and_(where, InfoPublishBase.id == subquery.c.publish_id)
  235. if dispose_status == '2' : # 2 已处理
  236. # 审核类型 21 审批通过 22 审批不通过
  237. subquery = db.query(InfoPublishExamine.publish_id).filter(InfoPublishExamine.del_flag == "0").filter(InfoPublishExamine.user_id == user_id).filter(InfoPublishExamine.examine_sub_type.in_([21,22])).subquery()
  238. where = and_(where, InfoPublishBase.id == subquery.c.publish_id)
  239. # 计算总条目数
  240. q = db.query(func.count(InfoPublishBase.id))
  241. q = q.filter(where)
  242. total = q.scalar()
  243. # 执行分页查询
  244. q = db.query(InfoPublishBase)
  245. q = q.filter(where)
  246. rows = q.order_by(InfoPublishBase.id.desc()).offset((page - 1) * page_size).limit(page_size).all()
  247. data = []
  248. for row in rows:
  249. # 发布申请人
  250. recorded_by = row.recorded_by
  251. user_row = db.query(SysUser).filter(SysUser.user_id == recorded_by).first()
  252. nick_name = ""
  253. dept_name = ""
  254. if user_row is not None:
  255. nick_name = user_row.nick_name
  256. dept_id = user_row.dept_id
  257. dept_row = db.query(SysDept).filter(SysDept.dept_id == dept_id).first()
  258. if dept_row is not None:
  259. dept_name = dept_row.dept_name
  260. # 待处理人
  261. examine_user = "无"
  262. examine_by = row.examine_by
  263. user_row = db.query(SysUser).filter(SysUser.user_id == examine_by).first()
  264. if user_row is not None:
  265. examine_user = user_row.nick_name
  266. # 是否我的审批事项(待审批)
  267. is_my_examine = 0
  268. examine_row = db.query(InfoPublishExamine).filter(InfoPublishExamine.del_flag == "0").filter(InfoPublishExamine.user_id == user_id).filter(InfoPublishExamine.examine_sub_type == 20).order_by(InfoPublishExamine.id.desc()).limit(1).first()
  269. if examine_row is not None:
  270. is_my_examine = 1
  271. data.append({
  272. "id": row.id,
  273. "title": row.title,
  274. "info_type": row.info_type,
  275. "publish_group": row.publish_group,
  276. "content": row.content,
  277. "publish_time": get_datetime_str(row.publish_time),
  278. "publish_channel": row.publish_channel,
  279. "nick_name": nick_name,
  280. "dept_name": dept_name,
  281. "examine_user": examine_user,
  282. "publish_status": row.publish_status, # db_dict.get_dict_label(db, "mm_publish_status", row.publish_status),
  283. "examine_status": row.examine_status, # db_dict.get_dict_label(db, "mm_examine_status", row.examine_status),
  284. "user_count": row.user_count,
  285. "user_ok_count": row.user_ok_count,
  286. "user_err_count": row.user_err_count,
  287. "user_sending_count": row.user_sending_count,
  288. "is_my_edit": (row.examine_status == 0 or row.examine_status == 9) and row.recorded_by == user_id, # 是否我的编辑事项
  289. "is_my_examine": is_my_examine
  290. })
  291. # 返回结果
  292. return {
  293. "code": 200,
  294. "msg": "查询成功",
  295. "data": data,
  296. "total": total
  297. }
  298. except Exception as e:
  299. # 处理异常
  300. traceback.print_exc()
  301. raise HTTPException(status_code=500, detail=str(e))
  302. # 信息发布查看
  303. @router.get('/edit')
  304. async def get_edit_info(
  305. request: Request,
  306. info_id: str = Query(None, description='信息ID'),
  307. db: Session = Depends(get_db)):
  308. row = db.query(InfoPublishBase).filter(InfoPublishBase.id == info_id).first()
  309. data = get_model_dict(row)
  310. examine_time = add_time = data['add_time']
  311. data['examine_user'] = db_user.get_user_name_by_id(db, data['examine_by'])
  312. data['add_time'] = get_datetime_str(data['add_time'])
  313. data['publish_time'] = get_datetime_str(data['publish_time'])
  314. # 反馈 && 未反馈
  315. data['feedback_count'] = db.query(InfoPublishResponses).filter(and_(InfoPublishResponses.publish_id == info_id, InfoPublishResponses.sent_status > 0, InfoPublishResponses.response_type > 0)).count()
  316. data['unresponsive_count'] = db.query(InfoPublishResponses).filter(and_(InfoPublishResponses.publish_id == info_id, InfoPublishResponses.sent_status > 0, InfoPublishResponses.response_type > 0)).count()
  317. # 附件
  318. rows = db.query(InfoPublishFile).filter(and_(InfoPublishFile.from_scenario=="infopublish_attach_file", InfoPublishFile.foreign_key == info_id, InfoPublishFile.del_flag == '0')).all()
  319. data['attachs'] = [
  320. {
  321. "name": row.file_name,
  322. "url": row.storage_file_name
  323. }
  324. for row in rows
  325. ]
  326. # 审批附件
  327. rows = db.query(InfoPublishFile).filter(and_(InfoPublishFile.from_scenario=="infopublish_examine_attach_file", InfoPublishFile.foreign_key == info_id, InfoPublishFile.del_flag == '0')).all()
  328. data['examine_attachs'] = [
  329. {
  330. "name": row.file_name,
  331. "url": row.storage_file_name
  332. }
  333. for row in rows
  334. ]
  335. data["examines"] = []
  336. rows = db.query(InfoPublishExamine).filter(InfoPublishExamine.publish_id == info_id).filter(InfoPublishExamine.del_flag == '0').all()
  337. for row in rows:
  338. examine_time = row.examine_time
  339. data["examines"].append({
  340. "examine_type": EXAMINE_TYPE_DICT[row.examine_type],
  341. "examine_sub_type": EXAMINE_SUB_TYPE_DICT[row.examine_sub_type],
  342. "content": row.content,
  343. "examine_time": get_datetime_str(row.examine_time),
  344. "user_id": row.user_id,
  345. "user_name": row.user_name,
  346. "nick_name": row.nick_name
  347. })
  348. time_diff = examine_time - add_time
  349. data['process_time'] = get_process_time(time_diff)
  350. return {
  351. "code": 200,
  352. "msg": "查询成功",
  353. "data": data
  354. }
  355. # 信息发布编辑保存
  356. @router.post('/edit')
  357. async def post_edit_info(
  358. request: Request,
  359. body = Depends(remove_xss_json),
  360. db: Session = Depends(get_db),
  361. user_id = Depends(valid_access_token)):
  362. try:
  363. id = body['id']
  364. remove_req_param(body, 'info_id')
  365. examines = body['examines']
  366. remove_req_param(body, 'examines')
  367. body['recorded_by'] = user_id
  368. db.query(InfoPublishBase).filter(InfoPublishBase.id == id).update(body)
  369. db.commit()
  370. return {
  371. "code": 200,
  372. "msg": "保存信息成功"
  373. }
  374. except Exception as e:
  375. # 处理异常
  376. traceback.print_exc()
  377. raise HTTPException(status_code=500, detail=str(e))
  378. # 信息发布提交审核
  379. @router.post('/examine')
  380. async def post_examine_info(
  381. request: Request,
  382. body = Depends(remove_xss_json),
  383. db: Session = Depends(get_db),
  384. user_id = Depends(valid_access_token)):
  385. user_row = db.query(SysUser).filter(SysUser.user_id == user_id).first()
  386. new_examine = InfoPublishExamine(
  387. publish_id = body['info_id'],
  388. examine_type = body['examine_type'],
  389. examine_sub_type = body['examine_sub_type'],
  390. content = body['content'],
  391. examine_time = datetime.now(),
  392. user_id = user_id,
  393. user_name = mpfun.dec_data(user_row.user_name),
  394. nick_name = user_row.nick_name
  395. )
  396. db.add(new_examine)
  397. db.commit()
  398. return {
  399. "code": 200,
  400. "msg": "保存审批记录成功"
  401. }
  402. # 信息发布查看发送列表
  403. @router.get("/sent_list")
  404. async def get_sent_list(
  405. info_id: str = Query('', description='信息ID'),
  406. channel: str = Query('', description='渠道'),
  407. keywords: str = Query('', description='关键字'),
  408. sort_by: str = Query('', description='排序字段'),
  409. sort_order: str = Query("asc", description='排序方式'),
  410. page: int = Query(1, gt=0, description='页码'),
  411. page_size: int = Query(10, gt=0, description='pageSize'),
  412. db: Session = Depends(get_db)
  413. ):
  414. try:
  415. # 应用查询条件
  416. where = and_(InfoPublishResponses.publish_id == info_id)
  417. if channel != '':
  418. where = and_(where, InfoPublishResponses.publish_channel.like('%{}%'.format(channel)))
  419. # 计算总条目数
  420. q = db.query(func.count(InfoPublishResponses.id))
  421. q = q.filter(where)
  422. total = q.scalar()
  423. # 执行分页查询
  424. q = db.query(InfoPublishResponses)
  425. q = q.filter(where)
  426. rows = q.order_by(InfoPublishResponses.id.desc()).offset((page - 1) * page_size).limit(page_size).all()
  427. data = [
  428. {
  429. "user_id": row.user_id,
  430. "user_name": row.user_name,
  431. "nick_name": row.nick_name,
  432. "dept_name": row.dept_name,
  433. "sent_status": row.sent_status,
  434. "sent_time": get_datetime_str(row.sent_time),
  435. "response_type": get_response_type_text(row.response_type),
  436. "publish_channel": row.publish_channel,
  437. "yzy_account": row.yzy_account,
  438. "yuezhengyiFeedbackStatus": get_sent_status_text(row.sent_status),
  439. "haixinetFeedbackStatus": get_sent_status_text(0),
  440. }
  441. for row in rows
  442. ]
  443. # 返回结果
  444. return {
  445. "code": 200,
  446. "msg": "查询成功",
  447. "data": data,
  448. "total": total
  449. }
  450. except Exception as e:
  451. # 处理异常
  452. traceback.print_exc()
  453. raise HTTPException(status_code=500, detail=str(e))
  454. # 列出可用模板
  455. @router.post("/template_list")
  456. def template_list(db: Session = Depends(get_db)):
  457. try:
  458. rows = db.query(InfoPublishTemplate).filter(InfoPublishTemplate.del_flag == '0').all()
  459. data = [
  460. {
  461. "id": row.id,
  462. "name": row.name,
  463. "content": row.content
  464. }
  465. for row in rows
  466. ]
  467. return {
  468. "code": 200,
  469. "msg": "查询成功",
  470. "data": data,
  471. "total": len(data)
  472. }
  473. except Exception as e:
  474. # 处理异常
  475. traceback.print_exc()
  476. raise HTTPException(status_code=500, detail=str(e))
  477. # 提交审批
  478. @router.post("/submit_examine")
  479. async def submit_examine(
  480. db: Session = Depends(get_db),
  481. body = Depends(remove_xss_json),
  482. user_id = Depends(valid_access_token)
  483. ):
  484. try:
  485. # 删除之前的待审批记录
  486. db.query(InfoPublishExamine).filter(and_(InfoPublishExamine.examine_type == 20, InfoPublishExamine.examine_sub_type == 20)).update({"del_flag": "2", "content": "content"})
  487. db.commit()
  488. user_row = db.query(SysUser).filter(SysUser.user_id == user_id).first()
  489. info_id = body['info_id']
  490. examine_type = body['examine_type']
  491. content = body['content']
  492. # 审批通过
  493. if examine_type == 'approved':
  494. new_examine = InfoPublishExamine(
  495. publish_id = info_id,
  496. examine_type = 20,
  497. examine_sub_type = 21,
  498. content = content,
  499. examine_time = datetime.now(),
  500. user_id = user_id,
  501. user_name = mpfun.dec_data(user_row.user_name),
  502. nick_name = user_row.nick_name
  503. )
  504. db.add(new_examine)
  505. db.commit()
  506. # publish_status 发布中
  507. # examine_status 审批通过
  508. db.query(InfoPublishBase).filter(InfoPublishBase.id == info_id).update({"publish_status": 3, "examine_status": 3})
  509. db.commit()
  510. # 审批不通过
  511. elif examine_type == 'rejected':
  512. new_examine = InfoPublishExamine(
  513. publish_id = info_id,
  514. examine_type = 20,
  515. examine_sub_type = 22,
  516. content = content,
  517. examine_time = datetime.now(),
  518. user_id = user_id,
  519. user_name = mpfun.dec_data(user_row.user_name),
  520. nick_name = user_row.nick_name
  521. )
  522. db.add(new_examine)
  523. db.commit()
  524. # publish_status 取消发布
  525. # examine_status 审批不通过
  526. db.query(InfoPublishBase).filter(InfoPublishBase.id == info_id).update({"publish_status": 9, "examine_status": 9})
  527. db.commit()
  528. return {
  529. "code": 200,
  530. "msg": "审批成功"
  531. }
  532. except Exception as e:
  533. # 处理异常
  534. traceback.print_exc()
  535. raise HTTPException(status_code=500, detail=str(e))
  536. def get_sent_status_text(val: int) -> str:
  537. if val == 0:
  538. return "待发送"
  539. elif val == 1:
  540. return '成功'
  541. elif val == 2:
  542. return '失败'
  543. else:
  544. return "未知"
  545. def get_response_type_text(val: int) -> str:
  546. if val == 0:
  547. return "仅需阅读"
  548. elif val == 1:
  549. return '点击确认'
  550. elif val == 2:
  551. return '签字确认'
  552. else:
  553. return '未知'
  554. @router.get('/find_examine_user')
  555. async def userlist( deptId: int = Query(None ,description='部门id'),
  556. userName: str = Query(None, description='用户名'),
  557. status: int = Query(None, description='用户状态'),
  558. phonenumber : str = Query(None, description='手机号'),
  559. page: int = Query(1, gt=0, description='页码'),
  560. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  561. db: Session = Depends(get_db),
  562. user_id: int = Depends(valid_access_token)):
  563. try:
  564. # 构建查询
  565. query = db.query(SysUser)
  566. query = query.filter(SysUser.del_flag != '2')
  567. # 应用查询条件
  568. if userName:
  569. query =query.filter(or_(SysUser.user_name == mpfun.enc_data(userName), SysUser.nick_name.like(f'%{userName}%')))
  570. if status:
  571. query =query.filter(SysUser.status == status)
  572. if phonenumber:
  573. query =query.filter(SysUser.phonenumber == mpfun.enc_data(phonenumber))
  574. # 计算总条目数
  575. total_items = query.count()
  576. # 排序
  577. query = query.order_by(SysUser.create_time.desc())
  578. # 执行分页查询
  579. users = query.offset((page - 1) * pageSize).limit(pageSize).all()
  580. # 将查询结果转换为列表形式的字典
  581. user_list = []
  582. for user in users:
  583. user_info = {
  584. "userId": user.user_id,
  585. "tenantId": user.tenant_id,
  586. "deptId": user.dept_id,
  587. "userName": mpfun.dec_data(user.user_name),
  588. "nickName": user.nick_name,
  589. "userType": user.user_type,
  590. "email": mpfun.dec_data(user.email),
  591. "phonenumber": mpfun.dec_data(user.phonenumber),
  592. "sex": user.sex,
  593. "avatar": user.avatar,
  594. "status": user.status,
  595. "loginIp": user.login_ip,
  596. "loginDate": user.login_date.strftime('%Y-%m-%d %H:%M:%S') if user.login_date else '',
  597. "remark": user.remark,
  598. "createTime": user.create_time.strftime('%Y-%m-%d %H:%M:%S') if user.create_time else '',
  599. "deptName": user.dept_name,
  600. }
  601. user_list.append(user_info)
  602. # 返回结果
  603. return {
  604. "code": 200,
  605. "msg": "成功用户列表",
  606. "rows": user_list,
  607. "total": total_items,
  608. "page": page,
  609. "pageSize": pageSize,
  610. "totalPages": (total_items + pageSize - 1) // pageSize
  611. }
  612. except Exception as e:
  613. traceback.print_exc()
  614. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")