#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,此参数可以从详情页面的地址栏中获取 获取事项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);
        }
    }

}

代码运行成功后,在已办、已发列表中,都可以看到终止成功的流程: 从已办详情页面进入,可以看到终止的意见、流程日志、以及当前流程终止的节点:

编撰人:liucong、shugang