xiejun
2023-07-13 2871cb99e018f6bf9e2ef76a424a1429a7c818f0
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
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<VciFieldTypeEnum, DdlFieldMappingAttrBO> 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));
    }
 
    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除外
            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<VciFieldTypeEnum> listFieldByColumnStr(String columnStr) {
        return listFieldInMapByColumnStr(columnStr, FIELD_MAP);
    }
 
    @Override
    public VciFieldTypeEnum getFieldTypeByColumnStr(String columnStr, Integer length) {
        return getFieldTypeBeColumnStrInMap(columnStr, length, FIELD_MAP);
    }
}