forum.bitel.ru http://forum.bitel.ru/ |
|
[5.2] Событие изменения баланса http://forum.bitel.ru/viewtopic.php?f=19&t=7764 |
Страница 1 из 1 |
Автор: | lda [ 22 фев 2013, 12:16 ] |
Заголовок сообщения: | [5.2] Событие изменения баланса |
Ув. разработчики в API биллинга есть событие ru.bitel.bgbilling.kernel.contract.balance.server.event.ContractBalanceChangedEvent Как на него подписаться? |
Автор: | Cromeshnic [ 22 фев 2013, 12:20 ] |
Заголовок сообщения: | Re: [5.2] Событие изменения баланса |
1. Вы уверены? 2. ВЫ ТОЧНО УВЕРЕНЫ? 3. В скрипте на событие старта сервера вешаем на этот ивент свой листнер: Код: EventProcessor.getInstance().addListener(new EventListener()
{ public void notify(ContractBalanceChangedEvent e, EventListenerContext ctx) throws BGException { //тут делаем свои грязные дела } } , ContractBalanceChangedEvent.class); |
Автор: | stark [ 22 фев 2013, 12:21 ] |
Заголовок сообщения: | Re: [5.2] Событие изменения баланса |
Пока никак .Оно типа системное. Для скриптов надо еще одно кидать. |
Автор: | Cromeshnic [ 22 фев 2013, 12:23 ] |
Заголовок сообщения: | Re: [5.2] Событие изменения баланса |
![]() |
Автор: | stark [ 22 фев 2013, 12:23 ] |
Заголовок сообщения: | Re: [5.2] Событие изменения баланса |
Cromeshnic писал(а): 1. Вы уверены? 2. ВЫ ТОЧНО УВЕРЕНЫ? 3. В скрипте на событие старта сервера вешаем на этот ивент свой листнер: Код: EventProcessor.getInstance().addListener(new EventListener() { public void notify(ContractBalanceChangedEvent e, EventListenerContext ctx) throws BGException { //тут делаем свои грязные дела } } , ContractBalanceChangedEvent.class); тсссс. а то все узнают..skyb-у не говорите |
Автор: | skyb [ 22 фев 2013, 12:31 ] |
Заголовок сообщения: | Re: [5.2] Событие изменения баланса |
stark писал(а): тсссс. а то все узнают..skyb-у не говорите А вас молодой человек я записал в блокнотек (с), вы у меня все на карандаше |
Автор: | lda [ 22 фев 2013, 12:56 ] |
Заголовок сообщения: | Re: [5.2] Событие изменения баланса |
Cromeshnic писал(а): 1. Вы уверены? 2. ВЫ ТОЧНО УВЕРЕНЫ? 3. В скрипте на событие старта сервера вешаем на этот ивент свой листнер: Код: EventProcessor.getInstance().addListener(new EventListener() { public void notify(ContractBalanceChangedEvent e, EventListenerContext ctx) throws BGException { //тут делаем свои грязные дела } } , ContractBalanceChangedEvent.class); 1. и 2. Не уверен ![]() Мне требуется в отдельной табличке хранить текущий баланс. Рассматриваю разные варианты. 3. Спасибо попробую. |
Автор: | Cromeshnic [ 22 фев 2013, 12:58 ] |
Заголовок сообщения: | Re: [5.2] Событие изменения баланса |
А зачем вам? Если нужен срез баланса каждый день - делайте его периодически просто. |
Автор: | Cromeshnic [ 22 фев 2013, 12:58 ] |
Заголовок сообщения: | Re: [5.2] Событие изменения баланса |
Это событие вызывается достаточно часто - при любом переобсчете, платежах, расходах и т.п. |
Автор: | lda [ 22 фев 2013, 13:07 ] |
Заголовок сообщения: | Re: [5.2] Событие изменения баланса |
Cromeshnic писал(а): А зачем вам? Если нужен срез баланса каждый день - делайте его периодически просто. Я делаю интеграцию с внешней системой. Там есть запросы балансов договоров в т.ч. запросы при которых я должен вывести список договоров у которых баланс < n или > n. Cromeshnic писал(а): Это событие вызывается достаточно часто - при любом переобсчете, платежах, расходах и т.п. Я думаю, что если по событию обновлять баланс в своей табличке, проблем быть не должно. Операция вроде как простая. |
Автор: | Cromeshnic [ 22 фев 2013, 13:28 ] |
Заголовок сообщения: | Re: [5.2] Событие изменения баланса |
А почему по запросу просто не получать текущий баланс? http-запросом через ContractBalanceGeneral например? |
Автор: | lda [ 22 фев 2013, 13:45 ] |
Заголовок сообщения: | Re: [5.2] Событие изменения баланса |
Cromeshnic писал(а): А почему по запросу просто не получать текущий баланс? http-запросом через ContractBalanceGeneral например? Запросы будут осуществляться через мой веб сервис. Если решать задачу в лоб, то получается примерно так: Код: SELECT contract.id, (SELECT contract_balance.summa1+contract_balance.summa2-contract_balance.summa3-contract_balance.summa4 FROM contract_balance WHERE contract_balance.cid=contract.id AND ((contract_balance.yy*12) + contract_balance.mm)<=((YEAR(CURDATE())*12) + MONTH(CURDATE())) ORDER BY yy DESC, mm DESC LIMIT 1) as 'balance' FROM contract WHERE (SELECT contract_balance.summa1+contract_balance.summa2-contract_balance.summa3-contract_balance.summa4 FROM contract_balance WHERE contract_balance.cid=contract.id AND ((contract_balance.yy*12) + contract_balance.mm)<=((YEAR(CURDATE())*12) + MONTH(CURDATE())) ORDER BY yy DESC, mm DESC LIMIT 1) > 0 Выполняется долго. Я ищу другое решение. |
Автор: | Cromeshnic [ 22 фев 2013, 13:50 ] |
Заголовок сообщения: | Re: [5.2] Событие изменения баланса |
Другое решение - нормальный mysql-запрос. Запилите себе сохранённую функцию в mysql: Код: CREATE FUNCTION `get_balance`(contract int(10) unsigned) RETURNS decimal(10,2) READS SQL DATA COMMENT 'returns current balance by cid' BEGIN DECLARE balance decimal(10,2); SELECT summa1+summa2-summa3-summa4 INTO balance FROM contract_balance where cid=contract and (yy<<4)+mm<=(year(now())<<4)+month(now()) ORDER BY yy desc, mm desc LIMIT 0,1; RETURN balance; END Работает быстро. Или лучше посмотрите, как вытаскивается текущий баланс в коде у Битела. |
Автор: | Cromeshnic [ 22 фев 2013, 13:51 ] |
Заголовок сообщения: | Re: [5.2] Событие изменения баланса |
http://bgbilling.ru/v5.2/javadoc/bitel/billing/server/contract/bean/BalanceUtils.html#getBalance(java.util.Date,%20int) |
Автор: | lda [ 22 фев 2013, 15:40 ] |
Заголовок сообщения: | Re: [5.2] Событие изменения баланса |
Ув. Cromeshnic К сожалению я не видел в исходниках Битела чтобы они выбирали балансы для нескольких договоров одним запросом. По поводу Вашей функции. Я как то не уверен что она будет работать быстрее, т.к. по сути она делает тоже самое что и я в запросе. Единственное что я подцепил из вашей функции так это: Код: (yy<<4)+mm<=(year(now())<<4)+month(now()) Так работает немного быстрее чем у меня и у разработчиков ![]() Плюс я сделал еще обвязку. Вот что получилось: Код: SELECT t1.id, t1.balance FROM ( SELECT contract.id, (SELECT contract_balance.summa1+contract_balance.summa2-contract_balance.summa3-contract_balance.summa4 FROM contract_balance WHERE contract_balance.cid=contract.id AND (contract_balance.yy<<4)+contract_balance.mm<=(year(now())<<4)+month(now()) ORDER BY yy DESC, mm DESC LIMIT 1) as 'balance' FROM contract ) t1 WHERE t1.balance >0 В принципе уже терпимо по скорости. |
Автор: | Cromeshnic [ 22 фев 2013, 16:12 ] |
Заголовок сообщения: | Re: [5.2] Событие изменения баланса |
Пользуйтесь вместо бесконечных подзапросов left join-ами, тогда всё будет хорошо. |
Автор: | Amir [ 22 фев 2013, 16:14 ] |
Заголовок сообщения: | Re: [5.2] Событие изменения баланса |
И темповыми таблицами. |
Автор: | lda [ 22 фев 2013, 16:27 ] |
Заголовок сообщения: | Re: [5.2] Событие изменения баланса |
Cromeshnic писал(а): Пользуйтесь вместо бесконечных подзапросов left join-ами, тогда всё будет хорошо. Как тут использовать left join? Если вы про таком метод: Код: SELECT contract.id, contract_balance.summa1+contract_balance.summa2-contract_balance.summa3-contract_balance.summa4 as balance FROM contract LEFT JOIN contract_balance ON (contract.id=contract_balance.cid AND contract_balance.mm=month(now()) AND contract_balance.yy=year(now())) То я получу баланс только для договоров, у которых есть запись о балансе в текущем месяце. Не могли бы Вы привести пример, как выбрать текущий баланс у всех договоров с использованием left join без подзапросов? |
Автор: | lda [ 22 фев 2013, 16:34 ] |
Заголовок сообщения: | Re: [5.2] Событие изменения баланса |
Еще вариант: Цитата: SELECT t1.id, t1.balance FROM ( SELECT contract.id, IFNULL( contract_balance.summa1+contract_balance.summa2-contract_balance.summa3-contract_balance.summa4, (SELECT contract_balance.summa1+contract_balance.summa2-contract_balance.summa3-contract_balance.summa4 FROM contract_balance WHERE contract_balance.cid=contract.id AND (contract_balance.yy<<4)+contract_balance.mm<=(year(now())<<4)+month(now()) ORDER BY yy DESC, mm DESC LIMIT 1)) as balance FROM contract LEFT JOIN contract_balance ON (contract.id=contract_balance.cid AND contract_balance.mm=month(now()) AND contract_balance.yy=year(now())) ) t1 WHERE t1.balance >0 Шустро работает ![]() |
Автор: | stark [ 22 фев 2013, 17:15 ] |
Заголовок сообщения: | Re: [5.2] Событие изменения баланса |
Сделайте срез балансов, темповую таблицу.Делается быстро, потом джойнится тоже |
Автор: | skn [ 22 фев 2013, 17:27 ] |
Заголовок сообщения: | Re: [5.2] Событие изменения баланса |
один из вариантов Код: select * from contract_balance t1
inner join (select cid, max(yy*12+mm) m from contract_balance group by cid) t2 on (t1.cid=t2.cid AND (t1.yy*12+t1.mm)=t2.m) |
Автор: | lda [ 22 фев 2013, 17:44 ] |
Заголовок сообщения: | Re: [5.2] Событие изменения баланса |
skn писал(а): один из вариантов Код: select * from contract_balance t1 inner join (select cid, max(yy*12+mm) m from contract_balance group by cid) t2 on (t1.cid=t2.cid AND (t1.yy*12+t1.mm)=t2.m) Я не знал что так можно ![]() Спасибо! Это пожалуй самый шустрый вариант. |
Автор: | vkulakov [ 29 сен 2015, 17:23 ] |
Заголовок сообщения: | Re: [5.2] Событие изменения баланса |
Раз залез в тему, то напишу ещё один вариант запроса: Код: SELECT SQL_NO_CACHE * FROM contract_balance t1 INNER JOIN ( SELECT cid, MAX(100*yy + mm) m FROM contract_balance GROUP BY cid ) t2 ON t1.cid = t2.cid AND (100*t1.yy + t1.mm) = t2.m; -- 0.312 ms SELECT SQL_NO_CACHE cid, SUM(summa2 - summa3 - summa4) AS balance FROM contract_balance t1 GROUP BY cid; -- 0.063 ms Видно, что работает в пять раз быстрее. Но это, если нужен именно последний баланс, а не какие-нибудь другие данные. А способ событие ловить хороший, однако. |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |