基于条件的 mule 4 中的 dataweave2.0 转换
dataweave2.0 transformation in mule 4 based on conditions
我必须根据摘要数组中的 cash/dd/cheque 收据计数和 cash/dd/cheque 之和等条件编写一些转换和计算。我已经定义了我的输入数组,并基于此我期待我定义的输出。帮我完成数据编织。\
代码:
%dw 2.0
output application/json
---
{
receipt: payload map ( payload01 , indexOfPayload01 ) -> {
receiptId: payload01.receiptId,
amountCollected: payload01.amountCollected,
paymentMode: payload01.paymentMode,
},
summary: {
TotalamountCollected: payload.*amountCollected reduce ((val, acc=0) -> acc + val)
}
}
输入:
[{
"receiptId": 11000134453,
"amountCollected": 11,
"paymentMode": "Cash"
}, {
"receiptId": 1105444723,
"amountCollected": 12,
"paymentMode": "Cheque"
}, {
"receiptId": 1143434763,
"amountCollected": 13,
"paymentMode": "DD"
},{
"receiptId": 11000134457,
"amountCollected": 14,
"paymentMode": "Cash"
}, {
"receiptId": 1105444728,
"amountCollected": 15,
"paymentMode": "Cheque"
}, {
"receiptId": 1143434769,
"amountCollected": 16,
"paymentMode": "DD"
}]
输出:
{
"summary": {
"TotalamountCollected": 81,
"cashRecepit": 2,
"cashRecepitAmount": 25,
"chequeRecepit": 2,
"chequeRecepitAmount": 27,
"ddRecepit": 2,
"ddRecepitAmount": 29
},
"receipt": [{
"receiptId": 11000134453,
"amountCollected": 11,
"paymentMode": "Cash"
}, {
"receiptId": 1105444723,
"amountCollected": 12,
"paymentMode": "Cheque"
}, {
"receiptId": 1143434763,
"amountCollected": 13,
"paymentMode": "DD"
},{
"receiptId": 11000134457,
"amountCollected": 14,
"paymentMode": "Cash"
}, {
"receiptId": 1105444728,
"amountCollected": 15,
"paymentMode": "Cheque"
}, {
"receiptId": 1143434769,
"amountCollected": 16,
"paymentMode": "DD"
}]
}
帮我完成数据编织。
这是一个涉及对输入进行一次迭代的解决方案。我很好奇是否有人有任何更清洁的解决方案。
%dw 2.0
output application/json
var inputVar =
[{
"receiptId": 11000134453,
"amountCollected": 11,
"paymentMode": "Cash"
}, {
"receiptId": 1105444723,
"amountCollected": 12,
"paymentMode": "Cheque"
}, {
"receiptId": 1143434763,
"amountCollected": 13,
"paymentMode": "DD"
},{
"receiptId": 11000134457,
"amountCollected": 14,
"paymentMode": "Cash"
}, {
"receiptId": 1105444728,
"amountCollected": 15,
"paymentMode": "Cheque"
}, {
"receiptId": 1143434769,
"amountCollected": 16,
"paymentMode": "DD"
}]
var init =
{
"TotalamountCollected": 0,
"cashRecepit": 0,
"cashRecepitAmount": 0,
"chequeRecepit": 0,
"chequeRecepitAmount": 0,
"ddRecepit": 0,
"ddRecepitAmount": 0
}
fun calcModeAmmount(acc, isTargetedMode, addend) = acc + if(isTargetedMode) addend else 0
fun summary() = inputVar reduce(item, acc=init) ->
{
"TotalamountCollected": acc.TotalamountCollected + item.amountCollected,
"cashRecepit": calcModeAmmount(acc.cashRecepit, item.paymentMode == "Cash", 1),
"cashRecepitAmount": calcModeAmmount(acc.cashRecepitAmount, item.paymentMode == "Cash", item.amountCollected),
"chequeRecepit": calcModeAmmount(acc.chequeRecepit, item.paymentMode == "Cheque", 1),
"chequeRecepitAmount": calcModeAmmount(acc.chequeRecepitAmount, item.paymentMode == "Cheque", item.amountCollected),
"ddRecepit": calcModeAmmount(acc.ddRecepit, item.paymentMode == "DD", 1),
"ddRecepitAmount": calcModeAmmount(acc.ddRecepitAmount, item.paymentMode == "DD", item.amountCollected)
}
---
{
summary:summary(),
receipt:inputVar
}
您可以通过多种方式完成它。
1) 这是一个灵活的流程,但不是 space 有效的完成方式:
%dw 2.0
output application/dw
var data = [{
"receiptId": 11000134453,
"amountCollected": 11,
"paymentMode": "Cash"
}, {
"receiptId": 1105444723,
"amountCollected": 12,
"paymentMode": "Cheque"
}, {
"receiptId": 1143434763,
"amountCollected": 13,
"paymentMode": "DD"
},{
"receiptId": 11000134457,
"amountCollected": 14,
"paymentMode": "Cash"
}, {
"receiptId": 1105444728,
"amountCollected": 15,
"paymentMode": "Cheque"
}, {
"receiptId": 1143434769,
"amountCollected": 16,
"paymentMode": "DD"
}]
---
do {
var byPaymentMode = data groupBy $.paymentMode
---
{
summary: (byPaymentMode mapObject {
(lower($$) ++ "Receipt"): sizeOf($),
(lower($$) ++ "ReceiptAmount"): sum($.*amountCollected)
}),
receipt: data
}
}
2) 使用内置 dw::core::Arrays
模块,这是一种不灵活、space 但处理效率不高的方法。
%dw 2.0
output application/dw
var data = [{
"receiptId": 11000134453,
"amountCollected": 11,
"paymentMode": "Cash"
}, {
"receiptId": 1105444723,
"amountCollected": 12,
"paymentMode": "Cheque"
}, {
"receiptId": 1143434763,
"amountCollected": 13,
"paymentMode": "DD"
},{
"receiptId": 11000134457,
"amountCollected": 14,
"paymentMode": "Cash"
}, {
"receiptId": 1105444728,
"amountCollected": 15,
"paymentMode": "Cheque"
}, {
"receiptId": 1143434769,
"amountCollected": 16,
"paymentMode": "DD"
}]
---
{
summary: {
TotalAmountCollected: data dw::core::Arrays::sumBy (e) -> e.amountCollected,
cashReceipt: data dw::core::Arrays::countBy (e) -> e.paymentMode == "Cash",
cashReceiptAmount: data dw::core::Arrays::sumBy (e) -> if (e.paymentMode == "Cash") e.amountCollected else 0,
checkReceipt: data dw::core::Arrays::countBy (e) -> e.paymentMode == "Cheque",
checkReceiptAmount: data dw::core::Arrays::sumBy (e) -> if (e.paymentMode == "Cheque") e.amountCollected else 0,
ddReceipt: data dw::core::Arrays::countBy (e) -> e.paymentMode == "DD",
ddReceiptAmount: data dw::core::Arrays::sumBy (e) -> if (e.paymentMode == "DD") e.amountCollected else 0
},
receipt: data
}
最后一个解决方案也可以很容易地变得灵活,因此您不必对 paymentMode
进行硬编码。
选一个你喜欢的。
这是另一个答案...希望对您有所帮助
%dw 2.0
import * from dw::core::Arrays
import * from dw::core::Strings
output application/json
var inputJsonArr=[{
"receiptId": 11000134453,
"amountCollected": 11,
"paymentMode": "Cash"
}, {
"receiptId": 1105444723,
"amountCollected": 12,
"paymentMode": "Cheque"
}, {
"receiptId": 1143434763,
"amountCollected": 13,
"paymentMode": "DD"
},{
"receiptId": 11000134457,
"amountCollected": 14,
"paymentMode": "Cash"
}, {
"receiptId": 1105444728,
"amountCollected": 15,
"paymentMode": "Cheque"
}, {
"receiptId": 1143434769,
"amountCollected": 16,
"paymentMode": "DD"
}]
---
{
summary:{
'TotalamountCollected':inputJsonArr sumBy $.amountCollected,
'cashRecepit':inputJsonArr countBy (($.paymentMode) == 'Cash'),
'cashRecepitAmount':((inputJsonArr filter (value, index) -> ((value.paymentMode)== 'Cash'))sumBy $.amountCollected),
'chequeRecepit':inputJsonArr countBy (($.paymentMode) == 'Cheque'),
'chequeRecepitAmount':((inputJsonArr filter (value, index) -> ((value.paymentMode)== 'Cheque'))sumBy $.amountCollected),
'ddRecepit':inputJsonArr countBy (($.paymentMode) == 'DD'),
'ddRecepitAmount':((inputJsonArr filter (value, index) -> ((value.paymentMode)== 'DD'))sumBy $.amountCollected)
},
'receipt':inputJsonArr
}
我必须根据摘要数组中的 cash/dd/cheque 收据计数和 cash/dd/cheque 之和等条件编写一些转换和计算。我已经定义了我的输入数组,并基于此我期待我定义的输出。帮我完成数据编织。\
代码:
%dw 2.0
output application/json
---
{
receipt: payload map ( payload01 , indexOfPayload01 ) -> {
receiptId: payload01.receiptId,
amountCollected: payload01.amountCollected,
paymentMode: payload01.paymentMode,
},
summary: {
TotalamountCollected: payload.*amountCollected reduce ((val, acc=0) -> acc + val)
}
}
输入:
[{
"receiptId": 11000134453,
"amountCollected": 11,
"paymentMode": "Cash"
}, {
"receiptId": 1105444723,
"amountCollected": 12,
"paymentMode": "Cheque"
}, {
"receiptId": 1143434763,
"amountCollected": 13,
"paymentMode": "DD"
},{
"receiptId": 11000134457,
"amountCollected": 14,
"paymentMode": "Cash"
}, {
"receiptId": 1105444728,
"amountCollected": 15,
"paymentMode": "Cheque"
}, {
"receiptId": 1143434769,
"amountCollected": 16,
"paymentMode": "DD"
}]
输出:
{
"summary": {
"TotalamountCollected": 81,
"cashRecepit": 2,
"cashRecepitAmount": 25,
"chequeRecepit": 2,
"chequeRecepitAmount": 27,
"ddRecepit": 2,
"ddRecepitAmount": 29
},
"receipt": [{
"receiptId": 11000134453,
"amountCollected": 11,
"paymentMode": "Cash"
}, {
"receiptId": 1105444723,
"amountCollected": 12,
"paymentMode": "Cheque"
}, {
"receiptId": 1143434763,
"amountCollected": 13,
"paymentMode": "DD"
},{
"receiptId": 11000134457,
"amountCollected": 14,
"paymentMode": "Cash"
}, {
"receiptId": 1105444728,
"amountCollected": 15,
"paymentMode": "Cheque"
}, {
"receiptId": 1143434769,
"amountCollected": 16,
"paymentMode": "DD"
}]
}
帮我完成数据编织。
这是一个涉及对输入进行一次迭代的解决方案。我很好奇是否有人有任何更清洁的解决方案。
%dw 2.0
output application/json
var inputVar =
[{
"receiptId": 11000134453,
"amountCollected": 11,
"paymentMode": "Cash"
}, {
"receiptId": 1105444723,
"amountCollected": 12,
"paymentMode": "Cheque"
}, {
"receiptId": 1143434763,
"amountCollected": 13,
"paymentMode": "DD"
},{
"receiptId": 11000134457,
"amountCollected": 14,
"paymentMode": "Cash"
}, {
"receiptId": 1105444728,
"amountCollected": 15,
"paymentMode": "Cheque"
}, {
"receiptId": 1143434769,
"amountCollected": 16,
"paymentMode": "DD"
}]
var init =
{
"TotalamountCollected": 0,
"cashRecepit": 0,
"cashRecepitAmount": 0,
"chequeRecepit": 0,
"chequeRecepitAmount": 0,
"ddRecepit": 0,
"ddRecepitAmount": 0
}
fun calcModeAmmount(acc, isTargetedMode, addend) = acc + if(isTargetedMode) addend else 0
fun summary() = inputVar reduce(item, acc=init) ->
{
"TotalamountCollected": acc.TotalamountCollected + item.amountCollected,
"cashRecepit": calcModeAmmount(acc.cashRecepit, item.paymentMode == "Cash", 1),
"cashRecepitAmount": calcModeAmmount(acc.cashRecepitAmount, item.paymentMode == "Cash", item.amountCollected),
"chequeRecepit": calcModeAmmount(acc.chequeRecepit, item.paymentMode == "Cheque", 1),
"chequeRecepitAmount": calcModeAmmount(acc.chequeRecepitAmount, item.paymentMode == "Cheque", item.amountCollected),
"ddRecepit": calcModeAmmount(acc.ddRecepit, item.paymentMode == "DD", 1),
"ddRecepitAmount": calcModeAmmount(acc.ddRecepitAmount, item.paymentMode == "DD", item.amountCollected)
}
---
{
summary:summary(),
receipt:inputVar
}
您可以通过多种方式完成它。
1) 这是一个灵活的流程,但不是 space 有效的完成方式:
%dw 2.0
output application/dw
var data = [{
"receiptId": 11000134453,
"amountCollected": 11,
"paymentMode": "Cash"
}, {
"receiptId": 1105444723,
"amountCollected": 12,
"paymentMode": "Cheque"
}, {
"receiptId": 1143434763,
"amountCollected": 13,
"paymentMode": "DD"
},{
"receiptId": 11000134457,
"amountCollected": 14,
"paymentMode": "Cash"
}, {
"receiptId": 1105444728,
"amountCollected": 15,
"paymentMode": "Cheque"
}, {
"receiptId": 1143434769,
"amountCollected": 16,
"paymentMode": "DD"
}]
---
do {
var byPaymentMode = data groupBy $.paymentMode
---
{
summary: (byPaymentMode mapObject {
(lower($$) ++ "Receipt"): sizeOf($),
(lower($$) ++ "ReceiptAmount"): sum($.*amountCollected)
}),
receipt: data
}
}
2) 使用内置 dw::core::Arrays
模块,这是一种不灵活、space 但处理效率不高的方法。
%dw 2.0
output application/dw
var data = [{
"receiptId": 11000134453,
"amountCollected": 11,
"paymentMode": "Cash"
}, {
"receiptId": 1105444723,
"amountCollected": 12,
"paymentMode": "Cheque"
}, {
"receiptId": 1143434763,
"amountCollected": 13,
"paymentMode": "DD"
},{
"receiptId": 11000134457,
"amountCollected": 14,
"paymentMode": "Cash"
}, {
"receiptId": 1105444728,
"amountCollected": 15,
"paymentMode": "Cheque"
}, {
"receiptId": 1143434769,
"amountCollected": 16,
"paymentMode": "DD"
}]
---
{
summary: {
TotalAmountCollected: data dw::core::Arrays::sumBy (e) -> e.amountCollected,
cashReceipt: data dw::core::Arrays::countBy (e) -> e.paymentMode == "Cash",
cashReceiptAmount: data dw::core::Arrays::sumBy (e) -> if (e.paymentMode == "Cash") e.amountCollected else 0,
checkReceipt: data dw::core::Arrays::countBy (e) -> e.paymentMode == "Cheque",
checkReceiptAmount: data dw::core::Arrays::sumBy (e) -> if (e.paymentMode == "Cheque") e.amountCollected else 0,
ddReceipt: data dw::core::Arrays::countBy (e) -> e.paymentMode == "DD",
ddReceiptAmount: data dw::core::Arrays::sumBy (e) -> if (e.paymentMode == "DD") e.amountCollected else 0
},
receipt: data
}
最后一个解决方案也可以很容易地变得灵活,因此您不必对 paymentMode
进行硬编码。
选一个你喜欢的。
这是另一个答案...希望对您有所帮助
%dw 2.0
import * from dw::core::Arrays
import * from dw::core::Strings
output application/json
var inputJsonArr=[{
"receiptId": 11000134453,
"amountCollected": 11,
"paymentMode": "Cash"
}, {
"receiptId": 1105444723,
"amountCollected": 12,
"paymentMode": "Cheque"
}, {
"receiptId": 1143434763,
"amountCollected": 13,
"paymentMode": "DD"
},{
"receiptId": 11000134457,
"amountCollected": 14,
"paymentMode": "Cash"
}, {
"receiptId": 1105444728,
"amountCollected": 15,
"paymentMode": "Cheque"
}, {
"receiptId": 1143434769,
"amountCollected": 16,
"paymentMode": "DD"
}]
---
{
summary:{
'TotalamountCollected':inputJsonArr sumBy $.amountCollected,
'cashRecepit':inputJsonArr countBy (($.paymentMode) == 'Cash'),
'cashRecepitAmount':((inputJsonArr filter (value, index) -> ((value.paymentMode)== 'Cash'))sumBy $.amountCollected),
'chequeRecepit':inputJsonArr countBy (($.paymentMode) == 'Cheque'),
'chequeRecepitAmount':((inputJsonArr filter (value, index) -> ((value.paymentMode)== 'Cheque'))sumBy $.amountCollected),
'ddRecepit':inputJsonArr countBy (($.paymentMode) == 'DD'),
'ddRecepitAmount':((inputJsonArr filter (value, index) -> ((value.paymentMode)== 'DD'))sumBy $.amountCollected)
},
'receipt':inputJsonArr
}