lihang
2023-05-04 3579af2945dd38d841a23cd340acd474bb63773a
Source/UBCS/ubcs-service/ubcs-ddl/src/main/java/com/vci/ubcs/ddl/processor/dll/DllMapperProcessor.java
@@ -1,9 +1,18 @@
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.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.List;
/**
@@ -12,7 +21,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;
@@ -66,126 +125,24 @@
      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(),"OID") ? StringPool.SPACE +  "primary key" + StringPool.SPACE : "");
      if (!attributeVO.isNullableFlag()){
         value += dealNullableSql(attributeVO);
      }
      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;
      }
      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 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();
   }
}