【问题标题】:How to aggregate this data using Dataweave 2.0?如何使用 Dataweave 2.0 聚合这些数据?
【发布时间】:2020-07-24 08:32:44
【问题描述】:

采用以下 JSON。它是一个对象数组。

[
  {
    "objects": [
      {
        "saleItems": [
          {
            "itemID": 1,
            "saleItemType": "Sale",
            "productCode": "072",
            "legacyProductCode": "1071",
            "legacyCategoryCode": "1071",
            "categoryCode": "1071",
            "subCategoryCode": "101",
            "amount": 12,
            "originalAmount": 15,
            "netAmount": 10,
            "originalNetAmount": 12.5,
            "vat": 2.5,
            "unitVAT": 1,
            "vatRate": 20,
            "unitMeasure": "EA",
            "unitPrice": 15,
            "quantity": 1,
            "saleChannel": 0
          }
        ]
      }
    ]
  },
  {
    "objects": [
      {
        "saleItems": [
          {
            "itemID": 1,
            "saleItemType": "Sale",
            "productCode": "072",
            "legacyProductCode": "1071",
            "legacyCategoryCode": "1071",
            "categoryCode": "1071",
            "subCategoryCode": "101",
            "amount": 12,
            "originalAmount": 15,
            "netAmount": 10,
            "originalNetAmount": 12.5,
            "vat": 2.5,
            "unitVAT": 1,
            "vatRate": 20,
            "unitMeasure": "EA",
            "unitPrice": 15,
            "quantity": 1,
            "saleChannel": 0
          }
        ]
      }
    ]
  },
  {
    "objects": [
      {
        "saleItems": [
          {
            "itemID": 1,
            "saleItemType": "Sale",
            "productCode": "072",
            "legacyProductCode": "1071",
            "legacyCategoryCode": "1071",
            "categoryCode": "1071",
            "subCategoryCode": "101",
            "amount": 12,
            "originalAmount": 15,
            "netAmount": 10,
            "originalNetAmount": 12.5,
            "vat": 2.5,
            "unitVAT": 1,
            "vatRate": 20,
            "unitMeasure": "EA",
            "unitPrice": 15,
            "quantity": 1,
            "saleChannel": 0
          }
        ]
      }
    ]
  }
]

此数据的示例输出需要是:

{
  "sales": {
    "saleItems": [
      {
        "saleChannel": "1",
        "categoryCode": "1071",
        "productCode": "072",
        "salesAmountIncludingTax": 11.79,
        "salesAmountExcludingTax": 9.82,
        "discountAmountIncludingTax": 1.0,
        "discountAmountExcludingTax": 0.83,
        "salesQuantity": 10.0
      }
    ],
    "totalSalesAmountIncludingTax": 11.79,
    "totalSalesAmountExcludingTax": 9.82,
    "totalSalesQuantity": 10.0
  },
  "refunds": {
    "refundItems": [
      {
        "saleChannel": "1",
        "categoryCode": "1010",
        "productCode": "033",
        "refundAmountIncludingTax": 11.79,
        "refundAmountExcludingTax": 9.82,
        "discountAmountIncludingTax": 1.0,
        "discountAmountExcludingTax": 0.83,
        "refundQuantity": 10.0
      }
    ],
    "totalRefundAmountIncludingTax": 11.79,
    "totalRefundAmountExcludingTax": 9.82,
    "totalRefundQuantity": 10.0
  }
}

复杂性在于聚合/总计。例如:

在有效负载数组的每个元素中,必须有一个基于值的值聚合。每个对象都包含 saleItems 对象数组。如果 saleChannel = 0 和 saleItemType = "Sale" 并且 productCode = "X"(以前没有见过),这意味着 productCode = X 的每个 saleItem 的值必须“求和”。

示例:因此对于前 2 个对象,productCode 可能为“001”。这意味着必须合计这些值。第三个对象 productCode 可以是“002”,必须在输出的 saleItems 数组中创建一个新对象。

示例:(如果 saleItemType = "Refund",如果基于 if 语句的退款也可以这样)

"sales": {
  "saleItems": [
    {
      productCode 001
      salesAmountIncludingTax: **The sum of "amount" field, if saleChannel = 0 && saleItemType = "Sale**
    },
    {
      productCode 002
    }
  ]
}

数值的合计必须遵循这个逻辑:

if saleChannel = 0
    group by subCategoryCode
        salesAmountIncludingTax = sum(saleItems.amount where saleItemType="Sale")
        salesAmountExcludingTax = sum(saleItems.netAmount where saleItemType="Sale")
    
if saleChannel != 0
    group by productCode
        salesAmountIncludingTax = sum(saleItems.originalAmount where saleItemType="Sale")
        salesAmountExcludingTax = sum(saleItems.originalNetAmount where saleItemType="Sale")

【问题讨论】:

  • 嘿,杰克,您是否错过了输入中的productCode: 033
  • 您的示例所有产品代码都相同。关于如果你有[pc=1,id =A, pc=1, id=B,pc=2,id=C,pc=1,id=D] 这种情况是否可能,如果可以,他们应该如何分组? [sum(A,B), sum(C), sum(D)][sum(A,B,D), sum(C)][sum(A,B), sum(C)]
  • 输出中的折扣从何而来?
  • pastebin.com/N5sRvBC9 请检查 pastebin 链接。这就解释了聚合逻辑

标签: dataweave anypoint-studio mulesoft


【解决方案1】:

如果我理解正确,你需要这样做:

%dw 2.0
output application/json

fun sumItems(itemsToSum, field1, field2) = do {
    var item = itemsToSum[0]
    var discounts = itemsToSum.priceAdjustments
    ---
    {
        "saleChannel": item.saleChannel,
        "categoryCode": item.categoryCode,
        "subCategoryCode": item.subCategoryCode,
        "productCode": item.productCode,
        "salesAmountIncludingTax": sum(itemsToSum[field1]),
        "salesAmountExcludingTax": sum(itemsToSum[field2]),
        "discountAmountIncludingTax": sum(discounts.amount default []),
        "discountAmountExcludingTax": sum(discounts.netAmount default []),
        "salesQuantity": sum(itemsToSum.quantity)
    }
}

var allItems       = flatten(payload..*saleItems default [])
var allSaleItems   = allItems filter ((item) -> item.saleItemType == "Sale")
var channel0       = allSaleItems filter ((item) -> item.saleChannel == 0)
var otherChannels  = allSaleItems filter ((item) -> item.saleChannel != 0)
var summedChannel0 = 
        channel0 
            groupBy ((item) -> item.subCategoryCode)
            pluck ((itemsToSum, groupName) -> do {
                sumItems(itemsToSum, "amount", "netAmount")
            })
var summedOtherChannels = 
        otherChannels 
            groupBy ((item) -> item.productCode)
            pluck ((itemsToSum, groupName) -> do {
                sumItems(itemsToSum, "originalAmount", "originalNetAmount")
            })
var saleItems = summedChannel0 ++ summedOtherChannels
---
{
    sales: {
        "saleItems": saleItems,
        "totalSalesAmountIncludingTax": sum(saleItems.salesAmountIncludingTax),
        "totalSalesAmountExcludingTax": sum(saleItems.salesAmountExcludingTax),
        "totalSalesQuantity": sum(saleItems.salesQuantity)
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-31
    • 2016-11-17
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多