ludc
2023-04-26 3cb0cef6f7189dcbb537df52cef5921d1d2c3cd9
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
package com.vci.ubcs.omd.service.impl;
 
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.vci.ubcs.omd.constant.OmdCacheConstant;
import com.vci.ubcs.omd.dto.AttributeDTO;
import com.vci.ubcs.omd.dto.BtmTypeLinkAttributesDTO;
import com.vci.ubcs.omd.entity.Attribute;
import com.vci.ubcs.omd.mapper.AttributeMapper;
import com.vci.ubcs.omd.service.IAttributeService;
import com.vci.ubcs.omd.vo.AttributeVO;
import com.vci.ubcs.omd.wrapper.AttributeWrapper;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import org.springblade.core.cache.utils.CacheUtil;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.tool.constant.BladeConstant;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.Func;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
 
import javax.validation.constraints.NotEmpty;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
 
 
/**
 * Description: 元数据(属性)的服务
 *
 * @author LiHang
 * @date 2023/4/3
 */
@Service
public class AttributeServiceImpl extends ServiceImpl<AttributeMapper, Attribute>  implements IAttributeService {
 
    @Override
    public boolean deleteLogic(@NotEmpty List<Long> ids) {
        return false;
    }
 
    @Override
    public boolean changeStatus(@NotEmpty List<Long> ids, Integer status) {
        return false;
    }
 
    /**
     * 获取元数据详情
     *
     * @param id 主键
     * @return 元数据显示对象
     */
    @Override
    public AttributeVO getAttributeDetail(Long id) {
        Func.requireNotNull(id,"主键不能为空");
        return AttributeWrapper.build().entityVO(baseMapper.selectByPrimaryKey(id));
    }
 
    /**
     * 新增或修改
     *
     * @param dto 页面传输对象
     * @return 执行结果
     */
    @Override
    public boolean submit(AttributeDTO dto) {
        LambdaQueryWrapper<Attribute> wrapper = Wrappers.<Attribute>query().lambda().eq(Attribute::getKey, dto.getKey());
        Long count = baseMapper.selectCount((Func.isEmpty(dto.getId())) ? wrapper : wrapper.notIn(Attribute::getId, dto.getId()));
        if (count > 0L) {
            throw new ServiceException("属性名已存在!");
        }
        dto.setIsDeleted(BladeConstant.DB_NOT_DELETED);
        Attribute omdAttribute = BeanUtil.copy(dto, Attribute.class);
        CacheUtil.clear(OmdCacheConstant.ATTR_CACHE);
        return saveOrUpdate(omdAttribute);
    }
 
    /**
     * 删除
     *
     * @param ids 主键集合
     * @return 执行结果
     */
    @Override
    public boolean removeAttrs(String ids) {
        List<Long> idList = Func.toLongList(ids);
        return !deleteLogic(idList) && removeByIds(idList);
    }
 
    /**
     * 查看应用范围
     *
     * @param id 主键
     * @return 查询已应用的业务类型名称
     */
    @Override
    public List<String> applyRange(Long id) {
        return new ArrayList<>();
    }
 
    /**
     * 检查属性是否存在
     *
     * @param keyCollections 英文名称集合
     * @return true表示都存在,false表示不存在,不存在的时候会抛出异常
     * @throws VciBaseException 不存在的时候会抛出异常
     */
    @Override
    public boolean checkAttributeExists(Collection<String> keyCollections) throws VciBaseException {
        List<AttributeVO> existAttributeVOList = listAttributeByKeyCollection(keyCollections);
        if (CollectionUtils.isEmpty(existAttributeVOList)) {
            throw new VciBaseException("使用的属性都在系统中不存在,请先查证");
        } else {
            Set<String> existAttributeIdSet = (existAttributeVOList.stream().collect(Collectors.toMap(s -> s.getKey().toLowerCase().trim(), t -> t))).keySet();
            keyCollections.stream().forEach(s -> {
                if (!existAttributeIdSet.contains(s)) {
                    throw new VciBaseException("使用的属性{0}在系统中不存在,请先查证", new Object[]{s});
                }
            });
        }
        return true;
    }
 
 
    /**
     * 根据英文名称集合批量获取属性对象
     *
     * @param attributeIdCollection 英文名称集合
     * @return 属性对象列表,如果有不存在的不会返回,全部不存在的则返回空列表
     * @throws VciBaseException 参数为空或者查询出错时会抛出错误
     */
    @Override
    public List<AttributeVO> listAttributeByKeyCollection(Collection<String> attributeIdCollection) throws VciBaseException {
        if(!CollectionUtils.isEmpty(attributeIdCollection)){
            List<Attribute> attributeDOList = listAttributeByKeyCollectionDO(attributeIdCollection);
            if(!CollectionUtils.isEmpty(attributeDOList)) {
                return AttributeWrapper.build().listEntityVO(attributeDOList);
            }
        }
        return null;
    }
 
    /**
     * 根据英文名称集合获取属性数据对象
     * @param attributeIdCollection 属性的英文名称集合
     * @return 属性数据对象列表,如果有不存在的不会返回,全部不存在的则返回空列表
     * @throws VciBaseException mybatis查询出错的时候会抛出异常
     */
    private List<Attribute> listAttributeByKeyCollectionDO(Collection<String> attributeIdCollection) throws VciBaseException {
        if(!CollectionUtils.isEmpty(attributeIdCollection)){
            List<Attribute> attributeDOList = new ArrayList<>();
            Collection<String> distAttributeIdCollection = attributeIdCollection.stream().distinct().collect(Collectors.toList());
            Collection<Collection<String>> idCollections = VciBaseUtil.switchCollectionForOracleIn(distAttributeIdCollection);
            if(!CollectionUtils.isEmpty(idCollections)) {
                idCollections.stream().forEach(s -> {
                    List<Attribute> attributeDOS = baseMapper.selectList(Wrappers.<Attribute>query().lambda().in(Attribute::getKey, s));
                    if(!CollectionUtils.isEmpty(attributeDOS)){
                        attributeDOList.addAll(attributeDOS);
                    }
                });
            }
            return attributeDOList;
        }
        return null;
    }
 
    /**
     * 判断属性的内容是否符合要求
     *
     * @param id              属性的主键
     * @param attrDataType    属性的类型
     * @param attributeLength 属性的长度
     * @param defaultValue    默认值
     * @return true表示符合要求,不符合要求会抛出异常
     * @throws VciBaseException 不符合要求会抛出异常
     */
    @Override
    public boolean checkAttributePass(String id, String attrDataType, Integer attributeLength, String defaultValue) throws VciBaseException {
        return true;
    }
 
    /**
     * 校验属性是否符合要求
     *
     * @param attributesDTO 属性数据传输对象
     * @return true 符合 false 不符合
     * @throws VciBaseException 不符合时抛出异常
     */
    @Override
    public boolean checkAttribute(BtmTypeLinkAttributesDTO attributesDTO) throws VciBaseException {
        VciBaseUtil.alertNotNull(attributesDTO.getId(), "属性的英文名称", attributesDTO.getName(), "属性的中文名称",
            attributesDTO.getAttrDataType(), "属性的数据类型");
        boolean pass = checkAttributePass(attributesDTO.getId(), attributesDTO.getAttrDataType(), attributesDTO.getAttributeLength(), attributesDTO.getDefaultValue());
        if (!pass){
            throw new VciBaseException("属性不符合要求");
        }
        return pass;
    }
}