command_system.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. from fastapi import APIRouter, Request, Depends, HTTPException, Query, BackgroundTasks,status
  2. from sqlalchemy.exc import IntegrityError
  3. from fastapi.responses import HTMLResponse, FileResponse
  4. from fastapi.responses import JSONResponse
  5. from database import get_db
  6. from sqlalchemy import text, exists, and_, or_, not_
  7. from sqlalchemy.orm import Session
  8. from models import *
  9. import json
  10. import random
  11. from sqlalchemy import create_engine, select
  12. from typing import Optional
  13. from utils.StripTagsHTMLParser import *
  14. from common.db import db_dept, db_user, db_area, db_emergency_plan, db_msg_center, db_yzy
  15. from common.security import valid_access_token
  16. import traceback
  17. from utils import *
  18. from datetime import datetime, timedelta
  19. from common import YzyApi
  20. from common.db import db_dict
  21. from urllib.parse import quote
  22. import base64
  23. from config import settings
  24. from extensions import logger
  25. from utils.ry_system_util import *
  26. from common.enc import mpfun
  27. router = APIRouter()
  28. @router.get('/common/dept/list')
  29. async def get_list(
  30. # request: Request,
  31. deptName: str = Query(None, max_length=100),
  32. deptCategory:str = Query(None, max_length=100),
  33. status: str = Query(None, max_length=100),
  34. db: Session = Depends(get_db),
  35. body = Depends(remove_xss_json),
  36. user_id = Depends(valid_access_token)
  37. ):
  38. query = db.query(SysDept)
  39. query = query.filter(SysDept.dept_id >= 3)
  40. query = query.filter(SysDept.del_flag != '2')
  41. if deptName:
  42. query = query.filter(SysDept.dept_name.like(f'%{deptName}%'))
  43. if deptCategory:
  44. query = query.filter(SysDept.dept_category.like(f'%{deptCategory}%'))
  45. if status:
  46. query = query.filter(SysDept.status.like(f'%{status}%'))
  47. dept_list = query.all()
  48. # 将模型实例转换为字典
  49. dept_list_dict = [{
  50. "deptId": dept.dept_id,
  51. "deptName": dept.dept_name,
  52. "ancestors": dept.ancestors,
  53. "deptCategory": dept.dept_category,
  54. "orderNum": dept.order_num,
  55. "parentId": dept.parent_id,
  56. "parentName": dept.parent_name,
  57. } for dept in dept_list]
  58. return {
  59. "code": 200,
  60. "data": dept_list_dict,
  61. "msg": "操作成功"
  62. }
  63. @router.get("/system/dept/list")
  64. async def get_system_dept_list(
  65. request: Request,
  66. eventId: str,
  67. db: Session = Depends(get_db),
  68. body = Depends(remove_xss_json),
  69. user_id = Depends(valid_access_token)
  70. ):
  71. dept_list_dict = get_dept_list_by_event_id(db, eventId)
  72. return {
  73. "code": 200,
  74. "data": dept_list_dict,
  75. "msg": "操作成功"
  76. }
  77. @router.post("/system/dept/delete")
  78. async def delete_system_dept(
  79. request: Request,
  80. db: Session = Depends(get_db),
  81. body = Depends(remove_xss_json),
  82. user_id = Depends(valid_access_token)
  83. ):
  84. eventId = body['eventId']
  85. deptId = body['deptId']
  86. db.query(CommandSystemDept).filter(and_(CommandSystemDept.event_id == eventId, CommandSystemDept.id == deptId, CommandSystemDept.dept_category == "temp")).delete()
  87. db.query(CommandSystemUser).filter(and_(CommandSystemUser.event_id == eventId, CommandSystemUser.system_dept_id == deptId, CommandSystemUser.user_category == "temp")).delete()
  88. db.commit()
  89. return {
  90. "code": 200,
  91. "msg": "操作成功"
  92. }
  93. @router.post("/system/user/checked")
  94. async def check_users(
  95. request: Request,
  96. db: Session = Depends(get_db),
  97. body = Depends(remove_xss_json),
  98. ):
  99. try:
  100. eventId = body['eventId']
  101. nodes = body['nodes']
  102. for node in nodes:
  103. userId = node['userId']
  104. db.query(CommandSystemUser).filter(and_(CommandSystemUser.event_id == eventId, CommandSystemUser.user_id == userId, CommandSystemUser.user_category == "temp")).delete()
  105. if node['checked'] == True:
  106. new_user = CommandSystemUser(
  107. user_id = node['userId'],
  108. dept_id = node['deptId'],
  109. dept_name = node['deptName'],
  110. user_name = node['userName'],
  111. nick_name = node['nickName'],
  112. system_dept_id = node['systemDeptId'],
  113. user_category = "temp",
  114. event_id = eventId,
  115. order_num = unixstamp()
  116. )
  117. db.add(new_user)
  118. db.commit()
  119. if node['checked'] == False:
  120. pass
  121. return {
  122. "code": 200,
  123. "msg": "操作成功"
  124. }
  125. except Exception as e:
  126. traceback.print_exc()
  127. @router.get("/system/user/list")
  128. async def get_system_user_list(
  129. request: Request,
  130. eventId: str,
  131. deptId: str,
  132. nickName: str = Query(None, description='用户姓名'),
  133. db: Session = Depends(get_db),
  134. body = Depends(remove_xss_json),
  135. user_id = Depends(valid_access_token)
  136. ):
  137. try:
  138. row = db.query(CommandSystemDept).filter(CommandSystemDept.id == int(deptId)).first()
  139. systemDeptId = row.id
  140. deptCategory = row.dept_category
  141. deptId = row.dept_id
  142. if deptCategory == '0':
  143. # 虚拟部门,总指挥或者副总指挥,其他部门已被tree下来忽略
  144. query = db.query(CommandSystemUser)
  145. query = query.filter(and_(CommandSystemUser.event_id == eventId, CommandSystemUser.system_dept_id == deptId))
  146. if nickName:
  147. query =query.filter(CommandSystemUser.nick_name.like(f'%{nickName}%'))
  148. user_list = []
  149. users = query.all()
  150. for user in users:
  151. user_info = {
  152. "id": user.id,
  153. "userId": user.user_id,
  154. "systemDeptId": user.system_dept_id,
  155. "deptId": user.dept_id,
  156. "deptName": user.dept_name,
  157. "userName": user.user_name,
  158. "nickName": user.nick_name,
  159. "position": user.position
  160. }
  161. user_list.append(user_info)
  162. # 返回结果
  163. return {
  164. "code": 200,
  165. "msg": "成功用户列表",
  166. "rows": user_list,
  167. "selected_rows": user_list
  168. }
  169. else:
  170. # 真实部门
  171. # 查询部门用户
  172. def get_dept_chli(dept_list : list,parent_id : int):
  173. depts = parent_id_get_dept_info(db,parent_id)
  174. if depts:
  175. for dept in depts:
  176. dept_list.append(dept.dept_id)
  177. get_dept_chli(dept_list, dept.dept_id)
  178. return dept_list
  179. query = db.query(SysUser).filter(and_(SysUser.status == 0))
  180. query = query.filter(SysUser.dept_id.in_(get_dept_chli([deptId],deptId)))
  181. query = query.order_by(SysUser.create_time.desc())
  182. users = query.all()
  183. user_list = []
  184. for user in users:
  185. user_info = {
  186. "userId": user.user_id,
  187. "deptId": user.dept_id,
  188. "deptName": user.dept_name,
  189. "userName": mpfun.dec_data(user.user_name),
  190. "nickName": user.nick_name,
  191. "systemDeptId": systemDeptId,
  192. "position": ""
  193. }
  194. user_list.append(user_info)
  195. # 查询已勾选用户
  196. query = db.query(CommandSystemUser)
  197. query = query.filter(CommandSystemUser.system_dept_id == systemDeptId)
  198. if nickName:
  199. query =query.filter(CommandSystemUser.nick_name.like(f'%{nickName}%'))
  200. users = query.all()
  201. # 将查询结果转换为列表形式的字典
  202. selected_user_list = []
  203. for user in users:
  204. user_info = {
  205. "id": user.id,
  206. "userId": user.user_id,
  207. "systemDeptId": user.system_dept_id,
  208. "deptId": user.dept_id,
  209. "deptName": user.dept_name,
  210. "userName": user.user_name,
  211. "nickName": user.nick_name,
  212. "position": user.position
  213. }
  214. selected_user_list.append(user_info)
  215. # 返回结果
  216. return {
  217. "code": 200,
  218. "msg": "成功用户列表",
  219. "rows": user_list,
  220. "selected_rows": selected_user_list
  221. }
  222. except Exception as e:
  223. traceback.print_exc()
  224. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  225. def get_dept_list_by_event_id(db: Session, eventId: str):
  226. init_system_dept_list_by_event_id(db, eventId)
  227. query = db.query(CommandSystemDept)
  228. query = query.filter(CommandSystemDept.event_id == eventId)
  229. query = query.filter(CommandSystemDept.del_flag != '2')
  230. dept_list = query.all()
  231. dept_list_dict = [{
  232. "id": dept.id,
  233. "deptId": dept.dept_id,
  234. "deptName": dept.dept_name,
  235. "ancestors": dept.ancestors,
  236. "deptCategory": dept.dept_category,
  237. "orderNum": dept.order_num,
  238. "parentId": dept.parent_id,
  239. "parentName": dept.parent_name
  240. } for dept in dept_list]
  241. return dept_list_dict
  242. @router.post("/system/filtered/dept/list")
  243. async def get_list(request: Request,
  244. db: Session = Depends(get_db),
  245. body = Depends(remove_xss_json)):
  246. eventId = body['eventId']
  247. nodes = body['nodes']
  248. # 成员单位节点
  249. parent_id = get_member_parent_id(db, eventId)
  250. print('成员单位节点:', parent_id)
  251. ok_nodes = []
  252. for node in nodes:
  253. deptName = node['deptName']
  254. # 只能是部门才可以加上去
  255. if deptName.find("局") != -1 :
  256. ok_nodes.append(node)
  257. if len(ok_nodes) > 0:
  258. # 删除之前的成员单位
  259. # 将勾选的XXX局等节点加到成员单位节点下
  260. i = 0
  261. for n in ok_nodes:
  262. row = db.query(CommandSystemDept).filter(and_(CommandSystemDept.event_id == eventId, CommandSystemDept.dept_id == n['deptId'])).first()
  263. if row is None:
  264. new_dept = CommandSystemDept(
  265. dept_id = n['deptId'],
  266. parent_id = parent_id,
  267. parent_name = '成员部门',
  268. ancestors = '',
  269. dept_name = n['deptName'],
  270. dept_category = "temp",
  271. event_id = eventId,
  272. order_num = 10 * i,
  273. del_flag = '0'
  274. )
  275. db.add(new_dept)
  276. db.commit()
  277. dept_list_dict = get_dept_list_by_event_id(db, eventId)
  278. return {
  279. "code": 200,
  280. "data": dept_list_dict,
  281. "msg": "操作成功"
  282. }
  283. # 成员单位节点
  284. def get_member_parent_id(db: Session, eventId: str):
  285. row = db.query(CommandSystemDept).filter(and_(CommandSystemDept.event_id == eventId, CommandSystemDept.dept_category == 'member_root')).first()
  286. parent_id = row.dept_id
  287. return parent_id
  288. def init_system_dept_list_by_event_id(db: Session, eventId: str):
  289. c = db.query(CommandSystemDept).filter(CommandSystemDept.event_id == eventId).count()
  290. if c > 0:
  291. return
  292. # 初始部门
  293. rows = db.query(CommandSystemDept).filter(and_(CommandSystemDept.event_id == "0", CommandSystemDept.del_flag == '0')).all()
  294. for row in rows:
  295. info = get_model_dict(row)
  296. info['event_id'] = eventId
  297. del info['id']
  298. new_dept = CommandSystemDept(**info)
  299. db.add(new_dept)
  300. db.commit()
  301. # 初始人员(总指挥和副总指挥)
  302. rows = db.query(CommandSystemUser).filter(and_(CommandSystemUser.event_id == "0")).all()
  303. for row in rows:
  304. info = get_model_dict(row)
  305. info['event_id'] = eventId
  306. del info['id']
  307. new_user = CommandSystemUser(**info)
  308. db.add(new_user)
  309. db.commit()
  310. # 获取成员单位节点
  311. member_parent_id = get_member_parent_id(db, eventId)
  312. print('成员单位节点:', member_parent_id)
  313. # 初始化应急预案人员
  314. row = db.query(EventBase).filter(EventBase.event_code == eventId).first()
  315. if row is None:
  316. return
  317. plan_id = row.plan_id
  318. if plan_id is None or plan_id == '':
  319. return
  320. # 匹配预案相关部门(以下代码,对数据匹配行要求高)
  321. rows = db.query(EmergencyUnit).filter(EmergencyUnit.plan_id == plan_id).order_by(EmergencyUnit.dept_order.asc()).all()
  322. for row in rows:
  323. dept_id = row.dept_id
  324. dept_name = row.dept_name
  325. dept_order = row.dept_order
  326. system_dept_id = 0
  327. dept_row = db.query(CommandSystemDept).filter(and_(CommandSystemDept.event_id == eventId, CommandSystemDept.dept_id == dept_id)).first()
  328. if dept_row is None:
  329. new_dept = CommandSystemDept(
  330. dept_id = dept_id,
  331. parent_id = member_parent_id,
  332. parent_name = '成员部门',
  333. ancestors = '',
  334. dept_name = dept_name,
  335. dept_category = "1",# 设置为固定部门
  336. event_id = eventId,
  337. order_num = dept_order,
  338. del_flag = '0'
  339. )
  340. db.add(new_dept)
  341. db.commit()
  342. db.refresh(new_dept)
  343. system_dept_id = new_dept.id
  344. else:
  345. system_dept_id = dept_row.id
  346. # 匹配部门对应的预案联系人
  347. contact_row = db.query(EmergencyContactInfo).filter(and_(EmergencyContactInfo.unit_id == dept_id, EmergencyContactInfo.del_flag == '0')).first()
  348. if contact_row is not None:
  349. db_dept.get_dept_name_by_id(db, dept_id)
  350. contact_name = contact_row.contact_name
  351. position = contact_row.position
  352. yzy_account = mpfun.dec_data(contact_row.yue_gov_ease_phone)
  353. user_name = ''
  354. nick_name = contact_name
  355. user_id = db_user.get_user_id_by_phonenumber(db, yzy_account)
  356. if user_id != -1:
  357. user_info = db_user.get_user_info(db, user_id)
  358. user_name = user_info.user_name
  359. nick_name = user_info.nick_name
  360. new_user = CommandSystemUser(
  361. user_id = user_id,
  362. dept_id = dept_id,
  363. dept_name = dept_name,
  364. user_name = user_name,
  365. nick_name = nick_name,
  366. system_dept_id = system_dept_id,
  367. user_category = "1",# 设置为固定人
  368. event_id = eventId,
  369. position = position,
  370. order_num = unixstamp()
  371. )
  372. db.add(new_user)
  373. db.commit()