feat:新增接口
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
"""资金账户相关 DTO。
|
||||
|
||||
金额统一序列化为两位小数字符串(如 "48000.00"),避免 JSON number 的浮点精度隐患。
|
||||
"""
|
||||
from datetime import datetime
|
||||
from decimal import Decimal
|
||||
from typing import Literal
|
||||
|
||||
from pydantic import BaseModel, Field, field_serializer
|
||||
|
||||
|
||||
class BalanceResp(BaseModel):
|
||||
"""用户余额响应体。available_balance = balance - frozen_amount,由 service 派生。"""
|
||||
|
||||
customer_id: int
|
||||
balance: Decimal
|
||||
available_balance: Decimal
|
||||
frozen_amount: Decimal
|
||||
currency: str
|
||||
status: str
|
||||
update_time: datetime | None = None
|
||||
|
||||
@field_serializer("balance", "available_balance", "frozen_amount")
|
||||
def _fmt_money(self, value: Decimal) -> str:
|
||||
return f"{value:.2f}"
|
||||
|
||||
|
||||
class AdjustReq(BaseModel):
|
||||
"""加减余额入参。amount 为正数(元),direction 决定加/减。"""
|
||||
|
||||
direction: Literal["add", "sub"] = Field(
|
||||
..., description="add=入账(充值),sub=出账(提现)"
|
||||
)
|
||||
amount: Decimal = Field(gt=0)
|
||||
@@ -0,0 +1,30 @@
|
||||
"""持仓相关 DTO。
|
||||
|
||||
金额字段序列化为字符串,避免 JSON number 浮点精度隐患;
|
||||
份额 / 盈亏比例保留 4 位,金额保留 2 位。
|
||||
"""
|
||||
from decimal import Decimal
|
||||
|
||||
from pydantic import BaseModel, field_serializer
|
||||
|
||||
|
||||
class HoldingResp(BaseModel):
|
||||
"""单条持仓记录。"""
|
||||
|
||||
id: int
|
||||
customer_id: int
|
||||
product_id: int
|
||||
shares: Decimal
|
||||
cost_amount: Decimal
|
||||
current_value: Decimal
|
||||
profit_loss: Decimal
|
||||
profit_ratio: Decimal
|
||||
status: str
|
||||
|
||||
@field_serializer("shares", "profit_ratio")
|
||||
def _fmt_ratio(self, value: Decimal) -> str:
|
||||
return f"{value:.4f}"
|
||||
|
||||
@field_serializer("cost_amount", "current_value", "profit_loss")
|
||||
def _fmt_money(self, value: Decimal) -> str:
|
||||
return f"{value:.2f}"
|
||||
@@ -0,0 +1,24 @@
|
||||
"""申购相关 DTO。"""
|
||||
from decimal import Decimal
|
||||
|
||||
from pydantic import BaseModel, Field, field_serializer
|
||||
|
||||
from schemas.holdings import HoldingResp
|
||||
|
||||
|
||||
class PurchaseReq(BaseModel):
|
||||
"""申购入参。amount 为正数(元),按净值折算份额。"""
|
||||
|
||||
product_id: int
|
||||
amount: Decimal = Field(gt=0)
|
||||
|
||||
|
||||
class PurchaseResp(BaseModel):
|
||||
"""申购结果:最新余额 + 该产品最新持仓。"""
|
||||
|
||||
balance: Decimal
|
||||
holding: HoldingResp
|
||||
|
||||
@field_serializer("balance")
|
||||
def _fmt_balance(self, value: Decimal) -> str:
|
||||
return f"{value:.2f}"
|
||||
@@ -0,0 +1,24 @@
|
||||
"""赎回相关 DTO。"""
|
||||
from decimal import Decimal
|
||||
|
||||
from pydantic import BaseModel, Field, field_serializer
|
||||
|
||||
from schemas.holdings import HoldingResp
|
||||
|
||||
|
||||
class RedeemReq(BaseModel):
|
||||
"""赎回入参。shares 为正数(份额),按净值折算入账金额。"""
|
||||
|
||||
product_id: int
|
||||
shares: Decimal = Field(gt=0)
|
||||
|
||||
|
||||
class RedeemResp(BaseModel):
|
||||
"""赎回结果:最新余额 + 该产品最新持仓。"""
|
||||
|
||||
balance: Decimal
|
||||
holding: HoldingResp
|
||||
|
||||
@field_serializer("balance")
|
||||
def _fmt_balance(self, value: Decimal) -> str:
|
||||
return f"{value:.2f}"
|
||||
Reference in New Issue
Block a user