package com.vci.ubcs.ddl.processor.dll; import com.vci.ubcs.ddl.bo.DdlFieldMappingAttrBO; import com.vci.ubcs.ddl.mapper.DllDmMapper; import com.vci.ubcs.ddl.mapper.DllMapper; import com.vci.ubcs.omd.vo.BtmTypeAttributeVO; import com.vci.ubcs.starter.util.VciSpringUtil; import com.vci.ubcs.starter.web.enumpck.VciFieldTypeEnum; import org.apache.commons.collections4.BidiMap; import org.springblade.core.tool.utils.StringPool; import org.springblade.core.tool.utils.StringUtil; import org.springframework.context.annotation.DependsOn; import org.springframework.stereotype.Component; import java.util.List; import java.util.Locale; import java.util.Optional; /** * Description: 应用于达梦数据,生成创建表操作sql的处理器 * * @author LiHang * @date 2023/4/24 */ @Component @DependsOn("vciSpringUtil") public class DllDmMapperProcessor extends DllMapperProcessor { private static final DllMapper MAPPER = VciSpringUtil.getBean(DllDmMapper.class); private static final BidiMap FIELD_MAP = getMappingMapCopy(); static { // 需要重新映射的字段类型在这里写 FIELD_MAP.put(VciFieldTypeEnum.VTDouble, new DdlFieldMappingAttrBO("DOUBLE", 53, null, true, null)); FIELD_MAP.put(VciFieldTypeEnum.VTInteger, new DdlFieldMappingAttrBO("INTEGER", null, null, true, null)); FIELD_MAP.put(VciFieldTypeEnum.VTLong, new DdlFieldMappingAttrBO("NUMBER", 38, null, true, null)); FIELD_MAP.put(VciFieldTypeEnum.VTBoolean, new DdlFieldMappingAttrBO("VARCHAR", 5, null, true, null)); FIELD_MAP.put(VciFieldTypeEnum.VTDate, new DdlFieldMappingAttrBO("DATE", null, null, true, null)); FIELD_MAP.put(VciFieldTypeEnum.VTDateTime, new DdlFieldMappingAttrBO("TIMESTAMP", null, null, true, null)); FIELD_MAP.put(VciFieldTypeEnum.VTTime, new DdlFieldMappingAttrBO("TIME", null, null, true, null)); FIELD_MAP.put(VciFieldTypeEnum.VTFilePath, new DdlFieldMappingAttrBO("TEXT", null, null, true, null)); FIELD_MAP.put(VciFieldTypeEnum.VTClob, new DdlFieldMappingAttrBO("CLOB", 100, null, true, null)); FIELD_MAP.put(VciFieldTypeEnum.VTString, new DdlFieldMappingAttrBO("VARCHAR", 255, null, true, null)); FIELD_MAP.put(VciFieldTypeEnum.VTString, new DdlFieldMappingAttrBO("VARCHAR2", 255, null, true, null)); } public DllDmMapperProcessor() { super(MAPPER); System.out.println("-----------------"); if (MAPPER != null) { System.out.println("[success]::加载达梦数据库DLL操作服务成功"); } else { System.out.println("[fail]::加载达梦数据库DLL操作服务失败"); } } @Override public boolean support(String url) { return "dm.jdbc.driver.DmDriver".equals(url); } @Override protected DdlFieldMappingAttrBO getMappingBO(VciFieldTypeEnum fieldTypeEnum) { return getMappingBOInMap(fieldTypeEnum, FIELD_MAP); } @Override public String getColumnTypeSql(VciFieldTypeEnum fieldType, BtmTypeAttributeVO attributeVO) { DdlFieldMappingAttrBO mappingBO = getMappingBO(fieldType); if (mappingBO.getDataLength() != null) { //mappingBO用来做最后的校验,如果定义的BO没有字段长度,则说明这个类型生成的sql不应该指定长度。如果指定了长度,说明是字段长度的最大值,VARCHAR、CLOB除外 // TODO:2024-4-23修改,这儿第一组判断条件取反了,但是这儿应该是不取反才对 if ((fieldType.equals(VciFieldTypeEnum.VTClob) || fieldType.equals(VciFieldTypeEnum.VTString)) && attributeVO.getAttributeLength() > mappingBO.getDataLength()) { mappingBO.setDataLength(attributeVO.getAttributeLength()); } } 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 : ""); } /** * 按数据库字段类型列举所有的VCI字段类型 * * @param columnStr 数据库字段类型 * @return VCI字段类型 */ @Override public List listFieldByColumnStr(String columnStr) { return listFieldInMapByColumnStr(columnStr, FIELD_MAP); } @Override public VciFieldTypeEnum getFieldTypeByColumnStr(String columnStr, Integer length) { return getFieldTypeBeColumnStrInMap(columnStr, length, FIELD_MAP); } }