package com.norteksoft.bs.options.service;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.norteksoft.acs.entity.organization.Company;
import com.norteksoft.acs.service.organization.CompanyManager;
import com.norteksoft.bs.options.dao.ImportColumnDao;
import com.norteksoft.bs.options.dao.ImportDefinitionDao;
import com.norteksoft.bs.options.entity.ImportColumn;
import com.norteksoft.bs.options.entity.ImportDefinition;
import com.norteksoft.bs.options.enumeration.BusinessType;
import com.norteksoft.bs.options.enumeration.ImportType;
import com.norteksoft.bs.options.enumeration.ImportWay;
import com.norteksoft.mms.base.data.DataHandle;
import com.norteksoft.mms.base.data.DataSheetConfig;
import com.norteksoft.mms.base.data.DataTransfer;
import com.norteksoft.mms.base.data.FileConfigModel;
import com.norteksoft.mms.form.enumeration.DataType;
import com.norteksoft.mms.form.jdbc.JdbcSupport;
import com.norteksoft.product.api.impl.DataImporterServiceImpl;
import com.norteksoft.product.api.impl.DefaultDataImporterCallBack;
import com.norteksoft.product.orm.Page;
import com.norteksoft.product.util.ContextUtils;
import com.norteksoft.product.util.JsonParser;
import com.norteksoft.product.util.ParameterUtils;
import com.norteksoft.product.util.PropUtils;
import com.norteksoft.product.util.ThreadParameters;
import com.norteksoft.product.util.ZipUtils;
/**
* 导入定义
* @author Administrator
*
*/
@Service
@Transactional
public class ImportDefinitionManager implements DataTransfer {
private final static String SEPARATOR = "\\\\";
public static final SimpleDateFormat SIMPLEDATEFORMAT1 = new SimpleDateFormat("yyyy-MM-dd");
public static final SimpleDateFormat SIMPLEDATEFORMAT2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private Log log = LogFactory.getLog(getClass());
@Autowired
private JdbcSupport jdbcDao;
@Autowired
private ImportDefinitionDao importDefinitionDao;
@Autowired
private ImportColumnDao importColumnDao;
@Autowired
private CompanyManager companyManager;
@Autowired
private DataHandle dataHandle;
/**
* 根据ID获得导入定义
* @param id
* @return
*/
@Transactional(readOnly=true)
public ImportDefinition getImportDefinition(Long id) {
return importDefinitionDao.get(id);
}
/**
* 根据编号获得导入定义
* @param code
* @return
*/
@Transactional(readOnly=true)
public ImportDefinition getImportDefinitionByCode(String code) {
return importDefinitionDao.getImportDefinitionByCode(code);
}
/**
* 获得所有的导入定义
* @param page
*/
public void getImportDefinitionPage(Page<ImportDefinition> page) {
importDefinitionDao.getImportDefinitionPage(page);
}
/**
* 根据导入定义的id获得导入列
* @param id
* @return
*/
public List<ImportColumn> getImportColumnByImportId(Long importId) {
return importColumnDao.getImportColumnByImportId(importId);
}
/**
* 保存导入基本信息
* @param importDefinition
*/
public void saveImportDefinition(ImportDefinition importDefinition) {
importDefinitionDao.save(importDefinition);
}
/**
* 删除导入定义
* @param ids
*/
public void delete(String ids) {
for(String id:ids.split(",")){
importDefinitionDao.delete(Long.valueOf(id));
}
}
/**
* 保存导入列
* @param id
*/
public void saveImportColumn(Long importId) {
ImportDefinition importDefinition=importDefinitionDao.get(importId);
List<Object> list=JsonParser.getFormTableDatas(ImportColumn.class);
for(Object obj:list){
ImportColumn importColumn=(ImportColumn)obj;
importColumn.setCompanyId(ContextUtils.getCompanyId());
importColumn.setImportDefinition(importDefinition);
importColumnDao.save(importColumn);
}
}
/**
* 删除导入列
* @param id
*/
public void importColumnDelete(Long id) {
importColumnDao.delete(id);
}
/**
* 导入
* @param file
* @param code
* @return
* @throws Exception
*/
public String importFile(File file,String fileName, ImportDefinition importDefinition) throws Exception {
if(ContextUtils.getCompanyId()==null){
return "没有取到公司id!";
}
String result = "";
Workbook workBook = null;
if(importDefinition.getImportColumns() !=null && importDefinition.getImportColumns().size()>0&&StringUtils.isNotEmpty(importDefinition.getName())){
if(fileName.endsWith(".xls")){
workBook = new HSSFWorkbook(new FileInputStream(file));
result = importExcelData(importDefinition,workBook);
}else if(fileName.endsWith(".xlsx")){
workBook = new XSSFWorkbook(new FileInputStream(file));
result = importExcelData(importDefinition,workBook);
}else{
result = importTextData(file,importDefinition);
}
}else{
result = "请填写数据表名和录入导入列!";
}
if(StringUtils.isEmpty(result)){
result="导入成功!";
}
return result;
}
private String importTextData(File file, ImportDefinition importDefinition) throws Exception{
String result = "";
if(ImportType.TXT_DIVIDE.equals(importDefinition.getImportType())){
if(StringUtils.isEmpty(importDefinition.getDivide())){
result = "字段信息中的 分隔符没有填写!\n";
}else{
result = importTxtDivideData(file,importDefinition);
}
}else if(ImportType.TXT.equals(importDefinition.getImportType())){
String validateResult=DataImporterServiceImpl.validateImportTxtData(importDefinition);
if(StringUtils.isEmpty(validateResult)){
result = importTxtData(file,importDefinition);
}else{
result = validateResult;
}
}else{
result = "编号为 "+importDefinition.getCode()+" 的导入定义中没有选择 导入类型 !";
}
return result;
}
/**
* 固定长度文本导入
* @param file
* @param importDefinition
* @return
* @throws Exception
*/
private String importTxtData(File file, ImportDefinition importDefinition) throws Exception{
FileInputStream fis= new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis,ZipUtils.prexEncoding(file.getPath()));
BufferedReader br = new BufferedReader(isr);
String line="";
List<String> fileContent = new ArrayList<String>();
int i=0;
while ((line=br.readLine())!=null){
if(i>0)
fileContent.add(line);
i++;
}
br.close();
isr.close();
fis.close();
String result = "";
if(ImportWay.SUCCESS.equals(importDefinition.getImportWay())){//所有数据正确后导入
result = validateImport(fileContent,importDefinition);
if(StringUtils.isEmpty(result)){
insertIntoTxtData(fileContent,importDefinition);
result="导入成功!";
}else{
return result;
}
}else if(ImportWay.ONLY_SUCCESS.equals(importDefinition.getImportWay())){//只导入正确数据
result=onlyImportRightData(fileContent,importDefinition);
}else{//有错误数据就不导入
result=haveErrorNotImport(fileContent,importDefinition);
}
return result;
}
/**
* 有错误数据就不导入
* @param fileContent
* @param importDefinition
* @param callBack
*/
private String haveErrorNotImport(List<String> fileContent,ImportDefinition importDefinition) {
String result="";
//导入定义中固定长度的总和
Integer rowWidth=totalWidth(importDefinition.getId());
int rowNum=1;//文件行数
if(fileContent != null && fileContent.size()>0){
for (String row : fileContent) {
String rowContent=row;
if(rowWidth==rowContent.length()){
for(ImportColumn importColumn:importDefinition.getImportColumns()){
String columnContent=rowContent.substring(0,importColumn.getWidth());
rowContent=rowContent.substring(importColumn.getWidth(), rowContent.length());
String validateResult=validateColumnDataType(importColumn,columnContent.trim(),rowNum);
if(StringUtils.isNotEmpty(validateResult))
return validateResult;
}
}else{
return "第"+rowNum+"行数据长度为"+rowContent.length()+"不等于导入定义中固定长度的总和"+rowWidth+"!";
}
rowNum++;
}
}else{
return "导入的文件中没有数据!";
}
insertIntoTxtData(fileContent,importDefinition);
return result;
}
/**
* 导入验证
*/
private String validateImport(List<String> fileContent,ImportDefinition importDefinition) {
//导入定义中固定长度的总和
Integer rowWidth=totalWidth(importDefinition.getId());
StringBuilder result=new StringBuilder();
int rowNum=1;//文件行数
if(fileContent != null && fileContent.size()>0){
for (String row : fileContent) {
String rowContent=row;
if(rowWidth==rowContent.length()){
for(ImportColumn importColumn:importDefinition.getImportColumns()){
String columnContent=rowContent.substring(0,importColumn.getWidth());
rowContent=rowContent.substring(importColumn.getWidth(), rowContent.length());
String validateResult=validateColumnDataType(importColumn,columnContent.trim(),rowNum);
if(StringUtils.isNotEmpty(validateResult))
result.append(validateResult);
}
}else{
result.append("第"+rowNum+"行数据长度为"+rowContent.length()+"不等于导入定义中固定长度的总和"+rowWidth+"!\n");
}
rowNum++;
}
}else{
result.append("导入的文件中没有数据!");
}
return result.toString();
}
/**
* 只导入正确数据
* @param fileContent
* @param importDefinition
* @param callBack
*/
private String onlyImportRightData(List<String> fileContent,ImportDefinition importDefinition) {
//导入定义中固定长度的总和
Integer rowWidth=totalWidth(importDefinition.getId());
StringBuilder result1=new StringBuilder();
int rowNum=1;//文件行数
if(fileContent != null && fileContent.size()>0){
for (String row : fileContent) {
String rowContent=row;
StringBuilder result=new StringBuilder();
if(rowWidth==rowContent.length()){
for(ImportColumn importColumn:importDefinition.getImportColumns()){
String columnContent=rowContent.substring(0,importColumn.getWidth());
rowContent=rowContent.substring(importColumn.getWidth(), rowContent.length());
String validateResult=validateColumnDataType(importColumn,columnContent.trim(),rowNum);
if(StringUtils.isNotEmpty(validateResult))
result.append(validateResult);
}
}else{
result.append("第"+rowNum+"行数据长度为"+rowContent.length()+"不等于导入定义中固定长度的总和"+rowWidth+"!\n");
}
if(StringUtils.isEmpty(result.toString())){//该行没有错误信息
importTxtRowData(row,importDefinition);
}else{//该行有错误信息
result1.append(result.toString());
}
rowNum++;
}
}else{
result1.append("导入的文件中没有数据!\n");
}
if(StringUtils.isEmpty(result1.toString())){
result1.append("导入文件成功!\n");
}
return result1.toString();
}
private void importTxtRowData(String rowContent,ImportDefinition importDefinition){
List<String> rowValues=new ArrayList<String>();
Date currentDate=new Date();
for(ImportColumn importColumn:importDefinition.getImportColumns()){
String columnValue=(rowContent.substring(0,importColumn.getWidth())).trim();
if(StringUtils.isEmpty(columnValue) && StringUtils.isNotEmpty(importColumn.getDefaultValue())){
columnValue=importColumn.getDefaultValue().trim();
}
rowValues.add(packagingColumnValue(importColumn,columnValue,currentDate));
rowContent=rowContent.substring(importColumn.getWidth(), rowContent.length());
}
String[] rowValue=rowValues.toArray(new String[rowValues.size()]);
saveSingleRowData(rowValue, importDefinition);
}
private String packagingColumnValue(ImportColumn importColumn,String columnValue, Date currentDate){
String column="";
if((DataType.LONG.equals(importColumn.getDataType())||DataType.INTEGER.equals(importColumn.getDataType()))&&columnValue.contains(".")){//excel的整形数据会带小数点
column=columnValue.substring(0,columnValue.indexOf("."));
}else if(DataType.DATE.equals(importColumn.getDataType()) && "${createdTime}".equals(columnValue)){
column=SIMPLEDATEFORMAT1.format(currentDate);
}else if(DataType.TIME.equals(importColumn.getDataType()) && "${createdTime}".equals(columnValue)){
column=SIMPLEDATEFORMAT2.format(currentDate);
}else{
column=columnValue;
}
return column;
}
//INSERT INTO BS_IMPORT_DEFINITION(company_id,creator,created_time) VALUES(8,'test1','2012-09-26 16:00:01');
private void insertIntoTxtData(List<String> fileContent,ImportDefinition importDefinition) {
for (String row : fileContent) {
importTxtRowData(row,importDefinition);
}
}
/**
* 分隔符分隔的文本导入
* @param file
* @param importDefinition
* @return
* @throws Exception
*/
private String importTxtDivideData(File file,ImportDefinition importDefinition) throws Exception{
int columnAmount=importDefinition.getImportColumns().size();
String separators=importDefinition.getDivide();
FileInputStream fis= new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis,ZipUtils.prexEncoding(file.getPath()));
BufferedReader br = new BufferedReader(isr);
String line="";
List<String[]> fileContent = new ArrayList<String[]>();
int i=0;
while ((line=br.readLine())!=null){
if(i > 0){
String[] columnContent ;
if(separators.equals("\\")){
columnContent = line.split(SEPARATOR);
}else{
columnContent = line.split(separators);
}
List<String> columns =Arrays.asList(columnContent);
List<String> values=new ArrayList<String>();
values.addAll(columns);
if(columnContent.length<columnAmount){
for(int m=0;m<columnAmount-columnContent.length;m++){
values.add("");
}
}
fileContent.add(values.toArray(new String[columnAmount]));
}
i++;
}
br.close();
isr.close();
fis.close();
String result = "";
if(ImportWay.SUCCESS.equals(importDefinition.getImportWay())){//所有数据正确后导入
result = validateSeparatorsImport(fileContent,importDefinition);
if(StringUtils.isEmpty(result)){
insertIntoSeparatorsData(fileContent,importDefinition);
}else{
return result;
}
}else if(ImportWay.ONLY_SUCCESS.equals(importDefinition.getImportWay())){//只导入正确数据
result=onlyImportTxtDivideRightData(fileContent, importDefinition);
}else{
result=haveErrorNotImportTxtDivide(fileContent, importDefinition);
}
return result;
}
/**
* 有错误数据就不导入
* @param fileContent
* @param importDefinition
*/
private String haveErrorNotImportTxtDivide(List<String[]> fileContent,ImportDefinition importDefinition) {
String result="";
int rowNum=1;//文件行数
String relevance =validateRelevance(importDefinition);
if(StringUtils.isNotEmpty(relevance)){
return relevance+"!";
}
if(fileContent != null && fileContent.size()>0){
for (String[] row : fileContent) {
int i=0;
for(ImportColumn importColumn:importDefinition.getImportColumns()){
String validateResult=validateColumnDataType(importColumn,row[i].trim(),rowNum);
if(StringUtils.isNotEmpty(validateResult))
return validateResult;
i++;
}
rowNum++;
}
}else{
return "导入的文件中没有数据!";
}
insertIntoSeparatorsData(fileContent,importDefinition);
return result;
}
/**
* 只导入正确数据
* @param fileContent
* @param importDefinition
* @param callBack
*/
private String onlyImportTxtDivideRightData(List<String[]> fileContent,ImportDefinition importDefinition) {
StringBuilder result1=new StringBuilder();
int rowNum=1;//文件行数
String relevance =validateRelevance(importDefinition);
if(StringUtils.isNotEmpty(relevance)){
return relevance;
}
if(fileContent != null && fileContent.size()>0){
for (String[] row : fileContent) {
StringBuilder result=new StringBuilder();
int i=0;
for(ImportColumn importColumn:importDefinition.getImportColumns()){
String validateResult=validateColumnDataType(importColumn,row[i].trim(),rowNum);
if(StringUtils.isNotEmpty(validateResult))
result.append(validateResult);
i++;
}
if(StringUtils.isEmpty(result.toString())){//该行没有错误信息
insertIntoSeparatorsRowData(row, importDefinition);
}else{//该行有错误信息
result1.append(result.toString());
}
rowNum++;
}
}else{
result1.append("导入的文件中没有数据!\n");
}
if(StringUtils.isEmpty(result1.toString())){
result1.append("导入文件成功!\n");
}
return result1.toString();
}
/**
* 分隔符分隔文本插入一行数据
* 返回值不为空说明没有给要导入的数据表名,为空说明插入成功
*/
private void insertIntoSeparatorsRowData(String[] rowContent,ImportDefinition importDefinition) {
int i=0;
List<String> rowValues=new ArrayList<String>();
Date currentDate=new Date();
for(ImportColumn importColumn:importDefinition.getImportColumns()){
String columnValue=rowContent[i].trim();
if(StringUtils.isEmpty(columnValue) && StringUtils.isNotEmpty(importColumn.getDefaultValue())){
columnValue=importColumn.getDefaultValue().trim();
}
rowValues.add(packagingColumnValue(importColumn,columnValue,currentDate));
i++;
}
String[] rowValue=rowValues.toArray(new String[rowValues.size()]);
saveSingleRowData(rowValue, importDefinition);
}
private void insertIntoSeparatorsData(List<String[]> fileContent,ImportDefinition importDefinition) {
for (String[] row : fileContent) {
insertIntoSeparatorsRowData(row, importDefinition);
}
}
private String validateSeparatorsImport(List<String[]> fileContent,ImportDefinition importDefinition) {
StringBuilder result=new StringBuilder();
int rowNum=1;//文件行数
String relevance =validateRelevance(importDefinition);
if(StringUtils.isNotEmpty(relevance)){
result.append(relevance);
}
if(fileContent != null && fileContent.size()>0){
for (String row[] : fileContent) {
int i=0;
for(ImportColumn importColumn:importDefinition.getImportColumns()){
String validateResult=validateColumnDataType(importColumn,row[i].trim(),rowNum);
if(StringUtils.isNotEmpty(validateResult))
result.append(validateResult);
i++;
}
rowNum++;
}
}else{
result.append("导入的文件中没有数据!\n");
}
return result.toString();
}
/**
* Excel导入
* @param importDefinition
* @param workBook
* @return
* @throws Exception
*/
private String importExcelData(ImportDefinition importDefinition, Workbook workBook) throws Exception{
String result = "";
if(workBook!=null){
int numberOfSheets = workBook.getNumberOfSheets();
for(int i=0;i<numberOfSheets;i++){
Sheet sheet = workBook.getSheetAt(i);
result = resolvingExcelData(sheet,importDefinition);
}
}else{
result="导入文件中没有内容!";
}
return result;
}
/**
* 解析数据
* @param sheet
* @param importDefinition
*/
private String resolvingExcelData(Sheet sheet,ImportDefinition importDefinition) {
String result = "";
int firstRowNum = sheet.getFirstRowNum();
int lastRowNum = sheet.getLastRowNum();
List<String[]> list = new ArrayList<String[]>();
int columnAmount=importDefinition.getImportColumns().size();
for(int i = firstRowNum+1; i <= lastRowNum; i++){
List<String> columns = new ArrayList<String>();
Row rowData = sheet.getRow(i);
if(rowData == null) continue;
for (int j = 0; j <= rowData.getLastCellNum()-1; j++) {
Cell cell = rowData.getCell(j);
if(cell==null){
columns.add("");
}else{
columns.add(DataImporterServiceImpl.getCellValue(cell)==null?"":DataImporterServiceImpl.getCellValue(cell).toString());
}
}
if(rowData.getLastCellNum()<columnAmount){
for(int m=0;m<columnAmount-rowData.getLastCellNum();m++){
columns.add("");
}
}
list.add(columns.toArray(new String[columnAmount]));
}
if(list.size()>0){
result=resolvingImportData(list,importDefinition);
}else{
result="编号为 "+importDefinition.getCode()+" 的导入文件中没有内容!\n";
}
return result;
}
private String resolvingImportData(List<String[]> list,ImportDefinition importDefinition){
String result="";
if(ImportWay.SUCCESS.equals(importDefinition.getImportWay())){//所有数据正确后导入
result = validateExcelImport(list,importDefinition);
if(StringUtils.isEmpty(result)){
insertIntoExcelData(list,importDefinition);
}else{
return result;
}
}else if(ImportWay.ONLY_SUCCESS.equals(importDefinition.getImportWay())){//只导入正确数据
result = onlyImportExcelRightData(list, importDefinition);
}else{
result = haveErrorNotImportExcel(list, importDefinition);
}
return result;
}
/**
* 有错误数据就不导入
* @param fileContent
* @param importDefinition
* @param callBack
*/
private String haveErrorNotImportExcel(List<String[]> fileContent,ImportDefinition importDefinition) {
String result = "";
int rowNum=1;//文件行数
String relevance =validateRelevance(importDefinition);
if(StringUtils.isNotEmpty(relevance)){
return relevance+"!";
}
if(fileContent != null && fileContent.size()>0){
for (String[] row : fileContent) {
int i=0;
for(ImportColumn importColumn:importDefinition.getImportColumns()){
String validateResult=validateColumnDataType(importColumn,row[i].trim(),rowNum);
if(StringUtils.isNotEmpty(validateResult))
return validateResult;
i++;
}
rowNum++;
}
}else{
return "导入的文件中没有数据!";
}
insertIntoExcelData(fileContent,importDefinition);
return result;
}
private void insertIntoExcelData(List<String[]> fileContent,ImportDefinition importDefinition) {
for (String[] row : fileContent) {
insertIntoSeparatorsRowData(row,importDefinition);
}
}
/**
* 只导入正确数据
* @param fileContent
* @param importDefinition
* @param callBack
*/
private String onlyImportExcelRightData(List<String[]> fileContent,ImportDefinition importDefinition) {
StringBuilder result1 = new StringBuilder();
int rowNum=1;//文件行数
String relevance =validateRelevance(importDefinition);
if(StringUtils.isNotEmpty(relevance)){
return relevance+"!";
}
if(fileContent != null && fileContent.size()>0){
for (String[] row : fileContent) {
StringBuilder result = new StringBuilder();
int i=0;
for(ImportColumn importColumn:importDefinition.getImportColumns()){
String validateResult=validateColumnDataType(importColumn,row[i].trim(),rowNum);
if(StringUtils.isNotEmpty(validateResult))
result.append(validateResult);
i++;
}
if(StringUtils.isEmpty(result.toString())){//该行没有错误信息
insertIntoSeparatorsRowData(row,importDefinition);
}else{//该行有错误信息
result1.append(result.toString());
}
rowNum++;
}
}else{
result1.append("导入的文件中没有数据!\n");
}
if(StringUtils.isEmpty(result1.toString())){
result1.append("导入文件成功!\n");
}
return result1.toString();
}
private void saveSingleRowData(String[] rowValue,ImportDefinition importDefinition) {
List<Object[]> relevanceField=new ArrayList<Object[]>();
List<Object[]> businessField=new ArrayList<Object[]>();
List<Object[]> field=new ArrayList<Object[]>();
int i=0;
for(ImportColumn importColumn:importDefinition.getImportColumns()){
packagingField(relevanceField,businessField,field,importColumn,rowValue[i]);
i++;
}
if(relevanceField.size()>0){//导入子表
relevanceData(relevanceField,field,businessField,importDefinition);
}else{//导入主表
importData(businessField, field, null, null,importDefinition.getName());
}
}
private void packagingField( List<Object[]> relevanceField,List<Object[]> businessField,List<Object[]> field,ImportColumn importColumn,String value){
if(BusinessType.RELEVANCE_FIELD.equals(importColumn.getBusinessType())){//是关联字段
relevanceField.add(getFieldMessage(importColumn, value));
}else if(BusinessType.BUSINESS_FIELD.equals(importColumn.getBusinessType())){//是业务字段
businessField.add(getFieldMessage(importColumn, value));
}else{
field.add(getFieldMessage(importColumn, value));
}
}
private Object[] getFieldMessage(ImportColumn importColumn,String value){
Object[] obj={importColumn.getName(),value,importColumn.getDataType()};
return obj;
}
private void importData(List<Object[]> businessField,List<Object[]> field,Long fkValue,String fkName,String tableName){
if(businessField.size()>0){
businessData(businessField,field,fkValue,fkName,tableName);
}else{
insertIntoData(field,fkValue,fkName,tableName);
}
}
private void relevanceData(List<Object[]> relevanceField,List<Object[]> field,List<Object[]> businessField,ImportDefinition importDefinition) {
String condition="";
for(Object[] obj:relevanceField){
if(StringUtils.isNotEmpty(condition)){
condition+=" and ";
}
condition+="o."+obj[0]+"=";
DataType dataType=DataType.valueOf(obj[2].toString());
if(DefaultDataImporterCallBack.fieldType(dataType, obj[1])){
condition+=obj[1];
}else {
condition+="'"+obj[1]+"'";
}
}
List fkId=jdbcDao.excutionSql("select o.id from "+importDefinition.getRelevanceName()+" o where "+condition);
if(fkId!=null&&fkId.size()>0){//找到需要主表
Long id=Long.valueOf(((Map)fkId.get(0)).get("id").toString());
importData(businessField, field, id,importDefinition.getForeignKey(),importDefinition.getName());
}else{//没有找到需要主表
importData(businessField, field, null, null,importDefinition.getName());
}
}
private void businessData(List<Object[]> businessField,List<Object[]> field,Long fkValue,String fkName,String tableName) {
String condition="";
for(Object[] obj:businessField){
if(StringUtils.isNotEmpty(condition)){
condition+=" and ";
}
condition+="o."+obj[0]+"=";
DataType dataType=DataType.valueOf(obj[2].toString());
if(DefaultDataImporterCallBack.fieldType(dataType, obj[1])){
condition+=obj[1];
}else {
condition+="'"+obj[1]+"'";
}
}
List fkId=jdbcDao.excutionSql("select o.id from "+tableName+" o where "+condition);
if(fkId!=null && fkId.size()>0){
for(int i=0;i<fkId.size();i++){
Long id=Long.valueOf(((Map)fkId.get(i)).get("id").toString());
updateData(field,id,tableName);
}
}else{
List<Object[]> newField=field;
for(Object[] obj:businessField){
newField.add(obj);
}
insertIntoData(newField,fkValue,fkName,tableName);
}
}
/**
* 更新数据
* @param field
*/
private void updateData(List<Object[]> field,Long id,String tableName) {
StringBuilder sql=new StringBuilder("UPDATE ");
sql.append(tableName);
sql.append(" SET ");
StringBuilder condition=new StringBuilder();
List<Object> values=new ArrayList<Object>();
for(Object[] obj:field){
if(StringUtils.isEmpty(obj[1].toString()))continue;
if(StringUtils.isNotEmpty(condition.toString())){
condition.append(",");
}
condition.append(obj[0]).append("=?");
DataType dataType=DataType.valueOf(obj[2].toString());
values.add(DefaultDataImporterCallBack.getValueByType(dataType,obj[1]));
}
sql.append(condition.toString());
sql.append(" WHERE id=?");
values.add(id);
jdbcDao.updateTable(sql.toString(),values.toArray());
}
/**
* 插入数据
* @param field
*/
private void insertIntoData(List<Object[]> field,Long fkValue,String fkName,String tableName) {
StringBuilder sql=new StringBuilder("INSERT INTO ");
StringBuilder name=new StringBuilder();
StringBuilder value=new StringBuilder();
List<Object> values=new ArrayList<Object>();
if("oracle".equals(PropUtils.getDataBase())){
name.append("id");
value.append("?");
values.add(jdbcDao.getSequenceValue("HIBERNATE_SEQUENCE"));
}
sql.append(tableName).append("(");
for(Object[] obj:field){
if(StringUtils.isEmpty(obj[1].toString()))continue;
if(StringUtils.isNotEmpty(name.toString())){
name.append(",");
value.append(",");
}
name.append(obj[0]);
value.append("?");
DataType dataType=DataType.valueOf(obj[2].toString());
values.add(DefaultDataImporterCallBack.getValueByType(dataType,obj[1]));
}
if(fkValue!=null){
name.append(",").append(fkName);
value.append(",?");
values.add(fkValue);
}
if(!name.toString().contains("company_id")){
name.append(",company_id");
value.append(",?");
values.add(ContextUtils.getCompanyId());
}
sql.append(name.toString());
sql.append(") VALUES(");
sql.append(value.toString());
sql.append(")");
jdbcDao.updateTable(sql.toString(),values.toArray());
}
private String validateRelevance(ImportDefinition importDefinition){
for(ImportColumn importColumn:importDefinition.getImportColumns()){
if(BusinessType.RELEVANCE_FIELD.equals(importColumn.getBusinessType()) && (StringUtils.isEmpty(importDefinition.getRelevanceName()) || StringUtils.isEmpty(importDefinition.getForeignKey()))){
return "基本信息中的关联表名或外键没有填写!\n";
}
}
return "";
}
private String validateExcelImport(List<String[]> fileContent,ImportDefinition importDefinition) {
StringBuilder result = new StringBuilder();
int rowNum=1;//文件行数
String relevance =validateRelevance(importDefinition);
if(StringUtils.isNotEmpty(relevance)){
result.append(relevance);
}
if(fileContent != null && fileContent.size()>0){
for (String[] row : fileContent) {
int i=0;
for(ImportColumn importColumn:importDefinition.getImportColumns()){
String validateResult=validateColumnDataType(importColumn,row[i].trim(),rowNum);
if(StringUtils.isNotEmpty(validateResult))
result.append(validateResult);
i++;
}
rowNum++;
}
}else{
result.append("导入的文件中没有数据!\n");
}
return result.toString();
}
private String validateColumnDataType(ImportColumn importColumn,String columnContent,int rowNum){
String validateResult="";
if(importColumn.getNotNull()){
if(StringUtils.isEmpty(importColumn.getDefaultValue())){//该字段不能为空,并且没有默认值
if(StringUtils.isEmpty(columnContent)){
validateResult="第"+rowNum+"行"+importColumn.getAlias()+"为空!\n";
}else{
validateResult=DataImporterServiceImpl.validateDataType(importColumn.getDataType(),columnContent,rowNum,importColumn.getAlias(),false);
}
}else if(StringUtils.isNotEmpty(importColumn.getDefaultValue())){//该字段不能为空,并且有默认值
//验证默认值的数据类型是否正确
validateResult=DataImporterServiceImpl.validateDataType(importColumn.getDataType(),importColumn.getDefaultValue().trim(),0,importColumn.getAlias(),true);
}
}else{
validateResult=DataImporterServiceImpl.validateDataType(importColumn.getDataType(),columnContent,rowNum,importColumn.getAlias(),false);
}
return validateResult;
}
/**
* 根据编码和ID获得编码相同且ID不同的导入定义
* @param code
* @param id
* @return
*/
@Transactional(readOnly=true)
public ImportDefinition getImportDefinitionByCode(String code, Long id) {
return importDefinitionDao.getImportDefinitionByCode(code, id);
}
public void backup(String systemIds, Long companyId,FileConfigModel fileConfig) {
try {
File file = new File(fileConfig.getExportRootPath()+"/"+fileConfig.getExportPath()+"/"+fileConfig.getFilename()+".xls");
OutputStream out=null;
out=new FileOutputStream(file);
exportImportDefinition(out);
}catch (Exception e) {
log.debug(PropUtils.getExceptionInfo(e));
}
}
private void exportImportDefinition(OutputStream fileOut){
HSSFWorkbook wb;
List<DataSheetConfig> confs=dataHandle.getConfigInfo("data-sheets/sheets/data-sheet[@name='BS_IMPORT_DEFINITION']");
List<DataSheetConfig> colConfs=dataHandle.getConfigInfo("data-sheets/sheets/data-sheet[@name='BS_IMPORT_COLUMN']");
wb = new HSSFWorkbook();
//导入定义excel信息
HSSFSheet sheet=wb.createSheet("BS_IMPORT_DEFINITION");
HSSFRow row = sheet.createRow(0);
dataHandle.getFileHead(wb,row,confs);
//导入列excel信息
HSSFSheet colSheet=wb.createSheet("BS_IMPORT_COLUMN");
HSSFRow colRow = colSheet.createRow(0);
dataHandle.getFileHead(wb,colRow,colConfs);
List<ImportDefinition> importDefinitions=importDefinitionDao.getAllImportDefinition();
for(ImportDefinition importDefinition:importDefinitions){
importDefinitionInfo(importDefinition,sheet,colSheet,confs,colConfs);
}
try {
wb.write(fileOut);
} catch (IOException e) {
log.debug(PropUtils.getExceptionInfo(e));
}finally{
if(fileOut!=null)
try {
fileOut.close();
} catch (IOException e) {
log.debug(PropUtils.getExceptionInfo(e));
}
}
}
private void importDefinitionInfo(ImportDefinition importDefinition,
HSSFSheet sheet, HSSFSheet colSheet, List<DataSheetConfig> confs,
List<DataSheetConfig> colConfs) {
if(importDefinition!=null){
//导入定义的信息
HSSFRow rowi = sheet.createRow(sheet.getLastRowNum()+1);
for(int i=0;i<confs.size();i++){
DataSheetConfig conf=confs.get(i);
if(!conf.isIgnore()){
dataHandle.setFieldValue(conf,i,rowi,importDefinition);
}
}
//导入列的信息
importColumnInfo(importDefinition,colSheet,colConfs);
}
}
private void importColumnInfo(ImportDefinition importDefinition,
HSSFSheet colSheet, List<DataSheetConfig> colConfs) {
List<ImportColumn> columns=importColumnDao.getImportColumnByImportId(importDefinition.getId());
for(ImportColumn col:columns){
HSSFRow colrowi = colSheet.createRow(colSheet.getLastRowNum()+1);
for(int i=0;i<colConfs.size();i++){
DataSheetConfig conf=colConfs.get(i);
if(!conf.isIgnore()){
if("importCode".equals(conf.getFieldName())){
HSSFCell cell = colrowi.createCell(i);
cell.setCellValue(importDefinition.getCode());
}else{
dataHandle.setFieldValue(conf,i,colrowi,col);
}
}
}
}
}
public void restore(Long companyId, FileConfigModel fileConfig,String... imatrixInfo) {
File file =null;
if(StringUtils.isNotEmpty(fileConfig.getFilename())){
file=new File(fileConfig.getImportRootPath()+"/"+fileConfig.getImportPath()+"/"+fileConfig.getFilename()+".xls");
if(file.exists()){
importDefinitionDatas(file, companyId);
}
}
}
private void importDefinitionDatas(File file,Long companyId){
List<DataSheetConfig> confs=dataHandle.getConfigInfo("data-sheets/sheets/data-sheet[@name='BS_IMPORT_DEFINITION']");
List<DataSheetConfig> colConfs=dataHandle.getConfigInfo("data-sheets/sheets/data-sheet[@name='BS_IMPORT_COLUMN']");
Map<String,Integer> map=dataHandle.getIdentifier(confs);
Map<String,Integer> colMap=dataHandle.getIdentifier(colConfs);
//创建时间,创建人姓名,创建人id,公司id
FileInputStream fis=null;
InputStreamReader fr=null;
BufferedReader br=null;
try{
fis=new FileInputStream(file);
HSSFWorkbook wb=new HSSFWorkbook(fis);
HSSFSheet sheet=wb.getSheet("BS_IMPORT_DEFINITION");
if(ContextUtils.getCompanyId()==null){
if(companyId==null){
List<Company> companys=companyManager.getCompanys();
for(Company company:companys){
ThreadParameters parameters=new ThreadParameters(company.getCompanyId(),null);
ParameterUtils.setParameters(parameters);
importDefinitionData(sheet,confs,map);
}
}else{
ThreadParameters parameters=new ThreadParameters(companyId,null);
ParameterUtils.setParameters(parameters);
importDefinitionData(sheet,confs,map);
}
dataHandle.clearCompanyId();
}else{
importDefinitionData(sheet,confs,map);
}
HSSFSheet colSheet=wb.getSheet("BS_IMPORT_COLUMN");
if(ContextUtils.getCompanyId()==null){
List<Company> companys=companyManager.getCompanys();
for(Company company:companys){
ThreadParameters parameters=new ThreadParameters(company.getCompanyId(),null);
ParameterUtils.setParameters(parameters);
importColumnData(colSheet,colConfs,colMap);
}
dataHandle.clearCompanyId();
}else{
importColumnData(colSheet,colConfs,colMap);
}
} catch (FileNotFoundException e) {
log.debug(PropUtils.getExceptionInfo(e));
}catch (IOException e){
log.debug(PropUtils.getExceptionInfo(e));
}finally{
try{
if(br!=null)br.close();
if(fr!=null)fr.close();
if(fis!=null)fis.close();
}catch(IOException ep){
log.debug(PropUtils.getExceptionInfo(ep));
}
}
}
private void importDefinitionData(HSSFSheet sheet,List<DataSheetConfig> confs,Map<String,Integer> map){
int firstRowNum = sheet.getFirstRowNum();
int rowNum=sheet.getLastRowNum();
for(int i=firstRowNum+1;i<=rowNum;i++){
HSSFRow row =sheet.getRow(i);
if(sheet.getRow(i)!=null){
addImportDefinition(confs,row,map);
}
}
}
private void addImportDefinition(List<DataSheetConfig> confs,HSSFRow row,Map<String,Integer> map ){
Integer index=map.get("code");
String code=row.getCell(index).getStringCellValue();//导入定义编号
ImportDefinition importDefinition=importDefinitionDao.getImportDefinitionByCode(code);
if(importDefinition==null){
importDefinition=new ImportDefinition();
}
importDefinition.setCode(code);
for(int j=0;j<confs.size();j++){
DataSheetConfig conf=confs.get(j);
if(!conf.isIgnore()){
String fieldName=conf.getFieldName();
String value=null;
if(row.getCell(j)!=null){
value=row.getCell(j).getStringCellValue();
}
if(StringUtils.isNotEmpty(value)){//导入数据
dataHandle.setValue(importDefinition,fieldName,conf.getDataType(),value,conf.getEnumName());
}else if(StringUtils.isNotEmpty(conf.getDefaultValue())){//导入默认值
dataHandle.setValue(importDefinition,fieldName,conf.getDataType(),conf.getDefaultValue(),conf.getEnumName());
}
}
}
importDefinition.setCreatedTime(new Date());
importDefinition.setCreator(ContextUtils.getLoginName());
importDefinition.setCreatorName(ContextUtils.getUserName());
importDefinition.setCompanyId(ContextUtils.getCompanyId());
importDefinitionDao.save(importDefinition);
}
private void importColumnData(HSSFSheet colSheet,List<DataSheetConfig> colConfs,Map<String,Integer> colMap){
int colFirstRowNum = colSheet.getFirstRowNum();
int colRowNum=colSheet.getLastRowNum();
for(int i=colFirstRowNum+1;i<=colRowNum;i++){
HSSFRow row =colSheet.getRow(i);
if(colSheet.getRow(i)!=null){
addImportColumns(colConfs,row,colMap);
}
}
}
private void addImportColumns(List<DataSheetConfig> confs,HSSFRow row,Map<String,Integer> map){
String code=row.getCell(map.get("importCode")).getStringCellValue();//导入定义编号
String columnName=row.getCell(map.get("name")).getStringCellValue();//字段名称
ImportDefinition importDefinition=importDefinitionDao.getImportDefinitionByCode(code);
ImportColumn column=importColumnDao.getImportColumn(importDefinition.getId(),columnName);
if(column==null){//该字段不存在,则新建
column=new ImportColumn();
}
if(column!=null){
for(int j=0;j<confs.size();j++){
DataSheetConfig conf=confs.get(j);
if(!conf.isIgnore()){
String fieldName=conf.getFieldName();
String value=null;
if(row.getCell(j)!=null){
value=row.getCell(j).getStringCellValue();
}
if("importCode".equals(conf.getFieldName())){
column.setImportDefinition(importDefinition);
}else{
if(StringUtils.isNotEmpty(value)){//导入数据
dataHandle.setValue(column,fieldName,conf.getDataType(),value,conf.getEnumName());
}else if(StringUtils.isNotEmpty(conf.getDefaultValue())){//导入默认值
dataHandle.setValue(column,fieldName,conf.getDataType(),conf.getDefaultValue(),conf.getEnumName());
}
}
}
}
column.setCompanyId(ContextUtils.getCompanyId());
column.setCreatedTime(new Date());
column.setCreator(ContextUtils.getLoginName());
column.setCreatorName(ContextUtils.getUserName());
importColumnDao.save(column);
}
}
/**
* 根据导入定义的id获得导入列中固定长度的总和
* @param importDefinitionId
* @return
*/
public Integer totalWidth(Long importDefinitionId) {
List<Integer> widthList = importColumnDao.getColumnWidth(importDefinitionId);
Integer totalWidth = 0;
for(Integer itemAmount : widthList){
totalWidth+=itemAmount;
}
return totalWidth;
}
}