← 返回文章列表
PRODUCT REQUIREMENTS DOCUMENT

采购订单主 PRD

1. 业务背景

采购订单是采购链路的起点控制单据,解决"原本计划买什么、买多少、向谁买、审核之后才能执行"的问题。

没有统一的采购订单:

  • 采购量靠经验判断,不透明,无法事后追溯
  • 向哪个供应商买、买什么价格,靠人记,无凭证
  • 到底买了多少、还有多少没到货,无法追踪
  • 财务无法对应口径核对应付账款

采购订单审核后作为采购执行的"原始凭据",后续入库和应付都以它为基准挂接。审核前可自由编辑,审核后关键字段锁定,所有变更必须通过单据全量重开或追加单据处理。


2. 功能范围

In Scope:

  • 采购订单手动创建、编辑、提交审核、审核/驳回
  • 多次入库追踪(一张订单生成多张采购入库单)
  • 订单状态流转和数量追踪(累计已入库数量、未入库数量)
  • 采购订单缺量完结(人工关闭)
  • 采购订单作废(待审核/待入库状态)
  • 草稿单据物理删除

Out of Scope:

  • 采购计划自动生成(安全库存预警、自动补货建议,属于计划模块)
  • 供应商协同(催货提醒、在线确认,属于SRM模块)
  • 采购价格多级审批(一期简化为管理员一级审核)
  • 采购合同管理与价格管控
  • 完整发票核销与应付结算(属于应付模块)
  • 批量导入创建(一期不支持,后续迭代)

3. 单据定位

3.1 在系统中的位置

项目内容
单据层级第1层——业务订单层(意图/计划)
核心职责记录"采购什么商品、从哪个供应商、计划入哪个仓、多少数量、多少价格"
单据来源手动创建(一期唯一方式)
下游单据采购入库单(审核通过后,采购员/仓管手动创建)
实体关系一张采购订单可对应多张采购入库单(1:N),支持分批到货

3.2 系统链路图(Mermaid)

flowchart LR A["供应商档案<br/>商品档案<br/>仓库档案"] --> B["采购订单<br/>(意图层)"] B -->|"审核通过后<br/>每次到货手动创建"| C["采购入库单<br/>(执行层)"] C -->|"确认入库"| D{"入库完毕?"} D -->|"未入库数量 = 0<br/>(系统自动)"| E["采购订单<br/>状态→已完成"] D -->|"人工关闭<br/>(缺量完结)"| E C -->|"确认入库后"| F["库存台账 +N<br/>库存流水(采购入库)"] C -->|"确认入库后"| G["基础应付记录"] C -->|"已入库商品可发起"| H["采购退货单<br/>→采购退货出库单"]

3.3 实体关系说明

关系说明
采购订单 : 采购入库单1:N(一张订单可多次到货,生成多张入库单)
采购订单 : 供应商N:1(一张订单只对应一个供应商)
采购订单 : 入库仓库N:1(一张订单只对应一个仓库)
采购订单明细行 : 采购入库单明细行1:N(一个商品行可分多次入库)
采购入库单 : 采购退货单已入库单据可被多张退货单引用(分批退货)

4. 业务场景

场景ID场景类型说明
S01创建采购订单并一次性全量入库主流程草稿→提交→审核→创建入库单→确认入库(全量)→订单已完成
S02创建采购订单并分批多次入库主流程审核后多次创建入库单,每次到货一张,累计到全量后自动完成
S03部分到货后缺量完结主流程部分入库状态下,供应商无法补货,人工关闭订单(缺量完结)→订单已完成
S04审核驳回后重提支线待审核→驳回→修改数量/供应商/价格→重新提交
S05草稿物理删除支线草稿态直接删除,记录从系统消失(如创建错误不想留痕)
S06待审核/待入库作废支线审核通过后因供应商断货等原因需作废,进入已作废状态(仍可查询)
S07已完成订单发起退货支线基于已入库的采购入库单创建采购退货单,与采购订单状态无关

5. 状态机

5.1 单据状态

状态含义是否终态
草稿创建后尚未提交,可自由编辑否
待审核已提交,等待审核确认否
待入库审核通过,等待货物首次到仓否
部分入库已产生至少一次采购入库确认,未全量到货否
已完成全量入库完成 或 缺量完结(人工关闭)是
已作废单据失效,不可恢复是

5.2 状态机图

stateDiagram-v2 [*] --> 草稿 草稿 --> [*]: 删除(物理删除,记录消失) 草稿 --> 待审核: 提交审核 待审核 --> 草稿: 驳回 待审核 --> 待入库: 审核通过 待审核 --> 已作废: 作废 待入库 --> 部分入库: 产生部分入库 待入库 --> 已完成: 全部入库完成(自动) 待入库 --> 已作废: 作废 部分入库 --> 已完成: 全部入库完成(自动) 部分入库 --> 已完成: 关闭订单(人工)

5.3 状态流转表

当前状态动作前置条件结果状态二次确认后置影响失败处理
草稿提交审核商品明细不为空;供应商、仓库、每行数量(>0)、单价已填写待审核无无Toast:「提交失败,{字段名}不满足条件」
草稿删除无限制物理消失「删除后不可恢复,确认删除?」记录从系统彻底移除—
待审核驳回—草稿无单据可重新编辑—
待审核审核通过—待入库无头部字段(供应商/仓库/明细数量/价格)锁定不可修改—
待审核作废无下游入库单已确认已作废「作废后不可恢复,确认作废?」单据进入只读状态—
待入库作废无下游入库单已确认已作废「作废后不可恢复,确认作废?」单据进入只读状态—
待入库(触发)部分入库关联采购入库单确认入库,但未入库数量 > 0部分入库系统自动累计已入库数量更新;未入库数量更新—
待入库(触发)全量完成关联采购入库单全部确认,所有行未入库数量 = 0已完成系统自动,无需确认订单进入终态,不可再创建入库单—
部分入库关闭订单(缺量完结)存在未入库数量 > 0已完成「关闭后剩余数量不再接收,确认关闭?」订单进入终态,不可再创建入库单;未入库量记录保留但不触发任何动作—
部分入库(触发)全量完成所有行未入库数量 = 0已完成系统自动,无需确认同上—

6. 动作能力矩阵

动作草稿待审核待入库部分入库已完成已作废
编辑✅❌❌❌❌❌
提交审核✅❌❌❌❌❌
删除(物理)✅❌❌❌❌❌
驳回❌✅❌❌❌❌
审核通过❌✅❌❌❌❌
作废❌✅✅❌❌❌
创建入库单❌❌✅✅❌❌
关闭订单(人工)❌❌❌✅(条件)❌❌
查看✅✅✅✅✅✅
导出✅✅✅✅✅✅

7. 核心业务规则

7.1 创建与提交规则

规则ID规则
R01采购订单必须选择供应商和入库仓库,至少包含一行商品明细。
R02商品明细至少包含:商品、采购数量(>0)、单价(≥0)。
R03同一张订单内允许同一商品出现在多行(不同批次或特殊处理需要时)。
R04下单日期默认为当天,允许修改为过去日期(补录场景),不允许设置未来日期。

7.2 审核与字段锁定规则

规则ID规则
R11审核通过后,以下字段锁定不可修改:供应商、入库仓库、商品(每行)、采购数量、单价、税率。
R12审核通过后,以下字段仍允许修改:采购备注、行备注、预计到货日期。
R13驳回后单据回到草稿态,所有字段恢复可编辑,允许重新提交。

7.3 入库追踪规则

规则ID规则
R21只有「待入库」或「部分入库」状态的采购订单,才可以创建采购入库单。
R22一张采购订单可以多次创建采购入库单(1:N,支持分批到货)。
R23采购入库单确认入库后,回写至采购订单对应明细行「累计已入库数量」(累加逻辑),同步更新「未入库数量」。
R24路径①(自动完成):某次确认入库后,所有明细行「未入库数量」均归零,系统自动将采购订单置为「已完成」。
R25默认不支持超收:本次入库数量不得超过对应商品「未入库数量」,超出时阻断提交入库单。

7.4 作废规则

规则ID规则
R31草稿支持物理删除:记录从系统彻底消失,不可恢复,不进入已作废状态。
R32待审核和待入库支持作废:作废后单据进入已作废状态,仍可查询,不可撤回。
R33已有采购入库单确认入库后(部分入库或已完成状态),不允许作废采购订单;如需修正须通过采购退货单逆向处理。

7.5 关闭规则(缺量完结)

规则ID规则
R41路径②(人工关闭):「部分入库」状态下,采购员可执行「关闭订单」(缺量完结),表示"剩余数量不再接收",订单进入「已完成」。
R42关闭后不可撤销;未入库数量字段保留记录值,供历史查询,但不触发任何后续流转。
R43「待入库」状态下没有人工关闭路径(全量尚未开始,无需关闭,作废即可)。
R44执行「关闭订单」时,如存在草稿状态的采购入库单,系统提示「该订单下存在N张草稿入库单,关闭后将无法继续操作,请确认」;用户确认后,这些草稿入库单将被阻断(不可确认入库),需用户手动删除。

7.6 作废与关闭的区别

维度作废关闭(缺量完结)
含义撤销未实际发生的业务意图,全部放弃终止剩余流程,封存现状,已执行的保留
适用状态待审核、待入库(无已确认入库记录)部分入库(已有确认入库记录,但存在剩余量)
单据状态变化→ 已作废(终态,仍可查询)→ 已完成(终态)
对已有入库单的影响无(此时还没有已确认的入库单)已确认的入库单不受影响;草稿入库单被阻断
后续回写不接收不接收(已完成,不接收新入库回写)

7.7 采购价格处理规则

规则ID规则
R51采购订单创建时,系统从商品档案自动带出「默认采购价」作为参考,允许人工调整。
R52实际采购价由采购员录入,不强制与商品档案默认价一致。
R53审核通过后,单价字段锁定,不可直接修改;如需调价,须先驳回回草稿后再修改。
R54价格调整建议留痕(操作日志记录调整前后值、操作人、时间);一期简化:不强制校验改价权限,但保留日志。
R55采购数量差异与价格差异是两套问题,不得混用同一字段处理:数量走入库差异,价格走驳回重提或另开单据。

7.8 数量口径说明

口径存在于含义
采购数量采购订单明细原计划购买数量(审核后锁定)
本次实收数量采购入库单明细本次实际收到货的数量(含质量问题货品)
本次入库数量采购入库单明细本次验货通过正式入库的数量(触发库存更新)

8. 权限设计

8.1 数据可见范围

角色可见数据范围说明
采购员本人创建的所有采购订单不可见其他采购员的单据
仓管入库仓库属于本人管辖范围的所有订单只能看跟自己仓相关的单
管理员全部采购订单,不受组织和人员限制全量可见

8.2 操作权限矩阵

操作业务员/内勤采购员仓管管理员
查看✅✅✅✅
新增❌✅❌✅
编辑(草稿)❌✅❌✅
删除(草稿)❌✅❌✅
提交审核❌✅❌✅
审核/驳回❌❌❌✅
创建入库单❌✅✅✅
关闭订单(缺量完结)❌✅❌✅
作废(待审核/待入库)❌✅❌✅
导出✅✅✅✅

8.3 审核约束

约束说明
审核人 ≠ 提交人课程简化版:一期不强制,管理员可自提自审;实际企业建议限定

9. 边界与异常处理

9.1 并发控制

场景处理方式
两个用户同时编辑同一张草稿单据后提交者提示「当前单据已被他人修改,请刷新后重试」,不覆盖先提交的结果
两个用户同时对待审核单据执行审核以数据库乐观锁为准,后操作者提示「操作失败,单据状态已变更,请刷新后重试」

9.2 幂等操作约束

操作幂等规则
数量回写采购入库单的回写支持多次累加;同一入库单号重复回写时,以最新值覆盖,不重复累加
状态自动完成当所有明细行未入库数量归零时,系统只更新一次状态为「已完成」,重复触发不产生副作用

9.3 数量边界约束

场景规则
超收阻断本次入库数量 > 未入库数量时,阻断保存入库单,提示「本次入库数量不能超过未入库数量」
零数量行不允许提交采购数量为0的明细行,阻断保存,提示「商品数量不可为 0」
SKU 明细行上限单张订单最多允许 50 条明细行;超出时阻断保存,提示「商品明细不可超过 50 行」

9.4 单据状态与下游不一致

场景处理方式
采购订单显示部分入库,但对应入库单已作废已作废的入库单不计入累计已入库数量;系统按有效入库单汇总数据
执行「关闭订单」时,存在草稿入库单阻断并提示:「该订单下存在N张草稿入库单,关闭后将无法继续操作,是否确认关闭?」;确认后草稿入库单不可再确认入库,需用户手动删除

10. 验收重点

#验收项输入条件预期结果
V01状态机正确性对已完成订单点击「创建入库单」操作入口不展示
V02审核锁定审核通过后尝试修改供应商/数量/单价字段不可编辑,无操作入口
V03数量回写-累加分两次确认入库,各10件采购订单累计已入库数量 = 20,未入库数量正确减少
V04路径① 自动完成未入库数量全部归零采购订单自动进入「已完成」,不可再创建入库单
V05路径② 缺量完结部分入库状态下执行「关闭订单」采购订单进入「已完成」,操作不可撤销
V06超收阻断本次入库数量 > 未入库数量入库单保存被阻断,红字提示
V07作废阻断已有入库单确认后尝试作废采购订单作废操作被阻断,提示无法作废
V08物理删除草稿状态执行删除单据从列表彻底消失,搜索找不到
V09并发保护A、B 同时对同一待审核单据执行审核只有一个成功,另一个收到「状态已变更」提示
V10SKU行上限添加第51条明细行阻断保存,提示「不可超过50行」
V11关闭时草稿入库单处理部分入库状态下执行「关闭订单」,且存在草稿入库单弹窗提示草稿入库单数量;确认后草稿入库单不可再确认

修订记录

日期变更摘要
2026-08-19V1.0 初版
2026-08-19V1.1 全量重写:补充单据定位(§3)、业务场景(§4)、完整状态流转表(§5.3)、动作能力矩阵(§6)、数据可见范围(§8.1)、边界异常处理(§9);验收项升级为「输入条件→预期结果」格式
2026-08-19V1.2 修复4处:①流程图采购退货单改为从入库单引出;②增§7.6作废vs关闭对比表;③增§7.7价格处理规则(课件§3.11.1.1);④§9.4关闭时草稿入库单改为阻断,新增V11验收项