Files
LoveACE-EndF/router/isim/model.py
2025-09-03 13:00:40 +08:00

141 lines
5.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from typing import List, Optional
from pydantic import BaseModel, Field
from provider.aufe.isim.model import (
BuildingInfo,
FloorInfo,
RoomInfo,
RoomBindingInfo,
ElectricityInfo,
PaymentInfo
)
from router.common_model import BaseResponse
# ==================== 请求模型 ====================
class AuthmeRequest(BaseModel):
"""认证请求基类"""
authme_token: str = Field(..., description="认证令牌")
class SetBuildingRequest(AuthmeRequest):
"""设置楼栋请求"""
building_code: str = Field(..., description="楼栋代码")
class SetFloorRequest(AuthmeRequest):
"""设置楼层请求"""
floor_code: str = Field(..., description="楼层代码")
class SetRoomRequest(AuthmeRequest):
"""设置房间请求"""
building_code: str = Field(..., description="楼栋代码")
floor_code: str = Field(..., description="楼层代码")
room_code: str = Field(..., description="房间代码")
# ==================== 响应模型 ====================
class BuildingListResponse(BaseResponse):
"""楼栋列表响应"""
data: Optional[List[BuildingInfo]] = Field(default=None, description="楼栋信息列表")
@classmethod
def from_data(cls, data: List[BuildingInfo], success_message: str, error_message: str):
"""根据数据创建响应"""
if data and len(data) > 0:
# 检查是否是错误数据(第一个楼栋名称为"请求失败"
if data[0].name == "请求失败":
return cls.error(message=error_message, code=500, data=None)
else:
return cls.success(data=data, message=success_message)
else:
return cls.error(message=error_message, code=500, data=None)
class FloorListResponse(BaseResponse):
"""楼层列表响应"""
data: Optional[List[FloorInfo]] = Field(default=None, description="楼层信息列表")
@classmethod
def from_data(cls, data: List[FloorInfo], success_message: str, error_message: str):
"""根据数据创建响应"""
if data and len(data) > 0:
return cls.success(data=data, message=success_message)
else:
return cls.error(message=error_message, code=500, data=None)
class RoomListResponse(BaseResponse):
"""房间列表响应"""
data: Optional[List[RoomInfo]] = Field(default=None, description="房间信息列表")
@classmethod
def from_data(cls, data: List[RoomInfo], success_message: str, error_message: str):
"""根据数据创建响应"""
if data and len(data) > 0:
return cls.success(data=data, message=success_message)
else:
return cls.error(message=error_message, code=500, data=None)
class RoomBindingResponse(BaseResponse):
"""房间绑定响应"""
data: Optional[RoomBindingInfo] = Field(default=None, description="房间绑定信息")
@classmethod
def from_data(cls, data: Optional[RoomBindingInfo], success_message: str, error_message: str):
"""根据数据创建响应"""
if data and hasattr(data, 'building') and data.building.name != "请求失败":
return cls.success(data=data, message=success_message)
else:
return cls.error(message=error_message, code=500, data=None)
class ElectricityInfoResponse(BaseResponse):
"""电费信息响应"""
data: Optional[ElectricityInfo] = Field(default=None, description="电费信息")
@classmethod
def from_data(cls, data: ElectricityInfo, success_message: str, error_message: str):
"""根据数据创建响应"""
# 检查是否是错误数据
if data.balance.remaining_purchased >= 0 and data.balance.remaining_subsidy >= 0:
return cls.success(data=data, message=success_message)
elif data.balance.remaining_purchased == -2.0 and data.balance.remaining_subsidy == -2.0:
# 未绑定房间的特定错误
return cls.error(message="请先绑定宿舍房间后再查询电费信息", code=400, data=None)
else:
return cls.error(message=error_message, code=500, data=None)
class PaymentInfoResponse(BaseResponse):
"""充值信息响应"""
data: Optional[PaymentInfo] = Field(default=None, description="充值信息")
@classmethod
def from_data(cls, data: PaymentInfo, success_message: str, error_message: str):
"""根据数据创建响应"""
# 检查是否是错误数据
if data.balance.remaining_purchased >= 0 and data.balance.remaining_subsidy >= 0:
return cls.success(data=data, message=success_message)
elif data.balance.remaining_purchased == -2.0 and data.balance.remaining_subsidy == -2.0:
# 未绑定房间的特定错误
return cls.error(message="请先绑定宿舍房间后再查询充值信息", code=400, data=None)
else:
return cls.error(message=error_message, code=500, data=None)
# ==================== 房间绑定状态相关模型 ====================
class RoomBindingStatusData(BaseModel):
"""房间绑定状态数据"""
is_bound: bool = Field(..., description="是否已绑定房间")
binding_info: Optional[RoomBindingInfo] = Field(default=None, description="绑定信息(如果已绑定)")
class RoomBindingStatusResponse(BaseResponse):
"""房间绑定状态响应"""
data: Optional[RoomBindingStatusData] = Field(default=None, description="绑定状态信息")