forum.bitel.ru
http://forum.bitel.ru/

[BUG] При тарификации появляются некорректные дроби (CRM)
http://forum.bitel.ru/viewtopic.php?f=17&t=10371
Страница 1 из 1

Автор:  Cromeshnic [ 06 апр 2015, 15:28 ]
Заголовок сообщения:  [BUG] При тарификации появляются некорректные дроби

Дано: плоский тариф 0.6р за единицу услуги
Количество = 555632
Считаем на калькуляторе - получается 333379.2
Считаем модулем RSCM - получаем 333379.21875
Не можем выставить счета клиентам из-за этого.

Код:
mysql> select * from rscm_service_account_5_201504 where cid=204561;
+-------+--------+-----+------------+--------+---------+
| id    | cid    | sid | date       | amount | comment |
+-------+--------+-----+------------+--------+---------+
| 31931 | 204561 | 591 | 2015-04-30 | 555632 |         |
+-------+--------+-----+------------+--------+---------+
1 row in set (0.01 sec)

mysql> select * from contract_account where cid=204561;
+------+----+--------+-----+--------------+
| yy   | mm | cid    | sid | summa        |
+------+----+--------+-----+--------------+
| 2015 |  4 | 204561 | 591 | 333379.21875 |
+------+----+--------+-----+--------------+
1 row in set (0.00 sec)

mysql> select * from mtree_node where id=234389;
+--------+-------------+----------+------+----------------+-----+
| id     | parent_node | mtree_id | type | data           | pos |
+--------+-------------+----------+------+----------------+-----+
| 234389 |      234387 |    24291 | cost | col&1%cost&0.6 |   0 |
+--------+-------------+----------+------+----------------+-----+
1 row in set (0.00 sec)


Посмотрел по коду - вроде тоже всё просто. Но куча приведений типов к float, double. Возможно где-то тут косяк.
(При делении на float-единицу? :) )

Сервер: вер. 5.2 сборка 1618 от 28.01.2015 21:38:59
os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.6.0_22
rscm вер. 5.2 сборка 173 от 15.04.2014 11:37:53

Автор:  Cromeshnic [ 06 апр 2015, 15:37 ]
Заголовок сообщения:  Re: [BUG] При тарификации появляются некорректные дроби

Написал BGBS-скрипт для проверки на основе декомпиленного кода из RSCM:

Код:
long amount = 555632L;
Long divisor = 1L;
Float cost = 0.6;

double summa = (float)amount * (cost.floatValue() / (float)divisor.longValue());
print(summa);


выдаёт те же самые лишние копейки:

Код:
GENERATE_TIME: 06.04.15 17:33:39
EXECUTION_STOP_TIME: 06.04.15 17:33:39
PROCESS_TIME: 59

OUT:
333379.21875


Ну т.е. 100% баг

Автор:  Cromeshnic [ 06 апр 2015, 15:50 ]
Заголовок сообщения:  Re: [BUG] При тарификации появляются некорректные дроби

http://habrahabr.ru/post/112953/
п.4.

Впрочем, разработчики всё это уже давно знают, я думаю. Даже где-то всплывало тут вроде.
Просто модуль RSCM похоже очень давно написан.

Автор:  skn [ 06 апр 2015, 20:47 ]
Заголовок сообщения:  Re: [BUG] При тарификации появляются некорректные дроби

пофиксили, проверяйте

Автор:  Cromeshnic [ 07 апр 2015, 08:16 ]
Заголовок сообщения:  Re: [BUG] При тарификации появляются некорректные дроби (CRM

Спасибо за оперативность. Уже выставили руками, обновимся на следующей неделе.

Автор:  Cromeshnic [ 16 апр 2015, 07:26 ]
Заголовок сообщения:  Re: [BUG] При тарификации появляются некорректные дроби (CRM

Обновился, проверил - всё ок.
Теперь посчитал как нужно - 333379.20

Автор:  Cromeshnic [ 29 апр 2015, 11:31 ]
Заголовок сообщения:  Re: [BUG] При тарификации появляются некорректные дроби (CRM

Алярм!

После обновления сломались тарифы, в которых цена указана за x единиц услуги.
Например, цена 0.10 за 1024 единицы
В результате выдаёт всегда 0, т.к. при обсчёте:
Код:
amount.multiply(cost.divide(divisor, RoundingMode.HALF_UP))

Т.е. сначала мы 0.10 делим на 1024, а уже затем умножаем на amount!
Судя по документации BigDecimal, после cost.divide(divisor, RoundingMode.HALF_UP) он сразу делает округление до scale объекта cost (т.е. до 2 знаков) - получаем цену за 1 единицу=0.

Можете пофиксить оперативно для 5.2? Нам счета скоро выставлять.

Автор:  Cromeshnic [ 29 апр 2015, 11:38 ]
Заголовок сообщения:  Re: [BUG] При тарификации появляются некорректные дроби (CRM

О, я придумал хак временный: указываем в тарифе цену не 0.1 и не 0.10, а 0.10000000000 - тогда считает верно.
Т.е. баг есть, но можно временно его обойти задав нужный scale строки.
Фишка в том, что в конструкторе BigDecimal при создании из строки берётся scale этой строки.

Автор:  Cromeshnic [ 29 апр 2015, 12:58 ]
Заголовок сообщения:  Re: [BUG] При тарификации появляются некорректные дроби (CRM

Fix будет?

Автор:  stark [ 29 апр 2015, 13:01 ]
Заголовок сообщения:  Re: [BUG] При тарификации появляются некорректные дроби (CRM

Cromeshnic писал(а):
Fix будет?

да, озадачили человека.

Автор:  Cromeshnic [ 29 апр 2015, 13:29 ]
Заголовок сообщения:  Re: [BUG] При тарификации появляются некорректные дроби (CRM

Второй баг - перестал работать узел "Множитель цены":

bitel.billing.server.tariff.MultCostTariffTreeNode:

Код:
...
if (minCost != null)
    {
      minCost = Float.valueOf(minCost.floatValue() * this.multiplier);
      request.setResponseParam("min_cost", minCost);
    }
    else if (cost != null)
    {
      if ((cost instanceof Float))
      {
        Float costF = Float.valueOf(((Float)cost).floatValue() * this.multiplier);
        request.setResponseParam("cost", costF);
      }
      else if ((cost instanceof Double))
      {
        Double costD = Double.valueOf(((Double)cost).doubleValue() * this.multiplier);
        request.setResponseParam("cost", costD);
      }
    }
...


Теперь объект cost стал BigDecimal и "Множитель цены" его не видит

Автор:  skn [ 29 апр 2015, 20:26 ]
Заголовок сообщения:  Re: [BUG] При тарификации появляются некорректные дроби (CRM

какая версия?

Автор:  Cromeshnic [ 30 апр 2015, 06:21 ]
Заголовок сообщения:  Re: [BUG] При тарификации появляются некорректные дроби (CRM

5.2

Автор:  Cromeshnic [ 01 май 2015, 14:49 ]
Заголовок сообщения:  Re: [BUG] При тарификации появляются некорректные дроби (CRM

ИСПРАВЛЕНО Kernel: Использование цены типа BigDecimal в bitel.billing.server.tariff.MultCostTariffTreeNode

ок, а первый баг с делением цены на x единиц услуги поправили?

Автор:  stark [ 02 май 2015, 02:00 ]
Заголовок сообщения:  Re: [BUG] При тарификации появляются некорректные дроби (CRM

Cromeshnic писал(а):
ИСПРАВЛЕНО Kernel: Использование цены типа BigDecimal в bitel.billing.server.tariff.MultCostTariffTreeNode

ок, а первый баг с делением цены на x единиц услуги поправили?


до праздников не успели. Видимо, уже после. Пока же есть workaround.

Автор:  skn [ 02 май 2015, 15:44 ]
Заголовок сообщения:  Re: [BUG] При тарификации появляются некорректные дроби (CRM

подправили, пробуйте

Автор:  stark [ 05 май 2015, 15:15 ]
Заголовок сообщения:  Re: [BUG] При тарификации появляются некорректные дроби (CRM

Обновитесь еще раз. Там не работал горячий обсчет и еще поменяли слегка.

Автор:  Cromeshnic [ 05 май 2015, 16:01 ]
Заголовок сообщения:  Re: [BUG] При тарификации появляются некорректные дроби (CRM

У меня пока хотфикс в виде Jar-ки, через недельку обновлюсь

Автор:  Cromeshnic [ 27 май 2015, 14:27 ]
Заголовок сообщения:  Re: [BUG] При тарификации появляются некорректные дроби (CRM

ага, следующий баг появился: при тарификации абсолютно все записи попадают в ошибки периодических процессов:

Код:
scheduler 05-27/16:14:30 ERROR [pool-1-thread-2] Calculator - Tariff request wasn't processed: accepted => true relevance => -1 REQ: sid => 230 time => 02.04.2015 00:00:00 RESP: divisor => 1 cost => 20.0 HIST:


Ну т.е. "accepted => true", но при этом "Tariff request wasn't processed"

Судя по всему, забыли установить в переменной accepted=tariffRequest.wasAccepted() в калькуляторе.

Автор:  stark [ 27 май 2015, 20:16 ]
Заголовок сообщения:  Re: [BUG] При тарификации появляются некорректные дроби (CRM

Cromeshnic писал(а):
ага, следующий баг появился: при тарификации абсолютно все записи попадают в ошибки периодических процессов:

Код:
scheduler 05-27/16:14:30 ERROR [pool-1-thread-2] Calculator - Tariff request wasn't processed: accepted => true relevance => -1 REQ: sid => 230 time => 02.04.2015 00:00:00 RESP: divisor => 1 cost => 20.0 HIST:


Ну т.е. "accepted => true", но при этом "Tariff request wasn't processed"

Судя по всему, забыли установить в переменной accepted=tariffRequest.wasAccepted() в калькуляторе.


Да, там поломали версии 6.0 и 5.2. Остальные правильно работают. Обновление выкладывается, будет в течении 20 минут.

Автор:  Cromeshnic [ 28 май 2015, 16:45 ]
Заголовок сообщения:  Re: [BUG] При тарификации появляются некорректные дроби (CRM

Не буду рисковать в конце месяца полным апдейтом - накачу только rscm.jar, пожалуй.
(Сделал diff по декомпиленным исходникам - вроде ничего больше не поменялось).

Автор:  Cromeshnic [ 28 май 2015, 16:53 ]
Заголовок сообщения:  Re: [BUG] При тарификации появляются некорректные дроби (CRM

накатил, пересчитал апрель - ошибки ушли

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/