Отчёт поиск договоров по тарифу

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

Перейти к: навигация, поиск

Табличный отчёт для демонстрации того, как из отчёта сделать поиск тарифов.

Пример 1

kernel_find_contracts_for_tariff.rep.xml

<?xml version="1.0" encoding="UTF-8"?>
<report title="Поиск договоров по тарифам CSV" type="java">
	<contractGroups name="contractGroups" title="Группы договоров"/>
	<contractGroups name="contractGroups2" title="Исключая группы"/>
	<tariffs name="tariffs" title="Тарифы"/>
	<tariffGroups name="tariffGroups" title="Группы тарифов"/>
	<combo name="isOnlyActive" title="Только активные тарифы и группы тарифов">
		<item id="1" title="Да"/>
		<item id="0" title="Нет"/>
	</combo>
	<list name="status" title="Статус">
		<item id="0" title="активен"/>
		<item id="1" title="в отключении"/>
		<item id="2" title="отключен"/>				
		<item id="3" title="закрыт"/>		
		<item id="4" title="приостановлен"/>		
		<item id="5" title="в подключении"/>		
	</list>
	<fields>
		<item id="title" title="Имя"/>
		<item id="comment" title="Комментарий"/>
		<item id="cid" title="#cid"/>
		<item id="status" title="Статус"/>
		<item id="tptitle" title="Тариф"/>
		<item id="tpdate" title="Период"/>
		<item id="tgtitle" title="Группа тарифа"/>
		<item id="tgdate" title="Период"/>
	</fields>
</report>

kernel_find_contracts_for_tariff.java

import java.sql.*;
import java.util.*;
import java.util.regex.*;
import java.sql.*;
import bitel.billing.server.util.*;
import bitel.billing.server.contract.bean.*;
import bitel.billing.common.TimeUtils;
 
public void fillReport( con, filter, result )
{
	// Группы договоров. Типа 536870912.
	long groupMask = filter.getLongParam( "contractGroups" );
	// Исключая группы договоров. Типа 536870912.
	long groupMask2 = filter.getLongParam( "contractGroups2" );
	// Тарифы. Типа "190, 47".
	String tariffsList = filter.getStringParam( "tariffs" );
	// Искать только активные?
	boolean isOnlyActive = filter.getIntParam( "isOnlyActive" ) == 1;
	// Группы тарифов
	String tariffGroups = filter.getStringParam( "tariffGroups" );
	// Статус
	String statuss = filter.getStringParam( "status" );
 
	String query =
		" SELECT contract.id,contract.title,contract.comment,contract.status," +
		"contract_tariff.tpid, contract_tariff.date1, contract_tariff.date2, tariff_plan.title, " +
		"contract_tariff_group.gid, contract_tariff_group.date1, contract_tariff_group.date2, tariff_group.title";
	query += " FROM contract ";
	query += " LEFT JOIN contract_tariff ON contract_tariff.cid=contract.id ";
	query += " LEFT JOIN tariff_plan ON contract_tariff.tpid=tariff_plan.id ";
	query += " LEFT JOIN contract_tariff_group ON  contract_tariff_group.cid=contract.id ";
	query += " LEFT JOIN tariff_group ON contract_tariff_group.gid=tariff_group.id ";
	query += " WHERE (1) ";
 
	if( groupMask > 0 )
	{
		query += " AND contract.gr&?!=0 ";
	}
	if( groupMask2 > 0 )
	{
		query += " AND contract.gr&?=0 ";
	}
	if( tariffsList != null && !tariffsList.isEmpty() )
	{
		query += " AND contract_tariff.tpid in ("+tariffsList+") ";
	}
	if( tariffGroups != null && !tariffGroups.isEmpty() )
	{
		query += " AND contract_tariff_group.gid IN ("+tariffGroups+") ";
	}
	if( statuss != null && !statuss.isEmpty() )
	{
		query += " AND contract.status IN (" + statuss + ") ";
	}
 
	if( isOnlyActive )
	{
		query += " AND (contract_tariff.date1 IS NULL OR TO_DAYS(contract_tariff.date1)<=TO_DAYS(now())) AND (contract_tariff.date2 IS NULL OR TO_DAYS(now())<=TO_DAYS(contract_tariff.date2)) ";
		query += " AND (contract_tariff_group.date1 IS NULL OR TO_DAYS(contract_tariff_group.date1)<=TO_DAYS(now())) AND (contract_tariff_group.date2 IS NULL OR TO_DAYS(now())<=TO_DAYS(contract_tariff_group.date2)) ";
	}
 
	ps = con.prepareStatement( query );
 
	int index = 1;
 
	if( groupMask > 0 )
	{
		ps.setLong( index++, groupMask );
	}
	if( groupMask2 > 0 )
	{
		ps.setLong( index++, groupMask2 );
	}
 
	ResultSet rs = ps.executeQuery();
 
	ArrayList data = new ArrayList( 1000 );
	while( rs.next() )
	{
		cid = rs.getString("contract.id");
	    title = rs.getString("contract.title");
	    comment = rs.getString("contract.comment"); 
	    status = rs.getInt("contract.status");
 
	    tpdate1 = rs.getDate("contract_tariff.date1");
	    tpdate2 = rs.getDate("contract_tariff.date2");
	    tptitle = rs.getString("tariff_plan.title");
 
	    tgdate1 = rs.getDate("contract_tariff_group.date1");
	    tgdate2 = rs.getDate("contract_tariff_group.date2");
	    tgtitle = rs.getString("tariff_group.title");
 
	    map = new HashMap();
	    map.put( "cid", cid );
	    map.put( "title", title );
	    map.put( "comment", comment );
	    map.put( "status", ContractStatus.statusToString( status ) );
	    map.put( "tpdate", TimeUtils.formatPeriod( tpdate1, tpdate2 ) );
	    map.put( "tptitle", tptitle );
	    map.put( "tgdate", TimeUtils.formatPeriod( tgdate1, tgdate2 ) );
	    map.put( "tgtitle", tgtitle );
	    data.add( map );
	}
 
	result.setData( data );
}

--dimOn 06:52, 5 августа 2010 (UTC)

Пример 2

список 1: какие нужны фильтры для поиска. это поле слева 1. Статус 2. Баланс от 2. Баланс до 3. Сортировка по адресу или по балансу или по номеру договора 4.1. Тарифы 4.2. Группы тарифов 4.3. Исключая группы

список 2: какие столбцы нужны в таблице. это таблица справа. т.е. какая информация должна отображаться там столбцами. 1. Номер договора 2. ФИО 3. Статус 4. Тариф 5. Баланс (на данный момент) 6. Адрес

PID параметров фио и адрес, берётся из настроек как и для contract_skat_debtor report.contract_skat_debtor.fio.pid report.contract_skat_debtor.address.pid

kernel_find_contracts_for_tariff_2.rep.xml

<?xml version="1.0" encoding="UTF-8"?>
<report title="Поиск договоров по тарифам CSV 2 (Скат)" type="java">
	<list name="status" title="Статус" width="2" x="0" y="0">
		<item id="0" title="активен"/>
		<item id="1" title="в отключении"/>
		<item id="2" title="отключен"/>				
		<item id="3" title="закрыт"/>		
		<item id="4" title="приостановлен"/>		
		<item id="5" title="в подключении"/>		
	</list>
	<textField name="min" title="Баланс от" textBefore="" textAfter="" x="0" y="1"/>	 
	<textField name="max" title="Баланс до" textBefore="" textAfter="" x="1" y="1"/>
	<combo name="sort" title="Сортировка" width="2" >
		<item id="0" title="-"/>
		<item id="1" title="по адресу"/>
		<item id="2" title="по балансу"/>				
		<item id="3" title="по номеру договора"/>		
	</combo>
	<tariffs name="tariffs" title="Тарифы"/>
	<tariffGroups name="tariffGroups" title="Группы тарифов"/>	
	<contractGroups name="contractGroups2" title="Исключая группы"/>
	<fields>
		<item id="cid" title="#cid"/>
		<item id="title" title="Номер договора"/>
		<item id="fio" title="ФИО"/>
		<item id="status" title="Статус"/>		
		<item id="tptitle" title="Тариф"/>
		<item id="balance" title="Баланс (на данный момент)"/>		
		<item id="address" title="Адрес"/>
	</fields>
</report>


kernel_find_contracts_for_tariff_2.java


import java.sql.*;
import java.util.*;
import java.util.regex.*;
import java.sql.*;
import bitel.billing.server.util.*;
import bitel.billing.server.contract.bean.*;
import bitel.billing.common.TimeUtils;
 
public void fillReport( con, filter, result )
{
	// Статус
	String statuss = filter.getStringParam( "status" );
	// Баланс от и до
    int min = filter.getIntParam( "min", Integer.MIN_VALUE );
	int max = filter.getIntParam( "max", Integer.MAX_VALUE );
	// Сортировка
	// "0" "-"
	// "1" "по адресу"
	// "2" "по балансу"			
	// "3" "по номеру договора"
	int sort = filter.getIntParam( "sort" );
	// Тарифы. Типа "190, 47".
	String tariffsList = filter.getStringParam( "tariffs" );
	// Группы тарифов
	String tariffGroups = filter.getStringParam( "tariffGroups" );
	// Исключая группы договоров. Типа 536870912.
	long groupMask2 = filter.getLongParam( "contractGroups2" );
	// PID параметров фио и адрес, берётся из настроек как и для contract_skat_debtor
	int fioPid = filter.getIntParam( "report.contract_skat_debtor.fio.pid", 1 );
	int addressPid = filter.getIntParam( "report.contract_skat_debtor.address.pid", 3 );
 
	// удаляем временную таблицу балансов договоров
	String query = "DROP TEMPORARY TABLE IF EXISTS temp_balance;";  	
	con.createStatement().executeUpdate( query );
	// балансы договоров
	query =
        "CREATE TEMPORARY TABLE temp_balance ( UNIQUE(cid) ) " +
        "SELECT cid, MAX(yy*12+(mm-1))%12 + 1 AS mm," +
        "FLOOR(MAX(yy*12+(mm-1)) / 12) AS yy " + 	    		
        "FROM contract_balance " +
        "GROUP BY cid";  
	//query = result.sql( query , filter );
	//System.out.println( query );                  
	con.createStatement().executeUpdate( query );
 
	String query =
		" SELECT contract.id, contract.title, contract.comment, contract.status, " +
		" fio.val as fio, address.address as address, ( b.summa1 + b.summa2 - b.summa3 - b.summa4) as balance, " +
		" tariff_plan.title ";
	query += " FROM contract ";
	query += " LEFT JOIN temp_balance ON temp_balance.cid=contract.id ";
	query += " LEFT JOIN contract_balance as b ON b.cid=contract.id AND b.mm = temp_balance.mm AND b.yy = temp_balance.yy";
 
	query += " LEFT JOIN contract_parameter_type_1 as fio ON contract.id=fio.cid AND fio.pid=" + fioPid;
	query += " LEFT JOIN contract_parameter_type_2 as address ON contract.id=address.cid AND address.pid=" + addressPid;
 
//	query += " LEFT JOIN contract_tariff ON contract_tariff.cid=contract.id ";
	query += " LEFT JOIN contract_tariff ON contract_tariff.cid=contract.id AND (contract_tariff.date1 <= ? OR contract_tariff.date1 is NULL) AND (contract_tariff.date2 >= ? OR contract_tariff.date2 is NULL) ";
	query += " LEFT JOIN tariff_plan ON contract_tariff.tpid=tariff_plan.id ";
	query += " LEFT JOIN contract_tariff_group ON  contract_tariff_group.cid=contract.id ";
	query += " LEFT JOIN tariff_group ON contract_tariff_group.gid=tariff_group.id ";
	query += " WHERE (1) ";
 
	if( groupMask2 > 0 )
	{
		query += " AND contract.gr&?=0 ";
	}
	if( tariffsList != null && !tariffsList.isEmpty() )
	{
		query += " AND contract_tariff.tpid in ("+tariffsList+") ";
	}
	if( tariffGroups != null && !tariffGroups.isEmpty() )
	{
		query += " AND contract_tariff_group.gid IN ("+tariffGroups+") ";
	}
	if( statuss != null && !statuss.isEmpty() )
	{
		query += " AND contract.status IN (" + statuss + ") ";
	}
 
	query += " AND  ( b.summa1 + b.summa2 - b.summa3 - b.summa4) >= " + min;
	query += " AND  ( b.summa1 + b.summa2 - b.summa3 - b.summa4) <= " + max;   
 
	if( sort>0 )
	{
		query +=  " ORDER BY ";
		switch( sort )
		{
			case 1:
				query += "address.address";
				break;
			case 2:
				query += "balance";
				break;
			case 3:
				query += "contract.title";
				break;
		}
	}
 
//System.out.println(query);
	ps = con.prepareStatement( query );
 
	int index = 1;
 
	java.sql.Date current = new java.sql.Date( System.currentTimeMillis() );
	ps.setDate(index++, current );
	ps.setDate(index++, current );
 
	if( groupMask2 > 0 )
	{
		ps.setLong( index++, groupMask2 );
	}
 
	ResultSet rs = ps.executeQuery();
 
	ArrayList data = new ArrayList( 1000 );
	while( rs.next() )
	{
		//<item id="cid" title="#cid"/>
		//<item id="title" title="Номер договора"/>
		//<item id="fio" title="ФИО"/>
		//<item id="status" title="Статус"/>		
		//<item id="tptitle" title="Тариф"/>
		//<item id="balance" title="Баланс (на данный момент)"/>		
		//<item id="address" title="Адрес"/>
		cid = rs.getString("contract.id");
	    title = rs.getString("contract.title");
	    comment = rs.getString("contract.comment"); 
	    status = rs.getInt("contract.status");
 
	    tptitle = rs.getString("tariff_plan.title");
 
	    balance = rs.getDouble("balance");
	    address = rs.getString("address");
	    fio = rs.getString("fio");
 
	    map = new HashMap();
	    map.put( "cid", cid );
	    map.put( "title", title );
	    map.put( "fio", fio );
	    map.put( "status", ContractStatus.statusToString( status ) );	    
	    map.put( "tptitle", tptitle );
	    map.put( "balance", String.valueOf( balance ) );
	    map.put( "address", address );
	    data.add( map );
	}
 
	result.setData( data );
}

--dimOn 05:17, 13 сентября 2010 (UTC)

Личные инструменты