瀏覽代碼

品种管理

xyxie 1 年之前
父節點
當前提交
07bde741df

+ 231 - 0
controllers/chart_permission.go

@@ -0,0 +1,231 @@
+package controllers
+
+import (
+	"encoding/json"
+	"eta/eta_api/models"
+	"eta/eta_api/services"
+	"eta/eta_api/utils"
+)
+
+// ChartPermissionController 品种列表
+type ChartPermissionController struct {
+	BaseAuthController
+}
+
+// List
+// @Title 品种列表
+// @Description 品种列表
+// @Param   Keyword  query  string  false  "关键词"
+// @Success 200 Ret=200 操作成功
+// @router /list [get]
+func (this *ChartPermissionController) List() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	list, e := services.GetChartPermissionList()
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取品种列表失败, Err: " + e.Error()
+		return
+	}
+
+	// 品种树
+	resp := make([]*models.ChartPermissionItem, 0)
+	childMap := make(map[int][]*models.ChartPermissionItem)
+
+	for _, v := range list {
+		t := new(models.ChartPermissionItem)
+		t.PermissionId = v.ChartPermissionId
+		t.PermissionName = v.PermissionName
+		t.ParentId = v.ParentId
+		t.IsPublic = v.IsPublic
+		t.Enabled = v.Enabled
+		t.Sort = v.Sort
+		t.CreateTime = v.CreatedTime.Format(utils.FormatDateTime)
+		t.Child = make([]*models.ChartPermissionItem, 0)
+		if v.ParentId == 0 {
+			resp = append(resp, t)
+			continue
+		}
+		if v.ParentId > 0 {
+			if childMap[v.ParentId] == nil {
+				childMap[v.ParentId] = make([]*models.ChartPermissionItem, 0)
+			}
+			childMap[v.ParentId] = append(childMap[v.ParentId], t)
+		}
+	}
+	for _, r := range resp {
+		r.Child = childMap[r.PermissionId]
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// Add
+// @Title 新增品种列表
+// @Description 新增品种列表
+// @Param  request body models.PermissionAddReq true "type json string"
+// @Success 200 Ret=200 操作成功
+// @router /add [post]
+func (this *ChartPermissionController) Add() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		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 models.PermissionAddReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+	if req.PermissionName == "" {
+		br.Msg = "参数有误"
+		return
+	}
+	var req2 services.ChartPermissionAddReq
+	req2.PermissionName = req.PermissionName
+	req2.ParentId = req.ParentId
+	req2.IsPublic = req.IsPublic
+	req2.Enabled = req.Enabled
+	e, msg := services.AddChartPermission(&req2)
+	if e != nil {
+		br.Msg = msg
+		br.ErrMsg = "新增品种失败, Err: " + e.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// Edit
+// @Title 编辑品种
+// @Description 编辑品种
+// @Param	request	body models.PermissionEditReq true "type json string"
+// @Success 200 Ret=200 操作成功
+// @router /edit [post]
+func (this *ChartPermissionController) Edit() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		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 models.PermissionEditReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+	if req.PermissionId == 0 {
+		br.Msg = "请选择要编辑的品种"
+		return
+	}
+
+	if req.PermissionName == "" {
+		br.Msg = "请输入品种名称"
+		return
+	}
+	var req2 services.ChartPermissionEditReq
+	req2.ChartPermissionId = req.PermissionId
+	req2.PermissionName = req.PermissionName
+	req2.IsPublic = req.IsPublic
+	req2.Enabled = req.Enabled
+	req2.PublicPermissionIds = req.PublicPermissionIds
+	e, msg := services.EditChartPermission(&req2)
+	if e != nil {
+		br.Msg = msg
+		br.ErrMsg = "编辑品种失败, Err: " + e.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// Move
+// @Title 移动品种
+// @Description 移动品种
+// @Param	request	body models.PermissionMoveReq true "type json string"
+// @Success 200 Ret=200 操作成功
+// @router /move [post]
+func (this *ChartPermissionController) Move() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		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 models.PermissionMoveReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+
+	if req.PermissionId == 0 {
+		br.Msg = "请选择要移动的品种"
+		return
+	}
+	var req2 services.ChartPermissionMoveReq
+	req2.ChartPermissionId = req.PermissionId
+	req2.PrevChartPermissionId = req.PrevPermissionId
+	req2.NextChartPermissionId = req.NextPermissionId
+	e, msg := services.MoveChartPermission(&req2)
+	if e != nil {
+		br.Msg = msg
+		br.ErrMsg = "移动品种失败, Err: " + e.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}

+ 46 - 0
controllers/english_report/en_permission.go

@@ -4,6 +4,7 @@ import (
 	"encoding/json"
 	"eta/eta_api/controllers"
 	"eta/eta_api/models"
+	"eta/eta_api/services"
 	"eta/eta_api/utils"
 	"fmt"
 	"strings"
@@ -418,3 +419,48 @@ func (this *EnPermissionController) Remove() {
 	br.Success = true
 	br.Msg = "操作成功"
 }
+
+// Move
+// @Title 移动品种权限
+// @Description 移动品种权限
+// @Param	request	body models.EnPermissionMoveReq true "type json string"
+// @Success 200 Ret=200 操作成功
+// @router /move [post]
+func (this *EnPermissionController) Move() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		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 models.EnPermissionMoveReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+	if req.PermissionId <= 0 {
+		br.Msg = "参数有误"
+		return
+	}
+
+	e, msg := services.MoveEnPermission(req)
+	if e != nil {
+		br.Msg = msg
+		br.ErrMsg = "移动品种失败, Err: " + e.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 4 - 2
controllers/report_chapter_type.go

@@ -2,9 +2,10 @@ package controllers
 
 import (
 	"encoding/json"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"eta/eta_api/models"
+	"eta/eta_api/services"
 	"eta/eta_api/utils"
+	"github.com/rdlucklib/rdluck_tools/paging"
 	"time"
 )
 
@@ -398,7 +399,8 @@ func (this *ReportChapterTypeController) AuthSetting() {
 		br.Msg = "章节不存在或已被删除"
 		return
 	}
-	permissionList, e := models.GetChartPermissionList()
+	// todo 测试品种在报告中的使用
+	permissionList, e := services.GetChartPermissionList()
 	if e != nil {
 		br.Msg = "操作失败"
 		br.ErrMsg = "获取权限列表失败, Err: " + e.Error()

+ 52 - 25
models/chart_permission.go

@@ -7,25 +7,38 @@ import (
 
 // ChartPermission 报告权限表
 type ChartPermission struct {
-	ChartPermissionId   int       `orm:"column(chart_permission_id);pk" description:"问题ID"`
-	ChartPermissionName string    `description:"名称"`
-	PermissionName      string    `description:"权限名"`
-	Sort                int       `description:"排序"`
-	Enabled             int       `description:"是否可用"`
-	CreatedTime         time.Time `description:"创建时间"`
-	LastUpdatedTime     time.Time `description:"更新时间"`
-	TeleconferenceSort  int       `description:"电话会类型排序"`
-	Remark              string    `description:"备注"`
-	ClassifyName        string    `description:"分类名称"`
-	ProductName         string    `description:"产品名称"`
-	ProductId           int       `description:"产品ID"`
-	ImageURL            string    `description:"图片地址"`
-	ShowType            int       `description:"1:查研观向小程序展示"`
-	IsOther             int       `description:"是否是其他,用于查研观向小程序后台展示"`
-	IsReport            int       `description:"是否是报告,用于查研观向小程序前台报告展示"`
-	CygxAuth            int       `description:"是否是权限,用于查研观向小程序前台权限校验"`
-	YbImgUrl            string    `description:"研报小程序报告列表icon"`
-	PriceDrivenState    int       `description:"品种价格驱动开启状态 0-关闭 1-开启"`
+	ChartPermissionId   int       `orm:"column(chart_permission_id);pk" description:"问题ID" json:"chart_permission_id"`
+	ChartPermissionName string    `description:"名称" json:"chart_permission_name"`
+	PermissionName      string    `description:"权限名" json:"permission_name"`
+	Sort                int       `description:"排序" json:"sort"`
+	Enabled             int       `description:"是否可用" json:"enabled"`
+	CreatedTime         time.Time `description:"创建时间" json:"created_time"`
+	LastUpdatedTime     time.Time `description:"更新时间" json:"last_updated_time"`
+	TeleconferenceSort  int       `description:"电话会类型排序" json:"teleconference_sort"`
+	Remark              string    `description:"备注" json:"remark"`
+	ClassifyName        string    `description:"分类名称" json:"classify_name"`
+	ProductName         string    `description:"产品名称" json:"product_name"`
+	ProductId           int       `description:"产品ID" json:"product_id"`
+	ImageURL            string    `description:"图片地址" json:"image_url"`
+	ShowType            int       `description:"1:查研观向小程序展示" json:"show_type"`
+	IsOther             int       `description:"是否是其他,用于查研观向小程序后台展示" json:"is_other"`
+	IsReport            int       `description:"是否是报告,用于查研观向小程序前台报告展示" json:"is_report"`
+	CygxAuth            int       `description:"是否是权限,用于查研观向小程序前台权限校验" json:"cygx_auth"`
+	YbImgUrl            string    `description:"研报小程序报告列表icon" json:"yb_img_url"`
+	PriceDrivenState    int       `description:"品种价格驱动开启状态 0-关闭 1-开启" json:"price_driven_state"`
+	ParentId            int       `description:"父级权限id" json:"parent_id"`
+	IsPublic            int       `description:"是否是公有权限1:公有权限,0私有权限" json:"is_public"`
+}
+
+type ChartPermissionItem struct {
+	PermissionId   int    `description:"品种权限ID"`
+	PermissionName string `description:"品种权限名称"`
+	ParentId       int    `description:"父级ID"`
+	IsPublic       int    `description:"是否是公有权限1:公有权限,0私有权限" `
+	Enabled        int    `description:"是否可用:1可用,0不可用" `
+	Sort           int    `description:"排序"`
+	CreateTime     string `description:"创建时间"`
+	Child          []*ChartPermissionItem
 }
 
 // Update 更新
@@ -35,10 +48,24 @@ func (chartPermissionInfo *ChartPermission) Update(cols []string) (err error) {
 	return
 }
 
-// GetChartPermissionList 获取品种权限列表
-func GetChartPermissionList() (list []*ChartPermission, err error) {
-	o := orm.NewOrmUsingDB("weekly")
-	sql := `SELECT * FROM chart_permission ORDER BY product_id ASC, sort ASC`
-	_, err = o.Raw(sql).QueryRows(&list)
-	return
+type PermissionAddReq struct {
+	PermissionName string `description:"品种权限名称"`
+	ParentId       int    `description:"父级ID"`
+	Enabled        int    `description:"是否可用 0禁用, 1启用"` //启用,禁用操作会关联二级品种
+	IsPublic       int    `description:"是否是公有权限1:公有权限,0私有权限"`
+}
+
+type PermissionEditReq struct {
+	PermissionId        int    `description:"品种权限Id"` // 如果ID存在,则是更新操作,否则是新增操作
+	PermissionName      string `description:"品种权限名称"`
+	Enabled             int    `description:"是否可用 0禁用, 1启用"` //启用,禁用操作会关联二级品种
+	IsPublic            int    `description:"是否是公有权限1:公有权限,0私有权限"`
+	PublicPermissionIds []int  `description:"公有权限的ID列表"` //一级品种没有公有私有属性
+}
+
+type PermissionMoveReq struct {
+	PermissionId int `description:"品种id"`
+	//	ParentChartPermissionId int `description:"父级品种id"`
+	PrevPermissionId int `description:"上一个兄弟节点品种id"`
+	NextPermissionId int `description:"下一个兄弟节点品种id"`
 }

+ 33 - 0
models/en_permission.go

@@ -152,6 +152,12 @@ type EnPermissionItem struct {
 	Child            []*EnPermissionItem
 }
 
+type EnPermissionMoveReq struct {
+	PermissionId     int `description:"品种id"`
+	PrevPermissionId int `description:"上一个兄弟节点品种id"`
+	NextPermissionId int `description:"下一个兄弟节点品种id"`
+}
+
 func GetEnPermissionUnionList(condition string, pars []interface{}) (items []*EnPermission, err error) {
 	o := orm.NewOrmUsingDB("rddp")
 	sql := fmt.Sprintf(`
@@ -203,3 +209,30 @@ func ClearEnPermissionsByPermissionId(permissionId int) (err error) {
 	}
 	return
 }
+
+// UpdateEnPermissionSortByParentId 根据父类id更新排序
+func UpdateEnPermissionSortByParentId(parentId, permissionId, nowSort int, updateSort string) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := ` update en_permission set sort = ` + updateSort + ` WHERE parent_id=? AND sort > ? `
+	if permissionId > 0 {
+		sql += ` or ( en_permission_id > ` + fmt.Sprint(permissionId) + ` and sort = ` + fmt.Sprint(nowSort) + `)`
+	}
+	_, err = o.Raw(sql, parentId, nowSort).Exec()
+	return
+}
+
+// GetMaxSortByParentId 获取最大的排序值
+func (m *EnPermission) GetMaxSortByParentId(parentId int) (maxSort int, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := fmt.Sprintf(`SELECT max(%s) AS sort FROM %s WHERE %s = ? `, EnPermissionColumns.Sort, m.TableName(), EnPermissionColumns.ParentId)
+	err = o.Raw(sql, parentId).QueryRow(&maxSort)
+	return
+}
+
+// GetFirstEnPermissionByParentId 获取当前父级分类下,且排序数相同 的排序第一条的数据
+func (m *EnPermission) GetFirstEnPermissionByParentId(parentId int) (item *EnPermission, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? order by sort asc, en_permission_id asc limit 1`, m.TableName(), EnPermissionColumns.ParentId)
+	err = o.Raw(sql, parentId).QueryRow(&item)
+	return
+}

+ 45 - 0
routers/commentsRouter.go

@@ -4624,6 +4624,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/english_report:EnPermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/english_report:EnPermissionController"],
+        beego.ControllerComments{
+            Method: "Move",
+            Router: `/move`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/english_report:EnPermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/english_report:EnPermissionController"],
         beego.ControllerComments{
             Method: "ParentList",
@@ -6082,6 +6091,42 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers:ChartPermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:ChartPermissionController"],
+        beego.ControllerComments{
+            Method: "Add",
+            Router: `/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:ChartPermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:ChartPermissionController"],
+        beego.ControllerComments{
+            Method: "Edit",
+            Router: `/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:ChartPermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:ChartPermissionController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers:ChartPermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:ChartPermissionController"],
+        beego.ControllerComments{
+            Method: "Move",
+            Router: `/move`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers:ClassifyController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:ClassifyController"],
         beego.ControllerComments{
             Method: "Add",

+ 5 - 0
routers/router.go

@@ -343,6 +343,11 @@ func init() {
 				&data_source.DataSourceController{},
 			),
 		),
+		web.NSNamespace("/permission",
+			web.NSInclude(
+				&controllers.ChartPermissionController{},
+			),
+		),
 	)
 	web.AddNamespace(ns)
 }

+ 206 - 1
services/chart_permission.go

@@ -1,5 +1,210 @@
 package services
 
-func GetChartPermissionList() {
+import (
+	"encoding/json"
+	"eta/eta_api/models"
+	"eta/eta_api/utils"
+	"fmt"
+	"io/ioutil"
+	"net/http"
+	"strings"
+)
 
+func GetChartPermissionList() (list []*models.ChartPermission, err error) {
+	var req GetChartPermissionReq
+	data, err := getChartPermission(req)
+	if err != nil {
+		return
+	}
+	list = data.List
+	return
+}
+
+type GetChartPermissionReq struct {
+	ChartPermissionId int `json:"chart_permission_id"`
+	ProductId         int `json:"product_id"`
+}
+type GetChartPermissionItem struct {
+	List       []*models.ChartPermission
+	ParentList []*models.ChartPermission
+}
+type GetChartPermissionResp struct {
+	Code   int                    `json:"code" description:"状态码"`
+	Msg    string                 `json:"msg" description:"提示信息"`
+	Data   GetChartPermissionItem `json:"data" description:"返回数据"`
+	ErrMsg string                 `json:"-" description:"错误信息,不用返回给前端,只是做日志记录"`
+}
+
+func getChartPermission(pars GetChartPermissionReq) (res GetChartPermissionItem, err error) {
+	url := fmt.Sprint(utils.CrmEtaServerUrl, "/api/crm/chart_permission/list")
+	if pars.ProductId == 0 {
+		pars.ProductId = 1 //默认查ficc的品种
+	}
+	b, err := crmEtaPost(url, pars)
+	if err != nil {
+		err = fmt.Errorf("url:%s err: %s", url, err.Error())
+		return
+	}
+	//result := new(models.ResultData)
+	result := new(GetChartPermissionResp)
+	if e := json.Unmarshal(b, &result); e != nil {
+		err = fmt.Errorf("result unmarshal err: %s\nresult: %s", e.Error(), string(b))
+		return
+	}
+	utils.FileLog.Info("%s", string(b))
+	if result.Code != 200 {
+		err = fmt.Errorf("result: %s", string(b))
+		return
+	}
+	res = result.Data
+	return
+}
+
+type ChartPermissionResp struct {
+	Code   int    `json:"code" description:"状态码"`
+	Msg    string `json:"msg" description:"提示信息"`
+	ErrMsg string `json:"-" description:"错误信息,不用返回给前端,只是做日志记录"`
+}
+
+type ChartPermissionAddReq struct {
+	PermissionName string `description:"品种权限名称"`
+	ParentId       int    `description:"父级ID"`
+	Enabled        int    `description:"是否可用 0禁用, 1启用"` //启用,禁用操作会关联二级品种
+	IsPublic       int    `description:"是否是公有权限1:公有权限,0私有权限"`
+	ProductId      int
+}
+
+type ChartPermissionEditReq struct {
+	ChartPermissionId   int    `description:"品种权限Id"` // 如果ID存在,则是更新操作,否则是新增操作
+	PermissionName      string `description:"品种权限名称"`
+	Enabled             int    `description:"是否可用 0禁用, 1启用"` //启用,禁用操作会关联二级品种
+	IsPublic            int    `description:"是否是公有权限1:公有权限,0私有权限"`
+	PublicPermissionIds []int  `description:"公有权限的ID列表"` //一级品种没有公有私有属性
+}
+
+type ChartPermissionMoveReq struct {
+	ChartPermissionId int `description:"品种id"`
+	//	ParentChartPermissionId int `description:"父级品种id"`
+	PrevChartPermissionId int `description:"上一个兄弟节点品种id"`
+	NextChartPermissionId int `description:"下一个兄弟节点品种id"`
+}
+
+func crmEtaPost(url string, pars interface{}) (respBody []byte, err error) {
+	params, e := json.Marshal(pars)
+	if e != nil {
+		err = fmt.Errorf("data json marshal err: %s", e.Error())
+		return
+	}
+
+	body := ioutil.NopCloser(strings.NewReader(string(params)))
+	client := &http.Client{}
+	req, e := http.NewRequest("POST", url, body)
+	if e != nil {
+		err = fmt.Errorf("http create request err: %s", e.Error())
+		return
+	}
+
+	contentType := "application/json;charset=utf-8"
+	req.Header.Set("Content-Type", contentType)
+	req.Header.Set("Authorization", utils.CrmEtaAuthorization)
+	resp, e := client.Do(req)
+	if e != nil {
+		err = fmt.Errorf("http client do err: %s", e.Error())
+		return
+	}
+	defer func() {
+		_ = resp.Body.Close()
+	}()
+	b, e := ioutil.ReadAll(resp.Body)
+	if e != nil {
+		err = fmt.Errorf("resp body read err: %s", e.Error())
+		return
+	}
+	if len(b) == 0 {
+		err = fmt.Errorf("resp body is empty")
+		return
+	}
+	// 生产环境解密, 注意有个坑前后的双引号
+	if utils.RunMode == "release" {
+		str := string(b)
+		str = strings.Trim(str, `"`)
+		b = utils.DesBase64Decrypt([]byte(str), utils.CrmEtaServerDes3Key)
+	}
+	respBody = b
+	return
+}
+
+func AddChartPermission(pars *ChartPermissionAddReq) (err error, errMsg string) {
+	url := fmt.Sprint(utils.CrmEtaServerUrl, "/api/crm/chart_permission/add")
+	if pars.ProductId == 0 {
+		pars.ProductId = 1 //默认新增ficc的品种
+	}
+	b, err := crmEtaPost(url, pars)
+	if err != nil {
+		errMsg = "新增品种失败"
+		err = fmt.Errorf("url:%s err: %s", url, err.Error())
+		return
+	}
+	//result := new(models.ResultData)
+	result := new(ChartPermissionResp)
+	if e := json.Unmarshal(b, &result); e != nil {
+		errMsg = "新增品种失败"
+		err = fmt.Errorf("result unmarshal err: %s\nresult: %s", e.Error(), string(b))
+		return
+	}
+	utils.FileLog.Info("%s", string(b))
+	if result.Code != 200 {
+		err = fmt.Errorf("result: %s, err: %s", string(b), result.ErrMsg)
+		errMsg = result.Msg
+		return
+	}
+	return
+}
+
+func EditChartPermission(pars *ChartPermissionEditReq) (err error, errMsg string) {
+	url := fmt.Sprint(utils.CrmEtaServerUrl, "/api/crm/chart_permission/edit")
+	b, err := crmEtaPost(url, pars)
+	if err != nil {
+		errMsg = "更新品种失败"
+		err = fmt.Errorf("url:%s err: %s", url, err.Error())
+		return
+	}
+	//result := new(models.ResultData)
+	result := new(ChartPermissionResp)
+	if e := json.Unmarshal(b, &result); e != nil {
+		errMsg = "更新品种失败"
+		err = fmt.Errorf("result unmarshal err: %s\nresult: %s", e.Error(), string(b))
+		return
+	}
+	utils.FileLog.Info("%s", string(b))
+	if result.Code != 200 {
+		err = fmt.Errorf("result: %s, err: %s", string(b), result.ErrMsg)
+		errMsg = result.Msg
+		return
+	}
+	return
+}
+
+func MoveChartPermission(pars *ChartPermissionMoveReq) (err error, errMsg string) {
+	url := fmt.Sprint(utils.CrmEtaServerUrl, "/api/crm/chart_permission/move")
+	b, err := crmEtaPost(url, pars)
+	if err != nil {
+		errMsg = "移动品种失败"
+		err = fmt.Errorf("url:%s err: %s", url, err.Error())
+		return
+	}
+	//result := new(models.ResultData)
+	result := new(ChartPermissionResp)
+	if e := json.Unmarshal(b, &result); e != nil {
+		errMsg = "移动品种失败"
+		err = fmt.Errorf("result unmarshal err: %s\nresult: %s", e.Error(), string(b))
+		return
+	}
+	utils.FileLog.Info("%s", string(b))
+	if result.Code != 200 {
+		err = fmt.Errorf("result: %s, err: %s", string(b), result.ErrMsg)
+		errMsg = result.Msg
+		return
+	}
+	return
 }

+ 170 - 0
services/english_permission.go

@@ -0,0 +1,170 @@
+package services
+
+import (
+	"eta/eta_api/models"
+	"eta/eta_api/utils"
+	"fmt"
+	"time"
+)
+
+// MoveEnPermission 移动品种
+func MoveEnPermission(req models.EnPermissionMoveReq) (err error, errMsg string) {
+	ob := new(models.EnPermission)
+	permissionId := req.PermissionId
+	prevPermissionId := req.PrevPermissionId
+	nextPermissionId := req.NextPermissionId
+
+	//如果有传入 上一个兄弟节点分类id
+	var (
+		permissionInfo *models.EnPermission
+		prevPermission *models.EnPermission
+		nextPermission *models.EnPermission
+
+		prevSort int
+		nextSort int
+	)
+
+	// 移动对象为分类, 判断权限
+	permissionInfo, err = ob.GetItemById(permissionId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			errMsg = "品种不存在, 请刷新页面"
+			err = fmt.Errorf("获取品种信息失败,Err:" + err.Error())
+			return
+		}
+		errMsg = "移动失败"
+		err = fmt.Errorf("获取分类信息失败,Err:" + err.Error())
+		return
+	} else if permissionInfo.EnPermissionId == 0 {
+		errMsg = "品种不存在, 请刷新页面"
+		err = fmt.Errorf("获取品种信息失败,Err:" + err.Error())
+		return
+	}
+
+	parentPermissionId := permissionInfo.ParentId
+	if prevPermissionId > 0 {
+		prevPermission, err = ob.GetItemById(prevPermissionId)
+		if err != nil {
+			if err.Error() == utils.ErrNoRow() {
+				errMsg = "上一个品种不存在, 请刷新页面"
+				err = fmt.Errorf("获取品种信息失败,Err:" + err.Error())
+				return
+			}
+			errMsg = "移动失败"
+			err = fmt.Errorf("获取上一个兄弟节点分类信息失败,Err:" + err.Error())
+			return
+		}
+		prevSort = prevPermission.Sort
+	}
+
+	if nextPermissionId > 0 {
+		//下一个兄弟节点
+		nextPermission, err = ob.GetItemById(nextPermissionId)
+		if err != nil {
+			if err.Error() == utils.ErrNoRow() {
+				errMsg = "下一个品种不存在, 请刷新页面"
+				err = fmt.Errorf("获取品种信息失败,Err:" + err.Error())
+				return
+			}
+			errMsg = "移动失败"
+			err = fmt.Errorf("获取下一个兄弟节点分类信息失败,Err:" + err.Error())
+			return
+		}
+		nextSort = nextPermission.Sort
+	}
+
+	err, errMsg = moveEnPermission(permissionInfo, prevPermission, nextPermission, parentPermissionId, prevSort, nextSort)
+	return
+}
+
+// moveEnPermission 移动品种
+func moveEnPermission(permissionInfo, prevPermission, nextPermission *models.EnPermission, parentId, prevSort, nextSort int) (err error, errMsg string) {
+	ob := new(models.EnPermission)
+	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 {
+					_ = models.UpdateEnPermissionSortByParentId(parentId, prevPermission.EnPermissionId, prevPermission.Sort, updateSortStr)
+				} else {
+					_ = models.UpdateEnPermissionSortByParentId(parentId, 0, prevSort, updateSortStr)
+				}
+
+			} else {
+				//如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
+				if nextSort-prevSort == 1 {
+					//变更兄弟节点的排序
+					updateSortStr := `sort + 1`
+
+					//变更分类
+					if prevPermission != nil {
+						_ = models.UpdateEnPermissionSortByParentId(parentId, prevPermission.EnPermissionId, prevSort, updateSortStr)
+					} else {
+						_ = models.UpdateEnPermissionSortByParentId(parentId, 0, prevSort, updateSortStr)
+					}
+
+				}
+			}
+		}
+
+		permissionInfo.Sort = prevSort + 1
+		permissionInfo.ModifyTime = time.Now()
+		updateCol = append(updateCol, "Sort", "ModifyTime")
+	} 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.ModifyTime = time.Now()
+		updateCol = append(updateCol, "Sort", "ModifyTime")
+	} else {
+		// 拖动到父级分类的第一位
+		firstPermission, tmpErr := ob.GetFirstEnPermissionByParentId(parentId)
+		if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+			errMsg = "移动失败"
+			err = fmt.Errorf("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tmpErr.Error())
+			return
+		}
+
+		//如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
+		if firstPermission != nil && firstPermission.EnPermissionId != 0 && firstPermission.Sort == 0 {
+			updateSortStr := ` sort + 1 `
+			_ = models.UpdateEnPermissionSortByParentId(parentId, firstPermission.EnPermissionId-1, 0, updateSortStr)
+		}
+
+		permissionInfo.Sort = 0 //那就是排在第一位
+		permissionInfo.ModifyTime = time.Now()
+		updateCol = append(updateCol, "Sort", "ModifyTime")
+	}
+
+	//更新
+	if len(updateCol) > 0 {
+		err = permissionInfo.Update(updateCol)
+		if err != nil {
+			errMsg = "移动失败"
+			err = fmt.Errorf("修改失败,Err:" + err.Error())
+			return
+		}
+	}
+	return
+}