forum.bitel.ru
http://forum.bitel.ru/

[6.0] Подскажите по java-скрипту поведения
http://forum.bitel.ru/viewtopic.php?f=19&t=8831
Страница 1 из 1

Автор:  ЮжныйКраснодар [ 15 янв 2014, 11:43 ]
Заголовок сообщения:  [6.0] Подскажите по java-скрипту поведения

Добрый день.
Задача такая: разрешать пользователю через 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".

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

Автор:  Artur [ 15 янв 2014, 11:58 ]
Заголовок сообщения:  Re: [6.0] Подскажите по java-скрипту поведения

параметр event1 имеет тип Event, в котором отсутсвует указанный метод.
Вам в самом начале вашего скрипта нужно сделать приведение event1 к дочернему классу GetChangeTariffDatesEvent и уже у него вызывать метод setDateList(list):
Код:
...
GetChangeTariffDatesEvent event = ( GetChangeTariffDatesEvent ) event1;
...
List dateList = new ArrayList(1);
dateList.add( FromDate );
event.setDateList( dateList );

Автор:  Phricker [ 15 янв 2014, 12:04 ]
Заголовок сообщения:  Re: [6.0] Подскажите по java-скрипту поведения

ЮжныйКраснодар писал(а):
Код:
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);
      }


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

Автор:  skyb [ 15 янв 2014, 12:06 ]
Заголовок сообщения:  Re: [6.0] Подскажите по java-скрипту поведения

Phricker удаляй пока никто не увидел )))))) там на евент ругаеццо

Автор:  Phricker [ 15 янв 2014, 12:10 ]
Заголовок сообщения:  Re: [6.0] Подскажите по java-скрипту поведения

Там ругается на
Код:
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

Автор:  Phricker [ 15 янв 2014, 12:12 ]
Заголовок сообщения:  Re: [6.0] Подскажите по java-скрипту поведения

ну и да, как правильно заметил Артур - эвент не приведен к тому, который нужен.
а у ТС
Код:
Date FromDate = CheckQRS.getDate(2);

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

Автор:  Phricker [ 15 янв 2014, 12:15 ]
Заголовок сообщения:  Re: [6.0] Подскажите по java-скрипту поведения

И набью еще один пост. Артур по факту ответил раньше меня, просто была открыта вкладка, а уже затем я в ней нажал ответить.
Прошу прощения )

Автор:  ЮжныйКраснодар [ 15 янв 2014, 16:42 ]
Заголовок сообщения:  Re: [6.0] Подскажите по java-скрипту поведения

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

Автор:  ЮжныйКраснодар [ 15 янв 2014, 17:03 ]
Заголовок сообщения:  Re: [6.0] Подскажите по java-скрипту поведения

Ага - нашел:

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

Автор:  ЮжныйКраснодар [ 16 янв 2014, 12:27 ]
Заголовок сообщения:  Re: [6.0] Подскажите по java-скрипту поведения

Еще один вопрос (в продолжении и расширении темы):
- как перенести "оставшиеся" даты в список возможных дат для смены ТП?

т.е. сейчас переносится только первая доступная дата, а надо "донаполнить" список.
Видится такой алгоритм:
- взять весь список дат перехода (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 ]
Заголовок сообщения:  Re: [6.0] Подскажите по java-скрипту поведения

Выкрутился по другому.
Выкладываю полный 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!");
   }


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

Автор:  barguzin2 [ 18 фев 2014, 08:22 ]
Заголовок сообщения:  Re: [6.0] Подскажите по java-скрипту поведения

Апну тему. Может немного подправить клиента, чтобы при создании шаблона кода обработчика автоматически подставлялся класс нужного события. Например, выбираешь событие Договор создан и сразу выходит следующий код
Код:
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
   {
   }
}

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

Автор:  skyb [ 18 фев 2014, 09:27 ]
Заголовок сообщения:  Re: [6.0] Подскажите по java-скрипту поведения

+

Автор:  Artur [ 18 фев 2014, 11:12 ]
Заголовок сообщения:  Re: [6.0] Подскажите по java-скрипту поведения

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, отличающиеся только типом передаваемого события? или я вас неверно понял?

Автор:  dimOn [ 18 фев 2014, 15:21 ]
Заголовок сообщения:  Re: [6.0] Подскажите по java-скрипту поведения

нет тут речь просто про автогенерацию текста обработчика

Автор:  barguzin2 [ 19 фев 2014, 18:50 ]
Заголовок сообщения:  Re: [6.0] Подскажите по java-скрипту поведения

Ага, dimOn правильно понял, подставляется конкретное имя класса события:

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

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

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/