package device_import import ( "context" "strconv" "time" "gorm.io/gorm" infraAudit "github.com/break/junhong_cmp_fiber/internal/infrastructure/audit" "github.com/break/junhong_cmp_fiber/internal/model" "github.com/break/junhong_cmp_fiber/pkg/auditfailure" "github.com/break/junhong_cmp_fiber/pkg/constants" "github.com/break/junhong_cmp_fiber/pkg/errors" "github.com/break/junhong_cmp_fiber/pkg/middleware" ) func (s *Service) writeDeviceImportTaskAudit(ctx context.Context, tx *gorm.DB, task *model.DeviceImportTask, before, after map[string]any, result, phase, errorCode, errorSummary string) error { scopeType, scopeID := constants.AuditScopePlatform, "" if task.OperatorShopID != nil { scopeType, scopeID = constants.AuditScopeShop, strconv.FormatUint(uint64(*task.OperatorShopID), 10) } return s.auditWriter.WriteTask(ctx, tx, infraAudit.TaskInput{ EventID: infraAudit.TaskEventID(constants.AuditResourceDeviceImportTask, task.ID, phase), ActionCode: constants.AuditActionDeviceImportTaskCreated, Summary: "创建设备导入任务", TaskID: task.ID, TaskNo: task.TaskNo, Actor: infraAudit.ActorInput{ Kind: constants.AuditActorAccount, ID: strconv.FormatUint(uint64(middleware.GetUserIDFromContext(ctx)), 10), Name: middleware.GetUsernameFromContext(ctx), ShopID: task.OperatorShopID, }, Source: constants.AuditSourceAdminAPI, ScopeType: scopeType, ScopeID: scopeID, Result: result, ErrorCode: errorCode, ErrorSummary: errorSummary, IdentitySnapshot: map[string]any{ "id": task.ID, "task_no": task.TaskNo, "file_name": task.FileName, "operation_type": task.OperationType, "target_id": task.TargetID, "batch_no": task.BatchNo, "realname_policy": task.RealnamePolicy, }, BeforeData: before, AfterData: after, }) } func (s *Service) recordDeviceImportTaskAudit(ctx context.Context, task *model.DeviceImportTask, before, after map[string]any, result, phase string, errorCode int, summary string) { if s == nil || s.db == nil || s.auditWriter == nil || task == nil || task.TaskNo == "" { return } code := strconv.Itoa(errorCode) if err := s.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { return s.writeDeviceImportTaskAudit(ctx, tx, task, before, after, result, phase, code, summary) }); err != nil { auditfailure.RecordSecondaryWriteFailure(constants.AuditActionDeviceImportTaskCreated, task.TaskNo, "", task.TaskNo, code, err) } } func (s *Service) failEnqueueWithAudit(ctx context.Context, task *model.DeviceImportTask, summary string) error { before := deviceImportTaskState(task) return s.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { now := time.Now() if err := tx.WithContext(ctx).Model(&model.DeviceImportTask{}).Where("id = ?", task.ID).Updates(map[string]any{ "status": model.ImportTaskStatusFailed, "error_message": summary, "completed_at": now, "updated_at": now, }).Error; err != nil { return err } task.Status, task.ErrorMessage = model.ImportTaskStatusFailed, summary return s.writeDeviceImportTaskAudit(ctx, tx, task, before, deviceImportTaskState(task), constants.AuditResultFailed, "enqueue_failed", strconv.Itoa(errors.CodeTaskQueueError), summary) }) } func deviceImportTaskState(task *model.DeviceImportTask) map[string]any { if task == nil { return nil } return map[string]any{ "status": task.Status, "total_count": task.TotalCount, "success_count": task.SuccessCount, "skip_count": task.SkipCount, "fail_count": task.FailCount, "warning_count": task.WarningCount, } }