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; /** * Description:DLL的处理接口 * * @author LiHang * @date 2023/4/24 */ public abstract class DllMapperProcessor { private final static BidiMap 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 map){ if (!map.containsKey(fieldTypeEnum)){ throw new VciBaseException("找不到字段的映射"); } DdlFieldMappingAttrBO bo = map.get(fieldTypeEnum); return BeanUtil.copy(bo,DdlFieldMappingAttrBO.class); } protected static BidiMap getMappingMapCopy(){ BidiMap map = new DualHashBidiMap<>(); map.putAll(FIELD_MAPPING_MAP); return map; } /** * 按数据库字段类型列举所有的VCI字段类型 * @param columnStr 数据库字段类型 * @return VCI字段类型 */ public List listFieldByColumnStr(String columnStr){ return listFieldInMapByColumnStr(columnStr,FIELD_MAPPING_MAP); } protected final List listFieldInMapByColumnStr(String columnStr,BidiMap map){ VciBaseUtil.alertNotNull(columnStr,"数据库字段类型",map,"字段映射集合"); List 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(),"OID") ? StringPool.SPACE + "primary key" + StringPool.SPACE : ""); } public abstract VciFieldTypeEnum getFieldTypeByColumnStr(String columnStr,Integer length); protected final VciFieldTypeEnum getFieldTypeBeColumnStrInMap(String columnStr,Integer length,BidiMap map){ List 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; } }