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

[6.1] Вопросы по API подписок
http://forum.bitel.ru/viewtopic.php?f=60&t=10250
Страница 1 из 1

Автор:  borisk [ 04 мар 2015, 16:09 ]
Заголовок сообщения:  [6.1] Вопросы по API подписок

Добрый день!

Начинаю изучать 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

Автор:  dimOn [ 04 мар 2015, 16:17 ]
Заголовок сообщения:  Re: [6.1] Вопросы по API подписок

написано же Table 'bgbilling.subscription' doesn't exist
она exist? думаю, что нет, потому что там должен быть mid в имени этой таблицы, который вы зачем-то занулили

Автор:  borisk [ 04 мар 2015, 16:26 ]
Заголовок сообщения:  Re: [6.1] Вопросы по API подписок

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

Автор:  dimOn [ 04 мар 2015, 16:38 ]
Заголовок сообщения:  Re: [6.1] Вопросы по API подписок

Вот именно, что не указывается, хотя должен указываться, очевидно, при получении имплементанта веб-сервиса данного конкретного экземпляра модуля в методе getService (второй параметр).

Автор:  borisk [ 04 мар 2015, 17:49 ]
Заголовок сообщения:  Re: [6.1] Вопросы по API подписок

Да, действительно. Спасибо за помощь. На ServerContext нет документации, приходится додумывать.

Автор:  borisk [ 04 мар 2015, 18:01 ]
Заголовок сообщения:  Re: [6.1] Вопросы по API подписок

Теперь еще вопросик:
судя по клиенту подписка и активна и автопродление включено. Галки стоят и там и там. И период подписки правильный. А код возвращает:
isActive() == false
isAvtoCommit() == true

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

Автор:  dimOn [ 04 мар 2015, 18:22 ]
Заголовок сообщения:  Re: [6.1] Вопросы по API подписок

в isActive проверяется: период подписки содержит сегодняшнюю дату + registration period имеет хоть одну запись + период этой записи (если их несколько то последнюю) тоже содержит now

Автор:  skn [ 04 мар 2015, 18:27 ]
Заголовок сообщения:  Re: [6.1] Вопросы по API подписок

borisk писал(а):
Теперь еще вопросик:
судя по клиенту подписка и активна и автопродление включено. Галки стоят и там и там. И период подписки правильный. А код возвращает:
isActive() == false
isAvtoCommit() == true

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


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

Автор:  borisk [ 04 мар 2015, 18:28 ]
Заголовок сообщения:  Re: [6.1] Вопросы по API подписок

Ну вроде у меня так и есть (скрин прикладываю), а isActive() == false

Вложения:
1.png
1.png [ 62.63 КБ | Просмотров: 8957 ]

Автор:  skn [ 04 мар 2015, 18:32 ]
Заголовок сообщения:  Re: [6.1] Вопросы по API подписок

метод
Код:
ss.subscriptionGet( 1 )
не грузит учетные периоды подписок, см. выше

Автор:  borisk [ 04 мар 2015, 19:03 ]
Заголовок сообщения:  Re: [6.1] Вопросы по API подписок

Понял, спасибо, исправил.
А подскажите, пожалуйста, как теперь правильно
1) Получить стоимость активации подписки
2) Активировать подписку на следующий период

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

Автор:  skn [ 04 мар 2015, 19:19 ]
Заголовок сообщения:  Re: [6.1] Вопросы по API подписок

Код:
   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() ) );
      }
   }

Автор:  borisk [ 04 мар 2015, 19:31 ]
Заголовок сообщения:  Re: [6.1] Вопросы по API подписок

Спасибо, вроде все понятно кроме: getSubscriptionTariffModuleTree( contractId, initDate, moduleId );
где эта функция?

Автор:  skn [ 04 мар 2015, 19:36 ]
Заголовок сообщения:  Re: [6.1] Вопросы по API подписок

Код:
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 )

Автор:  borisk [ 04 мар 2015, 23:15 ]
Заголовок сообщения:  Re: [6.1] Вопросы по API подписок

Мда, проглядел. Спасибо. :)

Автор:  borisk [ 30 мар 2015, 22:39 ]
Заголовок сообщения:  Re: [6.1] Вопросы по API подписок

Можно ли быть увереным, что Subscription.getRegistrationPeriodList() всегда вернет периоды в порядке их активации? (то есть сортированные по времени)? И, соответственно, Subscription.getRegistrationPeriodId указывает на id последнего периода в списке?

Автор:  skn [ 31 мар 2015, 00:41 ]
Заголовок сообщения:  Re: [6.1] Вопросы по API подписок

нет, так как во время получения списка периодов может быть активирован новый период
а какая цель то?

Автор:  borisk [ 31 мар 2015, 14:49 ]
Заголовок сообщения:  Re: [6.1] Вопросы по API подписок

Получить последний период. Но уже увидел в вашем примере, что это делается через SubscriptionPeriodDao

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