基于Foundry函数支持列计算滚动3个月的月度发动机平均工时
问题描述
我拥有一个包含Engine#、Date Recorded、Hours属性的“Engine Hours”对象集,数据如下:
| 发动机编号 | 记录日期 | 工时 |
|---|---|---|
| ABC123 | 2024年1月21日 | 9,171 |
| ABC123 | 2023年12月13日 | 9,009 |
| ABC123 | 2023年10月6日 | 8,936 |
| XYZ456 | 2024年1月8日 | 5,543 |
| XYZ456 | 2023年11月1日 | 4,998 |
| XYZ456 | 2023年10月10日 | 4,002 |
我还有一个独立的“Engine”对象集,已在Workshop的对象表中通过“Linked Objects/Aggregations”列,对“Engine Hours”的“Hours”属性执行Maximum聚合,展示各发动机的最新测量工时,结果如下:
| 发动机编号 | 记录日期 | 最新工时 |
|---|---|---|
| ABC123 | 2024年1月21日 | 9,171 |
| XYZ456 | 2024年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
相关产品推荐
相关产品推荐

