摘要:企业计划中的项目审批、任务变更等流程往往需要与钉钉或企业微信的审批流打通。本文以JVS企业计划为例,详细讲解如何通过API和回调机制实现双向集成,包括配置步骤、代码示例和常见问题排查。
一、集成场景概述
JVS企业计划中的项目管理、任务分配、预算变更等操作,通常需要上级审批才能生效。传统做法是审批人登录PC端操作系统处理,效率低下且容易遗漏。将审批流程推送到钉钉/企微,审批人可在移动端直接审批,大幅提升响应速度。
核心痛点:
-
审批人经常在外出差,无法及时登录系统处理审批
-
多个审批流程分散在不同页面,缺乏统一入口
-
审批完成后,业务单据状态需要同步更新,人工操作容易遗漏
本文解决的核心问题是:通过API对接,实现JVS企业计划与钉钉/企微审批流的双向自动同步。
二、准备工作
集成前需要完成以下准备工作:
JVS企业计划侧:
-
已在系统中配置好需要审批的业务单据(如项目立项、预算调整、计划变更等)
-
JVS企业计划版本要求:v2.5及以上
-
系统能够通过公网或内网访问钉钉/企微API(根据部署环境选择网络策略)
钉钉侧(以钉钉为例):
-
拥有钉钉管理员权限,能够创建自建应用
-
获取必要参数:AppKey、AppSecret、AgentId、CorpId
三、集成配置步骤(以钉钉为例)
3.1 钉钉侧配置
-
登录钉钉开放平台(open.dingtalk.com),进入"应用开发" → "企业内部开发",创建自建应用。
-
创建成功后,记录以下参数:AppKey(应用的唯一标识)、AppSecret(应用密钥,用于签名)、AgentId(应用标识ID,调用审批接口时使用)。
-
获取CorpId:在钉钉开放平台首页"基本信息"中查看企业CorpId。
-
在"权限管理"中申请"审批流接口权限"(包括:获取审批模板列表、发起审批实例、获取审批结果等)。
3.2 JVS企业计划侧配置
-
登录JVS企业计划管理后台,进入"集成中心" → "钉钉集成"。
-
填写CorpId、AppKey、AppSecret,点击"保存并测试连接",验证参数有效性。
-
在"审批流映射"中,将JVS的业务单据类型(如"项目立项")与钉钉的审批模板ID绑定。
-
系统自动生成回调URL,将该URL配置到钉钉应用的"事件订阅"中,用于接收审批结果通知。
说明:钉钉审批模板ID可以在钉钉开放平台的"审批"菜单中查看已创建的审批流程,每个审批流程都有一个唯一的模板ID。
四、代码示例(Java实现)
4.1 发起审批实例
JVS企业计划在提交审批时,调用钉钉API发起审批实例的核心逻辑如下:
java
// 构建审批表单数据
Map<String, Object> formData = new HashMap<>();
formData.put("projectName", project.getName());
formData.put("budget", project.getBudget());
formData.put("reason", project.getReason());
// 调用钉钉API
DingTalkClient client = new DefaultDingTalkClient(
"https://oapi.dingtalk.com/topapi/processinstance/create"
);
OapiProcessinstanceCreateRequest req = new OapiProcessinstanceCreateRequest();
req.setProcessCode(dingtalkTemplateId); // 钉钉审批模板ID
req.setFormComponentValues(convertToDingTalkForm(formData));
req.setOriginatorUserId(userId); // 审批发起人ID
OapiProcessinstanceCreateResponse rsp = client.execute(req, accessToken);
if (rsp.isSuccess()) {
// 保存钉钉返回的审批实例ID到JVS单据
project.setDingtalkInstanceId(rsp.getProcessInstanceId());
projectService.save(project);
}
关键方法说明:
-
convertToDingTalkForm():将JVS业务单据字段转换为钉钉审批表单格式 -
accessToken:通过AppKey+AppSecret调用钉钉API动态获取,有效期2小时,需缓存处理
4.2 接收审批结果回调
钉钉审批完成后(同意或拒绝),会向配置的回调URL发送结果。JVS通过以下接口接收并处理:
java
@PostMapping("/dingtalk/callback")
public String receiveCallback(@RequestBody DingTalkCallbackBody body) {
String instanceId = body.getProcessInstanceId();
String result = body.getResult(); // agree 或 refuse
// 根据审批实例ID找到对应的JVS业务单据
Project project = projectService.findByDingtalkInstanceId(instanceId);
if (project == null) {
return "fail: 单据不存在";
}
// 更新单据审批状态
if ("agree".equals(result)) {
project.setStatus(ProjectStatus.APPROVED);
// 可选:触发审批通过后的后续流程(如消息通知、自动化执行等)
} else if ("refuse".equals(result)) {
project.setStatus(ProjectStatus.REJECTED);
}
projectService.save(project);
return "success";
}
4.3 异常处理与重试机制
在实际生产环境中,网络波动或API限流可能导致调用失败。建议增加以下容错策略:
java
// 带指数退避的重试逻辑
private String getAccessTokenWithRetry(int maxRetries) {
for (int i = 0; i < maxRetries; i++) {
try {
return getAccessToken();
} catch (DingTalkException e) {
if (i == maxRetries - 1) throw e;
Thread.sleep(1000L * (1 << i)); // 1s, 2s, 4s...
}
}
return null;
}
1. 获取accessToken失败重试
2. 审批回调幂等性处理
钉钉可能存在重复推送回调的情况,需确保接口幂等:
java
// 使用redis分布式锁防止重复处理
String lockKey = "dingtalk:callback:" + instanceId;
if (!redisLock.tryLock(lockKey, 5, TimeUnit.SECONDS)) {
return "processing";
}
try {
// 检查单据当前状态,若已为终态则直接返回成功
if (project.getStatus() == ProjectStatus.APPROVED ||
project.getStatus() == ProjectStatus.REJECTED) {
return "success";
}
// 正常处理审批结果...
} finally {
redisLock.unlock();
}
五、其他平台支持说明
5.1 企业微信集成
JVS企业计划同样支持企业微信审批流对接,配置路径为"集成中心" → "企业微信集成"。
企业微信侧要点:
-
获取企业ID、应用Secret
-
审批模板ID从企业微信管理后台获取
-
API调用地址与企业微信官方接口不同(使用qyapi.weixin.qq.com)
配置映射表:
| 平台 | 认证方式 | 审批发起接口 | 审批回调格式 |
|---|---|---|---|
| 钉钉 | AppKey + AppSecret | /topapi/processinstance/create | JSON,含processInstanceId、result |
| 企业微信 | CorpId + Secret | /cgi-bin/oa/applyevent | JSON,含sp_no、sp_status |
六、常见问题排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 回调接收不到 | 回调URL不可达,或被防火墙拦截 | 检查URL公网/内网可达性;确认JVS服务器防火墙已放通相应端口;查看钉钉应用的事件订阅状态是否"已启用" |
| accessToken获取失败 | AppKey/AppSecret错误,或IP不在白名单 | 核对开放平台参数;将服务器出口IP添加到钉钉应用的IP白名单 |
| 审批单无法发起 | 审批模板ID错误,或用户ID不存在 | 核对模板ID;确认发起人userId在钉钉中存在且可访问 |
| 回调URL超时 | JVS回调接口处理时间过长 | 接口采用异步处理:收到回调后立即返回success,另起线程处理业务逻辑 |
| 重复回调 | 钉钉侧重试机制触发 | 实现幂等处理:根据instanceId记录处理状态,重复请求直接返回success |
七、总结
通过API集成,JVS企业计划可以实现与钉钉/企微审批流的双向自动同步:
-
发起审批:业务单据提交时,自动调用钉钉/企微API发起审批实例
-
结果同步:审批完成后,通过回调机制自动更新业务单据状态
-
异常处理:内置重试、幂等、日志记录等机制,保障集成稳定性
上述代码示例已在JVS企业计划v2.5生产环境中验证,可直接参考使用。
