#1、 OpenAPI调用规则 bpm流程引擎开放的OpenAPI接口,遵循V8统一的OpenAPI调用规则,以下为简单的接入流程示例。详细接入规则,请以:https://open.seeyoncloud.com/v8dev/2451/2462.html 为准
#2、BPM关键运行态接口经典示例 本示例列举运行态中,使用比较高频的接口,包括:发送、处理、取回、回退、终止、撤销,示例中都以基本的业务参数做为示例,如有复杂的业务,请研读接口接入说明。 本示例所演示的接口,都需要有相应的接口操作和数据权限,使用前请仔细确认。
# 2.1、示例流程图
这里为了方便演示,流程图中的所有节点参与人都是"发起者"。
# 2.2、OpenAPI接入V8规则代码示例
# 2.2.1、创建一个接入工程
# 2.3、发起一个流程
这里发起一个示例流程,关键的业务参数为:模板code、发起人code、表单参数等。
# 请求地址:
https://系统域名/bpm/case/send
###请求参数
# 接口参数说明
参数名称 | 父节点 | 是否必填 | 参数类型 | 参数描述 |
---|---|---|---|---|
requestId | - | true | string | 请求流水号。同一接入应用下的流水号不要重复;最长32位,超过部分会被截断。 |
timestamp | - | true | int64 | 请求时间戳。请求时间和服务器时间不能相差过大,默认5分钟以内。 |
notifyUrl | - | false | string | 异步回调URL。如果此参数非空,表示使用异步方式调用开放API。 |
data | - | true | BpmSendDto | 请求参数数据 |
templateCode | data | false | string | 模板code |
templateId | data | false | int64 | 模板code/模板ID两者传其一,如果都传,以模板code为准 |
userCode | data | true | string | 当前用户ID(编号) |
currentUserId | data | true | int64 | 当前用户ID |
orgCode | data | false | string | 当前机构id(编号) |
orgId | data | false | int64 | 当前机构id |
bpmCommentDto | data | false | BpmCommentDto | 意见信息dto |
id | bpmCommentDto | false | int64 | id |
opinion | bpmCommentDto | false | string | 意见CODE |
content | bpmCommentDto | false | string | 审批意见 |
richContent | bpmCommentDto | false | string | 富文本审批意见 |
attachmentStorageIds | bpmCommentDto | false | array[BpmAttachmentStorageDto] | 意见中的附件ID |
id | attachmentStorageIds | false | string | 附件id |
fileName | attachmentStorageIds | false | string | 附件文件名 |
fileSize | attachmentStorageIds | false | string | 文件大小 |
size | attachmentStorageIds | false | string | 大小 |
storageKey | attachmentStorageIds | false | string | 存储key |
secretId | attachmentStorageIds | false | string | 密级id |
operationCaption | bpmCommentDto | false | string | 操作类型自定义名称 |
hidden | bpmCommentDto | false | boolean | 意见是否影藏 |
showPerson | bpmCommentDto | false | string | 意见影藏不包括人员 |
extra | bpmCommentDto | false | map | 扩展字段,该字段BPM不做处理只做透传 |
attitudeCaption | bpmCommentDto | false | string | 意见态度显示名称,带国际化 |
actionTime | bpmCommentDto | false | date | 操作时间(发送修改意见事件时,填写修改后的操作时间) |
opinionUserId | bpmCommentDto | false | int64 | 意见所属人id |
opinionAccountId | bpmCommentDto | false | int64 | 意见所属人机构id |
memberPostId | bpmCommentDto | false | string | 处理身份任职id(假的,目前没有值) |
formRecordId | data | false | string | 表单数据id |
parameterData | data | false | map | 流程参数需要的数据 |
caseId | data | false | int64 | 流程实例ID |
sendPolicy | data | false | string | 流程发送策略,现有:添加节点 - node ; 抛异常 - exception |
commandId | data | true | string | 请求唯一标识 |
redo | data | false | boolean | 是否允许超时后在执行,默认false |
###返回参数
参数名称 | 父节点 | 参数类型 | 参数描述 |
---|---|---|---|
data | - | SingleData | 流程发送返回结果 |
content | data | BpmSendResultDto | 数据对象 |
caseId | content | int64 | 运行态流程实例ID |
subject | content | string | 流程标题 |
status | - | int32 | 状态 |
code | - | string | 错误码 |
message | - | string | 返回信息 |
traceId | - | string | 链路ID |
###完整发起代码如下
package com.seeyon.demo.bpm.openapi;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.seeyon.demo.bpm.openapi.utils.HeaderUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
* 发起一个流程
* @author seeyon
* @date 2025-06-09 下午1:32
*/
public class SendCase {
public static void main(String[] args) throws Exception {
/** ----------------准备OpenAPI规则参数---------------- **/
// 请求流水号。同一接入应用下的流水号不要重复;最长32位,超过部分会被截断。
String requestId = UUID.randomUUID().toString();
// 请求唯一标识,可以跟流水号一样,也可以不一样,保证每次请求唯一即可
String commandId = requestId;
// 请求时间戳。请求时间和服务器时间不能相差过大,默认5分钟以内。
long timestamp = System.currentTimeMillis();
/** ----------------准备业务参数---------------- **/
// 发起流程的模板ID
String templateCode = "BPMkaifangpingtaijiekoushili";
// 发起流程的用户code
String userCode = "MB202409020003";
// 发起的表单数据,这里表单实体中只定义了两个字段,姓名和年龄
Map<String, Object> formData = new HashMap<String, Object>();
formData.put("xingming", "小明");
formData.put("nianling", "12");
/** ----------------组装接口请求数据---------------- **/
Map<String, Object> requestObjectMap = new HashMap<String, Object>();
requestObjectMap.put("requestId", requestId);
requestObjectMap.put("timestamp", timestamp);
Map<String, Object> data = new HashMap<String, Object>();
data.put("templateCode", templateCode);
data.put("userCode", userCode);
data.put("parameterData", formData);
// 请求唯一标识
data.put("commandId", commandId);
requestObjectMap.put("data", data);
// 最终的请求参数
String paramsJson = new ObjectMapper().writeValueAsString(requestObjectMap);
/** ---------------- 创建客户端,处理请求头,并发起请求 ---------------- **/
// 接口地址
String url = "https://openapi-dev.seeyonv8.com/bpm/case/send";
// 接入应用appKey
String appKey = "9d4cb9bc5fd0417a847e565362fff76b";
// 接入应用的appSecret
String appSecret = "8d17e604963c49c9ab21cb8a5854e7f9";
// 获取参数签名
String sign = HeaderUtils.sign(appSecret, paramsJson);
// 创建客户端
CloseableHttpClient httpClient = HttpClients.createDefault();
// 创建 POST 请求
HttpPost httpPost = new HttpPost(url);
// 设置请求头
httpPost.setHeader("app-key", appKey);
httpPost.setHeader("sign-type", "MD5");
httpPost.setHeader("sign", sign);
// 设置请求体
httpPost.setEntity(new StringEntity(paramsJson));
// 执行请求
CloseableHttpResponse response = httpClient.execute(httpPost);
// 获取响应状态码
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("Status Code: " + statusCode);
// 获取响应内容
HttpEntity entity = response.getEntity();
if (entity != null) {
String result = EntityUtils.toString(entity);
System.out.println("Response: " + result);
}
}
}
运行代码,得到输出结果,其中code=BOOT_0000表示接口调用成功,并为发生业务异常,并附带输出了caseId(流程实例ID)、subject(流程标题)
Status Code: 200
Response: {"status":0,"code":"BOOT_0000","message":"SUCCESS","traceId":"9d4cb9bc5fd0417a847e565362fff76be90f001b-d170-4972-b6eb-4820d504","data":{"content":{"validate":true,"caseId":"-7138429048247920259","subject":"BPM开放平台接口示例(shugang10011 2025-06-09 14:08)"}}}
此时在MB202409020003用户界面可以查询到待办信息
如果点击待办的详情,可以看到表单数据值
点击查看流程图,可以看到流程图流转到了第一个节点
# 2.4、处理待办
这里我们以2.3中发起流程生成的待办为例,进行提交操作的演示,其中关键参数为事项ID,此参数可以从详情页面的地址栏中获取
###请求地址: https://系统域名/bpm/work-item/submit
###请求参数
参数名称 | 父节点 | 是否必填 | 参数类型 | 参数描述 |
---|---|---|---|---|
requestId | - | true | string | 请求流水号。同一接入应用下的流水号不要重复;最长32位,超过部分会被截断。 |
timestamp | - | true | int64 | 请求时间戳。请求时间和服务器时间不能相差过大,默认5分钟以内。 |
notifyUrl | - | false | string | 异步回调URL。如果此参数非空,表示使用异步方式调用开放API,执行结果将通过此URL异步通知调用者。 |
data | - | true | BpmSubmitDto | 请求参数数据 |
affairId | data | true | int64 | 事项affairId |
userCode | data | true | string | 当前用户ID(编号) |
currentUserId | data | true | int64 | 当前用户ID |
orgCode | data | false | string | 当前机构id(编号) |
orgId | data | false | int64 | 当前机构id |
bpmCommentDto | data | false | BpmCommentDto | 意见信息dto |
id | bpmCommentDto | false | int64 | id |
opinion | bpmCommentDto | false | string | 意见CODE |
content | bpmCommentDto | false | string | 审批意见 |
richContent | bpmCommentDto | false | string | 富文本审批意见 |
attachmentStorageIds | bpmCommentDto | false | array[BpmAttachmentStorageDto] | 意见中的附件ID |
id | attachmentStorageIds | false | string | 附件id |
fileName | attachmentStorageIds | false | string | 附件文件名 |
fileSize | attachmentStorageIds | false | string | 文件大小 |
size | attachmentStorageIds | false | string | 大小 |
storageKey | attachmentStorageIds | false | string | 存储key |
secretId | attachmentStorageIds | false | string | 密级id |
operationCaption | bpmCommentDto | false | string | 操作类型自定义名称 |
hidden | bpmCommentDto | false | boolean | 意见是否影藏 |
showPerson | bpmCommentDto | false | string | 意见影藏不包括人员 |
extra | bpmCommentDto | false | map | 扩展字段,该字段BPM不做处理只做透传 |
attitudeCaption | bpmCommentDto | false | string | 意见态度显示名称,带国际化 |
actionTime | bpmCommentDto | false | date | 操作时间(发送修改意见事件时,填写修改后的操作时间) |
opinionUserId | bpmCommentDto | false | int64 | 意见所属人id |
opinionAccountId | bpmCommentDto | false | int64 | 意见所属人机构id |
memberPostId | bpmCommentDto | false | string | 处理身份任职id(假的,目前没有值) |
formData | data | false | map | 表单数据(选择提交时填) |
changeNodeRequestDtos | data | false | array[ChangeNodeRequestDto] | 加签相关请求参数,没有做加签相关操作,传递NULL就可以 |
processId | changeNodeRequestDtos | false | int64 | 流程Id,processJson,优先取processJson,没有就取processId在数据库中对应的流程图 |
processJson | changeNodeRequestDtos | false | string | 流程图Json,和processId组合使用,优先取baseProcessXml,没有就取processId在数据库中对应的流程图 |
currentActivityId | changeNodeRequestDtos | true | string | 当前节点ID |
workItemId | changeNodeRequestDtos | false | string | 当前WorkItem的ID |
changeTypeEnum | changeNodeRequestDtos | true | enum | 操作类型。枚举项可选值列表:NONE(默认值:空),AddNode(加签),AddInform(知会),Assign(当前会签),DeleteNode(减签),PassRead(传阅),Transfer(转办),OrderExecuteAdd(多人按序执行),ReplaceNode(替换节点),ModifyNodeProperty(修改节点属性),Countersign(会签),LOOP(节点循环),SuperviseChange(督办修改),CountersignInnerAdd(会签-咨询),PostApprovalAddNode(后置审批增补),ADD_INNER(加签到节点内), |
needInsertLog | changeNodeRequestDtos | false | boolean | 是否插入日志 |
addNodeParameterDto | changeNodeRequestDtos | false | AddNodeParameterDto | 前端加签界面选择的具体参数,减签的时候不需要 |
nodeIdAndSelectPeoples | addNodeParameterDto | true | array[AddNodeOrgInfoDto] | 选人界面返回的加签的组织模型信息和节点信息 |
activityId | nodeIdAndSelectPeoples | false | string | 加签的节点id。只会,加签到节点内不传节点id,替换时需要传入需要替换的节点id |
activityName | nodeIdAndSelectPeoples | false | string | 加签的节点名称。合并为一个节点时,该属性不能为空,否则默认取第一个参与者的名称作为节点名称 |
orgInfo | nodeIdAndSelectPeoples | true | string | 选人界面返回的加签的组织模型信息 |
flowTypeEnum | addNodeParameterDto | false | enum | 加签模式,此处仅可使用 SERIAL:加签到节点后;FRONT:加签到节点前;CURRENT_BRANCH:加签到旁支;CURRENT_PARALLEL:与当前节点并发。枚举项可选值列表:NONE(默认值:空),SERIAL(串行),SERIAL_PARALLEL(并行后向加签),PARALLEL(并行),CURRENT_PARALLEL(当前会签),CURRENT_BRANCH(加签到旁支),FRONT(前向加签),FRONT_SERIAL(前向串行加签),COUNTERSIGN(会签),COUNTERSIGN_INNER_ADD(会签-咨询),PARALLEL_NEXT_NODE(加签与后一节点并列,加签节点串发),PARALLEL_NEXT_NODE_PARALLEL(加签与后一节点并列,加签节点并发), |
processExecuteEnum | addNodeParameterDto | false | enum | 执行模式 全体并发 竞争。枚举项可选值列表:NONE(默认值:空),ALL_PARALLEL(全体并发),COMPETITION(竞争), |
nodeExecuteEnum | addNodeParameterDto | false | enum | 多个节点执行模式 串发 并发。枚举项可选值列表:NONE(默认值:空),SERIAL(串发执行),PARALLEL(并发执行),MERGE(合并), |
policyId | addNodeParameterDto | false | string | 节点权限ID |
policyName | addNodeParameterDto | false | string | 节点权限名称 |
nodePermType | addNodeParameterDto | false | int32 | 节点权限类型Code |
processTerm | addNodeParameterDto | false | enum | 节点期限。枚举项可选值列表:NONE(默认值:空),NO(无),CUSTOM(自定义时间),PARAMETER(流程参数), |
parameterCode | addNodeParameterDto | false | string | 该模板的参数code,当节点期限选择的是节点参数的时候有效,并且只能选择日期时间类型 |
parameterName | addNodeParameterDto | false | string | 该模板的参数名称,和参数ID对应,当节点期限选择的是节点参数的时候有效 |
customTime | addNodeParameterDto | false | int32 | 自定义时间数字,当节点期限选择的是自定义时间该参数才有效 |
customTimeType | addNodeParameterDto | false | enum | 自定义时间类型,只有节点期限选择的是自定义时间该参数才有效。枚举项可选值列表:NONE(默认值:空),SECOND(秒),MINUTE(分),HOUR(小时),DAY(天), |
beforeExpiredTime | addNodeParameterDto | false | int32 | 节点到期前提醒时间,只有节点到期前操作选择的是消息提醒该参数才有效 |
beforeExpiredTimeType | addNodeParameterDto | false | enum | 节点到期前提醒时间类型,只是节点到期前操作选择的是消息提醒该参数才有效。枚举项可选值列表:NONE(默认值:空),SECOND(秒),MINUTE(分),HOUR(小时),DAY(天), |
beforeExpired | addNodeParameterDto | true | enum | 节点到期前操作。枚举项可选值列表:NONE(默认值:空),NO_OPERATION(无操作),MESSAGE_ALERT(消息提醒), |
afterExpired | addNodeParameterDto | false | enum | 节点到期后操作。枚举项可选值列表:NONE(默认值:空),NO(无操作),MESSAGE(消息提醒),CYCLE(消息重复提醒),DESIGNATED(转给指定人),SKIP(自动跳过),ADVANCE_SETTING(高级设置), |
repealAlertTime | addNodeParameterDto | false | int32 | 到期重复提醒时间,只有节点到期后操作选择的是消息提醒-重复提醒该参数才有效 |
repealAlertTimeType | addNodeParameterDto | false | enum | 到期重复提醒时间类型,只有节点到期后操作选择的是消息提醒-重复提醒该参数才有效。枚举项可选值列表:NONE(默认值:空),SECOND(秒),MINUTE(分),HOUR(小时),DAY(天), |
messageRemindUser | addNodeParameterDto | false | string | 消息提醒提醒对象 |
messageReRemindUser | addNodeParameterDto | false | string | 消息重复提醒提醒对象 |
dealTermUser | addNodeParameterDto | false | string | 超期后转指定人选择的人员信息 |
receiveImmediate | addNodeParameterDto | false | boolean | 加签与我合并,合并到原节点,true 表示立即收到 false为否 |
formOperationId | addNodeParameterDto | false | string | 表单权限ID |
readOnly | addNodeParameterDto | false | boolean | 是否只读:true只读,false编辑 |
repeatCount | addNodeParameterDto | false | int32 | 到期重复提醒次数,只有节点到期后操作选择的是消息提醒-重复提醒该参数才有效 |
addNodeToMe | addNodeParameterDto | false | boolean | 加签回到我 |
addNodeImmediate | addNodeParameterDto | false | boolean | 加签在我后面立即收到,形成独立节点 true 表示立即收到 false为否 |
deletedNodeIds | changeNodeRequestDtos | false | array[string] | 需要减签的节点ID,只有减签的时候需要 |
replaceNodeDto | changeNodeRequestDtos | false | AddNodeOrgInfoDto | 替换节点信息 |
activityId | replaceNodeDto | false | string | 加签的节点id。只会,加签到节点内不传节点id,替换时需要传入需要替换的节点id |
activityName | replaceNodeDto | false | string | 加签的节点名称。合并为一个节点时,该属性不能为空,否则默认取第一个参与者的名称作为节点名称 |
orgInfo | replaceNodeDto | true | string | 选人界面返回的加签的组织模型信息 |
modifyNodeTermParameterDtos | changeNodeRequestDtos | false | array[AddNodeProcessTermParameterDto] | 加签节点节点属性修改 |
activityId | modifyNodeTermParameterDtos | false | string | 节点id |
policyId | modifyNodeTermParameterDtos | false | string | 节点权限ID |
policyName | modifyNodeTermParameterDtos | false | string | 节点权限名称 |
nodePermType | modifyNodeTermParameterDtos | false | int32 | 节点权限类型Code |
processExecuteEnum | modifyNodeTermParameterDtos | false | enum | 执行模式 全体并发 竞争。枚举项可选值列表:NONE(默认值:空),ALL_PARALLEL(全体并发),COMPETITION(竞争), |
processTerm | modifyNodeTermParameterDtos | true | enum | 节点期限。枚举项可选值列表:NONE(默认值:空),NO(无),CUSTOM(自定义时间),PARAMETER(流程参数), |
parameterCode | modifyNodeTermParameterDtos | false | string | 该模板的参数code,当节点期限选择的是节点参数的时候有效,并且只能选择日期时间类型 |
parameterName | modifyNodeTermParameterDtos | false | string | 该模板的参数名称,和参数ID对应,当节点期限选择的是节点参数的时候有效 |
customTime | modifyNodeTermParameterDtos | false | int32 | 自定义时间数字,当节点期限选择的是自定义时间该参数才有效 |
customTimeType | modifyNodeTermParameterDtos | false | enum | 自定义时间类型,只有节点期限选择的是自定义时间该参数才有效。枚举项可选值列表:NONE(默认值:空),SECOND(秒),MINUTE(分),HOUR(小时),DAY(天), |
beforeExpiredTime | modifyNodeTermParameterDtos | false | int32 | 节点到期前提醒时间,只有节点到期前操作选择的是消息提醒该参数才有效 |
beforeExpiredTimeType | modifyNodeTermParameterDtos | false | enum | 节点到期前提醒时间类型,只是节点到期前操作选择的是消息提醒该参数才有效。枚举项可选值列表:NONE(默认值:空),SECOND(秒),MINUTE(分),HOUR(小时),DAY(天), |
beforeExpired | modifyNodeTermParameterDtos | true | enum | 节点到期前操作。枚举项可选值列表:NONE(默认值:空),NO_OPERATION(无操作),MESSAGE_ALERT(消息提醒), |
afterExpired | modifyNodeTermParameterDtos | false | enum | 节点到期后操作。枚举项可选值列表:NONE(默认值:空),NO(无操作),MESSAGE(消息提醒),CYCLE(消息重复提醒),DESIGNATED(转给指定人),SKIP(自动跳过),ADVANCE_SETTING(高级设置), |
repealAlertTime | modifyNodeTermParameterDtos | false | int32 | 到期重复提醒时间,只有节点到期后操作选择的是消息提醒-重复提醒该参数才有效 |
repealAlertTimeType | modifyNodeTermParameterDtos | false | enum | 到期重复提醒时间类型,只有节点到期后操作选择的是消息提醒-重复提醒该参数才有效。枚举项可选值列表:NONE(默认值:空),SECOND(秒),MINUTE(分),HOUR(小时),DAY(天), |
messageRemindUser | modifyNodeTermParameterDtos | false | string | 消息提醒提醒对象 |
messageReRemindUser | modifyNodeTermParameterDtos | false | string | 消息重复提醒提醒对象 |
dealTermUser | modifyNodeTermParameterDtos | false | string | 超期后转指定人选择的人员信息 |
repeatCount | modifyNodeTermParameterDtos | false | int32 | 到期重复提醒次数,只有节点到期后操作选择的是消息提醒-重复提醒该参数才有效 |
formOperationId | modifyNodeTermParameterDtos | false | string | 表单权限ID |
formDataMap | changeNodeRequestDtos | false | map | 前端表单数据 |
applicationName | changeNodeRequestDtos | false | string | 应用app |
preMatchRequestDto | data | false | PreMatchRequestDto | 预提交分支匹配结果 |
conditionsOfLinks | preMatchRequestDto | false | map | 节点的删除状态,<linkId,是否被删除(true删除,false没有被删除)> |
selectedPeoplesOfNodes | preMatchRequestDto | false | map | 节点选人信息,是一个map,key是节点ID,value是PreSelectedPeopleDto |
processLogs | preMatchRequestDto | false | array[BpmProcessLogDto] | 预提交时记录的流程日志 |
id | processLogs | true | int64 | 日志ID |
caseId | processLogs | false | int64 | 流程实例ID |
nodeId | processLogs | false | int64 | 节点ID |
nodeName | processLogs | false | string | 节点名称 |
workItemId | processLogs | false | int64 | 事项ID |
actionUserId | processLogs | false | int64 | 操作人ID |
actionUserName | processLogs | false | string | 操作用户名称 |
actionTime | processLogs | false | date | 操作时间 |
actionType | processLogs | false | string | 操作类型 |
actionDetail | processLogs | false | string | 处理操作 |
receiveTime | processLogs | false | date | 收到时间 |
dealTime | processLogs | false | string | 操作时长 |
dealTermTime | processLogs | false | string | 处理期限 |
hasExpire | processLogs | false | boolean | 是否超期 |
expireTime | processLogs | false | string | 超期时长 |
hasDetail | processLogs | false | boolean | 是否有日志明细 |
affairId | processLogs | false | int64 | 事项ID |
opinionId | processLogs | false | int64 | 意见ID |
nodeSubLicenseMap | preMatchRequestDto | false | map | 预匹配时节点转授权信息 |
oneHandlerMatchNeedPop | preMatchRequestDto | false | boolean | 只有一个分支满足的时候是否弹选人选分支(和系统参数同意受控,只要一个开关打开就允许弹选人选分支) |
postApprovalAddNodeSuccess | preMatchRequestDto | false | boolean | 后置审批增补节点是否成功 |
onlyCheck | data | false | boolean | 是否仅校验 |
commandId | data | true | string | 请求唯一标识 |
redo | data | false | boolean | 是否允许超时后在执行,默认false |
###返回参数
参数名称 | 父节点 | 参数类型 | 参数描述 |
---|---|---|---|
data | SingleData | 流程处理返回结果 | |
content | data | BpmSubmitResultDto | 数据对象 |
preMatchResponseDto | content | PreMatchResponseDto | 分支匹配返回信息 |
canSubmit | preMatchResponseDto | boolean | 是否获取流程锁成功:true表示获取到锁,false表示没有获取到锁 |
isLast | preMatchResponseDto | string | 是否为流程最后一个处理人 |
pop | preMatchResponseDto | boolean | 是否需要弹出分支选择和人员选择对话框 |
conditionMatchResultDtoMap | preMatchResponseDto | map | linkId_linkId,每个分支路径上最后一个节点的匹配节点 |
conditionMatchMapKeyList | preMatchResponseDto | array[string] | 需要选分支或选人的节点集合的Key的一个顺序List,用于前端分支排序 |
conditionsOfLinks | preMatchResponseDto | map | 流程流转线的删除状态,<linkId_linkId,是否被删除(true删除,false没有被删除),需要回填到提交dto中(PreMatchRequestDto)> |
selectedPeoplesOfNodes | preMatchResponseDto | map | linkId_linkId,节点选人信息,需要回填到提交dto中(PreMatchRequestDto) |
selectionMode | preMatchResponseDto | string | 分支可选数,单选-radio ; 多选-checkbox |
hasSatisfyAutoBranch | preMatchResponseDto | boolean | 是否有符合条件的自动分支,用于前端界面控制显示隐藏 |
processLogs | preMatchResponseDto | array[BpmProcessLogDto] | 流程日志 |
id | processLogs | int64 | 日志ID |
caseId | processLogs | int64 | 流程实例ID |
nodeId | processLogs | int64 | 节点ID |
nodeName | processLogs | string | 节点名称 |
workItemId | processLogs | int64 | 事项ID |
actionUserId | processLogs | int64 | 操作人ID |
actionUserName | processLogs | string | 操作用户名称 |
actionTime | processLogs | date | 操作时间 |
actionType | processLogs | string | 操作类型 |
actionDetail | processLogs | string | 处理操作 |
receiveTime | processLogs | date | 收到时间 |
dealTime | processLogs | string | 操作时长 |
dealTermTime | processLogs | string | 处理期限 |
hasExpire | processLogs | boolean | 是否超期 |
expireTime | processLogs | string | 超期时长 |
hasDetail | processLogs | boolean | 是否有日志明细 |
affairId | processLogs | int64 | 事项ID |
opinionId | processLogs | int64 | 意见ID |
nodeSubLicenseMap | preMatchResponseDto | map | 节点转授权信息 |
opinionAsBranch | preMatchResponseDto | boolean | 是否存在意见作为分支条件 |
showLinkName | preMatchResponseDto | boolean | 是否显示分支线名称 |
postApprovalAddNodeSuccess | preMatchResponseDto | boolean | 后置审批增补节点是否成功 |
isInSpecialStepBackStatus | preMatchResponseDto | string | 是否处于指定回退状态 |
cannotSubmitMsg | preMatchResponseDto | string | 不能获取到锁的校验信息 |
submitToMe | preMatchResponseDto | boolean | 是否指定回退直接提交给我 |
mainPreMatchResponseDto | content | PreMatchResponseDto | 主流程预提交选人选分支dto |
canSubmit | mainPreMatchResponseDto | boolean | 是否获取流程锁成功:true表示获取到锁,false表示没有获取到锁 |
isLast | mainPreMatchResponseDto | string | 是否为流程最后一个处理人 |
pop | mainPreMatchResponseDto | boolean | 是否需要弹出分支选择和人员选择对话框 |
conditionMatchResultDtoMap | mainPreMatchResponseDto | map | linkId_linkId,每个分支路径上最后一个节点的匹配节点 |
conditionMatchMapKeyList | mainPreMatchResponseDto | array[string] | 需要选分支或选人的节点集合的Key的一个顺序List,用于前端分支排序 |
conditionsOfLinks | mainPreMatchResponseDto | map | 流程流转线的删除状态,<linkId_linkId,是否被删除(true删除,false没有被删除),需要回填到提交dto中(PreMatchRequestDto)> |
selectedPeoplesOfNodes | mainPreMatchResponseDto | map | linkId_linkId,节点选人信息,需要回填到提交dto中(PreMatchRequestDto) |
selectionMode | mainPreMatchResponseDto | string | 分支可选数,单选-radio ; 多选-checkbox |
hasSatisfyAutoBranch | mainPreMatchResponseDto | boolean | 是否有符合条件的自动分支,用于前端界面控制显示隐藏 |
processLogs | mainPreMatchResponseDto | array[BpmProcessLogDto] | 流程日志 |
id | processLogs | int64 | 日志ID |
caseId | processLogs | int64 | 流程实例ID |
nodeId | processLogs | int64 | 节点ID |
nodeName | processLogs | string | 节点名称 |
workItemId | processLogs | int64 | 事项ID |
actionUserId | processLogs | int64 | 操作人ID |
actionUserName | processLogs | string | 操作用户名称 |
actionTime | processLogs | date | 操作时间 |
actionType | processLogs | string | 操作类型 |
actionDetail | processLogs | string | 处理操作 |
receiveTime | processLogs | date | 收到时间 |
dealTime | processLogs | string | 操作时长 |
dealTermTime | processLogs | string | 处理期限 |
hasExpire | processLogs | boolean | 是否超期 |
expireTime | processLogs | string | 超期时长 |
hasDetail | processLogs | boolean | 是否有日志明细 |
affairId | processLogs | int64 | 事项ID |
opinionId | processLogs | int64 | 意见ID |
nodeSubLicenseMap | mainPreMatchResponseDto | map | 节点转授权信息 |
opinionAsBranch | mainPreMatchResponseDto | boolean | 是否存在意见作为分支条件 |
showLinkName | mainPreMatchResponseDto | boolean | 是否显示分支线名称 |
postApprovalAddNodeSuccess | mainPreMatchResponseDto | boolean | 后置审批增补节点是否成功 |
isInSpecialStepBackStatus | mainPreMatchResponseDto | string | 是否处于指定回退状态 |
cannotSubmitMsg | mainPreMatchResponseDto | string | 不能获取到锁的校验信息 |
submitToMe | mainPreMatchResponseDto | boolean | 是否指定回退直接提交给我 |
status | int32 | 状态 | |
code | string | 错误码 | |
message | string | 返回信息 | |
traceId | string | 链路ID |
###处理示例完整代码:
package com.seeyon.demo.bpm.openapi;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.seeyon.demo.bpm.openapi.utils.HeaderUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
* 处理一个事项
* @author seeyon
* @date 2025-06-09 下午2:30
*/
public class SubmitAffair {
public static void main(String[] args) throws Exception {
/** ----------------准备OpenAPI规则参数---------------- **/
// 请求流水号。同一接入应用下的流水号不要重复;最长32位,超过部分会被截断。
String requestId = UUID.randomUUID().toString();
// 请求唯一标识,可以跟流水号一样,也可以不一样,保证每次请求唯一即可
String commandId = requestId;
// 请求时间戳。请求时间和服务器时间不能相差过大,默认5分钟以内。
long timestamp = System.currentTimeMillis();
/** ----------------准备业务参数---------------- **/
// 事项ID
long affairId = -5886927964286143223L;
// 处理流程的用户code
String userCode = "MB202409020003";
// 处理的表单数据,这里表单实体中只定义了两个字段,姓名和年龄
Map<String, Object> formData = new HashMap<String, Object>();
formData.put("xingming", "小明-第一个节点提交修改");
formData.put("nianling", "12");
// 可以添加一个审批意见
Map<String, Object> bpmCommentDto = new HashMap<String, Object>();
bpmCommentDto.put("opinion", "AGREE");
bpmCommentDto.put("content", "节点1说的:一定要好好学习,天天向上");
/** ----------------组装接口请求数据---------------- **/
Map<String, Object> requestObjectMap = new HashMap<String, Object>();
requestObjectMap.put("requestId", requestId);
requestObjectMap.put("timestamp", timestamp);
Map<String, Object> data = new HashMap<String, Object>();
data.put("affairId", affairId);
data.put("userCode", userCode);
data.put("parameterData", formData);
data.put("bpmCommentDto", bpmCommentDto);
// 请求唯一标识
data.put("commandId", commandId);
requestObjectMap.put("data", data);
// 最终的请求参数
String paramsJson = new ObjectMapper().writeValueAsString(requestObjectMap);
/** ---------------- 创建客户端,处理请求头,并发起请求 ---------------- **/
// 接口地址
String url = "https://openapi-dev.seeyonv8.com/bpm/work-item/submit";
// 接入应用appKey
String appKey = "9d4cb9bc5fd0417a847e565362fff76b";
// 接入应用的appSecret
String appSecret = "8d17e604963c49c9ab21cb8a5854e7f9";
// 获取参数签名
String sign = HeaderUtils.sign(appSecret, paramsJson);
// 创建客户端
CloseableHttpClient httpClient = HttpClients.createDefault();
// 创建 POST 请求
HttpPost httpPost = new HttpPost(url);
// 设置请求头
httpPost.setHeader("app-key", appKey);
httpPost.setHeader("sign-type", "MD5");
httpPost.setHeader("sign", sign);
// 设置请求体
httpPost.setEntity(new StringEntity(paramsJson, Charset.forName("UTF-8")));
// 执行请求
CloseableHttpResponse response = httpClient.execute(httpPost);
// 获取响应状态码
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("Status Code: " + statusCode);
// 获取响应内容
HttpEntity entity = response.getEntity();
if (entity != null) {
String result = EntityUtils.toString(entity);
System.out.println("Response: " + result);
}
}
}
运行代码后,得到返回结果:
Status Code: 200
Response: {"status":0,"code":"BOOT_0000","message":"SUCCESS","traceId":"9d4cb9bc5fd0417a847e565362fff76b2b604320-d6a8-4f59-bef1-d0fbdcb7","data":{"content":{"validate":true,"preMatchResponseDto":null,"mainPreMatchResponseDto":null}}}
查看待办列表,可以看到最新的生成待办
以及上一节点的已处理待办
提交的审批意见
当前节点流转位置
# 2.5 取回
取回操作与提交操作的关键参数差不多,关键参数都为事项ID(affairId)等,
###请求地址 https://系统域名/bpm/work-item/take-back
###请求参数
参数名称 | 父节点 | 是否必填 | 参数类型 | 参数描述 |
---|---|---|---|---|
requestId | true | string | 请求流水号。同一接入应用下的流水号不要重复;最长32位,超过部分会被截断。 | |
timestamp | true | int64 | 请求时间戳。请求时间和服务器时间不能相差过大,默认5分钟以内。 | |
notifyUrl | false | string | 异步回调URL。如果此参数非空,表示使用异步方式调用开放API,执行结果将通过此URL异步通知调用者。 | |
data | true | BpmTakeBackDto | 请求参数数据 | |
affairId | data | true | int64 | 事项affairId |
userCode | data | true | string | 当前用户ID(编号) |
currentUserId | data | true | int64 | 当前用户ID |
bpmCommentDto | data | false | BpmCommentDto | 意见信息dto |
id | bpmCommentDto | false | int64 | id |
opinion | bpmCommentDto | false | string | 意见CODE |
content | bpmCommentDto | false | string | 审批意见 |
richContent | bpmCommentDto | false | string | 富文本审批意见 |
attachmentStorageIds | bpmCommentDto | false | array[BpmAttachmentStorageDto] | 意见中的附件ID |
id | attachmentStorageIds | false | string | 附件id |
fileName | attachmentStorageIds | false | string | 附件文件名 |
fileSize | attachmentStorageIds | false | string | 文件大小 |
size | attachmentStorageIds | false | string | 大小 |
storageKey | attachmentStorageIds | false | string | 存储key |
secretId | attachmentStorageIds | false | string | 密级id |
operationCaption | bpmCommentDto | false | string | 操作类型自定义名称 |
hidden | bpmCommentDto | false | boolean | 意见是否影藏 |
showPerson | bpmCommentDto | false | string | 意见影藏不包括人员 |
extra | bpmCommentDto | false | map | 扩展字段,该字段BPM不做处理只做透传 |
attitudeCaption | bpmCommentDto | false | string | 意见态度显示名称,带国际化 |
actionTime | bpmCommentDto | false | date | 操作时间(发送修改意见事件时,填写修改后的操作时间) |
opinionUserId | bpmCommentDto | false | int64 | 意见所属人id |
opinionAccountId | bpmCommentDto | false | int64 | 意见所属人机构id |
memberPostId | bpmCommentDto | false | string | 处理身份任职id(假的,目前没有值) |
commandId | data | true | string | 请求唯一标识 |
redo | data | false | boolean | 是否允许超时后在执行,默认false |
###返回参数
参数名称 | 父节点 | 参数类型 | 参数描述 |
---|---|---|---|
data | SingleData | 流程取回返回结果 | |
content | data | CommonResultDto | 数据对象 |
success | content | boolean | 是否通过 |
message | content | string | 失败的时候的message信息,success为true的时候此信息为空或者可以忽略 |
status | int32 | 状态 | |
code | string | 错误码 | |
message | string | 返回信息 | |
traceId | string | 链路ID |
###完整代码
package com.seeyon.demo.bpm.openapi;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.seeyon.demo.bpm.openapi.utils.HeaderUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
* 取回一个事项
* @author seeyon
* @date 2025-06-09 下午2:30
*/
public class TakeBackAffair {
public static void main(String[] args) throws Exception {
/** ----------------准备OpenAPI规则参数---------------- **/
// 请求流水号。同一接入应用下的流水号不要重复;最长32位,超过部分会被截断。
String requestId = UUID.randomUUID().toString();
// 请求唯一标识,可以跟流水号一样,也可以不一样,保证每次请求唯一即可
String commandId = requestId;
// 请求时间戳。请求时间和服务器时间不能相差过大,默认5分钟以内。
long timestamp = System.currentTimeMillis();
/** ----------------准备业务参数---------------- **/
// 事项ID
long affairId = -5886927964286143223L;
// 取回流程的用户code
String userCode = "MB202409020003";
/** ----------------组装接口请求数据---------------- **/
Map<String, Object> requestObjectMap = new HashMap<String, Object>();
requestObjectMap.put("requestId", requestId);
requestObjectMap.put("timestamp", timestamp);
Map<String, Object> data = new HashMap<String, Object>();
data.put("affairId", affairId);
data.put("userCode", userCode);
// 请求唯一标识
data.put("commandId", commandId);
requestObjectMap.put("data", data);
// 最终的请求参数
String paramsJson = new ObjectMapper().writeValueAsString(requestObjectMap);
/** ---------------- 创建客户端,处理请求头,并发起请求 ---------------- **/
// 接口地址
String url = "https://openapi-dev.seeyonv8.com/bpm/work-item/take-back";
// 接入应用appKey
String appKey = "9d4cb9bc5fd0417a847e565362fff76b";
// 接入应用的appSecret
String appSecret = "8d17e604963c49c9ab21cb8a5854e7f9";
// 获取参数签名
String sign = HeaderUtils.sign(appSecret, paramsJson);
// 创建客户端
CloseableHttpClient httpClient = HttpClients.createDefault();
// 创建 POST 请求
HttpPost httpPost = new HttpPost(url);
// 设置请求头
httpPost.setHeader("app-key", appKey);
httpPost.setHeader("sign-type", "MD5");
httpPost.setHeader("sign", sign);
// 设置请求体
httpPost.setEntity(new StringEntity(paramsJson, Charset.forName("UTF-8")));
// 执行请求
CloseableHttpResponse response = httpClient.execute(httpPost);
// 获取响应状态码
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("Status Code: " + statusCode);
// 获取响应内容
HttpEntity entity = response.getEntity();
if (entity != null) {
String result = EntityUtils.toString(entity);
System.out.println("Response: " + result);
}
}
}
执行成功后,我们从流程日志中查看详细的流程流转日志:
# 2.6 回退
我们再次运行节点1的提交代码,由节点2回退给节点1,回退的关键参数也为事项ID(affairId)
###请求地址 https://系统域名/bpm/case/step-back
###请求参数
参数名称 | 父节点 | 是否必填 | 参数类型 | 参数描述 |
---|---|---|---|---|
requestId | true | string | 请求流水号。同一接入应用下的流水号不要重复;最长32位,超过部分会被截断。 | |
timestamp | true | int64 | 请求时间戳。请求时间和服务器时间不能相差过大,默认5分钟以内。 | |
notifyUrl | false | string | 异步回调URL。如果此参数非空,表示使用异步方式调用开放API,执行结果将通过此URL异步通知调用者。 | |
data | true | BpmStepBackDto | 请求参数数据 | |
affairId | data | false | int64 | 事项affairId。caseId 不传时,此字段必填 |
caseId | data | false | int64 | 流程实例id。affairId不传时,此字段必填 |
pendingNodeId | data | false | string | 当前节点id。affairId不传时,此字段必填 |
userCode | data | true | string | 当前用户ID(编号) |
currentUserId | data | true | int64 | 当前用户ID |
bpmCommentDto | data | false | BpmCommentDto | 意见信息dto |
id | bpmCommentDto | false | int64 | id |
opinion | bpmCommentDto | false | string | 意见CODE |
content | bpmCommentDto | false | string | 审批意见 |
richContent | bpmCommentDto | false | string | 富文本审批意见 |
attachmentStorageIds | bpmCommentDto | false | array[BpmAttachmentStorageDto] | 意见中的附件ID |
id | attachmentStorageIds | false | string | 附件id |
fileName | attachmentStorageIds | false | string | 附件文件名 |
fileSize | attachmentStorageIds | false | string | 文件大小 |
size | attachmentStorageIds | false | string | 大小 |
storageKey | attachmentStorageIds | false | string | 存储key |
secretId | attachmentStorageIds | false | string | 密级id |
operationCaption | bpmCommentDto | false | string | 操作类型自定义名称 |
hidden | bpmCommentDto | false | boolean | 意见是否影藏 |
showPerson | bpmCommentDto | false | string | 意见影藏不包括人员 |
extra | bpmCommentDto | false | map | 扩展字段,该字段BPM不做处理只做透传 |
attitudeCaption | bpmCommentDto | false | string | 意见态度显示名称,带国际化 |
actionTime | bpmCommentDto | false | date | 操作时间(发送修改意见事件时,填写修改后的操作时间) |
opinionUserId | bpmCommentDto | false | int64 | 意见所属人id |
opinionAccountId | bpmCommentDto | false | int64 | 意见所属人机构id |
memberPostId | bpmCommentDto | false | string | 处理身份任职id(假的,目前没有值) |
formData | data | false | map | 表单数据 |
submitStyleAfterStepBack | data | false | enum | 指定回退后的节点提交方式,参数只有在指定回退的时候才填写。枚举项可选值列表:NONE(默认值:空),NODE_GO_BACK(指定回退/撤办流程重走),NODE_TO_ME(指定回退/撤办直接提交给我) |
nodeToMeItem | data | false | enum | 指定回退-提交给我的下级选项:仅提交给我; 提交给回退节点全部处理人。枚举项可选值列表:SUBMIT_TO_ME(SUBMIT_TO_ME),SUBMIT_TO_ALL(SUBMIT_TO_ALL) |
selectTargetNodeId | data | false | string | 支持三种方式:一、值为空字符串表示上节点,二、值为具体的节点ID表示指定回退,submitStyleAfterStepBack必填,三、值为start,回退到发起节点,且submitStyleAfterStepBack的值只能为NODE_GO_BACK |
targetNodePeopleNeedReMatch | data | false | boolean | 回退到的目标节点是否需要重新匹配人员,指定回退只有流程重走才生效,提交给我不生效,false:取上次匹配的人员,true:重新匹配 |
commandId | data | true | string | 请求唯一标识 |
redo | data | false | boolean | 是否允许超时后在执行,默认false |
###返回参数
参数名称 | 父节点 | 参数类型 | 参数描述 |
---|---|---|---|
data | SingleData | 回退结果信息 | |
content | data | CommonResultDto | 数据对象 |
success | content | boolean | 是否通过 |
message | content | string | 失败的时候的message信息,success为true的时候此信息为空或者可以忽略 |
status | int32 | 状态 | |
code | string | 错误码 | |
message | string | 返回信息 | |
traceId | string | 链路ID |
###完整代码
package com.seeyon.demo.bpm.openapi;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.seeyon.demo.bpm.openapi.utils.HeaderUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
* 回退一个事项
* @author seeyon
* @date 2025-06-09 下午2:30
*/
public class StepBackAffair {
public static void main(String[] args) throws Exception {
/** ----------------准备OpenAPI规则参数---------------- **/
// 请求流水号。同一接入应用下的流水号不要重复;最长32位,超过部分会被截断。
String requestId = UUID.randomUUID().toString();
// 请求唯一标识,可以跟流水号一样,也可以不一样,保证每次请求唯一即可
String commandId = requestId;
// 请求时间戳。请求时间和服务器时间不能相差过大,默认5分钟以内。
long timestamp = System.currentTimeMillis();
/** ----------------准备业务参数---------------- **/
// 事项ID
long affairId = -1632920951033342447L;
// 回退流程的用户code
String userCode = "MB202409020003";
// 可以添加一个审批意见
Map<String, Object> bpmCommentDto = new HashMap<String, Object>();
bpmCommentDto.put("content", "节点2觉得节点1审批有问题,回退待办");
/** ----------------组装接口请求数据---------------- **/
Map<String, Object> requestObjectMap = new HashMap<String, Object>();
requestObjectMap.put("requestId", requestId);
requestObjectMap.put("timestamp", timestamp);
Map<String, Object> data = new HashMap<String, Object>();
data.put("affairId", affairId);
data.put("userCode", userCode);
data.put("bpmCommentDto", bpmCommentDto);
// 请求唯一标识
data.put("commandId", commandId);
requestObjectMap.put("data", data);
// 最终的请求参数
String paramsJson = new ObjectMapper().writeValueAsString(requestObjectMap);
/** ---------------- 创建客户端,处理请求头,并发起请求 ---------------- **/
// 接口地址
String url = "https://openapi-dev.seeyonv8.com/bpm/case/step-back";
// 接入应用appKey
String appKey = "9d4cb9bc5fd0417a847e565362fff76b";
// 接入应用的appSecret
String appSecret = "8d17e604963c49c9ab21cb8a5854e7f9";
// 获取参数签名
String sign = HeaderUtils.sign(appSecret, paramsJson);
// 创建客户端
CloseableHttpClient httpClient = HttpClients.createDefault();
// 创建 POST 请求
HttpPost httpPost = new HttpPost(url);
// 设置请求头
httpPost.setHeader("app-key", appKey);
httpPost.setHeader("sign-type", "MD5");
httpPost.setHeader("sign", sign);
// 设置请求体
httpPost.setEntity(new StringEntity(paramsJson, Charset.forName("UTF-8")));
// 执行请求
CloseableHttpResponse response = httpClient.execute(httpPost);
// 获取响应状态码
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("Status Code: " + statusCode);
// 获取响应内容
HttpEntity entity = response.getEntity();
if (entity != null) {
String result = EntityUtils.toString(entity);
System.out.println("Response: " + result);
}
}
}
回退结果,可以通过流程日志、流程意见查看
##2.7、撤销 撤销可以通过某个有撤销权限的待办撤销(关键参数为事项ID),也可以由流程实例发起者撤销(关键参数流程实例ID),如果发起人有撤销权限,这里我们以事项ID为例。
###请求地址 https://openapi-dev.seeyonv8.com/bpm/case/cancel
###请求参数
参数名称 | 父节点 | 是否必填 | 参数类型 | 参数描述 |
---|---|---|---|---|
requestId | true | string | 请求流水号。同一接入应用下的流水号不要重复;最长32位,超过部分会被截断。 | |
timestamp | true | int64 | 请求时间戳。请求时间和服务器时间不能相差过大,默认5分钟以内。 | |
notifyUrl | false | string | 异步回调URL。如果此参数非空,表示使用异步方式调用开放API,执行结果将通过此URL异步通知调用者。 | |
data | true | BpmRepealDto | 请求参数数据 | |
affairId | data | false | int64 | 事项affairId |
caseId | data | false | int64 | 流程实例ID,事项affairId存在则取事项id |
userCode | data | true | string | 当前用户ID(编号) |
currentUserId | data | true | int64 | 当前用户ID |
bpmCommentDto | data | false | BpmCommentDto | 意见信息dto |
id | bpmCommentDto | false | int64 | id |
opinion | bpmCommentDto | false | string | 意见CODE |
content | bpmCommentDto | false | string | 审批意见 |
richContent | bpmCommentDto | false | string | 富文本审批意见 |
attachmentStorageIds | bpmCommentDto | false | array[BpmAttachmentStorageDto] | 意见中的附件ID |
id | attachmentStorageIds | false | string | 附件id |
fileName | attachmentStorageIds | false | string | 附件文件名 |
fileSize | attachmentStorageIds | false | string | 文件大小 |
size | attachmentStorageIds | false | string | 大小 |
storageKey | attachmentStorageIds | false | string | 存储key |
secretId | attachmentStorageIds | false | string | 密级id |
operationCaption | bpmCommentDto | false | string | 操作类型自定义名称 |
hidden | bpmCommentDto | false | boolean | 意见是否影藏 |
showPerson | bpmCommentDto | false | string | 意见影藏不包括人员 |
extra | bpmCommentDto | false | map | 扩展字段,该字段BPM不做处理只做透传 |
attitudeCaption | bpmCommentDto | false | string | 意见态度显示名称,带国际化 |
actionTime | bpmCommentDto | false | date | 操作时间(发送修改意见事件时,填写修改后的操作时间) |
opinionUserId | bpmCommentDto | false | int64 | 意见所属人id |
opinionAccountId | bpmCommentDto | false | int64 | 意见所属人机构id |
memberPostId | bpmCommentDto | false | string | 处理身份任职id(假的,目前没有值) |
formData | data | false | map | 表单数据(选择提交时填) |
###返回参数
参数名称 | 父节点 | 参数类型 | 参数描述 |
---|---|---|---|
data | SingleData | 流程撤销结果 | |
content | data | CommonResultDto | 数据对象 |
success | content | boolean | 是否通过 |
message | content | string | 失败的时候的message信息,success为true的时候此信息为空或者可以忽略 |
status | int32 | 状态 | |
code | string | 错误码 | |
message | string | 返回信息 | |
traceId | string | 链路ID |
###完整代码
package com.seeyon.demo.bpm.openapi;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.seeyon.demo.bpm.openapi.utils.HeaderUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
* 撤销一个流程
* @author seeyon
* @date 2025-06-09 下午3:45
*/
public class RepealCase {
public static void main(String[] args) throws Exception {
/** ----------------准备OpenAPI规则参数---------------- **/
// 请求流水号。同一接入应用下的流水号不要重复;最长32位,超过部分会被截断。
String requestId = UUID.randomUUID().toString();
// 请求唯一标识,可以跟流水号一样,也可以不一样,保证每次请求唯一即可
String commandId = requestId;
// 请求时间戳。请求时间和服务器时间不能相差过大,默认5分钟以内。
long timestamp = System.currentTimeMillis();
/** ----------------准备业务参数---------------- **/
// 事项ID
long affairId = -7997807928418568589L;
// 事项所属人userCode
String userCode = "MB202409020003";
// 可以添加一个审批意见
Map<String, Object> bpmCommentDto = new HashMap<String, Object>();
bpmCommentDto.put("content", "节点2待办所属人撤销该条流程");
/** ----------------组装接口请求数据---------------- **/
Map<String, Object> requestObjectMap = new HashMap<String, Object>();
requestObjectMap.put("requestId", requestId);
requestObjectMap.put("timestamp", timestamp);
Map<String, Object> data = new HashMap<String, Object>();
data.put("affairId", affairId);
data.put("userCode", userCode);
data.put("bpmCommentDto", bpmCommentDto);
// 请求唯一标识
data.put("commandId", commandId);
requestObjectMap.put("data", data);
// 最终的请求参数
String paramsJson = new ObjectMapper().writeValueAsString(requestObjectMap);
/** ---------------- 创建客户端,处理请求头,并发起请求 ---------------- **/
// 接口地址
String url = "https://openapi-dev.seeyonv8.com/bpm/case/cancel";
// 接入应用appKey
String appKey = "9d4cb9bc5fd0417a847e565362fff76b";
// 接入应用的appSecret
String appSecret = "8d17e604963c49c9ab21cb8a5854e7f9";
// 获取参数签名
String sign = HeaderUtils.sign(appSecret, paramsJson);
// 创建客户端
CloseableHttpClient httpClient = HttpClients.createDefault();
// 创建 POST 请求
HttpPost httpPost = new HttpPost(url);
// 设置请求头
httpPost.setHeader("app-key", appKey);
httpPost.setHeader("sign-type", "MD5");
httpPost.setHeader("sign", sign);
// 设置请求体
httpPost.setEntity(new StringEntity(paramsJson, Charset.forName("UTF-8")));
// 执行请求
CloseableHttpResponse response = httpClient.execute(httpPost);
// 获取响应状态码
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("Status Code: " + statusCode);
// 获取响应内容
HttpEntity entity = response.getEntity();
if (entity != null) {
String result = EntityUtils.toString(entity);
System.out.println("Response: " + result);
}
}
}
运行代码后,在待发页面会有一条撤销流程,并且该流程的所有待办都消失
##2.8、终止 重新发起流程后,终止流程同撤销流程一样,可以从有终止权限的待办终止(关键参数为事项ID),如果发起人有终止权限,也可以由发起人身份直接终止流程(关键参数为流程实例ID),这里我们以流程实例ID为例。
###请求地址: https://系统域名/bpm/case/stop
###请求参数
参数名称 | 父节点 | 是否必填 | 参数类型 | 参数描述 |
---|---|---|---|---|
requestId | true | string | 请求流水号。同一接入应用下的流水号不要重复;最长32位,超过部分会被截断。 | |
timestamp | true | int64 | 请求时间戳。请求时间和服务器时间不能相差过大,默认5分钟以内。 | |
notifyUrl | false | string | 异步回调URL。如果此参数非空,表示使用异步方式调用开放API,执行结果将通过此URL异步通知调用者。 | |
data | true | BpmStopDto | 请求参数数据 | |
affairId | data | false | int64 | 事项affairId |
caseId | data | false | int64 | 流程实例ID,某些场景下没有affairId |
userCode | data | true | string | 当前用户ID(编号) |
currentUserId | data | true | int64 | 当前用户ID |
bpmCommentDto | data | false | BpmCommentDto | 意见信息dto |
id | bpmCommentDto | false | int64 | id |
opinion | bpmCommentDto | false | string | 意见CODE |
content | bpmCommentDto | false | string | 审批意见 |
richContent | bpmCommentDto | false | string | 富文本审批意见 |
attachmentStorageIds | bpmCommentDto | false | array[BpmAttachmentStorageDto] | 意见中的附件ID |
id | attachmentStorageIds | false | string | 附件id |
fileName | attachmentStorageIds | false | string | 附件文件名 |
fileSize | attachmentStorageIds | false | string | 文件大小 |
size | attachmentStorageIds | false | string | 大小 |
storageKey | attachmentStorageIds | false | string | 存储key |
secretId | attachmentStorageIds | false | string | 密级id |
operationCaption | bpmCommentDto | false | string | 操作类型自定义名称 |
hidden | bpmCommentDto | false | boolean | 意见是否影藏 |
showPerson | bpmCommentDto | false | string | 意见影藏不包括人员 |
extra | bpmCommentDto | false | map | 扩展字段,该字段BPM不做处理只做透传 |
attitudeCaption | bpmCommentDto | false | string | 意见态度显示名称,带国际化 |
actionTime | bpmCommentDto | false | date | 操作时间(发送修改意见事件时,填写修改后的操作时间) |
opinionUserId | bpmCommentDto | false | int64 | 意见所属人id |
opinionAccountId | bpmCommentDto | false | int64 | 意见所属人机构id |
memberPostId | bpmCommentDto | false | string | 处理身份任职id(假的,目前没有值) |
formData | data | false | map | 表单数据(选择提交时填) |
commandId | data | true | string | 请求唯一标识 |
redo | data | false | boolean | 是否允许超时后在执行,默认false |
###返回参数
参数名称 | 父节点 | 参数类型 | 参数描述 |
---|---|---|---|
data | SingleData | 流程终止返回结果 | |
content | data | CommonResultDto | 数据对象 |
success | content | boolean | 是否通过 |
message | content | string | 失败的时候的message信息,success为true的时候此信息为空或者可以忽略 |
status | int32 | 状态 | |
code | string | 错误码 | |
message | string | 返回信息 | |
traceId | string | 链路ID |
###完整代码
package com.seeyon.demo.bpm.openapi;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.seeyon.demo.bpm.openapi.utils.HeaderUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
* 终止一个流程
* @author seeyon
* @date 2025-06-09 下午3:45
*/
public class StopCase {
public static void main(String[] args) throws Exception {
/** ----------------准备OpenAPI规则参数---------------- **/
// 请求流水号。同一接入应用下的流水号不要重复;最长32位,超过部分会被截断。
String requestId = UUID.randomUUID().toString();
// 请求唯一标识,可以跟流水号一样,也可以不一样,保证每次请求唯一即可
String commandId = requestId;
// 请求时间戳。请求时间和服务器时间不能相差过大,默认5分钟以内。
long timestamp = System.currentTimeMillis();
/** ----------------准备业务参数---------------- **/
// 事项ID
long caseId = -7138429048247920259L;
// 撤销流程的用户code
String userCode = "MB202409020003";
// 可以添加一个审批意见
Map<String, Object> bpmCommentDto = new HashMap<String, Object>();
bpmCommentDto.put("content", "直接通过caseId终止流程");
/** ----------------组装接口请求数据---------------- **/
Map<String, Object> requestObjectMap = new HashMap<String, Object>();
requestObjectMap.put("requestId", requestId);
requestObjectMap.put("timestamp", timestamp);
Map<String, Object> data = new HashMap<String, Object>();
data.put("caseId", caseId);
data.put("userCode", userCode);
data.put("bpmCommentDto", bpmCommentDto);
// 请求唯一标识
data.put("commandId", commandId);
requestObjectMap.put("data", data);
// 最终的请求参数
String paramsJson = new ObjectMapper().writeValueAsString(requestObjectMap);
/** ---------------- 创建客户端,处理请求头,并发起请求 ---------------- **/
// 接口地址
String url = "https://openapi-dev.seeyonv8.com/bpm/case/stop";
// 接入应用appKey
String appKey = "9d4cb9bc5fd0417a847e565362fff76b";
// 接入应用的appSecret
String appSecret = "8d17e604963c49c9ab21cb8a5854e7f9";
// 获取参数签名
String sign = HeaderUtils.sign(appSecret, paramsJson);
// 创建客户端
CloseableHttpClient httpClient = HttpClients.createDefault();
// 创建 POST 请求
HttpPost httpPost = new HttpPost(url);
// 设置请求头
httpPost.setHeader("app-key", appKey);
httpPost.setHeader("sign-type", "MD5");
httpPost.setHeader("sign", sign);
// 设置请求体
httpPost.setEntity(new StringEntity(paramsJson, Charset.forName("UTF-8")));
// 执行请求
CloseableHttpResponse response = httpClient.execute(httpPost);
// 获取响应状态码
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("Status Code: " + statusCode);
// 获取响应内容
HttpEntity entity = response.getEntity();
if (entity != null) {
String result = EntityUtils.toString(entity);
System.out.println("Response: " + result);
}
}
}
代码运行成功后,在已办、已发列表中,都可以看到终止成功的流程:
从已办详情页面进入,可以看到终止的意见、流程日志、以及当前流程终止的节点:
