问题现象

业务方反馈,某门店刚补完货,几分钟内系统又派了一张同型号的补货工单,重复派单浪费人力,看起来像逻辑异常。

背景

系统会自动计算门店应补多少库存并生成补货工单派给执行人。补货目标由城市策略决定;此外还有一条紧急兜底规则,在门店已有在途工单时改用一个更保守的最低目标量。

根本原因

两条规则对同一个目标库存量给出不同答案,优先级却被写反了:发现有在途工单时,直接用保守的兜底目标覆盖了权威的城市策略目标。于是第一张工单按兜底目标补到低值就算完成;等在途结束、策略重新参与计算,发现离策略目标还差,又生成了第二张同型号工单。加上判断时机在状态还没收敛(在途工单未结束)时就下了结论,一变化就重复派单。

// 问题版:有在途就用兜底,盖掉了权威的策略目标
if (station.hasInFlightOrder()) return fallbackTarget; // 只补到低值
return strategyTarget;

解决方案

策略优先,兜底只在策略给不出结果时用,一次补到位;若确实需要有在途时先别派新单,那也应该是暂缓动作而不是改目标。

// 策略优先:即便有在途工单,目标也按策略来,一次补到位
if (strategyTarget != null) return strategyTarget;
return MIN_STOCK; // 策略缺位时才兜底
// 有在途要少派:应暂缓派单,而不是把目标改小
if (station.hasInFlightOrder()) return; // 等它结束,目标仍以策略为准

测试建议

专门造有在途工单加触发重算的场景,断言不会生成第二张工单;也要覆盖策略目标大于兜底目标时最终应以策略为准。给这类自动派单加去重:同门店同型号在一个时间窗内、或存在未完成工单时,不重复生成。

经验总结

多套规则算同一个值时先把优先级写清楚:谁是正式策略、谁是兜底、兜底只在什么条件下生效。别让在途或异常这类临时状态直接改写最终目标,最多用它来暂缓动作。