连锁 · 进店与分销

总店 / 分店:字段、分店策略、分销关系

底部导航跟总店走,商品订单跟当前店走,分销商也跟当前店走。三个 mch_id 不要混用。

先记三句话

  1. 包是谁的:独立小程序永远属于总店(_zong_mch_id)。导航、主题、装修读这一层。
  2. 人在哪家店:没选分店就是总店;选店 / 扫码 / 转发进了分店,就是分店(请求里的生效 mch_id)。商品、订单、分销商读这一层。
  3. 分销商一店一行:同一用户可以在总店是分销商、在分店再申请一次,两条 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,分店「测试」23818parent_mch_id=23778store_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.moneyyjd_user_mch_balance 只给平台包逛入驻店用。完整说明见 平台 / 商家 / 总店 / 分店 · 用户关系

请求里三个商家 ID(最容易绕)

小程序每次请求都会带这三个字段(tenant.js / attachTenantFields):

字段谁写干什么不要拿去干嘛
_zong_mch_id 出包配置 siteinfo.mch_id 包主总店。导航、主题、个人中心 DIY 不要当成分销商归属店、不要当订单店
branch_mch_id 仅当用户在选店页点过「进入门店」 已确认的分店;未选为 0 不要用浏览缓存里的分店去污染个人中心
mch_id 生效店:选了分店用分店,否则用总店 商品、下单、优惠券、分销申请 / check 不要拿去读底部导航(导航只读总店)
对照:_zong_mch_id 是「这是谁的小程序」;mch_id 是「我现在进了哪家店」。分店策略、扫码、转发只改后者。
场景_zong_mch_idbranch_mch_idmch_id(生效)
打开总店包,还没选店23778023778
选店页确认进入分店237782381823818
扫码 / 转发带 mch_id=238182377823818(确认后)23818
平台统一包,没逛店000

哪些数据跟总店,哪些跟当前店

能力读哪一层说明
底部导航 / 主题色总店 _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_modeneed_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 相同:成为分销商时所在的店

写入点

入口写入的 mch_id
C 端申请 api/share/join当前生效店
C 端检测 api/share/check(授权即成为)当前生效店
登录自动成为(share_condition=3登录时的生效店;冷启动多半是总店
商家后台手动添加分销商当前登录商家 ID
商家入驻审核通过且「授权即成为」这家商家自己的 ID

成为条件(平台设置,按 store)

yjd_setting.share_condition

申请页不再强制真实姓名、手机;空姓名用微信昵称。

后台列表

商家后台分销商列表过滤 yjd_share.mch_id = 本店。总店看不到分店的分销商,分店也看不到总店的。平台总后台不带商家 ID 时仍按整个 store_id 看。

佣金与上级

订单记在当前店(order.mch_id)。找上级分销商、分销等级时,优先用 订单店 那一行 yjd_share。用户在总店是分销商、在分店不是,分店订单不会按总店那一行计佣。

上下级关系仍在 yjd_user.parent_id(用户级)。同一人在两家店都是分销商时,团队人数可能交叉,按订单店拆开看佣金。

容易绕开的几件事

  1. 导航还是总店的:进了分店,底部仍是总店配的「首页 / 分类 / 购物车 / 我」,不会变成平台导航,也不会读分店(分店通常没配导航)。
  2. 没点「进入门店」不算进分店branch_mch_id 必须 user_picked=true。只打开过选店页、或接口写过 chain 缓存,不会把后续个人中心、分销申请改成分店。
  3. 单店模式冷启动:本地以前选过的分店作废,打开就是总店。要进分店只能扫码 / 转发。
  4. check=2 是待审核:不是「还没申请」。待审核不要再跳到填写手机号的申请页。
  5. 不要用 _build_mch_id:已废弃,只认 _zong_mch_id

和商品 / 订单文档怎么配合

系统按「新数据一步到位」实现:yjd_share.mch_id 必写,查询不兼容空值。上线前不要留旧的无 mch_id 分销商行。