mrsexy
@mrsexy
Senior Pomidor

Как правильно написать калькуляцию для логистики?

Добрый день!
Прошу помочь с реализацией калькуляции для логистики на JS/JQuery/PHP.
Проблема заключается в следующем - Нехватка знаний JS, и из этого вытекающее кол-во полей в базе.
Описывал калькуляцию с просчётом каждого диапазона отдельно 1-2км, 2-3км и т.д. Соответственно наплодил множество столбцов в БД и увеличил кол-во условий в JS. Работало всё нормально до увеличения максимального расстояния, а полей уже не хватает и плодить их глупо. Соответственно нужно было переходить на диапазоны значений - 10-20, 20-30 и т.д.
Есть слайдер(Ion.RangeSlider) От и До, значения От и До изменяются. Пытался описать условие самостоятельно, но надбавочная стоимость добавляется только 1 раз, когда ползунок достигает нужного диапазона. С каждым сдвигом ползунка должна прибавляться надбавочная стоимость, а это происходит только 1 раз на промежутке 10-11, далее считает по стандартной цене за 1км, так не должно. Ниже скриншот с более подробным описанием задачи:
6134e27d0568e397759315.png

// int_from - левый ползунок, int_to - правый ползунок.
                let interval =  Number(int_to) - Number(int_from);
                let int_price = (Number(interval) / Number(km_step) * Number(km_price)).toFixed(2);
                let nds = 0; // ндс
                let price = 20; // цена вызова

                if(int_to >= v_from_1 && int_to <= v_to_1){
                    nds = Number(price_1);
                }
                if(int_to >= v_from_2 && int_to <= v_to_2){
                    nds = Number(price_2);
                }
                if(int_to >= v_from_3 && int_to <= v_to_3){
                    nds = Number(price_3);
                }
                if(int_to >= v_from_4 && int_to <= v_to_4){
                    nds = Number(price_4);
                }
                if(int_to >= v_from_5 && int_to <= v_to_5){
                    nds = Number(price_5);
                }

               let total_price = Number(price) + Number(int_price) + Number(nds);


P.S - Соответственно int_from, int_to, int_price - находится внутри ф-ции которая отслеживает изменения их значений.
  • Вопрос задан
  • 109 просмотров
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
const CALL_COST = 20;
const DIST_COSTS = [
    ['range' => 0, 'cost' => 1],
    ['range' => 10, 'cost' => 1.5],
    ['range' => 20, 'cost' => 0.5], // 2 - 1.5
];

function distPrice($distance) {
    $price = 0;
    for ($i = 0; $i < count(DIST_COSTS) && $distance >= DIST_COSTS[$i]['range']; $i += 1) {
        $price += ($distance - DIST_COSTS[$i]['range']) * DIST_COSTS[$i]['cost'];
    }
    return $price;
}

function routePrice($distFrom, $distTo) {
    return CALL_COST + distPrice($distTo) - distPrice($distFrom);
}

print routePrice(0, 30) . "\n"; // 85
print routePrice(10, 28) . "\n"; // 69

Запись в массиве - начиная с какого километра на сколько увеличивается цена за километр.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы