feat(投顾): 客户主动申报投顾方案 + 投顾受理自动生成方案草稿
客户在自己主页提交申报 → 投顾工作台受理 → 自动跑既有推荐逻辑生成一份待审核草稿 → 投顾再走既有的「审核通过 → 发送给客户」。补上原先「客户只能被动等方案」的缺口。 后端 - 新增表 advisor_service_request(本轮新建,带 AUTO_INCREMENT)+ 迁移 20260916_advisor_service_request(幂等:先查表再建,兼容本库 alembic 指针滞后) - 新增 AdvisorServiceRequestService:create / list_mine / queue / review · 申报前置:风险测评必须存在且未失效(FM-03,12 个月),服务端判 · 队列复用 ProductRecommendationService._visible_customer_ids(本人 + 归属),待受理排前 · 受理即调用推荐逻辑生成草稿并把 content_id 回填;生成前置失败给出人话原因并保持待受理 · 「已发送客户」不落库,由关联方案 published_at 推导,避免两处状态各写各的 - 权限码 9071-9074(客户 write/read:self、投顾 read/review),已进种子与授权工具 前端 - 投顾工作台新增「客户申报」面板(受理 / 驳回,驳回理由客户可见) - 客户页新增申报表单(金额/期限/风险偏好/备注)与「我的申报」列表 客户自助路由刻意不挂投顾灰度闸门:那是投顾业务的灰度,客户提交自己的申请不该被它拦下。
This commit is contained in:
@@ -93,11 +93,27 @@ const ENDPOINTS = Object.freeze({
|
||||
T008: { method: 'GET', path: '/api/v1/users/me/transactions/{transactionNo}' },
|
||||
T009: { method: 'GET', path: '/api/v1/users/me/cash-ledger' },
|
||||
ADVISOR_PUBLISHED: { method: 'GET', path: '/api/v1/advisor/recommendations/published' },
|
||||
// 历史方案留档(本人 + 名下客户、**全部状态**,含待审/已驳回)。投顾工作台
|
||||
// 「历史方案记录」面板用;与 ADVISOR_PUBLISHED 的区别只在状态口径(后者只给已发布)。
|
||||
ADVISOR_HISTORY: { method: 'GET', path: '/api/v1/advisor/recommendations/history' },
|
||||
// 投顾自助审核/发布自己生成的推荐方案(2026-09-14 起):
|
||||
// 服务层不再额外要求 admin 角色,但仍要求 `product-recommendation:review` /
|
||||
// `product-recommendation:publish` 两个权限码(仅 advisor 与 admin 持有)。
|
||||
ADVISOR_REVIEW_RECOMMENDATION: { method: 'POST', path: '/api/v1/advisor/recommendations/{contentId}/reviews', idempotent: true },
|
||||
ADVISOR_PUBLISH_RECOMMENDATION: { method: 'POST', path: '/api/v1/advisor/recommendations/{contentId}/publications', idempotent: true },
|
||||
// 删除推荐方案(历史记录里的「删除」)。仅推荐方案可删 —— 投资方案书被
|
||||
// `advisor_investment_goal.goal_book_content_id`(NO ACTION 外键)引用,删不掉。
|
||||
// 权限码 `product-recommendation:delete`(advisor 与 admin 持有)。
|
||||
ADVISOR_DELETE_RECOMMENDATION: { method: 'DELETE', path: '/api/v1/advisor/recommendations/{contentId}', idempotent: true },
|
||||
// 客户侧:**本人**已发布的投顾交付物(推荐方案 + 投资方案书)。
|
||||
// 是投顾「发送给客户」的落点,见 `customer/advisor-plans/`。
|
||||
MY_ADVISOR_CONTENTS: { method: 'GET', path: '/api/v1/users/me/advisor-contents' },
|
||||
// 客户**主动申报**投顾方案(本人提交 / 查看自己的申报状态)。
|
||||
MY_ADVISOR_REQUESTS: { method: 'GET', path: '/api/v1/users/me/advisor-requests' },
|
||||
ADVISOR_REQUEST_CREATE: { method: 'POST', path: '/api/v1/users/me/advisor-requests', idempotent: true },
|
||||
// 投顾侧:名下客户的申报队列 + 受理/驳回(**受理会自动生成一份待审方案草稿**)。
|
||||
ADVISOR_SERVICE_REQUESTS: { method: 'GET', path: '/api/v1/advisor/service-requests' },
|
||||
ADVISOR_SERVICE_REQUEST_REVIEW: { method: 'POST', path: '/api/v1/advisor/service-requests/{requestNo}/reviews', idempotent: true },
|
||||
// ⚠️ 保留:前端契约测试(`tests/unit/api/test_portal_frontend.py`)把"页面会用到的端点"
|
||||
// 固定成一张清单,**删注册会破坏它**。它对应 AD002,当前页面确实没调用
|
||||
// (投顾本人没有"自己的投资目标",调它返回 404)—— 但**注册与调用是两件事**。
|
||||
|
||||
Reference in New Issue
Block a user