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 ) );
|
Автор: | 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/ |