mirror of
https://github.com/yangjian102621/geekai.git
synced 2026-04-12 14:14:25 +08:00
223 lines
5.0 KiB
Go
223 lines
5.0 KiB
Go
package admin
|
|
|
|
import (
|
|
"strconv"
|
|
|
|
"geekai/core"
|
|
"geekai/core/types"
|
|
"geekai/service/ai3d"
|
|
"geekai/store/model"
|
|
"geekai/store/vo"
|
|
"geekai/utils"
|
|
"geekai/utils/resp"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// AI3DHandler 3D管理处理器
|
|
type AI3DHandler struct {
|
|
app *core.AppServer
|
|
db *gorm.DB
|
|
service *ai3d.Service
|
|
}
|
|
|
|
// NewAI3DHandler 创建3D管理处理器
|
|
func NewAI3DHandler(app *core.AppServer, db *gorm.DB, service *ai3d.Service) *AI3DHandler {
|
|
return &AI3DHandler{
|
|
app: app,
|
|
db: db,
|
|
service: service,
|
|
}
|
|
}
|
|
|
|
// RegisterRoutes 注册路由
|
|
func (h *AI3DHandler) RegisterRoutes() {
|
|
admin := h.app.Engine.Group("/api/admin/ai3d")
|
|
{
|
|
admin.GET("/jobs", h.GetJobList)
|
|
admin.GET("/jobs/:id", h.GetJobDetail)
|
|
admin.DELETE("/jobs/:id", h.DeleteJob)
|
|
admin.GET("/stats", h.GetStats)
|
|
admin.GET("/models", h.GetModels)
|
|
admin.POST("/config", h.SaveConfig)
|
|
}
|
|
}
|
|
|
|
// GetJobList 获取任务列表
|
|
func (h *AI3DHandler) GetJobList(c *gin.Context) {
|
|
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
|
|
pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20"))
|
|
status := c.Query("status")
|
|
jobType := c.Query("type")
|
|
userIdStr := c.Query("user_id")
|
|
|
|
var userId uint
|
|
if userIdStr != "" {
|
|
if id, err := strconv.ParseUint(userIdStr, 10, 32); err == nil {
|
|
userId = uint(id)
|
|
}
|
|
}
|
|
|
|
// 构建查询条件
|
|
query := h.db.Model(&model.AI3DJob{})
|
|
|
|
if status != "" {
|
|
query = query.Where("status = ?", status)
|
|
}
|
|
|
|
if jobType != "" {
|
|
query = query.Where("type = ?", jobType)
|
|
}
|
|
|
|
if userId > 0 {
|
|
query = query.Where("user_id = ?", userId)
|
|
}
|
|
|
|
// 获取总数
|
|
var total int64
|
|
query.Count(&total)
|
|
|
|
// 获取分页数据
|
|
var jobs []model.AI3DJob
|
|
offset := (page - 1) * pageSize
|
|
err := query.Order("created_at DESC").Offset(offset).Limit(pageSize).Find(&jobs).Error
|
|
|
|
if err != nil {
|
|
resp.ERROR(c, "获取任务列表失败")
|
|
return
|
|
}
|
|
|
|
// 转换为VO
|
|
var jobList []vo.AI3DJob
|
|
for _, job := range jobs {
|
|
var jobVo vo.AI3DJob
|
|
err = utils.CopyObject(job, &jobVo)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
utils.JsonDecode(job.Params, &jobVo.Params)
|
|
jobVo.CreatedAt = job.CreatedAt.Unix()
|
|
jobVo.UpdatedAt = job.UpdatedAt.Unix()
|
|
jobList = append(jobList, jobVo)
|
|
}
|
|
|
|
resp.SUCCESS(c, vo.NewPage(total, page, pageSize, jobList))
|
|
}
|
|
|
|
// GetJobDetail 获取任务详情
|
|
func (h *AI3DHandler) GetJobDetail(c *gin.Context) {
|
|
idStr := c.Param("id")
|
|
id, err := strconv.ParseUint(idStr, 10, 32)
|
|
if err != nil {
|
|
resp.ERROR(c, "无效的任务ID")
|
|
return
|
|
}
|
|
|
|
var job model.AI3DJob
|
|
err = h.db.First(&job, uint(id)).Error
|
|
if err != nil {
|
|
if err == gorm.ErrRecordNotFound {
|
|
resp.ERROR(c, "任务不存在")
|
|
} else {
|
|
resp.ERROR(c, "获取任务详情失败")
|
|
}
|
|
return
|
|
}
|
|
|
|
var jobVo vo.AI3DJob
|
|
err = utils.CopyObject(job, &jobVo)
|
|
if err != nil {
|
|
resp.ERROR(c, "获取任务详情失败")
|
|
return
|
|
}
|
|
utils.JsonDecode(job.Params, &jobVo.Params)
|
|
jobVo.CreatedAt = job.CreatedAt.Unix()
|
|
jobVo.UpdatedAt = job.UpdatedAt.Unix()
|
|
resp.SUCCESS(c, jobVo)
|
|
}
|
|
|
|
// DeleteJob 删除任务
|
|
func (h *AI3DHandler) DeleteJob(c *gin.Context) {
|
|
idStr := c.Param("id")
|
|
id, err := strconv.ParseUint(idStr, 10, 32)
|
|
if err != nil {
|
|
resp.ERROR(c, "无效的任务ID")
|
|
return
|
|
}
|
|
|
|
// 检查任务是否存在
|
|
var job model.AI3DJob
|
|
err = h.db.First(&job, uint(id)).Error
|
|
if err != nil {
|
|
if err == gorm.ErrRecordNotFound {
|
|
resp.ERROR(c, "任务不存在")
|
|
} else {
|
|
resp.ERROR(c, "获取任务失败")
|
|
}
|
|
return
|
|
}
|
|
|
|
// 删除任务
|
|
err = h.db.Delete(&job).Error
|
|
if err != nil {
|
|
resp.ERROR(c, "删除任务失败")
|
|
return
|
|
}
|
|
|
|
resp.SUCCESS(c, "删除成功")
|
|
}
|
|
|
|
// GetStats 获取统计数据
|
|
func (h *AI3DHandler) GetStats(c *gin.Context) {
|
|
var stats struct {
|
|
Pending int64 `json:"pending"`
|
|
Processing int64 `json:"processing"`
|
|
Success int64 `json:"success"`
|
|
Failed int64 `json:"failed"`
|
|
}
|
|
|
|
// 统计各状态的任务数量
|
|
h.db.Model(&model.AI3DJob{}).Where("status = ?", "pending").Count(&stats.Pending)
|
|
h.db.Model(&model.AI3DJob{}).Where("status = ?", "processing").Count(&stats.Processing)
|
|
h.db.Model(&model.AI3DJob{}).Where("status = ?", "success").Count(&stats.Success)
|
|
h.db.Model(&model.AI3DJob{}).Where("status = ?", "failed").Count(&stats.Failed)
|
|
|
|
resp.SUCCESS(c, stats)
|
|
}
|
|
|
|
// GetModels 获取配置
|
|
func (h *AI3DHandler) GetModels(c *gin.Context) {
|
|
models := h.service.GetSupportedModels()
|
|
resp.SUCCESS(c, models)
|
|
}
|
|
|
|
// SaveGlobalSettings 保存全局配置
|
|
func (h *AI3DHandler) SaveConfig(c *gin.Context) {
|
|
var config types.AI3DConfig
|
|
err := c.ShouldBindJSON(&config)
|
|
if err != nil {
|
|
resp.ERROR(c, "参数错误")
|
|
return
|
|
}
|
|
var exist model.Config
|
|
err = h.db.Where("name", types.ConfigKeyAI3D).First(&exist).Error
|
|
if err != nil {
|
|
exist.Name = types.ConfigKeyAI3D
|
|
exist.Value = utils.JsonEncode(config)
|
|
err = h.db.Create(&exist).Error
|
|
} else {
|
|
exist.Value = utils.JsonEncode(config)
|
|
err = h.db.Updates(&exist).Error
|
|
}
|
|
if err != nil {
|
|
resp.ERROR(c, "保存配置失败")
|
|
return
|
|
}
|
|
|
|
h.service.UpdateConfig(config)
|
|
h.app.SysConfig.AI3D = config
|
|
|
|
resp.SUCCESS(c, "保存成功")
|
|
}
|