客户在自己主页提交申报 → 投顾工作台受理 → 自动跑既有推荐逻辑生成一份待审核草稿 → 投顾再走既有的「审核通过 → 发送给客户」。补上原先「客户只能被动等方案」的缺口。 后端 - 新增表 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),已进种子与授权工具 前端 - 投顾工作台新增「客户申报」面板(受理 / 驳回,驳回理由客户可见) - 客户页新增申报表单(金额/期限/风险偏好/备注)与「我的申报」列表 客户自助路由刻意不挂投顾灰度闸门:那是投顾业务的灰度,客户提交自己的申请不该被它拦下。
69 lines
2.4 KiB
Python
69 lines
2.4 KiB
Python
"""create advisor_service_request (客户申报 → 投顾受理)
|
|
|
|
新增一张表:客户在「我的投顾方案」页主动申报,投顾在工作台受理/驳回。
|
|
表内**新列全部可空或有业务默认**,不改动任何既有表,因此与基线完全兼容。
|
|
|
|
⚠️ 本表的 `id` 是 `AUTO_INCREMENT`:既有 `fin_*` 表缺自增(`20260914_baseline_auto_increment`
|
|
那次修复之后才补齐),新表直接按现代写法建,不再重复那个坑。
|
|
|
|
幂等:先查 `information_schema` 再建表 —— 本仓库的 alembic 版本指针与实际结构
|
|
历史上就对不上(指针停在 `20260911_adv_profile_tags`),该表可能已被 DDL 手工建过;
|
|
无条件 `CREATE TABLE` 会在这种环境直接失败。
|
|
"""
|
|
|
|
from sqlalchemy import text
|
|
|
|
from alembic import op
|
|
|
|
revision = "20260916_advisor_service_request"
|
|
down_revision = "20260914_baseline_auto_increment"
|
|
branch_labels = None
|
|
depends_on = None
|
|
|
|
CREATE_TABLE = """
|
|
CREATE TABLE `advisor_service_request` (
|
|
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
`request_no` VARCHAR(32) NOT NULL,
|
|
`customer_id` BIGINT UNSIGNED NOT NULL,
|
|
`amount_wan` DECIMAL(14,2) NOT NULL,
|
|
`horizon` VARCHAR(16) NOT NULL,
|
|
`risk_preference` VARCHAR(16) NOT NULL,
|
|
`note` VARCHAR(500) NULL,
|
|
`status` VARCHAR(24) NOT NULL,
|
|
`handled_by` BIGINT UNSIGNED NULL,
|
|
`handled_at` DATETIME NULL,
|
|
`advisor_note` VARCHAR(500) NULL,
|
|
`result_content_id` BIGINT UNSIGNED NULL,
|
|
`created_at` DATETIME NOT NULL,
|
|
`updated_at` DATETIME NOT NULL,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uk_advisor_service_request_no` (`request_no`),
|
|
KEY `idx_advisor_service_request_customer` (`customer_id`, `status`),
|
|
KEY `idx_advisor_service_request_advisor` (`status`, `created_at`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
|
|
COMMENT='客户主动申报的投顾服务申请单'
|
|
"""
|
|
|
|
|
|
def _exists() -> bool:
|
|
bind = op.get_bind()
|
|
return bool(
|
|
bind.execute(
|
|
text(
|
|
"SELECT COUNT(*) FROM information_schema.TABLES "
|
|
"WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'advisor_service_request'"
|
|
)
|
|
).scalar()
|
|
)
|
|
|
|
|
|
def upgrade() -> None:
|
|
if _exists():
|
|
return
|
|
op.execute(CREATE_TABLE)
|
|
|
|
|
|
def downgrade() -> None:
|
|
# 表里是客户主动提交的申请,**不做自动删表**:需要回退请人工确认后执行。
|
|
raise RuntimeError("advisor_service_request must not be dropped automatically")
|