shelters.py 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  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. class ShelterSchema(BaseModel):
  28. id: Optional[int] = None
  29. data_id: Optional[str] = None
  30. admin_area: Optional[str] = None
  31. full_name: Optional[str] = None
  32. address: Optional[str] = None
  33. incident_type: Optional[str] = None
  34. shelter_type: Optional[str] = None
  35. total_area: Optional[float] = None
  36. indoor_area: Optional[float] = None
  37. capacity: Optional[float] = None
  38. supplies: Optional[str] = None
  39. facilities: Optional[str] = None
  40. is_delete: Optional[bool] = False
  41. duration_type: Optional[str] = None
  42. space_type: Optional[str] = None
  43. function_type: Optional[str] = None
  44. construct_type: Optional[str] = None
  45. sponsor: Optional[str] = None
  46. construction_unit: Optional[str] = None
  47. completion_time: Optional[str] = None
  48. planning_situation: Optional[str] = None
  49. total_investment: Optional[str] = None
  50. standard_name: Optional[str] = None
  51. management_number: Optional[str] = None
  52. full_number: Optional[str] = None
  53. property_unit: Optional[str] = None
  54. transportation_investment: Optional[str] = None
  55. channel: Optional[str] = None
  56. identification_department: Optional[str] = None
  57. class Config:
  58. orm_mode = True
  59. class ShelterListSchema(BaseModel):
  60. shelters: List[ShelterSchema] = Field(default_factory=list)
  61. class Config:
  62. orm_mode = True
  63. # 创建
  64. @router.post("/add")
  65. def create_shelters(shelter_list_data: ShelterListSchema, db: Session = Depends(get_db)):
  66. shelters = shelter_list_data.shelters
  67. if not shelters:
  68. raise HTTPException(status_code=400, detail="避难场所列表不能为空")
  69. try:
  70. new_shelters = []
  71. for shelter_data in shelters:
  72. # new_shelter = Shelter(**shelter_data.dict(exclude_none=True))
  73. # new_shelters.append(new_shelter)
  74. shelter_data = shelter_data.dict(exclude_none=True)
  75. n_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
  76. shelter_data["created_time"] = n_time
  77. shelter_data["data_id"] = uuid.uuid1()
  78. new_unit = Shelter(**shelter_data)
  79. db.add(new_unit)
  80. new_shelters.append(new_unit)
  81. db.add_all(new_shelters)
  82. db.commit()
  83. shelter_ids = [shelter.id for shelter in new_shelters]
  84. return {"code": 200, "msg": "创建成功", "shelter_ids": shelter_ids}
  85. except Exception as e:
  86. db.rollback()
  87. raise HTTPException(status_code=400, detail=str(e))
  88. # 删除
  89. @router.delete("/delete/{shelter_id}")
  90. def delete_shelter(shelter_id: int, db: Session = Depends(get_db)):
  91. shelter = db.query(Shelter).filter_by(id=shelter_id, is_delete=0).first()
  92. if not shelter:
  93. raise HTTPException(status_code=404, detail="避难场所不存在")
  94. try:
  95. shelter.is_delete = True
  96. db.commit()
  97. return {"code": 200, "msg": "删除成功"}
  98. except Exception as e:
  99. db.rollback()
  100. raise HTTPException(status_code=400, detail=str(e))
  101. # 查询列表
  102. #
  103. @router.get("/list")
  104. def get_shelters(page: int = Query(default=1, gt=0),
  105. pageSize: int = Query(default=10, gt=0), db: Session = Depends(get_db)):
  106. data_query = db.query(Shelter).filter(Shelter.is_delete == False)
  107. data_query = data_query.order_by(Shelter.created_time.desc())
  108. total_count = data_query.count()
  109. offset = (page - 1) * pageSize
  110. shelters = data_query.offset(offset).limit(pageSize).all()
  111. result_items = [shelter.to_dict() for shelter in shelters]
  112. result = {
  113. "code": 200,
  114. 'msg': '查询成功',
  115. 'total': total_count,
  116. 'totalPages': (total_count + pageSize - 1) // pageSize,
  117. 'page': page,
  118. 'pageSize': pageSize,
  119. 'data': result_items
  120. }
  121. return result
  122. # 查询详情
  123. @router.get("/detail/{shelter_id}")
  124. def get_shelter_by_id(shelter_id: int, db: Session = Depends(get_db)):
  125. shelter = db.query(Shelter).filter_by(id=shelter_id, is_delete=0).first()
  126. if not shelter:
  127. raise HTTPException(status_code=404, detail="避难场所不存在或已被标记为删除")
  128. return {"code": 200, "msg": "查询成功", "shelter": shelter.to_dict()}
  129. # 修改
  130. @router.put("/edit/{shelter_id}")
  131. def update_shelter(shelter_id: int, update_data: ShelterSchema, db: Session = Depends(get_db)):
  132. shelter = db.query(Shelter).filter_by(id=shelter_id, is_delete=False).first()
  133. if not shelter:
  134. raise HTTPException(status_code=404, detail="避难场所不存在或已被标记为删除")
  135. try:
  136. for key, value in update_data.dict(exclude_none=True).items():
  137. if key != 'id':
  138. setattr(shelter, key, value)
  139. shelter.modified_time = datetime.utcnow()
  140. db.commit()
  141. db.refresh(shelter)
  142. return {"code": 200, "msg": "更新成功", "shelter": shelter.to_dict()}
  143. except Exception as e:
  144. db.rollback()
  145. raise HTTPException(status_code=400, detail=str(e))
  146. # 导入
  147. @router.post('/import')
  148. async def import_doc(
  149. request: Request,
  150. db: Session = Depends(get_db),
  151. body = Depends(remove_xss_json),
  152. user_id = Depends(valid_access_token)
  153. ):
  154. # print(body)
  155. try:
  156. filename = body['filename']
  157. if len(filename) == 0:
  158. raise Exception()
  159. file = filename[0]
  160. url = file['url']
  161. file_path = f"{UPLOAD_mergefile_PATH}/uploads/{url}"
  162. file_path = os.path.abspath(file_path)
  163. print(file_path)
  164. book = xlrd.open_workbook(file_path)
  165. sheet = book.sheet_by_index(0)
  166. data = []
  167. '''
  168. for i in range(9, sheet.nrows):
  169. # 预案名称
  170. plan_name = sheet.cell(i, 0).value
  171. # 一级目录
  172. title1 = sheet.cell(i, 1).value
  173. # 二级目录
  174. title2 = sheet.cell(i, 2).value
  175. # 三级目录
  176. title3 = sheet.cell(i, 3).value
  177. # 正文
  178. content = sheet.cell(i, 4).value
  179. if len(plan_name) < 1 and len(title1) < 1 and len(title2) < 1 and len(title3) < 1 and len(content) < 1 :
  180. break
  181. data.append({
  182. 'plan_name': plan_name,
  183. 'title1': title1,
  184. 'title2': title2,
  185. 'title3': title3,
  186. 'content': content,
  187. })
  188. if len(data) > 0:
  189. db.query(EmergencyDoc).filter(EmergencyDoc.plan_id == plan_id).delete()
  190. db.commit()
  191. title1 = ''
  192. content = ''
  193. docs = []
  194. for n in data:
  195. if n['title1'] != '':
  196. if len(docs) > 0:
  197. add_doc_1(db, title1, content, docs, plan_id)
  198. docs = []
  199. title1 = n['title1']
  200. content = n['content']
  201. if n['title2'] != '':
  202. docs.append(n)
  203. continue
  204. docs.append(n)
  205. if len(docs) > 0:
  206. add_doc_1(db, title1, content, docs, plan_id)
  207. '''
  208. return {
  209. 'code': 200,
  210. 'msg': '导入成功'
  211. }
  212. except Exception:
  213. traceback.print_exc()
  214. return {
  215. 'code': 500,
  216. 'msg': '导入发生异常'
  217. }