From 67f29ebbd82c67dfa6657f0fc265a263df69a37f Mon Sep 17 00:00:00 2001 From: aaron <> Date: Wed, 12 Mar 2025 18:24:53 +0800 Subject: [PATCH] update --- app/api/endpoints/community_building.py | 72 ++++++++++++++++++++++-- app/models/community_building.py | 7 ++- jobs.sqlite | Bin 24576 -> 24576 bytes 3 files changed, 74 insertions(+), 5 deletions(-) diff --git a/app/api/endpoints/community_building.py b/app/api/endpoints/community_building.py index 649df72..2fbc178 100644 --- a/app/api/endpoints/community_building.py +++ b/app/api/endpoints/community_building.py @@ -1,20 +1,44 @@ -from fastapi import APIRouter, Depends -from sqlalchemy.orm import Session +from fastapi import APIRouter, Depends, HTTPException, Query +from sqlalchemy.orm import Session, joinedload from typing import List, Optional from app.models.community_building import ( CommunityBuildingDB, CommunityBuildingCreate, CommunityBuildingUpdate, - CommunityBuildingInfo + CommunityBuildingInfo, + CommunityBuildingCreateBatch ) from app.models.community import CommunityDB from app.models.database import get_db -from app.api.deps import get_admin_user +from app.api.deps import get_admin_user, get_current_user from app.models.user import UserDB from app.core.response import success_response, error_response, ResponseModel router = APIRouter() +@router.get("/group_by_community", response_model=ResponseModel) +async def get_buildings_group_by_community( + db: Session = Depends(get_db), + skip: int = 0, + limit: int = 10, + current_user: UserDB = Depends(get_admin_user) +): + """获取楼栋列表,按社区分组""" + query = db.query(CommunityDB.id, CommunityDB.name, CommunityBuildingDB.id, CommunityBuildingDB.building_name).join(CommunityBuildingDB, CommunityBuildingDB.community_id == CommunityDB.id) + results = query.all() + # 按社区分组 + grouped_results = {} + for community_id, community_name, building_id, building_name in results: + if community_id not in grouped_results: + grouped_results[community_id] = { + "community_id": community_id, + "community_name": community_name, + "buildings": [] + } + grouped_results[community_id]["buildings"].append({"building_id": building_id, "building_name": building_name}) + + return success_response(data=list(grouped_results.values())) + @router.get("/list", response_model=ResponseModel) async def get_buildings( community_id: Optional[int] = None, @@ -70,6 +94,46 @@ async def get_buildings( "items": building_list }) +@router.post("/batch", response_model=ResponseModel) +async def create_buildings( + batch: CommunityBuildingCreateBatch, + db: Session = Depends(get_db), + admin: UserDB = Depends(get_admin_user) +): + """批量创建楼栋(管理员)""" + + # 检查社区是否存在 + community = db.query(CommunityDB).filter(CommunityDB.id == batch.community_id).first() + if not community: + return error_response(code=404, message="社区不存在") + + # 批量创建楼栋 + buildings = [] + for building_name in batch.building_names: + building = CommunityBuildingDB(community_id=batch.community_id, building_name=building_name) + buildings.append(building) + db.add_all(buildings) + + try: + db.commit() + # 不要尝试刷新整个列表 + # db.refresh(buildings) + + # 查询刚刚创建的楼栋 + created_buildings = db.query(CommunityBuildingDB).filter( + CommunityBuildingDB.community_id == batch.community_id, + CommunityBuildingDB.building_name.in_(batch.building_names) + ).all() + + # 转换为响应模型 + building_info_list = [CommunityBuildingInfo.model_validate(building) for building in created_buildings] + + return success_response(data=building_info_list) + except Exception as e: + db.rollback() + return error_response(code=500, message=f"创建失败: {str(e)}") + + @router.post("", response_model=ResponseModel) async def create_building( building: CommunityBuildingCreate, diff --git a/app/models/community_building.py b/app/models/community_building.py index d474655..f3198e0 100644 --- a/app/models/community_building.py +++ b/app/models/community_building.py @@ -4,7 +4,7 @@ from sqlalchemy.sql import func from pydantic import BaseModel, Field from .database import Base from datetime import datetime - +from typing import List # 数据库模型 class CommunityBuildingDB(Base): __tablename__ = "community_buildings" @@ -19,6 +19,11 @@ class CommunityBuildingDB(Base): unique_together = [("community_id", "building_name")] # Pydantic 模型 + +class CommunityBuildingCreateBatch(BaseModel): + community_id: int + building_names: List[str] = Field(..., max_length=100) + class CommunityBuildingCreate(BaseModel): community_id: int building_name: str = Field(..., max_length=50) diff --git a/jobs.sqlite b/jobs.sqlite index 80c7aa9903e40328152e84806e2dda648214d635..a9c088bb8ad62aa3e7c3926f76af03be93317126 100644 GIT binary patch delta 19 bcmZoTz}Rqrae_4Cnu#*bjB7R~EQkjHN_+>1 delta 19 bcmZoTz}Rqrae_4CtcfztjI%Z-EQkjHNp1&Z