ESRI Collector应用工单开放天数指标Arcade表达式编写问题
你当前的表达式属于单要素计算逻辑,运行时只会传入当前单个工单的created_at值,Max()、Mean()对单个数值计算只能返回数值本身,自然无法实现全表2万条数据的聚合统计。
方案1:服务端预聚合(性能最优,推荐2万行量级使用)
- 发布工单要素服务时,在ArcGIS Online/Enterprise后台开启要素服务的统计能力,提前预计算开放工单的最大天数、平均天数,Collector指示器直接调用预聚合结果,无需前端遍历计算,加载无延迟。
- 也可在源数据表新增计算字段:先新增
开放天数字段,用数据库定时任务每日更新全量工单的开放天数,再新增配置表存储全局最大值、平均值,指示器直接读取配置表的两个字段即可。
方案2:Arcade全表统计写法(无需修改数据源)
如果无法调整后端服务配置,可改用以下Arcade表达式,直接拉取全量要素做聚合计算:
// 替换为你的工单图层实际名称,第三个参数仅指定加载created_at字段,大幅降低数据传输量 var all_tickets = FeatureSetByName($map, "工单图层", ["created_at"], false) var today = Now() // 可选:如果有工单状态字段,过滤掉已关闭的工单,减少计算量 // all_tickets = Filter(all_tickets, "ticket_status = '开放'") // 一次性聚合计算最大值、平均值 var aggregate_stats = GroupBy(all_tickets, [], [ {name: "max_open_days", expression: DateDiff(today, $feature.created_at, "days"), statistic: "MAX"}, {name: "avg_open_days", expression: DateDiff(today, $feature.created_at, "days"), statistic: "MEAN"} ]) var stat = First(aggregate_stats) return { textColor:'', backgroundColor:'', topText:'Avg: ' + Round(stat.avg_open_days, 1), topTextColor: '', topTextOutlineColor: '', topTextMaxSize: 'medium', middleText: 'Max: '+ Round(stat.max_open_days, 0), middleTextColor: '', middleTextOutlineColor: '', middleTextMaxSize: 'medium', }
性能优化提示
- 拉取FeatureSet时务必仅指定需要的
created_at字段,不要加载全字段,可减少70%以上的数据加载耗时 - 若有已完结工单,增加过滤条件排除无效数据,进一步降低计算量
- 2万行数据用此写法在移动端会有1-3秒的加载延迟,对流畅度要求高建议优先选择方案1
内容的提问来源于stack exchange,提问作者BizzyBee
相关产品推荐
相关产品推荐

