Пример конвертера данных из CSV-файлов в базу BGBilling - 3
Материал из BiTel WiKi
Версия от 10:50, 21 ноября 2012; DimOn (Обсуждение | вклад)
Конвертер для версии 5.1 реализован как глобальный скрипт поведения. Похож на упрощённый вариант конвертера Пример конвертера данных из CSV-файлов в базу BGBilling - 2. По комментариям и по тексту всё понятно.
import java.io.FileInputStream; import java.io.InputStreamReader; import java.math.BigDecimal; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Date; import ru.bitel.bgbilling.server.util.Setup; import ru.bitel.common.Utils; import bitel.billing.common.TimeUtils; import bitel.billing.server.admin.bean.User; import bitel.billing.server.contract.ContractRemover; import bitel.billing.server.contract.bean.BalanceUtils; import bitel.billing.server.contract.bean.Contract; import bitel.billing.server.contract.bean.ContractManager; import bitel.billing.server.contract.bean.ContractParameterManager; import bitel.billing.server.contract.bean.ContractTariff; import bitel.billing.server.contract.bean.ContractTariffManager; import bitel.billing.server.contract.bean.Payment; import bitel.billing.server.contract.bean.PaymentManager; import bitel.billing.server.util.PswdGen; import com.Ostermiller.util.ExcelCSVParser; /* Столбцы: 1. ДогИД — целое число => название договора 2. ДатаЗакл — строка формата 2011-04-29 00:00:00 => дата открытия договора 3. СтрокаПользователя — ФИО строкой => комментарий договора + текстовый параметр договора FIO_PARAM_ID 4. СтрокаАдреса — адрес строкой => текстовый параметр договора ADDRESS_PARAM_ID 5. ТарифИмя — название тарифа => игнор, всем заносим тариф с id=TARIFF_ID 6. Телефон — телефон строкой => текстовый параметр договора TEL1_PARAM_ID 7. Мобила — телефон строкой => текстовый параметр договора TEL2_PARAM_ID 8. ПаспСер — строкой => текстовый параметр договора PASP1_PARAM_ID 9. ПаспНом — строкой => текстовый параметр договора PASP2_PARAM_ID 10.ПаспДата — строкой => текстовый параметр договора PASP3_PARAM_ID 11.ПаспВыданИмя — строкой => текстовый параметр договора PASP4_PARAM_ID 12.Баланс — целое число => начальный баланс договора (типом платежа PAYMENT_TYPE_ID) 13.Активность — 0/1 => игнор */ // группа, куда попадут загруженные договоры. перед запуском конвертер её чистит! int LOADED_GROUP = 3; // ид шаблона договора из которого они создаются int PATTERN_ID = 0; // параметры договора int FIO_PARAM_ID = 1; int ADDRESS_PARAM_ID = 9; int TEL1_PARAM_ID = 5; int TEL2_PARAM_ID = 6; int PASP1_PARAM_ID = 54; int PASP2_PARAM_ID = 55; int PASP3_PARAM_ID = 56; int PASP4_PARAM_ID = 57; // тип платежа заносимого int PAYMENT_TYPE_ID = 25; // сегодняшняя дата Date CURDATE = new Date(); // тариф устанавливаемый всем int TARIFF_ID = 9; public void main( setup, con, conSlave ) { ContractRemover cr = new ContractRemover( setup, con, null ); long timeStart = System.currentTimeMillis(); // удаление ранее загруженных договоров //query = "SELECT id FROM contract"; String query = "SELECT id FROM contract WHERE gr & (1<<?) != 0"; PreparedStatement ps = con.prepareStatement( query ); ps.setInt( 1, LOADED_GROUP ); ResultSet rs = ps.executeQuery(); int count = 0; while ( rs.next() ) { int cid = rs.getInt( 1 ); cr.deleteContract( cid ); count ++; } ps.close(); print( "Removed " + count + " contracts.." ); // загружаем файлы loadFile( "/home/dimon/ДВТК.csv", setup, con ); long timeEnd = System.currentTimeMillis(); print( "Process time: " + (timeEnd - timeStart)/1000 + " s." ); } private void loadFile( String filename, Setup setup, Connection con ) { print( "Loading " + filename ); ContractManager cm = new ContractManager( con ); ContractParameterManager cpm = new ContractParameterManager( con ); PaymentManager paymentManager = new PaymentManager( con ); BalanceUtils bu = new BalanceUtils( con ); ContractTariffManager ctm = new ContractTariffManager( con ); String[][] data = ExcelCSVParser.parse( new InputStreamReader( new FileInputStream( filename ), "UTF-16LE" ) , '\t' ); if( data != null && data.length > 0 ) { final int rowCount = data.length; print( "Row count: " + rowCount ); for( int rowNum = 1; rowNum < rowCount; rowNum++ ) { String[] fields = data[rowNum]; if( fields.length != 13 ) { error( "Incorrect line " + rowNum + " col count: " + fields.length ); break; } String contractId; Date contractDate; String fio; String address; String tel1; String tel2; String pasp1; String pasp2; String pasp3; String pasp4; BigDecimal balance; try { contractId = fields[0]; if( Utils.isBlankString( contractId ) ) throw new Exception( "пустой ид договора" ); contractDate = TimeUtils.parseDate( fields[1], "yyyy-MM-dd HH:mm:ss" ); if( contractDate == null ) print( "пустая или неправильная дата договора, будет поставлена текущая дата: " + fields[1] ); fio = fields[2]; address = fields[3]; tel1 = fields[5]; tel2 = fields[6]; pasp1 = fields[7]; pasp2 = fields[8]; pasp3 = fields[9]; pasp4 = fields[10]; balance = Utils.parseBigDecimal( fields[11], null ); } catch (Exception e) { error( "Incorrect line " + rowNum + " format: " + e.toString() ); break; } // лог print( "import " + contractId + "(" + contractDate + "," + fio + ")" ); // пароль ЛК String pswd = PswdGen.generatePassword( 5, "0123456789" ); // создание договора Contract contract = cm.createFromPattern( PATTERN_ID, contractId, TimeUtils.convertDateToCalendar( contractDate!=null?contractDate:CURDATE ), pswd ); // назначение группы contract.setGroups( contract.getGroups() | (1L << LOADED_GROUP) ); // камент и сохранение contract.setComment( fio ); cm.updateContract( contract ); // параметры cpm.setStringParam( contract.getId(), FIO_PARAM_ID, fio, User.USER_SERVER ); if( Utils.notBlankString( address ) ) { cpm.setStringParam( contract.getId(), ADDRESS_PARAM_ID, address, User.USER_SERVER ); } if( Utils.notBlankString( tel1 ) ) { cpm.setStringParam( contract.getId(), TEL1_PARAM_ID, tel1, User.USER_SERVER ); } if( Utils.notBlankString( tel2 ) ) { cpm.setStringParam( contract.getId(), TEL2_PARAM_ID, tel2, User.USER_SERVER ); } if( Utils.notBlankString( pasp1 ) ) { cpm.setStringParam( contract.getId(), PASP1_PARAM_ID, pasp1, User.USER_SERVER ); } if( Utils.notBlankString( pasp2 ) ) { cpm.setStringParam( contract.getId(), PASP2_PARAM_ID, pasp2, User.USER_SERVER ); } if( Utils.notBlankString( pasp3 ) ) { cpm.setStringParam( contract.getId(), PASP3_PARAM_ID, pasp3, User.USER_SERVER ); } if( Utils.notBlankString( pasp4 ) ) { cpm.setStringParam( contract.getId(), PASP4_PARAM_ID, pasp4, User.USER_SERVER ); } // приход if( balance != null && balance.compareTo( BigDecimal.ZERO ) != 0 ) { Payment payment = new Payment(); payment.setPaymentTypeID( PAYMENT_TYPE_ID ); payment.setContractID( contract.getId() ); payment.setDate( CURDATE ); payment.setSumma( balance ); payment.setComment( "Импорт" ); payment.setUserID( User.USER_SERVER ); paymentManager.updatePayment( payment ); } bu.updateBalance( CURDATE, contract.getId() ); // установка тарифа ContractTariff contractTariff = new ContractTariff(); contractTariff.setContractID( contract.getId() ); contractTariff.setTariffPlanID( TARIFF_ID ); contractTariff.setComment( "Импорт" ); contractTariff.setDate1( TimeUtils.convertDateToCalendar( CURDATE ) ); ctm.updateContractTariff( contractTariff ); } } }