埋点实现总结.md 5.7 KB

埋点系统实现总结

✅ 已完成的工作

1. 数据库表设计 ✅

  • store_track_event - 埋点事件表
  • store_track_statistics - 埋点统计表

⚠️ 注意:需要执行SQL建表语句,详见 埋点需求完整方案.md

2. 实体类 ✅

  • StoreTrackEvent.java - 埋点事件实体
  • StoreTrackStatistics.java - 统计数据实体

3. Mapper接口 ✅

  • StoreTrackEventMapper.java
  • StoreTrackStatisticsMapper.java

4. 注解 ✅

  • @TrackEvent - 埋点注解

5. AOP切面 ✅

  • TrackEventAspect.java - 自动埋点切面
    • 拦截标注了@TrackEvent的方法
    • 自动收集数据并写入Redis List

6. Service层 ✅

  • TrackEventService.java - 服务接口
  • TrackEventServiceImpl.java - 服务实现
    • 埋点数据保存(写入Redis List)
    • 批量保存到数据库
    • 经营数据统计查询
    • 数据对比
    • 价目表排名查询

7. 数据消费服务 ✅

  • TrackEventConsumer.java - 定时消费服务
    • 每10秒执行一次
    • 从Redis List批量取出数据
    • 批量写入数据库
    • 使用分布式锁防止重复消费

8. Controller层 ✅

  • TrackEventController.java - 埋点上报接口

    • POST /track/event - 前端主动上报埋点
  • BusinessDataController.java - 经营数据查询接口

    • GET /business/data - 查询经营数据
    • GET /business/data/compare - 数据对比
    • GET /business/data/history - 历史数据查询
  • AIRecoveryController.java - AI推荐接口

    • GET /business/ai/recommendation - 获取AI推荐

📋 待完成的工作

1. 执行数据库建表SQL ⚠️

需要执行以下SQL创建表结构:

  • store_track_event
  • store_track_statistics

详见:埋点需求完整方案.md 第 四、数据库表设计 章节

2. Service实现类的TODO ⚠️

TrackEventServiceImpl.java 中有以下TODO需要实现:

  1. 新增访客数统计 - getTrafficData() 方法

    • 需要查询历史数据判断是否为新增访客
  2. 互动数据统计 - getInteractionData() 方法

    • 好友数量、关注数量、粉丝数量
    • 发布动态数量、动态点赞/评论/转发数量
    • 被举报/拉黑次数
    • 这些数据需要从其他表查询
  3. 优惠券数据统计 - getCouponData() 方法

    • 需要从优惠券相关表查询数据
    • 实现赠送、使用等统计
  4. 代金券数据统计 - getVoucherData() 方法

    • 需要从代金券相关表查询数据
    • 实现赠送、使用等统计
  5. 服务质量数据统计 - getServiceData() 方法

    • 需要从评价表查询数据
    • 店铺评分、口味评分、环境评分、服务评分
    • 评价数量、好评/中评/差评统计
    • 差评申诉相关统计

3. AI推荐功能完善 ⚠️

AIRecoveryController.java 中:

  • 需要实现 callAIService() 方法
  • 根据实际的AI服务接口调用
  • 解析AI返回结果并生成推荐

🚀 使用指南

1. 在后端方法上使用注解埋点

@TrackEvent(
    eventType = "VIEW",
    eventCategory = "TRAFFIC",
    storeId = "#{#storeId}",
    targetType = "STORE"
)
@GetMapping("/store/detail")
public R<StoreInfo> getStoreDetail(@RequestParam Integer storeId) {
    // 业务逻辑
}

2. 前端上报埋点

// 上报浏览事件
axios.post('/track/event', {
  eventType: 'VIEW',
  eventCategory: 'TRAFFIC',
  storeId: 1001,
  targetType: 'STORE',
  duration: 3000
});

3. 查询经营数据

// 查询经营数据
axios.get('/business/data', {
  params: {
    storeId: 1001,
    startDate: '2026-01-08',
    endDate: '2026-01-14'
  }
});

// 对比数据
axios.get('/business/data/compare', {
  params: {
    storeId: 1001,
    startDate1: '2026-01-08',
    endDate1: '2026-01-14',
    startDate2: '2026-01-01',
    endDate2: '2026-01-07'
  }
});

4. 获取AI推荐

// 获取AI推荐
axios.get('/business/ai/recommendation', {
  params: {
    storeId: 1001
  }
});

📊 技术架构

前端上报埋点
    ↓
TrackEventController (POST /track/event)
    ↓
TrackEventService.saveTrackEvent()
    ↓
Redis List (异步队列)
    ↓
TrackEventConsumer (定时任务,每10秒)
    ↓
TrackEventService.batchSaveTrackEvents()
    ↓
MySQL (store_track_event 表)
    ↓
统计查询 (BusinessDataController)
    ↓
返回前端

🔧 配置说明

1. 定时任务已启用

应用已配置 @EnableScheduling,定时任务会自动执行。

2. Redis配置

确保Redis连接正常,Redis List Key为:track:event:queue

3. 消费频率

当前配置为每10秒消费一次,可在 TrackEventConsumer.java 中修改 @Scheduled 注解。

⚠️ 注意事项

  1. 数据量控制:Redis List需要设置最大长度,防止内存溢出
  2. 异常处理:消费服务已实现异常处理,失败不影响主流程
  3. 性能优化:统计数据建议使用定时任务预计算,存入 store_track_statistics
  4. 数据清理:定期清理历史埋点数据,避免数据表过大
  5. AI推荐缓存:AI推荐结果建议缓存,避免频繁调用AI服务

📝 后续优化建议

  1. 统计数据预计算:使用定时任务(如每天凌晨)计算前一天的统计数据
  2. 缓存优化:对常用查询结果进行缓存
  3. 监控告警:监控Redis List长度,设置告警阈值
  4. 数据分表:如果数据量很大,可以考虑按时间分表

📚 相关文档

  • 埋点需求完整方案.md - 完整方案文档
  • 埋点实现代码清单.md - 代码清单和关键代码示例

实现完成时间:2026-01-14 下一步:执行建表SQL,完善Service中的TODO,测试联调