工作流集成
工作流集成是指第三方表单使用平台流程引擎实现流转、回退等功能
- 平台流程引擎提供《流程动作 API》和《任务 API》给第三方调用,实现启动流程、流转、回退、查询待办任务等功能
- 流程处理人,需要使用平台中的组织用户,即第三方系统和平台需要组织同步,参考《组织同步》
- 流程中选择后续环节和处理人的流程确认对话框,在第三方界面中不能使用,需要自行开发,参考《自定义流程页面》中的流转确认页面的说明
- 显示流程图的页面,在第三方可以直接打开,参考《第三方自动登录并打开页面》
下面通过一个案例,介绍工作流集成的方法
案例说明
鉴于流程确认对话框需要自行开发,本例在流转和回退时,不弹出流程确认对话框,处理人在流程图中通过表达式指定
- 不能使用“获取表单数据”的函数,因为平台通过 DBRest 访问表单数据
- 可以使用“组织函数、流程函数”指定处理人
- 可以使用“通过 url 获取值”函数,调用 API 指定处理人,参考《流程函数》
- 可以在 ProcessControl 中指定处理人,参考《按数据顺序处理(工序排程)》中的设置审批人
在平台中,使用两个租户,租户 A 作为流程引擎,租户 B 模拟第三方系统
- 租户 A:包括企业门户、企业工作流两个应用
- 租户 B:创建企业应用,添加两个页面
- 页面一:我的待办,显示我的待办,打开表单页面
- 页面二:表单页面,实现启动、流转、回退、显示流程图
- 页面中使用高级网络请求组件,实现跨域访问,相当于调用后端服务,在服务中执行跨域请求
页面一
页面二
添加流程
在租户 A 中,打开“企业门户-系统管理-工作流管理-流程定义”,新增一个流程
设计流程图、输入流程编码、流程名称、表单地址。其中表单地址是第三方系统的页面,以 http 或 https 开头,如下图所示
由于本例,不弹出流程确认对话框,因此除首环节外,其余环节的处理人必填
登录平台
流程提供的 API 都是登录后才能访问的,即请求头 Cookie 中需要携带 user_session 才能访问,否则返回 401
登录平台,调用登录 API,参考《系统集成 API》中的登录,示例代码如下
onLoginBtnClick = async (event) => {
this.comp("srequest0").send({
url:"https://租户 A 门户域名/login",
method:"POST",
header:{
"content-type": "application/x-www-form-urlencoded"
},
data:{
"username":"liyun",
"password":"aSDF1@#$"
}
})
}
启动并流转
流程需要启动,才能流转。通常流程的第一个环节的处理人是当前人,因此使用启动并流程,可以直接流转到下一个环节
- 启动流程需要两个参数
- 流程编码:从流程定义中获取
- 业务数据主键值:从表单中获取
- 流程启动后返回任务 ID
- 获取后,存于表单中,可以用于流转、回退、显示流程图
示例代码如下
onStartAdvanceBtnClick = async (event) => {
let { data } = await this.comp("srequest0").send({
url: "https://租户 A 门户域名/wf/biz/process/startAdvance",
method: "POST",
data: {
"attributes": {
"sData1": this.comp("mainData").getCurrentRowID()
},
"process": "loan-flow"
}
})
this.task = data.data[0].task;
}
启动
流程需要启动,才能流转
- 启动流程需要两个参数
- 流程编码:从流程定义中获取
- 业务数据主键值:从表单中获取
- 流程启动后返回任务 ID
- 获取后,存于表单中,可以用于流转和显示流程图
示例代码如下
onStartBtnClick = async (event) => {
let { data } = await this.comp("srequest0").send({
url: "https://租户 A 门户域名/wf/biz/process/start",
method: "POST",
data: {
"attributes": {
"sData1": this.comp("mainData").getCurrentRowID()
},
"process": "loan-flow"
}
})
this.task = data.data[0].task;
}
流转
流转有两个 API
- 流转查询 API:不执行流转,只查询后续环节和处理人,返回 ProcessControl,修改 ProcessControl 可以作为流转 API 的参数
- 流转 API:
- 不指定 ProcessControl 时,流程引擎先计算 ProcessControl,然后根据 ProcessControl 执行流转
- 传入 ProcessControl,直接根据传入的 ProcessControl 执行流转
流转
- 至少需要一个参数:任务 ID,从我的待办中获取
- 同一个任务 ID,流转后,再流转,会提示“任务已被其他人处理”,因此一般情况下流转后会关闭页面
示例代码如下
onAdvanceBtnClick = async (event) => {
let { data } = await this.comp("srequest0").send({
url: "https://租户 A 门户域名/wf/biz/process/advance",
method: "POST",
data: {
"task": this.task || this.params.task
}
})
}
回退
回退有两个 API
- 回退查询 API:不执行回退,只查询前续环节和处理人,返回 ProcessControl,修改 ProcessControl 可以作为回退 API 的参数
- 回退 API:
- 不指定 ProcessControl 时,流程引擎先计算 ProcessControl,然后根据 ProcessControl 执行回退
- 传入 ProcessControl,直接根据传入的 ProcessControl 执行回退
回退
- 至少需要一个参数:任务 ID,从我的待办中获取
- 同一个任务 ID,回退后,再流转,会提示“任务已被其他人处理”,因此一般情况下回退后会关闭页面
示例代码如下
onBackBtnClick = async (event) => {
let { data } = await this.comp("srequest0").send({
url: "https://租户 A 门户域名/wf/biz/process/back",
method: "POST",
data: {
"task": this.task || this.params.task
}
})
}
查看流程图
查看流程图,可以直接打开流程引擎提供的流程图页面,使用自动登录平台并打开页面的方式,需要两个参数
- 任务 ID:从我的待办中获取
- 用户 token:参考《第三方自动登录并打开页面》中的获取用户 token
示例代码如下
onChartBtnClick = (event) => {
let token = "liyun@0FBjQ1Vpy43UPdBgHP2Ozw%2BwRcuClsCDEZENmUoNiew%3D";
let redirectUrl = "/wf/x5/UI2/SA/wf/dialog/chart.w?task="+(this.task || this.params.task)+"&_uuid=CAE063A1281000013AD6E6F214D5E270";
window.open("https://租户 A 门户域名/login?token="+token+"&redirectUrl="+encodeURIComponent(redirectUrl));
}
查询待办任务
查询待办任务返回 JSON 数组,其中
- id:任务 ID,用于流转、回退、查看流程图
- sName:任务标题
- sData1:业务数据主键值,用于过滤业务数据
- sEURL:表单 URL,用于打开表单,打开表单时,使用 sData1 过滤业务数据,才能显示正确的业务数据
在租户 B 中,添加静态数据集,调用查询待办任务 API 后,将返回的数据加载到数据集中,使用表格组件展示
示例代码如下
onQueryTaskBtnClick = async (event) => {
let {data} = await this.comp("srequest0").send({
url:"https://租户 A 门户域名/wf/biz/task/queryByOrg"
})
this.comp("taskData").loadData(data.data);
}
处理待办任务
在平台的我的待办中打开任务时,会调用“执行任务”,这一步是实现同一环境多人或签时,打开任务时抢占任务
- 如果需要打开时抢占,调用“执行任务”API,参考《任务 API》中的执行任务
- 如果可以使用处理时抢占,不需要调用“执行任务”API,系统会在处理任务时(流转、回退)时自动执行任务抢占
从我的待办任务列表中,打开某个待办任务的表单,至少传入三个参数
- sEURL:表单地址,用于打开表单
- sData1:业务主键值,用于表单上过滤业务数据
- id:任务 ID,用于执行流转、回退、查看流程图
示例代码如下
onOpenBtnClick = ({row}) => (event) => {
window.open(row.sEURL+"&rowid="+row.sData1+"&task="+row.id);
}
过滤业务数据
从我的待办中,打开待办任务的表单,传入业务数据主键值,使用这个主键值过滤业务数据
示例代码如下
onPageInitState = (event) => {
this.comp("mainData").setFilter("filter1",[{name:"fid",value:this.params.rowid,op:"eq"}]);
this.comp("mainData").refreshData();
}