package com.vci.ubcs.code.applyjtcodeservice.service.impl; import com.alibaba.fastjson.JSON; 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.applyjtcodeservice.vo.GroupAttrPoolMappingVO; 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 lombok.extern.slf4j.Slf4j; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.BeanUtil; import org.springblade.core.tool.utils.Func; 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.*; import java.util.stream.Collectors; /*** *集团属性映射服务 * @author xiejun * @date 2023-05-22 */ @Service @Slf4j 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 */ @Override public 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; } /** * 集团属性池映射数据同步导集团属性映射界面 * @param groupAttrPoolMappings * @return */ @Override public R syncGroupAttrMapping(List groupAttrPoolMappings) { log.info("开始集团属性池同步到集团属性映射配置表"); List groupAttrKeys = groupAttrPoolMappings.stream().map(GroupAttrPoolMapping::getGroupAttrKey).collect(Collectors.toList()); List dockingPreAttrMappings = dockingPreAttrMappingMapper.selectList( Wrappers.query() .lambda().in(DockingPreAttrMapping::getSourceAttrKey,groupAttrKeys) ); // 属性映射配置表中不存在要同步的集团属性 if(Func.isEmpty(dockingPreAttrMappings)){ return R.fail(String.format("要同步的%s属性,在集团属性映射表中不存在!", JSON.toJSONString(groupAttrKeys))); } log.info(String.format("这些%s集团属性正在往集团属性映射表中同步。",JSON.toJSONString(groupAttrPoolMappings))); Map syncTargetMap = new HashMap<>(); // 准备要修改的比对参数 groupAttrPoolMappings.stream().forEach(item->{ syncTargetMap.put((item.getGroupAttrKey()+item.getGroupAttrName()).toLowerCase(Locale.ROOT),item); }); List newGroupAttrPoolMappings = new ArrayList<>(); //查找到更改就改变查询出来的数据进行修改。 dockingPreAttrMappings.stream().forEach(item->{ GroupAttrPoolMapping groupAttrPoolMapping = syncTargetMap.get((item.getSourceAttrKey()+item.getSourceAttrName()).toLowerCase(Locale.ROOT)); if(Func.isNotEmpty(groupAttrPoolMapping)){ DockingPreAttrMapping dockingPreAttrMapping = BeanUtil.copy(item, DockingPreAttrMapping.class); dockingPreAttrMapping.setTargetAttrKey(groupAttrPoolMapping.getCodeMetaAttrKey()); dockingPreAttrMapping.setTargetAttrName(groupAttrPoolMapping.getCodeMetaAttrName()); newGroupAttrPoolMappings.add(dockingPreAttrMapping); } }); boolean resBoolean = this.saveOrUpdateBatch(newGroupAttrPoolMappings); log.info("集团属性池同步到集团属性映射配置表完成!"); return resBoolean ? R.success("集团属性池同步到集团属性映射配置表成功!"):R.fail("同步过程中,修改集团属性映射表时失败!"); } }