excel中一棵完整的树、只有子级没有父级的树的导入逻辑

node的导入

excel中一棵完整的树、只有子级没有父级的树的导入逻辑

private void checkDataAndInsert(Long tenantId, List<LimsUnitDTO> units, List<LimsExperimentItemTypeImportDTO> importVOList){
        //事业部
        List<String> unitNameList = units.stream().map(LimsUnitDTO::getUnitName).collect(Collectors.toList());
        Map<String, List<LimsUnitDTO>> unitNameMap = units.stream().collect(Collectors.groupingBy(LimsUnitDTO::getUnitName));
        List<Long> unitIds = units.stream().map(LimsUnitDTO::getUnitId).collect(Collectors.toList());
        Map<String, Long> unitNameIdMap = units.stream().collect(Collectors.toMap(LimsUnitDTO::getUnitName, LimsUnitDTO::getUnitId, (key1, key2) -> key2));

        //层级、分类类型
        List<LovValueDTO> lovValueLevelList = lovAdapter.queryLovValue("FYDS.LIMS.ITEM_TYPE_LEVEL", tenantId);//分类层级
        List<LovValueDTO> lovValueSortList = lovAdapter.queryLovValue("FYDS.LIMS.ITEM_TYPE_SORT", tenantId);//分类类型
        Map<String, String> levelMap = lovValueLevelList.stream().collect(Collectors.toMap(LovValueDTO::getValue, d -> d.getMeaning()));
        Map<String, String> sortMap = lovValueSortList.stream().collect(Collectors.toMap(LovValueDTO::getValue, d -> d.getMeaning()));

        List<LimsExperimentItemType> limsExperimentItemTypeList = new ArrayList<>(importVOList.size());
        Set<String> limsExperimentItemTypeSet = new HashSet<>(importVOList.size());
        Set<String> errorUnitNameSet = new HashSet<>(importVOList.size());
        Set<String> userNames = new HashSet<>(importVOList.size());
        for (LimsExperimentItemTypeImportDTO data : importVOList) {
            //入参必输性校验
            processValidateMessage(tenantId, StringUtils.isBlank(data.getUnitName()), "LIMS_EXPERIMENT_ITEM_TYPE_IMPORT_0001", "事业部");
            processValidateMessage(tenantId, StringUtils.isBlank(data.getItemTypeName()), "LIMS_EXPERIMENT_ITEM_TYPE_IMPORT_0001", "分类名称");
            processValidateMessage(tenantId, StringUtils.isBlank(data.getItemTypeSort()), "LIMS_EXPERIMENT_ITEM_TYPE_IMPORT_0001", "分类类型");
            processValidateMessage(tenantId, StringUtils.isBlank(data.getItemTypeLevel()), "LIMS_EXPERIMENT_ITEM_TYPE_IMPORT_0001", "分类层级");
            processValidateMessage(tenantId, StringUtils.isBlank(data.getCreatedByName()), "LIMS_EXPERIMENT_ITEM_TYPE_IMPORT_0001", "创建人");
            processValidateMessage(tenantId, StringUtils.isBlank(data.getLastUpdatedByName()), "LIMS_EXPERIMENT_ITEM_TYPE_IMPORT_0001", "更新人");
            userNames.add(data.getCreatedByName());
            userNames.add(data.getLastUpdatedByName());

            //分类层级校验
            if (MapUtils.isNotEmpty(levelMap) && !levelMap.containsKey(data.getItemTypeLevel())){
                processValidateMessage(tenantId, "LIMS_EXPERIMENT_ITEM_TYPE_IMPORT_0003", data.getItemTypeName());
            }

            //分类类型校验
            if (MapUtils.isNotEmpty(sortMap) && !sortMap.containsKey(data.getItemTypeSort())){
                processValidateMessage(tenantId, "LIMS_EXPERIMENT_ITEM_TYPE_IMPORT_0004", data.getItemTypeName());
            }

            //事业部校验
            if (CollectionUtils.isNotEmpty(unitNameList) && !unitNameList.contains(data.getUnitName())){
                errorUnitNameSet.add(data.getUnitName());
            }

            //校验上层分类名称是否存在
            if (!StringUtils.equals("ROOT",data.getItemTypeLevel()) && Objects.isNull(data.getItemTypeUpName()) && Objects.isNull(data.getItemTypeUpLevel())){
                processValidateMessage(tenantId, "LIMS_EXPERIMENT_ITEM_TYPE_IMPORT_0005", data.getItemTypeName());
            }

            //入参中唯一性校验:“分类层级+分类名称+事业部”唯一,不存重复值
            if (limsExperimentItemTypeSet.add(data.getItemTypeName() + "_" + data.getItemTypeLevel()+ "_" + data.getUnitName())){
                //唯一性校验通过
            }else {
                processValidateMessage(tenantId, "LIMS_EXPERIMENT_ITEM_TYPE_IMPORT_0006", data.getItemTypeName());
            }
        }

        //校验创建人/更新人存在性
        Map<String, List<MtUserInfo>> userMap = new HashMap<>(userNames.size());
        if (CollectionUtils.isNotEmpty(userNames)){
            List<MtUserInfo> mtUserInfos = limsStandardItemMapper.selectUserInfoByRealNameBatch(new ArrayList<>(userNames));
            if (CollectionUtils.isNotEmpty(mtUserInfos)){
                userMap = mtUserInfos.stream().collect(Collectors.groupingBy(MtUserInfo::getRealName));
            }
        }

        //校验事业部是否都是用户所属的事业部
        if (CollectionUtils.isNotEmpty(errorUnitNameSet)){
            processValidateMessage(tenantId, "FYDS_LIMS_STANDARD_ITEM_0001", errorUnitNameSet.toString());
        }

        //校验创建/更新人是否存在,是否找到多个
        for (LimsExperimentItemTypeImportDTO data : importVOList) {
            data.setTenantId(tenantId);
            if (MapUtils.isNotEmpty(unitNameIdMap) && unitNameIdMap.containsKey(data.getUnitName())) {
                data.setUnitId(unitNameIdMap.get(data.getUnitName()));
            }

            processValidateMessage(tenantId, !userMap.containsKey(data.getCreatedByName()), "FYDS_LIMS_STANDARD_ITEM_0022", data.getCreatedByName());
            processValidateMessage(tenantId, userMap.get(data.getCreatedByName()).size() > 1, "FYDS_LIMS_STANDARD_ITEM_0022", data.getCreatedByName());
            processValidateMessage(tenantId, !userMap.containsKey(data.getLastUpdatedByName()), "FYDS_LIMS_STANDARD_ITEM_0023", data.getLastUpdatedByName());
            processValidateMessage(tenantId, userMap.get(data.getLastUpdatedByName()).size() > 1, "FYDS_LIMS_STANDARD_ITEM_0023", data.getLastUpdatedByName());
        }

        //获取新增事件
        MtEventCreateVO eventCreateVO2 = new MtEventCreateVO();
        eventCreateVO2.setEventTypeCode("FYDS_LIMS_ITEM_TYPE_IMPORT");
        Long eventId = eventRepository.eventCreate(tenantId, eventCreateVO2);

        //数据构造及插入
        List<LimsExperimentItemTypeT> addFristTempTList = new ArrayList<>(importVOList.size());
        List<LimsExperimentItemTypeT> updateFristTempTList = new ArrayList<>(importVOList.size());
        List<LimsExperimentItemType> addFristList = new ArrayList<>(importVOList.size());
        List<LimsExperimentItemType> updateFristList = new ArrayList<>(importVOList.size());
        List<LimsExperimentItemTypeHis> addFristHisList = new ArrayList<>(importVOList.size());
        List<LimsExperimentItemTypeHis> updateFristHisList = new ArrayList<>(importVOList.size());

        //保存分类名称+ID的映射
        List<Long> nextPrimaryKeys = customDbRepository.getNextPrimaryKeys(LimsExperimentItemType.class, importVOList.size());
        Map<String, Long> itemTypeNameIdMap = new HashMap<>(importVOList.size());
        List<String> validList = new ArrayList<>();
        int num = 0;
        for (LimsExperimentItemTypeImportDTO data : importVOList) {
            itemTypeNameIdMap.put(data.getItemTypeName()+"-"+data.getItemTypeLevel()+"-"+data.getUnitName(), nextPrimaryKeys.get(num));
            validList.add(data.getItemTypeName()+"-"+data.getItemTypeLevel()+"-"+data.getUnitName());
            num++;
        }

        //表中是否存在子级的根目录
        List<LimsExperimentItemTypeDto> existUpItemTypeIdList = limsExperimentItemTypeMapper.selectUpItemTypeByContion(tenantId, unitIds, importVOList);
        //事业部名称
        List<Long> unitIdList = existUpItemTypeIdList.stream().map(LimsExperimentItemType::getUnitId).distinct().collect(Collectors.toList());
        UnitQueryDTO unitQueryDTO = new UnitQueryDTO();
        unitQueryDTO.setUnitIds(unitIdList);
        List<LimsUnitDTO> unitList = hzeroPlatformFeignClient.listCompanyUnitBatch(tenantId, unitQueryDTO).getBody();
        Map<Long, String> unitMap = unitList.stream().collect(Collectors.toMap(LimsUnitDTO::getUnitId, LimsUnitDTO::getUnitName, (key1, key2) -> key2));
        existUpItemTypeIdList.stream().forEach(item -> {
            if (MapUtils.isNotEmpty(unitMap) && unitMap.containsKey(item.getUnitId())) {
                item.setUnitName(unitMap.get(item.getUnitId()));
            }
        });
        //对于excel中没有根目录的子级,在表中查看是否存在
        Map<String, Long> existUpIdList = existUpItemTypeIdList.stream().distinct().collect(Collectors.toMap(t -> t.getItemTypeName() + "-" + t.getItemTypeLevel() + "-" +
                t.getUnitName(), s -> s.getItemTypeId()));

        //校验子级是否存在根目录:validList(excel中是否包含)、existIdList(表中是否包含)
        for (LimsExperimentItemTypeImportDTO importDto : importVOList) {
            //如果不是顶层分类
            if (StringUtils.isNotBlank(importDto.getItemTypeUpName())){
                //excel存在父级
                String valid = importDto.getItemTypeUpName()+"-"+importDto.getItemTypeUpLevel()+"-"+importDto.getUnitName();
                if (!validList.contains(valid) && !existUpIdList.containsKey(valid)){
                    processValidateMessage(tenantId, "LIMS_EXPERIMENT_ITEM_TYPE_IMPORT_0005", importDto.getItemTypeUpName());
                }
            }
        }


        //表中是否存在子级的根目录
        List<LimsExperimentItemTypeDto> existItemTypeIdList = limsExperimentItemTypeMapper.selectExperimentItemTypeByContion(tenantId, unitIds, importVOList);
        //表中唯一性校验(根目录):“分类层级+分类名称+事业部”唯一
        if (CollectionUtils.isNotEmpty(existItemTypeIdList)){
            processValidateMessage(tenantId, "LIMS_EXPERIMENT_ITEM_TYPE_IMPORT_0006", existItemTypeIdList.get(0).getItemTypeName());
        }

        //事业部名称
        List<Long> unitIdLists = existItemTypeIdList.stream().map(LimsExperimentItemType::getUnitId).distinct().collect(Collectors.toList());
        UnitQueryDTO unitQueryDTO1 = new UnitQueryDTO();
        unitQueryDTO1.setUnitIds(unitIdLists);
        List<LimsUnitDTO> unitList1 = hzeroPlatformFeignClient.listCompanyUnitBatch(tenantId, unitQueryDTO1).getBody();
        Map<Long, String> unitMap1 = unitList1.stream().collect(Collectors.toMap(LimsUnitDTO::getUnitId, LimsUnitDTO::getUnitName, (key1, key2) -> key2));
        existItemTypeIdList.stream().forEach(item -> {
            if (MapUtils.isNotEmpty(unitMap1) && unitMap1.containsKey(item.getUnitId())) {
                item.setUnitName(unitMap1.get(item.getUnitId()));
            }
        });
        /因为先做“表中唯一性校验(根目录):“分类层级+分类名称+事业部”唯一”,所以existIdList 判断更新永远走不到这一步。
        Map<String, Long> existIdList = existItemTypeIdList.stream().distinct().collect(Collectors.toMap(t -> t.getItemTypeName() + "-" + t.getItemTypeLevel() + "-" +
                t.getUnitName(), s -> s.getItemTypeId()));

        //插入、更新数据
        for (LimsExperimentItemTypeImportDTO importDto : importVOList) {
            LimsExperimentItemType root = new LimsExperimentItemType();
            if (existIdList.containsKey(importDto.getItemTypeName() + "-" + importDto.getItemTypeLevel() + "-" + importDto.getUnitName())){
                Long existId = existIdList.get(importDto.getItemTypeName() + "-" + importDto.getItemTypeLevel() + "-" + importDto.getUnitName());
                BeanUtils.copyProperties(importDto, root);
                root.setItemTypeId(existId);
                root.setTenantId(tenantId);
                root.setUnitId(unitNameMap.get(importDto.getUnitName()).get(0).getUnitId());
                root.setItemTypeStatus(StringUtils.isNotBlank(importDto.getApprovalStatus()) ? importDto.getApprovalStatus() : LimsContants.EnableFlag.N);
                root.setApprovalStatus(LimsContants.ExperimentItemTypeStatus.APPROVED);
                root.setCreatedBy(userMap.get(importDto.getCreatedByName()).get(0).getId());
                root.setLastUpdatedBy(userMap.get(importDto.getLastUpdatedByName()).get(0).getId());
                //如果不是顶层分类
                if (StringUtils.isNotBlank(importDto.getItemTypeUpName())){
                    //excel存在父级
                    if (itemTypeNameIdMap.containsKey(importDto.getItemTypeUpName()+"-"+importDto.getItemTypeUpLevel()+"-"+importDto.getUnitName())){
                        root.setItemTypeCodeUp(itemTypeNameIdMap.get(importDto.getItemTypeUpName()+"-"+importDto.getItemTypeUpLevel()+"-"+importDto.getUnitName()));
                    }else if(existUpIdList.containsKey(importDto.getItemTypeUpName()+"-"+importDto.getItemTypeUpLevel()+"-"+importDto.getUnitName())){
                        //excel不存在父级、表里存在父级
                        root.setItemTypeCodeUp(existUpIdList.get(importDto.getItemTypeUpName() + "-" + importDto.getItemTypeUpLevel() + "-" + importDto.getUnitName()));
                    }
                }
                updateFristList.add(root);

                //临时表
                LimsExperimentItemTypeT updatetTemp = new LimsExperimentItemTypeT();
                BeanUtils.copyProperties(root, updatetTemp);
                updatetTemp.setSubmitFlag(LimsContants.EnableFlag.Y);
                updatetTemp.setOperationType(LimsContants.ExperimentItemTypeStatus.ADD);
                updateFristTempTList.add(updatetTemp);

                LimsExperimentItemTypeHis rootHis = new LimsExperimentItemTypeHis();
                BeanUtils.copyProperties(root, rootHis);
                rootHis.setEventId(eventId);
                updateFristHisList.add(rootHis);

            }else{
                //主表
                BeanUtils.copyProperties(importDto, root);
                root.setTenantId(tenantId);
                root.setItemTypeId(itemTypeNameIdMap.get(importDto.getItemTypeName()+"-"+importDto.getItemTypeLevel()+"-"+importDto.getUnitName()));
                root.setUnitId(unitNameMap.get(importDto.getUnitName()).get(0).getUnitId());
                root.setItemTypeStatus(StringUtils.isNotBlank(importDto.getApprovalStatus()) ? importDto.getApprovalStatus() : LimsContants.EnableFlag.N);
                root.setApprovalStatus(LimsContants.ExperimentItemTypeStatus.APPROVED);
                root.setCreatedBy(userMap.get(importDto.getCreatedByName()).get(0).getId());
                root.setLastUpdatedBy(userMap.get(importDto.getLastUpdatedByName()).get(0).getId());
                //如果不是顶层分类
                if (StringUtils.isNotBlank(importDto.getItemTypeUpName())){
                    //excel存在父级
                    if (itemTypeNameIdMap.containsKey(importDto.getItemTypeUpName()+"-"+importDto.getItemTypeUpLevel()+"-"+importDto.getUnitName())){
                        root.setItemTypeCodeUp(itemTypeNameIdMap.get(importDto.getItemTypeUpName()+"-"+importDto.getItemTypeUpLevel()+"-"+importDto.getUnitName()));
                    }else if(existUpIdList.containsKey(importDto.getItemTypeUpName()+"-"+importDto.getItemTypeUpLevel()+"-"+importDto.getUnitName())){
                        //excel不存在父级、表里存在父级
                        root.setItemTypeCodeUp(existUpIdList.get(importDto.getItemTypeUpName() + "-" + importDto.getItemTypeUpLevel() + "-" + importDto.getUnitName()));
                    }
                }

                addFristList.add(root);

                //临时表
                LimsExperimentItemTypeT addfristTemp = new LimsExperimentItemTypeT();
                BeanUtils.copyProperties(root, addfristTemp);
                addfristTemp.setSubmitFlag(LimsContants.EnableFlag.Y);
                addfristTemp.setOperationType(LimsContants.ExperimentItemTypeStatus.ADD);
                addFristTempTList.add(addfristTemp);

                LimsExperimentItemTypeHis rootHis = new LimsExperimentItemTypeHis();
                BeanUtils.copyProperties(root, rootHis);
                rootHis.setEventId(eventId);
                addFristHisList.add(rootHis);
            }
        }

        if (CollectionUtils.isNotEmpty(addFristList)){
            limsCustomDbRepository.batchInsertWithPrimaryKey(addFristList);
            limsCustomDbRepository.batchInsertWithPrimaryKey(addFristTempTList);
            limsCustomDbRepository.batchInsert(addFristHisList);
        }
        if (CollectionUtils.isNotEmpty(updateFristList)){
            limsCustomDbRepository.batchUpdateSelective(updateFristList);
            limsCustomDbRepository.batchUpdateSelective(updateFristTempTList);
            limsCustomDbRepository.batchInsert(updateFristHisList);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值