# 嘉恒仓库全出入库单据纸质化与归档设计 ## 背景 嘉恒仓库已经有 6 大库:原材料库、半成品库、成品库、辅料库、废料库、退货库。当前出入库业务主要通过抽屉表单完成,保存后形成库存流水。用户已经认可 `原材料库 · 客料入库` 的纸质填单样板,但该样板目前只完成填写 UI,没有生成 PDF 归档,也没有预览和下载入口。 现有归档体系已覆盖销售订单、采购订单、到货入库单、质量校验单、生产领料出库单、生产入库结算单。仓库里大量非生产分支仍未纳入正式单据化:客料、委外、销售、退货、返工、特殊出入库、期初等。为避免后续继续碎片化,本方案把“所有仓库出入库填单纸质化、保存后 PDF 归档、流水入口预览下载、流水 Excel 导出”作为统一仓库单据化工程。 ## 目标 1. 6 大库所有入库、出库填单页面改造成正式纸质化单据风格。 2. 每次出入库保存后生成 PDF 归档,业务保存成功但 PDF 失败不回滚业务。 3. 保存成功提示区提供 `预览PDF`、`下载PDF` 快捷入口。 4. 各库流水抽屉中每条流水展示 `单据留档`,支持预览、下载、重新生成。 5. 物料/库存批次明细中的库存流水也能看到对应 PDF 留档入口。 6. `生产台账入库` 这类一次生成多个仓库流水的动作,使用一张 `生产入库结算单`,多条流水共用同一归档。 7. 各库流水模块支持按当前筛选条件,尤其是时间范围,导出 Excel 清单。 8. PDF 和 Excel 中不使用前端省略号逻辑,长字段完整换行或完整输出。 ## 范围 ### 覆盖仓库 - 原材料库 - 半成品库 - 成品库 - 辅料库 - 废料库 - 退货库 ### 覆盖入口 原材料库: - 期初入库 - 客料入库 - 生产余料入库 - 委外余料入库 - 特殊入库 - 生产出库 - 委外出库 - 退货出库 - 报废出库 - 特殊出库 半成品库: - 产中入库 - 期初入库 - 委外入库 - 特殊入库 - 产中出库 - 委外出库 - 特殊出库 成品库: - 生产入库 - 返工入库 - 委外入库 - 期初入库 - 特殊入库 - 销售出库 - 特殊出库 辅料库: - 期初入库 - 特殊入库 - 生产出库 - 特殊出库 废料库: - 生产废料入库 - 返工废料入库 - 期初入库 - 委外废料入库 - 退货废料入库 - 特殊入库 - 售卖出库 - 特殊出库 退货库: - 期初入库 - 退货入库 - 特殊入库 - 返工出库 - 特殊出库 跨库工具: - 生产台账入库 ## 单据归档类型 ### 生产专用单据 保持现有设计: - `生产领料出库单` - `生产入库结算单` 这些单据用于生产主链路,不再重复映射到通用仓库作业单,避免一笔生产业务出现两套 PDF。 ### 通用仓库作业单 新增通用归档类型: - `仓库出入库单` 该类型覆盖除生产专用单据外的所有仓库出入库按钮。PDF 标题根据仓库和业务类型动态生成,例如: - `客料入库单` - `委外余料入库单` - `委外出库单` - `销售出库单` - `退货入库单` - `返工出库单` - `特殊入库单` - `售卖出库单` 通用类型的好处是后端只需一个归档收集器和一个路由 key,所有仓库业务通过配置映射生成不同标题与字段。 ## 归档业务主键 ### 单条库存流水动作 以本次业务动作形成的主 `wh_inventory_txn.id` 作为 `business_id`。 适用: - 客料入库 - 委外出库 - 报废出库 - 售卖出库 - 期初入库 - 大多数普通入库/出库 ### 多条库存流水动作 以主库存流水 ID 作为 `business_id`,同一动作产生的其它库存流水通过 `document_batch_no` 或关联表映射到同一归档。 适用: - `生产台账入库`:使用现有 `生产入库结算单`,主流水优先级为成品入库、余料入库、废料入库。 - 后续若某个普通仓库动作一次形成多条流水,也沿用同样主流水规则。 ### 特殊出入库 特殊出入库要保留“必须填写说明”的业务约束。若特殊调整有主表,则优先以特殊调整主表 ID 作为归档业务主键;若当前实现只有库存流水,则以本次特殊调整的主库存流水 ID 作为归档业务主键。PDF 必须完整展示调整说明和每条明细的调整前后数量/重量。 ### 已有关联业务单据 如果某个仓库动作本质已经有更上游单据: - 采购到货入库保留 `到货入库单` - 销售订单保留 `销售订单` - 生产主链路保留生产专用单据 但仓库内实际发生出库/入库时,仍应能从仓库流水看到该次仓库作业的留档。如果该仓库动作已有专用归档,则流水指向专用归档;否则指向 `仓库出入库单`。 ## 纸质填单 UI 规则 ### 通用结构 所有仓库出入库抽屉采用统一纸质单据底座: - 抬头:嘉恒仓库、单据标题、单据编号或提交后生成提示。 - 基础信息区:仓库、库位、业务类型、来源/去向、经办人、时间。 - 明细区:物料/产品/半成品/废料/退货品、库存批次号、来源库存批次号、数量、重量、单价、金额。 - 辅助信息区:运单号、运费、辅助照片、用途、包装备注、退货/返工/委外方、说明。 - 备注区:用户备注和系统生成说明。 - 签核区:制单、仓库确认、业务确认、复核。 - 底部固定操作区:保存按钮、保存中状态。 ### 业务字段不删减 纸质化只是表现层升级,不改变原有业务字段和校验。已有字段必须保留,只调整布局、标题、分区和视觉样式。此前用户明确要求去掉的字段除外。 ### 保存后反馈 保存成功后显示: - 业务保存结果 - PDF 归档状态 - `预览PDF` - `下载PDF` 如果 PDF 失败: - 显示 `PDF归档失败` - 显示中文失败原因 - 提供 `重新生成` - 不回滚库存流水 ## PDF 内容规则 PDF 是业务快照,以保存后的数据库事实为准,不从前端表单重新计算。 PDF 必须包含: - 单据标题 - 单据编号 - 业务时间 - 仓库和库位 - 业务类型 - 经办人 - 物料/产品/半成品/废料/退货品信息 - 库存批次号 - 来源库存批次号 - 数量/重量 - 单价/金额 - 运单号、运费、辅助照片链接或照片存在标记 - 业务说明和备注 - 关联采购单、销售单、生产台账、发货批次、退货处置等追溯信息 PDF 不得出现: - 英文状态值 - 前端省略号 - 超出单元格的长文本 - 无业务意义的每库内部批次号 ## 流水预览与下载入口 ### 各库流水抽屉 在 `嘉恒仓库 -> 工具 -> 流水` 中新增 `单据留档` 列。 每条流水根据后端返回的归档字段展示: - `未生成` - `已归档` - `归档失败` - `预览PDF` - `下载PDF` - `重新生成` ### 库存明细右侧流水 物料/批次详情抽屉中的库存流水也新增 `单据留档`,行为与仓库流水一致。 ### 生产台账入库 `生产台账入库` 保存后若一次生成成品、余料、废料多条流水,这几条流水的 `单据留档` 指向同一张 `生产入库结算单`。 ## 流水 Excel 导出 ### 入口位置 在各库流水抽屉顶部筛选区增加 `导出Excel` 按钮,放在 `查询` 按钮旁边。 ### 导出范围 导出使用当前流水筛选条件: - 当前仓库类型 - 当前仓库 ID - 关键词 - 流水方向 - 流水类型 - 物料 - 库存批次号 - 开始日期 - 结束日期 - 排序字段 - 排序方向 如果用户没有选择时间范围,允许导出当前筛选条件下所有流水,但前端需要轻提示“当前未选择时间范围,将导出全部匹配流水”。第一版不强制时间范围,避免阻塞真实查账场景。 ### Excel 字段 导出的 Excel 至少包含: - 业务时间 - 仓库 - 库位 - 方向 - 流水类型 - 物料/产品编码 - 物料/产品名称 - 库存批次号 - 来源库存批次号 - 数量变化 - 重量变化 - 单价 - 金额 - 来源单据 - 经办人 - 运单号 - 运费 - 辅助照片 - 备注 - PDF归档状态 - PDF归档业务ID Excel 需使用中文表头,冻结表头,自动筛选,合理列宽。 ## 后端设计 ### 归档服务 在 `document_archives.py` 中新增: - `DOCUMENT_TYPE_WAREHOUSE_OPERATION = "仓库出入库单"` - `collect_warehouse_operation_archive_context` 通用收集器根据主库存流水读取: - 主库存流水 - 相关库存流水 - 库存批次 - 来源库存批次 - 仓库和库位 - 关联采购/销售/退货/发货/生产台账信息 - 物流字段 - 特殊调整说明 ### 路由 `/document-archives/{document_type_key}/{business_id}/...` 增加: - `warehouse-operation` ### 仓库保存接口 所有普通仓库出入库保存成功后: 1. 完成库存业务事务。 2. 提交业务数据。 3. 生成 PDF 归档。 4. 返回归档状态。 生产专用动作保持现有生产归档类型。 ### 流水接口 `GET /inventory/transaction-ledger` 返回每行归档字段: - `archive_status` - `archive_business_id` - `archive_document_type` - `archive_error_message` ### Excel 导出接口 新增: - `GET /inventory/transaction-ledger/export` 该接口接收与流水查询一致的筛选参数,返回 `.xlsx` 文件。 ## 前端设计 ### 单据化表单 抽出通用仓库纸质表单组件: - `WarehouseDocumentFormShell` - `WarehouseDocumentGrid` - `WarehouseDocumentActionBar` - `WarehouseArchiveShortcut` `原材料库 · 客料入库` 样板迁移到通用组件上,其它表单逐步替换。 ### PDF 操作组件 复用现有 `DocumentArchiveActions`,不再做第二套预览/下载按钮。 ### Excel 导出 仓库流水抽屉筛选区新增 `导出Excel`。 导出时: - 按钮显示 `导出中...` - 禁止重复点击 - 使用 `downloadResource` - 文件名格式:`{仓库名}出入库流水_{开始日期或全部}_{结束日期或全部}.xlsx` ## 实施分期 ### Phase 1:底座和入口 - 新增通用 `仓库出入库单` 归档类型。 - 仓库流水接口返回归档字段。 - 仓库流水新增预览/下载/重新生成。 - 流水 Excel 导出。 - 客料入库补齐 PDF 归档。 ### Phase 2:通用表单纸质化 - 期初入库 - 客料入库 - 委外余料入库 - 委外出库 - 报废出库 - 售卖出库 - 辅料生产出库 - 半成品产中/委外入出库 ### Phase 3:专用业务表单纸质化 - 销售出库 - 退货入库 - 退货废料入库 - 返工出库 - 返工入库 - 返工废料入库 - 特殊出入库 ### Phase 4:生产主链路统一入口 - 生产出库、生产台账入库、生产入库、生产余料入库、生产废料入库沿用生产专用 PDF。 - 仓库流水和生产台账详情统一指向同一份归档。 ## 验收标准 1. 所有仓库出入库入口打开后都是纸质化单据风格。 2. 客料入库保存后能生成 `仓库出入库单` PDF,并可预览和下载。 3. 任意仓库流水行能看到归档状态;已归档可预览和下载。 4. `生产台账入库` 一次产生多条流水时,多条流水打开同一张 `生产入库结算单`。 5. PDF 失败不影响库存保存,页面显示失败并允许重新生成。 6. 各库流水可按时间范围导出 Excel。 7. Excel 内容符合当前筛选范围,中文表头完整,数值和备注不丢失。 8. PDF 和 Excel 均不出现英文状态值或截断省略号。 ## 设计结论 全仓库单据化采用“通用仓库作业单 + 生产专用单据”的双轨方案: - 普通仓库出入库统一归档为 `仓库出入库单`。 - 生产领料和生产入库结算继续使用生产专用单据。 - 所有单据都通过仓库流水、库存明细流水、保存成功反馈提供预览和下载入口。 - 各库流水导出 Excel 与当前筛选条件保持一致。 该方案能覆盖 6 大库所有出入库入口,又避免为每个按钮单独造一套 PDF 逻辑。