需要帮助使用 mulesoft 中的 dataweave 为数组中的 child 行项目组构建 header 项(即时)

Need help building header item(on the fly) for groups of child line items from an array using dataweaver in mulesoft

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

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

1: input 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":""
}]

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

我也在为删除数组字段而苦苦挣扎。例如有效载荷 - “状态”不起作用。

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

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

输入:

name,code,status
a,yes,active
b,yes,active
c,no,inactive
d,no,inactive
e,yes,inactive
f,yes,inactive
g,no,active
h,no,active
i,no,inactive
j,no,inactive
k,yes,active
l,yes,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,
    "code":$[0].code,
    "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",
    "name":"",
    "code":headerCalc[item.name ++ "_" ++ item.status ++ "_" ++ item.code].code,
    "status":headerCalc[item.name ++ "_" ++  item.status ++ "_" ++ item.code].status
}] ++
[{    
    "type":"lineitem",
    "name":payload[index].name,
    "code":"",
    "status":""
}]
else
    [{ 
    "type":"lineitem",
    "name":payload[index].name,
    "code":"",
    "status":""
}]))

输出:

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

试试这个

输入:

name,code,status
a,yes,active
b,yes,active
c,no,inactive
d,no,inactive
e,yes,inactive
f,yes,inactive
g,no,active
h,no,active
i,no,inactive
j,no,inactive
k,yes,active
l,yes,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,code,status
header,,yes,active
lineItem,a,,
lineItem,b,,
lineItem,k,,
lineItem,l,,
header,,no,inactive
lineItem,c,,
lineItem,d,,
lineItem,i,,
lineItem,j,,
header,,yes,inactive
lineItem,e,,
lineItem,f,,
header,,no,active
lineItem,g,,
lineItem,h,,

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