Рассчитать стоимость доставки на основе диапазона цен и веса, каждая дополнительная единица веса должна добавить сумму к стоимости доставки - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть транспортные компании, и у каждой есть определенные условия для расчета стоимости доставки.

Транспортная компания:

[
  {
    "status": {
      "label": "Active",
      "value": true
    },
    "categories": [

    ],
    "_id": "5c3760435b30ef025d60aca7",
    "title": "Company Name,
    "type": "national",
    "conditions": [
      {
        "priceRange": {
          "min": 0.01,
          "max": 30.01
        },
        "weightRange": {
          "min": 0,
          "max": 2
        },
        "deliveryDays": {
          "label": "2 Days",
          "value": 2
        },
        "status": {
          "label": "Active",
          "value": true
        },
        "paymentMethod": [
          "all"
        ],
        "_id": "5cadc06f02cce3054ccaecc5",
        "cost": 5,
        "extraWeightPrice": 1,
        "eachUnit": 1
      },
      {
        "priceRange": {
          "min": 30.02,
          "max": 100.01
        },
        "weightRange": {
          "min": 0,
          "max": 2
        },
        "deliveryDays": {
          "label": "2 Days",
          "value": 2
        },
        "status": {
          "label": "Active",
          "value": true
        },
        "paymentMethod": [
          "all"
        ],
        "_id": "5cadc06f02cce3054ccaecc4",
        "cost": 5,
        "extraWeightPrice": 1,
        "eachUnit": 2
      },
      {
        "priceRange": {
          "min": 101,
          "max": 50000
        },
        "weightRange": {
          "min": 2,
          "max": 50
        },
        "deliveryDays": {
          "label": "2 Days",
          "value": 2
        },
        "status": {
          "label": "Active",
          "value": true
        },
        "paymentMethod": [
          "all"
        ],
        "_id": "5cadc06f02cce3054ccaecc3",
        "cost": 0
      }
    ],
    "__v": 0,
    "payOnDelivery": 3.5
  }
]

Калькулятор условий : (используя lodash)

const cost = 10;
const weight= 1;
const availableShippingConditions = shippings.map(shipping =>
        shipping.conditions.filter(condition => {
          return (
            _.inRange(
              cost,
              condition.priceRange.min,
              condition.priceRange.max
            ) &&
            _.inRange(
              weight,
              condition.weightRange.min,
              condition.weightRange.max
            )
          );
        })[0]
      );

Выше работает нормально и возвращает condition[0] , но мне нужно вычислить еще одну вещь:

Возможность проверить, находится ли стоимость между priceRange, но weightRange не находится внутри диапазона.Мне нужно добавить eachUnit extraWeightPrice в окончательный результат.

Итак

  • если cost равно 10€ и weight равно 5kg, нам нужно , чтобы попасть в condition[0], но нам нужнодобавить дополнительную стоимость веса 3€, потому что eachUnit становится 3 (weightRange.max равно 2, а вес 5) и extraWeightPrice равно 1, поэтому общая стоимость доставки должна составлять 8€ (cost:5, поэтому 5 + 3).

Желаемый результат - возвращать объект shipping из массива shippings только с условием, отвечающим требованиям, например:

{
    "title": "Company Name",
    "type": "national",
    "conditions": [
      {
        "priceRange": {
          "min": 0.01,
          "max": 30.01
        },
        "weightRange": {
          "min": 0,
          "max": 2
        },
        "deliveryDays": {
          "label": "2 Days",
          "value": 2
        },
        "status": {
          "label": "Active",
          "value": true
        },
        "paymentMethod": [
          "all"
        ],
        "_id": "5cadc06f02cce3054ccaecc5",
        "cost": 5,  // THIS SHOULD BE 8
        "extraWeightPrice": 1,
        "eachUnit": 1
      }
]
}

РЕДАКТИРОВАТЬ: Я сделал это, чтобы работать, мне интересно, есть ли более элегантный способ добиться этого.(будет возвращено условие, а не компания)

const availableShippingConditions = shippings.map(
        shipping =>
          shipping.conditions.filter(condition => {
            return _.inRange(
              cost,
              condition.priceRange.min,
              condition.priceRange.max
            );
          })[0]
      ).filter(item => {
        if (_.inRange(weight, item.weightRange.min, item.weightRange.max)) {
          return item;
        } else {
          item.cost = item.cost + (weight - item.weightRange.max) * (item.eachUnit * item.extraWeightPrice);
          return item;
        }
      });
...