ForgeFlow-ERP/docs/superpowers/specs/2026-06-13-system-wide-paper-document-unification-design.md
2026-06-14 21:05:49 +08:00

14 KiB
Raw Blame History

全系统纸质单据统一改造设计

背景

系统已经开始从普通后台表单向正式业务单据升级:销售订单、采购订单已经接入 DocumentPaper 纸质单据和 PDF 归档;仓库中的 原材料库 · 客料入库单 已被用户认可为“模板级别”;生产余料入库单 / 生产废料入库单 第一阶段也已经开始改成同一套纸质单据语言。

用户明确补充:这不是仓库专属改造,而是全系统所有“单据型业务”都要采用统一纸质单据体系。为了避免仓库、采购、销售、生产各自长出不同样式,本设计把目标升级为“全系统业务单据纸质化 + PDF 归档统一体系”。

单据边界

纳入纸质化的对象

满足任一条件就纳入:

  • 会创建正式业务凭证:销售订单、采购订单、到货入库单、质量校验单、发货单、退货/返工单。
  • 会改变库存或形成库存流水:各库入库、出库、特殊调整、盘库。
  • 会形成生产追溯闭环:生产出库、生产台账入库、生产入库结算、生产领料出库。
  • 用户后续需要预览、下载、批量下载或审计留档。

不纳入纸质化的对象

这些仍按系统管理/主数据维护表单处理,不强行改成纸质单据:

  • 供应商名录、客户名录、人员管理、设备管理。
  • 原材料名录、产品管理、产品需规清单、BOM、工艺路线。
  • 系统权限、系统拓展、导入工具、基础配置。

原因:这些是主数据或配置记录,不是业务凭证。强行纸质化会降低维护效率,也会把“单据”的正式感稀释掉。

现状清单

已基本纸质化且已有 PDF 归档

模块 页面 单据 前端状态 后端归档类型 备注
订单与计划 SalesPlanningView.vue 销售订单 使用 DocumentPaperDocumentLineTableDocumentArchiveActions 销售订单 已有预览、下载、重新生成、批量下载
采购与库存 PurchaseOrderView.vue 采购订单 使用 DocumentPaperDocumentArchiveActions 采购订单 已有预览、下载、重新生成、批量下载
采购与库存 PurchaseReceiptView.vue 到货入库单 使用 DocumentPaperDocumentArchiveActions 到货入库单 新增到货入库已纸质化
采购与库存 QualityInspectionView.vue 质量校验单 使用 DocumentPaperDocumentLineTableDocumentArchiveActions 质量校验单 质检放行弹窗仍需继续统一交互
生产执行 ProductionLedgerView.vue 生产领料出库单 列表详情有 DocumentArchiveActions 生产领料出库单 主要是归档入口,填单发生在仓库生产出库
生产执行 ProductionLedgerView.vue 生产入库结算单 列表详情有 DocumentArchiveActions 生产入库结算单 对应生产台账入库

已套纸质外壳但仍有混用 UI

模块 页面 单据 当前问题 优先级
百华仓库 InventoryLedgerView.vue 特殊入库单 / 特殊出库单 明细编辑区仍像现代卡片控件,和纸质单据割裂 P0
百华仓库 InventoryLedgerView.vue 生产出库单 已使用纸质外壳,但来源批次选择、产品/BOM信息仍需统一纸质表格语言 P0
百华仓库 InventoryLedgerView.vue 生产台账入库结算单 已有纸质外壳和摘要格,但三库联动字段、异常说明区域仍需与纸质单据模板对齐 P0
百华仓库 InventoryLedgerView.vue 生产入库单 / 返工入库单 结单区和摘要区仍有旧卡片感 P1
百华仓库 InventoryLedgerView.vue 销售出库单 已套纸质外壳,但销售订单关联、包装备注、发货明细区域需统一 P1
百华仓库 InventoryLedgerView.vue 原材料退货出库单、退货入库单、退货废料入库单、返工出库单 已套纸质外壳,但字段区仍有普通表单/表格痕迹 P1
百华仓库 InventoryLedgerView.vue 期初入库、委外入库/出库、报废出库、售卖出库等通用分支 通用分支第一阶段只统一了生产余料/废料一部分,仍需逐个验收 P1

需要补充纸质化或确认是否作为单据

模块 页面 业务 判断 优先级
发货概览 DeliveryManagementView.vue 发货台账/发货明细 如果存在独立发货动作,应形成发货单;若发货统一走成品库销售出库,则只保留流水归档入口 P1
发货概览 ReturnManagementView.vue 退货/返工/废料处置 属于业务凭证,需要与退货库单据闭环统一 P1
发货概览 ScrapReworkView.vue 报废返工处理 若仍在使用,应按退货/返工处置单统一;若已被仓库/退货库替代,应清理或降级为台账 P2
生产执行 CompletionReceiptView.vue 成品入库 旧入口如果仍可用,需要和仓库生产入库/生产台账入库统一;如果已被新流程替代,应标记为旧入口 P2
百华仓库 StocktakeDialog.vue 盘库单 盘库会改库存,应纳入纸质盘库单和 PDF 归档,但可排在特殊出入库之后 P2

推荐方案

方案 A继续逐页局部改造

每个页面自己套 DocumentPaper 和单独 CSS。

优点:

  • 单次改动小。
  • 速度快。

缺点:

  • 很容易再次出现“仓库一套、采购一套、销售一套”。
  • 样式复制越来越多。
  • 后续 PDF、预览、下载、异常说明、签核栏会重复实现。

结论:不推荐作为长期方案,只适合救急。

方案 B沉淀全系统单据底座分批迁移

把现在的 DocumentPaperDocumentGridDocumentLineTableWarehouseDocumentFormShell 抽象成全系统单据组件。仓库继续推进,但所有新样式都进入通用单据层。

优点:

  • 风格统一。
  • 后续新增单据成本低。
  • 能保留现有业务逻辑,不需要一次性大重构。
  • 适合当前系统已经上线、仍在快速迭代的状态。

缺点:

  • 第一批需要先做组件抽象和兼容层。
  • 每个单据仍要逐个检查字段和业务交互。

结论:推荐。

方案 C一次性全系统重构

一次把所有单据型页面、归档、PDF 重新设计和重写。

优点:

  • 最终一致性最高。

缺点:

  • 风险大。
  • 容易影响已经可用的采购、销售、仓库主流程。
  • 验收压力大。

结论:当前不推荐。

目标架构

前端组件层

保留现有组件并向通用命名演进:

  • DocumentPaper:纸张、标题、编号章、签核栏、留存联。
  • DocumentGrid:只读/展示型字段格。
  • DocumentLineTable:明细表。
  • DocumentArchiveActions:预览、下载、重新生成。

新增或演进:

  • DocumentFormShell:全系统通用填单外壳,替代仓库专属 WarehouseDocumentFormShell
  • DocumentSection:通用单据分区,替代仓库专属 WarehouseDocumentSection
  • DocumentActionBar:通用底部操作区,替代仓库专属 WarehouseDocumentActionBar
  • DocumentField:纸质输入格,承载 input、select、textarea、readonly。
  • DocumentSelectorPanel:纸质风格的下拉、多选、来源批次选择、关联订单选择。
  • DocumentInlineSummary:纸质风格的金额/数量/重量汇总条。
  • DocumentSettlePanel:结单、异常说明、偏差确认等正式确认区。

兼容规则:

  • 第一阶段不删除 WarehouseDocument* 组件。
  • 新通用组件先复用当前纸质 CSS 变量和视觉语言。
  • 仓库页面逐步从 warehouse-paper-* 类迁移到 document-paper-* 类。
  • 老类名保留一段时间作为兼容,避免正在使用的仓库单据被打断。

前端页面层

每个单据页面遵循同一结构:

  1. DocumentFormShell
  2. 单据头:标题、单据编号、业务日期、公司/模块名。
  3. 基础信息区:客户/供应商/仓库/经办人/业务日期/关联单据。
  4. 明细区:物料/产品/批次/数量/重量/单价/金额。
  5. 辅助信息区:照片、运单号、运费、包装备注、用途、说明。
  6. 汇总区:数量、重量、金额、差异、异常说明。
  7. 签核区:制单、经办、审核、仓库/财务。
  8. 操作区:保存、保存并归档、归档状态动作。

后端归档层

继续使用现有 document_archives 表和统一路由:

  • POST /document-archives/{document_type_key}/{business_id}/generate
  • GET /document-archives/{document_type_key}/{business_id}/latest/preview
  • GET /document-archives/{document_type_key}/{business_id}/latest/download
  • POST /document-archives/batch-download

现有支持的归档类型:

  • 销售订单
  • 采购订单
  • 到货入库单
  • 质量校验单
  • 生产领料出库单
  • 生产入库结算单
  • 仓库出入库单

新增归档类型只在确实不是现有类型能表达时添加。优先复用:

  • 普通仓库动作统一走 仓库出入库单
  • 生产出库走 生产领料出库单
  • 生产台账入库走 生产入库结算单
  • 采购流程走 采购订单 / 到货入库单 / 质量校验单
  • 销售下单走 销售订单

PDF 规则

PDF 是保存后的数据库事实快照,不从前端表单二次推导。

PDF 必须遵守:

  • 不显示英文状态。
  • 不显示前端省略号。
  • 长文本完整换行,不超格。
  • 制单、经办人默认使用当前登录账号或后端记录的操作人。
  • 库存批次号使用业务认可的原材料库存批次号,不使用无业务意义的每库内部批次号。
  • PDF 样式和前端纸质单据属于同一视觉体系,但不要求像素完全一致。

分期执行

第 0 期:全系统清单和统一底座

目标:

  • 固化本文档的单据清单。
  • 新增通用 DocumentFormShell / DocumentSection / DocumentActionBar / DocumentField / DocumentSelectorPanel
  • 把仓库当前纸质样式抽象为通用 document-paper-*,保留 warehouse-paper-* 兼容层。

验收:

  • 销售订单、采购订单、客料入库单视觉不退化。
  • 新通用组件有基础测试或源码断言。

第 1 期:仓库 P0 单据

目标:

  • 特殊入库 / 特殊出库。
  • 生产出库。
  • 生产台账入库结算单。

原因:

  • 这些单据业务风险最高,且当前混用 UI 最明显。
  • 改完能沉淀“多行明细类单据”“生产闭环类单据”“异常说明类单据”三类模板。

验收:

  • 不再出现普通卡片/普通表格突兀嵌在纸里。
  • 特殊出入库说明、明细行、调整前后数据完整显示。
  • 生产台账入库三库联动显示为一张结算单,不误写成只属于成品库。

第 2 期:仓库 P1 单据

目标:

  • 生产入库 / 返工入库。
  • 销售出库。
  • 原材料退货出库、退货入库、退货废料入库、返工出库。
  • 期初、委外、报废、售卖等通用分支。

验收:

  • 6 大库所有出入库抽屉都统一纸质化。
  • 流水里 PDF 预览、下载、重新生成入口完整。

第 3 期:采购、销售、质检细节统一

目标:

  • 销售订单、采购订单、到货入库、质量校验页面继续消除残留普通控件。
  • 关联销售订单、采购明细、质检备注弹窗等改成统一纸质选择/说明面板。

验收:

  • 已有 PDF 归档能力不回退。
  • 纸质字段、明细表、按钮区和仓库单据保持同一套视觉语言。

第 4 期:发货、退货、返工闭环

目标:

  • 发货台账按销售订单聚合后的明细留档入口统一。
  • 退货、返工、废料处置相关页面和退货库单据闭环。
  • 若旧页面被新仓库流程替代,则标记为只读台账或移除入口,避免双流程。

验收:

  • 用户能从销售订单、发货台账、退货库流水追溯到同一套 PDF 单据。

第 5 期:盘库与批量导出

目标:

  • 盘库单纸质化和 PDF 归档。
  • 各业务台账按时间/筛选条件批量导出单据或流水 Excel。

验收:

  • 盘库调整说明进入 PDF。
  • Excel 导出不使用省略号,长字段完整输出。

测试策略

前端测试

每批至少增加源码断言或组件测试:

  • 单据页面使用通用 DocumentFormShell 或兼容的纸质单据组件。
  • 不在纸质单据主体中裸露旧 form-field / double-field / triple-field / workflow-tip 作为主要布局。
  • 归档按钮使用 DocumentArchiveActions
  • 保存按钮位于单据底部操作区,不悬在单据中间。

后端测试

继续沿用现有归档测试风格:

  • 归档生成成功写入 document_archives
  • PDF 文件以 %PDF 开头。
  • 归档失败不阻断业务保存。
  • 列表返回最新 PDF 归档状态。
  • 不同业务类型映射到正确 document_type

浏览器验收

每批至少手动/浏览器验证:

  • 典型桌面宽度。
  • 当前内置浏览器窄视口。
  • 单据可滚动、按钮位置合理。
  • 长文本不挤坏单据。
  • PDF 预览/下载入口可见。

设计约束

  • 纸质化是表现层和归档层升级,不借机删字段。
  • 不改变现有业务计算和提交语义。
  • 不把主数据维护表单改成纸质单据。
  • 不把 PDF 归档失败作为库存/订单保存失败。
  • 不新增英文状态、英文备注或英文系统标志。
  • 不在 PDF 中使用省略号。
  • 不把仓库特有样式继续扩散到全系统,新增能力进入通用 documentForms

下一步推荐

推荐进入第 0 期 + 第 1 期合并执行:

  1. 先抽象通用单据底座,保留现有仓库兼容层。
  2. 接着改 特殊入库 / 特殊出库
  3. 再改 生产出库
  4. 再改 生产台账入库结算单

这样能最快解决用户当前肉眼最不舒服的仓库混 UI 问题,同时保证做出来的能力可以继续给采购、销售、质检、发货复用。

自检

  • 无占位项。
  • 已明确哪些页面纳入,哪些页面不纳入。
  • 已避免把仓库纸质化做成孤岛。
  • 已给出分期和优先级。
  • 已保持“先视觉/交互统一,不改变业务逻辑”的边界。