# 埋点统计数据JSON格式说明

## 一、概述

`store_track_statistics` 表中的各个数据字段存储的是JSON格式的统计数据。本文档详细说明各个字段的JSON格式。

````sql
-- 埋点事件表
CREATE TABLE `store_track_event` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `event_type` varchar(50) NOT NULL COMMENT '事件类型(VIEW-浏览,SEARCH-搜索,COLLECT-收藏,SHARE-分享,CHECKIN-打卡,CONSULT-咨询,FOLLOW-关注,UNFOLLOW-取消关注,FRIEND_ADD-添加好友,POST_PUBLISH-发布动态,POST_LIKE-动态点赞,POST_COMMENT-动态评论,POST_REPOST-动态转发,REPORT-举报,BLOCK-拉黑,COUPON_GIVE-赠送优惠券,COUPON_USE-使用优惠券,VOUCHER_GIVE-赠送代金券,VOUCHER_USE-使用代金券,PRICE_VIEW-价目表浏览,PRICE_SHARE-价目表分享,RATING-评价,APPEAL-申诉)',
  `event_category` varchar(50) NOT NULL COMMENT '事件分类(TRAFFIC-流量数据,INTERACTION-互动数据,COUPON-优惠券,VOUCHER-代金券,SERVICE-服务质量,PRICE-价目表)',
  `user_id` int(11) DEFAULT NULL COMMENT '用户ID',
  `store_id` int(11) DEFAULT NULL COMMENT '店铺ID',
  `target_id` int(11) DEFAULT NULL COMMENT '目标对象ID(如价目表ID、动态ID等)',
  `target_type` varchar(50) DEFAULT NULL COMMENT '目标对象类型(PRICE-价目表,POST-动态,STORE-店铺等)',
  `event_data` text COMMENT '事件附加数据(JSON格式)',
  `amount` decimal(10,2) DEFAULT NULL COMMENT '金额(用于优惠券、代金券等)',
  `duration` bigint(20) DEFAULT NULL COMMENT '时长(毫秒,用于访问时长等)',
  `ip_address` varchar(50) DEFAULT NULL COMMENT 'IP地址',
  `user_agent` varchar(500) DEFAULT NULL COMMENT '用户代理',
  `device_type` varchar(20) DEFAULT NULL COMMENT '设备类型(IOS,ANDROID,WEB)',
  `app_version` varchar(20) DEFAULT NULL COMMENT 'APP版本号',
  `event_time` datetime NOT NULL COMMENT '事件发生时间',
  `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `delete_flag` int(1) NOT NULL DEFAULT '0' COMMENT '删除标记(0:未删除,1:已删除)',
  PRIMARY KEY (`id`),
  KEY `idx_store_id` (`store_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_event_type` (`event_type`),
  KEY `idx_event_category` (`event_category`),
  KEY `idx_event_time` (`event_time`),
  KEY `idx_store_event_time` (`store_id`,`event_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='埋点事件表';

-- 埋点统计表
CREATE TABLE `store_track_statistics` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `store_id` int(11) NOT NULL COMMENT '店铺ID',
  `stat_date` date NOT NULL COMMENT '统计日期',
  `stat_type` varchar(50) NOT NULL COMMENT '统计类型(DAILY-日统计,WEEKLY-周统计,MONTHLY-月统计)',
  `traffic_data` text COMMENT '流量数据(JSON格式)',
  `interaction_data` text COMMENT '互动数据(JSON格式)',
  `coupon_data` text COMMENT '优惠券数据(JSON格式)',
  `voucher_data` text COMMENT '代金券数据(JSON格式)',
  `service_data` text COMMENT '服务质量数据(JSON格式)',
  `price_ranking_data` text COMMENT '价目表排名数据(JSON格式)',
  `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_store_date_type` (`store_id`,`stat_date`,`stat_type`),
  KEY `idx_store_id` (`store_id`),
  KEY `idx_stat_date` (`stat_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='埋点统计表';
```

## 二、各字段JSON格式

### 2.1 traffic_data（流量数据）

**字段说明**：存储流量相关的统计数据

**JSON格式**：
```json
{
  "searchCount": 100,           // 搜索量（Long类型）
  "viewCount": 500,             // 浏览量（Long类型）
  "visitorCount": 300,          // 访客数（去重后的用户数，Long类型）
  "newVisitorCount": 50,        // 新增访客数（Long类型）
  "totalDuration": 1500000,     // 总访问时长（毫秒，Long类型）
  "avgDuration": 5000           // 平均访问时长（毫秒，Long类型）
}
```

**字段说明**：
- `searchCount`: 店铺搜索次数（埋点时间SEARCH该店铺的次数）
- `viewCount`: 店铺浏览次数（埋点时间VIEW该店铺的次数）
- `visitorCount`: 访客数（去重后的用户ID数量）
- `newVisitorCount`: 新增访客数（在统计日期之前没有访问记录的用户）
- `totalDuration`: 总访问时长（所有浏览事件duration字段的总和，单位：毫秒）
- `avgDuration`: 平均访问时长（totalDuration / 有duration的浏览事件数，单位：毫秒）

---

### 2.2 interaction_data（互动数据）

**字段说明**：存储用户互动相关的统计数据

**JSON格式**：
```json
{
  "collectCount": 50,           // 收藏次数（Long类型）
  "shareCount": 30,             // 分享次数（Long类型）
  "checkinCount": 20,           // 打卡次数（Long类型）
  "consultCount": 10,           // 咨询次数（Long类型）
  "friendCount": 100,           // 好友数量（互相关注的用户数，Long类型）
  "followCount": 200,           // 关注数量（店铺用户关注的人数，Long类型）
  "fansCount": 150,             // 粉丝数量（关注店铺用户的人数，Long类型）
  "postCount": 25,              // 发布动态数量（Long类型）
  "postLikeCount": 200,         // 动态点赞数量（Long类型）
  "postCommentCount": 80,      // 动态评论数量（Long类型）
  "postRepostCount": 15,        // 动态转发数量（Long类型）
  "reportCount": 5,             // 被举报次数（Long类型）
  "blockCount": 2               // 被拉黑次数（Long类型）
}
```

**字段说明**：
- `collectCount`: 店铺收藏次数（从埋点事件中统计COLLECT类型）
- `shareCount`: 店铺分享次数（从埋点事件中统计SHARE类型）
- `checkinCount`: 店铺打卡次数（从埋点事件中统计CHECKIN类型）
- `consultCount`: 咨询商家次数（从埋点事件中统计CONSULT类型）
- `friendCount`: 好友数量（通过life_fans表查询互相关注的用户数）
- `followCount`: 关注数量（店铺用户关注的人数）
- `fansCount`: 粉丝数量（关注店铺用户的人数）
- `postCount`: 发布动态数量（从life_user_dynamics表查询，type=2商家社区）
- `postLikeCount`: 动态点赞数量（从埋点事件中统计POST_LIKE类型）
- `postCommentCount`: 动态评论数量（从埋点事件中统计POST_COMMENT类型）
- `postRepostCount`: 动态转发数量（从埋点事件中统计POST_REPOST类型）
- `reportCount`: 被举报次数（从埋点事件中统计REPORT类型）
- `blockCount`: 被拉黑次数（从埋点事件中统计BLOCK类型）

---

### 2.3 coupon_data（优惠券数据）

**字段说明**：存储优惠券相关的统计数据

**JSON格式**：
```json
{
  "giveToFriendCount": 50,                    // 赠送好友数量（Long类型）
  "giveToFriendAmount": 5000.00,             // 赠送好友金额合计（BigDecimal类型，单位：元）
  "giveToFriendUseCount": 30,                // 赠送好友使用数量（Long类型）
  "giveToFriendUseAmount": 3000.00,          // 赠送好友使用金额合计（BigDecimal类型，单位：元）
  "giveToFriendUseAmountPercent": 60.00,     // 赠送好友使用金额占比（Double类型，单位：%）
  "friendGiveCount": 20,                     // 好友赠送数量（Long类型）
  "friendGiveAmount": 2000.00,               // 好友赠送金额合计（BigDecimal类型，单位：元）
  "friendGiveUseCount": 15,                  // 好友赠送使用数量（Long类型）
  "friendGiveUseAmount": 1500.00,            // 好友赠送使用金额合计（BigDecimal类型，单位：元）
  "friendGiveUseAmountPercent": 75.00        // 好友赠送使用金额占比（Double类型，单位：%）
}
```

**字段说明**：
- `giveToFriendCount`: 赠送好友数量（从life_discount_coupon_user表统计，关联店铺的优惠券）
- `giveToFriendAmount`: 赠送好友金额合计（优惠券面值的总和）
- `giveToFriendUseCount`: 赠送好友使用数量（status=1已使用的数量）
- `giveToFriendUseAmount`: 赠送好友使用金额合计（已使用优惠券的面值总和）
- `giveToFriendUseAmountPercent`: 赠送好友使用金额占比（giveToFriendUseAmount / giveToFriendAmount * 100）
- `friendGiveCount`: 好友赠送数量（好友赠送给店铺用户的优惠券数量，从life_discount_coupon_store_friend表统计）
- `friendGiveAmount`: 好友赠送金额合计（好友赠送的优惠券面值总和）
- `friendGiveUseCount`: 好友赠送使用数量（已使用的数量）
- `friendGiveUseAmount`: 好友赠送使用金额合计（已使用的优惠券面值总和）
- `friendGiveUseAmountPercent`: 好友赠送使用金额占比（friendGiveUseAmount / friendGiveAmount * 100）

---

### 2.4 voucher_data（代金券数据）

**字段说明**：存储代金券相关的统计数据

**JSON格式**：
```json
{
  "giveToFriendCount": 30,                    // 赠送好友数量（Long类型）
  "giveToFriendAmount": 3000.00,             // 赠送好友金额合计（BigDecimal类型，单位：元）
  "giveToFriendUseCount": 20,               // 赠送好友使用数量（Long类型）
  "giveToFriendUseAmount": 2000.00,         // 赠送好友使用金额合计（BigDecimal类型，单位：元）
  "giveToFriendUseAmountPercent": 66.67,    // 赠送好友使用金额占比（Double类型，单位：%）
  "friendGiveCount": 10,                     // 好友赠送数量（Long类型）
  "friendGiveAmount": 1000.00,               // 好友赠送金额合计（BigDecimal类型，单位：元）
  "friendGiveUseCount": 8,                   // 好友赠送使用数量（Long类型）
  "friendGiveUseAmount": 800.00,             // 好友赠送使用金额合计（BigDecimal类型，单位：元）
  "friendGiveUseAmountPercent": 80.00        // 好友赠送使用金额占比（Double类型，单位：%）
}
```

**字段说明**：
- `giveToFriendCount`: 赠送好友数量（从埋点事件中统计VOUCHER_GIVE类型）
- `giveToFriendAmount`: 赠送好友金额合计（从埋点事件的amount字段汇总）
- `giveToFriendUseCount`: 赠送好友使用数量（从埋点事件中统计VOUCHER_USE类型）
- `giveToFriendUseAmount`: 赠送好友使用金额合计（从埋点事件的amount字段汇总）
- `giveToFriendUseAmountPercent`: 赠送好友使用金额占比（giveToFriendUseAmount / giveToFriendAmount * 100）
- `friendGiveCount`: 好友赠送数量（好友赠送给店铺用户的代金券数量，从life_discount_coupon_store_friend表统计，type=1代金券）
- `friendGiveAmount`: 好友赠送金额合计（好友赠送的代金券面值总和）
- `friendGiveUseCount`: 好友赠送使用数量（已使用的数量）
- `friendGiveUseAmount`: 好友赠送使用金额合计（已使用的代金券面值总和）
- `friendGiveUseAmountPercent`: 好友赠送使用金额占比（friendGiveUseAmount / friendGiveAmount * 100）

---

### 2.5 service_data（服务质量数据）

**字段说明**：存储服务质量相关的统计数据

**JSON格式**：
```json
{
  "storeScore": 4.5,              // 店铺评分（Double类型，0-5分）
  "scoreOne": 4.3,                // 评分1（Double类型，0-5分）
  "scoreTwo": 4.2,                // 评分2（Double类型，0-5分）
  "scoreThree": 4.4,              // 评分3（Double类型，0-5分）
  "ratingCount": 100,             // 评价数量（Long类型）
  "goodRatingCount": 60,          // 好评数量（score >= 4.5，Long类型）
  "midRatingCount": 30,           // 中评数量（3.0 <= score <= 4.0，Long类型）
  "badRatingCount": 10,           // 差评数量（0.5 <= score <= 2.5，Long类型）
  "badRatingPercent": 10.00,      // 差评占比（Double类型，单位：%）
  "appealCount": 5,               // 差评申诉次数（Long类型）
  "appealSuccessCount": 3,        // 差评申诉成功次数（Long类型）
  "appealSuccessPercent": 60.00   // 差评申诉成功占比（Double类型，单位：%）
}
```

**字段说明**：
- `storeScore`: 店铺评分（从common_rating表查询score字段，businessType=1，计算平均分）
- `scoreOne`: 评分1（从common_rating表的score_one字段，计算平均分）
- `scoreTwo`: 评分2（从common_rating表的score_two字段，计算平均分）
- `scoreThree`: 评分3（从common_rating表的score_three字段，计算平均分）
- `ratingCount`: 评价数量（common_rating表中该店铺的累计评价总数）
- `goodRatingCount`: 好评数量（score >= 4.5的评价数）
- `midRatingCount`: 中评数量（3.0 <= score <= 4.0的评价数）
- `badRatingCount`: 差评数量（0.5 <= score <= 2.5的评价数）
- `badRatingPercent`: 差评占比（badRatingCount / ratingCount * 100）
- `appealCount`: 差评申诉次数（从埋点事件中统计APPEAL类型）
- `appealSuccessCount`: 差评申诉成功次数（从store_comment_appeal表统计，appealStatus=2已同意）
- `appealSuccessPercent`: 差评申诉成功占比（appealSuccessCount / appealCount * 100）

**注意**：评价数据为累计数据，统计截止到统计日期的所有评价。

---

### 2.6 price_ranking_data（价目表排名数据）

**字段说明**：存储价目表排名相关的统计数据（数组格式）

**JSON格式**：
```json
[
  {
    "priceId": 1001,        // 价目表ID（Integer类型）
    "viewCount": 500,       // 浏览量（Integer类型）
    "visitorCount": 300,    // 访客数（Integer类型）
    "shareCount": 50        // 分享数（Integer类型）
  },
  {
    "priceId": 1002,
    "viewCount": 400,
    "visitorCount": 250,
    "shareCount": 40
  },
  {
    "priceId": 1003,
    "viewCount": 300,
    "visitorCount": 200,
    "shareCount": 30
  }
]
```

**字段说明**：
- 数组按`viewCount`（浏览量）降序排列
- 每个元素包含一个价目表的统计数据
- `priceId`: 价目表ID（targetId字段）
- `viewCount`: 浏览量（PRICE_VIEW事件数量）
- `visitorCount`: 访客数（去重后的用户ID数量）
- `shareCount`: 分享数（PRICE_SHARE事件数量）

---

## 三、数据保存说明

### 3.1 统计数据如何保存

统计数据通过定时任务自动计算并保存：

1. **日统计任务**：每天凌晨1点执行，计算前一天的统计数据（statType=DAILY）
2. **周统计任务**：每周一凌晨2点执行，计算上一周的统计数据（statType=WEEKLY）
3. **月统计任务**：每月1号凌晨3点执行，计算上一个月的统计数据（statType=MONTHLY）

**定时任务类**：`TrackStatisticsScheduler.java`

### 3.2 手动触发统计

如果需要手动触发统计数据计算，可以调用：

```java
trackEventService.calculateAndSaveStatistics(storeId, statDate, statType);
```

**参数说明**：
- `storeId`: 店铺ID
- `statDate`: 统计日期
- `statType`: 统计类型（DAILY/WEEKLY/MONTHLY）

### 3.3 数据更新策略

- 如果该店铺、该日期、该统计类型的记录已存在，则更新数据
- 如果不存在，则创建新记录
- 使用唯一索引 `uk_store_date_type` 保证唯一性

---

## 四、注意事项

1. **数据类型**：
   - Long类型字段在JSON中显示为数字（如：100）
   - BigDecimal类型字段在JSON中显示为数字（如：5000.00）
   - Double类型字段在JSON中显示为数字（如：4.5）
   - 数组类型字段在JSON中显示为数组（如：[]）

2. **空值处理**：
   - 如果某个分类没有数据，对应的字段可能为null或空对象
   - 建议在查询时进行null判断

3. **数据精度**：
   - 金额字段使用BigDecimal保证精度
   - 百分比字段保留2位小数
   - 评分字段保留1位小数

4. **性能优化**：
   - 统计数据已预计算并存储，查询时直接读取，无需实时计算
   - 建议定期清理历史统计数据，避免数据表过大
