Отчёт поиск договоров по тарифу
Материал из BiTel WiKi
(Различия между версиями)
DimOn (Обсуждение | вклад) (→Пример 2) |
DimOn (Обсуждение | вклад) (→Пример 2) |
||
(1 промежуточная версия не показана) | |||
Строка 4: | Строка 4: | ||
kernel_find_contracts_for_tariff.rep.xml | kernel_find_contracts_for_tariff.rep.xml | ||
+ | |||
<source lang="xml"> | <source lang="xml"> | ||
<?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||
Строка 152: | Строка 153: | ||
список 1: какие нужны фильтры для поиска. это поле слева | список 1: какие нужны фильтры для поиска. это поле слева | ||
- | 1. Статус | + | *1. Статус |
- | 2. Баланс от | + | *2. Баланс от |
- | 2. Баланс до | + | *2. Баланс до |
- | 3. Сортировка по адресу или по балансу или по номеру договора | + | *3. Сортировка по адресу или по балансу или по номеру договора |
- | 4.1. Тарифы | + | *4.1. Тарифы |
- | 4.2. Группы тарифов | + | *4.2. Группы тарифов |
- | 4.3. Исключая группы | + | *4.3. Исключая группы |
список 2: какие столбцы нужны в таблице. это таблица справа. т.е. какая информация должна отображаться там столбцами. | список 2: какие столбцы нужны в таблице. это таблица справа. т.е. какая информация должна отображаться там столбцами. | ||
- | 1. Номер договора | + | *1. Номер договора |
- | 2. ФИО | + | *2. ФИО |
- | 3. Статус | + | *3. Статус |
- | 4. Тариф | + | *4. Тариф |
- | 5. Баланс (на данный момент) | + | *5. Баланс (на данный момент) |
- | 6. Адрес | + | *6. Адрес |
PID параметров фио и адрес, берётся из настроек как и для contract_skat_debtor | PID параметров фио и адрес, берётся из настроек как и для contract_skat_debtor | ||
- | report.contract_skat_debtor.fio.pid | + | *report.contract_skat_debtor.fio.pid |
- | report.contract_skat_debtor.address.pid | + | *report.contract_skat_debtor.address.pid |
kernel_find_contracts_for_tariff_2.rep.xml | kernel_find_contracts_for_tariff_2.rep.xml | ||
+ | <source lang="xml"> | ||
<?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||
<report title="Поиск договоров по тарифам CSV 2 (Скат)" type="java"> | <report title="Поиск договоров по тарифам CSV 2 (Скат)" type="java"> | ||
Строка 205: | Строка 207: | ||
</fields> | </fields> | ||
</report> | </report> | ||
+ | </source> | ||
+ | |||
kernel_find_contracts_for_tariff_2.java | kernel_find_contracts_for_tariff_2.java | ||
+ | <source lang="java"> | ||
import java.sql.*; | import java.sql.*; | ||
import java.util.*; | import java.util.*; | ||
Строка 222: | Строка 227: | ||
String statuss = filter.getStringParam( "status" ); | String statuss = filter.getStringParam( "status" ); | ||
// Баланс от и до | // Баланс от и до | ||
- | + | int min = filter.getIntParam( "min", Integer.MIN_VALUE ); | |
int max = filter.getIntParam( "max", Integer.MAX_VALUE ); | int max = filter.getIntParam( "max", Integer.MAX_VALUE ); | ||
// Сортировка | // Сортировка | ||
Строка 336: | Строка 341: | ||
//<item id="address" title="Адрес"/> | //<item id="address" title="Адрес"/> | ||
cid = rs.getString("contract.id"); | 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"); | tptitle = rs.getString("tariff_plan.title"); | ||
Строка 359: | Строка 364: | ||
result.setData( data ); | result.setData( data ); | ||
} | } | ||
+ | </source> | ||
+ | --[[Участник:DimOn|dimOn]] 05:17, 13 сентября 2010 (UTC) |
Текущая версия на 05:19, 13 сентября 2010
Табличный отчёт для демонстрации того, как из отчёта сделать поиск тарифов.
Пример 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)