Пример конвертера данных из CSV-файлов в базу BGBilling - 3

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

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

Версия с динамическим кодом

Внимание! Данное решение/метод/статья относится к версии 7.0 и для других версий может быть неактуальна! Вам нужно самостоятельно поправить решение под свои нужды или воспользоваться помощью на форуме. Будем признательны, если внизу страницы или отдельной статьёй вы разместите исправленное решение для другой версии или подсказки что надо исправить.

Для работы скрипта необходимо скачать архив последнегоо бинарного релиза, распаковать файл ostermillerutils-1.08.02.jar и скопировать его на сервер в папку lib/ext/ и перезапустить службу BGBillingServer

Внимание! Данное решение/метод/статья относится к версии 5.2 и для других версий может быть неактуальна! Вам нужно самостоятельно поправить решение под свои нужды или воспользоваться помощью на форуме. Будем признательны, если внизу страницы или отдельной статьёй вы разместите исправленное решение для другой версии или подсказки что надо исправить.

Конвертер из csv-файла для версии 5.2 реализован как динамический класс. По сути является подправленным и упрощённым вариантом конвертера Пример конвертера данных из CSV-файлов в базу BGBilling - 2. По комментариям и по коду всё понятно. Ниже есть старая версия для глобального скрипта 5.1.

package ru.xxx;
 
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.kernel.script.server.dev.GlobalScriptBase;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.Utils;
import ru.bitel.common.sql.ConnectionSet;
import bitel.billing.common.TimeUtils;
import ru.bitel.bgbilling.kernel.module.common.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;
 
public class Converter
	extends GlobalScriptBase
{
	/*
	Столбцы:
	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;
 
	@Override
	public void execute( Setup setup, ConnectionSet connectionSet )
		throws Exception
	{
		print("Start");
		Connection con  = connectionSet.getConnection();
		//
		ContractRemover cr = new ContractRemover( setup, con, null );
		long timeStart = System.currentTimeMillis();
		// удаление ранее загруженных договоров
		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() )
		{
			cr.deleteContract( rs.getInt( 1 ) );
			++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 )
		throws Exception
	{
		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( "CSV 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.updateTextParam( contract.getId(), FIO_PARAM_ID, fio, User.USER_SERVER );
				if( Utils.notBlankString( address ) )
					cpm.updateTextParam( contract.getId(), ADDRESS_PARAM_ID, address, User.USER_SERVER );
				if( Utils.notBlankString( tel1 ) )
					cpm.updateTextParam( contract.getId(), TEL1_PARAM_ID, tel1, User.USER_SERVER );
				if( Utils.notBlankString( tel2 ) )
					cpm.updateTextParam( contract.getId(), TEL2_PARAM_ID, tel2, User.USER_SERVER );
				if( Utils.notBlankString( pasp1 ) )
					cpm.updateTextParam( contract.getId(), PASP1_PARAM_ID, pasp1, User.USER_SERVER );
				if( Utils.notBlankString( pasp2 ) )
					cpm.updateTextParam( contract.getId(), PASP2_PARAM_ID, pasp2, User.USER_SERVER );
				if( Utils.notBlankString( pasp3 ) )
					cpm.updateTextParam( contract.getId(), PASP3_PARAM_ID, pasp3, User.USER_SERVER );
				if( Utils.notBlankString( pasp4 ) )
					cpm.updateTextParam( contract.getId(), PASP4_PARAM_ID, pasp4, User.USER_SERVER );
				// баланс
				if( balance != null && balance.compareTo( BigDecimal.ZERO ) != 0 )
				{
					Payment payment = new Payment();
					payment.setTypeId( PAYMENT_TYPE_ID );
					payment.setContractId( contract.getId() );
					payment.setPaymentDate( 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 );
			}
		}
		else
		{
			error( "error file" );
		}
	}
}

Старая версия

Конвертер из csv-файла для версии 5.1 реализован как глобальный скрипт поведения. По сути является подправленным и упрощённым вариантом конвертера Пример конвертера данных из CSV-файлов в базу BGBilling - 2. По комментариям и по коду всё понятно.

Внимание! Данное решение/метод/статья относится к версии 5.1 и для других версий может быть неактуальна! Вам нужно самостоятельно поправить решение под свои нужды или воспользоваться помощью на форуме. Будем признательны, если внизу страницы или отдельной статьёй вы разместите исправленное решение для другой версии или подсказки что надо исправить.

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() )
	{
		cr.deleteContract( rs.getInt( 1 ) );
		++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( "CSV 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 );
		}
	}
	else
	{
		error( "error file" );
	}
}

--dimOn 10:59, 21 ноября 2012 (UTC)

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