oknosoft / windowbuilder

Окнософт:Заказ дилера
http://www.oknosoft.ru/zd/
Other
10 stars 19 forks source link

Наценки, вычисляемый totqty1, кмарж, loss_factor #340

Closed unpete closed 6 years ago

unpete commented 6 years ago

По мотивам задачи про наценку стеклопакетов в зависимости от формы и площади. image

Задача с наценкой сводится к написанию формулы - текст приведу ниже.

Искривления totqty1 можно использовать не только в ценообразовании и не только в сторону увеличения. Например, если две строки спецификации делаются из одной заготовки (штапик и створка в деревянных окнах), отражение такой потребности можно украсить с помощью этого механизма.

unpete commented 6 years ago
// на входе в переменной obj имеем:
// {
// ox,      -   объект характеристики текущей продукции
// elm,     -   текущий элемент, обычно - профиль
// cnstr,   -   номер конструкции или элемента для привязки параметров
// inset,   -   вставка элемента или допвставка
// row_ins, -   строка спецификации вставки, из которой произведён вызов формулы
// row_spec -   строка спецификации изделия, в которой заполняем totqty1
// }

// получаем ссылку параметра, значение которого используем при поиске характеристики
const {elm, row_ins, row_spec} = obj;

// габаритная площадь
row_spec.s = row_spec.totqty = row_spec.len * row_spec.width;

// коэффициент формы
let kf = 1;
// стеклопакет прямоугольный?
if(!elm.is_rectangular){
    const {profiles, path} = elm;
    // у фигуры есть искривления?
    if(path.hasHandles()){      
        let curvs = 0;  // количество искривлений > 1?
        let ccw = false;// вогнутость
        profiles.forEach(({sub_path}) => {
            if(sub_path.hasHandles()){
             curvs++;
             if(!ccw){
                ccw = sub_path.getCurvatureAt(sub_path.length / 2) < 0;
             }
            }
        });
        kf = (curvs > 1 || ccw) ? 2 : 1.5;
    }
    // искривлений нет
    else {
        // в зависимости от числа рёбер
        kf = profiles.length <= 4 ? 1.3 : 1.5;
    }
}

// коэффициент площади
let ks = 1;
if(row_spec.s <= 0.3){
    ks = 1.25;
}
else if(row_spec.s > 3 && row_spec.s <= 4){
    ks = 1.25;
}
else if(row_spec.s > 4){
    ks = 3;
}

row_spec.totqty1 = row_spec.s * kf * ks;
return row_ins.quantity;