表达式函数自定义

栏目:云苍穹知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

表达式函数自定义

变更记录


产品版本
更新内容更新日期
V6.0.1
初始版本2023年10月09日


1 简介

1.1 功能介绍

表达式中的函数使我们无需通过代码,就能实现简单的业务逻辑编写,平台已经预置大量通用函数与业务相关的函数,但无法覆盖所有应用场景,本功能提供自定义函数功能,帮助客户沉淀在特定领域可复用的函数。



1.2 应用场景

用户可在苍穹里自定义函数,函数可通用在界面规则、业务规则、校验规则、转换规则中。


1.3 系统路径

【开发服务云】-【新版开发平台-【模型扩展-规则-函数定义

2 主要操作

2.1 新建自定义函数

前提条件

有相关授权

操作步骤

步骤1: 进入菜单,点击新增按钮

步骤2:维护相关字段,点击保存。


界面字段说明:

1)默认表达式:

用户在函数树上,双击函数时,会把函数的【默认表达式】,插入到计算公式中。 因此,函数的默认表达式需要填写函数的完整表达式内容,包括函数名、括号、参数。 参考格式:函数名称(参数1, 参数2,...)  例如:if(condition, true_val, false_val)

2返回值类型:

定义函数返回值类型,如返回值:Object

3函数运行类

函数的完整执行类名,函数执行类,必须实现BOSUDFunction接口,后续章节说明如何编写函数执行类。

4参数配置界面

选择函数的参数配置界面,此界面一般可由动态表单开发获取。如不需要配置参数,可空。

如:

5函数适用范围

苍穹有多种场景支持表达式和函数,不同场景运行上下文不同,函数不能通用。 如果自定义的函数运算只依赖于传入的参数,可选择函数适用范围为“通用函数”,例如四设五入函数Round(d, i),只对传入参数做运算,是通用函数; 如果函数运算需主动到上下文中取单据信息,请选择适用范围为"单据函数"。例如是否下推函数IsPush(),没传入参数,需运行时反向到上下文中取当前单据信息,只能在单据上运行,是单据函数。

6函数使用说明

函数使用说明会显示在表达式配置界面,指导用户正确使用函数。请填写函数的用途及各参数的含义,参考格式: 1. 函数描述:xxx; 2. 函数格式:xxx; 3. 函数参数:xxx; 4. 示例:xxx;

如:

7显示顺序

函数在函数配置单据中,左树的显示排序位置。

8使用状态

已禁用的函数不会出现在函数树中,但已经用到此函数的表达式还能够正常运行。

9已废弃

已废弃的函数不会出现在函数树中,但已经用到此函数的表达式还能够正常运行。如有预置的函数需要禁止使用,请维护升级脚本更新此字段值为1。不要删除已发布的函数,会导致已配置的表达式运行中断。

10系统预置

系统预置的函数不允许被删除,出厂预置的函数请在预插SQL脚本中手工调整此字段值为1。



2.2 执行类编写与参数界面新建

1实现函数执行类函数的执行类,必须实现接口 BOSUDFunction,接口方法介绍如下:
getName : 输出函数名,必须与资源文件中的定义一致
getInstance:系统在执行函数前,调用此方法,创建函数执行类,传入单据转换上下文对象;
call:执行函数,传入函数的参数值
2实现函数配置界面如果函数的执行参数比较多,用户配置比较复杂,可以定义配置界面。如果函数非常简单,不需要执行参数,可以不用实现参数配置界面,略过本节。
基于动态表单界面 bos_functionparameter,设计自定义函数的参数配置界面
派生AbstractFuncParamPlugIn,实现参数配置界面插件
把函数参数配置界面FormId,填写到函数资源文件中,属性名为SettingFormId;

示例:界面bos_func_getsysparam,插件kd.bos.designer.func.GetSysParamPlugIn


3举例说明

以获取月份函数为例:

3.1)参数配置界面:bos_func_getmonth

3.2) 参数配置界面的插件:GetMonthPlugin

package kd.bos.designer.func;
import kd.bos.dataentity.resource.ResManager;

import kd.bos.dataentity.utils.StringUtils;
import kd.bos.form.func.AbstractFuncParamPlugIn;

/**
 * 获取时间的月份
 * @author rd_sort_oyang
 
 */
public class GetMonthPlugin extends AbstractFuncParamPlugIn {
    
    private static final String KEY_DATETIME = "datetime";
    
    @Override
    public Boolean checkSetting(StringBuilder msgBuilder) {
        String dateTimeString = (String)this.getModel().getValue(KEY_DATETIME);
        if (StringUtils.isBlank(dateTimeString)){
            msgBuilder.append(ResManager.loadKDString("请填写参数项。", "GetMonthPlugin_0", "bos-designer-plugin"));
            return false;
        }
        return true;
    }
    
    /**
     * 输出函数配置
     */
    @Override
    public String getSetting() {
        String dateTimeString = (String)this.getModel().getValue(KEY_DATETIME);
        return String.format("%s('%s')", this.getFuncId(),  dateTimeString);
    }
}

3.3)函数执行类:MyFunc

package kd.bos.newdevportal.domaindefine.sample.function;

import kd.bos.entity.formula.BOSExpressionContext;
import kd.bos.entity.formula.ExpressionContext;
import kd.bos.entity.function.BOSUDFunction;

/**
 * 自定义函数示例:取当前单据实体标识
 */
public class MyFunc implements BOSUDFunction {
    private BOSExpressionContext expContext;   // 函数运行上下文对象,内含单据数据包等上下文信息

    /**
     * 返回函数名称:可以和类名不同,但须和函数编码保持一致(增加开发商前缀),表达式中以此为函数名
     *
     * @return
     */
    @Override
    public String getName() {
        return "kdtest_MyFunc";
    }

    /**
     * 传入函数上下文,创建函数执行实例
     *
     * 如果函数执行需要依赖上下文对象,可在构造函数执行实例时,传入上下文对象,然后在call方法内就可以调用上下文对象
     *
     * @param expContext 函数执行上下文对象,基于此获取函数隐含的参数值
     * @return 返回本对象的实例
     */
    @Override
    public BOSUDFunction getInstance(ExpressionContext expContext) {
        return new MyFunc(expContext);
    }

    /**
     * 不带参数的构造函数:必须提供
     */
    public MyFunc() {
    }

    /**
     * 带参数的构造函数:可选
     *
     * @param expContext 函数运行上下文对象
     */
    public MyFunc(ExpressionContext expContext) {
        this.expContext = (BOSExpressionContext)expContext;
    }

    /**
     * 传入执行参数,执行函数
     *
     * @param objects 参数
     * @return 返回执行结果
     */
    @Override
    public Object call(Object... objects) {
        // 从执行上下文中获取当前主实体,返回其名称
        return this.expContext.getRowDataModel().getMainEntityType().getName();
    }
}


4、函数的使用

配置好的函数,我们可以进入开发平台设计器进行测试运用。

点击业务规则,进行函数配置,可以看到自定义函数会统一放置在扩展函数节点下。

选择函数,配置参数点击确认后,这时在调用表达式中出现该函数。


表达式函数自定义

变更记录产品版本更新内容更新日期V6.0.1 初始版本2023年10月09日1 简介1.1 功能介绍表达式中的函数使我们无需通过代码,就能实现简单的...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息