преобразование dataweave2.0 в mule 4 на основе условий - PullRequest
1 голос
/ 15 марта 2020

Я должен написать некоторые преобразования и расчеты, основанные на условии, например, счет наличных / дд / чек и сумма наличных / дд / чек в сводном массиве. Я определил свой входной массив и на основании этого я ожидаю вывод, который я определил. Помогите мне завершить переплетение данных для этого. \

Код:

    %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"
    }]
}

Справка мне завершить dataweave для этого.

Ответы [ 3 ]

6 голосов
/ 15 марта 2020

Есть несколько способов, которыми вы можете сделать это.

1) Вот гибкий, процессный, но не компактный способ сделать это:

%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.

%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 с.

Выберите тот, который вам нравится.

3 голосов
/ 15 марта 2020

Вот решение, которое включает одну итерацию для ввода. Мне любопытно, есть ли у кого-нибудь более чистые решения.

%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
}
0 голосов
/ 19 марта 2020

Вот еще один ответ ... Надеюсь, это поможет

%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
}
...