Skip to content

订货算法 ​

订货算法是智能订货的计算内核:把门店的销量、库存、促销、退货率、估清时间等业务参数喂进一段自定义逻辑,算出这次应该订多少。它用类 Pascal 语法配全中文变量编写,懂业务的人不需要会编程也能读懂、改数;系统同时预置了烘焙行业常用的九套算法模板,可以直接套用,也可以拿来做二次修改的起点。

功能路径:系统菜单 → 零售POS → 智能订货 → 订货算法

一、功能概述 ​

1. 算法解决什么问题 ​

  1. 降低经验依赖:把优秀店长的订货思路固化成规则,新店长按系统建议下单即可;
  2. 区分物料特性:半成品、原材料、短保、长保可以用不同算法,不必一刀切;
  3. 随业务迭代:促销加成比例、退货率阈值、估清判定时刻都是代码里的数字,改完存个版本就能生效;
  4. 可回退:每次保存都留版本记录,新逻辑不理想可以随时切回旧的生效版本。

2. 与其他功能的关系 ​

环节对应功能
提供库存上下限备货规则 → 分店备货标准设置
指定物料用哪套算法订货规则(按类别或按物料绑定算法)
算法上线前的验算模拟测试数据
版本切换与批量测试订货算法版本管理
退货率、安全系数等默认值智能订货用户特点

二、界面布局说明 ​

窗口分为四个业务页签,一条算法从建立到回溯正好走完这四页;此外还有编码维护通用的【编码备注】页签,用来给某套算法写关联说明与业务备注,方便日后追溯。

1)表格页签:算法清单 ​

字段说明
算法编号系统按流水号自动生成的四位编号,不用自己编;编号小于 0100 的是内置标准算法
算法名称算法的业务含义,例如"短保面包安全存量订货法"
默认算法勾上表示这是系统内置的标准算法,这一列在表格里只读、不能手工勾改。带这个标记的算法,【编辑算法】页签的代码框会底色变黄提示,字还能敲进去,但【提交保存】会被拦下:「默认标准算法不允许手工修改!」;要改逻辑请另建一条自己的算法
生效版本门店订货当下真正执行的版本号
最新版本该算法最近一次保存出来的版本号

表格上方还有一行记录导航条:【首记录】【尾记录】【新增】【删除】【修改】【保存】【取消】。刚打开窗口时整张表是只读的,这排按钮灰着;要先点顶部工具栏的【编辑】解除只读,【新增】【删除】【修改】才可用。改完一行不会自动写库,【保存】提交当前行、【取消】丢弃这一行的改动。

生效版本与最新版本可以不相等:改完代码【提交保存】会推高最新版本,此时系统会问一句「是否采纳当前最新版本为生效版本」,答否就不上线(只有一条算法的生效版本还是 0 时,保存即生效)。这个设计让"先写好、测好、再上线"成为可能。

顶部工具栏提供 退出 / 编辑 / 刷新 / 报表 / 增加默认记录 / 帮助 六个入口。【增加默认记录】用于第一次使用时生成系统预置的标准算法;【报表】带一个下拉箭头,里面是【报表机器】和【直接打印】两条输出路径,用于导出算法清单便于内部审计与复盘。工具栏上还有查询、附件两个按钮位,但查询按钮在本窗体是隐藏的,附件只在系统开启「编码附件管理」时才会出现。

主菜单「工作→增加默认记录」与工具栏【增加默认记录】按钮为同一入口,第一次使用时经任一入口创建默认算法。

订货算法窗口的算法清单列表

2)编辑算法页签:写代码 ​

编辑算法页签的中文参数列表与代码编辑区

区域说明
左侧参数区顶部写着「点击复制参数」:点一个参数,界面上会把这个参数连同中括号(例如 [当前结存数])复制到剪贴板,再到代码区按 Ctrl+V 贴进去
右侧代码区代码编辑器,支持语法高亮,中文变量直接书写
检查算法先做语法检查,出错时提示「代码检查存在错误!未通过!」并把光标停到出错那一行;检查通过还会用一组演示参数当场试算,弹出「算法模拟计算出 订货数量 =x」,不建测试数据也能先看一眼代码跑得通不通
提交保存校验代码确有改动、语法通过后,弹框要求填写版本说明,然后推高最新版本并写入版本记录;内置标准算法会被拒绝(「默认标准算法不允许手工修改!」)
初始化空白算法清空当前代码框,写入 Begin / result := [订货数量]; / end ; 三行骨架,动手前会确认「当前代码将被完全清空,确认要继续吗?」
重新加载放弃当前未保存的修改,恢复到该版本已保存的内容
剪切 / 复制 / 粘贴常规编辑操作

第一次使用建议先执行【增加默认记录】(顶部工具栏按钮,与【编辑算法】页签里的【初始化空白算法】不是一回事:前者建预置算法,后者只清空代码框)。系统会一次建出三套标准算法:

  1. 半成品原材料最低库存补齐法;
  2. 产品每日销售预测订货法;
  3. 产品每日安全存量订货法。

这三套覆盖最常见的两类需求(原料按最低库存补齐、成品按销量预测订货),拿来当模板改比空白页快得多。

要注意【增加默认记录】是"补齐 + 纠正":它按内置清单逐条比对,账套里还没有的就新建,已经有了但代码和内置版本不一致的会被覆盖回出厂代码。所以如果有人把内置算法直接改在内置条目上,再点一次这个按钮,改的东西就没了——自定义逻辑请另建一条自己的算法。

3)订货知识学习页签:抄作业 ​

左侧是系统预置的算法模板目录,点一条,右侧代码区显示完整实现;点【复制知识代码】复制到剪贴板,粘贴到编辑算法页签改成自己的参数即可。

订货知识学习页签的算法模板与示例代码

模板名称适用场景核心逻辑
考虑估清时间调整订货结果短保、畅销品提前售罄说明订少了,按经验比例追加订货量
考虑退货率调整订货结果高退货品类平均退货率超标准即下调订货量
考虑促销调整订货结果促销期商品参与促销的物料按系数上浮
销售预测订货法常规商品按同期销量加权预测,适合每晚清零的物料
安全存量订货法全品类通用预测销量加安全存量减当前结存
按起订规则调整订货结果总部管控品类低于起订下限归零,高于起订上限封顶
最低库存补齐订货法基础补货以最低库存为基准补齐库存缺口
考虑同期订货调整订货结果波动大的物料参考上周同星期订货量做平滑
节假日调整销售预测节日专属命中公历或农历节日时修正预测销量

4)历史版本页签:回溯与对比 ​

字段说明
当前算法版本版本序号
修改人员谁改的
修改日期什么时候改的
版本说明这次改了什么,例如"估清判定时刻由 18:01 调整为 18:00"
算法代码选中版本后右侧显示该版本的完整代码

用途有两个:把两个版本的代码并排看差异;把历史版本的代码复制到当前窗口继续改,避免从零重写。

三、业务操作步骤 ​

步骤 1:打开功能 ​

系统菜单 → 零售POS → 智能订货 → 【订货算法】。

步骤 2:建立算法 ​

  1. 首次使用点工具栏的【增加默认记录】,表格出现三套预置算法(注意别和编辑算法页签里的【初始化空白算法】混淆,后者只是把当前代码框清空重写三行骨架,不会建算法);

    工具栏中的增加默认记录按钮

  2. 需要新增一套,先点顶部工具栏的【编辑】解除只读,再用表格上方导航条的【新增】加一行,填写算法名称;算法编号由系统按流水号自动给,不用手工编;

  3. 选中该算法点【编辑】,切到【编辑算法】页签写代码。

步骤 3:编写代码 ​

  1. 从左侧参数区点击需要的变量,代码区自动插入 [日均销用量] 这类中文变量;
  2. 按 Pascal 语法组织判断与赋值,语句以分号结束、条件块用 then / else、以 end 收口;
  3. 最终结果落到 [订货数量],算法以此为输出。

估清时间微调的写法:

plaintext
// 如果连续过早估清,增加订货数量(经验值10%)
if  [近3天估清时间]  < '18:01'  then
  [订货数量] :=  [订货数量] * 1.1  ;
// 昨日仍提前估清,追加5%订货量
if  [昨天估清时间]  < '18:01'  then
  [订货数量] :=  [订货数量] * 1.05  ;

退货率与促销的微调:

plaintext
// 退货率过高时下调订货量,0.9 是经验值
if  [近7天平均退货率]  >  [退货率标准]  then
  [订货数量] :=  [订货数量] * 0.9  ;

if  [参加促销] then
  [订货数量] :=  [订货数量] * 1.2  ;

安全存量法:

plaintext
// 安全存量 = 日均用量 × 安全系数
[安全存量] := [日均销用量] * [安全系数] ;
// 订货数 = 预测销售数 + 安全存量 - 当前结存
[订货数量] := [预测销售数] + [安全存量] - [当前结存数] ;

起订规则收口:

plaintext
if  [订货数量] <  [最低起订数量] then
  [订货数量] := 0 ;
if [订货数量] > [最高起订数量] then
  [订货数量] := [最高起订数量] ;

同期订货平滑——按订货日是星期几取上周同星期的订货量,再与本次结果加权:

plaintext
[上周订货量] := 0 ;
if [星期几] = 1 then [上周订货量] := [近七天星期一订货量] ;
if [星期几] = 2 then [上周订货量] := [近七天星期二订货量] ;
if [星期几] = 3 then [上周订货量] := [近七天星期三订货量] ;
if [星期几] = 4 then [上周订货量] := [近七天星期四订货量] ;
if [星期几] = 5 then [上周订货量] := [近七天星期五订货量] ;
if [星期几] = 6 then [上周订货量] := [近七天星期六订货量] ;
if [星期几] = 7 then [上周订货量] := [近七天星期天订货量] ;

if [上周订货量] <> 0 then
  [订货数量] := ([订货数量] * 0.6) + ([上周订货量] * 0.4) ;

同星期权重 0.4 是平滑强度:调大更贴上周、波动更小,调小更贴本次预测、反应更快。

节假日销售预测修正——命中节日时用去年同期实际销量修正预测值,公历、农历分开取数:

plaintext
if [节假日] then
begin
  if [公历节日] <> '' then
  begin
    if ([公历节日] = '情人节') or ([公历节日] = '圣诞节') then
      [预测销售数] := ([预测销售数] * 0.4) + ([去年公历同期销售数] * 0.6)
    else
      [预测销售数] := ([预测销售数] * 0.6) + ([去年公历同期销售数] * 0.4)
  end
  else
  begin
    if ([农历节日] = '除夕') or ([农历节日] = '春节')
       or ([农历节日] = '元宵节') or ([农历节日] = '中秋节') then
      [预测销售数] := ([预测销售数] * 0.4) + ([去年农历同期销售数] * 0.6)
  end ;
end ;

公历侧覆盖儿童节、父亲节、妇女节、感恩节、国庆节、记者日、建党节、建军节、教师节、劳动节、老人节、母亲节、青年节、情人节、圣诞节、万圣节、愚人节、元旦节;农历侧覆盖除夕、春节、端午节、腊八节、七夕节、元宵节、中秋节、重阳节。情人节、圣诞节这类以单人/情侣消费为主的节日,去年同期的参考权重反而更高(0.6),其余公历节日按 0.4 加权;农历四大节日同样把去年权重提到 0.6。影响因子与加权比例都可以按本店历史销售经验自行改动,不必沿用示例数值。

步骤 4:校验并保存 ​

  1. 点【检查算法】,报语法错误时按提示定位行号改正,直到通过;
  2. 点【提交保存】,填写版本说明,系统生成新版本记录,最新版本号推高;
  3. 到【历史版本】页签确认这一版已经在列表里。

步骤 5:测试后再上线 ​

保存不等于生效。先到 订货算法版本管理 用 模拟测试数据 跑一遍,确认各场景的订货数量合理,再切换生效版本下发到门店。

完整示例:日清产品的六段微调串联 ​

下面这条算法适用于每日清库、未售商品当日退回工厂的烘焙产品:先用同期销售预测得出基础量,再依次叠加六段微调,最后由起订规则收口。它对应 烘焙行业常用订货算法介绍 里的第三种算法,可以直接作为一条新算法保存后按本店情况改参数。

第一段,同期订货平滑,避免订货量在相邻两周之间大幅跳动:

plaintext
[上周订货量] := 0 ;
if [星期几] = 1 then [上周订货量] := [近七天星期一订货量] ;
if [星期几] = 2 then [上周订货量] := [近七天星期二订货量] ;
if [星期几] = 3 then [上周订货量] := [近七天星期三订货量] ;
if [星期几] = 4 then [上周订货量] := [近七天星期四订货量] ;
if [星期几] = 5 then [上周订货量] := [近七天星期五订货量] ;
if [星期几] = 6 then [上周订货量] := [近七天星期六订货量] ;
if [星期几] = 7 then [上周订货量] := [近七天星期天订货量] ;
if [上周订货量] <> 0 then
  [订货数量] := ([订货数量] * 0.6) + ([上周订货量] * 0.4) ;

第二段,节假日修正,命中公历或农历节日时用去年同期销量修正预测:

plaintext
if [节假日] then
begin
  if [公历节日] <> '' then
  begin
    if ([公历节日] = '情人节') or ([公历节日] = '圣诞节') then
      [预测销售数] := ([预测销售数] * 0.4) + ([去年公历同期销售数] * 0.6)
    else
      [预测销售数] := ([预测销售数] * 0.6) + ([去年公历同期销售数] * 0.4)
  end
  else
  begin
    if ([农历节日] = '除夕') or ([农历节日] = '春节')
       or ([农历节日] = '元宵节') or ([农历节日] = '中秋节') then
      [预测销售数] := ([预测销售数] * 0.4) + ([去年农历同期销售数] * 0.6)
  end ;
end ;

第三段,估清时间上调,提前售罄说明订少了:

plaintext
if [近3天估清时间] < '18:01' then
  [订货数量] := [订货数量] * 1.1 ;
if [昨天估清时间] < '18:01' then
  [订货数量] := [订货数量] * 1.05 ;

第四段,退货率下调,损耗超标时收口订货量:

plaintext
if [近7天平均退货率] > [退货率标准] then
  [订货数量] := [订货数量] * 0.9 ;

第五段,促销上浮,参与促销的物料按系数追加:

plaintext
if [参加促销] then
  [订货数量] := [订货数量] * 1.2 ;

第六段,起订规则收口,必须放在算法最后执行,确保前五段都算完再做上下限校验:

plaintext
if [订货数量] < [最低起订数量] then
  [订货数量] := 0 ;
if [订货数量] > [最高起订数量] then
  [订货数量] := [最高起订数量] ;

串联时的三条纪律:

  1. 顺序不能随意调换。 起订收口放最后,否则前面几段的上浮会被提前截断,促销日反而订得比平日少;
  2. 节日修正改的是 [预测销售数],其余四段改的是 [订货数量]。 如果本段算法里订货量已经由预测值算出,节日修正要放在算订货量之前;
  3. 所有比例都是经验值。 0.6/0.4、1.1、1.05、0.9、1.2 都可以按本店历史销售经验改,改完保存新版本,用 模拟测试数据 验算后再切生效版本。

四、常用中文变量 ​

变量含义
订货数量算法的输出,赋值即最终建议订货量
预测销售数系统按同期销量加权预测出的当日预计销量
日均销用量物料在该门店的日均消耗
昨日订货数 / 今日销售数昨天实际订了多少、今天到当前已经卖了多少
当前结存数下单前的实际库存
最低库存 / 最高库存备货标准算出的库存上下限
最低起订数量 / 最高起订数量订货模板的起订区间
安全系数 / 安全存量安全库存的比例与折算数量
订货周期当期订货周期序号
星期几订货日的星期序号,1 = 周一,7 = 周日
近七天星期一订货量 ~ 近七天星期天订货量最近 7 天逐日实际订货量
上周同期销售数 / 上二周同期销售数 / 上三周同期销售数近 3 周同星期的实际销量
去年公历同期销售数 / 去年农历同期销售数去年同一公历日或同一农历日的实际销量,节日修正用
近7天平均退货率 / 退货率标准实际退货水平与合格线
昨天估清时间 / 近 3 天估清时间 / 上周同期估清时间售罄时刻,字符型 HH:MM,可直接比较
参加促销布尔量,if [参加促销] then 即可判断
节假日 / 公历节日 / 农历节日节日标识与节日名称,名称为空串表示当日无该节日

变量名一律用方括号包裹。估清时间是文本型时间,比较时写成 [近3天估清时间] < '18:01';节日名称判空写 [公历节日] <> ''。

五、典型使用场景 ​

场景 1:短保面包老是下午缺货 ​

现象是当天 17 点前后就卖空。用估清时间调整模板:近 3 天估清早于设定时刻即上浮一档订货量,昨天同样提前再追加一档。上浮比例先给 5%–10%,观察两周后按实际损耗回落。

场景 2:慕斯类退货率居高不下 ​

用退货率调整模板:[近7天平均退货率] > [退货率标准] 时把订货量乘 0.9。退货率标准在 智能订货用户特点 里给默认值,也可以在 订货规则 中按物料覆盖。

场景 3:原材料按生产周期补货 ​

半成品与原材料不看销量,看最低库存。用最低库存补齐法:订货数 = 订货周期 × 最低库存 − 当前结存数,再交给起订区间收口,避免出现 3.7 包这种无法下单的数量。

六、权限与前置条件 ​

  1. 算法直接决定门店下单量,编辑权限建议只开放给系统管理员与算法维护人员;
  2. 算法里的 [最低库存]、[最高库存] 取自备货标准,物料没有备货标准时这两个变量取到 0,算出的结果会明显偏小;
  3. 算法写好后还要在 订货规则 里绑定到类别或物料,否则门店订货不会调用它;
  4. 语法校验只做静态检查,业务是否合理要靠测试数据验证。

七、常见问题 ​

1. 点【检查算法】提示语法错误 ​

  • 原因:多为漏了分号、括号或引号不配对,也可能把中文变量写成了没有方括号的裸文字;
  • 处理:按提示行号回看该行的语句结尾与配对符号,从参数区重新点击插入变量,避免手打进错的括号。

2. 保存了新版本,门店订货还是旧结果 ​

  • 原因:保存只推高最新版本,生效版本没有切换;
  • 处理:到 订货算法版本管理 用【切换生效版本】指定新版本,再让门店重新取数。

3. 算法看起来没问题,算出来的数量却离谱 ​

  • 原因:常见于输入参数为空。[最低库存]、[当前结存数] 缺失时按 0 参与计算,缺口就会被放大;
  • 处理:先确认备货标准已经算出,再核对 订货规则 里该物料的绑定是否正确,最后用 模拟测试数据 把这几项参数填成已知值跑一次。

4. 想临时试一个改动,又怕污染线上逻辑 ​

  • 原因:直接在生效版本上改,保存后即成为新版本,但没有测试过;
  • 处理:把改动保存到新版本,生效版本保持不动。测试通过再切换生效,不通过就继续改这个新版本,历史记录不会丢。

附:本文档变更记录 ​

日期变更
2026-11-09初稿
2026-11-10按运行中的客户端界面复核顶部按钮:实际可见的是 退出 / 编辑 / 刷新 / 报表 / 增加默认记录 / 帮助,查询按钮恒隐藏、附件仅在开启编码附件管理时出现
2026-11-10订正参数区交互(点击是复制 [参数名] 到剪贴板,不是直接插入代码)、把【复制知识代码】从编辑算法页签移到订货知识学习页签、页签按钮名统一为界面上的【初始化空白算法】
2026-11-10补表格页签的记录导航条(编辑解除只读后才可用,保存/取消按行提交);订正【默认算法】列只读、内置算法代码框可输入但保存被拦;新增算法改走导航条【新增】且编号由流水号自动生成
2026-11-10三张界面图换成整窗 16:9 实拍(【表格】五页签与三行预置算法、【编辑算法】的「点击复制参数」参数墙与代码区、【订货知识学习】点开「最低库存补齐订货法」后的示例代码),替换掉早期尺寸不一的局部裁切;【增加默认记录】的按钮特写按原样保留;界面提示语统一改用「」