diff --git a/backend/internal/repository/task_repository.go b/backend/internal/repository/task_repository.go index e0b44c1..e695c3a 100644 --- a/backend/internal/repository/task_repository.go +++ b/backend/internal/repository/task_repository.go @@ -304,7 +304,7 @@ func (r *SQLTaskRepository) CancelTask(ctx context.Context, id, message string, rollback() return errors.New("任务当前无法取消") } - if _, err := tx.ExecContext(ctx, r.query(`UPDATE task_attempts SET status = 'cancelled', message = ?, finished_at = ? WHERE task_id = ? AND status IN ('queued', 'running')`), message, nullableTime(finishedAt), id); err != nil { + if _, err := tx.ExecContext(ctx, r.query(`UPDATE task_attempts SET status = 'cancelled', message = ?, finished_at = ? WHERE task_id = ? AND status IN ('queued', 'running', 'retry_wait', 'cancelling')`), message, nullableTime(finishedAt), id); err != nil { rollback() return fmt.Errorf("取消任务尝试失败:%w", err) } diff --git a/backend/internal/repository/task_repository_test.go b/backend/internal/repository/task_repository_test.go index 6f0febd..0de9b55 100644 --- a/backend/internal/repository/task_repository_test.go +++ b/backend/internal/repository/task_repository_test.go @@ -182,6 +182,39 @@ func TestSQLTaskRepositoryCancelMarksRunningAttempt(t *testing.T) { } } +func TestSQLTaskRepositoryCancelMarksAllActiveAttempts(t *testing.T) { + repository, db := newTaskRepositoryTest(t) + defer db.Close() + ctx := context.Background() + now := time.Now().UTC() + activeStatuses := []string{"queued", "running", "retry_wait", "cancelling"} + domainIDs := []string{"domain-1", "domain-2", "domain-3", "domain-1"} + for index, status := range activeStatuses { + taskID := "task-cancel-active-" + status + attemptID := "attempt-cancel-active-" + status + if err := repository.CreateTask(ctx, Task{ + ID: taskID, DomainID: domainIDs[index], TaskType: "certificate_issue", + Status: status, Stage: "certificate_issue", Message: "\u6b63\u5728\u6267\u884c", CreatedAt: now, UpdatedAt: now, + }); err != nil { + t.Fatalf("create %s task: %v", status, err) + } + if err := repository.CreateAttempt(ctx, TaskAttempt{ + ID: attemptID, TaskID: taskID, AttemptNumber: 1, + Stage: "certificate_issue", Status: status, Message: "\u6b63\u5728\u6267\u884c", StartedAt: &now, CreatedAt: now, + }); err != nil { + t.Fatalf("create %s attempt: %v", status, err) + } + + finished := now.Add(time.Second) + if err := repository.CancelTask(ctx, taskID, "\u4efb\u52a1\u5df2\u7531\u7528\u6237\u53d6\u6d88", &finished); err != nil { + t.Fatalf("cancel %s task: %v", status, err) + } + attempts, err := repository.ListAttempts(ctx, taskID) + if err != nil || len(attempts) != 1 || attempts[0].Status != "cancelled" || attempts[0].FinishedAt == nil { + t.Fatalf("cancel %s attempt state: %+v %v", status, attempts, err) + } + } +} func TestSQLTaskRepositoryDoesNotOverwriteCancelledTask(t *testing.T) { repository, db := newTaskRepositoryTest(t) defer db.Close() diff --git a/doc/Scert开发任务清单.md b/doc/Scert开发任务清单.md index 070b43a..d3d8815 100644 --- a/doc/Scert开发任务清单.md +++ b/doc/Scert开发任务清单.md @@ -3681,3 +3681,14 @@ Linux Ubuntu 22.04 上的 `Scert-admin` 手动启停、无开机自启动、无 - [~] P0-10 其他任务入口、任务尝试矩阵、跨数据库实机矩阵和统一复审继续进行。 - [ ] P0-12 备份恢复、浏览器、密码 SSH、远端部署和最终生产门禁尚未完成。 - [!] 总体验收继续保持 **P0-03:完成,待复审**,不得将本地自动化结果标记为生产验收通过。 + +## 最新进度追加(2026-09-29,P0-10 通用取消入口状态一致性) + +总体验收继续保持 **P0-03:完成,待复审**;本轮补齐通用仓储取消入口,不代表 P0-10 统一复审或生产部署验收通过。 + +- [x] 已完成,等待复审:通用 `CancelTask` 取消任务时,任务尝试同步覆盖 `queued`、`running`、`retry_wait`、`cancelling` 四种活动状态。 +- [x] 已完成,等待复审:新增四种活动状态的仓储回归测试,确认任务及任务尝试均进入 `cancelled` 并记录完成时间。 +- [x] 已完成,等待复审:`go test ./...`、`go vet ./...`、`git diff --check` 均通过。 +- [~] 进行中:P0-10 其他任务入口、跨数据库实机矩阵、崩溃恢复、重试幂等和统一复审仍需继续。 +- [ ] 未开始:P0-12 备份恢复及最终生产门禁仍未完成。 +- [!] 总体验收不得升级,当前仍为 **P0-03:完成,待复审**,没有新增 `[✓]` 复审通过项。 \ No newline at end of file diff --git a/doc/Scert整改任务执行清单.md b/doc/Scert整改任务执行清单.md index 4b88e94..dfc4dbd 100644 --- a/doc/Scert整改任务执行清单.md +++ b/doc/Scert整改任务执行清单.md @@ -985,3 +985,14 @@ P0-05 从 `[!]` 调整为 `[~]`,并未标记完成;P0-04 剩余门禁和全 - [~] 进行中:P0-10 仍需继续审查其他任务入口、重试、幂等、恢复和跨数据库行为。 - [ ] 未开始:P0-12 备份恢复以及最终生产流程门禁。 - [!] 总体验收保持 **P0-03:完成,待复审**,没有新增 `[✓]`。 + +## 最新进度追加(2026-09-29,P0-10 通用取消入口状态一致性) + +总体验收继续保持 **P0-03:完成,待复审**;本轮补齐通用仓储取消入口,不代表 P0-10 统一复审或生产部署验收通过。 + +- [x] 已完成,等待复审:通用 `CancelTask` 取消任务时,任务尝试同步覆盖 `queued`、`running`、`retry_wait`、`cancelling` 四种活动状态。 +- [x] 已完成,等待复审:新增四种活动状态的仓储回归测试,确认任务及任务尝试均进入 `cancelled` 并记录完成时间。 +- [x] 已完成,等待复审:`go test ./...`、`go vet ./...`、`git diff --check` 均通过。 +- [~] 进行中:P0-10 其他任务入口、跨数据库实机矩阵、崩溃恢复、重试幂等和统一复审仍需继续。 +- [ ] 未开始:P0-12 备份恢复及最终生产门禁仍未完成。 +- [!] 总体验收不得升级,当前仍为 **P0-03:完成,待复审**,没有新增 `[✓]` 复审通过项。 \ No newline at end of file diff --git a/doc/Scert整改合并优化清单.md b/doc/Scert整改合并优化清单.md index d4c09c0..594a8c9 100644 --- a/doc/Scert整改合并优化清单.md +++ b/doc/Scert整改合并优化清单.md @@ -1632,3 +1632,14 @@ P0-11 生产验收门禁 - [~] 进行中:P0-10 其余任务入口、跨数据库实机矩阵、崩溃恢复复核和统一复审仍需继续。 - [ ] 未开始:P0-12 备份恢复、最终浏览器清缓存、密码 SSH、远端部署和生产门禁仍未完成。 - [!] 总体验收不得升级,当前仍为 **P0-03 完成,待复审**,没有新增 `[✓]` 复审通过项。 + +## 最新进度追加(2026-09-29,P0-10 通用取消入口状态一致性) + +总体验收继续保持 **P0-03:完成,待复审**;本轮补齐通用仓储取消入口,不代表 P0-10 统一复审或生产部署验收通过。 + +- [x] 已完成,等待复审:通用 `CancelTask` 取消任务时,任务尝试同步覆盖 `queued`、`running`、`retry_wait`、`cancelling` 四种活动状态。 +- [x] 已完成,等待复审:新增四种活动状态的仓储回归测试,确认任务及任务尝试均进入 `cancelled` 并记录完成时间。 +- [x] 已完成,等待复审:`go test ./...`、`go vet ./...`、`git diff --check` 均通过。 +- [~] 进行中:P0-10 其他任务入口、跨数据库实机矩阵、崩溃恢复、重试幂等和统一复审仍需继续。 +- [ ] 未开始:P0-12 备份恢复及最终生产门禁仍未完成。 +- [!] 总体验收不得升级,当前仍为 **P0-03:完成,待复审**,没有新增 `[✓]` 复审通过项。 \ No newline at end of file diff --git a/doc/基础整改任务规格.md b/doc/基础整改任务规格.md index 02e9013..a932c0e 100644 --- a/doc/基础整改任务规格.md +++ b/doc/基础整改任务规格.md @@ -563,3 +563,14 @@ P0-06 与 P0-07 均维持 `[~]`,六阶段中的隔离、生产和最终验收 - [~] P0-10 其他任务链与三数据库实机复核仍在进行。 - [ ] P0-12 备份恢复及最终生产门禁尚未开始。 - [!] 总体验收不得升级,仍为 **P0-03:完成,待复审**。 + +## 最新进度追加(2026-09-29,P0-10 通用取消入口状态一致性) + +总体验收继续保持 **P0-03:完成,待复审**;本轮补齐通用仓储取消入口,不代表 P0-10 统一复审或生产部署验收通过。 + +- [x] 已完成,等待复审:通用 `CancelTask` 取消任务时,任务尝试同步覆盖 `queued`、`running`、`retry_wait`、`cancelling` 四种活动状态。 +- [x] 已完成,等待复审:新增四种活动状态的仓储回归测试,确认任务及任务尝试均进入 `cancelled` 并记录完成时间。 +- [x] 已完成,等待复审:`go test ./...`、`go vet ./...`、`git diff --check` 均通过。 +- [~] 进行中:P0-10 其他任务入口、跨数据库实机矩阵、崩溃恢复、重试幂等和统一复审仍需继续。 +- [ ] 未开始:P0-12 备份恢复及最终生产门禁仍未完成。 +- [!] 总体验收不得升级,当前仍为 **P0-03:完成,待复审**,没有新增 `[✓]` 复审通过项。 \ No newline at end of file