forum.bitel.ru http://forum.bitel.ru/ |
|
Ошибка при попытке получить параметры тарифа http://forum.bitel.ru/viewtopic.php?f=19&t=7426 |
Страница 1 из 1 |
Автор: | lda [ 14 ноя 2012, 18:11 ] |
Заголовок сообщения: | Ошибка при попытке получить параметры тарифа |
Доброго времени суток. Пытаюсь получить параметры тарифа в биллинге вер. 5.2: Код: package ru.ttk.billing.event.GlobalScript; import bitel.billing.server.contract.bean.ContractManager; import bitel.billing.server.tariff.TariffTreeSet; import java.util.Calendar; import java.util.GregorianCalendar; import ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase; import ru.bitel.bgbilling.server.util.Setup; import ru.bitel.common.sql.ConnectionSet; public class test extends GlobalScriptBase{ @Override public void execute( Setup setup, ConnectionSet connectionSet ) throws Exception{ Calendar dt = new GregorianCalendar(); int cid = 79343; TariffTreeSet tts = new ContractManager(connectionSet.getConnection()).getRealtimeTariffTreeSet(cid, dt, "npay", 7, true); } } Получаю ошибку: Код: 11-14/16:05:04 ERROR ["http-bio-/0.0.0.0-8080"-exec-2] LoggingPrintStream - java.lang.InstantiationException: ru.bitel.bgbilling.modules.npay.tariff.server.CalculateModeTariffTreeNode 11-14/16:05:04 ERROR ["http-bio-/0.0.0.0-8080"-exec-2] LoggingPrintStream - at java.lang.Class.newInstance0(Class.java:340) 11-14/16:05:04 ERROR ["http-bio-/0.0.0.0-8080"-exec-2] LoggingPrintStream - at java.lang.Class.newInstance(Class.java:308) 11-14/16:05:04 ERROR ["http-bio-/0.0.0.0-8080"-exec-2] LoggingPrintStream - at bitel.billing.server.tariff.TariffModuleTree.createNode(TariffModuleTree.java:206) 11-14/16:05:04 ERROR ["http-bio-/0.0.0.0-8080"-exec-2] LoggingPrintStream - at bitel.billing.server.tariff.TariffModuleTree.loadTree(TariffModuleTree.java:133) 11-14/16:05:04 ERROR ["http-bio-/0.0.0.0-8080"-exec-2] LoggingPrintStream - at bitel.billing.server.tariff.TariffModuleTree.load(TariffModuleTree.java:39) 11-14/16:05:04 ERROR ["http-bio-/0.0.0.0-8080"-exec-2] LoggingPrintStream - at bitel.billing.server.tariff.TariffTreeSet.getModuleTree(TariffTreeSet.java:51) 11-14/16:05:04 ERROR ["http-bio-/0.0.0.0-8080"-exec-2] LoggingPrintStream - at bitel.billing.server.tariff.TariffTreeSet.addTariffTree(TariffTreeSet.java:73) 11-14/16:05:04 ERROR ["http-bio-/0.0.0.0-8080"-exec-2] LoggingPrintStream - at bitel.billing.server.contract.bean.ContractManager.getRealtimeTariffTreeSet(ContractManager.java:656) 11-14/16:05:04 ERROR ["http-bio-/0.0.0.0-8080"-exec-2] LoggingPrintStream - at bitel.billing.server.contract.bean.ContractManager.getRealtimeTariffTreeSet(ContractManager.java:597) 11-14/16:05:04 ERROR ["http-bio-/0.0.0.0-8080"-exec-2] LoggingPrintStream - at ru.ttk.billing.event.GlobalScript.test.execute(test.java:26) .... Прошу подсказать, что я делаю не так. |
Автор: | lda [ 15 ноя 2012, 12:12 ] |
Заголовок сообщения: | Re: Ошибка при попытке получить параметры тарифа |
Код: TariffTreeSet tts = new ContractManager( connectionSet.getConnection() ).getRealtimeTariffTreeSet( cid, dt, "ipn", 4, true ); Для модуля IPN работает. Подскажите как в биллинге 5.2 получить параметры тарифа для модуля NPAY. |
Автор: | lda [ 15 ноя 2012, 12:45 ] |
Заголовок сообщения: | Re: Ошибка при попытке получить параметры тарифа |
Под параметрами тарифа модуля NPAY, я подразумеваю не только размер абонплаты, но еще и режим снятия (месячный, дневной и т.д.). На форуме и в wiki есть примеры получения размера абонплаты. Как получить режим снятия? |
Автор: | lda [ 16 ноя 2012, 12:25 ] |
Заголовок сообщения: | Re: Ошибка при попытке получить параметры тарифа |
Жаль что диалога не получилось... Приведу пример, того как можно получить параметры тарифа, скрипт рассчитан только на 2 режима списания: месячный и дневной. Как будет работать в других условиях я не знаю. Код: package ru.ttk.billing.event.GlobalScript; import bitel.billing.common.TimeUtils; import bitel.billing.server.npay.bean.ServiceObject; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Calendar; import java.util.Collections; import java.util.List; import ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase; import ru.bitel.bgbilling.kernel.tariff.tree.server.TariffModuleTree; import ru.bitel.bgbilling.kernel.tariff.tree.server.TariffModuleTreeSet; import ru.bitel.bgbilling.kernel.tariff.tree.server.TariffModuleTreeSetDao; import ru.bitel.bgbilling.modules.npay.tariff.server.NPayTariffContext; import ru.bitel.bgbilling.modules.npay.tariff.server.NPayTariffRequest; import ru.bitel.bgbilling.server.util.Setup; import ru.bitel.common.Preferences; import ru.bitel.common.model.Period; import ru.bitel.common.sql.ConnectionSet; /** * * @author lda */ public class test extends GlobalScriptBase{ @Override public void execute( Setup setup, ConnectionSet connectionSet ) throws Exception{ int cid = 79343; int mid = 7; Calendar dt = TimeUtils.clear_HOUR_MIN_MIL_SEC(Calendar.getInstance()); Calendar startMonth = TimeUtils.getStartMonth( dt ); Calendar endMonth = TimeUtils.getEndMonth( dt ); int daysInMonth = startMonth.getActualMaximum( Calendar.DAY_OF_MONTH ); Connection con = connectionSet.getConnection(); Connection conSlave = connectionSet.getSlaveConnection(); try { TariffModuleTreeSetDao tariffModuleTreeSetDao = new TariffModuleTreeSetDao( con ); Preferences moduleSetup = setup.getModuleSetup( mid ); NPayTariffContext context = new NPayTariffContext( moduleSetup, con, mid, startMonth, endMonth, endMonth, String.valueOf(cid), null ); context.setPrecalcOpenPeriod( new Period( TimeUtils.convertCalendarToDate( startMonth ), null ) ); String query = "SELECT cid, sid, col, emid, eid " + "FROM npay_service_object_" + mid + " " + "WHERE (date1 IS NULL OR date1<=?) AND (date2 IS NULL OR date2>=?) "; query += " AND cid IN (" + cid + ")"; query += " ORDER BY cid, sid"; PreparedStatement ps = conSlave.prepareStatement( query ); ps.setDate( 1, TimeUtils.convertCalendarToSqlDate( dt ) ); ps.setDate( 2, TimeUtils.convertCalendarToSqlDate( dt ) ); ResultSet rs = ps.executeQuery(); while( rs.next() ){ ServiceObject serviceObject = new ServiceObject(); serviceObject.setContractId( rs.getInt( 1 ) ); serviceObject.setServiceId( rs.getInt( 2 ) ); serviceObject.setDate1( TimeUtils.convertCalendarToDate(startMonth )); serviceObject.setDate2( TimeUtils.convertCalendarToDate(endMonth ) ); serviceObject.setCol( rs.getInt( 3 ) ); serviceObject.setEntityMid( rs.getInt( 4 ) ); serviceObject.setEntityId( rs.getInt( 5 ) ); int emid = serviceObject.getEntityMid(); int eid = serviceObject.getEntityId(); int col = serviceObject.getCol(); int sid = serviceObject.getServiceId(); Calendar serviceStart = TimeUtils.convertDateToCalendar( serviceObject.getDate1() ); Calendar serviceEnd = TimeUtils.convertDateToCalendar( serviceObject.getDate2() ); Calendar date1 = (Calendar)serviceStart.clone(); Calendar date2 = (Calendar)serviceEnd.clone(); TariffModuleTreeSet tts = tariffModuleTreeSetDao.getTariffTreeSetForDay(cid, dt, "npay", mid, emid, eid); for( TariffModuleTreeSet.Entry tariffPeriod : tts.entries() ){ List<NPayTariffRequest.NPayServiceCost> serviceCostList = Collections.singletonList( new NPayTariffRequest.NPayServiceCost( sid, serviceStart, serviceEnd, date1, date2, col ) ); NPayTariffRequest req = new NPayTariffRequest( mid, cid, sid ); req.setInfoEnable( true ); req.setConnectionSet( connectionSet ); req.setAccountingMonthDays( daysInMonth ); req.setTime( date1 ); req.setServiceCost( sid, serviceCostList); final TariffModuleTree tree = tariffPeriod.getTree(); tree.execute( req, context ); if( req.isAccepted() ){ boolean isDayMode = req.toString().indexOf("Day mode") != -1; for( NPayTariffRequest.NPayServiceCost serviceCost : req.getServiceCostList() ){ print("cost="+serviceCost.cost); print("isDayMode="+isDayMode); } } } } ps.close(); tariffModuleTreeSetDao.freeResources(); }catch( Exception e ){ e.printStackTrace(); } } } Криво конечно, но работает. Если кто нибудь приведет другой пример, буду благодарен. |
Автор: | snark [ 17 ноя 2012, 01:36 ] |
Заголовок сообщения: | Re: Ошибка при попытке получить параметры тарифа |
lda писал(а): Код: ... FROM npay_service_object_" + mid + " " + "WHERE (date1 IS NULL OR date1<=?) ... Дата начала действия услуги может быть не установлена? |
Автор: | aiwbend [ 18 ноя 2012, 00:54 ] |
Заголовок сообщения: | Re: Ошибка при попытке получить параметры тарифа |
Для меня тоже тема получения цен актуальна, хотел сделать генерируемый прайс лист, но все руки не доходят. Писал запрос на получение цен с помесячным снятием, на вики вроде был, но там не учитываются тарифы с копированным деревом, что очень не удобно. Код из первого поста у меня отрабатывается без ошибок, те лист возвращает, но я не смотрел есть в нем чтото или нет. PS. Еще думал в сторону функций mysql, думаю через них было бы удачнее эту задачу реализовать, и получать суммы, режим списания, множители простыми запросами в БД. |
Автор: | lda [ 19 ноя 2012, 12:00 ] |
Заголовок сообщения: | Re: Ошибка при попытке получить параметры тарифа |
snark писал(а): lda писал(а): Код: ... FROM npay_service_object_" + mid + " " + "WHERE (date1 IS NULL OR date1<=?) ... Дата начала действия услуги может быть не установлена? В теории может, на практике маловероятно. Это просто общий подход к объектам, имеющим период действия. |
Автор: | lda [ 19 ноя 2012, 12:08 ] |
Заголовок сообщения: | Re: Ошибка при попытке получить параметры тарифа |
aiwbend писал(а): Для меня тоже тема получения цен актуальна, хотел сделать генерируемый прайс лист, но все руки не доходят. Писал запрос на получение цен с помесячным снятием, на вики вроде был, но там не учитываются тарифы с копированным деревом, что очень не удобно. Код из первого поста у меня отрабатывается без ошибок, те лист возвращает, но я не смотрел есть в нем чтото или нет. PS. Еще думал в сторону функций mysql, думаю через них было бы удачнее эту задачу реализовать, и получать суммы, режим списания, множители простыми запросами в БД. Очень не рекомендую Вам получать параметры тарифа напрямую из MySql. Известно ли Вам, что биллинг кэширует параметры тарифа? Получать параметры тарифа из кеша на порядок быстрее чем напрямую из базы. Посмотрите что выводит req.toString(), в тарифах с разным типом тарификации, может быть вам это поможет. |
Автор: | lda [ 19 ноя 2012, 12:23 ] |
Заголовок сообщения: | Re: Ошибка при попытке получить параметры тарифа |
aiwbend писал(а): Писал запрос на получение цен с помесячным снятием, на вики вроде был, но там не учитываются тарифы с копированным деревом, что очень не удобно. Мне не совсем понятно, что значит "тарифы с копированным деревом", наверное вы имели ввиду персональные тарифы. Вот эта статья: http://wiki.bgbilling.ru/index.php/%D0% ... 1%82%D1%8B Этот пример не работает с персональными тарифами. Мой пример персональные тарифы обрабатывает. |
Автор: | aiwbend [ 19 ноя 2012, 13:39 ] |
Заголовок сообщения: | Re: Ошибка при попытке получить параметры тарифа |
lda писал(а): Посмотрите что выводит req.toString(), в тарифах с разным типом тарификации, может быть вам это поможет. В чем поможет? lda писал(а): Мне не совсем понятно, что значит "тарифы с копированным деревом", наверное вы имели ввиду персональные тарифы. Голобальные тарифы с parent_tree lda писал(а): Очень не рекомендую Вам получать параметры тарифа напрямую из MySql. Известно ли Вам, что биллинг кэширует параметры тарифа? Получать параметры тарифа из кеша на порядок быстрее чем напрямую из базы. соглашусь, лучше наверно будет написать универсальный класс который будет возвращать нужную инфу по id тарифа. PS.Я просто дискуссировал на тему получения инфы из тарифа, с какими трудностями я столкнулся и размашлял как лучше и универсально, с учетом всех деталей(унаследованным деревом, учетом периодов и тп) реализовать это, а Вы мне про персональные тарифы... ![]() |
Автор: | lda [ 19 ноя 2012, 15:28 ] |
Заголовок сообщения: | Re: Ошибка при попытке получить параметры тарифа |
aiwbend писал(а): PS.Я просто дискуссировал на тему получения инфы из тарифа, с какими трудностями я столкнулся и размашлял как лучше и универсально, с учетом всех деталей(унаследованным деревом, учетом периодов и тп) реализовать это, а Вы мне про персональные тарифы... ![]() Да я в общем то тоже дискутирую, откуда и как можно получить параметры тарифа. ![]() К сожалению разработчики не подсказывают, как правильно получать эти параметры. По поводу персональных тарифов. Я предположил что "тарифы с копированным деревом" это персональные тарифы унаследованные от глобальных. Если Вы получаете абонплату использую стандартное API, то унаследованные тарифа там должны обрабатываться. Можете показать пример, который не обрабатывает "тарифы с копированным деревом"? У вас биллинг 5.2? |
Автор: | aiwbend [ 19 ноя 2012, 16:56 ] |
Заголовок сообщения: | Re: Ошибка при попытке получить параметры тарифа |
lda писал(а): Можете показать пример, который не обрабатывает "тарифы с копированным деревом"? У вас биллинг 5.2? Когда я ковырял все это дело был 5.1, и я яро хотел все сделать через SQL чтобы можно было использовать это быстро, там где потребуется. Да и в API на тот момент ничего подходящего не нашел, наверное плохо искал. Да и динкода не было еще. В итоге натыкал такое, где не учитывается все выше сказанное ![]() Код: SELECT p.id, p.title, mtree_node.type, sum(MID(DATA,13)) AS abon, SUBSTRING_INDEX(DATA, "%", 1) AS type FROM tariff_plan AS p LEFT JOIN tariff_tree_link ON tariff_tree_link.tpid=p.id LEFT JOIN module_tariff_tree ON module_tariff_tree.tree_id=tariff_tree_link.tree_id AND module_tariff_tree.mid=5 LEFT JOIN mtree_node ON mtree_node.mtree_id=module_tariff_tree.id WHERE mtree_node.type LIKE '%_cost' GROUP BY p.id в общем уныло и не универсально, но все равно пользуюсь где условия позволяют. |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |