diff --git a/internal/task/device_import.go b/internal/task/device_import.go index 0ac6591..0448e52 100644 --- a/internal/task/device_import.go +++ b/internal/task/device_import.go @@ -85,7 +85,18 @@ func (h *DeviceImportHandler) HandleDeviceImport(ctx context.Context, task *asyn return asynq.SkipRetry } - if importTask.Status != model.ImportTaskStatusPending { + switch importTask.Status { + case model.ImportTaskStatusPending: + // 正常首次处理 + case model.ImportTaskStatusProcessing: + // 上次 worker 中途中断(重启/崩溃),重置计数重新处理 + // 已入库的设备会被 ExistsByDeviceNoBatch 识别为 skip,不会重复写入 + h.logger.Warn("检测到导入任务上次处理中途中断,重置进度重新处理", + zap.Uint("task_id", payload.TaskID), + ) + h.importTaskStore.UpdateProgress(ctx, importTask.ID, 0, 0, 0) + default: + // 已完成或失败,不重复处理 h.logger.Info("导入任务已处理,跳过", zap.Uint("task_id", payload.TaskID), zap.Int("status", importTask.Status), diff --git a/internal/task/iot_card_import.go b/internal/task/iot_card_import.go index 84fd9f1..82f891d 100644 --- a/internal/task/iot_card_import.go +++ b/internal/task/iot_card_import.go @@ -92,7 +92,18 @@ func (h *IotCardImportHandler) HandleIotCardImport(ctx context.Context, task *as return asynq.SkipRetry } - if importTask.Status != model.ImportTaskStatusPending { + switch importTask.Status { + case model.ImportTaskStatusPending: + // 正常首次处理 + case model.ImportTaskStatusProcessing: + // 上次 worker 中途中断(重启/崩溃),重置计数重新处理 + // 已入库的卡会被 ExistsByICCIDBatch 识别为 skip,不会重复写入 + h.logger.Warn("检测到导入任务上次处理中途中断,重置进度重新处理", + zap.Uint("task_id", payload.TaskID), + ) + h.importTaskStore.UpdateProgress(ctx, importTask.ID, 0, 0, 0) + default: + // 已完成或失败,不重复处理 h.logger.Info("导入任务已处理,跳过", zap.Uint("task_id", payload.TaskID), zap.Int("status", importTask.Status),