BiTel

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

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




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
СообщениеДобавлено: 07 май 2017, 23:58 
Не в сети

Зарегистрирован: 29 янв 2014, 11:32
Сообщения: 365
Карма: 10
Добрый день!

Вопрос следующий. При блокировке договоров:
Код:
         ContractStatus status = new ContractStatus();
         status.setContractId(contractId);
         status.setStatus(3);
         status.setComment("Недостаточно средств для начисления абонплаты");
         status.setDateFrom(new Date());
         status.setDateTo(null);
         ContractStatusManager contractStatusManager = new ContractStatusManager(con);
         contractStatusManager.changeStatus(status, 0);         
         con.commit();   


Не происходит сразу сброс состояний сервисов выделенных линий и текущих подключений абонентов.
Т.е. договор блокируется. Статус договора становится соответствующий, но при этом абонент подключен и продолжает работать. Т.е. сессия не сбрасывается. Так продолжается до тех пор, пока не закончит работу API-скрипт.
Дело в том, что мы пытаемся реализовать плавное отключение абонентов по балансу 1-го числа месяца. Т.е. не всех сразу, а постепенно. Таким образом предполагается работа скрипта несколько часов.
Блокировка договоров и начисление абонплат работает как положено. Но, как написал выше, не происходит сброс сессий абонентов и абонент остается активным. Каким образом можно принудительно установить соответствующее состояние сервиса "Отключен" и, соответственно, сбросить сессии?


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

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
Либо воспользоваться в ContractStatusManager
Код:
changeStatus(ContractStatus newStatus, java.lang.Integer userId, boolean processEvent)
Смена статуса договора.

и boolean ProcessEvent выставить в true, чтобы бросилось событие
либо вручную после смены статуса бросить событие
Код:
EventProcessor eventProcessor = EventProcessor.getInstance();
EventProcessor.getInstance().publish( new ContractStatusChangedEvent(status, 0) );
EventProcessor.getInstance().publish( new ContractStatusChangedTopicEvent(status, 0) );

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


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

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
Третий вариант - воспользоваться ContractStatusService

Код:
        ServerContext context = ServerContext.get();
        ContractStatusService contractStatusService = context.getService(ContractStatusService.class, 0);
        contractStatusService.contractStatusChange(cid, status, false);


Единственное НО, в ContractStatusService нельзя указывать пользователя.
Статус будет сменен под тем пользователем под которым запускался скрипт (если через планировщик - значит User.USER_SERVER)

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


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

Зарегистрирован: 29 янв 2014, 11:32
Сообщения: 365
Карма: 10
Спасибо большое!
Еще вопрос. Предположим выбрал вариант
Код:
changeStatus(ContractStatus newStatus, java.lang.Integer userId, boolean processEvent)

Не получится ли такой ситуации, произошла блокировка абонента, соответствующее состояние сервиса установилось, сессия сбросилась.
После этого абонент производит оплату, договор открывается. Абонент переподключается и работает.
При этом скрипт еще не закончил свою работу. При окончании работы скрипта не получится ли такой ситуации, что сервис переключится в состояние "Отключен"? Т.е. не будет ли заново запущено событие отключения на сервисе?


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

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
Не должно.
Конечно если только у вас скрипт не выбрал кучу договоров на отключение, в цикле начал перебирать договора и у вас в цикле же стоит задержка.
В таком случае абонент может оплатить, а потом до него в цикле дойдет задание на приостановку и его выключит.

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 09 май 2017, 17:28 
Не в сети

Зарегистрирован: 29 янв 2014, 11:32
Сообщения: 365
Карма: 10
Нет, Там оценка текущего баланса, блокировка договора и начисление абонплаты идут друг за другом без задержки. Задержка вставляется между договорами.
Кстати, получается 2-ой и 3-ий наверно не подходят. Потому как статус на данный момент ты установишь вручную, но потом, по окончании работы скрипта, состояние сервисов опять установится в "отключен", даже если абонент уже оплатил.


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

Зарегистрирован: 29 янв 2014, 11:32
Сообщения: 365
Карма: 10
К сожалению все 3 способа оказались не рабочие.
1 способ. Там true - означает посылать событие, а false означает не посылать его вовсе. Т.е. при false даже после окончания работы скрипта не происходит отключения абонентской сессии.
2 способ. Он как будто вообще ни на что не влияет. Если в методе changeStatus выставишь processEvent в true, то отключение срабатывает после окончания работы скрипта. Если false, то отключение абонента не происходит вовсе.
3 способ. Блокировка также происходит только после окончания работы скрипта.

Уважаемые разработчики, посоветуйте что-нибудь.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 май 2017, 12:43 
Не в сети

Зарегистрирован: 29 янв 2014, 11:32
Сообщения: 365
Карма: 10
Уважаемые разработчики, прокомментируйте, плиз, ситуацию. Можно ли как-то принудительно отправить событие или может по-другому решить проблему? Почему она вообще возникает?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 21 июл 2017, 18:01 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Вам нужно делать 3-м способом и взывать commit у context-а,а не у connection. Тогда скорее всего будет работать. События отправляются после commit-а context-а.


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

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


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

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


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

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