工作流集成

工作流集成是指第三方表单使用平台流程引擎实现流转、回退等功能

  • 平台流程引擎提供《流程动作 API》和《任务 API》给第三方调用,实现启动流程、流转、回退、查询待办任务等功能
  • 流程处理人,需要使用平台中的组织用户,即第三方系统和平台需要组织同步,参考《组织同步
  • 流程中选择后续环节和处理人的流程确认对话框,在第三方界面中不能使用,需要自行开发,参考《自定义流程页面》中的流转确认页面的说明
  • 显示流程图的页面,在第三方可以直接打开,参考《第三方自动登录并打开页面

下面通过一个案例,介绍工作流集成的方法

案例说明

鉴于流程确认对话框需要自行开发,本例在流转和回退时,不弹出流程确认对话框,处理人在流程图中通过表达式指定

  • 不能使用“获取表单数据”的函数,因为平台通过 DBRest 访问表单数据
  • 可以使用“组织函数、流程函数”指定处理人
  • 可以使用“通过 url 获取值”函数,调用 API 指定处理人,参考《流程函数
  • 可以在 ProcessControl 中指定处理人,参考《按数据顺序处理(工序排程)》中的设置审批人

在平台中,使用两个租户,租户 A 作为流程引擎,租户 B 模拟第三方系统

  • 租户 A:包括企业门户、企业工作流两个应用
  • 租户 B:创建企业应用,添加两个页面
    • 页面一:我的待办,显示我的待办,打开表单页面
    • 页面二:表单页面,实现启动、流转、回退、显示流程图
    • 页面中使用高级网络请求组件,实现跨域访问,相当于调用后端服务,在服务中执行跨域请求

页面一

1725009731977

页面二

1725009786485

添加流程

在租户 A 中,打开“企业门户-系统管理-工作流管理-流程定义”,新增一个流程

1724931377776

设计流程图、输入流程编码、流程名称、表单地址。其中表单地址是第三方系统的页面,以 http 或 https 开头,如下图所示

1724931412646

由于本例,不弹出流程确认对话框,因此除首环节外,其余环节的处理人必填

1724931433808

登录平台

流程提供的 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
            }
        })
    }

查看流程图

查看流程图,可以直接打开流程引擎提供的流程图页面,使用自动登录平台并打开页面的方式,需要两个参数

示例代码如下

    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 后,将返回的数据加载到数据集中,使用表格组件展示

1724931263756

示例代码如下

    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();
    }

results matching ""

    No results matching ""