usage_cleanup.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package service
  2. import (
  3. "context"
  4. "time"
  5. "github.com/Wei-Shaw/sub2api/internal/pkg/pagination"
  6. )
  7. const (
  8. UsageCleanupStatusPending = "pending"
  9. UsageCleanupStatusRunning = "running"
  10. UsageCleanupStatusSucceeded = "succeeded"
  11. UsageCleanupStatusFailed = "failed"
  12. UsageCleanupStatusCanceled = "canceled"
  13. )
  14. // UsageCleanupFilters 定义清理任务过滤条件
  15. // 时间范围为必填,其他字段可选
  16. // JSON 序列化用于存储任务参数
  17. //
  18. // start_time/end_time 使用 RFC3339 时间格式
  19. // 以 UTC 或用户时区解析后的时间为准
  20. //
  21. // 说明:
  22. // - nil 表示未设置该过滤条件
  23. // - 过滤条件均为精确匹配
  24. type UsageCleanupFilters struct {
  25. StartTime time.Time `json:"start_time"`
  26. EndTime time.Time `json:"end_time"`
  27. UserID *int64 `json:"user_id,omitempty"`
  28. APIKeyID *int64 `json:"api_key_id,omitempty"`
  29. AccountID *int64 `json:"account_id,omitempty"`
  30. GroupID *int64 `json:"group_id,omitempty"`
  31. Model *string `json:"model,omitempty"`
  32. RequestType *int16 `json:"request_type,omitempty"`
  33. Stream *bool `json:"stream,omitempty"`
  34. BillingType *int8 `json:"billing_type,omitempty"`
  35. }
  36. // UsageCleanupTask 表示使用记录清理任务
  37. // 状态包含 pending/running/succeeded/failed/canceled
  38. type UsageCleanupTask struct {
  39. ID int64
  40. Status string
  41. Filters UsageCleanupFilters
  42. CreatedBy int64
  43. DeletedRows int64
  44. ErrorMsg *string
  45. CanceledBy *int64
  46. CanceledAt *time.Time
  47. StartedAt *time.Time
  48. FinishedAt *time.Time
  49. CreatedAt time.Time
  50. UpdatedAt time.Time
  51. }
  52. // UsageCleanupRepository 定义清理任务持久层接口
  53. type UsageCleanupRepository interface {
  54. CreateTask(ctx context.Context, task *UsageCleanupTask) error
  55. ListTasks(ctx context.Context, params pagination.PaginationParams) ([]UsageCleanupTask, *pagination.PaginationResult, error)
  56. // ClaimNextPendingTask 抢占下一条可执行任务:
  57. // - 优先 pending
  58. // - 若 running 超过 staleRunningAfterSeconds(可能由于进程退出/崩溃/超时),允许重新抢占继续执行
  59. ClaimNextPendingTask(ctx context.Context, staleRunningAfterSeconds int64) (*UsageCleanupTask, error)
  60. // GetTaskStatus 查询任务状态;若不存在返回 sql.ErrNoRows
  61. GetTaskStatus(ctx context.Context, taskID int64) (string, error)
  62. // UpdateTaskProgress 更新任务进度(deleted_rows)用于断点续跑/展示
  63. UpdateTaskProgress(ctx context.Context, taskID int64, deletedRows int64) error
  64. // CancelTask 将任务标记为 canceled(仅允许 pending/running)
  65. CancelTask(ctx context.Context, taskID int64, canceledBy int64) (bool, error)
  66. MarkTaskSucceeded(ctx context.Context, taskID int64, deletedRows int64) error
  67. MarkTaskFailed(ctx context.Context, taskID int64, deletedRows int64, errorMsg string) error
  68. DeleteUsageLogsBatch(ctx context.Context, filters UsageCleanupFilters, limit int) (int64, error)
  69. }