Browse Source

Merge branch 'feature/eta1.1.0_edb_classify' of eta_server/eta_api into master

xyxie 1 year ago
parent
commit
ca4bf27533

+ 170 - 44
controllers/data_manage/edb_classify.go

@@ -8,6 +8,7 @@ import (
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/data"
 	"eta/eta_api/utils"
+	"sort"
 )
 
 // EdbClassifyController 数据管理-分类模块
@@ -15,47 +16,6 @@ type EdbClassifyController struct {
 	controllers.BaseAuthController
 }
 
-//
-//// @Title 分类列表
-//// @Description 分类列表接口
-//// @Success 200 {object} data_manage.EdbClassifyListResp
-//// @router /classify/list [get]
-//func (this *EdbClassifyController) List() {
-//	br := new(models.BaseResponse).Init()
-//	defer func() {
-//		this.Data["json"] = br
-//		this.ServeJSON()
-//	}()
-//	rootList, err := data_manage.GetEdbClassifyByParentId(0)
-//	if err != nil {
-//		br.Msg = "获取失败"
-//		br.ErrMsg = "获取数据失败,Err:" + err.Error()
-//		return
-//	}
-//
-//	classifyAll, err := data_manage.GetEdbClassifyAll()
-//	if err != nil {
-//		br.Msg = "获取失败"
-//		br.ErrMsg = "获取数据失败,Err:" + err.Error()
-//		return
-//	}
-//
-//	fmt.Println("start:", time.Now())
-//	nodeAll := make([]*data_manage.EdbClassifyItems, 0)
-//	for k := range rootList {
-//		rootNode := rootList[k]
-//		data.EdbClassifyListMakeTree(classifyAll, rootNode)
-//		nodeAll = append(nodeAll, rootNode)
-//	}
-//	fmt.Println("end:", time.Now())
-//	resp := new(data_manage.EdbClassifyListResp)
-//	resp.AllNodes = nodeAll
-//	br.Ret = 200
-//	br.Success = true
-//	br.Msg = "获取成功"
-//	br.Data = resp
-//}
-
 // ListV2
 // @Title 分类列表
 // @Description 分类列表接口
@@ -527,13 +487,13 @@ func (this *EdbClassifyController) EdbClassifyMove() {
 		return
 	}
 
-	if req.ClassifyId <= 0 {
+	if req.ClassifyId <= 0 && req.EdbInfoId <= 0 {
 		br.Msg = "参数错误"
-		br.ErrMsg = "分类id小于等于0"
+		br.ErrMsg = "请选择拖动目标,分类目录或者指标"
 		return
 	}
 
-	err, errMsg := data.MoveEdbClassify(req.ClassifyId, req.ParentClassifyId, req.PrevClassifyId, req.NextClassifyId, sysUser)
+	err, errMsg := data.MoveEdbClassify(req, sysUser, 0)
 	if errMsg != `` {
 		br.Msg = errMsg
 		br.ErrMsg = errMsg
@@ -897,6 +857,172 @@ func (this *EdbClassifyController) ItemsV3() {
 	br.Data = resp
 }
 
+// SimpleList
+// @Title 单层分类列表
+// @Description 单层分类列表
+// @Success 200 {object} data_manage.EdbClassifyListResp
+// @router /classify/simple [get]
+func (this *EdbClassifyController) SimpleList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	// 默认查一级分类和一级分类下的指标信息,
+	// 如果是 子级分类,查询该子级分类的下一级分类和指标信息
+	// 增加标识判断是文件夹还是指标列表
+	parentId, _ := this.GetInt("ParentId")
+
+	rootList, err := data_manage.GetEdbClassifyByParentId(parentId, 0)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	nodeAll := make([]*data_manage.EdbClassifyItems, 0)
+
+	var sortList data_manage.EdbClassifyItemList
+	if parentId > 0 {
+		// 查询挂在当前分类上的指标列表
+		// 获取当前账号的不可见指标
+		obj := data_manage.EdbInfoNoPermissionAdmin{}
+		confList, err := obj.GetAllListByAdminId(this.SysUser.AdminId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
+			return
+		}
+		noPermissionEdbInfoIdMap := make(map[int]bool)
+		for _, v := range confList {
+			noPermissionEdbInfoIdMap[v.EdbInfoId] = true
+		}
+		allEdbInfo, err := data_manage.GetEdbInfoByClassifyId(parentId, 0, 0)
+		if err != nil {
+			br.Msg = "获取指标数据失败"
+			br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
+			return
+		}
+
+		for _, v := range allEdbInfo {
+			// 如果指标不可见,那么就不返回该指标
+			if _, ok := noPermissionEdbInfoIdMap[v.EdbInfoId]; ok {
+				continue
+			}
+			button := data.GetEdbOpButton(this.SysUser, v.SysUserId, v.EdbType, utils.EDB_INFO_TYPE)
+			button.AddButton = false //不管有没有权限,指标都是没有添加按钮的
+			v.Button = button
+			v.Children = make([]*data_manage.EdbClassifyItems, 0)
+			v.ParentId = parentId
+			nodeAll = append(nodeAll, v)
+		}
+	}
+	if len(rootList) > 0 {
+		for _, v := range rootList {
+			button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId)
+			v.Button = button
+			v.Children = make([]*data_manage.EdbClassifyItems, 0)
+			nodeAll = append(nodeAll, v)
+		}
+	}
+	if len(nodeAll) > 0 {
+		//根据sort值排序
+		sortList = nodeAll
+		sort.Sort(sortList)
+	}
+
+	language := `CN`
+	// 指标显示的语言
+	{
+		configDetail, _ := system.GetConfigDetailByCode(this.SysUser.AdminId, system.EdbLanguageVar)
+		if configDetail != nil {
+			language = configDetail.ConfigValue
+		} else {
+			configDetail, _ = system.GetDefaultConfigDetailByCode(system.EdbLanguageVar)
+			if configDetail != nil {
+				language = configDetail.ConfigValue
+			}
+		}
+	}
+
+	// 是否允许添加一级分类
+	canOpClassify := true
+	button := data.GetEdbClassifyOpButton(this.SysUser, 0)
+	if !button.AddButton {
+		canOpClassify = false
+	}
+
+	resp := new(data_manage.EdbClassifyListResp)
+	resp.AllNodes = sortList
+	resp.Language = language
+	resp.CanOpClassify = canOpClassify
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// ClassifyTree
+// @Title 多层分类列表树
+// @Description 多层分类列表树
+// @Success 200 {object} data_manage.EdbClassifyListResp
+// @router /classify/tree [get]
+func (this *EdbClassifyController) ClassifyTree() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	allList, err := data_manage.GetNormalEdbClassifyAll()
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	nodeAll := make([]*data_manage.EdbClassifyItems, 0)
+	var sortList data_manage.EdbClassifyItemList
+
+	if len(allList) > 0 {
+		for k, v := range allList {
+			button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId)
+			allList[k].Button = button
+		}
+		nodeAll = data.GetClassifyTreeRecursive(allList, 0)
+		//根据sort值排序
+		sortList = nodeAll
+		sort.Sort(sortList)
+	}
+	language := `CN`
+	// 指标显示的语言
+	{
+		configDetail, _ := system.GetConfigDetailByCode(this.SysUser.AdminId, system.EdbLanguageVar)
+		if configDetail != nil {
+			language = configDetail.ConfigValue
+		} else {
+			configDetail, _ = system.GetDefaultConfigDetailByCode(system.EdbLanguageVar)
+			if configDetail != nil {
+				language = configDetail.ConfigValue
+			}
+		}
+	}
+
+	// 是否允许添加一级分类
+	canOpClassify := true
+	button := data.GetEdbClassifyOpButton(this.SysUser, 0)
+	if !button.AddButton {
+		canOpClassify = false
+	}
+
+	resp := new(data_manage.EdbClassifyListResp)
+	resp.AllNodes = sortList
+	resp.Language = language
+	resp.CanOpClassify = canOpClassify
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
 // EdbClassifyMoveV2
 // @Title 分类移动接口v2
 // @Description 分类移动接口v2

+ 33 - 18
controllers/data_manage/edb_info.go

@@ -1748,11 +1748,16 @@ func (this *EdbInfoController) EdbInfoList() {
 	//是否展示英文标识
 	edbInfoItem.IsEnEdb = data.CheckIsEnEdb(edbInfoItem.EdbNameEn, edbInfoItem.Unit, edbInfoItem.UnitEn)
 	//查询目录
-	resultList, _ := data_manage.GetClassifyAllByClassifyId(edbInfoItem.ClassifyId)
+	classifyList, err, errMsg := data.GetFullClassifyByClassifyId(edbInfoItem.ClassifyId)
+	if err != nil {
+		br.Msg = err.Error()
+		br.ErrMsg = errMsg
+		return
+	}
 
 	resp.Paging = page
 	resp.Item = edbInfoItem
-	resp.ClassifyList = resultList
+	resp.ClassifyList = classifyList
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
@@ -2444,11 +2449,20 @@ func (this *EdbInfoController) EdbInfoDetail() {
 		br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
 		return
 	}
+	var resp data_manage.EdbInfoFullClassify
+	classifyList, err, errMsg := data.GetFullClassifyByClassifyId(edbInfo.ClassifyId)
+	if err != nil {
+		br.Msg = err.Error()
+		br.ErrMsg = errMsg
+		return
+	}
+	resp.EdbInfo = edbInfo
+	resp.ClassifyList = classifyList
 
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
-	br.Data = edbInfo
+	br.Data = resp
 }
 
 // EdbInfoFilter
@@ -2987,8 +3001,17 @@ func (this *ChartInfoController) EdbInfoData() {
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
-	resp := new(data_manage.EdbInfoDataResp)
-	resp.EdbInfo = edbInfo
+	fullEdb := new(data_manage.EdbInfoFullClassify)
+	resp := new(data_manage.EdbInfoDataFullClassifyResp)
+	classifyList, err, errMsg := data.GetFullClassifyByClassifyId(edbInfo.ClassifyId)
+	if err != nil {
+		br.Msg = err.Error()
+		br.ErrMsg = errMsg
+		return
+	}
+	fullEdb.EdbInfo = edbInfo
+	fullEdb.ClassifyList = classifyList
+	resp.EdbInfo = fullEdb
 	resp.DataList = dataList
 	br.Ret = 200
 	br.Success = true
@@ -4500,26 +4523,18 @@ func (this *EdbInfoController) EdbChartList() {
 	// 分类筛选
 	classifyId, _ := this.GetInt("ClassifyId")
 	if classifyId > 0 {
-		strClassifyIds, e := data_manage.GetEdbClassify(classifyId)
+		childClassify, e, _ := data.GetChildClassifyByClassifyId(classifyId)
 		if e != nil && e.Error() != utils.ErrNoRow() {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取分类信息失败, GetEdbClassify,Err:" + e.Error()
 			return
 		}
 		var classifyIds []int
-		classifyIdArr := strings.Split(strClassifyIds, ",")
-		for _, v := range classifyIdArr {
-			c, _ := strconv.Atoi(v)
-			if c > 0 {
-				classifyIds = append(classifyIds, c)
-			}
-		}
-		if len(classifyIds) > 0 {
-			condition += fmt.Sprintf(` AND classify_id IN (%s) `, utils.GetOrmInReplace(len(classifyIds)))
-			pars = append(pars, classifyIds)
-		} else {
-			condition += ` AND 1=2 `
+		for _, v := range childClassify {
+			classifyIds = append(classifyIds, v.ClassifyId)
 		}
+		condition += fmt.Sprintf(` AND classify_id IN (%s) `, utils.GetOrmInReplace(len(classifyIds)))
+		pars = append(pars, classifyIds)
 	}
 
 	// 创建人

+ 7 - 0
controllers/data_manage/edb_info_calculate.go

@@ -218,7 +218,14 @@ func (this *ChartInfoController) CalculateDetail() {
 	}
 
 	fullEdb := new(data_manage.EdbInfoFullClassify)
+	classifyList, err, errMsg := data.GetFullClassifyByClassifyId(edbInfo.ClassifyId)
+	if err != nil {
+		br.Msg = err.Error()
+		br.ErrMsg = errMsg
+		return
+	}
 	fullEdb.EdbInfo = edbInfo
+	fullEdb.ClassifyList = classifyList
 
 	// 拟合残差计算相关系数
 	if edbInfo.Source == utils.DATA_SOURCE_CALCULATE_NHCC {

+ 178 - 3
controllers/data_manage/predict_edb_classify.go

@@ -8,6 +8,7 @@ import (
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/data"
 	"eta/eta_api/utils"
+	"sort"
 )
 
 // PredictEdbClassifyController 数据管理-预测指标分类模块
@@ -387,13 +388,13 @@ func (this *PredictEdbClassifyController) Move() {
 		return
 	}
 
-	if req.ClassifyId <= 0 {
+	if req.ClassifyId <= 0 && req.EdbInfoId <= 0 {
 		br.Msg = "参数错误"
-		br.ErrMsg = "分类id小于等于0"
+		br.ErrMsg = "请选择拖动目标,分类目录或者指标"
 		return
 	}
 
-	err, errMsg := data.MoveEdbClassify(req.ClassifyId, req.ParentClassifyId, req.PrevClassifyId, req.NextClassifyId, sysUser)
+	err, errMsg := data.MoveEdbClassify(req, sysUser, 1)
 	if errMsg != `` {
 		br.Msg = errMsg
 		br.ErrMsg = errMsg
@@ -653,3 +654,177 @@ func (this *PredictEdbClassifyController) ListV2() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// SimpleList
+// @Title 单层分类列表
+// @Description 单层分类列表
+// @Success 200 {object} data_manage.EdbClassifyListResp
+// @router /predict_classify/simple [get]
+func (this *PredictEdbClassifyController) SimpleList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	// 默认查一级分类和一级分类下的指标信息,
+	// 如果是 子级分类,查询该子级分类的下一级分类和指标信息
+	// 增加标识判断是文件夹还是指标列表
+	parentId, _ := this.GetInt("ParentId")
+	isOnlyMe, _ := this.GetBool("IsOnlyMe")
+	// 如果选择了只看我的,那么只查询归属于我的账号
+	sysUserId := 0
+	if isOnlyMe {
+		sysUserId = this.SysUser.AdminId
+	}
+
+	rootList, err := data_manage.GetEdbClassifyByParentId(parentId, 1)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	nodeAll := make([]*data_manage.EdbClassifyItems, 0)
+
+	var sortList data_manage.EdbClassifyItemList
+	if parentId > 0 {
+		// 查询挂在当前分类上的指标列表
+		// 获取当前账号的不可见指标
+		obj := data_manage.EdbInfoNoPermissionAdmin{}
+		confList, err := obj.GetAllListByAdminId(this.SysUser.AdminId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
+			return
+		}
+		noPermissionEdbInfoIdMap := make(map[int]bool)
+		for _, v := range confList {
+			noPermissionEdbInfoIdMap[v.EdbInfoId] = true
+		}
+		allEdbInfo, err := data_manage.GetEdbInfoByClassifyId(parentId, 1, sysUserId)
+		if err != nil {
+			br.Msg = "获取指标数据失败"
+			br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
+			return
+		}
+
+		for _, v := range allEdbInfo {
+			// 如果指标不可见,那么就不返回该指标
+			if _, ok := noPermissionEdbInfoIdMap[v.EdbInfoId]; ok {
+				continue
+			}
+			button := data.GetPredictEdbOpButton(this.SysUser, v.SysUserId)
+			button.AddButton = false //不管有没有权限,指标都是没有添加按钮的
+			button.OpButton = false
+			button.DeleteButton = false
+			v.Button = button
+			v.Children = make([]*data_manage.EdbClassifyItems, 0)
+			v.ParentId = parentId
+			nodeAll = append(nodeAll, v)
+		}
+	}
+	if len(rootList) > 0 {
+		for _, v := range rootList {
+			button := data.GetPredictEdbClassifyOpButton(this.SysUser, v.SysUserId)
+			v.Button = button
+			v.Children = make([]*data_manage.EdbClassifyItems, 0)
+			nodeAll = append(nodeAll, v)
+		}
+	}
+	if len(nodeAll) > 0 {
+		//根据sort值排序
+		sortList = nodeAll
+		sort.Sort(sortList)
+	}
+
+	// 是否允许添加一级分类
+	canOpClassify := true
+	button := data.GetPredictEdbClassifyOpButton(this.SysUser, 0)
+	if !button.AddButton {
+		canOpClassify = false
+	}
+
+	language := `CN`
+	// 指标显示的语言
+	{
+		configDetail, _ := system.GetConfigDetailByCode(this.SysUser.AdminId, system.PredictEdbLanguageVar)
+		if configDetail != nil {
+			language = configDetail.ConfigValue
+		} else {
+			configDetail, _ = system.GetDefaultConfigDetailByCode(system.PredictEdbLanguageVar)
+			if configDetail != nil {
+				language = configDetail.ConfigValue
+			}
+		}
+	}
+
+	resp := new(data_manage.EdbClassifyListResp)
+	resp.AllNodes = sortList
+	resp.Language = language
+	resp.CanOpClassify = canOpClassify
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// ClassifyTree
+// @Title 多层分类列表树
+// @Description 多层分类列表树
+// @Success 200 {object} data_manage.EdbClassifyListResp
+// @router /predict_classify/tree [get]
+func (this *PredictEdbClassifyController) ClassifyTree() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	allList, err := data_manage.GetPredictEdbClassifyAll()
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	nodeAll := make([]*data_manage.EdbClassifyItems, 0)
+	var sortList data_manage.EdbClassifyItemList
+
+	if len(allList) > 0 {
+		for k, v := range allList {
+			button := data.GetPredictEdbClassifyOpButton(this.SysUser, v.SysUserId)
+			allList[k].Button = button
+		}
+		nodeAll = data.GetClassifyTreeRecursive(allList, 0)
+		//根据sort值排序
+		sortList = nodeAll
+		sort.Sort(sortList)
+	}
+	// 是否允许添加一级分类
+	canOpClassify := true
+	button := data.GetPredictEdbClassifyOpButton(this.SysUser, 0)
+	if !button.AddButton {
+		canOpClassify = false
+	}
+
+	language := `CN`
+	// 指标显示的语言
+	{
+		configDetail, _ := system.GetConfigDetailByCode(this.SysUser.AdminId, system.PredictEdbLanguageVar)
+		if configDetail != nil {
+			language = configDetail.ConfigValue
+		} else {
+			configDetail, _ = system.GetDefaultConfigDetailByCode(system.PredictEdbLanguageVar)
+			if configDetail != nil {
+				language = configDetail.ConfigValue
+			}
+		}
+	}
+
+	resp := new(data_manage.EdbClassifyListResp)
+	resp.AllNodes = sortList
+	resp.Language = language
+	resp.CanOpClassify = canOpClassify
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 37 - 14
controllers/data_manage/predict_edb_info.go

@@ -10,6 +10,7 @@ import (
 	"eta/eta_api/services/data"
 	"eta/eta_api/services/elastic"
 	"eta/eta_api/utils"
+	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"github.com/shopspring/decimal"
 	"sort"
@@ -75,14 +76,18 @@ func (this *PredictEdbInfoController) EdbChartList() {
 
 	// 筛选分类
 	if classifyId > 0 {
-		classifyIds, err := data_manage.GetEdbClassify(classifyId)
-		if err != nil && err.Error() != utils.ErrNoRow() {
-			br.Msg = "获取分类信息失败"
-			br.ErrMsg = "获取分类信息失败,GetEdbClassifyById,Err:" + err.Error()
+		childClassify, e, _ := data.GetChildClassifyByClassifyId(classifyId)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取分类信息失败, GetEdbClassify,Err:" + e.Error()
 			return
 		}
-		condition += " AND classify_id IN(" + classifyIds + ") "
-
+		var classifyIds []int
+		for _, v := range childClassify {
+			classifyIds = append(classifyIds, v.ClassifyId)
+		}
+		condition += fmt.Sprintf(` AND classify_id IN (%s) `, utils.GetOrmInReplace(len(classifyIds)))
+		pars = append(pars, classifyIds)
 	}
 	if adminId > 0 {
 		condition += " AND sys_user_id = ? "
@@ -219,9 +224,6 @@ func (this *PredictEdbInfoController) List() {
 	//获取英文频度
 	edbInfoItem.FrequencyEn = data.GetFrequencyEn(edbInfoItem.Frequency)
 
-	//查询目录
-	resultList, _ := data_manage.GetClassifyAllByClassifyId(edbInfoItem.ClassifyId)
-
 	// 未来的指标预测数据
 	predictDataList := make([]*data_manage.EdbData, 0)
 
@@ -398,9 +400,17 @@ func (this *PredictEdbInfoController) List() {
 	if edbInfoItem.DataList == nil {
 		edbInfoItem.DataList = make([]*data_manage.EdbData, 0)
 	}
+	//查询目录
+	classifyList, err, errMsg := data.GetFullClassifyByClassifyId(edbInfoItem.ClassifyId)
+	if err != nil {
+		br.Msg = err.Error()
+		br.ErrMsg = errMsg
+		return
+	}
+
 	resp.Paging = page
 	resp.Item = edbInfoItem
-	resp.ClassifyList = resultList
+	resp.ClassifyList = classifyList
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
@@ -965,6 +975,12 @@ func (this *PredictEdbInfoController) Detail() {
 			calculateList[k] = v
 		}
 	}
+	classifyList, err, errMsg := data.GetFullClassifyByClassifyId(edbInfo.ClassifyId)
+	if err != nil {
+		br.Msg = err.Error()
+		br.ErrMsg = errMsg
+		return
+	}
 
 	// 拟合残差计算相关系数
 	var correlationStr string
@@ -1016,6 +1032,7 @@ func (this *PredictEdbInfoController) Detail() {
 		CalculateList:  calculateList,
 		RuleList:       predictEdbConfList,
 		CorrelationStr: correlationStr,
+		ClassifyList:   classifyList,
 	}
 	br.Ret = 200
 	br.Success = true
@@ -1337,11 +1354,17 @@ func (this *PredictEdbInfoController) DataList() {
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
-
+	classifyList, err, errMsg := data.GetFullClassifyByClassifyId(edbInfo.ClassifyId)
+	if err != nil {
+		br.Msg = err.Error()
+		br.ErrMsg = errMsg
+		return
+	}
 	resp := response.PredictEdbInfoDataResp{
-		EdbInfo:  edbInfo,
-		DataList: resultDataList,
-		Button:   button,
+		EdbInfo:      edbInfo,
+		DataList:     resultDataList,
+		Button:       button,
+		ClassifyList: classifyList,
 	}
 	br.Ret = 200
 	br.Success = true

+ 81 - 1
models/data_manage/edb_classify.go

@@ -13,6 +13,7 @@ type EdbClassify struct {
 	ClassifyType    uint8     `description:"分类类型,0:普通指标分类,1:预测指标分类"`
 	ClassifyName    string    `description:"分类名称"`
 	ParentId        int       `description:"父级id"`
+	RootId          int       `description:"顶级id"`
 	HasData         int       `description:"是否含有指标数据"`
 	CreateTime      time.Time `description:"创建时间"`
 	ModifyTime      time.Time `description:"修改时间"`
@@ -117,6 +118,26 @@ func GetEdbClassifyByParentId(parentId int, classifyType int8) (items []*EdbClas
 	return
 }
 
+func GetEdbClassifyByRootIdLevel(rootId int, classifyType uint8, orderStr string) (items []*EdbClassifyItems, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_classify WHERE root_id=? AND classify_type = ? `
+	if orderStr != "" {
+		sql += orderStr
+	} else {
+		sql += ` order by level desc, sort asc, classify_id asc`
+	}
+
+	_, err = o.Raw(sql, rootId, classifyType).QueryRows(&items)
+	return
+}
+
+func GetEdbClassifyByRootIdLevelOrder(rootId int, classifyType uint8) (items []*EdbClassifyItems, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_classify WHERE root_id=? AND classify_type = ? order by level desc, sort asc, classify_id asc`
+	_, err = o.Raw(sql, rootId, classifyType).QueryRows(&items)
+	return
+}
+
 // GetEdbClassifyAll 获取普通指标的分类列表
 func GetEdbClassifyAll() (items []*EdbClassifyItems, err error) {
 	o := orm.NewOrmUsingDB("data")
@@ -125,6 +146,14 @@ func GetEdbClassifyAll() (items []*EdbClassifyItems, err error) {
 	return
 }
 
+// GetNormalEdbClassifyAll 获取普通指标的分类列表
+func GetNormalEdbClassifyAll() (items []*EdbClassifyItems, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_classify WHERE  classify_type = 0  order by sort asc,classify_id asc`
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
 // GetPredictEdbClassifyAll 获取预测指标的分类列表
 func GetPredictEdbClassifyAll() (items []*EdbClassifyItems, err error) {
 	o := orm.NewOrmUsingDB("data")
@@ -139,6 +168,7 @@ type EdbClassifyItems struct {
 	ClassifyName    string
 	ClassifyNameEn  string
 	ParentId        int
+	RootId          int    `description:"顶级id"`
 	Level           int    `description:"层级"`
 	Sort            int    `description:"排序字段,越小越靠前,默认值:10"`
 	UniqueCode      string `description:"唯一编码"`
@@ -153,6 +183,29 @@ type EdbClassifyItems struct {
 	Button          EdbClassifyItemsButton `description:"操作权限"`
 }
 
+type EdbClassifyIdItems struct {
+	ClassifyId   int `description:"分类id"`
+	ClassifyName string
+	UniqueCode   string `description:"唯一编码"`
+	ParentId     int    `description:"父级分类id"`
+	Level        int    `description:"层级"`
+	RootId       int    `description:"顶级分类id"`
+}
+
+type EdbClassifyItemList []*EdbClassifyItems
+
+func (m EdbClassifyItemList) Len() int {
+	return len(m)
+}
+
+func (m EdbClassifyItemList) Less(i, j int) bool {
+	return m[i].Sort < m[j].Sort
+}
+
+func (m EdbClassifyItemList) Swap(i, j int) {
+	m[i], m[j] = m[j], m[i]
+}
+
 // EdbClassifyItemsButton 操作按钮
 type EdbClassifyItemsButton struct {
 	AddButton           bool `description:"是否可添加"`
@@ -165,7 +218,7 @@ type EdbClassifyItemsButton struct {
 }
 
 type EdbClassifyListResp struct {
-	AllNodes      []*EdbClassifyItems
+	AllNodes      EdbClassifyItemList
 	CanOpClassify bool   `description:"是否允许操作分类"`
 	Language      string `description:"指标的展示语言,CN:中文,EN:英文"`
 }
@@ -229,6 +282,9 @@ type MoveEdbClassifyReq struct {
 	ParentClassifyId int `description:"父级分类id"`
 	PrevClassifyId   int `description:"上一个兄弟节点分类id"`
 	NextClassifyId   int `description:"下一个兄弟节点分类id"`
+	EdbInfoId        int `description:"指标ID, 如果指标ID有值,则移动对象为指标,否则认为移动对象为分类"`
+	PrevEdbInfoId    int `description:"上一个指标ID"`
+	NextEdbInfoId    int `description:"下一个指标ID"`
 }
 
 // GetFirstEdbClassifyByParentId 获取当前父级分类下,且排序数相同 的排序第一条的数据
@@ -265,6 +321,14 @@ func GetEdbClassifyMaxSort(parentId int, classifyType uint8) (sort int, err erro
 	return
 }
 
+// GetEdbInfoMaxSortByClassifyId 获取分类下指标的最大的排序数
+func GetEdbInfoMaxSortByClassifyId(classifyId int) (sort int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT Max(sort) AS sort FROM edb_info WHERE classify_id=? `
+	err = o.Raw(sql, classifyId).QueryRow(&sort)
+	return
+}
+
 type ClassifyEdbInfoListResp struct {
 	EdbInfoList []*EdbClassifyItems
 }
@@ -448,3 +512,19 @@ func FixPredictEdbClassifySysUser() {
 	}
 	fmt.Println("EditChartClassifySysUser end")
 }
+
+func UpdateEdbClassifyChildByParentClassifyId(classifyIds []int, rootId int, levelStep int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	var pars []interface{}
+	pars = append(pars, rootId, levelStep)
+	pars = append(pars, classifyIds)
+	// 更新相关联的二级分类的parentId,和classify_name_second
+	sql := `update edb_classify 
+SET root_id = ?, level = level+?
+where classify_id IN (` + utils.GetOrmInReplace(len(classifyIds)) + `)`
+	_, err = o.Raw(sql, pars).Exec()
+	if err != nil {
+		return
+	}
+	return
+}

+ 12 - 5
models/data_manage/edb_info.go

@@ -47,10 +47,10 @@ type EdbInfo struct {
 	DataDateType     string  `orm:"column(data_date_type);size(255);null;default(交易日)"`
 	ManualSave       int     `description:"是否有手动保存过上下限: 0-否; 1-是"`
 }
-
 type EdbInfoFullClassify struct {
 	*EdbInfo
 	CorrelationStr string `description:"相关性系数字符串"`
+	ClassifyList   []*EdbClassifyIdItems
 }
 
 func AddEdbInfo(item *EdbInfo) (lastId int64, err error) {
@@ -302,7 +302,7 @@ type EdbData struct {
 type EdbInfoListResp struct {
 	Paging       *paging.PagingItem
 	Item         *EdbInfoList
-	ClassifyList []*EdbClassifySimplify
+	ClassifyList []*EdbClassifyIdItems
 }
 
 func GetEdbInfoByCondition(condition string, pars []interface{}) (item *EdbInfoList, err error) {
@@ -732,9 +732,11 @@ func GetFirstEdbInfoByClassifyId(classifyId int) (item *EdbInfo, err error) {
 // UpdateEdbInfoSortByClassifyId 根据分类id更新排序
 func UpdateEdbInfoSortByClassifyId(classifyId, nowSort int, prevEdbInfoId int, updateSort string) (err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := ` update edb_info set sort = ` + updateSort + ` WHERE classify_id=? AND `
+	sql := ` update edb_info set sort = ` + updateSort + ` WHERE classify_id=?`
 	if prevEdbInfoId > 0 {
-		sql += ` ( sort > ? or ( edb_info_id > ` + fmt.Sprint(prevEdbInfoId) + ` and sort=` + fmt.Sprint(nowSort) + ` )) `
+		sql += ` AND ( sort > ? or ( edb_info_id > ` + fmt.Sprint(prevEdbInfoId) + ` and sort=` + fmt.Sprint(nowSort) + ` )) `
+	} else {
+		sql += ` AND ( sort > ? )`
 	}
 	_, err = o.Raw(sql, classifyId, nowSort).Exec()
 	return
@@ -752,6 +754,11 @@ type EdbInfoDataResp struct {
 	DataList []*EdbDataList
 }
 
+type EdbInfoDataFullClassifyResp struct {
+	EdbInfo  *EdbInfoFullClassify
+	DataList []*EdbDataList
+}
+
 type EdbInfoReplaceReq struct {
 	OldEdbInfoId int `description:"原指标ID"`
 	NewEdbInfoId int `description:"替换为指标ID"`
@@ -1718,7 +1725,7 @@ type SetEdbDataInsertConfigReq struct {
 // GetEdbInfoByClassifyId 用于分类展示
 func GetEdbInfoByClassifyId(classifyId, edbInfoType, adminId int) (items []*EdbClassifyItems, err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT edb_info_id,classify_id,edb_name_source AS classify_name,edb_name_en AS classify_name_en,unique_code,source_name,source,sys_user_id,sys_user_real_name,start_date,edb_code,edb_type FROM edb_info WHERE classify_id = ? AND edb_info_type = ?`
+	sql := ` SELECT edb_info_id,classify_id,edb_name_source AS classify_name,edb_name_en AS classify_name_en,unique_code,source_name,source,sys_user_id,sys_user_real_name,start_date,edb_code,edb_type, sort FROM edb_info WHERE classify_id = ? AND edb_info_type = ?`
 
 	pars := []interface{}{classifyId, edbInfoType}
 	// 如果筛选了用户id

+ 5 - 3
models/data_manage/response/predit_edb_info.go

@@ -19,9 +19,10 @@ type PredictEdbInfoListResp struct {
 
 // PredictEdbInfoDataResp 预测指标数据返回
 type PredictEdbInfoDataResp struct {
-	EdbInfo  *data_manage.EdbInfo
-	Button   data_manage.EdbClassifyItemsButton
-	DataList interface{}
+	EdbInfo      *data_manage.EdbInfo
+	Button       data_manage.EdbClassifyItemsButton
+	DataList     interface{}
+	ClassifyList []*data_manage.EdbClassifyIdItems `description:"父级分类列表"`
 }
 
 // PredictEdbInfo 预测指标详情
@@ -32,6 +33,7 @@ type PredictEdbInfo struct {
 	CalculateList  []*data_manage.EdbInfoCalculateDetail `description:"关联指标"`
 	RuleList       []data_manage.PredictEdbConfDetail    `description:"指标规则配置"`
 	CorrelationStr string                                `description:"相关性系数字符串"`
+	ClassifyList   []*data_manage.EdbClassifyIdItems     `description:"父级分类列表"`
 }
 
 // PredictEdbInfoChartDataResp 获取预测指标绘图数据返回

+ 36 - 0
routers/commentsRouter.go

@@ -1618,6 +1618,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbClassifyController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbClassifyController"],
+        beego.ControllerComments{
+            Method: "SimpleList",
+            Router: `/classify/simple`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbClassifyController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbClassifyController"],
+        beego.ControllerComments{
+            Method: "ClassifyTree",
+            Router: `/classify/tree`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbClassifyController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbClassifyController"],
         beego.ControllerComments{
             Method: "EdbClassifyMove",
@@ -3220,6 +3238,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:PredictEdbClassifyController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:PredictEdbClassifyController"],
+        beego.ControllerComments{
+            Method: "SimpleList",
+            Router: `/predict_classify/simple`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:PredictEdbClassifyController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:PredictEdbClassifyController"],
+        beego.ControllerComments{
+            Method: "ClassifyTree",
+            Router: `/predict_classify/tree`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:PredictEdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:PredictEdbInfoController"],
         beego.ControllerComments{
             Method: "Add",

+ 570 - 78
services/data/edb_classify.go

@@ -48,6 +48,125 @@ func edbClassifyHaveChild(allNode []*data_manage.EdbClassifyItems, node *data_ma
 	return
 }
 
+// GetClassifyTreeRecursive 递归获取分类树形结构
+func GetClassifyTreeRecursive(list []*data_manage.EdbClassifyItems, parentId int) []*data_manage.EdbClassifyItems {
+	res := make([]*data_manage.EdbClassifyItems, 0)
+	for _, v := range list {
+		if v.ParentId == parentId {
+			v.Children = GetClassifyTreeRecursive(list, v.ClassifyId)
+			res = append(res, v)
+		}
+	}
+	return res
+}
+
+func GetFullClassifyByClassifyId(targetClassifyId int) (targetList []*data_manage.EdbClassifyIdItems, err error, errMsg string) {
+	//判断是否是挂在顶级目录下
+	targetClassify, err := data_manage.GetEdbClassifyById(targetClassifyId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			errMsg = "当前分类不存在"
+			err = errors.New(errMsg)
+			return
+		}
+		errMsg = "获取失败"
+		err = errors.New("获取分类信息失败,Err:" + err.Error())
+		return
+	}
+	if targetClassify.ParentId == 0 {
+		targetItem := new(data_manage.EdbClassifyIdItems)
+		targetItem.ClassifyId = targetClassify.ClassifyId
+		targetItem.ParentId = targetClassify.ParentId
+		targetItem.RootId = targetClassify.RootId
+		targetItem.UniqueCode = targetClassify.UniqueCode
+		targetItem.Level = targetClassify.Level
+		targetItem.ClassifyName = targetClassify.ClassifyName
+		targetList = append(targetList, targetItem)
+		return
+	}
+	tmpList, err := data_manage.GetEdbClassifyByRootIdLevel(targetClassify.RootId, targetClassify.ClassifyType, "")
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		errMsg = "获取失败"
+		err = errors.New("获取数据失败,Err:" + err.Error())
+		return
+	}
+	idMap := make(map[int]struct{})
+	if len(tmpList) > 0 {
+		for _, v := range tmpList {
+			if v.ClassifyId == targetClassify.ClassifyId {
+				idMap[v.ClassifyId] = struct{}{}
+				idMap[v.ParentId] = struct{}{}
+			}
+		}
+		for _, v := range tmpList {
+			if _, ok := idMap[v.ClassifyId]; ok {
+				idMap[v.ParentId] = struct{}{}
+			}
+		}
+		for _, v := range tmpList {
+			if _, ok := idMap[v.ClassifyId]; ok {
+				targetItem := new(data_manage.EdbClassifyIdItems)
+				targetItem.ClassifyId = v.ClassifyId
+				targetItem.ParentId = v.ParentId
+				targetItem.RootId = v.RootId
+				targetItem.UniqueCode = v.UniqueCode
+				targetItem.Level = v.Level
+				targetItem.ClassifyName = v.ClassifyName
+				targetList = append(targetList, targetItem)
+			}
+		}
+	}
+	return
+}
+
+func GetChildClassifyByClassifyId(targetClassifyId int) (targetList []*data_manage.EdbClassifyIdItems, err error, errMsg string) {
+	//判断是否是挂在顶级目录下
+	targetClassify, err := data_manage.GetEdbClassifyById(targetClassifyId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			errMsg = "当前分类不存在"
+			err = errors.New(errMsg)
+			return
+		}
+		errMsg = "获取失败"
+		err = errors.New("获取分类信息失败,Err:" + err.Error())
+		return
+	}
+	orderStr := ` order by level asc, sort asc, classify_id asc`
+	tmpList, err := data_manage.GetEdbClassifyByRootIdLevel(targetClassify.RootId, targetClassify.ClassifyType, orderStr)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		errMsg = "获取失败"
+		err = errors.New("获取数据失败,Err:" + err.Error())
+		return
+	}
+	idMap := make(map[int]struct{})
+	if len(tmpList) > 0 {
+		for _, v := range tmpList {
+			if v.ClassifyId == targetClassify.ClassifyId {
+				idMap[v.ClassifyId] = struct{}{}
+			}
+		}
+		for _, v := range tmpList {
+			if _, ok := idMap[v.ParentId]; ok {
+				idMap[v.ClassifyId] = struct{}{}
+			}
+		}
+		for _, v := range tmpList {
+			if _, ok := idMap[v.ClassifyId]; ok {
+				targetItem := new(data_manage.EdbClassifyIdItems)
+				targetItem.ClassifyId = v.ClassifyId
+				targetItem.ParentId = v.ParentId
+				targetItem.RootId = v.RootId
+				targetItem.UniqueCode = v.UniqueCode
+				targetItem.Level = v.Level
+				targetItem.ClassifyName = v.ClassifyName
+				targetList = append(targetList, targetItem)
+			}
+		}
+	}
+
+	return
+}
 func GetEdbClassifyEdbInfo() (result map[int][]*data_manage.EdbClassifyItems, err error) {
 	cMap := make(map[int][]*data_manage.EdbClassifyItems)
 	items, err := data_manage.GetEdbInfoAll(0)
@@ -134,8 +253,33 @@ func AddEdbClassify(classifyName string, parentId, level int, classifyType uint8
 		errMsg = `分类名称已存在,请重新输入`
 		return
 	}
+	if level > 6 {
+		errMsg = `最高只支持添加6级分类`
+		return
+	}
 	//获取该层级下最大的排序数
-	maxSort, err := data_manage.GetEdbClassifyMaxSort(parentId, classifyType)
+	maxSort, err := GetEdbClassifyMaxSort(parentId, classifyType)
+	if err != nil {
+		errMsg = "获取失败"
+		err = errors.New("查询排序信息失败,Err:" + err.Error())
+		return
+	}
+	//查询顶级rootId
+	rootId := 0
+	if parentId > 0 {
+		parentClassify, tErr := data_manage.GetEdbClassifyById(parentId)
+		if tErr != nil {
+			if tErr.Error() == utils.ErrNoRow() {
+				errMsg = "父级分类不存在"
+				err = errors.New(errMsg)
+				return
+			}
+			errMsg = "获取失败"
+			err = errors.New("获取分类信息失败,Err:" + tErr.Error())
+			return
+		}
+		rootId = parentClassify.RootId
+	}
 
 	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
 	classifyInfo = &data_manage.EdbClassify{
@@ -143,6 +287,7 @@ func AddEdbClassify(classifyName string, parentId, level int, classifyType uint8
 		ClassifyType:    classifyType,
 		ClassifyName:    classifyName,
 		ParentId:        parentId,
+		RootId:          rootId,
 		HasData:         0,
 		CreateTime:      time.Now(),
 		ModifyTime:      time.Now(),
@@ -150,12 +295,23 @@ func AddEdbClassify(classifyName string, parentId, level int, classifyType uint8
 		SysUserRealName: sysUserName,
 		Level:           level + 1,
 		UniqueCode:      utils.MD5(utils.DATA_PREFIX + "_" + timestamp),
-		Sort:            maxSort,
+		Sort:            maxSort + 1,
 	}
-	_, err = data_manage.AddEdbClassify(classifyInfo)
+	newId, err := data_manage.AddEdbClassify(classifyInfo)
 	if err != nil {
 		errMsg = "保存分类失败"
+		return
 	}
+	if parentId == 0 { //一级目录的rootId等于自己本身
+		classifyInfo.ClassifyId = int(newId)
+		classifyInfo.RootId = int(newId)
+		err = classifyInfo.Update([]string{"RootId"})
+		if err != nil {
+			errMsg = "更新分类失败"
+			return
+		}
+	}
+
 	return
 }
 
@@ -477,113 +633,432 @@ func Delete(classifyId, edbInfoId int, sysUser *system.Admin, requestBody, reque
 }
 
 // MoveEdbClassify 移动指标分类
-func MoveEdbClassify(classifyId, parentClassifyId, prevClassifyId, nextClassifyId int, sysUser *system.Admin) (err error, errMsg string) {
-	//判断分类是否存在
-	edbClassifyInfo, err := data_manage.GetEdbClassifyById(classifyId)
-	if err != nil {
-		errMsg = "移动失败"
-		err = errors.New("获取分类信息失败,Err:" + err.Error())
-		return
+func MoveEdbClassify(req data_manage.MoveEdbClassifyReq, sysUser *system.Admin, classifyType uint8) (err error, errMsg string) {
+	// req.ClassifyId, req.ParentClassifyId, req.PrevClassifyId, req.NextClassifyId
+	classifyId := req.ClassifyId
+	parentClassifyId := req.ParentClassifyId
+	prevClassifyId := req.PrevClassifyId
+	nextClassifyId := req.PrevClassifyId
+
+	edbInfoId := req.EdbInfoId
+	prevEdbInfoId := req.PrevEdbInfoId
+	nextEdbInfoId := req.NextEdbInfoId
+
+	//首先确定移动的对象是分类还是指标
+	//判断上一个节点是分类还是指标
+	//判断下一个节点是分类还是指标
+	//同时更新分类目录下的分类sort和指标sort
+	//更新当前移动的分类或者指标sort
+
+	var parentEdbClassifyInfo *data_manage.EdbClassify
+	if parentClassifyId > 0 {
+		parentEdbClassifyInfo, err = data_manage.GetEdbClassifyById(parentClassifyId)
+		if err != nil {
+			errMsg = "移动失败"
+			err = errors.New("获取上级分类信息失败,Err:" + err.Error())
+			return
+		}
 	}
 
-	// 权限校验
-	{
-		if edbClassifyInfo.ClassifyType == 0 { // 普通指标
-			button := GetEdbClassifyOpButton(sysUser, edbClassifyInfo.SysUserId)
-			if !button.MoveButton {
-				errMsg = "无操作权限"
-				err = errors.New(errMsg)
+	//如果有传入 上一个兄弟节点分类id
+	var (
+		edbClassifyInfo *data_manage.EdbClassify
+		prevClassify    *data_manage.EdbClassify
+		nextClassify    *data_manage.EdbClassify
+
+		edbInfo     *data_manage.EdbInfo
+		prevEdbInfo *data_manage.EdbInfo
+		nextEdbInfo *data_manage.EdbInfo
+		prevSort    int
+		nextSort    int
+	)
+
+	// 移动对象为分类, 判断权限
+	if edbInfoId == 0 {
+		edbClassifyInfo, err = data_manage.GetEdbClassifyById(classifyId)
+		if err != nil {
+			if err.Error() == utils.ErrNoRow() {
+				errMsg = "当前分类不存在"
+				err = errors.New("获取分类信息失败,Err:" + err.Error())
 				return
 			}
-		} else if edbClassifyInfo.ClassifyType == 1 { // 预测指标
-			button := GetPredictEdbClassifyOpButton(sysUser, edbClassifyInfo.SysUserId)
-			if !button.MoveButton {
-				errMsg = "无操作权限"
-				err = errors.New(errMsg)
-				return
+			errMsg = "移动失败"
+			err = errors.New("获取分类信息失败,Err:" + err.Error())
+			return
+		}
+		if parentClassifyId > 0 && parentEdbClassifyInfo.Level == 6 {
+			errMsg = "最高只支持添加6级分类"
+			err = errors.New(errMsg)
+			return
+		}
+		// 权限校验
+		{
+			if edbClassifyInfo.ClassifyType == 0 { // 普通指标
+				button := GetEdbClassifyOpButton(sysUser, edbClassifyInfo.SysUserId)
+				if !button.MoveButton {
+					errMsg = "无操作权限"
+					err = errors.New(errMsg)
+					return
+				}
+			} else if edbClassifyInfo.ClassifyType == 1 { // 预测指标
+				button := GetPredictEdbClassifyOpButton(sysUser, edbClassifyInfo.SysUserId)
+				if !button.MoveButton {
+					errMsg = "无操作权限"
+					err = errors.New(errMsg)
+					return
+				}
 			}
 		}
 
+	} else {
+		edbInfo, err = data_manage.GetEdbInfoById(req.EdbInfoId)
+		if err != nil {
+			if err.Error() == utils.ErrNoRow() {
+				errMsg = "当前指标不存在"
+				err = errors.New("获取分类信息失败,Err:" + err.Error())
+				return
+			}
+			errMsg = "移动失败"
+			err = errors.New("获取分类信息失败,Err:" + err.Error())
+			return
+		}
+		if parentClassifyId == 0 {
+			errMsg = "移动失败,指标必须挂在分类下"
+			err = errors.New(errMsg)
+			return
+		}
+		// 移动权限校验
+		button := GetEdbOpButton(sysUser, edbInfo.SysUserId, edbInfo.EdbType, edbInfo.EdbInfoType)
+		if !button.MoveButton {
+			errMsg = "无操作权限"
+			err = errors.New(errMsg)
+			return
+		}
 	}
 
-	updateCol := make([]string, 0)
-
-	//判断上级id是否一致,如果不一致的话,那么需要移动该分类层级
-	if edbClassifyInfo.ParentId != parentClassifyId && parentClassifyId != 0 {
-		parentEdbClassifyInfo, tmpErr := data_manage.GetEdbClassifyById(parentClassifyId)
-		if tmpErr != nil {
+	if prevClassifyId > 0 {
+		prevClassify, err = data_manage.GetEdbClassifyById(prevClassifyId)
+		if err != nil {
 			errMsg = "移动失败"
-			err = errors.New("获取上级分类信息失败,Err:" + tmpErr.Error())
+			err = errors.New("获取上一个兄弟节点分类信息失败,Err:" + err.Error())
 			return
 		}
-		edbClassifyInfo.ParentId = parentEdbClassifyInfo.ClassifyId
-		edbClassifyInfo.Level = parentEdbClassifyInfo.Level + 1
-		edbClassifyInfo.ModifyTime = time.Now()
-		updateCol = append(updateCol, "ParentId", "Level", "ModifyTime")
+		prevSort = prevClassify.Sort
+	} else if prevEdbInfoId > 0 {
+		prevEdbInfo, err = data_manage.GetEdbInfoById(prevEdbInfoId)
+		if err != nil {
+			errMsg = "移动失败"
+			err = errors.New("获取上一个兄弟节点分类信息失败,Err:" + err.Error())
+			return
+		}
+		prevSort = prevEdbInfo.Sort
 	}
 
-	//如果有传入 上一个兄弟节点分类id
-	if prevClassifyId > 0 {
-		prevClassify, tmpErr := data_manage.GetEdbClassifyById(prevClassifyId)
-		if tmpErr != nil {
+	if nextClassifyId > 0 {
+		//下一个兄弟节点
+		nextClassify, err = data_manage.GetEdbClassifyById(nextClassifyId)
+		if err != nil {
 			errMsg = "移动失败"
-			err = errors.New("获取上一个兄弟节点分类信息失败,Err:" + tmpErr.Error())
+			err = errors.New("获取下一个兄弟节点分类信息失败,Err:" + err.Error())
 			return
 		}
+		nextSort = nextClassify.Sort
+	} else if nextEdbInfoId > 0 {
+		//下一个兄弟节点
+		nextEdbInfo, err = data_manage.GetEdbInfoById(nextEdbInfoId)
+		if err != nil {
+			errMsg = "移动失败"
+			err = errors.New("获取下一个兄弟节点分类信息失败,Err:" + err.Error())
+			return
+		}
+		nextSort = nextEdbInfo.Sort
+	}
 
-		//如果是移动在两个兄弟节点之间
-		if nextClassifyId > 0 {
-			//下一个兄弟节点
-			nextClassify, tmpErr := data_manage.GetEdbClassifyById(nextClassifyId)
-			if tmpErr != nil {
+	err, errMsg = moveEdbClassify(parentEdbClassifyInfo, edbClassifyInfo, prevClassify, nextClassify, edbInfo, prevEdbInfo, nextEdbInfo, parentClassifyId, prevSort, nextSort, classifyType)
+	return
+}
+
+// moveEdbClassify 移动指标分类
+func moveEdbClassify(parentEdbClassifyInfo, edbClassifyInfo, prevClassify, nextClassify *data_manage.EdbClassify, edbInfo, prevEdbInfo, nextEdbInfo *data_manage.EdbInfo, parentClassifyId int, prevSort, nextSort int, classifyType uint8) (err error, errMsg string) {
+	updateCol := make([]string, 0)
+
+	// 移动对象为分类, 判断分类是否存在
+	if edbClassifyInfo != nil {
+		oldParentId := edbClassifyInfo.ParentId
+		oldLevel := edbClassifyInfo.Level
+		var classifyIds []int
+		if oldParentId != parentClassifyId {
+			//更新子分类对应的level
+			childList, e, m := GetChildClassifyByClassifyId(edbClassifyInfo.ClassifyId)
+			if e != nil {
 				errMsg = "移动失败"
-				err = errors.New("获取下一个兄弟节点分类信息失败,Err:" + tmpErr.Error())
+				err = errors.New("查询子分类失败,Err:" + e.Error() + m)
 				return
 			}
-			//如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
-			if prevClassify.Sort == nextClassify.Sort || prevClassify.Sort == edbClassifyInfo.Sort {
-				//变更兄弟节点的排序
-				updateSortStr := `sort + 2`
-				_ = data_manage.UpdateEdbClassifySortByParentId(prevClassify.ParentId, prevClassify.ClassifyId, prevClassify.Sort, updateSortStr, edbClassifyInfo.ClassifyType)
-			} else {
-				//如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
-				if nextClassify.Sort-prevClassify.Sort == 1 {
+
+			if len(childList) > 0 {
+				for _, v := range childList {
+					if v.ClassifyId == edbClassifyInfo.ClassifyId {
+						continue
+					}
+					classifyIds = append(classifyIds, v.ClassifyId)
+				}
+			}
+		}
+		//判断上级id是否一致,如果不一致的话,那么需要移动该分类层级
+		if edbClassifyInfo.ParentId != parentClassifyId && parentClassifyId != 0 {
+			edbClassifyInfo.ParentId = parentEdbClassifyInfo.ClassifyId
+			edbClassifyInfo.RootId = parentEdbClassifyInfo.RootId
+			edbClassifyInfo.Level = parentEdbClassifyInfo.Level + 1
+			edbClassifyInfo.ModifyTime = time.Now()
+			updateCol = append(updateCol, "ParentId", "RootId", "Level", "ModifyTime")
+		} else if edbClassifyInfo.ParentId != parentClassifyId && parentClassifyId == 0 {
+			edbClassifyInfo.ParentId = 0
+			edbClassifyInfo.RootId = edbClassifyInfo.ClassifyId
+			edbClassifyInfo.Level = 1
+			edbClassifyInfo.ModifyTime = time.Now()
+			updateCol = append(updateCol, "ParentId", "RootId", "Level", "ModifyTime")
+		}
+
+		if prevSort > 0 {
+			//如果是移动在两个兄弟节点之间
+			if nextSort > 0 {
+				//下一个兄弟节点
+				//如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
+				if prevSort == nextSort || prevSort == edbClassifyInfo.Sort {
 					//变更兄弟节点的排序
-					updateSortStr := `sort + 1`
-					_ = data_manage.UpdateEdbClassifySortByParentId(prevClassify.ParentId, 0, prevClassify.Sort, updateSortStr, edbClassifyInfo.ClassifyType)
+					updateSortStr := `sort + 2`
+
+					//变更分类
+					if prevClassify != nil {
+						_ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, prevClassify.ClassifyId, prevClassify.Sort, updateSortStr, classifyType)
+					} else {
+						_ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, 0, prevSort, updateSortStr, classifyType)
+					}
+
+					//变更指标
+					if prevEdbInfo != nil {
+						//变更兄弟节点的排序
+						_ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, prevSort, prevEdbInfo.EdbInfoId, updateSortStr)
+					} else {
+						_ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, prevSort, 0, updateSortStr)
+					}
+				} else {
+					//如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
+					if nextSort-prevSort == 1 {
+						//变更兄弟节点的排序
+						updateSortStr := `sort + 1`
+
+						//变更分类
+						if prevClassify != nil {
+							_ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, prevClassify.ClassifyId, prevSort, updateSortStr, classifyType)
+						} else {
+							_ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, 0, prevSort, updateSortStr, classifyType)
+						}
+
+						//变更指标
+						if prevEdbInfo != nil {
+							//变更兄弟节点的排序
+							_ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, prevSort, prevEdbInfo.EdbInfoId, updateSortStr)
+						} else {
+							_ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, prevSort, 0, updateSortStr)
+						}
+
+					}
+				}
+			}
+
+			edbClassifyInfo.Sort = prevSort + 1
+			edbClassifyInfo.ModifyTime = time.Now()
+			updateCol = append(updateCol, "Sort", "ModifyTime")
+		} else if prevClassify == nil && nextClassify == nil && prevEdbInfo == nil && nextEdbInfo == nil && parentClassifyId > 0 {
+			//处理只拖动到目录里,默认放到目录底部的情况
+			var maxSort int
+			maxSort, err = GetEdbClassifyMaxSort(parentClassifyId, classifyType)
+			if err != nil {
+				errMsg = "移动失败"
+				err = errors.New("查询组内排序信息失败,Err:" + err.Error())
+				return
+			}
+			edbClassifyInfo.Sort = maxSort + 1 //那就是排在组内最后一位
+			edbClassifyInfo.ModifyTime = time.Now()
+			updateCol = append(updateCol, "Sort", "ModifyTime")
+		} else {
+			// 拖动到父级分类的第一位
+			firstClassify, tmpErr := data_manage.GetFirstEdbClassifyByParentId(parentClassifyId)
+			if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+				errMsg = "移动失败"
+				err = errors.New("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tmpErr.Error())
+				return
+			}
+
+			//如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
+			if firstClassify != nil && firstClassify.Sort == 0 {
+				updateSortStr := ` sort + 1 `
+				_ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, firstClassify.ClassifyId-1, 0, updateSortStr, edbClassifyInfo.ClassifyType)
+				//该分类下的所有指标也需要+1
+				_ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, 0, 0, updateSortStr)
+			} else {
+				//如果该分类下存在指标,且第一个指标的排序等于0,那么需要调整排序
+				firstEdb, tErr := data_manage.GetFirstEdbInfoByClassifyId(parentClassifyId)
+				if tErr != nil && tErr.Error() != utils.ErrNoRow() {
+					errMsg = "移动失败"
+					err = errors.New("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tErr.Error())
+					return
+				}
+
+				//如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
+				if firstEdb != nil && firstEdb.Sort == 0 {
+					updateSortStr := ` sort + 1 `
+					_ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, 0, firstEdb.EdbInfoId-1, updateSortStr)
+					_ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, 0, 0, updateSortStr, classifyType)
 				}
 			}
+
+			edbClassifyInfo.Sort = 0 //那就是排在第一位
+			edbClassifyInfo.ModifyTime = time.Now()
+			updateCol = append(updateCol, "Sort", "ModifyTime")
 		}
 
-		edbClassifyInfo.Sort = prevClassify.Sort + 1
-		edbClassifyInfo.ModifyTime = time.Now()
-		updateCol = append(updateCol, "Sort", "ModifyTime")
+		//更新
+		if len(updateCol) > 0 {
+			err = edbClassifyInfo.Update(updateCol)
+			if err != nil {
+				errMsg = "移动失败"
+				err = errors.New("修改失败,Err:" + err.Error())
+				return
+			}
+			//更新对应分类的root_id和层级
+			if oldParentId != parentClassifyId {
+				if len(classifyIds) > 0 {
+					levelStep := edbClassifyInfo.Level - oldLevel
+					err = data_manage.UpdateEdbClassifyChildByParentClassifyId(classifyIds, edbClassifyInfo.RootId, levelStep)
+					if err != nil {
+						errMsg = "移动失败"
+						err = errors.New("更新子分类失败,Err:" + err.Error())
+						return
+					}
+				}
+			}
+		}
 	} else {
-		firstClassify, tmpErr := data_manage.GetFirstEdbClassifyByParentId(edbClassifyInfo.ParentId)
-		if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
-			errMsg = "移动失败"
-			err = errors.New("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tmpErr.Error())
+		if edbInfo == nil {
+			errMsg = "当前指标不存在"
+			err = errors.New(errMsg)
 			return
 		}
-
-		//如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
-		if firstClassify != nil && firstClassify.Sort == 0 {
-			updateSortStr := ` sort + 1 `
-			_ = data_manage.UpdateEdbClassifySortByParentId(firstClassify.ParentId, firstClassify.ClassifyId-1, 0, updateSortStr, edbClassifyInfo.ClassifyType)
+		//如果改变了分类,那么移动该指标数据
+		if edbInfo.ClassifyId != parentClassifyId {
+			edbInfo.ClassifyId = parentClassifyId
+			edbInfo.ModifyTime = time.Now()
+			updateCol = append(updateCol, "ClassifyId", "ModifyTime")
 		}
+		if prevSort > 0 {
+			//如果是移动在两个兄弟节点之间
+			if nextSort > 0 {
+				//下一个兄弟节点
+				//如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
+				if prevSort == nextSort || prevSort == edbInfo.Sort {
+					//变更兄弟节点的排序
+					updateSortStr := `sort + 2`
 
-		edbClassifyInfo.Sort = 0 //那就是排在第一位
-		edbClassifyInfo.ModifyTime = time.Now()
-		updateCol = append(updateCol, "Sort", "ModifyTime")
-	}
+					//变更分类
+					if prevClassify != nil {
+						_ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, prevClassify.ClassifyId, prevClassify.Sort, updateSortStr, classifyType)
+					} else {
+						_ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, 0, prevSort, updateSortStr, classifyType)
+					}
 
-	//更新
-	if len(updateCol) > 0 {
-		err = edbClassifyInfo.Update(updateCol)
-		if err != nil {
-			errMsg = "移动失败"
-			err = errors.New("修改失败,Err:" + err.Error())
-			return
+					//变更指标
+					if prevEdbInfo != nil {
+						//变更兄弟节点的排序
+						_ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, prevSort, prevEdbInfo.EdbInfoId, updateSortStr)
+					} else {
+						_ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, prevSort, 0, updateSortStr)
+					}
+				} else {
+					//如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
+					if nextSort-prevSort == 1 {
+						//变更兄弟节点的排序
+						updateSortStr := `sort + 1`
+						//变更分类
+						if prevClassify != nil {
+							_ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, prevClassify.ClassifyId, prevSort, updateSortStr, classifyType)
+						} else {
+							_ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, 0, prevSort, updateSortStr, classifyType)
+						}
+
+						//变更指标
+						if prevEdbInfo != nil {
+							//变更兄弟节点的排序
+							_ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, prevSort, prevEdbInfo.EdbInfoId, updateSortStr)
+						} else {
+							_ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, prevSort, 0, updateSortStr)
+						}
+					}
+				}
+			}
+
+			edbInfo.Sort = prevSort + 1
+			edbInfo.ModifyTime = time.Now()
+			updateCol = append(updateCol, "Sort", "ModifyTime")
+		} else if prevClassify == nil && nextClassify == nil && prevEdbInfo == nil && nextEdbInfo == nil && parentClassifyId > 0 {
+			//处理只拖动到目录里,默认放到目录底部的情况
+			var maxSort int
+			maxSort, err = GetEdbClassifyMaxSort(parentClassifyId, classifyType)
+			if err != nil {
+				errMsg = "移动失败"
+				err = errors.New("查询组内排序信息失败,Err:" + err.Error())
+				return
+			}
+			edbInfo.Sort = maxSort + 1 //那就是排在组内最后一位
+			edbInfo.ModifyTime = time.Now()
+			updateCol = append(updateCol, "Sort", "ModifyTime")
+		} else {
+			// 拖动到父级分类的第一位
+			firstClassify, tmpErr := data_manage.GetFirstEdbClassifyByParentId(parentClassifyId)
+			if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+				errMsg = "移动失败"
+				err = errors.New("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tmpErr.Error())
+				return
+			}
+
+			//如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
+			if firstClassify != nil && firstClassify.Sort == 0 {
+				updateSortStr := ` sort + 1 `
+				_ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, firstClassify.ClassifyId-1, 0, updateSortStr, edbClassifyInfo.ClassifyType)
+				//该分类下的所有指标也需要+1
+				_ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, 0, 0, updateSortStr)
+			} else {
+				//如果该分类下存在指标,且第一个指标的排序等于0,那么需要调整排序
+				firstEdb, tErr := data_manage.GetFirstEdbInfoByClassifyId(parentClassifyId)
+				if tErr != nil && tErr.Error() != utils.ErrNoRow() {
+					errMsg = "移动失败"
+					err = errors.New("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tErr.Error())
+					return
+				}
+
+				//如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
+				if firstEdb != nil && firstEdb.Sort == 0 {
+					updateSortStr := ` sort + 1 `
+					_ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, 0, firstEdb.EdbInfoId-1, updateSortStr)
+					_ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, 0, 0, updateSortStr, classifyType)
+				}
+			}
+
+			edbInfo.Sort = 0 //那就是排在第一位
+			edbInfo.ModifyTime = time.Now()
+			updateCol = append(updateCol, "Sort", "ModifyTime")
+		}
+
+		//更新
+		if len(updateCol) > 0 {
+			err = edbInfo.Update(updateCol)
+			if err != nil {
+				errMsg = "移动失败"
+				err = errors.New("修改失败,Err:" + err.Error())
+				return
+			}
 		}
 	}
 	return
@@ -650,3 +1125,20 @@ func GetPredictEdbClassifyOpButton(sysUser *system.Admin, belongUserId int) (but
 
 	return
 }
+
+func GetEdbClassifyMaxSort(parentId int, classifyType uint8) (maxSort int, err error) {
+	//获取该层级下最大的排序数
+	classifyMaxSort, err := data_manage.GetEdbClassifyMaxSort(parentId, classifyType)
+	if err != nil {
+		return
+	}
+	maxSort = classifyMaxSort
+	edbMaxSort, err := data_manage.GetEdbInfoMaxSortByClassifyId(parentId)
+	if err != nil {
+		return
+	}
+	if maxSort < edbMaxSort {
+		maxSort = edbMaxSort
+	}
+	return
+}

+ 9 - 0
services/data/edb_info.go

@@ -2573,6 +2573,14 @@ func EdbInfoAdd(source, classifyId int, edbCode, edbName, frequency, unit, start
 			}
 		}
 	}
+	//获取该层级下最大的排序数
+	maxSort, err := GetEdbClassifyMaxSort(classifyId, 0)
+	if err != nil {
+		errMsg = "获取失败"
+		err = errors.New("查询排序信息失败,Err:" + err.Error())
+		return
+	}
+
 	edbInfo.EdbCode = edbCode
 	edbInfo.EdbName = edbName
 	edbInfo.EdbNameSource = edbName
@@ -2586,6 +2594,7 @@ func EdbInfoAdd(source, classifyId int, edbCode, edbName, frequency, unit, start
 	edbInfo.CreateTime = time.Now()
 	edbInfo.ModifyTime = time.Now()
 	edbInfo.ServerUrl = serverUrl
+	edbInfo.Sort = maxSort + 1
 	edbInfo.DataDateType = `交易日`
 	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
 	edbInfo.UniqueCode = utils.MD5(utils.DATA_PREFIX + "_" + timestamp)