🐛 违章记录导入失败明细返回全量原表
问题:importViolationRecord 收集 errorList 后 setRollbackOnly 并 return, 控制器据此导出「仅错误行」——失败明细不是原表全量,用户看不到哪几行是对的、 也不便对照原表修正(用户反馈:违章记录没有返回全量表格)。 改动: - 服务层:改为抛 ImportFailureException(data),明细携带**原表全部行**; 整批回滚由异常触发(替代 setRollbackOnly,语义不变)。 - 控制器:catch 异常后取 getFailureList() 导出,并补上传文件校验。 用 export(...) 而非 exportFailureReasonOnly(...):后者会把 markErrorColumns 置 false、只标红失败原因列,导致「按列标红」能力丢失(实测 5 个既有用例 标红列变空);export(...) 同时保留全量行与按列标红。 验证:mvn install -DskipTests 通过;违章记录回归 40/40 (既有 9 用例,标红列断言全绿:03 类型 / 04 事项 / 05 事项 / 06 类型 / 08 车牌号/船号); 用户实际上传文件实测:失败明细返回全量 5 行、仅错误行带原因、标红[车船类型,状态]、 库中零写入。其余 8 个导入模块回归 187 项全绿,无连带影响。
This commit is contained in:
+12
-3
@@ -127,9 +127,18 @@ public class ViolationRecordController extends BladeController {
|
||||
@ApiOperationSupport(order = 5)
|
||||
@Operation(summary = "导入违章记录", description = "传入excel")
|
||||
public R importViolationRecord(MultipartFile file, HttpServletResponse response) {
|
||||
List<ViolationRecordImportExcel> failureList = violationRecordService.importViolationRecord(ExcelUtil.read(file, ViolationRecordImportExcel.class));
|
||||
if (Func.isNotEmpty(failureList)) {
|
||||
org.springblade.common.excel.ImportFailureExcelUtil.export(response, "违章记录导入失败明细" + DateUtil.time(), "导入失败明细", failureList, ViolationRecordImportExcel.class);
|
||||
if (file == null || file.isEmpty()) {
|
||||
return R.fail("上传文件不能为空");
|
||||
}
|
||||
String fileName = Func.toStrWithEmpty(file.getOriginalFilename(), "").toLowerCase();
|
||||
if (!fileName.endsWith(".xls") && !fileName.endsWith(".xlsx")) {
|
||||
return R.fail("请上传 .xls,.xlsx 标准格式文件");
|
||||
}
|
||||
try {
|
||||
violationRecordService.importViolationRecord(ExcelUtil.read(file, ViolationRecordImportExcel.class));
|
||||
} catch (org.springblade.common.excel.ImportFailureException exception) {
|
||||
// 任一行失败即整批回滚,导出原表全部数据并标注错误(含按列标红),用户修正后重新导入。
|
||||
org.springblade.common.excel.ImportFailureExcelUtil.export(response, "违章记录导入失败明细" + DateUtil.time(), "导入失败明细", exception.getFailureList(), ViolationRecordImportExcel.class);
|
||||
return null;
|
||||
}
|
||||
return R.success("操作成功");
|
||||
|
||||
+5
-2
@@ -116,8 +116,11 @@ public class ViolationRecordServiceImpl extends BaseServiceImpl<ViolationRecordM
|
||||
}
|
||||
}
|
||||
if (Func.isNotEmpty(errorList)) {
|
||||
org.springframework.transaction.interceptor.TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
||||
return errorList;
|
||||
// 抛出携带失败明细的异常,触发事务回滚(替代旧的 setRollbackOnly)。
|
||||
// 明细为原表全部行(未出错行仅无错误原因),用户可对照原表修正后重新导入。
|
||||
// 注意不能只往 errorList 里塞数据就 return——异常被吞掉后方法会正常返回,
|
||||
// Spring 会照常提交事务,@Transactional 起不到回滚作用。
|
||||
throw new org.springblade.common.excel.ImportFailureException(data);
|
||||
}
|
||||
for (ViolationRecord violationRecord : violationRecordList) {
|
||||
if (!save(violationRecord)) {
|
||||
|
||||
Reference in New Issue
Block a user