feat(§T): 账户看板 + 场内模拟交易 9 端点(用户自助首版)
新增 §T 用户自助段(docs/05 §19 新号段 7 个 = A×40/C×7/K×4/M×4/O×3/R×4/T×9): - T001 GET /api/v1/users/me/account/dashboard — 账户/资金/持仓/盈亏汇总 - T002 POST /api/v1/users/me/orders — 委托提交(首版 market 立即全额成交) - T003 / T004 / T005 委托列表/详情/撤单 - T006 GET /api/v1/users/me/holdings — 持仓列表(含市值/盈亏/当日盈亏) - T007 / T008 成交记录列表/详情 - T009 GET /api/v1/users/me/cash-ledger — 资金账本 要点(与 docs/00 §6.6 一致): - 首版市价委托立即全额成交,不实现撮合队列/部分成交;T005 撤单首版对任何在场委托返回 ORDER_NOT_CANCELLABLE (409) - 价格来源复用 base FundQuoteService;service 层不二次封装(满足 AGENTS 第 2 条) - 首版风控 3 条硬性:产品可交易、客户适当性、持仓比例上限(fin_market_price 缺失或过期 → 拒绝买入) - 数据库零修改:10 张 fin_* 表全部 docs/00 既定,本批 PR 改列类型与可空性均 0;底座实际偏差(id 无 AUTO_INCREMENT、所谓'生成列'是普通 NOT NULL)由 service _next_id / 业务派生值补偿 注册 API:9 端点均注册进 app.main;user=9001(cust)'s id 写账 权限码(tools/seed_test_rbac.py 同步登记 + CUSTOMER 全量): 9047 account:read:self 9048 trade:order:create 9049 trade:order:read 9050 trade:order:cancel 9051 holding:read:self 9052 trade:txn:read 错误码(app/core/errors.py + docs/05 §3.6 + tests/unit/core/test_errors.py DOCUMENTED 三方同步): 404 ACCOUNT_NOT_FOUND / ORDER_NOT_FOUND 409 ORDER_NOT_CANCELLABLE 422 INSUFFICIENT_FUNDS / INSUFFICIENT_HOLDING / HOLDING_RATIO_EXCEEDED / SUITABILITY_MISMATCH / PRODUCT_NOT_TRADABLE 503 FUND_QUOTE_UNAVAILABLE(可重试) 新增:app/api/controllers/trading.py / app/api/schemas/trading.py / app/service/trade_service.py / tools/seed_sim_account_demo.py / tests/unit/service/test_trade_service.py(unit×8) / tests/contract/test_trading_endpoint_contract.py(contract×11) 修改:app/main.py(挂载 controller) / app/core/errors.py(10 新异常类) / tools/seed_test_rbac.py / docs/05-接口文档.md(§19 T001-T009 + §3.6 9 新码) / tests/unit/core/test_errors.py(DOCUMENTED 同步) 门禁:pytest tests/unit tests/contract 1313 passed (+19 新增) / ruff all clean / 三道守卫全过
This commit is contained in:
@@ -100,6 +100,7 @@ PERMISSIONS: tuple[tuple[int, str, str, str, str], ...] = (
|
||||
(9044, "memory:candidate:confirm", "memory:candidate", "confirm", "self"),
|
||||
(9045, "memory:candidate:review", "memory:candidate", "review", "all"),
|
||||
(9046, "handover:read", "handover", "read", "all"),
|
||||
|
||||
# ---- 9047-9050:风控模块四个权限码 ----
|
||||
# 风控 Service 和 Agent 工具都按这四个权限码失败关闭。此前依赖
|
||||
# `grant_risk_permissions.py` 临时补种,重跑本脚本时会删除 9001-9099 号段内的
|
||||
@@ -136,6 +137,18 @@ PERMISSIONS: tuple[tuple[int, str, str, str, str], ...] = (
|
||||
(9057, "investment-goal:read:customer", "investment-goal", "read", "own_customers"),
|
||||
(9058, "investment-goal:write:customer", "investment-goal", "write", "own_customers"),
|
||||
(9059, "investment-goal:confirm:customer", "investment-goal", "confirm", "own_customers"),
|
||||
|
||||
# ---- 9060-9065:账户看板 + 场内模拟交易(T 段 9 端点) ----
|
||||
# ZSY_develop §T 段(docs/05 §19)用户自助端点的权限码。
|
||||
# Controller 当前不主动 require,但为与"业务契约 = 权限码声明"一致仍登记进
|
||||
# `PERMISSIONS`,同时挂在 `CUSTOMER_PERMISSIONS` 让 customer 角色自带。
|
||||
# 号段续 9060(避开 9047-9059 qyqy 风险/推广/探针/投资目标号段):与 9041-9046 客服二期间隔 1,避免与既有迁移/种子冲突。
|
||||
(9060, "account:read:self", "account", "read", "self"),
|
||||
(9061, "trade:order:create", "trade", "order", "create"),
|
||||
(9062, "trade:order:read", "trade", "order", "read"),
|
||||
(9063, "trade:order:cancel", "trade", "order", "cancel"),
|
||||
(9064, "holding:read:self", "holding", "read", "self"),
|
||||
(9065, "trade:txn:read", "trade", "txn", "read"),
|
||||
)
|
||||
|
||||
# 客户:业务侧自助能力(自己的会话、反馈、转人工、自己的记忆画像)。
|
||||
@@ -144,6 +157,8 @@ CUSTOMER_PERMISSIONS = (
|
||||
9020, 9021, 9022, 9023, 9024, 9025, 9026, 9034,
|
||||
# 客服二期:客户确认/拒绝**自己**的画像候选(服务层按 customer_id 过滤,不越权)。
|
||||
9044,
|
||||
# ZSY §T:账户看板与场内模拟交易(首版仅 customer 角色可用,留 admin 全量)
|
||||
9060, 9061, 9062, 9063, 9064, 9065,
|
||||
)
|
||||
# 风控专员:业务侧只读 + 跨客户记忆 + 审计只读,不含配置写权限。
|
||||
RISK_PERMISSIONS = (
|
||||
|
||||
Reference in New Issue
Block a user