feat:用户画像功能

This commit is contained in:
2026-09-14 00:19:31 +08:00
parent cf8fcf63c9
commit a7f9e182a4
17 changed files with 971 additions and 37 deletions
+5 -5
View File
@@ -17,6 +17,7 @@ from repositories.fin_product import FinProductRepo
from repositories.trade_order import TradeOrderRepo
from schemas.holdings import HoldingResp
from schemas.purchase import PurchaseResp
from service.memory.composed_profile import invalidate_composed_profile
from service.risk.engine import RiskEngine, summarize
from service.risk.settle import settle
from utils.exceptions import (
@@ -30,11 +31,8 @@ from utils.order_no import gen_order_no
_MONEY = Decimal("0.01")
_SHARES = Decimal("0.0001")
# 风险等级 → 序号。兼容两套口径:R1~R5 与 保守~激进(同一映射)。
_RISK_RANK = {
"R1": 1, "R2": 2, "R3": 3, "R4": 4, "R5": 5,
"保守": 1, "稳健": 2, "平衡": 3, "进取": 4, "激进": 5,
}
# 风险等级 → 序号。客户画像与产品统一 R1~R5 口径(历史中文等级已在数据迁移中转换)。
_RISK_RANK = {"R1": 1, "R2": 2, "R3": 3, "R4": 4, "R5": 5}
def _risk_rank(level: str | None) -> int | None:
@@ -137,6 +135,8 @@ async def purchase(
order.id, status="已确认", confirm_time=now
)
await db.commit()
# 持仓变更后失效最终画像缓存(失败静默,不影响交易结果)
await invalidate_composed_profile(user.id)
account = await account_repo.get_by_customer_id(user.id)
holding = await holdings_repo.get_by_customer_product(user.id, product_id)
return PurchaseResp(