田源
2023-05-09 d2570148ec3884de3af721bd99c4b7acbbdee075
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/AttributeServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,230 @@
package com.vci.ubcs.omd.service.impl;
import com.alibaba.cloud.commons.lang.StringUtils;
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.constant.OmdRegExpConstant;
import com.vci.ubcs.starter.web.enumpck.VciFieldTypeEnum;
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 {
      String attributeDataTypeText = VciFieldTypeEnum.getTextByValue(attrDataType);
      if(StringUtils.isBlank(attributeDataTypeText)){
         throw new VciBaseException("英文名称为{0}的属性的类型不符合要求",new Object[]{id});
      }
      //必须要输入长度
      if( VciBaseUtil.inArray(new String[] {VciFieldTypeEnum.VTString.name()},attrDataType)
         && (attributeLength == null ||attributeLength < 1)){
         throw new VciBaseException("英文名称为{0}的属性的为{1}类型时,必须要输入长度的值",new Object[]{id,attributeDataTypeText});
      }
      //判断默认值
      if(StringUtils.isNotBlank(defaultValue)){
         if(VciFieldTypeEnum.VTDouble.name().equalsIgnoreCase(attrDataType)
            && !defaultValue.matches(OmdRegExpConstant.DOUBLE)){
            throw new VciBaseException("英文名称为{0}的属性的默认值不是双精度类型",new Object[]{id});
         }
         if(VciFieldTypeEnum.VTInteger.name().equalsIgnoreCase(defaultValue)
            && !defaultValue.matches(OmdRegExpConstant.INT)){
            throw new VciBaseException("英文名称为{0}的属性的默认值不是整数型",new Object[]{id});
         }
         if(VciFieldTypeEnum.VTLong.name().equalsIgnoreCase(defaultValue)
            && !defaultValue.matches(OmdRegExpConstant.LONG)){
            throw new VciBaseException("英文名称为{0}的属性的默认值不是长整形",new Object[]{id});
         }
      }
      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;
   }
}