田源
2024-04-24 d50dec2d9b92c103134ae4e313c7bbbe5c2f4432
Source/UBCS/ubcs-service/ubcs-ddl/src/main/java/com/vci/ubcs/ddl/processor/dll/DllMapperProcessor.java
@@ -1,10 +1,22 @@
package com.vci.ubcs.ddl.processor.dll;
import com.vci.ubcs.ddl.mapper.DllMapper;
import com.vci.ubcs.omd.vo.OmdBtmTypeAttributeVO;
import org.apache.commons.lang3.StringUtils;
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的处理接口
@@ -12,7 +24,57 @@
 * @author LiHang
 * @date 2023/4/24
 */
public abstract class DllMapperProcessor implements DllBehavior {
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;
@@ -26,166 +88,77 @@
      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转换
    *
    * 获取字段创建sql
    * @param fieldType VT字段类型
    * @param attributeVO 属性
    * @return sql
    */
   @Override
   public String dealNumberCreateSql(OmdBtmTypeAttributeVO attributeVO) {
      StringBuilder snb = new StringBuilder().append(NUMBER + SPACE);
      dealDefaultAndNull(attributeVO);
      return snb.toString();
   }
   /**
    * 调用处理默认值和非空
    *
    * @param attributeVO 属性
    * @return 执行结果
    */
   @Override
   public String dealDefaultAndNull(OmdBtmTypeAttributeVO attributeVO) {
      String value = "";
      if (StringUtils.isNotBlank(attributeVO.getDefaultValue())) {
         value += dealDefaultValue(attributeVO.getDefaultValue());
   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 : "");
      if (!attributeVO.isNullableFlag()){
         value += dealNullableSql(attributeVO);
   }
   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);
      }
      return value;
   }
   /**
    * 处理默认值
    *
    * @return sql
    */
   @Override
   public String dealDefaultValue(String defualValule) {
      return DEFAULT + SPACE + defualValule + SPACE;
   }
   /**
    * 处理浮点数类型的sql转换
    *
    * @param attributeVO 属性
    * @return sql
    */
   @Override
   public String dealDoubleCreateSql(OmdBtmTypeAttributeVO attributeVO) {
      Integer length = attributeVO.getPrecisionLength();
      if(length == null || length == 0){
         length = 20;
      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;
         }
      }
      Integer scaleLength = attributeVO.getScaleLength();
      if(scaleLength == null){
         scaleLength = 2;
      }
      StringBuilder sb = new StringBuilder().append(NUMBER).append("(").append(String.valueOf(length.intValue()))
         .append(",").append(String.valueOf(scaleLength.intValue()))
         .append(")").append(SPACE);
      sb.append(dealDefaultAndNull(attributeVO));
      return sb.toString();
      return finalField;
   }
   /**
    * 处理非空
    *
    * @return sql
    */
   @Override
   public String dealNullableSql(OmdBtmTypeAttributeVO attributeVO) {
      if (!attributeVO.isNullableFlag()) {
         return SPACE + "not null" + SPACE;
      }
      return "";
   }
   /**
    * 处理布尔类型的sql转换
    *
    * @param attributeVO 属性
    * @return sql
    */
   @Override
   public String dealBooleanCreateSql(OmdBtmTypeAttributeVO attributeVO) {
      return "VARCHAR (5) " + SPACE + dealDefaultAndNull(attributeVO);
   }
   /**
    * 处理日期时间类型的sql转换
    *
    * @param attributeVO 属性
    * @return sql
    */
   @Override
   public String dealDateTimeCreateSql(OmdBtmTypeAttributeVO attributeVO) {
      return "DATETIME" + SPACE + dealDefaultAndNull(attributeVO);
   }
   /**
    * 处理字符串类型的sql转换
    *
    * @param attributeVO 属性
    * @return sql
    */
   @Override
   public String dealStringCreateSql(OmdBtmTypeAttributeVO attributeVO) {
      StringBuilder sb = new StringBuilder();
      Integer length2 = attributeVO.getAttributeLength();
      if (length2 == null) {
         length2 = 250;
      }
      sb.append("VARCHAR").append("(").
         append(String.valueOf(length2.intValue())).append(")").append(SPACE);
      if (OID.equalsIgnoreCase(attributeVO.getId())) {
         sb.append(" primary key ");
         //强制设置OID为主键
      }
      sb.append(dealDefaultAndNull(attributeVO));
      return sb.toString();
   }
}