You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
230 lines
8.6 KiB
Python
230 lines
8.6 KiB
Python
from typing import Literal
|
|
|
|
from pydantic import BaseModel, ConfigDict, Field
|
|
|
|
from app.common.enums import OrderTypeEnum
|
|
|
|
OrderType = OrderTypeEnum # 兼容旧代码的类型别名
|
|
PackageAction = Literal["buy", "renew", "upgrade", "downgrade"]
|
|
PayMethod = Literal["alipay", "wxpay", "free"]
|
|
|
|
|
|
class PackageAvailableItem(BaseModel):
|
|
"""
|
|
可选套餐项
|
|
"""
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
id: int = Field(..., description="套餐ID")
|
|
name: str = Field(..., description="套餐名称")
|
|
price: int = Field(..., ge=0, description="价格(分)")
|
|
period: str = Field(..., description="计费周期(month/year)")
|
|
trial_days: int = Field(default=0, ge=0, description="试用天数")
|
|
max_users: int = Field(default=0, ge=0, description="最大用户数")
|
|
max_roles: int = Field(default=0, ge=0, description="最大角色数")
|
|
max_depts: int = Field(default=0, ge=0, description="最大部门数")
|
|
max_storage_mb: int = Field(default=0, ge=0, description="最大存储(MB)")
|
|
description: str | None = Field(default=None, description="套餐描述")
|
|
is_current: bool = Field(default=False, description="是否为当前套餐")
|
|
available_actions: list[PackageAction] = Field(default_factory=list, description="可执行操作列表")
|
|
|
|
|
|
class PackageAvailableOut(BaseModel):
|
|
"""
|
|
可选套餐列表
|
|
"""
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
current_package_id: int | None = Field(default=None, description="当前套餐ID")
|
|
packages: list[PackageAvailableItem] = Field(default_factory=list, description="可选套餐列表")
|
|
|
|
|
|
class PackagePreviewOut(BaseModel):
|
|
"""
|
|
套餐变更预览结果
|
|
"""
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
current_package: str = Field(default="", description="当前套餐名称")
|
|
target_package: str = Field(default="", description="目标套餐名称")
|
|
action: PackageAction = Field(default="buy", description="操作类型")
|
|
amount: int = Field(default=0, ge=0, description="金额(分)")
|
|
period: str = Field(default="", description="计费周期")
|
|
gained_menus: list[dict] = Field(default_factory=list, description="新增菜单清单")
|
|
lost_menus: list[dict] = Field(default_factory=list, description="移除菜单清单")
|
|
affected_roles: list[str] = Field(default_factory=list, description="受影响的角色名")
|
|
affected_users: int = Field(default=0, ge=0, description="受影响用户数")
|
|
|
|
|
|
class SelfOrderCreate(BaseModel):
|
|
"""
|
|
自助订单创建
|
|
"""
|
|
|
|
package_id: int = Field(..., ge=1, description="套餐ID")
|
|
order_type: PackageAction = Field(..., description="订单类型(buy/renew/upgrade/downgrade)")
|
|
|
|
|
|
class PluginPurchaseCreate(BaseModel):
|
|
"""
|
|
插件购买
|
|
"""
|
|
|
|
plugin_id: int = Field(..., ge=1, description="插件ID")
|
|
pay_method: PayMethod | None = Field(default=None, description="支付方式(alipay/wxpay/free)")
|
|
|
|
|
|
class SelfOrderOut(BaseModel):
|
|
"""
|
|
自助订单创建结果
|
|
"""
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
order_id: int = Field(..., description="订单ID")
|
|
order_no: str = Field(..., description="订单号")
|
|
amount: int = Field(..., ge=0, description="订单金额(分)")
|
|
need_pay: bool = Field(..., description="是否需要支付")
|
|
|
|
|
|
class SelfOrderListItem(BaseModel):
|
|
"""
|
|
我的订单列表项
|
|
"""
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
id: int = Field(..., description="订单ID")
|
|
order_no: str = Field(..., description="订单号")
|
|
package_name: str = Field(default="", description="套餐名称")
|
|
order_type: OrderType = Field(..., description="订单类型")
|
|
amount: int = Field(..., ge=0, description="订单金额(分)")
|
|
status: int = Field(..., description="订单状态(0:待支付 1:已支付 2:已取消 3:已退款)")
|
|
pay_method: str | None = Field(default=None, description="支付方式")
|
|
pay_time: str | None = Field(default=None, description="支付时间")
|
|
created_at: str | None = Field(default=None, description="创建时间")
|
|
|
|
|
|
class SelfOrderListOut(BaseModel):
|
|
"""
|
|
我的订单列表
|
|
"""
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
items: list[SelfOrderListItem] = Field(default_factory=list, description="订单列表")
|
|
total: int = Field(..., ge=0, description="总记录数")
|
|
page_no: int = Field(..., ge=1, description="页码")
|
|
page_size: int = Field(..., ge=1, description="每页数量")
|
|
|
|
|
|
class SelfOrderDetailOut(BaseModel):
|
|
"""
|
|
订单详情
|
|
"""
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
id: int = Field(..., description="订单ID")
|
|
order_no: str = Field(..., description="订单号")
|
|
package_id: int | None = Field(default=None, description="套餐ID")
|
|
package_name: str = Field(default="", description="套餐名称")
|
|
amount: int = Field(..., ge=0, description="订单金额(分)")
|
|
order_type: OrderType = Field(..., description="订单类型")
|
|
status: int = Field(..., description="订单状态(0:待支付 1:已支付 2:已取消 3:已退款)")
|
|
pay_method: str | None = Field(default=None, description="支付方式")
|
|
pay_time: str | None = Field(default=None, description="支付时间")
|
|
created_at: str | None = Field(default=None, description="创建时间")
|
|
|
|
|
|
class WorkspaceTenantInfo(BaseModel):
|
|
"""
|
|
工作台-租户信息
|
|
"""
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
id: int = Field(..., description="租户ID")
|
|
name: str = Field(..., description="租户名称")
|
|
code: str = Field(..., description="租户编码")
|
|
status: int = Field(..., description="租户状态(0:正常 1:宽限期 2:已暂停 3:已冻结 4:已过期 5:已归档)")
|
|
status_label: str = Field(..., description="租户状态描述")
|
|
start_time: str | None = Field(default=None, description="开始时间")
|
|
end_time: str | None = Field(default=None, description="结束时间")
|
|
days_remaining: int = Field(default=0, description="剩余天数")
|
|
|
|
|
|
class WorkspacePackageInfo(BaseModel):
|
|
"""
|
|
工作台-套餐信息
|
|
"""
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
id: int = Field(..., description="套餐ID")
|
|
name: str = Field(..., description="套餐名称")
|
|
price: int = Field(..., ge=0, description="价格(分)")
|
|
period: str = Field(..., description="计费周期")
|
|
max_users: int = Field(..., ge=0, description="最大用户数")
|
|
max_roles: int = Field(..., ge=0, description="最大角色数")
|
|
max_depts: int = Field(..., ge=0, description="最大部门数")
|
|
|
|
|
|
class WorkspaceUsagePercent(BaseModel):
|
|
"""
|
|
工作台-用量百分比
|
|
"""
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
users: float = Field(default=0.0, ge=0, description="用户用量占比(%)")
|
|
roles: float = Field(default=0.0, ge=0, description="角色用量占比(%)")
|
|
depts: float = Field(default=0.0, ge=0, description="部门用量占比(%)")
|
|
|
|
|
|
class WorkspaceQuotaInfo(BaseModel):
|
|
"""
|
|
工作台-配额用量
|
|
"""
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
max_users: int = Field(default=0, ge=0, description="最大用户数")
|
|
max_roles: int = Field(default=0, ge=0, description="最大角色数")
|
|
max_depts: int = Field(default=0, ge=0, description="最大部门数")
|
|
current_users: int = Field(default=0, ge=0, description="当前用户数")
|
|
current_roles: int = Field(default=0, ge=0, description="当前角色数")
|
|
current_depts: int = Field(default=0, ge=0, description="当前部门数")
|
|
usage_percent: WorkspaceUsagePercent = Field(default_factory=WorkspaceUsagePercent, description="用量占比")
|
|
|
|
|
|
class WorkspaceOrderItem(BaseModel):
|
|
"""
|
|
工作台-近期订单项
|
|
"""
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
id: int = Field(..., description="订单ID")
|
|
order_no: str = Field(..., description="订单号")
|
|
amount: int = Field(..., ge=0, description="订单金额(分)")
|
|
order_type: OrderType = Field(..., description="订单类型")
|
|
status: int = Field(..., description="订单状态(0:待支付 1:已支付 2:已取消 3:已退款)")
|
|
created_at: str | None = Field(default=None, description="创建时间")
|
|
|
|
|
|
class WorkspaceOut(BaseModel):
|
|
"""
|
|
工作台概览
|
|
"""
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
tenant: WorkspaceTenantInfo = Field(..., description="租户信息")
|
|
package: WorkspacePackageInfo | None = Field(default=None, description="当前套餐信息")
|
|
quota: WorkspaceQuotaInfo = Field(..., description="配额用量")
|
|
recent_orders: list[WorkspaceOrderItem] = Field(default_factory=list, description="近期订单(最多5条)")
|