ludc
2023-05-30 695e4a085727ef5017597dd1ab72a47d0e9883e6
Source/UBCS/ubcs-service/ubcs-webservice/src/main/java/com/vci/ubcs/code/webservice/service/impl/DockingPreAttrMappingServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,235 @@
package com.vci.ubcs.code.webservice.service.impl;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.vci.ubcs.code.webservice.mapper.DockingPreAttrMappingMapper;
import com.vci.ubcs.code.webservice.service.IDockingPreAttrMappingService;
import com.vci.ubcs.code.webservice.service.IDockingPreAttrRangeService;
import com.vci.ubcs.code.webservice.service.IDockingPreMetaAttrService;
import com.vci.ubcs.code.webservice.vo.DokingAttributeSerchVO;
import com.vci.ubcs.code.webservice.wrapper.DockingPreAttrMappingWrapper;
import com.vci.ubcs.code.webservice.wrapper.DockingPreAttrRangeWrapper;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.util.DefaultAttrAssimtUtil;
import com.vci.ubcs.starter.util.MdmBtmTypeConstant;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import com.vci.ubcs.code.webservice.entity.DockingPreAttrMapping;
import com.vci.ubcs.code.webservice.entity.DockingPreAttrRange;
import com.vci.ubcs.code.webservice.entity.DockingPreMetaAttr;
import com.vci.ubcs.code.webservice.vo.DockingPreAttrMappingVO;
import com.vci.ubcs.code.webservice.vo.DockingPreAttrRangeVO;
import org.springblade.core.tool.api.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/***
 *集团属性映射服务
 * @author xiejun
 * @date 2023-05-22
 */
@Service
public class DockingPreAttrMappingServiceImpl extends ServiceImpl<DockingPreAttrMappingMapper, DockingPreAttrMapping> implements IDockingPreAttrMappingService {
   /***
    * é›†å›¢åˆ†ç±»å±žæ€§å±žæ€§æ˜ å°„配置服务
    */
   @Autowired(required = false)
   private DockingPreAttrMappingMapper dockingPreAttrMappingMapper;
   /***
    * ä¸šåŠ¡æ•°æ®å±žæ€§æœåŠ¡
    */
   //@Autowired(required = false)
   //private  MdmEngineService mdmEngineService;
   /***
    * é›†å›¢å±žæ€§æœåŠ¡
    */
   @Autowired(required = false)
   private IDockingPreMetaAttrService dockingPreMetaAttrService;
   /***
    * å±žæ€§å–值范围服务
    */
   @Autowired(required = false)
   private IDockingPreAttrRangeService dockingPreAttrRangeService;
   /***
    * æ ¹æ®ä¸»æ•°æ®åˆ†ç±»ä¸»é”®èŽ·å–åˆ†ç±»ä¿¡æ¯é…ç½®
    * @param codeClassifyId
    * @return
    */
   @Override
   public List<DockingPreAttrMappingVO> getDockingAttrMappingsByCodeClassifyId(String codeClassifyId,String sourceClassifyId) {
      VciBaseUtil.alertNotNull(codeClassifyId,"主数据分类主键");
      VciBaseUtil.alertNotNull(sourceClassifyId,"集团分类主键");
      //首先获取分类模板属性,然后与属性配置坐比较,以防被有增删属性的可能
      List<DockingPreMetaAttr> dockingPreMetaAttrList=   dockingPreMetaAttrService.selectByWrapper(Wrappers.<DockingPreMetaAttr>query().lambda().eq(DockingPreMetaAttr::getSourceClassifyId,sourceClassifyId));
      List<DockingPreAttrMapping> dockingPreAttrMappings=this.selectByWrapper(Wrappers.<DockingPreAttrMapping>query().lambda().eq(DockingPreAttrMapping::getSourceClassifyId, sourceClassifyId).eq(DockingPreAttrMapping::getTargetClassifyId, codeClassifyId));
      Map<String/**属性主键**/, DockingPreAttrMapping> dockingPreAttrMappingMap = dockingPreAttrMappings.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getMetaListId(), t -> t));
      List<DockingPreAttrMapping> newDockingPreAttrMappingList=new ArrayList<>();
      dockingPreMetaAttrList.stream().forEach(dockingPreMetaAttr -> {
         String attrOid=dockingPreMetaAttr.getOid();
         DockingPreAttrMapping dockingPreAttrMapping=new DockingPreAttrMapping();
         if(dockingPreAttrMappingMap.containsKey(attrOid)){
            dockingPreAttrMapping=   dockingPreAttrMappingMap.get(attrOid);
         }else{
            DefaultAttrAssimtUtil.addDefaultAttrAssimt(dockingPreAttrMapping, MdmBtmTypeConstant.DOCKING_PRE_JAPPLYFORM);
            dockingPreAttrMapping.setMetaListId(dockingPreMetaAttr.getOid());//属性主键
            dockingPreAttrMapping.setSourceAttrKey(dockingPreMetaAttr.getEnglishName());//英文名称
            dockingPreAttrMapping.setSourceAttrName(dockingPreMetaAttr.getChineseName());//中文名称
            dockingPreAttrMapping.setSourceClassifyId(dockingPreMetaAttr.getSourceClassifyId());//集团分类oid
            dockingPreAttrMapping.setSourceClassifyName("");//分类名称
            dockingPreAttrMapping.setViewModeId(dockingPreMetaAttr.getViewModelId());//模型视图id
            dockingPreAttrMapping.setViewModelName("");//分类模型名称
            dockingPreAttrMapping.setViewName("");//分类模型名称
         }
         newDockingPreAttrMappingList.add(dockingPreAttrMapping);
      });
      return    dockingPreAttrMappingDO2VOS(dockingPreAttrMappings,false);
   }
   /***
    * æž„造器查询方式
    * @param wrapper æŸ¥è¯¢å°è£…器
    * @return
    */
   @Override
   public List<DockingPreAttrMapping> selectByWrapper(Wrapper wrapper) {
      return dockingPreAttrMappingMapper.selectList(wrapper);
   }
   /****
    * é›†å›¢å±žæ€§æ˜ å°„配置保存
    * @param dockingPreAttrMappingVOList
    * @return
    * @throws VciBaseException
    */
   @Override
   @Transactional(rollbackFor = Exception.class)
   public List<DockingPreAttrMappingVO> batchAddSave(List<DockingPreAttrMappingVO> dockingPreAttrMappingVOList) throws Exception {
      if(org.springframework.util.CollectionUtils.isEmpty(dockingPreAttrMappingVOList)){
         return new ArrayList<>();
      }
      /**
       * 1.传递过来的有可能主数据模板新增属性,这样的需要添加,也有可能删除的属性,这样的映射需要删除
       * ä¹Ÿæœ‰æ›´æ–°çš„这样则更新
       */
      List<DockingPreAttrMapping> newDockingPreAttrMapping=new ArrayList<>();
      List<String>appingConfigOidList=new ArrayList<>();
      List<String>attrIdList=new ArrayList<>();
      List<String> attributeOidList=new ArrayList<>();
      List<DockingPreAttrRange> newDockingPreAttrRangeList=new ArrayList<>();
      List<DockingPreAttrRangeVO> newDockingPreAttrRangeVOList=new ArrayList<>();
      dockingPreAttrMappingVOList.stream().forEach(dockingPreAttrMappingVO -> {
         List<DockingPreAttrRangeVO>dockingPreAttrRangeVOList=dockingPreAttrMappingVO.getDockingPreAttrRangeVoList();
         appingConfigOidList.add(dockingPreAttrMappingVO.getOid());
         if(!CollectionUtils.isEmpty(dockingPreAttrRangeVOList)) {
            attrIdList.add(dockingPreAttrMappingVO.getMetaListId());
            newDockingPreAttrRangeVOList.addAll(dockingPreAttrRangeVOList);
         }
      });
      //将属性取值范围转成数据持久层对象
      newDockingPreAttrRangeList= DockingPreAttrRangeWrapper.build().voentitys(newDockingPreAttrRangeVOList);
      //将属性映射配置信息转换为需要数据持久层保存的对象
      newDockingPreAttrMapping= DockingPreAttrMappingWrapper.build().voentitys(dockingPreAttrMappingVOList);
      List<DockingPreAttrRange> oldDockingPreAttrRangeList=new ArrayList<>();
      if(!org.springframework.util.CollectionUtils.isEmpty(attrIdList)) {
         //获取存在的属性取值范围.
         oldDockingPreAttrRangeList = dockingPreAttrRangeService.selectByWrapper(Wrappers.<DockingPreAttrRange>query().lambda().in(DockingPreAttrRange::getMetaListId,attrIdList));
      }
      //获取存在的属性映射.
      List<DockingPreAttrMapping> oldDataAttrMapping = dockingPreAttrMappingMapper.selectList(Wrappers.<DockingPreAttrMapping>query().lambda().in(DockingPreAttrMapping::getOid,appingConfigOidList));
      Map<String/**oid**/,DockingPreAttrMapping/**属性对象**/> allSaveAttrMappingMap = newDockingPreAttrMapping.stream().collect(Collectors.toMap(s -> s.getOid(), t -> t,(o1, o2)->o2));
      Map<String/**oid**/,DockingPreAttrMapping/**对象**/> oldAttrMappingMap =oldDataAttrMapping.stream().collect(Collectors.toMap(s -> s.getOid(), t -> t,(o1, o2)->o2));
      //需要删除的属性映射
      List<String> deleteIdList=new ArrayList<>();
      oldDataAttrMapping.stream().forEach(cbo -> {
         String oid =cbo.getOid();
         if(!allSaveAttrMappingMap.containsKey(oid)){
            deleteIdList.add(oid);
         }
      });
      this.removeBatchByIds(deleteIdList);//删除已经丢掉的
      this.saveOrUpdateBatch(newDockingPreAttrMapping);//添加更新新的配置信息
      //取值范围处理
      if(!CollectionUtils.isEmpty(newDockingPreAttrRangeList)) {
         Map<String/**oid**/, DockingPreAttrRange/**属性对象**/> allSaveAttrAttrRangeDOMap =newDockingPreAttrRangeList.stream().collect(Collectors.toMap(s -> s.getOid(), t -> t, (o1, o2) -> o2));
         Map<String/**oid**/, DockingPreAttrRange/**对象**/> oldSaveAttrAttrRangeDOMap = oldDockingPreAttrRangeList.stream().collect(Collectors.toMap(s -> s.getOid(), t -> t, (o1, o2) -> o2));
         //需要删除的属性取值范围
         List<String> deleteRangeIdList = new ArrayList<>();
         oldDockingPreAttrRangeList.stream().forEach(cbo -> {
            String oid = cbo.getOid();
            if (!allSaveAttrAttrRangeDOMap.containsKey(oid)) {
               deleteRangeIdList.add(oid);
            }
         });
         dockingPreAttrRangeService.removeBatchByIds(deleteIdList);//删除已经丢掉的
         dockingPreAttrRangeService.saveOrUpdateBatch(newDockingPreAttrRangeList);//添加更新新的配置信息
      }
      return dockingPreAttrMappingVOList;
   }
   /***
    * æ ¹æ®ä¸»æ•°æ®oid检测是否属性映射配置
    * @param targetClassifyId
    * @return
    * @throws Exception
    */
   @Override
   public boolean checkHasConfigByTragetCodeclassifyId(String targetClassifyId){
      Long count =0L;
      try {
         count = dockingPreAttrMappingMapper.selectCount(Wrappers.<DockingPreAttrMapping>query().lambda().eq(DockingPreAttrMapping::getTargetClassifyId, targetClassifyId));
      }catch (Throwable e){
         e.printStackTrace();;
      } finally {
         return  count>0?true:false;
      }
   }
   @Override
   public R search(DokingAttributeSerchVO dokingAttributeSerchVO) {
      return null;
   }
   /***
    * å¯¹è±¡è½¬æ¢
    * @param dockingPreAttrMappings
    * @return
    */
   private List<DockingPreAttrMappingVO> dockingPreAttrMappingDO2VOS(Collection<DockingPreAttrMapping> dockingPreAttrMappings,boolean contain) {
      List<DockingPreAttrMappingVO> dockingPreAttrMappingVOList=new ArrayList<>();
         dockingPreAttrMappingVOList=DockingPreAttrMappingWrapper.build().entityVOs(dockingPreAttrMappings);
         if(CollectionUtils.isEmpty(dockingPreAttrMappingVOList)){
            dockingPreAttrMappingVOList.stream().distinct().forEach(dockingPreAttrMappingVO -> {
               if(contain) {
                  List<DockingPreAttrRangeVO>  dockingPreAttrRangeVOList=   dockingPreAttrRangeService.getDockingPreAttrRangesByMetaId(dockingPreAttrMappingVO.getMetaListId());
                  dockingPreAttrMappingVO.setDockingPreAttrRangeVoList(dockingPreAttrRangeVOList);
               }
            });
         }
         return dockingPreAttrMappingVOList;
      }
}