从"跑腿帮办"到"一句话搞定":AI Agent 自动化 OA 流程实战
作者:金融马 日期:2025年5月27日 标签:AI Agent · 自动化 · 泛微OA · 钉钉
---
一、痛点
每次发起 OA 流程,都要:
1. 打开 OA 系统 2. 登录账号 3. 找到对应的流程模板 4. 填写一堆表单字段 5. 上传附件(表格、扫描件、压缩包...) 6. 提交后时不时点进去看审批到哪了 7. 等审批完了还要手动归档
一套流程下来,10 分钟起步,如果是出差报销、项目付款这种高频流程,每天要跑好几遍。
更烦的是:人在外面、只能用手机的时候,根本没法操作 OA。
---
二、解决思路
能不能像发微信一样,发条消息就把流程搞定了?
用户(钉钉):发一个付款申请,附件发你了
Agent:收到!请发送附件
用户:[发送 Excel 文件]
Agent:✓ 附件已上传泛微
✓ 流程已发起:付款申请 #WF20250627001
✓ 当前节点:部门主管审批中
...
● 流程已通过,附件已归档
核心理念:人只做决策,机器执行流程。
---
三、技术方案
3.1 整体架构
┌──────────────────────────────────────────────────────────────┐
│ 钉钉 │
│ 用户 ──消息/文件──▶ 钉钉 Server ──Stream──▶ │
└──────────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────┐
│ Hermes Agent │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌─────────┐│
│ │ 钉钉客户端 │ │ 意图解析器 │ │ 泛微客户端 │ │状态监控器││
│ │ │ │ │ │ │ │ ││
│ │ • 消息接收│ │ • 指令识别│ │ • 登录 │ │• 轮询状态││
│ │ • 文件下载│ │ • 流程匹配│ │ • 发起流程│ │• 超时告警││
│ │ • 结果推送│ │ • 字段提取│ │ • 上传附件│ │• 钉钉回报││
│ └──────────┘ └──────────┘ └──────────┘ └─────────┘│
│ │
│ 本地存储 │
│ /tmp/oa-flows/{id}/ │
└──────────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────┐
│ 泛微 OA │
│ POST /api/login → POST /api/createRequest │
│ POST /api/upload → GET /api/getRequestInfo │
└──────────────────────────────────────────────────────────────┘
3.2 技术选型
| 组件 | 选型 | 说明 |
|---|---|---|
| 运行环境 | Python 3.10+ | 主力开发语言 |
| 钉钉接入 | dingtalk-stream-sdk | Stream 模式实时接收,支持文件消息 |
| OA 接入 | requests + 泛微 REST API | HTTP 直连,无需浏览器 |
| 文件存储 | 本地 /tmp/oa-flows/ | 按 request_id 分目录,流程结束后清理 |
| 配置 | config.yaml + 环境变量 | 敏感信息不写死在代码里 |
| 日志 | loguru | 结构化日志,支持文件 + 钉钉双输出 |
3.3 核心模块
钉钉客户端(dingtalk_client.py)
负责与钉钉的实时通信:
class DingTalkClient:
def start(self, on_message_callback):
"""启动 Stream 长连接,收到消息触发回调"""
...
def download_file(self, file_key: str) -> Path:
"""下载钉钉文件到本地临时目录"""
...
def send_message(self, user_id: str, content: str):
"""推送结果消息给用户"""
...
关键能力:
- Stream 模式:长连接实时收消息,不丢消息
- 支持文本、图片、压缩包等各类文件
- 自动重连,断线不怕
泛微客户端(weaver_client.py)
封装泛微 OA 的 REST API:
class WeaverClient:
def login(self) -> bool:
"""登录泛微,维护 cookie session"""
...
def create_request(self, workflow_id: str, fields: dict, attachments: list) -> str:
"""发起流程,返回 request_id"""
...
def upload_attachment(self, file_path: Path, request_id: str) -> str:
"""上传附件,返回附件 ID"""
...
def get_request_status(self, request_id: str) -> dict:
"""查询流程当前状态"""
...
def get_workflow_progress(self, request_id: str) -> list:
"""获取各审批节点进度"""
...
关键能力:
- Cookie 持久化,不用每次都登录
- 支持批量上传附件(表格、图片、ZIP 都能传)
- 统一的错误处理和重试机制
流程引擎(flow_engine.py)
编排完整执行链路:
用户发消息
│
▼
意图解析 ──缺字段──▶ 追问用户
│
▼
下载钉钉文件
│
▼
泛微登录
│
▼
上传附件
│
▼
发起流程 → 返回 request_id
│
▼
轮询监控 ◄─────────────┐
│ │
┌──┴──┐ │
│结束?│ │
└──┬──┘ │
│ 否 │
▼ │
回报结果 等待 30 秒 ─────┘
状态监控器(monitor.py)
class FlowStatus(Enum):
PENDING = "待提交"
RUNNING = "审批中"
APPROVED = "已通过"
REJECTED = "已驳回"
TERMINATED = "已终止"
监控策略:
- 每 30 秒轮询一次状态
- 超时(默认 1 小时)自动告警
- 每 5 分钟推送一次进度到钉钉
四、应用场景
场景 1:付款申请
用户:发一个付款申请,金额10万
Agent:请发送附件(合同/发票/清单等)
用户:[发送 PDF 合同]
Agent:收到!
✓ 流程已发起:付款申请
✓ 流程编号:WF20250627001
✓ 附件已上传
正在监控...
○ 部门主管审批(待处理)
○ 财务审批(待处理)
● 流程已通过
完成!
场景 2:差旅报销
用户:报销差旅,李四,5000元
Agent:请发送发票照片或电子发票
用户:[发送 ZIP 包,内含多张发票]
Agent:收到 5 张发票,正在上传...
✓ 流程已发起:差旅报销
✓ 金额:5000 元
...
场景 3:查询进度
用户:查一下 WF20250627001
Agent:流程编号:WF20250627001
类型:付款申请
状态:审批中
当前节点:财务审批 - 张三
已用时:2小时15分
预计:今日内完成
---
五、效果对比
| 操作 | 传统方式 | AI Agent |
|---|---|---|
| 操作入口 | 打开 OA 网页/APP | 钉钉发消息 |
| 附件上传 | 手动选择文件 | 直接发文件 |
| 填写表单 | 逐项填写 | 说一句话,AI 提取 |
| 查看进度 | 反复登录 OA | 自动推送 |
| 操作耗时 | 10-15 分钟 | < 1 分钟 |
| 移动场景 | 不方便 | 手机一句话搞定 |
六、技术亮点
1. 钉钉 Stream 模式
相比轮询拉取消息,Stream 模式是服务端推送,优势:
- 实时性:消息秒到
- 低延迟:不用频繁调接口查新消息
- 省资源:长连接,不用每次都建立 HTTP
2. 意图解析 + 字段提取
不用让用户填写标准的表单字段,直接说人话:
- "发个付款申请,10万" → 自动识别流程类型、金额
- 缺少必填字段时,AI 会主动追问
3. 全链路自动化
发起 → 上传 → 监控 → 推送,一条龙。 用户只需要发一条消息,躺平等结果就行。
---
七、后续规划
| 阶段 | 内容 |
|---|---|
| Phase 1 | 跑通泛微核心 API(登录、发起、上传、查询) |
| Phase 2 | 接入钉钉 Stream,消息和文件收发 |
| Phase 3 | 完善意图解析,支持更多流程类型 |
| Phase 4 | 增加多级审批、超时告警、统计报表 |
| Phase 5 | 支持审批节点自动处理(充当审批人角色) |
八、总结
技术只是手段,解决问题才是目的。
这套方案把原本分散在 OA 系统、手机、邮件里的流程,统一收口到钉钉这一个入口。
人从"操作者"变成"决策者",真正实现了动动嘴就能办事。
---
你也有类似的自动化需求?想了解具体实现细节?欢迎交流。