classification.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  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,valid_websocket_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. from utils.ry_system_util import *
  18. from common.websocketManager import *
  19. import json
  20. import xlrd,os
  21. import traceback
  22. router = APIRouter()
  23. def classification_id_get_classification_info(db,id):
  24. query = db.query(TpPatternClassification)
  25. query = query.filter_by(classification_id = id,del_flag = '0')
  26. return query.first()
  27. def template_id_get_classification_list(db,id):
  28. query = db.query(TpPatternClassification)
  29. query = query.filter_by(template_id = id,del_flag = '0')
  30. query = query.order_by(TpPatternClassification.order_num.asc())
  31. return query.all()
  32. def template_id_get_template_info(db,id):
  33. query = db.query(TpPatternTemplate)
  34. query = query.filter_by(template_id = id,del_flag = '0')
  35. return query.first()
  36. @router.post('/createImport')
  37. async def create_contact(
  38. request: Request,
  39. db: Session = Depends(get_db),
  40. body=Depends(remove_xss_json),
  41. auth_user: AuthUser = Depends(find_auth_user),
  42. user_id=Depends(valid_access_token)
  43. ):
  44. try:
  45. # 提取请求数据
  46. filename = body['filename']
  47. # file_name_desc = body['file_name_desc']
  48. template_id = body['template_id']
  49. if len(filename) == 0:
  50. raise Exception()
  51. file_path = f'/data/upload/mergefile/uploads/{filename}'
  52. # 检查文件是否存在
  53. if not os.path.isfile(file_path):
  54. return JSONResponse(status_code=404, content={
  55. 'errcode': 404,
  56. 'errmsg': f'{filename}不存在'
  57. })
  58. msg = '成功'
  59. code =200
  60. try:
  61. book = xlrd.open_workbook(file_path)
  62. sheet = book.sheet_by_index(0)
  63. except Exception as e:
  64. traceback.print_exc()
  65. msg = f'\n文件打开失败,请核实文件格式为xlsx/xlx>{str(e)}'
  66. code = 500
  67. return JSONResponse(status_code=code, content={
  68. "code": code,
  69. "msg": msg,
  70. "data": None
  71. })
  72. data = []
  73. import_status = True
  74. for row in range(1, sheet.nrows):
  75. name = sheet.cell(row, 0).value
  76. if name == '' or name==0:
  77. import_status = False
  78. msg = f'\n行<{row + 1}>模型名称不能为空<{name}>'
  79. code = 500
  80. value = sheet.cell(row, 1).value
  81. if value == '':
  82. import_status = False
  83. msg = f'\n行<{row + 1}>模型值不能为空<{value}>'
  84. code = 500
  85. new_classification = TpPatternClassification(
  86. classification_id=new_guid(),
  87. template_id=body['template_id'],
  88. name=body['name'],
  89. value=body['value'],
  90. order_num=0,
  91. visible='1',
  92. image=body['image'],
  93. icon=body['icon'],
  94. size=body['size'],
  95. create_by=user_id
  96. )
  97. data.append(new_classification)
  98. if import_status:
  99. db.add_all(data)
  100. db.commit()
  101. except Exception as e:
  102. traceback.print_exc()
  103. # 处理异常
  104. db.rollback()
  105. code = 500
  106. msg = str(e)
  107. return JSONResponse(status_code=code, content={
  108. "code": code,
  109. "msg": msg,
  110. "data": None
  111. })
  112. @router.post("/create")
  113. async def create_pattern(
  114. user_id=Depends(valid_access_token),
  115. body = Depends(remove_xss_json),
  116. db: Session = Depends(get_db)
  117. ):
  118. try:
  119. if 'order_num' in body:
  120. order_num=body['order_num']
  121. else:
  122. info = db.query(func.max(TpPatternClassification.order_num).label('max_value')).filter_by(template_id=body['template_id']).first()
  123. if info.max_value:
  124. order_num=info.max_value+1
  125. else:
  126. order_num=1
  127. if 'visible'in body:
  128. visible=body['visible']
  129. else:
  130. visible='1'
  131. new_classification = TpPatternClassification(
  132. classification_id=new_guid(),
  133. template_id=body['template_id'],
  134. name=body['name'],
  135. value=body['value'],
  136. order_num = order_num,
  137. visible=visible,
  138. image=body['image'],
  139. icon=body['icon'],
  140. size=body['size'],
  141. create_by = user_id
  142. )
  143. db.add(new_classification)
  144. db.commit()
  145. return {"code": 200, "msg": "创建成功", "data": None}
  146. except Exception as e:
  147. traceback.print_exc()
  148. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  149. @router.put("/update/{id}")
  150. async def update_classification(
  151. id :str ,
  152. user_id=Depends(valid_access_token),
  153. body=Depends(remove_xss_json),
  154. db: Session = Depends(get_db)
  155. ):
  156. try:
  157. update_classification = classification_id_get_classification_info(db,id)
  158. if not update_classification:
  159. return JSONResponse(status_code=404,content={"code":404,"msg":"classification not found"})
  160. update_classification.template_id = body['template_id']
  161. update_classification.name = body['name']
  162. update_classification.value=body['value']
  163. update_classification.order_num=body['order_num']
  164. update_classification.visible=body['visible']
  165. update_classification.image=body['image']
  166. update_classification.icon=body['icon']
  167. update_classification.size=body['size']
  168. update_classification.update_by = user_id
  169. db.commit()
  170. return {"code": 200, "msg": "更新成功"}
  171. except Exception as e:
  172. traceback.print_exc()
  173. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  174. @router.get("/info/{id}")
  175. async def get_pattern_info(
  176. id: str,
  177. db: Session = Depends(get_db)
  178. ):
  179. try:
  180. info = classification_id_get_classification_info(db,id)
  181. if not info:
  182. return JSONResponse(status_code=404,content={"code":404,"msg":"classification not found"})
  183. template_info = template_id_get_template_info(db,info.template_id)
  184. data = {"classification_id": info.classification_id,
  185. "template_id": info.template_id,
  186. "template_name":template_info.name,
  187. "name": info.name,
  188. "value": info.value,
  189. "order_num": info.order_num,
  190. "visible": info.visible,
  191. "image": info.image,
  192. "icon": info.icon,
  193. "size": info.size,
  194. "create_time": info.create_time}
  195. return {"code": 200, "msg": "获取成功", "data": data}
  196. except Exception as e:
  197. traceback.print_exc()
  198. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  199. @router.get("/list")
  200. async def get_pattern_list(
  201. name: str = Query(None, description='名称'),
  202. page: int = Query(1, gt=0, description='页码'),
  203. pageSize: int = Query(None, gt=0, description='每页条目数量'),
  204. db: Session = Depends(get_db)
  205. ):
  206. try:
  207. query = db.query(TpPatternClassification)
  208. query = query.filter_by(del_flag='0')
  209. if name:
  210. query = query.filter(TpPatternClassification.name.like(f'%{name}%'))
  211. total_items = query.count()
  212. # 排序
  213. if pageSize is None:
  214. pageSize=total_items
  215. query = query.order_by(TpPatternClassification.order_num.asc())
  216. # 执行分页查询
  217. lists = query.offset((page - 1) * pageSize).limit(pageSize).all()
  218. data = [ ]
  219. for info in lists:
  220. template_info = template_id_get_template_info(db, info.template_id)
  221. data.append({"classification_id": info.classification_id,
  222. "template_id": info.template_id,
  223. "template_name":template_info.name,
  224. "name": info.name,
  225. "value": info.value,
  226. "order_num": info.order_num,
  227. "visible": info.visible,
  228. "image": info.image,
  229. "icon": info.icon,
  230. "size": info.size,
  231. "create_time": info.create_time})
  232. return {"code": 200, "msg": "查询成功", "data": data,
  233. "total": total_items,
  234. "page": page,
  235. "pageSize": pageSize,
  236. "totalPages": (total_items + pageSize - 1) // pageSize
  237. }
  238. except Exception as e:
  239. traceback.print_exc()
  240. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  241. @router.delete("/delete/{id}")
  242. async def delete_pattern(
  243. id: str,
  244. db: Session = Depends(get_db)
  245. ):
  246. try:
  247. # 检查图案是否存在
  248. info = classification_id_get_classification_info(db, id)
  249. if not info:
  250. return JSONResponse(status_code=404, content={"code": 404, "msg": "classification not found"})
  251. info.del_flag='2'
  252. db.commit()
  253. return {"code": 200, "msg": "删除成功"}
  254. except Exception as e:
  255. traceback.print_exc()
  256. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  257. @router.put('/changeVisible')
  258. async def change_classification_visible(
  259. db: Session = Depends(get_db),
  260. body=Depends(remove_xss_json),
  261. user_id=Depends(valid_access_token)
  262. ):
  263. try:
  264. classification_id = body['classification_id']
  265. visible = body['visible']
  266. info = classification_id_get_classification_info(db, classification_id)
  267. if not info:
  268. return JSONResponse(status_code=404, content={"code": 404, "msg": "classification not found"})
  269. info.visible= visible
  270. info.update_by=user_id
  271. db.commit()
  272. return {
  273. "code": 200,
  274. "msg": "操作成功"
  275. }
  276. except Exception as e:
  277. # 处理异常
  278. traceback.print_exc()
  279. raise HTTPException(status_code=500, detail=str(e))
  280. @router.get("/templateTree")
  281. async def get_pattern_list(
  282. visible: str = Query(None, description='是否显示'),
  283. # page: int = Query(1, gt=0, description='页码'),
  284. # pageSize: int = Query(None, gt=0, description='每页条目数量'),
  285. db: Session = Depends(get_db)
  286. ):
  287. try:
  288. query = db.query(TpPatternTemplate)
  289. query = query.filter_by(del_flag='0')
  290. if visible is not None:
  291. query = query.filter_by(visible=visible)
  292. # if name:
  293. # query = query.filter(TpPatternTemplate.name.like(f'%{name}%'))
  294. # total_items = query.count()
  295. # # 排序
  296. # if pageSize is None:
  297. # pageSize=total_items
  298. query = query.order_by(TpPatternTemplate.order_num.asc())
  299. # 执行分页查询
  300. lists = query.all() # .offset((page - 1) * pageSize).limit(pageSize)
  301. data = []
  302. for info in lists:
  303. # print(1111)
  304. query1 = db.query(TpPatternClassification)
  305. query1 = query1.filter_by(template_id=info.template_id, del_flag='0')
  306. if visible is not None:
  307. query1 = query1.filter_by(visible=visible)
  308. query1 = query1.order_by(TpPatternClassification.order_num.asc())
  309. classification_list = query1.all()
  310. # =template_id_get_classification_list(db,info.template_id)
  311. template_info = {"template_id": info.template_id,
  312. "name": info.name,
  313. "value": info.value,
  314. "order_num": info.order_num,
  315. "visible": info.visible,
  316. "create_time": info.create_time}
  317. if classification_list:
  318. template_info['children']=[{"classification_id": classification.classification_id,
  319. "name": classification.name,
  320. "value": classification.value,
  321. "order_num": classification.order_num,
  322. "visible": classification.visible,
  323. "image": classification.image,
  324. "icon": classification.icon,
  325. "size": classification.size,
  326. "create_time": classification.create_time} for classification in classification_list]
  327. data.append(template_info)
  328. return {"code": 200, "msg": "查询成功", "data": data}
  329. except Exception as e:
  330. traceback.print_exc()
  331. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")