主子表导入功能,设计了新增导入和更新导入,还有各种校验

该代码段展示了如何使用SpringBoot的Controller和Service处理Excel导入功能,包括文件上传、数据读取、异常捕获、事务管理以及数据验证和批量插入到数据库的操作。同时,涉及了日期格式验证和主子表的数据处理。
摘要由CSDN通过智能技术生成

主子导入功能Controller

    /**
     * 导入
     *
     * @param file
     * @param ifFlag
     * @return
     * @throws Exception
     */

    @RequestMapping("/importSheet")
    @ResponseBody
    public Object importSheet(@RequestPart("file") MultipartFile file, int ifFlag) {
        try {
            Map<String, JSONArray> stringJSONArrayMap = ImportExeclUtil.readFileManySheet(file);
            return this.buildSuccess(hrrgComEvaService.importSheet(stringJSONArrayMap, ifFlag));
        } catch (Exception e) {
            logger.error("Excel导入失败", e);
            return this.buildFaild(e.getMessage());
        }
        /*catch (RuntimeException e){
            return this.buildFaild(e.getMessage());
        }catch (Exception e){
            logger.error("Excel导入失败", e);
            return this.buildFaild("导入失败请检查导入文件");
        }*/

    }

service

@Transactional(rollbackFor = Exception.class)
    public Object importSheet(Map<String, JSONArray> hrrgComEvaModels, int ifFlag) throws Exception {

        String timeRegex1 = "(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|" +
                "((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|" +
                "((0[48]|[2468][048]|[3579][26])00))-02-29)$";
        List<HrrgComEva> hrrgComEvas = ImportExeclUtil.getBeanList(hrrgComEvaModels.get("胜任力测评记录"), HrrgComEva.class);
        List<HrrgEvaDimInfo> hrrgEvaDimInfos = ImportExeclUtil.getBeanList(hrrgComEvaModels.get("维度信息"), HrrgEvaDimInfo.class);
        AtomicInteger com = new AtomicInteger();
        AtomicInteger eva = new AtomicInteger();
        //主表userCode集合
        List<String> ids = new ArrayList<>();
        List<HrrgComEva> insertData = new ArrayList<>();
        List<String> userCode = hrrgComEvas.stream().map(HrrgComEva::getUserCode).collect(Collectors.toList());
        List<String> name = hrrgComEvas.stream().map(HrrgComEva::getName).collect(Collectors.toList());
        List<String> evaScheme = hrrgComEvas.stream().map(HrrgComEva::getEvaScheme).collect(Collectors.toList());
        //处理ts
        String currentDate = DateUtil.getCurrentDate();
        AtomicInteger modefyCount = new AtomicInteger();
        List<HrrgComEva> hrrgComEvaList = hrrgComEvas.stream().map(item -> {

            //非空校验
            if (StringUtils.isBlank(item.getUserCode())) {
                throw new RuntimeException("人员编码不能为空");
            }
            if (StringUtils.isBlank(item.getName())) {
                throw new RuntimeException("人员不能为空");
            }
            if (StringUtils.isBlank(item.getOrg())) {
                throw new RuntimeException("组织不能为空");
            }
//            HrrgComEva comEvaByName = hrrgComEvaMapper.getComEvaByName(item.getPkOrgCode());
//            if (StringUtils.isBlank(item.getPkOrgCode())){
//                throw  new RuntimeException("组织编码不能为空");
//            }
            if (StringUtils.isBlank(item.getDept())) {
                throw new RuntimeException("部门不能为空");
            }
            if (StringUtils.isBlank(item.getPost())) {
                throw new RuntimeException("岗位不能为空");
            }
            if (StringUtils.isBlank(item.getEvaScheme())) {
                throw new RuntimeException("测评方案不能为空");
            }

            List<HrrgComEva> ListData = hrrgComEvaMapper.queryEva(userCode, name, evaScheme);

            Optional<HrrgComEva> repeatRelOption =
                    ListData.stream().filter(relDb ->
                            relDb.getUserCode().equals(item.getUserCode())
                                    && relDb.getName().equals(item.getName())
                                    && relDb.getEvaScheme().equals(item.getEvaScheme())
                    ).findFirst();
            if (repeatRelOption.isPresent()) {
                HrrgComEva rel = repeatRelOption.get();
                item.setTs(rel.getTs());
                item.setId(rel.getId());
                modefyCount.getAndAdd(this.hrrgComEvaMapper.updateSelective(item));
                //com.set(com.get() + modefyCount.get());
                this.hrrgEvaDimInfoMapper.deleteHrrgEvaDimInfosBypkComEva(rel.getId());
            } else{
                insertData.add(item);
            }
            //校验日期不能为空,校验日期格式不正确
            String evaDate1 = item.getEvaDate();
            if (StringUtils.isBlank(evaDate1)) {
                throw new RuntimeException("测评日期不能为空");
            }
            boolean evaDate = Pattern.matches(timeRegex1,evaDate1);
            if (!evaDate) {
                throw new RuntimeException("日期以YYYY-MM-DD为准");
            }
            if (StringUtils.isBlank(item.getSumScore())) {
                throw new RuntimeException("总分不能为空");
            }
            String orgId = hrrgComEvaMapper.queryEvaCom(item.getPkOrgCode());
            if (orgId == null){
                throw new RuntimeException("组织编码不能为空或跟系统的组织编码不匹配");
            }
            item.setPkOrgCode(orgId);
            //收集用户id
            ids.add(item.getUserCode());
            item.setId(UUID.randomUUID().toString().replace("-", ""));
            item.setTenantId(InvocationInfoProxy.getTenantid());
            item.setTs(currentDate);
            item.setDataSources("外部导入");
            return item;
        }).collect(Collectors.toList());

        int row1 =0;
        row1 = row1 + modefyCount.get();
        if(!insertData.isEmpty() &&insertData!=null){
            //批量新增主表
            try{
                row1 = row1 + hrrgComEvaMapper.insertToHrrgComEvas(insertData);
            }catch (Exception e){
                logger.error("人岗匹配-胜任力测评记录接口主表", e);
                throw new RuntimeException("导入失败请检查导入文件");
            }
        }

        //查询主表id,userCode
        List<Map<String, String>> idUserCodes = hrrgComEvaMapper.getIdAndUserCodeByUserCodes(ids);
        //将结果匹配hrrgEvaDimInfos,对应赋值
        hrrgEvaDimInfos.stream().map(item -> idUserCodes.stream()
                .filter(m -> (item.getUserCode().equals(m.get("userCode"))
                    && item.getEvaScheme().equals(m.get("evaScheme"))
                    && item.getEvaDate().equals(m.get("evaDate"))))
                .findFirst().map(m -> {
                    //非空校验
                    if (StringUtils.isBlank(item.getUserCode())) {
                        throw new RuntimeException("人员编码不能为空");
                    }
                    if (StringUtils.isBlank(item.getName())) {
                        throw new RuntimeException("人员不能为空");
                    }
                    if (StringUtils.isBlank(item.getEvaScheme())) {
                        throw new RuntimeException("测评方案不能为空");
                    }
                    if (StringUtils.isBlank(item.getEvaDate())) {
                        throw new RuntimeException("测评日期不能为空");
                    }
                    if (StringUtils.isBlank(item.getDimResult())) {
                        throw new RuntimeException("维度结果不能为空");
                    }
                    //校验分数
                    if (!StringUtils.isNumeric(item.getDimResult())) {
                        throw new RuntimeException("测评维度结果校验未通过");
                    }
                    if (StringUtils.isBlank(item.getEvaDim())) {
                        throw new RuntimeException("测评维度不能为空");
                    }
                    HrrgPostComDim postComDimByName = hrrgPostComDimMapper.getPostComDimByName(item.getEvaDim());
                    if (postComDimByName == null) {
                        throw new RuntimeException("测评维度在维度库中尚未设置");
                    }
                    //维度库状态
                    int isStatus = postComDimByName.getIsStatus();
                    //维度库分制
                    double dimScore = Double.parseDouble(postComDimByName.getDimScore());
                    //校验维度库状态
                    if (isStatus != 1) {
                        throw new RuntimeException("测评维度存在未启用");
                    }
                    if (Double.parseDouble(item.getDimResult()) > dimScore) {
                        throw new RuntimeException("测评维度结果不能大于维度库设置");
                    }
                    if (StringUtils.isBlank(item.getState())) {
                        throw new RuntimeException("是否重点关注项不能为空");
                    }
                    item.setPkComEva(m.get("id"));
                    item.setId(UUID.randomUUID().toString().replace("-", ""));
                    item.setTenantId(InvocationInfoProxy.getTenantid());
                    item.setTs(currentDate);
                    return m;
                }).orElse(null)).filter(Objects::isNull).collect(Collectors.toList());

        //子表批量新增
        int row2=0;
        try{
            row2 = hrrgComEvaMapper.insertToHrrgEvaDimInfos(hrrgEvaDimInfos);
        }catch (Exception e){
            logger.error("人岗匹配-胜任力测评记录接口子表", e);
            throw new RuntimeException("导入失败请检查导入文件");
        }
        //主表失败条数
        com.set(hrrgComEvas.size() - row1);
        //子表失败条数
        eva.set(hrrgEvaDimInfos.size() - row2);
        String str = "成功插入”胜任力测评记录“表" + row1 + "条数据," + "失败" + com + "条数据;"
                + "成功插入“维度信息”表" + row2 + "条信息," + "失败" + eva + "条数据;失败原因:";
        return str;
    }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值