保盛仓库管理系统后台程序管理
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

2026-09-20.md 2.4KB

2026-09-20 工作记录

钢板出库后”又回到库存”问题(数据已修复,代码加防复发保险)

用户反馈与排查过程

  1. 初判”out_flag 被 updateByPrimaryKey 覆盖为 null”→ 用户核实 out_flag 无 null,排除。
  2. 再判”取消配车 cancel 覆盖 out_flag”→ 用户核实取消配车早于出库、时间线正常,排除。
  3. 当前模型无法查看图片,前两轮对截图的”解读”有误,已向用户澄清。
  4. 用户已用修复 SQL 把脏数据刷回(out_flag=1、回填 out_id)。

核心现象(已确认)

  • 出库记录存在、配车单 out_flag=‘1’,但库存 t_ware_store.out_flag=‘0’、out_id 空 → 板子”回到库存”。

本轮代码修复(防复发保险)

  • OutServiceImpl.outByDistribution():出库后新增自校验,遍历 listStoreId 逐一 selectByPrimaryKey 确认 out_flag=‘1’,否则抛异常(配合 @Transactional 整体回滚),杜绝”出库记录有、库存没更新”的中间态。
  • OutServiceImpl.checkStock():恢复定时兜底逻辑(原被注释),每秒扫描 selectWaitOutIds(配车单已出库、明细有效、库存未出库),自动 updateOutStatus 把库存标记为已出库。

前几轮已做修复

  • StoreMapper.xml / InStoreMapper.xml 的 updateByPrimaryKey:out_flag/cancel_flag/lock_flag 加 ifnull 保护。
  • StoreMapper.xml selEffStore:cancel_flag 加 ifnull。
  • DistributionServiceImpl.cancel() / lockAndInsertDetail():改为先 selectByPrimaryKey 查库,只改 lock_flag,不覆盖状态字段。
  • OutServiceImpl 出库加日志与入参校验。

关键表名(已确认)

  • 库存 t_ware_store、出库记录 t_ware_out_record、入库记录 t_ware_in_record、 配车单 t_ware_distribution、配车明细 t_ware_distribution_detail、 配车记录 t_ware_distribution_record、移动 t_ware_move_record、变更 t_ware_change_record、 账务明细 t_finance_account_detail。

经验教训

  • 排查数据一致性类问题,务必先拿到真实数据(图片不可用时让用户贴文本),避免基于假设反复试错。
  • 出库等关键写操作,加”写后自校验 + 事务回滚”是防中间态脏数据的有效手段。
  • 事务配置:applicationContext 同时有 tx:annotation-driven 和 tx:advice+aop(proxy-target-class=true),tx:advice 方法名规则未覆盖 out* 方法,依赖 @Transactional 注解生效。