美文网首页
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