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

基于Foundry函数支持列计算滚动3个月的月度发动机平均工时

问题描述

我拥有一个包含Engine#、Date Recorded、Hours属性的“Engine Hours”对象集,数据如下:

发动机编号记录日期工时
ABC1232024年1月21日9,171
ABC1232023年12月13日9,009
ABC1232023年10月6日8,936
XYZ4562024年1月8日5,543
XYZ4562023年11月1日4,998
XYZ4562023年10月10日4,002

我还有一个独立的“Engine”对象集,已在Workshop的对象表中通过“Linked Objects/Aggregations”列,对“Engine Hours”的“Hours”属性执行Maximum聚合,展示各发动机的最新测量工时,结果如下:

发动机编号记录日期最新工时
ABC1232024年1月21日9,171
XYZ4562024年1月8日5,543

但我还需要一列来展示滚动3个月的月度平均使用工时。我查阅了所有Palantir学习资源,认为这需要用到Function-Backed Column,但我没有TypeScript编程基础,也未找到类似代码示例,请问是否有可参考的同类Function-Backed Column模板?


解决方案:Function-Backed Column 模板

以下是适配需求的TypeScript模板,代码内附详细注释说明每个步骤:

// 导入Foundry SDK核心模块
import { Objects, Dates, Numbers } from "@foundry/functions-api";

// 定义计算函数,接收当前Engine对象作为参数
export function calculateRolling3MonthAverageHours(engine: Objects.Object): number | null {
    // 1. 获取当前发动机关联的所有工时记录,按日期降序排列
    const engineHoursRecords = Objects.search()
        .objectType("Engine Hours") // 替换为你的Engine Hours对象集实际名称
        .where(o => o.getRelation("engine").equals(engine)) // 替换为关联Engine对象的关系属性名
        .sortByDescending(o => o.getValue("dateRecorded")) // 替换为你的记录日期属性名(需为Date类型)
        .all();

    if (engineHoursRecords.length < 2) {
        // 记录少于2条无法计算差值,返回null
        return null;
    }

    // 2. 转换记录格式:清理工时数值(去除千分位逗号)并提取日期
    const processedRecords = engineHoursRecords.map(record => ({
        date: record.getValue<Date>("dateRecorded"),
        hours: Numbers.parseNumber(record.getValue<string>("hours").replace(",", "")) // 替换为你的工时属性名
    }));

    // 3. 确定滚动3个月的时间范围
    const latestDate = processedRecords[0].date;
    const threeMonthsAgo = Dates.addMonths(latestDate, -3);

    // 4. 筛选出时间范围内的记录
    const recentRecords = processedRecords.filter(record => 
        Dates.isAfterOrEqual(record.date, threeMonthsAgo)
    );

    if (recentRecords.length < 2) {
        return null;
    }

    // 5. 计算相邻记录的月度平均工时并汇总
    let totalMonthlyUsage = 0;
    let validIntervals = 0;

    for (let i = 0; i < recentRecords.length - 1; i++) {
        const current = recentRecords[i];
        const previous = recentRecords[i + 1];
        
        // 计算两个记录的月份间隔
        const monthDiff = Dates.getMonthDifference(current.date, previous.date);
        if (monthDiff <= 0) continue;
        
        // 计算工时差值
        const hoursDiff = current.hours - previous.hours;
        if (hoursDiff <= 0) continue; // 跳过工时异常减少的记录
        
        // 累加该时间段的月度平均工时
        totalMonthlyUsage += hoursDiff / monthDiff;
        validIntervals++;
    }

    if (validIntervals === 0) {
        return null;
    }

    // 6. 返回最终平均结果,保留两位小数
    return Numbers.round(totalMonthlyUsage / validIntervals, 2);
}

使用提示

  • 替换代码中标注的占位符为你实际的对象集名称、属性名
  • 若记录不足或数据异常(如工时倒退),函数会返回null,可在Workshop中设置空值显示文案
  • 函数逻辑:先筛选最近3个月的记录,计算相邻记录间的月度平均工时,再取这些平均值的整体均值

内容的提问来源于stack exchange,提问作者Liam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 22:27:38