279 lines
8.1 KiB
Markdown
279 lines
8.1 KiB
Markdown
|
|
# 企业微信表格数据自动抓取与统计系统
|
|||
|
|
|
|||
|
|
## 📋 系统概述
|
|||
|
|
|
|||
|
|
本系统实现了从企业微信自动抓取指定表格数据,进行数据解析、去重、统计分析的完整流程。
|
|||
|
|
|
|||
|
|
## 🔄 完整流程图
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|||
|
|
│ 企业微信表格数据处理流程 │
|
|||
|
|
└─────────────────────────────────────────────────────────────────┘
|
|||
|
|
|
|||
|
|
1. 【获取访问令牌】
|
|||
|
|
├─ 使用 corpId + appSecret
|
|||
|
|
├─ 调用企业微信 API 获取 access_token
|
|||
|
|
└─ 缓存 token(有效期 7200 秒)
|
|||
|
|
|
|||
|
|
2. 【抓取表格数据】
|
|||
|
|
├─ 使用 access_token + docId + sheetId + range
|
|||
|
|
├─ 调用企业微信文档 API
|
|||
|
|
└─ 获取表格原始数据(JSON 格式)
|
|||
|
|
|
|||
|
|
3. 【数据转换】
|
|||
|
|
├─ 解析 JSON 数据结构
|
|||
|
|
├─ 映射到 CustomerData 实体
|
|||
|
|
└─ 处理日期、文本等字段
|
|||
|
|
|
|||
|
|
4. 【数据去重】
|
|||
|
|
├─ 计算数据哈希值(MD5)
|
|||
|
|
├─ 基于日期的智能去重
|
|||
|
|
│ ├─ 当天数据:检查缓存,跳过已处理
|
|||
|
|
│ └─ 非当天数据:直接处理
|
|||
|
|
└─ 记录处理状态到数据库
|
|||
|
|
|
|||
|
|
5. 【数据统计】
|
|||
|
|
├─ 按标签组统计数量
|
|||
|
|
├─ 按日期统计趋势
|
|||
|
|
└─ 生成统计报表
|
|||
|
|
|
|||
|
|
6. 【数据存储】
|
|||
|
|
├─ 保存客户数据到数据库
|
|||
|
|
├─ 保存统计结果
|
|||
|
|
└─ 清理过期缓存
|
|||
|
|
|
|||
|
|
7. 【定时任务】
|
|||
|
|
└─ 每小时自动执行一次(可配置)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🎯 核心功能模块
|
|||
|
|
|
|||
|
|
### 1. 企业微信 API 集成
|
|||
|
|
- **文件**: `WecomApiUtils.java`
|
|||
|
|
- **功能**:
|
|||
|
|
- 获取并缓存 access_token
|
|||
|
|
- 调用企业微信文档 API 获取表格数据
|
|||
|
|
- 自动处理 token 过期和刷新
|
|||
|
|
|
|||
|
|
### 2. 数据抓取服务
|
|||
|
|
- **文件**: `WecomTableService.java`
|
|||
|
|
- **功能**:
|
|||
|
|
- 从企业微信抓取表格数据
|
|||
|
|
- 数据格式转换(JSON → CustomerData)
|
|||
|
|
- 智能去重处理
|
|||
|
|
- 批量保存数据
|
|||
|
|
|
|||
|
|
### 3. 数据去重服务
|
|||
|
|
- **文件**: `ProcessedDataService.java`
|
|||
|
|
- **功能**:
|
|||
|
|
- 基于日期的去重策略
|
|||
|
|
- 数据哈希计算
|
|||
|
|
- 缓存管理(内存 + 数据库)
|
|||
|
|
- 自动清理过期数据
|
|||
|
|
|
|||
|
|
### 4. 数据统计服务
|
|||
|
|
- **文件**: `CustomerDataService.java`
|
|||
|
|
- **功能**:
|
|||
|
|
- Excel 文件解析
|
|||
|
|
- 标签统计分析
|
|||
|
|
- 统计结果持久化
|
|||
|
|
|
|||
|
|
### 5. 定时任务
|
|||
|
|
- **文件**: `WecomTableSyncTask.java`
|
|||
|
|
- **功能**:
|
|||
|
|
- 定时自动抓取(默认每小时)
|
|||
|
|
- 异常处理和日志记录
|
|||
|
|
|
|||
|
|
### 6. REST API 接口
|
|||
|
|
- **文件**: `WecomTableController.java`
|
|||
|
|
- **接口**:
|
|||
|
|
- `POST /wecom/table/sync` - 手动触发同步
|
|||
|
|
- `GET /wecom/table/status` - 查询服务状态
|
|||
|
|
|
|||
|
|
## 📦 数据实体
|
|||
|
|
|
|||
|
|
### CustomerData(客户数据)
|
|||
|
|
包含 31 个字段:
|
|||
|
|
- 基本信息:客户名称、描述、手机、邮箱、企业、地址、职务、电话
|
|||
|
|
- 添加信息:添加人、添加人账号、添加人部门、添加时间
|
|||
|
|
- 来源信息:来源
|
|||
|
|
- 标签信息:18 个标签组(投放、公司孵化、商务、成交日期等)
|
|||
|
|
|
|||
|
|
## 🔧 必需的外部参数
|
|||
|
|
|
|||
|
|
### 1. 企业微信配置参数(必填)
|
|||
|
|
|
|||
|
|
在 `application.yml` 中配置:
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
wecom:
|
|||
|
|
# 企业 ID(必填)
|
|||
|
|
corp-id: "your_corp_id"
|
|||
|
|
|
|||
|
|
# 应用密钥(必填)
|
|||
|
|
app-secret: "your_app_secret"
|
|||
|
|
|
|||
|
|
# 文档 ID(必填)
|
|||
|
|
doc-id: "your_doc_id"
|
|||
|
|
|
|||
|
|
# 工作表 ID(必填)
|
|||
|
|
sheet-id: "your_sheet_id"
|
|||
|
|
|
|||
|
|
# 查询范围(必填,A1 表示法)
|
|||
|
|
range: "A1:AE1000"
|
|||
|
|
|
|||
|
|
# 抓取间隔(可选,默认 60 分钟)
|
|||
|
|
fetch-interval: 60
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 参数获取方法
|
|||
|
|
|
|||
|
|
#### 2.1 获取 corp-id(企业 ID)
|
|||
|
|
1. 登录企业微信管理后台:https://work.weixin.qq.com/
|
|||
|
|
2. 进入「我的企业」→「企业信息」
|
|||
|
|
3. 复制「企业 ID」
|
|||
|
|
|
|||
|
|
#### 2.2 获取 app-secret(应用密钥)
|
|||
|
|
1. 登录企业微信管理后台
|
|||
|
|
2. 进入「应用管理」→ 选择或创建一个应用
|
|||
|
|
3. 在应用详情页面找到「Secret」
|
|||
|
|
4. 复制应用的 Secret
|
|||
|
|
|
|||
|
|
**注意**: 需要给应用授予「企业微信文档」的权限
|
|||
|
|
|
|||
|
|
#### 2.3 获取 doc-id(文档 ID)
|
|||
|
|
1. 在企业微信中打开目标表格文档
|
|||
|
|
2. 查看浏览器地址栏的 URL
|
|||
|
|
3. URL 格式:`https://doc.weixin.qq.com/sheet/xxxxx`
|
|||
|
|
4. `xxxxx` 部分就是 doc-id
|
|||
|
|
|
|||
|
|
#### 2.4 获取 sheet-id(工作表 ID)
|
|||
|
|
方法一:通过 API 查询
|
|||
|
|
- 调用企业微信文档 API 获取文档的所有工作表列表
|
|||
|
|
- 从返回结果中找到目标工作表的 ID
|
|||
|
|
|
|||
|
|
方法二:通过开发者工具
|
|||
|
|
- 打开企业微信文档
|
|||
|
|
- 按 F12 打开开发者工具
|
|||
|
|
- 切换工作表时查看网络请求
|
|||
|
|
- 找到包含 sheet_id 的请求参数
|
|||
|
|
|
|||
|
|
#### 2.5 设置 range(查询范围)
|
|||
|
|
- 使用 A1 表示法,例如:
|
|||
|
|
- `A1:Z100` - 查询 A 到 Z 列,前 100 行
|
|||
|
|
- `A1:AE1000` - 查询 A 到 AE 列,前 1000 行
|
|||
|
|
- `A:Z` - 查询 A 到 Z 列的所有行
|
|||
|
|
|
|||
|
|
### 3. 数据库配置(必填)
|
|||
|
|
|
|||
|
|
需要在主项目的 `application.yml` 中配置数据库连接:
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
spring:
|
|||
|
|
datasource:
|
|||
|
|
url: jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
|
|||
|
|
username: your_username
|
|||
|
|
password: your_password
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4. 数据库表结构(需要创建)
|
|||
|
|
|
|||
|
|
需要创建以下表:
|
|||
|
|
- `customer_data` - 存储客户数据
|
|||
|
|
- `processed_data_record` - 存储已处理数据记录(用于去重)
|
|||
|
|
- `customer_tag_statistics` - 存储标签统计数据
|
|||
|
|
|
|||
|
|
## 🚀 使用方式
|
|||
|
|
|
|||
|
|
### 方式一:自动定时任务
|
|||
|
|
系统启动后,定时任务会自动执行(默认每小时整点)
|
|||
|
|
|
|||
|
|
### 方式二:手动触发
|
|||
|
|
调用 REST API:
|
|||
|
|
```bash
|
|||
|
|
curl -X POST http://localhost:8080/wecom/table/sync
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 方式三:查看服务状态
|
|||
|
|
```bash
|
|||
|
|
curl -X GET http://localhost:8080/wecom/table/status
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📊 数据处理逻辑
|
|||
|
|
|
|||
|
|
### 去重策略
|
|||
|
|
1. **当天数据去重**:
|
|||
|
|
- 使用「客户名称 + 添加人账号」作为唯一键
|
|||
|
|
- 计算数据的 MD5 哈希值
|
|||
|
|
- 如果键和哈希值都相同,则跳过
|
|||
|
|
|
|||
|
|
2. **历史数据处理**:
|
|||
|
|
- 非当天的数据直接处理,不进行去重检查
|
|||
|
|
- 适用于补录历史数据的场景
|
|||
|
|
|
|||
|
|
### 缓存管理
|
|||
|
|
- 内存缓存:存储当天已处理的数据
|
|||
|
|
- 数据库持久化:记录所有处理历史
|
|||
|
|
- 自动清理:每次处理后清理非当天的缓存
|
|||
|
|
|
|||
|
|
## 📝 日志说明
|
|||
|
|
|
|||
|
|
系统会记录详细的日志信息:
|
|||
|
|
- 数据抓取日志:记录抓取的数据量
|
|||
|
|
- 去重日志:记录新数据、跳过数据、无效数据的数量
|
|||
|
|
- 错误日志:记录所有异常信息
|
|||
|
|
|
|||
|
|
## ⚠️ 注意事项
|
|||
|
|
|
|||
|
|
1. **权限要求**:
|
|||
|
|
- 企业微信应用需要有「企业微信文档」的 API 权限
|
|||
|
|
- 应用需要能访问目标文档
|
|||
|
|
|
|||
|
|
2. **API 限制**:
|
|||
|
|
- 企业微信 API 有调用频率限制
|
|||
|
|
- access_token 有效期为 7200 秒(2 小时)
|
|||
|
|
|
|||
|
|
3. **数据量限制**:
|
|||
|
|
- 单次查询的数据量不宜过大
|
|||
|
|
- 建议 range 设置在 1000 行以内
|
|||
|
|
|
|||
|
|
4. **表格格式要求**:
|
|||
|
|
- 第一行必须是表头
|
|||
|
|
- 列的顺序必须与 CustomerData 实体的字段映射一致
|
|||
|
|
|
|||
|
|
## 🔍 故障排查
|
|||
|
|
|
|||
|
|
### 问题 1:获取 access_token 失败
|
|||
|
|
- 检查 corp-id 和 app-secret 是否正确
|
|||
|
|
- 检查应用是否有相应权限
|
|||
|
|
- 检查网络连接是否正常
|
|||
|
|
|
|||
|
|
### 问题 2:获取表格数据失败
|
|||
|
|
- 检查 doc-id 和 sheet-id 是否正确
|
|||
|
|
- 检查应用是否有文档访问权限
|
|||
|
|
- 检查 range 范围是否合法
|
|||
|
|
|
|||
|
|
### 问题 3:数据解析失败
|
|||
|
|
- 检查表格列的顺序是否与代码映射一致
|
|||
|
|
- 检查日期格式是否为 yyyy-MM-dd
|
|||
|
|
- 查看详细的错误日志
|
|||
|
|
|
|||
|
|
## 📚 相关文档
|
|||
|
|
|
|||
|
|
- [企业微信 API 文档](https://developer.work.weixin.qq.com/document/)
|
|||
|
|
- [企业微信文档 API](https://developer.work.weixin.qq.com/document/path/97459)
|
|||
|
|
- [EasyExcel 文档](https://easyexcel.opensource.alibaba.com/)
|
|||
|
|
|
|||
|
|
## 🎉 总结
|
|||
|
|
|
|||
|
|
本系统提供了一个完整的企业微信表格数据自动化处理方案,包括:
|
|||
|
|
- ✅ 自动抓取企业微信表格数据
|
|||
|
|
- ✅ 智能去重(基于日期和数据哈希)
|
|||
|
|
- ✅ 数据统计分析
|
|||
|
|
- ✅ 定时任务自动执行
|
|||
|
|
- ✅ REST API 手动触发
|
|||
|
|
- ✅ 完整的日志记录
|
|||
|
|
|
|||
|
|
只需配置好企业微信的相关参数,系统即可自动运行!
|