BiTel

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

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




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: Дерево тарифов
СообщениеДобавлено: 28 мар 2011, 13:26 
Не в сети

Зарегистрирован: 07 янв 2009, 02:07
Сообщения: 38
Карма: 13
Может кому понадобиться
SELECT mn.*, tp.title
FROM tariff_plan tp
join module_tariff_tree mtt on mtt.tree_id=tp.id
join mtree_node mn on mtt.id = mn.mtree_id
where tp.id=128

в поле type значение range, тогда поле data принимает значение
col&10000%for_time&1%type&3%mode&0
где col - заданное количество, а далее
type
0 - bite
1 - Kb
2 - Mb
3 - Gb
4 - секунды
5 - минуты
6 - часы

for_time
1 - месяц
2 - день
3 - за учетный период

mode
0 - безусловно
1 - пропорционально периоду разрешённой услуги
2 - пропорционально периоду действия тарифа
3 - пропорционально периоду действия тарифа (с учетом "приостановлен" и "закрыт")


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дерево тарифов
СообщениеДобавлено: 28 мар 2011, 13:32 
Не в сети

Зарегистрирован: 07 янв 2009, 02:07
Сообщения: 38
Карма: 13
В поле type - filter, поле data принимает значение
0&hour_8388544_month_4095_dayOfMonth_2147483647_dayOfWeek_127
переводим численные значения в двоичный вид и анализ проводим справа на лево

для часов будет двоичное значение из 24 бит (от 0 часов до 23 часов)
1 - включаем в диапазон
0 - нет в диапазоне

для месяцев от 1 до 12
для дней в месяце от 1 до 31
в днях недели от 1 до 7


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дерево тарифов
СообщениеДобавлено: 29 мар 2011, 17:36 
Не в сети
Клиент

Зарегистрирован: 12 фев 2008, 18:10
Сообщения: 3951
Карма: 249
спасибо, пригодится
тег code бы не помешал бы


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дерево тарифов
СообщениеДобавлено: 29 мар 2011, 18:14 
Не в сети
Клиент
Аватара пользователя

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

на вики не помешало бы )))
а вообще, я насколько помню, разработчики говорили что скулем для ТП лучше не пользоваться....

_________________
Код:
  Клиент: вер. 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: Дерево тарифов
СообщениеДобавлено: 29 мар 2011, 19:38 
Не в сети
Клиент

Зарегистрирован: 12 фев 2008, 18:10
Сообщения: 3951
Карма: 249
skyb писал(а):
скулем для ТП лучше не пользоваться

если б еще API под тарифы было ... тут тока сикулем и получается :(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дерево тарифов
СообщениеДобавлено: 30 мар 2011, 07:37 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 03 авг 2009, 18:42
Сообщения: 7166
Откуда: Благовещенск
Карма: 241
snark писал(а):
skyb писал(а):
скулем для ТП лучше не пользоваться

если б еще API под тарифы было ... тут тока сикулем и получается :(

когда то было обещенно что откроется.....вот тока когда это "когда то" ))))

_________________
Код:
  Клиент: вер. 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: Дерево тарифов
СообщениеДобавлено: 30 мар 2011, 07:56 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Ну вот данные в 1 посте через TariffRequest не вытянешь.

Вот например мой класс, вытаскивающий подобное:

Код:
public class FreeDailyAmountNotificationExtractor {
   
   private static final Logger log = Logger.getLogger(FreeDailyAmountNotificationExtractor.class.getName());
   public static String[] trafficTypes = {"байт", "Кбайт", "Мбайт", "Гбайт", "сек", "мин", "ч"};
   public static Integer[] trafficMultipliers = {1, 1024, 1048576, 1073741824, 1, 60, 3600};

   /**
    * Возвращает остаток бесплатных минут/байт/др. в день для услуги sid модуля mid (dialup),
    * Бесплатный пакет определяется из ветки активного сегодня тарифного плана.
    * Алгоритм следующий: ищется ветка услуги sid, среди её прямых потомков берётся первый диапазон с ненулевым количеством - это количество и будет считаться дневным бесплатным пакетом.
    * Далее выгребаем amount по услуге за конкретный день и вычитаем из пакета. Если получившееся число >0, то выдаём строку.
    * Работает с наследованными тарифами.
    * При ошибке возвращается NULL.
    * Если чего-то не найдено, возвращается пустая строка.
    * Нюансы:
    *    - Узел тарифа "диапазон" (range) должен быть прямым потомком узла "услуга" (service)
    *    - Цена трафика в диапазоне игнорируется - предполагаем, что первый найденный ненулевой пакет бесплатен, остальное на совести пользователя экстрактора
    *    - Работает только для подневных бесплатных пакетов
    *    - Только dialup (используется таблица session_detail_mid_xxxxxx)
    *
    */
   public String getText(int cid, int mid, int sid, Connection con) {
      String textFormat = "Бесплатный остаток на сегодня = %1.0f %2s";
      
      //Берём количество бесплатных минут в день из пакета в текущем тарифе
      int col = -1;
      int type = -1;
      List<HashMap<String, String>> ranges = this.getRanges(cid, mid, sid, con);
      //Переибраем диапазоны, ищем первый подходящий
      for(HashMap<String, String> range : ranges){
         int tmp_col = -1; //количество единиц в диапазоне
         int tmp_for_time = -1; //тип диапазона (1 - месячный, 2 - дневной, 3 - уч. период)
         int tmp_type = -1; //единицы измерения (см this.types )
         try{
            tmp_col = Integer.valueOf(range.get("col"));
            tmp_for_time = Integer.valueOf(range.get("for_time"));
            tmp_type = Integer.valueOf(range.get("type"));
         }catch(NumberFormatException e){
            log.error("error parsing range tariff node (" + range + ") : " + e.getMessage(), e);
            continue;
         }
         if(tmp_for_time!=2){
            log.warn("При вычислении бесплатного дневного остатка для договора "+cid+", sid="+sid+", mid="+mid+" в тарифе найден не дневной диапазон ("+range+")");
            return null;
         }
         if(tmp_col<=0){continue;}//Неинтересно, пропускаем
         //Всё ок, найден нужный диапазон
         col = tmp_col;
         type = tmp_type;
         break;
      }
      if(col<=0){return "";}//Не найден бесплатный диапазон в тарифе
      
      //Берём наработку по услуге за сегодня
      long todaysAmount = 0;
      String sessionDetailTable = ServerUtils.getModuleMonthTableName("session_detail", new Date(), mid);
      String query = "select sum(amount) from "+sessionDetailTable+" where cid=? and sid=? and date(dtime)=date(now())";
      try {
         PreparedStatement ps = con.prepareStatement(query);
         ps.setInt(1, cid);
         ps.setInt(2, sid);
         ResultSet rs = ps.executeQuery();
         if(rs.next()){
            todaysAmount = rs.getLong(1);
         }
         rs.close();
         ps.close();
      } catch (SQLException e) {
         log.error(e.getMessage(), e);
      }
      
      long col_multiplied = col*trafficMultipliers[type];//Соотв множитель для разных единиц измерения (приводим к виду как в таблице - байты либо секунды)
      if(col_multiplied>todaysAmount){//Ещё остался невыработанный пакет
         String result = String.format(textFormat, (float)(col_multiplied-todaysAmount)/trafficMultipliers[type], trafficTypes[type]);
         return result;
      }
      
      return "";
   }
   
   /**
    * Возвращает массив объектов HashMap, каждый из которых содержит пары key->value для найденных узлов типа "диапазон" для услуги sid. т.е. каждый элемент массива - узел тарифа "диапазон"
    * @param cid
    * @param mid
    * @param sid
    * @param con
    * @return
    */
   private List<HashMap<String, String>> getRanges(int cid, int mid, int sid, Connection con){

      List<HashMap<String,String>> result = new ArrayList<HashMap<String,String>>();
      ContractManager contractManager = new ContractManager(con);
      TariffTreeSet tts = contractManager.getRealtimeTariffTreeSet(cid, Calendar.getInstance(), "dialup", mid, true);
      if(null==tts){
         return result;
      }
      TariffSetEntry tse = tts.getTreeEntry(Calendar.getInstance());
      if(null==tse){
         return result;
      }
      TariffModuleTree mtree = tse.getTreeForDate(Calendar.getInstance());
      if(null==mtree){
         return result;
      }

      //Получаем id дерева
      int treeid = mtree.getTreeId();      //tariff_tree.id
      int mtree_id=0;      //module_tariff_tree.id
      int mtree_parent_id=0; //module_tariff_tree.id
      PreparedStatement ps;
      ResultSet rs;
      
      String query = "select id, parent_tree from module_tariff_tree where tree_id=? and mid=?";
      try {
         ps = con.prepareStatement(query);
         ps.setInt(1,treeid);
         ps.setInt(2,mid);
         rs = ps.executeQuery();
         if(rs.next()){
            mtree_id = rs.getInt(1);
            int tmp_parent_tree_id = rs.getInt(2); //tariff_tree.id
            rs.close();
            //получаем по tmp_parent_tree_id -> mtree_parent_id
            if(tmp_parent_tree_id>0){
               ps.setInt(1,tmp_parent_tree_id);
               ps.setInt(2,mid);
               rs = ps.executeQuery();
               if(rs.next()){
                  mtree_parent_id = rs.getInt(1);
               }
               rs.close();
            }
         }
         ps.close();
      } catch (SQLException e2) {
         log.error(e2.getMessage(), e2);
      }


      //Выгребаем нужные узлы дерева модуля с кодом mid (включая унаследованные)
      // - Ищем узел услуги с кодом sid
      int service_node_id = 0;
      query = "select id from mtree_node where type=\"service\" and (mtree_id = ? or mtree_id = ?) and data = ?";
      try {
         ps = con.prepareStatement(query);
         ps.setInt(1, mtree_id);
         ps.setInt(2, mtree_parent_id);
         ps.setString(3, String.valueOf(sid));
         rs = ps.executeQuery();
         if(rs.next()){
            service_node_id = rs.getInt(1);
         }
         rs.close();
      } catch (SQLException e1) {
         log.error(e1.getMessage(), e1);
      }

      // - Берём параметры диапазона
      if(service_node_id>0){
         query = "select data from mtree_node where type=\"range\" and (mtree_id = ? or mtree_id = ?) and parent_node = ?";
         try {
            ps = con.prepareStatement(query);
            ps.setInt(1, mtree_id);
            ps.setInt(2, mtree_parent_id);
            ps.setInt(3, service_node_id);
            rs = ps.executeQuery();
            while(rs.next()){
               String data = rs.getString(1); //example = col&61%for_time&2%type&5%mode&0
               StringTokenizer st = new StringTokenizer(data, "%");
               HashMap<String, String> map = new HashMap<String, String>();
               //HashMap<String,String> map
               while (st.hasMoreTokens()) {
                  String token = st.nextToken();
                  int ind = token.indexOf("&");
                  String key = token.substring(0,ind);
                  String val = token.substring(ind+1);
                  map.put(key, val);
               }
               result.add(map);
            }
            rs.close();
         } catch (SQLException e) {
            log.error(e.getMessage(), e);
         }
      }
      return result;
   }
}


Можно сделать все методы статическими, например.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дерево тарифов
СообщениеДобавлено: 30 мар 2011, 12:27 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
skyb писал(а):
snark писал(а):
тег code бы не помешал бы

на вики не помешало бы )))

вообще-то там есть

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дерево тарифов
СообщениеДобавлено: 30 мар 2011, 12:33 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 03 авг 2009, 18:42
Сообщения: 7166
Откуда: Благовещенск
Карма: 241
dimOn писал(а):
skyb писал(а):
snark писал(а):
тег code бы не помешал бы

на вики не помешало бы )))

вообще-то там есть

А нафига тада тут, если есть? я то не знаю......

_________________
Код:
  Клиент: вер. 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: Дерево тарифов
СообщениеДобавлено: 30 мар 2011, 12:41 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
skyb писал(а):
dimOn писал(а):
skyb писал(а):
snark писал(а):
тег code бы не помешал бы

на вики не помешало бы )))

вообще-то там есть

А нафига тада тут, если есть? я то не знаю......

Чо? :lupa:

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дерево тарифов
СообщениеДобавлено: 30 мар 2011, 13:10 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 03 авг 2009, 18:42
Сообщения: 7166
Откуда: Благовещенск
Карма: 241
dimOn писал(а):
skyb писал(а):
dimOn писал(а):
skyb писал(а):
snark писал(а):
тег code бы не помешал бы

на вики не помешало бы )))

вообще-то там есть

А нафига тада тут, если есть? я то не знаю......

Чо? :lupa:

что есть на вики я не знал, а если есть, зачем дублировать ;)

_________________
Код:
  Клиент: вер. 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: Дерево тарифов
СообщениеДобавлено: 30 мар 2011, 13:46 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6055
Карма: 244
http://wiki.bgbilling.ru/index.php/%D0% ... 0%B5%D0%B9

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


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

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


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

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


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

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