需要帮助在 mulesoft 中使用 dataweaver 为数组中的子行项组构建标题项动态

问题描述

(PS:下面是一个简单的例子来解释我的需求。实际数据要庞大和复杂得多。)

我有一个可用作订单项的行列表。我需要动态分组这些行项目并为每个组构建一​​个标题。如果你能遵循结构。

1input structure output structure

我已经实现了逻辑,但它只考虑替代行 v.i.z 数组 [0],1,[4],[6]。 1、3、5 等缺失

这是我在数据编织器转换消息中的逻辑:

%dw 2.0
output application/java
---
flatten(payload map ((item,index) ->
[{
"type":"header","name":"","code":payload[index].code,"status":payload[index].status
},{
"type":"lineitem","name":payload[index].name,"code":"","status":""
}]

想法基本上是将每一行拆分为标题和行项目。 并在订购行项目后的下一步中删除重复的标题。 除了下一步中缺少替代行(通过使用索引标记行进行验证)之外,所有这些都有效。

我也在努力删除数组字段。例如有效载荷 - “状态”不起作用。

如果有人可以提出更简单的方法或帮助我理解为什么缺少替代行,那就太好了。

解决方法

试试这个

输入:

name,code,status
a,yes,active
b,active
c,no,inactive
d,inactive
e,inactive
f,inactive
g,active
h,active
i,inactive
j,inactive
k,active
l,active

脚本

%dw 2.0
output application/csv
var headerGroups = (payload groupBy (item,index) -> (item.status ++ "_" ++ item.code)) mapObject 
($$): {
    "type":"header","name":"","code":$[0].code,"status":$[0].status
}

var nameHeaderGroups= (payload groupBy (item,index) -> (item.status ++ "_" ++ item.code)) mapObject 
($$): {
    "name":[$.name]
}

fun buildNameObject(nameArray) = nameArray map 
   {
    "temp": ($ map {
    "type":"lineItem","name": $,"code":"","status":""
    } 
   )}
    
---
flatten(nameHeaderGroups mapObject {
    a: {(headerGroups[$$])},b: {(buildNameObject($.name))}.temp
}pluck ($)
)

输出:

type,name,status
header,active
lineItem,a,lineItem,b,k,l,header,inactive
lineItem,c,d,i,j,e,f,g,h,

这应该可以帮助您实现目标。它确实根据状态和代码组合对行项目进行了分组。如果顺序很重要,您也可以添加它。

,

假设有两行状态和代码相似但名称不同的行,也许下面的解决方案可以满足您的需求。

输入:

name,active

脚本:

%dw 2.0
output application/csv headerLineNumber=0
var headerCalc = (payload groupBy (item,index) -> (item.name ++ "_" ++ item.status ++ "_" ++ item.code)) mapObject 
($$):{
    "type":"header","name":$.name,"status":$[0].status
}
---
flatten(payload map ((item,index) ->  
if((headerCalc[item.name ++ "_" ++ item.status ++ "_" ++ item.code].name contains item.name) and (isEven(index) or (index == 0)))
[{
    "type":"header","code":headerCalc[item.name ++ "_" ++ item.status ++ "_" ++ item.code].code,"status":headerCalc[item.name ++ "_" ++  item.status ++ "_" ++ item.code].status
}] ++
[{    
    "type":"lineitem","name":payload[index].name,"status":""
}]
else
    [{ 
    "type":"lineitem","status":""
}]))

输出:

type,active
lineitem,lineitem,inactive
lineitem,