Files
ai-agent/workflow/service/skill/skill_user_service.go
qhd 03c95c3601 feat: 新增主动拉取与多类型回调功能
- 新增 ActivePull 实体、DAO、DTO 及 Service,支持主动拉取任务管理
- 新增 ComposeCallback、VideoCallback、HttpNodeCallback 多类型回调接口
- FlowExecution 增加 NodeGroupId 和 TotalTokens 字段,支持节点组追踪与 Token 统计
- ExecutedNodes 结构由字符串列表改为包含执行状态的节点对象列表
- 重构回调通知机制,统一 Notify 函数调用
- 优化输出项类型判断逻辑,新增文件类型标识
2026-06-10 14:23:55 +08:00

284 lines
6.6 KiB
Go

package skill
import (
skillDao "ai-agent/workflow/dao/skill"
skillDto "ai-agent/workflow/model/dto/skill"
"ai-agent/workflow/model/entity"
"ai-agent/workflow/service"
"context"
"fmt"
"path/filepath"
"strings"
"gitea.com/red-future/common/beans"
"gitea.com/red-future/common/utils"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/util/gconv"
)
var SkillUserService = &skillUserService{}
type skillUserService struct{}
func (s *skillUserService) Create(ctx context.Context, req *skillDto.CreateSkillUserReq) (res *skillDto.CreateSkillUserRes, err error) {
ext := strings.TrimPrefix(filepath.Ext(req.FileUrl), ".")
if ext != "zip" {
return nil, fmt.Errorf("文件格式不支持,请上传zip格式文件")
}
admin, err := service.UtilService.IsAdmin(ctx)
if err != nil {
return
}
var id int64
if admin {
var count int
count, err = skillDao.SkillTemplateDao.Count(ctx, &skillDto.GetSkillTemplateReq{
Name: req.Name,
})
if err != nil {
return nil, err
}
if count > 0 {
return nil, fmt.Errorf("技能名称 %s 已存在", req.Name)
}
id, err = skillDao.SkillTemplateDao.Insert(ctx, &skillDto.CreateSkillTemplateReq{
Name: req.Name,
Description: req.Description,
FileName: req.FileName,
FileUrl: req.FileUrl,
})
} else {
var user *beans.User
user, err = utils.GetUserInfo(ctx)
if err != nil {
return nil, err
}
var count int
count, err = skillDao.SkillUserDao.Count(ctx, &skillDto.GetSkillUserReq{
Name: req.Name,
Creator: user.UserName,
})
if err != nil {
return nil, err
}
if count > 0 {
return nil, fmt.Errorf("技能名称 %s 已存在", req.Name)
}
id, err = skillDao.SkillUserDao.Insert(ctx, req)
}
return &skillDto.CreateSkillUserRes{Id: id}, err
}
func (s *skillUserService) Update(ctx context.Context, req *skillDto.UpdateSkillUserReq) (err error) {
ext := strings.TrimPrefix(filepath.Ext(req.FileUrl), ".")
if ext != "zip" {
return fmt.Errorf("文件格式不支持,请上传zip格式文件")
}
admin, err := service.UtilService.IsAdmin(ctx)
if err != nil {
return
}
if admin {
var count int
count, err = skillDao.SkillTemplateDao.Count(ctx, &skillDto.GetSkillTemplateReq{
NotInId: req.Id,
Name: req.Name,
})
if err != nil {
return err
}
if count > 0 {
return fmt.Errorf("技能名称 %s 已存在", req.Name)
}
_, err = skillDao.SkillTemplateDao.Update(ctx, &skillDto.UpdateSkillTemplateReq{
Id: req.Id,
Name: req.Name,
Description: req.Description,
FileName: req.FileName,
FileUrl: req.FileUrl,
})
} else {
var user *beans.User
user, err = utils.GetUserInfo(ctx)
if err != nil {
return err
}
var count int
count, err = skillDao.SkillUserDao.Count(ctx, &skillDto.GetSkillUserReq{
NotInId: req.Id,
Name: req.Name,
Creator: user.UserName,
})
if err != nil {
return err
}
if count > 0 {
return fmt.Errorf("技能名称 %s 已存在", req.Name)
}
_, err = skillDao.SkillUserDao.Update(ctx, req)
}
return err
}
func (s *skillUserService) Delete(ctx context.Context, req *skillDto.DeleteSkillUserReq) (err error) {
admin, err := service.UtilService.IsAdmin(ctx)
if err != nil {
return
}
if admin {
_, err = skillDao.SkillTemplateDao.Delete(ctx, &skillDto.DeleteSkillTemplateReq{
Id: req.Id,
})
} else {
_, err = skillDao.SkillUserDao.Delete(ctx, req)
}
return
}
func (s *skillUserService) Get(ctx context.Context, req *skillDto.GetSkillUserReq) (res *skillDto.SkillUserVO, err error) {
admin, err := service.UtilService.IsAdmin(ctx)
if err != nil {
return
}
if admin {
var list *entity.SkillTemplate
list, err = skillDao.SkillTemplateDao.Get(ctx, &skillDto.GetSkillTemplateReq{
Id: req.Id,
})
if err != nil {
return nil, err
}
res = &skillDto.SkillUserVO{}
res.ImgAddressPrefix, err = utils.GetFileAddressPrefix(ctx)
if err != nil {
return nil, err
}
err = gconv.Struct(list, &res)
return
}
user, err := utils.GetUserInfo(ctx)
if err != nil {
return
}
req.Creator = user.UserName
list, err := skillDao.SkillUserDao.Get(ctx, &skillDto.GetSkillUserReq{
Id: req.Id,
})
if err != nil {
return nil, err
}
res = &skillDto.SkillUserVO{}
res.ImgAddressPrefix, err = utils.GetFileAddressPrefix(ctx)
if err != nil {
return nil, err
}
err = gconv.Struct(list, &res)
return
}
func (s *skillUserService) List(ctx context.Context, req *skillDto.ListSkillReq) (res *skillDto.ListSkillUserRes, err error) {
admin, err := service.UtilService.IsAdmin(ctx)
if err != nil {
return
}
if admin {
var total int
var list []*entity.SkillTemplate
list, total, err = skillDao.SkillTemplateDao.List(ctx, &skillDto.ListSkillTemplateReq{
Keyword: req.Keyword,
Page: req.Page,
})
if err != nil {
return nil, err
}
res = &skillDto.ListSkillUserRes{
Total: total,
}
err = gconv.Struct(list, &res.List)
return
}
user, err := utils.GetUserInfo(ctx)
if err != nil {
return
}
req.Creator = user.UserName
list, total, err := skillDao.SkillUserDao.List(ctx, &skillDto.ListSkillUserReq{
Keyword: req.Keyword,
Creator: req.Creator,
Page: req.Page,
})
if err != nil {
return nil, err
}
res = &skillDto.ListSkillUserRes{
Total: total,
}
err = gconv.Struct(list, &res.List)
return
}
func (s *skillUserService) ListUser(ctx context.Context, req *skillDto.ListSkillUserReq) (res *skillDto.ListSkillUserRes, err error) {
user, err := utils.GetUserInfo(ctx)
if err != nil {
return
}
req.Creator = user.UserName
list, total, err := skillDao.SkillUserDao.List(ctx, req)
if err != nil {
return nil, err
}
res = &skillDto.ListSkillUserRes{
Total: total,
}
err = gconv.Struct(list, &res.List)
return
}
func (s *skillUserService) GetUserOrTemplate(ctx context.Context, req *skillDto.GetSkillReq) (res *skillDto.SkillUserVO, err error) {
var list *entity.SkillTemplate
list, err = skillDao.SkillTemplateDao.Get(ctx, &skillDto.GetSkillTemplateReq{
Id: req.Id,
Name: req.Name,
})
if err != nil {
return nil, err
}
if !g.IsEmpty(list) {
res = &skillDto.SkillUserVO{}
res.ImgAddressPrefix, err = utils.GetFileAddressPrefix(ctx)
if err != nil {
return nil, err
}
err = gconv.Struct(list, &res)
return
}
user, err := utils.GetUserInfo(ctx)
if err != nil {
return
}
req.Creator = user.UserName
userList := new(entity.SkillUser)
userList, err = skillDao.SkillUserDao.Get(ctx, &skillDto.GetSkillUserReq{
Id: req.Id,
Creator: user.UserName,
Name: req.Name,
})
if err != nil {
return nil, err
}
res = &skillDto.SkillUserVO{}
res.ImgAddressPrefix, err = utils.GetFileAddressPrefix(ctx)
if err != nil {
return nil, err
}
err = gconv.Struct(userList, &res)
return
}