BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 03 дек 2022, 14:30

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




Начать новую тему Ответить на тему  [ Сообщений: 18 ] 
Автор Сообщение
 Заголовок сообщения: [6.1] Вопросы по API подписок
СообщениеДобавлено: 04 мар 2015, 16:09 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Добрый день!

Начинаю изучать API подписок, чтобы реализовать свою логику. Начал с простого - получить подписку и вывести ее реквизиты.
Код:
      SubscriptionService   ss = (SubscriptionService)ServerContext.get(ServerContext.class).getService( SubscriptionService.class, 0 );
      Subscription      s = ss.subscriptionGet( 1 );
      print(s.isActive());


Компилируется без ошибок, но при попытке запуска:
Код:

load class ru.usinsknet.subscription.SManager get method public void ru.usinsknet.subscription.SManager.execute(ru.bitel.bgbilling.server.util.Setup,ru.bitel.common.sql.ConnectionSet) throws java.lang.Exception new instance ru.usinsknet.subscription.SManager@428db243 ru.bitel.bgbilling.common.BGException: Table 'bgbilling.subscription' doesn't exist [42S02, 1146]    at ru.bitel.common.model.AbstractDao.processException(AbstractDao.java:98)    at ru.bitel.common.model.AbstractIdDao.get(AbstractIdDao.java:31)    at ru.bitel.bgbilling.modules.subscription.server.service.SubscriptionServiceImpl.subscriptionGet(SubscriptionServiceImpl.java:84)    at ru.usinsknet.subscription.SManager.execute(SManager.java:20)    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)    at java.lang.reflect.Method.invoke(Method.java:483)    at ru.bitel.bgbilling.kernel.dynamic.server.DynamicCodeServiceImpl.run(DynamicCodeServiceImpl.java:329)    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)    at java.lang.reflect.Method.invoke(Method.java:483)    at ru.bitel.bgbilling.kernel.container.service.server.ServiceInfo.invoke(ServiceInfo.java:101)    at ru.bitel.bgbilling.kernel.container.ws.server.AbstractJaxWsHandler.invoke0(AbstractJaxWsHandler.java:195)    at ru.bitel.bgbilling.kernel.container.ws.server.AbstractJaxWsHandler.access$0(AbstractJaxWsHandler.java:169)    at ru.bitel.bgbilling.kernel.container.ws.server.AbstractJaxWsHandler$1.run(AbstractJaxWsHandler.java:242)    at java.security.AccessController.doPrivileged(Native Method)    at javax.security.auth.Subject.doAs(Subject.java:422)    at ru.bitel.bgbilling.kernel.container.ws.server.AbstractJaxWsHandler.invoke(AbstractJaxWsHandler.java:236)    at ru.bitel.bgbilling.kernel.container.ws.server.JaxWsHandler.invoke(JaxWsHandler.java:315)    at ru.bitel.bgbilling.kernel.container.ws.server.AbstractJaxWsHandler$ServiceInstanceResolver$1.invoke(AbstractJaxWsHandler.java:335)    at com.sun.xml.ws.server.InvokerTube$2.invoke(InvokerTube.java:150)    at com.sun.xml.ws.server.sei.EndpointMethodHandler.invoke(EndpointMethodHandler.java:261)    at com.sun.xml.ws.server.sei.SEIInvokerTube.processRequest(SEIInvokerTube.java:100)    at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:641)    at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:600)    at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:585)    at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:482)    at com.sun.xml.ws.server.WSEndpointImpl$2.process(WSEndpointImpl.java:314)    at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:608)    at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:259)    at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:162)    at ru.bitel.bgbilling.kernel.container.ws.server.JaxWSAdapter.handle(JaxWSAdapter.java:288)    at bitel.billing.server.Executer.doPost(Unknown Source)    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)    at java.lang.Thread.run(Thread.java:745) Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'bgbilling.subscription' doesn't exist    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)    at java.lang.reflect.Constructor.newInstance(Constructor.java:408)    at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)    at com.mysql.jdbc.Util.getInstance(Util.java:384)    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4232)    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4164)    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2615)    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2776)    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2838)    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2082)    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2212)    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)    at ru.bitel.bgbilling.server.util.PreparedStatementWrapper.executeQuery(PreparedStatementWrapper.java:91)    at ru.bitel.common.model.AbstractDao.getById(AbstractDao.java:516)    at ru.bitel.common.model.AbstractDao.getImpl(AbstractDao.java:498)    at ru.bitel.common.model.AbstractIdDao.get(AbstractIdDao.java:27)    ... 51 more


При этом из клиента никаких проблем с подписками нет - создаются, показываются, модифицируются. Где я косячу?
Цитата:
Клиент: вер. 6.1.832 / 10.02.2015 19:17:01
os: Windows XP; java: Java HotSpot(TM) Client VM, v.1.7.0_71
Сервер: вер. 6.1.1042 / 26.02.2015 13:14:12
os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_31
ВНИМАНИЕ: Спецификация версии 1.8 не рекомендуется

inet: вер. 6.1.658 / 16.02.2015 21:20:29
mps: вер. 6.1.190 / 08.02.2015 20:45:41
npay: вер. 6.1.184 / 11.02.2015 04:02:21
reports: вер. 6.1.196 / 08.02.2015 20:45:22
rscm: вер. 6.1.172 / 08.02.2015 20:45:23
subscription: вер. 6.1.30 / 08.02.2015 20:45:31
tv: вер. 6.1.199 / 13.02.2015 21:47:50


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [6.1] Вопросы по API подписок
СообщениеДобавлено: 04 мар 2015, 16:17 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6053
Карма: 244
написано же Table 'bgbilling.subscription' doesn't exist
она exist? думаю, что нет, потому что там должен быть mid в имени этой таблицы, который вы зачем-то занулили

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [6.1] Вопросы по API подписок
СообщениеДобавлено: 04 мар 2015, 16:26 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Уважаемый, но что и где я занулил? Код, который генерирует данный exception я привел. Насколько я вижу в этом коде вообще ни где не указывается id модуля, а только id подписки (если верить документации API).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [6.1] Вопросы по API подписок
СообщениеДобавлено: 04 мар 2015, 16:38 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6053
Карма: 244
Вот именно, что не указывается, хотя должен указываться, очевидно, при получении имплементанта веб-сервиса данного конкретного экземпляра модуля в методе getService (второй параметр).

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [6.1] Вопросы по API подписок
СообщениеДобавлено: 04 мар 2015, 17:49 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Да, действительно. Спасибо за помощь. На ServerContext нет документации, приходится додумывать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [6.1] Вопросы по API подписок
СообщениеДобавлено: 04 мар 2015, 18:01 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Теперь еще вопросик:
судя по клиенту подписка и активна и автопродление включено. Галки стоят и там и там. И период подписки правильный. А код возвращает:
isActive() == false
isAvtoCommit() == true

Работаю с правильной подпиской, специально менял ей комментарий - getComment() возвращает именно мой комментарий. Можно ли вообще доверять функции isActive или самому работать со списком периодов?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [6.1] Вопросы по API подписок
СообщениеДобавлено: 04 мар 2015, 18:22 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6053
Карма: 244
в isActive проверяется: период подписки содержит сегодняшнюю дату + registration period имеет хоть одну запись + период этой записи (если их несколько то последнюю) тоже содержит now

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [6.1] Вопросы по API подписок
СообщениеДобавлено: 04 мар 2015, 18:27 
Не в сети
Разработчик

Зарегистрирован: 07 апр 2007, 23:51
Сообщения: 4482
Откуда: Уфа, Россия
Карма: 186
borisk писал(а):
Теперь еще вопросик:
судя по клиенту подписка и активна и автопродление включено. Галки стоят и там и там. И период подписки правильный. А код возвращает:
isActive() == false
isAvtoCommit() == true

Работаю с правильной подпиской, специально менял ей комментарий - getComment() возвращает именно мой комментарий. Можно ли вообще доверять функции isActive или самому работать со списком периодов?


работает если вы проинициализировали список с периодами подписок, методом
Код:
s.setRegistrationPeriodList( ss.subscriptionRegistrationPeriodList( subscriptionId ) );


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [6.1] Вопросы по API подписок
СообщениеДобавлено: 04 мар 2015, 18:28 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Ну вроде у меня так и есть (скрин прикладываю), а isActive() == false


Вложения:
1.png
1.png [ 62.63 КБ | Просмотров: 6265 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [6.1] Вопросы по API подписок
СообщениеДобавлено: 04 мар 2015, 18:32 
Не в сети
Разработчик

Зарегистрирован: 07 апр 2007, 23:51
Сообщения: 4482
Откуда: Уфа, Россия
Карма: 186
метод
Код:
ss.subscriptionGet( 1 )
не грузит учетные периоды подписок, см. выше


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [6.1] Вопросы по API подписок
СообщениеДобавлено: 04 мар 2015, 19:03 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Понял, спасибо, исправил.
А подскажите, пожалуйста, как теперь правильно
1) Получить стоимость активации подписки
2) Активировать подписку на следующий период

нашел SubscriptionUtils, но параметры там какие-то жуткие, включая SubscriptionDao


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [6.1] Вопросы по API подписок
СообщениеДобавлено: 04 мар 2015, 19:19 
Не в сети
Разработчик

Зарегистрирован: 07 апр 2007, 23:51
Сообщения: 4482
Откуда: Уфа, Россия
Карма: 186
Код:
   public void subscriptionActivate( Subscription subscription, Date initDate, int moduleId, int userId, boolean changeBalance, SubscriptionDao subscriptionDao )
       throws BGException
   {
      int contractId = subscription.getContractId();
      // проверяем, не активирована ли уже подписка
      int registrationPeriodId = subscription.getRegistrationPeriodId();
      if ( registrationPeriodId > 0 )
      {
          RegistrationPeriod registrationPeriod = new SubscriptionPeriodDao( con, moduleId, userId ).get( registrationPeriodId );
          if ( registrationPeriod != null )
          {
              PeriodWithTime lastRegistrationPeriod = registrationPeriod.getPeriod();
              if ( TimeUtils.dateInPeriod( initDate, lastRegistrationPeriod ) )
              {
                  throw new BGException( "Активация не возможна, так как на заданое время уже есть активный период." );
              }
          }
      }
      // проверка периода действия подписки
      PeriodWithTime subscriptionPeriod = subscription.getPeriod();
      if ( !TimeUtils.timeInRange( new Date(), subscriptionPeriod.getDateFrom(), subscriptionPeriod.getDateTo() ) )
      {
         throw new BGException( "Период подписки еще не наступил или уже закончился" );
      }
      // проверим если создать новый период, дата его окончания будет раньше,
      // даты окончания периода подписки
      SubscriptionType subscriptionType = new SubscriptionTypeDao( con, moduleId ).get( subscription.getTypeId() );
      PeriodWithTime newRegistrationPeriod = subscriptionType.getNewRegistrationPeriod( initDate );
      if ( subscriptionPeriod.getDateTo() != null && newRegistrationPeriod.getDateTo().after( subscriptionPeriod.getDateTo() ) )
      {
         throw new BGException( "Активация не возможна, так как дата окончания учетного периода выходит за период окончания подписки" );
      }
      BigDecimal cost = BigDecimal.ZERO;
      try( BalanceUtils bu = new BalanceUtils( con ) )
      {
         if ( changeBalance )
         {
            // находим стоимость подписки для сравнения с балансом
            List<TariffModuleTree> tariffModuleTrees = getSubscriptionTariffModuleTree( contractId, initDate, moduleId );
            if ( tariffModuleTrees == null || tariffModuleTrees.size() == 0 )
            {
               throw new BGException( "Активация не возможна, не найден актуальный тариф на дату - " + TimeUtils.formatDate( initDate ) );
            }
            cost = getSubscriptionCost( tariffModuleTrees, initDate, subscriptionType.getServiceId() );
            if ( cost == null )
            {
               throw new BGException( "Активация не возможна, в тарифе не найдена цена" );
            }
            // проверяем баланс, достаточно ли средств на продление подписки
            BigDecimal balanceSumma = bu.getBalance( initDate, contractId );
            // сравниваем стоимость подписки и кол-во средств на балансе
            if ( balanceSumma.compareTo( cost ) == -1 )
            {
               throw new BGMessageException( "Активация не возможна, не достаточно средств на балансе" );
            }
         }
         //
         subscriptionActivateApply( contractId, subscription.getId(), subscriptionType.getServiceId(), initDate, cost,
                                    newRegistrationPeriod, moduleId, userId, subscriptionDao, bu );
         
         // добавляем задание на продление подписки по ее окончанию, если у подписки стоит флаг автопродления
         addSubscriptionJob( subscription, moduleId, newRegistrationPeriod.getDateTo(), subscriptionDao );
         // кидаем событие
         EventProcessor.getInstance().publish( new SubscriptionActivateEvent( moduleId, subscription.getContractId(), userId, subscription.getId() ) );
      }
   }


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [6.1] Вопросы по API подписок
СообщениеДобавлено: 04 мар 2015, 19:31 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Спасибо, вроде все понятно кроме: getSubscriptionTariffModuleTree( contractId, initDate, moduleId );
где эта функция?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [6.1] Вопросы по API подписок
СообщениеДобавлено: 04 мар 2015, 19:36 
Не в сети
Разработчик

Зарегистрирован: 07 апр 2007, 23:51
Сообщения: 4482
Откуда: Уфа, Россия
Карма: 186
Код:
SubscriptionUtils.subscriptionActivate( Subscription subscription, Date initDate, int moduleId, int userId, boolean changeBalance, SubscriptionDao subscriptionDao )
SubscriptionUtils.addSubscriptionJob( Subscription subscription, int moduleId, Date jobDateTime, SubscriptionDao subscriptionDao )
SubscriptionUtils.subscriptionActivateApply( int contractId, int subscriptionId, int serviceId, Date initDate, BigDecimal cost, PeriodWithTime newRegistrationPeriod, int moduleId, int userId, SubscriptionDao subscriptionDao, BalanceUtils balanceUtils )
SubscriptionUtils.getSubscriptionTariffModuleTree( int contractId, Date initDate, int moduleId )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [6.1] Вопросы по API подписок
СообщениеДобавлено: 04 мар 2015, 23:15 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Мда, проглядел. Спасибо. :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [6.1] Вопросы по API подписок
СообщениеДобавлено: 30 мар 2015, 22:39 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Можно ли быть увереным, что Subscription.getRegistrationPeriodList() всегда вернет периоды в порядке их активации? (то есть сортированные по времени)? И, соответственно, Subscription.getRegistrationPeriodId указывает на id последнего периода в списке?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [6.1] Вопросы по API подписок
СообщениеДобавлено: 31 мар 2015, 00:41 
Не в сети
Разработчик

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [6.1] Вопросы по API подписок
СообщениеДобавлено: 31 мар 2015, 14:49 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Получить последний период. Но уже увидел в вашем примере, что это делается через SubscriptionPeriodDao


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

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


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

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


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

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