上个月,公司财务部的小张又加班到了晚上九点。不是因为核算量大,而是同一笔费用报销单,她已经在OA里审过了,还要把申请人、金额、费用项目、发票信息一个个手敲进用友YonSuite里。一天几十笔,眼睛都看花了,偶尔还会把金额输错,被业务部门投诉。
这不是个例。很多企业都在用致远OA走审批流程,用用友YonSuite做财务核算,两个系统之间隔着一道"数据鸿沟"。审批流结束了,财务的工作才真正开始。
这篇文章,我会把最近刚做完的一个真实项目完整复盘出来——如何把致远OA-V8里的费用报销单、付款申请单、差旅费申请,自动同步到用友YonSuite,让财务人员从重复的录入工作中解放出来。全文不讲虚的,只讲接口怎么调、字段怎么对、坑怎么躲。
先说说我们公司的现状:
我们采用的是"中间数据库 + 定时同步"的方案。没走实时消息队列,原因很简单:费用单据不是毫秒级要求的业务,分钟级甚至十分钟级的延迟完全可以接受,而且定时轮询的实现和维护成本更低。

图1:致远OA-V8 ↔ 用友YonSuite 系统集成总体架构–基于轻易云数据集成平台
整个架构分三层:
POST http://{OA服务器IP}:{端口}/seeyon/rest/token/{用户名}/{密码}
这个接口返回一个Token字符串,后续所有请求都要在HTTPPOST http://{OA服务器IP}:{端口}/seeyon/rest/token/channel
OA在返回前会调用你预先配置好的回调接口,把Token传给你。你的服务返回HTTP 200,就算验证通过。如果这一步没过,后面所有接口都会报401。
GET http://{OA服务器IP}:{端口}/seeyon/rest/form/getformdata/{summaryId}
summaryId就是流程实例ID,可以理解为单据的唯一标识。这个接口返回完整的表单数据,主表字段直接是key-value,从表数据在sub节点下以数组形式返回。我们用的是JSON格式,处理起来比XML方便得多。{
"申请人":
"张三",
"申请部门":
"销售一部",
"报销事由":
"客户招待",
"报销总金额":
"2580.00",
"sub": [
{"费用项目":
"餐饮费", "金额":
"1580.00"},
{"费用项目":
"交通费", "金额":
"1000.00"}
]
}
② 批量获取已结束流程ID
GET http://{OA服务器IP}:{端口}/seeyon/rest/flow/FromFinish/{templateCode}/{startTime}/{endTime}
集成服务不可能每次把OA里所有单据都扫一遍,这个接口按模板编号和时间范围,返回已正常结束的流程ID列表。我们每10分钟跑一次,只扫这10分钟内新归档的单据,效率很高。GET http://{OA服务器IP}:{端口}/seeyon/rest/flow/state/{flowId}
返回一个整数状态码:0表示正常结束,1表示待发,¾表示审批中,5表示撤销,6/7表示退回/取回,15表示终止。我们只同步state=0的单据,其他状态一律跳过。
图2:致远OA-V8 数据抽取接口调用完整流程
用友YonSuite的开放接口风格跟金蝶完全不同,它是基于开放平台的RESTful模式,需要先建应用、拿授权,再用access_token调业务接口。
第一步,在YonSuite后台的"我的应用"里创建一个自建应用,拿到三样东西:AppKey、AppSecret、租户ID(tenantId)。
第二步,用AppKey和AppSecret去换access_token:
GET https://open.yonyoucloud.com/open-auth/selfAppAuth/getAccessToken
?appKey={appKey}×tamp={timestamp}&signature={signature}
这里的signature不是明文密码,而是用HmacSHA256算出来的签名。具体做法:把appKey、timestamp这些参数按名称排序后拼成字符串,用AppSecret做密钥做HmacSHA256签名,结果Base64编码后再URL编码。这个签名计算建议直接写在代码里,不要每次手拼。
接口返回的JSON里有两个关键字段:
{
"code": "00000",
"message": "成功",
"data": {
"access_token":
"2215d3c77b684876980ff15f9a0df6c7",
"expire": 7200
}
}
access_token有效期2小时(7200秒),调用业务接口时放在Header里:
Authorization: Bearer {access_token}
Content-Type: application/json
注意:用友大部分接口都有单独的限流策略,默认每秒2次请求。我们在开发时踩过这个坑——一开始没做速率控制,批量同步20条单据时直接触发限流,接口返回429错误。后来加了请求队列和sleep控制,问题解决。
用友的单据操作接口统一以yonbip为前缀,格式很规整:
POST https://{数据中心域名}/yonbip/{业务域}/{单据标识}/batchSave
请求Body是JSON结构,核心字段有三个:
er_expensebill,资金管理结算单是fi_settlebill。具体编码要以用友开放平台API文档为准,不同版本可能有差异。POST https://{数据中心域名}/yonbip/{业务域}/{单据标识}/list
支持传filter过滤条件、fields返回字段、分页参数,跟常规的数据库查询很像。POST https://{数据中心域名}/yonbip/{业务域}/{单据标识}/audit
我们的做法是:结算单自动提交审核(因为付款时效要求高),费用报销单停留在创建状态,让财务人员在用友里人工复核一遍再提交。这样既省时间,又保留了财务管控。
图3:用友YonSuite 数据写入接口调用完整流程
下面这张是整个同步过程的业务全景图,从员工提单到财务核算,三个单据类型走的是同一条主干道,只是各自进不同的用友单据模块。

图4:费用类单据端到端同步业务流程
这是最常规的单据,员工报销差旅费、招待费、办公用品都走这个模板。
| 致远字段 | 用友字段 | 转换说明 |
|---|---|---|
| 申请人 | applicantId | 通过基础资料对照表取职员ID/编码 |
| 申请部门 | applyDeptId | 通过基础资料对照表取部门ID/编码 |
| 报销事由 | memo | 直接映射 |
| 报销总金额 | amount | Decimal精度处理,去除千分位 |
| 费用明细.费用项目 | ||
| expenseItems.expItemId | 子表映射,取费用项目ID | |
| 费用明细.金额 | expenseItems.amount | |
| 直接映射 |
接口调用四步走:
er_expensebill,_status写Insert;| 致远字段 | 用友字段 | 转换说明 |
|---|---|---|
| 申请人 | applicantId | 取职员ID/编码 |
| 申请日期 | billDate | YYYY-MM-DD格式 |
| 往来单位 | counterpartId | 根据往来类型判断:员工/供应商/客户 |
| 应付金额 | payAmount | 直接映射 |
| 申请付款金额 | applyAmount | 直接映射 |
| 付款用途 | payPurposeId | 固定值编码,以用友配置为准 |
| 致远字段 | 用友字段 | 转换说明 |
|---|---|---|
| 申请人 | applicantId | 取职员ID/编码 |
| 出差事由 | memo | 直接映射 |
| 出发日期 | startDate | YYYY-MM-DD格式 |
| 返回日期 | endDate | YYYY-MM-DD格式 |
| 出发地 | departure | 直接映射 |
| 目的地 | destination | 直接映射 |
| 交通工具 | vehicleType | 枚举值映射,如飞机/火车/汽车 |
er_expensebill,但busiType字段要赋值为差旅相关的业务类型编码(具体编码咨询用友顾问或查开放平台字典表)。差旅独有的字段(出发地、目的地、交通工具)可以通过扩展字段或子表自定义字段承载。| 坑点 | 现象 | 解决方案 |
|---|---|---|
| Token过期 | 同步到一半报401,后面单据全失败 | 封装Token管理模块,过期前5分钟自动刷新 |
| 接口限流 | 批量同步时返回429,请求被拒 | 加请求队列,控制每秒不超过2次,超限自动sleep |
| 基础资料不匹配 | 部门/职员编码在用友里找不到,保存报错 | 中间库维护对照表,未匹配的先写默认值并告警 |
| 金额精度丢失 | 大额单据小数点后几位对不上 | 全程用Decimal类型,最后转字符串写入JSON |
| 来源单号断链 | 用友里联查不到OA来源单据 | 结算单必须使用来源生单接口,回写来源标识 |
| 子表字段缺失 | 用友返回缺少某某字段key | 子表数据通过"子表明细聚合"字符串方式拼接传递 |
系统集成这件事,技术难度其实不算高,致远和用友都有成熟的开放接口。真正的难点在于业务细节的梳理:字段能不能对上、基础资料是不是一致、单据状态怎么流转、异常了谁负责处理。
这个项目上线后,财务小张每天的手工录入量从几十笔降到了几笔(只需要处理异常单据),数据准确率也明显提升。最重要的是,业务部门再也不用等两三天才能看到财务状态了。
如果你也在做致远和用友的对接,希望这篇文章能帮你少走一些弯路。有具体问题欢迎在评论区交流。
| 2024-10-04 01:52:22 | |
| 2024-11-19 22:30:00 | |
| 2024-05-16 22:40:59 | |
| 2021-06-07 20:34:36 | |
| 2024-05-14 15:55:26 | |
| 2024-12-06 20:19:43 | |
| 2024-12-09 07:12:37 | |
| 2024-05-04 23:01:29 | |
| 2024-12-21 11:27:21 | |
| 2021-06-26 11:16:12 | |
| 2024-10-24 11:28:24 | |
| 2024-10-22 11:28:28 | |
| 2024-08-02 06:25:00 | |
| 2024-11-27 23:57:24 | |
| 2023-05-21 20:51:48 | |
| 2024-06-10 23:08:22 | |
| 2024-11-20 23:45:38 | |
| 2024-11-04 11:26:08 | |
| 2024-11-11 14:18:23 | |
| 2022-10-16 09:42:39 | |
| 2023-01-26 10:06:21 | |
| 2023-01-26 10:06:21 | |
| 2023-01-26 10:06:19 | |
| 2023-01-26 10:06:18 | |
| 2023-01-26 10:06:17 |
胡秀丛 15813570600
数据集成顾问 项目总监 她以卓越的数据集成专长,精通ERP、MES系统,以及数据中台的构建与优化。通过创新的一站式解决方案,她助力企业实现数据的无缝对接,提升业务流程效率,确保信息流通无障碍,为企业的数字化转型提供强有力的支持。
卢剑航 13760755942
数据集成专家 拥有十多年丰富的经验,擅长ERP、MES、数据中台、营销云中台等集成。他能够根据客户需求,为其提供一站式集成解决方案,帮助企业快速实现各类系统数据集成服务。
何海波 18175716035
数据集成顾问 轻易云的技术专家,拥有丰富的数据集成规划经验。他能够为客户提供专业、全面的数据集成规划方案,熟练掌握多种集成技术和工具,帮助企业在数据集成领域得到长远发展。