Dataweave基于嵌套值过滤数组 应收账龄客户筛选及标记实现
报错原因
你之前的代码报错是因为aging是数组类型,直接调用$.aging.totalamount会返回所有账龄区间的余额组成的数组,无法直接和单值200做比较,也无法直接整体转为Number类型。
完整解决方案代码
%dw 2.0 output application/json --- { arAccounts: payload.data.araging map (customer) -> do { // 预计算客户总余额 var totalBalance = sum(customer.aging.totalamount as Number) // 预计算31天及以上账龄区间的余额,默认值0避免区间不存在的异常 var over30DayBalance = (customer.aging filter ($.agingperiod == "31-")).totalamount[0] as Number default 0 --- if (totalBalance > 1000 or over30DayBalance > 200) { customerid: customer.customerid, totalBalance: totalBalance, over30DayBalance: over30DayBalance, // 新增合规标记字段,明确满足的规则 qualifyFlag: if (totalBalance > 1000 and over30DayBalance > 200) "同时满足总余额超1000美元、30天以上账龄余额超200美元" else if (totalBalance > 1000) "满足总余额超1000美元" else "满足30天以上账龄余额超200美元" } else null // 过滤掉不符合条件返回的null值 } filter ($ != null) }
逻辑说明
- 先通过
sum函数对客户所有账龄区间的余额求和,自动遍历嵌套的aging数组完成金额类型转换和累加,得到总余额 - 先过滤出
agingperiod为31-的区间,再提取对应余额,避免数组和单值比较的错误 - 同时满足两个筛选规则的任意一条就保留客户,否则返回null,最后统一过滤掉null值实现筛选
- 新增
qualifyFlag字段,明确标记每个保留客户符合的规则类型
运行输出结果
基于你提供的示例输入,运行后返回结果如下:
{ "arAccounts": [ { "customerid": "50002", "totalBalance": 246.0, "over30DayBalance": 246.0, "qualifyFlag": "满足30天以上账龄余额超200美元" }, { "customerid": "50003", "totalBalance": 1084.6, "over30DayBalance": 0.0, "qualifyFlag": "满足总余额超1000美元" } ] }
内容的提问来源于stack exchange,提问作者aplane1290
相关产品推荐
相关产品推荐

