forum.bitel.ru http://forum.bitel.ru/ |
|
Добавление персонального тарифа и Calculator http://forum.bitel.ru/viewtopic.php?f=19&t=10896 |
Страница 1 из 1 |
Автор: | vkulakov [ 15 сен 2015, 17:44 ] |
Заголовок сообщения: | Добавление персонального тарифа и Calculator |
На изменение тарифного плана повесил динамический код, который добавляет персональный тарифный план и делает перерасчет для договора. По коду сначала устанавливается ПТ и после этого запускается Calculator. После установки ПТ бросаются события: Код: ep = EventProcessor.getInstance(); ep.publish(new ContractTariffChangedEvent(contractId)); ep.publish(new PersonalTariffUpdateEvent(userId, contractId, subTariffId)); После события вызывается Calculator, но он почему-то не учитывает только что сделанные изменения с тарифом. Если персональный тариф добавился скриптом, то Calculator считает, что никакого персонального тарифа нет вовсе. Вместо publish пробовал publishAfterCommit, но результат тот же. Думаю, что нужно вызвать commit принудительно перед перерасчётом, но не знаю как это сделать. Может кто-нибудь посоветовать, как правильно вызвать Calculator сразу после изменения персонального тарифа? |
Автор: | stark [ 15 сен 2015, 18:36 ] |
Заголовок сообщения: | Re: Добавление персонального тарифа и Calculator |
Там надо сделать оповестить об изменениях. Код: List<TariffTreeModifiedEvent> events = new ArrayList<TariffTreeModifiedEvent>(); new TariffTreeBuilder( con ).getMtreeModifiedEvents( mtreeId, userID, events ); for( TariffTreeModifiedEvent event : events ) { EventProcessor.getInstance().publish( event ); } А так сложно нужно делать, если у вас используется наследование деревьев. |
Автор: | vkulakov [ 15 сен 2015, 18:56 ] |
Заголовок сообщения: | Re: Добавление персонального тарифа и Calculator |
Приведённый код у меня уже есть, но с ним не работает. Кстати, да. Перерасчёт выполняется неправильно только при изменении дерева персонального тарифа с одного на другое. При добавлении и удалении ПТ перерасчёт даёт правильные результаты. И да, там используется наследование от глобальных тарифов. Что делать, если есть наследование? |
Автор: | stark [ 15 сен 2015, 19:41 ] |
Заголовок сообщения: | Re: Добавление персонального тарифа и Calculator |
vkulakov писал(а): Приведённый код у меня уже есть, но с ним не работает. Кстати, да. Перерасчёт выполняется неправильно только при изменении дерева персонального тарифа с одного на другое. При добавлении и удалении ПТ перерасчёт даёт правильные результаты. И да, там используется наследование от глобальных тарифов. Что делать, если есть наследование? Если вручную изменить персональный тариф и оповестить об изменениях, то переобсчет работает ? |
Автор: | vkulakov [ 15 сен 2015, 21:31 ] |
Заголовок сообщения: | Re: Добавление персонального тарифа и Calculator |
Так ведь в стандартной комплектации пересчёт никогда не делается при изменении тарифов? Если вы имеете в виду мой скрипт, то он начинает правильно считать даже если просто сразу пересохранить тариф. Т. е. поменял тариф на договоре на другой, сработал скрипт изменения ПТ и Calculator показал неправильное значение. Открываю тариф, жму ОК, опять срабатывает скрипт и Calculator уже показывает правильные значения. |
Автор: | vkulakov [ 16 сен 2015, 14:02 ] |
Заголовок сообщения: | Re: Добавление персонального тарифа и Calculator |
Такое ощущение, что информация о дереве персонального тарифа сохранена где-то в кеше потока, и при изменении дерева этот кеш в текущем потоке никак не обновляется. При пересохранении тарифа вызывается новое события, которое обрабатывается в новом потоке с уже новым кешем и всё работает как положено. Правильно ли я думаю? Можно ли принудительно обновить этот кеш? |
Автор: | vkulakov [ 16 сен 2015, 14:11 ] |
Заголовок сообщения: | Re: Добавление персонального тарифа и Calculator |
При изменении дерева персонального тарифа добавил события: Код: ep.publish(new ContractTariffChangedEvent(contractId)); ep.publish(new PersonalTariffUpdateEvent(userId, contractId, subTariffId)); ep.publish(new PersonalTariffTreeUpdateEvent(userId, contractId, subTariffId)); и начались чудеса: после изменения тарифа на договоре сначала появляется правильная наработка от текущего тарифа, потом она меняется на неправильную наработку от предыдущего тарифа. Всё это очень странно... |
Автор: | vkulakov [ 16 сен 2015, 17:25 ] |
Заголовок сообщения: | Re: Добавление персонального тарифа и Calculator |
Может кто-нибудь помочь мне с описанной проблемой? |
Автор: | stark [ 16 сен 2015, 17:54 ] |
Заголовок сообщения: | Re: Добавление персонального тарифа и Calculator |
А попробуйте все события вызывать publishAfterCommit . |
Автор: | vkulakov [ 16 сен 2015, 18:01 ] |
Заголовок сообщения: | Re: Добавление персонального тарифа и Calculator |
Переделал всё на publishAfterCommit. Результат тот же - сначала неправильно, после пересохранения правильно. |
Автор: | stark [ 16 сен 2015, 18:08 ] |
Заголовок сообщения: | Re: Добавление персонального тарифа и Calculator |
пробовать надо и разбираться. |
Автор: | vkulakov [ 16 сен 2015, 18:19 ] |
Заголовок сообщения: | Re: Добавление персонального тарифа и Calculator |
А костыль временный можете посоветовать? |
Автор: | vkulakov [ 17 сен 2015, 23:02 ] |
Заголовок сообщения: | Re: Добавление персонального тарифа и Calculator |
Вроде стало понятнее. Сейчас для изменения дерева персонального тарифа использую такой код: Код: ttb.createMtree(subTreeId, NPAY_MID, parentTreeId); try { ttb.getMtreeModifiedEvents(subModuleTreeId, userId, events); for(TariffTreeModifiedEvent event : events) { ep.publish(event); } } catch(BGException e) { error("Ошибка получения событий: " + e.getMessage()); } ep.publish(event) нужен для того, чтобы после изменения дерева для персонального тарифа в кеше обновилась соответствующая информация о дереве. Но обработка этого события происходит асинхронно и до вызова калькулятора информация о дереве ещё не успевает обновиться. Для решения проблемы можно бросить события в асинхронном режиме, но я не знаю как. Может кто-нибудь подсказать, есть ли возможность бросить события в синхронном режиме? |
Автор: | vkulakov [ 18 сен 2015, 14:54 ] |
Заголовок сообщения: | Re: Добавление персонального тарифа и Calculator |
На свежую голову, наконец-то, придумал нормальное решение. Вместо изменение родителя поддерева модуля персонального тарифа и публикации событий TariffTreeModifiedEvent я теперь целиком удаляю дерево персонального тарифа и создаю новое. В этом случае в кеше поддерева модуля ещё нет и при перерасчёте данные берутся не из кеша, а напрямую из базы. При тестировании статусы меняются в соответствии с ожиданиями, наработка пересчитывается правильно, в логах ничего подозрительно тоже нет. Думаю, так и оставлю. |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |