Browse Source

fix:商品

super-yimizi 2 months ago
parent
commit
6c485fd18a

+ 0 - 0
application/api/controller/LuckLottery.php → application/api/controller/Lottery.php


+ 1 - 1
application/api/controller/Order.php

@@ -124,7 +124,7 @@ class Order extends Base
             $this->error($e->getMessage());
         }
         
-        $this->success('下单成功!', array_intersect_key($order->toArray(), array_flip(['order_sn', 'paystate'])));
+        $this->success('下单成功!', array_intersect_key($order->toArray(), array_flip(['order_sn', 'id', 'order_status'])));
     }
 
     //订单详情

+ 201 - 0
docs/消费抽奖营销活动_产品设计文档.md

@@ -0,0 +1,201 @@
+# 消费抽奖营销活动 - 产品设计文档
+
+## 1. 产品概述
+
+### 1.1 产品目标
+消费抽奖营销活动是一个基于用户消费行为的抽奖系统,通过设置消费门槛和任务条件,激励用户参与购买,提高用户粘性和复购率。
+
+### 1.2 核心特色
+- **多样化奖品类型**: 支持实物奖品、优惠券、红包、兑换码、商城奖品等
+- **灵活的开奖机制**: 支持即抽即中、按时间开奖、按人数开奖三种模式
+- **精准的用户分层**: 支持会员等级、会员标签、全部会员的精准投放
+- **多元化参与条件**: 支持购买指定商品、消费满额、充值满额等多种触发条件
+- **完善的风控机制**: 支持参与次数限制、人数上限、时间限制等
+
+## 2. 功能模块设计
+
+### 2.1 活动基础信息
+- **活动名称**: 支持最多24个字符
+- **活动时间**: 开始时间、结束时间
+- **活动描述**: 富文本编辑器支持
+- **活动封面**: 支持图片上传
+- **活动状态**: 草稿、进行中、已结束、已暂停
+
+### 2.2 奖品配置模块
+
+#### 2.2.1 奖品类型
+1. **实物奖品**
+   - 奖品名称、图片、描述
+   - 发放方式:快递邮寄
+   - 库存数量管理
+
+2. **优惠券**
+   - 关联系统优惠券
+   - 自动发放到用户账户
+
+3. **红包**
+   - 金额设置
+   - 微信红包直接发放
+
+4. **兑换码**
+   - 批量导入兑换码
+   - 一码一用机制
+
+5. **商城奖品**
+   - 关联商城商品
+   - 自动添加到用户购物车或订单
+
+#### 2.2.2 奖品属性
+- **中奖概率**: 支持百分比设置
+- **奖品数量**: 库存管理
+- **中奖提示语**: 自定义中奖文案
+- **排序权重**: 影响显示顺序
+
+### 2.3 开奖设置模块
+
+#### 2.3.1 开奖方式
+1. **即抽即中**
+   - 用户抽奖后立即出结果
+   - 适合日常营销活动
+
+2. **按时间开奖**
+   - 设置统一开奖时间
+   - 支持定时开奖功能
+   - 可设置按参与人数依次解锁奖品
+
+3. **按人数开奖**
+   - 达到指定参与人数后开奖
+   - 适合拼团类活动
+
+#### 2.3.2 参与限制
+- **单人参与次数**: 每人限抽N次
+- **参与人数上限**: 活动总参与人数限制
+- **抽奖截止时间**: 最后参与时间
+
+### 2.4 用户群体设置
+
+#### 2.4.1 适用人群
+- **全部会员**: 所有注册用户
+- **会员等级**: 指定VIP等级用户
+- **会员标签**: 自定义用户标签分组
+
+#### 2.4.2 参与条件设置
+1. **购买指定商品**
+   - 支持指定商品参与/不可参与设置
+   - 商品购买后自动获得抽奖机会
+
+2. **单笔订单消费满额**
+   - 设置最低消费金额
+   - 单笔订单达到金额后获得抽奖机会
+
+3. **单次充值金额满额**
+   - 设置充值门槛
+   - 充值成功后获得抽奖机会
+
+4. **活动期间累计消费满额**
+   - 设置累计消费目标
+   - 达到目标后获得抽奖机会
+
+### 2.5 引导样式设置
+- **引导入口**: 默认内置样式
+- **自定义引导图**: 支持上传自定义图片
+- **引导文案**: 可自定义引导文案
+
+## 3. 业务流程设计
+
+### 3.1 活动创建流程
+```
+活动创建 → 基础信息配置 → 奖品配置 → 开奖设置 → 用户群体设置 → 审核发布
+```
+
+### 3.2 用户参与流程
+```
+触发条件 → 检查用户资格 → 获得抽奖机会 → 参与抽奖 → 中奖结果 → 奖品发放
+```
+
+### 3.3 奖品发放流程
+```
+中奖确认 → 奖品类型判断 → 自动发放/手动发放 → 发放状态更新 → 用户通知
+```
+
+## 4. 数据统计与分析
+
+### 4.1 活动数据
+- 活动参与人数
+- 抽奖总次数
+- 中奖人数/次数
+- 奖品发放统计
+- 活动转化率
+
+### 4.2 用户数据
+- 用户参与记录
+- 中奖历史
+- 奖品领取状态
+- 用户行为分析
+
+## 5. 系统架构设计
+
+### 5.1 核心表结构
+- **活动主表**: 存储活动基础信息
+- **奖品表**: 存储奖品配置信息
+- **参与记录表**: 记录用户参与历史
+- **中奖记录表**: 记录中奖结果
+- **任务条件表**: 存储参与条件配置
+- **用户群体表**: 存储适用人群配置
+
+### 5.2 接口设计
+- **活动管理接口**: CRUD操作
+- **抽奖接口**: 核心抽奖逻辑
+- **记录查询接口**: 参与记录和中奖记录
+- **奖品发放接口**: 奖品发放管理
+- **统计分析接口**: 数据统计和报表
+
+## 6. 技术实现要点
+
+### 6.1 抽奖算法
+- 基于权重的随机算法
+- 防作弊机制
+- 并发安全保障
+
+### 6.2 性能优化
+- Redis缓存热点数据
+- 数据库查询优化
+- 异步任务处理
+
+### 6.3 安全机制
+- 防刷机制
+- 数据校验
+- 日志记录
+
+## 7. 运营支持
+
+### 7.1 活动模板
+- 提供常用活动模板
+- 快速创建活动
+
+### 7.2 数据导出
+- 参与数据导出
+- 中奖数据导出
+- 统计报表导出
+
+### 7.3 消息通知
+- 中奖消息推送
+- 活动开始/结束通知
+- 异常情况告警
+
+## 8. 后续优化方向
+
+### 8.1 功能增强
+- 社交分享机制
+- 邀请好友参与
+- 多级抽奖玩法
+
+### 8.2 数据分析
+- 用户行为分析
+- 活动效果评估
+- 个性化推荐
+
+### 8.3 运营工具
+- A/B测试支持
+- 智能推荐活动配置
+- 自动化运营 

+ 315 - 0
docs/消费抽奖营销活动_使用说明.md

@@ -0,0 +1,315 @@
+# 消费抽奖营销活动 - 使用说明
+
+## 1. 文档概述
+
+本文档包含了完整的消费抽奖营销活动系统的设计方案,包括:
+
+1. **产品设计文档** - 详细的功能设计和业务流程
+2. **数据表设计** - 完整的数据库表结构设计
+3. **表字段说明** - 每个字段的详细说明和使用方法
+4. **数据库脚本** - 可直接执行的建表SQL脚本
+
+## 2. 系统架构
+
+### 2.1 核心功能模块
+- **活动管理**: 创建和管理抽奖活动
+- **奖品配置**: 设置多种类型的奖品
+- **参与条件**: 灵活的消费触发条件
+- **开奖机制**: 三种开奖模式(即抽即中、按时间、按人数)
+- **用户管理**: 精准的用户群体控制
+- **统计分析**: 完整的数据统计和报表
+
+### 2.2 数据表关系
+```
+shop_marketing_activity (活动主表)
+├── shop_marketing_prize (奖品表)
+├── shop_marketing_condition (条件表)
+├── shop_marketing_draw_record (抽奖记录表)
+├── shop_marketing_win_record (中奖记录表)
+├── shop_marketing_user_chance (用户机会表)
+└── shop_marketing_statistics (统计表)
+```
+
+## 3. 快速开始
+
+### 3.1 环境要求
+- PHP 7.0+
+- MySQL 5.7+
+- FastAdmin框架
+- Redis (推荐用于缓存)
+
+### 3.2 安装步骤
+
+1. **创建数据表**
+   ```bash
+   # 执行SQL脚本创建表结构
+   mysql -u root -p your_database < 消费抽奖营销活动_数据库建表脚本.sql
+   ```
+
+2. **配置权限菜单**
+   - 在FastAdmin后台添加营销活动菜单
+   - 配置相应的权限规则
+
+3. **创建控制器和模型**
+   - 根据表结构创建对应的模型文件
+   - 实现活动管理的控制器逻辑
+
+## 4. 核心业务流程
+
+### 4.1 活动创建流程
+```
+1. 创建活动基础信息
+   ├── 活动名称、时间、描述
+   ├── 开奖方式设置
+   └── 用户群体设置
+
+2. 配置奖品信息
+   ├── 添加各类型奖品
+   ├── 设置中奖概率
+   └── 配置库存数量
+
+3. 设置参与条件
+   ├── 消费满额条件
+   ├── 指定商品购买
+   └── 充值条件等
+
+4. 发布活动
+   └── 状态设为"进行中"
+```
+
+### 4.2 用户参与流程
+```
+1. 触发条件检查
+   ├── 用户购买商品/充值
+   ├── 检查是否满足参与条件
+   └── 生成抽奖机会
+
+2. 执行抽奖
+   ├── 验证用户资格
+   ├── 检查剩余次数
+   ├── 执行抽奖算法
+   └── 返回抽奖结果
+
+3. 奖品发放
+   ├── 记录中奖信息
+   ├── 根据奖品类型发放
+   └── 更新相关统计
+```
+
+## 5. 配置说明
+
+### 5.1 奖品类型配置
+
+#### 实物奖品 (type=2)
+- 需要收货地址信息
+- 支持快递发货
+- 可设置手动发放
+
+#### 优惠券 (type=3)
+- 关联系统优惠券ID
+- 自动发放到用户账户
+
+#### 红包 (type=4)
+- 设置红包金额
+- 可对接微信红包API
+
+#### 兑换码 (type=5)
+- 批量导入兑换码
+- 一码一用机制
+
+#### 商城奖品 (type=6)
+- 关联商城商品
+- 支持指定SKU
+
+### 5.2 开奖模式配置
+
+#### 即抽即中 (lottery_type=1)
+- 用户抽奖后立即出结果
+- 适合日常营销活动
+
+#### 按时间开奖 (lottery_type=2)
+- 设置统一开奖时间
+- 支持按人数解锁奖品功能
+
+#### 按人数开奖 (lottery_type=3)
+- 达到指定人数后开奖
+- 适合拼团类活动
+
+### 5.3 参与条件配置
+
+#### 消费满额 (type=2)
+```json
+{
+  "type": 2,
+  "condition_value": 200.00,
+  "reward_times": 1,
+  "is_repeatable": 1
+}
+```
+
+#### 购买指定商品 (type=1)
+```json
+{
+  "type": 1,
+  "goods_ids": [1, 2, 3],
+  "goods_rule": 1,
+  "reward_times": 1
+}
+```
+
+## 6. API接口设计
+
+### 6.1 核心接口
+
+#### 获取活动列表
+```
+GET /api/marketing/activity/list
+参数: status, type, page, limit
+返回: 活动列表数据
+```
+
+#### 获取活动详情
+```
+GET /api/marketing/activity/detail
+参数: activity_id
+返回: 活动详细信息及奖品列表
+```
+
+#### 执行抽奖
+```
+POST /api/marketing/activity/draw
+参数: activity_id, user_id
+返回: 抽奖结果
+```
+
+#### 查询中奖记录
+```
+GET /api/marketing/win/records
+参数: user_id, activity_id, page, limit
+返回: 中奖记录列表
+```
+
+### 6.2 管理端接口
+
+#### 活动管理
+- 创建活动: `POST /admin/marketing/activity/add`
+- 编辑活动: `POST /admin/marketing/activity/edit`
+- 删除活动: `POST /admin/marketing/activity/del`
+
+#### 奖品管理
+- 添加奖品: `POST /admin/marketing/prize/add`
+- 编辑奖品: `POST /admin/marketing/prize/edit`
+- 库存管理: `POST /admin/marketing/prize/stock`
+
+#### 数据统计
+- 活动统计: `GET /admin/marketing/statistics/activity`
+- 中奖统计: `GET /admin/marketing/statistics/win`
+
+## 7. 核心算法
+
+### 7.1 抽奖算法
+```php
+/**
+ * 基于权重的随机抽奖算法
+ */
+function lottery($prizes) {
+    $totalWeight = array_sum(array_column($prizes, 'probability'));
+    $rand = mt_rand(0, $totalWeight * 100) / 100;
+    
+    $currentWeight = 0;
+    foreach ($prizes as $prize) {
+        $currentWeight += $prize['probability'];
+        if ($rand <= $currentWeight) {
+            return $prize;
+        }
+    }
+    
+    // 默认返回未中奖
+    return $prizes[0]; 
+}
+```
+
+### 7.2 并发安全
+- 使用Redis锁机制
+- 数据库事务保证一致性
+- 乐观锁更新库存
+
+## 8. 性能优化
+
+### 8.1 数据库优化
+- 合理的索引设计
+- 分表分库策略
+- 读写分离
+
+### 8.2 缓存策略
+- 活动配置缓存
+- 奖品信息缓存
+- 用户状态缓存
+
+### 8.3 异步处理
+- 奖品发放异步处理
+- 统计数据异步更新
+- 消息通知异步发送
+
+## 9. 安全机制
+
+### 9.1 防刷机制
+- IP限制
+- 用户行为分析
+- 验证码验证
+
+### 9.2 数据安全
+- 敏感数据加密
+- 日志记录
+- 权限控制
+
+## 10. 运营指南
+
+### 10.1 活动配置建议
+- 合理设置中奖概率
+- 控制奖品成本
+- 分析用户行为
+
+### 10.2 数据分析
+- 参与率分析
+- 转化率统计
+- ROI计算
+
+### 10.3 常见问题
+- 库存不足处理
+- 重复抽奖防范
+- 异常情况处理
+
+## 11. 扩展功能
+
+### 11.1 社交功能
+- 分享机制
+- 邀请好友
+- 组队抽奖
+
+### 11.2 个性化
+- 用户标签
+- 个性化奖品
+- 智能推荐
+
+### 11.3 多端支持
+- 微信小程序
+- H5页面
+- APP集成
+
+## 12. 维护说明
+
+### 12.1 定期维护
+- 数据备份
+- 日志清理
+- 性能监控
+
+### 12.2 故障处理
+- 异常告警
+- 快速恢复
+- 数据修复
+
+### 12.3 版本升级
+- 兼容性检查
+- 灰度发布
+- 回滚方案 

+ 263 - 0
docs/消费抽奖营销活动_数据库建表脚本.sql

@@ -0,0 +1,263 @@
+-- ========================================
+-- 消费抽奖营销活动 - 数据库建表脚本
+-- 创建时间: 2024年1月
+-- 版本: v1.0
+-- 说明: 基于FastAdmin框架的消费抽奖营销活动系统
+-- ========================================
+
+-- 1. 营销活动主表
+DROP TABLE IF EXISTS `shop_marketing_activity`;
+CREATE TABLE `shop_marketing_activity` (
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '活动ID',
+  `name` varchar(255) NOT NULL COMMENT '活动名称',
+  `description` text COMMENT '活动描述',
+  `cover_image` varchar(500) DEFAULT NULL COMMENT '活动封面图片',
+  `type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '活动类型: 1=消费抽奖',
+  `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '活动状态: 0=草稿 1=进行中 2=已结束 3=已暂停',
+  `start_time` int(11) NOT NULL COMMENT '开始时间',
+  `end_time` int(11) NOT NULL COMMENT '结束时间',
+  `lottery_type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '开奖方式: 1=即抽即中 2=按时间开奖 3=按人数开奖',
+  `lottery_time` int(11) DEFAULT NULL COMMENT '开奖时间(按时间开奖)',
+  `lottery_people_num` int(11) DEFAULT NULL COMMENT '开奖人数(按人数开奖)',
+  `unlock_by_people` tinyint(1) DEFAULT '0' COMMENT '按参与人数依次解锁奖品: 0=否 1=是',
+  `user_limit_type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '适用人群: 1=全部会员 2=会员等级 3=会员标签',
+  `user_limit_value` text COMMENT '适用人群限制值(JSON格式)',
+  `draw_time_enable` tinyint(1) DEFAULT '1' COMMENT '抽奖时间控制: 0=关闭 1=开启',
+  `draw_time_start` varchar(10) DEFAULT NULL COMMENT '每日抽奖开始时间(HH:mm)',
+  `draw_time_end` varchar(10) DEFAULT NULL COMMENT '每日抽奖结束时间(HH:mm)',
+  `person_limit_num` int(11) DEFAULT '1' COMMENT '单人参与次数限制',
+  `total_people_limit` int(11) DEFAULT NULL COMMENT '参与人数上限',
+  `draw_deadline` int(11) DEFAULT NULL COMMENT '抽奖截止时间',
+  `guide_style` tinyint(1) DEFAULT '1' COMMENT '引导样式: 1=默认样式 2=自定义',
+  `guide_image` varchar(500) DEFAULT NULL COMMENT '自定义引导图片',
+  `guide_text` varchar(255) DEFAULT NULL COMMENT '引导文案',
+  `intro_content` text COMMENT '抽奖介绍内容',
+  `total_draw_count` int(11) DEFAULT '0' COMMENT '总抽奖次数',
+  `total_people_count` int(11) DEFAULT '0' COMMENT '参与人数',
+  `total_win_count` int(11) DEFAULT '0' COMMENT '中奖次数',
+  `createtime` int(11) NOT NULL COMMENT '创建时间',
+  `updatetime` int(11) DEFAULT NULL COMMENT '更新时间',
+  `deletetime` int(11) DEFAULT NULL COMMENT '删除时间',
+  PRIMARY KEY (`id`),
+  KEY `idx_status_time` (`status`, `start_time`, `end_time`),
+  KEY `idx_type` (`type`),
+  KEY `idx_createtime` (`createtime`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='营销活动主表';
+
+-- 2. 抽奖奖品表
+DROP TABLE IF EXISTS `shop_marketing_prize`;
+CREATE TABLE `shop_marketing_prize` (
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '奖品ID',
+  `activity_id` int(11) NOT NULL COMMENT '活动ID',
+  `name` varchar(255) NOT NULL COMMENT '奖品名称',
+  `type` tinyint(1) NOT NULL COMMENT '奖品类型: 1=未中奖 2=实物奖品 3=优惠券 4=红包 5=兑换码 6=商城奖品',
+  `image` varchar(500) DEFAULT NULL COMMENT '奖品图片',
+  `description` text COMMENT '奖品描述',
+  `win_prompt` varchar(255) DEFAULT NULL COMMENT '中奖提示语',
+  `probability` decimal(5,2) NOT NULL DEFAULT '0.00' COMMENT '中奖概率(%)',
+  `total_stock` int(11) NOT NULL DEFAULT '0' COMMENT '奖品总数量',
+  `remain_stock` int(11) NOT NULL DEFAULT '0' COMMENT '剩余数量',
+  `win_count` int(11) DEFAULT '0' COMMENT '已中奖数量',
+  `sort_order` int(11) DEFAULT '0' COMMENT '排序权重',
+  `deliver_type` tinyint(1) DEFAULT '1' COMMENT '发放方式: 1=自动发放 2=手动发放',
+  `goods_id` int(11) DEFAULT NULL COMMENT '关联商品ID(商城奖品)',
+  `goods_sku_id` int(11) DEFAULT NULL COMMENT '关联商品SKU ID(商城奖品)',
+  `coupon_id` int(11) DEFAULT NULL COMMENT '关联优惠券ID(优惠券奖品)',
+  `amount` decimal(10,2) DEFAULT NULL COMMENT '奖品金额(红包)',
+  `exchange_codes` text COMMENT '兑换码列表(JSON格式)',
+  `used_codes` text COMMENT '已使用兑换码(JSON格式)',
+  `unlock_people_num` int(11) DEFAULT NULL COMMENT '解锁所需人数',
+  `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态: 0=禁用 1=启用',
+  `createtime` int(11) NOT NULL COMMENT '创建时间',
+  `updatetime` int(11) DEFAULT NULL COMMENT '更新时间',
+  `deletetime` int(11) DEFAULT NULL COMMENT '删除时间',
+  PRIMARY KEY (`id`),
+  KEY `idx_activity_id` (`activity_id`),
+  KEY `idx_type` (`type`),
+  KEY `idx_status` (`status`),
+  KEY `idx_sort` (`sort_order`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='抽奖奖品表';
+
+-- 3. 参与条件表
+DROP TABLE IF EXISTS `shop_marketing_condition`;
+CREATE TABLE `shop_marketing_condition` (
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '条件ID',
+  `activity_id` int(11) NOT NULL COMMENT '活动ID',
+  `type` tinyint(1) NOT NULL COMMENT '条件类型: 1=购买指定商品 2=单笔订单消费满额 3=单次充值满额 4=活动期间累计消费满额',
+  `condition_value` decimal(10,2) DEFAULT NULL COMMENT '条件值(金额)',
+  `goods_ids` text COMMENT '商品ID列表(JSON格式)',
+  `goods_rule` tinyint(1) DEFAULT '1' COMMENT '商品规则: 1=指定商品参与 2=指定商品不可参与',
+  `reward_times` int(11) DEFAULT '1' COMMENT '满足条件奖励抽奖次数',
+  `is_repeatable` tinyint(1) DEFAULT '0' COMMENT '是否可重复获得: 0=否 1=是',
+  `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态: 0=禁用 1=启用',
+  `createtime` int(11) NOT NULL COMMENT '创建时间',
+  `updatetime` int(11) DEFAULT NULL COMMENT '更新时间',
+  `deletetime` int(11) DEFAULT NULL COMMENT '删除时间',
+  PRIMARY KEY (`id`),
+  KEY `idx_activity_id` (`activity_id`),
+  KEY `idx_type` (`type`),
+  KEY `idx_status` (`status`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='参与条件表';
+
+-- 4. 用户抽奖记录表
+DROP TABLE IF EXISTS `shop_marketing_draw_record`;
+CREATE TABLE `shop_marketing_draw_record` (
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+  `activity_id` int(11) NOT NULL COMMENT '活动ID',
+  `user_id` int(11) NOT NULL COMMENT '用户ID',
+  `prize_id` int(11) NOT NULL COMMENT '奖品ID',
+  `is_win` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否中奖: 0=未中奖 1=中奖',
+  `win_info` text COMMENT '中奖信息(JSON格式)',
+  `trigger_type` tinyint(1) NOT NULL COMMENT '触发类型: 1=购买商品 2=订单消费 3=充值 4=累计消费',
+  `trigger_order_id` int(11) DEFAULT NULL COMMENT '触发订单ID',
+  `trigger_amount` decimal(10,2) DEFAULT NULL COMMENT '触发金额',
+  `draw_ip` varchar(50) DEFAULT NULL COMMENT '抽奖IP',
+  `draw_time` int(11) NOT NULL COMMENT '抽奖时间',
+  `device_info` varchar(255) DEFAULT NULL COMMENT '设备信息',
+  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+  `createtime` int(11) NOT NULL COMMENT '创建时间',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `uniq_activity_user_order` (`activity_id`, `user_id`, `trigger_order_id`),
+  KEY `idx_activity_id` (`activity_id`),
+  KEY `idx_user_id` (`user_id`),
+  KEY `idx_is_win` (`is_win`),
+  KEY `idx_draw_time` (`draw_time`),
+  KEY `idx_createtime` (`createtime`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户抽奖记录表';
+
+-- 5. 中奖记录表
+DROP TABLE IF EXISTS `shop_marketing_win_record`;
+CREATE TABLE `shop_marketing_win_record` (
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '中奖记录ID',
+  `draw_record_id` int(11) NOT NULL COMMENT '抽奖记录ID',
+  `activity_id` int(11) NOT NULL COMMENT '活动ID',
+  `user_id` int(11) NOT NULL COMMENT '用户ID',
+  `prize_id` int(11) NOT NULL COMMENT '奖品ID',
+  `prize_name` varchar(255) NOT NULL COMMENT '奖品名称',
+  `prize_type` tinyint(1) NOT NULL COMMENT '奖品类型',
+  `prize_value` text COMMENT '奖品信息(JSON格式)',
+  `deliver_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '发放状态: 0=待发放 1=已发放 2=发放失败 3=已取消',
+  `deliver_time` int(11) DEFAULT NULL COMMENT '发放时间',
+  `deliver_info` text COMMENT '发放信息(JSON格式)',
+  `receiver_name` varchar(100) DEFAULT NULL COMMENT '收货人姓名',
+  `receiver_mobile` varchar(20) DEFAULT NULL COMMENT '收货人手机',
+  `receiver_address` varchar(500) DEFAULT NULL COMMENT '收货地址',
+  `express_company` varchar(100) DEFAULT NULL COMMENT '快递公司',
+  `express_number` varchar(100) DEFAULT NULL COMMENT '快递单号',
+  `exchange_code` varchar(100) DEFAULT NULL COMMENT '兑换码',
+  `code_used_time` int(11) DEFAULT NULL COMMENT '兑换码使用时间',
+  `fail_reason` varchar(500) DEFAULT NULL COMMENT '发放失败原因',
+  `admin_remark` varchar(500) DEFAULT NULL COMMENT '管理员备注',
+  `createtime` int(11) NOT NULL COMMENT '创建时间',
+  `updatetime` int(11) DEFAULT NULL COMMENT '更新时间',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `uniq_draw_record` (`draw_record_id`),
+  KEY `idx_activity_id` (`activity_id`),
+  KEY `idx_user_id` (`user_id`),
+  KEY `idx_prize_id` (`prize_id`),
+  KEY `idx_deliver_status` (`deliver_status`),
+  KEY `idx_createtime` (`createtime`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='中奖记录表';
+
+-- 6. 用户抽奖机会表
+DROP TABLE IF EXISTS `shop_marketing_user_chance`;
+CREATE TABLE `shop_marketing_user_chance` (
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '机会ID',
+  `activity_id` int(11) NOT NULL COMMENT '活动ID',
+  `user_id` int(11) NOT NULL COMMENT '用户ID',
+  `total_chances` int(11) NOT NULL DEFAULT '0' COMMENT '总获得次数',
+  `used_chances` int(11) NOT NULL DEFAULT '0' COMMENT '已使用次数',
+  `remain_chances` int(11) NOT NULL DEFAULT '0' COMMENT '剩余次数',
+  `last_get_time` int(11) DEFAULT NULL COMMENT '最后获得时间',
+  `last_use_time` int(11) DEFAULT NULL COMMENT '最后使用时间',
+  `get_detail` text COMMENT '获得详情(JSON格式)',
+  `createtime` int(11) NOT NULL COMMENT '创建时间',
+  `updatetime` int(11) DEFAULT NULL COMMENT '更新时间',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `uniq_activity_user` (`activity_id`, `user_id`),
+  KEY `idx_activity_id` (`activity_id`),
+  KEY `idx_user_id` (`user_id`),
+  KEY `idx_remain_chances` (`remain_chances`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户抽奖机会表';
+
+-- 7. 活动统计表
+DROP TABLE IF EXISTS `shop_marketing_statistics`;
+CREATE TABLE `shop_marketing_statistics` (
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '统计ID',
+  `activity_id` int(11) NOT NULL COMMENT '活动ID',
+  `stat_date` date NOT NULL COMMENT '统计日期',
+  `new_participants` int(11) DEFAULT '0' COMMENT '新增参与人数',
+  `total_participants` int(11) DEFAULT '0' COMMENT '累计参与人数',
+  `draw_count` int(11) DEFAULT '0' COMMENT '抽奖次数',
+  `win_count` int(11) DEFAULT '0' COMMENT '中奖次数',
+  `win_rate` decimal(5,2) DEFAULT '0.00' COMMENT '中奖率(%)',
+  `prize_cost` decimal(10,2) DEFAULT '0.00' COMMENT '奖品成本',
+  `trigger_orders` int(11) DEFAULT '0' COMMENT '触发订单数',
+  `trigger_amount` decimal(10,2) DEFAULT '0.00' COMMENT '触发订单金额',
+  `conversion_rate` decimal(5,2) DEFAULT '0.00' COMMENT '转化率(%)',
+  `createtime` int(11) NOT NULL COMMENT '创建时间',
+  `updatetime` int(11) DEFAULT NULL COMMENT '更新时间',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `uniq_activity_date` (`activity_id`, `stat_date`),
+  KEY `idx_activity_id` (`activity_id`),
+  KEY `idx_stat_date` (`stat_date`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='活动统计表';
+
+-- ========================================
+-- 插入测试数据
+-- ========================================
+
+-- 插入示例活动
+INSERT INTO `shop_marketing_activity` (`id`, `name`, `description`, `cover_image`, `type`, `status`, `start_time`, `end_time`, `lottery_type`, `user_limit_type`, `draw_time_enable`, `draw_time_start`, `draw_time_end`, `person_limit_num`, `intro_content`, `createtime`) VALUES
+(1, '双十一消费抽奖活动', '购买满200元即可参与抽奖,豪华大奖等你来拿!', '/uploads/activity/cover.jpg', 1, 1, UNIX_TIMESTAMP('2024-11-01 00:00:00'), UNIX_TIMESTAMP('2024-11-11 23:59:59'), 1, 1, 1, '09:00', '22:00', 3, '<p>活动规则说明:</p><ol><li>活动期间,单笔订单消费满200元即可获得1次抽奖机会</li><li>每人每日最多可参与3次抽奖</li><li>奖品有限,先到先得</li><li>中奖后请及时联系客服领取奖品</li></ol>', UNIX_TIMESTAMP());
+
+-- 插入示例奖品
+INSERT INTO `shop_marketing_prize` (`id`, `activity_id`, `name`, `type`, `image`, `description`, `win_prompt`, `probability`, `total_stock`, `remain_stock`, `sort_order`, `deliver_type`, `amount`, `status`, `createtime`) VALUES
+(1, 1, '谢谢参与', 1, '/uploads/prize/thanks.jpg', '谢谢参与,再接再厉!', '谢谢参与,再接再厉!', 60.00, 999999, 999999, 1, 1, NULL, 1, UNIX_TIMESTAMP()),
+(2, 1, '5元红包', 4, '/uploads/prize/redpack.jpg', '微信红包5元', '恭喜您获得5元红包!', 25.00, 1000, 1000, 2, 1, 5.00, 1, UNIX_TIMESTAMP()),
+(3, 1, '20元优惠券', 3, '/uploads/prize/coupon.jpg', '满100元可用优惠券', '恭喜您获得20元优惠券!', 10.00, 500, 500, 3, 1, NULL, 1, UNIX_TIMESTAMP()),
+(4, 1, 'iPhone 15', 2, '/uploads/prize/iphone.jpg', '最新款iPhone 15手机', '恭喜您获得iPhone 15!', 0.1, 5, 5, 5, 2, NULL, 1, UNIX_TIMESTAMP()),
+(5, 1, '50元现金券', 5, '/uploads/prize/cashcode.jpg', '通用现金券兑换码', '恭喜您获得50元现金券!', 4.9, 100, 100, 4, 1, NULL, 1, UNIX_TIMESTAMP());
+
+-- 插入示例参与条件
+INSERT INTO `shop_marketing_condition` (`id`, `activity_id`, `type`, `condition_value`, `reward_times`, `is_repeatable`, `status`, `createtime`) VALUES
+(1, 1, 2, 200.00, 1, 1, 1, UNIX_TIMESTAMP());
+
+-- ========================================
+-- 权限配置SQL(可选)
+-- ========================================
+
+-- 插入菜单权限(根据实际情况调整)
+INSERT INTO `fa_auth_rule` (`type`, `pid`, `name`, `title`, `icon`, `condition`, `remark`, `ismenu`, `createtime`, `updatetime`, `weigh`, `status`) VALUES
+('file', 0, 'marketing', '营销活动', 'fa fa-gift', '', '营销活动管理', 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), 0, 'normal'),
+('file', (SELECT id FROM `fa_auth_rule` WHERE name='marketing' LIMIT 1), 'marketing/activity', '抽奖活动', 'fa fa-cube', '', '抽奖活动管理', 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), 0, 'normal'),
+('file', (SELECT id FROM `fa_auth_rule` WHERE name='marketing/activity' LIMIT 1), 'marketing/activity/index', '查看', 'fa fa-circle-o', '', '', 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), 0, 'normal'),
+('file', (SELECT id FROM `fa_auth_rule` WHERE name='marketing/activity' LIMIT 1), 'marketing/activity/add', '添加', 'fa fa-circle-o', '', '', 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), 0, 'normal'),
+('file', (SELECT id FROM `fa_auth_rule` WHERE name='marketing/activity' LIMIT 1), 'marketing/activity/edit', '编辑', 'fa fa-circle-o', '', '', 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), 0, 'normal'),
+('file', (SELECT id FROM `fa_auth_rule` WHERE name='marketing/activity' LIMIT 1), 'marketing/activity/del', '删除', 'fa fa-circle-o', '', '', 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), 0, 'normal');
+
+-- ========================================
+-- 建表脚本说明
+-- ========================================
+
+/*
+使用说明:
+1. 本脚本基于FastAdmin框架设计,兼容MySQL 5.7+
+2. 所有表使用utf8mb4字符集,支持emoji表情
+3. 时间字段统一使用int(11)存储Unix时间戳
+4. 金额字段使用decimal(10,2)确保精度
+5. 预留了deletetime字段支持软删除
+6. 包含完整的索引设计优化查询性能
+
+安装步骤:
+1. 备份现有数据库
+2. 执行本脚本创建所有表结构
+3. 根据需要调整权限配置部分
+4. 配置相关的控制器和模型文件
+5. 测试功能完整性
+
+注意事项:
+- 请在测试环境中充分测试后再部署到生产环境
+- 根据实际业务需求调整字段长度和索引配置
+- 建议定期备份数据,特别是中奖记录相关数据
+*/ 

+ 272 - 0
docs/消费抽奖营销活动_数据表设计.md

@@ -0,0 +1,272 @@
+# 消费抽奖营销活动 - 数据表设计
+
+## 1. 数据表概述
+
+消费抽奖营销活动系统共设计7张核心数据表,涵盖活动管理、奖品配置、用户参与、条件设置等完整业务流程。
+
+## 2. 数据表设计
+
+### 2.1 营销活动主表 (shop_marketing_activity)
+
+存储抽奖活动的基础信息配置。
+
+```sql
+CREATE TABLE `shop_marketing_activity` (
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '活动ID',
+  `name` varchar(255) NOT NULL COMMENT '活动名称',
+  `description` text COMMENT '活动描述',
+  `cover_image` varchar(500) DEFAULT NULL COMMENT '活动封面图片',
+  `type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '活动类型: 1=消费抽奖',
+  `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '活动状态: 0=草稿 1=进行中 2=已结束 3=已暂停',
+  `start_time` int(11) NOT NULL COMMENT '开始时间',
+  `end_time` int(11) NOT NULL COMMENT '结束时间',
+  `lottery_type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '开奖方式: 1=即抽即中 2=按时间开奖 3=按人数开奖',
+  `lottery_time` int(11) DEFAULT NULL COMMENT '开奖时间(按时间开奖)',
+  `lottery_people_num` int(11) DEFAULT NULL COMMENT '开奖人数(按人数开奖)',
+  `unlock_by_people` tinyint(1) DEFAULT '0' COMMENT '按参与人数依次解锁奖品: 0=否 1=是',
+  `user_limit_type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '适用人群: 1=全部会员 2=会员等级 3=会员标签',
+  `user_limit_value` text COMMENT '适用人群限制值(JSON格式)',
+  `draw_time_enable` tinyint(1) DEFAULT '1' COMMENT '抽奖时间控制: 0=关闭 1=开启',
+  `draw_time_start` varchar(10) DEFAULT NULL COMMENT '每日抽奖开始时间(HH:mm)',
+  `draw_time_end` varchar(10) DEFAULT NULL COMMENT '每日抽奖结束时间(HH:mm)',
+  `person_limit_num` int(11) DEFAULT '1' COMMENT '单人参与次数限制',
+  `total_people_limit` int(11) DEFAULT NULL COMMENT '参与人数上限',
+  `draw_deadline` int(11) DEFAULT NULL COMMENT '抽奖截止时间',
+  `guide_style` tinyint(1) DEFAULT '1' COMMENT '引导样式: 1=默认样式 2=自定义',
+  `guide_image` varchar(500) DEFAULT NULL COMMENT '自定义引导图片',
+  `guide_text` varchar(255) DEFAULT NULL COMMENT '引导文案',
+  `intro_content` text COMMENT '抽奖介绍内容',
+  `total_draw_count` int(11) DEFAULT '0' COMMENT '总抽奖次数',
+  `total_people_count` int(11) DEFAULT '0' COMMENT '参与人数',
+  `total_win_count` int(11) DEFAULT '0' COMMENT '中奖次数',
+  `createtime` int(11) NOT NULL COMMENT '创建时间',
+  `updatetime` int(11) DEFAULT NULL COMMENT '更新时间',
+  `deletetime` int(11) DEFAULT NULL COMMENT '删除时间',
+  PRIMARY KEY (`id`),
+  KEY `idx_status_time` (`status`, `start_time`, `end_time`),
+  KEY `idx_type` (`type`),
+  KEY `idx_createtime` (`createtime`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='营销活动主表';
+```
+
+### 2.2 抽奖奖品表 (shop_marketing_prize)
+
+存储抽奖活动的奖品配置信息。
+
+```sql
+CREATE TABLE `shop_marketing_prize` (
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '奖品ID',
+  `activity_id` int(11) NOT NULL COMMENT '活动ID',
+  `name` varchar(255) NOT NULL COMMENT '奖品名称',
+  `type` tinyint(1) NOT NULL COMMENT '奖品类型: 1=未中奖 2=实物奖品 3=优惠券 4=红包 5=兑换码 6=商城奖品',
+  `image` varchar(500) DEFAULT NULL COMMENT '奖品图片',
+  `description` text COMMENT '奖品描述',
+  `win_prompt` varchar(255) DEFAULT NULL COMMENT '中奖提示语',
+  `probability` decimal(5,2) NOT NULL DEFAULT '0.00' COMMENT '中奖概率(%)',
+  `total_stock` int(11) NOT NULL DEFAULT '0' COMMENT '奖品总数量',
+  `remain_stock` int(11) NOT NULL DEFAULT '0' COMMENT '剩余数量',
+  `win_count` int(11) DEFAULT '0' COMMENT '已中奖数量',
+  `sort_order` int(11) DEFAULT '0' COMMENT '排序权重',
+  `deliver_type` tinyint(1) DEFAULT '1' COMMENT '发放方式: 1=自动发放 2=手动发放',
+  `goods_id` int(11) DEFAULT NULL COMMENT '关联商品ID(商城奖品)',
+  `goods_sku_id` int(11) DEFAULT NULL COMMENT '关联商品SKU ID(商城奖品)',
+  `coupon_id` int(11) DEFAULT NULL COMMENT '关联优惠券ID(优惠券奖品)',
+  `amount` decimal(10,2) DEFAULT NULL COMMENT '奖品金额(红包)',
+  `exchange_codes` text COMMENT '兑换码列表(JSON格式)',
+  `used_codes` text COMMENT '已使用兑换码(JSON格式)',
+  `unlock_people_num` int(11) DEFAULT NULL COMMENT '解锁所需人数',
+  `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态: 0=禁用 1=启用',
+  `createtime` int(11) NOT NULL COMMENT '创建时间',
+  `updatetime` int(11) DEFAULT NULL COMMENT '更新时间',
+  `deletetime` int(11) DEFAULT NULL COMMENT '删除时间',
+  PRIMARY KEY (`id`),
+  KEY `idx_activity_id` (`activity_id`),
+  KEY `idx_type` (`type`),
+  KEY `idx_status` (`status`),
+  KEY `idx_sort` (`sort_order`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='抽奖奖品表';
+```
+
+### 2.3 参与条件表 (shop_marketing_condition)
+
+存储活动的参与条件配置。
+
+```sql
+CREATE TABLE `shop_marketing_condition` (
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '条件ID',
+  `activity_id` int(11) NOT NULL COMMENT '活动ID',
+  `type` tinyint(1) NOT NULL COMMENT '条件类型: 1=购买指定商品 2=单笔订单消费满额 3=单次充值满额 4=活动期间累计消费满额',
+  `condition_value` decimal(10,2) DEFAULT NULL COMMENT '条件值(金额)',
+  `goods_ids` text COMMENT '商品ID列表(JSON格式)',
+  `goods_rule` tinyint(1) DEFAULT '1' COMMENT '商品规则: 1=指定商品参与 2=指定商品不可参与',
+  `reward_times` int(11) DEFAULT '1' COMMENT '满足条件奖励抽奖次数',
+  `is_repeatable` tinyint(1) DEFAULT '0' COMMENT '是否可重复获得: 0=否 1=是',
+  `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态: 0=禁用 1=启用',
+  `createtime` int(11) NOT NULL COMMENT '创建时间',
+  `updatetime` int(11) DEFAULT NULL COMMENT '更新时间',
+  `deletetime` int(11) DEFAULT NULL COMMENT '删除时间',
+  PRIMARY KEY (`id`),
+  KEY `idx_activity_id` (`activity_id`),
+  KEY `idx_type` (`type`),
+  KEY `idx_status` (`status`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='参与条件表';
+```
+
+### 2.4 用户抽奖记录表 (shop_marketing_draw_record)
+
+记录用户的抽奖参与历史。
+
+```sql
+CREATE TABLE `shop_marketing_draw_record` (
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+  `activity_id` int(11) NOT NULL COMMENT '活动ID',
+  `user_id` int(11) NOT NULL COMMENT '用户ID',
+  `prize_id` int(11) NOT NULL COMMENT '奖品ID',
+  `is_win` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否中奖: 0=未中奖 1=中奖',
+  `win_info` text COMMENT '中奖信息(JSON格式)',
+  `trigger_type` tinyint(1) NOT NULL COMMENT '触发类型: 1=购买商品 2=订单消费 3=充值 4=累计消费',
+  `trigger_order_id` int(11) DEFAULT NULL COMMENT '触发订单ID',
+  `trigger_amount` decimal(10,2) DEFAULT NULL COMMENT '触发金额',
+  `draw_ip` varchar(50) DEFAULT NULL COMMENT '抽奖IP',
+  `draw_time` int(11) NOT NULL COMMENT '抽奖时间',
+  `device_info` varchar(255) DEFAULT NULL COMMENT '设备信息',
+  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+  `createtime` int(11) NOT NULL COMMENT '创建时间',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `uniq_activity_user_order` (`activity_id`, `user_id`, `trigger_order_id`),
+  KEY `idx_activity_id` (`activity_id`),
+  KEY `idx_user_id` (`user_id`),
+  KEY `idx_is_win` (`is_win`),
+  KEY `idx_draw_time` (`draw_time`),
+  KEY `idx_createtime` (`createtime`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户抽奖记录表';
+```
+
+### 2.5 中奖记录表 (shop_marketing_win_record)
+
+记录用户的中奖详细信息和发放状态。
+
+```sql
+CREATE TABLE `shop_marketing_win_record` (
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '中奖记录ID',
+  `draw_record_id` int(11) NOT NULL COMMENT '抽奖记录ID',
+  `activity_id` int(11) NOT NULL COMMENT '活动ID',
+  `user_id` int(11) NOT NULL COMMENT '用户ID',
+  `prize_id` int(11) NOT NULL COMMENT '奖品ID',
+  `prize_name` varchar(255) NOT NULL COMMENT '奖品名称',
+  `prize_type` tinyint(1) NOT NULL COMMENT '奖品类型',
+  `prize_value` text COMMENT '奖品信息(JSON格式)',
+  `deliver_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '发放状态: 0=待发放 1=已发放 2=发放失败 3=已取消',
+  `deliver_time` int(11) DEFAULT NULL COMMENT '发放时间',
+  `deliver_info` text COMMENT '发放信息(JSON格式)',
+  `receiver_name` varchar(100) DEFAULT NULL COMMENT '收货人姓名',
+  `receiver_mobile` varchar(20) DEFAULT NULL COMMENT '收货人手机',
+  `receiver_address` varchar(500) DEFAULT NULL COMMENT '收货地址',
+  `express_company` varchar(100) DEFAULT NULL COMMENT '快递公司',
+  `express_number` varchar(100) DEFAULT NULL COMMENT '快递单号',
+  `exchange_code` varchar(100) DEFAULT NULL COMMENT '兑换码',
+  `code_used_time` int(11) DEFAULT NULL COMMENT '兑换码使用时间',
+  `fail_reason` varchar(500) DEFAULT NULL COMMENT '发放失败原因',
+  `admin_remark` varchar(500) DEFAULT NULL COMMENT '管理员备注',
+  `createtime` int(11) NOT NULL COMMENT '创建时间',
+  `updatetime` int(11) DEFAULT NULL COMMENT '更新时间',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `uniq_draw_record` (`draw_record_id`),
+  KEY `idx_activity_id` (`activity_id`),
+  KEY `idx_user_id` (`user_id`),
+  KEY `idx_prize_id` (`prize_id`),
+  KEY `idx_deliver_status` (`deliver_status`),
+  KEY `idx_createtime` (`createtime`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='中奖记录表';
+```
+
+### 2.6 用户抽奖机会表 (shop_marketing_user_chance)
+
+记录用户获得的抽奖机会和使用情况。
+
+```sql
+CREATE TABLE `shop_marketing_user_chance` (
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '机会ID',
+  `activity_id` int(11) NOT NULL COMMENT '活动ID',
+  `user_id` int(11) NOT NULL COMMENT '用户ID',
+  `total_chances` int(11) NOT NULL DEFAULT '0' COMMENT '总获得次数',
+  `used_chances` int(11) NOT NULL DEFAULT '0' COMMENT '已使用次数',
+  `remain_chances` int(11) NOT NULL DEFAULT '0' COMMENT '剩余次数',
+  `last_get_time` int(11) DEFAULT NULL COMMENT '最后获得时间',
+  `last_use_time` int(11) DEFAULT NULL COMMENT '最后使用时间',
+  `get_detail` text COMMENT '获得详情(JSON格式)',
+  `createtime` int(11) NOT NULL COMMENT '创建时间',
+  `updatetime` int(11) DEFAULT NULL COMMENT '更新时间',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `uniq_activity_user` (`activity_id`, `user_id`),
+  KEY `idx_activity_id` (`activity_id`),
+  KEY `idx_user_id` (`user_id`),
+  KEY `idx_remain_chances` (`remain_chances`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户抽奖机会表';
+```
+
+### 2.7 活动统计表 (shop_marketing_statistics)
+
+存储活动的统计数据,用于报表分析。
+
+```sql
+CREATE TABLE `shop_marketing_statistics` (
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '统计ID',
+  `activity_id` int(11) NOT NULL COMMENT '活动ID',
+  `stat_date` date NOT NULL COMMENT '统计日期',
+  `new_participants` int(11) DEFAULT '0' COMMENT '新增参与人数',
+  `total_participants` int(11) DEFAULT '0' COMMENT '累计参与人数',
+  `draw_count` int(11) DEFAULT '0' COMMENT '抽奖次数',
+  `win_count` int(11) DEFAULT '0' COMMENT '中奖次数',
+  `win_rate` decimal(5,2) DEFAULT '0.00' COMMENT '中奖率(%)',
+  `prize_cost` decimal(10,2) DEFAULT '0.00' COMMENT '奖品成本',
+  `trigger_orders` int(11) DEFAULT '0' COMMENT '触发订单数',
+  `trigger_amount` decimal(10,2) DEFAULT '0.00' COMMENT '触发订单金额',
+  `conversion_rate` decimal(5,2) DEFAULT '0.00' COMMENT '转化率(%)',
+  `createtime` int(11) NOT NULL COMMENT '创建时间',
+  `updatetime` int(11) DEFAULT NULL COMMENT '更新时间',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `uniq_activity_date` (`activity_id`, `stat_date`),
+  KEY `idx_activity_id` (`activity_id`),
+  KEY `idx_stat_date` (`stat_date`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='活动统计表';
+```
+
+## 3. 索引设计说明
+
+### 3.1 主要索引
+- **联合索引**: 按查询频率设计联合索引,提高查询性能
+- **唯一索引**: 防止重复数据,保证数据完整性
+- **普通索引**: 优化常用查询条件
+
+### 3.2 性能优化
+- 时间字段使用int类型存储时间戳,提高查询效率
+- JSON字段存储复杂数据结构,减少关联查询
+- 适当的字段长度设置,节省存储空间
+
+## 4. 数据关系说明
+
+### 4.1 主要关联关系
+```
+shop_marketing_activity (1) ----< (N) shop_marketing_prize
+shop_marketing_activity (1) ----< (N) shop_marketing_condition  
+shop_marketing_activity (1) ----< (N) shop_marketing_draw_record
+shop_marketing_draw_record (1) ----< (1) shop_marketing_win_record
+shop_marketing_activity (1) ----< (N) shop_marketing_user_chance
+shop_marketing_activity (1) ----< (N) shop_marketing_statistics
+```
+
+### 4.2 外键约束
+建议在应用层面维护数据完整性,不设置数据库外键约束,提高性能和灵活性。
+
+## 5. 数据安全与备份
+
+### 5.1 敏感数据处理
+- 用户个人信息加密存储
+- 中奖记录数据定期备份
+- 关键操作记录审计日志
+
+### 5.2 数据清理策略
+- 过期活动数据归档
+- 统计数据定期汇总
+- 日志数据按策略清理 

+ 299 - 0
docs/消费抽奖营销活动_表字段说明.md

@@ -0,0 +1,299 @@
+# 消费抽奖营销活动 - 表字段详细说明
+
+## 1. 营销活动主表 (shop_marketing_activity)
+
+### 1.1 基础信息字段
+| 字段名 | 类型 | 说明 | 示例值 | 备注 |
+|--------|------|------|--------|------|
+| id | int(11) | 活动ID,主键 | 1 | 自增主键 |
+| name | varchar(255) | 活动名称 | "双十一消费抽奖" | 最多24个字符,前端限制 |
+| description | text | 活动描述 | "购买满200元即可参与抽奖" | 富文本内容 |
+| cover_image | varchar(500) | 活动封面图片 | "/uploads/activity/cover.jpg" | 相对路径 |
+| type | tinyint(1) | 活动类型 | 1 | 1=消费抽奖,预留扩展 |
+
+### 1.2 状态控制字段
+| 字段名 | 类型 | 说明 | 枚举值 | 备注 |
+|--------|------|------|--------|------|
+| status | tinyint(1) | 活动状态 | 0=草稿<br>1=进行中<br>2=已结束<br>3=已暂停 | 控制活动生命周期 |
+| start_time | int(11) | 开始时间 | 1640995200 | Unix时间戳 |
+| end_time | int(11) | 结束时间 | 1641081600 | Unix时间戳 |
+
+### 1.3 开奖设置字段
+| 字段名 | 类型 | 说明 | 枚举值 | 备注 |
+|--------|------|------|--------|------|
+| lottery_type | tinyint(1) | 开奖方式 | 1=即抽即中<br>2=按时间开奖<br>3=按人数开奖 | 核心业务逻辑 |
+| lottery_time | int(11) | 开奖时间 | 1641081600 | 仅按时间开奖时使用 |
+| lottery_people_num | int(11) | 开奖人数 | 100 | 仅按人数开奖时使用 |
+| unlock_by_people | tinyint(1) | 按参与人数依次解锁奖品 | 0=否,1=是 | 配合按时间开奖使用 |
+
+### 1.4 用户群体控制字段
+| 字段名 | 类型 | 说明 | 枚举值 | JSON格式示例 |
+|--------|------|------|--------|------------|
+| user_limit_type | tinyint(1) | 适用人群类型 | 1=全部会员<br>2=会员等级<br>3=会员标签 | - |
+| user_limit_value | text | 适用人群限制值 | JSON格式 | `{"levels":[1,2,3]}`<br>`{"tags":["vip","gold"]}` |
+
+### 1.5 抽奖时间控制字段
+| 字段名 | 类型 | 说明 | 示例值 | 备注 |
+|--------|------|------|--------|------|
+| draw_time_enable | tinyint(1) | 抽奖时间控制 | 1 | 0=关闭,1=开启 |
+| draw_time_start | varchar(10) | 每日抽奖开始时间 | "09:00" | HH:mm格式 |
+| draw_time_end | varchar(10) | 每日抽奖结束时间 | "22:00" | HH:mm格式 |
+
+### 1.6 参与限制字段
+| 字段名 | 类型 | 说明 | 示例值 | 备注 |
+|--------|------|------|--------|------|
+| person_limit_num | int(11) | 单人参与次数限制 | 3 | 每人最多抽奖次数 |
+| total_people_limit | int(11) | 参与人数上限 | 1000 | 活动总人数限制 |
+| draw_deadline | int(11) | 抽奖截止时间 | 1641081600 | Unix时间戳 |
+
+### 1.7 引导样式字段
+| 字段名 | 类型 | 说明 | 枚举值 | 备注 |
+|--------|------|------|--------|------|
+| guide_style | tinyint(1) | 引导样式 | 1=默认样式<br>2=自定义 | 活动入口展示样式 |
+| guide_image | varchar(500) | 自定义引导图片 | "/uploads/guide.jpg" | 自定义时使用 |
+| guide_text | varchar(255) | 引导文案 | "快来参与抽奖吧!" | 自定义引导文案 |
+| intro_content | text | 抽奖介绍内容 | "活动规则说明..." | 富文本内容 |
+
+### 1.8 统计字段
+| 字段名 | 类型 | 说明 | 示例值 | 备注 |
+|--------|------|------|--------|------|
+| total_draw_count | int(11) | 总抽奖次数 | 500 | 实时统计 |
+| total_people_count | int(11) | 参与人数 | 200 | 去重统计 |
+| total_win_count | int(11) | 中奖次数 | 50 | 中奖统计 |
+
+## 2. 抽奖奖品表 (shop_marketing_prize)
+
+### 2.1 基础信息字段
+| 字段名 | 类型 | 说明 | 示例值 | 备注 |
+|--------|------|------|--------|------|
+| id | int(11) | 奖品ID,主键 | 1 | 自增主键 |
+| activity_id | int(11) | 关联活动ID | 1 | 外键关联 |
+| name | varchar(255) | 奖品名称 | "iPhone 14" | 奖品展示名称 |
+| type | tinyint(1) | 奖品类型 | 2 | 见下方类型说明 |
+| image | varchar(500) | 奖品图片 | "/uploads/prize.jpg" | 相对路径 |
+| description | text | 奖品描述 | "最新款iPhone..." | 详细描述 |
+| win_prompt | varchar(255) | 中奖提示语 | "恭喜您获得iPhone 14!" | 中奖时显示 |
+
+### 2.2 奖品类型枚举
+| 类型值 | 类型名称 | 说明 | 相关字段 |
+|--------|----------|------|----------|
+| 1 | 未中奖 | 谢谢参与 | - |
+| 2 | 实物奖品 | 需要邮寄的实物 | deliver_type |
+| 3 | 优惠券 | 系统优惠券 | coupon_id |
+| 4 | 红包 | 微信红包 | amount |
+| 5 | 兑换码 | 第三方兑换码 | exchange_codes |
+| 6 | 商城奖品 | 商城商品 | goods_id, goods_sku_id |
+
+### 2.3 概率和库存字段
+| 字段名 | 类型 | 说明 | 示例值 | 备注 |
+|--------|------|------|--------|------|
+| probability | decimal(5,2) | 中奖概率(%) | 5.50 | 0.00-100.00 |
+| total_stock | int(11) | 奖品总数量 | 100 | 初始库存 |
+| remain_stock | int(11) | 剩余数量 | 95 | 实时库存 |
+| win_count | int(11) | 已中奖数量 | 5 | 统计字段 |
+| sort_order | int(11) | 排序权重 | 100 | 数值越大越靠前 |
+
+### 2.4 发放设置字段
+| 字段名 | 类型 | 说明 | 枚举值 | 备注 |
+|--------|------|------|--------|------|
+| deliver_type | tinyint(1) | 发放方式 | 1=自动发放<br>2=手动发放 | 影响发放流程 |
+| unlock_people_num | int(11) | 解锁所需人数 | 50 | 按人数解锁奖品 |
+
+### 2.5 关联字段
+| 字段名 | 类型 | 说明 | 示例值 | 使用条件 |
+|--------|------|------|--------|----------|
+| goods_id | int(11) | 关联商品ID | 123 | 商城奖品时使用 |
+| goods_sku_id | int(11) | 关联商品SKU ID | 456 | 商城奖品时使用 |
+| coupon_id | int(11) | 关联优惠券ID | 789 | 优惠券奖品时使用 |
+| amount | decimal(10,2) | 奖品金额 | 50.00 | 红包时使用 |
+
+### 2.6 兑换码字段
+| 字段名 | 类型 | 说明 | JSON格式示例 | 备注 |
+|--------|------|------|------------|------|
+| exchange_codes | text | 兑换码列表 | `["CODE001","CODE002"]` | 批量导入的兑换码 |
+| used_codes | text | 已使用兑换码 | `["CODE001"]` | 已发放的兑换码 |
+
+## 3. 参与条件表 (shop_marketing_condition)
+
+### 3.1 基础字段
+| 字段名 | 类型 | 说明 | 示例值 | 备注 |
+|--------|------|------|--------|------|
+| id | int(11) | 条件ID,主键 | 1 | 自增主键 |
+| activity_id | int(11) | 关联活动ID | 1 | 外键关联 |
+| type | tinyint(1) | 条件类型 | 2 | 见下方类型说明 |
+
+### 3.2 条件类型枚举
+| 类型值 | 类型名称 | 说明 | 使用字段 |
+|--------|----------|------|----------|
+| 1 | 购买指定商品 | 购买特定商品获得抽奖机会 | goods_ids, goods_rule |
+| 2 | 单笔订单消费满额 | 单笔订单达到金额 | condition_value |
+| 3 | 单次充值满额 | 单次充值达到金额 | condition_value |
+| 4 | 活动期间累计消费满额 | 活动期间累计消费 | condition_value |
+
+### 3.3 条件配置字段
+| 字段名 | 类型 | 说明 | 示例值 | 备注 |
+|--------|------|------|--------|------|
+| condition_value | decimal(10,2) | 条件值(金额) | 200.00 | 消费/充值门槛 |
+| goods_ids | text | 商品ID列表 | `[1,2,3]` | JSON格式 |
+| goods_rule | tinyint(1) | 商品规则 | 1 | 1=指定商品参与<br>2=指定商品不可参与 |
+| reward_times | int(11) | 奖励抽奖次数 | 1 | 满足条件获得次数 |
+| is_repeatable | tinyint(1) | 是否可重复获得 | 0 | 0=否,1=是 |
+
+## 4. 用户抽奖记录表 (shop_marketing_draw_record)
+
+### 4.1 基础字段
+| 字段名 | 类型 | 说明 | 示例值 | 备注 |
+|--------|------|------|--------|------|
+| id | int(11) | 记录ID,主键 | 1 | 自增主键 |
+| activity_id | int(11) | 活动ID | 1 | 外键关联 |
+| user_id | int(11) | 用户ID | 123 | 外键关联 |
+| prize_id | int(11) | 奖品ID | 5 | 抽中的奖品 |
+| is_win | tinyint(1) | 是否中奖 | 1 | 0=未中奖,1=中奖 |
+
+### 4.2 触发信息字段
+| 字段名 | 类型 | 说明 | 枚举值 | 备注 |
+|--------|------|------|--------|------|
+| trigger_type | tinyint(1) | 触发类型 | 1=购买商品<br>2=订单消费<br>3=充值<br>4=累计消费 | 抽奖触发条件 |
+| trigger_order_id | int(11) | 触发订单ID | 789 | 关联订单 |
+| trigger_amount | decimal(10,2) | 触发金额 | 200.00 | 触发的金额 |
+
+### 4.3 抽奖环境字段
+| 字段名 | 类型 | 说明 | 示例值 | 备注 |
+|--------|------|------|--------|------|
+| draw_ip | varchar(50) | 抽奖IP | "192.168.1.1" | 用户IP地址 |
+| draw_time | int(11) | 抽奖时间 | 1641081600 | Unix时间戳 |
+| device_info | varchar(255) | 设备信息 | "iPhone 13" | 用户设备信息 |
+
+### 4.4 扩展字段
+| 字段名 | 类型 | 说明 | JSON格式示例 | 备注 |
+|--------|------|------|------------|------|
+| win_info | text | 中奖信息 | `{"prize_name":"iPhone","amount":8999}` | 中奖详情 |
+| remark | varchar(500) | 备注 | "正常抽奖" | 管理员备注 |
+
+## 5. 中奖记录表 (shop_marketing_win_record)
+
+### 5.1 基础字段
+| 字段名 | 类型 | 说明 | 示例值 | 备注 |
+|--------|------|------|--------|------|
+| id | int(11) | 中奖记录ID,主键 | 1 | 自增主键 |
+| draw_record_id | int(11) | 抽奖记录ID | 1 | 一对一关联 |
+| activity_id | int(11) | 活动ID | 1 | 冗余字段,便于查询 |
+| user_id | int(11) | 用户ID | 123 | 冗余字段 |
+| prize_id | int(11) | 奖品ID | 5 | 冗余字段 |
+| prize_name | varchar(255) | 奖品名称 | "iPhone 14" | 冗余字段,防止删除 |
+| prize_type | tinyint(1) | 奖品类型 | 2 | 冗余字段 |
+
+### 5.2 发放状态字段
+| 字段名 | 类型 | 说明 | 枚举值 | 备注 |
+|--------|------|------|--------|------|
+| deliver_status | tinyint(1) | 发放状态 | 0=待发放<br>1=已发放<br>2=发放失败<br>3=已取消 | 核心状态字段 |
+| deliver_time | int(11) | 发放时间 | 1641081600 | Unix时间戳 |
+| fail_reason | varchar(500) | 发放失败原因 | "库存不足" | 失败时记录 |
+
+### 5.3 收货信息字段
+| 字段名 | 类型 | 说明 | 示例值 | 备注 |
+|--------|------|------|--------|------|
+| receiver_name | varchar(100) | 收货人姓名 | "张三" | 实物奖品时必填 |
+| receiver_mobile | varchar(20) | 收货人手机 | "13800138000" | 实物奖品时必填 |
+| receiver_address | varchar(500) | 收货地址 | "北京市..." | 实物奖品时必填 |
+
+### 5.4 物流信息字段
+| 字段名 | 类型 | 说明 | 示例值 | 备注 |
+|--------|------|------|--------|------|
+| express_company | varchar(100) | 快递公司 | "顺丰快递" | 实物奖品发货 |
+| express_number | varchar(100) | 快递单号 | "SF1234567890" | 物流跟踪 |
+
+### 5.5 兑换码字段
+| 字段名 | 类型 | 说明 | 示例值 | 备注 |
+|--------|------|------|--------|------|
+| exchange_code | varchar(100) | 兑换码 | "CODE001" | 兑换码奖品 |
+| code_used_time | int(11) | 兑换码使用时间 | 1641081600 | 使用时记录 |
+
+### 5.6 扩展字段
+| 字段名 | 类型 | 说明 | JSON格式示例 | 备注 |
+|--------|------|------|------------|------|
+| prize_value | text | 奖品信息 | `{"amount":50,"coupon_id":123}` | 不同类型奖品的详细信息 |
+| deliver_info | text | 发放信息 | `{"wechat_order_id":"wx123"}` | 发放详细信息 |
+| admin_remark | varchar(500) | 管理员备注 | "手动发放" | 管理员操作备注 |
+
+## 6. 用户抽奖机会表 (shop_marketing_user_chance)
+
+### 6.1 基础字段
+| 字段名 | 类型 | 说明 | 示例值 | 备注 |
+|--------|------|------|--------|------|
+| id | int(11) | 机会ID,主键 | 1 | 自增主键 |
+| activity_id | int(11) | 活动ID | 1 | 外键关联 |
+| user_id | int(11) | 用户ID | 123 | 外键关联 |
+
+### 6.2 次数统计字段
+| 字段名 | 类型 | 说明 | 示例值 | 备注 |
+|--------|------|------|--------|------|
+| total_chances | int(11) | 总获得次数 | 5 | 累计获得的抽奖机会 |
+| used_chances | int(11) | 已使用次数 | 3 | 已经消耗的次数 |
+| remain_chances | int(11) | 剩余次数 | 2 | 当前可用次数 |
+
+### 6.3 时间记录字段
+| 字段名 | 类型 | 说明 | 示例值 | 备注 |
+|--------|------|------|--------|------|
+| last_get_time | int(11) | 最后获得时间 | 1641081600 | 最近一次获得机会的时间 |
+| last_use_time | int(11) | 最后使用时间 | 1641081800 | 最近一次使用机会的时间 |
+
+### 6.4 扩展字段
+| 字段名 | 类型 | 说明 | JSON格式示例 | 备注 |
+|--------|------|------|------------|------|
+| get_detail | text | 获得详情 | `[{"time":1641081600,"type":"order","amount":200}]` | 获得机会的详细记录 |
+
+## 7. 活动统计表 (shop_marketing_statistics)
+
+### 7.1 基础字段
+| 字段名 | 类型 | 说明 | 示例值 | 备注 |
+|--------|------|------|--------|------|
+| id | int(11) | 统计ID,主键 | 1 | 自增主键 |
+| activity_id | int(11) | 活动ID | 1 | 外键关联 |
+| stat_date | date | 统计日期 | 2024-01-01 | 按日统计 |
+
+### 7.2 参与统计字段
+| 字段名 | 类型 | 说明 | 示例值 | 备注 |
+|--------|------|------|--------|------|
+| new_participants | int(11) | 新增参与人数 | 50 | 当日新增 |
+| total_participants | int(11) | 累计参与人数 | 200 | 累计参与 |
+| draw_count | int(11) | 抽奖次数 | 100 | 当日抽奖总次数 |
+| win_count | int(11) | 中奖次数 | 20 | 当日中奖次数 |
+| win_rate | decimal(5,2) | 中奖率(%) | 20.00 | 中奖率统计 |
+
+### 7.3 成本统计字段
+| 字段名 | 类型 | 说明 | 示例值 | 备注 |
+|--------|------|------|--------|------|
+| prize_cost | decimal(10,2) | 奖品成本 | 1000.00 | 当日奖品成本 |
+
+### 7.4 转化统计字段
+| 字段名 | 类型 | 说明 | 示例值 | 备注 |
+|--------|------|------|--------|------|
+| trigger_orders | int(11) | 触发订单数 | 80 | 因活动产生的订单 |
+| trigger_amount | decimal(10,2) | 触发订单金额 | 16000.00 | 订单总金额 |
+| conversion_rate | decimal(5,2) | 转化率(%) | 40.00 | 参与转化为订单的比率 |
+
+## 8. 字段设计原则说明
+
+### 8.1 数据类型选择
+- **int(11)**: 用于ID、时间戳、数量等字段
+- **tinyint(1)**: 用于状态、类型等枚举字段,节省空间
+- **decimal(10,2)**: 用于金额字段,保证精度
+- **varchar**: 用于文本字段,根据实际需要设置长度
+- **text**: 用于长文本或JSON数据
+
+### 8.2 索引设计
+- **主键索引**: 所有表都有自增主键
+- **唯一索引**: 防止重复数据
+- **联合索引**: 优化常用查询组合
+- **普通索引**: 提高单字段查询性能
+
+### 8.3 冗余字段
+为了查询性能,适当增加冗余字段:
+- 中奖记录表冗余奖品信息,防止奖品删除后数据丢失
+- 统计表冗余计算结果,避免实时计算
+
+### 8.4 扩展性考虑
+- 使用JSON字段存储灵活配置
+- 预留status字段便于功能扩展
+- 软删除机制保证数据安全