删除上传文件后触发项目重新打标
This commit is contained in:
@@ -14,6 +14,9 @@ public enum TriggerType {
|
||||
/** 自动参数变更 */
|
||||
AUTO_PARAM_CHANGE,
|
||||
|
||||
/** 自动文件删除 */
|
||||
AUTO_FILE_DELETE,
|
||||
|
||||
/** 手动触发 */
|
||||
MANUAL
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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())
|
||||
));
|
||||
|
||||
@@ -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 "补充文件删除触发重打标失败保护"
|
||||
```
|
||||
@@ -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 "补充上传文件删除重打标提示"
|
||||
```
|
||||
@@ -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
|
||||
```
|
||||
|
||||
## 结果
|
||||
|
||||
- 删除文件成功后会自动提交项目重新打标
|
||||
- 删除失败分支不会误触发重打标
|
||||
- 本次验证未启动额外前后端进程,无需清理测试进程
|
||||
@@ -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
|
||||
```
|
||||
|
||||
## 结果
|
||||
|
||||
- 删除前提示与删除后反馈都已覆盖“重新打标”语义
|
||||
- 本次验证未启动前端开发进程,无需清理测试进程
|
||||
@@ -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
|
||||
```
|
||||
|
||||
## 验证结果
|
||||
|
||||
- 前端文案断言通过
|
||||
- 后端相关单元测试通过
|
||||
- 本次验证未启动额外前后端进程,无需清理测试进程
|
||||
@@ -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()) {
|
||||
|
||||
21
ruoyi-ui/tests/unit/upload-data-delete-retag-copy.test.js
Normal file
21
ruoyi-ui/tests/unit/upload-data-delete-retag-copy.test.js
Normal 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");
|
||||
Reference in New Issue
Block a user