forum.bitel.ru http://forum.bitel.ru/ |
|
Дерево тарифов http://forum.bitel.ru/viewtopic.php?f=19&t=5314 |
Страница 1 из 1 |
Автор: | vasco [ 28 мар 2011, 13:26 ] |
Заголовок сообщения: | Дерево тарифов |
Может кому понадобиться 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 - пропорционально периоду действия тарифа (с учетом "приостановлен" и "закрыт") |
Автор: | vasco [ 28 мар 2011, 13:32 ] |
Заголовок сообщения: | Re: Дерево тарифов |
В поле type - filter, поле data принимает значение 0&hour_8388544_month_4095_dayOfMonth_2147483647_dayOfWeek_127 переводим численные значения в двоичный вид и анализ проводим справа на лево для часов будет двоичное значение из 24 бит (от 0 часов до 23 часов) 1 - включаем в диапазон 0 - нет в диапазоне для месяцев от 1 до 12 для дней в месяце от 1 до 31 в днях недели от 1 до 7 |
Автор: | snark [ 29 мар 2011, 17:36 ] |
Заголовок сообщения: | Re: Дерево тарифов |
спасибо, пригодится тег code бы не помешал бы |
Автор: | skyb [ 29 мар 2011, 18:14 ] |
Заголовок сообщения: | Re: Дерево тарифов |
snark писал(а): тег code бы не помешал бы на вики не помешало бы ))) а вообще, я насколько помню, разработчики говорили что скулем для ТП лучше не пользоваться.... |
Автор: | snark [ 29 мар 2011, 19:38 ] |
Заголовок сообщения: | Re: Дерево тарифов |
skyb писал(а): скулем для ТП лучше не пользоваться если б еще API под тарифы было ... тут тока сикулем и получается ![]() |
Автор: | skyb [ 30 мар 2011, 07:37 ] |
Заголовок сообщения: | Re: Дерево тарифов |
snark писал(а): skyb писал(а): скулем для ТП лучше не пользоваться если б еще API под тарифы было ... тут тока сикулем и получается ![]() когда то было обещенно что откроется.....вот тока когда это "когда то" )))) |
Автор: | Cromeshnic [ 30 мар 2011, 07:56 ] |
Заголовок сообщения: | Re: Дерево тарифов |
Ну вот данные в 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; } } Можно сделать все методы статическими, например. |
Автор: | dimOn [ 30 мар 2011, 12:27 ] |
Заголовок сообщения: | Re: Дерево тарифов |
skyb писал(а): snark писал(а): тег code бы не помешал бы на вики не помешало бы ))) вообще-то там есть |
Автор: | skyb [ 30 мар 2011, 12:33 ] |
Заголовок сообщения: | Re: Дерево тарифов |
dimOn писал(а): skyb писал(а): snark писал(а): тег code бы не помешал бы на вики не помешало бы ))) вообще-то там есть А нафига тада тут, если есть? я то не знаю...... |
Автор: | dimOn [ 30 мар 2011, 12:41 ] |
Заголовок сообщения: | Re: Дерево тарифов |
skyb писал(а): dimOn писал(а): skyb писал(а): snark писал(а): тег code бы не помешал бы на вики не помешало бы ))) вообще-то там есть А нафига тада тут, если есть? я то не знаю...... Чо? ![]() |
Автор: | skyb [ 30 мар 2011, 13:10 ] |
Заголовок сообщения: | Re: Дерево тарифов |
dimOn писал(а): skyb писал(а): dimOn писал(а): skyb писал(а): snark писал(а): тег code бы не помешал бы на вики не помешало бы ))) вообще-то там есть А нафига тада тут, если есть? я то не знаю...... Чо? ![]() что есть на вики я не знал, а если есть, зачем дублировать ![]() |
Автор: | dimOn [ 30 мар 2011, 13:46 ] |
Заголовок сообщения: | Re: Дерево тарифов |
http://wiki.bgbilling.ru/index.php/%D0% ... 0%B5%D0%B9 |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |