# 商城推销模式功能需求文档 ## 一、功能概述 本文档描述商城消费者端的推销模式功能,**该功能为商家级别功能**,即: - **商家可自主开启/关闭**自己店铺的推销模式 - 只有**开启了推销模式的商家**,其店铺订单才会显示"分享免单"按钮 - **会员等级系统**为全局功能,适用于所有商家 - **经销点返利系统**为商家级别功能,由商家自行配置 ### 1.1 核心变更说明 | 功能模块 | 作用范围 | 说明 | |---------|---------|------| | 分享免单系统 | 商家级别 | 商家开启后,其订单才显示分享免单入口 | | 会员等级系统 | 全局 | 所有用户统一等级体系 | | 经销点返利系统 | 商家级别 | 商家自行创建和管理经销点 | | 用户余额系统 | 商家级别 | 每个商家有独立的用户余额池 | --- ## 二、商家推销模式配置 ### 2.1 商家推销设置表 ml_merchant_promotion_config | 字段名 | 类型 | 说明 | |--------|------|------| | id | UUID | 主键 | | merchant_id | UUID | 商家ID(关联ml_shops.merchant_id) | | promotion_enabled | BOOLEAN | 是否开启推销模式(默认false) | | share_free_enabled | BOOLEAN | 是否开启分享免单(默认false) | | distribution_enabled | BOOLEAN | 是否开启经销点返利(默认false) | | required_count | INT | 分享免单所需购买数(默认4) | | reward_type | VARCHAR(20) | 奖励类型:product_price-商品价格,fixed-固定金额 | | fixed_reward_amount | DECIMAL(10,2) | 固定奖励金额(reward_type=fixed时使用) | | created_at | TIMESTAMPTZ | 创建时间 | | updated_at | TIMESTAMPTZ | 更新时间 | ### 2.2 商家用户余额表 ml_merchant_user_balance > 每个商家的用户余额独立计算,用户在不同商家有不同余额 | 字段名 | 类型 | 说明 | |--------|------|------| | id | UUID | 主键 | | merchant_id | UUID | 商家ID | | user_id | UUID | 用户ID | | balance | DECIMAL(10,2) | 当前余额 | | frozen_balance | DECIMAL(10,2) | 冻结余额 | | total_earned | DECIMAL(10,2) | 累计获得 | | total_withdrawn | DECIMAL(10,2) | 累计提现 | | updated_at | TIMESTAMPTZ | 更新时间 | | UNIQUE(merchant_id, user_id) | | 联合唯一约束 | --- ## 三、分享免单系统 ### 3.1 功能描述 用户购买商品后,可分享商品链接给其他用户(二级用户)。当二级用户通过分享链接购买该商品累计达到指定数量时,原用户可获得免单奖励。 **重要变更:** - 只有开启了分享免单功能的商家,其订单才显示分享免单入口 - 分享免单所需购买数由商家自行设置(默认4人) - 奖励金额可以是商品价格或固定金额 ### 3.2 业务流程 ``` 商家开启推销模式 → 用户购买商品 → 订单详情显示"分享免单"按钮 ↓ 用户点击创建分享记录 ↓ 分享给好友B/C/D ↓ 好友通过分享码购买 ↓ 累计购买数量达标 ↓ 用户获得免单奖励 ↓ 奖励存入该商家下的用户余额 ``` ### 3.3 数据库设计 #### 3.3.1 分享记录表 ml_share_records | 字段名 | 类型 | 说明 | |--------|------|------| | id | UUID | 主键 | | merchant_id | UUID | 商家ID(新增) | | user_id | UUID | 分享用户ID | | product_id | UUID | 商品ID | | order_id | UUID | 关联订单ID | | share_code | VARCHAR(20) | 分享码(唯一) | | required_count | INT | 需要的购买数量 | | current_count | INT | 当前已购买数量 | | status | INT | 状态:0-进行中,1-已完成,2-已失效 | | reward_amount | DECIMAL(10,2) | 奖励金额 | | created_at | TIMESTAMPTZ | 创建时间 | | completed_at | TIMESTAMPTZ | 完成时间 | #### 3.3.2 二级购买记录表 ml_secondary_purchases | 字段名 | 类型 | 说明 | |--------|------|------| | id | UUID | 主键 | | share_record_id | UUID | 关联分享记录ID | | buyer_id | UUID | 购买用户ID | | order_id | UUID | 订单ID | | quantity | INT | 购买数量 | | created_at | TIMESTAMPTZ | 创建时间 | #### 3.3.3 免单奖励记录表 ml_free_order_rewards | 字段名 | 类型 | 说明 | |--------|------|------| | id | UUID | 主键 | | merchant_id | UUID | 商家ID(新增) | | user_id | UUID | 获得奖励的用户ID | | share_record_id | UUID | 关联分享记录ID | | amount | DECIMAL(10,2) | 奖励金额 | | status | INT | 状态:0-待处理,1-已发放,2-已清零 | | cleared_at | TIMESTAMPTZ | 清零时间 | | cleared_by | UUID | 清零操作人 | | created_at | TIMESTAMPTZ | 创建时间 | ### 3.4 前端逻辑变更 #### 3.4.1 订单列表页/订单详情页 ```typescript // 判断是否显示分享免单按钮 async function checkShareFreeEnabled(merchantId: string): Promise { const config = await supabaseService.getMerchantPromotionConfig(merchantId) return config?.promotion_enabled && config?.share_free_enabled } // 在订单卡片中 🎁 分享免单 ``` #### 3.4.2 我的余额页 - 需要按商家分组显示余额 - 或显示总余额,点击查看各商家余额明细 --- ## 四、会员等级系统 ### 4.1 功能描述 会员等级系统为**全局功能**,用户等级在所有商家通用。用户可通过累计消费金额自动升级,或由商家手动设置等级。 ### 4.2 等级设置(全局配置) | 等级 | 名称 | 升级条件 | 折扣 | |------|------|---------|------| | 0 | 普通会员 | 注册即可 | 无折扣 | | 1 | 铜牌会员 | 累计消费500元 | 98折 | | 2 | 银牌会员 | 累计消费2000元 | 95折 | | 3 | 金牌会员 | 累计消费5000元 | 92折 | | 4 | 钻石会员 | 累计消费10000元 | 88折 | | 5 | VIP会员 | 商家手动设置 | 85折 | ### 4.3 数据库设计 保持原有设计不变,会员等级为全局配置。 --- ## 五、经销点返利系统 ### 5.1 功能描述 商家可创建多个经销点,每个经销点有独立的推广码。经销点通过推广码产生的订单可获得返利。 **重要变更:** - 经销点返利为商家级别功能 - 商家需先开启经销点功能才能使用 ### 5.2 数据库设计 #### 5.2.1 经销点表 ml_distribution_points | 字段名 | 类型 | 说明 | |--------|------|------| | id | UUID | 主键 | | merchant_id | UUID | 商家ID(新增) | | name | VARCHAR(100) | 经销点名称 | | contact_name | VARCHAR(50) | 联系人 | | contact_phone | VARCHAR(20) | 联系电话 | | invite_code | VARCHAR(20) | 邀请码(唯一) | | owner_id | UUID | 负责人用户ID | | status | INT | 状态:0-禁用,1-启用 | | total_orders | INT | 累计订单数 | | total_rebate | DECIMAL(10,2) | 累计返利 | | balance | DECIMAL(10,2) | 可提现余额 | | created_at | TIMESTAMPTZ | 创建时间 | --- ## 六、余额变动记录表 ### 6.1 ml_balance_records(按商家区分) | 字段名 | 类型 | 说明 | |--------|------|------| | id | UUID | 主键 | | merchant_id | UUID | 商家ID(新增) | | user_id | UUID | 用户ID | | type | VARCHAR(50) | 类型 | | amount | DECIMAL(10,2) | 变动金额 | | balance_before | DECIMAL(10,2) | 变动前余额 | | balance_after | DECIMAL(10,2) | 变动后余额 | | related_id | UUID | 关联ID | | description | VARCHAR(200) | 描述 | | operator_id | UUID | 操作人 | | created_at | TIMESTAMPTZ | 创建时间 | --- ## 七、API 接口变更 ### 7.1 新增接口 | 接口 | 方法 | 说明 | |------|------|------| | /api/merchant/promotion-config | GET | 获取商家推销配置 | | /api/merchant/user-balance | GET | 获取用户在某商家的余额 | | /api/merchant/user-balance-list | GET | 获取用户所有商家余额列表 | ### 7.2 修改接口 | 接口 | 变更说明 | |------|---------| | /api/share/create | 新增merchant_id参数 | | /api/share/my-records | 按merchant_id筛选 | | /api/balance/info | 新增merchant_id参数 | --- ## 八、前端页面变更 ### 8.1 消费者端 | 页面 | 变更说明 | |------|---------| | 订单列表/详情 | 根据商家配置显示分享免单按钮 | | 我的余额 | 按商家分组显示余额,或显示余额列表 | | 我的分享 | 按商家筛选分享记录 | ### 8.2 商家端(新增) | 页面 | 说明 | |------|------| | 推销模式设置 | 开启/关闭分享免单、经销点功能 | | 用户余额管理 | 查看用户余额、清零操作 | | 经销点管理 | 创建、编辑经销点 | --- ## 九、开发优先级 ### 第一阶段 1. 商家推销配置表(SQL) 2. 修改用户余额表结构(按商家区分) 3. 修改分享记录表结构(添加merchant_id) 4. 前端:根据商家配置显示分享免单按钮 ### 第二阶段 1. 商家端推销模式设置页面 2. 用户余额按商家分组显示 3. 经销点返利系统 --- ## 十、SQL变更清单 需要执行以下SQL变更: 1. **新增商家推销配置表** `ml_merchant_promotion_config` 2. **修改用户余额表** 添加merchant_id字段,改为联合唯一约束 3. **修改分享记录表** 添加merchant_id字段 4. **修改余额记录表** 添加merchant_id字段 5. **修改免单奖励表** 添加merchant_id字段 6. **修改经销点表** 添加merchant_id字段 详细SQL语句见:`promotion_system_tables_v2.sql`