删除上传文件后触发项目重新打标

This commit is contained in:
wkc
2026-03-19 16:05:40 +08:00
parent 199dbb1d9d
commit 627886f711
11 changed files with 341 additions and 5 deletions

View File

@@ -14,6 +14,9 @@ public enum TriggerType {
/** 自动参数变更 */
AUTO_PARAM_CHANGE,
/** 自动文件删除 */
AUTO_FILE_DELETE,
/** 手动触发 */
MANUAL
}

View File

@@ -241,8 +241,13 @@ public class CcdiFileUploadServiceImpl implements ICcdiFileUploadService {
CcdiFileUploadRecord update = new CcdiFileUploadRecord();
update.setId(record.getId());
update.setFileStatus("deleted");
recordMapper.updateById(update);
return "删除成功";
int updatedRows = recordMapper.updateById(update);
if (updatedRows <= 0) {
throw new RuntimeException("更新上传记录状态失败");
}
bankTagService.submitAutoRebuild(record.getProjectId(), TriggerType.AUTO_FILE_DELETE);
return "删除成功,已开始项目重新打标";
}
@Override

View File

@@ -74,6 +74,13 @@ class CcdiBankTagServiceImplTest {
verify(coordinator).submitAuto(40L, TriggerType.AUTO_PARAM_CHANGE);
}
@Test
void submitAutoRebuild_shouldKeepAutoFileDeleteTriggerType() {
service.submitAutoRebuild(40L, TriggerType.AUTO_FILE_DELETE);
verify(coordinator).submitAuto(40L, TriggerType.AUTO_FILE_DELETE);
}
@Test
void rebuildProject_shouldDeleteOldResultsBeforeSubmittingRuleTasks() {
ReflectionTestUtils.setField(service, "tagRuleExecutor", (Executor) Runnable::run);

View File

@@ -376,10 +376,11 @@ class CcdiFileUploadServiceImplTest {
when(lsfxClient.deleteFiles(any())).thenReturn(buildDeleteFilesResponse());
when(projectMapper.selectById(PROJECT_ID)).thenReturn(project);
when(bankStatementMapper.selectObjs(any())).thenReturn(List.of("110101199001018888", "110101199001019999"));
when(recordMapper.updateById(any(CcdiFileUploadRecord.class))).thenReturn(1);
String result = service.deleteFileUploadRecord(RECORD_ID, 9527L);
assertEquals("删除成功", result);
assertEquals("删除成功已开始项目重新打标", result);
verify(lsfxClient).deleteFiles(argThat(request ->
request.getGroupId().equals(LSFX_PROJECT_ID)
&& request.getUserId().equals(9527)
@@ -390,6 +391,7 @@ class CcdiFileUploadServiceImplTest {
verify(recordMapper).updateById(org.mockito.ArgumentMatchers.<CcdiFileUploadRecord>argThat(item ->
RECORD_ID.equals(item.getId()) && "deleted".equals(item.getFileStatus())
));
verify(bankTagService).submitAutoRebuild(PROJECT_ID, TriggerType.AUTO_FILE_DELETE);
verify(projectMapper).updateById(org.mockito.ArgumentMatchers.<CcdiProject>argThat(item ->
PROJECT_ID.equals(item.getProjectId()) && Integer.valueOf(2).equals(item.getTargetCount())
));
@@ -419,6 +421,7 @@ class CcdiFileUploadServiceImplTest {
assertThrows(RuntimeException.class, () -> service.deleteFileUploadRecord(RECORD_ID, 9527L));
verify(bankStatementMapper, never()).deleteByProjectIdAndBatchId(any(), any());
verify(bankTagService, never()).submitAutoRebuild(any(), any());
verify(recordMapper, never()).updateById(org.mockito.ArgumentMatchers.<CcdiFileUploadRecord>argThat(item ->
"deleted".equals(item.getFileStatus())
));

View File

@@ -0,0 +1,134 @@
# Project Upload File Delete Trigger Retag Backend Implementation Plan
> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 在项目上传文件删除成功后,由后端自动触发项目重新打标,保证项目风险结果与剩余文件数据一致。
**Architecture:** 保持现有删除主链路不变,只在 `CcdiFileUploadServiceImpl.deleteFileUploadRecord` 的“平台删除成功、本地流水删除成功、上传记录状态更新成功”之后追加一次自动重打标提交。为避免触发语义混淆,新增独立触发类型 `AUTO_FILE_DELETE`,并通过现有 `ICcdiBankTagService.submitAutoRebuild` 进入项目级异步重打标协调器。
**Tech Stack:** Java 21, Spring Boot 3, MyBatis Plus, JUnit 5, Mockito, Maven
---
### Task 1: 为文件删除补齐自动重打标失败测试
**Files:**
- Modify: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImplTest.java`
- Modify: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiBankTagServiceImplTest.java`
- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/enums/TriggerType.java`
- [ ] **Step 1: Write the failing test**
`CcdiFileUploadServiceImplTest` 的删除成功用例中增加断言:
```java
verify(bankTagService).submitAutoRebuild(PROJECT_ID, TriggerType.AUTO_FILE_DELETE);
```
`CcdiBankTagServiceImplTest` 中增加触发类型透传测试:
```java
@Test
void submitAutoRebuild_shouldKeepAutoFileDeleteTriggerType() {
service.submitAutoRebuild(40L, TriggerType.AUTO_FILE_DELETE);
verify(coordinator).submitAuto(40L, TriggerType.AUTO_FILE_DELETE);
}
```
- [ ] **Step 2: Run test to verify it fails**
Run:
```bash
mvn -pl ccdi-project -Dtest=CcdiFileUploadServiceImplTest#deleteFileUploadRecord_shouldDeletePlatformFileBankStatementsAndMarkDeleted,CcdiBankTagServiceImplTest#submitAutoRebuild_shouldKeepAutoFileDeleteTriggerType test
```
Expected:
- `FAIL`
- 原因是还没有 `AUTO_FILE_DELETE` 触发类型,也没有在文件删除成功后触发自动重打标
- [ ] **Step 3: Write minimal implementation**
1.`TriggerType` 中新增:
```java
AUTO_FILE_DELETE
```
2.`CcdiFileUploadServiceImpl.deleteFileUploadRecord` 的状态更新成功后追加:
```java
bankTagService.submitAutoRebuild(record.getProjectId(), TriggerType.AUTO_FILE_DELETE);
```
3. 返回成功提示改为能体现重打标已开始的文案。
- [ ] **Step 4: Run test to verify it passes**
Run:
```bash
mvn -pl ccdi-project -Dtest=CcdiFileUploadServiceImplTest#deleteFileUploadRecord_shouldDeletePlatformFileBankStatementsAndMarkDeleted,CcdiBankTagServiceImplTest#submitAutoRebuild_shouldKeepAutoFileDeleteTriggerType test
```
Expected:
- `PASS`
- [ ] **Step 5: Commit**
```bash
git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/domain/enums/TriggerType.java ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImpl.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImplTest.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiBankTagServiceImplTest.java
git commit -m "删除上传文件后自动触发项目重打标"
```
### Task 2: 验证删除失败分支不会误触发重打标
**Files:**
- Modify: `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImplTest.java`
- Modify: `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImpl.java`
- [ ] **Step 1: Write the failing test**
在“流水分析平台删除失败”用例中增加断言:
```java
verify(bankTagService, never()).submitAutoRebuild(any(), any());
```
- [ ] **Step 2: Run test to verify it fails**
Run:
```bash
mvn -pl ccdi-project -Dtest=CcdiFileUploadServiceImplTest#deleteFileUploadRecord_shouldStopWhenLsfxDeleteFails test
```
Expected:
- 如果实现位置不正确,测试会失败
- [ ] **Step 3: Write minimal implementation**
确保仅在删除主链路全部成功后,才触发自动重打标;任何异常都直接抛出,不补触发。
- [ ] **Step 4: Run test to verify it passes**
Run:
```bash
mvn -pl ccdi-project -Dtest=CcdiFileUploadServiceImplTest#deleteFileUploadRecord_shouldStopWhenLsfxDeleteFails test
```
Expected:
- `PASS`
- [ ] **Step 5: Commit**
```bash
git add ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImpl.java ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImplTest.java
git commit -m "补充文件删除触发重打标失败保护"
```

View File

@@ -0,0 +1,84 @@
# Project Upload File Delete Trigger Retag Frontend Implementation Plan
> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 在项目详情上传数据页删除文件时,确认框明确提示“即将重新打标”,删除成功后明确提示项目已开始重新打标。
**Architecture:** 不改动现有删除按钮、列表刷新和轮询逻辑,只在 `UploadData.vue` 中更新删除确认文案和成功提示文案。继续沿用现有 `deleteFileUploadRecord` 接口,由后端实际触发异步重新打标,前端只负责明确告知用户影响。
**Tech Stack:** Vue 2, Element UI, Node.js, npm
---
### Task 1: 为删除确认和成功提示补齐失败测试
**Files:**
- Create: `ruoyi-ui/tests/unit/upload-data-delete-retag-copy.test.js`
- Modify: `ruoyi-ui/src/views/ccdiProject/components/detail/UploadData.vue`
- [ ] **Step 1: Write the failing test**
新增一个轻量源码断言测试,验证删除交互文案:
```javascript
assert(
source.includes("删除后将即将重新打标"),
"删除确认框应明确提示即将重新打标"
);
assert(
source.includes("删除成功,已开始项目重新打标"),
"删除成功提示应明确告知已开始项目重新打标"
);
```
实现时可用正则放宽空白和换行,不依赖运行 Vue 环境。
- [ ] **Step 2: Run test to verify it fails**
Run:
```bash
node ruoyi-ui/tests/unit/upload-data-delete-retag-copy.test.js
```
Expected:
- `FAIL`
- 原因是当前确认框和成功提示还没有“重新打标”文案
- [ ] **Step 3: Write minimal implementation**
`handleDeleteFile` 中把确认框改为明确提示会重新打标,例如:
```javascript
await this.$confirm(
"删除该文件后将重新打标项目内流水,是否继续?",
"提示",
{ type: "warning" }
);
```
把成功提示改为:
```javascript
this.$message.success("删除成功,已开始项目重新打标");
```
- [ ] **Step 4: Run test to verify it passes**
Run:
```bash
node ruoyi-ui/tests/unit/upload-data-delete-retag-copy.test.js
```
Expected:
- `PASS`
- [ ] **Step 5: Commit**
```bash
git add ruoyi-ui/src/views/ccdiProject/components/detail/UploadData.vue ruoyi-ui/tests/unit/upload-data-delete-retag-copy.test.js
git commit -m "补充上传文件删除重打标提示"
```

View File

@@ -0,0 +1,31 @@
# 上传文件删除触发项目重新打标后端实施记录
## 本次改动
- 为项目上传文件删除新增独立触发类型 `AUTO_FILE_DELETE`
- 在上传文件删除主链路全部成功后自动提交项目重新打标
- 为删除失败分支补充“不触发重打标”保护验证
## 修改内容
-`TriggerType` 中新增 `AUTO_FILE_DELETE`
-`CcdiFileUploadServiceImpl.deleteFileUploadRecord()` 中:
- 校验上传记录状态更新结果
- 仅在上传记录状态成功更新为 `deleted` 后调用 `bankTagService.submitAutoRebuild(projectId, TriggerType.AUTO_FILE_DELETE)`
- 返回成功文案 `删除成功,已开始项目重新打标`
-`CcdiFileUploadServiceImplTest` 中补充:
- 删除成功后触发自动重打标
- 流水分析平台删除失败时不触发自动重打标
-`CcdiBankTagServiceImplTest` 中补充 `AUTO_FILE_DELETE` 触发类型透传校验
## 测试与验证
```bash
mvn -pl ccdi-project -Dtest=CcdiFileUploadServiceImplTest#deleteFileUploadRecord_shouldDeletePlatformFileBankStatementsAndMarkDeleted,CcdiFileUploadServiceImplTest#deleteFileUploadRecord_shouldStopWhenLsfxDeleteFails,CcdiBankTagServiceImplTest#submitAutoRebuild_shouldKeepAutoFileDeleteTriggerType,CcdiFileUploadControllerTest#deleteFile_shouldUseCurrentLoginUserId test
```
## 结果
- 删除文件成功后会自动提交项目重新打标
- 删除失败分支不会误触发重打标
- 本次验证未启动额外前后端进程,无需清理测试进程

View File

@@ -0,0 +1,27 @@
# 上传文件删除触发项目重新打标前端实施记录
## 本次改动
- 调整项目详情上传数据页删除文件确认框文案,明确提示会重新打标
- 调整删除成功提示文案,明确告知项目已开始重新打标
- 保持现有删除按钮、列表刷新和轮询逻辑不变
## 修改内容
-`UploadData.vue``handleDeleteFile()` 中将确认框文案改为:
- 删除平台文件
- 清理本系统流水
- 项目内流水重新打标
- 删除成功后提示改为 `删除成功,已开始项目重新打标`
- 新增 `ruoyi-ui/tests/unit/upload-data-delete-retag-copy.test.js`,校验确认框与成功提示文案均包含重新打标语义
## 测试与验证
```bash
node ruoyi-ui/tests/unit/upload-data-delete-retag-copy.test.js
```
## 结果
- 删除前提示与删除后反馈都已覆盖“重新打标”语义
- 本次验证未启动前端开发进程,无需清理测试进程

View File

@@ -0,0 +1,21 @@
# 上传文件删除触发项目重新打标验证记录
## 验证范围
- 删除文件确认框明确提示会重新打标
- 删除文件成功后后端自动提交项目重新打标
- 删除失败时不触发自动重打标
- 删除接口仍正确透传当前登录用户 ID
## 验证命令
```bash
node ruoyi-ui/tests/unit/upload-data-delete-retag-copy.test.js
mvn -pl ccdi-project -Dtest=CcdiFileUploadServiceImplTest#deleteFileUploadRecord_shouldDeletePlatformFileBankStatementsAndMarkDeleted,CcdiFileUploadServiceImplTest#deleteFileUploadRecord_shouldStopWhenLsfxDeleteFails,CcdiBankTagServiceImplTest#submitAutoRebuild_shouldKeepAutoFileDeleteTriggerType,CcdiFileUploadControllerTest#deleteFile_shouldUseCurrentLoginUserId test
```
## 验证结果
- 前端文案断言通过
- 后端相关单元测试通过
- 本次验证未启动额外前后端进程,无需清理测试进程

View File

@@ -1286,7 +1286,7 @@ export default {
async handleDeleteFile(row) {
try {
await this.$confirm(
"删除后将同步删除流水分析平台中的文件,并清除本系统中该文件对应的所有银行流水数据,是否继续?",
"删除该文件后将同步删除流水分析平台中的文件,并清除本系统中该文件对应的所有银行流水数据,项目内流水也将重新打标,是否继续?",
"提示",
{
confirmButtonText: "确定",
@@ -1296,7 +1296,7 @@ export default {
);
await deleteFileUploadRecord(row.id);
this.$message.success("删除成功");
this.$message.success("删除成功,已开始项目重新打标");
await Promise.all([this.loadStatistics(), this.loadFileList()]);
if (this.hasActivePollingRecords()) {

View File

@@ -0,0 +1,21 @@
const assert = require("assert");
const fs = require("fs");
const path = require("path");
const componentPath = path.resolve(
__dirname,
"../../src/views/ccdiProject/components/detail/UploadData.vue"
);
const source = fs.readFileSync(componentPath, "utf8");
assert(
/删除[^"]*重新打标[^"]*是否继续/.test(source),
"删除确认框应明确提示即将重新打标"
);
assert(
/删除成功,已开始项目重新打标/.test(source),
"删除成功提示应明确告知已开始项目重新打标"
);
console.log("upload-data-delete-retag-copy test passed");