Руководство пользователя Semantic MDM
×
Меню
Индекс

Пример решения расчетной задачи по расчету нормы расхода

 
На данном примере, наглядно показано, как через вычисляемые атрибуты выполнять вычисления с помощью скриптов Groovy, для решения расчетных задач. Для проведения вычислений, рекомендуется использовать только переменные типа BigDecimal, которые позволяют получить нужную точность в десятичной системе исчисления. Для получения числовых значений из атрибутов, рекомендуется использовать методы: getDoubleValue, getLeftDoubleValue, getRightDoubleValue, которые позволяют получить числовое значение атрибута с требуемой точностью и пересчетом на необходимый коэффициент. Возврат вычисленного значения, рекомендуется выполнять через одну из функций: createDblSimpleValue, createDblRangeValue, createDblDeflectionValue. Если в формулах вычисления используются числовые константы, то к ним необходимо добавлять литеру “G”, чтобы указать системе что это число типа BigDecimal, например: “2G”, “3.1416G”. При необходимости выполнения округления числа типа BigDecimal, необходимо использовать метод setScale(), в который необходимо требуемую точность округления (количество знаков после запятой) и тип округления (RoundingMode):
 
Число
Тип округления
UP
DOWN
CEILING
FLOOR
HALF_UP
HALF_DOWN
HALF_EVEN
5.5
6
5
6
5
6
5
6
2.5
3
2
3
2
3
2
2
1.6
2
1
2
1
2
2
2
1.1
2
1
2
1
1
1
1
1.0
1
1
1
1
1
1
1
-1.0
-1
-1
-1
-1
-1
-1
-1
-1.1
-2
-1
-1
-2
-1
-1
-1
-1.6
-2
-1
-1
-2
-2
-2
-2
-2.5
-3
-2
-2
-3
-3
-2
-2
-5.5
-6
-5
-5
-6
-6
-5
-6
 
Пример округления до 5 знаков: D = D.setScale(5, RoundingMode.HALF_UP);.  Для использования округления в скрипте, в начало скрипта требуется добавить: import java.math.RoundingMode.
Описание задачи по расчету нормы расхода: требуется вычислить норму расхода материала(@[Материал]) для заготовки по следующим данным:
Норму расхода требуется вычислить исходя из заданных параметров заготовки, геометрических параметров материала заготовки и плотности материала заготовки. Формула расчета, определяется формой сортамента материала заготовки. Все расчеты требуется проводить с использованием типа данных BigDecimal, который дает правильную точность при округлениях в десятичной системе исчисления.
 
Скрипт вычисления нормы расхода для кругов, лент, листов и труб
ValueDouble getValue(){
    BigDecimal Res;
    try {
      // Форма сортамента
      String SortForm = @[Материал заготовки][Форма сортамента];     
      if (SortForm != null) {
        //Получим длину заготовки и плотность материала
       BigDecimal L = support.getDoubleValue(@[Длина заготовки], 5, null);
        BigDecimal Ro = support.getDoubleValue(@[Материал заготовки][Марка материала][Плотность], 5, null);
        switch(SortForm) {
          case "Круг":
          case "Проволока":
          case "Пруток":
          case "Стержень":         
            BigDecimal D = support.getDoubleValue(@[Материал заготовки][Диаметр], 5, null);
            Res = L * D * D * Ro * 3.1416G * 1000G / 4G; // приводим к граммам
            return support.createDblSimpleValue(Res,2,null);// округляем до сотых грамма
            break;
          case "Лента":
            BigDecimal B = support.getDoubleValue(@[Ширина заготовки], 5, null);
            BigDecimal Hlent = support.getDoubleValue(@[Материал заготовки][Толщина], 5, null);
            Res = Hlent * B * L * Ro * 1000G; // приводим к граммам
            return support.createDblSimpleValue(Res,2,null);// округляем до сотых грамма
            break;
          case "Лист":
          case "Листы":
          case "Полоса":
          case "Полосы":
          case "Листовое органическое стекло":
          case "Войлок":
          case "Паронит":
          case "Плита":
            BigDecimal Hl = support.getDoubleValue(@[Материал заготовки][Толщина], 5, null);
            BigDecimal B = support.getDoubleValue(@[Ширина заготовки], 5, null);
            Res = Hl * B * L * Ro * 1000G; // приводим к граммам
            return support.createDblSimpleValue(Res,2,null);// округляем до сотых грамма
            break;
          case "Труба":
            // Марка материала
            BigDecimal Dn = support.getDoubleValue(@[Материал заготовки][Наружный диаметр], 5, null);
            BigDecimal Hst = support.getDoubleValue(@[Материал заготовки][Толщина стенки], 5, null);
            Res = L * 3.1416G * (Dn * Dn – 4G * (Dn / 2G - Hst) * (Dn / 2G - Hst)) * Ro * 1000 / 4; // приводим к граммам
            return support.createDblSimpleValue(Res,2,null); // округляем до сотых грамма
            break;
          case "Шестигранник":
            BigDecimal Dvk = support.getDoubleValue(@[Материал заготовки][Диаметр], 5, null);
            Res = 0.86605G * Dvk * Dvk * L * Ro * 1000G; // приводим к граммам
            return support.createDblSimpleValue(Res,2,null); // округляем до сотых грамма
            break;
          default:
            return support.createDblSimpleValue(0,null,null);
            break;
        }
      }
      else
        return support.createDblSimpleValue(0,null,null);
    }
    catch (Exception ex) {
      return support.createDblSimpleValue(0,null,null);
    }
}