# 流程节点与外部系统对接能力

# 节点通用能力

# 1、节点基本属性:节点名称、节点编码(节点编码同一个流程图唯一)

使用场景:在消息中通过节点编码区分是哪一个节点的消息,来做业务区隔,达到不同节点走不同的业务逻辑的目的。

# 2、节点事件 节点属性上可以配置节点事件,最终发送MQ消息

节点配置 说明
节点激活 节点激活的时候发出的MQ消息
节点提交 节点提交的时候发出的MQ消息
节点撤回(回退/取回) 节点撤销的时候发出的MQ消息,包括:取回、回退、撤销流程等

1747461728268.png

# 3、节点动作

# 自动节点

# 1、使用场景

自动节点主要是V8系统主动和外部系统交互使用的场景,通过主动调用外部系统接口,传递V8数据给外部系统,并获取外部系统的返回数据,到达系统交互目的。主要交互逻辑如下: 1747463523643.png

# 2、配置

节点配置 说明
节点激活动作 调用外部系统接口配置:主要是连接器或者其他服务OpenApi
节点撤回动作 做取回、回退、撤销的时候调用的接口,做数据还原
容错模式 接口调用报错的时候处理机制:转督办;忽略错误并提交;自动重试
请求参数映射 接口入参映射,主要用于传参
返回参数映射 接口响应映射,主要用于返回值处理,可以用于更新表单数据
节点动作 提交;回退到上节点;回退到发起者;撤销;终止;转督办人;自动重试; 根据这些表达式自动匹配执行的动作

其中自动重试的规则是:相对第一次执行重试的时间 1、2、4、8、15、30分钟 1747466125612.png

1747466147253.png

# 监听节点

# 1、使用场景

自动节点主要是V8系统被动和外部系统交互使用的场景,通过监听MQ消息的方式感知外部系统的变化,以监听到的数据驱动V8系统流程流转。 以客户顺丰使用场景为例,先通过自动节点传输数据到外部系统,外部系统需要一定时间处理相关业务,待外部系统业务处理完成后,发送MQ消息驱动V8流程继续流转,主要交互逻辑如下: 1747470188148.png

# 2、配置

节点配置 说明
监听事件 调用外部系统MQ消息配置:主要是连接器或者其他服务MQ消息
流程实例id 消息体中代表流程实例的属性 caseId, 这个注意用于查找要流转的那一条流程
参数映射 MQ消息体中的数据,可以映射到流程参数中,也可以用于更新表单数据
节点动作 提交;回退到上节点;回退到发起者;撤销;终止;转督办人; 根据这些表达式自动匹配执行的动作

1747470469321.png

1747470461811.png

# 事件节点

# 1、使用场景

事件节点V8系统主动通知外部系统的场景,但是不关心返回,这个节点会根据配置产生MQ消息,消息体可以携带流程参数数据。在连接器中监听节点激活事件或者节点撤回事件来和外部系统交互。

# 2、配置

节点配置 说明
节点激活事件 节点激活的时候发出的MQ消息
节点撤回事件 节点撤销的时候发出的MQ消息,包括:取回、回退、撤销流程等

1747471075135.png

# 脚本节点

# 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、配置

配置脚本节点需要在节点属性下的节点处理人中编写脚本。单据数据在流程中是流程参数,流程参数可以在编辑框中输入中文名称会有提示。 1749634482186.png

实例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;

1747469059016.png

# 节点动作

# 1、使用场景

节点动作主要用于人工节点,人工节点在流转过程中不同时机或者操作触发的行为动作,可以用于内部系统的数据产生、表单数据更新、外部系统交互等。包括三种类型:知会、更新表单数据、自定义动作。

  • 知会:在流程激活的时候,可以根据配置对特定人员产生知会事项。
  • 更新表单数据:在事项提交前、事项提交后;事项取回前、事项取回后;事项回退前、事项回退后的情况下更新表单数据,通过配置常量值或者表达式计算值去更新表单数据
  • 自定义动作:在事项提交前、事项提交后;事项取回前、事项取回后;事项回退前、事项回退后的情况下执行调用外部接口,在节点动作中和外部系统交互

# 2、配置

分类 说明
知会 执行时机:节点激活;产生知会事项
更新表单数据 更新表单中的数据 ;触发节点动作的时机:事项提交前、事项提交后;事项取回前、事项取回后;事项回退前、事项回退后
自定义动作 调用外部系统接口:主要是连接器或者其他服务OpenApi(同自动节点调用接口配置方式一致) ;触发节点动作的时机:事项提交前、事项提交后;事项取回前、事项取回后;事项回退前、事项回退后

注意:执行动作和流程的处于不同服务中,导致不会在相同事务中,如果出现更新数据和校验的逻辑建议配置提交前、取回前、回退前。

1747472874706.png

1747472880699.png

编撰人:fuchengzhi、shugang