У меня есть транспортные компании, и у каждой есть определенные условия для расчета стоимости доставки.
Транспортная компания:
[
{
"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;
}
});