feat:新增接口

This commit is contained in:
2026-09-11 11:05:52 +08:00
parent 2004b8fcf4
commit 78e326db59
18 changed files with 766 additions and 0 deletions
+34
View File
@@ -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)
+30
View File
@@ -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}"
+24
View File
@@ -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}"
+24
View File
@@ -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}"