You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dell Boomi/Groovy计算7月1日起始的YTD工时方案咨询

财年YTD工时累计计算实现思路

前置数据处理规则

  • 给所有工时数据打财年标签:判断每条数据的业务日期,若月份≥7,财年为「当前年份+1」,否则为当前年份。例:2023-08-05、2024-06-20均属于2024财年,2024-07-02属于2025财年,以此实现同一财年数据自动归集。
  • 按「人员ID+财年」作为分组主键,对同一分组内数据按业务日期升序排序,保证工时累加时序正确。

方案1:自定义映射函数实现

  • 配置带持久化缓存的自定义函数,入参设为人员ID、业务日期、当前记录工时,出参为累计YTD工时
  • 函数内部逻辑:
    1. 按上述财年规则计算当前记录对应财年
    2. 读取缓存中人员ID_财年对应的累计值,若缓存为空(即当前财年第一条数据,7月1日之后的首条记录),直接将当前工时作为累计值存入缓存并返回
    3. 若缓存存在值,将缓存值+当前工时,更新缓存后返回新的累计值
  • 注意:映射执行完成后需清空缓存,避免不同集成运行实例的数据串扰。

方案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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 18:27:01