Files

4.4 KiB
Raw Permalink Blame History

REQ-20260915-0011 代码评审报告

  • 工具:warehouse.stock.list.query
  • 评审任务:21775
  • 评审结论:通过,无阻塞问题
  • 评审范围:库存实体与 Mapper、WarehouseStockTools、库存专用权限过滤、专项测试及工具文档

变更与设计一致性

实现与详细设计一致:工具保持只读,查询 warehouse_stock_manage 快照表;输入支持仓库、所属公司、物品名称、编号、分类和规格组合筛选;分页默认 1/20、上限 100;结果固定按库存量和记录 ID 倒序。返回值采用显式白名单,并对库存空值及修改时间进行规范化处理。

关键实现位于 src/main/java/me/iiv/agent/mcp/tool/WarehouseStockTools.java:41 至 :125。行级权限实现位于 src/main/java/me/iiv/agent/permission/PermissionService.java:195 至 :213。专项测试位于 src/test/java/me/iiv/agent/mcp/tool/WarehouseStockToolsTest.java:55 至 :114 和 src/test/java/me/iiv/agent/permission/PermissionServiceWarehouseStockRowFilterTest.java:52 至 :90。

五视角扫描结果

1. 攻击者视角

筛选值通过 MyBatis-Plus 查询构造器参数化绑定,名称、编号和规格未直接拼接进 SQL。唯一显式拼接的分页片段来自已规范化的整数 page/rows;rows 被限制为 100,offset 使用 long 参与乘法,未发现可控 SQL 结构注入路径。工具始终添加 soft_delete = 0,不会通过普通筛选读取软删记录。工具标注为 warehouse/read,方法中只执行 count 和 selectList,不包含库存新增、扣减、预占或回写逻辑。

2. 泄露者视角

代理权限在 PermissionService.java:199-213 中独立执行。总部身份不追加过滤;代理身份仅组合本人 agentId 与 warehouse_agent_auth 授权的 managerAgentId,并以括号化的 agent_id IN (...) OR warehouse_owner_id IN (...) 约束结果。代理用户缺少 agentId 时直接拒绝访问,未降级为总部权限。输出映射位于 WarehouseStockTools.java:95-120,只返回仓库、公司、物料和库存业务字段,不包含 createId、modifyId、softDelete 等内部维护信息。

3. 并发者视角

工具无共享可变业务状态,时间格式器为不可变的 DateTimeFormatter,每次调用均新建查询 wrapper 和返回 Map,不存在跨请求复用条件或结果的问题。count 与 list 是两个读取时点,库存并发变化时 total 与当前页可能短暂不完全一致;详细设计已明确该工具是运营查询而非事务级快照接口,此行为可接受。稳定排序在 WarehouseStockTools.java:78-80 使用 current_inventory DESC, id DESC,降低相同库存量下翻页顺序的不确定性。

4. 边界者视角

page 为空或小于 1 时归一为 1;rows 为空或小于 1 时归一为 20,超过 100 时截断并返回 notice。空 ID 集合不会生成 IN (),空白字符串不参与筛选且有效字符串会去除首尾空格。库存字段为空时按 0 返回,availableInventory = currentInventory - outOfStock,负值不会被静默钳制,能够暴露异常库存。修改时间为空时返回 null,否则按 Asia/Shanghai 格式化。页码超出结果范围时 Mapper 正常返回空列表。

5. 依赖者视角

实体与 Mapper 使用现有 m2 数据源和 MyBatis-Plus 单表查询路径,没有引入远程服务、逐条富化或 N+1 查询。权限复用现有 managedAuths 读取授权关系,保持与其他仓库工具一致的软删约束。Spring AI schema 测试验证工具名及关键参数可发现;查询测试验证组合筛选、分页截断、稳定排序、库存派生值与上海时区;权限测试覆盖总部、代理自有/代管公司以及缺少 agentId 的 fail-closed 分支。

约定与质量检查

  • 库存工具及权限专项测试通过。
  • 项目全量 Java 测试此前通过,共 224 项。
  • git diff --check 通过。
  • 当前工作区还混有入库、出库工具的未提交改动,因此本次评审不以提交或 PR 边界作为变更范围依据;评审范围按上述库存文件和对应文档限定。

发现汇总与结论

未发现 Critical、High、Medium 或阻塞级问题。行级权限与老接口语义一致,分页与稳定排序正确,返回字段白名单符合设计,空值处理和可用库存计算正确,专项测试覆盖关键正反例。评审结论为通过,可进入测试阶段。