Dell Boomi/Groovy计算7月1日起始的YTD工时方案咨询
财年YTD工时累计计算实现思路
前置数据处理规则
- 给所有工时数据打财年标签:判断每条数据的业务日期,若月份≥7,财年为「当前年份+1」,否则为当前年份。例:2023-08-05、2024-06-20均属于2024财年,2024-07-02属于2025财年,以此实现同一财年数据自动归集。
- 按「人员ID+财年」作为分组主键,对同一分组内数据按业务日期升序排序,保证工时累加时序正确。
方案1:自定义映射函数实现
- 配置带持久化缓存的自定义函数,入参设为
人员ID、业务日期、当前记录工时,出参为累计YTD工时 - 函数内部逻辑:
- 按上述财年规则计算当前记录对应财年
- 读取缓存中
人员ID_财年对应的累计值,若缓存为空(即当前财年第一条数据,7月1日之后的首条记录),直接将当前工时作为累计值存入缓存并返回 - 若缓存存在值,将缓存值+当前工时,更新缓存后返回新的累计值
- 注意:映射执行完成后需清空缓存,避免不同集成运行实例的数据串扰。
方案2:Groovy脚本实现(灵活度更高,适合复杂规则扩展)
无需依赖Boomi缓存组件,所有计算逻辑在脚本内闭环,自动按财年重置累计基数,参考代码片段如下:
import java.util.Calendar import java.text.SimpleDateFormat def dateFormatter = new SimpleDateFormat("yyyy-MM-dd") // 存储各人员对应财年的累计工时缓存 def ytdAccumulateCache = [:] def outputList = [] // inputList为拉取的全量工时数据集合,每条数据需包含业务日期、人员ID、单条工时三个核心字段 inputList.each { record -> def bizDate = dateFormatter.parse(record.bizDate) int year = bizDate[Calendar.YEAR] int month = bizDate[Calendar.MONTH] + 1 // Calendar原生月份从0开始,需补1 // 计算归属财年 int fiscalYear = month >= 7 ? year + 1 : year def cacheKey = "${record.userId}_${fiscalYear}" // 累计逻辑,新财年自动从0开始计算 if(!ytdAccumulateCache.containsKey(cacheKey)){ ytdAccumulateCache[cacheKey] = 0 } ytdAccumulateCache[cacheKey] += record.workHours record.ytdWorkHours = ytdAccumulateCache[cacheKey] outputList.add(record) } // outputList可直接传给后续节点处理

内容的提问来源于stack exchange,提问作者Steven Rivera
相关产品推荐
相关产品推荐

