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/ |