ADDED Requirements
Requirement: Reagent inventory fields
系统 SHALL 在 biz_reagent 表上新增以下库存字段:
stock_qty DECIMAL(18,4) NOT NULL DEFAULT 0 — 当前库存量
warning_qty DECIMAL(18,4) NOT NULL DEFAULT 0 — 预警库存量
status CHAR(1) NOT NULL DEFAULT '1' — 启用/停用状态(1=启用,0=停用)
后端 SQLAlchemy Model BizReagent SHALL 同步新增对应字段。前端列表和表单 SHALL 展示这些字段。
Scenario: Existing reagents have zero stock after migration
- WHEN 数据库迁移完成,已有试剂记录存在
- THEN 所有已有试剂的 stock_qty 为 0,warning_qty 为 0,status 为 '1'
Scenario: Reagent list shows stock info
- WHEN 用户访问试剂管理列表
- THEN 列表显示当前库存量、预警库存量、状态列
Requirement: Manual stock-in for reagent
系统 SHALL 支持对单个试剂进行手动入库操作。入库数量必须大于 0。入库后 stock_qty 增加,同时生成一条变动记录(source_type=manual_in,change_type=in)。
Scenario: Successful stock-in
- WHEN 用户对库存为 10 的试剂入库 5
- THEN 试剂 stock_qty 变为 15,生成变动记录 change_qty=5, stock_after=15, source_type=manual_in
Requirement: Manual stock-out for reagent
系统 SHALL 支持对单个试剂进行手动出库操作。出库数量必须大于 0,且不能超过当前库存。出库必须填写领用人。出库后 stock_qty 减少,同时生成一条变动记录(source_type=manual_out,change_type=use,change_qty 为负数)。
Scenario: Successful stock-out
- WHEN 用户对库存为 10 的试剂出库 3,领用人"李四"
- THEN 试剂 stock_qty 变为 7,生成变动记录 change_qty=-3, stock_after=7, source_type=manual_out, receiver=李四
Scenario: Stock-out exceeds inventory
- WHEN 用户对库存为 2 的试剂出库 5
- THEN 系统拒绝并提示库存不足
Requirement: Batch stock-in for reagents
系统 SHALL 支持对多个试剂批量入库。所有条目在同一事务内处理,任一条目失败则全部回滚。
Scenario: Successful batch stock-in
- WHEN 用户批量入库 3 种试剂,数量分别为 5、10、2
- THEN 3 种试剂库存分别增加,生成 3 条变动记录,全部在同一事务内
Requirement: Batch stock-out for reagents
系统 SHALL 支持对多个试剂批量出库。批量出库需统一填写领用人和用途。所有条目在同一事务内处理,任一条目失败则全部回滚。
Scenario: Successful batch stock-out
- WHEN 用户批量出库 3 种试剂,领用人"李四"
- THEN 3 种试剂库存分别减少,生成 3 条变动记录
Requirement: Delete protection for stocked reagent
系统 SHALL 禁止删除库存量大于 0 的试剂。
Scenario: Delete reagent with stock
- WHEN 用户尝试删除库存为 5 的试剂
- THEN 系统拒绝并提示"该物料仍有库存,无法删除"
Requirement: Row-level locking for reagent stock operations
出入库操作 SHALL 使用 with_for_update() 行锁,防止并发操作导致库存数据不一致。
Requirement: Reagent stock log table
系统 SHALL 新建 biz_reagent_stock_log 变动记录表,字段结构与 biz_consumable_stock_log 一致:
material_id — 试剂 ID
material_code / material_name — 快照字段
change_type — in(入库) / use(使用/出库)
change_qty — 变动数量(入库正数,出库负数)
stock_before / stock_after — 变动前后库存
source_type — manual_in / manual_out / step_save
step_id / task_id / task_no — 步骤溯源字段
receiver / purpose — 领用人/用途
- 公共字段
Scenario: Stock log created on reagent stock-in
- WHEN 试剂入库 5
- THEN 变动记录 change_type=in, change_qty=5, source_type=manual_in, stock_before=旧库存, stock_after=新库存