xyxie преди 1 година
родител
ревизия
106e13847a
променени са 6 файла, в които са добавени 612 реда и са изтрити 0 реда
  1. 144 0
      controller/crm/chart_permission.go
  2. 1 0
      init_serve/router.go
  3. 137 0
      models/crm/chart_permission.go
  4. 12 0
      models/request/chart_permission.go
  5. 15 0
      routers/chart_permission.go
  6. 303 0
      services/crm/chart_permission.go

+ 144 - 0
controller/crm/chart_permission.go

@@ -0,0 +1,144 @@
+package crm
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/go-playground/validator/v10"
+	"hongze/hz_crm_eta/controller/resp"
+	"hongze/hz_crm_eta/global"
+	"hongze/hz_crm_eta/models/crm"
+	"hongze/hz_crm_eta/models/request"
+	crmService "hongze/hz_crm_eta/services/crm"
+)
+
+type ChartPermissionController struct{}
+
+// GetChartPermission
+// @Description  获取品种列表
+// @Success 200 {string} string "操作成功"
+// @Router /crm/chart_permission/list [post]
+func (cp *ChartPermissionController) GetChartPermission(c *gin.Context) {
+	var req request.ChartPermissionReq
+	err := c.Bind(&req)
+	if err != nil {
+		errs, ok := err.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+err.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", errs.Translate(global.Trans), c)
+		return
+	}
+
+	cond := ` 1=1`
+	pars := make([]interface{}, 0)
+
+	if req.ProductId > 0 {
+		cond += " and product_id = ?"
+		pars = append(pars, req.ProductId)
+	}
+	if req.ChartPermissionId > 0 {
+		cond += " and chart_permission_id = ?"
+		pars = append(pars, req.ChartPermissionId)
+	}
+	list, e := crmService.GetChartPermissionList(cond, pars)
+	if e != nil {
+		resp.FailData("查询失败", e.Error(), c)
+		return
+	}
+	data := request.ChartPermissionResp{List: list}
+	resp.OkData("操作成功", data, c)
+}
+
+// AddChartPermission
+// @Description  新增品种
+// @Success 200 {string} string "操作成功"
+// @Router /crm/chart_permission/add [post]
+func (cp *ChartPermissionController) AddChartPermission(c *gin.Context) {
+	var req crm.PermissionAddReq
+	err := c.Bind(&req)
+	if err != nil {
+		errs, ok := err.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+err.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", errs.Translate(global.Trans), c)
+		return
+	}
+
+	if req.PermissionName == "" {
+		resp.Fail("请输入品种名称", c)
+		return
+	}
+	e, msg := crmService.AddChartPermission(req)
+	if e != nil {
+		resp.FailData(msg, e.Error(), c)
+		return
+	}
+	resp.Ok("操作成功", c)
+}
+
+// EditChartPermission
+// @Description  编辑品种
+// @Success 200 {string} string "操作成功"
+// @Router /crm/chart_permission/edit [post]
+func (cp *ChartPermissionController) EditChartPermission(c *gin.Context) {
+	var req crm.PermissionEditReq
+	err := c.Bind(&req)
+	if err != nil {
+		errs, ok := err.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+err.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", errs.Translate(global.Trans), c)
+		return
+	}
+
+	if req.PermissionName == "" {
+		resp.Fail("请输入品种名称", c)
+		return
+	}
+
+	if req.ChartPermissionId <= 0 {
+		resp.Fail("请选择品种", c)
+		return
+	}
+
+	e, msg := crmService.EditChartPermission(req)
+	if e != nil {
+		resp.FailData(msg, e.Error(), c)
+		return
+	}
+	resp.Ok("操作成功", c)
+}
+
+// MoveChartPermission
+// @Description  移动品种
+// @Success 200 {string} string "操作成功"
+// @Router /crm/chart_permission/move [post]
+func (cp *ChartPermissionController) MoveChartPermission(c *gin.Context) {
+	var req crm.PermissionMoveReq
+	err := c.Bind(&req)
+	if err != nil {
+		errs, ok := err.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+err.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", errs.Translate(global.Trans), c)
+		return
+	}
+
+	if req.ChartPermissionId <= 0 {
+		resp.Fail("请选择品种", c)
+		return
+	}
+
+	e, msg := crmService.MoveChartPermission(req)
+	if e != nil {
+		resp.FailData(msg, e.Error(), c)
+		return
+	}
+	resp.Ok("操作成功", c)
+}

+ 1 - 0
init_serve/router.go

@@ -19,5 +19,6 @@ func InitRouter() (r *gin.Engine) {
 	rBase := r.Group("api/")
 	routers.InitAuth(rBase)
 	routers.InitEtaTrial(rBase)
+	routers.InitChartPermission(rBase)
 	return
 }

+ 137 - 0
models/crm/chart_permission.go

@@ -0,0 +1,137 @@
+package crm
+
+import (
+	"fmt"
+	"hongze/hz_crm_eta/global"
+	"time"
+)
+
+type ChartPermission struct {
+	ChartPermissionId     int       `gorm:"column:chart_permission_id;primary_key;AUTO_INCREMENT;NOT NULL;comment:'主键'" json:"chart_permission_id"`
+	ChartPermissionName   string    `gorm:"column:chart_permission_name;default:NULL;comment:'名称'" json:"chart_permission_name"`
+	PermissionName        string    `gorm:"column:permission_name;default:;comment:'权限名'" json:"permission_name"`
+	Sort                  int       `gorm:"column:sort;default:1;comment:'排序'" json:"sort"`
+	Enabled               int       `gorm:"column:enabled;default:1;comment:'是否可用 0禁用, 1启用'" json:"enabled"`
+	CreatedTime           time.Time `gorm:"column:created_time;default:CURRENT_TIMESTAMP;comment:'创建时间'" json:"created_time"`
+	LastUpdatedTime       time.Time `gorm:"column:last_updated_time;default:CURRENT_TIMESTAMP;NOT NULL" json:"last_updated_time"`
+	TeleconferenceSort    int       `gorm:"column:teleconference_sort;default:0;comment:'电话会类型排序'" json:"teleconference_sort"`
+	Remark                string    `gorm:"column:remark;default:NULL" json:"remark"`
+	ClassifyName          string    `gorm:"column:classify_name;default:NULL" json:"classify_name"`
+	ProductName           string    `gorm:"column:product_name;default:" json:"product_name"`
+	ProductId             int       `gorm:"column:product_id;default:0" json:"product_id"`
+	ImageUrl              string    `gorm:"column:image_url;default:NULL;comment:'图片地址'" json:"image_url"`
+	ShowType              int       `gorm:"column:show_type;default:0;comment:'1:查研观向小程序展示'" json:"show_type"`
+	IsOther               int       `gorm:"column:is_other;default:0;NOT NULL;comment:'是否是其他,用于查研观向小程序后台展示'" json:"is_other"`
+	IsReport              int       `gorm:"column:is_report;default:0;NOT NULL;comment:'是否是报告,用于查研观向小程序前台报告展示'" json:"is_report"`
+	CygxAuth              int       `gorm:"column:cygx_auth;default:0;NOT NULL;comment:'是否是权限,用于查研观向小程序前台权限校验'" json:"cygx_auth"`
+	PermissionType        int       `gorm:"column:permission_type;default:0;NOT NULL;comment:'1主观,2客观'" json:"permission_type"`
+	YbImgUrl              string    `gorm:"column:yb_img_url;default:NULL;comment:'研报小程序报告列表icon'" json:"yb_img_url"`
+	ProductPermissionName string    `gorm:"column:product_permission_name;default:;comment:'种类权限名称'" json:"product_permission_name"`
+	PriceDrivenState      int       `gorm:"column:price_driven_state;default:1;NOT NULL;comment:'品种价格驱动状态 0-关闭 1-开启'" json:"price_driven_state"`
+	ImageUrlM             string    `gorm:"column:image_url_m;default:NULL;comment:'图片地址(查研观向移动端)'" json:"image_url_m"`
+	ParentId              int       `gorm:"column:parent_id;default:0;NOT NULL;comment:'父级权限id'" json:"parent_id"`
+	IsPublic              int       `gorm:"column:is_public;default:0;NOT NULL;comment:'是否是公有权限1:公有权限,0私有权限'" json:"is_public"`
+}
+
+func (c *ChartPermission) TableName() string {
+	return "chart_permission"
+}
+
+// GetItemById 查询品种
+func (c *ChartPermission) GetItemById(chartPermissionId int) (item *ChartPermission, err error) {
+	err = global.MYSQL["hz_crm"].Where("chart_permission_id = ?", chartPermissionId).First(&item).Error
+	return
+}
+
+// GetItemsByCondition 查询列表
+func (c *ChartPermission) GetItemsByCondition(condition string, pars []interface{}) (items []*ChartPermission, err error) {
+	err = global.MYSQL["hz_crm"].Where(condition, pars...).Order("sort asc, chart_permission_id asc").Find(&items).Error
+	return
+}
+
+// GetItemByCondition 查询列表
+func (c *ChartPermission) GetItemByCondition(condition string, pars []interface{}) (item *ChartPermission, err error) {
+	err = global.MYSQL["hz_crm"].Where(condition, pars...).First(&item).Error
+	return
+}
+
+// Create 新增权限
+func (c *ChartPermission) Create() (err error) {
+	err = global.MYSQL["hz_crm"].Create(c).Error
+	return
+}
+
+// Update 更新权限
+func (c *ChartPermission) Update(cols []string) (err error) {
+	err = global.MYSQL["hz_crm"].Model(c).Select(cols).Updates(c).Error
+	return
+}
+
+// SetIsPublic 更新公有私有权限
+func (c *ChartPermission) SetIsPublic(ids []int, parentId, isPublic int) (err error) {
+	err = global.MYSQL["hz_crm"].Model(c).Where("chart_permission_id in (?) and parent_id = ?", ids, parentId).Update("is_public", isPublic).Error
+	return
+}
+
+// SetEnabled 更新启动禁用
+func (c *ChartPermission) SetEnabled(parentId, enabled int) (err error) {
+	err = global.MYSQL["hz_crm"].Model(c).Where("parent_id = ?", parentId).Update("enabled", enabled).Error
+	return
+}
+
+// Delete 删除权限
+func (c *ChartPermission) Delete() (err error) {
+	err = global.MYSQL["hz_crm"].Delete(c).Error
+	return
+}
+
+// GetMaxSort 获取最大的排序值
+func (c *ChartPermission) GetMaxSort() (maxSort int, err error) {
+	err = global.MYSQL["hz_crm"].Model(c).Select("max(sort)").Scan(&maxSort).Error
+	return
+}
+
+// GetMaxSortByParentId 获取最大的排序值
+func (c *ChartPermission) GetMaxSortByParentId(parentId int) (maxSort int, err error) {
+	err = global.MYSQL["hz_crm"].Model(c).Select("max(sort)").Where("parent_id = ?", parentId).Scan(&maxSort).Error
+	return
+}
+
+type PermissionAddReq struct {
+	PermissionName string `description:"品种权限名称"`
+	ParentId       int    `description:"父级ID"`
+	Enabled        int    `description:"是否可用 0禁用, 1启用"` //启用,禁用操作会关联二级品种
+	IsPublic       int    `description:"是否是公有权限1:公有权限,0私有权限"`
+	ProductId      int
+}
+
+type PermissionEditReq struct {
+	ChartPermissionId   int    `description:"品种权限Id"` // 如果ID存在,则是更新操作,否则是新增操作
+	PermissionName      string `description:"品种权限名称"`
+	Enabled             int    `description:"是否可用 0禁用, 1启用"` //启用,禁用操作会关联二级品种
+	IsPublic            int    `description:"是否是公有权限1:公有权限,0私有权限"`
+	PublicPermissionIds []int  `description:"公有权限的ID列表"` //一级品种没有公有私有属性
+}
+
+type PermissionMoveReq struct {
+	ChartPermissionId int `description:"品种id"`
+	//	ParentChartPermissionId int `description:"父级品种id"`
+	PrevChartPermissionId int `description:"上一个兄弟节点品种id"`
+	NextChartPermissionId int `description:"下一个兄弟节点品种id"`
+}
+
+// UpdateChartPermissionSortByParentId 根据父类id更新排序
+func UpdateChartPermissionSortByParentId(parentId, chartPermissionId, nowSort int, updateSort string, productId int) (err error) {
+	sql := ` update chart_permission set sort = ` + updateSort + ` WHERE parent_id=? AND sort > ? AND product_id = ? `
+	if chartPermissionId > 0 {
+		sql += ` or ( chart_permission_id > ` + fmt.Sprint(chartPermissionId) + ` and sort = ` + fmt.Sprint(nowSort) + `)`
+	}
+	err = global.MYSQL["hz_crm"].Exec(sql, parentId, nowSort, productId).Error
+	return
+}
+
+// GetFirstChartPermissionByParentId 获取当前父级分类下,且排序数相同 的排序第一条的数据
+func (c *ChartPermission) GetFirstChartPermissionByParentId(parentId int) (item *ChartPermission, err error) {
+	err = global.MYSQL["hz_crm"].Where("parent_id = ?", parentId).Order("sort asc, chart_permission_id asc").First(&item).Error
+	return
+}

+ 12 - 0
models/request/chart_permission.go

@@ -0,0 +1,12 @@
+package request
+
+import "hongze/hz_crm_eta/models/crm"
+
+type ChartPermissionReq struct {
+	ChartPermissionId int `json:"chart_permission_id"`
+	ProductId         int `json:"product_id"`
+}
+
+type ChartPermissionResp struct {
+	List []*crm.ChartPermission
+}

+ 15 - 0
routers/chart_permission.go

@@ -0,0 +1,15 @@
+package routers
+
+import (
+	"github.com/gin-gonic/gin"
+	"hongze/hz_crm_eta/controller/crm"
+)
+
+func InitChartPermission(r *gin.RouterGroup) {
+	control := new(crm.ChartPermissionController)
+	group := r.Group("crm/chart_permission")
+	group.POST("list", control.GetChartPermission)
+	group.POST("add", control.AddChartPermission)
+	group.POST("edit", control.EditChartPermission)
+	group.POST("move", control.MoveChartPermission)
+}

+ 303 - 0
services/crm/chart_permission.go

@@ -0,0 +1,303 @@
+package crm
+
+import (
+	"fmt"
+	"hongze/hz_crm_eta/models/crm"
+	"hongze/hz_crm_eta/utils"
+	"time"
+)
+
+// 获取权限列表
+func GetChartPermissionList(cond string, pars []interface{}) (permissionList []*crm.ChartPermission, err error) {
+	ob := new(crm.ChartPermission)
+	permissionList, err = ob.GetItemsByCondition(cond, pars)
+	if err != nil {
+		err = fmt.Errorf("获取权限列表失败, Err: %s", err.Error())
+		return
+	}
+	return
+}
+
+// 新增权限
+func AddChartPermission(req crm.PermissionAddReq) (err error, errMsg string) {
+	// 重名校验
+	ob := new(crm.ChartPermission)
+	existCond := ` permission_name = ? AND parent_id = ?`
+	existPars := make([]interface{}, 0)
+	existPars = append(existPars, req.PermissionName, req.ParentId)
+	exist, e := ob.GetItemByCondition(existCond, existPars)
+	if e != nil && e != utils.ErrNoRow {
+		errMsg = "操作失败"
+		err = fmt.Errorf("获取重名品种权限失败, Err: " + e.Error())
+		return
+	}
+	if exist != nil && exist.ChartPermissionId > 0 {
+		errMsg = "品种名称已存在"
+		err = fmt.Errorf("品种名称已存在")
+		return
+	}
+
+	// 获取最大的排序值
+	maxSort, e := ob.GetMaxSort()
+	if e != nil {
+		errMsg = "查询品种排序失败"
+		err = fmt.Errorf("查询品种排序失败, Err: " + e.Error())
+		return
+	}
+	if req.ParentId > 0 {
+		//查询父级是否存在
+		parent, e := ob.GetItemById(req.ParentId)
+		if e != nil {
+			errMsg = "查询父级品种失败"
+			err = fmt.Errorf("查询父级品种失败, Err: " + e.Error())
+			return
+		}
+		if parent.ChartPermissionId == 0 {
+			errMsg = "请选择正确的父级品种"
+			err = fmt.Errorf("请选择正确的父级品种")
+			return
+		}
+		if parent.ParentId != 0 {
+			errMsg = "只能选择一级品种作为父级品种"
+			err = fmt.Errorf("只能选择一级品种作为父级品种")
+			return
+		}
+	}
+	// 新增
+	ob.ChartPermissionName = req.PermissionName
+	ob.PermissionName = req.PermissionName
+	ob.ParentId = req.ParentId
+	ob.ProductId = req.ProductId
+	ob.IsPublic = req.IsPublic
+	ob.Enabled = req.Enabled
+	ob.Sort = maxSort + 1
+	ob.CreatedTime = time.Now()
+	ob.LastUpdatedTime = time.Now()
+	if e = ob.Create(); e != nil {
+		errMsg = "操作失败"
+		err = fmt.Errorf("新增品种权限失败, Err: " + e.Error())
+		return
+	}
+	return
+}
+
+func EditChartPermission(req crm.PermissionEditReq) (err error, errMsg string) {
+	//查询是否存在品种
+	ob := new(crm.ChartPermission)
+	item, e := ob.GetItemById(req.ChartPermissionId)
+	if e != nil {
+		errMsg = "查询品种信息失败"
+		err = fmt.Errorf("查询品种信息失败, Err: " + e.Error())
+		return
+	}
+	if item.ChartPermissionId == 0 {
+		errMsg = "请选择正确的品种"
+		err = fmt.Errorf("请选择正确的品种")
+		return
+	}
+	// 查询品种名称是否修改
+	if item.PermissionName != req.PermissionName {
+		existCond := ` permission_name = ? AND parent_id = ? AND chart_permission_id !=?`
+		existPars := make([]interface{}, 0)
+		existPars = append(existPars, req.PermissionName, item.ParentId, req.ChartPermissionId)
+		exist, e := ob.GetItemByCondition(existCond, existPars)
+		if e != nil && e != utils.ErrNoRow {
+			errMsg = "操作失败"
+			err = fmt.Errorf("获取重名品种权限失败, Err: " + e.Error())
+			return
+		}
+		if exist != nil && exist.ChartPermissionId > 0 {
+			errMsg = "品种名称已存在"
+			err = fmt.Errorf("品种名称已存在")
+			return
+		}
+	}
+	oldEnabled := item.Enabled
+	item.PermissionName = req.PermissionName
+	item.Enabled = req.Enabled
+	item.IsPublic = req.IsPublic
+	item.LastUpdatedTime = time.Now()
+	err = item.Update([]string{"PermissionName", "Enabled", "IsPublic", "LastUpdatedTime"})
+	if err != nil {
+		errMsg = "更新失败"
+		err = fmt.Errorf("更新品种失败, Err: " + err.Error())
+		return
+	}
+
+	//判断是否是一级品种
+	if item.ParentId == 0 {
+		// 判断是否设置公有的二级品种
+		if len(req.PublicPermissionIds) > 0 {
+			// 更新二级品种的公有权限
+			err = ob.SetIsPublic(req.PublicPermissionIds, item.ChartPermissionId, 1)
+			if err != nil {
+				errMsg = "更新品种公有权限失败"
+				err = fmt.Errorf("更新品种公有权限失败, Err: " + err.Error())
+				return
+			}
+		}
+		if oldEnabled != req.Enabled {
+			// 更新二级的启动禁用
+			err = ob.SetEnabled(item.ChartPermissionId, req.Enabled)
+			if err != nil {
+				errMsg = "更新品种启用禁用状态失败"
+				err = fmt.Errorf("更新品种启用禁用状态失败, Err: " + err.Error())
+				return
+			}
+		}
+	}
+	return
+}
+
+// MoveChartPermission 移动品种
+func MoveChartPermission(req crm.PermissionMoveReq) (err error, errMsg string) {
+	ob := new(crm.ChartPermission)
+	chartPermissionId := req.ChartPermissionId
+	prevChartPermissionId := req.PrevChartPermissionId
+	nextChartPermissionId := req.NextChartPermissionId
+
+	//如果有传入 上一个兄弟节点分类id
+	var (
+		permissionInfo *crm.ChartPermission
+		prevPermission *crm.ChartPermission
+		nextPermission *crm.ChartPermission
+
+		prevSort int
+		nextSort int
+	)
+
+	// 移动对象为分类, 判断权限
+	permissionInfo, err = ob.GetItemById(chartPermissionId)
+	if err != nil {
+		if err == utils.ErrNoRow {
+			errMsg = "当前品种不存在"
+			err = fmt.Errorf("获取品种信息失败,Err:" + err.Error())
+			return
+		}
+		errMsg = "移动失败"
+		err = fmt.Errorf("获取分类信息失败,Err:" + err.Error())
+		return
+	} else if permissionInfo.ChartPermissionId == 0 {
+		errMsg = "当前品种不存在"
+		err = fmt.Errorf("获取品种信息失败,Err:" + err.Error())
+		return
+	}
+
+	parentChartPermissionId := permissionInfo.ParentId
+	productId := permissionInfo.ProductId
+	if prevChartPermissionId > 0 {
+		prevPermission, err = ob.GetItemById(prevChartPermissionId)
+		if err != nil {
+			errMsg = "移动失败"
+			err = fmt.Errorf("获取上一个兄弟节点分类信息失败,Err:" + err.Error())
+			return
+		}
+		prevSort = prevPermission.Sort
+	}
+
+	if nextChartPermissionId > 0 {
+		//下一个兄弟节点
+		nextPermission, err = ob.GetItemById(nextChartPermissionId)
+		if err != nil {
+			errMsg = "移动失败"
+			err = fmt.Errorf("获取下一个兄弟节点分类信息失败,Err:" + err.Error())
+			return
+		}
+		nextSort = nextPermission.Sort
+	}
+
+	err, errMsg = moveChartPermission(permissionInfo, prevPermission, nextPermission, parentChartPermissionId, prevSort, nextSort, productId)
+	return
+}
+
+// moveChartPermission 移动指标分类
+func moveChartPermission(permissionInfo, prevPermission, nextPermission *crm.ChartPermission, parentId, prevSort, nextSort, productId int) (err error, errMsg string) {
+	ob := new(crm.ChartPermission)
+	updateCol := make([]string, 0)
+
+	//判断上级id是否一致,如果不一致的话,那么需要移动该分类层级
+	if permissionInfo.ParentId != parentId {
+		errMsg = "移动失败"
+		err = fmt.Errorf("不支持目录层级变更")
+		return
+	}
+
+	if prevSort > 0 {
+		//如果是移动在两个兄弟节点之间
+		if nextSort > 0 {
+			//下一个兄弟节点
+			//如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
+			if prevSort == nextSort || prevSort == permissionInfo.Sort {
+				//变更兄弟节点的排序
+				updateSortStr := `sort + 2`
+
+				//变更分类
+				if prevPermission != nil {
+					_ = crm.UpdateChartPermissionSortByParentId(parentId, prevPermission.ChartPermissionId, prevPermission.Sort, updateSortStr, productId)
+				} else {
+					_ = crm.UpdateChartPermissionSortByParentId(parentId, 0, prevSort, updateSortStr, productId)
+				}
+
+			} else {
+				//如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
+				if nextSort-prevSort == 1 {
+					//变更兄弟节点的排序
+					updateSortStr := `sort + 1`
+
+					//变更分类
+					if prevPermission != nil {
+						_ = crm.UpdateChartPermissionSortByParentId(parentId, prevPermission.ChartPermissionId, prevSort, updateSortStr, productId)
+					} else {
+						_ = crm.UpdateChartPermissionSortByParentId(parentId, 0, prevSort, updateSortStr, productId)
+					}
+
+				}
+			}
+		}
+
+		permissionInfo.Sort = prevSort + 1
+		permissionInfo.LastUpdatedTime = time.Now()
+		updateCol = append(updateCol, "Sort", "LastUpdatedTime")
+	} else if prevPermission == nil && nextPermission == nil && parentId > 0 {
+		//处理只拖动到目录里,默认放到目录底部的情况
+		var maxSort int
+		maxSort, err = ob.GetMaxSortByParentId(parentId)
+		if err != nil {
+			errMsg = "移动失败"
+			err = fmt.Errorf("查询组内排序信息失败,Err:" + err.Error())
+			return
+		}
+		permissionInfo.Sort = maxSort + 1 //那就是排在组内最后一位
+		permissionInfo.LastUpdatedTime = time.Now()
+		updateCol = append(updateCol, "Sort", "LastUpdatedTime")
+	} else {
+		// 拖动到父级分类的第一位
+		firstPermission, tmpErr := ob.GetFirstChartPermissionByParentId(parentId)
+		if tmpErr != nil && tmpErr != utils.ErrNoRow {
+			errMsg = "移动失败"
+			err = fmt.Errorf("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tmpErr.Error())
+			return
+		}
+
+		//如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
+		if firstPermission != nil && firstPermission.ChartPermissionId != 0 && firstPermission.Sort == 0 {
+			updateSortStr := ` sort + 1 `
+			_ = crm.UpdateChartPermissionSortByParentId(parentId, firstPermission.ChartPermissionId-1, 0, updateSortStr, productId)
+		}
+
+		permissionInfo.Sort = 0 //那就是排在第一位
+		permissionInfo.LastUpdatedTime = time.Now()
+		updateCol = append(updateCol, "Sort", "LastUpdatedTime")
+	}
+
+	//更新
+	if len(updateCol) > 0 {
+		err = permissionInfo.Update(updateCol)
+		if err != nil {
+			errMsg = "移动失败"
+			err = fmt.Errorf("修改失败,Err:" + err.Error())
+			return
+		}
+	}
+	return
+}