表达式函数自定义
变更记录
产品版本 | 更新内容 | 更新日期 |
V6.0.1 | 初始版本 | 2023年10月09日 |
1 简介
1.1 功能介绍
表达式中的函数使我们无需通过代码,就能实现简单的业务逻辑编写,平台已经预置大量通用函数与业务相关的函数,但无法覆盖所有应用场景,本功能提供自定义函数功能,帮助客户沉淀在特定领域可复用的函数。
1.2 应用场景
用户可在苍穹里自定义函数,函数可通用在界面规则、业务规则、校验规则、转换规则中。
1.3 系统路径
2 主要操作
2.1 新建自定义函数
前提条件
有相关授权
操作步骤
步骤1: 进入菜单,点击新增按钮
步骤2:维护相关字段,点击保存。
界面字段说明:
用户在函数树上,双击函数时,会把函数的【默认表达式】,插入到计算公式中。 因此,函数的默认表达式需要填写函数的完整表达式内容,包括函数名、括号、参数。 参考格式:函数名称(参数1, 参数2,...) 例如:if(condition, true_val, false_val)
定义函数返回值类型,如返回值:Object
函数的完整执行类名,函数执行类,必须实现BOSUDFunction接口,后续章节说明如何编写函数执行类。
选择函数的参数配置界面,此界面一般可由动态表单开发获取。如不需要配置参数,可空。
如:
苍穹有多种场景支持表达式和函数,不同场景运行上下文不同,函数不能通用。 如果自定义的函数运算只依赖于传入的参数,可选择函数适用范围为“通用函数”,例如四设五入函数Round(d, i),只对传入参数做运算,是通用函数; 如果函数运算需主动到上下文中取单据信息,请选择适用范围为"单据函数"。例如是否下推函数IsPush(),没传入参数,需运行时反向到上下文中取当前单据信息,只能在单据上运行,是单据函数。
函数使用说明会显示在表达式配置界面,指导用户正确使用函数。请填写函数的用途及各参数的含义,参考格式: 1. 函数描述:xxx; 2. 函数格式:xxx; 3. 函数参数:xxx; 4. 示例:xxx;
如:
函数在函数配置单据中,左树的显示排序位置。
已禁用的函数不会出现在函数树中,但已经用到此函数的表达式还能够正常运行。
9)已废弃
已废弃的函数不会出现在函数树中,但已经用到此函数的表达式还能够正常运行。如有预置的函数需要禁止使用,请维护升级脚本更新此字段值为1。不要删除已发布的函数,会导致已配置的表达式运行中断。
10)系统预置
系统预置的函数不允许被删除,出厂预置的函数请在预插SQL脚本中手工调整此字段值为1。
2.2 执行类编写与参数界面新建
示例:界面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、函数的使用
点击业务规则,进行函数配置,可以看到自定义函数会统一放置在扩展函数节点下。
选择函数,配置参数点击确认后,这时在调用表达式中出现该函数。
表达式函数自定义
本文2024-09-23 00:28:43发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-139720.html