wecom-approval

n8n 节点:批量导出企业微信审批流数据。支持按日期范围查询审批单号、批量获取审批详情、多条件过滤、自动分页与容错。

Package Information

Released: 1 mo ago
Downloads: 0 weekly / 0 monthly
Latest Version: 1.0.1
Author: libin0019

Documentation

n8n-nodes-wecom-approval

一个 N8N 1.x 社区节点插件,用于批量导出企业微信「审批」应用的审批流数据。

基于企业微信官方 OA 审批接口实现,核心链路为:

  1. GET /cgi-bin/gettoken — 获取 access_token(进程级缓存)
  2. POST /cgi-bin/oa/getapprovalinfo — 按日期范围批量获取审批单号(自动分页)
  3. POST /cgi-bin/oa/getapprovaldetail — 按审批单号获取审批详情

功能特性

  • ✅ 完成日期 + 通过状态过滤:按审批「通过时间」范围(完成日期)过滤已通过单据;因企业微信仅支持按提交时间拉取,插件采用「回溯拉取 + 客户端按通过时间精确过滤」
  • ✅ 多条件过滤:审批状态(默认「已通过」)、审批模板、申请人、部门、审批类型
  • ✅ 直接查单:支持按审批单号(可多个,逗号分隔)跳过批量查询直接取详情
  • ✅ 自动分页:基于 new_cursor / new_next_cursor 游标分页,pageSize 上限 100
  • ✅ 容错与限流:access_token 缓存与过期自动刷新、接口限流(45009/45033)指数退避重试、网络错误重试、业务错误码解析
  • ✅ 结构化输出:字段命名清晰、层级合理,并额外附加 _text 可读时间与扁平化内容明细,兼容 N8N 数据流转

目录结构

n8n-nodes-wecom-approval/
├── package.json                        # n8n 注册块(nodes/credentials 入口)
├── tsconfig.json
├── credentials/
│   └── WeComApprovalApi.credentials.ts # 企业微信凭证(corpid / secret / agentid)
├── nodes/
│   └── WeComApproval/
│       ├── WeComApproval.node.ts       # 节点实现
│       ├── WeComApproval.node.json     # codex 元数据
│       └── wecomapproval.svg           # 节点图标
├── scripts/
│   └── copy-assets.js                  # 构建后复制图标等静态资源
└── README.md

安装

1. 开发 / 本地安装

cd n8n-nodes-wecom-approval
npm install
npm run build          # 输出到 dist/

# 将包链接到 n8n 的自定义节点目录(目录不存在则先创建)
mkdir -p ~/.n8n/custom
cd ~/.n8n/custom
npm link n8n-nodes-wecom-approval

然后启动 n8n(n8n start),在节点面板搜索「企业微信审批导出」即可。

2. 通过 n8n 社区节点安装(发布到 npm 后)

在 n8n 的 Settings → Community Nodes 中安装包名 n8n-nodes-wecom-approval。

凭证配置

新建「企业微信审批 API」凭证,填写:

字段 必填 说明
企业 ID(corpid) ✅ 「管理后台 - 我的企业 - 企业信息」中的企业 ID
应用密钥(secret) ✅ 审批应用或已授权自建应用的 secret
AgentID ⬜ 可选,审批查询主要用 corpid + secret

权限前置条件(重要)

调用审批接口前,需要在企业微信管理后台完成以下授权:

  1. 管理后台 → 应用管理 → 审批 → API → 可调用应用:将自建应用加入列表
  2. 管理后台 → 应用管理 → 审批 → API → 审批数据权限:授权应用允许查询审批单据
  3. 自建应用只能获取「应用可见范围内」成员提交的审批单

自 2023-12-01 起,不再支持使用系统应用 secret 调用审批接口,请使用审批应用或已授权的自建应用 secret。

节点参数

参数 类型 必填 默认值 说明
完成日期-开始 dateTime ✅ — 审批通过时间范围起点(通过时间 ≥ 此时间)
完成日期-结束 dateTime ✅ — 审批通过时间范围终点(须晚于起点)
拉取回溯天数 number ⬜ 90 从完成日期起点向前回溯 N 天拉取提交记录,覆盖审批周期较长的单据
审批状态 options ⬜ 已通过(2) 1 审批中 / 2 已通过 / 3 已驳回 / 4 已撤销 / 6 通过后撤销 / 7 已删除 / 10 已支付 / 不限
审批模板 ID string ⬜ 空 filters.template_id
申请人 userid string ⬜ 空 filters.creator
部门 ID string ⬜ 空 filters.department
审批类型 options ⬜ 不限 请假/补卡/出差/外出/加班/调班/会议室/退款/红包报销
直接查询审批单号 string ⬜ 空 填写后跳过日期范围查询,逗号分隔多个
获取审批详情 boolean ⬜ true 关闭仅返回单号列表
每页数量 number ⬜ 100 企业微信上限 100
最大分页数 number ⬜ 0 安全阀,0 为不限制
输出模式 options ⬜ splitItems 每条一个 Item / 合并单个 Item
输出可读时间 boolean ⬜ true 附加 *_text 北京时间字段

输出 JSON 结构

输出模式:每条记录一个 Item(默认)

每条审批记录对应一个 item,json 结构如下:

{
  "sp_no": "202409010001",
  "sp_name": "请假申请",
  "template_id": "ZLqk8pcsAoaXZ1eY56vpAgfX28MPdYU3ayMaSPHaaa",
  "sp_status": 2,
  "sp_status_text": "已通过",
  "record_type": "1",
  "record_type_text": "请假",
  "apply_userid": "zhangsan",
  "apply_partyid": 1,
  "apply_time": 1725156000,
  "apply_time_text": "2024-09-01 10:00:00",
  "approve_time": 1725160000,
  "approve_time_text": "2024-09-01 11:06:40",
  "approver_userids": ["lisi"],
  "content": [
    {
      "control": "Text",
      "id": "Text-15111111111",
      "title": "请假事由",
      "value": { "text": "家中有事" },
      "value_text": "家中有事"
    },
    {
      "control": "DateRange",
      "id": "DateRange-15111111112",
      "title": "请假时间",
      "value": {
        "date_range": {
          "type": "day",
          "new_begin": 1725156000,
          "new_end": 1725242400,
          "new_duration": 86400
        }
      },
      "value_text": "2024-09-01 10:00:00 ~ 2024-09-02 10:00:00"
    }
  ],
  "approval_steps": [
    {
      "sp_status": 2,
      "sp_status_text": "已通过",
      "approverattr": 1,
      "approverattr_text": "或签",
      "details": [
        {
          "userid": "lisi",
          "speech": "同意",
          "sp_status": 2,
          "sp_status_text": "已通过",
          "sptime": 1725160000,
          "sptime_text": "2024-09-01 11:06:40",
          "media_id": []
        }
      ]
    }
  ],
  "notifyer": [],
  "comments": [],
  "apply_data": {
    "contents": [
      {
        "control": "Text",
        "id": "Text-15111111111",
        "value": { "text": "家中有事" }
      }
    ]
  }
}

输出模式:合并为单个 Item

{
  "summary": {
    "total": 128,
    "generated_at": "2024-09-01T12:00:00.000Z"
  },
  "records": [
    { "sp_no": "202409010001", "sp_name": "请假申请", "...": "..." }
  ]
}

字段说明

字段 类型 说明
sp_no string 审批单号
sp_name string 审批模板名称
template_id string 审批模板 ID
sp_status / sp_status_text number / string 审批状态(数值 / 中文)
record_type / record_type_text string / string 审批类型(数值 / 中文)
apply_userid / apply_partyid string / number 申请人 userid / 部门
apply_time / apply_time_text number / string 申请时间(时间戳 / 可读)
approve_time / approve_time_text number / string 通过时间(时间戳 / 可读)
approver_userids string[] 审批人 userid 列表
content array 扁平化的内容明细(control/id/title/value/value_text)
approval_steps array 审批流各节点(含每个审批人的意见、时间)
notifyer array 抄送人
comments array 审批评论
apply_data object 原始审批申请数据(保真)

说明:value_text 对常见控件(文本、数字、金额、单选/多选、成员、日期、时长等)做了可读文本提取,便于下游组件直接引用;复杂控件(明细表、假勤、附件等)会以 JSON 字符串形式返回,原始完整结构见 apply_data。

企业微信 API 说明

接口 方法 频率限制 说明
/cgi-bin/gettoken GET — 获取 access_token,有效期 7200s
/cgi-bin/oa/getapprovalinfo POST 600 次/分 批量获取审批单号,单次最多 100 条
/cgi-bin/oa/getapprovaldetail POST 600 次/分 获取审批单详情

约束:

  • starttime ~ endtime 时间跨度不能超过 31 天(本插件自动切分)
  • 单次拉取审批单号上限 100(本插件自动分页)
  • 自建应用只能获取应用可见范围内申请人提交的表单
  • getapprovalinfo 的 starttime/endtime 仅支持按「提交时间」过滤,不支持按通过时间过滤;因此本插件的「完成日期」过滤 = 按提交时间回溯拉取(完成日期起点 - 回溯天数 至 完成日期终点)+ 拉取详情后按 approve_time 精确过滤,回溯天数由「拉取回溯天数」参数控制(默认 90 天)

开发

npm install
npm run build    # 编译到 dist/
npm run lint     # 代码检查

常见错误码

errcode 说明 处理建议
301055 无审批应用数据拉取权限 在「审批 - API - 审批数据权限」授权应用
301025 请求参数错误 检查日期/过滤条件格式
301026 批量拉取审批单内部接口失败 重试
301112 时间范围过大 缩小查询时间范围(本插件已自动切分)
42001 / 42007 access_token 过期/无效 自动刷新后重试
45009 / 45033 接口调用频率/并发超限 自动指数退避重试

License

MIT

Discussion