From 6b730ba3619bf37a87d013d1345dbf7d71ff0af5 Mon Sep 17 00:00:00 2001 From: Leufolium Date: Thu, 27 Jun 2024 18:19:11 +0800 Subject: [PATCH] by Robin at 20240627 --- app/mix/service/apiservice.go | 19 +++++--- app/mix/service/service.go | 19 +++++--- app/mix/service/utilservice.go | 44 +++++++++++++++++++ .../video_moderation_result_handler.go | 35 +++++++++++++++ app/mix/service/video_moderation_service.go | 20 +++++++++ app/mix/service/xxljob_tasks.go | 12 ++++- 6 files changed, 136 insertions(+), 13 deletions(-) diff --git a/app/mix/service/apiservice.go b/app/mix/service/apiservice.go index c6ba7a06..d5647d9b 100644 --- a/app/mix/service/apiservice.go +++ b/app/mix/service/apiservice.go @@ -1699,6 +1699,7 @@ func (s *Service) ApiCreateMoment(ctx *gin.Context, req *momentproto.ApiCreateRe // 添加审核任务 imageaudittasks := s.CreateMomentImageAudit(ctx, req.Moment) textaudittasks := s.CreateMomentTextAudit(ctx, oldMoment, req.Moment) + videomoderationtasks := s.CreateMomentVideoModeration(ctx, req.Moment) // 封装动态审核任务 momentAuditTask := &dbstruct.MomentAuditTask{ @@ -1708,11 +1709,15 @@ func (s *Service) ApiCreateMoment(ctx *gin.Context, req *momentproto.ApiCreateRe Status: goproto.Int64(consts.MomentAudit_Created), ManuallyReviewStatus: goproto.Int64(consts.MomentManuallyReview_Waiting), } + + momentAuditTask.ImageAuditTaskStatus = goproto.Int64(consts.MomentAudit_Created) if len(imageaudittasks) > 0 { momentAuditTask.ImageAuditTaskId = imageaudittasks[0].Id - momentAuditTask.ImageAuditTaskStatus = goproto.Int64(consts.MomentAudit_Created) + } else if len(videomoderationtasks) > 0 { + momentAuditTask.ImageAuditTaskId = videomoderationtasks[0].Id } else { - momentAuditTask.ImageAuditTaskStatus = goproto.Int64(consts.MomentAudit_Passed) + ec = errcode.ErrCodeBadParam + return } if len(textaudittasks) > 0 { momentAuditTask.TextAuditTaskId = textaudittasks[0].Id @@ -1772,18 +1777,20 @@ func (s *Service) ApiUpdateMoment(ctx *gin.Context, req *momentproto.ApiUpdateRe // 添加审核任务 imageaudittasks := s.CreateMomentImageAudit(ctx, req.Moment) textaudittasks := s.CreateMomentTextAudit(ctx, oldMoment, req.Moment) + videomoderationtasks := s.CreateMomentVideoModeration(ctx, req.Moment) // 封装动态审核任务 momentAuditTask := &dbstruct.MomentAuditTask{ AssociativeTableId: goproto.String(fmt.Sprint(util.DerefInt64(req.Moment.Id))), ManuallyReviewStatus: goproto.Int64(consts.MomentManuallyReview_Waiting), } + momentAuditTask.ImageAuditTaskStatus = goproto.Int64(consts.MomentAudit_Created) if len(imageaudittasks) > 0 { - momentAuditTask.AuditedMedia = imageaudittasks[0].AuditedMedia momentAuditTask.ImageAuditTaskId = imageaudittasks[0].Id - momentAuditTask.ImageAuditTaskStatus = goproto.Int64(consts.MomentAudit_Created) - } else { - momentAuditTask.ImageAuditTaskStatus = goproto.Int64(consts.MomentAudit_Passed) + momentAuditTask.AuditedMedia = imageaudittasks[0].AuditedMedia + } else if len(videomoderationtasks) > 0 { + momentAuditTask.ImageAuditTaskId = videomoderationtasks[0].Id + momentAuditTask.AuditedMedia = imageaudittasks[0].AuditedMedia } if len(textaudittasks) > 0 { momentAuditTask.AuditedText = textaudittasks[0].AuditedText diff --git a/app/mix/service/service.go b/app/mix/service/service.go index e10a7e23..c883cc5a 100644 --- a/app/mix/service/service.go +++ b/app/mix/service/service.go @@ -1106,6 +1106,7 @@ func (s *Service) OpCreateMoment(ctx *gin.Context, req *momentproto.OpCreateReq) // 添加审核任务 imageaudittasks := s.CreateMomentImageAudit(ctx, req.Moment) textaudittasks := s.CreateMomentTextAudit(ctx, oldMoment, req.Moment) + videomoderationtasks := s.CreateMomentVideoModeration(ctx, req.Moment) // 封装动态审核任务 momentAuditTask := &dbstruct.MomentAuditTask{ @@ -1114,11 +1115,15 @@ func (s *Service) OpCreateMoment(ctx *gin.Context, req *momentproto.OpCreateReq) AuditedText: req.Moment.Text, ManuallyReviewStatus: goproto.Int64(consts.MomentManuallyReview_Waiting), } + + momentAuditTask.ImageAuditTaskStatus = goproto.Int64(consts.MomentAudit_Created) if len(imageaudittasks) > 0 { momentAuditTask.ImageAuditTaskId = imageaudittasks[0].Id - momentAuditTask.ImageAuditTaskStatus = goproto.Int64(consts.MomentAudit_Created) + } else if len(videomoderationtasks) > 0 { + momentAuditTask.ImageAuditTaskId = videomoderationtasks[0].Id } else { - momentAuditTask.ImageAuditTaskStatus = goproto.Int64(consts.MomentAudit_Passed) + ec = errcode.ErrCodeBadParam + return } if len(textaudittasks) > 0 { momentAuditTask.TextAuditTaskId = textaudittasks[0].Id @@ -1169,18 +1174,20 @@ func (s *Service) OpUpdateMoment(ctx *gin.Context, req *momentproto.OpUpdateReq) // 添加审核任务 imageaudittasks := s.CreateMomentImageAudit(ctx, req.Moment) textaudittasks := s.CreateMomentTextAudit(ctx, oldMoment, req.Moment) + videomoderationtasks := s.CreateMomentVideoModeration(ctx, req.Moment) // 封装动态审核任务 momentAuditTask := &dbstruct.MomentAuditTask{ AssociativeTableId: goproto.String(fmt.Sprint(util.DerefInt64(req.Moment.Id))), ManuallyReviewStatus: goproto.Int64(consts.MomentManuallyReview_Waiting), } + momentAuditTask.ImageAuditTaskStatus = goproto.Int64(consts.MomentAudit_Created) if len(imageaudittasks) > 0 { - momentAuditTask.AuditedMedia = imageaudittasks[0].AuditedMedia momentAuditTask.ImageAuditTaskId = imageaudittasks[0].Id - momentAuditTask.ImageAuditTaskStatus = goproto.Int64(consts.MomentAudit_Created) - } else { - momentAuditTask.ImageAuditTaskStatus = goproto.Int64(consts.MomentAudit_Passed) + momentAuditTask.AuditedMedia = imageaudittasks[0].AuditedMedia + } else if len(videomoderationtasks) > 0 { + momentAuditTask.ImageAuditTaskId = videomoderationtasks[0].Id + momentAuditTask.AuditedMedia = imageaudittasks[0].AuditedMedia } if len(textaudittasks) > 0 { momentAuditTask.AuditedText = textaudittasks[0].AuditedText diff --git a/app/mix/service/utilservice.go b/app/mix/service/utilservice.go index 00f43e78..53393495 100644 --- a/app/mix/service/utilservice.go +++ b/app/mix/service/utilservice.go @@ -17,6 +17,7 @@ import ( textauditproto "service/api/proto/textaudit/proto" textaudittaskproto "service/api/proto/textaudittask/proto" thumbsupproto "service/api/proto/thumbsup/proto" + video_moderation_task_proto "service/api/proto/video_moderation_task/proto" zoneproto "service/api/proto/zone/proto" zone_collaborator_proto "service/api/proto/zone_collaborator/proto" zone_third_partner_proto "service/api/proto/zone_third_partner/proto" @@ -2093,3 +2094,46 @@ func (s *Service) utilAssembleDailyStatementZoneInfo(zoneprofits, zonerefunds [] return } + +// 同步图像审核结果 +func (s *Service) utilSyncVideoModerationTaskResultByBatchId(ctx *gin.Context, batchId string) (err error) { + // 查询得到该批次所有有关动态的图像审核任务 + videomoderationtasks, err := _DefaultVideoModerationTask.OpList(ctx, &video_moderation_task_proto.OpListReq{ + AssociativeDatabase: goproto.String(dao.DBMoment), + AssociativeTableName: goproto.String(dao.COLMoment), + AssociativeTableColumn: goproto.String("media_component"), + BatchId: goproto.String(batchId), + }) + if err != nil { + logger.Error("_DefaultVideoModerationTask OpList fail, err: %v", err) + return + } + + // 将有关动态的图像审核任务审核结果同步到动态审核表 + _map := make(map[int64][]string) + for _, videomoderationtask := range videomoderationtasks { + ids := _map[videomoderationtask.GetStatus()] + ids = append(ids, videomoderationtask.GetId()) + _map[videomoderationtask.GetStatus()] = ids + } + for status, ids := range _map { + logger.Info("status: %v, ids: %v", status, ids) + task := &dbstruct.MomentAuditTask{ + ImageAuditTaskStatus: goproto.Int64(status), + } + err = _DefaultMomentAuditTask.OpUpdateByImageAuditTaskIds(ctx, task, ids) + if err != nil { + logger.Error("_DefaultMomentAuditTask OpUpdateByVideoModerationTaskIds fail, err: %v", err) + return + } + } + + // 同步本批次所有待人工复审的任务(通过,或机审失败) + err = s.utilSyncWaitingForManuallyReviewMoment(ctx, batchId) + if err != nil { + logger.Error("_DefaultMomentAuditTask OpUpdateByVideoModerationTaskIds fail, err: %v", err) + return + } + + return +} diff --git a/app/mix/service/video_moderation_result_handler.go b/app/mix/service/video_moderation_result_handler.go index 5cd8f509..8edad71a 100644 --- a/app/mix/service/video_moderation_result_handler.go +++ b/app/mix/service/video_moderation_result_handler.go @@ -3,6 +3,7 @@ package service import ( "fmt" "service/api/consts" + momentproto "service/api/proto/moment/proto" zonemomentproto "service/api/proto/zonemoment/proto" "service/bizcommon/util" "service/dbstruct" @@ -32,6 +33,7 @@ func (handler *VideoModerationTaskResultHandler) Handle(ctx *gin.Context, task * func (handler *VideoModerationTaskResultHandler) initVideoModerationTaskUpdateFuncGeneratorMap() { handler.videoModerationTaskUpdateFuncGeneratorMap = make(map[string]func(ctx *gin.Context, task *dbstruct.VideoModerationTask, option int) func() error) + handler.generateMomentMediaComponentUpdateFunc() handler.generateZoneMomentMediaComponentUpdateFunc() } @@ -49,6 +51,26 @@ func (handler *VideoModerationTaskResultHandler) getVideoModerationTaskUpdateFun } +// 动态表->视频内容,通过和不通过均不作处理,等待人工审核 +func (handler *VideoModerationTaskResultHandler) generateMomentMediaComponentUpdateFunc() { + handler.videoModerationTaskUpdateFuncGeneratorMap["moment|moment|media_component"] = func(ctx *gin.Context, task *dbstruct.VideoModerationTask, option int) func() error { + return func() error { + //20240403更新: 增加成功后处理的切面 + if option == consts.ImageAuditTaskUpdate_Success { + return nil + } + + if option == consts.ImageAuditTaskUpdate_Pass { + //return passMomentVideoModerationTask(ctx, task) + return nil + + } else { + return rollbackMomentVideoModerationTask(ctx, task) + } + } + } +} + // 私密动态表->图像内容,若不通过,则写入不通过的原因 func (handler *VideoModerationTaskResultHandler) generateZoneMomentMediaComponentUpdateFunc() { handler.videoModerationTaskUpdateFuncGeneratorMap["zone_moment|zone_moment|media_component"] = func(ctx *gin.Context, task *dbstruct.VideoModerationTask, option int) func() error { @@ -92,3 +114,16 @@ func (handler *VideoModerationTaskResultHandler) generateZoneMomentMediaComponen } } } + +// 回退动态表视频 +func rollbackMomentVideoModerationTask(ctx *gin.Context, task *dbstruct.VideoModerationTask) (err error) { + if err := _DefaultMoment.OpUpdate(ctx, &momentproto.OpUpdateReq{ + Moment: &dbstruct.Moment{ + Id: task.AssociativeTableId, + Status: goproto.Int64(consts.Moment_AuditRejected), + }, + }); err != nil { + return err + } + return nil +} diff --git a/app/mix/service/video_moderation_service.go b/app/mix/service/video_moderation_service.go index c8d9becc..bde4ff96 100644 --- a/app/mix/service/video_moderation_service.go +++ b/app/mix/service/video_moderation_service.go @@ -13,6 +13,26 @@ import ( goproto "google.golang.org/protobuf/proto" ) +func (s *Service) CreateMomentVideoModeration(ctx *gin.Context, newMoment *dbstruct.Moment) (tasks []*dbstruct.VideoModerationTask) { + + if newMoment.MediaComp != nil && len(newMoment.MediaComp.GetVideoIds()) > 0 { + tasks = append(tasks, &dbstruct.VideoModerationTask{ + RouteUrl: goproto.String(ctx.Request.URL.Path), + AssociativeDatabase: goproto.String("moment"), + AssociativeTableName: goproto.String("moment"), + AssociativeTableId: newMoment.Id, + AssociativeTableColumn: goproto.String("media_component"), + AuditedMedia: newMoment.MediaComp, + OldMedia: nil, + IsAligned: goproto.Int64(consts.VideoModerationIsAligned_Yes), + }) + } + + addVideoModerationTasks(ctx, tasks) + + return +} + func (s *Service) CreateZoneMomentVideoModeration(ctx *gin.Context, newZoneMoment *dbstruct.ZoneMoment) (tasks []*dbstruct.VideoModerationTask) { if newZoneMoment.MediaComp != nil && len(newZoneMoment.MediaComp.GetVideoIds()) > 0 { diff --git a/app/mix/service/xxljob_tasks.go b/app/mix/service/xxljob_tasks.go index 9294aafd..6819db6e 100644 --- a/app/mix/service/xxljob_tasks.go +++ b/app/mix/service/xxljob_tasks.go @@ -552,6 +552,11 @@ func (s *CronService) VideoModerationBatch(ctx context.Context, param *xxl.RunRe } else { handleMsg.WriteString(fmt.Sprintf("batchId : %v, video moderation tasks of this batchId have finished, successNum: %v, failNum: %v", batchId, successNum, failNum)) } + // 同步视频审核结果 + err = DefaultService.utilSyncVideoModerationTaskResultByBatchId(&gin.Context{}, batchId) + if err != nil { + handleMsg.WriteString(fmt.Sprintf("ERROR : batchId : %v, video moderation tasks of this batchId have failed to syncronize, err :%v", batchId, err)) + } logger.Info("Video moderation batch ends...") return handleMsg.String() @@ -562,13 +567,18 @@ func (s *CronService) VideoModerationBatchHis(ctx context.Context, param *xxl.Ru handleMsg := &strings.Builder{} // 刷新批次号 batchId := param.ExecutorParams - // 执行图像审核 + // 执行视频审核 successNum, failNum, err := videomoderation.Run(batchId) if err != nil { handleMsg.WriteString(fmt.Sprintf("ERROR : batchId : %v, video moderation tasks of this batchId have failed, successNum: %v, failNum: %v, err :%v ; ", batchId, successNum, failNum, err)) } else { handleMsg.WriteString(fmt.Sprintf("batchId : %v, video moderation tasks of this batchId have finished, successNum: %v, failNum: %v", batchId, successNum, failNum)) } + // 同步视频审核结果 + err = DefaultService.utilSyncVideoModerationTaskResultByBatchId(&gin.Context{}, batchId) + if err != nil { + handleMsg.WriteString(fmt.Sprintf("ERROR : batchId : %v, video moderation tasks of this batchId have failed to syncronize, err :%v", batchId, err)) + } logger.Info("Video moderation batch ends...") return handleMsg.String() -- 2.41.0