rescue_units.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. # from fastapi import APIRouter, HTTPException, Depends, Body,Query
  2. from fastapi import APIRouter, Request, Depends, HTTPException, Query, BackgroundTasks
  3. from fastapi.responses import JSONResponse
  4. import os
  5. # from sqlalchemy.orm import Session
  6. from sqlalchemy.orm import Session, joinedload
  7. import xlrd
  8. from database import get_db, get_db_share
  9. from models import *
  10. from typing import List, Optional
  11. from pydantic import BaseModel,Extra, Field
  12. import uuid
  13. from common.security import valid_access_token
  14. from pydantic import BaseModel
  15. from exceptions import AppException, HmacException
  16. from common.security import valid_access_token
  17. import traceback
  18. from utils import *
  19. from common.auth_user import *
  20. from common.db import db_czrz
  21. from sqlalchemy import create_engine, Column, Integer, String, Boolean, MetaData, Table, \
  22. inspect, exists,or_,text,insert,asc,desc
  23. # 目录在文档上传接口写死
  24. UPLOAD_mergefile_PATH = '/data/upload/mergefile'
  25. router = APIRouter()
  26. # 救灾人员单位
  27. # Pydantic 模型
  28. class UnitSchema(BaseModel):
  29. id: int = None
  30. name: str = None
  31. category: str = None
  32. contact_number: str = None
  33. responsible_person: str = None
  34. contact_number: str = None
  35. team_size: int = None
  36. supervisor_unit: str = None
  37. unit_prop: str = None
  38. unit_level: str = None
  39. unit_favor: str = None
  40. supervisor_unit_phone: str = None
  41. supervisor_unit_contact: str = None
  42. responsible_person_phone: str = None
  43. area: str = None
  44. founding_time: str = None
  45. address: str = None
  46. longitude: str = None
  47. latitude: str = None
  48. position: str = None
  49. is_delete: int = 0
  50. class UnitListSchema(BaseModel):
  51. units: List[UnitSchema] = Field(default_factory=list)
  52. class Config:
  53. orm_mode = True
  54. #创建
  55. # @router.post("/")
  56. # def create_units(unit_list_data: UnitListSchema, db: Session = Depends(get_db)):
  57. # units = unit_list_data.units
  58. # if not units: # 确保列表不为空
  59. # raise HTTPException(status_code=400, detail="单位列表不能为空")
  60. # try:
  61. # new_units = [] # 创建一个空列表来存储新对象
  62. # for unit_data in units:
  63. #
  64. # unit_data = unit_data.dict(exclude_none=True)
  65. # unit_data["add_time"] = datetime.now()
  66. # print(unit_data)
  67. # new_unit = RescueUnit(**unit_data)
  68. # db.add(new_unit)
  69. # db.commit()
  70. # db.refresh(new_unit)
  71. # new_units.append(new_unit)
  72. #
  73. # unit_ids = [unit.id for unit in new_units] # 获取所有新对象的ID
  74. # return {"code": 200, "msg": "创建成功", "unit_ids": unit_ids}
  75. # except Exception as e:
  76. # traceback.print_exc()
  77. # db.rollback()
  78. # raise HTTPException(status_code=400, detail=str(e))
  79. #删除
  80. # @router.delete("/{unit_id}")
  81. # def delete_unit(unit_id: int, db: Session = Depends(get_db), user_id=Depends(valid_access_token)):
  82. # unit = db.query(RescueUnit).get(unit_id)
  83. # if not unit:
  84. # raise HTTPException(status_code=404, detail="单位不存在")
  85. # try:
  86. # # 更新 is_delete 字段为 1,而不是删除记录
  87. # unit.is_delete = 1
  88. # db.commit()
  89. # return {"code": 200, "msg": "删除成功"}
  90. # except Exception as e:
  91. # traceback.print_exc()
  92. # db.rollback()
  93. # raise HTTPException(status_code=400, detail=str(e))
  94. @router.delete('/{unit_id}')
  95. async def delete(
  96. request: Request,
  97. unit_id: int,
  98. db: Session = Depends(get_db_share),
  99. body=Depends(remove_xss_json),
  100. user_id=Depends(valid_access_token)
  101. ):
  102. try:
  103. query = db.query(RescueTeams)
  104. query = query.filter(RescueTeams.id == unit_id)
  105. query = query.filter(RescueTeams.del_flag != '2')
  106. unit_to_delete = query.first()
  107. if not unit_to_delete:
  108. return JSONResponse(status_code=404, content={"code": 404, "msg": "该id不存在"})
  109. unit_to_delete.update_by = user_id
  110. unit_to_delete.update_time = datetime.now()
  111. unit_to_delete.del_flag = '2'
  112. db.commit()
  113. return {
  114. "code": 200,
  115. "msg": "菜单删除成功"
  116. }
  117. except Exception as e:
  118. traceback.print_exc()
  119. db.rollback()
  120. return JSONResponse(status_code=404, content={"code": 404, "msg": str(e)})
  121. # class UnitListQueryParams(BaseModel):
  122. # page: int = Field(default=1, gt=0)
  123. # page_size: int = Field(default=10, gt=0)
  124. #查询列表
  125. @router.get("/list")
  126. def get_units(page: int = Query(default=1, gt=0),
  127. pageSize: int = Query(default=10, gt=0),
  128. db: Session = Depends(get_db_share),
  129. user_id=Depends(valid_access_token)):
  130. # 应用过滤条件,仅查询未被删除的单位
  131. data_query = db.query(RescueTeams).filter(RescueTeams.del_flag == '0')
  132. data_query = data_query.order_by(RescueTeams.create_time.desc())
  133. # 计算总数
  134. total_count = data_query.count()
  135. # 分页查询
  136. offset = (page - 1) * pageSize
  137. units = data_query.offset(offset).limit(pageSize).all()
  138. # 构造结果
  139. result_items = [{'id' :unit.id,
  140. 'name' :unit.name,
  141. 'team_type' :unit.team_type,
  142. 'professional_category' :unit.professional_category,
  143. 'team_category' :unit.team_category,
  144. 'team_attribute' :unit.team_attribute,
  145. 'team_level' :unit.team_level,
  146. 'affiliated_unit' :unit.affiliated_unit,
  147. 'leader_name' :unit.leader_name,
  148. 'leader_phone' :unit.leader_phone,
  149. 'city' :unit.city,
  150. 'district' :unit.district,
  151. 'main_equipment' :unit.main_equipment,
  152. 'number_of_people' :unit.number_of_people,
  153. 'address' :unit.address,
  154. 'description' :unit.description,
  155. 'longitude' :unit.longitude,
  156. 'latitude' :unit.latitude,
  157. 's_last_updatetime' :unit.s_last_updatetime} for unit in units]
  158. result = {
  159. "code": 200,
  160. 'msg': '查询成功',
  161. 'total': total_count,
  162. 'totalPages': (total_count + pageSize - 1) // pageSize,
  163. 'page': page,
  164. 'pageSize': pageSize,
  165. 'data': result_items
  166. }
  167. return result
  168. #查询详情
  169. @router.get("/detail/{unit_id}")
  170. def get_unit_by_id(unit_id: int, db: Session = Depends(get_db_share), user_id=Depends(valid_access_token)):
  171. # unit = db.query(Unit).filter(Unit.is_delete == 0).get(unit_id)
  172. unit = db.query(RescueTeams).filter_by(id=unit_id, del_flag='0').first()
  173. if not unit:
  174. raise HTTPException(status_code=404, detail="单位不存在或已被标记为删除")
  175. return {"code": 200, "msg": "查询成功", "unit": {'id' :unit.id,
  176. 'name' :unit.name,
  177. 'team_type' :unit.team_type,
  178. 'professional_category' :unit.professional_category,
  179. 'team_category' :unit.team_category,
  180. 'team_attribute' :unit.team_attribute,
  181. 'team_level' :unit.team_level,
  182. 'affiliated_unit' :unit.affiliated_unit,
  183. 'leader_name' :unit.leader_name,
  184. 'leader_phone' :unit.leader_phone,
  185. 'city' :unit.city,
  186. 'district' :unit.district,
  187. 'main_equipment' :unit.main_equipment,
  188. 'number_of_people' :unit.number_of_people,
  189. 'address' :unit.address,
  190. 'description' :unit.description,
  191. 'longitude' :unit.longitude,
  192. 'latitude' :unit.latitude,
  193. 's_last_updatetime' :unit.s_last_updatetime}}
  194. #修改
  195. @router.put("/edit/{unit_id}")
  196. def update_unit(unit_id: int, update_data: UnitSchema, db: Session = Depends(get_db),
  197. user_id=Depends(valid_access_token)):
  198. return {"code": 404, "msg": "数据由数据整理团队提供,不能修改", "unit": None}
  199. # 根据id和is_delete字段获取单位
  200. # unit = db.query(RescueUnit).filter_by(id=unit_id, is_delete=0).first()
  201. # if not unit:
  202. # raise HTTPException(status_code=404, detail="单位不存在或已被标记为删除")
  203. #
  204. # try:
  205. # # 更新非空字段,排除id字段
  206. # for key, value in update_data.dict(exclude_none=True).items():
  207. # # 确保不更新id字段
  208. # if key != 'id':
  209. # setattr(unit, key, value)
  210. # db.commit()
  211. # db.refresh(unit)
  212. # return {"code": 200, "msg": "更新成功", "unit": unit.to_dict()}
  213. # except Exception as e:
  214. # traceback.print_exc()
  215. # db.rollback()
  216. # raise HTTPException(status_code=400, detail=str(e))
  217. # 导入
  218. @router.post('/import')
  219. async def import_doc(
  220. request: Request,
  221. db: Session = Depends(get_db),
  222. body = Depends(remove_xss_json),
  223. user_id = Depends(valid_access_token)
  224. ):
  225. # print(body)
  226. try:
  227. filename = body['filename']
  228. if len(filename) == 0:
  229. raise Exception()
  230. file = filename[0]
  231. url = file['url']
  232. file_path = f"{UPLOAD_mergefile_PATH}/uploads/{url}"
  233. file_path = os.path.abspath(file_path)
  234. print(file_path)
  235. book = xlrd.open_workbook(file_path)
  236. sheet = book.sheet_by_index(0)
  237. data = []
  238. '''
  239. for i in range(9, sheet.nrows):
  240. # 预案名称
  241. plan_name = sheet.cell(i, 0).value
  242. # 一级目录
  243. title1 = sheet.cell(i, 1).value
  244. # 二级目录
  245. title2 = sheet.cell(i, 2).value
  246. # 三级目录
  247. title3 = sheet.cell(i, 3).value
  248. # 正文
  249. content = sheet.cell(i, 4).value
  250. if len(plan_name) < 1 and len(title1) < 1 and len(title2) < 1 and len(title3) < 1 and len(content) < 1 :
  251. break
  252. data.append({
  253. 'plan_name': plan_name,
  254. 'title1': title1,
  255. 'title2': title2,
  256. 'title3': title3,
  257. 'content': content,
  258. })
  259. if len(data) > 0:
  260. db.query(EmergencyDoc).filter(EmergencyDoc.plan_id == plan_id).delete()
  261. db.commit()
  262. title1 = ''
  263. content = ''
  264. docs = []
  265. for n in data:
  266. if n['title1'] != '':
  267. if len(docs) > 0:
  268. add_doc_1(db, title1, content, docs, plan_id)
  269. docs = []
  270. title1 = n['title1']
  271. content = n['content']
  272. if n['title2'] != '':
  273. docs.append(n)
  274. continue
  275. docs.append(n)
  276. if len(docs) > 0:
  277. add_doc_1(db, title1, content, docs, plan_id)
  278. '''
  279. return {
  280. 'code': 200,
  281. 'msg': '导入成功'
  282. }
  283. except Exception:
  284. traceback.print_exc()
  285. return {
  286. 'code': 500,
  287. 'msg': '导入发生异常'
  288. }