瀏覽代碼

fix:模型框架

Roc 2 月之前
父節點
當前提交
48aafeb9e9

+ 633 - 0
controllers/data_manage/ai_predict_model/framework.go

@@ -0,0 +1,633 @@
+package ai_predict_model
+
+import (
+	"encoding/json"
+	"eta/eta_api/controllers"
+	"eta/eta_api/models"
+	aiPredictModel "eta/eta_api/models/ai_predict_model"
+	"eta/eta_api/utils"
+	"fmt"
+	"strings"
+	"time"
+)
+
+// AiPredictModelFrameworkController 模型框架
+type AiPredictModelFrameworkController struct {
+	controllers.BaseAuthController
+}
+
+// List
+// @Title 列表
+// @Description 列表
+// @Param   AdminId		query	int		false	"创建人ID"
+// @Param   Visibility	query	int		false	"范围: 0-所有; 1-私有; 2-公开"
+// @Param   Keyword		query	string	false	"关键词"
+// @Success 200 Ret=200 获取成功
+// @router /framework/list [get]
+func (c *AiPredictModelFrameworkController) List() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	adminId, _ := c.GetInt("AdminId")
+	keyword := c.GetString("Keyword")
+	keyword = strings.TrimSpace(keyword)
+
+	frameworkOb := new(aiPredictModel.AiPredictModelFramework)
+
+	cond := ``
+	pars := make([]interface{}, 0)
+	if adminId > 0 {
+		cond += fmt.Sprintf(` AND %s = ?`, aiPredictModel.AiPredictModelFrameworkColumns.AdminId)
+		pars = append(pars, adminId)
+	}
+	if keyword != "" {
+		cond += fmt.Sprintf(` AND %s LIKE ?`, aiPredictModel.AiPredictModelFrameworkColumns.FrameworkName)
+		pars = append(pars, "%"+keyword+"%")
+	}
+
+	orderRule := `sort ASC, create_time DESC`
+	list, e := frameworkOb.GetItemsByCondition(cond, pars, []string{}, orderRule)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取框架列表失败, Err: " + e.Error()
+		return
+	}
+	resp := make([]*aiPredictModel.AiPredictModelFrameworkItem, 0)
+	for _, v := range list {
+		t := aiPredictModel.FormatAiPredictModelFramework2Item(v, make([]*aiPredictModel.AiPredictModelFrameworkNodeItem, 0))
+		resp = append(resp, t)
+	}
+
+	br.Data = resp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// Add
+// @Title 新增框架
+// @Description 新增框架
+// @Param	request	body aiPredictModel.AiPredictModelFrameworkAddReq true "type json string"
+// @Success 200 Ret=200 操作成功
+// @router /framework/add [post]
+func (c *AiPredictModelFrameworkController) Add() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	// 参数校验
+	var req aiPredictModel.AiPredictModelFrameworkAddReq
+	if e := json.Unmarshal(c.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+	req.FrameworkName = strings.TrimSpace(req.FrameworkName)
+	if req.FrameworkName == "" {
+		br.Msg = "框架名称不可为空"
+		return
+	}
+
+	// 重名校验
+	{
+		ob := new(aiPredictModel.AiPredictModelFramework)
+		cond := fmt.Sprintf(` AND %s = ? AND %s = ?`, aiPredictModel.AiPredictModelFrameworkColumns.FrameworkName, aiPredictModel.AiPredictModelFrameworkColumns.AdminId)
+		pars := make([]interface{}, 0)
+		pars = append(pars, req.FrameworkName, sysUser.AdminId)
+		exist, e := ob.GetItemByCondition(cond, pars)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			br.Msg = "操作失败"
+			br.ErrMsg = "获取重名框架失败, Err: " + e.Error()
+			return
+		}
+		if exist != nil {
+			br.Msg = "框架名称已存在,请重新输入"
+			return
+		}
+	}
+
+	now := time.Now().Local()
+	frameworkCode := utils.MD5(fmt.Sprint(now.UnixMilli()))
+	item := new(aiPredictModel.AiPredictModelFramework)
+	item.FrameworkName = req.FrameworkName
+	item.FrameworkCode = frameworkCode
+	item.FrameworkImg = req.FrameworkImg
+	item.FrameworkContent = req.FrameworkContent
+	item.AdminId = sysUser.AdminId
+	item.AdminName = sysUser.RealName
+	item.CreateTime = now
+	item.ModifyTime = now
+	nodes := make([]*aiPredictModel.AiPredictModelFrameworkNode, 0)
+	itemNodes := make([]*aiPredictModel.AiPredictModelFrameworkNodeItem, 0)
+	if len(req.Nodes) > 0 {
+		for _, v := range req.Nodes {
+			if v.AiPredictModelIndexId <= 0 {
+				continue
+			}
+			t := new(aiPredictModel.AiPredictModelFrameworkNode)
+			t.FrameworkName = req.FrameworkName
+			t.NodeId = v.NodeId
+			t.NodeName = v.NodeName
+			t.AiPredictModelIndexId = v.AiPredictModelIndexId
+			t.CreateTime = now
+			nodes = append(nodes, t)
+			num := 1
+			// 响应节点数据
+			td := aiPredictModel.FormatAiPredictModelFrameworkNode2Item(t, num)
+			itemNodes = append(itemNodes, td)
+		}
+	}
+	if e := item.CreateFrameworkAndNodes(item, nodes); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "新增框架及节点失败, Err: " + e.Error()
+		return
+	}
+	detail := aiPredictModel.FormatAiPredictModelFramework2Item(item, itemNodes)
+
+	br.Data = detail
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+	br.IsAddLog = true
+}
+
+// Edit
+// @Title 编辑框架
+// @Description 编辑框架
+// @Param	request	body aiPredictModel.AiPredictModelFrameworkEditReq true "type json string"
+// @Success 200 Ret=200 操作成功
+// @router /framework/edit [post]
+func (c *AiPredictModelFrameworkController) Edit() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	// 参数校验
+	var req aiPredictModel.AiPredictModelFrameworkEditReq
+	if e := json.Unmarshal(c.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+	if req.AiPredictModelFrameworkId <= 0 {
+		br.Msg = "参数有误"
+		br.ErrMsg = fmt.Sprintf("参数有误, AiPredictModelFrameworkId: %d", req.AiPredictModelFrameworkId)
+		return
+	}
+	req.FrameworkName = strings.TrimSpace(req.FrameworkName)
+	if req.FrameworkName == "" {
+		br.Msg = "框架名称不可为空"
+		return
+	}
+
+	frameworkOb := new(aiPredictModel.AiPredictModelFramework)
+	item, e := frameworkOb.GetItemById(req.AiPredictModelFrameworkId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "框架不存在, 请刷新页面"
+			return
+		}
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取框架失败, Err: " + e.Error()
+		return
+	}
+
+	// 操作权限校验
+	if item.AdminId != sysUser.AdminId && utils.IsAdminRole(sysUser.RoleTypeCode) {
+		br.Msg = "您没有权限操作该框架"
+		return
+	}
+
+	// 重名校验
+	{
+		ob := new(aiPredictModel.AiPredictModelFramework)
+		cond := fmt.Sprintf(` AND %s <> ? AND %s = ? AND %s = ?`, ob.PrimaryId(), aiPredictModel.AiPredictModelFrameworkColumns.FrameworkName, aiPredictModel.AiPredictModelFrameworkColumns.AdminId)
+		pars := make([]interface{}, 0)
+		pars = append(pars, req.AiPredictModelFrameworkId, req.FrameworkName, sysUser.AdminId)
+		exist, e := ob.GetItemByCondition(cond, pars)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			br.Msg = "操作失败"
+			br.ErrMsg = "获取重名框架失败, Err: " + e.Error()
+			return
+		}
+		if exist != nil {
+			br.Msg = "框架名称已存在,请重新输入"
+			return
+		}
+	}
+
+	now := time.Now().Local()
+	item.FrameworkName = req.FrameworkName
+	item.FrameworkImg = req.FrameworkImg
+	item.FrameworkContent = req.FrameworkContent
+	item.ModifyTime = now
+	updateCols := []string{"FrameworkName", "FrameworkImg", "FrameworkContent", "ModifyTime"}
+	nodes := make([]*aiPredictModel.AiPredictModelFrameworkNode, 0)
+	itemNodes := make([]*aiPredictModel.AiPredictModelFrameworkNodeItem, 0)
+	if len(req.Nodes) > 0 {
+		for _, v := range req.Nodes {
+			if v.AiPredictModelIndexId <= 0 {
+				continue
+			}
+			t := new(aiPredictModel.AiPredictModelFrameworkNode)
+			t.AiPredictModelFrameworkId = req.AiPredictModelFrameworkId
+			t.FrameworkName = req.FrameworkName
+			t.NodeId = v.NodeId
+			t.NodeName = v.NodeName
+			t.AiPredictModelIndexId = v.AiPredictModelIndexId
+			t.CreateTime = now
+			nodes = append(nodes, t)
+
+			// 响应节点数据
+			td := aiPredictModel.FormatAiPredictModelFrameworkNode2Item(t, 1)
+			itemNodes = append(itemNodes, td)
+		}
+	}
+	if e := item.EditFrameworkAndNodes(item, updateCols, nodes); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "编辑框架及节点失败, Err: " + e.Error()
+		return
+	}
+	detail := aiPredictModel.FormatAiPredictModelFramework2Item(item, itemNodes)
+
+	br.Data = detail
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+	br.IsAddLog = true
+}
+
+// Remove
+// @Title 删除框架
+// @Description 删除视频
+// @Param	request	body aiPredictModel.AiPredictModelFrameworkRemoveReq true "type json string"
+// @Success 200 Ret=200 操作成功
+// @router /framework/remove [post]
+func (c *AiPredictModelFrameworkController) Remove() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	// 参数校验
+	var req aiPredictModel.AiPredictModelFrameworkRemoveReq
+	if e := json.Unmarshal(c.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+	if req.AiPredictModelFrameworkId <= 0 {
+		br.Msg = "参数有误"
+		br.ErrMsg = fmt.Sprintf("参数有误, AiPredictModelFrameworkId: %d", req.AiPredictModelFrameworkId)
+		return
+	}
+
+	ob := new(aiPredictModel.AiPredictModelFramework)
+	item, e := ob.GetItemById(req.AiPredictModelFrameworkId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Ret = 200
+			br.Success = true
+			br.Msg = "操作成功"
+			return
+		}
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取框架失败, Err: " + e.Error()
+		return
+	}
+	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN && item.AdminId != sysUser.AdminId {
+		br.Msg = "无权操作"
+		return
+	}
+
+	if e := item.RemoveFrameworkAndNodes(req.AiPredictModelFrameworkId); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "删除框架失败, Err: " + e.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+	br.IsAddLog = true
+}
+
+// Rename
+// @Title 重命名框架
+// @Description 重命名框架
+// @Param	request	body aiPredictModel.AiPredictModelFrameworkRenameReq true "type json string"
+// @Success 200 Ret=200 操作成功
+// @router /framework/rename [post]
+func (c *AiPredictModelFrameworkController) Rename() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	// 参数校验
+	var req aiPredictModel.AiPredictModelFrameworkRenameReq
+	if e := json.Unmarshal(c.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+	if req.AiPredictModelFrameworkId <= 0 {
+		br.Msg = "参数有误"
+		br.ErrMsg = fmt.Sprintf("参数有误, AiPredictModelFrameworkId: %d", req.AiPredictModelFrameworkId)
+		return
+	}
+	req.FrameworkName = strings.TrimSpace(req.FrameworkName)
+	if req.FrameworkName == "" {
+		br.Msg = "框架名称不可为空"
+		return
+	}
+
+	frameworkOb := new(aiPredictModel.AiPredictModelFramework)
+	item, e := frameworkOb.GetItemById(req.AiPredictModelFrameworkId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "框架不存在, 请刷新页面"
+			return
+		}
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取框架失败, Err: " + e.Error()
+		return
+	}
+
+	// 操作权限校验
+	if item.AdminId != sysUser.AdminId && utils.IsAdminRole(sysUser.RoleTypeCode) {
+		br.Msg = "您没有权限操作该框架"
+		return
+	}
+
+	// 重名校验
+	{
+		ob := new(aiPredictModel.AiPredictModelFramework)
+		cond := fmt.Sprintf(` AND %s <> ? AND %s = ? AND %s = ?`, ob.PrimaryId(), aiPredictModel.AiPredictModelFrameworkColumns.FrameworkName, aiPredictModel.AiPredictModelFrameworkColumns.AdminId)
+		pars := make([]interface{}, 0)
+		pars = append(pars, req.AiPredictModelFrameworkId, req.FrameworkName, sysUser.AdminId)
+		exist, e := ob.GetItemByCondition(cond, pars)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			br.Msg = "操作失败"
+			br.ErrMsg = "获取重名框架失败, Err: " + e.Error()
+			return
+		}
+		if exist != nil {
+			br.Msg = "框架名称已存在,请重新输入"
+			return
+		}
+	}
+
+	now := time.Now().Local()
+	item.FrameworkName = req.FrameworkName
+	item.ModifyTime = now
+	updateCols := []string{"FrameworkName", "ModifyTime"}
+	if e := item.Update(updateCols); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "框架重命名失败, Err: " + e.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// Move
+// @Title 移动排序
+// @Description 移动排序
+// @Param	request	body aiPredictModel.AiPredictModelFrameworkMoveReq true "type json string"
+// @Success 200 Ret=200 操作成功
+// @router /framework/move [post]
+func (c *AiPredictModelFrameworkController) Move() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	// 参数校验
+	var req aiPredictModel.AiPredictModelFrameworkMoveReq
+	if e := json.Unmarshal(c.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+	if req.AiPredictModelFrameworkId <= 0 {
+		br.Msg = "参数有误"
+		br.ErrMsg = fmt.Sprintf("参数有误, AiPredictModelFrameworkId: %d", req.AiPredictModelFrameworkId)
+		return
+	}
+
+	frameworkOb := new(aiPredictModel.AiPredictModelFramework)
+	item, e := frameworkOb.GetItemById(req.AiPredictModelFrameworkId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "框架不存在, 请刷新页面"
+			return
+		}
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取框架失败, Err: " + e.Error()
+		return
+	}
+
+	updateCols := make([]string, 0)
+	// 上一个兄弟节点
+	if req.PrevAiPredictModelFrameworkId > 0 {
+		prev, e := frameworkOb.GetItemById(req.PrevAiPredictModelFrameworkId)
+		if e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "获取上一个兄弟节点失败, Err: " + e.Error()
+			return
+		}
+
+		// 两个兄弟节点之间
+		if req.NextAiPredictModelFrameworkId > 0 {
+			next, e := frameworkOb.GetItemById(req.PrevAiPredictModelFrameworkId)
+			if e != nil {
+				br.Msg = "操作失败"
+				br.ErrMsg = "获取下一个兄弟节点失败, Err: " + e.Error()
+				return
+			}
+			// 如果上一个与下一个排序权重是一致的, 那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2, 自己变成上一个兄弟的排序权重+1
+			if prev.Sort == next.Sort || prev.Sort == item.Sort {
+				strUpdate := `sort + 2`
+				_ = aiPredictModel.UpdateAiPredictModelFrameworkSort(sysUser.AdminId, prev.AiPredictModelFrameworkId, prev.Sort, strUpdate)
+			} else {
+				// 如果下一个排序权重正好是上一个节点的下一层, 那么需要再加一层了
+				if next.Sort-prev.Sort == 1 {
+					//变更兄弟节点的排序
+					strUpdate := `sort + 1`
+					_ = aiPredictModel.UpdateAiPredictModelFrameworkSort(sysUser.AdminId, 0, prev.Sort, strUpdate)
+				}
+			}
+		}
+
+		// 上一个兄弟节点sort+1
+		item.Sort = prev.Sort + 1
+		item.ModifyTime = time.Now()
+		updateCols = append(updateCols, "Sort", "ModifyTime")
+	} else {
+		first, err := aiPredictModel.GetFirstAiPredictModelFramework(sysUser.AdminId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "操作失败"
+			br.ErrMsg = "获取我的模型框架排首位的数据失败, Err:" + err.Error()
+			return
+		}
+		if first != nil && first.Sort == 0 {
+			strUpdate := ` sort + 1 `
+			_ = aiPredictModel.UpdateAiPredictModelFrameworkSort(sysUser.AdminId, first.AiPredictModelFrameworkId-1, 0, strUpdate)
+		}
+
+		// 排首位
+		item.Sort = 0
+		item.ModifyTime = time.Now()
+		updateCols = append(updateCols, "Sort", "ModifyTime")
+	}
+
+	if len(updateCols) > 0 {
+		if e := item.Update(updateCols); e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "更新框架排序失败, Err: " + e.Error()
+			return
+		}
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// Detail
+// @Title 框架详情
+// @Description 框架详情
+// @Param   AiPredictModelFrameworkId  query  int  true  "框架ID"
+// @Success 200 Ret=200 操作成功
+// @router /framework/detail [get]
+func (c *AiPredictModelFrameworkController) Detail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	frameworkId, _ := c.GetInt("AiPredictModelFrameworkId")
+	if frameworkId <= 0 {
+		br.Msg = "参数有误"
+		br.ErrMsg = fmt.Sprintf("参数有误, AiPredictModelFrameworkId: %d", frameworkId)
+		return
+	}
+
+	frameworkOb := new(aiPredictModel.AiPredictModelFramework)
+	item, e := frameworkOb.GetItemById(frameworkId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "框架不存在, 请刷新页面"
+			return
+		}
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取框架失败, Err: " + e.Error()
+		return
+	}
+
+	// 获取节点
+	nodeOb := new(aiPredictModel.AiPredictModelFrameworkNode)
+	nodeCond := ` AND ai_predict_model_framework_id = ?`
+	nodePars := make([]interface{}, 0)
+	nodePars = append(nodePars, frameworkId)
+	nodes, e := nodeOb.GetItemsByCondition(nodeCond, nodePars, []string{}, "")
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取框架节点失败, Err: " + e.Error()
+		return
+	}
+
+	// 格式化响应数据
+	itemNodes := make([]*aiPredictModel.AiPredictModelFrameworkNodeItem, 0)
+	for _, v := range nodes {
+		if v.NodeId == "" {
+			continue
+		}
+		num := 1
+		itemNodes = append(itemNodes, aiPredictModel.FormatAiPredictModelFrameworkNode2Item(v, num))
+	}
+	detail := aiPredictModel.FormatAiPredictModelFramework2Item(item, itemNodes)
+
+	br.Data = detail
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 358 - 0
models/ai_predict_model/ai_predict_model_framework.go

@@ -0,0 +1,358 @@
+package data_manage
+
+import (
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strings"
+	"time"
+)
+
+// AiPredictModelFramework 图库框架表
+type AiPredictModelFramework struct {
+	AiPredictModelFrameworkId int       `orm:"column(ai_predict_model_framework_id);pk"`
+	FrameworkCode             string    `description:"框架唯一编码"`
+	FrameworkName             string    `description:"框架名称"`
+	FrameworkImg              string    `description:"框架图片"`
+	FrameworkContent          string    `description:"框架内容"`
+	IsPublic                  int       `description:"是否公开:0-私有;1-公开"`
+	PublicTime                time.Time `description:"公开时间"`
+	Sort                      int       `description:"排序"`
+	AdminId                   int       `description:"创建人ID"`
+	AdminName                 string    `description:"创建人姓名"`
+	CreateTime                time.Time `description:"创建时间"`
+	ModifyTime                time.Time `description:"更新时间"`
+}
+
+func (m *AiPredictModelFramework) TableName() string {
+	return "ai_predict_model_framework"
+}
+
+func (m *AiPredictModelFramework) PrimaryId() string {
+	return AiPredictModelFrameworkColumns.AiPredictModelFrameworkId
+}
+
+var AiPredictModelFrameworkColumns = struct {
+	AiPredictModelFrameworkId string
+	FrameworkCode             string
+	FrameworkName             string
+	FrameworkImg              string
+	FrameworkContent          string
+	IsPublic                  string
+	PublicTime                string
+	Sort                      string
+	AdminId                   string
+	AdminName                 string
+	CreateTime                string
+	ModifyTime                string
+}{
+	AiPredictModelFrameworkId: "ai_predict_model_framework_id",
+	FrameworkCode:             "framework_code",
+	FrameworkName:             "framework_name",
+	FrameworkImg:              "framework_img",
+	FrameworkContent:          "framework_content",
+	IsPublic:                  "is_public",
+	PublicTime:                "public_time",
+	Sort:                      "sort",
+	AdminId:                   "admin_id",
+	AdminName:                 "admin_name",
+	CreateTime:                "create_time",
+	ModifyTime:                "modify_time",
+}
+
+func (m *AiPredictModelFramework) Create() (err error) {
+	o := orm.NewOrmUsingDB("data")
+	id, err := o.Insert(m)
+	if err != nil {
+		return
+	}
+	m.AiPredictModelFrameworkId = int(id)
+	return
+}
+
+func (m *AiPredictModelFramework) CreateMulti(items []*AiPredictModelFramework) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.InsertMulti(len(items), items)
+	return
+}
+
+func (m *AiPredictModelFramework) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Update(m, cols...)
+	return
+}
+
+func (m *AiPredictModelFramework) Del() (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
+	_, err = o.Raw(sql, m.AiPredictModelFrameworkId).Exec()
+	return
+}
+
+func (m *AiPredictModelFramework) GetItemById(id int) (item *AiPredictModelFramework, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
+	err = o.Raw(sql, id).QueryRow(&item)
+	return
+}
+
+func (m *AiPredictModelFramework) GetItemByCondition(condition string, pars []interface{}) (item *AiPredictModelFramework, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s LIMIT 1`, m.TableName(), condition)
+	err = o.Raw(sql, pars).QueryRow(&item)
+	return
+}
+
+func (m *AiPredictModelFramework) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+func (m *AiPredictModelFramework) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*AiPredictModelFramework, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+func (m *AiPredictModelFramework) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*AiPredictModelFramework, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+func (m *AiPredictModelFramework) CreateFrameworkAndNodes(item *AiPredictModelFramework, nodes []*AiPredictModelFrameworkNode) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	tx, e := o.Begin()
+	if e != nil {
+		err = fmt.Errorf("orm begin err: %s", e.Error())
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = tx.Rollback()
+			return
+		}
+		_ = tx.Commit()
+	}()
+
+	id, e := tx.Insert(item)
+	if e != nil {
+		err = fmt.Errorf("insert framework err: %s", e.Error())
+		return
+	}
+	newId := int(id)
+	item.AiPredictModelFrameworkId = newId
+
+	if len(nodes) > 0 {
+		for _, n := range nodes {
+			n.AiPredictModelFrameworkId = newId
+		}
+		_, e = tx.InsertMulti(len(nodes), nodes)
+		if e != nil {
+			err = fmt.Errorf("insert multi nodes err: %s", e.Error())
+			return
+		}
+	}
+	return
+}
+
+func (m *AiPredictModelFramework) EditFrameworkAndNodes(item *AiPredictModelFramework, updateCols []string, nodes []*AiPredictModelFrameworkNode) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	tx, e := o.Begin()
+	if e != nil {
+		err = fmt.Errorf("orm begin err: %s", e.Error())
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = tx.Rollback()
+			return
+		}
+		_ = tx.Commit()
+	}()
+
+	_, e = tx.Update(item, updateCols...)
+	if e != nil {
+		err = fmt.Errorf("framework update err: %s", e.Error())
+		return
+	}
+
+	sql := `DELETE FROM ai_predict_model_framework_node WHERE ai_predict_model_framework_id = ?`
+	_, e = tx.Raw(sql, item.AiPredictModelFrameworkId).Exec()
+	if e != nil {
+		err = fmt.Errorf("clear nodes err: %s", e.Error())
+		return
+	}
+	if len(nodes) > 0 {
+		_, e = tx.InsertMulti(len(nodes), nodes)
+		if e != nil {
+			err = fmt.Errorf("insert multi nodes err: %s", e.Error())
+			return
+		}
+	}
+	return
+}
+
+func (m *AiPredictModelFramework) RemoveFrameworkAndNodes(frameworkId int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	tx, e := o.Begin()
+	if e != nil {
+		err = fmt.Errorf("orm begin err: %s", e.Error())
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = tx.Rollback()
+			return
+		}
+		_ = tx.Commit()
+	}()
+
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
+	_, e = tx.Raw(sql, frameworkId).Exec()
+	if e != nil {
+		err = fmt.Errorf("delete framework err: %s", e.Error())
+		return
+	}
+
+	sql = `DELETE FROM ai_predict_model_framework_node WHERE ai_predict_model_framework_id = ?`
+	_, e = tx.Raw(sql, frameworkId).Exec()
+	if e != nil {
+		err = fmt.Errorf("clear nodes err: %s", e.Error())
+		return
+	}
+	return
+}
+
+// AiPredictModelFrameworkAddReq 图库框架新增请求体
+type AiPredictModelFrameworkAddReq struct {
+	FrameworkName    string                           `description:"框架名称"`
+	FrameworkImg     string                           `description:"框架图片"`
+	FrameworkContent string                           `description:"框架内容"`
+	Nodes            []AiPredictModelFrameworkNodeReq `description:"框架节点"`
+}
+
+// AiPredictModelFrameworkNodeReq 图库框架节点请求体
+type AiPredictModelFrameworkNodeReq struct {
+	AiPredictModelIndexId int    `description:"模型标的ID"`
+	NodeId                string `description:"节点ID"`
+	NodeName              string `description:"节点名称"`
+}
+
+// AiPredictModelFrameworkEditReq 图库框架编辑请求体
+type AiPredictModelFrameworkEditReq struct {
+	AiPredictModelFrameworkId int `description:"图库框架ID"`
+	AiPredictModelFrameworkAddReq
+}
+
+// AiPredictModelFrameworkRemoveReq 图库框架编辑请求体
+type AiPredictModelFrameworkRemoveReq struct {
+	AiPredictModelFrameworkId int `description:"图库框架ID"`
+}
+
+// AiPredictModelFrameworkRenameReq 图库框架重命名请求体
+type AiPredictModelFrameworkRenameReq struct {
+	AiPredictModelFrameworkId int    `description:"图库框架ID"`
+	FrameworkName             string `description:"框架名称"`
+}
+
+// AiPredictModelFrameworkEditPublicReq 图库框架编辑公开请求体
+type AiPredictModelFrameworkEditPublicReq struct {
+	AiPredictModelFrameworkId int `description:"图库框架ID"`
+	IsPublic                  int `description:"0-隐藏公开; 1-公开"`
+}
+
+// AiPredictModelFrameworkMoveReq 图库框架移动排序请求体
+type AiPredictModelFrameworkMoveReq struct {
+	AiPredictModelFrameworkId     int `description:"图库框架ID"`
+	PrevAiPredictModelFrameworkId int `description:"上一个框架ID"`
+	NextAiPredictModelFrameworkId int `description:"下一个框架ID"`
+}
+
+// UpdateAiPredictModelFrameworkSort 更新我的图库框架排序
+func UpdateAiPredictModelFrameworkSort(adminId, frameworkId, current int, updates string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`UPDATE ai_predict_model_framework SET sort = %s WHERE admin_id = ? and sort > ?`, updates)
+	if frameworkId > 0 {
+		sql += ` OR (ai_predict_model_framework_id > ` + fmt.Sprint(frameworkId) + ` AND sort = ` + fmt.Sprint(current) + `)`
+	}
+	_, err = o.Raw(sql, adminId, current).Exec()
+	return
+}
+
+// GetFirstAiPredictModelFramework 获取我的图库框架排首位的数据
+func GetFirstAiPredictModelFramework(adminId int) (item *AiPredictModelFramework, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM ai_predict_model_framework WHERE admin_id = ? ORDER BY sort ASC,ai_predict_model_framework_id ASC LIMIT 1`
+	err = o.Raw(sql, adminId).QueryRow(&item)
+	return
+}
+
+// AiPredictModelFrameworkItem 图库框架表信息
+type AiPredictModelFrameworkItem struct {
+	AiPredictModelFrameworkId int                                `description:"框架ID"`
+	FrameworkCode             string                             `description:"框架唯一编码"`
+	FrameworkName             string                             `description:"框架名称"`
+	FrameworkImg              string                             `description:"框架图片"`
+	FrameworkContent          string                             `description:"框架内容"`
+	IsPublic                  int                                `description:"是否公开:0-私有;1-公开"`
+	PublicTime                string                             `description:"公开时间"`
+	Sort                      int                                `description:"排序"`
+	AdminId                   int                                `description:"创建人ID"`
+	AdminName                 string                             `description:"创建人姓名"`
+	CreateTime                string                             `description:"创建时间"`
+	ModifyTime                string                             `description:"更新时间"`
+	Nodes                     []*AiPredictModelFrameworkNodeItem `description:"框架节点"`
+}
+
+// FormatAiPredictModelFramework2Item 格式化框架信息
+func FormatAiPredictModelFramework2Item(origin *AiPredictModelFramework, nodes []*AiPredictModelFrameworkNodeItem) (item *AiPredictModelFrameworkItem) {
+	if origin == nil {
+		return
+	}
+	item = new(AiPredictModelFrameworkItem)
+	item.AiPredictModelFrameworkId = origin.AiPredictModelFrameworkId
+	item.FrameworkCode = origin.FrameworkCode
+	item.FrameworkName = origin.FrameworkName
+	item.FrameworkImg = origin.FrameworkImg
+	item.FrameworkContent = origin.FrameworkContent
+	item.IsPublic = origin.IsPublic
+	item.PublicTime = utils.TimeTransferString(utils.FormatDateTime, origin.PublicTime)
+	item.Sort = origin.Sort
+	item.AdminId = origin.AdminId
+	item.AdminName = origin.AdminName
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	item.Nodes = nodes
+	return
+}
+
+// AiPredictModelFrameworkPublicMenuItem 公开框架目录
+type AiPredictModelFrameworkPublicMenuItem struct {
+	AdminId    int                            `description:"创建人ID"`
+	MenuName   string                         `description:"目录名称"`
+	Frameworks []*AiPredictModelFrameworkItem `description:"框架列表"`
+}

+ 140 - 0
models/ai_predict_model/ai_predict_model_framework_node.go

@@ -0,0 +1,140 @@
+package data_manage
+
+import (
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strings"
+	"time"
+)
+
+// AiPredictModelFrameworkNode 图库框架节点表
+type AiPredictModelFrameworkNode struct {
+	AiPredictModelFrameworkNodeId int       `orm:"column(ai_predict_model_framework_node_id);pk"`
+	AiPredictModelFrameworkId     int       `description:"框架ID"`
+	FrameworkName                 string    `description:"框架名称"`
+	NodeId                        string    `description:"节点ID"`
+	NodeName                      string    `description:"节点名称"`
+	AiPredictModelIndexId         int       `description:"我的图表分类ID"`
+	CreateTime                    time.Time `description:"创建时间"`
+}
+
+func (m *AiPredictModelFrameworkNode) TableName() string {
+	return "ai_predict_model_framework_node"
+}
+
+func (m *AiPredictModelFrameworkNode) PrimaryId() string {
+	return "ai_predict_model_framework_node_id"
+}
+
+func (m *AiPredictModelFrameworkNode) Create() (err error) {
+	o := orm.NewOrmUsingDB("data")
+	id, err := o.Insert(m)
+	if err != nil {
+		return
+	}
+	m.AiPredictModelFrameworkNodeId = int(id)
+	return
+}
+
+func (m *AiPredictModelFrameworkNode) CreateMulti(items []*AiPredictModelFrameworkNode) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.InsertMulti(len(items), items)
+	return
+}
+
+func (m *AiPredictModelFrameworkNode) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Update(m, cols...)
+	return
+}
+
+func (m *AiPredictModelFrameworkNode) Del() (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
+	_, err = o.Raw(sql, m.AiPredictModelFrameworkNodeId).Exec()
+	return
+}
+
+func (m *AiPredictModelFrameworkNode) GetItemById(id int) (item *AiPredictModelFrameworkNode, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.PrimaryId())
+	err = o.Raw(sql, id).QueryRow(&item)
+	return
+}
+
+func (m *AiPredictModelFrameworkNode) GetItemByCondition(condition string, pars []interface{}) (item *AiPredictModelFrameworkNode, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s LIMIT 1`, m.TableName(), condition)
+	err = o.Raw(sql, pars).QueryRow(&item)
+	return
+}
+
+func (m *AiPredictModelFrameworkNode) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+func (m *AiPredictModelFrameworkNode) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*AiPredictModelFrameworkNode, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+func (m *AiPredictModelFrameworkNode) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*AiPredictModelFrameworkNode, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// AiPredictModelFrameworkNodeItem 图库框架节点信息
+type AiPredictModelFrameworkNodeItem struct {
+	AiPredictModelFrameworkNodeId int
+	AiPredictModelFrameworkId     int    `description:"框架ID"`
+	FrameworkName                 string `description:"框架名称"`
+	NodeId                        string `description:"节点ID"`
+	NodeName                      string `description:"节点名称"`
+	AiPredictModelIndexId         int    `description:"模型标的ID"`
+	AiPredictModelNum             int    `description:"分类下的图表数"`
+	CreateTime                    string `description:"创建时间"`
+}
+
+// FormatAiPredictModelFrameworkNode2Item 格式化框架节点信息
+func FormatAiPredictModelFrameworkNode2Item(origin *AiPredictModelFrameworkNode, aiPredictModelNum int) (item *AiPredictModelFrameworkNodeItem) {
+	if origin == nil {
+		return
+	}
+	item = new(AiPredictModelFrameworkNodeItem)
+	item.AiPredictModelFrameworkNodeId = origin.AiPredictModelFrameworkNodeId
+	item.AiPredictModelFrameworkId = origin.AiPredictModelFrameworkId
+	item.FrameworkName = origin.FrameworkName
+	item.NodeId = origin.NodeId
+	item.NodeName = origin.NodeName
+	item.AiPredictModelIndexId = origin.AiPredictModelIndexId
+	item.AiPredictModelNum = aiPredictModelNum
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	return
+}

+ 2 - 0
models/db.go

@@ -716,6 +716,8 @@ func initAiPredictModel() {
 		new(aiPredictModel.AiPredictModelData),
 		new(aiPredictModel.AiPredictModelDashboard),
 		new(aiPredictModel.AiPredictModelDashboardDetail),
+		new(aiPredictModel.AiPredictModelFramework),
+		new(aiPredictModel.AiPredictModelFrameworkNode),
 	)
 }
 

+ 63 - 0
routers/commentsRouter.go

@@ -295,6 +295,69 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/ai_predict_model:AiPredictModelFrameworkController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/ai_predict_model:AiPredictModelFrameworkController"],
+        beego.ControllerComments{
+            Method: "Add",
+            Router: `/framework/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/ai_predict_model:AiPredictModelFrameworkController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/ai_predict_model:AiPredictModelFrameworkController"],
+        beego.ControllerComments{
+            Method: "Detail",
+            Router: `/framework/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/ai_predict_model:AiPredictModelFrameworkController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/ai_predict_model:AiPredictModelFrameworkController"],
+        beego.ControllerComments{
+            Method: "Edit",
+            Router: `/framework/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/ai_predict_model:AiPredictModelFrameworkController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/ai_predict_model:AiPredictModelFrameworkController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/framework/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/ai_predict_model:AiPredictModelFrameworkController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/ai_predict_model:AiPredictModelFrameworkController"],
+        beego.ControllerComments{
+            Method: "Move",
+            Router: `/framework/move`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/ai_predict_model:AiPredictModelFrameworkController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/ai_predict_model:AiPredictModelFrameworkController"],
+        beego.ControllerComments{
+            Method: "Remove",
+            Router: `/framework/remove`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/ai_predict_model:AiPredictModelFrameworkController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/ai_predict_model:AiPredictModelFrameworkController"],
+        beego.ControllerComments{
+            Method: "Rename",
+            Router: `/framework/rename`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/ai_predict_model:AiPredictModelIndexController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage/ai_predict_model:AiPredictModelIndexController"],
         beego.ControllerComments{
             Method: "DashboardDetail",

+ 1 - 0
routers/router.go

@@ -430,6 +430,7 @@ func init() {
 			web.NSInclude(
 				&ai_predict_model.AiPredictModelClassifyController{},
 				&ai_predict_model.AiPredictModelIndexController{},
+				&ai_predict_model.AiPredictModelFrameworkController{},
 			),
 		),
 		web.NSNamespace("/residual_analysis",