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;
}
ECCILE导入到列表(对数据做校验)
于 2019-02-21 10:07:59 首次发布