Browse Source

单Sheet 失败回滚

master
han\hanst 6 days ago
parent
commit
ece0de15ad
  1. 31
      src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelExcelTXServiceImpl.java

31
src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelExcelTXServiceImpl.java

@ -29,7 +29,9 @@ import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.support.TransactionTemplate;
import org.springframework.web.multipart.MultipartFile;
import jakarta.servlet.http.HttpServletRequest;
@ -49,6 +51,8 @@ public class CoDelExcelTXServiceImpl implements CoDelExcelTXService {
private CoDelMapper coDelMapper;
@Autowired
SqlSession sqlSession;
@Autowired
private PlatformTransactionManager transactionManager;
@Override
public Map<String, Object> previewExcelTX(MultipartFile file, EcssCoDelNotifyHeaderData inData) {
@ -184,7 +188,6 @@ public class CoDelExcelTXServiceImpl implements CoDelExcelTXService {
}
@Override
@Transactional(rollbackFor = Exception.class)
public Map<String, List<String>> saveEcssCoDelNotifyByExcelTX(MultipartFile file, EcssCoDelNotifyHeaderData data, String deletedInvoices, HttpServletRequest request) throws Exception {
List<String> deletedInvoiceList = new ArrayList<>();
if (deletedInvoices != null && !deletedInvoices.trim().isEmpty()) {
@ -199,15 +202,17 @@ public class CoDelExcelTXServiceImpl implements CoDelExcelTXService {
List<String> successList = new ArrayList<>();
List<String> failList = new ArrayList<>();
TransactionTemplate sheetTxTemplate = new TransactionTemplate(transactionManager);
sheetTxTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
Workbook workbook = WorkbookFactory.create(file.getInputStream());
try (Workbook workbook = WorkbookFactory.create(file.getInputStream())) {
for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
Sheet sheet = workbook.getSheetAt(i);
if (sheet.getPhysicalNumberOfRows() < 2) {
continue;
}
try {
String cmcInvoice = getInvoiceFromSheet(sheet);
try {
if (cmcInvoice != null) {
if (deletedInvoiceList.contains(cmcInvoice)) {
continue;
@ -218,13 +223,27 @@ public class CoDelExcelTXServiceImpl implements CoDelExcelTXService {
continue;
}
}
// 每个Sheet独立事务失败只回滚当前Sheet
sheetTxTemplate.executeWithoutResult(status -> {
try {
processSheet(sheet, data, request);
} catch (Exception e) {
status.setRollbackOnly();
throw new RuntimeException(e);
}
});
successList.add(cmcInvoice);
} catch (Exception e) {
failList.add("Sheet [" + sheet.getSheetName() + "] 错误:" + e.getMessage());
Throwable cause = e;
while (cause.getCause() != null) {
cause = cause.getCause();
}
String errMsg = cause.getMessage() != null ? cause.getMessage() : e.getMessage();
failList.add("Sheet [" + sheet.getSheetName() + "] 错误:" + errMsg);
log.error("Sheet导入失败已回滚: sheetName={}, cmcInvoice={}, err={}", sheet.getSheetName(), cmcInvoice, errMsg, e);
}
}
}
workbook.close();
Map<String, List<String>> result = new HashMap<>();
result.put("success", successList);

Loading…
Cancel
Save