From f61e06b49b7559a01ebcec8bcd1ef6cd9dc098df Mon Sep 17 00:00:00 2001 From: huangrh Date: Mon, 16 Mar 2026 16:38:08 +0800 Subject: [PATCH] Add delete report API --- interface-checklist.md | 2 +- .../task/controller/TaskController.java | 17 +++++++ .../modules/task/service/TaskService.java | 45 +++++++++++++++++++ 3 files changed, 63 insertions(+), 1 deletion(-) diff --git a/interface-checklist.md b/interface-checklist.md index 4a2a2ef..e40170e 100644 --- a/interface-checklist.md +++ b/interface-checklist.md @@ -16,6 +16,6 @@ | 10 | POST | `/api/tasks` | 创建识别任务 | `src/api/report.js` | ✅ 已修正 | 支持 `product_name/testing_date/contact_phone` 等表单字段 | | 11 | POST | `/api/reports/{id}/submit` | 用户确认提交 | `src/api/report.js` | ✅ 已修正 | OCR 通过后将状态置为 `pending` 并记录历史 | | 12 | POST | `/api/reports/{id}/audit` | 审核提交 | `src/api/report.js` | ✅ 已修正 | 支持 `status/opinion/files`,保存附件并记录历史 | -| 13 | DELETE | `/api/reports/{id}` | 删除报告 | `src/api/report.js` | | | +| 13 | DELETE | `/api/reports/{id}` | 删除报告 | `src/api/report.js` | ✅ 已修正 | 删除任务并清理 pdf/预览/附件目录 | | 14 | POST | `/api/validate-cma` | CMA 校验 | `src/api/report.js` | | | | 15 | GET | `/api/reports/{id}/pdf` | PDF 预览 | `src/views/shibieneirong/shenhe/index.vue` | | | diff --git a/src/main/java/com/chinaweal/youfool/reportdetect/modules/task/controller/TaskController.java b/src/main/java/com/chinaweal/youfool/reportdetect/modules/task/controller/TaskController.java index e4e0584..69692c6 100644 --- a/src/main/java/com/chinaweal/youfool/reportdetect/modules/task/controller/TaskController.java +++ b/src/main/java/com/chinaweal/youfool/reportdetect/modules/task/controller/TaskController.java @@ -236,6 +236,23 @@ public class TaskController { } } + @DeleteMapping("/reports/{id}") + @SaCheckRole(value = { "ADMIN", "USER" }, mode = SaMode.OR) + public ResponseEntity deleteReport(@PathVariable("id") String id) { + try { + taskService.deleteReport(id); + Map resp = new HashMap<>(); + resp.put("code", 0); + resp.put("msg", "Deleted"); + return ResponseEntity.ok(resp); + } catch (IllegalArgumentException e) { + Map resp = new HashMap<>(); + resp.put("code", 1); + resp.put("msg", e.getMessage()); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(resp); + } + } + @GetMapping("/statistics") @SaCheckRole(value = { "ADMIN", "AUDITOR", "USER" }, mode = SaMode.OR) public ResponseEntity getStatistics() { diff --git a/src/main/java/com/chinaweal/youfool/reportdetect/modules/task/service/TaskService.java b/src/main/java/com/chinaweal/youfool/reportdetect/modules/task/service/TaskService.java index 4e50ab0..d35475b 100644 --- a/src/main/java/com/chinaweal/youfool/reportdetect/modules/task/service/TaskService.java +++ b/src/main/java/com/chinaweal/youfool/reportdetect/modules/task/service/TaskService.java @@ -618,6 +618,51 @@ public class TaskService { taskRepository.save(task); } + @Transactional + public void deleteReport(String approvalId) { + if (approvalId == null || approvalId.isBlank()) { + throw new IllegalArgumentException("approval_id is required"); + } + Task task = taskRepository.findByApprovalId(approvalId); + if (task == null) { + return; + } + + if (task.getPdfPath() != null) { + try { + Files.deleteIfExists(Paths.get(task.getPdfPath())); + } catch (IOException ignored) { + // ignore cleanup failure + } + } + + try { + deleteDirectory(Paths.get(previewDir, approvalId)); + } catch (IOException ignored) { + } + + try { + deleteDirectory(Paths.get(attachmentDir, approvalId)); + } catch (IOException ignored) { + } + + taskRepository.delete(task); + } + + private void deleteDirectory(Path dir) throws IOException { + if (dir == null || !Files.exists(dir)) { + return; + } + Files.walk(dir) + .sorted((a, b) -> b.compareTo(a)) + .forEach(path -> { + try { + Files.deleteIfExists(path); + } catch (IOException ignored) { + } + }); + } + public Map getStatistics() { List pendingStatuses = List.of("pending", "ocr_completed"); List auditedStatuses = List.of("compliant", "non-compliant");