package com.norteksoft.product.api.impl;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.norteksoft.bs.options.entity.ImportColumn;
import com.norteksoft.bs.options.entity.ImportDefinition;
import com.norteksoft.bs.options.enumeration.BusinessType;
import com.norteksoft.mms.form.enumeration.DataType;
import com.norteksoft.mms.form.jdbc.JdbcSupport;
import com.norteksoft.product.api.DataImporterCallBack;
import com.norteksoft.product.util.ContextUtils;
import com.norteksoft.product.util.PropUtils;
@Service
@Transactional
public class DefaultDataImporterCallBack implements DataImporterCallBack{
public static final SimpleDateFormat SIMPLEDATEFORMAT1 = new SimpleDateFormat("yyyy-MM-dd");
public static final SimpleDateFormat SIMPLEDATEFORMAT2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private String tableName;
public DefaultDataImporterCallBack() {
super();
}
public DefaultDataImporterCallBack(String tableName) {
super();
this.tableName = tableName;
}
public String afterValidate(List<String> results) {
String str="";
for(String result:results){
str+=result+"!\n";
}
return str;
}
public boolean beforeSaveSingleRow(String[] rowValue,ImportDefinition importDefinition) {
return true;
}
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;
}
public String saveSingleRow(String[] rowValue,ImportDefinition importDefinition) {
if(ContextUtils.getCompanyId()==null){
return "no_company_id";
}
if(StringUtils.isEmpty(tableName)&&StringUtils.isEmpty(importDefinition.getName())){
return "no_table_name";
}else if(StringUtils.isEmpty(tableName)&&StringUtils.isNotEmpty(importDefinition.getName())){
tableName=importDefinition.getName();
}
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);
}
return "";
}
private void importData(List<Object[]> businessField,List<Object[]> field,Long fkValue,String fkName){
if(businessField.size()>0){
businessData(businessField,field,fkValue,fkName);
}else{
insertIntoData(field,fkValue,fkName);
}
}
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(fieldType(dataType,obj[1])){
condition+=obj[1];
}else {
condition+="'"+obj[1]+"'";
}
}
if(((JdbcSupport)ContextUtils.getBean("jdbcDao")) == null) throw new RuntimeException("JdbcSupport为null");
List fkId=((JdbcSupport)ContextUtils.getBean("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());
}else{//没有找到需要主表
importData(businessField, field, null, null);
}
}
public static boolean fieldType(DataType dataType,Object columnContent){
if(DataType.BOOLEAN.equals(dataType)||DataType.DOUBLE.equals(dataType)||DataType.FLOAT.equals(dataType)||DataType.LONG.equals(dataType)||DataType.AMOUNT.equals(dataType)||DataType.NUMBER.equals(dataType)||DataType.INTEGER.equals(dataType)){
return true;
}else if(DataType.ENUM.equals(dataType)&&columnContent.toString().matches("^-?\\d+$")){
return true;
}else{
return false;
}
}
public static Object getValueByType(DataType dataType,Object value){
try {
if(DataType.DATE.equals(dataType)){
return SIMPLEDATEFORMAT1.parse(value.toString());
}else if(DataType.TIME.equals(dataType)){
return SIMPLEDATEFORMAT1.parse(value.toString());
}else if(DataType.BOOLEAN.equals(dataType)){
if("0".equals(value.toString())||"false".equals(value.toString())){
return false;
}else if("1".equals(value.toString())||"true".equals(value.toString())){
return true;
}
}else if(DataType.DOUBLE.equals(dataType)||DataType.AMOUNT.equals(dataType)){
return Double.valueOf(value.toString());
}else if(DataType.FLOAT.equals(dataType)){
return Float.valueOf(value.toString());
}else if(DataType.LONG.equals(dataType)||DataType.NUMBER.equals(dataType)||DataType.INTEGER.equals(dataType)){
return Integer.valueOf(value.toString());
}else if(DataType.ENUM.equals(dataType)){
if(value.toString().matches("^-?\\d+$")){
return Integer.valueOf(value.toString());
}else{
return String.valueOf(value);
}
}else{
return String.valueOf(value);
}
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
private void businessData(List<Object[]> businessField,List<Object[]> field,Long fkValue,String fkName) {
String condition="";
for(Object[] obj:businessField){
if(StringUtils.isNotEmpty(condition)){
condition+=" and ";
}
condition+="o."+obj[0]+"=";
DataType dataType=DataType.valueOf(obj[2].toString());
if(fieldType(dataType,obj[1])){
condition+=obj[1];
}else {
condition+="'"+obj[1]+"'";
}
}
if(((JdbcSupport)ContextUtils.getBean("jdbcDao")) == null) throw new RuntimeException("JdbcSupport为null");
List fkId=((JdbcSupport)ContextUtils.getBean("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);
}
}else{
List<Object[]> newField=field;
for(Object[] obj:businessField){
newField.add(obj);
}
insertIntoData(newField,fkValue,fkName);
}
}
/**
* 更新数据
* @param field
*/
private void updateData(List<Object[]> field,Long id) {
StringBuilder sql=new StringBuilder("UPDATE ");
sql.append(tableName);
sql.append(" t 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);
if(((JdbcSupport)ContextUtils.getBean("jdbcDao")) == null) throw new RuntimeException("JdbcSupport为null");
((JdbcSupport)ContextUtils.getBean("jdbcDao")).updateTable(sql.toString(),values.toArray());
}
/**
* 插入数据
* @param field
*/
private void insertIntoData(List<Object[]> field,Long fkValue,String fkName) {
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("?");
if(((JdbcSupport)ContextUtils.getBean("jdbcDao")) == null) throw new RuntimeException("JdbcSupport为null");
values.add(((JdbcSupport)ContextUtils.getBean("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(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(")");
if(((JdbcSupport)ContextUtils.getBean("jdbcDao")) == null) throw new RuntimeException("JdbcSupport为null");
((JdbcSupport)ContextUtils.getBean("jdbcDao")).updateTable(sql.toString(),values.toArray());
}
public void afterSaveSingleRow(String[] rowValue,ImportDefinition importDefinition) {
}
public void afterSaveAllRows() {
}
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
}