BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 20 июн 2025, 02:40

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




Начать новую тему Ответить на тему  [ Сообщений: 16 ] 
Автор Сообщение
СообщениеДобавлено: 15 янв 2014, 11:43 
Не в сети
Аватара пользователя

Зарегистрирован: 09 июл 2013, 15:42
Сообщения: 152
Откуда: Краснодар
Карма: 0
Добрый день.
Задача такая: разрешать пользователю через web менять свой ТП не чаще 1 раза в месяц (с любого числа).

Создаю скрипт поведения, обрабатывающий событие "Запрос дат с которых разрешена смена тарифа через Web".
Логика работы:
- в таблице contract_tariff запрашивается date1 (дата начала действия ТП) для "текущего" состояния (date2 is null)
- эта дата сравнивается с текущей датой
- если разница меньше месяца, то устанавливается список дат с даты "date1 + 1 месяц"

Сам скрипт:

package ru.bitel.ugtel;

import ru.bitel.bgbilling.kernel.event.Event;
import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.sql.ConnectionSet;
import bitel.billing.server.util.*;
import bitel.billing.server.contract.bean.ContractParameterManager;
import bitel.billing.server.contract.bean.ContractManager;
import bitel.billing.common.TimeUtils;

import java.sql.*;
import java.util.*;
import java.util.Date;

public class webTPChangeDateFrom
extends EventScriptBase
{
@Override
public void onEvent( Event event1, Setup setup2, ConnectionSet connectionSet3 )
throws Exception
{
Connection con = connectionSet3.getConnection();

Date CurDate = new Date();
int cid = event1.getContractId();

String CheckQuery = "select date1, Date_Add(date1, interval 1 month) from contract_tariff where date2 is null and cid = " + cid;
PreparedStatement CheckQPS = con.prepareStatement(CheckQuery);
ResultSet CheckQRS = CheckQPS.executeQuery();

Date LastDate = CheckQRS.getDate(1);
Date FromDate = CheckQRS.getDate(2);

int DeltaMounth = TimeUtils.monthsDelta(LastDate, CurDate);
if (DeltaMounth < 1) {
event1.setDateList(FromDate);
}

}

}

при компиляции выпадает ошибка "cannot find symbol symbol : method setDateList(java.util.Date) location: class ru.bitel.bgbilling.kernel.event.Event".

Подскажите: что не так?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 янв 2014, 11:58 
Не в сети
Аватара пользователя

Зарегистрирован: 27 янв 2010, 16:12
Сообщения: 941
Откуда: Уфа
Карма: 124
параметр event1 имеет тип Event, в котором отсутсвует указанный метод.
Вам в самом начале вашего скрипта нужно сделать приведение event1 к дочернему классу GetChangeTariffDatesEvent и уже у него вызывать метод setDateList(list):
Код:
...
GetChangeTariffDatesEvent event = ( GetChangeTariffDatesEvent ) event1;
...
List dateList = new ArrayList(1);
dateList.add( FromDate );
event.setDateList( dateList );

_________________
С уважением, Гареев Артур. Вежливый разработчик ООО "Бител".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 янв 2014, 12:04 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
ЮжныйКраснодар писал(а):
Код:
package ru.bitel.ugtel;

import ru.bitel.bgbilling.kernel.event.Event;
import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.sql.ConnectionSet;
import bitel.billing.server.util.*;
import bitel.billing.server.contract.bean.ContractParameterManager;
import bitel.billing.server.contract.bean.ContractManager;
import bitel.billing.common.TimeUtils;

import java.sql.*;
import java.util.*;
import java.util.Date;

public class webTPChangeDateFrom
   extends EventScriptBase
{
   @Override
   public void onEvent( Event event1, Setup setup2, ConnectionSet connectionSet3 )
      throws Exception
   {
      Connection con = connectionSet3.getConnection();

      Date CurDate = new Date();
      int cid = event1.getContractId();

      String CheckQuery = "select date1, Date_Add(date1, interval 1 month) from contract_tariff where date2 is null and cid = " + cid;
      PreparedStatement CheckQPS = con.prepareStatement(CheckQuery);
      ResultSet CheckQRS = CheckQPS.executeQuery();

      Date LastDate = CheckQRS.getDate(1);
      Date FromDate = CheckQRS.getDate(2);

      int DeltaMounth = TimeUtils.monthsDelta(LastDate, CurDate);
      if (DeltaMounth < 1) {
         event1.setDateList(FromDate);
      }
      
   }

}


при компиляции выпадает ошибка
Код:
"cannot find symbol symbol : method setDateList(java.util.Date) location: class ru.bitel.bgbilling.kernel.event.Event".




Код:
ArrayList dateList = new ArrayList();

...blablabla...

int DeltaMounth = TimeUtils.monthsDelta(LastDate, CurDate);
      if (DeltaMounth < 1) {
dateList.add = (FromDate);
         event1.setDateList(dateList);
      }


вроде как так. код внятно не читал - так что могу ошибиться. но направление правильное.

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 янв 2014, 12:06 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 03 авг 2009, 18:42
Сообщения: 7166
Откуда: Благовещенск
Карма: 241
Phricker удаляй пока никто не увидел )))))) там на евент ругаеццо

_________________
Код:
  Клиент: вер. 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
Стиль программирования - пьяный мастерстер
Разработка мобильных приложений


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 янв 2014, 12:10 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
Там ругается на
Код:
method setDateList(java.util.Date)

такого метода нет.
Этот эвент
http://bgbilling.ru/v6.0/javadoc/ru/bit ... Event.html
Код:
setDateList(java.util.List<java.util.Date> dateList)
          Установка списка дат, с которых можно сменять тариф.

ТС пытается вместо java.util.List засунуть просто java.util.Date

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 янв 2014, 12:12 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
ну и да, как правильно заметил Артур - эвент не приведен к тому, который нужен.
а у ТС
Код:
Date FromDate = CheckQRS.getDate(2);

так что две ошибки инклюдед.
Говорю же внятно не читал :)

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 янв 2014, 12:15 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
И набью еще один пост. Артур по факту ответил раньше меня, просто была открыта вкладка, а уже затем я в ней нажал ответить.
Прошу прощения )

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 янв 2014, 16:42 
Не в сети
Аватара пользователя

Зарегистрирован: 09 июл 2013, 15:42
Сообщения: 152
Откуда: Краснодар
Карма: 0
Спасибо - поправил.
НО теперь ругается на формат даты из sql: java.sql.SQLException: Bad format for DATE '1' in column
Каким образом отконвертить?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 янв 2014, 17:03 
Не в сети
Аватара пользователя

Зарегистрирован: 09 июл 2013, 15:42
Сообщения: 152
Откуда: Краснодар
Карма: 0
Ага - нашел:

Date LastDate = TimeUtils.convertStringToDate( CheckQRS.getString(1) );


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 янв 2014, 12:27 
Не в сети
Аватара пользователя

Зарегистрирован: 09 июл 2013, 15:42
Сообщения: 152
Откуда: Краснодар
Карма: 0
Еще один вопрос (в продолжении и расширении темы):
- как перенести "оставшиеся" даты в список возможных дат для смены ТП?

т.е. сейчас переносится только первая доступная дата, а надо "донаполнить" список.
Видится такой алгоритм:
- взять весь список дат перехода (event.getDateList() в список ArrayList TariffDateListFull = new ArrayList(); )
- если дата перехода CurDate входит в список - сформировать новый список дат (ArrayList TariffDateList = new ArrayList();), начинающийся с неё; иначе оставить в списке только одну дату

Код:
         TariffDateListFull.add( event.getDateList() );

         if ( TariffDateListFull.contains( CurDate ) ) {

            for ( int i = 0; i < TariffDateListFull.size(); i++ ) {

               if ( TimeUtils.daysDelta( CurDate, TariffDateListFull.get( i ) ) >= 0 ) {
                  TariffDateList.add( TariffDateListFull.get( i ) );
               }
         
            }
         }
         else {
            TariffDateList.add( CurDate );
         }

         event.setDateList( TariffDateList );



Загвоздка в конвертировании дат тут: TimeUtils.daysDelta( CurDate, TariffDateListFull.get( i ) )
как преобразовать даты для сравнения?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 20 янв 2014, 18:17 
Не в сети
Аватара пользователя

Зарегистрирован: 09 июл 2013, 15:42
Сообщения: 152
Откуда: Краснодар
Карма: 0
Выкрутился по другому.
Выкладываю полный java-скрипт (может кому и пригодится):
Код:
   public void onEvent( Event event1, Setup setup2, ConnectionSet connectionSet3 )
      throws Exception
   {
//      текущий коннект
      Connection con = connectionSet3.getConnection();
//      событие на запрос дат при смене ТП
      GetChangeTariffDatesEvent event = ( GetChangeTariffDatesEvent ) event1 ;

      Date CurDate = new Date();
      int cid = event1.getContractId();
      ArrayList TariffDateList = new ArrayList();
      int FromTariffId = event.getFromTariffId();
      int ToTariffId = event.getToTariffId();

      System.out.println("webChangeTariffDateScript work " + CurDate + " for ContractID " + cid);

//      выбираем из БД дату начала "текущего ТП"
      String DateQuery = "select date1 from contract_tariff where date2 is null and cid = " + cid + " and tpid = " + FromTariffId + " order by date1 desc limit 1";
      PreparedStatement DateQPS = con.prepareStatement( DateQuery );
      ResultSet DateQRS = DateQPS.executeQuery();
      DateQRS.next();
//      отбрасываем часы-минуты-секунды и переходим на начало текущего месяца
      Date LastDate = TimeUtils.convertStringToDate( DateQRS.getString( 1 ) );
      CurDate = TimeUtils.clear_HOUR_MIN_MIL_SEC( CurDate );
      CurDate = TimeUtils.getStartMonth ( CurDate );

      int DeltaDates = TimeUtils.monthsDelta( LastDate, CurDate );

      System.out.println("webChangeTariffDateScript: CID=" + cid + "; FromTarID=" + FromTariffId + "; ToTarID=" + ToTariffId + "; FromTarDate=" + LastDate + "; DeltaDate=" + DeltaDates + " day.");
//      если дата "текущего ТП" уже в текущем месяце - будем шаманить с датой перехода (сдвигать её в следующий месяц)
      if ( DeltaDates == 0 ) {
//         за точку отсчета берём первое число следующего месяца
         CurDate = TimeUtils.getNextMonth( CurDate );
         System.out.println("webChangeTariffDateScript: Change DateFrom to " + CurDate + "!");
//         смотрим в БД на какое количество дней вперёд разрешено задавать смену в ГруппеТарифов
         String DayQuery = "select df from tariff_group tg join (select tgtf.tgid as tgid, tgtf.tpid as tpidf, tgtt.tpid as tpidt from tariff_group_tariff tgtf join tariff_group_tariff tgtt using(tgid) where tgtf.tpid = " + FromTariffId + " and tgtt.tpid = " + ToTariffId + " order by tgtf.tgid limit 1) as tgt on tg.id = tgt.tgid";
         PreparedStatement DayQPS = con.prepareStatement( DayQuery );
         ResultSet DayQRS = DayQPS.executeQuery();
         DayQRS.next();
//         начинаем двигать дату от текущего дня до максимально разрешенного в ГруппеТарифов
         LastDate = new Date();
         LastDate = TimeUtils.clear_HOUR_MIN_MIL_SEC( LastDate );

         for ( int i = 0; i < DayQRS.getInt( 1 ); i++ ) {

            if ( TimeUtils.daysDelta( CurDate, LastDate ) >= 0 ) {
//               заносим в массив если дата больше/равна
               TariffDateList.add( LastDate );
            }
            LastDate = TimeUtils.getNextDay( LastDate );
         }
//         если массив пуст, то вносим только одну дату (первое число следующего месяца)
         if ( TariffDateList.size() == 1 ) {
            TariffDateList.add( CurDate );
         }

         System.out.println("webChangeTariffDateScript: Change DateTo to " + TariffDateList.get( TariffDateList.size() - 1 ) + "!");
//         переносим даты из массива в список дат для смены ТП
         event.setDateList( TariffDateList );
      }
      else
         System.out.println("webChangeTariffDateScript: NO Change DateFrom!");
   }


Изменились условия - теперь скрипт дает сменить Тариф не чаще одного раза в календарный месяц.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 фев 2014, 08:22 
Не в сети
Клиент

Зарегистрирован: 09 фев 2011, 15:28
Сообщения: 1092
Карма: 135
Апну тему. Может немного подправить клиента, чтобы при создании шаблона кода обработчика автоматически подставлялся класс нужного события. Например, выбираешь событие Договор создан и сразу выходит следующий код
Код:
import ru.bitel.bgbilling.kernel.event.events.ContractCreatedEvent;
import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.sql.ConnectionSet;

public class CreatedContract
   extends EventScriptBase<ContractCreatedEvent>
{
   @Override
   public void onEvent( ContractCreatedEvent event, Setup setup, ConnectionSet connectionSet )
      throws Exception
   {
   }
}

и не надо искать клаасы обработчиков, приведения типов делать...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 фев 2014, 09:27 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 03 авг 2009, 18:42
Сообщения: 7166
Откуда: Благовещенск
Карма: 241
+

_________________
Код:
  Клиент: вер. 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
Стиль программирования - пьяный мастерстер
Разработка мобильных приложений


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 фев 2014, 11:12 
Не в сети
Аватара пользователя

Зарегистрирован: 27 янв 2010, 16:12
Сообщения: 941
Откуда: Уфа
Карма: 124
barguzin2 писал(а):
Апну тему. Может немного подправить клиента, чтобы при создании шаблона кода обработчика автоматически подставлялся класс нужного события. Например, выбираешь событие Договор создан и сразу выходит следующий код
Код:
import ru.bitel.bgbilling.kernel.event.events.ContractCreatedEvent;
import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.sql.ConnectionSet;

public class CreatedContract
   extends EventScriptBase<ContractCreatedEvent>
{
   @Override
   public void onEvent( ContractCreatedEvent event, Setup setup, ConnectionSet connectionSet )
      throws Exception
   {
   }
}

и не надо искать клаасы обработчиков, приведения типов делать...



Т.е. есть предложение избавиться от полиморфизма/наследования и создать кучу методов onEvent(), отличающихся лишь первым аргументом? а еще создать методы publish/publishAfterCommit/request, отличающиеся только типом передаваемого события? или я вас неверно понял?

_________________
С уважением, Гареев Артур. Вежливый разработчик ООО "Бител".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 18 фев 2014, 15:21 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
нет тут речь просто про автогенерацию текста обработчика

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 фев 2014, 18:50 
Не в сети
Клиент

Зарегистрирован: 09 фев 2011, 15:28
Сообщения: 1092
Карма: 135
Ага, dimOn правильно понял, подставляется конкретное имя класса события:

import ru.bitel.bgbilling.kernel.event.events.ContractCreatedEvent;
extends EventScriptBase<ContractCreatedEvent>
public void onEvent( ContractCreatedEvent event, Setup setup, ConnectionSet connectionSet )

Это, в общем, задача не первой важности, кто знает - тот найдет, но просто было бы гораздо удобнее, особенно начинающим.


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

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


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

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


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

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