# -*- coding:utf-8 -*- """ @Author : xuxingchen @Contact : xuxingchen@sinochem.com @Desc : 房产信息控制逻辑 """ from typing import Optional from fastapi import APIRouter, Header, Request, Query from pydantic import BaseModel, field_validator, Field from routers.login import authenticate_token from utils import logger from utils.logger import TOKEN_ERROR from utils.database import get_table_handler from models.houses import HousesTable from utils.misc import InvalidException router = APIRouter() class ListsReq(BaseModel): project: str = Field(description="必填项,用于限定项目编号") area: Optional[str] = Field(None, description="可选项,用于限定区域") building: Optional[str] = Field(None, description="可选项,用于限定楼栋") unit: Optional[str] = Field(None, description="可选项,用于限定单元") floor: Optional[str] = Field(None, description="可选项,用于限定楼层") target: str = Field(description="必填项,用于控制输出结果,取值范围:area, building, unit, floor, room") def dict(self, *args, **kwargs): _dict = self.__dict__.copy() for key, value in self.__dict__.items(): if value is None: _dict.pop(key) _dict.pop("target") return _dict @field_validator("target") def validate_target(cls, value): if value not in ["area", "building", "unit", "floor", "room"]: raise InvalidException("请提供正确的请求target [area, building, unit, floor, room]") else: return value @router.get("/projects", summary="获取所有项目列表") async def get_projects_list(request: Request, token: str = Header(...)): """获取项目列表""" if not authenticate_token(token): raise InvalidException(TOKEN_ERROR) th = get_table_handler() projects_list = HousesTable.get_items_by_dynamic_item(th, "project", {}) resp = {"projects": projects_list} logger.Logger.debug(f"{request.url.path} {resp}") return resp @router.post("/project/lists", summary="动态获取房产信息") async def get_items(request: Request, item: ListsReq, token: str = Header(...)): """根据请求获取列表""" if not authenticate_token(token): raise InvalidException(TOKEN_ERROR) th = get_table_handler() item_list = HousesTable.get_items_by_dynamic_item(th, item.target, item.dict()) resp = {f"{item.target.split('_')[0]}s": item_list} logger.Logger.debug(f"{request.url.path} {resp}") return resp @router.get("/getHouseholderCount", summary="获取房产住户数量") async def get_householder_count(request: Request, room_id: str = Query(...), token: str = Header(...)): """根据请求获取对应房屋中当前住户数量""" if not authenticate_token(token): raise InvalidException(TOKEN_ERROR) th = get_table_handler() count = HousesTable.get_householder_count(th, room_id) if count is not None: resp = {"count": count} else: raise InvalidException("room_id 不存在") logger.Logger.debug(f"{request.url.path} {resp}") return resp