Отключение Fake сессий при приходе платежа

Материал из BiTel WiKi

(Различия между версиями)
Перейти к: навигация, поиск
(Новая страница: «Для версии 5.1 сброс Reject-To-Accept сессий при приходе платежа в договор либо понижении лимита в …»)
 
Строка 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 session.id FROM " + tableName + " AS session " +
+
"SELECT login.login, alias.login_alias FROM " + loginTable + " AS login " +  
-
"INNER JOIN user_login_" + MID + " AS login ON session.lid=login.id AND login.cid=? " +
+
"LEFT JOIN " + aliasTable +" AS alias ON login.id=alias.login_id WHERE login.cid=?";
-
"WHERE session.status=0 AND fake=1";
+
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 ) );
-
count++;
+
nameSet.add( rs.getString( 2 ) );
-
+
};
-
print( "Killing " + recordId );
+
ps.close();
-
+
 
-
BillingEventBus.publish( new DialupSessionBreakEvent( MID, recordId ) );
+
 
 +
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 + " сессий." );		
	}
}
Личные инструменты