package com.vci.ubcs.ddl.processor.dll;
|
|
import com.vci.ubcs.ddl.bo.DdlFieldMappingAttrBO;
|
import com.vci.ubcs.ddl.mapper.*;
|
import com.vci.ubcs.omd.vo.BtmTypeAttributeVO;
|
import com.vci.ubcs.starter.exception.VciBaseException;
|
import com.vci.ubcs.starter.web.enumpck.VciFieldTypeEnum;
|
import com.vci.ubcs.starter.web.util.VciBaseUtil;
|
import org.apache.commons.collections4.BidiMap;
|
import org.apache.commons.collections4.CollectionUtils;
|
import org.apache.commons.collections4.bidimap.DualHashBidiMap;
|
import org.springblade.core.tool.utils.BeanUtil;
|
import org.springblade.core.tool.utils.StringPool;
|
import org.springblade.core.tool.utils.StringUtil;
|
|
import java.util.ArrayList;
|
import java.util.Collection;
|
import java.util.List;
|
import java.util.Locale;
|
|
/**
|
* Description:DLL的处理接口
|
*
|
* @author LiHang
|
* @date 2023/4/24
|
*/
|
public abstract class DllMapperProcessor {
|
|
private final static BidiMap<VciFieldTypeEnum, DdlFieldMappingAttrBO> FIELD_MAPPING_MAP;
|
|
static {
|
FIELD_MAPPING_MAP = new DualHashBidiMap<>();
|
FIELD_MAPPING_MAP.put(VciFieldTypeEnum.VTInteger,new DdlFieldMappingAttrBO("NUMBER",22,null,true,null));
|
FIELD_MAPPING_MAP.put(VciFieldTypeEnum.VTLong,new DdlFieldMappingAttrBO("NUMBER",22,null,true,null));
|
FIELD_MAPPING_MAP.put(VciFieldTypeEnum.VTDouble,new DdlFieldMappingAttrBO("NUMBER",26,8,true,null));
|
FIELD_MAPPING_MAP.put(VciFieldTypeEnum.VTBoolean,new DdlFieldMappingAttrBO("VARCHAR2",5,null,true,null));
|
FIELD_MAPPING_MAP.put(VciFieldTypeEnum.VTDate,new DdlFieldMappingAttrBO("TIMESTAMP",6,null,true,null));
|
FIELD_MAPPING_MAP.put(VciFieldTypeEnum.VTTime,new DdlFieldMappingAttrBO("TIMESTAMP",6,null,true,null));
|
FIELD_MAPPING_MAP.put(VciFieldTypeEnum.VTDateTime,new DdlFieldMappingAttrBO("TIMESTAMP",6,null,true,null));
|
FIELD_MAPPING_MAP.put(VciFieldTypeEnum.VTFilePath,new DdlFieldMappingAttrBO("VARCHAR2",100,null,true,null));
|
FIELD_MAPPING_MAP.put(VciFieldTypeEnum.VTClob,new DdlFieldMappingAttrBO("VTClob",null,null,true,null));
|
FIELD_MAPPING_MAP.put(VciFieldTypeEnum.VTString,new DdlFieldMappingAttrBO("VARCHAR2",255,null,true,null));
|
}
|
|
protected abstract DdlFieldMappingAttrBO getMappingBO(VciFieldTypeEnum fieldTypeEnum);
|
|
protected final DdlFieldMappingAttrBO getMappingBOInMap(VciFieldTypeEnum fieldTypeEnum,BidiMap<VciFieldTypeEnum, DdlFieldMappingAttrBO> map){
|
if (!map.containsKey(fieldTypeEnum)){
|
throw new VciBaseException("找不到字段的映射");
|
}
|
DdlFieldMappingAttrBO bo = map.get(fieldTypeEnum);
|
return BeanUtil.copy(bo,DdlFieldMappingAttrBO.class);
|
}
|
|
protected static BidiMap<VciFieldTypeEnum,DdlFieldMappingAttrBO> getMappingMapCopy(){
|
BidiMap<VciFieldTypeEnum, DdlFieldMappingAttrBO> map = new DualHashBidiMap<>();
|
map.putAll(FIELD_MAPPING_MAP);
|
return map;
|
}
|
|
/**
|
* 按数据库字段类型列举所有的VCI字段类型
|
* @param columnStr 数据库字段类型
|
* @return VCI字段类型
|
*/
|
public List<VciFieldTypeEnum> listFieldByColumnStr(String columnStr){
|
return listFieldInMapByColumnStr(columnStr,FIELD_MAPPING_MAP);
|
}
|
|
protected final List<VciFieldTypeEnum> listFieldInMapByColumnStr(String columnStr,BidiMap<VciFieldTypeEnum,DdlFieldMappingAttrBO> map){
|
VciBaseUtil.alertNotNull(columnStr,"数据库字段类型",map,"字段映射集合");
|
List<VciFieldTypeEnum> fieldTypeList = new ArrayList<>();
|
map.values().stream().filter(s -> StringUtil.equals(s.getDataType(),columnStr)).forEach(s -> {
|
fieldTypeList.add(map.getKey(s));
|
});
|
return fieldTypeList;
|
}
|
|
private DllMapper mapper;
|
|
public DllMapperProcessor(DllMapper mapper) {
|
this.mapper = mapper;
|
}
|
|
public abstract boolean support(String url);
|
|
public int createViewBySql(String viewCreateSql) {
|
return mapper.createViewBySql(viewCreateSql);
|
}
|
|
public int createTableBySql(String tableName, String attributeSql) {
|
return mapper.createTableBySql(tableName, attributeSql);
|
}
|
|
public int commentTable(String tableName, String comment) {
|
return mapper.commentTable(tableName, comment);
|
}
|
|
public int commentColumnTable(String tableName, String columnName, String comment) {
|
return mapper.commentColumnTable(tableName, columnName, comment);
|
}
|
|
public int modifyTableBySql(String tableName, String attributeSql) {
|
return mapper.modifyTableBySql(tableName, attributeSql);
|
}
|
|
public int addColumn2TableBySql(String tableName, String attributeSql) {
|
return mapper.addColumn2TableBySql(tableName, attributeSql);
|
}
|
|
public int dropTable(String tableName) {
|
return mapper.dropTable(tableName);
|
}
|
|
public int checkTableExist(String tableName) {
|
return mapper.checkTableExist(tableName);
|
}
|
|
public int countAll(String tableName) {
|
return mapper.countAll(tableName);
|
}
|
|
/**
|
* 获取字段创建sql
|
* @param fieldType VT字段类型
|
* @param attributeVO 属性
|
* @return sql
|
*/
|
public String getColumnTypeSql(VciFieldTypeEnum fieldType,BtmTypeAttributeVO attributeVO){
|
DdlFieldMappingAttrBO mappingBO = getMappingBO(fieldType);
|
mappingBO.setDataLength(attributeVO.getAttributeLength());
|
if (fieldType.equals(VciFieldTypeEnum.VTDouble)){
|
mappingBO.setDataPrecision(attributeVO.getPrecisionLength());
|
}
|
mappingBO.setNullable(attributeVO.isNullableFlag());
|
mappingBO.setDefaultValue(attributeVO.getDefaultValue());
|
return mappingBO.toString() + (StringUtil.equals(attributeVO.getId().toLowerCase(Locale.ROOT),"OID".toLowerCase(Locale.ROOT)) ? StringPool.SPACE + "primary key" + StringPool.SPACE : "");
|
|
}
|
|
public abstract VciFieldTypeEnum getFieldTypeByColumnStr(String columnStr,Integer length);
|
|
protected final VciFieldTypeEnum getFieldTypeBeColumnStrInMap(String columnStr,Integer length,BidiMap<VciFieldTypeEnum, DdlFieldMappingAttrBO> map){
|
List<VciFieldTypeEnum> fieldTypes = listFieldInMapByColumnStr(columnStr, map);
|
VciFieldTypeEnum finalField = null;
|
int i = Integer.MAX_VALUE;
|
if (fieldTypes.size() == 1){
|
return fieldTypes.get(0);
|
}
|
for (VciFieldTypeEnum fieldType : fieldTypes) {
|
if (fieldType.equals(VciFieldTypeEnum.VTString)) {
|
finalField = VciFieldTypeEnum.VTString;
|
}
|
if (fieldType.equals(VciFieldTypeEnum.VTDateTime)){
|
finalField = VciFieldTypeEnum.VTDateTime;
|
}
|
if (fieldType.equals(VciFieldTypeEnum.VTInteger) && length <= 26){
|
finalField = VciFieldTypeEnum.VTInteger;
|
}
|
}
|
return finalField;
|
}
|
|
}
|