Пример конвертера данных из 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 );
		}
	}
}
Личные инструменты