emergency_resources.py 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753
  1. from fastapi import APIRouter, HTTPException, Depends, Body
  2. from sqlalchemy.orm import Session
  3. from database import get_db
  4. from models import *
  5. from typing import List, Optional
  6. from pydantic import BaseModel,Extra, Field
  7. import uuid
  8. from common.security import valid_access_token
  9. from pydantic import BaseModel
  10. router = APIRouter()
  11. # 水利工程管理
  12. # Pydantic 模型
  13. class WaterResourceProjectSchema(BaseModel):
  14. id: int = None
  15. jsdwzjlx: str = None
  16. lxfs: str = None
  17. sjtgbmtyshxydm: str = None
  18. jdgljgbm: str = None
  19. cd_time: str = None
  20. sjtgbmmc: str = None
  21. ggmj: str = None
  22. sjtgbmxzqhdm: str = None
  23. jsdwzjhm: str = None
  24. xzqhdm: str = None
  25. cd_operation: str = None
  26. zdmj: str = None
  27. d_bmmc: str = None
  28. etl_time: str = None
  29. jssj: str = None
  30. jsdwmc: str = None
  31. slsshslgcmc: str = None
  32. cd_batch: str = None
  33. slsshslgcdd: str = None
  34. jdgljg: str = None
  35. jingdu: str = None
  36. weidu: str = None
  37. is_delete: int = 0
  38. class WaterResourceProjectListSchema(BaseModel):
  39. projects: List[WaterResourceProjectSchema] = []
  40. class Config:
  41. orm_mode = True
  42. #插入数据
  43. @router.post("/projects/")
  44. def create_projects(project_list_data: WaterResourceProjectListSchema, db: Session = Depends(get_db)):
  45. projects = project_list_data.projects
  46. if not projects: # 确保列表不为空
  47. raise HTTPException(status_code=400, detail="项目列表不能为空")
  48. try:
  49. new_projects = [] # 创建一个空列表来存储新对象
  50. for project_data in projects:
  51. new_project = WaterResourceProject(**project_data.dict(exclude_none=True))
  52. db.add(new_project)
  53. new_projects.append(new_project)
  54. db.commit()
  55. project_ids = [project.id for project in new_projects] # 获取所有新对象的ID
  56. return {"code": 200, "msg": "创建成功", "project_ids": project_ids}
  57. except Exception as e:
  58. db.rollback()
  59. raise HTTPException(status_code=400, detail=str(e))
  60. #删除
  61. @router.delete("/projects/{project_id}/")
  62. def delete_project(project_id: int, db: Session = Depends(get_db), user_id=Depends(valid_access_token)):
  63. project = db.query(WaterResourceProject).get(project_id)
  64. if not project:
  65. raise HTTPException(status_code=404, detail="项目不存在")
  66. try:
  67. # 更新 is_delete 字段为 2,而不是删除记录
  68. project.is_delete = 2
  69. db.commit()
  70. return {"code": 200, "msg": "删除成功"}
  71. except Exception as e:
  72. db.rollback()
  73. raise HTTPException(status_code=400, detail=str(e))
  74. class ProjectListQueryParams(BaseModel):
  75. page: int = Field(default=1, gt=0)
  76. page_size: int = Field(default=10, gt=0)
  77. #查询列表
  78. @router.get("/projects/")
  79. def get_projects(query_params: ProjectListQueryParams, db: Session = Depends(get_db), user_id=Depends(valid_access_token)):
  80. data_query = db.query(WaterResourceProject).filter(WaterResourceProject.is_delete == 0)
  81. # 计算总数
  82. total_count = data_query.count()
  83. # 分页查询
  84. offset = (query_params.page - 1) * query_params.page_size
  85. projects = data_query.offset(offset).limit(query_params.page_size).all()
  86. # 构造结果
  87. result_items = [project.to_dict() for project in projects]
  88. result = {
  89. "code": 200,
  90. 'msg': '查询成功',
  91. 'total': total_count,
  92. 'pages': (total_count + query_params.page_size - 1) // query_params.page_size,
  93. 'currentPage': query_params.page,
  94. 'pageSize': query_params.page_size,
  95. 'data': result_items
  96. }
  97. return result
  98. #查询详情
  99. @router.get("/projects/{project_id}/")
  100. def get_project_by_id(project_id: int, db: Session = Depends(get_db), user_id=Depends(valid_access_token)):
  101. # 添加条件过滤 is_delete 为 0 的项目
  102. project = db.query(WaterResourceProject).filter(WaterResourceProject.is_delete == 0, WaterResourceProject.id == project_id).first()
  103. if not project:
  104. raise HTTPException(status_code=404, detail="项目不存在或已被标记为删除")
  105. return {"code": 200, "msg": "查询成功", "project": project.to_dict()}
  106. #修改
  107. @router.put("/projects/{project_id}/")
  108. def update_project(project_id: int, update_data: WaterResourceProjectSchema, db: Session = Depends(get_db), user_id=Depends(valid_access_token)):
  109. # 创建一个新的查询对象,不包含过滤条件
  110. project = db.query(WaterResourceProject).get(project_id)
  111. if project is None or project.is_delete == 1:
  112. raise HTTPException(status_code=404, detail="项目不存在或已被标记为删除")
  113. try:
  114. # 只更新传入的非空字段
  115. for key, value in update_data.dict(exclude_none=True).items():
  116. setattr(project, key, value)
  117. db.commit()
  118. db.refresh(project)
  119. return {"code": 200, "msg": "更新成功", "project": project.to_dict()}
  120. except Exception as e:
  121. db.rollback()
  122. raise HTTPException(status_code=400, detail=str(e))
  123. # 救灾人员单位
  124. # Pydantic 模型
  125. class UnitSchema(BaseModel):
  126. id: int = None
  127. name: str = None
  128. category: str = None
  129. address: str = None
  130. equipment: str = None
  131. training: str = None
  132. responsible_person: str = None
  133. contact_number: str = None
  134. longitude: float = None
  135. latitude: float = None
  136. is_delete: int = 0
  137. class UnitListSchema(BaseModel):
  138. units: List[UnitSchema] = Field(default_factory=list)
  139. class Config:
  140. orm_mode = True
  141. #创建
  142. @router.post("/rescue_units/")
  143. def create_units(unit_list_data: UnitListSchema, db: Session = Depends(get_db)):
  144. units = unit_list_data.units
  145. if not units: # 确保列表不为空
  146. raise HTTPException(status_code=400, detail="单位列表不能为空")
  147. try:
  148. new_units = [] # 创建一个空列表来存储新对象
  149. for unit_data in units:
  150. new_unit = Unit(**unit_data.dict(exclude_none=True))
  151. db.add(new_unit)
  152. new_units.append(new_unit)
  153. db.commit()
  154. unit_ids = [unit.id for unit in new_units] # 获取所有新对象的ID
  155. return {"code": 200, "msg": "创建成功", "unit_ids": unit_ids}
  156. except Exception as e:
  157. db.rollback()
  158. raise HTTPException(status_code=400, detail=str(e))
  159. #删除
  160. @router.delete("/rescue_units/{unit_id}/")
  161. def delete_unit(unit_id: int, db: Session = Depends(get_db), user_id=Depends(valid_access_token)):
  162. unit = db.query(Unit).get(unit_id)
  163. if not unit:
  164. raise HTTPException(status_code=404, detail="单位不存在")
  165. try:
  166. # 更新 is_delete 字段为 1,而不是删除记录
  167. unit.is_delete = 1
  168. db.commit()
  169. return {"code": 200, "msg": "删除成功"}
  170. except Exception as e:
  171. db.rollback()
  172. raise HTTPException(status_code=400, detail=str(e))
  173. class UnitListQueryParams(BaseModel):
  174. page: int = Field(default=1, gt=0)
  175. page_size: int = Field(default=10, gt=0)
  176. #查询列表
  177. @router.get("/rescue_units/")
  178. def get_units(query_params: UnitListQueryParams, db: Session = Depends(get_db), user_id=Depends(valid_access_token)):
  179. # 应用过滤条件,仅查询未被删除的单位
  180. data_query = db.query(Unit).filter(Unit.is_delete == 0)
  181. # 计算总数
  182. total_count = data_query.count()
  183. # 分页查询
  184. offset = (query_params.page - 1) * query_params.page_size
  185. units = data_query.offset(offset).limit(query_params.page_size).all()
  186. # 构造结果
  187. result_items = [unit.to_dict() for unit in units]
  188. result = {
  189. "code": 200,
  190. 'msg': '查询成功',
  191. 'total': total_count,
  192. 'pages': (total_count + query_params.page_size - 1) // query_params.page_size,
  193. 'currentPage': query_params.page,
  194. 'pageSize': query_params.page_size,
  195. 'data': result_items
  196. }
  197. return result
  198. #查询详情
  199. @router.get("/rescue_units/{unit_id}/")
  200. def get_unit_by_id(unit_id: int, db: Session = Depends(get_db), user_id=Depends(valid_access_token)):
  201. # unit = db.query(Unit).filter(Unit.is_delete == 0).get(unit_id)
  202. unit = db.query(Unit).filter_by(id=unit_id, is_delete=0).first()
  203. if not unit:
  204. raise HTTPException(status_code=404, detail="单位不存在或已被标记为删除")
  205. return {"code": 200, "msg": "查询成功", "unit": unit.to_dict()}
  206. #修改
  207. @router.put("/rescue_units/{unit_id}/")
  208. def update_unit(unit_id: int, update_data: UnitSchema, db: Session = Depends(get_db),
  209. user_id=Depends(valid_access_token)):
  210. # 根据id和is_delete字段获取单位
  211. unit = db.query(Unit).filter_by(id=unit_id, is_delete=0).first()
  212. if not unit:
  213. raise HTTPException(status_code=404, detail="单位不存在或已被标记为删除")
  214. try:
  215. # 更新非空字段,排除id字段
  216. for key, value in update_data.dict(exclude_none=True).items():
  217. # 确保不更新id字段
  218. if key != 'id':
  219. setattr(unit, key, value)
  220. db.commit()
  221. db.refresh(unit)
  222. return {"code": 200, "msg": "更新成功", "unit": unit.to_dict()}
  223. except Exception as e:
  224. db.rollback()
  225. raise HTTPException(status_code=400, detail=str(e))
  226. #救援人员接口
  227. class RescuePersonnelSchema(BaseModel):
  228. id: int = None
  229. name: str = None
  230. contact_number: str = None
  231. gender: str = None
  232. current_address: str = None
  233. position: str = None
  234. unit_id: int = None
  235. is_delete: int = 0
  236. class Config:
  237. orm_mode = True
  238. class RescuePersonnelListSchema(BaseModel):
  239. personnel_list: List[RescuePersonnelSchema] = []
  240. class Config:
  241. orm_mode = True
  242. #创建
  243. @router.post("/rescue_personnel/")
  244. def create_rescue_personnel(personnel_list_data: RescuePersonnelListSchema, db: Session = Depends(get_db)):
  245. personnel_list = personnel_list_data.personnel_list
  246. if not personnel_list: # 确保列表不为空
  247. raise HTTPException(status_code=400, detail="人员列表不能为空")
  248. try:
  249. new_personnel_objects = [] # 创建一个空列表来存储新对象
  250. for personnel_data in personnel_list:
  251. new_personnel = RescuePersonnel(**personnel_data.dict(exclude_none=True))
  252. db.add(new_personnel)
  253. new_personnel_objects.append(new_personnel)
  254. db.commit()
  255. personnel_ids = [personnel.id for personnel in new_personnel_objects] # 获取所有新对象的ID
  256. return {"code": 200, "msg": "创建成功", "personnel_ids": personnel_ids}
  257. except Exception as e:
  258. db.rollback()
  259. raise HTTPException(status_code=400, detail=str(e))
  260. #删除
  261. @router.delete("/rescue_personnel/{personnel_id}/")
  262. def delete_rescue_personnel(personnel_id: int, db: Session = Depends(get_db)):
  263. personnel = db.query(RescuePersonnel).get(personnel_id)
  264. if not personnel:
  265. raise HTTPException(status_code=404, detail="救灾人员不存在")
  266. personnel.is_delete = 1
  267. db.commit()
  268. return {"code": 200, "msg": "删除成功"}
  269. #查询列表
  270. @router.get("/rescue_personnel/")
  271. def get_rescue_personnel(db: Session = Depends(get_db)):
  272. personnels = db.query(RescuePersonnel).filter(RescuePersonnel.is_delete == 0).all()
  273. return {"code": 200, "msg": "查询成功", "data": [personnel.to_dict() for personnel in personnels]}
  274. #查询详情
  275. @router.get("/rescue_personnel/{personnel_id}/")
  276. def get_rescue_personnel_by_id(personnel_id: int, db: Session = Depends(get_db)):
  277. # unit = db.query(Unit).filter_by(id=unit_id, is_delete=0).first()
  278. personnel = db.query(RescuePersonnel).filter_by(id = personnel_id, is_delete = 0).first()
  279. if not personnel:
  280. raise HTTPException(status_code=404, detail="救灾人员不存在或已被标记为删除")
  281. return {"code": 200, "msg": "查询成功", "personnel": personnel.to_dict()}
  282. # @router.put("/rescue_units/{unit_id}/")
  283. # def update_unit(unit_id: int, update_data: UnitSchema, db: Session = Depends(get_db),
  284. # user_id=Depends(valid_access_token)):
  285. # # 根据id和is_delete字段获取单位
  286. # unit = db.query(Unit).filter_by(id=unit_id, is_delete=0).first()
  287. # if not unit:
  288. # raise HTTPException(status_code=404, detail="单位不存在或已被标记为删除")
  289. #
  290. # try:
  291. # # 更新非空字段,排除id字段
  292. # for key, value in update_data.dict(exclude_none=True).items():
  293. # # 确保不更新id字段
  294. # if key != 'id':
  295. # setattr(unit, key, value)
  296. # db.commit()
  297. # db.refresh(unit)
  298. # return {"code": 200, "msg": "更新成功", "unit": unit.to_dict()}
  299. # except Exception as e:
  300. # db.rollback()
  301. # raise HTTPException(status_code=400, detail=str(e))
  302. #修改
  303. @router.put("/rescue_personnel/{personnel_id}/")
  304. def update_rescue_personnel(personnel_id: int, update_data: RescuePersonnelSchema, db: Session = Depends(get_db)):
  305. personnel = db.query(RescuePersonnel).filter_by(id=personnel_id, is_delete=0).first()
  306. if not personnel:
  307. raise HTTPException(status_code=404, detail="救灾人员不存在或已被标记为删除")
  308. try:
  309. # 更新非空字段,排除id字段
  310. for key, value in update_data.dict(exclude_none=True).items():
  311. if key != 'id': # 确保不更新id字段
  312. setattr(personnel, key, value)
  313. personnel.modified_time = datetime.utcnow() # 更新修改时间
  314. db.commit()
  315. db.refresh(personnel)
  316. return {"code": 200, "msg": "更新成功", "personnel": personnel.to_dict()}
  317. except Exception as e:
  318. db.rollback()
  319. raise HTTPException(status_code=400, detail=str(e))
  320. class RescueStationSchema(BaseModel):
  321. id: int = None
  322. fwdx: str = None
  323. data_id: str = uuid.uuid1()
  324. zj: str = None
  325. lng: str = None
  326. cd_time: str = None
  327. fwdmc: str = None
  328. fwnr: str = None
  329. add_time: str = None
  330. cd_operation: str = None
  331. fwdlx: str = None
  332. lxdh: str = None
  333. kfsj: str = None
  334. lat: str = None
  335. fwdjj: str = None
  336. lxr: str = None
  337. fid: str = None
  338. fwdzt: str = None
  339. fwdaddr: str = None
  340. is_delete: int = 0
  341. class Config:
  342. orm_mode = True
  343. class RescueStationListSchema(BaseModel):
  344. stations: List[RescueStationSchema] = Field(default_factory=list)
  345. class Config:
  346. orm_mode = True
  347. #救助站管理
  348. @router.post("/rescue_stations/")
  349. def create_rescue_stations(rescue_station_list_data: RescueStationListSchema, db: Session = Depends(get_db)):
  350. stations = rescue_station_list_data.stations
  351. if not stations: # 确保列表不为空
  352. raise HTTPException(status_code=400, detail="救助站列表不能为空")
  353. try:
  354. new_stations = [] # 创建一个空列表来存储新对象
  355. for station_data in stations:
  356. new_station = RescueStation(**station_data.dict(exclude_none=True))
  357. db.add(new_station)
  358. new_stations.append(new_station)
  359. db.commit()
  360. station_ids = [station.id for station in new_stations] # 获取所有新对象的ID
  361. return {"code": 200, "msg": "创建成功", "station_ids": station_ids}
  362. except Exception as e:
  363. db.rollback()
  364. raise HTTPException(status_code=400, detail=str(e))
  365. @router.delete("/rescue_stations/{station_id}/")
  366. def delete_rescue_station(station_id: int, db: Session = Depends(get_db)):
  367. station = db.query(RescueStation).filter_by(id=station_id, is_delete=0).first()
  368. if not station:
  369. raise HTTPException(status_code=404, detail="救助站不存在")
  370. try:
  371. # 更新 is_delete 字段为 1,而不是删除记录
  372. station.is_delete = 1
  373. db.commit()
  374. return {"code": 200, "msg": "删除成功"}
  375. except Exception as e:
  376. db.rollback()
  377. raise HTTPException(status_code=400, detail=str(e))
  378. class RescueStationListQueryParams(BaseModel):
  379. page: int = Field(default=1, gt=0)
  380. page_size: int = Field(default=10, gt=0)
  381. @router.get("/rescue_stations/")
  382. def get_rescue_stations(query_params: RescueStationListQueryParams, db: Session = Depends(get_db)):
  383. # 应用过滤条件,仅查询未被删除的救助站
  384. data_query = db.query(RescueStation).filter(RescueStation.is_delete == 0)
  385. # 计算总数
  386. total_count = data_query.count()
  387. # 分页查询
  388. offset = (query_params.page - 1) * query_params.page_size
  389. stations = data_query.offset(offset).limit(query_params.page_size).all()
  390. # 构造结果
  391. result_items = [station.to_dict() for station in stations]
  392. result = {
  393. "code": 200,
  394. 'msg': '查询成功',
  395. 'total': total_count,
  396. 'pages': (total_count + query_params.page_size - 1) // query_params.page_size,
  397. 'currentPage': query_params.page,
  398. 'pageSize': query_params.page_size,
  399. 'data': result_items
  400. }
  401. return result
  402. @router.get("/rescue_stations/{station_id}/")
  403. def get_rescue_station_by_id(station_id: int, db: Session = Depends(get_db)):
  404. station = db.query(RescueStation).filter_by(id=station_id, is_delete=0).first()
  405. if not station:
  406. raise HTTPException(status_code=404, detail="救助站不存在或已被标记为删除")
  407. return {"code": 200, "msg": "查询成功", "station": station.to_dict()}
  408. @router.put("/rescue_stations/{station_id}/")
  409. def update_rescue_station(station_id: int, update_data: RescueStationSchema, db: Session = Depends(get_db)):
  410. station = db.query(RescueStation).filter_by(id=station_id, is_delete=0).first()
  411. if not station:
  412. raise HTTPException(status_code=404, detail="救助站不存在或已被标记为删除")
  413. try:
  414. # 更新非空字段,排除id字段
  415. for key, value in update_data.dict(exclude_none=True).items():
  416. # 确保不更新id字段
  417. if key != 'id':
  418. setattr(station, key, value)
  419. db.commit()
  420. db.refresh(station)
  421. return {"code": 200, "msg": "更新成功", "station": station.to_dict()}
  422. except Exception as e:
  423. db.rollback()
  424. raise HTTPException(status_code=400, detail=str(e))
  425. #人防工程基本信息
  426. class DefenseProjectSchema(BaseModel):
  427. id: Optional[int] = None
  428. data_id: Optional[str] = None
  429. gcmc: Optional[str] = None
  430. jsdw: Optional[str] = None
  431. whdw: Optional[str] = None
  432. rfzyjlgcs: Optional[str] = None
  433. jsdd: Optional[str] = None
  434. cd_operation: Optional[str] = None
  435. yjdxsmj: Optional[float] = None
  436. sjdxsmj: Optional[float] = None
  437. cd_time: Optional[datetime] = None
  438. add_time: Optional[datetime] = None
  439. jldw: Optional[str] = None
  440. jsdwdm: Optional[str] = None
  441. kgsj: Optional[datetime] = None
  442. stdw: Optional[str] = None
  443. rfsjdwdm: Optional[str] = None
  444. rfsjdw: Optional[str] = None
  445. ybrs: Optional[float] = None
  446. stdwdm: Optional[str] = None
  447. whdwdm: Optional[str] = None
  448. jldwdm: Optional[str] = None
  449. rfzjlgcs: Optional[str] = None
  450. gcid: Optional[str] = None
  451. extend2: Optional[str] = None
  452. data_area: Optional[str] = None
  453. extend1: Optional[str] = None
  454. jgsj: Optional[datetime] = None
  455. is_delete: Optional[bool] = False
  456. class Config:
  457. orm_mode = True
  458. class DefenseProjectListSchema(BaseModel):
  459. projects: List[DefenseProjectSchema] = Field(default_factory=list)
  460. class Config:
  461. orm_mode = True
  462. # 创建
  463. @router.post("/defense_projects/")
  464. def create_defense_projects(defense_project_list_data: DefenseProjectListSchema, db: Session = Depends(get_db)):
  465. projects = defense_project_list_data.projects
  466. if not projects: # 确保列表不为空
  467. raise HTTPException(status_code=400, detail="项目列表不能为空")
  468. try:
  469. new_projects = [] # 创建一个空列表来存储新对象
  470. for project_data in projects:
  471. new_project = DefenseProject(**project_data.dict(exclude_none=True))
  472. new_projects.append(new_project)
  473. db.add_all(new_projects)
  474. db.commit()
  475. project_ids = [project.id for project in new_projects] # 获取所有新对象的ID
  476. return {"code": 200, "msg": "创建成功", "project_ids": project_ids}
  477. except Exception as e:
  478. db.rollback()
  479. raise HTTPException(status_code=400, detail=str(e))
  480. # 删除
  481. @router.delete("/defense_projects/{project_id}/")
  482. def delete_defense_project(project_id: int, db: Session = Depends(get_db)):
  483. # project = db.query(DefenseProject).get(project_id)
  484. project = db.query(DefenseProject).filter_by(id=project_id, is_delete=0).first()
  485. if not project:
  486. raise HTTPException(status_code=404, detail="项目不存在")
  487. try:
  488. # 更新 is_delete 字段为 True,而不是删除记录
  489. project.is_delete = True
  490. db.commit()
  491. return {"code": 200, "msg": "删除成功"}
  492. except Exception as e:
  493. db.rollback()
  494. raise HTTPException(status_code=400, detail=str(e))
  495. # 查询列表
  496. class DefenseProjectListQueryParams(BaseModel):
  497. page: int = Field(default=1, gt=0)
  498. page_size: int = Field(default=10, gt=0)
  499. @router.get("/defense_projects/")
  500. def get_defense_projects(query_params: DefenseProjectListQueryParams, db: Session = Depends(get_db)):
  501. # 应用过滤条件,仅查询未被删除的项目
  502. data_query = db.query(DefenseProject).filter(DefenseProject.is_delete == False)
  503. # 计算总数
  504. total_count = data_query.count()
  505. # 分页查询
  506. offset = (query_params.page - 1) * query_params.page_size
  507. projects = data_query.offset(offset).limit(query_params.page_size).all()
  508. # 构造结果
  509. result_items = [project.to_dict() for project in projects]
  510. result = {
  511. "code": 200,
  512. 'msg': '查询成功',
  513. 'total': total_count,
  514. 'pages': (total_count + query_params.page_size - 1) // query_params.page_size,
  515. 'currentPage': query_params.page,
  516. 'pageSize': query_params.page_size,
  517. 'data': result_items
  518. }
  519. return result
  520. # 查询详情
  521. @router.get("/defense_projects/{project_id}/")
  522. def get_defense_project_by_id(project_id: int, db: Session = Depends(get_db)):
  523. # project = db.query(DefenseProject).filter_by(id=project_id, is_delete=0).first()
  524. project = db.query(DefenseProject).filter_by(id=project_id, is_delete=0).first()
  525. if not project:
  526. raise HTTPException(status_code=404, detail="项目不存在或已被标记为删除")
  527. return {"code": 200, "msg": "查询成功", "project": project.to_dict()}
  528. # 修改
  529. @router.put("/defense_projects/{project_id}/")
  530. def update_defense_project(project_id: int, update_data: DefenseProjectSchema, db: Session = Depends(get_db)):
  531. project = db.query(DefenseProject).filter_by(id=project_id, is_delete=False).first()
  532. if not project:
  533. raise HTTPException(status_code=404, detail="项目不存在或已被标记为删除")
  534. try:
  535. # 更新非空字段,排除id字段
  536. for key, value in update_data.dict(exclude_none=True).items():
  537. # 确保不更新id字段
  538. if key != 'id':
  539. setattr(project, key, value)
  540. project.cd_time = datetime.utcnow() # 更新修改时间
  541. db.commit()
  542. db.refresh(project)
  543. return {"code": 200, "msg": "更新成功", "project": project.to_dict()}
  544. except Exception as e:
  545. db.rollback()
  546. raise HTTPException(status_code=400, detail=str(e))
  547. #避难场所接口
  548. class ShelterSchema(BaseModel):
  549. id: Optional[int] = None
  550. data_id: Optional[str] = None
  551. admin_area: Optional[str] = None
  552. full_name: Optional[str] = None
  553. address: Optional[str] = None
  554. incident_type: Optional[str] = None
  555. shelter_type: Optional[str] = None
  556. total_area: Optional[float] = None
  557. indoor_area: Optional[float] = None
  558. capacity: Optional[float] = None
  559. supplies: Optional[str] = None
  560. facilities: Optional[str] = None
  561. is_delete: Optional[bool] = False
  562. class Config:
  563. orm_mode = True
  564. class ShelterListSchema(BaseModel):
  565. shelters: List[ShelterSchema] = Field(default_factory=list)
  566. class Config:
  567. orm_mode = True
  568. # 创建
  569. @router.post("/shelters/")
  570. def create_shelters(shelter_list_data: ShelterListSchema, db: Session = Depends(get_db)):
  571. shelters = shelter_list_data.shelters
  572. if not shelters:
  573. raise HTTPException(status_code=400, detail="避难场所列表不能为空")
  574. try:
  575. new_shelters = []
  576. for shelter_data in shelters:
  577. new_shelter = Shelter(**shelter_data.dict(exclude_none=True))
  578. new_shelters.append(new_shelter)
  579. db.add_all(new_shelters)
  580. db.commit()
  581. shelter_ids = [shelter.id for shelter in new_shelters]
  582. return {"code": 200, "msg": "创建成功", "shelter_ids": shelter_ids}
  583. except Exception as e:
  584. db.rollback()
  585. raise HTTPException(status_code=400, detail=str(e))
  586. # 删除
  587. @router.delete("/shelters/{shelter_id}/")
  588. def delete_shelter(shelter_id: int, db: Session = Depends(get_db)):
  589. shelter = db.query(Shelter).filter_by(id=shelter_id, is_delete=0).first()
  590. if not shelter:
  591. raise HTTPException(status_code=404, detail="避难场所不存在")
  592. try:
  593. shelter.is_delete = True
  594. db.commit()
  595. return {"code": 200, "msg": "删除成功"}
  596. except Exception as e:
  597. db.rollback()
  598. raise HTTPException(status_code=400, detail=str(e))
  599. # 查询列表
  600. class ShelterListQueryParams(BaseModel):
  601. page: int = Field(default=1, gt=0)
  602. page_size: int = Field(default=10, gt=0)
  603. @router.get("/shelters/")
  604. def get_shelters(query_params: ShelterListQueryParams, db: Session = Depends(get_db)):
  605. data_query = db.query(Shelter).filter(Shelter.is_delete == False)
  606. total_count = data_query.count()
  607. offset = (query_params.page - 1) * query_params.page_size
  608. shelters = data_query.offset(offset).limit(query_params.page_size).all()
  609. result_items = [shelter.to_dict() for shelter in shelters]
  610. result = {
  611. "code": 200,
  612. 'msg': '查询成功',
  613. 'total': total_count,
  614. 'pages': (total_count + query_params.page_size - 1) // query_params.page_size,
  615. 'currentPage': query_params.page,
  616. 'pageSize': query_params.page_size,
  617. 'data': result_items
  618. }
  619. return result
  620. # 查询详情
  621. @router.get("/shelters/{shelter_id}/")
  622. def get_shelter_by_id(shelter_id: int, db: Session = Depends(get_db)):
  623. shelter = db.query(Shelter).filter_by(id=shelter_id, is_delete=0).first()
  624. if not shelter:
  625. raise HTTPException(status_code=404, detail="避难场所不存在或已被标记为删除")
  626. return {"code": 200, "msg": "查询成功", "shelter": shelter.to_dict()}
  627. # 修改
  628. @router.put("/shelters/{shelter_id}/")
  629. def update_shelter(shelter_id: int, update_data: ShelterSchema, db: Session = Depends(get_db)):
  630. shelter = db.query(Shelter).filter_by(id=shelter_id, is_delete=False).first()
  631. if not shelter:
  632. raise HTTPException(status_code=404, detail="避难场所不存在或已被标记为删除")
  633. try:
  634. for key, value in update_data.dict(exclude_none=True).items():
  635. if key != 'id':
  636. setattr(shelter, key, value)
  637. shelter.modified_time = datetime.utcnow()
  638. db.commit()
  639. db.refresh(shelter)
  640. return {"code": 200, "msg": "更新成功", "shelter": shelter.to_dict()}
  641. except Exception as e:
  642. db.rollback()
  643. raise HTTPException(status_code=400, detail=str(e))