package com.vci.ubcs.code.applyjtcodeservice.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.entity.CodeClassify; import com.vci.ubcs.code.feign.ICodeClassifyClient; import com.vci.ubcs.code.applyjtcodeservice.entity.*; import com.vci.ubcs.code.applyjtcodeservice.mapper.DockingPreAttrMappingMapper; import com.vci.ubcs.code.applyjtcodeservice.service.*; import com.vci.ubcs.code.applyjtcodeservice.vo.DokingAttributeSerchVO; import com.vci.ubcs.code.applyjtcodeservice.wrapper.DockingPreAttrMappingWrapper; import com.vci.ubcs.code.applyjtcodeservice.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.applyjtcodeservice.vo.DockingPreAttrMappingVO; import com.vci.ubcs.code.applyjtcodeservice.vo.DockingPreAttrRangeVO; import org.springblade.core.tool.api.R; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; 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 implements IDockingPreAttrMappingService { /*** * 集团分类属性属性映射配置服务 */ @Autowired(required = false) private DockingPreAttrMappingMapper dockingPreAttrMappingMapper; /*** * 主数据分类服务 */ @Autowired(required = true) private ICodeClassifyClient codeClassifyClient; /*** * 业务数据属性服务 */ //@Autowired(required = false) //private MdmEngineService mdmEngineService; /*** * 集团属性服务 */ @Autowired(required = false) private IDockingPreMetaAttrService dockingPreMetaAttrService; /*** * 属性取值范围服务 */ @Autowired(required = false) private IDockingPreAttrRangeService dockingPreAttrRangeService; /*** * 集团分类视图模型服务 */ @Autowired(required = false) private IDockingPreViewModelService dockingPreViewModelService; /*** * 集团属性服务 */ @Autowired(required = false) @Lazy private IDockingPreClassifyService dockingPreClassifyService; /*** * 根据主数据分类主键获取分类信息配置 * @param codeClassifyId * @return */ @Override public List getDockingAttrMappingsByCodeClassifyId(String codeClassifyId,String sourceClassifyId) { VciBaseUtil.alertNotNull(codeClassifyId,"主数据分类主键"); VciBaseUtil.alertNotNull(sourceClassifyId,"集团分类主键"); //首先获取分类模板属性,然后与属性配置坐比较,以防被有增删属性的可能 DockingPreClassify dockingPreClassify=dockingPreClassifyService.getById(sourceClassifyId); List dockingPreMetaAttrList= dockingPreMetaAttrService.selectByWrapper(Wrappers.query().lambda().eq(DockingPreMetaAttr::getSourceClassifyId,sourceClassifyId)); List dockingPreAttrMappings=this.selectByWrapper(Wrappers.query().lambda().eq(DockingPreAttrMapping::getSourceClassifyId, sourceClassifyId).eq(DockingPreAttrMapping::getTargetClassifyId, codeClassifyId)); Map dockingPreAttrMappingMap = dockingPreAttrMappings.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getMetaListId(), t -> t)); List dockingPreViewModelList= dockingPreViewModelService.list(Wrappers.query().lambda().eq(DockingPreViewModel::getSourceClassifyId,sourceClassifyId)); Map dockingPreViewModelMap=dockingPreViewModelList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t)); CodeClassify codeClassify= codeClassifyClient.getById(codeClassifyId); List newDockingPreAttrMappingList=new ArrayList<>(); dockingPreMetaAttrList.stream().forEach(dockingPreMetaAttr -> { String attrOid=dockingPreMetaAttr.getOid(); DockingPreAttrMapping dockingPreAttrMapping=new DockingPreAttrMapping(); if(dockingPreAttrMappingMap.containsKey(attrOid)){ dockingPreAttrMapping= dockingPreAttrMappingMap.get(attrOid); DefaultAttrAssimtUtil.updateDefaultAttrAssimt(dockingPreAttrMapping); }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 DockingPreViewModel dockingPreViewModel=new DockingPreViewModel(); if(dockingPreViewModelMap.containsKey(dockingPreMetaAttr.getViewModelId())){ dockingPreViewModel=dockingPreViewModelMap.get(dockingPreMetaAttr.getViewModelId()); } dockingPreAttrMapping.setSourceClassifyName(dockingPreClassify.getClassName());//分类名称 dockingPreAttrMapping.setViewModeId(dockingPreMetaAttr.getViewModelId());//模型视图id dockingPreAttrMapping.setViewModelName(dockingPreViewModel.getName());//分类模型名称 dockingPreAttrMapping.setViewName(dockingPreViewModel.getViewName());//分类模型名称 dockingPreAttrMapping.setTargetClassifyId(codeClassifyId); dockingPreAttrMapping.setTargetClassifyName(codeClassify.getName()); } newDockingPreAttrMappingList.add(dockingPreAttrMapping); }); return dockingPreAttrMappingDO2VOS(newDockingPreAttrMappingList,false); } /*** * 构造器查询方式 * @param wrapper 查询封装器 * @return */ @Override public List selectByWrapper(Wrapper wrapper) { return dockingPreAttrMappingMapper.selectList(wrapper); } /**** * 集团属性映射配置保存 * @param dockingPreAttrMappingVOList * @return * @throws VciBaseException */ @Override @Transactional(rollbackFor = Exception.class) public List batchAddSave(List dockingPreAttrMappingVOList) throws Exception { if(org.springframework.util.CollectionUtils.isEmpty(dockingPreAttrMappingVOList)){ return new ArrayList<>(); } /** * 1.传递过来的有可能主数据模板新增属性,这样的需要添加,也有可能删除的属性,这样的映射需要删除 * 也有更新的这样则更新 */ List newDockingPreAttrMapping=new ArrayList<>(); ListappingConfigOidList=new ArrayList<>(); ListattrIdList=new ArrayList<>(); List attributeOidList=new ArrayList<>(); List newDockingPreAttrRangeList=new ArrayList<>(); List newDockingPreAttrRangeVOList=new ArrayList<>(); dockingPreAttrMappingVOList.stream().forEach(dockingPreAttrMappingVO -> { ListdockingPreAttrRangeVOList=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 oldDockingPreAttrRangeList=new ArrayList<>(); if(!org.springframework.util.CollectionUtils.isEmpty(attrIdList)) { //获取存在的属性取值范围. oldDockingPreAttrRangeList = dockingPreAttrRangeService.selectByWrapper(Wrappers.query().lambda().in(DockingPreAttrRange::getMetaListId,attrIdList)); } //获取存在的属性映射. List oldDataAttrMapping = dockingPreAttrMappingMapper.selectList(Wrappers.query().lambda().in(DockingPreAttrMapping::getOid,appingConfigOidList)); Map allSaveAttrMappingMap = newDockingPreAttrMapping.stream().collect(Collectors.toMap(s -> s.getOid(), t -> t,(o1, o2)->o2)); Map oldAttrMappingMap =oldDataAttrMapping.stream().collect(Collectors.toMap(s -> s.getOid(), t -> t,(o1, o2)->o2)); //需要删除的属性映射 List 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 allSaveAttrAttrRangeDOMap =newDockingPreAttrRangeList.stream().collect(Collectors.toMap(s -> s.getOid(), t -> t, (o1, o2) -> o2)); Map oldSaveAttrAttrRangeDOMap = oldDockingPreAttrRangeList.stream().collect(Collectors.toMap(s -> s.getOid(), t -> t, (o1, o2) -> o2)); //需要删除的属性取值范围 List 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 * @param sourceClassifyId * @return * @throws Exception */ @Override public boolean checkHasConfigByTragetCodeclassifyId(String targetClassifyId,String sourceClassifyId){ Long count =0L; try { count = dockingPreAttrMappingMapper.selectCount(Wrappers.query().lambda().eq(DockingPreAttrMapping::getTargetClassifyId, targetClassifyId).eq(DockingPreAttrMapping::getSourceClassifyId,sourceClassifyId)); }catch (Throwable e){ e.printStackTrace();; } finally { return count>0?true:false; } } @Override public R search(DokingAttributeSerchVO dokingAttributeSerchVO) { return null; } /*** * 对象转换 * @param dockingPreAttrMappings * @return */ private List dockingPreAttrMappingDO2VOS(Collection dockingPreAttrMappings,boolean contain) { List dockingPreAttrMappingVOList=new ArrayList<>(); dockingPreAttrMappingVOList=DockingPreAttrMappingWrapper.build().entityVOs(dockingPreAttrMappings); if(CollectionUtils.isEmpty(dockingPreAttrMappingVOList)){ dockingPreAttrMappingVOList.stream().distinct().forEach(dockingPreAttrMappingVO -> { if(contain) { List dockingPreAttrRangeVOList= dockingPreAttrRangeService.getDockingPreAttrRangesByMetaId(dockingPreAttrMappingVO.getMetaListId()); dockingPreAttrMappingVO.setDockingPreAttrRangeVoList(dockingPreAttrRangeVOList); } }); } return dockingPreAttrMappingVOList; } }