ziwen il y a 1 an
Parent
commit
665863cf5c
3 fichiers modifiés avec 232 ajouts et 16 suppressions
  1. 153 0
      controllers/sandbox/sandbox.go
  2. 70 16
      models/sandbox/sandbox.go
  3. 9 0
      routers/commentsRouter.go

+ 153 - 0
controllers/sandbox/sandbox.go

@@ -1576,3 +1576,156 @@ func (this *SandboxController) GetSandboxDetail() {
 	br.Msg = msg
 	br.Data = sandboxVersionInfo
 }
+
+// SandboxMove
+// @Title 移动沙盘接口
+// @Description 移动图表接口
+// @Success 200 {object} data_manage.MoveChartInfoReq
+// @router /move [post]
+func (this *SandboxController) SandboxMove() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req sandbox.MoveSandboxReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.SandboxId <= 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "沙盘id小于等于0"
+		return
+	}
+
+	if req.SandboxClassifyId <= 0 {
+		br.Msg = "请选择分类"
+		return
+	}
+	//判断分类是否存在
+	count, _ := sandbox.GetSandboxClassifyCountById(req.SandboxClassifyId)
+	if count <= 0 {
+		br.Msg = "分类已被删除,不可移动,请刷新页面"
+		return
+	}
+
+	sandboxInfo, err := sandbox.GetSandboxById(req.SandboxId)
+	if err != nil {
+		br.Msg = "移动失败"
+		br.ErrMsg = "获取沙盘信息失败,Err:" + err.Error()
+		return
+	}
+
+	//如果改变了分类,那么移动该图表数据
+	if sandboxInfo.SandboxClassifyId != req.SandboxClassifyId {
+		//查询需要修改的分类下是否存在同一个图表名称
+		tmpSandboxInfo, tmpErr := sandbox.GetSandboxByClassifyIdAndName(req.SandboxClassifyId, sandboxInfo.Name)
+		if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+			br.Msg = "移动失败"
+			br.ErrMsg = "移动失败,Err:" + tmpErr.Error()
+			return
+		}
+		if tmpSandboxInfo != nil {
+			br.Msg = "移动失败,同一个分类下沙盘名称不允许重复"
+			br.ErrMsg = "移动失败,同一个分类下沙盘名称不允许重复"
+			return
+		}
+		err = sandbox.MoveSandbox(req.SandboxId, req.SandboxClassifyId)
+		if err != nil {
+			br.Msg = "移动失败"
+			br.ErrMsg = "移动失败,Err:" + err.Error()
+			return
+		}
+	}
+
+	//移动排序
+	updateCol := make([]string, 0)
+	//如果有传入 上一个兄弟节点分类id
+	if req.PrevSandboxId > 0 {
+		prevChartInfo, err := sandbox.GetSandboxById(req.PrevSandboxId)
+		if err != nil {
+			br.Msg = "移动失败"
+			br.ErrMsg = "获取上一个兄弟节点分类信息失败,Err:" + err.Error()
+			return
+		}
+
+		//如果是移动在两个兄弟节点之间
+		if req.NextSandboxId > 0 {
+			//下一个兄弟节点
+			nextChartInfo, err := sandbox.GetSandboxById(req.NextSandboxId)
+			if err != nil {
+				br.Msg = "移动失败"
+				br.ErrMsg = "获取下一个兄弟节点分类信息失败,Err:" + err.Error()
+				return
+			}
+			//如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
+			if prevChartInfo.Sort == nextChartInfo.Sort || prevChartInfo.Sort == sandboxInfo.Sort {
+				//变更兄弟节点的排序
+				updateSortStr := `sort + 2`
+				_ = sandbox.UpdateSandboxSortByClassifyId(prevChartInfo.SandboxClassifyId, prevChartInfo.Sort, prevChartInfo.SandboxId, updateSortStr)
+			} else {
+				//如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
+				if nextChartInfo.Sort-prevChartInfo.Sort == 1 {
+					//变更兄弟节点的排序
+					updateSortStr := `sort + 1`
+					_ = sandbox.UpdateSandboxSortByClassifyId(prevChartInfo.SandboxClassifyId, prevChartInfo.Sort, prevChartInfo.SandboxId, updateSortStr)
+				}
+			}
+		}
+
+		sandboxInfo.Sort = prevChartInfo.Sort + 1
+		sandboxInfo.ModifyTime = time.Now()
+		updateCol = append(updateCol, "Sort", "ModifyTime")
+
+	} else {
+		firstClassify, err := sandbox.GetFirstSandboxByClassifyId(req.SandboxClassifyId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "移动失败"
+			br.ErrMsg = "获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + err.Error()
+			return
+		}
+
+		//如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
+		if firstClassify != nil && firstClassify.Sort == 0 {
+			updateSortStr := ` sort + 1 `
+			_ = sandbox.UpdateSandboxSortByClassifyId(firstClassify.SandboxClassifyId, 0, firstClassify.SandboxId-1, updateSortStr)
+		}
+
+		sandboxInfo.Sort = 0 //那就是排在第一位
+		sandboxInfo.ModifyTime = time.Now()
+		updateCol = append(updateCol, "Sort", "ModifyTime")
+	}
+
+	//更新
+	if len(updateCol) > 0 {
+		err = sandboxInfo.Update(updateCol)
+		if err != nil {
+			br.Msg = "移动失败"
+			br.ErrMsg = "修改失败,Err:" + err.Error()
+			return
+		}
+	}
+
+	if err != nil {
+		br.Msg = "移动失败"
+		br.ErrMsg = "修改失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "移动成功"
+}

+ 70 - 16
models/sandbox/sandbox.go

@@ -3,6 +3,7 @@ package sandbox
 import (
 	"eta/eta_api/models/system"
 	"eta/eta_api/utils"
+	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"time"
@@ -28,18 +29,18 @@ import (
 //}
 
 type Sandbox struct {
-	SandboxId           int       `orm:"column(sandbox_id);pk" description:"沙盘id"`
-	Name                string    `description:"沙盘名称"`
-	Code                string    `description:"沙盘code"`
-	Content             string    `description:"沙盘数据"`
-	PicUrl              string    `description:"沙盘图片地址"`
-	SysUserId            int       `description:"作者id"`
-	SysUserName          string    `description:"作者名称"`
-	IsDelete            int8      `description:"是否删除,0:未删除,1:已删除"`
-	ModifyTime          time.Time `description:"修改时间"`
-	CreateTime          time.Time `description:"创建时间"`
-	SandboxClassifyId   int       `description:"分类id"`
-	Sort                int       `description:"排序"`
+	SandboxId         int       `orm:"column(sandbox_id);pk" description:"沙盘id"`
+	Name              string    `description:"沙盘名称"`
+	Code              string    `description:"沙盘code"`
+	Content           string    `description:"沙盘数据"`
+	PicUrl            string    `description:"沙盘图片地址"`
+	SysUserId         int       `description:"作者id"`
+	SysUserName       string    `description:"作者名称"`
+	IsDelete          int8      `description:"是否删除,0:未删除,1:已删除"`
+	ModifyTime        time.Time `description:"修改时间"`
+	CreateTime        time.Time `description:"创建时间"`
+	SandboxClassifyId int       `description:"分类id"`
+	Sort              int       `description:"排序"`
 }
 
 // Update 沙盘字段变更
@@ -272,6 +273,7 @@ type SandboxListItems struct {
 	Sandbox
 	ParentIds string
 }
+
 func GetSandboxListByCondition(condition string, pars []interface{}, startSize, pageSize int) (item []*SandboxListItems, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM sandbox WHERE 1=1 `
@@ -307,8 +309,8 @@ func AddSandbox(item *Sandbox) (lastId int64, err error) {
 func GetSandboxItemsByClassifyId(sandboxClassifyId int) (list []*SandboxClassifyItems, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `SELECT sandbox_id,sandbox_classify_id,name AS sandbox_classify_name, sort
-		FROM sandbox  WHERE sandbox_classify_id = ? AND is_delete = 0 `
-	_, err = o.Raw(sql,sandboxClassifyId).QueryRows(&list)
+		FROM sandbox  WHERE sandbox_classify_id = ? AND is_delete = 0  ORDER BY sort `
+	_, err = o.Raw(sql, sandboxClassifyId).QueryRows(&list)
 	return
 }
 
@@ -345,6 +347,58 @@ FROM
 	INNER JOIN sandbox_classify m 
 WHERE
 	sandbox_classify_id = vm._id `
-	err = o.Raw(sql,sandboxClassifyId).QueryRow(&ids)
+	err = o.Raw(sql, sandboxClassifyId).QueryRow(&ids)
+	return
+}
+
+type MoveSandboxReq struct {
+	SandboxId         int `description:"沙盘ID"`
+	PrevSandboxId     int `description:"上一个沙盘ID"`
+	NextSandboxId     int `description:"下一个沙盘ID"`
+	SandboxClassifyId int `description:"分类id"`
+}
+
+func GetSandboxClassifyCountById(classifyId int) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT count(1) AS count FROM sandbox_classify WHERE sandbox_classify_id=? `
+	err = o.Raw(sql, classifyId).QueryRow(&count)
+	return
+}
+
+// GetSandboxByClassifyIdAndName 根据分类id和沙盘名获取图表信息
+func GetSandboxByClassifyIdAndName(classifyId int, name string) (item *Sandbox, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM sandbox WHERE sandbox_classify_id = ? and name=? `
+	err = o.Raw(sql, classifyId, name).QueryRow(&item)
+	return
+}
+
+func MoveSandbox(sandboxId, classifyId int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` UPDATE  sandbox
+			SET
+			  sandbox_classify_id = ?
+			WHERE sandbox_id = ?`
+	_, err = o.Raw(sql, classifyId, sandboxId).Exec()
 	return
-}
+}
+
+
+// UpdateSandboxSortByClassifyId 根据沙盘id更新排序
+func UpdateSandboxSortByClassifyId(classifyId, nowSort, prevChartInfoId int, updateSort string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` update sandbox set sort = ` + updateSort + ` WHERE sandbox_classify_id=?  AND `
+	if prevChartInfoId > 0 {
+		sql += ` (sort > ? or (sandbox_id > ` + fmt.Sprint(prevChartInfoId) + ` and sort = ` + fmt.Sprint(nowSort) + `))`
+	}
+	_, err = o.Raw(sql, classifyId, nowSort).Exec()
+	return
+}
+
+// GetFirstSandboxByClassifyId 获取当前分类下,且排序数相同 的排序第一条的数据
+func GetFirstSandboxByClassifyId(classifyId int) (item *Sandbox, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM sandbox WHERE sandbox_classify_id=? order by sort asc,sandbox_id asc limit 1`
+	err = o.Raw(sql, classifyId).QueryRow(&item)
+	return
+}

+ 9 - 0
routers/commentsRouter.go

@@ -4210,6 +4210,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/sandbox:SandboxController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/sandbox:SandboxController"],
+        beego.ControllerComments{
+            Method: "SandboxMove",
+            Router: `/move`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/sandbox:SandboxController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/sandbox:SandboxController"],
         beego.ControllerComments{
             Method: "SaveV2",