lihang
2023-07-10 dd2cbe9c6f7360d0f50da4e5f0fc506ad3915d8b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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.stereotype.Component;
 
import java.util.List;
import java.util.Locale;
 
/**
 * Description: 应用于达梦数据,生成创建表操作sql的处理器
 *
 * @author LiHang
 * @date 2023/4/24
 */
@Component
public class DllDmMapperProcessor extends DllMapperProcessor {
 
    private static final DllMapper MAPPER = VciSpringUtil.getBean(DllDmMapper.class);
 
    private static final BidiMap<VciFieldTypeEnum, DdlFieldMappingAttrBO> FIELD_MAP = getMappingMapCopy();
 
    static {
        // 需要重新映射的字段类型在这里写
        FIELD_MAP.put(VciFieldTypeEnum.VTDouble, new DdlFieldMappingAttrBO("DOUBLE", 26, 8, true, null));
        FIELD_MAP.put(VciFieldTypeEnum.VTInteger, new DdlFieldMappingAttrBO("INTEGER", 10, 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));
    }
 
    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 (fieldType.equals(VciFieldTypeEnum.VTDouble)) {
            mappingBO.setDataPrecision(attributeVO.getPrecisionLength() == -1 ? 8 : attributeVO.getPrecisionLength());
        }
        //先只针对数字类型的进行处理
        if (fieldType.equals(VciFieldTypeEnum.VTInteger) ){
            mappingBO.setDataLength(null);
        } else if (fieldType.equals(VciFieldTypeEnum.VTDouble) || fieldType.equals(VciFieldTypeEnum.VTLong)) {
            if (attributeVO.getAttributeLength() <= mappingBO.getDataLength()) {
                mappingBO.setDataLength(attributeVO.getAttributeLength());
            }
        }else {
            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<VciFieldTypeEnum> listFieldByColumnStr(String columnStr) {
        return listFieldInMapByColumnStr(columnStr, FIELD_MAP);
    }
 
    @Override
    public VciFieldTypeEnum getFieldTypeByColumnStr(String columnStr, Integer length) {
        return getFieldTypeBeColumnStrInMap(columnStr, length, FIELD_MAP);
    }
}