Browse Source

Merge remote-tracking branch 'origin/eta/1.7.6' into debug

Roc 11 months ago
parent
commit
d94e663b1e

+ 17 - 0
controllers/data_manage/data_manage_permission.go

@@ -7,6 +7,7 @@ import (
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/services/data"
 	"eta/eta_api/utils"
+	"fmt"
 )
 
 // DataMangePermissionController 数据权限管理
@@ -197,3 +198,19 @@ func (c *DataMangePermissionController) SetEdbChartClassifyPermission() {
 	br.Success = true
 	br.Msg = "设置成功"
 }
+func init() {
+	fmt.Println()
+
+	item, err := data_manage.GetEdbInfoById(100080)
+	if err != nil {
+		fmt.Println("GetEdbInfoById err:", err)
+		return
+	}
+	classifyItem, err := data_manage.GetEdbClassifyById(item.ClassifyId)
+	if err != nil {
+		fmt.Println("GetChartClassifyById err:", err)
+		return
+	}
+
+	fmt.Println(data.CheckEdbPermission(item.IsJoinPermission, classifyItem.IsJoinPermission, 142, item.EdbInfoId, item.ClassifyId))
+}

+ 16 - 1
controllers/data_manage/edb_classify.go

@@ -889,6 +889,21 @@ func (this *EdbClassifyController) SimpleList() {
 
 	var sortList data_manage.EdbClassifyItemList
 	if parentId > 0 {
+		// 查询当前分类信息
+		currClassify, err := data_manage.GetEdbClassifyById(parentId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取当前分类信息失败,Err:" + err.Error()
+			return
+		}
+		// 获取所有有权限的指标和分类
+		permissionEdbIdList, permissionClassifyIdList, err := data.GetUserEdbAndClassifyPermissionList(this.SysUser.AdminId, 0, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+			return
+		}
+
 		// 查询挂在当前分类上的指标列表
 		// 获取当前账号的不可见指标
 		obj := data_manage.EdbInfoNoPermissionAdmin{}
@@ -919,7 +934,7 @@ func (this *EdbClassifyController) SimpleList() {
 			v.Button = button
 			v.Children = make([]*data_manage.EdbClassifyItems, 0)
 			v.ParentId = parentId
-			v.HaveOperaAuth = true
+			v.HaveOperaAuth = data.CheckEdbPermissionByPermissionIdList(v.IsJoinPermission, currClassify.IsJoinPermission, v.EdbInfoId, v.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
 			nodeAll = append(nodeAll, v)
 		}
 	}

+ 162 - 21
controllers/data_manage/edb_info.go

@@ -2135,7 +2135,25 @@ func (this *EdbInfoController) EdbInfoList() {
 	button := data.GetEdbOpButton(this.SysUser, edbInfoItem.SysUserId, edbInfoItem.EdbType, edbInfoItem.EdbInfoType)
 	button.AddButton = false
 	edbInfoItem.Button = button
-	edbInfoItem.HaveOperaAuth = true
+
+	// 权限校验
+	{
+		currClassify, err := data_manage.GetEdbClassifyById(edbInfoItem.EdbInfoId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取当前分类信息失败,Err:" + err.Error()
+			return
+		}
+		if currClassify != nil {
+			haveOperaAuth, err := data.CheckEdbPermission(edbInfoItem.IsJoinPermission, currClassify.IsJoinPermission, this.SysUser.AdminId, edbInfoItem.EdbInfoId, edbInfoItem.ClassifyId)
+			if err != nil {
+				br.Msg = err.Error()
+				br.ErrMsg = "校验指标权限失败,err:" + err.Error()
+				return
+			}
+			edbInfoItem.HaveOperaAuth = haveOperaAuth
+		}
+	}
 
 	//是否展示英文标识
 	edbInfoItem.IsEnEdb = data.CheckIsEnEdb(edbInfoItem.EdbNameEn, edbInfoItem.Unit, edbInfoItem.UnitEn)
@@ -3135,9 +3153,42 @@ func (this *EdbInfoController) EdbInfoFilterByEs() {
 
 	edbInfoListLen := len(edbInfoList)
 
+	classifyIdList := make([]int, 0)
 	for i := 0; i < edbInfoListLen; i++ {
 		edbInfoList[i].EdbNameAlias = edbInfoList[i].EdbName
-		edbInfoList[i].HaveOperaAuth = true
+		classifyIdList = append(classifyIdList, edbInfoList[i].ClassifyId)
+	}
+
+	// 当前列表中的分类map
+	classifyMap := make(map[int]*data_manage.EdbClassify)
+	if edbInfoListLen > 0 {
+		classifyList, err := data_manage.GetEdbClassifyByIdList(classifyIdList)
+		if err != nil {
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取分类列表失败,Err:" + err.Error()
+				return
+			}
+		}
+
+		for _, v := range classifyList {
+			classifyMap[v.ClassifyId] = v
+		}
+
+		// 获取所有有权限的指标和分类
+		permissionEdbIdList, permissionClassifyIdList, err := data.GetUserEdbAndClassifyPermissionList(this.SysUser.AdminId, 0, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+			return
+		}
+
+		for i := 0; i < edbInfoListLen; i++ {
+			tmpEdbInfo := edbInfoList[i]
+			if currClassify, ok := classifyMap[tmpEdbInfo.ClassifyId]; ok {
+				edbInfoList[i].HaveOperaAuth = data.CheckEdbPermissionByPermissionIdList(tmpEdbInfo.IsJoinPermission, currClassify.IsJoinPermission, tmpEdbInfo.EdbInfoId, tmpEdbInfo.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+			}
+		}
 	}
 
 	for i := 0; i < edbInfoListLen; i++ {
@@ -3367,6 +3418,11 @@ func (this *ChartInfoController) EdbInfoData() {
 		br.Ret = 408
 		return
 	}
+
+	fullEdb := new(data_manage.EdbInfoFullClassify)
+	resp := new(data_manage.EdbInfoDataFullClassifyResp)
+	dataList := make([]*data_manage.EdbDataList, 0)
+
 	edbInfoId, _ := this.GetInt("EdbInfoId")
 	if edbInfoId <= 0 {
 		br.Msg = "参数错误"
@@ -3396,21 +3452,8 @@ func (this *ChartInfoController) EdbInfoData() {
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
-	maxYear := 0
-	if edbInfo.LatestDate != "" {
-		latestDateT, _ := time.Parse(utils.FormatDate, edbInfo.LatestDate)
-		maxYear = latestDateT.Year()
-	}
-	dataList := make([]*data_manage.EdbDataList, 0)
-	startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, maxYear)
-	dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfoId, startDate, endDate)
-	if err != nil {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取失败,Err:" + err.Error()
-		return
-	}
-	fullEdb := new(data_manage.EdbInfoFullClassify)
-	resp := new(data_manage.EdbInfoDataFullClassifyResp)
+
+	// 分类
 	classifyList, err, errMsg := data.GetFullClassifyByClassifyId(edbInfo.ClassifyId)
 	if err != nil {
 		br.Msg = err.Error()
@@ -3419,9 +3462,41 @@ func (this *ChartInfoController) EdbInfoData() {
 	}
 	fullEdb.EdbInfo = edbInfo
 	fullEdb.ClassifyList = classifyList
-	fullEdb.HaveOperaAuth = true
+
+	var currClassifyItem *data_manage.EdbClassifyIdItems
+	for _, v := range classifyList {
+		if v.ClassifyId == edbInfo.ClassifyId {
+			currClassifyItem = v
+		}
+	}
+	if currClassifyItem != nil {
+		haveOperaAuth, err := data.CheckEdbPermission(edbInfo.IsJoinPermission, currClassifyItem.IsJoinPermission, sysUser.AdminId, edbInfo.EdbInfoId, edbInfo.ClassifyId)
+		if err != nil {
+			br.Msg = err.Error()
+			br.ErrMsg = "校验指标权限失败,err:" + err.Error()
+			return
+		}
+		fullEdb.HaveOperaAuth = haveOperaAuth
+	}
 	resp.EdbInfo = fullEdb
-	resp.DataList = dataList
+
+	// 数据获取
+	if fullEdb.HaveOperaAuth { // 有权限才获取数据
+		maxYear := 0
+		if edbInfo.LatestDate != "" {
+			latestDateT, _ := time.Parse(utils.FormatDate, edbInfo.LatestDate)
+			maxYear = latestDateT.Year()
+		}
+		startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, maxYear)
+		dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfoId, startDate, endDate)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+
+		resp.DataList = dataList
+	}
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
@@ -4526,9 +4601,42 @@ func (this *EdbInfoController) AllEdbInfoByEs() {
 
 	edbInfoListLen := len(edbInfoList)
 
+	classifyIdList := make([]int, 0)
 	for i := 0; i < edbInfoListLen; i++ {
 		edbInfoList[i].EdbNameAlias = edbInfoList[i].EdbName
-		edbInfoList[i].HaveOperaAuth = true
+		classifyIdList = append(classifyIdList, edbInfoList[i].ClassifyId)
+	}
+
+	// 当前列表中的分类map
+	classifyMap := make(map[int]*data_manage.EdbClassify)
+	if edbInfoListLen > 0 {
+		classifyList, err := data_manage.GetEdbClassifyByIdList(classifyIdList)
+		if err != nil {
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取分类列表失败,Err:" + err.Error()
+				return
+			}
+		}
+
+		for _, v := range classifyList {
+			classifyMap[v.ClassifyId] = v
+		}
+
+		// 获取所有有权限的指标和分类
+		permissionEdbIdList, permissionClassifyIdList, err := data.GetUserEdbAndClassifyPermissionList(this.SysUser.AdminId, 0, 0)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+			return
+		}
+
+		for i := 0; i < edbInfoListLen; i++ {
+			tmpEdbInfo := edbInfoList[i]
+			if currClassify, ok := classifyMap[tmpEdbInfo.ClassifyId]; ok {
+				edbInfoList[i].HaveOperaAuth = data.CheckEdbPermissionByPermissionIdList(tmpEdbInfo.IsJoinPermission, currClassify.IsJoinPermission, tmpEdbInfo.EdbInfoId, tmpEdbInfo.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+			}
+		}
 	}
 
 	for i := 0; i < edbInfoListLen; i++ {
@@ -5051,10 +5159,43 @@ func (this *EdbInfoController) EdbChartList() {
 	if len(list) == 0 {
 		list = make([]*data_manage.EdbInfoList, 0)
 	} else {
+		classifyIdList := make([]int, 0)
 		for _, v := range list {
-			v.HaveOperaAuth = true
+			classifyIdList = append(classifyIdList, v.ClassifyId)
 			v.Button = data.GetEdbOpButton(sysUser, v.SysUserId, v.EdbType, v.EdbInfoType)
 		}
+
+		// 指标权限
+		{
+			// 当前的分类
+			classifyMap := make(map[int]*data_manage.EdbClassify)
+			classifyList, err := data_manage.GetEdbClassifyByIdList(classifyIdList)
+			if err != nil {
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取分类列表失败,Err:" + err.Error()
+					return
+				}
+			}
+
+			for _, v := range classifyList {
+				classifyMap[v.ClassifyId] = v
+			}
+
+			// 获取所有有权限的指标和分类
+			permissionEdbIdList, permissionClassifyIdList, err := data.GetUserEdbAndClassifyPermissionList(this.SysUser.AdminId, 0, 0)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取所有有权限的指标和分类失败,Err:" + err.Error()
+				return
+			}
+
+			for _, v := range list {
+				if currClassify, ok := classifyMap[v.ClassifyId]; ok {
+					v.HaveOperaAuth = data.CheckEdbPermissionByPermissionIdList(v.IsJoinPermission, currClassify.IsJoinPermission, v.EdbInfoId, v.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
+				}
+			}
+		}
 		page = paging.GetPaging(currentIndex, pageSize, int(dataCount))
 	}
 

+ 17 - 2
controllers/data_manage/edb_info_calculate.go

@@ -236,12 +236,27 @@ func (this *ChartInfoController) CalculateDetail() {
 		return
 	}
 
-	fullEdb.HaveOperaAuth = true
 	fullEdb.EdbInfo = edbInfo
 	fullEdb.ClassifyList = classifyList
 
+	var currClassifyItem *data_manage.EdbClassifyIdItems
+	for _, v := range classifyList {
+		if v.ClassifyId == edbInfo.ClassifyId {
+			currClassifyItem = v
+		}
+	}
+	if currClassifyItem != nil {
+		haveOperaAuth, err := data.CheckEdbPermission(edbInfo.IsJoinPermission, currClassifyItem.IsJoinPermission, sysUser.AdminId, edbInfo.EdbInfoId, edbInfo.ClassifyId)
+		if err != nil {
+			br.Msg = err.Error()
+			br.ErrMsg = "校验指标权限失败,err:" + err.Error()
+			return
+		}
+		fullEdb.HaveOperaAuth = haveOperaAuth
+	}
+
 	// 拟合残差计算相关系数
-	if edbInfo.Source == utils.DATA_SOURCE_CALCULATE_NHCC {
+	if fullEdb.HaveOperaAuth && edbInfo.Source == utils.DATA_SOURCE_CALCULATE_NHCC {
 		var aEdbInfo, bEdbInfo *data_manage.EdbInfoCalculateDetail
 		for _, v := range calculateList {
 			if v.FromTag == "A" {

+ 42 - 0
models/data_manage/data_manage_permission.go

@@ -310,3 +310,45 @@ func SetPermissionEdbChartClassifyIdByClassifyIdList(classifyIdList []int, userI
 
 	return
 }
+
+// GetPermissionEdbIdList
+// @Description: 获取用户权限的指标列表
+// @author: Roc
+// @datetime 2024-03-28 16:50:47
+// @param userId int
+// @param edbInfoId int
+// @return idList []int
+// @return err error
+func GetPermissionEdbIdList(userId, edbInfoId int) (idList []int, err error) {
+	pars := []interface{}{userId}
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT edb_info_id FROM edb_info_permission WHERE sys_user_id = ? `
+	if edbInfoId > 0 {
+		sql += ` AND edb_info_id = ? `
+		pars = append(pars, edbInfoId)
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&idList)
+
+	return
+}
+
+// GetPermissionEdbClassifyIdList
+// @Description: 获取用户权限的指标分类列表
+// @author: Roc
+// @datetime 2024-03-28 16:50:47
+// @param userId int
+// @param classifyId int
+// @return idList []int
+// @return err error
+func GetPermissionEdbClassifyIdList(userId, classifyId int) (idList []int, err error) {
+	pars := []interface{}{userId}
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT edb_classify_id FROM edb_classify_permission WHERE sys_user_id = ? `
+	if classifyId > 0 {
+		sql += ` AND edb_classify_id = ? `
+		pars = append(pars, classifyId)
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&idList)
+
+	return
+}

+ 26 - 7
models/data_manage/edb_classify.go

@@ -203,13 +203,14 @@ type EdbClassifyItems struct {
 }
 
 type EdbClassifyIdItems struct {
-	ClassifyId    int `description:"分类id"`
-	ClassifyName  string
-	UniqueCode    string `description:"唯一编码"`
-	ParentId      int    `description:"父级分类id"`
-	Level         int    `description:"层级"`
-	RootId        int    `description:"顶级分类id"`
-	HaveOperaAuth bool   `description:"是否有该数据权限,默认:false"`
+	ClassifyId       int `description:"分类id"`
+	ClassifyName     string
+	UniqueCode       string `description:"唯一编码"`
+	ParentId         int    `description:"父级分类id"`
+	Level            int    `description:"层级"`
+	RootId           int    `description:"顶级分类id"`
+	IsJoinPermission int    `description:"是否加入权限管控,0:不加入;1:加入;默认:0" json:"-"`
+	HaveOperaAuth    bool   `description:"是否有该数据权限,默认:false"`
 }
 
 type EdbClassifyItemList []*EdbClassifyItems
@@ -556,3 +557,21 @@ func GetEdbClassifyByParentIdAndName(parentId int, classifyName string, classify
 	err = o.Raw(sql, parentId, classifyName, classifyId).QueryRow(&item)
 	return
 }
+
+// GetEdbClassifyByIdList
+// @Description: 根据分类id列表获取分类列表
+// @author: Roc
+// @datetime 2024-03-29 10:30:21
+// @param classifyId int
+// @return item *EdbClassify
+// @return err error
+func GetEdbClassifyByIdList(classifyIdList []int) (item []*EdbClassify, err error) {
+	num := len(classifyIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM edb_classify WHERE classify_id in (` + utils.GetOrmInReplace(num) + `) `
+	_, err = o.Raw(sql, classifyIdList).QueryRows(&item)
+	return
+}

+ 2 - 0
models/data_manage/edb_info.go

@@ -58,6 +58,7 @@ type EdbInfo struct {
 	EmptyType        int     `description:"空值处理类型(0查找前后35天,1不计算,2前值填充,3后值填充,4等于0)"`
 	MaxEmptyType     int     `description:"MAX、MIN公式空值处理类型(1、等于0;2、跳过空值)"`
 	Extra            string  `description:"指标额外配置"`
+	IsJoinPermission int     `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
 }
 
 type EdbInfoFullClassify struct {
@@ -353,6 +354,7 @@ type EdbInfoList struct {
 	IndicatorCode    string                  `description:"指标代码"`
 	StockCode        string                  `description:"证券代码"`
 	NoUpdate         int8                    `description:"是否停止更新,0:继续更新;1:停止更新"`
+	IsJoinPermission int                     `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
 	HaveOperaAuth    bool                    `description:"是否有数据权限,默认:false"`
 }
 

+ 83 - 0
services/data/data_manage_permission.go

@@ -2,6 +2,8 @@ package data
 
 import (
 	"eta/eta_api/models/data_manage"
+	"eta/eta_api/utils"
+	"fmt"
 )
 
 // SetEdbChartPermission
@@ -203,3 +205,84 @@ func SetEdbChartClassifyPermission(source, subSource int, userList []int, classi
 
 	return
 }
+
+// GetUserEdbAndClassifyPermissionList
+// @Description: 根据用户获取已经授权指标ID列表和指标分类ID列表
+// @author: Roc
+// @datetime 2024-03-28 17:20:36
+// @param userId int
+// @param edbInfoId int 如果传递了edbInfoId,则只返回该edbInfoId的权限列表(其实也就是为了判断是否存在该指标权限了,目的是为了少获取数据)
+// @param classifyId int  classifyId,则只返回该classifyId的权限列表(其实也就是为了判断是否存在该指标分类权限了,目的是为了少获取数据)
+// @return edbIdList []int
+// @return classifyIdList []int
+// @return err error
+func GetUserEdbAndClassifyPermissionList(userId, edbInfoId, classifyId int) (edbIdList, classifyIdList []int, err error) {
+	edbIdList, err = data_manage.GetPermissionEdbIdList(userId, edbInfoId)
+	if err != nil {
+		fmt.Println("获取授权指标列表失败, err:", err)
+		return
+	}
+	classifyIdList, err = data_manage.GetPermissionEdbClassifyIdList(userId, classifyId)
+	if err != nil {
+		fmt.Println("获取授权指标分类列表失败, err:", err)
+		return
+	}
+
+	return
+}
+
+// CheckEdbPermission
+// @Description: 检查EDB指标(含预测指标)权限(方法内部自己获取所有的指标和指标分类权限,不用额外传递)
+// @author: Roc
+// @datetime 2024-03-28 16:12:08
+// @param edbIsJoinPermission int
+// @param edbClassifyIsJoinPermission int
+// @param edbInfoId int
+// @param edbClassifyId int
+// @return hasAuth bool
+func CheckEdbPermission(edbIsJoinPermission, edbClassifyIsJoinPermission, userId, edbInfoId, edbClassifyId int) (hasAuth bool, err error) {
+	edbIdList, classifyIdList, err := GetUserEdbAndClassifyPermissionList(userId, edbInfoId, edbClassifyId)
+	if err != nil {
+		fmt.Println("GetUserEdbAndClassifyPermissionList err:", err)
+		return
+	}
+
+	hasAuth = CheckEdbPermissionByPermissionIdList(edbIsJoinPermission, edbClassifyIsJoinPermission, edbInfoId, edbClassifyId, edbIdList, classifyIdList)
+
+	return
+}
+
+// CheckEdbPermissionByPermissionIdList
+// @Description: 检查EDB指标(含预测指标)权限
+// @author: Roc
+// @datetime 2024-03-28 16:12:08
+// @param edbIsJoinPermission int
+// @param edbClassifyIsJoinPermission int
+// @param edbInfoId int
+// @param edbClassifyId int
+// @param permissionEdbInfoIdList []int
+// @param permissionEdbClassifyIdList []int
+// @return hasAuth bool
+func CheckEdbPermissionByPermissionIdList(edbIsJoinPermission, edbClassifyIsJoinPermission, edbInfoId, edbClassifyId int, permissionEdbInfoIdList, permissionEdbClassifyIdList []int) (hasAuth bool) {
+	//hasAuth = true
+
+	// 判断 分类是否纳入权限管控
+	if edbClassifyIsJoinPermission == 1 {
+		// 不属于已授权的分类,那么就无权限
+		if !utils.InArrayByInt(permissionEdbClassifyIdList, edbClassifyId) {
+			return false
+		}
+	}
+
+	// 判断 指标是否纳入权限管控
+	if edbIsJoinPermission == 1 {
+		// 不属于已授权的指标,那么就无权限
+		if !utils.InArrayByInt(permissionEdbInfoIdList, edbInfoId) {
+			return false
+		}
+	}
+
+	hasAuth = true
+
+	return
+}

+ 4 - 0
services/data/edb_classify.go

@@ -85,6 +85,8 @@ func GetFullClassifyByClassifyId(targetClassifyId int) (targetList []*data_manag
 		targetItem.UniqueCode = targetClassify.UniqueCode
 		targetItem.Level = targetClassify.Level
 		targetItem.ClassifyName = targetClassify.ClassifyName
+		targetItem.ClassifyName = targetClassify.ClassifyName
+		targetItem.IsJoinPermission = targetClassify.IsJoinPermission
 		targetList = append(targetList, targetItem)
 		return
 	}
@@ -116,6 +118,7 @@ func GetFullClassifyByClassifyId(targetClassifyId int) (targetList []*data_manag
 				targetItem.UniqueCode = v.UniqueCode
 				targetItem.Level = v.Level
 				targetItem.ClassifyName = v.ClassifyName
+				targetItem.IsJoinPermission = v.IsJoinPermission
 				targetList = append(targetList, targetItem)
 			}
 		}
@@ -164,6 +167,7 @@ func GetChildClassifyByClassifyId(targetClassifyId int) (targetList []*data_mana
 				targetItem.UniqueCode = v.UniqueCode
 				targetItem.Level = v.Level
 				targetItem.ClassifyName = v.ClassifyName
+				targetItem.IsJoinPermission = v.IsJoinPermission
 				targetList = append(targetList, targetItem)
 			}
 		}