Files
shanxia2.0/openspec/changes/dibang-migration/design.md
T
2026-06-10 22:59:34 +08:00

84 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## Context
原地磅系统源码位于 `simple-dibang-xiaoshou`(FastAPI + SQLModel async + art-design-pro),DDL 快照为 `docs/sql/dibang.sql`。shanxia2.0 已具备 CRM 产品/客户主数据、统一用户权限、报销 bx 子域移植先例。用户确认采用方案 A(主数据仅存名称文本)及五模块移植范围。
**原系统核心表关系**:`db_weighing_slip` → `db_purchase_plan` → `db_inbound_outbound`,保存地磅单时在同一事务内更新计划执行量并生成出入库单。
## Goals / Non-Goals
**Goals:**
- 4 张 `db_*` 表符合 database-conventions(UUID、tenant_no、del_flag、create_time 等)
- 完整移植五模块业务功能及地磅→计划→出入库联动
- 计划按月自动生成定时任务
- web-admin Fresh Mint UI + 菜单权限
- 历史数据可迁移脚本
**Non-Goals:**
- 不移植 cargos/companies/users 表及对应 CRUD 页
- 不引入 product_id/customer_id 外键(方案 A)
- 不做小程序端地磅页面(本期仅 web-admin)
- 不改造 CRM 产品/客户模块本身
- 不保留原地磅独立登录与 JWT 体系
## Decisions
### D1: 表前缀 `db_*` 与子域 `app/api/db/`
**选择**: 业务表 `db_purchase_plan` 等,代码子域 `db`(非 `dibang` 缩写混用)
**理由**: 与 `bx_*`、`crm_*` 命名一致;路由 `/api/.../db/` 简短
**替代**: 表名保留 `purchase_plans` → 违反门户命名规范,弃用
### D2: 主数据方案 A — 文本冗余
**选择**: 业务表继续存 `product`/`cargo_name`/`customer_name` 等 varchar;表单从 CRM 下拉选中后写入名称
**理由**: 与原系统行为一致;避免 CRM 与地磅历史名称不一致导致迁移失败
**替代**: 加 FK 字段 → 改动大、历史数据对齐成本高,用户已拒绝
### D3: 后端参照 bx 子域而非照搬 SQLModel async
**选择**: SQLAlchemy 同步 Session + `DbCrudService` 基类 + 门户 `{ code, data, message }` 响应
**理由**: 与 shanxia2.0 主栈一致;bx 已验证该模式
**替代**: 保留 async SQLModel → 与门户 middleware/CRUD 模式割裂
### D4: 地磅作废保留 `is_voided` 字段
**选择**: 除 `del_flag` 外保留 `is_voided`
**理由**: 作废是业务操作(可回滚计划量),与软删除语义不同;原系统已有此区分
**替代**: 合并为 status 枚举 → 需大范围改前端逻辑,本期不采用
### D5: 前端按 P02 复杂列表 + order 模板页
**选择**: 计划/出入库/地磅单参照 `views/system/order/index.vue`;车辆参照 `unit/index.vue`
**理由**: ui-conventions 模板页要求;原 art-design-pro 样式不可直接复用
**替代**: 复制 art-design-pro 页面 → 违反 Fresh Mint 规范
### D6: 定时任务迁入 APScheduler
**选择**: `app/tasks/db_auto_plan.py`,在 `init_scheduled_tasks` 注册
**理由**: 门户已有 APScheduler;原独立 cron 脚本可退役
**替代**: 保留 shell cron → 运维分散,弃用
## Risks / Trade-offs
- **[名称不一致]** CRM 下拉与历史文本可能不匹配 → 允许手工输入;迁移不强制关联 CRM id
- **[联动回归]** weighing 保存逻辑复杂 → 移植时逐函数对照原 `weighing.py`;验收用原库样例数据
- **[ID 迁移]** int→UUID 关联易错 → 迁移脚本输出映射 CSV 并做 count 校验
- **[单位混用]** t vs kg → 文档与代码注释明确;禁止「优化」换算逻辑
- **[ecosystem 文档]** 归档前需更新 landscape spec → 本 change 含 delta
## Migration Plan
1. 执行 DDL 创建 `db_*` 表(空库可开发联调)
2. 部署后端 db 子域 + 前端页面(菜单权限 SQL)
3. 运行历史数据迁移脚本导入生产数据
4. 并行运行:原系统只读对照验收 1–2 周
5. 切换 DNS/入口至门户;退役原 backend 与 art-design-pro
6. **回滚**: 保留原库快照;门户侧 feature flag 关闭地磅菜单
## Open Questions
- (已关闭)主数据 FK vs 文本 → **方案 A 已确认**
- 生产切换窗口与是否双写:实施阶段与业务方确认