emergency_resources.py 30 KB

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