AWS 流程事件开发参考指南

FORM_BEFORE_LOAD

表单构建前被触发

说明
抽象类 ExecuteListener
接口 ExecuteListenerInterface
返回值
异常 -如抛出异常时,异常被包装成结果返回,后继执行被中断

在表单加载前事件中,能够获取到BO表记录ID,可以查询业务数据,通过实现业务逻辑和用户结合,做出控制表单读、写,字段读、写的状态控制。

//获得当前表单数据源的BO表Id
String boId = ctx.getParameterOfString(ListenerConst.FORM_EVENT_PARAM_BOID);
//获得当前表单模型定义Id
String formDefId = ctx.getParameterOfString(ListenerConst.FORM_EVENT_PARAM_FORMID);

常见触发场景

1.用户打开表单时

场景:动态设置字段权限

ctx.addFormReadOnlyPolicy("BO表名");//针对该表设置一个只读策略,该表全部字段有效
ctx.addFormReadOnlyPolicy("BO表名", "字段名");//针对字段设置一个只读策略

ctx.addFormEditablePolicy("BO表名");//针对该表设置一个可编辑策略,该表全部字段有效
ctx.addFormEditablePolicy("BO表名", "字段名");//针对字段设置一个可编辑策略

ctx.addFormHiddenPolicy("BO表名", "字段名");//针对字段设置一个隐藏策略
ctx.addFormDisplayPolicy("BO表名", "字段名");//针对字段设置一个显示策略

ctx.addGridHiddenPolicy("BO表名", "字段名");//程序指定子表列的BO字段隐藏(优先级最高)。仅适用于人工节点的表单权限场景
ctx.addGridDisplayPolicy("BO表名", "字段名");//程序指定子表列的BO字段显示(优先级最高)。仅适用于人工节点的表单权限场景

ctx.addFormNotNullPolicy("BO表名", "字段名");//针对字段设置一个必填策略
ctx.addFormNullablePolicy("BO表名", "字段名");//针对字段设置一个可填策略

ctx.setFieldTitlePolicy("BO表名", "字段名", "新标题");//程序指定BO字段标题(优先级最高)。仅适用于人工节点的表单权限场景

ctx.addGridColumnPolicy("BO表名", List<String> gridColumnPolicy);//程序指定子表列头的字段信息(可控制显示顺序,优先级最高,高于子表列字段的显示隐藏策略)。仅适用于人工节点的表单权限场景

如果主表单被设置为只读,字段设置为可编辑,字段的优先级会高于表单的控制,这种情况下结果是:字段最终会可编辑。

字段权限在AWS各种策略中得优先次序

级别 描述
第1优先级 HTML 模板出现该字段标签[#字段名]
第2优先级 HTML 模板客户端 JS 硬代码处理(非常规)
第3优先级 表单加载前事件策略(字段级别),判断是否存在字段级的设置,
字段的设置,高于BO表级别的设置
第4优先级 表单加载前事件策略(BO表级别),判断安全策略中是否存在主表表名或者子表表名的策略,
如果存在,设置了true,即只读,则每个字段都只读
第5优先级 判断权限组的数据权限
第6优先级 表单应用中字段分级权限设置只读权限的
第7优先级 表单应用中设置了字段只读的
第8优先级 BO模型中字段是否允许编辑
第9优先级 表单应用中表单(主表和子表)是否可修改
第10优先级 表单动态规则中配置(主表和子表)是否可修改

注意

虽然代码的优先级高于表单应用中的配置,但是有一种场景不支持,即:
当表单应用中主/子表设置为不可编辑时,设置的该表可编辑,或者该表中某字段可编辑,将不起作用

场景:打开表单时,给用户提供一些信息

打开表单时,可针对该表单的业务数据,给用户展示一些信息,这些信息可以是的普通的提醒类消息,也可以是警告,或者错误的消息。通常这些消息仅展示一次,但又不想使用对话框的交互方式时,适用该场景

代码实现见开发示例一节

注意

这些消息在表单进行一次操作之后(如表单的保存),如果在其他事件中,没有新的消息的话,则会消失。如果FORM_COMPLETE_VALIDATEFORM_AFTER_SAVE事件中再次添加新的消息,这时表单会显示新的消息。

该场景仅适用以下事件

  • FORM_COMPLETE_VALIDATE
  • FORM_AFTER_SAVE
  • FORM_BEFORE_LOAD

场景:初始化表单BO数据

//插入数据
SDK.getBOAPI().create(boName, recordData, processInst, userContext)
//更新数据
SDK.getBOAPI().update(boName,recordData);

开发示例

package com.actionsoft.apps.poc.form.event;

import com.actionsoft.bpms.bpmn.engine.core.delegate.ProcessExecutionContext;
import com.actionsoft.bpms.bpmn.engine.listener.ExecuteListener;
import com.actionsoft.bpms.bpmn.engine.listener.ListenerConst;

public class TestFormBeforeLoad extends ExecuteListener {

    public void execute(ProcessExecutionContext ctx) throws Exception {
        //参数获取
        //注意:除特殊说明外,下列参数仅在该事件中场景有效
        //记录ID
        String boId = ctx.getParameterOfString(ListenerConst.FORM_EVENT_PARAM_BOID);
        //BO表记录,注意:该记录的数据如果被修改,将会体现到表单上,修改后不会直接持久化到数据库中
        BO boData = (BO) ctx.getParameter(ListenerConst.FORM_EVENT_PARAM_BODATA);
        // 可以为boData中的字段进行赋值
        if (boData == null) {
            boData = new BO();
            boData.set("PCNO", "123");
        } else {
            boData.set("PCNAME", "名称");
        }
        // 如果需要展示在表单上,需要调用如下代码。注意:此操作不会更新数据库中的数据
        // ctx.setParameter(ListenerConst.FORM_EVENT_PARAM_BODATA, boData);

        //表单ID
        String formId = ctx.getParameterOfString(ListenerConst.FORM_EVENT_PARAM_FORMID);
        //BO表名
        String boName = ctx.getParameterOfString(ListenerConst.FORM_EVENT_PARAM_BONAME);

        ctx.addFormReadOnlyPolicy("BO表名");//针对该表设置一个只读策略,该表全部字段有效
        ctx.addFormReadOnlyPolicy("BO表名", "字段名");//针对字段设置一个只读策略

        ctx.addFormEditablePolicy("BO表名");//针对该表设置一个可编辑策略,该表全部字段有效
        ctx.addFormEditablePolicy("BO表名", "字段名");//针对字段设置一个可编辑策略

        ctx.addFormHiddenPolicy("BO表名", "字段名");//针对字段设置一个隐藏策略
        ctx.addFormDisplayPolicy("BO表名", "字段名");//针对字段设置一个显示策略

        ctx.addGridHiddenPolicy("BO表名", "字段名");//程序指定子表列的BO字段隐藏(优先级最高)。仅适用于人工节点的表单权限场景
        ctx.addGridDisplayPolicy("BO表名", "字段名");//程序指定子表列的BO字段显示(优先级最高)。仅适用于人工节点的表单权限场景

        ctx.addFormNotNullPolicy("BO表名", "字段名");//针对字段设置一个必填策略
        ctx.addFormNullablePolicy("BO表名", "字段名");//针对字段设置一个可填策略

        ctx.setFieldTitlePolicy("BO表名", "字段名", "新标题");//程序指定BO字段标题(优先级最高)。仅适用于人工节点的表单权限场景

        List<String> gridColumnPolicy = new ArrayList<String>();// 定义一个字符串类型的List
        gridColumnPolicy.add("字段1");//将需要显示的字段,按照实际需求的顺序放入List
        gridColumnPolicy.add("字段3");
        gridColumnPolicy.add("字段5");
        gridColumnPolicy.add("字段2");
        gridColumnPolicy.add("字段4");
        gridColumnPolicy.add("字段6");
        //调用以下策略,子表将按照该策略,展示子表列的展示
        //ctx.addGridColumnPolicy("BO表名", gridColumnPolicy);//程序指定子表列头的字段信息(可控制显示顺序,优先级最高,高于子表列字段的显示隐藏策略)。仅适用于人工节点的表单权限场景

        //以下是表单横幅消息的示例代码,多条消息顺序按照添加的顺序展示
        //第一个参数是BO名称,第二个参数是消息内容,这是一个默认的消息
        ctx.addAlertMessage(boName, "测试横幅警告消息");
        ctx.addAlertMessage(boName, "第二个消息");
        ctx.addAlertMessageInfo(boName, "我是第三个提醒消息");//这是一个普通的消息
        ctx.addAlertMessageWarn(boName, "我是第四个警告消息");//这是一个警告的消息
        ctx.addAlertMessageError(boName, "我是第五个错误消息");//这是一个错误的消息
        //另外提供了自定义外观的消息,第三个参数指定背景色,第四个参数指定文字颜色
        ctx.addAlertMessage(boName, "消息", "bgColor", "fontColor");

    }
}

场景:事件中改变一个字段的UI组件

事件中,可以改变一个字段UI配置,来改变表单界面上展示的内容。

!!!注意!!!

代码中,一定要构造一个新的BOItemModel的模型,否则,直接修改Cache中获取的对象,会将原有模型修改掉。

//注意:一定要构造一个新的对象模型,否则会将原有的模型信息改掉
BOItemModel newT1 = new BOItemModel();
newT1.setModel(t1);

主要调用setComponentId方法和setComponentSetting方法

setComponentId的参数是一个常量,参考UIConstant类,注意常量名以NAME结尾的是名称,不是ID,**该ID仅 限平台注册的有效的AWSUI。

setComponentSetting的参数一个JSON字符串,可以通过一个已经的字段来获取这个配置信息,可新建一个临时字段,配置好UI的信息,调试代码将配置信息打印出来,然后获取配置内容,最后将该临时字段删除。

代码片段:

BOItemModel combobox = BOCache.getInstance().getBOItemModelByItemName(boModel, "COMBOBOX");
newT1.setComponentId(combobox.getComponentId());//必须设置
newT1.setComponentSetting(combobox.getComponentSetting());//这里通过一个已经存在的UI组件来获取这个配置信息

开发示例

package com.actionsoft.apps.poc.form.event;

import java.util.ArrayList;
import java.util.List;

import com.actionsoft.bpms.bo.design.cache.BOCache;
import com.actionsoft.bpms.bo.design.model.BOItemModel;
import com.actionsoft.bpms.bo.design.model.BOModel;
import com.actionsoft.bpms.bpmn.engine.core.delegate.ProcessExecutionContext;
import com.actionsoft.bpms.bpmn.engine.listener.ExecuteListener;
import com.actionsoft.bpms.bpmn.engine.listener.ListenerConst;

public class TestFormBeforeLoadChangeUI extends ExecuteListener {

    public String getDescription() {
        return "表单加载前事件改变一个字段的UI组件配置";
    }

    public String getProvider() {
        return "Actionsoft";
    }

    public String getVersion() {
        return "1.0";
    }

    public void execute(ProcessExecutionContext ctx) throws Exception {

        String boName = ctx.getParameterOfString(ListenerConst.FORM_EVENT_PARAM_BONAME);
        BOModel boModel = BOCache.getInstance().getModelByEntityName(boName);

        //获取当前BO表中T1这个字段的boItemModel对象,这里T1是假设是单行组件
        BOItemModel t1 = BOCache.getInstance().getBOItemModelByItemName(boModel, "T1");
        //注意:一定要构造一个新的对象模型,否则会将原有的模型信息改掉
        BOItemModel newT1 = new BOItemModel();
        newT1.setModel(t1);

        //获取当前BO表中COMBOBOX这个字段的boItemModel对象,这里COMBOBOX假设是列表组件
        BOItemModel combobox = BOCache.getInstance().getBOItemModelByItemName(boModel, "COMBOBOX");
        newT1.setComponentId(combobox.getComponentId());//必须设置
        newT1.setComponentSetting(combobox.getComponentSetting());//这里通过一个已经存在的UI组件来获取这个配置信息

        //将调整后的newT1这个对象放到一个list中,如果有多个字段按照上述方法分别处理后放入list,设置ctx的参数中
        List<BOItemModel> list = new ArrayList<>();
        list.add(newT1);
        ctx.setParameter(ListenerConst.FORM_EVENT_PARAM_CUSTOM_BOITEMMODEL, list);
    }
}


Seven
 010-62962343-690
 liujx@actionsoft.com.cn
感谢您对该文档的关注!如果您对当前页面内容有疑问或好的建议,请与我联系。如果您需要解答相关技术问题请登录AWS客户成功社区