Ну вот данные в 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;
}
}
Можно сделать все методы статическими, например.