emergency_resources.py 28 KB

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