1) 客服 Agent 四份交付文档 + 构建脚手架:品牌由包装占位 XX科技 / 旧名 南方财富 统一为南方基金(热线 400-889-8899 / 官网 nffund.com),系统名改为「智能服务系统」; 同步追加 §0.4 修订记录行,工程记录行保留原占位字面以支撑硬编码扫描验收。 2) 开发文档:清理 28 份已作废/残留文档(14 份移出归档 + 14 份仓库副本), 新增《文档规整方案与开发前待决事项-2026-09-17》。 3) 客服agent 四份交付文档首次纳入本分支。
44 lines
1.7 KiB
Python
44 lines
1.7 KiB
Python
"""中期记忆有效版本唯一性:memory_unit 增加生成列 `active_memory_key` 与唯一键。
|
|
|
|
依据 `docs/00-新数据库基线设计.md` 第 696 行:同一 `customer_id + memory_key` 可以
|
|
存在历史版本和待验证候选,但只能有一条当前"有效"记录;实现时增加生成列
|
|
`active_memory_key`(仅当状态为有效时返回 `memory_key`,否则返回 `NULL`),并建立
|
|
唯一键 `(customer_id, active_memory_key)`。
|
|
|
|
本迁移只新增列与唯一键,未重命名、删除或修改任何已有字段。
|
|
|
|
MySQL 语法说明:VIRTUAL 生成列允许索引,但不允许显式 DEFAULT 值;NULL 语义由
|
|
CASE 表达式给出(非 active 状态返回 NULL),因此唯一键不会约束历史版本行。
|
|
"""
|
|
from alembic import op
|
|
|
|
revision = "20260909_memory_active_key"
|
|
down_revision = "20260909_constraint_fix"
|
|
branch_labels = None
|
|
depends_on = None
|
|
|
|
TABLE = "memory_unit"
|
|
GENERATED_COLUMN = "active_memory_key"
|
|
UNIQUE_KEY = "uk_memory_unit_customer_active_key"
|
|
# 生成列表达式中的状态值为 docs/00 规定的"有效"状态。
|
|
ACTIVE_STATUS = "active"
|
|
EXPRESSION = f"(CASE WHEN `status` = '{ACTIVE_STATUS}' THEN `memory_key` ELSE NULL END)"
|
|
|
|
|
|
def upgrade() -> None:
|
|
op.execute(
|
|
f"ALTER TABLE `{TABLE}` "
|
|
f"ADD COLUMN `{GENERATED_COLUMN}` VARCHAR(128) "
|
|
f"GENERATED ALWAYS AS {EXPRESSION} VIRTUAL, "
|
|
f"ADD UNIQUE KEY `{UNIQUE_KEY}` (`customer_id`, `{GENERATED_COLUMN}`)"
|
|
)
|
|
|
|
|
|
def downgrade() -> None:
|
|
# 生成列为本次新增,回退时删除;不触碰任何基线已有字段。
|
|
op.execute(
|
|
f"ALTER TABLE `{TABLE}` "
|
|
f"DROP INDEX `{UNIQUE_KEY}`, "
|
|
f"DROP COLUMN `{GENERATED_COLUMN}`"
|
|
)
|