今天写的一个业务场景是批量导入,然后需要记录错误的数据,精确到某个单元格的记录,有重复数据或者单元格为空的就回滚,但是事务失效了。
我的业务逻辑:
》》插入所有数据
》》在插的过程中记录哪些单元格为空或者重复数据就存在一个集合内
》》 最后判断该集合是否为空,不为空就抛异常,正常抛异常事务就会回滚
正是因为需要返回这个错误集合,return 这个集合 就会把抛出的异常处理了,导致@Transactional回滚失效
由于我是同时导入两张表,里面的逻辑比较繁琐,后面4个单元格是另一张表,需查重
后来在捕获异常的地方加入以下代码,就可以事务就可以正常回滚了。
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
/**
* @author: JiaXinMa
* @description: 批量导入
* @date: 2021/4/21
*/
public List<ImportDto> saveOwnerRoom(MultipartFile file, Integer communityId) {
List<ImportDto> importDtoList = new ArrayList<>();//存空单元格的集合
try {
XSSFWorkbook workbook;
File files = new File(System.getProperty("user.dir"));//jar包父目录
String path = files.getAbsolutePath() + "/upload/Excel/";
List<List<String>> list = new ArrayList<>();//sheet页的所有行
//1.判断该社区是否有单位
List<CommunityUnitInfo> units = communityUnitServiceImpl.findAllUnits(communityId);
boolean isExcel = ExcelUtil.isExcel(file.getOriginalFilename());
String temporaryPath = path + file.getOriginalFilename();
if (isExcel) {//判断是否为Excel文件
File file1 = new File(path + "/" + file.getOriginalFilename());
if (!file1.exists()) {
file1.mkdirs();
}
file.transferTo(file1);//生成批量导入 Excel文件
workbook = new XSSFWorkbook(temporaryPath);
ExcelUtil excelUtil = new ExcelUtil(workbook);
list = excelUtil.read();
//业主姓名--业主电话--证件号码--房产证编号--面积--栋--单元--层--房--厕所
ComSCommunity community = null;//获取社区
Optional<ComSCommunity> comSCommunity = comSCommunityRepository.findById(communityId);
if (comSCommunity != null) {
community = comSCommunity.get();
}
if (CollectionUtils.isNotEmpty(list)) {
for (int i = 1; i < list.size(); i++) {//第一行为上面的字段,0不读取
List<String> cells = list.get(i);//excel的每一行
String unitXName = "";
CommunityRoom communityRoom = new CommunityRoom();//房源
BRoomOwner ownerRoom = new BRoomOwner();//业主
ownerRoom.setStatus(1);//默认设置业主的启用状态为启用:1
ownerRoom.setCommunityId(communityId);
communityRoom.setCommunityId(communityId);
communityRoom.setCommunityName(community.getCommunityName());
/*
//设置房源表单位对应的值
for (int z = 0; z < units.size(); z++) {
if (z == 0) {
unitXName += (cells.get(5) + ",");
communityRoom.setUnitA(cells.get(5));
} else if (z == 1) {
unitXName += (cells.get(6) + ",");
communityRoom.setUnitB(cells.get(6));
} else if (z == 2) {
unitXName += (cells.get(7) + ",");
communityRoom.setUnitC(cells.get(7));
} else if (z == 3) {
unitXName += (cells.get(8) + ",");
communityRoom.setUnitD(cells.get(8));
} else if (z == 4) {
unitXName += (cells.get(9) + ",");
communityRoom.setUnitE(cells.get(9));
} else if (z == 5) {
unitXName += (cells.get(10) + ",");
communityRoom.setUnitF(cells.get(10));
}
}
*/
//设置房源表单位对应的值
for (int z = 0; z < units.size(); z++) {
if (z == 0) {
unitXName += (cells.get(5) +units.get(z).getName()+ ",");
communityRoom.setUnitA(cells.get(5)+units.get(z).getName());
} else if (z == 1) {
unitXName += (cells.get(6) + units.get(z).getName()+",");
communityRoom.setUnitB(cells.get(6)+units.get(z).getName());
} else if (z == 2) {
unitXName += (cells.get(7) +units.get(z).getName()+ ",");
communityRoom.setUnitC(cells.get(7)+units.get(z).getName());
} else if (z == 3) {
unitXName += (cells.get(8) + units.get(z).getName()+",");
communityRoom.setUnitD(cells.get(8)+units.get(z).getName());
} else if (z == 4) {
unitXName += (cells.get(9) +units.get(z).getName()+ ",");
communityRoom.setUnitE(cells.get(9)+units.get(z).getName());
} else if (z == 5) {
unitXName += (cells.get(10) + units.get(z).getName()+",");
communityRoom.setUnitF(cells.get(10)+units.get(z).getName());
}
}
//去除unitXName最后一个","
unitXName = unitXName.substring(0, unitXName.length() - 1);
for (int j = 0; j < cells.size(); j++) {
String cell = cells.get(j);
ImportDto importDto = new ImportDto();//存空单元格
if (j == 3) {//房产证编号可以为空
ownerRoom.setRoomNumber(cell);
} else {
if (cell == null || cell.length() <= 0) {
importDto.setRow(i);
importDto.setColumn(j);
importDto.setMsg(list.get(0).get(j) + "不能为空!!!");
importDtoList.add(importDto);//存空单元格的集合
} else {
if (j == 0) {
ownerRoom.setOwnerName(cell);
} else if (j == 1) {
ownerRoom.setOwnerPhone(cell);
} else if (j == 2) {
ownerRoom.setCardTypeId(1);//默认设置为身份证:1
ownerRoom.setPapersNumber(cell);
/*校验身份证合法性
if (IdCardUtil.isValidatedAllIdcard(cell)) {//判断证件号是否正确
ownerRoom.setCardTypeId(1);//默认设置为身份证:1
ownerRoom.setPapersNumber(cell);
} else {
importDto.setRow(i);
importDto.setColumn(j);
importDto.setMsg(list.get(0).get(j) + "格式错误!!!");
importDtoList.add(importDto);//存空单元格的集合
}
*/
} else if (j == 4) {
communityRoom.setArea(Double.parseDouble(cell));
}
}
}
}
//验证房源是否存在
CommunityRoom room = communityRoomServiceImpl.findAllRoomName(unitXName, communityId);
if (room == null) {
//添加房源
communityRoomDao.save(communityRoom);
//获取刚添加的房源
room = communityRoomServiceImpl.findAllRoomName(unitXName, communityId);
ownerRoom.setRoomId(room.getRoomId());//设置房源id
//添加业主表
ownerRoomRepository.save(ownerRoom);
//获取刚添加的业主
BRoomOwner bRoomOwner = ownerRoomRepository.findByRoomId(room.getRoomId());
//更新刚添加的房源
room.setOwnerId(bRoomOwner.getId());//设置业主id
communityRoomDao.save(room);
} else {
ImportDto importDto = new ImportDto();
importDto.setRow(i);
importDto.setMsg("该房源已存在!!!");
importDtoList.add(importDto);//存空单元格的集合
}
//判断是否有存在空的或者重复数据
if (i == list.size() - 1 && CollectionUtils.isNotEmpty(importDtoList)) {
throw new MdException(500, "有重复数据或者单元格为空的就回滚");
}
}
}
}
} catch (IOException e) {
//transferTo 文件导入失败
throw new MdException(500, "文件导入失败");
} catch (Exception e) {
//list 文件读取失败
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
return importDtoList;
}
想看更多精彩内容,可以关注我的博客园
我的博客园