cid适配ppgo_job

This commit is contained in:
lmk
2026-07-18 10:10:23 +08:00
parent d930266fbf
commit 2fd858c97e
20 changed files with 810 additions and 884 deletions
+63 -49
View File
@@ -1,12 +1,10 @@
package yidun
import (
internal "cid/controller/internal"
dataengineService "cid/service/dataengine"
"context"
"fmt"
"strings"
"gitea.redpowerfuture.com/red-future/common/beans"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)
@@ -42,13 +40,13 @@ type PollResult struct {
// Body: callbackData={"antispam":{...}}
func (c *YidunCallbackController) ReceiveImageCallback(r *ghttp.Request) {
// IP 白名单校验
if !checkCallbackIP(r) {
if !internal.CheckCallbackIP(r.Context()) {
r.Response.WriteJson(CallbackResult{Code: 403, Msg: "IP not allowed"})
return
}
ctx := r.Context()
ctx = context.WithValue(ctx, "user", &beans.User{UserName: "yidun_callback", TenantId: 1})
ctx = internal.WithCallbackUser(ctx)
// 易盾推送的数据在请求体中
var callbackData string
@@ -86,7 +84,7 @@ func (c *YidunCallbackController) ReceiveImageCallback(r *ghttp.Request) {
return
}
r.Response.WriteJson(CallbackResult{Code: 200, Msg: "success"})
r.Response.WriteJson(CallbackResult{Code: 0, Msg: "success"})
}
// ReceiveVideoCallback 接收易盾视频检测结果推送
@@ -94,13 +92,13 @@ func (c *YidunCallbackController) ReceiveImageCallback(r *ghttp.Request) {
// Body: callbackData={"antispam":{...}}
func (c *YidunCallbackController) ReceiveVideoCallback(r *ghttp.Request) {
// IP 白名单校验
if !checkCallbackIP(r) {
if !internal.CheckCallbackIP(r.Context()) {
r.Response.WriteJson(CallbackResult{Code: 403, Msg: "IP not allowed"})
return
}
ctx := r.Context()
ctx = context.WithValue(ctx, "user", &beans.User{UserName: "yidun_callback", TenantId: 1})
ctx = internal.WithCallbackUser(ctx)
// 易盾推送的数据在请求体中
var callbackData string
@@ -138,7 +136,7 @@ func (c *YidunCallbackController) ReceiveVideoCallback(r *ghttp.Request) {
return
}
r.Response.WriteJson(CallbackResult{Code: 200, Msg: "success"})
r.Response.WriteJson(CallbackResult{Code: 0, Msg: "success"})
}
// =============================================================================
@@ -149,35 +147,40 @@ func (c *YidunCallbackController) ReceiveVideoCallback(r *ghttp.Request) {
// 格式: POST /yidun/callback/poll
func (c *YidunCallbackController) PollAllResults(r *ghttp.Request) {
ctx := r.Context()
ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin", TenantId: 1})
ctx = internal.WithAdminUser(ctx)
g.Log().Info(ctx, "开始轮询所有待查询的检测结果...")
// 先获取待处理数量
pendingCount, _ := dataengineService.MaterialVerify.GetPendingResultsCount(ctx)
// 执行轮询
successCount, failCount, err := dataengineService.MaterialVerify.PollPendingResults(ctx)
result := PollResult{
SuccessCount: successCount,
FailCount: failCount,
PendingCount: pendingCount - successCount,
}
// 轮询后再查一下剩余待处理的明细
pendingItems, _ := dataengineService.MaterialVerify.GetPendingResultsDetail(ctx, 50)
msg := fmt.Sprintf("✅ 成功处理 %d 条 | ❌ 失败 %d 条 | ⏳ 还剩 %d 条待处理",
successCount, failCount, len(pendingItems))
if err != nil {
r.Response.WriteJson(CallbackResult{
Code: 500,
Msg: fmt.Sprintf("轮询完成但有错误: %v", err),
Data: result,
Msg: fmt.Sprintf("部分完成但有错误: %v", err),
Data: g.Map{
"summary": g.Map{"success": successCount, "fail": failCount, "pending": len(pendingItems)},
"pending_detail": pendingItems,
},
})
return
}
r.Response.WriteJson(CallbackResult{
Code: 200,
Msg: fmt.Sprintf("轮询完成,成功处理 %d 条,失败 %d 条", successCount, failCount),
Data: result,
Code: 0,
Msg: msg,
Data: g.Map{
"summary": g.Map{"success": successCount, "fail": failCount, "pending": len(pendingItems)},
"pending_detail": pendingItems,
},
})
}
@@ -185,7 +188,7 @@ func (c *YidunCallbackController) PollAllResults(r *ghttp.Request) {
// 格式: POST /yidun/callback/pollImage
func (c *YidunCallbackController) PollImageResults(r *ghttp.Request) {
ctx := r.Context()
ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin", TenantId: 1})
ctx = internal.WithAdminUser(ctx)
g.Log().Info(ctx, "开始轮询图片待查询的检测结果...")
@@ -201,7 +204,7 @@ func (c *YidunCallbackController) PollImageResults(r *ghttp.Request) {
}
r.Response.WriteJson(CallbackResult{
Code: 200,
Code: 0,
Msg: fmt.Sprintf("轮询完成,成功处理 %d 条,失败 %d 条", successCount, failCount),
Data: PollResult{SuccessCount: successCount, FailCount: failCount},
})
@@ -211,7 +214,7 @@ func (c *YidunCallbackController) PollImageResults(r *ghttp.Request) {
// 格式: POST /yidun/callback/pollVideo
func (c *YidunCallbackController) PollVideoResults(r *ghttp.Request) {
ctx := r.Context()
ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin", TenantId: 1})
ctx = internal.WithAdminUser(ctx)
g.Log().Info(ctx, "开始轮询视频待查询的检测结果...")
@@ -227,7 +230,7 @@ func (c *YidunCallbackController) PollVideoResults(r *ghttp.Request) {
}
r.Response.WriteJson(CallbackResult{
Code: 200,
Code: 0,
Msg: fmt.Sprintf("轮询完成,成功处理 %d 条,失败 %d 条", successCount, failCount),
Data: PollResult{SuccessCount: successCount, FailCount: failCount},
})
@@ -237,7 +240,7 @@ func (c *YidunCallbackController) PollVideoResults(r *ghttp.Request) {
// 格式: POST /yidun/callback/pollTask
func (c *YidunCallbackController) PollByTaskID(r *ghttp.Request) {
ctx := r.Context()
ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin", TenantId: 1})
ctx = internal.WithAdminUser(ctx)
taskID := r.Get("taskId", "").String()
taskType := r.Get("type", "").String() // image 或 video
@@ -268,14 +271,41 @@ func (c *YidunCallbackController) PollByTaskID(r *ghttp.Request) {
return
}
r.Response.WriteJson(CallbackResult{Code: 200, Msg: "查询并处理成功"})
r.Response.WriteJson(CallbackResult{Code: 0, Msg: "查询并处理成功"})
}
// PendingListRes 待查询结果明细
type PendingListRes struct {
Total int `json:"total"`
List []dataengineService.PendingResultItem `json:"list"`
}
// GetPendingDetail 获取待查询结果的明细
// 格式: GET /yidun/callback/pendingDetail
func (c *YidunCallbackController) GetPendingDetail(r *ghttp.Request) {
ctx := r.Context()
ctx = internal.WithAdminUser(ctx)
items, err := dataengineService.MaterialVerify.GetPendingResultsDetail(ctx, 50)
if err != nil {
r.Response.WriteJson(CallbackResult{Code: 500, Msg: err.Error()})
return
}
r.Response.WriteJson(g.Map{
"code": 0,
"data": PendingListRes{
Total: len(items),
List: items,
},
})
}
// GetPendingCount 获取待查询结果的数量
// 格式: GET /yidun/callback/pendingCount
func (c *YidunCallbackController) GetPendingCount(r *ghttp.Request) {
ctx := r.Context()
ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin", TenantId: 1})
ctx = internal.WithAdminUser(ctx)
count, err := dataengineService.MaterialVerify.GetPendingResultsCount(ctx)
if err != nil {
@@ -284,7 +314,7 @@ func (c *YidunCallbackController) GetPendingCount(r *ghttp.Request) {
}
r.Response.WriteJson(g.Map{
"code": 200,
"code": 0,
"data": g.Map{
"pending_count": count,
"description": "待查询结果的日志数量(状态为pending且有taskID",
@@ -300,7 +330,7 @@ func (c *YidunCallbackController) GetPendingCount(r *ghttp.Request) {
// 格式: POST /yidun/callback/processImage
func (c *YidunCallbackController) ProcessImageCallback(r *ghttp.Request) {
ctx := r.Context()
ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin", TenantId: 1})
ctx = internal.WithAdminUser(ctx)
var req struct {
CallbackData string `json:"callbackData" v:"required#回调数据不能为空"`
@@ -317,14 +347,14 @@ func (c *YidunCallbackController) ProcessImageCallback(r *ghttp.Request) {
return
}
r.Response.WriteJson(CallbackResult{Code: 200, Msg: "success"})
r.Response.WriteJson(CallbackResult{Code: 0, Msg: "success"})
}
// ProcessVideoCallback 手动处理视频回调(兼容旧接口)
// 格式: POST /yidun/callback/processVideo
func (c *YidunCallbackController) ProcessVideoCallback(r *ghttp.Request) {
ctx := r.Context()
ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin", TenantId: 1})
ctx = internal.WithAdminUser(ctx)
var req struct {
CallbackData string `json:"callbackData" v:"required#回调数据不能为空"`
@@ -341,7 +371,7 @@ func (c *YidunCallbackController) ProcessVideoCallback(r *ghttp.Request) {
return
}
r.Response.WriteJson(CallbackResult{Code: 200, Msg: "success"})
r.Response.WriteJson(CallbackResult{Code: 0, Msg: "success"})
}
// toString 转换interface{}为string
@@ -351,19 +381,3 @@ func toString(v interface{}) string {
}
return ""
}
// checkCallbackIP 校验回调请求IP是否在白名单内
func checkCallbackIP(r *ghttp.Request) bool {
allowedIPs := g.Cfg().MustGet(r.Context(), "yidun.callback_allowed_ips", "").String()
if allowedIPs == "" {
return true // 未配置白名单,跳过校验
}
clientIP := r.GetClientIp()
for _, ip := range strings.Split(allowedIPs, ",") {
if strings.TrimSpace(ip) == clientIP {
return true
}
}
g.Log().Warningf(r.Context(), "回调IP不在白名单中, clientIP=%s, allowedIPs=%s", clientIP, allowedIPs)
return false
}