需要帮助使用 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,,
这应该可以帮助您实现目标。它确实根据状态和代码组合对行项目进行分组。如果顺序很重要,您也可以添加它。
(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,,
这应该可以帮助您实现目标。它确实根据状态和代码组合对行项目进行分组。如果顺序很重要,您也可以添加它。