总店统一建品、分店选品上架;商品实体归总店,订单归属分店。本文说明表结构、前台展示、下单扣库存与总店汇总查询方式。
商户表 yjd_mch 用 shop_type 区分连锁角色,分店通过 parent_mch_id 指向所属总店。
| shop_type | 角色 | 说明 |
|---|---|---|
| 0 | 普通商户 | 独立入驻,无连锁关系 |
| 1 | 连锁总店 | 创建分店后自动标记;维护商品库、分店销售策略 |
| 2 | 连锁分店 | parent_mch_id = 总店 mch.id;从总店选品、独立上架价/库存 |
一句话:商品在总店(goods.mch_id),分店在售关系在选品表,订单记在分店(order.mch_id)。
flowchart TB HQ["总店 mch\nshop_type=1"] BR["分店 mch\nshop_type=2\nparent_mch_id→总店"] G["yjd_goods\nmch_id=总店"] POL["yjd_mch_branch_goods_policy\n是否允许分店卖、改价、佣金"] BG["yjd_mch_branch_goods\n分店选品上架"] SKU["yjd_mch_branch_goods_sku\n分店 SKU 价/库存"] O["yjd_order\nmch_id=分店"] OD["yjd_order_detail\ngoods_id→总店商品"] HQ -->|parent_mch_id| BR HQ --> G G --> POL BR --> BG G --> BG BG --> SKU BR --> O O --> OD G --> OD
| 表 | 作用 | 关键字段 |
|---|---|---|
yjd_mch_branch_goods_policy |
总店对某商品的分店销售策略 | goods_id、hq_mch_id、is_branch_sell(允许选品)、is_custom_price(分店可改价)、commission |
yjd_mch_branch_goods |
分店已选商品及上架状态 | branch_mch_id、hq_mch_id、goods_id(总店商品 ID)、status、price、stock(0 表示沿用总店) |
yjd_mch_branch_goods_sku |
多规格商品分店 SKU 价/库存 | branch_mch_id、goods_id、sku_id、price、stock |
yjd_goods |
商品实体(总店维护) | mch_id = 总店商户 ID |
yjd_order |
订单主体 | mch_id = 分店商户 ID(谁在卖) |
yjd_order_detail |
订单明细 | goods_id = 总店商品 ID(卖的是哪件货) |
顾客进入分店店铺时,商品列表带分店 mch_id。查询条件为「分店自有商品」或「总店商品且分店已上架」:
g.mch_id = 分店ID(分店自己发布的商品,若有)g.id IN (分店已上架的总店商品 ID),需同时满足:选品表 status=1、策略表 is_branch_sell=1、总店商品已上架审核餐饮点餐等同理:分店菜单会合并「本店分类」与「已选总店商品所属总店分类」;价格/库存优先读 mch_branch_goods / mch_branch_goods_sku,为 0 时回退总店。
order.mch_id 写入分店 ID(不是总店)。order_detail.goods_id 仍指向总店商品记录。goods);分店自有商品走普通商户库存。先取分店 ID 列表:parent_mch_id = 总店ID 且 shop_type=2。
SELECT id, name FROM yjd_mch
WHERE parent_mch_id = :hq_id AND shop_type = 2 AND is_delete = 0;
SELECT bg.*, g.name AS goods_name, m.name AS branch_name
FROM yjd_mch_branch_goods bg
INNER JOIN yjd_goods g ON g.id = bg.goods_id
INNER JOIN yjd_mch m ON m.id = bg.branch_mch_id
WHERE bg.hq_mch_id = :hq_id AND bg.is_delete = 0;
SELECT o.* FROM yjd_order o
WHERE o.store_id = :store_id
AND o.mch_id = :branch_id
AND o.is_delete = 0;
SELECT o.* FROM yjd_order o
WHERE o.store_id = :store_id
AND o.mch_id IN (:branch_ids)
AND o.is_delete = 0;
SELECT DISTINCT o.*, od.goods_id, g.name AS goods_name
FROM yjd_order o
INNER JOIN yjd_order_detail od ON od.order_id = o.id
INNER JOIN yjd_goods g ON g.id = od.goods_id
WHERE o.mch_id IN (:branch_ids) -- 订单归分店
AND g.mch_id = :hq_id -- 商品归总店
AND o.is_delete = 0;
goods.mch_id = 总店;分店订单列表只显示 order.mch_id = 分店。
总店要看「全部分店订单」需在查询中扩展 order.mch_id IN (分店IDs),目前需二次开发或按上表 SQL 汇总。
| 操作 | PC 商家后台 | 小程序商家端 |
|---|---|---|
| 总店:分店管理 | user/branch/shop/index | 经营工具「连锁总店」菜单(API 下发) |
| 总店:商品分店策略 | 商品编辑页「分店权限」 | — |
| 分店:选品上架 | user/branch/shop/goods | 分店商品管理 |
| 分店:订单 | 我的店铺 → 订单 | shop_pages/order |
| 分店列表(C 端) | — | API mchshop/index/mchs-list |
新环境需执行 SQL 补丁(按顺序):
core/sql/patch_mch_multi_store.sql — 连锁字段、选品表、策略表core/sql/patch_mch_branch_goods_sku.sql — 分店 SKU 价库存表