回归测试用例
This commit is contained in:
parent
b24bb25553
commit
1c316d0105
|
|
@ -8,7 +8,7 @@
|
||||||
- 建立组织级数据隔离和用户组织访问权限。
|
- 建立组织级数据隔离和用户组织访问权限。
|
||||||
- 统一库存业务单据状态和过账规则。
|
- 统一库存业务单据状态和过账规则。
|
||||||
- 库存按“组织 + 仓库 + 库位 + 物料”管理。
|
- 库存按“组织 + 仓库 + 库位 + 物料”管理。
|
||||||
- 已过账业务不得直接修改或删除,错误通过撤销过账(冲销)纠正。
|
- 已过账业务不得直接修改或删除,错误通过撤销过账纠正。
|
||||||
- 补充调拨、盘点、库存预留、库存流水、BOM 版本、审计和预警通知等用户故事。
|
- 补充调拨、盘点、库存预留、库存流水、BOM 版本、审计和预警通知等用户故事。
|
||||||
- 明确物料主数据由技术人员负责创建、维护和作废,采购人员只维护供应商及采购属性。
|
- 明确物料主数据由技术人员负责创建、维护和作废,采购人员只维护供应商及采购属性。
|
||||||
- 主数据管理和 BOM 管理作为当前优先交付模块,并使用武汉真实数据副本完成验收。
|
- 主数据管理和 BOM 管理作为当前优先交付模块,并使用武汉真实数据副本完成验收。
|
||||||
|
|
@ -24,7 +24,7 @@
|
||||||
| 经营组织(Organization) | 使用系统并拥有物料、仓库、编码规则和业务单据的本方公司或核算主体 |
|
| 经营组织(Organization) | 使用系统并拥有物料、仓库、编码规则和业务单据的本方公司或核算主体 |
|
||||||
| 业务伙伴(Business Partner) | 与经营组织发生业务往来的外部公司,可同时承担供应商和客户角色 |
|
| 业务伙伴(Business Partner) | 与经营组织发生业务往来的外部公司,可同时承担供应商和客户角色 |
|
||||||
| 过账(Post) | 业务单据通过校验后正式写入库存流水并改变库存余额 |
|
| 过账(Post) | 业务单据通过校验后正式写入库存流水并改变库存余额 |
|
||||||
| 撤销过账(冲销) | 使用反向流水抵消已过账单据的库存影响,内部状态为 Reverse,原单据和原流水均保留 |
|
| 撤销过账 | 通过反向流水恢复已过账前的库存数量,内部状态为 Reverse,原单据和原流水均保留 |
|
||||||
| 账面库存 | 已完成过账、当前实际记录在库的数量 |
|
| 账面库存 | 已完成过账、当前实际记录在库的数量 |
|
||||||
| 预留库存 | 已被制造、销售或领料需求占用,但尚未正式出库的数量 |
|
| 预留库存 | 已被制造、销售或领料需求占用,但尚未正式出库的数量 |
|
||||||
| 锁定库存 | 因盘点、质量或异常处理而暂不可使用的数量 |
|
| 锁定库存 | 因盘点、质量或异常处理而暂不可使用的数量 |
|
||||||
|
|
@ -47,7 +47,7 @@
|
||||||
- 数量使用可配置精度的十进制数,默认最大六位小数。
|
- 数量使用可配置精度的十进制数,默认最大六位小数。
|
||||||
- 所有库存以物料基本计量单位记账;其他单位必须按有效换算规则转换。
|
- 所有库存以物料基本计量单位记账;其他单位必须按有效换算规则转换。
|
||||||
- 默认禁止负库存。并发扣减时必须在同一事务内重新校验可用库存。
|
- 默认禁止负库存。并发扣减时必须在同一事务内重新校验可用库存。
|
||||||
- 作废物料不得发生新的普通出入库业务,但允许查询历史及执行合法的撤销过账(冲销)。
|
- 作废物料不得发生新的普通出入库业务,但允许查询历史及执行合法的撤销过账。
|
||||||
- 停用仓库或库位不得发生新业务;存在账面、预留、锁定或在途库存时不得停用。
|
- 停用仓库或库位不得发生新业务;存在账面、预留、锁定或在途库存时不得停用。
|
||||||
|
|
||||||
### 2.3 单据状态与过账
|
### 2.3 单据状态与过账
|
||||||
|
|
@ -59,7 +59,7 @@
|
||||||
| draft | 草稿,可编辑、可删除,不影响库存 |
|
| draft | 草稿,可编辑、可删除,不影响库存 |
|
||||||
| submitted | 已提交,等待确认或审批,不影响库存 |
|
| submitted | 已提交,等待确认或审批,不影响库存 |
|
||||||
| posted | 已过账,不可编辑、不可删除,已产生库存流水 |
|
| posted | 已过账,不可编辑、不可删除,已产生库存流水 |
|
||||||
| reversed | 已完成撤销过账(冲销),保留原单据和正反向流水 |
|
| reversed | 已完成撤销过账,保留原单据和正反向流水 |
|
||||||
| cancelled | 未过账前取消,不影响库存 |
|
| cancelled | 未过账前取消,不影响库存 |
|
||||||
|
|
||||||
通用规则:
|
通用规则:
|
||||||
|
|
@ -67,7 +67,7 @@
|
||||||
- 只有过账动作能够改变库存。
|
- 只有过账动作能够改变库存。
|
||||||
- 单据头、单据明细、库存流水和库存余额必须在同一事务中处理。
|
- 单据头、单据明细、库存流水和库存余额必须在同一事务中处理。
|
||||||
- 客户端提交业务操作时必须携带幂等键;相同幂等键重复提交不得重复影响库存。
|
- 客户端提交业务操作时必须携带幂等键;相同幂等键重复提交不得重复影响库存。
|
||||||
- 已过账单据不可修改、不可物理删除,只能按权限执行撤销过账(冲销)。
|
- 已过账单据不可修改、不可物理删除,只能按权限执行撤销过账。
|
||||||
- 所有状态迁移必须校验当前状态、操作者权限和数据版本。
|
- 所有状态迁移必须校验当前状态、操作者权限和数据版本。
|
||||||
|
|
||||||
### 2.4 删除、停用与追溯
|
### 2.4 删除、停用与追溯
|
||||||
|
|
@ -104,7 +104,7 @@
|
||||||
| suspended | 暂停合作 |
|
| suspended | 暂停合作 |
|
||||||
| eliminated | 淘汰 |
|
| eliminated | 淘汰 |
|
||||||
|
|
||||||
只有 active 状态的供应商可以被新的采购入库业务选用;历史单据和撤销过账(冲销)不受此限制。
|
只有 active 状态的供应商可以被新的采购入库业务选用;历史单据和撤销过账不受此限制。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
@ -238,7 +238,7 @@
|
||||||
|
|
||||||
- 作废物料不得用于新建普通入库、出库、调拨、预留、BOM 和制造订单。
|
- 作废物料不得用于新建普通入库、出库、调拨、预留、BOM 和制造订单。
|
||||||
- 列表操作列保留“作废物料”或“撤销作废”按钮,以按钮文案区分当前状态;有权限的人员可直接操作,作废前必须二次确认。
|
- 列表操作列保留“作废物料”或“撤销作废”按钮,以按钮文案区分当前状态;有权限的人员可直接操作,作废前必须二次确认。
|
||||||
- 作废不影响历史查询和合法的撤销过账(冲销)。
|
- 作废不影响历史查询和合法的撤销过账。
|
||||||
- 已存在账面、预留、锁定或在途库存时必须提示风险并禁止直接作废,处理完库存后方可作废。
|
- 已存在账面、预留、锁定或在途库存时必须提示风险并禁止直接作废,处理完库存后方可作废。
|
||||||
|
|
||||||
#### 故事 #MD-005:物料作废后查询
|
#### 故事 #MD-005:物料作废后查询
|
||||||
|
|
@ -510,7 +510,7 @@
|
||||||
| in_transit | 已发出,来源库存减少,在途库存增加 |
|
| in_transit | 已发出,来源库存减少,在途库存增加 |
|
||||||
| received | 已收货,在途库存减少,目标库存增加 |
|
| received | 已收货,在途库存减少,目标库存增加 |
|
||||||
| cancelled | 发出前取消 |
|
| cancelled | 发出前取消 |
|
||||||
| reversed | 已完成调拨被撤销过账(冲销) |
|
| reversed | 已完成调拨被撤销过账 |
|
||||||
|
|
||||||
验收标准:
|
验收标准:
|
||||||
|
|
||||||
|
|
@ -521,21 +521,21 @@
|
||||||
- 接收数量默认等于发出数量;如允许差异,必须记录差异原因并经过授权确认。
|
- 接收数量默认等于发出数量;如允许差异,必须记录差异原因并经过授权确认。
|
||||||
- 重复发出或重复接收不得重复改变库存。
|
- 重复发出或重复接收不得重复改变库存。
|
||||||
|
|
||||||
#### 故事 #STOCK-006:库存单据撤销过账(冲销)
|
#### 故事 #STOCK-006:库存单据撤销过账
|
||||||
|
|
||||||
作为|具有撤销过账(冲销)权限的仓库管理员
|
作为|具有撤销过账权限的仓库管理员
|
||||||
我想要|对错误的已过账库存单据执行完整的撤销过账(冲销)
|
我想要|对错误的已过账库存单据执行撤销过账
|
||||||
以便|在不篡改历史记录的情况下恢复库存
|
以便|在不篡改历史记录的情况下恢复库存
|
||||||
|
|
||||||
验收标准:
|
验收标准:
|
||||||
|
|
||||||
- 只有 posted 状态且未执行过撤销过账(冲销)的单据可以发起该操作。
|
- 只有 posted 状态且未执行过撤销过账的单据可以发起该操作。
|
||||||
- 用户必须填写撤销过账(冲销)原因。
|
- 用户必须填写撤销过账原因。
|
||||||
- 撤销过账(冲销)生成独立的撤销过账记录和数量相反的库存流水。
|
- 撤销过账生成独立的撤销过账记录和数量相反的库存流水。
|
||||||
- 原单据、撤销过账记录及其流水可以双向追溯。
|
- 原单据、撤销过账记录及其流水可以双向追溯。
|
||||||
- 执行撤销过账(冲销)前,必须校验反向操作是否会造成负库存或破坏后续业务约束。
|
- 执行撤销过账前,必须校验恢复库存是否会造成负库存或破坏后续业务约束。
|
||||||
- 撤销过账记录自身不得再次执行撤销过账(冲销);需要纠正时创建新的合法业务单据。
|
- 撤销过账记录自身不得再次撤销过账;需要纠正时创建新的合法业务单据。
|
||||||
- 撤销过账(冲销)动作写入审计日志。
|
- 撤销过账动作写入审计日志。
|
||||||
|
|
||||||
#### 故事 #STOCK-007:库存盘点、差异确认与盘盈盘亏过账
|
#### 故事 #STOCK-007:库存盘点、差异确认与盘盈盘亏过账
|
||||||
|
|
||||||
|
|
@ -748,7 +748,7 @@ BOM 版本状态:
|
||||||
- 系统累计展示计划、已领、已退、已完工和剩余数量。
|
- 系统累计展示计划、已领、已退、已完工和剩余数量。
|
||||||
- 关闭前提示未领料、未消耗预留和未完工数量。
|
- 关闭前提示未领料、未消耗预留和未完工数量。
|
||||||
- 关闭时自动释放剩余预留,不自动伪造成品入库。
|
- 关闭时自动释放剩余预留,不自动伪造成品入库。
|
||||||
- 已发生库存业务的订单不能取消,只能完成或关闭;错误库存业务按撤销过账(冲销)流程处理。
|
- 已发生库存业务的订单不能取消,只能完成或关闭;错误库存业务按撤销过账流程处理。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
@ -826,7 +826,7 @@ BOM 版本状态:
|
||||||
权限模型采用“用户多角色 + 功能权限 + 用户数据范围”的结构:
|
权限模型采用“用户多角色 + 功能权限 + 用户数据范围”的结构:
|
||||||
|
|
||||||
- 角色:用户职责集合,例如仓库管理员、采购人员;一个用户可以同时拥有多个角色。
|
- 角色:用户职责集合,例如仓库管理员、采购人员;一个用户可以同时拥有多个角色。
|
||||||
- 功能权限:每个角色可以对资源执行查看、新建、修改、提交、过账、撤销过账(冲销)、审批和导出等动作。
|
- 功能权限:每个角色可以对资源执行查看、新建、修改、提交、过账、撤销过账、审批和导出等动作。
|
||||||
- 用户数据范围:独立配置用户可访问的经营组织及仓库,不因拥有某个角色而自动扩大。
|
- 用户数据范围:独立配置用户可访问的经营组织及仓库,不因拥有某个角色而自动扩大。
|
||||||
|
|
||||||
通用规则:
|
通用规则:
|
||||||
|
|
@ -839,7 +839,7 @@ BOM 版本状态:
|
||||||
- 本版本不设置角色间的显式拒绝冲突;未被任一角色授予的权限默认拒绝。
|
- 本版本不设置角色间的显式拒绝冲突;未被任一角色授予的权限默认拒绝。
|
||||||
- 服务端必须执行权限校验,前端菜单或按钮隐藏不能替代服务端校验。
|
- 服务端必须执行权限校验,前端菜单或按钮隐藏不能替代服务端校验。
|
||||||
- 未明确授予的权限默认拒绝。
|
- 未明确授予的权限默认拒绝。
|
||||||
- 高风险权限包括库存过账、撤销过账(冲销)、盘点确认、BOM 审批和用户授权,应单独配置。
|
- 高风险权限包括库存过账、撤销过账、盘点确认、BOM 审批和用户授权,应单独配置。
|
||||||
|
|
||||||
#### 故事 #AUTH-001:用户登录
|
#### 故事 #AUTH-001:用户登录
|
||||||
|
|
||||||
|
|
@ -888,7 +888,7 @@ BOM 版本状态:
|
||||||
|
|
||||||
验收标准:
|
验收标准:
|
||||||
|
|
||||||
- 权限粒度至少覆盖查看、新建、修改、提交、过账、撤销过账(冲销)、审批和导出。
|
- 权限粒度至少覆盖查看、新建、修改、提交、过账、撤销过账、审批和导出。
|
||||||
- 关键接口必须具有自动化越权测试。
|
- 关键接口必须具有自动化越权测试。
|
||||||
- 无权限请求返回统一错误且不泄露目标数据是否存在。
|
- 无权限请求返回统一错误且不泄露目标数据是否存在。
|
||||||
|
|
||||||
|
|
@ -946,7 +946,7 @@ BOM 版本状态:
|
||||||
- 登录成功、登录失败、注销和令牌撤销。
|
- 登录成功、登录失败、注销和令牌撤销。
|
||||||
- 用户、角色、功能权限、组织权限和仓库权限变更。
|
- 用户、角色、功能权限、组织权限和仓库权限变更。
|
||||||
- 物料、业务伙伴、仓库、库位、编码规则和 BOM 变更。
|
- 物料、业务伙伴、仓库、库位、编码规则和 BOM 变更。
|
||||||
- 单据提交、过账、取消、撤销过账(冲销)、审批和关闭。
|
- 单据提交、过账、取消、撤销过账、审批和关闭。
|
||||||
- 批量导入、导出及错误报告下载。
|
- 批量导入、导出及错误报告下载。
|
||||||
|
|
||||||
验收标准:
|
验收标准:
|
||||||
|
|
@ -994,7 +994,7 @@ BOM 版本状态:
|
||||||
### 6.1 一致性与并发
|
### 6.1 一致性与并发
|
||||||
|
|
||||||
- 库存单据、流水和余额更新必须具备数据库事务一致性。
|
- 库存单据、流水和余额更新必须具备数据库事务一致性。
|
||||||
- 编码生成、库存扣减、预留、调拨发出、调拨接收、过账和撤销过账(冲销)必须支持并发控制。
|
- 编码生成、库存扣减、预留、调拨发出、调拨接收、过账和撤销过账必须支持并发控制。
|
||||||
- 所有可能被重复提交的写操作必须支持幂等。
|
- 所有可能被重复提交的写操作必须支持幂等。
|
||||||
- 并发修改主数据和单据时使用版本号或等效机制检测覆盖冲突。
|
- 并发修改主数据和单据时使用版本号或等效机制检测覆盖冲突。
|
||||||
|
|
||||||
|
|
@ -1121,7 +1121,7 @@ BOM 版本状态:
|
||||||
| 提交和过账出库单 | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ |
|
| 提交和过账出库单 | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ |
|
||||||
| 创建和提交仓库调拨单 | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ |
|
| 创建和提交仓库调拨单 | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ |
|
||||||
| 执行调拨发出和接收 | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ |
|
| 执行调拨发出和接收 | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ |
|
||||||
| 执行撤销过账(冲销) | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ |
|
| 执行撤销过账 | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ |
|
||||||
| 创建和执行库存盘点 | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ |
|
| 创建和执行库存盘点 | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ |
|
||||||
| 确认盘点差异并过账 | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ |
|
| 确认盘点差异并过账 | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ |
|
||||||
| 创建和释放生产库存预留 | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ |
|
| 创建和释放生产库存预留 | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ |
|
||||||
|
|
@ -1174,6 +1174,6 @@ BOM 版本状态:
|
||||||
- 用户的组织和仓库数据范围独立配置,不因增加角色而自动扩大。
|
- 用户的组织和仓库数据范围独立配置,不因增加角色而自动扩大。
|
||||||
- 用户拥有功能权限但目标数据不在其组织或仓库授权范围内时,仍不得访问或操作。
|
- 用户拥有功能权限但目标数据不在其组织或仓库授权范围内时,仍不得访问或操作。
|
||||||
- 角色被移除或停用后,相关权限从用户下一次请求开始失效。
|
- 角色被移除或停用后,相关权限从用户下一次请求开始失效。
|
||||||
- 库存过账、撤销过账(冲销)、盘点差异过账、BOM 审批和权限分配属于高风险操作,应独立授权。
|
- 库存过账、撤销过账、盘点差异过账、BOM 审批和权限分配属于高风险操作,应独立授权。
|
||||||
- 默认由超级管理员审批 BOM;如果后续需要严格的技术审签,可新增“技术审批人”角色,避免技术人员维护后自行审批。
|
- 默认由超级管理员审批 BOM;如果后续需要严格的技术审签,可新增“技术审批人”角色,避免技术人员维护后自行审批。
|
||||||
- 菜单和按钮根据权限动态显示,但所有权限必须由服务端再次校验。
|
- 菜单和按钮根据权限动态显示,但所有权限必须由服务端再次校验。
|
||||||
|
|
|
||||||
|
|
@ -71,7 +71,7 @@
|
||||||
|
|
||||||
上述状态允许维护主数据、查询本公司历史库存/单据/流水,以及创建申请、驳回、取消等不扣库存操作。入出库创建/修改/删除、预警修改及自动出库审批要求启用维度,禁止借用另一公司的资源。所有启用且授权公司均可使用已有业务模块。
|
上述状态允许维护主数据、查询本公司历史库存/单据/流水,以及创建申请、驳回、取消等不扣库存操作。入出库创建/修改/删除、预警修改及自动出库审批要求启用维度,禁止借用另一公司的资源。所有启用且授权公司均可使用已有业务模块。
|
||||||
|
|
||||||
入出库表头及库存流水保存 `organization_id/warehouse_id/location_id`。修改/删除在事务内锁定当前公司原单据,以原维度冲销,再处理新的本公司明细;失败整体回滚。库存余额锁定完整维度与物料 ID,条件扣减防止透支,多物料按 ID 排序锁定。流水结存只在本公司内计算,提交成功后才发布本公司事件。
|
入出库表头及库存流水保存 `organization_id/warehouse_id/location_id`。修改/删除在事务内锁定当前公司原单据,先按原库存维度恢复原单据造成的库存变化,再处理新的本公司明细;失败整体回滚。库存余额锁定完整维度与物料 ID,条件扣减防止透支,多物料按 ID 排序锁定。流水结存只在本公司内计算,提交成功后才发布本公司事件。
|
||||||
|
|
||||||
### 申请与审批
|
### 申请与审批
|
||||||
|
|
||||||
|
|
@ -534,7 +534,7 @@
|
||||||
|
|
||||||
### PUT /inbound/:id
|
### PUT /inbound/:id
|
||||||
|
|
||||||
更新入库单。服务端会先冲销原明细的库存,再按新明细重新入库,两步在同一事务内完成。
|
更新入库单。服务端会先恢复原明细造成的库存变化,再按新明细重新入库,两步在同一事务内完成。
|
||||||
|
|
||||||
**路径参数:**
|
**路径参数:**
|
||||||
|
|
||||||
|
|
@ -556,7 +556,7 @@
|
||||||
|
|
||||||
### DELETE /inbound/:id
|
### DELETE /inbound/:id
|
||||||
|
|
||||||
删除入库单。同时**冲销该单带来的库存增加**并删除对应的库存流水。
|
删除入库单。同时**恢复该单增加的库存**并删除对应的库存流水。
|
||||||
|
|
||||||
**路径参数:**
|
**路径参数:**
|
||||||
|
|
||||||
|
|
@ -750,7 +750,7 @@
|
||||||
|
|
||||||
### PUT /outbound/:id
|
### PUT /outbound/:id
|
||||||
|
|
||||||
更新出库单。服务端先冲销原明细的库存扣减,再按新明细重新扣减,两步在同一事务内完成。
|
更新出库单。服务端先恢复原明细扣减的库存,再按新明细重新扣减,两步在同一事务内完成。
|
||||||
|
|
||||||
**路径参数:**
|
**路径参数:**
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,8 +15,8 @@
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| 授权/请求边界 | `internal/handler/company_isolation_integration_test.go` | 四类账号经真实登录、路由、认证和组织中间件;缺失/非法头 400,未授权/公司停用 403,授权内跨公司 ID 404 |
|
| 授权/请求边界 | `internal/handler/company_isolation_integration_test.go` | 四类账号经真实登录、路由、认证和组织中间件;缺失/非法头 400,未授权/公司停用 403,授权内跨公司 ID 404 |
|
||||||
| 主数据 | 同上 | 分页总数、编码搜索、分类/单位/规则读写、物料创建/更新/作废/恢复和日志;跨公司引用 400 且不推进编码流水;请求体伪造归属不起作用 |
|
| 主数据 | 同上 | 分页总数、编码搜索、分类/单位/规则读写、物料创建/更新/作废/恢复和日志;跨公司引用 400 且不推进编码流水;请求体伪造归属不起作用 |
|
||||||
| 完整业务链 | 同上 | 两公司分别入库→库存→申请→自动审批出库→出库查询;人工出库修改/删除冲销;预警、流水、申请取消/驳回均按公司隔离 |
|
| 完整业务链 | 同上 | 两公司分别入库→库存→申请→自动审批出库→出库查询;人工出库修改/删除后的库存回退;预警、流水、申请取消/驳回均按公司隔离 |
|
||||||
| 单据冲销 | `internal/handler/order_flow_integration_test.go` | 入出库编辑/删除仅改变本公司;不足库存、停用仓库失败不留下半单或孤立流水 |
|
| 单据库存回退 | `internal/handler/order_flow_integration_test.go` | 入出库编辑/删除仅改变本公司库存;不足库存、停用仓库失败不留下半单或孤立流水 |
|
||||||
| 库存并发 | `internal/repository/stock_test.go` | 真实 MySQL 并发条件扣减不透支;读取、预警、总数、流水与详情限定公司 |
|
| 库存并发 | `internal/repository/stock_test.go` | 真实 MySQL 并发条件扣减不透支;读取、预警、总数、流水与详情限定公司 |
|
||||||
| 审批事务 | `internal/service/application_organization_db_test.go`及新增路由套件 | 原有不足库存/顺序重复审批场景复用;新增同时审批仅一次成功,MySQL trigger 注入流水写入故障后申请/余额/单据/流水一起回滚,解除故障后可重试 |
|
| 审批事务 | `internal/service/application_organization_db_test.go`及新增路由套件 | 原有不足库存/顺序重复审批场景复用;新增同时审批仅一次成功,MySQL trigger 注入流水写入故障后申请/余额/单据/流水一起回滚,解除故障后可重试 |
|
||||||
| 库存配置 | 新增路由套件 | 无仓库、无库位、仓库停用、库位停用四种 409 和具体提示;历史读取及不扣库存操作仍可执行 |
|
| 库存配置 | 新增路由套件 | 无仓库、无库位、仓库停用、库位停用四种 409 和具体提示;历史读取及不扣库存操作仍可执行 |
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@
|
||||||
- 库存最小维度固定为“经营组织 + 仓库 + 库位 + 物料”。
|
- 库存最小维度固定为“经营组织 + 仓库 + 库位 + 物料”。
|
||||||
- 库存数量使用 MySQL `DECIMAL(20,6)`;Go 使用 `github.com/shopspring/decimal`,JSON 使用十进制字符串。
|
- 库存数量使用 MySQL `DECIMAL(20,6)`;Go 使用 `github.com/shopspring/decimal`,JSON 使用十进制字符串。
|
||||||
- 默认禁止负库存,所有扣减在事务和行锁内再次校验。
|
- 默认禁止负库存,所有扣减在事务和行锁内再次校验。
|
||||||
- 只有过账改变库存;已过账单据只能执行撤销过账(冲销),不得修改或删除。
|
- 只有过账改变库存;已过账单据只能执行撤销过账,不得修改或删除。
|
||||||
- 所有写接口接收 `Idempotency-Key`;同一组织、操作类型和幂等键唯一。
|
- 所有写接口接收 `Idempotency-Key`;同一组织、操作类型和幂等键唯一。
|
||||||
- 已被业务引用的主数据只能停用或作废。
|
- 已被业务引用的主数据只能停用或作废。
|
||||||
- 服务端执行全部权限校验,前端菜单隐藏不能替代服务端鉴权。
|
- 服务端执行全部权限校验,前端菜单隐藏不能替代服务端鉴权。
|
||||||
|
|
@ -620,7 +620,7 @@ type AuditEvent struct {
|
||||||
|
|
||||||
- 在第一阶段独立库存余额上增加不可变库存流水和统一过账内核。
|
- 在第一阶段独立库存余额上增加不可变库存流水和统一过账内核。
|
||||||
- 入库、出库、调拨、盘点和预留全部通过统一库存服务。
|
- 入库、出库、调拨、盘点和预留全部通过统一库存服务。
|
||||||
- 已过账业务只能执行撤销过账(冲销),所有库存变化可追溯。
|
- 已过账业务只能执行撤销过账,所有库存变化可追溯。
|
||||||
- 可用库存低于阈值时形成可处理的站内预警。
|
- 可用库存低于阈值时形成可处理的站内预警。
|
||||||
|
|
||||||
### Task 9:建立库存流水和过账内核
|
### Task 9:建立库存流水和过账内核
|
||||||
|
|
@ -709,7 +709,7 @@ type AuditEvent struct {
|
||||||
|
|
||||||
- [ ] 提交:`feat: migrate inventory and add document lifecycle`。
|
- [ ] 提交:`feat: migrate inventory and add document lifecycle`。
|
||||||
|
|
||||||
### Task 11:实现撤销过账(冲销)
|
### Task 11:实现撤销过账
|
||||||
|
|
||||||
**Files:**
|
**Files:**
|
||||||
|
|
||||||
|
|
@ -734,7 +734,7 @@ type AuditEvent struct {
|
||||||
|
|
||||||
- [ ] 撤销过账记录不得再次撤销;重复幂等键返回第一次结果。
|
- [ ] 撤销过账记录不得再次撤销;重复幂等键返回第一次结果。
|
||||||
|
|
||||||
- [ ] 前端按钮统一使用“撤销过账(冲销)”,强制填写原因并显示不可逆提示。
|
- [ ] 前端按钮统一使用“撤销过账”,强制填写原因并显示不可逆提示。
|
||||||
|
|
||||||
- [ ] 编写入库撤销、出库撤销、余额不足、重复撤销和审计测试。
|
- [ ] 编写入库撤销、出库撤销、余额不足、重复撤销和审计测试。
|
||||||
|
|
||||||
|
|
@ -1032,7 +1032,7 @@ type AuditEvent struct {
|
||||||
|
|
||||||
- [ ] 关闭订单时释放剩余预留,不自动生成成品入库。
|
- [ ] 关闭订单时释放剩余预留,不自动生成成品入库。
|
||||||
|
|
||||||
- [ ] 已发生库存业务的订单不得取消;错误业务使用撤销过账(冲销)。
|
- [ ] 已发生库存业务的订单不得取消;错误业务使用撤销过账。
|
||||||
|
|
||||||
- [ ] 编写分批领料、部分完工、退料、超领、重复请求、关闭释放和 BOM 版本锁定测试。
|
- [ ] 编写分批领料、部分完工、退料、超领、重复请求、关闭释放和 BOM 版本锁定测试。
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -77,7 +77,7 @@
|
||||||
本版同时完成库存、入库、出库、申请、审批和实时推送隔离。所有已授权且启用的公司都能使用现有业务功能,不设置仅历史默认公司可用的限制;功能角色权限仍单独校验。
|
本版同时完成库存、入库、出库、申请、审批和实时推送隔离。所有已授权且启用的公司都能使用现有业务功能,不设置仅历史默认公司可用的限制;功能角色权限仍单独校验。
|
||||||
|
|
||||||
- 库存列表、预警、详情、流水、分页总数、按物料查询只包含当前公司;关联查询同时校验物料、仓库及库位归属。
|
- 库存列表、预警、详情、流水、分页总数、按物料查询只包含当前公司;关联查询同时校验物料、仓库及库位归属。
|
||||||
- 入出库单据及申请保存公司归属。入出库单据保存唯一仓库、库位;单据明细物料必须属于同一公司。更新、删除及库存冲销只能操作该公司原单据及原库存维度。
|
- 入出库单据及申请保存公司归属。入出库单据保存唯一仓库、库位;单据明细物料必须属于同一公司。更新、删除及库存回退只能操作该公司原单据及原库存维度。
|
||||||
- 新建申请时锁定所属公司;我的申请列表按“当前公司 + 当前用户”查询,审批列表按当前公司查询,审批人需要该公司授权及已有审批功能权限。
|
- 新建申请时锁定所属公司;我的申请列表按“当前公司 + 当前用户”查询,审批列表按当前公司查询,审批人需要该公司授权及已有审批功能权限。
|
||||||
- 审批、驳回、取消均检查申请归属和状态。自动出库在同一事务内锁定本公司申请、扣减本公司库存、建立本公司出库单及流水并修改申请状态,不跨公司取库存,不因切换页面而改变申请归属。
|
- 审批、驳回、取消均检查申请归属和状态。自动出库在同一事务内锁定本公司申请、扣减本公司库存、建立本公司出库单及流水并修改申请状态,不跨公司取库存,不因切换页面而改变申请归属。
|
||||||
- 所有库存读写显式携带公司、仓库、库位,删除 `DEFAULT`/`MAIN` 和 ID 1 的运行时兜底;这些编码只可用于核验已确认的历史数据,不参与新业务路由。
|
- 所有库存读写显式携带公司、仓库、库位,删除 `DEFAULT`/`MAIN` 和 ID 1 的运行时兜底;这些编码只可用于核验已确认的历史数据,不参与新业务路由。
|
||||||
|
|
@ -103,7 +103,7 @@
|
||||||
- 全部功能、设计约定和完成标准保留;只精简测试组织与重复执行。已完成任务的勾选及验证记录保持原样。
|
- 全部功能、设计约定和完成标准保留;只精简测试组织与重复执行。已完成任务的勾选及验证记录保持原样。
|
||||||
- 同一业务场景选择一个主要测试入口,不在 Handler、Service、Repository 三层重复编写相同用例。优先复用现有测试文件,Files 中列出的测试文件按实际职责选用,不要求逐个新增。
|
- 同一业务场景选择一个主要测试入口,不在 Handler、Service、Repository 三层重复编写相同用例。优先复用现有测试文件,Files 中列出的测试文件按实际职责选用,不要求逐个新增。
|
||||||
- 授权和请求边界使用表驱动测试;前端集中测试公司 store、请求上下文和一个代表性业务页面。各页面已有测试随接口变化维护,不为每个页面复制整套切换测试。
|
- 授权和请求边界使用表驱动测试;前端集中测试公司 store、请求上下文和一个代表性业务页面。各页面已有测试随接口变化维护,不为每个页面复制整套切换测试。
|
||||||
- 库存隔离、入出库冲销、审批事务及数据库约束统一使用 Task 8 的真实 MySQL 双公司测试集。任务 5A~5C 逐步补充并运行相关场景,不再另建重复的真实数据库测试集。
|
- 库存隔离、入出库编辑和删除后的库存回退、审批事务及数据库约束统一使用 Task 8 的真实 MySQL 双公司测试集。任务 5A~5C 逐步补充并运行相关场景,不再另建重复的真实数据库测试集。
|
||||||
- 每个任务完成后运行受影响的测试即可,不要求每项新增用例单独执行“先确认失败”。修复具体缺陷时仍先复现;只有变更、失败或未解决问题才需要重复运行。
|
- 每个任务完成后运行受影响的测试即可,不要求每项新增用例单独执行“先确认失败”。修复具体缺陷时仍先复现;只有变更、失败或未解决问题才需要重复运行。
|
||||||
- 最终运行一次全量 Go/前端测试和构建,并完成一次浏览器验收与升级演练。不可省略:跨公司越权、授权撤销、库存并发/回滚、重复审批、A→B→A 旧响应、WebSocket 串流、历史数据升级。
|
- 最终运行一次全量 Go/前端测试和构建,并完成一次浏览器验收与升级演练。不可省略:跨公司越权、授权撤销、库存并发/回滚、重复审批、A→B→A 旧响应、WebSocket 串流、历史数据升级。
|
||||||
- 后端任务的定向验证按相关包或现有测试名称运行;前端按实际修改的测试文件运行。命令不要求新测试沿用特定命名,完整交付命令见 Task 8。
|
- 后端任务的定向验证按相关包或现有测试名称运行;前端按实际修改的测试文件运行。命令不要求新测试沿用特定命名,完整交付命令见 Task 8。
|
||||||
|
|
@ -259,11 +259,11 @@ func (r *StockRepo) UpdateStockTx(tx *sql.Tx, scope model.InventoryScope, materi
|
||||||
- [ ] 在共享双公司 MySQL 测试集中覆盖库存读取与预警:同物料编码但不同 ID/余额,A 的库存列表、总数、预警、详情和库存流水只含 A;传 B 的物料 ID 返回 404;A 的预警调整不改 B。
|
- [ ] 在共享双公司 MySQL 测试集中覆盖库存读取与预警:同物料编码但不同 ID/余额,A 的库存列表、总数、预警、详情和库存流水只含 A;传 B 的物料 ID 返回 404;A 的预警调整不改 B。
|
||||||
- [ ] 将 `GetDefaultStock/GetStockForUpdateTx/UpdateStockTx`、预警 upsert 和空余额创建中的默认公司编码改为 scope 参数;所有计数与聚合按公司过滤,关联条件包含物料和仓库组织一致性。
|
- [ ] 将 `GetDefaultStock/GetStockForUpdateTx/UpdateStockTx`、预警 upsert 和空余额创建中的默认公司编码改为 scope 参数;所有计数与聚合按公司过滤,关联条件包含物料和仓库组织一致性。
|
||||||
- [ ] 更新 `StockLog` 模型和 INSERT,显式保存三个库存维度;按物料/全量流水及带结存流水均按公司计算,不能先全局计算结存再过滤。
|
- [ ] 更新 `StockLog` 模型和 INSERT,显式保存三个库存维度;按物料/全量流水及带结存流水均按公司计算,不能先全局计算结存再过滤。
|
||||||
- [ ] 出库锁定 `(organization_id, warehouse_id, location_id, material_id)` 余额行,余额不存在按 0 处理。条件扣减保证余额足够,入库创建余额使用现有维度唯一键;修改/冲销遵循原库存规则,同维度多物料按 ID 排序加锁。
|
- [ ] 出库锁定 `(organization_id, warehouse_id, location_id, material_id)` 余额行,余额不存在按 0 处理。条件扣减保证余额足够,入库创建余额使用现有维度唯一键;修改及恢复原库存遵循原库存规则,同维度多物料按 ID 排序加锁。
|
||||||
- [ ] 在同一测试集中以表驱动覆盖无仓库、无库位、停用、跨公司仓库/物料;增加一次并发扣减验证,确认不会透支、不会锁错公司,也不会创建默认公司的余额。
|
- [ ] 在同一测试集中以表驱动覆盖无仓库、无库位、停用、跨公司仓库/物料;增加一次并发扣减验证,确认不会透支、不会锁错公司,也不会创建默认公司的余额。
|
||||||
- [ ] 运行对应测试,提交:`feat: isolate inventory balances and logs by company`。
|
- [ ] 运行对应测试,提交:`feat: isolate inventory balances and logs by company`。
|
||||||
|
|
||||||
### Task 5B:入出库单据和库存冲销隔离
|
### Task 5B:入出库单据修改删除与库存回退隔离
|
||||||
|
|
||||||
**Files:**
|
**Files:**
|
||||||
- 修改:`internal/model/model.go`、`internal/repository/inbound.go`、`internal/repository/outbound.go`、`internal/service/inbound.go`、`internal/service/outbound.go`、`internal/handler/api.go`。
|
- 修改:`internal/model/model.go`、`internal/repository/inbound.go`、`internal/repository/outbound.go`、`internal/service/inbound.go`、`internal/service/outbound.go`、`internal/handler/api.go`。
|
||||||
|
|
@ -273,7 +273,7 @@ func (r *StockRepo) UpdateStockTx(tx *sql.Tx, scope model.InventoryScope, materi
|
||||||
|
|
||||||
- [ ] 在共享双公司 MySQL 测试集中以表驱动覆盖入出库隔离:A 不能读/改/删 B 单据,按物料历史记录与分页总数也隔离;新建/修改单据引用 B 物料时无单据、余额或流水变化。
|
- [ ] 在共享双公司 MySQL 测试集中以表驱动覆盖入出库隔离:A 不能读/改/删 B 单据,按物料历史记录与分页总数也隔离;新建/修改单据引用 B 物料时无单据、余额或流水变化。
|
||||||
- [ ] 新建时解析启用库存 scope,后端填写单据三个维度,忽略前端伪造归属;所有头表 INSERT 显式保存维度。单据编号保留现有全局唯一策略,不额外改为公司内编号。
|
- [ ] 新建时解析启用库存 scope,后端填写单据三个维度,忽略前端伪造归属;所有头表 INSERT 显式保存维度。单据编号保留现有全局唯一策略,不额外改为公司内编号。
|
||||||
- [ ] 查询头表加组织条件,明细经已授权头表关联并限制同组织物料;对更新和删除,在事务中锁定当前公司的原单据,按原单据维度冲销原库存,再处理修改后的同公司物料,失败整体回滚。
|
- [ ] 查询头表加组织条件,明细经已授权头表关联并限制同组织物料;对更新和删除,在事务中锁定当前公司的原单据,按原单据维度恢复原单据造成的库存变化,再处理修改后的同公司物料,失败整体回滚。
|
||||||
- [ ] 库存流水删除同时约束组织、关联类型和单据 ID,不删除其他公司的流水;提交完成后才发布带组织 ID 的库存事件。
|
- [ ] 库存流水删除同时约束组织、关联类型和单据 ID,不删除其他公司的流水;提交完成后才发布带组织 ID 的库存事件。
|
||||||
- [ ] 扩展同一测试集的单据流程:A 的入库/出库/编辑/删除只改变 A 库存;B 保持不变;库存不足及仓库停用错误不会留下半张单据或孤立流水。
|
- [ ] 扩展同一测试集的单据流程:A 的入库/出库/编辑/删除只改变 A 库存;B 保持不变;库存不足及仓库停用错误不会留下半张单据或孤立流水。
|
||||||
- [ ] 运行对应测试,提交:`feat: isolate inbound and outbound workflows by company`。
|
- [ ] 运行对应测试,提交:`feat: isolate inbound and outbound workflows by company`。
|
||||||
|
|
@ -373,7 +373,7 @@ func (h *Hub) BroadcastStockUpdate(organizationID int64, action string, orderID
|
||||||
|
|
||||||
- [x] 在独立 MySQL 测试库创建北京/武汉两个公司、不同分类/单位/规则、同编码物料;准备仅北京、仅武汉、两公司及超级管理员四类账号。
|
- [x] 在独立 MySQL 测试库创建北京/武汉两个公司、不同分类/单位/规则、同编码物料;准备仅北京、仅武汉、两公司及超级管理员四类账号。
|
||||||
- [x] 汇总并运行任务 4、5A~5C 的双公司场景,使用同一组数据经过真实路由、中间件和 MySQL 验证授权、分页总数、按 ID/编码读取、创建、更新、作废、恢复、日志和外键引用,不另写一套重复用例。测试显式设置 `TEST_DB_DSN`;未配置导致跳过时不能计为验收通过。
|
- [x] 汇总并运行任务 4、5A~5C 的双公司场景,使用同一组数据经过真实路由、中间件和 MySQL 验证授权、分页总数、按 ID/编码读取、创建、更新、作废、恢复、日志和外键引用,不另写一套重复用例。测试显式设置 `TEST_DB_DSN`;未配置导致跳过时不能计为验收通过。
|
||||||
- [x] 为两个公司分别配置唯一仓库、库位及同编码物料,执行入库→库存查询→申请→审批自动出库→出库查询完整流程,验证所有记录和扣减属于各自公司;对入出库修改/删除冲销、预警、流水及申请驳回/取消逐项测试。
|
- [x] 为两个公司分别配置唯一仓库、库位及同编码物料,执行入库→库存查询→申请→审批自动出库→出库查询完整流程,验证所有记录和扣减属于各自公司;对入出库修改/删除后的库存回退、预警、流水及申请驳回/取消逐项测试。
|
||||||
- [x] 浏览器验收依次切换北京→武汉→北京,检查页面和编码流水独立;模拟慢网、保存中切换、撤销授权、停用公司、刷新及登出换账号。
|
- [x] 浏览器验收依次切换北京→武汉→北京,检查页面和编码流水独立;模拟慢网、保存中切换、撤销授权、停用公司、刷新及登出换账号。
|
||||||
- [x] 验证两个启用授权公司均可使用所有现有业务模块;无仓库、无库位或停用时库存写操作返回具体 409 配置提示,其他公司的资源 ID 返回 404。没有默认公司专属业务限制。
|
- [x] 验证两个启用授权公司均可使用所有现有业务模块;无仓库、无库位或停用时库存写操作返回具体 409 配置提示,其他公司的资源 ID 返回 404。没有默认公司专属业务限制。
|
||||||
- [x] 在同一次浏览器验收中验证双公司 WebSocket 并行连接不会互串,撤销公司授权/角色或退出登录后旧连接停止投递;核对共享 MySQL 测试集的并发出库、重复审批和事务故障结果,不重复编写同类测试。
|
- [x] 在同一次浏览器验收中验证双公司 WebSocket 并行连接不会互串,撤销公司授权/角色或退出登录后旧连接停止投递;核对共享 MySQL 测试集的并发出库、重复审批和事务故障结果,不重复编写同类测试。
|
||||||
|
|
@ -407,6 +407,6 @@ git diff --check
|
||||||
- [ ] 切换不残留旧公司的列表、弹窗、详情、缓存、响应或错误提示。
|
- [ ] 切换不残留旧公司的列表、弹窗、详情、缓存、响应或错误提示。
|
||||||
- [ ] 授权撤销、角色撤销和公司停用在下一次请求生效。
|
- [ ] 授权撤销、角色撤销和公司停用在下一次请求生效。
|
||||||
- [ ] 库存、预警、入出库、申请、审批、相关日志及实时推送全部按公司隔离;所有授权启用公司可使用现有业务,没有“仅历史默认公司开放”的临时限制。
|
- [ ] 库存、预警、入出库、申请、审批、相关日志及实时推送全部按公司隔离;所有授权启用公司可使用现有业务,没有“仅历史默认公司开放”的临时限制。
|
||||||
- [ ] 本公司库存增加、扣减和冲销只影响本公司余额;审批自动出库在同一公司和事务内完成,重复审批及并发出库不会造成重复扣减或库存透支。
|
- [ ] 本公司库存增加、扣减及恢复原单据造成的库存变化只影响本公司余额;审批自动出库在同一公司和事务内完成,重复审批及并发出库不会造成重复扣减或库存透支。
|
||||||
- [ ] 组织切换、授权变更可审计;历史数据与原有默认公司业务可追溯。
|
- [ ] 组织切换、授权变更可审计;历史数据与原有默认公司业务可追溯。
|
||||||
- [ ] Go、前端测试、构建及真实数据库升级验证均有新鲜执行证据。
|
- [ ] Go、前端测试、构建及真实数据库升级验证均有新鲜执行证据。
|
||||||
|
|
|
||||||
222
docs/回归测试用例.md
Normal file
222
docs/回归测试用例.md
Normal file
|
|
@ -0,0 +1,222 @@
|
||||||
|
# 物料管理系统回归测试用例
|
||||||
|
|
||||||
|
更新时间:2026-10-09
|
||||||
|
|
||||||
|
本文用于版本发布前的人工回归检查。用例依据当前仓库已实现的入库、出库、库存、物料申请审批、物料主数据和组织隔离功能编写;权限功能暂不纳入本轮回归。测试时请使用隔离的测试环境和测试账号;涉及库存变更的用例应使用专用测试物料,执行前记录库存基线。
|
||||||
|
|
||||||
|
## 通用测试准备
|
||||||
|
|
||||||
|
- 准备可执行对应业务操作的测试账号;组织切换用例需准备两个可访问的组织。
|
||||||
|
- 准备有效物料 M1(库存不少于 20)、有效物料 M2(库存不少于 10),并记录各自的组织、库存和库存流水。
|
||||||
|
- 准备已作废物料 M3(仅用于历史查询用例),以及可用仓库、库位。
|
||||||
|
- 记录测试前单据列表、库存余额、库存流水条数和申请状态;每个用例使用独立单据或执行后恢复测试数据。
|
||||||
|
- 下文提到的“库存”均指当前组织库存查询页显示的现存量;预警用例按当前系统口径检查现存量。
|
||||||
|
|
||||||
|
## 用例列表
|
||||||
|
|
||||||
|
### TC-01 新增入库单后库存增加
|
||||||
|
|
||||||
|
**测试内容:** 验证新增入库单、明细、库存余额和流水的一致性。
|
||||||
|
|
||||||
|
**前置数据:** M1 当前库存为 10。
|
||||||
|
|
||||||
|
**操作步骤:**
|
||||||
|
|
||||||
|
1. 进入「库存管理 → 入库管理」,点击「新增入库单」。
|
||||||
|
2. 选择 M1,数量填写 5;填写经手人、供应商和备注。
|
||||||
|
3. 保存,打开新单详情;再到「库存查询」和「库存流水」查询 M1。
|
||||||
|
|
||||||
|
**判断指标:** 单据及明细保存成功,详情数量为 5;M1 库存变为 15;新增一条入库流水,数量为 +5,变动前后分别为 10 和 15。刷新页面后结果一致。
|
||||||
|
|
||||||
|
### TC-02 入库单多物料明细
|
||||||
|
|
||||||
|
**测试内容:** 验证一张入库单包含多条物料明细时分别更新库存。
|
||||||
|
|
||||||
|
**前置数据:** M1 库存 10,M2 库存 20。
|
||||||
|
|
||||||
|
**操作步骤:** 新建入库单,添加 M1 数量 3、M2 数量 4,填写必填信息并保存;查看单据详情、两种物料库存及流水。
|
||||||
|
|
||||||
|
**判断指标:** 单据详情有且仅有两条对应明细;M1 为 13、M2 为 24;两种物料各有一条来源为该入库单的入库流水,数量分别为 +3、+4。
|
||||||
|
|
||||||
|
### TC-03 编辑入库单后库存按新数量更新
|
||||||
|
|
||||||
|
**测试内容:** 验证编辑入库单不会重复累加原数量,且库存按新明细重算。
|
||||||
|
|
||||||
|
**前置数据:** M1 库存 15,其中目标入库单贡献 5。
|
||||||
|
|
||||||
|
**操作步骤:** 在入库列表找到目标单据,点击「编辑」,将 M1 数量从 5 改为 8 并保存;检查详情、库存及相关流水。
|
||||||
|
|
||||||
|
**判断指标:** 详情数量为 8;M1 最终库存为 18(只净增加 8);流水与修改后的单据和最终余额相符,不出现重复增加到 23 的情况。
|
||||||
|
|
||||||
|
### TC-04 删除入库单后库存回退
|
||||||
|
|
||||||
|
**测试内容:** 验证删除入库单会按原单据维度冲回库存。
|
||||||
|
|
||||||
|
**前置数据:** M1 库存 15,其中待删入库单贡献 5。
|
||||||
|
|
||||||
|
**操作步骤:** 在入库列表删除目标单据并确认;重新查询单据列表、M1 库存和库存流水。
|
||||||
|
|
||||||
|
**判断指标:** 该单据不再出现在列表;M1 库存恢复到 10;该单据对应的库存流水已按删除后的结果更新,库存余额核对一致。
|
||||||
|
|
||||||
|
### TC-05 新增出库单扣减库存
|
||||||
|
|
||||||
|
**测试内容:** 验证正常出库的单据、库存和流水联动。
|
||||||
|
|
||||||
|
**前置数据:** M1 当前库存为 10。
|
||||||
|
|
||||||
|
**操作步骤:** 进入「出库管理」,新增出库单,选择 M1 数量 4,填写接收方并保存;查看详情、库存和流水。
|
||||||
|
|
||||||
|
**判断指标:** 单据明细数量为 4;M1 库存变为 6;新增一条出库流水,类型为出库、数量为 4,变动前后为 10 和 6。
|
||||||
|
|
||||||
|
### TC-06 库存不足时拒绝出库并保持数据不变
|
||||||
|
|
||||||
|
**测试内容:** 验证出库数量超过库存时服务端拦截且不产生部分写入。
|
||||||
|
|
||||||
|
**前置数据:** M1 当前库存为 3。
|
||||||
|
|
||||||
|
**操作步骤:** 新增出库单,选择 M1 数量 4,填写接收方并保存;检查提示、出库单列表、库存和流水。
|
||||||
|
|
||||||
|
**判断指标:** 保存失败并提示库存不足或等效错误;没有新增有效出库单或出库明细;M1 仍为 3;没有对应出库流水。
|
||||||
|
|
||||||
|
### TC-07 编辑出库单时正确返还旧数量并扣减新数量
|
||||||
|
|
||||||
|
**测试内容:** 验证修改出库单明细后库存按差额更新。
|
||||||
|
|
||||||
|
**前置数据:** M1 库存 6,目标出库单原数量为 4(出库前为 10)。
|
||||||
|
|
||||||
|
**操作步骤:** 编辑目标出库单,将 M1 数量由 4 改为 2 并保存;检查单据详情、库存和流水。
|
||||||
|
|
||||||
|
**判断指标:** 详情数量为 2;M1 最终库存为 8;不会仍按旧的 4 件扣减,也不会再次扣除新数量导致余额错误。
|
||||||
|
|
||||||
|
### TC-08 申请提交、本人列表和取消
|
||||||
|
|
||||||
|
**测试内容:** 验证申请人创建待审批申请、查看本人申请并取消。
|
||||||
|
|
||||||
|
**前置数据:** 使用普通申请账号登录;M1 有足够库存。
|
||||||
|
|
||||||
|
**操作步骤:** 在「物料申请 → 发起申请」填写用途,添加 M1 数量 2 并提交;切换到「我的申请」找到记录并取消。
|
||||||
|
|
||||||
|
**判断指标:** 提交后生成一条待审批申请,物料和数量正确;取消后状态为已取消;库存不变;该记录不再显示待审批操作。
|
||||||
|
|
||||||
|
### TC-09 审批拒绝并记录原因
|
||||||
|
|
||||||
|
**测试内容:** 验证审批人拒绝申请及原因展示。
|
||||||
|
|
||||||
|
**前置数据:** 存在一条待审批申请;使用有审批权限的账号。
|
||||||
|
|
||||||
|
**操作步骤:** 打开「申请审批」,对目标申请点击「拒绝」,填写原因“需求信息不完整”并确认;申请人重新查看「我的申请」。
|
||||||
|
|
||||||
|
**判断指标:** 申请状态变为已拒绝;拒绝原因与输入一致并可由申请人查看;库存不变;该申请不能再次通过或拒绝。
|
||||||
|
|
||||||
|
### TC-10 审批通过并自动出库
|
||||||
|
|
||||||
|
**测试内容:** 验证自动出库审批事务性地更新申请、库存、出库单和流水。
|
||||||
|
|
||||||
|
**前置数据:** M1 库存 10;存在数量为 3 的待审批申请。
|
||||||
|
|
||||||
|
**操作步骤:** 审批人打开目标申请,点击「通过」,保持「自动出库」开启并确认;检查申请状态、出库列表、M1 库存及流水。
|
||||||
|
|
||||||
|
**判断指标:** 申请变为已通过;产生对应出库单及数量 3 的明细;M1 变为 7;产生来源为该申请的出库流水,数量为 3。重复刷新或再次处理不得重复扣库存。
|
||||||
|
|
||||||
|
### TC-11 审批通过但不自动出库
|
||||||
|
|
||||||
|
**测试内容:** 验证关闭自动出库时只审批,不修改库存。
|
||||||
|
|
||||||
|
**前置数据:** M1 库存 10;存在数量为 3 的待审批申请。
|
||||||
|
|
||||||
|
**操作步骤:** 审批人点击「通过」,关闭「自动出库」后确认;查看申请状态、库存、出库列表和流水。
|
||||||
|
|
||||||
|
**判断指标:** 申请变为已通过;M1 仍为 10;没有由本次审批生成的出库单或库存流水。
|
||||||
|
|
||||||
|
### TC-12 自动出库审批库存不足时整体回滚
|
||||||
|
|
||||||
|
**测试内容:** 验证申请自动出库失败不会留下半完成的数据。
|
||||||
|
|
||||||
|
**前置数据:** M1 当前库存 2;存在数量为 3 的待审批申请。
|
||||||
|
|
||||||
|
**操作步骤:** 审批人对该申请选择自动出库并确认;检查提示、申请状态、库存、出库列表及流水。
|
||||||
|
|
||||||
|
**判断指标:** 操作失败并提示库存不足或等效错误;申请仍为待审批;M1 仍为 2;未生成出库单和出库流水。
|
||||||
|
|
||||||
|
### TC-13 设置库存预警及阈值边界
|
||||||
|
|
||||||
|
**测试内容:** 验证预警启停与“库存小于等于阈值”规则。
|
||||||
|
|
||||||
|
**前置数据:** 准备库存为 5 的 M1。
|
||||||
|
|
||||||
|
**操作步骤:** 在「库存查询」打开 M1 的「设置预警」,启用预警并将阈值设为 5 保存;检查「库存预警」列表。随后将阈值改为 0,并分别验证库存为 0 和大于 0 的结果;最后关闭预警。
|
||||||
|
|
||||||
|
**判断指标:** 库存等于阈值时出现在预警列表;阈值 0 合法且库存为 0 时预警、库存大于 0 时不预警;关闭后不再出现在预警列表,阈值配置可保留。
|
||||||
|
|
||||||
|
### TC-14 库存查询筛选与详情
|
||||||
|
|
||||||
|
**测试内容:** 验证按物料编码/名称和分类查询,以及库存详情展示。
|
||||||
|
|
||||||
|
**前置数据:** 至少准备两个不同分类的有效物料和对应库存。
|
||||||
|
|
||||||
|
**操作步骤:** 在「库存查询」分别按物料编码、名称关键词和分类筛选;清空条件后点击一条记录的「详情」。
|
||||||
|
|
||||||
|
**判断指标:** 每种筛选只返回匹配记录,清空条件后恢复列表;详情显示正确的组织、仓库、库位、现存量、预留、锁定和在途数量,与测试数据一致。
|
||||||
|
|
||||||
|
### TC-15 库存流水查询及来源关联
|
||||||
|
|
||||||
|
**测试内容:** 验证入库、出库和申请自动出库产生的流水可筛选并显示来源。
|
||||||
|
|
||||||
|
**前置数据:** 依次准备一笔入库、一笔普通出库和一笔自动出库审批。
|
||||||
|
|
||||||
|
**操作步骤:** 打开「库存查询 → 库存流水」,按物料查询;逐条检查变动类型、数量、前后库存、来源类型和来源编号。
|
||||||
|
|
||||||
|
**判断指标:** 三类变动均可查到;入库方向和出库方向正确;前后数量连续匹配库存变更;来源分别对应入库单、出库单和申请。
|
||||||
|
|
||||||
|
### TC-16 组织切换后数据和缓存隔离
|
||||||
|
|
||||||
|
**测试内容:** 验证用户切换已授权组织后页面数据刷新,不串用上一个组织的数据。
|
||||||
|
|
||||||
|
**前置数据:** 组织 A 与组织 B 各有不同编码的物料及不同库存;测试账号有两组织访问权限。
|
||||||
|
|
||||||
|
**操作步骤:** 切换到组织 A,记录库存列表及 M1 库存;切换到组织 B,查询库存、预警、流水和入库/出库列表;再切回 A 查询。
|
||||||
|
|
||||||
|
**判断指标:** 每个组织只显示本组织的数据;切换后列表、筛选、分页和单物料库存信息更新;返回 A 后恢复 A 的数据,不显示 B 的单据、流水或库存。
|
||||||
|
|
||||||
|
### TC-17 物料主数据编辑、变更记录与作废约束
|
||||||
|
|
||||||
|
**测试内容:** 验证物料基础资料修改留下变更记录,且仍有库存的物料不能作废。
|
||||||
|
|
||||||
|
**前置数据:** M1 有非零库存;准备一件库存为 0 且无阻止作废业务记录的有效测试物料 M4。
|
||||||
|
|
||||||
|
**操作步骤:** 在「物料」编辑 M1 的名称/规格并保存,查看对应物料日志;尝试作废 M1;再对 M4 执行作废并检查物料列表和历史查询选项。
|
||||||
|
|
||||||
|
**判断指标:** M1 修改成功且日志可见修改前后信息;M1 因仍有库存而作废失败,状态不变;M4 作废成功,常规业务物料选择不再可选,库存流水历史检索仍可找到已作废物料。
|
||||||
|
|
||||||
|
### TC-18 物料基础配置与编码生成
|
||||||
|
|
||||||
|
**测试内容:** 验证物料分类、计量单位和编码规则能够配置,并被新增物料流程正确使用。
|
||||||
|
|
||||||
|
**前置数据:** 使用可维护物料主数据的测试账号;准备尚未使用的分类编码、单位编码和编码前缀。
|
||||||
|
|
||||||
|
**操作步骤:** 在「物料主数据 → 基础配置」依次新增一个大类、其下的小类、一个计量单位,并为小类配置启用的编码规则(例如前缀 `RT`、流水号 4 位、下一流水号 1);进入「物料」新增物料,选择该大类、小类和单位,保存后再次新增一件同分类物料。
|
||||||
|
|
||||||
|
**判断指标:** 配置项保存并在列表显示正确;新增物料可选到对应分类和单位;系统按规则生成编码(例如 `RT0001`、`RT0002`),编码不重复,物料详情显示所选分类和单位。
|
||||||
|
|
||||||
|
### TC-19 供应商和客户资料维护
|
||||||
|
|
||||||
|
**测试内容:** 验证业务伙伴新增、编辑、分类筛选及供应商/客户身份页面数据正确。
|
||||||
|
|
||||||
|
**前置数据:** 准备唯一伙伴编码及未使用的测试企业名称;供应商与客户页面均可访问。
|
||||||
|
|
||||||
|
**操作步骤:** 在「业务伙伴 → 供应商」新增一条供应商资料,填写伙伴编码、企业名称、联系人和电话,并选择一个业务分类;保存后按分类筛选并打开详情;编辑联系人信息并保存。再到「客户」页面新增一条客户资料,检查列表和详情。
|
||||||
|
|
||||||
|
**判断指标:** 两类资料均保存成功且字段显示正确;供应商分类筛选结果匹配;编辑后联系人信息更新;供应商资料显示在供应商页面,客户资料显示在客户页面,页面间无错误混列。
|
||||||
|
|
||||||
|
## 执行结果记录
|
||||||
|
|
||||||
|
| 用例编号 | 执行日期 | 执行人 | 结果(通过/失败/阻塞) | 缺陷单号或备注 |
|
||||||
|
| --- | --- | --- | --- | --- |
|
||||||
|
| | | | | |
|
||||||
|
|
||||||
|
## 使用说明
|
||||||
|
|
||||||
|
- 每次回归记录软件版本、测试环境、账号角色和执行结果;库存相关用例同时记录物料、组织及测试前后库存。
|
||||||
|
- 失败时保留单据编号、申请编号、物料编码、操作时间和页面提示,便于定位。
|
||||||
|
- 涉及修改或删除单据的用例,核对库存余额及库存流水与最终单据一致;库存流水不作为不可修改的审计日志。
|
||||||
|
- 当前系统没有独立盘点、调拨、BOM或批量导入业务流程,本清单不将这些未接入功能作为现有功能验收项。
|
||||||
|
|
@ -227,7 +227,7 @@
|
||||||
| `warehouses` | `UNIQUE(organization_id)`,停用仓库仍占名额 |
|
| `warehouses` | `UNIQUE(organization_id)`,停用仓库仍占名额 |
|
||||||
| `warehouse_locations` | `UNIQUE(warehouse_id)`,停用库位仍占名额 |
|
| `warehouse_locations` | `UNIQUE(warehouse_id)`,停用库位仍占名额 |
|
||||||
| `inventory_balances` | 余额以 `(organization_id, warehouse_id, location_id, material_id)` 唯一,事务锁定完整维度并条件扣减 |
|
| `inventory_balances` | 余额以 `(organization_id, warehouse_id, location_id, material_id)` 唯一,事务锁定完整维度并条件扣减 |
|
||||||
| `inbound_orders`、`outbound_orders` | 三个库存维度为非空归属字段;创建由后端解析,修改/删除锁定本公司原单并以原维度冲销 |
|
| `inbound_orders`、`outbound_orders` | 三个库存维度为非空归属字段;创建由后端解析,修改/删除锁定本公司原单并按原库存维度恢复原单造成的库存变化 |
|
||||||
| `stock_logs` | 保存非空 `organization_id/warehouse_id/location_id`,索引 `(organization_id, material_id, created_at)`;关联单据和物料均校验公司 |
|
| `stock_logs` | 保存非空 `organization_id/warehouse_id/location_id`,索引 `(organization_id, material_id, created_at)`;关联单据和物料均校验公司 |
|
||||||
| `material_applications` | 非空 `organization_id`;索引 `(organization_id,user_id,created_at)`、`(organization_id,status,created_at)`;状态更新携带原状态条件 |
|
| `material_applications` | 非空 `organization_id`;索引 `(organization_id,user_id,created_at)`、`(organization_id,status,created_at)`;状态更新携带原状态条件 |
|
||||||
| `organization_audit_logs` | `actor_user_id`、可空 `organization_id`、`action`、JSON `old_value/new_value`、`created_at`;按公司/时间和操作者/时间建索引 |
|
| `organization_audit_logs` | `actor_user_id`、可空 `organization_id`、`action`、JSON `old_value/new_value`、`created_at`;按公司/时间和操作者/时间建索引 |
|
||||||
|
|
|
||||||
BIN
uploads/1791535442192046600_5442.png
Normal file
BIN
uploads/1791535442192046600_5442.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 123 KiB |
Loading…
Reference in New Issue
Block a user