Mule 4 / DW 2.0, как мне закрепить эту JSON на основе 'Title'? - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть JSON следующим образом:

[{
        "Number": "66667",
        "Date": "2020-08-29 16:40:32.0",
        "Account Number":  {"externalId":1,"account": 122},
        "Title": "ABC",
        "Auto Reversing": "",
        "Debit": 20,
        "Credit": 0
    },
    {
        "Number": "66667",
        "Date": "2020-08-29 16:40:32.0",
        "Account Number":  {"externalId":1,"account": 122},
        "Title": "ABC",
        "Auto Reversing": "",
        "Debit": 10,
        "Credit": 0
    },
    {
        "Number": "66667",
        "Date": "2020-08-29 16:40:32.0",
        "Account Number":  {"externalId":1,"account": 122},
        "Title": "ABC",
        "Auto Reversing": "",
        "Debit": 0,
        "Credit": 30
    },
    {
        "Number": "66667",
        "Date": "2020-08-29 16:40:32.0",
        "Account Number":  {"externalId":1,"account": 3144},
        "Title": "DEF",
        "Auto Reversing": "",
        "Debit": 10,
        "Credit": 0
    },
    {
        "Number": "66667",
        "Date": "2020-08-29 16:40:32.0",
        "Account Number":  {"externalId":1,"account": 3144},
        "Title": "DEF",
        "Auto Reversing": "",
        "Debit": 0,
        "Credit": 10
    }
]

Я должен загрузить эти данные в netsuite, поэтому в нем должны быть только записи, созданные на основе заголовков округа в «Заголовке». 'field (ABC и DEF здесь).

Каждая запись для одного и того же заголовка должна постоянно обновлять записи, например, для каждой записи заголовка ABC должна быть только 1 запись в netsuite со всеми обновленными значениями.

Я пытался использовать groupby, однако динамическое добавление объекта groupby вызывает у меня проблемы. Вот вывод после groupby.

{
  "DEF": [
    {
      "Number": "66667",
      "Date": "2020-08-29 16:40:32.0",
      "Account Number": {
        "externalId": 1,
        "account": 3144
      },
      "Title": "DEF",
      "Auto Reversing": "",
      "Debit": 0,
      "Credit": 10
    },
    {
      "Number": "66667",
      "Date": "2020-08-29 16:40:32.0",
      "Account Number": {
        "externalId": 1,
        "account": 3144
      },
      "Title": "DEF",
      "Debit": 0,
      "Credit": 10
    }
  ],
  "ABC": [
    {
      "Number": "66667",
      "Date": "2020-08-29 16:40:32.0",
      "Account Number": {
        "externalId": 1,
        "account": 3144
      },
      "Title": "ABC",
      "Debit": 20,
      "Credit": 0
    },
    {
      "JE Number": "66667",
      "JE Date": "2020-08-29 16:40:32.0",
      "Account Number": {
        "externalId": 1,
        "account": 3144
      },
      "Journal Entry Title": "ABC",
      "Debit": 10,
      "Credit": 0
    },
    {
      "JE Number": "66667",
      "JE Date": "2020-08-29 16:40:32.0",
      "Account Number": {
        "externalId": 1,
        "account": 3144
      },
      "Journal Entry Title": "ABC",
      "Debit": 0,
      "Credit": 30
    }
  ]
}

Я понятия не имею, как мне продолжить это.

1 Ответ

3 голосов
/ 03 февраля 2020

Позвольте мне начать с того, что ваш вопрос неясен. Я остановлюсь на этом для моего ответа ниже: «Всего должно быть сгенерировано только 2 записи, одна с заголовком AB C, а другая с DEF.»

Я использовал dw::core::Objects::mergeWith Функция, вы можете найти документацию здесь: https://docs.mulesoft.com/mule-runtime/4.2/dw-objects-functions-mergewith

Попробуйте это: payload distinctBy $.Title

Редактировать: Теперь, когда вы уточнили вопрос, я могу вам сказать Я понятия не имею, как использовать соединитель netsuite, но я знаю DW, и я могу постепенно обновлять объекты с тем же Title, что дает мне обновленный результат.

Попробуйте вместо этого код:

%dw 2.0
output application/dw
var data = [{
        "Number": "66667",
        "Date": "2020-08-29 16:40:32.0",
        "Account Number":  {"externalId":1,"account": 122},
        "Title": "ABC",
        "Auto Reversing": "",
        "Debit": 20,
        "Credit": 0
    },
    {
        "Number": "66667",
        "Date": "2020-08-29 16:40:32.0",
        "Account Number":  {"externalId":1,"account": 122},
        "Title": "ABC",
        "Auto Reversing": "",
        "Debit": 10,
        "Credit": 0
    },
    {
        "Number": "66667",
        "Date": "2020-08-29 16:40:32.0",
        "Account Number":  {"externalId":1,"account": 122},
        "Title": "ABC",
        "Auto Reversing": "",
        "Debit": 0,
        "Credit": 30
    },
    {
        "Number": "66667",
        "Date": "2020-08-29 16:40:32.0",
        "Account Number":  {"externalId":1,"account": 3144},
        "Title": "DEF",
        "Auto Reversing": "",
        "Debit": 10,
        "Credit": 0
    },
    {
        "Number": "66667",
        "Date": "2020-08-29 16:40:32.0",
        "Account Number":  {"externalId":1,"account": 3144},
        "Title": "DEF",
        "Auto Reversing": "",
        "Debit": 0,
        "Credit": 10
    }
]
---
// Group the data by Title
data groupBy $.Title
// Iterate over the object
mapObject {
    ($$): (
        // Iterate over the array in the values and mergeWith the sequence 
        // of objects with the same title
        // NOTE: the values to the right take precedence when using mergeWith.
        $ reduce (e, acc={}) -> acc dw::core::Objects::mergeWith e
    )
}
// Restore the array with the updated objects
pluck $
...