目前平台里可以自己写函数,把那些平台自带算不来的业务逻辑接上去,直接在表单、规则、服务编排里用。用完不用再找开发改系统,也不用天天催厂商,这一点对业务人来说挺实在的。

这话一句话把好处说清了,接下来讲讲怎么玩,怎么做稳当点,不踩雷。简单来说,你在表单里想把某个字段自动算出来,就把那段计算逻辑写成一个函数,保存到系统里,更新缓存后就能在公式里选用了。举个常见的例子,预算里“预计金额”字段,往往就是单价乘数量,这个乘法就能写成一个函数,字段绑定它,表单里一填单价和数量,金额就自动冒出来,不用人去算也不易出错。
底层实现上,平台里函数是用groovy写的,groovy能直接拿Java类库来用,这点很方便。你有现成的工具类,直接import进来复用,复杂的校验、格式化、数值运算啥的,别在函数体里把所有逻辑堆一堆,能复用就复用,既干净又稳当。

函数在系统里有固定的存储位置,数据库库名是 jvs-design,表名是 jvs_function_base。每条函数记录里要填一堆字段,得按规矩来填,系统才认。常见字段和含义说清楚点:name是函数名,得和你在代码里定义的方法名一模一样;type决定函数在界面里归哪类分组;info是说明,右侧协助区会展示,提议写点HTML或文字,解释参数和返回值,别偷懒;param_count是参数个数,要和函数体里声明的参数数一致;dynamic_param表明是否支持可变参数,0代表固定参数(那param_count不能是0),1代表动态参数(这时把param_count写成0);enable_cache一般设成1,表明走缓存;jvs_param_type提议都写any,传值不会被平台类型校验卡住。
参数数量和可变参数这块常有疑惑,举两个常见场景比较好理解。普通函数需要固定两个参数,那就把param_count写成2,dynamic_param写0。另一种场景是求和、拼接这种,不知道会传几个值的,就把param_count设为0,dynamic_param改成1,函数体里用可变参数去处理,灵活又好用。

写完函数保存后,有个关键步骤不能忘:去“运维设置”里点一次更新缓存,让新加的函数被系统加载。许多人卡壳就是忘了这步,公式编辑里找半天找不到新函数,实则就是没刷新缓存。这一步别省。
函数体能写纯groovy代码,也能在开头import你需要的工具类。举几个例子更直观。做个截取字符串的简单示例,可以写成:def LEFT_STR(s, n) { return s.take(n) }。再列如想用已有工具类判断两个对象是否相等,可以import
cn.hutool.core.util.ObjectUtil,然后写:def EQ_OBJ(a, b) { return ObjectUtil.equals(a, b) }。工具类能让逻辑清楚、健壮,尤其是已有库里有常用判断、格式化、数值计算这些,复用率高,写起来省心省力。

再举个动态参数的实用例子,做个通用求和函数,能接任意个数的值,并把字符串类型转换成数值再相加。代码思路是:import
cn.hutool.core.util.NumberUtil;def SUM_ALL(...items) { Number total = 0; for (int i = 0; i < items.size(); i++) { if (items[i] instanceof String) { items[i] = NumberUtil.parseNumber(items[i]); } total = NumberUtil.add((Number) items[i], (Number) total); } return total; }。把它保存后,param_count写0,dynamic_param设1,就能在公式里传任意数量的参数进来求和。
使用时还有些容易忽略的小细节,常常导致出错的几点要记牢:函数名在平台里要唯一,而且代码里的方法名要和name字段完全匹配,名字错一个字母就报错;参数类型提议都用any,避免运行时被平台类型检查给卡住;写info说明最好把入参和返回值写清楚,能省去同事问来问去的麻烦;enable_cache大多数场景设1有利于性能,但如果你的函数依赖外部频繁变化的状态,缓存可能造成数据滞后,这种情况要思考不走缓存或设计合理的失效策略。

常见错误还包括忘了import工具类、函数名字拼错、param_count写错、或者没更新缓存。碰到错误时看日志一般能定位问题,对照方法名、参数个数和类型,基本能把问题找出来。调试时提议先在本地把逻辑用groovy或Java工具类写好并测试通过,再把代码粘到平台里,这样能少走弯路。
最后给点实操上的提议,方便上手:开发过程中把常用工具函数抽成一个库,测试好后在函数里直接调用;写函数描述时把示例写清楚,告知别人怎么传参、会返回什么类型;新加函数后记得去“运维设置”刷新缓存;如果函数依赖外部资源或状态频繁变动,思考把enable_cache改成不走缓存或设计缓存失效逻辑。平台上有在线demo可以试,地址是 https://app.bctools.cn,底层框架是开源的,源码放在 Gitee,路径是
https://gitee.com/software-minister/jvs,想深入了解加载、缓存和调用链路的原理,去看源码会更清楚。
