在使用致远 OA 搭建表单时,各位同事可能会遇到一些标准公式无法实现的需求,比如跨明细表校验、提取文本字段中某种类型的数据(比如“费用化12138”需要将文本中的数字提取出来放在另一个文本或者数字控件上),亦或者需要判断这个文本是中文还是英文……诸如此类的需求。
有些朋友可能实现不了就止步于此,或者请求开发支援去了。
在小编刚接触这个系统时也只会使用标准公式,直到有一天项目上遇到了没办法配置的校验,有位前辈说其实致远开了个口子,也就是自定义函数,可以用脚本代码实现校验和计算,但很多实施不具备代码能力。碰巧小编大学学的软件工程,略懂 Java 和 Python,抱着琢磨琢磨的心态小试牛刀,从此打开新世界的大门。

不说废话,开始分享。后续小编遇到其他场景需要其他函数也会持续更新,记得关注。

目录
一、把文本中的数字拿出来,放到数字控件上
需求是把文本控件中的数字提取出来,放到一个数字控件上,文本和数字都得在主表或者都在明细上(一个主表一个明细这个函数用不了)。

效果:

def str = param[0]
if (str == null || str.toString().trim() == "") {
return 0
}
def matcher = (str.toString() =~ /\d+/)
def digits = ""
while (matcher.find()) {
digits += matcher.group()
}
if (digits == "") {
return 0
}
return digits.toLong()
原理就是取到文本类型参数,如果不为空则使用正则 =~ 匹配器,全局匹配连续数字 \d+,循环提取所有数字片段拼接。如果没有提取到数字返回0,否则把拼接后的数字字符串转长整型返回。这个函数因为返回值是整型类型,公式必须做在数字类型控件上。
二、去除网页复制的零宽非连接符
联行号等字段,客户可能去网页复制,网页数据可能存在零宽非连接符(它是一个看不见的格式控制字符,主要用于防止特定语言中的字符连写)比如网页复制招商银行某支行联行号:308100005344 ,实际数据是308100005344\u200c ,但表单上不显示。接口传输报文出错导致数据接收方校验报错。

解决方式
1.提示用户手动删除
加个文本字段,用来替换掉原数据零宽非连接符,以其他方式展示,然后做校验,如果用户输入数据和这个函数结果不一致,提示用户修改。
def bankNo = param[0]
if (bankNo.contains("\u200c")) {
/*将文本里的\200c替换为[ZWSP],后再配置校验去校验原数据和原数据全两个字段是否一致*/
return bankNo.replaceAll(/\u200c/, "【ZWSP】")
}
return bankNo
结果:

2.直接用函数去除零宽非连接符和多余数据
联行号全为数字格式,不存在其他字符,可以直接去除掉除了数字外的其他一切字符
def bankNo = param[0]
if (!bankNo) {
return ""
}
String temp = bankNo.replaceAll(/\u200c/, "")
String cleanNo = temp.replaceAll(/[^0-9]/, "")
return cleanNo
方式2的计算公式会修改用户填写数据,建议配合方式1使用,弱校验提示用户系统修改了数据。
三、判断这个文本输入的是中文还是英文
一张涉及国际公司使用的表单,需要判断某字段是中文还是英文,需求中中文和英文是不混用的,所以可以判断出来。小编在此基础上增加了混合判断和数字判断,可以参考下面返回值表格。

def str = param[0]
// 空值、空白直接返回0
if (!str?.trim()) {
return "empty" // 统一返回字符串,避免类型混乱
}
String text = str.toString()
// 判断是否存在中文
boolean hasChinese = (text =~ /[\u4e00-\u9fa5]/).find()
// 判断是否存在英文字母
boolean hasEnglish = (text =~ /[a-zA-Z]/).find()
if (hasChinese && hasEnglish) {
return "mix"
} else if (hasChinese) {
return "chinese"
} else {
return "english"
}
\u4e00 是 Unicode 编码,汉字或者字母介于一个范围之内,所以用正则判断输入的字符每个值是不是都在这个范围内,即可判断出是中文还是英文,或者是混合类型。
测试用例:
| 参数值 | 返回 |
| (空) | empty |
| 你好 world | mix |
| 今天天气很好 | chinese |
| Hello SpringBoot | english |
| 123456 | english |
| 测试 123abc | mix |
四、明细表去重拼接自定义函数
需要在主表上展示明细行某一列出现了哪些数据,如果直接在主表加字段给公式等于明细,会出现重复数据,这个函数可以去重后输出。后续很多明细表校验都会用到这个函数。
比如下面这个表,需要统计物料明细中出现哪些物料名称

def data = param[0];
String res = "";
res=data.unique();
return res.replace('[', '').replace(']', '').replace(', ', '、').trim();
参数直接选明细字段就行,效果如下:

五、明细某个字段不能为空
这个需求有点扯淡,场景是和外部系统对接时候,明细表上某个文本字段双方约定都不能为空,咱们这边实施配置操作权限不能为空,实际业务使用中用户不知道这个字段该填啥,反手打了个空格上去,离谱的是校验就给跳过去了。。。开发老师一顿吵吵,做不了。本以为这类误操作基本不会出现,然鹅后续又出现好几单。无奈之下有了这个函数。
这是一个组合函数,参数用到上一点的 明细表去重拼接自定义函数,原理是组合后的数据都是A、B、C、D 这样格式的文本,如果中间有一个空格,则输出是A、B、 、D 同样也是空格。只需要使用字符串的 trim()方法,去除空格后按、组成列表,再校验每一项是否为空即可
def data = param[0]
/* 2. 校验1:字符串以顿号开头/结尾(证明第一行或最后一行为空格) → 直接返回2(不通过)*/
if (data.startsWith('、') || data.endsWith('、')) {
return 2
}
// 3. 校验2:包含顿号的情况(说明不止一行)
if (data.contains('、')) {
// 按顿号分割成列表
def list = data.split('、').toList()
// 检查分割后的元素是否有空白/空值(trim后为空)
def hasEmptyOrWhitespace = list.any { it.trim().isEmpty() }
// 有空白/空值返回2,否则返回1
return hasEmptyOrWhitespace ? 2 : 1
} else {
// 4. 校验3:无顿号的情况(一行数据) → 字符串trim后为空返回2,否则返回1
return data.trim().isEmpty() ? 2 : 1
}
注意各类情况,开头为空,结尾为空等特殊情况。
本次给大家分享五个函数,小编下班回家睡觉了。如果有解决不了得场景,记得关注并留言哦

420



被折叠的 条评论
为什么被折叠?



