BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 28 апр 2024, 02:13

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 23 ] 
Автор Сообщение
 Заголовок сообщения: [5.2] Событие изменения баланса
СообщениеДобавлено: 22 фев 2013, 12:16 
Не в сети
Клиент

Зарегистрирован: 20 мар 2008, 20:20
Сообщения: 676
Откуда: Россия, Иваново
Карма: 36
Ув. разработчики в API биллинга есть событие
ru.bitel.bgbilling.kernel.contract.balance.server.event.ContractBalanceChangedEvent
Как на него подписаться?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [5.2] Событие изменения баланса
СообщениеДобавлено: 22 фев 2013, 12:20 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
1. Вы уверены?
2. ВЫ ТОЧНО УВЕРЕНЫ?
3. В скрипте на событие старта сервера вешаем на этот ивент свой листнер:

Код:
EventProcessor.getInstance().addListener(new EventListener()
    {
      public void notify(ContractBalanceChangedEvent e, EventListenerContext ctx)
        throws BGException
      {
        //тут делаем свои грязные дела
      }
    }
    , ContractBalanceChangedEvent.class);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [5.2] Событие изменения баланса
СообщениеДобавлено: 22 фев 2013, 12:21 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Пока никак .Оно типа системное. Для скриптов надо еще одно кидать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [5.2] Событие изменения баланса
СообщениеДобавлено: 22 фев 2013, 12:23 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
:roll:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [5.2] Событие изменения баланса
СообщениеДобавлено: 22 фев 2013, 12:23 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Cromeshnic писал(а):
1. Вы уверены?
2. ВЫ ТОЧНО УВЕРЕНЫ?
3. В скрипте на событие старта сервера вешаем на этот ивент свой листнер:

Код:
EventProcessor.getInstance().addListener(new EventListener()
    {
      public void notify(ContractBalanceChangedEvent e, EventListenerContext ctx)
        throws BGException
      {
        //тут делаем свои грязные дела
      }
    }
    , ContractBalanceChangedEvent.class);


тсссс. а то все узнают..skyb-у не говорите


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [5.2] Событие изменения баланса
СообщениеДобавлено: 22 фев 2013, 12:31 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 03 авг 2009, 18:42
Сообщения: 7166
Откуда: Благовещенск
Карма: 241
stark писал(а):
тсссс. а то все узнают..skyb-у не говорите

А вас молодой человек я записал в блокнотек (с), вы у меня все на карандаше

_________________
Код:
  Клиент: вер. 6.2.714 / 25.05.2015 17:27:15
    os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_45
  Сервер: вер. 6.2.881 / 22.05.2015 17:56:55
    os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_45
Помощь по администрированию bgbilling в jabber конференции или Группа в telegram
Стиль программирования - пьяный мастерстер
Разработка мобильных приложений


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [5.2] Событие изменения баланса
СообщениеДобавлено: 22 фев 2013, 12:56 
Не в сети
Клиент

Зарегистрирован: 20 мар 2008, 20:20
Сообщения: 676
Откуда: Россия, Иваново
Карма: 36
Cromeshnic писал(а):
1. Вы уверены?
2. ВЫ ТОЧНО УВЕРЕНЫ?
3. В скрипте на событие старта сервера вешаем на этот ивент свой листнер:

Код:
EventProcessor.getInstance().addListener(new EventListener()
    {
      public void notify(ContractBalanceChangedEvent e, EventListenerContext ctx)
        throws BGException
      {
        //тут делаем свои грязные дела
      }
    }
    , ContractBalanceChangedEvent.class);

1. и 2. Не уверен :)
Мне требуется в отдельной табличке хранить текущий баланс.
Рассматриваю разные варианты.
3. Спасибо попробую.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [5.2] Событие изменения баланса
СообщениеДобавлено: 22 фев 2013, 12:58 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
А зачем вам?
Если нужен срез баланса каждый день - делайте его периодически просто.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [5.2] Событие изменения баланса
СообщениеДобавлено: 22 фев 2013, 12:58 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Это событие вызывается достаточно часто - при любом переобсчете, платежах, расходах и т.п.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [5.2] Событие изменения баланса
СообщениеДобавлено: 22 фев 2013, 13:07 
Не в сети
Клиент

Зарегистрирован: 20 мар 2008, 20:20
Сообщения: 676
Откуда: Россия, Иваново
Карма: 36
Cromeshnic писал(а):
А зачем вам?
Если нужен срез баланса каждый день - делайте его периодически просто.

Я делаю интеграцию с внешней системой.
Там есть запросы балансов договоров в т.ч. запросы при которых я должен вывести список договоров у которых баланс < n или > n.

Cromeshnic писал(а):
Это событие вызывается достаточно часто - при любом переобсчете, платежах, расходах и т.п.


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [5.2] Событие изменения баланса
СообщениеДобавлено: 22 фев 2013, 13:28 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
А почему по запросу просто не получать текущий баланс?
http-запросом через ContractBalanceGeneral например?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [5.2] Событие изменения баланса
СообщениеДобавлено: 22 фев 2013, 13:45 
Не в сети
Клиент

Зарегистрирован: 20 мар 2008, 20:20
Сообщения: 676
Откуда: Россия, Иваново
Карма: 36
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


Выполняется долго.

Я ищу другое решение.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [5.2] Событие изменения баланса
СообщениеДобавлено: 22 фев 2013, 13:50 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Другое решение - нормальный 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


Работает быстро.

Или лучше посмотрите, как вытаскивается текущий баланс в коде у Битела.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [5.2] Событие изменения баланса
СообщениеДобавлено: 22 фев 2013, 13:51 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
http://bgbilling.ru/v5.2/javadoc/bitel/billing/server/contract/bean/BalanceUtils.html#getBalance(java.util.Date,%20int)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [5.2] Событие изменения баланса
СообщениеДобавлено: 22 фев 2013, 15:40 
Не в сети
Клиент

Зарегистрирован: 20 мар 2008, 20:20
Сообщения: 676
Откуда: Россия, Иваново
Карма: 36
Ув. 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


В принципе уже терпимо по скорости.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [5.2] Событие изменения баланса
СообщениеДобавлено: 22 фев 2013, 16:12 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Пользуйтесь вместо бесконечных подзапросов left join-ами, тогда всё будет хорошо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [5.2] Событие изменения баланса
СообщениеДобавлено: 22 фев 2013, 16:14 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
И темповыми таблицами.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [5.2] Событие изменения баланса
СообщениеДобавлено: 22 фев 2013, 16:27 
Не в сети
Клиент

Зарегистрирован: 20 мар 2008, 20:20
Сообщения: 676
Откуда: Россия, Иваново
Карма: 36
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 без подзапросов?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [5.2] Событие изменения баланса
СообщениеДобавлено: 22 фев 2013, 16:34 
Не в сети
Клиент

Зарегистрирован: 20 мар 2008, 20:20
Сообщения: 676
Откуда: Россия, Иваново
Карма: 36
Еще вариант:
Цитата:
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

Шустро работает :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [5.2] Событие изменения баланса
СообщениеДобавлено: 22 фев 2013, 17:15 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Сделайте срез балансов, темповую таблицу.Делается быстро, потом джойнится тоже


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [5.2] Событие изменения баланса
СообщениеДобавлено: 22 фев 2013, 17:27 
Не в сети
Разработчик

Зарегистрирован: 07 апр 2007, 23:51
Сообщения: 4489
Откуда: Уфа, Россия
Карма: 186
один из вариантов
Код:
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)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [5.2] Событие изменения баланса
СообщениеДобавлено: 22 фев 2013, 17:44 
Не в сети
Клиент

Зарегистрирован: 20 мар 2008, 20:20
Сообщения: 676
Откуда: Россия, Иваново
Карма: 36
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)


Я не знал что так можно :)

Спасибо! Это пожалуй самый шустрый вариант.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [5.2] Событие изменения баланса
СообщениеДобавлено: 29 сен 2015, 17:23 
Не в сети
Клиент

Зарегистрирован: 07 мар 2012, 15:02
Сообщения: 932
Откуда: Воронеж
Карма: 35
Раз залез в тему, то напишу ещё один вариант запроса:
Код:
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

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

А способ событие ловить хороший, однако.

_________________

Клиент: вер. 6.2.873 / 04.12.2017 19:38:11
os: Windows 7; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_65
Сервер: вер. 6.2.1202 / 04.12.2017 19:39:21
os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_91


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 23 ] 

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
POWERED_BY
Русская поддержка phpBB
[ Time : 0.104s | 66 Queries | GZIP : On ]