ECCILE导入到列表(对数据做校验)

public ResponseVO importFile(@RequestParam(value = "importFile", required = true) MultipartFile importFile,String invBtId,String btId,
                                 HttpServletRequest request) throws Exception {
        if(StringUtil.isEmpty(invBtId)){
            return errorResponse("没有批次号");//发票批次号不能为空
        }
        CommonsMultipartFile cf = (CommonsMultipartFile) importFile;
        DiskFileItem fi = (DiskFileItem) cf.getFileItem();
        String tempFilePath = fi.getStoreLocation().getPath();
        String realNamePreFix = fi.getName().substring(fi.getName().lastIndexOf("."), 
        fi.getName().length());
        File f = new File(tempFilePath.substring(0, tempFilePath.lastIndexOf(".")) + 
        realNamePreFix);
        importFile.transferTo(f);
        List<List> list;
        try {
            list = ExcelReadUtil.readExcel(f);
            //删除临时文件
            f.delete();
        } catch (IOException e) {
            f.delete();
            return errorResponse("数据文件缓存失败!");
        }
        SaveInvVO saveInvVO;
        List<SaveInvVO> invList = null;
        List<String> invNoList = new ArrayList<String>();//发票号码列表
        List<String> invCdList = new ArrayList<String>();//发票代码列表
        //模板中第一页为说明,第二页为数据
        if (list != null) {
            List<Map<String, String>> rowList = list.get(0);
            if (rowList.size() > 101) {//限制上传不超过100行
                return errorResponse("数据超过100行,请分批次上传!");
            }
            int i = 0;
            invList = new ArrayList<>();
            for (Map<String, String> rowData : rowList) {
                i++;
                // 前1行为空行,跳过
                if(i<=1){
                    continue;
                }
                // 第二行为表头,需要校验
                if (i == 2) {
                    //校验模板表头
                    if (!checkTemplateHead(rowData)) {
                        return errorResponse("您用的不是系统的模板,请重新下载系统模板!");
                    }
                    continue;
                }
                saveInvVO = new SaveInvVO();
                String index = MapUtils.getString(rowData, "0");//序号
                if (StringUtil.isEmpty(index)) {
                    continue;
                }
                
                String invTp = rowData.get("1") ;
                String invNo = rowData.get("2") ;
                String invCd = rowData.get("3") ;
                String ccy = rowData.get("4") ;
                String faceAmt = rowData.get("5") ;
                String pblAccvalAmt = rowData.get("6") ;
                String notTaxAmount = rowData.get("7") ;
                
                if(index == null || "".equals(index.toString())){
                    return errorResponse("您上传的数据中存在序号为空的数据,请正确录入序号 
                    !");
                }
                if(invTp == null || "".equals(invTp.toString())){
                    return errorResponse("您上传的数据中,序号为"+index+"的发票类型存在空数 
                    据!");
                }
                if(invNo == null || "".equals(invNo.toString())  ){
                    return errorResponse("您上传的数据中,序号为"+index+"的发票号码存在空数 
                    据!");
                }
                if(invCd == null || "".equals(invCd.toString())){
                    return errorResponse("您上传的数据中,序号为"+index+"的发票代码存在空数 
                    据!");
                }
                if(ccy == null || "".equals(ccy.toString())){
                    return errorResponse("您上传的数据中,序号为"+index+"的币种存在空数 
                    据!");
                }
                if(faceAmt == null || "".equals(faceAmt.toString())){
                    return errorResponse("您上传的数据中,序号为"+index+"的票面金额存在空数 
                    据!");
                }
                if(pblAccvalAmt == null || "".equals(pblAccvalAmt.toString())){
                    return errorResponse("您上传的数据中,序号为"+index+"的发票编号存在空数 
                    据!");
                }
                if(notTaxAmount == null || "".equals(notTaxAmount.toString())){
                    return errorResponse("您上传的数据中,序号为"+index+"的发票编号存在空数 
                    据!");
                }
                
                QueryInvVO queryVo = new QueryInvVO();
                queryVo.setInvNo(invNo);
                queryVo.setStCd("0");
                InvResultVO result = invMgtApi.getInv(queryVo);
                if(result != null){
                    return errorResponse("您上传的数据中,序号为"+index+",发票号码 
                    为"+invNo+"的数据已经存在,请确认!");
                }else{
                    /*发票代码 不做校验 
                    queryVo = new QueryInvVO();
                    queryVo.setInvCd(invCd);
                    result = invMgtApi.getInv(queryVo);
                    if(result != null){
                        return errorResponse("您上传的数据中,序号为"+index+",发票代码 
                        为"+invCd+"的数据已经存在,请确认!");
                    }*/
                }
                
                if(invTp==null||"".equals(invTp.toString())){
                    saveInvVO.setInvTp(null);
                }else if("增值税专用发票".equals(invTp.toString())){
                    saveInvVO.setInvTp("0");
                }else if("增值税普通发票".equals(invTp.toString())){
                    saveInvVO.setInvTp("1");
                }
                saveInvVO.setInvId(invMgtApi.buildInvId()) ; 
                saveInvVO.setInvNo(invNo);// 发票号码  by jinp 20180627 
                saveInvVO.setInvCd(invCd);// 发票代码
                saveInvVO.setCcy(ccy);// 币种
                saveInvVO.setFaceAmt( faceAmt!=null?new 
                BigDecimal(faceAmt):BigDecimal.ZERO);// 票面金额
                saveInvVO.setPblAccvalAmt(pblAccvalAmt!=null?new 
                BigDecimal(pblAccvalAmt):BigDecimal.ZERO);// 应收账款金额
                saveInvVO.setNotTaxAmount(notTaxAmount!=null?new 
                BigDecimal(notTaxAmount):BigDecimal.ZERO);// 不含税金额 by jinp 20180625 
                saveInvVO.setIssubillDt( rowData.get("8"));// 开票日期
                //校验数据
                Map resultMap = this.checkImportData(saveInvVO);
                if (!(boolean) resultMap.get("flag")) {
                    return errorResponse(String.valueOf(resultMap.get("msg")));
                }
                // jinp update 20180424  设置发票批次号信息  start 
                saveInvVO.setInvBtId(invBtId);
                saveInvVO.setBtId(btId);
                // jinp update 20180424  设置发票批次号信息  end 
                invList.add(saveInvVO);
                invNoList.add(invNo.trim());
                invCdList.add(saveInvVO.getInvCd().trim());
            }
        } else {
            return errorResponse("您用的不是系统的模板,请重新下载系统模板!");
        }
        if (invList.isEmpty()) {
            return errorResponse("没有有效的数据行,请注意填写序号!");
        }
        //校验发票编号是否重复
        Map invIdCheckResult = this.checkRepeat(invNoList,"发票编号");
        if (!(boolean) invIdCheckResult.get("flag")) {
            return errorResponse(String.valueOf(invIdCheckResult.get("msg")));
        }
        //校验发票代码是否重复
        /*Map invCdCheckResult = this.checkRepeat(invCdList,"发票代码");
        if (!(boolean) invCdCheckResult.get("flag")) {
            return errorResponse(String.valueOf(invCdCheckResult.get("msg")));
        }*/
        // 数据校验成功,保存发票数据
        invMgtApi.saveBatchInv(invList);
        return successResponse(invList, "导入发票信息成功!");
    }

    // 校验导入模板的表头
    private boolean checkTemplateHead(Map<String, String> param) {
        String cell = param.get("1");
        if (cell == null || !"发票类型".equals(cell.trim())) {
            return false;
        }
        cell = param.get("2");
        if (cell == null || !"发票号码".equals(cell.trim())) {
            return false;
        }
        cell = param.get("3");
        if (cell == null || !"发票代码".equals(cell.trim())) {
            return false;
        }
        cell = param.get("4");
        if (cell == null || !"币种".equals(cell.trim())) {
            return false;
        }
        cell = param.get("5");
        if (cell == null || !"票面金额".equals(cell.trim())) {
            return false;
        }
        cell = param.get("6");
        if (cell == null || !"应付账款金额".equals(cell.trim())) {
            return false;
        }
        cell = param.get("7");
        if (cell == null || !"不含税金额".equals(cell.trim())) {
            return false;
        }
        cell = param.get("8");
        return !(cell == null || !"开票日期".equals(cell.trim()));
    }

    // 校验导入数据是否重复
    private Map<Object, Object> checkRepeat(List<String> list,String field) {
        Map<Object, Object> checkResultMap = new HashMap<Object, Object>();
        boolean flag = true;
        String msg = "";
        checkResultMap.put("flag", flag);
        checkResultMap.put("msg", msg);
        //超过1行后校验
        if (list != null && list.size() > 1) {
            flag = (list.size() > new HashSet<>(list).size());
            if (flag) {
                msg = "数据校验错误:%s重复,请检查!";
                checkResultMap.put("flag", false);
                checkResultMap.put("msg", String.format(msg,field));
                return checkResultMap;
            }
        }
        return checkResultMap;
    }

    // 校验导入数据是否正确
    private Map<Object, Object> checkImportData(SaveInvVO saveInvVO) {
        Map<Object, Object> checkResultMap = new HashMap<Object, Object>();
        boolean flag = true;
        String msg = "";
        checkResultMap.put("flag", flag);
        checkResultMap.put("msg", msg);


        if (StringUtil.isEmpty(saveInvVO.getInvTp())) {
            checkResultMap.put("flag", false);
            checkResultMap.put("msg", "数据校验错误:发票类型不能为空,请检查!");
            return checkResultMap;
        }
        if (StringUtil.isEmpty(saveInvVO.getInvNo())) {
            checkResultMap.put("flag", false);
            checkResultMap.put("msg", "数据校验错误:发票号码不能为空,请检查!");
            return checkResultMap;
        }
        if (StringUtil.isEmpty(saveInvVO.getInvCd())) {
            checkResultMap.put("flag", false);
            checkResultMap.put("msg", "数据校验错误:发票代码不能为空,请检查!");
            return checkResultMap;
        }
        if (saveInvVO.getFaceAmt() == null || 
        saveInvVO.getFaceAmt().compareTo(BigDecimal.ZERO) == 0) {
            checkResultMap.put("flag", false);
            checkResultMap.put("msg", "数据校验错误:票面金额不能为空,请检查!");
            return checkResultMap;
        }
        if (saveInvVO.getPblAccvalAmt() == null || 
        saveInvVO.getPblAccvalAmt().compareTo(BigDecimal.ZERO) == 0) {
            checkResultMap.put("flag", false);
            checkResultMap.put("msg", "数据校验错误:应收账款金额不能为空,请检查!");
            return checkResultMap;
        }
        
        // 数据校验 不含税金额  by jinp 20180625 
        if (saveInvVO.getNotTaxAmount() == null ||                 
        saveInvVO.getNotTaxAmount().compareTo(BigDecimal.ZERO) == 0) {
            checkResultMap.put("flag", false);
            checkResultMap.put("msg", "数据校验错误:不含税金额不能为空,请检查!");
            return checkResultMap;
        }
        
        if(StringUtil.isEmpty(saveInvVO.getIssubillDt())){
            checkResultMap.put("flag", false);
            checkResultMap.put("msg", String.format("数据校验错误:开票日期不能为空,请检 
            查!"));
            return checkResultMap;
        }

        // 校验重复的发票编号重复  前面已经校验过,重复校验 去掉
        /*QueryInvVO queryInvVO = new QueryInvVO();
        queryInvVO.setInvNo(saveInvVO.getInvNo());
        queryInvVO.setStCd("0");
        if(invMgtApi.checkRepeatInv(queryInvVO)){
            checkResultMap.put("flag", false);
            checkResultMap.put("msg", String.format("数据校验错误:发票号码%s已存在,请重新录        
            入!",saveInvVO.getInvId()));
            return checkResultMap;
        }*/
        // 校验重复的发票代码重复   去掉发票代码重复性校验 by jinp 20180629
        /*queryInvVO = new QueryInvVO();
        queryInvVO.setInvCd(saveInvVO.getInvCd());
        if(invMgtApi.checkRepeatInv(queryInvVO)){
            checkResultMap.put("flag", false);
            checkResultMap.put("msg", String.format("数据校验错误:发票代码%s已存在,请重新录入!",saveInvVO.getInvCd()));
            return checkResultMap;
        }*/
        return checkResultMap;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值