Отключение 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 + " сессий." ); } }
