package api import ( "ZhenTuLocalPassiveAdapter/logger" "context" "fmt" "go.uber.org/zap" "golang.org/x/sync/errgroup" ) // UploadFaceData implements the coordinated upload flow: Get Config -> Upload -> Notify func UploadFaceData(ctx context.Context, scenicId int64, deviceNo string, faceImg, thumbImg, srcImg []byte, facePos FacePositionInfo) error { // 1. Get Upload Config uploadConfig, err := GetUploadConfig(ctx, scenicId, deviceNo) if err != nil { logger.Error("获取上传配置失败", zap.String("deviceNo", deviceNo), zap.Error(err)) return err } logger.Info("获取到VIID任务ID", zap.Int64("taskId", uploadConfig.TaskID)) // 2. Parallel Upload to OSS g, subCtx := errgroup.WithContext(ctx) // Upload Face Image g.Go(func() error { if len(faceImg) > 0 { if err := UploadFileToOSS(subCtx, uploadConfig.FaceUploadURL, faceImg, "image/jpeg"); err != nil { return fmt.Errorf("upload face image failed: %w", err) } } return nil }) // Upload Thumbnail Image g.Go(func() error { if len(thumbImg) > 0 { if err := UploadFileToOSS(subCtx, uploadConfig.ThumbnailUploadURL, thumbImg, "image/jpeg"); err != nil { return fmt.Errorf("upload thumbnail image failed: %w", err) } } return nil }) // Upload Source Image g.Go(func() error { if len(srcImg) > 0 { if err := UploadFileToOSS(subCtx, uploadConfig.SourceUploadURL, srcImg, "image/jpeg"); err != nil { return fmt.Errorf("upload source image failed: %w", err) } } return nil }) if err := g.Wait(); err != nil { // Report failure SubmitFailure(ctx, uploadConfig.TaskID, "UPLOAD_FAILED", err.Error()) logger.Error("文件上传失败", zap.Int64("taskId", uploadConfig.TaskID), zap.Error(err)) return err } // 3. Submit Result if err := SubmitResult(ctx, uploadConfig.TaskID, facePos); err != nil { logger.Error("提交结果失败", zap.Int64("taskId", uploadConfig.TaskID), zap.Error(err)) return err } logger.Info("VIID任务完成", zap.Int64("taskId", uploadConfig.TaskID)) return nil }