emergency_resources.py 29 KB

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