Files
wecom_it_smart_desk/docs/03-技术架构/02-技术方案/02-技术方案-企微审批工单同步.md
T

200 lines
6.2 KiB
Markdown
Raw Normal View History

# 技术方案-企微审批工单同步
> **文档编号**: 02-技术方案-企微审批工单同步
> **版本**: v1.1
> **创建日期**: 2026-07-04
> **状态**: 待评审
---
## 1. 需求概述
### 1.1 背景
将企微审批工单同步到坐席待办事项,实现IT服务台与企微审批系统的集成。
### 1.2 需求描述
| 需求项 | 说明 |
|--------|------|
| 需求来源 | PRD v0.7.2 Backlog #74 |
| 需求类型 | P1(待办事项集成) |
| 目标 | 将企微审批工单同步到坐席待办事项 |
---
## 2. 技术方案
### 2.1 整体架构
```
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 企微审批系统 │ ───▶ │ IT服务台后端 │ ───▶ │ 坐席待办事项 │
│ (外部API) │ │ (同步服务) │ │ (todo_items) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
▼ ▼ ▼
审批工单数据 定时轮询/回调 待办面板展示
(get_approval_list) 转换+存储
```
### 2.2 数据同步方式
| 方式 | 说明 | 优点 | 缺点 |
|------|------|------|------|
| **定时轮询** | 每5分钟调用企微API拉取审批列表 | 实现简单,稳定可靠 | 有延迟(最大5分钟) |
| **企微回调** | 审批通过时企微主动推送 | 实时性高 | 需要企微开通回调权限 |
| **混合模式** | 回调为主 + 定时兜底 | 实时+兜底 | 实现复杂 |
**推荐方案**:定时轮询(简单可靠) + 回调模式(实时性)
### 2.3 企微API接口
使用企微 OA 审批接口:
| 接口 | 说明 |
|------|------|
| `GET /cgi-bin/oa/approvallist` | 获取审批列表 |
| `GET /cgi-bin/oa/approvalinfo` | 获取审批详情 |
### 2.4 数据映射
| 企微审批字段 | todo_item 字段 | 说明 |
|-------------|----------------|------|
| `sp_no` | `id` | 审批单号 |
| `sp_name` | `title` | 审批名称 |
| `apply_name` | `description.applicant` | 申请人 |
| `apply_time` | `created_at` | 申请时间 |
| `status` | `status` | 审批状态 |
| `sp_status` | `priority` | 审批类型 |
### 2.5 待办事项字段扩展
```python
class TodoItem(Base):
# 现有字段...
type: Mapped[str] = "approval" # 固定为 approval
# 新增字段(审批专用)
approval_id: Mapped[str] = mapped_column(String(64)) # 企微审批单ID
approval_type: Mapped[str] = mapped_column(String(64)) # 审批模板名称
applicant: Mapped[str] = mapped_column(String(100)) # 申请人
applicant_dept: Mapped[str] = mapped_column(String(100)) # 申请人部门
apply_time: Mapped[datetime] # 申请时间
approval_url: Mapped[str] = mapped_column(String(512)) # 审批详情链接
```
---
## 3. 审批模板(IT相关)
根据需求,明确需要同步的审批模板:
| 序号 | 审批模板名称 | 说明 |
|------|-------------|------|
| 1 | IT资产升级申请 | 硬件升级审批 |
| 2 | IT资产报废申请 | 资产报废审批 |
| 3 | 商业软件服务申请 | 软件采购审批 |
| 4 | 企微外联权限申请 | 外网权限审批 |
| 5 | 离职人员企微微盘&文档空间异常移交 | 离职资产移交 |
| 6 | 会议室故障报修 | 设备报修审批 |
---
## 4. 企微API权限确认
### 4.1 如何确认是否已开通权限
**方法一:企微管理后台查看**
1. 登录企微管理后台:https://work.weixin.qq.com/
2. 进入「应用管理」→「自建应用」→ 选择IT服务台应用
3. 查看「API权限」中是否包含:
- 通讯录同步
- 审批相关接口
**方法二:调用接口测试**
使用已有 access_token 调用以下接口测试:
```bash
curl "https://qyapi.weixin.qq.com/cgi-bin/oa/approvallist?access_token=xxx&start_time=0&end_time=9999999999"
```
如果返回 `{"errcode":0, ...}` 表示已开通权限。
**方法三:联系企微管理员**
确认是否在「审批」应用中开通了API调用权限。
### 4.2 回调模式说明
| 对比项 | 定时轮询 | 企微回调 |
|--------|----------|----------|
| 实时性 | 5分钟延迟 | 秒级实时 |
| 实现复杂度 | 简单 | 稍复杂 |
| 可靠性 | 稳定 | 依赖回调通道 |
| 资源消耗 | 每次全量/增量拉取 | 按需推送 |
**回调模式优势**
1. 实时性高 - 审批提交/通过后立即同步
2. 节省资源 - 只需处理变更,无需轮询
3. 体验更好 - 坐席几乎实时看到新待办
**回调模式限制**
1. 需要企微开通审批回调权限
2. 回调地址需公网可访问(可通过nginx反向代理)
3. 需要处理回调签名验证
---
## 5. 实施计划
### 5.1 任务拆分
| 任务 | 说明 | 优先级 |
|------|------|--------|
| T1 | 扩展 todo_item 模型,新增审批专用字段 | P0 |
| T2 | 创建企微审批同步服务 `ApprovalSyncService` | P0 |
| T3 | 实现定时轮询逻辑(每5分钟) | P0 |
| T4 | 坐席端待办面板接入审批数据 | P1 |
| T5 | 审批状态变更同步 | P1 |
| T6 | 企微审批回调接入(可选) | P2 |
### 5.2 数据库变更
```sql
ALTER TABLE todo_items
ADD COLUMN approval_id VARCHAR(64),
ADD COLUMN approval_type VARCHAR(64),
ADD COLUMN applicant VARCHAR(100),
ADD COLUMN applicant_dept VARCHAR(100),
ADD COLUMN apply_time TIMESTAMP,
ADD COLUMN approval_url VARCHAR(512);
```
---
## 6. 待确认事项
| 事项 | 状态 | 备注 |
|------|------|------|
| 企微API权限 | 待确认 | 需按4.1方法确认 |
| 审批模板 | ✅ 已明确 | 6个IT相关模板 |
| 同步频率 | ✅ 已确认 | 5分钟可接受 |
| 回调模式 | ✅ 确认开通 | 实时性优先 |
---
## 7. 相关文档
| 文档 | 说明 |
|------|------|
| [PRD v0.7.2 Backlog](./02-产品需求/product-产品/v0.7.2-backlog-candidate-2026-06-24.md) | 需求来源 |
| [todo_item 模型](../../backend/app/models/todo_item.py) | 现有模型定义 |
| [企微API文档](https://developer.work.weixin.qq.com/document/14567) | 审批接口文档 |
---
> **文档状态**: 待评审