B端(商户软件管理平台)设计评审 · gpt6 独立视角 + 代码核实修正

时间:2026-09-23
来源:gpt-6-astra(medium 档)独立评审,由 Bob 对照真实代码去伪存真。
背景:老板定调 B端 = 通用底座 + 按行业定制的软件管理平台;原则 = 不大而全 / 不按业态锁死功能(A端人工开通)/ 重点先做住宿(房态)。

一、gpt6 四节核心建议(精炼)

第1节 · 底座+行业包架构(针对"A端人工开通")

  1. 新增 feature_packs(包目录)+ membership_feature_packs(商户开通关系)两表,功能包落在商户/会员维度而非 business_type。
  2. A端只写"某商户开通哪些包",B端读生效清单(如 GET /me/feature-packs);前端路由 + 后端接口双重校验(防越权直调)。
  3. 未开通包"隐藏为主、降级为辅",不显示无关行业入口。
  4. 人工开通优于自动匹配,但须补操作日志/版本/撤销,避免"配置孤岛"。

第2节 · 住宿包(房态)MVP 范围

  1. MVP 只做"房型×日期"经营维护:房型列表、14天网格、状态(开放/满房/维护)、房量编辑、已售只读展示、保存反馈。
  2. 价格/预订/入住/退房/清洁/收益分析 → 后续版本,不进 MVP。
  3. MVP 不接订单实时扣减,手动维护房量/状态;sold 只读或"暂未接入",绝不伪造成实时库存。
  4. 房态与订单通过"库存快照/汇总服务"隔离,MVP 互不直写表。

第3节 · item_type 标记标准统一

  1. 用稳定业务语义枚举:accommodation_room / accommodation_package / dining_item / retail_item / scenic_ticket / experience_session / transport_vehicle / generic_service。
  2. 行业包代码(accommodation)与 item_type(accommodation_room)必须解耦。
  3. 迁移策略:"兼容读取 + 规范写入 + 分批回填",不强改全库。
  4. 上线前先验 lodging_display 是否全是房型、有无混入套餐/展示类。

第4节 · 执行者遗漏的关键风险

  1. 多角色操作级权限(老板/店长/收银员边界不同,不止"是否开通包")。
  2. 房态并发需乐观锁(version),否则覆盖。
  3. A端开通后 B端生效机制(登录时拉一次不够,需请求时校验+短缓存)。
  4. 弱网/幂等/重复提交(H5 高频强一致数据)。
  5. 数据归属(已做)+ 审计日志(待补)。

二、Bob 对照真实代码的核实与修正(关键)

gpt6 假设/盲区真实代码核实结果结论
存在 membership 表,开通关系挂 membership_id后端无 membership 表;身份走 merchant_staff(user_id→merchant_id+role)+ merchants。前端变量名 memberships[0] 只是前端叫法修正:新表应挂 merchant_id 维度(如 merchant_feature_packs),对齐真实结构
room_calendar 需加 version 防并发表字段:id, merchant_id, room_type_id, biz_date, total, sold, status, updated_at——无 version 字段;UPSERT 按 (merchant_id,room_type_id,biz_date) 会直接覆盖属实:并发覆盖是真实风险,需加 version 或靠 updated_at 条件更新
担心商户串数据(未做隔离)rooms.py 已 mid = staff["merchant_id"] 只查本商户 + 校验 role∈(owner/manager/operator)部分成立:归属隔离已做;但角色仅粗粒度,未细分 read/edit_quantity/change_status
item_type 不匹配(后端认 room/stay/accommodation)rooms.py:27 硬编码 item_type IN ('room','stay','accommodation');prod 真实住宿标记是 lodging_display、餐饮 dining实证成立:直接接会拉错房型,必须先统一标记

三、采纳结论(可直接采纳)

四、建议下一步排序(修正 gpt6,把"核实真实结构"前置)

  1. 先钉死真实结构:确认 merchant_staff/merchants 完整字段 + 角色模型(老板/店长/收银员如何落库),再定开通关系表。
  2. 统一 item_type:定 accommodation_room 标准,rooms.py 改过滤条件 + 抽样核验 lodging_display,分批回填。
  3. 建开通关系 + 改 business-pack.ts:A端开通界面(或先用 SQL 直开两家酒店)+ B端读清单路由。
  4. 房态 MVP 页面:替换错配的 SessionManage 桩,接 rooms.py;补 merchant 隔离(已有)+ 操作反馈 + 并发 version(或 updated_at 条件更新)。

五、待老板拍板


六、老板修订(19:1x):角色简化为「老板/员工」两级 + 功能包开通归 A端

用户明确纠偏(回应上轮"老板/店长/收银员"三档提案):

  1. 功能包开通 = 行业标准「租户功能授权 (Tenant Feature Entitlement)」:A端(平台运营后台 / 控制面 Control Plane)为租户(商户)开通能力,B端(商户工作台 / 数据面 Tenant Console)仅消费已授权清单。B端不做任何自助申请/开通 UI。机制:A端开通 → 落 tenant_feature_entitlements(挂 merchant 维度)→ B端拉本租户已授权 feature_key 列表 → 路由 + 接口双校验显隐。命名严格区别于 packages(商品套餐),详见下方术语对齐。
  2. 角色不需要复杂分级:B端只分「老板 / 员工」两级,不要店长/收银员之类细分。理由:我们提供的是轻量易用的商户工具,不是大型复杂 ERP,目标商户群(中小民宿/餐饮/摊位)接受不了复杂权限体系。
  3. 设计第一原则 = 方便易用:能不多角色就不多角色,能不配置就不配置;功能授权由 A端按商户人工开通,而非让商户自己折腾。

行业标准术语对齐(消除歧义,19:2x 补充)

为避免"功能包"与系统已有"套餐(packages)"混淆、以及"开通"归属不清,按多租户 SaaS 行业标准重定义:

我们的语境行业标准术语含义
商户租户 (Tenant)一个入驻商户 = 一个租户实例
功能包功能/能力 (Feature / Capability) 或 应用 (App/Module)可独立开通的商户经营能力(如房态、进销存)
开通功能包租户功能授权 (Tenant Feature Entitlement / Provisioning)平台为租户启用某能力
A端平台运营后台 / 控制面 (Control Plane)管租户 + 授权
B端商户工作台 / 数据面 (Tenant Console / Data Plane)租户使用已授权能力

关键边界(消除歧义):

数据模型(标准):

简化后的权限模型(2 角色)

对实现方案的影响(推翻上轮"三档 require_role")

决策状态(19:2x 更新)

item_type 标准值提案(旅游六要素对齐,19:3x)

service_items.item_type 现状混乱(prod 实测 14 种:meal20/hotel5/lodging_display2/room2/dining1/restaurant5/vehicle2/transport2/guide1/experience1/attraction1/scenic5/retail5/other5)。按国家文旅"旅游六要素"(食·住·行·游·购·娱)这一行业标准 taxonomy 收敛为受控词表,覆盖全部历史值:

规范值(canonical)中文六要素兼容读取(legacy prod 值)说明
accommodation住宿住hotel, lodging_display, room, stay房型/房间/民宿/酒店;rooms.py 已认 accommodation/room/stay
dining餐饮食meal, dining, restaurant, food餐/菜/饮品/套餐
transport交通行vehicle, transport车票/租车/接送
retail零售特产购retail, goods, souvenir商品/伴手礼
attraction景点门票游scenic, attraction, ticket门票/景点
experience体验活动娱experience, activity体验/活动/娱乐
guide向导服务衍生guide, service, companion向导/陪护
other其它—other兜底,不进任何行业包

要点:

落地收尾(2026-09-23,续前评审)