command_system.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  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. dept_list_dict = get_dept_list_by_event_id(db, eventId)
  90. return {
  91. "code": 200,
  92. "data": dept_list_dict,
  93. "msg": "操作成功"
  94. }
  95. @router.post("/system/user/checked")
  96. async def check_users(
  97. request: Request,
  98. db: Session = Depends(get_db),
  99. body = Depends(remove_xss_json),
  100. ):
  101. try:
  102. eventId = body['eventId']
  103. nodes = body['nodes']
  104. for node in nodes:
  105. userId = node['userId']
  106. db.query(CommandSystemUser).filter(and_(CommandSystemUser.event_id == eventId, CommandSystemUser.user_id == userId, CommandSystemUser.user_category == "temp")).delete()
  107. if node['checked'] == True:
  108. new_user = CommandSystemUser(
  109. user_id = node['userId'],
  110. dept_id = node['deptId'],
  111. dept_name = node['deptName'],
  112. user_name = node['userName'],
  113. nick_name = node['nickName'],
  114. system_dept_id = node['systemDeptId'],
  115. user_category = "temp",
  116. event_id = eventId,
  117. order_num = unixstamp()
  118. )
  119. db.add(new_user)
  120. db.commit()
  121. if node['checked'] == False:
  122. pass
  123. return {
  124. "code": 200,
  125. "msg": "操作成功"
  126. }
  127. except Exception as e:
  128. traceback.print_exc()
  129. @router.get("/system/user/list")
  130. async def get_system_user_list(
  131. request: Request,
  132. eventId: str,
  133. deptId: str,
  134. nickName: str = Query(None, description='用户姓名'),
  135. db: Session = Depends(get_db),
  136. body = Depends(remove_xss_json),
  137. user_id = Depends(valid_access_token)
  138. ):
  139. try:
  140. user_list = selected_user_list = []
  141. row = db.query(CommandSystemDept).filter(CommandSystemDept.id == int(deptId)).first()
  142. if row is not None:
  143. systemDeptId = row.id
  144. deptCategory = row.dept_category
  145. deptId = row.dept_id
  146. if deptCategory == '0':
  147. # 虚拟部门,总指挥或者副总指挥,其他部门已被tree下来忽略
  148. query = db.query(CommandSystemUser)
  149. query = query.filter(and_(CommandSystemUser.event_id == eventId, CommandSystemUser.system_dept_id == deptId))
  150. if nickName:
  151. query =query.filter(CommandSystemUser.nick_name.like(f'%{nickName}%'))
  152. user_list = []
  153. users = query.all()
  154. for user in users:
  155. user_info = {
  156. "id": user.id,
  157. "userId": user.user_id,
  158. "systemDeptId": user.system_dept_id,
  159. "deptId": user.dept_id,
  160. "deptName": user.dept_name,
  161. "userName": user.user_name,
  162. "nickName": user.nick_name,
  163. "position": user.position
  164. }
  165. user_list.append(user_info)
  166. # 返回结果
  167. return {
  168. "code": 200,
  169. "msg": "成功用户列表",
  170. "rows": user_list,
  171. "selected_rows": user_list
  172. }
  173. else:
  174. # 真实部门
  175. # 查询部门用户
  176. def get_dept_chli(dept_list : list,parent_id : int):
  177. depts = parent_id_get_dept_info(db,parent_id)
  178. if depts:
  179. for dept in depts:
  180. dept_list.append(dept.dept_id)
  181. get_dept_chli(dept_list, dept.dept_id)
  182. return dept_list
  183. query = db.query(SysUser).filter(and_(SysUser.status == 0))
  184. query = query.filter(SysUser.dept_id.in_(get_dept_chli([deptId],deptId)))
  185. query = query.order_by(SysUser.create_time.desc())
  186. users = query.all()
  187. user_list = []
  188. for user in users:
  189. user_info = {
  190. "userId": user.user_id,
  191. "deptId": user.dept_id,
  192. "deptName": user.dept_name,
  193. "userName": mpfun.dec_data(user.user_name),
  194. "nickName": user.nick_name,
  195. "systemDeptId": systemDeptId,
  196. "position": ""
  197. }
  198. user_list.append(user_info)
  199. # 查询已勾选用户
  200. query = db.query(CommandSystemUser)
  201. query = query.filter(CommandSystemUser.system_dept_id == systemDeptId)
  202. if nickName:
  203. query =query.filter(CommandSystemUser.nick_name.like(f'%{nickName}%'))
  204. users = query.all()
  205. # 将查询结果转换为列表形式的字典
  206. selected_user_list = []
  207. for user in users:
  208. user_info = {
  209. "id": user.id,
  210. "userId": user.user_id,
  211. "systemDeptId": user.system_dept_id,
  212. "deptId": user.dept_id,
  213. "deptName": user.dept_name,
  214. "userName": user.user_name,
  215. "nickName": user.nick_name,
  216. "position": user.position
  217. }
  218. selected_user_list.append(user_info)
  219. # 返回结果
  220. return {
  221. "code": 200,
  222. "msg": "成功用户列表",
  223. "rows": user_list,
  224. "selected_rows": selected_user_list
  225. }
  226. except Exception as e:
  227. traceback.print_exc()
  228. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  229. def get_dept_list_by_event_id(db: Session, eventId: str):
  230. init_system_dept_list_by_event_id(db, eventId)
  231. query = db.query(CommandSystemDept)
  232. query = query.filter(CommandSystemDept.event_id == eventId)
  233. query = query.filter(CommandSystemDept.del_flag != '2')
  234. dept_list = query.all()
  235. dept_list_dict = [{
  236. "id": dept.id,
  237. "deptId": dept.dept_id,
  238. "deptName": dept.dept_name,
  239. "ancestors": dept.ancestors,
  240. "deptCategory": dept.dept_category,
  241. "orderNum": dept.order_num,
  242. "parentId": dept.parent_id,
  243. "parentName": dept.parent_name
  244. } for dept in dept_list]
  245. return dept_list_dict
  246. @router.post("/system/filtered/dept/list")
  247. async def get_list(request: Request,
  248. db: Session = Depends(get_db),
  249. body = Depends(remove_xss_json)):
  250. eventId = body['eventId']
  251. nodes = body['nodes']
  252. # 成员单位节点
  253. parent_id = get_member_parent_id(db, eventId)
  254. print('成员单位节点:', parent_id)
  255. ok_nodes = []
  256. for node in nodes:
  257. deptName = node['deptName']
  258. # 只能是部门才可以加上去
  259. if deptName.find("局") != -1 or deptName.find("中心") != -1 :
  260. ok_nodes.append(node)
  261. if len(ok_nodes) > 0:
  262. # 删除之前的成员单位
  263. # 将勾选的XXX局等节点加到成员单位节点下
  264. i = 0
  265. for n in ok_nodes:
  266. row = db.query(CommandSystemDept).filter(and_(CommandSystemDept.event_id == eventId, CommandSystemDept.dept_id == n['deptId'])).first()
  267. if row is None:
  268. new_dept = CommandSystemDept(
  269. dept_id = n['deptId'],
  270. parent_id = parent_id,
  271. parent_name = '成员部门',
  272. ancestors = '',
  273. dept_name = n['deptName'],
  274. dept_category = "temp",
  275. event_id = eventId,
  276. order_num = 10 * i,
  277. del_flag = '0'
  278. )
  279. db.add(new_dept)
  280. db.commit()
  281. dept_list_dict = get_dept_list_by_event_id(db, eventId)
  282. return {
  283. "code": 200,
  284. "data": dept_list_dict,
  285. "msg": "操作成功"
  286. }
  287. # 成员单位节点
  288. def get_member_parent_id(db: Session, eventId: str):
  289. row = db.query(CommandSystemDept).filter(and_(CommandSystemDept.event_id == eventId, CommandSystemDept.dept_category == 'member_root')).first()
  290. parent_id = row.dept_id
  291. return parent_id
  292. def init_system_dept_list_by_event_id(db: Session, eventId: str):
  293. c = db.query(CommandSystemDept).filter(CommandSystemDept.event_id == eventId).count()
  294. if c > 0:
  295. return
  296. # 初始部门
  297. rows = db.query(CommandSystemDept).filter(and_(CommandSystemDept.event_id == "0", CommandSystemDept.del_flag == '0')).all()
  298. for row in rows:
  299. info = get_model_dict(row)
  300. info['event_id'] = eventId
  301. del info['id']
  302. new_dept = CommandSystemDept(**info)
  303. db.add(new_dept)
  304. db.commit()
  305. # 初始人员(总指挥和副总指挥)
  306. rows = db.query(CommandSystemUser).filter(and_(CommandSystemUser.event_id == "0")).all()
  307. for row in rows:
  308. info = get_model_dict(row)
  309. info['event_id'] = eventId
  310. del info['id']
  311. new_user = CommandSystemUser(**info)
  312. db.add(new_user)
  313. db.commit()
  314. # 获取成员单位节点
  315. member_parent_id = get_member_parent_id(db, eventId)
  316. print('成员单位节点:', member_parent_id)
  317. # 初始化应急预案人员
  318. row = db.query(EventBase).filter(EventBase.event_code == eventId).first()
  319. if row is None:
  320. return
  321. plan_id = row.plan_id
  322. if plan_id is None or plan_id == '':
  323. return
  324. # 匹配预案相关部门(以下代码,对数据匹配行要求高)
  325. rows = db.query(EmergencyUnit).filter(EmergencyUnit.plan_id == plan_id).order_by(EmergencyUnit.dept_order.asc()).all()
  326. for row in rows:
  327. dept_id = row.dept_id
  328. dept_name = row.dept_name
  329. dept_order = row.dept_order
  330. system_dept_id = 0
  331. dept_row = db.query(CommandSystemDept).filter(and_(CommandSystemDept.event_id == eventId, CommandSystemDept.dept_id == dept_id)).first()
  332. if dept_row is None:
  333. new_dept = CommandSystemDept(
  334. dept_id = dept_id,
  335. parent_id = member_parent_id,
  336. parent_name = '成员部门',
  337. ancestors = '',
  338. dept_name = dept_name,
  339. dept_category = "1",# 设置为固定部门
  340. event_id = eventId,
  341. order_num = dept_order,
  342. del_flag = '0'
  343. )
  344. db.add(new_dept)
  345. db.commit()
  346. db.refresh(new_dept)
  347. system_dept_id = new_dept.id
  348. else:
  349. system_dept_id = dept_row.id
  350. # 匹配部门对应的预案联系人
  351. contact_row = db.query(EmergencyContactInfo).filter(and_(EmergencyContactInfo.unit_id == dept_id, EmergencyContactInfo.del_flag == '0')).first()
  352. if contact_row is not None:
  353. db_dept.get_dept_name_by_id(db, dept_id)
  354. contact_name = contact_row.contact_name
  355. position = contact_row.position
  356. yzy_account = mpfun.dec_data(contact_row.yue_gov_ease_phone)
  357. user_name = ''
  358. nick_name = contact_name
  359. user_id = db_user.get_user_id_by_phonenumber(db, yzy_account)
  360. if user_id != -1:
  361. user_info = db_user.get_user_info(db, user_id)
  362. user_name = user_info.user_name
  363. nick_name = user_info.nick_name
  364. new_user = CommandSystemUser(
  365. user_id = user_id,
  366. dept_id = dept_id,
  367. dept_name = dept_name,
  368. user_name = user_name,
  369. nick_name = nick_name,
  370. system_dept_id = system_dept_id,
  371. user_category = "1",# 设置为固定人
  372. event_id = eventId,
  373. position = position,
  374. order_num = unixstamp()
  375. )
  376. db.add(new_user)
  377. db.commit()