43 lines
2.2 KiB
Markdown
43 lines
2.2 KiB
Markdown
## Context
|
||
|
||
运输计划归档弹窗(`pl-plan-archive-dialog`)提交走 `POST /transport/plan/{id}/archive`,会写装卸货数量、运费、回传附件,触发库存,并将 `archive_status` 设为 `archived`。未归档计划无法中途保存部分填写内容。
|
||
|
||
## Goals / Non-Goals
|
||
|
||
**Goals:**
|
||
- 未正式归档时可暂存部分归档表单数据,下次打开自动回填
|
||
- 暂存不改库存、不完成计划
|
||
- 列表可区分未归档 / 已暂存 / 已归档
|
||
|
||
**Non-Goals:**
|
||
- localStorage 草稿、多人编辑锁
|
||
- 已归档「调整」模式的暂存
|
||
- 数据库新表或 DDL(`archive_status` 已为 VARCHAR(20))
|
||
|
||
## Decisions
|
||
|
||
1. **状态值 `draft`**:扩展 `archive_status` 为 `unarchived | draft | archived`,暂存时写入 `draft`;正式归档仍写 `archived`。备选「仅写字段不改状态」不利于列表识别,故不采用。
|
||
|
||
2. **独立草稿接口**:`POST .../archive-draft`,body 复用 `PlanArchiveBody`。与正式归档分离,避免误触发库存。
|
||
|
||
3. **同字段持久化**:草稿写入现有 `inbound_qty` / `outbound_qty` / 品牌 / 运费 / 附件字段;打开弹窗沿用现有加载逻辑即可回填。允许空数量(不强制 `_require_qty`)。
|
||
|
||
4. **运费暂存放宽**:`hasFreight=1` 但运输量未填齐时允许保存部分运费字段,跳过「运输量必须大于0」硬校验;正式归档仍严格校验。
|
||
|
||
5. **UI**:仅 `archiveStatus !== 'archived'` 显示「暂存」(Document 图标 + 中性描边);暂存成功后刷新列表状态并关闭弹窗。
|
||
|
||
## Risks / Trade-offs
|
||
|
||
- [Risk] 草稿部分数量被其他报表/导出误当成正式归档数 → Mitigation:导出与库存仅在 `archived` 时视为完成;列表明确「已暂存」
|
||
- [Risk] 运费草稿写入运输单后影响结算草稿 → Mitigation:沿用 `sync_draft_settlement_freight_for_transport`(仅草稿结算),正式结算仍受锁定校验约束
|
||
- [Risk] 产品行不完整提交 → Mitigation:草稿允许子集更新已提交行;缺失行保留库内原值
|
||
|
||
## Migration Plan
|
||
|
||
- 无 DDL;已有 `unarchived` 数据不变
|
||
- 回滚:前端隐藏暂存按钮并下线 draft 接口即可;库中 `draft` 可视为未归档处理
|
||
|
||
## Open Questions
|
||
|
||
- 无(方案 A 已确认)
|