BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 28 мар 2024, 22:05

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 22 ] 
Автор Сообщение
СообщениеДобавлено: 06 апр 2015, 15:28 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Дано: плоский тариф 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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 апр 2015, 15:37 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Написал 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% баг


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 апр 2015, 15:50 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
http://habrahabr.ru/post/112953/
п.4.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 апр 2015, 20:47 
Не в сети
Разработчик

Зарегистрирован: 07 апр 2007, 23:51
Сообщения: 4489
Откуда: Уфа, Россия
Карма: 186
пофиксили, проверяйте


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 07 апр 2015, 08:16 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Спасибо за оперативность. Уже выставили руками, обновимся на следующей неделе.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 апр 2015, 07:26 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Обновился, проверил - всё ок.
Теперь посчитал как нужно - 333379.20


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 апр 2015, 11:31 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Алярм!

После обновления сломались тарифы, в которых цена указана за 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? Нам счета скоро выставлять.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 апр 2015, 11:38 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
О, я придумал хак временный: указываем в тарифе цену не 0.1 и не 0.10, а 0.10000000000 - тогда считает верно.
Т.е. баг есть, но можно временно его обойти задав нужный scale строки.
Фишка в том, что в конструкторе BigDecimal при создании из строки берётся scale этой строки.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 апр 2015, 12:58 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Fix будет?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 апр 2015, 13:01 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Cromeshnic писал(а):
Fix будет?

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 апр 2015, 13:29 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Второй баг - перестал работать узел "Множитель цены":

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 и "Множитель цены" его не видит


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 апр 2015, 20:26 
Не в сети
Разработчик

Зарегистрирован: 07 апр 2007, 23:51
Сообщения: 4489
Откуда: Уфа, Россия
Карма: 186
какая версия?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 30 апр 2015, 06:21 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
5.2


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01 май 2015, 14:49 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
ИСПРАВЛЕНО Kernel: Использование цены типа BigDecimal в bitel.billing.server.tariff.MultCostTariffTreeNode

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 02 май 2015, 02:00 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Cromeshnic писал(а):
ИСПРАВЛЕНО Kernel: Использование цены типа BigDecimal в bitel.billing.server.tariff.MultCostTariffTreeNode

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


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 02 май 2015, 15:44 
Не в сети
Разработчик

Зарегистрирован: 07 апр 2007, 23:51
Сообщения: 4489
Откуда: Уфа, Россия
Карма: 186
подправили, пробуйте


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 май 2015, 15:15 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Обновитесь еще раз. Там не работал горячий обсчет и еще поменяли слегка.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 май 2015, 16:01 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
У меня пока хотфикс в виде Jar-ки, через недельку обновлюсь


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 27 май 2015, 14:27 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
ага, следующий баг появился: при тарификации абсолютно все записи попадают в ошибки периодических процессов:

Код:
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() в калькуляторе.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 27 май 2015, 20:16 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
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 минут.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 28 май 2015, 16:45 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Не буду рисковать в конце месяца полным апдейтом - накачу только rscm.jar, пожалуй.
(Сделал diff по декомпиленным исходникам - вроде ничего больше не поменялось).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 28 май 2015, 16:53 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
накатил, пересчитал апрель - ошибки ушли


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 22 ] 

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
POWERED_BY
Русская поддержка phpBB
[ Time : 0.098s | 62 Queries | GZIP : On ]