用户生成资源容量管控

This commit is contained in:
2026-06-29 13:50:39 +08:00
parent b21f35582e
commit 25fa41f894
21 changed files with 1314 additions and 80 deletions
+2
View File
@@ -1,6 +1,7 @@
from pydantic import BaseModel, Field
from app.schemas.common import NaiveDatetime, NaiveDatetimeOptional
from app.schemas.resource_capacity import ResourceCapacityUsageOut
class CreditAdjustRequest(BaseModel):
@@ -54,6 +55,7 @@ class AdminUserOut(BaseModel):
created_at: NaiveDatetime
last_login_at: NaiveDatetimeOptional = None
allowed_menus: list | None = None
resource_capacity: ResourceCapacityUsageOut | None = None
model_config = {"from_attributes": True}
@@ -0,0 +1,72 @@
from __future__ import annotations
from decimal import Decimal
from pydantic import BaseModel, Field, field_validator, model_validator
from app.enums.resource_capacity import ResourceCapacitySourceEnum, ResourceCapacityUnitEnum
class ResourceCapacityConfigUpdate(BaseModel):
enabled: bool = Field(
...,
description="是否开启容量管控。true=开启,false=关闭。全局配置关闭表示全局不限制;用户配置关闭表示该用户个人明确关闭限制,优先级高于全局。",
examples=[True],
)
limit_value: Decimal | None = Field(
None,
description="容量数值,最小1,不能为负数,最多3位小数。例如:1、10、10.5、10.500。enabled=true 时必填。",
examples=["10.500"],
)
limit_unit: ResourceCapacityUnitEnum | None = Field(
None,
description="容量单位枚举:MB=1024*1024字节,GB=1024*1024*1024字节,TB=1024*1024*1024*1024字节。enabled=true 时必填。",
examples=[ResourceCapacityUnitEnum.GB.value],
)
@field_validator("limit_value")
@classmethod
def validate_limit_value(cls, value: Decimal | None) -> Decimal | None:
if value is None:
return value
if value < Decimal("1"):
raise ValueError("容量数值不能小于1")
if value.as_tuple().exponent < -3:
raise ValueError("容量数值最多支持3位小数")
return value
@model_validator(mode="after")
def validate_enabled_payload(self) -> "ResourceCapacityConfigUpdate":
if self.enabled:
if self.limit_value is None:
raise ValueError("开启容量管控时必须填写容量数值")
if self.limit_unit is None:
raise ValueError("开启容量管控时必须选择容量单位:MB、GB、TB")
return self
class ResourceCapacityConfigOut(BaseModel):
enabled: bool = Field(..., description="是否开启容量管控")
limit_value: str = Field(..., description="容量数值字符串,最多3位小数")
limit_unit: ResourceCapacityUnitEnum = Field(..., description="容量单位枚举:MB、GB、TB")
limit_bytes: int = Field(..., ge=0, description="按单位换算后的字节数")
class ResourceCapacityUsageOut(BaseModel):
enabled: bool = Field(..., description="当前用户最终是否启用容量管控")
source: ResourceCapacitySourceEnum = Field(..., description="最终配置来源:user=用户个人配置,global=全局配置,disabled=容量管控未开启")
has_user_config: bool = Field(..., description="该用户是否存在个人容量配置记录。注意:存在且 enabled=false 表示用户个人明确关闭限制")
used_bytes: int = Field(..., ge=0, description="当前用户已用有效资源容量,来自 UserResourceTotalStat.active_size_bytes")
available_bytes: int | None = Field(None, description="当前用户可用容量字节数。未开启容量管控时为 null")
total_bytes: int | None = Field(None, description="当前用户总容量字节数。未开启容量管控时为 null")
usage_percent: float | None = Field(None, description="当前用户容量使用百分比,未开启容量管控时为 null")
exceeded: bool = Field(..., description="是否已超额。判断规则:enabled=true 且 used_bytes >= total_bytes")
limit_value: str | None = Field(None, description="最终生效容量数值。未开启容量管控时为 null")
limit_unit: ResourceCapacityUnitEnum | None = Field(None, description="最终生效容量单位。未开启容量管控时为 null")
class AdminUserResourceCapacityOut(BaseModel):
has_user_config: bool = Field(..., description="该用户是否已单独设置容量配置")
user_config: ResourceCapacityConfigOut | None = Field(None, description="用户个人容量配置。未单独设置时为 null")
global_config: ResourceCapacityConfigOut = Field(..., description="当前全局容量配置")
effective: ResourceCapacityUsageOut = Field(..., description="该用户最终生效的容量使用数据")
+3
View File
@@ -1,5 +1,7 @@
from pydantic import BaseModel
from app.schemas.resource_capacity import ResourceCapacityUsageOut
class UserOut(BaseModel):
id: str
@@ -12,5 +14,6 @@ class UserOut(BaseModel):
user_type: str = "frontend"
allowed_menus: list | None = None
must_set_password: bool = False
resource_capacity: ResourceCapacityUsageOut | None = None
model_config = {"from_attributes": True}