决策日期:2026-07-12
适用范围:docs/data-migration/下全部生产数据同步(CRM、报销、地磅)
原则:原系统业务主键 原样迁入 门户库,仅做类型适配(bigint/int→ 同值VARCHAR),不重新生成 UUID。
| 项 | 规则 |
|---|---|
业务表主键 id |
target.id = str(source.id)(十进制字符串,与源数值一致) |
业务外键 *_id |
指向业务实体时:str(source_*_id);指向用户时:见 §3 |
parent_id 等树字段 |
0 → '0';非 0 → str(source_parent_id) |
| 映射文件 | 仍生成 *_id_mapping.csv,多为 恒等映射(source_id = new_id),用于审计与二次移植对账 |
| 脚本实现 | 统一使用 legacy_id_to_str()(参考 migrate_dibang_data.py、migrate_crm_product_category.py) |
示例
源 crm_product.id = 42 → 目标 "42"
源 crm_product.category_id = 1975766458781167617 → 目标 "1975766458781167617"
源地磅 plan.id = 12 → 目标 "12"
str(源值) 写入。id 幂等 SKIP/UPDATE,mapping 即对账表。| 场景 | 处理方式 | 说明 |
|---|---|---|
sys_user(P0 已执行) |
已生成门户 UUID | 以 mappings/user_mapping_result.csv 为准;create_by / owner_user_id / approver_id 等 必须经用户映射转换 |
字典 sys_dict_data.id |
按门户既有主键 | 字典项以 dict_type + dict_value 对齐,不按 sx 的 dict_code 保留 id(见 step-01-dict) |
| 门户已手工录入且 id 冲突 | 步骤文档写明 | 测试库可用 --truncate;生产需人工合并,禁止静默覆盖 |
| 源 id 非纯数字 | 原样字符串写入 | 若超长则按目标列宽截断并记 WARNING |
| 阶段 | 表 / 实体 | 主键策略 |
|---|---|---|
| P0 | sys_user |
❌ 例外:门户 UUID + user_mapping |
| P0 | sys_dept、sys_role |
✅ 若从 sx 导入,优先保留源 id 字符串 |
| P1 CRM | crm_product_category |
✅ 已按本策略实现脚本 |
| P1 CRM | crm_product、crm_customer、crm_clue、商机/报价/合同等 |
✅ 全部 str(source.id) |
| P1 CRM | sys_oss(附件) |
✅ str(oss_id) |
| P2 报销 | bx_* 业务表 |
✅ str(source.id) |
| P3 地磅 | db_* |
✅ 已有脚本,int → 同值字符串 |
每个 migrate_*.py 应:
--dry-runid → SKIP;--update 可覆盖非主键字段--mapping-out 写出恒等或例外映射 CSVphase-*/logs/ 记录「ID 策略:原样保留」共享工具函数(可复制到各脚本或后续抽到 scripts/migration_utils.py):
def legacy_id_to_str(legacy_id) -> str:
if legacy_id is None:
return "0"
return str(int(legacy_id))
docs/superpowers/specs/2026-05-30-crm-migration-design.md §7.1 曾写「bigint → UUID」;生产数据同步以本文档为准。VARCHAR(64);保留源 id 字符串满足类型要求,不要求必须是 UUID 格式。