底部导航跟总店走,商品订单跟当前店走,分销商也跟当前店走。三个 mch_id 不要混用。
_zong_mch_id)。导航、主题、装修读这一层。mch_id)。商品、订单、分销商读这一层。yjd_share,互不影响。都在 yjd_mch。分店不是独立平台,而是挂在某一家总店下面的店。
| 字段 | 含义 |
|---|---|
shop_type = 0 | 普通单店,没有连锁 |
shop_type = 1 | 连锁总店。独立小程序绑在这家上(yjd_wechat_app.mchid) |
shop_type = 2 | 连锁分店。parent_mch_id = 总店 ID |
store_id | 总店、分店、平台包共用同一个平台店 ID。用户按 yjd_user.mch_id 拆开,不是同一套会员 |
例:总店「绿茶餐厅(壹方天地店)」23778,分店「测试」23818,parent_mch_id=23778,store_id 都是 365。
flowchart LR PKG["独立小程序包\n_zong_mch_id=23778"] HQ["总店 yjd_mch 23778\nshop_type=1"] BR["分店 yjd_mch 23818\nshop_type=2"] PKG --> HQ HQ -->|parent_mch_id| BR
商品建在总店、订单记在当前店,见 总店与分店 · 数据关系。
平台包和商家独立包共用同一个 store_id,以前总店后台用「没绑分店」当本店用户,会把平台小程序用户一起算进去。现在登录时把包主写到 yjd_user.mch_id(等于请求里的 _zong_mch_id)。
| 后台 | 统计谁 | 条件 |
|---|---|---|
| 平台 | 平台小程序用户 | user.mch_id = 0 |
| 连锁总店 | 这个独立小程序的全部用户(含已选分店的人) | user.mch_id = 总店。首页再拆:未进分店 / 已进分店 |
| 连锁分店 | 进了这家分店的人 | branch_id = 分店 且包主=总店 |
| 普通独立小程序店 | 本店包用户 | user.mch_id = 本店 |
| 平台入驻店(没有自己的小程序) | 跟本店下过单 / 储值 / 购卡的人 | 仍按关联表,不按包主 |
yjd_user.branch_id 只表示进了哪家分店(0=还没进分店),不能用来区分平台用户和总店用户。不授权头像、正常打开小程序也会建号,同样要带上包主。余额:商家自己小程序读 yjd_user.money,yjd_user_mch_balance 只给平台包逛入驻店用。完整说明见 平台 / 商家 / 总店 / 分店 · 用户关系。
小程序每次请求都会带这三个字段(tenant.js / attachTenantFields):
| 字段 | 谁写 | 干什么 | 不要拿去干嘛 |
|---|---|---|---|
_zong_mch_id |
出包配置 siteinfo.mch_id |
包主总店。导航、主题、个人中心 DIY | 不要当成分销商归属店、不要当订单店 |
branch_mch_id |
仅当用户在选店页点过「进入门店」 | 已确认的分店;未选为 0 |
不要用浏览缓存里的分店去污染个人中心 |
mch_id |
生效店:选了分店用分店,否则用总店 | 商品、下单、优惠券、分销申请 / check | 不要拿去读底部导航(导航只读总店) |
_zong_mch_id 是「这是谁的小程序」;mch_id 是「我现在进了哪家店」。分店策略、扫码、转发只改后者。
| 场景 | _zong_mch_id | branch_mch_id | mch_id(生效) |
|---|---|---|---|
| 打开总店包,还没选店 | 23778 | 0 | 23778 |
| 选店页确认进入分店 | 23778 | 23818 | 23818 |
扫码 / 转发带 mch_id=23818 | 23778 | 23818(确认后) | 23818 |
| 平台统一包,没逛店 | 0 | 0 | 0 |
| 能力 | 读哪一层 | 说明 |
|---|---|---|
| 底部导航 / 主题色 | 总店 _zong_mch_id | 分店没有自己的导航;不会落到平台 mch_id=0 |
| 个人中心 DIY | 优先总店 | 进了分店也不换导航 |
| 商品列表 / 点餐菜单 | 当前店 mch_id | 分店卖总店货,靠选品表 |
订单 yjd_order.mch_id | 当前店 | 在哪家店下单就记哪家 |
分销商 yjd_share.mch_id | 当前店 | 在哪家店申请 / 授权成为,就挂哪家 |
小程序用户 yjd_user.mch_id | 包主 _zong_mch_id | 登录时写入。平台包=0,商家独立包=总店。总店后台看整包,分店后台看 branch_id |
| 商家后台分销列表 | 登录的那家店 | 总店只看总店行,分店只看分店行 |
配在总店:平台后台 mch/mch/index/edit(仅 shop_type=1 显示)。字段 yjd_mch.mp_entry_mode。
| 值 | 名称 | 打开总店小程序 | 怎么进分店 |
|---|---|---|---|
1(默认) |
分店模式 | 强制先到选店页,确认后才进分店逛 | 选店页;或扫码 / 转发带分店 mch_id |
2 |
单店模式 | 打开就是总店自己,不弹选店 | 只有扫码、转发等带了分店 mch_id 才进分店。冷启动忽略本地「曾经选过店」 |
接口:C 端 chain-meta 会带回 mp_entry_mode 和 need_pick_store。单店模式 need_pick_store=false。
flowchart TD
OPEN["打开总店独立小程序"]
MODE{"mp_entry_mode"}
PICK["pages/store-pick\n选店"]
HQ["逛总店\nmch_id=总店"]
BR["逛分店\nmch_id=分店"]
SCAN["扫码/转发带分店 mch_id"]
OPEN --> MODE
MODE -->|"1 分店模式"| PICK
PICK --> BR
MODE -->|"2 单店模式"| HQ
SCAN --> BR
表 yjd_share 增加 mch_id,含义与请求生效 mch_id 相同:成为分销商时所在的店。
user_id + store_id + mch_id + is_delete=0mch_id=23778mch_id=23818yjd_user.is_distributor 只是用户级标记;本店是不是分销商以这一行为准(api/share/check)| 入口 | 写入的 mch_id |
|---|---|
C 端申请 api/share/join | 当前生效店 |
C 端检测 api/share/check(授权即成为) | 当前生效店 |
登录自动成为(share_condition=3) | 登录时的生效店;冷启动多半是总店 |
| 商家后台手动添加分销商 | 当前登录商家 ID |
| 商家入驻审核通过且「授权即成为」 | 这家商家自己的 ID |
yjd_setting.share_condition:
1 提交申请 · 需要审核(status=0)2 提交申请 · 无需审核(直接 status=1)3 无需申请 · 授权即成为(登录 / check 直接写通过)申请页不再强制真实姓名、手机;空姓名用微信昵称。
商家后台分销商列表过滤 yjd_share.mch_id = 本店。总店看不到分店的分销商,分店也看不到总店的。平台总后台不带商家 ID 时仍按整个 store_id 看。
订单记在当前店(order.mch_id)。找上级分销商、分销等级时,优先用 订单店 那一行 yjd_share。用户在总店是分销商、在分店不是,分店订单不会按总店那一行计佣。
上下级关系仍在 yjd_user.parent_id(用户级)。同一人在两家店都是分销商时,团队人数可能交叉,按订单店拆开看佣金。
branch_mch_id 必须 user_picked=true。只打开过选店页、或接口写过 chain 缓存,不会把后续个人中心、分销申请改成分店。_build_mch_id:已废弃,只认 _zong_mch_id。yjd_share.mch_id 必写,查询不兼容空值。上线前不要留旧的无 mch_id 分销商行。