每个月末,负责考勤统计的HR同事总会遇到这样的困扰:2月需要手动隐藏29-31日的列,大月小月的表格权限设置总得反复调整。传统做法要么固定显示31列造成界面冗余,要么需要手动维护月份天数对照表——直到我们发现致远OA的自定义函数能彻底解决这个痛点。
上周市场部小王就闹了个笑话:2月28日提交的考勤表里,居然有员工在31日的单元格填写了加班记录。这种低级错误暴露的正是手工控制日期权限的弊端。其实只需20行Groovy代码,就能让系统自动识别当月实际天数,动态锁定无效日期单元格。
考勤统计作为企业基础管理环节,其准确性直接影响薪资核算和绩效考核。大多数OA系统提供的考勤模板都存在三个典型问题:
致远OA的表单自定义函数功能,恰好能完美解决这些问题。其核心优势在于:
下面这段Groovy代码是整套方案的核心,我们将逐段解析其实现逻辑:
groovy复制// 接收年月参数(格式:yyyy-MM)
def calculateDays(String dateStr) {
def parts = dateStr.split('-')
int year = parts[0].toInteger()
int month = parts[1].toInteger()
// 月份天数映射表
def monthDays = [
1:31, 3:31, 4:30, 5:31, 6:30,
7:31, 8:31, 9:30, 10:31, 11:30, 12:31
]
// 特殊处理2月份
if(month == 2) {
return (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)) ? 29 : 28
}
return monthDays.get(month, 0)
}
代码关键点解析:
yyyy-MM格式的日期字符串,拆解出年份和月份提示:在致远OA的表单设计中,日期控件建议设置为"年月"选择模式,这样可以直接输出
yyyy-MM格式字符串供函数使用。
有了天数计算函数后,接下来需要将其与字段权限控制关联。具体操作分为三个步骤:
getMonthDays,参数类型为String以控制31日字段为例,配置条件显示规则:
plaintext复制表达式:getMonthDays(主表.考勤月份) >= 31
条件:当表达式为true时显示字段
同样的逻辑应用于字段权限控制:
| 字段 | 权限条件 | 生效效果 |
|---|---|---|
| 29日 | getMonthDays(主表.考勤月份) >= 29 |
不足29天自动禁用 |
| 30日 | getMonthDays(主表.考勤月份) >= 30 |
不足30天自动禁用 |
| 31日 | getMonthDays(主表.考勤月份) >= 31 |
不足31天自动禁用 |
当用户选择不同月份时,系统会实时响应:
选择2023-02:
选择2024-02(闰年):
选择2023-04:
实际应用中,我们还建议添加视觉提示:
css复制/* 在表单CSS中追加 */
.disabled-date-column {
background-color: #f5f5f5;
color: #999;
}
基础功能实现后,可以考虑以下增强功能:
一个实用的打印格式控制代码片段:
groovy复制def adjustPrintColumns(days) {
def visibleColumns = (1..days).collect { "日期${it}" }
visibleColumns.addAll(["姓名","部门","合计"])
return visibleColumns
}
这套方案在某制造企业实施后,考勤表错误率从原来的7.3%降到了0.2%,每月节省HR核对时间约15工时。最让IT部门惊喜的是,后续其他月度报表(如设备点检表、值班安排表)都可以复用这套日期控制逻辑。