public String saveExcel(MultipartFile file, Integer actShowId,Long userId) { /** * 第一步是读取名单 */ List<Invite> items = EasyPoiUtil.importExcel(file, 1, 1, Invite.class); RsvpActShow actShow = actShowService.findByPrimaryKey(actShowId); List<Invite> errorItems = new ArrayList<>();// 错误数据集合 Date date = new Date(); /** * 第二步,校验名单数据,是否有错误.各种维度校验 * 是否邮箱格式 * 公司已邀约检验(重复检验) * 是否数字 * 是否总数超标 */ Pattern pattern = Pattern.compile("[0-9]*"); Iterator<Invite> itr = items.iterator(); Integer applyNumMax = actShow.getManagerTicketNum();//管理员最大门票数量 Integer inviteApplyNum = 0;//门票数量初始值 List<Invite> alreadyInviteList = inviteRepositor.findAllByActShowId(actShowId);//已经上传的报名 if (alreadyInviteList.size()>0){ for (Invite i : alreadyInviteList) { inviteApplyNum+=Integer.parseInt(i.getTicketNum()); } } while(itr.hasNext()) { //邮箱校验 Invite invite = itr.next(); if (!invite.getEmail().matches("[\\w\\.\\-]+@([\\w\\-]+\\.)+[\\w\\-]+")) { invite.setErrorMsg("邮箱错误"); errorItems.add(invite); itr.remove(); } //票数校验是否为数字 Matcher isNum = pattern.matcher(invite.getTicketNum()); if( !isNum.matches() ){ if (!errorItems.contains(invite)){ invite.setErrorMsg("总票数错误"); errorItems.add(invite); itr.remove(); } } //分配门票总票数校验 if (items.contains(invite)){ inviteApplyNum+=Integer.parseInt(invite.getTicketNum()); } // 公司已报名校验 Invite topByCompanyName = inviteRepositor.findTopByCompanyName(invite.getCompanyName()); if (topByCompanyName!=null){ invite.setErrorMsg("公司已存在"); errorItems.add(invite); itr.remove(); } } if (inviteApplyNum > applyNumMax){ logger.info("分配门票数量超过上限applyNumMax:{} and inviteApplyNum:{}",applyNumMax,inviteApplyNum); return "分配门票数量超过上限"; } /** * 3\保存正确数据的内容到数据库 */ for (Invite invite :items) { invite.setCreatedBy(userId);//操作人 invite.setActShowId(actShowId);//活动id invite.setActContaId(actShow.getActContaId());//界别 invite.setOverNum(Integer.parseInt(invite.getTicketNum()));//保存时将剩余票数设置和总票数一致 invite.setCreateTime(date); } List<Invite> invites = inviteRepositor.saveAll(items);//保存正确数据 /** * 4\返回错误格式的数据集合 * 以Excel格式返回. * 以EXCEL文件路径返回 * 如果没有错误,返回空字符串 */ if (errorItems.size()>0){ //将错误数据集合以Excel形式返回 logger.info("错误数据集合==========={}",errorItems); //导出Excel } return ""; }