# 流程节点与外部系统对接能力
# 节点通用能力
# 1、节点基本属性:节点名称、节点编码(节点编码同一个流程图唯一)
使用场景:在消息中通过节点编码区分是哪一个节点的消息,来做业务区隔,达到不同节点走不同的业务逻辑的目的。
# 2、节点事件 节点属性上可以配置节点事件,最终发送MQ消息
节点配置 | 说明 |
---|---|
节点激活 | 节点激活的时候发出的MQ消息 |
节点提交 | 节点提交的时候发出的MQ消息 |
节点撤回(回退/取回) | 节点撤销的时候发出的MQ消息,包括:取回、回退、撤销流程等 |
# 3、节点动作
# 自动节点
# 1、使用场景
自动节点主要是V8系统主动和外部系统交互使用的场景,通过主动调用外部系统接口,传递V8数据给外部系统,并获取外部系统的返回数据,到达系统交互目的。主要交互逻辑如下:
# 2、配置
节点配置 | 说明 |
---|---|
节点激活动作 | 调用外部系统接口配置:主要是连接器或者其他服务OpenApi |
节点撤回动作 | 做取回、回退、撤销的时候调用的接口,做数据还原 |
容错模式 | 接口调用报错的时候处理机制:转督办;忽略错误并提交;自动重试 |
请求参数映射 | 接口入参映射,主要用于传参 |
返回参数映射 | 接口响应映射,主要用于返回值处理,可以用于更新表单数据 |
节点动作 | 提交;回退到上节点;回退到发起者;撤销;终止;转督办人;自动重试; 根据这些表达式自动匹配执行的动作 |
其中自动重试的规则是:相对第一次执行重试的时间 1、2、4、8、15、30分钟
# 监听节点
# 1、使用场景
自动节点主要是V8系统被动和外部系统交互使用的场景,通过监听MQ消息的方式感知外部系统的变化,以监听到的数据驱动V8系统流程流转。
以客户顺丰使用场景为例,先通过自动节点传输数据到外部系统,外部系统需要一定时间处理相关业务,待外部系统业务处理完成后,发送MQ消息驱动V8流程继续流转,主要交互逻辑如下:
# 2、配置
节点配置 | 说明 |
---|---|
监听事件 | 调用外部系统MQ消息配置:主要是连接器或者其他服务MQ消息 |
流程实例id | 消息体中代表流程实例的属性 caseId, 这个注意用于查找要流转的那一条流程 |
参数映射 | MQ消息体中的数据,可以映射到流程参数中,也可以用于更新表单数据 |
节点动作 | 提交;回退到上节点;回退到发起者;撤销;终止;转督办人; 根据这些表达式自动匹配执行的动作 |
# 事件节点
# 1、使用场景
事件节点V8系统主动通知外部系统的场景,但是不关心返回,这个节点会根据配置产生MQ消息,消息体可以携带流程参数数据。在连接器中监听节点激活事件或者节点撤回事件来和外部系统交互。
# 2、配置
节点配置 | 说明 |
---|---|
节点激活事件 | 节点激活的时候发出的MQ消息 |
节点撤回事件 | 节点撤销的时候发出的MQ消息,包括:取回、回退、撤销流程等 |
# 脚本节点
# 1、使用场景
在复杂业务场景下,目前系统提供的找人规则都不能满足业务需要,需要自己写编排逻辑,可以通过脚本节点自己写脚本来查找人员。
脚本节点使用的脚本语言是AviatorScript。 官网地址为:https://www.yuque.com/boyan-avfmj/aviatorscript/cpow90 (opens new window)
脚本节点返回的数据一定是BpmUserDto的集合,其中userDto.id是必填的属性。
@Getter
@Setter
@DtoInfo(value = "工作流的用户对象基类")
public class BpmUserDto extends BaseDto {
private static final long serialVersionUID = -3205501578868343371L;
@DtoAttribute(value = "用户Id,唯一", example = "",relationDto = "com.seeyon.organization.dto.core.response.OrgMemberDto",
relationApp = StandardAppId.ORGANIZATION)
private String id;
@DtoAttribute(value = "用户名称", example = "")
private String name;
@DtoAttribute(value = "任职id")
private Long memberPostId;
@DtoAttribute(value = "人员排序号")
private Integer orderNo;
@DtoAttribute(value = "机构id")
private Long institutionId;
@DtoAttribute(value = "部门id")
private Long departmentId;
@DtoAttribute(value = "岗位id")
private Long postId;
@DtoAttribute(value = "是否为主岗")
private Boolean isMain;
@DtoAttribute(value = "任职信息是否已排序")
private Boolean orgInfoSorted;
}
# 2、配置
配置脚本节点需要在节点属性下的节点处理人中编写脚本。单据数据在流程中是流程参数,流程参数可以在编辑框中输入中文名称会有提示。
实例1:获取单据数据,或者自定义变了中的人员id数据,作为脚本节点找人的结果
// 创建集合变量
let usersMap1 = app-approval.applicant;// 表单中的某个字段值 :"564544610505404416_张三"
let usersMap2 = "594931287984004096_李四"; // 固定的变了值
let usersMap3 = "594931689898990592_王五";
// 组装外部接口参数
let paramList = seq.list(usersMap1, usersMap2, usersMap3);
let params = seq.map("params", paramList);
// 调用外部接口,地址和入参
let userResponse = httpPost("http://***/***/demo-post", params);
let userDtoList = seq.list();
// 判断接口返回值,并组装人员结果
if (userResponse.status == 0 && userResponse.data != nil && userResponse.data.content != nil) {
let users = userResponse.data.content;
for user in users {
if (user.userId == nil) {
continue;
}
let userDto = new com.seeyon.bpm.dto.match.BpmUserDto();
userDto.id = user.userId;
userDto.name = user.userName;
seq.add(userDtoList, userDto);
}
}
// 返回BpmUserDto 集合结果
return (userDtoList);
实例2:根据某个人员的code调用组织模型openapi接口转换成节点的人员
// 创建集合变量
let userDtoList = seq.list();
// 调用V8 openapi 接口地址
let url = "https://openapi-dev.seeyonv8.com/organization/member/code";
// 设置openapi 任职 放入header参数
let header = seq.map("app-key", "0fe1667c73624666bfc03286df196911","app-secret","beb5aa4fd692472896ce5d3819785f72");
let codes = seq.list("wurina0927002");
let data = seq.map("codes", codes,"includeDisable", false);
let now = now();
let params = seq.map("data", data,"requestId", now,"timestamp", now);
// 用预制函数 调用openapi接口
let response = sendHttpPost(url, params,header);
// 判断接口返回值,并组装人员结果
if (response.status == 0 && response.data != nil && response.data.content != nil) {
let users = response.data.content;
for user in users {
if (user.userId == nil) {
continue;
}
let userDto = new com.seeyon.bpm.dto.match.BpmUserDto();
userDto.id = user.userId;
userDto.name = user.userName;
seq.add(userDtoList, userDto);
}
}
// 返回BpmUserDto 集合结果
return userDtoList;
# 节点动作
# 1、使用场景
节点动作主要用于人工节点,人工节点在流转过程中不同时机或者操作触发的行为动作,可以用于内部系统的数据产生、表单数据更新、外部系统交互等。包括三种类型:知会、更新表单数据、自定义动作。
- 知会:在流程激活的时候,可以根据配置对特定人员产生知会事项。
- 更新表单数据:在事项提交前、事项提交后;事项取回前、事项取回后;事项回退前、事项回退后的情况下更新表单数据,通过配置常量值或者表达式计算值去更新表单数据
- 自定义动作:在事项提交前、事项提交后;事项取回前、事项取回后;事项回退前、事项回退后的情况下执行调用外部接口,在节点动作中和外部系统交互
# 2、配置
分类 | 说明 |
---|---|
知会 | 执行时机:节点激活;产生知会事项 |
更新表单数据 | 更新表单中的数据 ;触发节点动作的时机:事项提交前、事项提交后;事项取回前、事项取回后;事项回退前、事项回退后 |
自定义动作 | 调用外部系统接口:主要是连接器或者其他服务OpenApi(同自动节点调用接口配置方式一致) ;触发节点动作的时机:事项提交前、事项提交后;事项取回前、事项取回后;事项回退前、事项回退后 |
注意:执行动作和流程的处于不同服务中,导致不会在相同事务中,如果出现更新数据和校验的逻辑建议配置提交前、取回前、回退前。
快速跳转
