Отключение Fake сессий при приходе платежа
Материал из BiTel WiKi
(Различия между версиями)
Admin (Обсуждение | вклад) (Новая страница: «Для версии 5.1 сброс Reject-To-Accept сессий при приходе платежа в договор либо понижении лимита в …») |
Admin (Обсуждение | вклад) |
||
Строка 2: | Строка 2: | ||
<source lang="java"> | <source lang="java"> | ||
+ | import bitel.billing.server.dialup.bean.busevent.*; | ||
+ | import bitel.billing.server.admin.eventbus.*; | ||
import bitel.billing.server.contract.bean.*; | import bitel.billing.server.contract.bean.*; | ||
import ru.bitel.bgbilling.server.util.*; | import ru.bitel.bgbilling.server.util.*; | ||
Строка 7: | Строка 9: | ||
import java.util.*; | import java.util.*; | ||
import java.sql.*; | import java.sql.*; | ||
+ | import ru.bitel.common.*; | ||
int MID = 8; | int MID = 8; | ||
Строка 27: | Строка 30: | ||
if( ServerUtils.tableExists( con, tableName ) ) | if( ServerUtils.tableExists( con, tableName ) ) | ||
{ | { | ||
+ | String loginTable = "user_login_" + MID; | ||
+ | String aliasTable = "user_alias_" + MID; | ||
+ | |||
+ | Set nameSet = new HashSet(); | ||
+ | |||
+ | //т.к. у фиктивной сессии нет привязки к коду логина - поиск по логину либо алиасу | ||
String query = | String query = | ||
- | "SELECT | + | "SELECT login.login, alias.login_alias FROM " + loginTable + " AS login " + |
- | " | + | "LEFT JOIN " + aliasTable +" AS alias ON login.id=alias.login_id WHERE login.cid=?"; |
- | + | ||
PreparedStatement ps = con.prepareStatement( query ); | PreparedStatement ps = con.prepareStatement( query ); | ||
ps.setInt( 1, contractId ); | ps.setInt( 1, contractId ); | ||
Строка 36: | Строка 44: | ||
while( rs.next() ) | while( rs.next() ) | ||
{ | { | ||
- | int recordId = rs.getInt( 1 ); | + | nameSet.add( rs.getString( 1 ) ); |
- | + | nameSet.add( rs.getString( 2 ) ); | |
- | + | }; | |
- | + | ps.close(); | |
- | + | ||
- | + | ||
+ | if( nameSet.size() > 0 ) | ||
+ | { | ||
+ | String logins = "'" + Utils.toString( nameSet, "','" ) + "'"; | ||
+ | logins = logins.substring( 0, logins.length() - 2 ); | ||
+ | |||
+ | print( "Logins: " + logins ); | ||
+ | |||
+ | query = | ||
+ | "SELECT session.id FROM " + tableName + " AS session " + | ||
+ | "WHERE session.status=0 AND fake=1 AND session.login_name IN (" + logins + ")"; | ||
+ | PreparedStatement ps = con.prepareStatement( query ); | ||
+ | ResultSet rs = ps.executeQuery(); | ||
+ | while( rs.next() ) | ||
+ | { | ||
+ | int recordId = rs.getInt( 1 ); | ||
+ | count++; | ||
+ | |||
+ | print( "Killing " + recordId ); | ||
+ | |||
+ | BillingEventBus.publish( new DialupSessionBreakEvent( MID, recordId ) ); | ||
+ | } | ||
} | } | ||
} | } |
Текущая версия на 11:27, 20 января 2012
Для версии 5.1 сброс Reject-To-Accept сессий при приходе платежа в договор либо понижении лимита в случае если баланс превышает лимит.
import bitel.billing.server.dialup.bean.busevent.*; import bitel.billing.server.admin.eventbus.*; import bitel.billing.server.contract.bean.*; import ru.bitel.bgbilling.server.util.*; import java.math.*; import java.util.*; import java.sql.*; import ru.bitel.common.*; int MID = 8; public void onEvent( event, setup, con, conSlave ) { Payment payment = event.getPayment(); int contractId = payment.getContractID(); java.util.Date date = event.getGenerateTime().getTime(); BigDecimal summa = payment.getSumma(); BalanceUtils bu = new BalanceUtils( con ); BigDecimal balance = bu.getBalance( date, contractId ); if( balance.compareTo( BigDecimal.ZERO ) > 0 /*&& summa.compareTo( balance ) > 0*/ ) { int count = 0; String tableName = ServerUtils.getModuleMonthTableName( "log_session", date, MID ); if( ServerUtils.tableExists( con, tableName ) ) { String loginTable = "user_login_" + MID; String aliasTable = "user_alias_" + MID; Set nameSet = new HashSet(); //т.к. у фиктивной сессии нет привязки к коду логина - поиск по логину либо алиасу String query = "SELECT login.login, alias.login_alias FROM " + loginTable + " AS login " + "LEFT JOIN " + aliasTable +" AS alias ON login.id=alias.login_id WHERE login.cid=?"; PreparedStatement ps = con.prepareStatement( query ); ps.setInt( 1, contractId ); ResultSet rs = ps.executeQuery(); while( rs.next() ) { nameSet.add( rs.getString( 1 ) ); nameSet.add( rs.getString( 2 ) ); }; ps.close(); if( nameSet.size() > 0 ) { String logins = "'" + Utils.toString( nameSet, "','" ) + "'"; logins = logins.substring( 0, logins.length() - 2 ); print( "Logins: " + logins ); query = "SELECT session.id FROM " + tableName + " AS session " + "WHERE session.status=0 AND fake=1 AND session.login_name IN (" + logins + ")"; PreparedStatement ps = con.prepareStatement( query ); ResultSet rs = ps.executeQuery(); while( rs.next() ) { int recordId = rs.getInt( 1 ); count++; print( "Killing " + recordId ); BillingEventBus.publish( new DialupSessionBreakEvent( MID, recordId ) ); } } } print( "Сброшено " + count + " сессий." ); } }