固定组合
固定组合是「把一组商品绑成一个价」的最省事做法:一张单 = 一个名称 + 一段起止日期 + 一张明细表,明细里逐行填数量与现价,表头直接给出原价金额与现价金额两个数。它没有分组、没有任选、没有分店范围、没有促销时段,收银端按整体识别——客人买的就是这一套,不做挑选。
入口:促销管理 → 固定组合,页面地址 /admin/Promotion/salesetcasepage/。它和促销方案里的套餐促销是两套独立的东西:不同的表、不同的页面、不同的审核状态,配出来的都是「多商品一口价」,但数据结构完全不同。
一、功能概述
| 项目 | 说明 |
|---|---|
| 单据主表 | SCtrl_SaleSetCase(方案级),明细表 SCtrl_SaleSetCaseDetail(物料行) |
| 生效判定 | 日期窗口 + 审核标志,没有单据状态机(不走 fBillState) |
| 审核标志 | 主表 fStopSign:0 = 已审核(在用),1 = 未审核(停用) |
| 适用范围 | 没有。一张单对所有门店生效,不能按分店圈定 |
| 时段与周期 | 没有。只有开始日期、结束日期,精确到日期 |
| 收银端表现 | 按整体识别,子件固定,顾客不选 |
| 与套餐促销的分界 | 需要「这组里任选一件」就用套餐促销;内容写死就用固定组合 |
二、界面布局说明
列表页

| 区域 | 内容 |
|---|---|
| 右上 | 蓝色 + 新增方案;工具栏只有 新增方案 / 查询 / 重置三个按钮,没有导出、没有打印、没有回收站 |
| 过滤 | 单选标签:未过期(默认)/ 有效 / 未生效 / 全部,点标签即自动查询 |
| 关键字 | 一个匹配方式下拉 + 一个输入框。匹配方式:包含 / 等于 / 开头为 / 结尾为 / 不等于 / 不包含 / 介于(默认「包含」);输入框提示「方案编号/名称」 |
| 计数行 | 共 N 条,第 1-N 条;无结果时只有 共 0 条,表体显示 暂无数据 |
| 列表 | 勾选框 / 行内编辑(铅笔图标,悬停提示「编辑方案」)/ 序号 / 方案编号(蓝色下划线链接)/ 方案名称 / 开始日期 / 结束日期 / 提交人 / 提交日期 / 审核状态 / 总金额;末尾还有一个隐藏的 ID 列 |
| 分页 | 默认每页 50 条,可选 20 / 30 / 50 / 100 / 200 |
| 下方 | 方案内容 区:列 行号 / 编号 / 条码 / 名称 / 单位 / 单位数量 / 基础数量 / 原价 / 现价 / 总金额;未选单时显示 请选择上方单据查看明细 |
默认排序是方案 ID 倒序,也就是新建的排最前。
组合方案窗口
点 方案编号 弹出「组合方案 - 方案名称」窗(不是新页签,是浮层里套的一页)。默认只读:

| 位置 | 只读态 | 编辑态 |
|---|---|---|
| 工具栏 | 返回 / 编辑 / 审核 / 删除 | 返回 / 保存 / 审核 / 删除 |
| 方案编号 | 只读 | 仍然只读(系统生成,改不了) |
| 方案名称 / 开始日期 / 结束日期 / 方案摘要 | 只读 | 可写,日期换成日期选择器 |
| 明细表首列 | 无 | 多一个 # 操作列(+ 加行、- 删行) |
| 明细空态 | 暂无物料 | 暂无物料, + 蓝色 添加物料 按钮 |

统计行 在明细表上方一行:总件数:N 原价金额:X 现价金额:Y元,现价金额橙色高亮。三个数的口径是:
| 统计 | 算法 |
|---|---|
| 总件数 | 明细的行数,不是件数合计 |
| 原价金额 | Σ(原价 × 单位数量) |
| 现价金额 | Σ 各行 总金额,即 Σ(现价 × 单位数量) |
| 折扣 | 只在「原价金额 > 0 且 现价金额 < 原价金额」时出现在现价金额后面,形如 (85.7%),等于 现价金额 ÷ 原价金额 |
原价金额 − 现价金额 就是这套组合给客人省的钱。
三、业务操作步骤
新建一个「早餐 15 元」组合
- 促销管理 → 固定组合,先在顶栏选好分店(没选分店时点新增会报「未选择分店」)。
- 点 + 新增方案。这一步当场就落库:系统取号、生成方案编号、按默认名「新方案」建一张未审核的空单,提示
已新增方案,编号 27xxxxxx,并弹出组合方案窗。 - 把 方案名称 从「新方案」改成有意义的名字,例如
早餐A 吐司+牛奶+蛋挞 15元。 - 填 开始日期、结束日期,方案摘要 写用途。
- 点 保存(保存只写表头这五项)。
- 点 编辑 让明细可写 → 点 添加物料,在「选择组合物料」窗里多选要进组合的商品,确定。
- 逐行改 单位数量 与 现价,例如三行的现价填
5 / 5 / 5。 - 看统计行:
总件数:3、原价金额是三个原价合计、现价金额:15.00元。 - 点 审核 → 确认「确定审核该方案吗?」→ 提示
已审核,列表 审核状态 变「已审核」,总金额 落定。
明细的增、删、改是即时落库的:选完物料就写进去了,改一个单元格失焦就提交并提示
已保存,不需要再点【保存】。工具栏的 保存 只管表头五项。
改一张已审核的组合
已审核的单不能直接动。先点 审核 反审核(确认「确定反审核该方案吗?」,提示 已反审核(未审核)),再 编辑 改内容,改完重新审核。反审核期间收银端就查不到这个组合了,尽量放在非营业时段做。
停用与删除
- 停用 = 反审核(
fStopSign置 1),单据还在,切到 未生效 标签能找到它,随时能重新审核。 - 删除 = 逻辑删除(确认「确定删除该方案及其全部明细吗?删除后不可恢复。」),主表和明细一起打删除标志。网页端没有回收站、没有还原入口,删完四个过滤标签都查不到它。要恢复只能回客户端 ERP 处理原表。
检索一张老单
过滤 默认停在 未过期,过了结束日期的单不在里面,先切 全部。
注意 关键字只匹配方案名称:输入框虽然写着「方案编号/名称」,但按编号搜是搜不出东西的。

要按编号找,就把 方案名称 填进关键字,或者切 全部 后翻页人肉找;也可以从促销效果一类的账表反查。
四、字段与规则详细说明
表头字段
| 字段 | 落库列 | 可编辑 | 规则 |
|---|---|---|---|
| 方案编号 | fCaseNo | 否 | 系统生成,见下方编号规则 |
| 方案名称 | fCaseName | 是 | 默认「新方案」;空名过不了审核 |
| 开始日期 | fBeginDay | 是 | 必填 |
| 结束日期 | fEndDay | 是 | 必填,保存表头时会归到当天 23:59:59;新增那一张空单存的是「新增时刻 + 1 年」,所以列表里能看到开始与结束带着同一个时分 |
| 方案摘要 | fCaseRemark | 是 | 自由文本,最长 200 |
| 提交人 | fPostManID | 否 | 建单时取当前操作员 |
| 提交日期 | fPostDay | 否 | 建单时刻 |
| 审核状态 | fStopSign | 否 | 列表列显示 未审核 / 已审核 / 删除 |
| 总金额 | 明细汇总 | 否 | Σ(现价 × 单位数量),只算未停用的明细行 |
表头校验原文:方案名称不能为空、开始日期不能晚于结束日期、开始/结束日期不能为空。
明细字段
| 列 | 落库列 | 可编辑 | 规则 |
|---|---|---|---|
| 编号 / 条码 / 名称 / 单位 | fInvID、fUnitID | 否 | 由「选择组合物料」带出;选择器只放有基础单位的商品 |
| 单位数量 | fInputQty | 是 | 新增行默认 1;填负数或非数字提示 请输入非负数字 |
| 基础数量 | fQty | 否 | = 单位数量 × 该单位换算率;选择器限基础单位,所以实际多与单位数量相等 |
| 原价 | fSprice | 否 | 取该单位的售价,加行时写入 |
| 现价 | fSpecialSprice | 是 | 组合内单价,新增行默认等于原价;允许填 0 |
| 总金额 | 计算列 | 否 | = 现价 × 单位数量 |
| 行号 | fLine | 否 | 追加时为当前最大行号 + 1 |
同一物料在一个组合里不能重复:选择器里勾了已在表里的商品,会提示 跳过 N 个已存在物料。
方案编号怎么来的
27 + 类型标志 1 + 补零的方案 ID + EAN 校验位。例:ID 192 → 27 1 0192 → EAN8 校验位 6 → 27101926。ID 超过 9999 时改用 9 位补零 + EAN13 校验位。方案 ID 与客户端的赠品单共用同一个取号器,所以编号会跳号,这是正常的。
收银端与外卖平台认的组合条码是 set + 方案编号,例如 set27101926。
审核时校验什么
点 审核 会先做完整性检查,任一条不过就整条拒绝:
| 提示原文 | 触发条件 |
|---|---|
| 审核失败:方案名称不能为空 | 名称还是空的 |
| 审核失败:开始/结束日期不能为空 | 少填一个日期 |
| 审核失败:结束日期不能早于开始日期 | 日期填反 |
| 审核失败:组合明细为空,请先添加物料 | 一张明细都没有 |
| 审核失败:N 行明细无效(物料/数量/现价) | 有行的物料为空、单位数量 ≤ 0,或现价为负 |
反审核不做任何校验,随时能退回去。
四个过滤标签的真实口径
| 标签 | 实际条件 |
|---|---|
| 未过期 | 未删除 且 结束日期 ≥ 今天 |
| 有效 | 未过期 且已审核 |
| 未生效 | 未过期 且未审核 |
| 全部 | 不加任何条件,含已过期的、含已删除的 |
「未生效」不等于「日期还没到」,它筛的就是未审核的单——和「有效」加起来正好等于「未过期」。想让一张已审核的组合停止生效,只能等结束日期过掉或者反审核,过滤标签本身不改变单据状态。
五、下发与收银端表现
固定组合不走促销方案的快照下发,它随云 POS 商品目录以 setMeals 契约下发。一张单要出现在收银端,四个条件同时成立:
- 已审核(
fStopSign = 0); - 今天在日期窗口内——判定按天取整比较,不看时分;
- 主表与明细都没打删除标志;
- 至少有一行在用明细——空壳单不下发,明细行自己也能停用。
所以「审核了但收银台搜不到」通常是今天已经出了日期窗口,或者明细行全被停用了。
| 下游 | 怎么用这张单 |
|---|---|
| 收银端 | 按整体识别,子件固定,顾客不做选择;与套餐促销的「分组任选」相对 |
| 外卖平台 | 组合作为可售商品并进商品列表;平台侧扩展码含 set 时按 set + 方案编号 拆套,子行数量按基础数量展开 |
| 券池(月饼券等) | 券类型管理的兑换产品选类别「套餐」时,来源就是固定组合;已停用或已删除的组合不能选,选了报 套餐不存在或已停用 |
| 券核销落单 | 核销时展开成「券行 + 子件留痕行」;组合停用报 {券号}:套餐已停用,没有在用子件报 {券号}:套餐无有效子件,无法核销 |
金额口径有两套,别混
| 位置 | 用哪个数量 |
|---|---|
| 网页端统计行 原价金额 / 现价金额、列表 总金额 | 单位数量 |
| 收银端目录的套餐标准价 / 组合价、券池里的原价 | 基础数量 |
选择器限定基础单位时两者相等,看不出差;一旦组合行用的是换算率不为 1 的单位(历史数据、客户端建的单),网页上显示的金额和收银端算的就不是一个数。核对以基础数量那套为准。
六、典型使用场景
早餐固定组合:内容写死、全天有效
背景:早餐客要的是「一个价拿走一套」,不需要挑,排队时越快越好。 路径:新增方案 → 名称「早餐A 吐司+牛奶+蛋挞 15元」→ 三行商品现价 5/5/5 → 审核。 注意:固定组合没有分店范围,一张单对所有门店生效。只想在几家店跑早餐组合,就得改用套餐促销。
中秋礼盒:绑茶和刀叉成一个价
背景:礼盒要和配件绑成一个整体卖。 路径:新增方案 → 礼盒、茶、刀叉三行 → 现价按整套定价 → 结束日期卡到节前。 注意:要区分直营与加盟、要卡「节前两周的下午」这类条件,固定组合做不到,首选套餐促销;固定组合只能靠日期粗控。
月饼券的奖品挂固定组合
背景:一张券提走一个固定礼盒。 路径:先把组合配好并审核,再到券类型管理的 兑换产品 里选类别「套餐」挂上它。 注意:组合一旦被反审核或删除,券在核销时会被 套餐已停用 直接拦下——发出去的券还在有效期内就不要动这张组合单。
七、权限控制与前置条件
- 需要「促销管理」的菜单权限;固定组合与促销方案共用同一个权限模块,能看到促销方案基本就能看到它。
- 组合里的每个商品必须已建档、有基础单位、有售价;选择器只放有基础单位的商品。
- 新增方案前顶栏要先选好分店,否则报「未选择分店」。
- 网页端与客户端读写同一张
SCtrl_SaleSetCase;客户端建的组合单在网页端能不能改,以门店实测为准。促销方案那条「只有网页端建的单能回网页端编辑」的规则不套在这里。 - 折扣金额由收银端按下发的目录在本地计算,网页端只做配置。
八、常见问题
审核提示「审核失败:组合明细为空,请先添加物料」。 原因:点了新增方案、改了名称日期,但一张物料都没加就审核。 处理:编辑 → 添加物料 选商品 → 再审核。
列表里一堆默认名「新方案」、总金额 0.00 的单。 原因:新增方案当场就建单,不是保存才建。开了窗没填内容就 返回,空单已经留在库里了。 处理:逐张打开,确认不是别人正在配的,改好名称与明细,或者直接 删除。空壳单不会下发到门店,但会长期污染检索。
按方案编号搜不到。 原因:关键字只匹配 方案名称,输入框的「方案编号/名称」提示名不副实。 处理:用名称搜;或切 全部 后翻页找。
过滤选了「有效」却一条都没有。 原因:所有单都还没审核。「有效」= 未过期 且已审核,未审核的单在 未生效 标签里。 处理:切 未生效 找到它,打开审核后回 有效。
改了明细但表头还是旧值 / 点了保存没反应。 这是设计如此:明细的增删改即时落库,工具栏的 保存 只写表头五项。 处理:改完明细直接看统计行,数字已经变了;只有名称、日期、摘要需要点【保存】。
提示「方案已审核,请先反审核再编辑」。 原因:已审核的单锁了,表头、明细、加行、删行、删除全都拦。 处理:先 审核 按钮反审核,再改。反审核期间收银端查不到这个组合。
列表看不到某张单,切了「全部」才出现,审核状态是「删除」。 原因:这张单被逻辑删除过。「全部」不加任何条件,所以能把已删除的捞出来看。 处理:网页端没有还原按钮,要恢复只能回客户端 ERP 处理,或者重新建一张。
组合在收银端搜不到。 按第五节的四个条件依次核对:审核状态、今天是否落在起止日期内、明细有没有在用行、有没有误删。日期判定按天取整,结束日期填哪天就到哪天收盘。
同一张组合想给不同门店定不同的价。 固定组合做不到——它没有分店维度。改用套餐促销,或者按门店各建一张单再靠日期窗口错开(不推荐,容易互相覆盖)。
