__init__.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from fastapi import APIRouter, Request, Depends, Query, HTTPException, status,WebSocket,WebSocketDisconnect
  4. from common.security import valid_access_token
  5. from fastapi.responses import JSONResponse
  6. from sqlalchemy.orm import Session
  7. from sqlalchemy.sql import func
  8. from common.auth_user import *
  9. from sqlalchemy import text
  10. from pydantic import BaseModel
  11. from common.BigDataCenterAPI import *
  12. from database import get_db
  13. from typing import List
  14. from models import *
  15. from utils import *
  16. from utils.spatial import *
  17. import json
  18. import traceback
  19. router = APIRouter()
  20. @router.post("/create")
  21. async def create_pattern(
  22. user_id=Depends(valid_access_token),
  23. body = Depends(remove_xss_json),
  24. db: Session = Depends(get_db)
  25. ):
  26. try:
  27. new_pattern = TpPatternList(
  28. id = new_guid(),
  29. pattern_name=body['pattern_name'],
  30. content=body['content'],
  31. create_dept = user_id
  32. )
  33. db.add(new_pattern)
  34. db.commit()
  35. return {"code": 200, "msg": "创建成功", "data": None}
  36. except Exception as e:
  37. traceback.print_exc()
  38. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  39. @router.put("/update/{pattern_id}")
  40. async def update_pattern(
  41. pattern_id :int ,
  42. user_id=Depends(valid_access_token),
  43. body=Depends(remove_xss_json),
  44. db: Session = Depends(get_db)
  45. ):
  46. try:
  47. query = db.query(TpPatternList)
  48. query = query.filter(TpPatternList.id == pattern_id)
  49. query = query.filter(TpPatternList.del_flag != '2')
  50. update_pattern = query.first()
  51. if not update_pattern:
  52. raise HTTPException(status_code=404, detail="图案不存在")
  53. update_pattern.pattern_name = body['pattern_name']
  54. update_pattern.content = body['content']
  55. update_pattern.create_dept = user_id
  56. db.commit()
  57. return {"code": 200, "msg": "更新成功"}
  58. except Exception as e:
  59. traceback.print_exc()
  60. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  61. @router.get("/info/{pattern_id}")
  62. async def get_pattern_info(
  63. pattern_id: int,
  64. db: Session = Depends(get_db)
  65. ):
  66. try:
  67. query = db.query(TpPatternList)
  68. query = query.filter(TpPatternList.id == pattern_id)
  69. query = query.filter(TpPatternList.del_flag != '2')
  70. pattern = query.first()
  71. # pattern = db.query(TpPatternList).filter(TpPatternList.id == pattern_id).first()
  72. if not pattern:
  73. raise HTTPException(status_code=404, detail="图案不存在")
  74. return {"code": 200, "msg": "获取成功", "data": {"pattern_name": pattern.pattern_name, "content": pattern.content}}
  75. except Exception as e:
  76. traceback.print_exc()
  77. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  78. @router.get("/list")
  79. async def get_pattern_list(
  80. pattern_name: str = Query(None, description='预案名称'),
  81. page: int = Query(1, gt=0, description='页码'),
  82. pageSize: int = Query(5, gt=0, description='每页条目数量'),
  83. db: Session = Depends(get_db)
  84. ):
  85. try:
  86. query = db.query(TpPatternList)
  87. query = query.filter(TpPatternList.del_flag != '2')
  88. if pattern_name:
  89. query = query.filter(TpPatternList.pattern_name.like(f'%{pattern_name}%'))
  90. total_items = query.count()
  91. # 排序
  92. query = query.order_by(TpPatternList.create_time.desc())
  93. # 执行分页查询
  94. patterns = query.offset((page - 1) * pageSize).limit(pageSize).all()
  95. return {"code": 200, "msg": "查询成功", "data": [{"id": p.id, "pattern_name": p.pattern_name, "content": p.content} for p in patterns],
  96. "total": total_items,
  97. "page": page,
  98. "pageSize": pageSize,
  99. "totalPages": (total_items + pageSize - 1) // pageSize
  100. }
  101. except Exception as e:
  102. traceback.print_exc()
  103. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  104. @router.delete("/delete/{pattern_id}")
  105. async def delete_pattern(
  106. pattern_id: int,
  107. db: Session = Depends(get_db)
  108. ):
  109. try:
  110. # 检查图案是否存在
  111. query = db.query(TpPatternList)
  112. query = query.filter(TpPatternList.id == pattern_id)
  113. query = query.filter(TpPatternList.del_flag != '2')
  114. pattern = query.first()
  115. if not pattern:
  116. raise HTTPException(status_code=404, detail="图案不存在")
  117. # 执行删除操作
  118. pattern.del_flag='2'
  119. db.commit()
  120. return {"code": 200, "msg": "删除成功"}
  121. except Exception as e:
  122. traceback.print_exc()
  123. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  124. def pattern_id_get_tp_pattern_ws_info(pattern_id:str,db: Session):
  125. query = db.query(TpPatternWSList)
  126. query = query.filter(TpPatternWSList.del_flag != '2')
  127. query = query.filter(TpPatternWSList.pattern_id == pattern_id)
  128. query.order_by(TpPatternWSList.create_time.desc())
  129. return query.first()
  130. def pattern_id_get_tp_pattern_ws_user_list(pattern_id:str,db: Session):
  131. query = db.query(TpPatternWSUserList)
  132. query = query.filter(TpPatternWSUserList.del_flag != '2')
  133. query = query.filter(TpPatternWSUserList.pattern_id == pattern_id)
  134. query.order_by(TpPatternWSUserList.create_time.desc())
  135. return query.all()
  136. def user_id_get_tp_pattern_ws_user_list(user_id:str,db: Session):
  137. query = db.query(TpPatternWSUserList)
  138. query = query.filter(TpPatternWSUserList.del_flag != '2')
  139. query = query.filter(TpPatternWSUserList.user_id == user_id)
  140. query.order_by(TpPatternWSUserList.create_time.desc())
  141. return query.all()
  142. def user_id_and_pattern_id_get_tp_pattern_ws_user_info(user_id:str,pattern_id:str,db: Session):
  143. query = db.query(TpPatternWSUserList)
  144. query = query.filter(TpPatternWSUserList.del_flag != '2')
  145. query = query.filter(TpPatternWSUserList.user_id == user_id)
  146. query = query.filter(TpPatternWSUserList.pattern_id == pattern_id)
  147. query.order_by(TpPatternWSUserList.create_time.desc())
  148. return query.all()
  149. class ConnectionManager:
  150. def __init__(self):
  151. self.active_connections = {} #: List[WebSocket]
  152. async def connect(self, websocket: WebSocket,pattern_id:str,db: Session):
  153. await websocket.accept()
  154. if pattern_id not in self.active_connections:
  155. data = pattern_id_get_tp_pattern_ws_info(pattern_id,db)
  156. if data:
  157. await websocket.send_text(data.content)
  158. self.active_connections[pattern_id] = [websocket]
  159. else:
  160. self.active_connections[pattern_id].append(websocket)
  161. def disconnect(self, websocket: WebSocket,pattern_id:str):
  162. self.active_connections[pattern_id].remove(websocket)
  163. if not self.active_connections[pattern_id]:
  164. del self.active_connections[pattern_id]
  165. async def broadcast(self, message: str,pattern_id:str,user_id,db: Session):
  166. new_pattern = TpPatternWSList(
  167. id = new_guid(),
  168. pattern_id=pattern_id,
  169. content=pattern_id,
  170. create_dept = user_id
  171. )
  172. db.add(new_pattern)
  173. db.commit()
  174. for connection in self.active_connections[pattern_id]:
  175. await connection.send_text(message)
  176. manager = ConnectionManager()
  177. @router.websocket("/{pattern_id}/ws")
  178. async def websocket_endpoint(pattern_id:str ,websocket: WebSocket,user_id=Depends(valid_access_token),db: Session = Depends(get_db)):
  179. user_list = [i.user_id for i in pattern_id_get_tp_pattern_ws_user_list(pattern_id, db)]
  180. if user_id not in user_list:
  181. return JSONResponse(status_code=404, content={
  182. 'code': 404,
  183. 'msg': '抱歉,您无权限,请联系系统管理员'
  184. })
  185. await manager.connect(websocket,pattern_id,db)
  186. try:
  187. while True:
  188. data = await websocket.receive_text()
  189. await manager.broadcast(data,pattern_id,user_id,db) # 广播消息给所有连接
  190. except WebSocketDisconnect:
  191. manager.disconnect(websocket,pattern_id)
  192. @router.post("/ws/create")
  193. async def create_pattern(
  194. user_id=Depends(valid_access_token),
  195. body = Depends(remove_xss_json),
  196. db: Session = Depends(get_db)
  197. ):
  198. try:
  199. user_id_list = body['user_id_list']
  200. if user_id not in user_id_list:
  201. user_id_list.append(user_id)
  202. for user in user_id_list:
  203. new_pattern_ws = TpPatternWSUserList(
  204. id=new_guid(),
  205. pattern_id=body['pattern_id'],
  206. user_id=user,
  207. create_dept=user_id
  208. )
  209. db.add(new_pattern_ws)
  210. new_pattern_ws = TpPatternWSList(
  211. id = new_guid(),
  212. pattern_id=body['pattern_id'],
  213. content=body['content'],
  214. create_dept = user_id
  215. )
  216. db.add(new_pattern_ws)
  217. db.commit()
  218. return {"code": 200, "msg": "创建成功", "data": None}
  219. except Exception as e:
  220. traceback.print_exc()
  221. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  222. @router.put("/ws/rollback")
  223. async def rollback_pattern(
  224. user_id=Depends(valid_access_token),
  225. body = Depends(remove_xss_json),
  226. db: Session = Depends(get_db)
  227. ):
  228. try:
  229. user_list = [i.user_id for i in pattern_id_get_tp_pattern_ws_user_list(body['pattern_id'],db)]
  230. if user_id not in user_list:
  231. return JSONResponse(status_code=404, content={
  232. 'code': 404,
  233. 'msg': '抱歉,您无权限,请联系系统管理员'
  234. })
  235. data = pattern_id_get_tp_pattern_ws_info(body['pattern_id'],db)
  236. data.del_flag='2'
  237. data.update_by = user_id
  238. db.commit()
  239. return {"code": 200, "msg": "回滚成功", "data": None}
  240. except Exception as e:
  241. traceback.print_exc()
  242. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  243. @router.get("/ws/list")
  244. async def get_pattern_list(
  245. pattern_name: str = Query(None, description='预案名称'),
  246. page: int = Query(1, gt=0, description='页码'),
  247. pageSize: int = Query(5, gt=0, description='每页条目数量'),
  248. user_id=Depends(valid_access_token),
  249. db: Session = Depends(get_db)
  250. ):
  251. try:
  252. query = db.query(TpPatternWSUserList)
  253. query = query.filter(TpPatternWSUserList.del_flag != '2')
  254. query = query.filter(TpPatternWSUserList.user_id==user_id)
  255. if pattern_name:
  256. query = query.filter(TpPatternWSUserList.pattern_name.like(f'%{pattern_name}%'))
  257. total_items = query.count()
  258. # 排序
  259. query = query.order_by(TpPatternWSUserList.create_time.desc())
  260. # 执行分页查询
  261. patterns = query.offset((page - 1) * pageSize).limit(pageSize).all()
  262. return {"code": 200, "msg": "查询成功", "data": [{"id": p.id,"pattern_id":p.pattern_id, "pattern_name": p.pattern_name} for p in patterns],
  263. "total": total_items,
  264. "page": page,
  265. "pageSize": pageSize,
  266. "totalPages": (total_items + pageSize - 1) // pageSize
  267. }
  268. except Exception as e:
  269. traceback.print_exc()
  270. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  271. @router.put("/ws/delete_user")
  272. async def rollback_pattern(
  273. user_id=Depends(valid_access_token),
  274. body = Depends(remove_xss_json),
  275. db: Session = Depends(get_db)
  276. ):
  277. try:
  278. pattern_info = pattern_id_get_tp_pattern_ws_info(body['pattern_id'],db)
  279. if pattern_info.create_by!=user_id:
  280. return JSONResponse(status_code=404, content={
  281. 'code': 404,
  282. 'msg': '抱歉,您无权限,请联系系统管理员'
  283. })
  284. user = user_id_and_pattern_id_get_tp_pattern_ws_user_info(body['user_id'],body['pattern_id'],db)
  285. user.del_flag='2'
  286. user.update_by = user_id
  287. db.commit()
  288. return {"code": 200, "msg": "关闭协同成功", "data": None}
  289. except Exception as e:
  290. traceback.print_exc()
  291. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  292. @router.put("/ws/delete_user")
  293. async def rollback_pattern(
  294. user_id=Depends(valid_access_token),
  295. body = Depends(remove_xss_json),
  296. db: Session = Depends(get_db)
  297. ):
  298. try:
  299. pattern_info = pattern_id_get_tp_pattern_ws_info(body['pattern_id'],db)
  300. if pattern_info.create_by!=user_id:
  301. return JSONResponse(status_code=404, content={
  302. 'code': 404,
  303. 'msg': '抱歉,您无权限,请联系系统管理员'
  304. })
  305. new_pattern_ws = TpPatternWSUserList(
  306. id=new_guid(),
  307. pattern_id=body['pattern_id'],
  308. user_id=body['user_id'],
  309. create_dept=user_id
  310. )
  311. db.add(new_pattern_ws)
  312. db.commit()
  313. return {"code": 200, "msg": "开启协同成功", "data": None}
  314. except Exception as e:
  315. traceback.print_exc()
  316. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")