美文网首页
excel导入

excel导入

作者: ml66 | 来源:发表于2023-09-06 15:32 被阅读0次

    导入
    导入模板格式的保单规则清单,每个文件最多可导入1000条数据,超过1000条数据,管控提示“最多可提交1000条数据,请分批导入”;
    如导入文件中的保单号与系统维护清单中现有的保单号重复,更新保单规则清单中的信息”
    如导入文件不符合模板规范,管控提示“请使用正确模板表格导入”;
    如导入文件中的任一字段空白,管控提示“导入失败,导入失败原因为:第X行数据YYY为空!”(X为导入文件中的行数,YYY为空白字段名称【弹窗提示语中的*需筛除,如:保单号】;);
    如导入文件中的保单号不是22字,管控提示“导入失败,导入失败原因为:第X行保单号应为22个字!”(X为导入文件中的行数);
    导入文件中的保单号只能由大写英文字母+数字组成,否则管控提示“导入失败,导入失败原因为:第X行保单号应为22位的数字和大写英文字母组合!”(X为导入文件中的行数);
    如导入文件中的起保日期格式不是年月日,管控提示“导入失败,导入失败原因为:第X行起保日期格式不是年月日(YYYY-MM-DD)!”(X为导入文件中的行数);
    如导入文件中的终保日期格式不是年月日,管控提示“导入失败,导入失败原因为:第X行终保日期格式不是年月日(YYYY-MM-DD)!”(X为导入文件中的行数);
    如导入文件中的起保日期>终保日期,管控提示“导入失败,导入失败原因为:第X行终保日期早于起保日期!”(X为导入文件中的行数);
    如导入文件中的单次赔付最大天数不是非负整数,管控提示“导入失败,导入失败原因为:第X行单次赔付最大天数不是非负整数!”(X为导入文件中的行数);
    如导入文件中的赔付最大天数不是非负整数,管控提示“导入失败,导入失败原因为:第X行赔付最大天数不是非负整数!”(X为导入文件中的行数);
    如导入文件中的单次赔付最大天数>最大赔付天数,管控提示“导入失败,导入失败原因为:第X行单次最大赔付天数超过最大赔付天数!”(X为导入文件中的行数)
    如导入文件中的赔付标准1(1860周岁)不是非负整数,管控提示“导入失败,导入失败原因为:第X行赔付标准1(1860周岁)不是非负整数!”(X为导入文件中的行数);
    如导入文件中的赔付标准2(小于18 或 大于60 周岁)不是非负整数,管控提示“导入失败,导入失败原因为:第X行赔付标准2(小于18 或 大于60 周岁)不是非负整数!”(X为导入文件中的行数);
    注:
    如导入文件中有多行数据不符合管控要求,则弹出一个管控窗口,管控提示语分别展示;
    如同一行数据多个字段不符合管控要求,则弹出一个管控窗口,管控提示语分别展示;
    如导入文件中的保单号已在系统维护,且原保单规则为有效状态,则覆盖原保单规则;
    如导入文件中的保单号已在系统维护,但原保单规则为无效状态,则原保单规则不变,新保单规则和新保单规则均保存;

        /**
         * 嘉兴保单规则维护导入
         * @param file
         * @return
         */
    
        @RequestMapping(value = "/importExcel", method = POST)
        public BaseResponse<Object> importExcel(MultipartFile file,HttpServletRequest request) {
            User user = (User) request.getSession().getAttribute(Constants.SESSION_USER);
            return newNotEawRuleService.importExcel(file,user);
        }
    
     /**
         * 导入嘉兴保单规则excel
         *
         * @param file
         * @return
         */
    
        @Override
        public BaseResponse<Object> importExcel(MultipartFile file, User user) {
            String id = null;
            try {
    
                String originalFilename = file.getOriginalFilename();
    
                //校验excel文件格式
                String suffix = originalFilename.substring(file.getOriginalFilename().lastIndexOf(".") + 1);
                if (!StringUtils.equals("xls", suffix)) {
                    return new BaseResponse<>(400, "请使用正确模板表格导入");
                }
                //获取模板标题
                List<String> title = generateTitle();
                //获取表
                HSSFWorkbook hssfWorkbook = new HSSFWorkbook(file.getInputStream());
                HSSFSheet sheet = hssfWorkbook.getSheetAt(0);
                //获取总行数
                int totalRowNum = sheet.getLastRowNum() + 1;
                //获取第一行数据
                HSSFRow row = sheet.getRow(0);
                //校验模板是否一致
                for (int i = 0; i < title.size(); i++) {
                    HSSFCell cell = row.getCell(i);
                    String titleName = title.get(i);
                    try {
                        String cellValue = cell.getStringCellValue();
                        if (!StringUtils.equals(titleName, cellValue)) {
                            return new BaseResponse<>(400, "请使用正确模板表格导入");
                        }
                    } catch (Exception e) {
                        return new BaseResponse<>(400, "请使用正确模板表格导入");
                    }
                }
    
                if (totalRowNum == 1) {
                    return new BaseResponse<>(400, "导入内容不应为空");
                }
    
                //校验条数
                if (totalRowNum > 1001) {
                    return new BaseResponse<>(400, "导入数量不能超过1000条,请修改后重新导入");
                }
                List<NcEawPolicyRule> ncEawPolicyRuleList = new ArrayList<>();
                return readExcel(ncEawPolicyRuleList, sheet, totalRowNum, user);
    
            } catch (Exception e) {
    
                e.printStackTrace();
                CiapLog.info("嘉兴保单规则导入异常:" + e.getMessage());
                return new BaseResponse<>(500, "嘉兴保单规则导入接口异常!");
            }
        }
    
    /**
         * 读取excel数据
         *
         * @param sheet       表
         * @param totalRowNum 总行数
         */
        private BaseResponse<Object> readExcel(List<NcEawPolicyRule> ncEawPolicyRuleList, HSSFSheet sheet, int totalRowNum, User user) throws Exception {
            //获取第一行数据
            HSSFRow row = sheet.getRow(0);
            List<String> msgList = new ArrayList<>();
            for (int i = 1; i < totalRowNum; i++) {
                int rowNum = i+1;
                HSSFRow hssfRow = sheet.getRow(i);
                NcEawPolicyRule ncEawPolicyRulelVo = new NcEawPolicyRule();
                for (int j = 0; j < row.getLastCellNum(); j++) {
                    //获取当前列的标题
                    HSSFCell cellTitle = row.getCell(j);
                    String title = cellTitle.getStringCellValue();
                    //获取当前行当前列的元素
                    HSSFCell cell = hssfRow.getCell(j);
                    if (cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK) {
                        switch (j) {
                            case 0:
                                //获取保单号
                                String policyNo = getValue(cell);
                                //校验保单号字符数
                                if (policyNo.length() != 22) {
                                    CiapLog.info("导入失败,导入失败原因为:第" + rowNum + "行保单号应为22个字!");
                                    // msgMap.put("message", "导入失败,导入失败原因为:第" + i + "行保单号应为22个字!<br>");
                                    msgList.add("第" + rowNum + "行保单号应为22个字!");
                                } else if (!policyNo.matches(BAO_DAN_HAO2)) {
                                    ////保单号校验 匹配数字和字母
                                    CiapLog.info("导入失败,导入失败原因为:第" + i + "行保单号应为22位的数字和大写英文字母组合!");
                                    msgList.add("第" + rowNum + "行保单号应为22位的数字和大写英文字母组合!");
                                } else if (policyNo.matches(VIN1)) {
                                    //正则匹配纯英文
                                    CiapLog.info("导入失败,导入失败原因为:第" + i + "行保单号应为22位的数字和大写英文字母组合!");
                                    msgList.add("第" + rowNum + "行保单号应为22位的数字和大写英文字母组合!");
                                } else {
                                    ncEawPolicyRulelVo.setPolicyNo(policyNo);
                                }
                                break;
                            case 1:
                                //获取起保日期
                                String policyStartDate = getValue(cell);
                                //校验起保日期是否合法
                                if (!policyStartDate.matches(regex)) {
                                    CiapLog.info("导入失败,导入失败原因为:第" + rowNum + "行数据,起保日期格式不是年月日(YYYY-MM-DD)!");
                                    msgList.add("第" + rowNum + "行数据,起保日期格式不是年月日(YYYY-MM-DD)!");
                                } else {
                                    ncEawPolicyRulelVo.setPolicyStartDate(policyStartDate);
                                }
                                break;
                            case 2:
                                //获取终保日期
                                String policyEndDate = getValue(cell);
                                //校验终保日期是否合法
                                if (!policyEndDate.matches(regex)) {
                                    CiapLog.info("导入失败,导入失败原因为:第" + rowNum + "行数据,终保日期格式不是年月日(YYYY-MM-DD)!");
                                    msgList.add("第" + rowNum + "行数据,终保日期格式不是年月日(YYYY-MM-DD)!");
                                } else {
                                    ncEawPolicyRulelVo.setPolicyEndDate(policyEndDate);
                                }
                                break;
                            case 3:
                                //获取最大赔付天数
                                String maxPayDate = getValue(cell);
                                if (!maxPayDate.matches(MNS)) {
                                    CiapLog.info("导入失败,导入失败原因为:第" + rowNum + "行数据,最大赔付天数格式不是数字!");
                                    msgList.add("第" + rowNum + "行数据,最大赔付天数格式不是非负整数!");
                                } else {
                                    ncEawPolicyRulelVo.setMaxPayDate(maxPayDate);
                                }
                                break;
                            case 4:
                                //获取单次赔付最大天数
                                String maxPayDateOnce = getValue(cell);
                                if (!maxPayDateOnce.matches(MNS)) {
                                    CiapLog.info("导入失败,导入失败原因为:第" + rowNum + "行数据,单次赔付最大天数格式不是数字!");
                                    msgList.add("第" + rowNum + "行数据,单次赔付最大天数格式不是非负整数!");
                                } else {
                                    ncEawPolicyRulelVo.setMaxPayDateOnce(maxPayDateOnce);
                                }
                                break;
                            case 5:
                                //获取赔付标准1(18-60周岁)
                                String payStandard1 = getValue(cell);
                                if (!payStandard1.matches(MNS)) {
                                    CiapLog.info("导入失败,导入失败原因为:第" + rowNum + "行数据,赔付标准1格式不是数字!");
                                    msgList.add("第" + rowNum + "行数据,赔付标准1格式不是非负整数!");
                                } else {
                                    ncEawPolicyRulelVo.setPayStandard1(payStandard1);
                                }
                                break;
                            case 6:
                                //赔付标准2(小于18或大于60周岁)
                                String payStandard2 = getValue(cell);
                                if (!payStandard2.matches(MNS)) {
                                    CiapLog.info("导入失败,导入失败原因为:第" + rowNum + "行数据,赔付标准2格式不是数字!");
                                    msgList.add("第" + rowNum + "行数据,赔付标准2格式不是非负整数!");
                                } else {
                                    ncEawPolicyRulelVo.setPayStandard2(payStandard2);
                                }
                                break;
                        }
                    } else {
                        CiapLog.info("导入失败,导入失败原因为:第" + rowNum + "行数据," + title + "为空!");
                        msgList.add("第" + rowNum + "行数据," + title + "为空!");
                    }
                }
                //起保日期
                String policyStartDate = ncEawPolicyRulelVo.getPolicyStartDate();
                //终保日期
                String policyEndDate = ncEawPolicyRulelVo.getPolicyEndDate();
                //校验终保日期是否小于起保日期
                if (StringUtils.isNotBlank(policyStartDate) && StringUtils.isNotBlank(policyEndDate)) {
                    SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
                    Date beginDate = sd.parse(policyStartDate);
                    Date endDate = sd.parse(policyEndDate);
                    if (endDate.before(beginDate)) {
                        CiapLog.info("导入失败,导入失败原因为:第" + rowNum + "行数据,终保日期早于起保日期!");
                        msgList.add("第" + rowNum + "行数据,终保日期早于起保日期!");
                    }
                }
                //校验单次赔付天数是否大于最大赔付天数
                //最大赔付天数
                String maxPayDate = ncEawPolicyRulelVo.getMaxPayDate();
                //单次赔付最大天数
                String maxPayDateOnce = ncEawPolicyRulelVo.getMaxPayDateOnce();
                if (StringUtils.isNotBlank(maxPayDate) && StringUtils.isNotBlank(maxPayDateOnce)) {
                    if (Integer.parseInt(maxPayDateOnce) > Integer.parseInt(maxPayDate)) {
                        CiapLog.info("导入失败,导入失败原因为:第" + rowNum + "行数据,单次赔付最大天数大于最大赔付天数!");
                        msgList.add("第" + rowNum + "行数据,单次赔付最大天数不能超过最大赔付天数!");
                    }
                }
                if (msgList.isEmpty()) {
                    //如果保单号重复更新数据
                    String policyNo = ncEawPolicyRulelVo.getPolicyNo();
                    if (StringUtils.isNotBlank(policyNo)) {
                        String userCode = null;
                        String userName = null;
                        if(user!=null){
                            userCode = user.getUserCode();
                            userName = user.getUserName();
                        }
                        //如果保单号已存在
                        NcEawPolicyRule getRule = ncEawPolicyRuleMapper.selectBypolicyNo(policyNo);
                        if (getRule != null) {
                            getRule.setUpdateUserCode(userCode);
                            getRule.setUpdateUserName(userName);
                            int flag = ncEawPolicyRuleMapper.updateBypolicyNo(getRule);
                            if (flag == 1) {
                                CiapLog.info("保单号:" + policyNo + "更新成功");
                            }
                        } else {
                            ncEawPolicyRulelVo.setInsertUserCode(userCode);
                            ncEawPolicyRulelVo.setInsertUserName(userName);
                            ncEawPolicyRuleList.add(ncEawPolicyRulelVo);
                        }
                    }
                }
            }
            if (msgList.isEmpty() ) {
                if(ncEawPolicyRuleList.size()>0){
                    ncEawPolicyRuleMapper.batchInsert(ncEawPolicyRuleList);
                }
                CiapLog.info("导入成功");
                return new BaseResponse(200, "导入成功");
            }
            Map result = new HashMap();
            result.put("message", msgList);
            return new BaseResponse(200, "导入数据格式有误", result);
        }
    
     /**
         * 获取表格数据
         *
         * @param cell 单元格
         * @return 返回数据
         */
        public static String getValue(Cell cell) {
            String result = null;
            switch (cell.getCellType()) {
                case 0:
                    if (HSSFDateUtil.isCellDateFormatted(cell)) {
                        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
                        result = dateFormat.format(cell.getDateCellValue());
                    } else {
                        NumberFormat nf = NumberFormat.getInstance();
                        nf.setGroupingUsed(false);
                        nf.setMaximumFractionDigits(100);
                        result = nf.format(cell.getNumericCellValue());
                    }
                    break;
                case 1:
                    result = cell.getStringCellValue();
                    break;
                case 2:
                    result = cell.getNumericCellValue() + "";
                    break;
                case 3:
                    result = "";
                    break;
                case 4:
                    result = String.valueOf(cell.getBooleanCellValue());
                    break;
                case 5:
                    result = String.valueOf(cell.getErrorCellValue());
                    break;
            }
            return result;
        }
    
     /**
         * 生成模板标题
         *
         * @return
         */
        private List<String> generateTitle() {
            List<String> list = new ArrayList<>();
            list.add("保单号*");
            list.add("起保日期*");
            list.add("终保日期*");
            list.add("最大赔付天数*");
            list.add("单次赔付最大天数*");
            list.add("赔付标准1(18-60周岁)*");
            list.add("赔付标准2(小于18或大于60周岁)*");
            return list;
        }
    

    相关文章

      网友评论

          本文标题:excel导入

          本文链接:https://www.haomeiwen.com/subject/uaikvdtx.html