feat: 添加工作流取消与临时文件管理功能
- 新增临时文件(FileTemp)的实体、DAO和DTO,支持文件临时存储与批量操作 - 实现工作流执行取消功能,使用sync.Map管理context.CancelFunc,支持按会话取消运行中的流程 - 将流程执行状态"暂停"变更为"取消",并处理取消导致的错误 - 引入IsDialogue标识区分对话模式,调整判断/文案/图片节点的表单数据组装逻辑 - 重构ComposeMessagesReq,使用BuildType替代IsBuild和ModelTypeId - 优化HTML内容提取逻辑,修复文案纯文本与图片URL的标签过滤及标签命名 - 在结果汇总节点中使用事务更新执行状态并批量保存输出文件记录
This commit is contained in:
@@ -5,7 +5,11 @@ import (
|
||||
skillDto "ai-agent/workflow/model/dto/skill"
|
||||
"ai-agent/workflow/model/entity"
|
||||
"context"
|
||||
"fmt"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"gitea.com/red-future/common/beans"
|
||||
commonHttp "gitea.com/red-future/common/http"
|
||||
"gitea.com/red-future/common/utils"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
@@ -34,25 +38,105 @@ func IsAdmin(ctx context.Context) (res bool, err error) {
|
||||
}
|
||||
|
||||
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 := 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,
|
||||
Category: req.Category,
|
||||
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 := 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 := IsAdmin(ctx)
|
||||
if err != nil {
|
||||
@@ -68,6 +152,49 @@ func (s *skillUserService) Delete(ctx context.Context, req *skillDto.DeleteSkill
|
||||
return
|
||||
}
|
||||
|
||||
func (s *skillUserService) Get(ctx context.Context, req *skillDto.GetSkillUserReq) (res *skillDto.SkillUserVO, err error) {
|
||||
admin, err := 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 := IsAdmin(ctx)
|
||||
if err != nil {
|
||||
@@ -128,3 +255,46 @@ func (s *skillUserService) ListUser(ctx context.Context, req *skillDto.ListSkill
|
||||
|
||||
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
|
||||
var userList *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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user