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] Событие изменения баланса

:roll:

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