初始提交:OCI 面板后端(含 GenAI 网关一期)
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"log"
|
||||
|
||||
"gorm.io/gorm"
|
||||
|
||||
"oci-portal/internal/model"
|
||||
)
|
||||
|
||||
// AI 探测任务由系统按渠道数量自动管理:每天 00:00 探测一次全部号池渠道
|
||||
// (逐渠道使用该渠道自己的租户凭据,与号池一一对应)。
|
||||
const (
|
||||
aiProbeTaskName = "AI渠道探测"
|
||||
aiProbeCron = "0 0 * * *"
|
||||
)
|
||||
|
||||
// SyncAiProbeTask 按渠道数量同步 AI 探测任务:
|
||||
// 渠道数 > 0 时确保任务存在且激活,归零时连同日志自动删除;
|
||||
// 由渠道增删钩子与启动时调用。cron 与代码基线不一致时一并对齐(升级自动迁移)。
|
||||
func (s *TaskService) SyncAiProbeTask(ctx context.Context) {
|
||||
var count int64
|
||||
if err := s.db.WithContext(ctx).Model(&model.AiChannel{}).Count(&count).Error; err != nil {
|
||||
return
|
||||
}
|
||||
var task model.Task
|
||||
err := s.db.WithContext(ctx).Where("type = ?", model.TaskTypeAiProbe).First(&task).Error
|
||||
notFound := errors.Is(err, gorm.ErrRecordNotFound)
|
||||
if err != nil && !notFound {
|
||||
return
|
||||
}
|
||||
if !notFound && task.CronExpr != aiProbeCron {
|
||||
s.alignAiProbeCron(ctx, &task)
|
||||
}
|
||||
if count > 0 {
|
||||
s.activateAiProbe(ctx, &task, notFound)
|
||||
return
|
||||
}
|
||||
if !notFound {
|
||||
if err := s.removeTask(ctx, task.ID); err != nil {
|
||||
log.Printf("sync ai probe task: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// alignAiProbeCron 把存量任务的执行计划对齐到当前基线。
|
||||
func (s *TaskService) alignAiProbeCron(ctx context.Context, task *model.Task) {
|
||||
cron := aiProbeCron
|
||||
if _, err := s.UpdateTask(ctx, task.ID, UpdateTaskInput{CronExpr: &cron}); err != nil {
|
||||
log.Printf("align ai probe cron: %v", err)
|
||||
return
|
||||
}
|
||||
task.CronExpr = aiProbeCron
|
||||
}
|
||||
|
||||
// activateAiProbe 创建或激活 AI 探测任务。
|
||||
func (s *TaskService) activateAiProbe(ctx context.Context, task *model.Task, notFound bool) {
|
||||
if notFound {
|
||||
in := CreateTaskInput{Name: aiProbeTaskName, Type: model.TaskTypeAiProbe, CronExpr: aiProbeCron}
|
||||
if _, err := s.CreateTask(ctx, in); err != nil {
|
||||
log.Printf("sync ai probe task: %v", err)
|
||||
}
|
||||
return
|
||||
}
|
||||
if task.Status == model.TaskStatusActive {
|
||||
return
|
||||
}
|
||||
active := model.TaskStatusActive
|
||||
if _, err := s.UpdateTask(ctx, task.ID, UpdateTaskInput{Status: &active}); err != nil {
|
||||
log.Printf("sync ai probe task: %v", err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user