浏览代码

Merge branch 'debug' of http://8.136.199.33:3000/eta_gn_server/eta_api into bzq/6665_excel_bug_cf

zqbao 4 月之前
父节点
当前提交
1d34241514
共有 59 个文件被更改,包括 4180 次插入2243 次删除
  1. 34 1
      controllers/bi_dashboard.go
  2. 32 10
      controllers/data_manage/chart_info.go
  3. 2 2
      controllers/data_manage/data_manage_permission/data_move.go
  4. 22 15
      controllers/data_manage/edb_classify.go
  5. 67 77
      controllers/data_manage/edb_info.go
  6. 0 70
      controllers/data_manage/edb_info_calculate.go
  7. 130 0
      controllers/data_manage/edb_info_share.go
  8. 0 13
      controllers/data_manage/excel/custom_analysis_edb.go
  9. 18 58
      controllers/data_manage/excel/excel_info.go
  10. 0 404
      controllers/data_manage/future_good/future_good_edb_info.go
  11. 0 27
      controllers/data_manage/manual.go
  12. 0 244
      controllers/data_manage/multiple_graph_config.go
  13. 0 4
      controllers/data_manage/my_chart.go
  14. 4 4
      controllers/data_manage/predict_edb_classify.go
  15. 4 5
      controllers/data_manage/predict_edb_info.go
  16. 19 0
      controllers/data_manage/range_analysis/chart_info.go
  17. 1 1
      controllers/data_manage/wind_data.go
  18. 359 0
      controllers/fix.go
  19. 300 0
      controllers/image_conf_controller.go
  20. 346 6
      controllers/knowledge/resource.go
  21. 10 0
      controllers/ppt_report.go
  22. 61 53
      controllers/ppt_v2.go
  23. 300 0
      controllers/ppt_v2_history.go
  24. 22 1
      controllers/report_chapter.go
  25. 443 0
      controllers/report_history.go
  26. 41 3
      controllers/report_v2.go
  27. 0 4
      controllers/resource.go
  28. 0 14
      controllers/sys_admin.go
  29. 1 7
      go.mod
  30. 0 23
      go.sum
  31. 1 0
      models/bi_dashboard/bi_dashboard.go
  32. 13 1
      models/bi_dashboard/bi_dashboard_detail.go
  33. 137 16
      models/data_manage/edb_classify.go
  34. 13 0
      models/data_manage/edb_collect.go
  35. 15 0
      models/data_manage/edb_info.go
  36. 93 0
      models/data_manage/edb_info_share.go
  37. 23 0
      models/data_manage/request/edb_info_share.go
  38. 10 0
      models/data_manage/response/edb_info_share.go
  39. 69 0
      models/image_conf.go
  40. 49 4
      models/knowledge/knowledge_resource.go
  41. 51 0
      models/knowledge/knowledge_resource_bi_dashboard_detail.go
  42. 82 58
      models/ppt_v2.go
  43. 89 0
      models/ppt_v2_history.go
  44. 2 0
      models/report.go
  45. 1 0
      models/report_chapter.go
  46. 86 0
      models/report_history.go
  47. 2 2
      models/report_v2.go
  48. 153 0
      routers/commentsRouter.go
  49. 16 0
      routers/router.go
  50. 47 1
      services/bi_dashboard.go
  51. 6 3
      services/data/data_manage_permission/data_move.go
  52. 59 0
      services/data/data_manage_permission/edb.go
  53. 369 240
      services/data/edb_classify.go
  54. 16 0
      services/data/edb_info.go
  55. 203 869
      services/elastic/elastic.go
  56. 221 0
      services/knowledge/es.go
  57. 134 2
      services/knowledge/resource.go
  58. 2 0
      utils/config.go
  59. 2 1
      utils/constants.go

+ 34 - 1
controllers/bi_dashboard.go

@@ -100,16 +100,21 @@ func (this *BIDaShboardController) AddDashboard() {
 		return
 	}
 	detailList := make([]*bi_dashboard.BiDashboardDetail, 0)
+	var isAddResource bool
 	for i, v := range req.List {
 		item := &bi_dashboard.BiDashboardDetail{
 			BiDashboardId: int(id),
 			Type:          v.Type,
 			UniqueCode:    v.UniqueCode,
+			Conf:          v.Conf,
 			Sort:          i + 1,
 			CreateTime:    time.Now(),
 			ModifyTime:    time.Now(),
 		}
 		detailList = append(detailList, item)
+		if v.Type == 3 {
+			isAddResource = true
+		}
 	}
 	err = bi_dashboard.AddBiDashboardDetailMulti(detailList)
 	if err != nil {
@@ -117,11 +122,22 @@ func (this *BIDaShboardController) AddDashboard() {
 		br.ErrMsg = "新增详情失败,Err:" + err.Error()
 		return
 	}
+	if isAddResource {
+		msg, err := services.SaveBiDashboardKnowledgeResource(item.BiDashboardId, this.SysUser.AdminId)
+		if err != nil {
+			if msg == "" {
+				msg = "新增知识资源失败"
+			}
+			br.Msg = msg
+			br.ErrMsg = "新增知识资源失败,Err:" + err.Error()
+			return
+		}
+
+	}
 
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "新增成功"
-	//br.Data =
 }
 
 // EditPpt
@@ -179,15 +195,20 @@ func (this *BIDaShboardController) EditDashboard() {
 	}
 
 	detailList := make([]*bi_dashboard.BiDashboardDetail, 0)
+	isEditResource := false
 	for _, v := range req.List {
 		item := &bi_dashboard.BiDashboardDetail{
 			BiDashboardId: req.BiDashboardId,
 			Type:          v.Type,
 			UniqueCode:    v.UniqueCode,
+			Conf:          v.Conf,
 			Sort:          v.Sort,
 			CreateTime:    time.Now(),
 			ModifyTime:    time.Now(),
 		}
+		if v.Type == 3 {
+			isEditResource = true
+		}
 		detailList = append(detailList, item)
 	}
 	err = bi_dashboard.AddBiDashboardDetailMulti(detailList)
@@ -196,6 +217,18 @@ func (this *BIDaShboardController) EditDashboard() {
 		br.ErrMsg = "新增详情失败,Err:" + err.Error()
 		return
 	}
+	if isEditResource {
+		// 添加知识资源引用
+		msg, err := services.SaveBiDashboardKnowledgeResource(item.BiDashboardId, this.SysUser.AdminId)
+		if err != nil {
+			if msg == "" {
+				msg = "编辑知识资源失败"
+			}
+			br.Msg = msg
+			br.ErrMsg = "编辑知识资源失败,Err:" + err.Error()
+			return
+		}
+	}
 
 	br.Ret = 200
 	br.Success = true

+ 32 - 10
controllers/data_manage/chart_info.go

@@ -167,6 +167,38 @@ func (this *ChartInfoController) ChartInfoAdd() {
 		return
 	}
 
+	// 来源字数校验
+	type SourcesFrom struct {
+		Text string `json:"text"`
+	}
+
+	if req.SourcesFrom != "" && len(req.SourcesFrom) > 0 {
+		var sourcesFrom SourcesFrom
+		err = json.Unmarshal([]byte(req.SourcesFrom), &sourcesFrom)
+		if err != nil {
+			return
+		}
+		if len(sourcesFrom.Text) > 50 {
+			br.Msg = "字数已达上限!"
+			br.ErrMsg = "来源文本字数已达上限,请修改!"
+			return
+		}
+	}
+
+	// 说明字数校验
+	if req.Instructions != "" && len(req.Instructions) > 0 {
+		var instructions SourcesFrom
+		err = json.Unmarshal([]byte(req.Instructions), &instructions)
+		if err != nil {
+			return
+		}
+		if len(instructions.Text) > 100 {
+			br.Msg = "字数已达上限!"
+			br.ErrMsg = "说明文本字数已达上限,请修改!"
+			return
+		}
+	}
+
 	chartInfo, err, errMsg, isSendEmail := data.AddChartInfo(req, sysUser.AdminId, sysUser.RealName, this.Lang)
 	if err != nil {
 		br.Msg = "保存失败"
@@ -4213,13 +4245,3 @@ func (this *ChartInfoController) ChartInfoImgSetBySvg() {
 	br.Data = resp
 	return
 }
-
-// 修复ES中的指标和图表数据
-//func init() {
-//	// 更新ES中的指标数据
-//	data.AddOrEditAllEdbInfoToEs()
-//	// 更新es中的图表数据
-//	data.AddAllChartInfo()
-//
-//	fmt.Println("全部es数据修复完成")
-//}

+ 2 - 2
controllers/data_manage/data_manage_permission/data_move.go

@@ -46,7 +46,7 @@ func (c *DataMangePermissionController) EdbChartClassifyList() {
 		return
 	}
 
-	list, err := data_manage_permission.GetEdbChartClassifyList(source, subSource)
+	list, err := data_manage_permission.GetEdbChartClassifyList(source, subSource, c.SysUser.AdminId)
 	if err != nil {
 		//br.Success = true
 		br.Msg = "获取失败"
@@ -96,7 +96,7 @@ func (c *DataMangePermissionController) SecretEdbChartClassifyList() {
 		return
 	}
 
-	resp, err := data_manage_permission.GetEdbChartClassifyList(source, subSource)
+	resp, err := data_manage_permission.GetEdbChartClassifyList(source, subSource, c.SysUser.AdminId)
 	if err != nil {
 		//br.Success = true
 		br.Msg = "获取失败"

+ 22 - 15
controllers/data_manage/edb_classify.go

@@ -41,14 +41,14 @@ func (this *EdbClassifyController) ListV2() {
 		edbType = utils.EdbTypeCalculate
 	}
 
-	rootList, err := data_manage.GetEdbClassifyByParentId(0, int8(classifyType))
+	rootList, err := data_manage.GetEdbClassifyByParentId(0, int8(classifyType), this.SysUser.AdminId)
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
 		return
 	}
 	//classifyAll, err := data_manage.GetEdbClassifyAll()
-	classifyAll, err := data_manage.GetChildEdbClassifyByClassifyType(classifyType)
+	classifyAll, err := data_manage.GetChildEdbClassifyByClassifyType(classifyType, this.SysUser.AdminId)
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
@@ -177,7 +177,7 @@ func (this *EdbClassifyController) Items() {
 	//	edbType = utils.EdbTypeCalculate
 	//}
 
-	rootList, err := data_manage.GetEdbClassifyByParentId(0, int8(classifyType))
+	rootList, err := data_manage.GetEdbClassifyByParentId(0, int8(classifyType), this.SysUser.AdminId)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
@@ -185,7 +185,7 @@ func (this *EdbClassifyController) Items() {
 	}
 
 	//classifyAll, err := data_manage.GetEdbClassifyAll()
-	classifyAll, err := data_manage.GetChildEdbClassifyByClassifyType(classifyType)
+	classifyAll, err := data_manage.GetChildEdbClassifyByClassifyType(classifyType, this.SysUser.AdminId)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
@@ -244,7 +244,7 @@ func (this *EdbClassifyController) AddEdbClassify() {
 	}
 
 	//添加指标
-	_, err, errMsg := data.AddEdbClassify(req.ClassifyName, req.ParentId, req.Level, classifyType, this.SysUser.AdminId, this.SysUser.AdminName, this.Lang)
+	_, err, errMsg := data.AddEdbClassify(req.ClassifyName, req.ParentId, req.Level, classifyType, this.SysUser.AdminId, this.SysUser.RealName, this.Lang)
 	if errMsg != `` {
 		br.Msg = errMsg
 		br.ErrMsg = errMsg
@@ -709,14 +709,14 @@ func (this *EdbClassifyController) ItemsV2() {
 	//	edbType = utils.EdbTypeCalculate
 	//}
 
-	rootList, err := data_manage.GetEdbClassifyByParentId(0, int8(classifyType))
+	rootList, err := data_manage.GetEdbClassifyByParentId(0, int8(classifyType), this.SysUser.AdminId)
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
 		return
 	}
 	//classifyAll, err := data_manage.GetEdbClassifyAll()
-	classifyAll, err := data_manage.GetChildEdbClassifyByClassifyType(classifyType)
+	classifyAll, err := data_manage.GetChildEdbClassifyByClassifyType(classifyType, this.SysUser.AdminId)
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
@@ -926,7 +926,7 @@ func (this *EdbClassifyController) ItemsV3() {
 	//}
 
 	// TODO:9级改造
-	rootList, err := data_manage.GetEdbClassifyByParentId(0, int8(classifyType))
+	rootList, err := data_manage.GetEdbClassifyByParentId(0, int8(classifyType), this.SysUser.AdminId)
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
@@ -1070,13 +1070,14 @@ func (this *EdbClassifyController) SimpleList() {
 	// 如果是 子级分类,查询该子级分类的下一级分类和指标信息
 	// 增加标识判断是文件夹还是指标列表
 	parentId, _ := this.GetInt("ParentId")
-	isOnlyMe, _ := this.GetBool("IsOnlyMe")
 	// 如果选择了只看我的,那么只查询归属于我的账号
-	sysUserId := 0
-	if isOnlyMe {
-		sysUserId = this.SysUser.AdminId
+	sysUserId := this.SysUser.AdminId
+
+	// 如果是数据查看,那么就看所有的指标和分类
+	if classifyType == utils.EdbClassifyTypeBase {
+		sysUserId = 0
 	}
-	rootList, err := data_manage.GetEdbClassifyByParentId(parentId, int8(classifyType))
+	rootList, err := data_manage.GetEdbClassifyByParentId(parentId, int8(classifyType), sysUserId)
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
@@ -1238,10 +1239,16 @@ func (this *EdbClassifyController) ClassifyTree() {
 	//	edbType = utils.EdbTypeCalculate
 	//}
 
+	sysUserId := this.SysUser.AdminId
+	// 基础指标(数据查看)默认是所有分类
+	if classifyType == utils.EdbClassifyTypeBase {
+		sysUserId = 0
+	}
+
 	allList := make([]*data_manage.EdbClassifyItems, 0)
 	if classifyType == utils.EdbClassifyTypeOrigin {
 		// 基础指标+计算指标
-		list, e := data_manage.GetEdbClassifyByClassifyTypes([]int{utils.EdbClassifyTypeBase, utils.EdbClassifyTypeCalculate})
+		list, e := data_manage.GetEdbClassifyByClassifyTypes([]int{utils.EdbClassifyTypeBase, utils.EdbClassifyTypeCalculate}, sysUserId)
 		if e != nil && !utils.IsErrNoRow(e) {
 			br.Msg = "获取失败"
 			br.ErrMsg = fmt.Sprintf("获取分类失败, %v", e)
@@ -1250,7 +1257,7 @@ func (this *EdbClassifyController) ClassifyTree() {
 		allList = list
 	} else {
 		// 单一类型
-		list, err := data_manage.GetAllEdbClassifyByType(classifyType)
+		list, err := data_manage.GetAllEdbClassifyByType(classifyType, sysUserId)
 		if err != nil && !utils.IsErrNoRow(err) {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取数据失败,Err:" + err.Error()

+ 67 - 77
controllers/data_manage/edb_info.go

@@ -1742,7 +1742,9 @@ func (this *EdbInfoController) EdbInfoFilter() {
 // @Param   IsAddPredictEdb   query   bool  false       "是否查询添加预测指标"
 // @Param   PageSize   query   int  true       "每页数据条数"
 // @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
-// @Param   EdbType   query   int  false       "指标类型:0-基础和计算;1-基础指标;2-计算指标"
+// @Param   EdbType   query   int  false       "指标类型:0-基础和计算;1-基础指标;2-计算指标;3-衍生指标"
+// @Param   EdbAuth   query   int  false       "指标权限:0-全部;1-我的;2-公共"
+// @Param   EdbCollect   query   int  false       "指标收藏状态:0-全部;1-已收藏"
 // @Success 200 {object} data_manage.EdbInfoList
 // @router /edb_info/filter_by_es [get]
 func (this *EdbInfoController) EdbInfoFilterByEs() {
@@ -1777,95 +1779,83 @@ func (this *EdbInfoController) EdbInfoFilterByEs() {
 
 	frequency := this.GetString("Frequency") //频度
 
-	isAddPredictEdb, _ := this.GetBool("IsAddPredictEdb") //是否查询添加预测指标
+	//isAddPredictEdb, _ := this.GetBool("IsAddPredictEdb") //是否查询添加预测指标
 
-	edbType, _ := this.GetInt("EdbType", 0) // 指标类型:0-基础和计算;1-基础指标;2-计算指标
+	// 指标类型数组:1-基础指标;2-计算指标;3-预测指标
+	edbTypeList := make([]int, 0)
+	edbInfoType := -1                            // 指标范围
+	edbTypeStr := this.GetString("EdbType", "0") // 指标类型:0-基础和计算;1-基础指标;2-计算指标;3-预测指标
+	{
+		if edbTypeStr == `` || edbTypeStr == `0` {
+			edbTypeList = []int{1, 2}
+			edbInfoType = 0
+		} else {
+			var hasEdb, hasPredictEdb bool
+			tmpEdbTypeList := strings.Split(edbTypeStr, `,`)
+			for _, v := range tmpEdbTypeList {
+				edbType, err := strconv.Atoi(v)
+				if err != nil {
+					br.Msg = "EdbType异常"
+					br.ErrMsg = "EdbType异常,Err:" + err.Error()
+					return
+				}
+
+				// 指标类型
+				switch edbType {
+				case 1, 2:
+					hasEdb = true
+					edbTypeList = append(edbTypeList, edbType)
+				case 3:
+					hasPredictEdb = true
+					edbTypeList = []int{1, 2}
+				}
+			}
+
+			// 只有数据查看和指标加工
+			if hasEdb && !hasPredictEdb {
+				edbInfoType = 0
+			} else if !hasEdb && hasPredictEdb {
+				// 只有预测指标
+				edbInfoType = 1
+			}
+		}
+	}
+
+	edbAuth, _ := this.GetInt("EdbAuth", 0) // 指标权限范围,0-全部;1-我的;2-公共
+
+	edbCollect, _ := this.GetInt("EdbCollect", 0) // 指标收藏状态:0-全部;1-已收藏
 
 	var edbInfoList []*data_manage.EdbInfoList
 	var err error
 
-	// 无权限指标 和 无权限指标分类id
-	noPermissionEdbInfoIdList, noPermissionEdbClassifyIdList, err := data_manage_permission.GetUserAllEdbAndClassifyNoPermissionList(this.SysUser.AdminId, utils.EDB_INFO_TYPE, edbType)
+	// 无权限指标 和 无权限指标分类id(只考虑)
+	noPermissionEdbInfoIdList, noPermissionEdbClassifyIdList, err := data_manage_permission.GetUserAllEdbAndClassifyNoPermissionListV2(this.SysUser.AdminId)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
 		return
 	}
 
-	// 是否走ES
-	isEs := false
-	if keyWord != "" {
-		var keyWordArr []string
-		keyWordArr = append(keyWordArr, keyWord)
-
-		newKeyWord := strings.Split(keyWord, " ")
-		keyWordArr = append(keyWordArr, newKeyWord...)
-
-		// 普通的搜索
-		if !isAddPredictEdb {
-			total, edbInfoList, err = elastic.SearchEdbInfoData(utils.DATA_INDEX_NAME, keyWord, startSize, pageSize, filterSource, source, 0, frequency, noPermissionEdbInfoIdList, noPermissionEdbClassifyIdList, edbType)
-		} else {
-			// 允许添加预测指标的搜索
-			total, edbInfoList, err = elastic.SearchAddPredictEdbInfoData(utils.DATA_INDEX_NAME, keyWord, noPermissionEdbInfoIdList, noPermissionEdbClassifyIdList, startSize, pageSize, edbType)
-		}
-		isEs = true
-	} else {
-		var condition string
-		var pars []interface{}
-		// 普通指标
-		condition += ` AND edb_info_type = ? `
-		pars = append(pars, 0)
-
-		// 无权限指标id
-		lenNoPermissionEdbInfoIdList := len(noPermissionEdbInfoIdList)
-		if lenNoPermissionEdbInfoIdList > 0 {
-			condition += ` AND edb_info_id  not in (` + utils.GetOrmInReplace(lenNoPermissionEdbInfoIdList) + `) `
-			pars = append(pars, noPermissionEdbInfoIdList)
-		}
-		// 无权限指标分类id
-		lenNoPermissionEdbClassifyIdList := len(noPermissionEdbClassifyIdList)
-		if lenNoPermissionEdbClassifyIdList > 0 {
-			condition += ` AND classify_id  not in (` + utils.GetOrmInReplace(lenNoPermissionEdbClassifyIdList) + `) `
-			pars = append(pars, noPermissionEdbClassifyIdList)
-		}
-
-		switch filterSource {
-		case 2:
-			condition += ` AND frequency='月度' `
-		case 3:
-			condition += ` AND frequency <> '日度' `
-		case 4:
-			condition += ` AND edb_type = 1 `
-		case 5:
-			condition += ` AND source = 6 ` //来源(同比值)
-		case 6:
-			condition += ` AND frequency != ? `
-			pars = append(pars, "年度")
+	// 收藏的指标id
+	collectEdbInfoIdList := make([]int, 0)
+	if edbCollect == 1 {
+		collectEdbInfoIdList, err = data_manage.GetUserAllCollectEdbInfoIdList(this.SysUser.AdminId)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取收藏指标配置数据失败,Err:" + err.Error()
+			return
 		}
+	}
 
-		//频度
-		if frequency != "" {
-			condition += ` AND frequency = ? `
-			pars = append(pars, frequency)
-		}
+	var keyWordArr []string
+	keyWordArr = append(keyWordArr, keyWord)
 
-		if source > 0 && filterSource != 5 {
-			condition += ` AND source = ? `
-			pars = append(pars, source)
-		}
-		// 查询只允许添加预测指标的搜索
-		if isAddPredictEdb {
-			condition += ` AND frequency in ("日度","周度","月度") `
-		}
+	newKeyWord := strings.Split(keyWord, " ")
+	keyWordArr = append(keyWordArr, newKeyWord...)
 
-		// 基础指标/计算指标
-		if edbType > 0 {
-			condition += ` AND edb_type = ? `
-			pars = append(pars, edbType)
-		}
+	// 普通的搜索
+	total, edbInfoList, err = elastic.SearchEdbInfoData(keyWord, startSize, pageSize, filterSource, source, frequency, noPermissionEdbInfoIdList, noPermissionEdbClassifyIdList, collectEdbInfoIdList, edbTypeList, edbInfoType, edbAuth, this.SysUser.AdminId)
 
-		total, edbInfoList, err = data_manage.GetEdbInfoFilterList(condition, pars, startSize, pageSize)
-	}
 	if err != nil {
 		edbInfoList = make([]*data_manage.EdbInfoList, 0)
 	}
@@ -1903,8 +1893,8 @@ func (this *EdbInfoController) EdbInfoFilterByEs() {
 			return
 		}
 
-		// 如果是ES的话,需要重新查一下指标的信息,主要是为了把是否授权字段找出来
-		if isEs {
+		// 因为是ES查找的,所以需要重新查一下指标的信息,主要是为了把是否授权字段找出来
+		{
 			edbInfoIdList := make([]int, 0)
 			for i := 0; i < edbInfoListLen; i++ {
 				edbInfoIdList = append(edbInfoIdList, edbInfoList[i].EdbInfoId)
@@ -3217,7 +3207,7 @@ func (this *EdbInfoController) AllEdbInfoByEs() {
 		keyWordArr = append(keyWordArr, newKeyWord...)
 
 		// 普通的搜索
-		total, edbInfoList, err = elastic.SearchEdbInfoData(utils.DATA_INDEX_NAME, keyWord, startSize, pageSize, filterSource, source, -1, frequency, noPermissionEdbInfoIdList, noPermissionEdbClassifyIdList, edbType)
+		total, edbInfoList, err = elastic.SearchEdbInfoData(keyWord, startSize, pageSize, filterSource, source, frequency, noPermissionEdbInfoIdList, noPermissionEdbClassifyIdList, []int{}, []int{1, 2}, -1, 0, this.SysUser.AdminId)
 		isEs = true
 	} else {
 		var condition string

+ 0 - 70
controllers/data_manage/edb_info_calculate.go

@@ -1068,76 +1068,6 @@ func (this *ChartInfoController) CalculateBatchReset() {
 	br.IsAddLog = true
 }
 
-//累计值转月值
-//func init() {
-//	fmt.Println("start CalculateBatchSave")
-//	req := new(data_manage.EdbInfoCalculateBatchSaveReq)
-//	req.EdbInfoId = 100282
-//
-//	randStr := utils.GetRandDigit(4)
-//	edbCode := `C` + time.Now().Format("060102") + randStr
-//	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
-//	uniqueCode := utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
-//	fromEdbInfo, _ := data_manage.GetEdbInfoById(req.EdbInfoId)
-//	data_manage.AddCalculateLjzzy(req, fromEdbInfo, edbCode, uniqueCode, 1, "rdluck")
-//	fmt.Println("end CalculateBatchSave")
-//	return
-//}
-
-////同比值
-//func init() {
-//	fmt.Println("start AddCalculateTbz")
-//	req := new(data_manage.EdbInfoCalculateBatchSaveReq)
-//	req.EdbInfoId = 100092
-//
-//	randStr := utils.GetRandDigit(4)
-//	edbCode := `C` + time.Now().Format("060102") + randStr
-//	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
-//	uniqueCode := utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
-//	fromEdbInfo, _ := data_manage.GetEdbInfoById(req.EdbInfoId)
-//
-//	data_manage.AddCalculateTbz(req, fromEdbInfo, edbCode, uniqueCode, 1, "rdluck")
-//	fmt.Println("end AddCalculateTbz")
-//	return
-//}
-//同差值
-
-//func init() {
-//	fmt.Println("start AddCalculateTbz")
-//	req := new(data_manage.EdbInfoCalculateBatchSaveReq)
-//	req.EdbInfoId = 100092
-//
-//	randStr := utils.GetRandDigit(4)
-//	edbCode := `C` + time.Now().Format("060102") + randStr
-//	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
-//	uniqueCode := utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
-//	fromEdbInfo, _ := data_manage.GetEdbInfoById(req.EdbInfoId)
-//
-//	data_manage.AddCalculateTcz(req, fromEdbInfo, edbCode, uniqueCode, 1, "rdluck")
-//
-//	fmt.Println("end AddCalculateTbz")
-//	return
-//}
-
-//N数值移动平均计算
-//func init() {
-//	fmt.Println("start AddCalculateTbz")
-//	req := new(data_manage.EdbInfoCalculateBatchSaveReq)
-//	req.FromEdbInfoId = 100081
-//
-//	randStr := utils.GetRandDigit(4)
-//	edbCode := `C` + time.Now().Format("060102") + randStr
-//	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
-//	uniqueCode := utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
-//	fromEdbInfo, _ := data_manage.GetEdbInfoById(req.FromEdbInfoId)
-//	formulaInt := 3
-//	fmt.Println("edbCode:", edbCode)
-//	data_manage.AddCalculateNszydpjjs(req, fromEdbInfo, edbCode, uniqueCode, 1, "rdluck", formulaInt)
-//
-//	fmt.Println("end AddCalculateTbz")
-//	return
-//}
-
 // ExecPythonCode
 // @Title 执行python代码
 // @Description 执行python代码接口

+ 130 - 0
controllers/data_manage/edb_info_share.go

@@ -0,0 +1,130 @@
+package data_manage
+
+import (
+	"encoding/json"
+	"eta_gn/eta_api/controllers"
+	"eta_gn/eta_api/models"
+	"eta_gn/eta_api/models/data_manage"
+	"eta_gn/eta_api/models/data_manage/request"
+	"eta_gn/eta_api/models/data_manage/response"
+	"eta_gn/eta_api/services/data"
+)
+
+// EdbInfoShareController 数据管理
+type EdbInfoShareController struct {
+	controllers.BaseAuthController
+}
+
+// UserList
+// @Title 获取指标设置共享的详情
+// @Description 获取指标详情接口
+// @Param   EdbInfoId   query   int  true       "指标id"
+// @Success 200 {object} response.EdbInfoShareUserResp
+// @router /edb_info/share/user_list [get]
+func (c *EdbInfoShareController) UserList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	edbInfoId, _ := c.GetInt("EdbInfoId")
+	if edbInfoId <= 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误"
+		return
+	}
+	_, err := data_manage.GetEdbInfoById(edbInfoId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
+		return
+	}
+
+	//// TODO 权限校验
+	//{
+	//	classifyMap := make(map[int]*data_manage.EdbClassifyIdItems)
+	//	for _, v := range classifyList {
+	//		classifyMap[v.ClassifyId] = v
+	//	}
+	//	if currClassify, ok := classifyMap[edbInfo.ClassifyId]; ok {
+	//		haveOperaAuth, err := data_manage_permission.CheckEdbPermission(edbInfo.IsJoinPermission, currClassify.IsJoinPermission, c.SysUser.AdminId, edbInfo.EdbInfoId, edbInfo.ClassifyId)
+	//		if err != nil {
+	//			br.Msg = err.Error()
+	//			br.ErrMsg = "校验指标权限失败,err:" + err.Error()
+	//			return
+	//		}
+	//		resp.HaveOperaAuth = haveOperaAuth
+	//	}
+	//}
+
+	resp := response.EdbInfoShareUserResp{}
+
+	obj := data_manage.EdbInfoShare{}
+	list, err := obj.GetListByEdbInfoId(edbInfoId)
+	if err != nil {
+		br.Msg = `获取失败`
+		br.ErrMsg = `获取失败:` + err.Error()
+		return
+	}
+	resp.List = list
+	if len(list) > 0 {
+		resp.ShareType = list[0].ShareType
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// Save
+// @Title 保存指标指标设置共享的详情
+// @Description 获取指标详情接口
+// @Param	request	body request.SetEdbInfoShareReq true "type json string"
+// @Success 200 {object} data_manage.EdbInfo
+// @router /edb_info/share/save [post]
+func (c *EdbInfoShareController) Save() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req request.SetEdbInfoShareReq
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	obj := data_manage.EdbInfoShare{}
+	err = obj.SaveEdbInfoShare([]int{req.EdbInfoId}, req.UserIdList, req.ShareType)
+	if err != nil {
+		br.Msg = `保存失败`
+		br.ErrMsg = `保存失败:` + err.Error()
+		return
+	}
+
+	// 更新es
+	go data.AddOrEditEdbInfoToEs(req.EdbInfoId)
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "保存成功"
+}

+ 0 - 13
controllers/data_manage/excel/custom_analysis_edb.go

@@ -461,16 +461,3 @@ func (c *CustomAnalysisController) EdbRefresh() {
 	br.Success = true
 	br.Msg = "刷新成功"
 }
-
-//func init() {
-//	excelInfo, err := excelModel.GetExcelInfoById(160)
-//	if err != nil {
-//		fmt.Println("查找excel失败:", err)
-//		return
-//	}
-//	_, err, _ = excel.GenerateExcelCustomAnalysisExcel(excelInfo)
-//	if err != nil {
-//		fmt.Println("生成excel失败:", err)
-//		return
-//	}
-//}

文件差异内容过多而无法显示
+ 18 - 58
controllers/data_manage/excel/excel_info.go


+ 0 - 404
controllers/data_manage/future_good/future_good_edb_info.go

@@ -334,407 +334,3 @@ func (this *FutureGoodEdbInfoController) FutureGoodEdbExchangeList() {
 	br.Msg = "获取成功"
 	br.Data = list
 }
-
-//func init() {
-//	var condition string
-//	var pars []interface{}
-//
-//	condition += ` AND parent_id = ? `
-//	pars = append(pars, 0)
-//
-//	list, err := future_good2.GetFutureGoodEdbInfoList(condition, pars)
-//	if err != nil && !utils.IsErrNoRow(err) {
-//		fmt.Println("err:", err)
-//		return
-//	}
-//
-//	monthMap := map[string]string{
-//		`(1月`:  "(Jan",
-//		`(2月`:  "(Feb",
-//		`(3月`:  "(Mar",
-//		`(4月`:  "(Apr",
-//		`(5月`:  "(May",
-//		`(6月`:  "(Jun",
-//		`(7月`:  "(Jul",
-//		`(8月`:  "(Aug",
-//		`(9月`:  "(Sep",
-//		`(10月`: "(Oct",
-//		`(11月`: "(Nov",
-//		`(12月`: "(Dec",
-//	}
-//	for _, v := range list {
-//		fmt.Println(v)
-//		var tmpCondition string
-//		var tmpPars []interface{}
-//
-//		tmpCondition += ` AND parent_id = ? `
-//		tmpPars = append(tmpPars, v.FutureGoodEdbInfoId)
-//		tmpList, tmpErr := future_good2.GetFutureGoodEdbInfoList(tmpCondition, tmpPars)
-//		if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
-//			fmt.Println("err:", tmpErr)
-//			return
-//		}
-//
-//		for _, child := range tmpList {
-//			child.FutureGoodEdbNameEn = strings.Replace(child.FutureGoodEdbNameEn, v.FutureGoodEdbName, v.FutureGoodEdbNameEn, -1)
-//
-//			for k, month := range monthMap {
-//				if strings.Contains(child.FutureGoodEdbNameEn, k) {
-//					child.FutureGoodEdbNameEn = strings.Replace(child.FutureGoodEdbNameEn, k, month, -1)
-//					fmt.Println(child.FutureGoodEdbNameEn)
-//					//os.Exit(-1)
-//					child.Update([]string{"FutureGoodEdbNameEn"})
-//				}
-//			}
-//		}
-//	}
-//
-//	fmt.Println("end")
-//}
-
-//func init() {
-//
-//	edbCodeMap := map[string]string{
-//		//"沪深300指数期货": "IF",
-//		//"上证50指数期货": "IH",
-//		//"中证500指数期货": "IC",
-//		//"中证1000指数期货": "IM",
-//		//"2年期国债期货": "TS",
-//		//"5年期国债期货": "TF",
-//		"10年期国债期货": "T",
-//	}
-//	//T03
-//	suffix := "M.CFE"
-//	monthList := []string{"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"}
-//	monthStrList := []string{"(1月)", "(2月)", "(3月)", "(4月)", "(5月)", "(6月)", "(7月)", "(8月)", "(9月)", "(10月)", "(11月)", "(12月)"}
-//
-//	for k, v := range edbCodeMap {
-//		code := v + "CFE"
-//		tmpFutureGoodEdbInfo := &future_good2.FutureGoodEdbInfo{
-//			//FutureGoodEdbInfoId: 0,
-//			FutureGoodEdbCode:   code,
-//			FutureGoodEdbName:   k,
-//			FutureGoodEdbNameEn: k,
-//			ParentId:            0,
-//			Exchange:            "中金所",
-//			Month:               0,
-//			StartDate:           "",
-//			EndDate:             "",
-//			MinValue:            0,
-//			MaxValue:            0,
-//			LatestValue:         0,
-//			//LatestDate:          time.Time{},
-//			ServerUrl:  "",
-//			CreateTime: time.Now(),
-//			ModifyTime: time.Now(),
-//		}
-//		err := future_good2.AddFutureGoodEdbInfo(tmpFutureGoodEdbInfo)
-//		if err != nil {
-//			fmt.Println("添加指标:", k, "失败,err:", err)
-//			continue
-//		}
-//
-//		for index, month := range monthList {
-//			code2 := v + month + suffix
-//			name := tmpFutureGoodEdbInfo.FutureGoodEdbName + monthStrList[index]
-//			tmpFutureGoodEdbInfo2 := &future_good2.FutureGoodEdbInfo{
-//				//FutureGoodEdbInfoId: 0,
-//				FutureGoodEdbCode:   code2,
-//				FutureGoodEdbName:   name,
-//				FutureGoodEdbNameEn: name,
-//				ParentId:            tmpFutureGoodEdbInfo.FutureGoodEdbInfoId,
-//				Exchange:            "中金所",
-//				Month:               0,
-//				StartDate:           "",
-//				EndDate:             "",
-//				MinValue:            0,
-//				MaxValue:            0,
-//				LatestValue:         0,
-//				//LatestDate:          time.Time{},
-//				ServerUrl:  "",
-//				CreateTime: time.Now(),
-//				ModifyTime: time.Now(),
-//			}
-//			err = future_good2.AddFutureGoodEdbInfo(tmpFutureGoodEdbInfo2)
-//			if err != nil {
-//				fmt.Println("添加子指标:", name, "失败,err:", err)
-//				continue
-//			}
-//		}
-//	}
-//
-//	fmt.Println("end")
-//}
-
-//func init() {
-//	var condition string
-//	var pars []interface{}
-//
-//	condition += ` AND parent_id > ? AND start_date= ? `
-//	pars = append(pars, 0, "0000-00-00")
-//
-//	list, err := future_good2.GetFutureGoodEdbInfoList(condition, pars)
-//	if err != nil && !utils.IsErrNoRow(err) {
-//		fmt.Println("err:", err)
-//		return
-//	}
-//
-//	for _, v := range list {
-//		fmt.Println(v)
-//		resp, err := future_good.AddEdbData(v.FutureGoodEdbCode)
-//		if err != nil {
-//			fmt.Println(v.FutureGoodEdbName, "添加 异常 ,err:", err)
-//			continue
-//		}
-//		if resp.Ret != 200 {
-//			fmt.Println(v.FutureGoodEdbName, "添加 失败 ,msg:", resp.Msg, ";errMsg:", resp.ErrMsg)
-//		}
-//	}
-//
-//	fmt.Println("end")
-//}
-
-//func init() {
-//	var condition string
-//	var pars []interface{}
-//
-//	condition += ` AND parent_id = ? AND start_date= ? `
-//	pars = append(pars, 0, "0000-00-00")
-//
-//	list, err := future_good2.GetFutureGoodEdbInfoList(condition, pars)
-//	if err != nil && !utils.IsErrNoRow(err) {
-//		fmt.Println("err:", err)
-//		return
-//	}
-//
-//	for _, v := range list {
-//		fmt.Println(v)
-//		//v.FutureGoodEdbCode = strings.Replace(v.FutureGoodEdbCode, ".", "ZL.", -1)
-//		//v.Update([]string{"FutureGoodEdbCode"})
-//		resp, err := future_good.AddEdbData(v.FutureGoodEdbCode)
-//		if err != nil {
-//			fmt.Println(v.FutureGoodEdbName, "添加 异常 ,err:", err)
-//			continue
-//		}
-//		if resp.Ret != 200 {
-//			fmt.Println(v.FutureGoodEdbName, "添加 失败 ,msg:", resp.Msg, ";errMsg:", resp.ErrMsg)
-//		}
-//	}
-//
-//	fmt.Println("end")
-//}
-
-// 添加海外交易所
-//func init() {
-//	exchangeName := `新加坡证券(SGX)`
-//	suffix := ".SGX"
-//	type TmpStruct struct {
-//		Name  string
-//		Code  string
-//		Year  int
-//		Month int
-//	}
-//	str := `TSI铁矿石指数	FEF	SGX	2612`
-//	list := make([]TmpStruct, 0)
-//
-//	strList := strings.Split(str, `
-//`)
-//	//fmt.Println(strList)
-//	for _, v := range strList {
-//		v = strings.TrimPrefix(v, "\t")
-//		tmp := strings.Split(v, `	`)
-//		fmt.Println(tmp)
-//
-//		year, err := strconv.Atoi(tmp[3][0:2])
-//		if err != nil {
-//			fmt.Println(err)
-//			return
-//		}
-//		//fmt.Println(year)
-//		month, err := strconv.Atoi(tmp[3][2:4])
-//		if err != nil {
-//			fmt.Println(err)
-//			return
-//		}
-//		//fmt.Println(month)
-//
-//		tmpStruct := TmpStruct{
-//			Name:  tmp[0],
-//			Code:  tmp[1],
-//			Year:  year,
-//			Month: month,
-//		}
-//		list = append(list, tmpStruct)
-//	}
-//
-//	//T03
-//	//suffix := ".CMX"
-//	//1、@CL0W.NMX[NYMEX美原油电子盘主力(持仓量)合约]
-//	//2、@CL23J.NMX[NYMEX美原油电子盘2304]
-//	//yearList := []int{2023, 2024, 2025, 2026, 2027, 2028}
-//	monthList := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
-//	startMonth := 3
-//	//endMonth := 5
-//
-//	monthCodeStrList := []string{"F", "G", "H", "J", "K", "M", "N", "Q", "U", "V", "X", "Z"}
-//	//monthStrList := []string{"(1月)", "(2月)", "(3月)", "(4月)", "(5月)", "(6月)", "(7月)", "(8月)", "(9月)", "(10月)", "(11月)", "(12月)"}
-//
-//	for k, v := range list {
-//		yearList := make([]int, 0)
-//		for i := 23; i <= v.Year; i++ {
-//			yearList = append(yearList, i+2000)
-//		}
-//		//fmt.Println(yearList)
-//		//return
-//		endMonth := v.Month
-//
-//		code := v.Code + `0W` + suffix
-//		tmpFutureGoodEdbInfo := &future_good2.FutureGoodEdbInfo{
-//			//FutureGoodEdbInfoId: 0,
-//			FutureGoodEdbCode:   code,
-//			FutureGoodEdbName:   v.Name,
-//			FutureGoodEdbNameEn: v.Name,
-//			ParentId:            0,
-//			RegionType:          `海外`,
-//			Exchange:            exchangeName,
-//			Year:                0,
-//			Month:               0,
-//			StartDate:           "",
-//			EndDate:             "",
-//			MinValue:            0,
-//			MaxValue:            0,
-//			LatestValue:         0,
-//			//LatestDate:          time.Time{},
-//			ServerUrl:  "",
-//			CreateTime: time.Now(),
-//			ModifyTime: time.Now(),
-//		}
-//		err := future_good2.AddFutureGoodEdbInfo(tmpFutureGoodEdbInfo)
-//		if err != nil {
-//			fmt.Println("添加指标:", k, "失败,err:", err)
-//			continue
-//		}
-//
-//		lastYearIndex := len(yearList) - 1
-//		for yearIndex, year := range yearList {
-//			for index, month := range monthList {
-//				// 如果第一年的开始月份早于约定的开始月份,那么就退出这个循环,进入下一个循环
-//				if yearIndex == 0 && month < startMonth {
-//					continue
-//				}
-//				// 如果最一年的结束月份晚于约定的开始月份,那么就退出这个循环,进入下一个循环
-//				if lastYearIndex == yearIndex && month > endMonth {
-//					break
-//				}
-//				monthStr := strconv.Itoa(month)
-//				if month < 10 {
-//					monthStr = `0` + monthStr
-//				}
-//				yearStr := strconv.Itoa(year - 2000)
-//				yearMonthStr := yearStr + monthStr
-//
-//				code2 := v.Code + yearStr + monthCodeStrList[index] + suffix
-//				name := tmpFutureGoodEdbInfo.FutureGoodEdbName + `(` + yearMonthStr + `)`
-//				tmpFutureGoodEdbInfo2 := &future_good2.FutureGoodEdbInfo{
-//					//FutureGoodEdbInfoId: 0,
-//					FutureGoodEdbCode:   code2,
-//					FutureGoodEdbName:   name,
-//					FutureGoodEdbNameEn: name,
-//					ParentId:            tmpFutureGoodEdbInfo.FutureGoodEdbInfoId,
-//					RegionType:          `海外`,
-//					Exchange:            exchangeName,
-//					Year:                year,
-//					Month:               month,
-//					StartDate:           "",
-//					EndDate:             "",
-//					MinValue:            0,
-//					MaxValue:            0,
-//					LatestValue:         0,
-//					//LatestDate:          time.Time{},
-//					ServerUrl:  "",
-//					CreateTime: time.Now(),
-//					ModifyTime: time.Now(),
-//				}
-//				err = future_good2.AddFutureGoodEdbInfo(tmpFutureGoodEdbInfo2)
-//				if err != nil {
-//					fmt.Println("添加子指标:", name, "失败,err:", err)
-//					continue
-//				}
-//			}
-//		}
-//
-//	}
-//
-//	fmt.Println("end")
-//}
-
-// 刷新海外交易所数据
-//func init() {
-//	var condition string
-//	var pars []interface{}
-//
-//	//condition += ` AND parent_id > ? AND start_date= ? `
-//	condition += ` AND region_type = ? AND start_date= ?  AND exchange = ? `
-//	pars = append(pars, "海外", "0000-00-00", "伦敦金属(LME)")
-//	//condition += ` AND region_type = ? AND start_date= ?  `
-//	//pars = append(pars, "海外", "0000-00-00")
-//
-//	list, err := future_good2.GetFutureGoodEdbInfoList(condition, pars)
-//	if err != nil && !utils.IsErrNoRow(err) {
-//		fmt.Println("err:", err)
-//		return
-//	}
-//
-//	errIdList := make([]string, 0)
-//	for _, v := range list {
-//		fmt.Println(v)
-//		resp, err := future_good.AddEdbData(v.FutureGoodEdbCode)
-//		if err != nil {
-//			fmt.Println(v.FutureGoodEdbName, "添加 异常 ,err:", err)
-//			continue
-//		}
-//		if resp.Ret != 200 {
-//			errIdList = append(errIdList, fmt.Sprint(v.FutureGoodEdbInfoId))
-//			fmt.Println(v.FutureGoodEdbName, "添加 失败 ,msg:", resp.Msg, ";errMsg:", resp.ErrMsg)
-//		}
-//	}
-//
-//	fmt.Println("end")
-//	fmt.Println(strings.Join(errIdList, ","))
-//}
-
-// 刷新海外交易所数据
-//func init() {
-//	var condition string
-//	var pars []interface{}
-//
-//	//condition += ` AND parent_id > ? AND start_date= ? `
-//	condition += ` AND region_type = ? AND parent_id != 0 and future_good_edb_type = 1`
-//	pars = append(pars, "海外")
-//	//condition += ` AND region_type = ? AND start_date= ?  `
-//	//pars = append(pars, "海外", "0000-00-00")
-//
-//	list, err := future_good2.GetFutureGoodEdbInfoList(condition, pars)
-//	if err != nil && !utils.IsErrNoRow(err) {
-//		fmt.Println("err:", err)
-//		return
-//	}
-//	for _, v := range list {
-//		//fmt.Println(v.FutureGoodEdbName)
-//		tmpList := strings.Split(v.FutureGoodEdbName, "(")
-//		//fmt.Println(tmpList)
-//		//fmt.Println(tmpList[1])
-//		year, err := strconv.Atoi(tmpList[1][0:2])
-//		if err != nil {
-//			fmt.Println(err)
-//			return
-//		}
-//		v.Year = year + 2000
-//		err = v.Update([]string{"Year"})
-//		if err != nil {
-//			fmt.Println(err)
-//			return
-//		}
-//	}
-//	fmt.Println("end")
-//}

+ 0 - 27
controllers/data_manage/manual.go

@@ -627,30 +627,3 @@ func (this *ManualController) AllClassifyList() {
 	br.Msg = "获取成功"
 	br.Data = list
 }
-
-//func init() {
-//	fmt.Println("start")
-//	adminId:=137
-//	setList, err := data_manage.GetManualUserSetClassify(adminId)
-//	if err != nil {
-//		fmt.Println("err:", err)
-//		return
-//	}
-//	listLen := len(setList)
-//	classifyArr := make([]string, 0)
-//	for i := 0; i < listLen; i++ {
-//		classifyArr = append(classifyArr, strconv.Itoa(setList[i].ClassifyId))
-//	}
-//	classifyIdStr := strings.Join(classifyArr, ",")
-//	condition := ""
-//	if classifyIdStr != "" {
-//		condition += ` AND classify_id IN(` + classifyIdStr + `)`
-//	}
-//	items, err := data_manage.GetManualClassifyAllByCondition(condition)
-//	if err != nil {
-//		fmt.Println("err:", err)
-//		return
-//	}
-//	fmt.Println(items)
-//	fmt.Println("end")
-//}

+ 0 - 244
controllers/data_manage/multiple_graph_config.go

@@ -1598,247 +1598,3 @@ func (this *ChartInfoController) GetMultipleGraphConfig() {
 	br.Data = resp
 	br.IsAddLog = true
 }
-
-//	func init() {
-//		//correlationChart := new(data_manage.ChartInfoCorrelation)
-//
-//		condition := ` AND source = 3 `
-//		list, err := data_manage.GetChartListByCondition(condition, []interface{}{}, 0, 1000)
-//		if err != nil {
-//			fmt.Println("err:", err)
-//			return
-//		}
-//		timeNowFormat := time.Now().Format(utils.FormatDate)
-//		for _, v := range list {
-//			item, tmpErr := data_manage.GetMultipleGraphConfigChartMappingByChartIdAndSource(v.ChartInfoId)
-//			if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
-//				fmt.Println("tmpErr:", tmpErr)
-//				continue
-//			}
-//			if item == nil {
-//				correlationChart := new(data_manage.ChartInfoCorrelation)
-//				e := correlationChart.GetItemById(v.ChartInfoId)
-//				if e != nil {
-//					fmt.Println("获取历史配置失败:", e)
-//					continue
-//				}
-//				day, _ := utils.GetDaysBetween2Date(utils.FormatDate, timeNowFormat, correlationChart.StartDate.Format(utils.FormatDate))
-//				req := request.SaveMultipleGraphConfigReq{
-//					MultipleGraphConfigId: 0,
-//					EdbInfoIdA:            correlationChart.EdbInfoIdFirst,
-//					EdbInfoIdB:            correlationChart.EdbInfoIdSecond,
-//					Curve:                 data_manage.CurveConfig{},
-//					Correlation: data_manage.CorrelationConfig{
-//						LeadValue:      correlationChart.LeadValue,
-//						LeadUnit:       correlationChart.LeadUnit,
-//						CalculateValue: day,
-//						CalculateUnit:  "天",
-//					},
-//					RollingCorrelation: []data_manage.RollingCorrelationConfig{
-//						{}, {},
-//					},
-//				}
-//				curveStrByte, _ := json.Marshal(req.Curve)
-//				correlationStrByte, _ := json.Marshal(req.Correlation)
-//				rollingCorrelationStrByte, _ := json.Marshal(req.RollingCorrelation)
-//
-//				multipleGraphConfig := &data_manage.MultipleGraphConfig{
-//					//MultipleGraphConfigId: 0,
-//					EdbInfoIdA:         req.EdbInfoIdA,
-//					EdbInfoIdB:         req.EdbInfoIdB,
-//					Curve:              string(curveStrByte),
-//					Correlation:        string(correlationStrByte),
-//					RollingCorrelation: string(rollingCorrelationStrByte),
-//					SysUserId:          v.SysUserId,
-//					SysUserRealName:    v.SysUserRealName,
-//					ModifyTime:         v.ModifyTime,
-//					CreateTime:         v.CreateTime,
-//				}
-//				err = data_manage.AddMultipleGraphConfig(multipleGraphConfig)
-//
-//				if err != nil {
-//					fmt.Println(v.ChartInfoId, "创建配置失败:", err)
-//					continue
-//				}
-//
-//				multipleGraphConfigChartMapping := &data_manage.MultipleGraphConfigChartMapping{
-//					//Id:                    0,
-//					MultipleGraphConfigId: multipleGraphConfig.MultipleGraphConfigId,
-//					ChartInfoId:           v.ChartInfoId,
-//					Source:                2,
-//					ModifyTime:            time.Now(),
-//					CreateTime:            time.Now(),
-//				}
-//				err = data_manage.AddMultipleGraphConfigChartMapping(multipleGraphConfigChartMapping)
-//				if err != nil {
-//					fmt.Println(v.ChartInfoId, "保存配置与图表的关联关系失败:", err)
-//				}
-//
-//				correlationChart.CalculateUnit = "天"
-//				correlationChart.CalculateValue = day
-//				err = correlationChart.Update([]string{"CalculateUnit", "CalculateValue"})
-//				if err != nil {
-//					fmt.Println(v.ChartInfoId, "修复历史数据失败:", err)
-//				}
-//			}
-//		}
-//	}
-
-// 修复相关性图表与滚动相关性图表的强关联关系
-//func init() {
-//	condition := ` AND source =  ? `
-//	pars := []interface{}{utils.CHART_SOURCE_ROLLING_CORRELATION}
-//	list, err := data_manage.GetChartListByCondition(condition, pars, 0, 1000)
-//	if err != nil {
-//		fmt.Println("err:", err)
-//		return
-//	}
-//	for _, chartInfo := range list {
-//		multipleGraphConfigChartMapping, e := data_manage.GetMultipleGraphConfigChartMappingByChartId(chartInfo.ChartInfoId)
-//		if e != nil {
-//			fmt.Println(chartInfo.ChartInfoId, ";获取滚动相关性图表的配置信息失败, Err:"+e.Error())
-//			continue
-//		}
-//		baseChartMultipleGraphConfigChartMapping, e := data_manage.GetMultipleGraphConfigChartMappingByIdAndSource(multipleGraphConfigChartMapping.MultipleGraphConfigId, 2)
-//		if e != nil {
-//			fmt.Println(chartInfo.ChartInfoId, ";获取相关性图表的配置信息失败, Err:"+e.Error())
-//			continue
-//		}
-//		baseChartCorrelationChart := new(data_manage.ChartInfoCorrelation)
-//		if e := baseChartCorrelationChart.GetItemById(baseChartMultipleGraphConfigChartMapping.ChartInfoId); e != nil {
-//			fmt.Println(chartInfo.ChartInfoId, ";获取基础相关性图表信息失败, Err:"+e.Error())
-//			continue
-//		}
-//
-//		// 自己的配置
-//		selfChartCorrelationChart := new(data_manage.ChartInfoCorrelation)
-//		if e := selfChartCorrelationChart.GetItemById(chartInfo.ChartInfoId); e != nil {
-//			fmt.Println(chartInfo.ChartInfoId, ";获取自己的相关性图表信息失败, Err:"+e.Error())
-//			continue
-//		}
-//
-//		selfChartCorrelationChart.BaseCalculateUnit = baseChartCorrelationChart.CalculateUnit
-//		selfChartCorrelationChart.BaseCalculateValue = baseChartCorrelationChart.CalculateValue
-//		err = selfChartCorrelationChart.Update([]string{"BaseCalculateUnit", "BaseCalculateValue"})
-//		if err != nil {
-//			fmt.Println(chartInfo.ChartInfoId, ";更新相关性图表信息失败, Err:"+err.Error())
-//			continue
-//		}
-//	}
-//
-//}
-
-// 修复相关性图表与滚动相关性图表的强关联关系
-//func init() {
-//	{
-//		condition := ` AND source =  ? `
-//		pars := []interface{}{utils.CHART_SOURCE_ROLLING_CORRELATION}
-//		list, err := data_manage.GetChartListByCondition(condition, pars, 0, 1000)
-//		if err != nil {
-//			fmt.Println("err:", err)
-//			return
-//		}
-//		for _, chartInfo := range list {
-//			multipleGraphConfigChartMapping, e := data_manage.GetMultipleGraphConfigChartMappingByChartId(chartInfo.ChartInfoId)
-//			if e != nil {
-//				fmt.Println(chartInfo.ChartInfoId, ";获取滚动相关性图表的配置信息失败, Err:"+e.Error())
-//				continue
-//			}
-//			multipleGraphConfig, e := data_manage.GetMultipleGraphConfigById(multipleGraphConfigChartMapping.MultipleGraphConfigId)
-//			if e != nil {
-//				fmt.Println(chartInfo.ChartInfoId, ";获取相关性图表的配置信息失败, Err:"+e.Error())
-//				continue
-//			}
-//			var curveConf data_manage.CurveConfig
-//			e = json.Unmarshal([]byte(multipleGraphConfig.Curve), &curveConf)
-//			if e != nil {
-//				fmt.Println(chartInfo.ChartInfoId, ";格式化曲线图数据失败, Err:"+e.Error())
-//				continue
-//			}
-//
-//			// 自己的配置
-//			selfChartCorrelationChart := new(data_manage.ChartInfoCorrelation)
-//			if e := selfChartCorrelationChart.GetItemById(chartInfo.ChartInfoId); e != nil {
-//				fmt.Println(chartInfo.ChartInfoId, ";获取自己的相关性图表信息失败, Err:"+e.Error())
-//				continue
-//			}
-//
-//			selfChartCorrelationChart.DateType = curveConf.DateType
-//
-//			startDate, endDate := utils.GetDateByDateType(curveConf.DateType, curveConf.StartDate, curveConf.EndDate)
-//			if startDate != `` {
-//				startDateTime, e := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
-//				if e != nil {
-//					fmt.Println(chartInfo.ChartInfoId, ";开始日期格式化失败,开始日期:", startDate, ", Err:"+e.Error())
-//					continue
-//				}
-//				selfChartCorrelationChart.StartDate = startDateTime
-//			}
-//			if endDate != `` {
-//				endDateTime, e := time.ParseInLocation(utils.FormatDate, endDate, time.Local)
-//				if e != nil {
-//					fmt.Println(chartInfo.ChartInfoId, ";开始日期格式化失败,开始日期:", startDate, ", Err:"+e.Error())
-//					continue
-//				}
-//				selfChartCorrelationChart.EndDate = endDateTime
-//			}
-//			err = selfChartCorrelationChart.Update([]string{"DateType", "StartDate", "EndDate"})
-//			if err != nil {
-//				fmt.Println(chartInfo.ChartInfoId, ";更新相关性图表信息失败, Err:"+err.Error())
-//				continue
-//			}
-//		}
-//
-//		fmt.Println("图表更新完成")
-//	}
-//
-//	{
-//		// 更新指标
-//		condition := ` AND source =  ? `
-//		pars := []interface{}{utils.DATA_SOURCE_CALCULATE_CORRELATION}
-//		list, err := data_manage.GetEdbInfoListV2ByCondition(condition, pars, 0, 10000)
-//		if err != nil {
-//			fmt.Println("err:", err)
-//			return
-//		}
-//		for _, edbInfo := range list {
-//			multipleGraphConfigEdbMappingInfo, e := data_manage.GetMultipleGraphConfigEdbMappingByEdbInfoId(edbInfo.EdbInfoId)
-//			if e != nil {
-//				fmt.Println(edbInfo.EdbInfoId, ";获取滚动相关性指标的配置信息失败, Err:"+e.Error())
-//				continue
-//			}
-//			multipleGraphConfig, e := data_manage.GetMultipleGraphConfigById(multipleGraphConfigEdbMappingInfo.MultipleGraphConfigId)
-//			if e != nil {
-//				fmt.Println(edbInfo.EdbInfoId, ";获取相关性图表的配置信息失败, Err:"+e.Error())
-//				continue
-//			}
-//
-//			// 曲线图配置
-//			var curveConf data_manage.CurveConfig
-//			e = json.Unmarshal([]byte(multipleGraphConfig.Curve), &curveConf)
-//			if e != nil {
-//				fmt.Println(edbInfo.EdbInfoId, ";格式化曲线图数据失败, Err:"+e.Error())
-//				continue
-//			}
-//
-//			var formulaConf request.EdbCalculateFormula
-//			e = json.Unmarshal([]byte(edbInfo.CalculateFormula), &formulaConf)
-//			if e != nil {
-//				fmt.Println(edbInfo.EdbInfoId, ";格式化指标计算配置数据失败, Err:"+e.Error())
-//				continue
-//			}
-//			formulaConf.DateType = curveConf.DateType
-//			formulaConf.StartDate = curveConf.StartDate
-//			formulaConf.EndDate = curveConf.EndDate
-//			calculateFormulaByte, err := json.Marshal(formulaConf)
-//			edbInfo.CalculateFormula = string(calculateFormulaByte)
-//			err = edbInfo.Update([]string{"CalculateFormula"})
-//			if err != nil {
-//				fmt.Println(edbInfo.EdbInfoId, ";更新指标信息失败, Err:"+err.Error())
-//				continue
-//			}
-//		}
-//
-//		fmt.Println("指标更新完成")
-//	}
-//}

+ 0 - 4
controllers/data_manage/my_chart.go

@@ -2250,10 +2250,6 @@ func (this *MyChartController) CompanyPublicClassifyList() {
 	br.Data = resp
 }
 
-//func init() {
-//	data.AddAllMyChartInfo()
-//}
-
 // ClassifyFrameworkNodeList
 // @Title 我的图表分类-关联的框架节点列表
 // @Description 我的图表分类-关联的框架节点列表

+ 4 - 4
controllers/data_manage/predict_edb_classify.go

@@ -138,7 +138,7 @@ func (this *PredictEdbClassifyController) Items() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
-	rootList, err := data_manage.GetEdbClassifyByParentId(0, 1)
+	rootList, err := data_manage.GetEdbClassifyByParentId(0, utils.EdbClassifyTypePredict, this.SysUser.AdminId)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
@@ -211,7 +211,7 @@ func (this *PredictEdbClassifyController) Add() {
 	}
 
 	// 添加指标分类
-	_, err, errMsg := data.AddEdbClassify(req.ClassifyName, req.ParentId, req.Level, 1, this.SysUser.AdminId, this.SysUser.AdminName, this.Lang)
+	_, err, errMsg := data.AddEdbClassify(req.ClassifyName, req.ParentId, req.Level, 1, this.SysUser.AdminId, this.SysUser.RealName, this.Lang)
 	if errMsg != `` {
 		br.Msg = errMsg
 		br.ErrMsg = errMsg
@@ -701,7 +701,7 @@ func (this *PredictEdbClassifyController) SimpleList() {
 		sysUserId = this.SysUser.AdminId
 	}
 
-	rootList, err := data_manage.GetEdbClassifyByParentId(parentId, 1)
+	rootList, err := data_manage.GetEdbClassifyByParentId(parentId, utils.EdbClassifyTypePredict, this.SysUser.AdminId)
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
@@ -832,7 +832,7 @@ func (this *PredictEdbClassifyController) ClassifyTree() {
 		this.ServeJSON()
 	}()
 
-	allList, err := data_manage.GetPredictEdbClassifyAll()
+	allList, err := data_manage.GetAllEdbClassifyByType(utils.EdbClassifyTypePredict, this.SysUser.AdminId)
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()

+ 4 - 5
controllers/data_manage/predict_edb_info.go

@@ -1082,6 +1082,7 @@ func (this *PredictEdbInfoController) FilterByEs() {
 
 	frequency := this.GetString("Frequency") //频度
 	isOnlyMe, _ := this.GetBool("IsOnlyMe")
+	isOnlyMe = true
 
 	var edbInfoList []*data_manage.EdbInfoList
 	var err error
@@ -1102,11 +1103,9 @@ func (this *PredictEdbInfoController) FilterByEs() {
 
 		newKeyWord := strings.Split(keyWord, " ")
 		keyWordArr = append(keyWordArr, newKeyWord...)
-		if isOnlyMe {
-			total, edbInfoList, err = elastic.SearchEdbInfoDataByAdminId(utils.DATA_INDEX_NAME, keyWord, startSize, pageSize, filterSource, source, 1, frequency, this.SysUser.AdminId)
-		} else {
-			total, edbInfoList, err = elastic.SearchEdbInfoData(utils.DATA_INDEX_NAME, keyWord, startSize, pageSize, filterSource, source, 1, frequency, noPermissionEdbInfoIdList, noPermissionEdbClassifyIdList, 0)
-		}
+
+		total, edbInfoList, err = elastic.SearchEdbInfoData(keyWord, startSize, pageSize, filterSource, source, frequency, noPermissionEdbInfoIdList, noPermissionEdbClassifyIdList, []int{}, []int{1, 2}, 1, 0, this.SysUser.AdminId)
+
 		isEs = true
 	} else {
 		var condition string

+ 19 - 0
controllers/data_manage/range_analysis/chart_info.go

@@ -183,6 +183,25 @@ func (this *RangeChartChartInfoController) Add() {
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
 		return
 	}
+
+	// 来源字数校验
+	type SourcesFrom struct {
+		Text string `json:"text"`
+	}
+
+	if req.SourcesFrom != "" && len(req.SourcesFrom) > 0 {
+		var sourcesFrom SourcesFrom
+		err = json.Unmarshal([]byte(req.SourcesFrom), &sourcesFrom)
+		if err != nil {
+			return
+		}
+		if len(sourcesFrom.Text) > 50 {
+			br.Msg = "字数已达上限!"
+			br.ErrMsg = "来源文本字数已达上限,请修改!"
+			return
+		}
+	}
+
 	if req.DateType == 0 {
 		req.DateType = 3
 	}

+ 1 - 1
controllers/data_manage/wind_data.go

@@ -28,7 +28,7 @@ func (this *EdbInfoController) WindClassify() {
 	// 增加标识判断是文件夹还是指标列表
 	parentId, _ := this.GetInt("ParentId")
 	// 特殊处理顶级分类
-	rootList, err := data_manage.GetEdbClassifyByParentId(parentId, 0)
+	rootList, err := data_manage.GetEdbClassifyByParentId(parentId, 0, 0)
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()

+ 359 - 0
controllers/fix.go

@@ -0,0 +1,359 @@
+package controllers
+
+import (
+	"eta_gn/eta_api/models/data_manage"
+	"eta_gn/eta_api/services/data"
+	"eta_gn/eta_api/utils"
+	"fmt"
+	"sort"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// init
+// @Description: 数据修复
+// @author: Roc
+// @datetime 2024-12-02 09:29:56
+func init() {
+	// ### 1、先修复分类完整路径
+	//initFixClassifyPath()
+
+	// ### 2、再修复个人分类、删除不存在指标的分类
+	// ### 2.1 数据加工
+	//initFixSelfClassify(utils.EdbClassifyTypeCalculate)
+	//
+	//// ### 2.2 衍生指标
+	//initFixSelfClassify(utils.EdbClassifyTypePredict)
+	//
+	//fmt.Println("修复完成")
+}
+
+// initFixClassifyPath
+// @Description: 修复分类完整路径
+// @author: Roc
+// @datetime 2024-11-26 15:40:57
+func initFixClassifyPath() {
+	allList := make([]*data_manage.EdbClassifyItems, 0)
+	allList, e := data_manage.GetEdbClassifyByClassifyTypes([]int{utils.EdbClassifyTypeBase, utils.EdbClassifyTypePredict, utils.EdbClassifyTypeCalculate}, 0)
+	if e != nil {
+		fmt.Println("获取分类失败", e)
+		return
+	}
+
+	var sortList data_manage.EdbClassifyItemList
+
+	allList = data.GetClassifyTreeRecursive(allList, 0)
+	//根据sort值排序
+	sortList = allList
+	sort.Sort(sortList)
+
+	for _, v := range sortList {
+		updatePath(v, "", "")
+	}
+	fmt.Println("修复分类路径完成")
+}
+
+func updatePath(item *data_manage.EdbClassifyItems, classifyNamePath, classifyIdPath string) {
+	if classifyNamePath == `` {
+		classifyNamePath = item.ClassifyName
+		classifyIdPath = fmt.Sprint(item.ClassifyId)
+	} else {
+		classifyNamePath = fmt.Sprint(classifyNamePath, "|", item.ClassifyName)
+		classifyIdPath = fmt.Sprint(classifyIdPath, ",", item.ClassifyId)
+	}
+	err := data_manage.UpdateEdbClassify(item.ClassifyId, classifyNamePath, classifyIdPath)
+	if err != nil {
+		fmt.Println(item.ClassifyId, ";更新失败", err)
+	}
+	if item.Children != nil {
+		for _, v := range item.Children {
+			updatePath(v, classifyNamePath, classifyIdPath)
+		}
+	}
+}
+
+// initFixUserClassify
+// @Description: initFixUserClassify
+// @author: Roc
+// @datetime 2024-11-29 16:57:54
+func initFixSelfClassify(classifyType int) {
+	// 指标数据明细
+	condition := ` AND edb_info_type = 0 and edb_type = 2 `
+	if classifyType == utils.EdbClassifyTypePredict {
+		condition = ` AND edb_info_type = 1 `
+	}
+
+	pars := make([]interface{}, 0)
+	edbList, err := data_manage.GetEdbInfoListByCond(condition, pars)
+	if err != nil {
+		fmt.Println("查找指标加工数据失败", err.Error())
+		return
+	}
+
+	edbClassifyIdMap := make(map[int]bool)
+	classifyIdList := make([]int, 0)
+
+	edbUserMap := make(map[int]string)
+
+	for _, v := range edbList {
+		if _, ok := edbClassifyIdMap[v.ClassifyId]; !ok {
+			classifyIdList = append(classifyIdList, v.ClassifyId)
+			edbClassifyIdMap[v.ClassifyId] = true
+		}
+
+		edbUserMap[v.SysUserId] = v.SysUserRealName
+	}
+
+	// 获取所有数据加工的分类
+	classifyList, err := data_manage.GetAllEdbClassifyByType(classifyType, 0)
+	if err != nil {
+		fmt.Println("获取数据加工分类失败", err.Error())
+		return
+	}
+
+	hasClassifyIdStrList := make([]string, 0)
+	for _, v := range classifyList {
+		// 判断当前分类id是否加到指标中,如果加进去了,那么才处理
+		_, ok := edbClassifyIdMap[v.ClassifyId]
+		if !ok {
+			continue
+		}
+		hasClassifyIdStrList = append(hasClassifyIdStrList, v.ClassifyIdPath)
+	}
+	classifyIdStrList := strings.Split(strings.Join(hasClassifyIdStrList, ","), ",")
+	classifyIdMap := make(map[string]bool)
+	for _, v := range classifyIdStrList {
+		classifyIdMap[v] = true
+	}
+	newClassifyList := make([]*data_manage.EdbClassifyItems, 0)
+	newClassifyMap := make(map[string]bool)
+	for _, v := range classifyList {
+		classifyIdStr := fmt.Sprint(v.ClassifyId)
+
+		// 是否在关联指标的map里面,如果不在的话,那么就过滤
+		_, ok := classifyIdMap[classifyIdStr]
+		if !ok {
+			continue
+		}
+
+		// 是否已经加到需要关联指标分类的map里面,如果已经在了,那么也过滤
+		_, ok = newClassifyMap[classifyIdStr]
+		if ok {
+			continue
+		}
+
+		newClassifyMap[classifyIdStr] = true
+		newClassifyList = append(newClassifyList, v)
+	}
+
+	rootList, err := data_manage.GetEdbClassifyByParentId(0, int8(classifyType), 0)
+	nodeAll := make([]*data_manage.EdbClassifyItems, 0)
+	for k := range rootList {
+		rootNode := rootList[k]
+		data.EdbClassifyItemsMakeTree(newClassifyList, rootNode)
+		nodeAll = append(nodeAll, rootNode)
+	}
+
+	// 创建新的分类
+	// [用户id][原分类id][新分类id]
+	userClassifyIdMap := make(map[int]map[int]int)
+	for userId, sysUserName := range edbUserMap {
+		classifyRelationMap := make(map[int]int)
+		for _, v := range nodeAll {
+			createNewClassify(userId, 0, 0, 0, sysUserName, ``, ``, v, classifyRelationMap)
+		}
+		userClassifyIdMap[userId] = classifyRelationMap
+	}
+
+	// ##### 第二步,指标数据迁移
+
+	// 指标数据迁移
+	for _, v := range edbList {
+		userClassifyMap, ok := userClassifyIdMap[v.SysUserId]
+		if !ok {
+			fmt.Println("找不到该用户所属的分类,userId:", v.SysUserId)
+			continue
+		}
+
+		newClassifyId, ok := userClassifyMap[v.ClassifyId]
+		if !ok {
+			fmt.Println("找不到该用户所属的分类,classifyId:", v.ClassifyId)
+			continue
+		}
+		// 开始迁移指标数据
+		err = data_manage.UpdateClassifyIdByEdbInfoId(v.EdbInfoId, newClassifyId)
+		if err != nil {
+			fmt.Println("指标数据迁移失败", err.Error())
+		}
+	}
+
+	// ##### 3、开始删除没有指标的分类
+	deleteNullClassify(classifyType)
+	return
+}
+
+func deleteNullClassify(classifyType int) {
+	// 指标列表数据
+	condition := ` AND edb_info_type = 0 and edb_type = 2 `
+	if classifyType == utils.EdbClassifyTypePredict {
+		condition = ` AND edb_info_type = 1 `
+	}
+
+	pars := make([]interface{}, 0)
+	edbList, err := data_manage.GetEdbInfoListByCond(condition, pars)
+	if err != nil {
+		fmt.Println("查找指标加工数据失败", err.Error())
+		return
+	}
+
+	edbClassifyIdMap := make(map[int]bool)
+	classifyIdList := make([]int, 0)
+
+	for _, v := range edbList {
+		if _, ok := edbClassifyIdMap[v.ClassifyId]; !ok {
+			classifyIdList = append(classifyIdList, v.ClassifyId)
+			edbClassifyIdMap[v.ClassifyId] = true
+		}
+	}
+
+	// 获取所有数据加工的分类
+	classifyList, err := data_manage.GetAllEdbClassifyByType(classifyType, 0)
+	if err != nil {
+		fmt.Println("获取数据加工分类失败", err.Error())
+		return
+	}
+
+	// 存在指标的分类
+	hasEdbClassifyList := make([]*data_manage.EdbClassifyItems, 0)
+	for _, v := range classifyList {
+		if _, ok := edbClassifyIdMap[v.ClassifyId]; ok {
+			hasEdbClassifyList = append(hasEdbClassifyList, v)
+		}
+	}
+
+	// 待删除的分类id集合
+	deleteClassifyIdMap := make(map[int]int)
+	// 全部的分类id集合
+	for _, v := range classifyList {
+		deleteClassifyIdMap[v.ClassifyId] = v.ClassifyId
+	}
+
+	// 存在指标的的分类id集合
+	hasClassifyIdStrList := make([]string, 0)
+	for _, v := range hasEdbClassifyList {
+		hasClassifyIdStrList = append(hasClassifyIdStrList, v.ClassifyIdPath)
+	}
+	classifyIdStrList := strings.Split(strings.Join(hasClassifyIdStrList, ","), ",")
+	for _, v := range classifyIdStrList {
+		classifyId, err := strconv.Atoi(v)
+		if err != nil {
+			fmt.Println("分类字符串转int失败,", err.Error())
+			return
+		}
+		delete(deleteClassifyIdMap, classifyId)
+	}
+
+	// 删除空分类
+	if len(deleteClassifyIdMap) > 0 {
+		deleteClassifyIdList := make([]int, 0)
+		for _, v := range deleteClassifyIdMap {
+			deleteClassifyIdList = append(deleteClassifyIdList, v)
+		}
+
+		err = data_manage.DelEdbClassifyByIdList(deleteClassifyIdList)
+		if err != nil {
+			fmt.Println("删除空分类失败", err.Error())
+			return
+		}
+	}
+}
+
+// createNewClassify
+// @Description: 创建分类
+// @author: Roc
+// @datetime 2024-11-29 17:57:47
+// @param userId int
+// @param parentId int
+// @param rootId int
+// @param level int
+// @param sysUserName string
+// @param parentClassifyNamePath string
+// @param parentClassifyIdPath string
+// @param node *data_manage.EdbClassifyItems
+// @param classifyRelationMap map[int]int
+func createNewClassify(userId, parentId, rootId, level int, sysUserName, parentClassifyNamePath, parentClassifyIdPath string, node *data_manage.EdbClassifyItems, classifyRelationMap map[int]int) {
+	var classifyNamePath, classifyIdPath string
+
+	if parentId > 0 {
+		classifyNamePath = fmt.Sprint(parentClassifyNamePath, "|", node.ClassifyName)
+		classifyIdPath = fmt.Sprint(parentClassifyIdPath, ",")
+	} else {
+		classifyNamePath = node.ClassifyName
+	}
+
+	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+	classifyInfo := &data_manage.EdbClassify{
+		//ClassifyId:      0,
+		ClassifyType:     node.ClassifyType,
+		ClassifyName:     node.ClassifyName,
+		ClassifyNameEn:   node.ClassifyNameEn,
+		ParentId:         parentId,
+		RootId:           rootId,
+		HasData:          1,
+		CreateTime:       time.Now(),
+		ModifyTime:       time.Now(),
+		SysUserId:        userId,
+		SysUserRealName:  sysUserName,
+		Level:            level + 1,
+		UniqueCode:       utils.MD5(utils.DATA_PREFIX + "_" + timestamp),
+		Sort:             node.Sort,
+		ClassifyNamePath: classifyNamePath,
+	}
+	err := data_manage.AddEdbClassify(classifyInfo)
+	if err != nil {
+		fmt.Println("创建分类失败:", err.Error())
+		return
+	}
+
+	updateCols := []string{"ClassifyIdPath"}
+	// 更改分类id完整路径path
+	classifyInfo.ClassifyIdPath = fmt.Sprint(classifyIdPath, classifyInfo.ClassifyId)
+
+	if rootId <= 0 {
+		rootId = classifyInfo.ClassifyId
+		classifyInfo.RootId = classifyInfo.ClassifyId
+		updateCols = append(updateCols, "RootId")
+	}
+
+	_ = classifyInfo.Update(updateCols)
+
+	classifyRelationMap[node.ClassifyId] = classifyInfo.ClassifyId
+
+	level = classifyInfo.Level
+
+	if node.Children == nil {
+		return
+	}
+	if len(node.Children) <= 0 {
+		return
+	}
+	for _, child := range node.Children {
+		createNewClassify(userId, classifyInfo.ClassifyId, rootId, level, sysUserName, classifyNamePath, classifyInfo.ClassifyIdPath, child, classifyRelationMap)
+	}
+
+	return
+}
+
+// initEs
+// @Description: 修复ES中的指标和图表数据
+// @author: Roc
+// @datetime 2024-11-29 16:18:02
+func initEs() {
+	// 更新ES中的指标数据
+	data.AddOrEditAllEdbInfoToEs()
+	// 更新es中的图表数据
+	data.AddAllChartInfo()
+
+	fmt.Println("全部es数据修复完成")
+}

+ 300 - 0
controllers/image_conf_controller.go

@@ -0,0 +1,300 @@
+package controllers
+
+import (
+	"encoding/json"
+	"eta_gn/eta_api/models"
+	"eta_gn/eta_api/utils"
+	"github.com/rdlucklib/rdluck_tools/paging"
+)
+
+type ImageConfController struct {
+	BaseAuthController
+}
+
+// GetImageMaterial
+// @Title 根据条件查询图片素材
+// @Description 根据条件查询图片素材
+// @Success 200 {object} models.ImageConf
+// @router /get/image/material [get]
+func (this *ImageConfController) GetImageMaterial() {
+	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
+	}
+
+	confType, err := this.GetInt("ConfType")
+	if err != nil {
+		return
+	}
+	if confType <= 0 {
+		br.Msg = "请选择配置类型!"
+		br.ErrMsg = "请选择配置类型!"
+		return
+	}
+	imageType, _ := this.GetInt("ImageType")
+
+	imageName := this.GetString("ImageName")
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize := paging.StartIndex(currentIndex, pageSize)
+
+	var condition string
+	var pars []interface{}
+
+	condition += ` conf_type=? `
+	pars = append(pars, confType)
+
+	if imageType > 0 {
+		condition += ` AND image_type=? `
+		pars = append(pars, imageType)
+	}
+
+	if imageName != "" {
+		condition += ` AND image_name LIKE '%` + imageName + `%' `
+	}
+
+	count, err := models.GetImageConfByConditionCount(condition, pars)
+	if err != nil {
+		return
+	}
+	pagingItem := paging.GetPaging(currentIndex, pageSize, int(count))
+	var ImageConfPage models.ImageConfPage
+	ImageConfPage.Paging = pagingItem
+
+	if count <= 0 {
+		ImageConfPage.List = []*models.ImageConf{}
+
+		br.Msg = "操作成功"
+		br.Ret = 200
+		br.Data = ImageConfPage
+		return
+	}
+
+	condition += ` ORDER BY modify_time DESC `
+
+	condition += ` LIMIT ?, ? `
+	pars = append(pars, startSize, pageSize)
+
+	imageConfList, err := models.GetImageConfByCondition(condition, pars)
+
+	ImageConfPage.List = imageConfList
+
+	br.Msg = "操作成功"
+	br.Ret = 200
+	br.Data = ImageConfPage
+	return
+}
+
+// AddImageMaterial
+// @Title 新增图片素材
+// @Description 新增图片素材
+// @Success 200
+// @router /add/image/material [post]
+func (this *ImageConfController) AddImageMaterial() {
+	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.ImageConf
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+
+	// 校验图片名称是否重复
+	for _, item := range req {
+		if item.ImageType <= 0 {
+			br.Msg = "请选择图片类型!"
+			br.ErrMsg = "请选择图片类型!"
+			return
+		}
+
+		if item.Url == "" {
+			br.Msg = "请上传图片!"
+			br.ErrMsg = "请上传图片!"
+			return
+		}
+
+		// 校验名称是否重复
+		imageConfByName, err := models.GetImageConfByName(item.ImageName)
+		if err != nil {
+			return
+		}
+		if imageConfByName != nil {
+			br.Msg = "图片名称已存在,请重新上传!"
+			br.ErrMsg = "图片名称已存在,请重新上传!"
+			return
+		}
+	}
+
+	err := models.BatchAddImageMaterials(req, len(req))
+	if err != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "操作失败,Err:" + err.Error()
+		return
+	}
+
+	br.Msg = "操作成功"
+	br.Ret = 200
+	return
+}
+
+// EditImageMaterial
+// @Title 修改图片素材
+// @Description 修改图片素材
+// @Success 200
+// @router /edit/image/material [post]
+func (this *ImageConfController) EditImageMaterial() {
+	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.ImageConf
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+
+	if req.ImageType <= 0 {
+		br.Msg = "请选择图片类型!"
+		br.ErrMsg = "请选择图片类型!"
+		return
+	}
+
+	if req.Url == "" {
+		br.Msg = "请上传图片!"
+		br.ErrMsg = "请上传图片!"
+		return
+	}
+
+	// 校验名称是否重复
+	imageConfByName, err := models.GetImageConfByName(req.ImageName)
+	if err != nil {
+		return
+	}
+	if imageConfByName != nil {
+		br.Msg = "图片名称已存在,请重新上传!"
+		br.ErrMsg = "图片名称已存在,请重新上传!"
+		return
+	}
+
+	imageConf, err := models.GetImageConfById(req.ImageConfId)
+	if err != nil {
+		return
+	}
+	if imageConf.ImageConfId == 0 {
+		br.Msg = "该素材已被删除"
+		br.ErrMsg = "操作失败,Err: 该素材已被删除"
+		return
+	}
+
+	err = models.EditImageMaterial(req)
+	if err != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "操作失败,Err:" + err.Error()
+		return
+	}
+
+	br.Msg = "操作成功"
+	br.Ret = 200
+	return
+}
+
+// DeleteImageMaterial
+// @Title 删除图片素材
+// @Description 删除图片素材
+// @Success 200
+// @router /delete/image/material [post]
+func (this *ImageConfController) DeleteImageMaterial() {
+	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
+	}
+	type DeleteReq struct {
+		ImageConfId int `json:"ImageConfId"`
+	}
+	var req []DeleteReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+
+	var imageConfIds []int
+	for _, deleteReq := range req {
+		// 查看图片是否被使用
+		count, err := models.GetPptByImageIdCount(deleteReq.ImageConfId)
+		if err != nil {
+			return
+		}
+		if count > 0 {
+			br.Msg = "该素材正在使用中,不允许删除"
+			br.ErrMsg = "该素材正在使用中,不允许删除"
+			return
+		}
+		imageConfIds = append(imageConfIds, deleteReq.ImageConfId)
+	}
+
+	err := models.DeleteImageConfByIds(imageConfIds)
+	if err != nil {
+		return
+	}
+
+	br.Msg = "操作成功"
+	br.Ret = 200
+	return
+}

+ 346 - 6
controllers/knowledge/resource.go

@@ -9,9 +9,6 @@ import (
 	knowledgeServ "eta_gn/eta_api/services/knowledge"
 	"eta_gn/eta_api/utils"
 	"fmt"
-	"github.com/h2non/filetype"
-	"github.com/rdlucklib/rdluck_tools/paging"
-	"github.com/tealeg/xlsx"
 	"html"
 	"io/ioutil"
 	"os"
@@ -19,6 +16,10 @@ import (
 	"strconv"
 	"strings"
 	"time"
+
+	"github.com/h2non/filetype"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/tealeg/xlsx"
 )
 
 // 分类
@@ -35,13 +36,14 @@ type ResourceController struct {
 // @Param   StartDate   query   string  true       "开始时间"
 // @Param   EndDate   query   string  true       "结束时间"
 // @Param   Frequency   query   string  true       "频度"
-// @Param   ClassifyIdFirst   query   int  true       "一级分类id"
-// @Param   ClassifyIdSecond   query   int  true       "二级分类id"
-// @Param   ClassifyIdThird   query   int  true       "三级分类id"
+// @Param   ClassifyIds   query   int  true       "分类id, 多选, 英文逗号分隔"
 // @Param   State   query   int  true       "状态"
 // @Param   KeyWord   query   string  true       "搜索关键词"
 // @Param   PublishSort   query   string  true       "desc:降序,asc 升序(预留)"
 // @Param   FilterReportType   query   string  true       "筛选事件类型,1:公共研报,2:共享研报,3:我的研报"
+// @Param   IncludeFile   query   string  true       "是否包含文件, no:不包含"
+// @Param   SourceFrom   query   string  true       "来源, 用英文逗号分隔"
+// @Param   IsShowMe   query   string  true       "只看我, false:全部, true:只看我"
 // @Success 200 {object} knowledge.KnowledgeResourceListResp
 // @router /resource/list [get]
 func (this *ResourceController) List() {
@@ -64,6 +66,10 @@ func (this *ResourceController) List() {
 
 	sourceFrom := this.GetString("SourceFrom")
 
+	includeFile := this.GetString("IncludeFile")
+
+	IsShowMe, _ := this.GetBool("IsShowMe")
+
 	var startSize int
 	if pageSize <= 0 {
 		pageSize = utils.PageSize20
@@ -79,6 +85,15 @@ func (this *ResourceController) List() {
 	condition += ` AND resource_type = ? `
 	pars = append(pars, resourceType)
 
+	if includeFile == "no" {
+		condition += ` AND is_file = ? `
+		pars = append(pars, 0)
+	}
+	if IsShowMe {
+		condition += ` AND admin_id = ? `
+		pars = append(pars, this.SysUser.AdminId)
+	}
+
 	if keyWord != "" {
 		//按照空格划分为关键词数组
 		keyWordArr := strings.Split(keyWord, " ")
@@ -263,6 +278,241 @@ func (this *ResourceController) List() {
 	br.Data = resp
 }
 
+// Search
+// @Title 获取事件列表接口
+// @Description 获取事件列表
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   TimeType     query string true  "筛选的时间类别:publish_time(发布时间),modify_time(更新时间);approve_time(审批时间)"
+// @Param   StartDate   query   string  true       "开始时间"
+// @Param   EndDate   query   string  true       "结束时间"
+// @Param   Frequency   query   string  true       "频度"
+// @Param   ClassifyIds   query   int  true       "分类id, 多选, 英文逗号分隔"
+// @Param   SysUserIds   query   int  true       "用户id, 多选, 英文逗号分隔"
+// @Param   State   query   int  true       "状态"
+// @Param   KeyWord   query   string  true       "搜索关键词"
+// @Param   PublishSort   query   string  true       "desc:降序,asc 升序(预留)"
+// @Param   FilterReportType   query   string  true       "筛选事件类型,1:公共研报,2:共享研报,3:我的研报"
+// @Param   IncludeFile   query   string  true       "是否包含文件, no:不包含"
+// @Param   SourceFrom   query   string  true       "来源, 用英文逗号分隔"
+// @Param   IsShowMe   query   string  true       "只看我, false:全部, true:只看我"
+// @Success 200 {object} knowledge.KnowledgeResourceListResp
+// @router /resource/search_by_es [get]
+func (this *ResourceController) Search() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+
+	classifyIds := this.GetString("ClassifyIds")
+	// 添加人
+	addUserIds := this.GetString("SysUserIds")
+	// 标签
+	tagIds := this.GetString("TagIds")
+
+	keyWord := this.GetString("Keyword")
+	resourceType, _ := this.GetInt("ResourceType")
+
+	sourceFrom := this.GetString("SourceFrom")
+
+	includeFile := this.GetString("IncludeFile")
+
+	IsShowMe, _ := this.GetBool("IsShowMe")
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+
+	startSize = utils.StartIndex(currentIndex, pageSize)
+
+	isIncludeFile := true
+	if includeFile == "no" {
+		isIncludeFile = false
+	}
+	var searchUserIds []int
+	if addUserIds != "" {
+		// 转成数组,并把类型转成int
+		addUserIdsArr := strings.Split(addUserIds, ",")
+		for _, v := range addUserIdsArr {
+			addUserId, _ := strconv.Atoi(v)
+			searchUserIds = append(searchUserIds, addUserId)
+		}
+	}
+	var myId int
+	if IsShowMe {
+		myId = this.SysUser.AdminId
+	}
+
+	var sourceFromArr []string
+	if sourceFrom != "" {
+		sourceFromArr = strings.Split(sourceFrom, ",")
+	}
+	var classifyIdsInt []int
+	if classifyIds != "" {
+		//转成数组,并把类型转成int
+		classifyIdsArr := strings.Split(classifyIds, ",")
+		for _, v := range classifyIdsArr {
+			classifyId, _ := strconv.Atoi(v)
+			classifyIdsInt = append(classifyIdsInt, classifyId)
+		}
+	}
+	var tagIdsInt []int
+	if tagIds != "" {
+		//转成数组,并把类型转成int
+		tagIdsArr := strings.Split(tagIds, ",")
+		for _, v := range tagIdsArr {
+			tagId, _ := strconv.Atoi(v)
+			tagIdsInt = append(tagIdsInt, tagId)
+		}
+	}
+	listTmp, total, err := knowledgeServ.SearchKnowledgeResourceByEs(
+		resourceType,
+		keyWord,
+		searchUserIds,
+		myId,
+		classifyIdsInt,
+		sourceFromArr,
+		tagIdsInt,
+		isIncludeFile,
+		startSize,
+		pageSize,
+	)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	var list []*knowledge.KnowledgeResourceList
+	// 整理分类ID
+	classifyFullNameMap := make(map[int]string)
+	classifyIdsArr := make([]int, 0)
+	for _, v := range listTmp {
+		classifyIdsArr = append(classifyIdsArr, v.ClassifyId)
+	}
+	// 获取分类列表
+	classifyList, err := knowledge.GetFullClassifyListByIdList(classifyIdsArr, resourceType)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	for _, v := range classifyList {
+		name := v.ClassifyName
+		if v.ParentName != "" {
+			name = v.ParentName + "/" + name
+		}
+		if v.RootName != "" {
+			name = v.RootName + "/" + name
+		}
+		classifyFullNameMap[v.ClassifyId] = name
+	}
+
+	// 整理标签ID
+	tagNameMap := make(map[int]string)
+	tagIdsArr := make([]int, 0)
+	for _, v := range listTmp {
+		tagIdsArr = append(tagIdsArr, v.TagId)
+	}
+	// 获取标签列表
+	tagObj := new(knowledge.KnowledgeTag)
+	tagList, err := tagObj.GetListByIdList(tagIdsArr, resourceType)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+	}
+	for _, v := range tagList {
+		tagNameMap[v.TagId] = v.TagName
+	}
+
+	for _, v := range listTmp {
+		var startTime, endTime string
+		if v.StartTime != nil && !v.StartTime.IsZero() {
+			startTime = v.StartTime.In(time.Local).Format(utils.FormatDateTime)
+			if resourceType == knowledge.KnowledgeResourceTypeOpinion || resourceType == knowledge.KnowledgeResourceTypeKnow {
+				startTime = v.StartTime.In(time.Local).Format(utils.FormatDate)
+			}
+		}
+		if v.EndTime != nil && !v.EndTime.IsZero() {
+			endTime = v.EndTime.In(time.Local).Format(utils.FormatDateTime)
+			if resourceType == knowledge.KnowledgeResourceTypeOpinion || resourceType == knowledge.KnowledgeResourceTypeKnow {
+				endTime = v.EndTime.In(time.Local).Format(utils.FormatDate)
+			}
+		}
+		modifyTime := v.ModifyTime.In(time.Local).Format(utils.FormatDateTime)
+		createTime := v.CreateTime.In(time.Local).Format(utils.FormatDateTime)
+		tmp := &knowledge.KnowledgeResourceList{
+			KnowledgeResourceId: v.KnowledgeResourceId,
+			ResourceType:        v.ResourceType,
+			ClassifyId:          v.ClassifyId,
+			Title:               v.Title,
+			Content:             v.Content,
+			CreateTime:          createTime,
+			ModifyTime:          modifyTime,
+			State:               v.State,
+			ResourceCode:        v.ResourceCode,
+			AdminId:             v.AdminId,
+			AdminRealName:       v.AdminRealName,
+			SourceFrom:          v.SourceFrom,
+			TagId:               v.TagId,
+			StartTime:           startTime,
+			EndTime:             endTime,
+		}
+
+		classifyName, ok := classifyFullNameMap[tmp.ClassifyId]
+		if ok {
+			tmp.ClassifyFullName = classifyName
+		}
+		tagName, ok := tagNameMap[v.TagId]
+		if ok {
+			tmp.TagName = tagName
+		}
+		list = append(list, tmp)
+	}
+
+	// list := make([]*knowledge.KnowledgeResourceList, 0, len(knowledges))
+	// for _, v := range knowledges {
+	// 	item := new(knowledge.KnowledgeResourceList)
+	// 	item.KnowledgeResourceId = v.KnowledgeResourceId
+	// 	item.ResourceType = v.ResourceType
+	// 	item.ClassifyId = v.ClassifyId
+	// 	item.Title = v.Title
+	// 	item.CreateTime = v.CreateTime.Format(utils.FormatDateTime)
+	// 	item.ModifyTime = v.ModifyTime.Format(utils.FormatDateTime)
+	// 	item.State = v.State
+	// 	item.Content = v.Content
+	// 	item.ResourceCode = v.ResourceCode
+	// 	item.AdminId = v.AdminId
+	// 	item.AdminRealName = v.AdminRealName
+	// 	item.SourceFrom = v.SourceFrom
+	// 	item.TagId = v.TagId
+	// 	if v.StartTime != nil {
+	// 		item.StartTime = v.StartTime.Format(utils.FormatDateTime)
+	// 	}
+	// 	if v.EndTime != nil {
+	// 		item.EndTime = v.EndTime.Format(utils.FormatDateTime)
+	// 	}
+	// 	list = append(list, item)
+	// }
+
+	page := paging.GetPaging(currentIndex, pageSize, int(total))
+	resp := new(knowledge.KnowledgeResourceListResp)
+	resp.Paging = page
+	resp.List = list
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
 // Add
 // @Title 新增事件接口
 // @Description 新增事件(区分事件类型)
@@ -800,6 +1050,13 @@ func (this *ResourceController) Delete() {
 		br.ErrMsg = "删除事件失败, Err: " + err.Error()
 		return
 	}
+	go func() {
+		item.IsDelete = 1
+		er := knowledgeServ.EsAddOrEditKnowledgeResource(item)
+		if er != nil {
+			utils.FileLog.Info("知识资源id:" + strconv.Itoa(req.KnowledgeResourceId) + ",删除事件同步es失败, Err: " + er.Error())
+		}
+	}()
 
 	br.Ret = 200
 	br.Success = true
@@ -1185,3 +1442,86 @@ func (this *ResourceController) TemplateDownload() {
 	br.Success = true
 	br.Msg = "下载成功"
 }
+
+// BiDashboardTmpResourceList
+// @Title 获取bi看报中的知识资源列表
+// @Description 获取bi看报中的知识资源列表
+// @Success 200 {object} models.EdbdataClassifyResp
+// @Param   biDashboardDetailId   query   int  true       "看板详情ID"
+// @router /resource/bi_dashboard/list [get]
+func (this *ResourceController) BiDashboardCacheResourceList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	biDashboardDetailId, _ := this.GetInt("BiDashboardDetailId")
+
+	resp, msg, err := knowledgeServ.GetKnowledgeResourceTmpList(biDashboardDetailId, this.SysUser.AdminId)
+	if err != nil {
+		if msg == "" {
+			msg = "获取数据失败"
+		}
+		br.Msg = msg
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// BiDashboardResourceSave
+// @Title 将知识资源库添加到bi看板
+// @Description 将知识资源库添加到bi看板
+// @Param	request	body knowledge.DeleteReq true "type json string"
+// @Success 200 {object} models.EdbdataClassifyResp
+// @router /resource/bi_dashboard/save [post]
+func (this *ResourceController) BiDashboardResourceSave() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	var req knowledge.BiDashboardResourceAddReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析失败"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+
+	if len(req.KnowledgeResourceList) == 0 {
+		// 则删除缓存中的数据
+		err := utils.Rc.Delete(utils.CACHE_KEY_BI_DASHBOARD_PREPARE_RESOURCE + strconv.Itoa(this.SysUser.AdminId))
+		if err != nil {
+			br.Msg = "添加失败"
+			br.ErrMsg = "删除缓存失败,Err:" + err.Error()
+			return
+		}
+		br.Msg = "添加成功"
+		br.Ret = 200
+		br.Success = true
+		return
+	}
+	cacheData, err := json.Marshal(req)
+	if err != nil {
+		br.Msg = "添加失败"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	err = utils.Rc.Put(utils.CACHE_KEY_BI_DASHBOARD_PREPARE_RESOURCE+strconv.Itoa(this.SysUser.AdminId), cacheData, time.Hour*24)
+	if err != nil {
+		br.Msg = "添加失败"
+		br.ErrMsg = "添加失败,Err:" + err.Error()
+		return
+	}
+
+	br.Msg = "添加成功"
+	br.Ret = 200
+	br.Success = true
+
+}

+ 10 - 0
controllers/ppt_report.go

@@ -414,6 +414,11 @@ func (this *PptV2Controller) CreateReport() {
 		}
 		newItem.TemplateType = inheritPpt.TemplateType
 		newItem.BackgroundImg = inheritPpt.BackgroundImg
+		newItem.CurrentBackgroundImg = inheritPpt.CurrentBackgroundImg
+		newItem.BackCoverImg = inheritPpt.BackCoverImg
+		newItem.CurrentBackgroundImgId = inheritPpt.CurrentBackgroundImgId
+		newItem.BackCoverImgId = inheritPpt.BackCoverImgId
+		newItem.BackgroundImgId = inheritPpt.BackgroundImgId
 		newItem.ReportType = inheritPpt.ReportType
 		newItem.PptDate = inheritPpt.PptDate
 		newItem.Content = inheritPpt.Content
@@ -425,6 +430,11 @@ func (this *PptV2Controller) CreateReport() {
 	if req.InheritPptId <= 0 {
 		newItem.TemplateType = req.FirstPage.TemplateType
 		newItem.BackgroundImg = req.FirstPage.ImgUrl
+		newItem.CurrentBackgroundImg = req.FirstPage.CurrentBackgroundImg
+		newItem.BackCoverImg = req.FirstPage.BackCoverImg
+		newItem.CurrentBackgroundImgId = req.FirstPage.CurrentBackgroundImgId
+		newItem.BackCoverImgId = req.FirstPage.BackCoverImgId
+		newItem.BackgroundImgId = req.FirstPage.BackgroundImgId
 		newItem.ReportType = req.FirstPage.ReportType
 		newItem.PptDate = req.FirstPage.PptDate
 		newItem.Content = req.Content

+ 61 - 53
controllers/ppt_v2.go

@@ -227,17 +227,7 @@ func (this *PptV2Controller) EditPpt() {
 		br.Msg = "标题不能为空"
 		return
 	}
-	//item, err := models.GetPptV2ByTitleAndId(req.FirstPage.Title, this.SysUser.AdminId)
-	//if err != nil && !utils.IsErrNoRow(err) {
-	//	br.Msg = "获取数据异常!"
-	//	br.ErrMsg = "获取数据异常,Err:" + err.Error()
-	//	return
-	//}
-	//if item != nil && item.PptId > 0 && item.PptId != int(req.PptId) {
-	//	br.Msg = "标题已存在,不可重复添加"
-	//	br.IsSendEmail = false
-	//	return
-	//}
+
 	pptInfo, err := models.GetPptV2ById(int(req.PptId))
 	if err != nil {
 		br.Msg = "信息获取失败"
@@ -262,25 +252,14 @@ func (this *PptV2Controller) EditPpt() {
 		}
 	}
 
-	// 判断权限
-	//if pptInfo.AdminId != this.SysUser.AdminId {
-	//	_, err := models.GetPPtGrantConf(pptInfo.PptId, this.SysUser.AdminId)
-	//	if err != nil {
-	//		if utils.IsErrNoRow(err) {
-	//			br.Msg = `该PPT已取消共享,保存失败`
-	//			br.ErrMsg = `该PPT已取消共享,保存失败`
-	//			br.IsSendEmail = false
-	//		} else {
-	//			br.Msg = `保存失败`
-	//			br.ErrMsg = `保存失败,ERR:` + err.Error()
-	//		}
-	//		return
-	//	}
-	//}
-
 	// 修改
 	pptInfo.TemplateType = req.FirstPage.TemplateType
 	pptInfo.BackgroundImg = req.FirstPage.ImgUrl
+	pptInfo.CurrentBackgroundImg = req.FirstPage.CurrentBackgroundImg
+	pptInfo.BackCoverImg = req.FirstPage.BackCoverImg
+	pptInfo.CurrentBackgroundImgId = req.FirstPage.CurrentBackgroundImgId
+	pptInfo.BackCoverImgId = req.FirstPage.BackCoverImgId
+	pptInfo.BackgroundImgId = req.FirstPage.BackgroundImgId
 	pptInfo.Title = req.FirstPage.Title
 	pptInfo.ReportType = req.FirstPage.ReportType
 	pptInfo.PptDate = req.FirstPage.PptDate
@@ -288,7 +267,7 @@ func (this *PptV2Controller) EditPpt() {
 	pptInfo.CoverContent = req.CoverContent
 	pptInfo.ModifyTime = time.Now()
 	pptInfo.TitleSetting = req.TitleSetting
-	err = pptInfo.Update([]string{"TemplateType", "BackgroundImg", "Title", "ReportType", "PptDate", "Content", "ModifyTime", "CoverContent", "TitleSetting"})
+	err = pptInfo.Update([]string{"TemplateType", "BackgroundImg", "CurrentBackgroundImg", "BackCoverImg", "CurrentBackgroundImgId", "BackCoverImgId", "BackgroundImgId", "Title", "ReportType", "PptDate", "Content", "ModifyTime", "CoverContent", "TitleSetting"})
 	if err != nil {
 		br.Msg = "编辑失败"
 		br.ErrMsg = "编辑失败,Err:" + err.Error()
@@ -322,21 +301,43 @@ func (this *PptV2Controller) EditPpt() {
 	//		return
 	//	}
 	//}
-
+	// 版本记录
+	historyInfo := &models.PptV2History{
+		PptId:         pptInfo.PptId,
+		TemplateType:  pptInfo.TemplateType,
+		BackgroundImg: pptInfo.BackgroundImg,
+		Title:         pptInfo.Title,
+		ReportType:    pptInfo.ReportType,
+		PptDate:       pptInfo.PptDate,
+		Content:       pptInfo.Content,
+		CoverContent:  pptInfo.CoverContent,
+		AdminId:       this.SysUser.AdminId,
+		AdminRealName: this.SysUser.RealName,
+		CreateTime:    time.Now(),
+		TitleSetting:  pptInfo.TitleSetting,
+	}
+	err = historyInfo.Add()
+	if err != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "保存PPT版本失败, Err: " + err.Error()
+		return
+	}
 	// 日志记录
 	{
 		logInfo := &models.PptV2SaveLog{
-			PptId:         pptInfo.PptId,
-			TemplateType:  pptInfo.TemplateType,
-			BackgroundImg: pptInfo.BackgroundImg,
-			Title:         pptInfo.Title,
-			ReportType:    pptInfo.ReportType,
-			PptDate:       pptInfo.PptDate,
-			Content:       pptInfo.Content,
-			CoverContent:  pptInfo.CoverContent,
-			AdminId:       this.SysUser.AdminId,
-			AdminRealName: this.SysUser.RealName,
-			CreateTime:    time.Now(),
+			PptId:                pptInfo.PptId,
+			TemplateType:         pptInfo.TemplateType,
+			BackgroundImg:        pptInfo.BackgroundImg,
+			CurrentBackgroundImg: pptInfo.CurrentBackgroundImg,
+			BackCoverImg:         pptInfo.BackCoverImg,
+			Title:                pptInfo.Title,
+			ReportType:           pptInfo.ReportType,
+			PptDate:              pptInfo.PptDate,
+			Content:              pptInfo.Content,
+			CoverContent:         pptInfo.CoverContent,
+			AdminId:              this.SysUser.AdminId,
+			AdminRealName:        this.SysUser.RealName,
+			CreateTime:           time.Now(),
 		}
 		_, err = models.AddPptV2SaveLog(logInfo)
 	}
@@ -792,6 +793,11 @@ func (this *PptV2Controller) SaveLog() {
 	}
 	pptItem.TemplateType = req.FirstPage.TemplateType
 	pptItem.BackgroundImg = req.FirstPage.ImgUrl
+	pptItem.CurrentBackgroundImg = req.FirstPage.CurrentBackgroundImg
+	pptItem.BackCoverImg = req.FirstPage.BackCoverImg
+	pptItem.CurrentBackgroundImgId = req.FirstPage.CurrentBackgroundImgId
+	pptItem.BackCoverImgId = req.FirstPage.BackCoverImgId
+	pptItem.BackgroundImgId = req.FirstPage.BackgroundImgId
 	pptItem.Title = req.FirstPage.Title
 	pptItem.ReportType = req.FirstPage.ReportType
 	pptItem.PptDate = req.FirstPage.PptDate
@@ -799,7 +805,7 @@ func (this *PptV2Controller) SaveLog() {
 	pptItem.ModifyTime = time.Now()
 	pptItem.TitleSetting = req.TitleSetting
 	pptItem.PptPage = len(pptContent)
-	err = pptItem.Update([]string{"TemplateType", "BackgroundImg", "Title", "ReportType", "PptDate", "Content", "ModifyTime", "TitleSetting", "ppt_page"})
+	err = pptItem.Update([]string{"TemplateType", "BackgroundImg", "CurrentBackgroundImg", "BackCoverImg", "CurrentBackgroundImgId", "BackCoverImgId", "BackgroundImgId", "Title", "ReportType", "PptDate", "Content", "ModifyTime", "TitleSetting", "ppt_page"})
 	if err != nil {
 		br.Msg = "自动保存失败"
 		br.ErrMsg = fmt.Sprintf("自动保存PPT失败, ID: %d, Err: %v", pptItem.PptId, err)
@@ -837,18 +843,20 @@ func (this *PptV2Controller) SaveLog() {
 
 	//日志记录
 	logInfo := &models.PptV2SaveLog{
-		PptId:         int(req.PptId),
-		TemplateType:  req.FirstPage.TemplateType,
-		BackgroundImg: req.FirstPage.ImgUrl,
-		Title:         req.FirstPage.Title,
-		ReportType:    req.FirstPage.ReportType,
-		PptDate:       req.FirstPage.PptDate,
-		Content:       req.Content,
-		CoverContent:  req.CoverContent,
-		AdminId:       this.SysUser.AdminId,
-		AdminRealName: this.SysUser.RealName,
-		CreateTime:    time.Now(),
-		TitleSetting:  req.TitleSetting,
+		PptId:                int(req.PptId),
+		TemplateType:         req.FirstPage.TemplateType,
+		BackgroundImg:        req.FirstPage.ImgUrl,
+		CurrentBackgroundImg: req.FirstPage.CurrentBackgroundImg,
+		BackCoverImg:         req.FirstPage.BackCoverImg,
+		Title:                req.FirstPage.Title,
+		ReportType:           req.FirstPage.ReportType,
+		PptDate:              req.FirstPage.PptDate,
+		Content:              req.Content,
+		CoverContent:         req.CoverContent,
+		AdminId:              this.SysUser.AdminId,
+		AdminRealName:        this.SysUser.RealName,
+		CreateTime:           time.Now(),
+		TitleSetting:         req.TitleSetting,
 	}
 	_, e = models.AddPptV2SaveLog(logInfo)
 	if e != nil {

+ 300 - 0
controllers/ppt_v2_history.go

@@ -0,0 +1,300 @@
+package controllers
+
+import (
+	"encoding/json"
+	"eta_gn/eta_api/models"
+	"eta_gn/eta_api/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"strings"
+	"time"
+)
+
+// PptV2HistoryController PPT
+type PptV2HistoryController struct {
+	BaseAuthController
+}
+
+// List
+// @Title 获取PPT列表接口
+// @Description 获取PPT列表
+// @Param   PptId   query   int  true       "PPTID"
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   IsShowMe   query   bool  true       "是否只看我的,true、false"
+// @Success 200 {object} models.ReportListResp
+// @router /list [get]
+func (this *PptV2HistoryController) List() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	pptId, _ := this.GetInt("PptId")
+	isShowMe, _ := this.GetBool("IsShowMe")
+
+	if pptId <= 0 {
+		br.Msg = "请选择PPT"
+		br.ErrMsg = "请选择PPT"
+		return
+	}
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+
+	var condition string
+	var pars []interface{}
+
+	condition += ` AND ppt_id = ? `
+	pars = append(pars, pptId)
+
+	if isShowMe {
+		condition += ` AND admin_id = ? `
+		pars = append(pars, this.SysUser.AdminId)
+	}
+	var err error
+	var total int
+	var list []*models.PptV2HistoryListItem
+
+	historyObj := new(models.PptV2History)
+
+	total, err = historyObj.GetPageListCount(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	listTmp, err := historyObj.GetNoContentPageList(condition, pars, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	for _, item := range listTmp {
+		tmp := &models.PptV2HistoryListItem{
+			Id:            item.Id,
+			PptId:         item.PptId,
+			TemplateType:  item.TemplateType,
+			BackgroundImg: item.BackgroundImg,
+			Title:         item.Title,
+			ReportType:    item.ReportType,
+			PptDate:       item.PptDate,
+			AdminId:       item.AdminId,
+			AdminRealName: item.AdminRealName,
+			CreateTime:    item.CreateTime.Format(utils.FormatDateTime),
+		}
+
+		list = append(list, tmp)
+	}
+
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp := new(models.PptV2HistoryListResp)
+	resp.Paging = page
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// Delete
+// @Title 删除版本
+// @Description 删除版本
+// @Param   Id   query   int  true       "版本ID"
+// @Success 200 {object} models.ReportListResp
+// @router /del [post]
+func (this *PptV2HistoryController) Delete() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	var req models.DeleteReportHistoryReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.Id <= 0 {
+		br.Msg = "请选择PPT版本"
+		return
+	}
+	historyObj := new(models.PptV2History)
+
+	item, err := historyObj.GetById(req.Id)
+	if err != nil {
+		br.Msg = "该版本已删除"
+		return
+	}
+
+	err = item.Delete()
+	if err != nil {
+		br.Msg = "删除失败"
+		br.ErrMsg = "删除失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// Detail
+// @Title 获取PPT历史版本详情接口
+// @Description 获取PPT详情
+// @Param	request	body models.ReportDetailReq true "type json string"
+// @Success 200 {object} models.Report
+// @router /detail [get]
+func (this *PptV2HistoryController) Detail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	id, _ := this.GetInt("Id")
+	if id <= 0 {
+		br.Msg = "请选择PPT版本"
+		return
+	}
+	historyObj := new(models.PptV2History)
+
+	history, err := historyObj.GetById(id)
+	if err != nil {
+		br.Msg = "该版本已删除"
+		return
+	}
+	pptId := history.PptId
+
+	pptInfo, err := models.GetPptV2ById(pptId)
+	if err != nil {
+		br.Msg = "信息获取失败"
+		br.ErrMsg = "信息获取失败,Err:" + err.Error()
+		return
+	}
+
+	pptInfo.TemplateType = history.TemplateType
+	pptInfo.BackgroundImg = history.BackgroundImg
+	pptInfo.Title = history.Title
+	pptInfo.ReportType = history.ReportType
+	pptInfo.PptDate = history.PptDate
+	pptInfo.Content = history.Content
+	pptInfo.CoverContent = history.CoverContent
+	pptInfo.TitleSetting = history.TitleSetting
+	pptInfo.AdminId = history.AdminId
+	pptInfo.AdminRealName = history.AdminRealName
+	pptInfo.ModifyTime = history.CreateTime
+
+	resp := new(models.PPTDetailResp)
+	resp.PptV2 = pptInfo
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// Revert
+// @Title 恢复PPT内容
+// @Description 恢复PPT内容
+// @Param   Id   query   int  true       "版本ID"
+// @Success 200 {object} models.ReportListResp
+// @router /revert [post]
+func (this *PptV2HistoryController) Revert() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.DeleteReportHistoryReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.Id <= 0 {
+		br.Msg = "请选择PPT版本"
+		return
+	}
+	historyObj := new(models.PptV2History)
+
+	history, err := historyObj.GetById(req.Id)
+	if err != nil {
+		br.Msg = "该版本已删除"
+		return
+	}
+	// 获取PPT详情
+	pptInfo, err := models.GetPptV2ById(history.PptId)
+	if err != nil {
+		br.Msg = "信息获取失败"
+		br.ErrMsg = "信息获取失败,Err:" + err.Error()
+		return
+	}
+
+	// 协作人权限
+	if pptInfo.AdminId != this.SysUser.AdminId {
+		if pptInfo.CollaborateType != utils.ReportWriteTypeGroup {
+			br.Msg = "非协作人无权操作"
+			return
+		}
+		if pptInfo.CollaborateUsers == "" {
+			br.Msg = "非协作人无权操作"
+			return
+		}
+		partnerArr := strings.Split(pptInfo.CollaborateUsers, ",")
+		if !utils.InArrayByStr(partnerArr, fmt.Sprint(this.SysUser.AdminId)) {
+			br.Msg = "非协作人无权操作"
+			return
+		}
+	}
+
+	// 修改
+	pptInfo.TemplateType = history.TemplateType
+	pptInfo.BackgroundImg = history.BackgroundImg
+	pptInfo.Title = history.Title
+	pptInfo.ReportType = history.ReportType
+	pptInfo.PptDate = history.PptDate
+	pptInfo.Content = history.Content
+	pptInfo.CoverContent = history.CoverContent
+	pptInfo.ModifyTime = time.Now()
+	pptInfo.TitleSetting = history.TitleSetting
+	err = pptInfo.Update([]string{"TemplateType", "BackgroundImg", "Title", "ReportType", "PptDate", "Content", "ModifyTime", "CoverContent", "TitleSetting"})
+	if err != nil {
+		br.Msg = "编辑失败"
+		br.ErrMsg = "编辑失败,Err:" + err.Error()
+		return
+	}
+
+	// 记录修改日志
+	{
+		logInfo := &models.PptV2SaveLog{
+			PptId:         pptInfo.PptId,
+			TemplateType:  pptInfo.TemplateType,
+			BackgroundImg: pptInfo.BackgroundImg,
+			Title:         pptInfo.Title,
+			ReportType:    pptInfo.ReportType,
+			PptDate:       pptInfo.PptDate,
+			Content:       pptInfo.Content,
+			CoverContent:  pptInfo.CoverContent,
+			AdminId:       this.SysUser.AdminId,
+			AdminRealName: this.SysUser.RealName,
+			CreateTime:    time.Now(),
+		}
+		_, err = models.AddPptV2SaveLog(logInfo)
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 22 - 1
controllers/report_chapter.go

@@ -470,7 +470,28 @@ func (this *ReportController) EditDayWeekChapter() {
 			return
 		}
 	}
-
+	// 增加版本记录
+	if req.IsManualSave {
+		reportHistory := new(models.ReportHistory)
+		reportHistory.ReportId = reportChapterInfo.ReportId
+		reportHistory.ReportChapterId = reportChapterInfo.ReportChapterId
+		reportHistory.Content = reportChapterInfo.Content
+		reportHistory.Title = reportChapterInfo.Title
+		reportHistory.ContentSub = reportChapterInfo.ContentSub
+		reportHistory.ContentStruct = reportChapterInfo.ContentStruct
+		reportHistory.CanvasColor = req.CanvasColor
+		reportHistory.HeadResourceId = req.HeadResourceId
+		reportHistory.EndResourceId = req.EndResourceId
+		reportHistory.AdminId = sysUser.AdminId
+		reportHistory.AdminName = sysUser.AdminName
+		reportHistory.CreateTime = time.Now()
+		err = reportHistory.Add()
+		if err != nil {
+			br.Msg = "保存失败"
+			br.ErrMsg = "保存失败,Err:" + err.Error()
+			return
+		}
+	}
 	// 备份关键数据
 	chapters := make([]*models.ReportChapter, 0)
 	chapters = append(chapters, reportChapterInfo)

+ 443 - 0
controllers/report_history.go

@@ -0,0 +1,443 @@
+package controllers
+
+import (
+	"encoding/json"
+	"eta_gn/eta_api/models"
+	"eta_gn/eta_api/models/report"
+	"eta_gn/eta_api/models/smart_report"
+	"eta_gn/eta_api/services"
+	"eta_gn/eta_api/utils"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"html"
+	"time"
+)
+
+// ReportHistoryController 报告
+type ReportHistoryController struct {
+	BaseAuthController
+}
+
+// List
+// @Title 获取报告列表接口
+// @Description 获取报告列表
+// @Param   ReportId   query   int  true       "报告ID"
+// @Param   ReportChapterId   query   int  true       "报告ID"
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   IsShowMe   query   bool  true       "是否只看我的,true、false"
+// @Success 200 {object} models.ReportListResp
+// @router /list [get]
+func (this *ReportHistoryController) List() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	reportId, _ := this.GetInt("ReportId")
+	reportChapterId, _ := this.GetInt("ReportChapterId")
+	isShowMe, _ := this.GetBool("IsShowMe")
+
+	if reportId <= 0 && reportChapterId <= 0 {
+		br.Msg = "请选择报告"
+		br.ErrMsg = "请选择报告"
+		return
+	}
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+
+	var condition string
+	var pars []interface{}
+	if reportId > 0 {
+		condition += ` AND report_id = ? `
+		pars = append(pars, reportId)
+	}
+	if reportChapterId > 0 {
+		condition += ` AND report_chapter_id = ? `
+		pars = append(pars, reportChapterId)
+	}
+	if isShowMe {
+		condition += ` AND admin_id = ? `
+		pars = append(pars, this.SysUser.AdminId)
+	}
+	var err error
+	var total int
+	var list []*models.ReportHistoryListItem
+
+	historyObj := new(models.ReportHistory)
+
+	total, err = historyObj.GetPageListCount(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	listTmp, err := historyObj.GetNoContentPageList(condition, pars, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	for _, item := range listTmp {
+		tmp := new(models.ReportHistoryListItem)
+		tmp.Id = item.Id
+		tmp.ReportId = item.ReportId
+		tmp.ReportChapterId = item.ReportChapterId
+		tmp.CreateTime = item.CreateTime.Format(utils.FormatDateTime)
+		tmp.AdminId = item.AdminId
+		tmp.AdminName = item.AdminName
+		tmp.Title = item.Title
+		list = append(list, tmp)
+	}
+
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp := new(models.ReportHistoryListResp)
+	resp.Paging = page
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// Delete
+// @Title 删除版本
+// @Description 删除版本
+// @Param   Id   query   int  true       "版本ID"
+// @Success 200 {object} models.ReportListResp
+// @router /del [post]
+func (this *ReportHistoryController) Delete() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	var req models.DeleteReportHistoryReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.Id <= 0 {
+		br.Msg = "请选择报告版本"
+		return
+	}
+	historyObj := new(models.ReportHistory)
+
+	item, err := historyObj.GetById(req.Id)
+	if err != nil {
+		br.Msg = "该版本已删除"
+		return
+	}
+
+	err = item.Delete()
+	if err != nil {
+		br.Msg = "删除失败"
+		br.ErrMsg = "删除失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// Detail
+// @Title 获取报告历史版本详情接口
+// @Description 获取报告详情
+// @Param	request	body models.ReportDetailReq true "type json string"
+// @Success 200 {object} models.Report
+// @router /detail [get]
+func (this *ReportHistoryController) Detail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	id, _ := this.GetInt("Id")
+	if id <= 0 {
+		br.Msg = "请选择报告版本"
+		return
+	}
+	historyObj := new(models.ReportHistory)
+
+	history, err := historyObj.GetById(id)
+	if err != nil {
+		br.Msg = "该版本已删除"
+		return
+	}
+	reportId := history.ReportId
+	reportChapterId := history.ReportChapterId
+
+	reportInfo, err := models.GetReportById(reportId)
+	if err != nil {
+		if utils.IsErrNoRow(err) {
+			br.Msg = "报告已被删除"
+			return
+		}
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	chapterList := make([]*models.ReportChapter, 0)
+	if reportInfo.HasChapter == 1 && reportChapterId > 0 {
+		chapter, e := models.GetReportChapterInfoById(reportChapterId)
+		if e != nil {
+			if e.Error() == utils.ErrNoRow() {
+				br.Msg = "章节已删除"
+				return
+			}
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + e.Error()
+			return
+		}
+		chapter.Content = html.UnescapeString(history.Content)
+		chapter.ContentSub = html.UnescapeString(history.ContentSub)
+		chapter.ContentStruct = html.UnescapeString(history.ContentStruct)
+		chapter.LastModifyAdminName = history.AdminName
+		chapter.ContentModifyTime = history.CreateTime
+		chapter.LastModifyAdminId = history.AdminId
+		chapterList = append(chapterList, chapter)
+	} else {
+		reportInfo.Title = history.Title
+		reportInfo.Content = html.UnescapeString(history.Content)
+		reportInfo.ContentSub = html.UnescapeString(history.ContentSub)
+		reportInfo.ContentStruct = html.UnescapeString(history.ContentStruct)
+		reportInfo.CanvasColor = history.CanvasColor
+		reportInfo.LastModifyAdminName = history.AdminName
+		reportInfo.LastModifyAdminId = history.AdminId
+		reportInfo.ContentModifyTime = history.CreateTime.Format(utils.FormatDate)
+	}
+
+	if history.HeadResourceId > 0 {
+		headResource, err := smart_report.GetResourceItemById(history.HeadResourceId)
+		if err != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "获取资源库版头失败, Err: " + err.Error()
+			return
+		}
+		reportInfo.HeadImg = headResource.ImgUrl
+		reportInfo.HeadStyle = headResource.Style
+	} else {
+		reportInfo.HeadImg = ""
+		reportInfo.HeadStyle = ""
+	}
+
+	if history.EndResourceId > 0 {
+		endResource, err := smart_report.GetResourceItemById(history.EndResourceId)
+		if err != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "获取资源库版头失败, Err: " + err.Error()
+			return
+		}
+		reportInfo.EndImg = endResource.ImgUrl
+		reportInfo.EndStyle = endResource.Style
+	} else {
+		reportInfo.EndImg = ""
+		reportInfo.EndStyle = ""
+	}
+
+	resp := &models.ReportDetailView{
+		ReportDetail: reportInfo,
+		ChapterList:  chapterList,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// Revert
+// @Title 恢复报告内容
+// @Description 恢复报告内容
+// @Param   Id   query   int  true       "版本ID"
+// @Success 200 {object} models.ReportListResp
+// @router /revert [post]
+func (this *ReportHistoryController) Revert() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.DeleteReportHistoryReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.Id <= 0 {
+		br.Msg = "请选择报告版本"
+		return
+	}
+	historyObj := new(models.ReportHistory)
+
+	history, err := historyObj.GetById(req.Id)
+	if err != nil {
+		br.Msg = "该版本已删除"
+		return
+	}
+	// 获取报告详情
+	reportInfo, err := models.GetReportByReportId(history.ReportId)
+	if err != nil {
+		if utils.IsErrNoRow(err) {
+			br.Msg = "报告已删除"
+			return
+		}
+		br.Msg = "获取报告失败"
+		br.ErrMsg = "获取报告失败,Err:" + err.Error()
+		return
+	}
+	if reportInfo.Id > 0 && reportInfo.State == 2 {
+		br.Msg = "该报告已发布,不允许编辑"
+		br.ErrMsg = "该报告已发布,不允许编辑"
+		br.IsSendEmail = false
+		return
+	}
+
+	// 恢复章节
+	if history.ReportChapterId > 0 {
+		// 如果不是创建人,那么就要去查看是否授权
+		reportChapterInfo, e := models.GetReportChapterInfoById(history.ReportChapterId)
+		if e != nil {
+			if utils.IsErrNoRow(e) {
+				br.Msg = "章节已删除"
+				return
+			}
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + e.Error()
+			return
+		}
+		if reportInfo.AdminId != this.SysUser.AdminId {
+			// 授权用户权限校验
+			chapterGrantObj := report.ReportChapterGrant{}
+			_, tmpErr := chapterGrantObj.GetGrantByIdAndAdmin(reportChapterInfo.ReportChapterId, this.SysUser.AdminId)
+			if tmpErr != nil {
+				if utils.IsErrNoRow(tmpErr) {
+					br.Msg = "没有权限"
+					br.ErrMsg = "没有权限"
+					br.IsSendEmail = false
+					return
+				}
+				br.Msg = "获取章节id授权用户失败"
+				br.ErrMsg = "获取章节id授权用户失败, Err: " + tmpErr.Error()
+				return
+			}
+		}
+
+		// 标记更新中
+		{
+			markStatus, err := services.UpdateReportEditMark(reportChapterInfo.ReportId, reportChapterInfo.ReportChapterId, this.SysUser.AdminId, 1, this.SysUser.RealName, this.Lang)
+			if err != nil {
+				br.Msg = err.Error()
+				return
+			}
+			if markStatus.Status == 1 {
+				br.Msg = markStatus.Msg
+				br.IsSendEmail = false
+				return
+			}
+		}
+		reportChapterInfo.Title = history.Title
+		reportChapterInfo.Content = history.Content
+		reportChapterInfo.ContentSub = history.ContentSub
+		reportChapterInfo.IsEdit = 1
+		reportChapterInfo.ModifyTime = time.Now()
+		reportChapterInfo.LastModifyAdminId = this.SysUser.AdminId
+		reportChapterInfo.LastModifyAdminName = this.SysUser.RealName
+		reportChapterInfo.ContentModifyTime = time.Now()
+		reportChapterInfo.ContentStruct = history.ContentStruct
+		updateCols := make([]string, 0)
+		updateCols = append(updateCols, "Title", "Content", "ContentSub", "IsEdit", "ModifyTime")
+		updateCols = append(updateCols, "LastModifyAdminId", "LastModifyAdminName", "ContentModifyTime", "ContentStruct")
+		err = reportChapterInfo.Update(updateCols)
+		if err != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "操作失败,Err:" + err.Error()
+			return
+		}
+	} else {
+		// 标记更新中
+		{
+			markStatus, err := services.UpdateReportEditMark(history.ReportId, 0, this.SysUser.AdminId, 1, this.SysUser.RealName, this.Lang)
+			if err != nil {
+				br.Msg = err.Error()
+				return
+			}
+			if markStatus.Status == 1 {
+				br.Msg = markStatus.Msg
+				return
+			}
+		}
+
+		if history.HeadResourceId > 0 {
+			headResource, err := smart_report.GetResourceItemById(history.HeadResourceId)
+			if err != nil {
+				br.Msg = "操作失败"
+				br.ErrMsg = "获取资源库版头失败, Err: " + err.Error()
+				return
+			}
+			reportInfo.HeadImg = headResource.ImgUrl
+		} else {
+			reportInfo.HeadImg = ""
+		}
+
+		if history.EndResourceId > 0 {
+			endResource, err := smart_report.GetResourceItemById(history.EndResourceId)
+			if err != nil {
+				br.Msg = "操作失败"
+				br.ErrMsg = "获取资源库版头失败, Err: " + err.Error()
+				return
+			}
+			reportInfo.EndImg = endResource.ImgUrl
+		} else {
+			reportInfo.EndImg = ""
+		}
+		// 恢复报告
+		// todo 标题是否需要恢复
+		reportInfo.Title = history.Title
+		reportInfo.Content = history.Content
+		reportInfo.ContentSub = history.ContentSub
+		reportInfo.ContentStruct = history.ContentStruct
+		reportInfo.CanvasColor = history.CanvasColor
+		reportInfo.HeadResourceId = history.HeadResourceId
+		reportInfo.EndResourceId = history.EndResourceId
+		reportInfo.ModifyTime = time.Now()
+		reportInfo.ContentModifyTime = time.Now()
+		updateCols := []string{"Title", "Content", "ContentSub", "ContentStruct", "HeadImg", "EndImg", "CanvasColor", "HeadResourceId", "EndResourceId", "ModifyTime", "ContentModifyTime"}
+		err = reportInfo.UpdateReport(updateCols)
+		if err != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "操作失败,Err:" + err.Error()
+			return
+		}
+	}
+
+	// 报告的最后编辑人
+	reportInfo.LastModifyAdminId = this.SysUser.AdminId
+	reportInfo.LastModifyAdminName = this.SysUser.RealName
+	reportInfo.ModifyTime = time.Now()
+	err = reportInfo.UpdateReport([]string{"LastModifyAdminId", "LastModifyAdminName", "ModifyTime"})
+	if err != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "操作失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 41 - 3
controllers/report_v2.go

@@ -758,8 +758,18 @@ func (this *ReportController) SaveReportContent() {
 	}
 
 	// 获取报告详情
-	reportInfo, _ := models.GetReportByReportId(req.ReportId)
-	if reportInfo != nil && reportInfo.State == 2 {
+	reportInfo, err := models.GetReportByReportId(req.ReportId)
+	if err != nil {
+		if utils.IsErrNoRow(err) {
+			br.Msg = "该报告不存在"
+			br.ErrMsg = "该报告不存在, Err: " + err.Error()
+			return
+		}
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取报告详情失败, Err: " + err.Error()
+		return
+	}
+	if reportInfo.Id > 0 && reportInfo.State == 2 {
 		br.Msg = "该报告已发布,不允许编辑"
 		br.ErrMsg = "该报告已发布,不允许编辑"
 		br.IsSendEmail = false
@@ -780,7 +790,7 @@ func (this *ReportController) SaveReportContent() {
 	}
 
 	// 内容有过修改的话,那么逻辑处理
-	if noChangeFlag != 1 {
+	if noChangeFlag != 1 || req.IsManualSave {
 		content := req.Content
 		if content == "" {
 			content = this.GetString("Content")
@@ -822,6 +832,27 @@ func (this *ReportController) SaveReportContent() {
 				br.ErrMsg = "保存失败,Err:" + err.Error()
 				return
 			}
+			// 增加版本记录
+			if req.IsManualSave {
+				reportHistory := new(models.ReportHistory)
+				reportHistory.ReportId = req.ReportId
+				reportHistory.Title = reportInfo.Title
+				reportHistory.Content = reportInfo.Content
+				reportHistory.ContentSub = reportInfo.ContentSub
+				reportHistory.ContentStruct = reportInfo.ContentStruct
+				reportHistory.CanvasColor = reportInfo.CanvasColor
+				reportHistory.HeadResourceId = reportInfo.HeadResourceId
+				reportHistory.EndResourceId = reportInfo.EndResourceId
+				reportHistory.AdminId = sysUser.AdminId
+				reportHistory.AdminName = sysUser.AdminName
+				reportHistory.CreateTime = time.Now()
+				e = reportHistory.Add()
+				if e != nil {
+					br.Msg = "保存失败"
+					br.ErrMsg = "保存失败,Err:" + e.Error()
+					return
+				}
+			}
 			go models.AddReportSaveLog(reportId, this.SysUser.AdminId, reportInfo.Content, reportInfo.ContentSub, reportInfo.ContentStruct, reportInfo.CanvasColor, this.SysUser.AdminName, reportInfo.HeadResourceId, reportInfo.EndResourceId)
 		}
 	}
@@ -857,6 +888,7 @@ func (this *ReportController) AuthorizedListReport() {
 	classifyIdFirst, _ := this.GetInt("ClassifyIdFirst", 0)
 	classifyIdSecond, _ := this.GetInt("ClassifyIdSecond", 0)
 	classifyIdThird, _ := this.GetInt("ClassifyIdThird", 0)
+	stateStr := this.GetString("State")
 
 	var startSize int
 	if pageSize <= 0 {
@@ -917,6 +949,12 @@ func (this *ReportController) AuthorizedListReport() {
 		pars = utils.GetLikeKeywordPars(pars, keyword, 1)
 	}
 
+	if stateStr != `` {
+		stateStrList := strings.Split(stateStr, ",")
+		condition += ` AND a.state in (` + utils.GetOrmInReplace(len(stateStrList)) + `) `
+		pars = append(pars, stateStrList)
+	}
+
 	var err error
 	var total int
 	noVisibleClassifyIds, err := models.GetNoVisibleClassifyIdByAdminId(this.SysUser.AdminId)

文件差异内容过多而无法显示
+ 0 - 4
controllers/resource.go


+ 0 - 14
controllers/sys_admin.go

@@ -890,20 +890,6 @@ func (this *SysAdminController) Delete() {
 	br.Msg = "删除成功"
 }
 
-/*
-func init() {
-	fmt.Println("start")
-	pwdStr:=`11111`
-	//compile := `(\d+.*[^a-zA-Z]+){6,12}|([^a-zA-Z]+.*\d+){6,12}`
-	compile := `([0-9a-z]+){6,12}|(a-z0-9]+){6,12}`
-	///^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,12}$/
-	///^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,12}$/
-	reg := regexp.MustCompile(compile)
-	flag := reg.MatchString(pwdStr)
-	fmt.Println(flag)
-	fmt.Println("end")
-}*/
-
 // SetConfig
 // @Title 用户信息配置接口
 // @Description 用户信息配置接口

+ 1 - 7
go.mod

@@ -5,12 +5,9 @@ go 1.21.7
 require (
 	baliance.com/gooxml v1.0.1
 	github.com/PuerkitoBio/goquery v1.9.1
-	github.com/SebastiaanKlippert/go-wkhtmltopdf v1.9.2
-	github.com/alibabacloud-go/alimt-20181012/v2 v2.2.0
 	github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.6
 	github.com/alibabacloud-go/dm-20151123/v2 v2.0.9
 	github.com/alibabacloud-go/tea v1.2.2
-	github.com/alibabacloud-go/tea-utils/v2 v2.0.5
 	github.com/aliyun/alibaba-cloud-sdk-go v1.62.695
 	github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible
 	github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de
@@ -56,11 +53,8 @@ require (
 	github.com/alibabacloud-go/debug v1.0.0 // indirect
 	github.com/alibabacloud-go/endpoint-util v1.1.0 // indirect
 	github.com/alibabacloud-go/openapi-util v0.1.0 // indirect
-	github.com/alibabacloud-go/openplatform-20191219/v2 v2.0.1 // indirect
-	github.com/alibabacloud-go/tea-fileform v1.1.1 // indirect
-	github.com/alibabacloud-go/tea-oss-sdk v1.1.3 // indirect
-	github.com/alibabacloud-go/tea-oss-utils v1.1.0 // indirect
 	github.com/alibabacloud-go/tea-utils v1.3.6 // indirect
+	github.com/alibabacloud-go/tea-utils/v2 v2.0.5 // indirect
 	github.com/alibabacloud-go/tea-xml v1.1.3 // indirect
 	github.com/aliyun/credentials-go v1.3.1 // indirect
 	github.com/andybalholm/cascadia v1.3.2 // indirect

+ 0 - 23
go.sum

@@ -22,8 +22,6 @@ github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8L
 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
 github.com/PuerkitoBio/goquery v1.9.1 h1:mTL6XjbJTZdpfL+Gwl5U2h1l9yEkJjhmlTeV9VPW7UI=
 github.com/PuerkitoBio/goquery v1.9.1/go.mod h1:cW1n6TmIMDoORQU5IU/P1T3tGFunOeXEpGP2WHRwkbY=
-github.com/SebastiaanKlippert/go-wkhtmltopdf v1.9.2 h1:enQwehstpeaAnsyse1Aqb6r0sU5UJbiNvIqVmPo+KWI=
-github.com/SebastiaanKlippert/go-wkhtmltopdf v1.9.2/go.mod h1:SQq4xfIdvf6WYKSDxAJc+xOJdolt+/bc1jnQKMtPMvQ=
 github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
 github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
 github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
@@ -33,10 +31,6 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF
 github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4 h1:iC9YFYKDGEy3n/FtqJnOkZsene9olVspKmkX5A2YBEo=
 github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4/go.mod h1:sCavSAvdzOjul4cEqeVtvlSaSScfNsTQ+46HwlTL1hc=
-github.com/alibabacloud-go/alimt-20181012/v2 v2.2.0 h1:9AwDOjOZvhycl60jlXuMBSSl52rpWlcAuwxJOAQM4Bo=
-github.com/alibabacloud-go/alimt-20181012/v2 v2.2.0/go.mod h1:4gZhZ+BvRg/k14Z8SZnmu86zNqjslSpcC1wFl0jabl4=
-github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.0/go.mod h1:5JHVmnHvGzR2wNdgaW1zDLQG8kOC4Uec8ubkMogW7OQ=
-github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.2/go.mod h1:5JHVmnHvGzR2wNdgaW1zDLQG8kOC4Uec8ubkMogW7OQ=
 github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.6 h1:y1K+zKhpWcxso8zqI03CcYuwgyZPFwQdwAQOXAeuOVM=
 github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.6/go.mod h1:CzQnh+94WDnJOnKZH5YRyouL+OOcdBnXY5VWAf0McgI=
 github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68/go.mod h1:6pb/Qy8c+lqua8cFpEy7g39NRRqOWc3rOwAy8m5Y2BY=
@@ -46,36 +40,20 @@ github.com/alibabacloud-go/dm-20151123/v2 v2.0.9 h1:3OPVk25YWcJ48whyVCFOf168dafh
 github.com/alibabacloud-go/dm-20151123/v2 v2.0.9/go.mod h1:AhCnEI1csfLmYL5fS5TbrxPR2xZZHRQ9MmkF04Iyez8=
 github.com/alibabacloud-go/endpoint-util v1.1.0 h1:r/4D3VSw888XGaeNpP994zDUaxdgTSHBbVfZlzf6b5Q=
 github.com/alibabacloud-go/endpoint-util v1.1.0/go.mod h1:O5FuCALmCKs2Ff7JFJMudHs0I5EBgecXXxZRyswlEjE=
-github.com/alibabacloud-go/openapi-util v0.0.11/go.mod h1:sQuElr4ywwFRlCCberQwKRFhRzIyG4QTP/P4y1CJ6Ws=
 github.com/alibabacloud-go/openapi-util v0.1.0 h1:0z75cIULkDrdEhkLWgi9tnLe+KhAFE/r5Pb3312/eAY=
 github.com/alibabacloud-go/openapi-util v0.1.0/go.mod h1:sQuElr4ywwFRlCCberQwKRFhRzIyG4QTP/P4y1CJ6Ws=
-github.com/alibabacloud-go/openplatform-20191219/v2 v2.0.1 h1:L0TIjr9Qh/SLVc1yPhFkcB9+9SbCNK/jPq4ZKB5zmnc=
-github.com/alibabacloud-go/openplatform-20191219/v2 v2.0.1/go.mod h1:EKxBRDLcMzwl4VLF/1WJwlByZZECJawPXUvinKMsTTs=
 github.com/alibabacloud-go/tea v1.1.0/go.mod h1:IkGyUSX4Ba1V+k4pCtJUc6jDpZLFph9QMy2VUPTwukg=
 github.com/alibabacloud-go/tea v1.1.7/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4=
 github.com/alibabacloud-go/tea v1.1.8/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4=
-github.com/alibabacloud-go/tea v1.1.10/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4=
-github.com/alibabacloud-go/tea v1.1.12/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4=
 github.com/alibabacloud-go/tea v1.1.17/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A=
-github.com/alibabacloud-go/tea v1.1.19/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A=
 github.com/alibabacloud-go/tea v1.2.1/go.mod h1:qbzof29bM/IFhLMtJPrgTGK3eauV5J2wSyEUo4OEmnA=
 github.com/alibabacloud-go/tea v1.2.2 h1:aTsR6Rl3ANWPfqeQugPglfurloyBJY85eFy7Gc1+8oU=
 github.com/alibabacloud-go/tea v1.2.2/go.mod h1:CF3vOzEMAG+bR4WOql8gc2G9H3EkH3ZLAQdpmpXMgwk=
-github.com/alibabacloud-go/tea-fileform v1.1.1 h1:1YG6erAP3joQ0XdCXYIotuD7zyOM6qCR49xkp5FZDeU=
-github.com/alibabacloud-go/tea-fileform v1.1.1/go.mod h1:ZeCV91o4ISmxidd686f0ebdS5EDHWU+vW+TkjLhrsFE=
-github.com/alibabacloud-go/tea-oss-sdk v1.1.3 h1:EhAHI6edMeqgkZEqP7r4nc9iMWAUBKGxJHoBsOSKTtU=
-github.com/alibabacloud-go/tea-oss-sdk v1.1.3/go.mod h1:yUnodpR3Bf2rudLE7V/Gft5txjJF30Pk+hH77K/Eab0=
-github.com/alibabacloud-go/tea-oss-utils v1.1.0 h1:y65crjjcZ2Pbb6UZtC2deuIZHDVTS3IaDWE7M9nVLRc=
-github.com/alibabacloud-go/tea-oss-utils v1.1.0/go.mod h1:PFCF12e9yEKyBUIn7X1IrF/pNjvxgkHy0CgxX4+xRuY=
 github.com/alibabacloud-go/tea-utils v1.3.1/go.mod h1:EI/o33aBfj3hETm4RLiAxF/ThQdSngxrpF8rKUDJjPE=
 github.com/alibabacloud-go/tea-utils v1.3.6 h1:bVjrxHztM8hAs6nOfLWCgxQfAtKb9RgFFMV6J3rdvB4=
 github.com/alibabacloud-go/tea-utils v1.3.6/go.mod h1:EI/o33aBfj3hETm4RLiAxF/ThQdSngxrpF8rKUDJjPE=
-github.com/alibabacloud-go/tea-utils/v2 v2.0.0/go.mod h1:U5MTY10WwlquGPS34DOeomUGBB0gXbLueiq5Trwu0C4=
-github.com/alibabacloud-go/tea-utils/v2 v2.0.4/go.mod h1:sj1PbjPodAVTqGTA3olprfeeqqmwD0A5OQz94o9EuXQ=
 github.com/alibabacloud-go/tea-utils/v2 v2.0.5 h1:EUakYEUAwr6L3wLT0vejIw2rc0IA1RSXDwLnIb3f2vU=
 github.com/alibabacloud-go/tea-utils/v2 v2.0.5/go.mod h1:dL6vbUT35E4F4bFTHL845eUloqaerYBYPsdWR2/jhe4=
-github.com/alibabacloud-go/tea-xml v1.1.1/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCEtyBy9+DPF6GgEu8=
-github.com/alibabacloud-go/tea-xml v1.1.2/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCEtyBy9+DPF6GgEu8=
 github.com/alibabacloud-go/tea-xml v1.1.3 h1:7LYnm+JbOq2B+T/B0fHC4Ies4/FofC4zHzYtqw7dgt0=
 github.com/alibabacloud-go/tea-xml v1.1.3/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCEtyBy9+DPF6GgEu8=
 github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc=
@@ -802,7 +780,6 @@ golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
 golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20220609170525-579cf78fd858 h1:Dpdu/EMxGMFgq0CeYMh4fazTD2vtlZRYE7wyynxJb9U=
 golang.org/x/time v0.0.0-20220609170525-579cf78fd858/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

+ 1 - 0
models/bi_dashboard/bi_dashboard.go

@@ -82,6 +82,7 @@ type AddDashboardListReq struct {
 	Type       int
 	UniqueCode string
 	Sort       int
+	Conf       string
 }
 
 type EditDashboardReq struct {

+ 13 - 1
models/bi_dashboard/bi_dashboard_detail.go

@@ -8,7 +8,8 @@ import (
 type BiDashboardDetail struct {
 	BiDashboardDetailId int       `gorm:"primaryKey;autoIncrement;column:bi_dashboard_detail_id" ` // bi看板id
 	BiDashboardId       int       `gorm:"column:bi_dashboard_id" `                                 // 看板id
-	Type                int       `gorm:"column:type" `                                            // 1图表 2表格
+	Type                int       `gorm:"column:type" `                                            // 1图表 2表格 3知识资源库
+	Conf                string    `gorm:"column:conf" `                                            // 配置信息
 	UniqueCode          string    `gorm:"column:unique_code;size:32;not null" `                    // 报告唯一编码
 	Sort                int       `gorm:"column:sort" `                                            // 排序字段
 	CreateTime          time.Time `gorm:"column:create_time" `                                     // 创建时间
@@ -20,12 +21,23 @@ func (m *BiDashboardDetail) TableName() string {
 	return "bi_dashboard_detail"
 }
 
+func (m *BiDashboardDetail) Insert() (err error) {
+	return global.DEFAULT_DmSQL.Create(m).Error
+}
+
 func GetBiDashboardDetailById(id int) (list []*BiDashboardDetail, err error) {
 	err = global.DEFAULT_DmSQL.Table("bi_dashboard_detail").Where("bi_dashboard_id IN ?", id).Find(&list).Error
 
 	return
 }
 
+// GetBiDashboardDetailIdByBidashboardIdAndType 获取看板详情id
+func GetBiDashboardDetailIdByBidashboardIdAndType(bid int, t int) (ids []int, err error) {
+	sql := "SELECT bi_dashboard_detail_id FROM bi_dashboard_detail WHERE bi_dashboard_id = ? AND type = ?"
+	err = global.DEFAULT_DmSQL.Raw(sql, bid, t).Scan(&ids).Error
+	return
+}
+
 // multiAdd
 func AddBiDashboardDetailMulti(items []*BiDashboardDetail) (err error) {
 	return global.DEFAULT_DmSQL.CreateInBatches(items, 100).Error

+ 137 - 16
models/data_manage/edb_classify.go

@@ -25,14 +25,12 @@ type EdbClassify struct {
 	LastModifyUserRealName string    `description:"最后修改人姓名"`
 	IsJoinPermission       int       `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
 	ClassifyNameEn         string    `description:"英文分类名称"`
+	ClassifyNamePath       string    `description:"分类名称的完整路径,格式为:父级分类名称|当前分类名称"`
+	ClassifyIdPath         string    `description:"分类的完整路径,格式为:父级ID,当前ID"`
 }
 
-func AddEdbClassify(item *EdbClassify) (lastId int64, err error) {
+func AddEdbClassify(item *EdbClassify) (err error) {
 	err = global.DmSQL["data"].Create(item).Error
-	if err != nil {
-		return
-	}
-	lastId = int64(item.ClassifyId)
 
 	return
 }
@@ -161,9 +159,14 @@ DELETE
 	return
 }
 
-func GetEdbClassifyByParentId(parentId int, classifyType int8) (items []*EdbClassifyItems, err error) {
+func GetEdbClassifyByParentId(parentId int, classifyType int8, sysUserId int) (items []*EdbClassifyItems, err error) {
 	o := global.DmSQL["data"]
-	sql := ` SELECT * FROM edb_classify WHERE parent_id=? AND classify_type = ?  order by sort asc,classify_id asc`
+	sql := ` SELECT * FROM edb_classify WHERE parent_id=? AND classify_type = ? `
+
+	if sysUserId > 0 {
+		sql += fmt.Sprintf(` AND sys_user_id = %d `, sysUserId)
+	}
+	sql += ` order by sort asc,classify_id asc `
 	err = o.Raw(sql, parentId, classifyType).Scan(&items).Error
 
 	return
@@ -193,7 +196,7 @@ func GetAllEdbClassify() (items []*EdbClassifyItems, err error) {
 }
 
 // GetPredictEdbClassifyAll 获取预测指标的分类列表
-func GetPredictEdbClassifyAll() (items []*EdbClassifyItems, err error) {
+func GetPredictEdbClassifyAll(sysUserId int) (items []*EdbClassifyItems, err error) {
 	o := global.DmSQL["data"]
 	sql := ` SELECT * FROM edb_classify WHERE classify_type = 1  order by sort asc,classify_id asc`
 	err = o.Raw(sql).Scan(&items).Error
@@ -202,17 +205,22 @@ func GetPredictEdbClassifyAll() (items []*EdbClassifyItems, err error) {
 }
 
 // GetAllEdbClassifyByType 根据类型获取分类列表
-func GetAllEdbClassifyByType(classifyType int) (items []*EdbClassifyItems, err error) {
+func GetAllEdbClassifyByType(classifyType, sysUserId int) (items []*EdbClassifyItems, err error) {
 	o := global.DmSQL["data"]
-	sql := ` SELECT * FROM edb_classify WHERE classify_type = ? order by sort ASC,classify_id ASC`
+	sql := ` SELECT * FROM edb_classify WHERE classify_type = ?`
+	if sysUserId > 0 {
+		sql += fmt.Sprintf(` AND sys_user_id = %d `, sysUserId)
+	}
+	sql += ` order by sort ASC,classify_id ASC `
 	err = o.Raw(sql, classifyType).Scan(&items).Error
 
 	return
 }
 
 type EdbClassifyItems struct {
-	ClassifyId       int `description:"分类id"`
-	EdbInfoId        int `description:"指标id"`
+	ClassifyId       int   `description:"分类id"`
+	EdbInfoId        int   `description:"指标id"`
+	ClassifyType     uint8 `description:"分类类型,0:普通指标分类,1:预测指标分类"`
 	ClassifyName     string
 	ClassifyNameEn   string
 	ParentId         int
@@ -231,6 +239,7 @@ type EdbClassifyItems struct {
 	Button           EdbClassifyItemsButton `gorm:"-" description:"操作权限"`
 	IsJoinPermission int                    `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
 	HaveOperaAuth    bool                   `description:"是否有数据权限"`
+	ClassifyIdPath   string                 `description:"分类的完整路径,格式为:父级ID,当前ID"`
 }
 
 type EdbClassifyIdItems struct {
@@ -520,9 +529,16 @@ func GetEdbClassifyRootIdsByClassifyIds(classifyIds []int) (items []int, err err
 }
 
 // GetChildEdbClassifyByClassifyType 根据类型获取非顶级分类
-func GetChildEdbClassifyByClassifyType(classifyType int) (items []*EdbClassifyItems, err error) {
+func GetChildEdbClassifyByClassifyType(classifyType, sysUserId int) (items []*EdbClassifyItems, err error) {
 	o := global.DmSQL["data"]
-	sql := `SELECT * FROM edb_classify WHERE parent_id <> 0 AND classify_type = ? ORDER BY sort ASC,classify_id ASC`
+	sql := `SELECT * FROM edb_classify WHERE parent_id <> 0 AND classify_type = ?`
+
+	if sysUserId > 0 {
+		sql += fmt.Sprintf(` AND sys_user_id = %d `, sysUserId)
+	}
+
+	sql += ` ORDER BY sort ASC,classify_id ASC `
+
 	err = o.Raw(sql, classifyType).Find(&items).Error
 	return
 }
@@ -545,12 +561,117 @@ func GetIsJoinPermissionEdbClassifyIdList(classifyType int) (list []int, err err
 }
 
 // GetEdbClassifyByClassifyTypes 根据类型IDs获取分类
-func GetEdbClassifyByClassifyTypes(classifyTypes []int) (items []*EdbClassifyItems, err error) {
+func GetEdbClassifyByClassifyTypes(classifyTypes []int, sysUserId int) (items []*EdbClassifyItems, err error) {
 	if len(classifyTypes) == 0 {
 		return
 	}
 	o := global.DmSQL["data"]
-	sql := `SELECT * FROM edb_classify WHERE classify_type IN (?) ORDER BY classify_type ASC, sort ASC, classify_id ASC`
+	sql := `SELECT * FROM edb_classify WHERE classify_type IN (?) `
+
+	// 指定人
+	if sysUserId > 0 {
+		sql += ` AND sys_user_id = ? `
+	}
+	sql += ` ORDER BY classify_type ASC, sort ASC, classify_id ASC `
 	err = o.Raw(sql, classifyTypes).Scan(&items).Error
 	return
 }
+
+// UpdateEdbClassifyNameAndNamePath
+// @Description: 更新分类名称和子分类的全路径
+// @author: Roc
+// @receiver edbClassify
+// @datetime 2024-11-26 14:39:09
+// @param cols []string
+// @param oldClassifyNamePath string
+// @param newClassifyNamePath string
+// @return err error
+func (edbClassify *EdbClassify) UpdateEdbClassifyNameAndNamePath(cols []string, oldClassifyNamePath, newClassifyNamePath string) (err error) {
+	tx := global.DmSQL["data"].Begin()
+	defer func() {
+		if err != nil {
+			_ = tx.Rollback()
+			return
+		}
+		_ = tx.Commit()
+	}()
+
+	// 变更分类信息
+	err = tx.Select(cols).Updates(edbClassify).Error
+	if err != nil {
+		return
+	}
+
+	// 更改子分类的完整的路径
+	if oldClassifyNamePath != `` && newClassifyNamePath != `` {
+		sql := `UPDATE edb_classify SET classify_name_path = REPLACE(classify_name_path,?,?) WHERE classify_id_path LIKE ?`
+		err = tx.Exec(sql, oldClassifyNamePath, newClassifyNamePath, fmt.Sprint(edbClassify.ClassifyIdPath+`,%`)).Error
+		if err != nil {
+			return
+		}
+	}
+
+	return
+}
+
+// UpdateEdbClassifyNameAndNamePathByOldClassifyIdPath
+// @Description: 根据源分类id全路径更新分类名称和子分类的全路径
+// @author: Roc
+// @receiver edbClassify
+// @datetime 2024-11-26 14:39:09
+// @param cols []string
+// @param oldClassifyNamePath string
+// @param newClassifyNamePath string
+// @return err error
+func UpdateEdbClassifyNameAndNamePathByOldClassifyIdPath(oldClassifyIdPath, newClassifyIdPath, oldClassifyNamePath, newClassifyNamePath string) (err error) {
+	// 更改子分类的完整的路径
+	if oldClassifyIdPath != `` && newClassifyNamePath != `` && newClassifyIdPath != `` {
+		sql := `UPDATE edb_classify SET classify_id_path = REPLACE(classify_id_path,?,?) ,classify_name_path = REPLACE(classify_name_path,?,?)  WHERE classify_id_path LIKE ?`
+		err = global.DmSQL["data"].Exec(sql, oldClassifyIdPath, newClassifyIdPath, oldClassifyNamePath, newClassifyNamePath, fmt.Sprint(oldClassifyIdPath+`,%`)).Error
+		if err != nil {
+			return
+		}
+	}
+
+	return
+}
+
+// UpdateEdbClassify 更新分类基础信息
+func UpdateEdbClassify(classifyId int, classifyNamePath, classifyIdPath string) (err error) {
+	sql := `UPDATE edb_classify SET classify_name_path = ?,classify_id_path = ? WHERE classify_id = ?`
+
+	err = global.DmSQL["data"].Exec(sql, classifyNamePath, classifyIdPath, classifyId).Error
+
+	return
+}
+
+// DelEdbClassifyByIdList
+// @Description: 根据id删除分类
+// @author: Roc
+// @datetime 2024-12-02 09:27:26
+// @param idList []int
+// @return err error
+func DelEdbClassifyByIdList(idList []int) (err error) {
+	num := len(idList)
+	if num <= 0 {
+		return
+	}
+	sql := `DELETE  FROM edb_classify  WHERE classify_id IN (?) `
+	err = global.DmSQL["data"].Exec(sql, idList).Error
+
+	return
+}
+
+func GetChildEdbClassifyListByParentId(classifyIdPath, orderStr string) (items []*EdbClassifyItems, err error) {
+	o := global.DmSQL["data"]
+	sql := ` SELECT * FROM edb_classify WHERE classify_id_path like ? `
+	if orderStr != "" {
+		sql += orderStr
+	} else {
+		sql += ` order by level desc, sort asc, classify_id asc`
+	}
+
+	err = o.Raw(sql, classifyIdPath).Scan(&items).Error
+
+	return
+}

+ 13 - 0
models/data_manage/edb_collect.go

@@ -236,6 +236,19 @@ ORDER BY collect_time DESC LIMIT ?,?`, condition)
 	return
 }
 
+// GetUserAllCollectEdbInfoIdList
+// @Description: 获取用户所有收藏的指标id列表
+// @author: Roc
+// @datetime 2024-11-28 15:27:52
+// @param userId int
+// @return list []int
+// @return err error
+func GetUserAllCollectEdbInfoIdList(userId int) (list []int, err error) {
+	sql := `SELECT edb_info_id FROM edb_collect WHERE 1=1 AND sys_user_id = ? GROUP BY edb_info_id`
+	err = global.DmSQL["data"].Raw(sql, userId).Scan(&list).Error
+	return
+}
+
 type CollectEdbInfoQuery struct {
 	EdbInfo
 	CollectClassifyIdStr string    `gorm:"column:collect_classify_id" description:"收藏分类ID"`

+ 15 - 0
models/data_manage/edb_info.go

@@ -409,6 +409,8 @@ type EdbInfoList struct {
 	HaveOperaAuth         bool                    `description:"是否有数据权限,默认:false"`
 	IsSupplierStop        int                     `description:"是否供应商停更:1:停更,0:未停更"`
 	CollectClassifyIdList []int                   `description:"所属收藏分类id列表" gorm:"-"`
+	SharedUserIdList      []int                   `description:"共享用户id列表" gorm:"-"`
+	PublicStatus          int                     `description:"公开状态;0:未公开;1:审批中;2:已驳回;3:已公开"`
 }
 
 type EdbDataInsertConfigItem struct {
@@ -2050,3 +2052,16 @@ func GetIsJoinPermissionEdbInfoIdList(edbInfoType, edbType int) (list []int, err
 
 	return
 }
+
+// UpdateClassifyIdByEdbInfoId
+// @Description: 根据指标id更新所属分类id
+// @author: Roc
+// @datetime 2024-11-29 17:54:44
+// @param edbInfoId int
+// @param edbClassifyId int
+// @return err error
+func UpdateClassifyIdByEdbInfoId(edbInfoId, edbClassifyId int) (err error) {
+	sql := ` UPDATE edb_info SET classify_id = ? WHERE  edb_info_id=? `
+	err = global.DmSQL["data"].Exec(sql, edbClassifyId, edbInfoId).Error
+	return
+}

+ 93 - 0
models/data_manage/edb_info_share.go

@@ -0,0 +1,93 @@
+package data_manage
+
+import (
+	"eta_gn/eta_api/global"
+	"eta_gn/eta_api/utils"
+	"fmt"
+	"time"
+)
+
+// EdbInfoShare
+// @Description: 指标分享表
+type EdbInfoShare struct {
+	EdbInfoShareId int       `gorm:"primaryKey" `
+	EdbInfoId      int       `description:"指标id"`
+	SysUserId      int       `description:"sys_user_id"`
+	ShareType      int8      `description:"分享类型,1:仅查看;2:可编辑"`
+	CreateTime     time.Time `description:"创建时间"`
+}
+
+// TableName
+// @Description: 表名
+// @author: Roc
+// @receiver m
+// @datetime 2024-11-27 14:04:14
+// @return string
+func (m EdbInfoShare) TableName() string {
+	return `edb_info_share`
+}
+
+// GetListByEdbInfoId
+// @Description: 根据指标id获取分享用户列表
+// @author: Roc
+// @receiver m
+// @datetime 2024-11-27 15:39:17
+// @param edbInfoId int
+// @return items []*EdbInfoShare
+// @return err error
+func (m EdbInfoShare) GetListByEdbInfoId(edbInfoId int) (items []*EdbInfoShare, err error) {
+	sql := ` SELECT * FROM edb_info_share WHERE edb_info_id = ? ORDER BY edb_info_share_id ASC `
+	err = global.DmSQL["data"].Raw(sql, edbInfoId).Find(&items).Error
+
+	return
+}
+
+// SaveEdbInfoShare
+// @Description: 保存配置
+// @author: Roc
+// @receiver m
+// @datetime 2024-11-27 15:54:07
+// @param edbInfoIdList []int
+// @param userIdList []int
+// @param shareType int8
+// @return err error
+func (m EdbInfoShare) SaveEdbInfoShare(edbInfoIdList, userIdList []int, shareType int8) (err error) {
+	addList := make([]*EdbInfoShare, 0)
+	for _, edbInfoId := range edbInfoIdList {
+		for _, userId := range userIdList {
+			addList = append(addList, &EdbInfoShare{
+				EdbInfoShareId: 0,
+				EdbInfoId:      edbInfoId,
+				SysUserId:      userId,
+				ShareType:      shareType,
+				CreateTime:     time.Now(),
+			})
+		}
+	}
+
+	tx := global.DmSQL["data"].Begin()
+	defer func() {
+		if err != nil {
+			_ = tx.Rollback()
+			return
+		}
+		_ = tx.Commit()
+	}()
+
+	// 先删除原来的配置,新增最新的配置
+	sql := fmt.Sprintf("DELETE FROM %s WHERE edb_info_id IN (?) ", m.TableName())
+	err = tx.Exec(sql, edbInfoIdList).Error
+	if err != nil {
+		return
+	}
+
+	// 批量添加新的配置
+	if len(addList) > 0 {
+		err = tx.CreateInBatches(addList, utils.MultiAddNum).Error
+		if err != nil {
+			return
+		}
+	}
+
+	return
+}

+ 23 - 0
models/data_manage/request/edb_info_share.go

@@ -0,0 +1,23 @@
+package request
+
+// SetEdbInfoShareReq
+// @Description: 设置指标分享人请求
+type SetEdbInfoShareReq struct {
+	EdbInfoId  int   `description:"指标id"`
+	UserIdList []int `description:"分享用户id列表,如果为空,说明要给该指标移除分享人"`
+	ShareType  int8  `description:"分享类型,1:仅查看;2:可编辑"`
+}
+
+// SetEdbChartPermissionReq
+// @Description: 设置数据权限请求
+type SetEdbChartPermissionReq struct {
+	Source       int      `description:"来源id"`
+	SubSource    int      `description:"子来源id"`
+	UserId       int      `description:"用户筛选"`
+	DataIdList   []string `description:"指标/图表/表格唯一id列表"`
+	NoDataIdList []string `description:"指标/图表/表格唯一id列表"`
+	UserList     []int    `description:"赋权用户id列表,如果为空,说明要给这些指标移除权限管控"`
+	IsSelectAll  bool     `description:"是否选择所有指标"`
+	Classify     string   `description:"分类id,支持多选,用英文,隔开"`
+	Keyword      string   `description:"关键字"`
+}

+ 10 - 0
models/data_manage/response/edb_info_share.go

@@ -0,0 +1,10 @@
+package response
+
+import "eta_gn/eta_api/models/data_manage"
+
+// EdbInfoShareUserResp
+// @Description: 获取指标分享用户列表
+type EdbInfoShareUserResp struct {
+	ShareType int8                        `description:"分享类型,1:仅查看;2:可编辑"`
+	List      []*data_manage.EdbInfoShare `description:"分享用户列表"`
+}

+ 69 - 0
models/image_conf.go

@@ -0,0 +1,69 @@
+package models
+
+import (
+	"eta_gn/eta_api/global"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+type ImageConf struct {
+	ImageConfId int       `gorm:"column:image_conf_id;primaryKey;autoIncrement:true"`
+	CreateTime  time.Time `gorm:"column:create_time;autoCreateTime" description:"消息时间"`
+	ModifyTime  time.Time `gorm:"column:modify_time;autoUpdateTime" description:"更新时间"`
+	ImageName   string    `gorm:"column:image_name;type:varchar(64);not null;default:''" description:"图片名称"`
+	Url         string    `gorm:"column:url;type:varchar(512);not null;default:''" description:"图片地址"`
+	ConfType    int       `gorm:"column:conf_type;type:tinyint(4) unsigned;not null;default:1" description:"配置类型 1-ppt素材"`
+	ImageType   int       `gorm:"column:image_type;type:tinyint(4) unsigned;not null;default:1" description:"图片类型 1-封面图 2-背景图 3-封底图"`
+}
+
+type ImageConfPage struct {
+	List   []*ImageConf
+	Paging *paging.PagingItem `description:"分页数据"`
+}
+
+// BatchAddImageMaterials 新增图片素材
+func BatchAddImageMaterials(items []*ImageConf, batchSize int) (err error) {
+	err = global.DmSQL["rddp"].CreateInBatches(items, batchSize).Error
+	return
+}
+
+// GetImageConfByName 根据图片名称查询
+func GetImageConfByName(imageName string) (item *ImageConf, err error) {
+	item = &ImageConf{}
+	err = global.DmSQL["rddp"].Where("image_name = ?", imageName).First(item).Error
+	if err.Error() == "record not found" {
+		return nil, nil
+	}
+	return item, nil
+}
+
+// GetImageConfByCondition 根据条件查询图片素材
+func GetImageConfByCondition(condition string, pars []interface{}) (list []*ImageConf, err error) {
+	err = global.DmSQL["rddp"].Where(condition, pars...).Find(&list).Error
+	return
+}
+
+// GetImageConfByConditionCount 根据条件查询图片素材数量
+func GetImageConfByConditionCount(condition string, pars []interface{}) (count int64, err error) {
+	err = global.DmSQL["rddp"].Model(&ImageConf{}).Where(condition, pars...).Count(&count).Error
+	return
+}
+
+// EditImageMaterial 修改图片素材
+func EditImageMaterial(item *ImageConf) (err error) {
+	err = global.DmSQL["rddp"].Updates(item).Error
+	return
+}
+
+// GetImageConfById 根据id查询图片素材
+func GetImageConfById(id int) (item *ImageConf, err error) {
+	item = &ImageConf{}
+	err = global.DmSQL["rddp"].Where("image_conf_id = ?", id).First(item).Error
+	return item, err
+}
+
+// DeleteImageConfByIds 根据id批量删除图片素材
+func DeleteImageConfByIds(ids []int) (err error) {
+	err = global.DmSQL["rddp"].Where("image_conf_id IN ?", ids).Delete(&ImageConf{}).Error
+	return
+}

+ 49 - 4
models/knowledge/knowledge_resource.go

@@ -4,8 +4,9 @@ import (
 	"eta_gn/eta_api/global"
 	"eta_gn/eta_api/utils"
 	"fmt"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"time"
+
+	"github.com/rdlucklib/rdluck_tools/paging"
 )
 
 const (
@@ -37,6 +38,7 @@ type KnowledgeResource struct {
 	EndTime             *time.Time `gorm:"column:end_time"`
 	IsFile              int        `gorm:"column:is_file;default:0;NOT NULL"`
 	FileUrl             string     `gorm:"column:file_url"`
+	IsDelete            int        `gorm:"column:is_delete;default:0;NOT NULL"`
 }
 
 func (m *KnowledgeResource) TableName() string {
@@ -63,6 +65,7 @@ type KnowledgeResourceList struct {
 	TagId               int    `gorm:"column:tag_id;default:0;NOT NULL"`
 	StartTime           string `gorm:"column:start_time"`
 	EndTime             string `gorm:"column:end_time"`
+	Content             string `gorm:"-"`
 	ClassifyFullName    string
 	TagName             string
 }
@@ -72,8 +75,15 @@ type KnowledgeResourceListResp struct {
 	Paging *paging.PagingItem `description:"分页数据"`
 }
 
+func GetBatchKnowledgeResource(batchSize int, id int) (items []*KnowledgeResource, err error) {
+	sql := `SELECT * FROM knowledge_resource WHERE knowledge_resource_id>=? AND is_delete=0 ORDER BY knowledge_resource_id ASC LIMIT ?`
+	pars := []interface{}{id, batchSize}
+	err = global.DmSQL["rddp"].Raw(sql, pars...).Find(&items).Error
+	return
+}
+
 func GetKnowledgeResourcePageList(condition string, pars []interface{}, startSize, pageSize int) (items []*KnowledgeResource, err error) {
-	sql := `SELECT * FROM knowledge_resource WHERE 1=1  `
+	sql := `SELECT * FROM knowledge_resource WHERE 1=1  AND is_delete=0 `
 	if condition != "" {
 		sql += condition
 	}
@@ -95,7 +105,7 @@ func GetKnowledgeResourceIdList(condition string, pars []interface{}) (items []i
 }
 
 func GetKnowledgeResourceListCount(condition string, pars []interface{}) (count int, err error) {
-	sql := `SELECT COUNT(1) AS count  FROM knowledge_resource WHERE 1=1 `
+	sql := `SELECT COUNT(1) AS count  FROM knowledge_resource WHERE 1=1 AND is_delete=0 `
 	if condition != "" {
 		sql += condition
 	}
@@ -103,9 +113,30 @@ func GetKnowledgeResourceListCount(condition string, pars []interface{}) (count
 	return
 }
 
+func GetKnowledgeResourcePageByIds(ids []int, startSize, pageSize int) (items []*KnowledgeResource, err error) {
+	if len(ids) == 0 {
+		return
+	}
+	sql := `SELECT * FROM knowledge_resource WHERE knowledge_resource_id in (?) ORDER BY modify_time DESC LIMIT ?,?`
+
+	err = global.DmSQL["rddp"].Raw(sql, ids, startSize, pageSize).Find(&items).Error
+	return
+}
+
+func GetKnowledgeResourceByIds(ids []int) (items []*KnowledgeResource, err error) {
+	if len(ids) == 0 {
+		return
+	}
+	sql := `SELECT * FROM knowledge_resource WHERE knowledge_resource_id in (?) ORDER BY modify_time`
+
+	err = global.DmSQL["rddp"].Raw(sql, ids).Find(&items).Error
+	return
+}
+
+// Delete逻辑删除
 func (m *KnowledgeResource) Delete(knowledgeResourceIds int) (err error) {
 
-	sql := ` DELETE FROM knowledge_resource WHERE knowledge_resource_id =? `
+	sql := ` UPDATE knowledge_resource SET is_delete = 1 WHERE knowledge_resource_id =? `
 	err = global.DmSQL["rddp"].Exec(sql, knowledgeResourceIds).Error
 	return
 }
@@ -277,3 +308,17 @@ func (m *KnowledgeResource) UpdateClassifyIdByIds(ids []int, classifyId int, res
 	err = global.DmSQL["rddp"].Exec(sql, pars...).Error
 	return
 }
+
+type BiDashboardResourceAddReq struct {
+	BiDashboardDetailId   int                        `description:"Bi看板详情"`
+	KnowledgeResourceList []KnowledgeResourceMapItem `description:"知识资源id"`
+}
+type BiDashboardResourceAddResp struct {
+	BiDashboardDetailId   int                      `description:"Bi看板详情"`
+	KnowledgeResourceList []*KnowledgeResourceList `description:"知识资源列表"`
+}
+
+type KnowledgeResourceMapItem struct {
+	KnowledgeResourceId int
+	ResourceType        int
+}

+ 51 - 0
models/knowledge/knowledge_resource_bi_dashboard_detail.go

@@ -0,0 +1,51 @@
+package knowledge
+
+import (
+	"eta_gn/eta_api/global"
+	"eta_gn/eta_api/utils"
+	"time"
+)
+
+type KnowledgeResourceBiDashboardDetail struct {
+	Id                    int       `gorm:"column:id;primary_key"`
+	BiDashboardDetailId   int       `gorm:"column:bi_dashboard_detail_id;comment:关联的BI仪表盘详情ID"`
+	KnowledgeResourceId   int       `gorm:"column:knowledge_resource_id;comment:关联的知识库资源ID"`
+	KnowledgeResourceType int       `gorm:"column:knowledge_resource_type;comment:知识库资源类型:0事件库,1政策库,2观点库,3知识库"`
+	CreateTime            time.Time `gorm:"column:create_time;comment:创建时间"`
+}
+
+func (KnowledgeResourceBiDashboardDetail) TableName() string {
+	return "knowledge_resource_bi_dashboard_detail"
+}
+
+func (k *KnowledgeResourceBiDashboardDetail) BatchAdd(items []*KnowledgeResourceBiDashboardDetail) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	tx := global.DmSQL["rddp"].Begin()
+	defer func() {
+		if err != nil {
+			tx.Rollback()
+		} else {
+			tx.Commit()
+		}
+	}()
+
+	sql := `DELETE FROM knowledge_resource_bi_dashboard_detail WHERE bi_dashboard_detail_id =? `
+	err = tx.Exec(sql, items[0].BiDashboardDetailId).Error
+	if err != nil {
+		return
+	}
+	err = global.DmSQL["rddp"].CreateInBatches(items, utils.MultiAddNum).Error
+	return
+}
+
+func GetKnowledgeResourceIdsByCondition(condition string, pars []interface{}) (resourceIds []int, err error) {
+	sql := "SELECT knowledge_resource_id FROM knowledge_resource_bi_dashboard_detail WHERE 1=1 "
+	if condition != "" {
+		sql += condition
+	}
+
+	err = global.DmSQL["rddp"].Raw(sql, pars...).Find(&resourceIds).Error
+	return
+}

+ 82 - 58
models/ppt_v2.go

@@ -12,39 +12,44 @@ import (
 
 // PptV2 表
 type PptV2 struct {
-	PptId            int       `gorm:"column:ppt_id;primaryKey;autoIncrement:true" description:"ppt的Id"`
-	TemplateType     int       `gorm:"column:template_type" description:"模版类型"`
-	BackgroundImg    string    `gorm:"column:background_img" description:"背景图片"`
-	Title            string    `gorm:"column:title" description:"标题"`
-	ReportType       string    `gorm:"column:report_type" description:"报告类型"`
-	PptDate          string    `gorm:"column:ppt_date" description:"选择日期"`
-	Content          string    `gorm:"column:content" description:"ppt内容"`
-	PptUrl           string    `gorm:"column:ppt_url" description:"ppt下载地址"`
-	PptxUrl          string    `gorm:"column:pptx_url" description:"pptx下载地址"`
-	CreateTime       time.Time `gorm:"column:create_time" description:"创建时间"`
-	ModifyTime       time.Time `gorm:"column:modify_time" description:"修改时间"`
-	AdminId          int       `gorm:"column:admin_id" description:"系统用户id"`
-	AdminRealName    string    `gorm:"column:admin_real_name" description:"系统用户名称"`
-	PptVersion       int8      `gorm:"column:ppt_version" description:"是否ppt的旧版本;1:旧的,2:新的"`
-	ReportId         int       `gorm:"column:report_id" description:"关联的报告ID"`
-	ReportCode       string    `gorm:"column:report_code" description:"关联的报告code"`
-	IsShare          int8      `gorm:"column:is_share" description:"是否分享,0:不分享,1:分享"`
-	PublishTime      time.Time `gorm:"column:publish_time" description:"发布时间"`
-	CoverContent     string    `gorm:"column:cover_content" description:"PPT内容-JSON"`
-	PptPage          int       `gorm:"column:ppt_page" description:"PPT页数"`
-	TitleSetting     string    `gorm:"column:title_setting" description:"PPT标题设置"`
-	ClassifyId       int       `gorm:"column:classify_id" description:"报告分类ID"`
-	AddType          int       `gorm:"column:add_type" description:"新增方式:1-新增报告;2-继承报告"`
-	InheritReportId  int       `gorm:"column:inherit_report_id" description:"继承的报告ID"`
-	CollaborateType  int       `gorm:"column:collaborate_type" description:"协作方式:1-个人;2-多人协作"`
-	CollaborateUsers string    `gorm:"column:collaborate_users" description:"协作人IDs, 英文逗号分隔"`
-	IsPublicPublish  int       `gorm:"column:is_public_publish" description:"是否公开发布:1-是;2-否"`
-	SubmitTime       time.Time `gorm:"column:submit_time" description:"提交时间"`
-	ApproveTime      time.Time `gorm:"column:approve_time" description:"审批时间"`
-	ReportSource     int       `gorm:"column:report_source" description:"报告来源:1-系统内;2-智力共享"`
-	OutReportId      string    `gorm:"column:out_report_id" description:"外部报告ID(或编码)"`
-	State            int       `gorm:"column:state" description:"报告状态:1-未发布;2-已发布;3-待提交;4-待审批;5-已驳回;6-已通过"`
-	TopicEndTime     time.Time `gorm:"column:topic_end_time" description:"课题结束时间"`
+	PptId                  int       `gorm:"column:ppt_id;primaryKey;autoIncrement:true" description:"ppt的Id"`
+	TemplateType           int       `gorm:"column:template_type" description:"模版类型"`
+	BackgroundImg          string    `gorm:"column:background_img" description:"现在实际存的封面图(前端改动太大,不知道该字段之前谁定义的)"`
+	Title                  string    `gorm:"column:title" description:"标题"`
+	ReportType             string    `gorm:"column:report_type" description:"报告类型"`
+	PptDate                string    `gorm:"column:ppt_date" description:"选择日期"`
+	Content                string    `gorm:"column:content" description:"ppt内容"`
+	PptUrl                 string    `gorm:"column:ppt_url" description:"ppt下载地址"`
+	PptxUrl                string    `gorm:"column:pptx_url" description:"pptx下载地址"`
+	CreateTime             time.Time `gorm:"column:create_time" description:"创建时间"`
+	ModifyTime             time.Time `gorm:"column:modify_time" description:"修改时间"`
+	AdminId                int       `gorm:"column:admin_id" description:"系统用户id"`
+	AdminRealName          string    `gorm:"column:admin_real_name" description:"系统用户名称"`
+	PptVersion             int8      `gorm:"column:ppt_version" description:"是否ppt的旧版本;1:旧的,2:新的"`
+	ReportId               int       `gorm:"column:report_id" description:"关联的报告ID"`
+	ReportCode             string    `gorm:"column:report_code" description:"关联的报告code"`
+	IsShare                int8      `gorm:"column:is_share" description:"是否分享,0:不分享,1:分享"`
+	PublishTime            time.Time `gorm:"column:publish_time" description:"发布时间"`
+	CoverContent           string    `gorm:"column:cover_content" description:"PPT内容-JSON"`
+	PptPage                int       `gorm:"column:ppt_page" description:"PPT页数"`
+	TitleSetting           string    `gorm:"column:title_setting" description:"PPT标题设置"`
+	ClassifyId             int       `gorm:"column:classify_id" description:"报告分类ID"`
+	AddType                int       `gorm:"column:add_type" description:"新增方式:1-新增报告;2-继承报告"`
+	InheritReportId        int       `gorm:"column:inherit_report_id" description:"继承的报告ID"`
+	CollaborateType        int       `gorm:"column:collaborate_type" description:"协作方式:1-个人;2-多人协作"`
+	CollaborateUsers       string    `gorm:"column:collaborate_users" description:"协作人IDs, 英文逗号分隔"`
+	IsPublicPublish        int       `gorm:"column:is_public_publish" description:"是否公开发布:1-是;2-否"`
+	SubmitTime             time.Time `gorm:"column:submit_time" description:"提交时间"`
+	ApproveTime            time.Time `gorm:"column:approve_time" description:"审批时间"`
+	ReportSource           int       `gorm:"column:report_source" description:"报告来源:1-系统内;2-智力共享"`
+	OutReportId            string    `gorm:"column:out_report_id" description:"外部报告ID(或编码)"`
+	State                  int       `gorm:"column:state" description:"报告状态:1-未发布;2-已发布;3-待提交;4-待审批;5-已驳回;6-已通过"`
+	TopicEndTime           time.Time `gorm:"column:topic_end_time" description:"课题结束时间"`
+	CurrentBackgroundImg   string    `gorm:"column:current_background_img" description:"背景图片"`
+	BackCoverImg           string    `gorm:"column:back_cover_img" description:"封底图片"`
+	CurrentBackgroundImgId int       `gorm:"column:current_background_img_id" description:"背景图片id"`
+	BackCoverImgId         int       `gorm:"column:back_cover_img_id" description:"封底图片id"`
+	BackgroundImgId        int       `gorm:"column:background_img_id" description:"封面图id"`
 }
 
 type PptV2Item struct {
@@ -127,12 +132,17 @@ func DeletePptV2(pptId int) (err error) {
 type AddPptV2Req struct {
 	PptId     int64 `description:"ppt_id"`
 	FirstPage struct {
-		Title        string `description:"标题"`
-		ReportType   string `description:"类型"`
-		PptDate      string `description:"日期"`
-		ImgUrl       string `description:"图片"`
-		BackIndex    int    `description:"背景图片下标"`
-		TemplateType int    `description:"模版id"`
+		Title                  string `description:"标题"`
+		ReportType             string `description:"类型"`
+		PptDate                string `description:"日期"`
+		ImgUrl                 string `description:"封面图片"`
+		CurrentBackgroundImg   string `description:"背景图片"`
+		BackCoverImg           string `description:"封底图片"`
+		CurrentBackgroundImgId int    `description:"背景图片id"`
+		BackCoverImgId         int    `description:"封底图片id"`
+		BackgroundImgId        int    `description:"封面图id"`
+		BackIndex              int    `description:"背景图片下标"`
+		TemplateType           int    `description:"模版id"`
 	} `description:"首页"`
 	Content      string `description:"ppt的json数据"`
 	GroupId      int64  `description:"目录id"`
@@ -195,19 +205,21 @@ func AddPptV2PublishRecord(item *PptV2PublishRecord) (lastId int64, err error) {
 
 // PptV2SaveLog ppt记录表
 type PptV2SaveLog struct {
-	Id            int       `gorm:"column:id;primaryKey;autoIncrement" description:"自增Id"`
-	PptId         int       `gorm:"column:ppt_id" description:"ppt的Id"`
-	TemplateType  int       `gorm:"column:template_type" description:"模版类型"`
-	BackgroundImg string    `gorm:"column:background_img" description:"背景图片"`
-	Title         string    `gorm:"column:title" description:"标题"`
-	ReportType    string    `gorm:"column:report_type" description:"报告类型"`
-	PptDate       string    `gorm:"column:ppt_date" description:"选择日期"`
-	Content       string    `gorm:"column:content" description:"ppt内容"`
-	AdminId       int       `gorm:"column:admin_id" description:"系统用户id"`
-	AdminRealName string    `gorm:"column:admin_real_name" description:"系统用户名称"`
-	CreateTime    time.Time `gorm:"column:create_time" description:"创建时间"`
-	CoverContent  string    `gorm:"column:cover_content" description:"PPT内容-JSON"`
-	TitleSetting  string    `gorm:"column:title_setting" description:"PPT标题设置"`
+	Id                   int       `gorm:"column:id;primaryKey;autoIncrement" description:"自增Id"`
+	PptId                int       `gorm:"column:ppt_id" description:"ppt的Id"`
+	TemplateType         int       `gorm:"column:template_type" description:"模版类型"`
+	BackgroundImg        string    `gorm:"column:background_img" description:"背景图片"`
+	Title                string    `gorm:"column:title" description:"标题"`
+	ReportType           string    `gorm:"column:report_type" description:"报告类型"`
+	PptDate              string    `gorm:"column:ppt_date" description:"选择日期"`
+	Content              string    `gorm:"column:content" description:"ppt内容"`
+	AdminId              int       `gorm:"column:admin_id" description:"系统用户id"`
+	AdminRealName        string    `gorm:"column:admin_real_name" description:"系统用户名称"`
+	CreateTime           time.Time `gorm:"column:create_time" description:"创建时间"`
+	CoverContent         string    `gorm:"column:cover_content" description:"PPT内容-JSON"`
+	TitleSetting         string    `gorm:"column:title_setting" description:"PPT标题设置"`
+	CurrentBackgroundImg string    `gorm:"column:current_background_img" description:"背景图片"`
+	BackCoverImg         string    `gorm:"column:back_cover_img" description:"封底图片"`
 }
 
 // AddPptV2SaveLog 新增PPT日志
@@ -477,12 +489,17 @@ type PptReportCreateReq struct {
 	CollaborateType    int    `description:"协作方式,1:个人,2:多人协作。默认:1"`
 	CollaborateUserIds []int  `description:"协作人IDs"`
 	FirstPage          struct {
-		Title        string `description:"标题"`
-		ReportType   string `description:"类型"`
-		PptDate      string `description:"日期"`
-		ImgUrl       string `description:"图片"`
-		BackIndex    int    `description:"背景图片下标"`
-		TemplateType int    `description:"模版id"`
+		Title                  string `description:"标题"`
+		ReportType             string `description:"类型"`
+		PptDate                string `description:"日期"`
+		ImgUrl                 string `description:"图片"`
+		CurrentBackgroundImg   string `description:"背景图片"`
+		BackCoverImg           string `description:"封底图片"`
+		CurrentBackgroundImgId int    `description:"背景图片id"`
+		BackCoverImgId         int    `description:"封底图片id"`
+		BackgroundImgId        int    `description:"封面图id"`
+		BackIndex              int    `description:"背景图片下标"`
+		TemplateType           int    `description:"模版id"`
 	} `description:"首页"`
 	Content      string `description:"ppt的json数据"`
 	CoverContent string `description:"封面图内容-JSON数据"`
@@ -495,3 +512,10 @@ func MovePptReportClassify(newClassifyId, originClassifyId int) (err error) {
 	err = global.DmSQL["rddp"].Exec(sql, newClassifyId, originClassifyId).Error
 	return
 }
+
+// GetPptByImageIdCount 根据图片id查询ppt信息
+func GetPptByImageIdCount(imageId int) (count int, err error) {
+	sql := `SELECT COUNT(1) FROM ppt_v2 WHERE current_background_img_id = ? or back_cover_img_id = ? or background_img_id = ?`
+	err = global.DmSQL["rddp"].Raw(sql, imageId, imageId, imageId).Scan(&count).Error
+	return
+}

+ 89 - 0
models/ppt_v2_history.go

@@ -0,0 +1,89 @@
+package models
+
+import (
+	"eta_gn/eta_api/global"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+type PptV2History struct {
+	Id            int       `gorm:"primaryKey"`
+	PptId         int       `description:"ppt ID"`
+	TemplateType  int       `description:"模板类型"`
+	BackgroundImg string    `description:"背景图"`
+	Title         string    `description:"标题"`
+	ReportType    string    `description:"报告类型"`
+	PptDate       string    `description:"选择日期"`
+	Content       string    `description:"内容"`
+	AdminId       int       `description:"操作人ID"`
+	AdminRealName string    `description:"操作人真实姓名"`
+	CreateTime    time.Time `description:"创建时间"`
+	CoverContent  string    `description:"封面内容"`
+	TitleSetting  string    `description:"标题设置"`
+}
+
+// 获取表名
+func (p *PptV2History) TableName() string {
+	return "ppt_v2_history"
+}
+
+func (p *PptV2History) Add() (err error) {
+	err = global.DmSQL["rddp"].Create(p).Error
+	return
+}
+
+func (p *PptV2History) GetNoContentPageList(condition string, pars []interface{}, startSize, pageSize int) (list []*PptV2History, err error) {
+	sql := fmt.Sprintf(`SELECT id, ppt_id, template_type, background_img, title, report_type, ppt_date, create_time, admin_id, admin_real_name  FROM %s WHERE 1=1 `, p.TableName())
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY create_time DESC, id DESC LIMIT ?, ?`
+	pars = append(pars, startSize, pageSize)
+	err = global.DmSQL["rddp"].Raw(sql, pars...).Scan(&list).Error
+	return
+}
+
+func (p *PptV2History) GetPageListCount(condition string, pars []interface{}) (count int, err error) {
+	sql := fmt.Sprintf(`SELECT COUNT(1) AS count  FROM %s WHERE 1=1 `, p.TableName())
+	if condition != "" {
+		sql += condition
+	}
+	err = global.DmSQL["rddp"].Raw(sql, pars...).Scan(&count).Error
+	return
+}
+
+// 删除接口
+func (p *PptV2History) Delete() (err error) {
+	err = global.DmSQL["rddp"].Delete(p).Error
+	return
+}
+
+// 查询单条记录
+func (p *PptV2History) GetById(id int) (item *PptV2History, err error) {
+	err = global.DmSQL["rddp"].Where("id = ?", id).First(&item).Error
+	return
+}
+
+// PptV2HistoryListItem 定义PPT历史记录列表项的结构体
+type PptV2HistoryListItem struct {
+	Id            int    `description:"PPT历史记录id"`
+	PptId         int    `description:"ppt ID"`
+	TemplateType  int    `description:"模板类型"`
+	BackgroundImg string `description:"背景图"`
+	Title         string `description:"标题"`
+	ReportType    string `description:"报告类型"`
+	PptDate       string `description:"选择日期"`
+	AdminId       int    `description:"操作人ID"`
+	AdminRealName string `description:"操作人真实姓名"`
+	CreateTime    string `description:"创建时间"`
+}
+
+type PptV2HistoryListResp struct {
+	List   []*PptV2HistoryListItem
+	Paging *paging.PagingItem `description:"分页数据"`
+}
+
+type DeletePptV2HistoryReq struct {
+	Id int `description:"PPT历史记录id"`
+}

+ 2 - 0
models/report.go

@@ -802,6 +802,8 @@ type SaveReportContent struct {
 	NeedSplice     int    `description:"是否拼接版头版位的标记,主要是为了兼容历史报告。0-不需要 1-需要"`
 	HeadResourceId int    `description:"版头资源ID"`
 	EndResourceId  int    `description:"版尾资源ID"`
+
+	IsManualSave bool `description:"是否手动保存:true:手动 false:自动"`
 }
 
 func AddReportSaveLog(reportId, adminId int, content, contentSub, contentStruct, canvasColor, adminName string, headResourceId, endResourceId int) (err error) {

+ 1 - 0
models/report_chapter.go

@@ -172,6 +172,7 @@ type EditReportChapterReq struct {
 	CanvasColor    string `description:"画布颜色"`
 	HeadResourceId int    `description:"版头资源ID"`
 	EndResourceId  int    `description:"版尾资源ID"`
+	IsManualSave   bool   `description:"是否手动保存:true:手动 false:自动"`
 }
 
 type EditTickList struct {

+ 86 - 0
models/report_history.go

@@ -0,0 +1,86 @@
+package models
+
+import (
+	"eta_gn/eta_api/global"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+// ReportHistory 定义报告历史记录的结构体
+type ReportHistory struct {
+	Id              int       `gorm:"primaryKey"`
+	ReportId        int       `description:"报告id"`
+	ReportChapterId int       `description:"报告章节id"`
+	Title           string    `description:"标题"`
+	Content         string    `description:"内容"`
+	CreateTime      time.Time `description:"创建时间"`
+	ContentSub      string    `description:"部分内容"`
+	AdminId         int       `description:"创建人id"`
+	AdminName       string    `description:"创建人姓名"`
+	ContentStruct   string    `description:"内容组件"`
+	CanvasColor     string    `description:"画布颜色"`
+	HeadResourceId  int       `description:"版头资源ID"`
+	EndResourceId   int       `description:"版尾资源ID"`
+}
+
+func (r *ReportHistory) TableName() string {
+	return "report_history"
+}
+
+func (r *ReportHistory) Add() (err error) {
+	err = global.DmSQL["rddp"].Create(r).Error
+	return
+}
+
+func (r *ReportHistory) GetNoContentPageList(condition string, pars []interface{}, startSize, pageSize int) (list []*ReportHistory, err error) {
+	sql := fmt.Sprintf(`SELECT id, report_id, report_chapter_id, title, create_time, admin_id, admin_name  FROM %s WHERE 1=1 `, r.TableName())
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY create_time DESC, id DESC LIMIT ?, ?`
+	pars = append(pars, startSize, pageSize)
+	err = global.DmSQL["rddp"].Raw(sql, pars...).Scan(&list).Error
+	return
+}
+
+func (r *ReportHistory) GetPageListCount(condition string, pars []interface{}) (count int, err error) {
+	sql := fmt.Sprintf(`SELECT COUNT(1) AS count  FROM %s WHERE 1=1 `, r.TableName())
+	if condition != "" {
+		sql += condition
+	}
+	err = global.DmSQL["rddp"].Raw(sql, pars...).Scan(&count).Error
+	return
+}
+
+// 删除接口
+func (r *ReportHistory) Delete() (err error) {
+	err = global.DmSQL["rddp"].Delete(r).Error
+	return
+}
+
+// 查询单条记录
+func (r *ReportHistory) GetById(id int) (item *ReportHistory, err error) {
+	err = global.DmSQL["rddp"].Where("id = ?", id).First(&item).Error
+	return
+}
+
+// ReportHistoryListItem 定义报告历史记录列表项的结构体
+type ReportHistoryListItem struct {
+	Id              int    `description:"报告历史记录id"`
+	ReportId        int    `description:"报告id"`
+	ReportChapterId int    `description:"报告章节id"`
+	Title           string `description:"标题"`
+	CreateTime      string `description:"创建时间"`
+	AdminId         int    `description:"创建人id"`
+	AdminName       string `description:"创建人姓名"`
+}
+
+type ReportHistoryListResp struct {
+	List   []*ReportHistoryListItem
+	Paging *paging.PagingItem `description:"分页数据"`
+}
+
+type DeleteReportHistoryReq struct {
+	Id int `description:"报告历史记录id"`
+}

+ 2 - 2
models/report_v2.go

@@ -351,12 +351,12 @@ func GetReportListCountByAuthorized(condition string, pars []interface{}) (count
 // @return items []*ReportList
 // @return err error
 func GetReportListByAuthorized(condition string, pars []interface{}, startSize, pageSize int) (items []*ReportList, err error) {
-	sql := `SELECT id,classify_id_first,classify_name_first,classify_id_second,classify_name_second,classify_id_third,classify_name_third,title,stage,create_time,author,report_layout,collaborate_type,is_public_publish,abstract,has_chapter,publish_time,report_create_time FROM report as a WHERE 1=1  `
+	sql := `SELECT id,classify_id_first,classify_name_first,classify_id_second,classify_name_second,classify_id_third,classify_name_third,title,stage,create_time,author,report_layout,collaborate_type,is_public_publish,abstract,has_chapter,publish_time,report_create_time,state FROM report as a WHERE 1=1  `
 	if condition != "" {
 		sql += condition
 	}
 	// 排序:1:未发布;2:已发布;3-待提交;4-待审批;5-已驳回;6-已通过
-	sql += ` GROUP BY id,classify_id_first,classify_name_first,classify_id_second,classify_name_second,classify_id_third,classify_name_third,title,stage,create_time,author,report_layout,collaborate_type,is_public_publish,abstract,has_chapter,publish_time,report_create_time
+	sql += ` GROUP BY id,classify_id_first,classify_name_first,classify_id_second,classify_name_second,classify_id_third,classify_name_third,title,stage,create_time,author,report_layout,collaborate_type,is_public_publish,abstract,has_chapter,publish_time,report_create_time,state
             ORDER BY  report_create_time DESC LIMIT ?,?`
 	pars = append(pars, startSize)
 	pars = append(pars, pageSize)

+ 153 - 0
routers/commentsRouter.go

@@ -4183,6 +4183,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbInfoShareController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbInfoShareController"],
+        beego.ControllerComments{
+            Method: "Save",
+            Router: `/edb_info/share/save`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbInfoShareController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbInfoShareController"],
+        beego.ControllerComments{
+            Method: "UserList",
+            Router: `/edb_info/share/user_list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:FactorEdbSeriesController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:FactorEdbSeriesController"],
         beego.ControllerComments{
             Method: "Add",
@@ -5020,6 +5038,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/knowledge:ResourceController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/knowledge:ResourceController"],
+        beego.ControllerComments{
+            Method: "BiDashboardCacheResourceList",
+            Router: `/resource/bi_dashboard/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/knowledge:ResourceController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/knowledge:ResourceController"],
+        beego.ControllerComments{
+            Method: "BiDashboardResourceSave",
+            Router: `/resource/bi_dashboard/save`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta_gn/eta_api/controllers/knowledge:ResourceController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/knowledge:ResourceController"],
         beego.ControllerComments{
             Method: "Delete",
@@ -5092,6 +5128,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/knowledge:ResourceController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/knowledge:ResourceController"],
+        beego.ControllerComments{
+            Method: "Search",
+            Router: `/resource/search_by_es`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta_gn/eta_api/controllers/knowledge:ResourceController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/knowledge:ResourceController"],
         beego.ControllerComments{
             Method: "GetSourceFrom",
@@ -6496,6 +6541,42 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers:ImageConfController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers:ImageConfController"],
+        beego.ControllerComments{
+            Method: "AddImageMaterial",
+            Router: `/add/image/material`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers:ImageConfController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers:ImageConfController"],
+        beego.ControllerComments{
+            Method: "DeleteImageMaterial",
+            Router: `/delete/image/material`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers:ImageConfController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers:ImageConfController"],
+        beego.ControllerComments{
+            Method: "EditImageMaterial",
+            Router: `/edit/image/material`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers:ImageConfController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers:ImageConfController"],
+        beego.ControllerComments{
+            Method: "GetImageMaterial",
+            Router: `/get/image/material`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta_gn/eta_api/controllers:MeetingProbabilitiesController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers:MeetingProbabilitiesController"],
         beego.ControllerComments{
             Method: "Detail",
@@ -6883,6 +6964,42 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers:PptV2HistoryController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers:PptV2HistoryController"],
+        beego.ControllerComments{
+            Method: "Delete",
+            Router: `/del`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers:PptV2HistoryController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers:PptV2HistoryController"],
+        beego.ControllerComments{
+            Method: "Detail",
+            Router: `/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers:PptV2HistoryController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers:PptV2HistoryController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers:PptV2HistoryController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers:PptV2HistoryController"],
+        beego.ControllerComments{
+            Method: "Revert",
+            Router: `/revert`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta_gn/eta_api/controllers:ReportAuthorController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers:ReportAuthorController"],
         beego.ControllerComments{
             Method: "Author",
@@ -7432,6 +7549,42 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers:ReportHistoryController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers:ReportHistoryController"],
+        beego.ControllerComments{
+            Method: "Delete",
+            Router: `/del`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers:ReportHistoryController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers:ReportHistoryController"],
+        beego.ControllerComments{
+            Method: "Detail",
+            Router: `/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers:ReportHistoryController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers:ReportHistoryController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers:ReportHistoryController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers:ReportHistoryController"],
+        beego.ControllerComments{
+            Method: "Revert",
+            Router: `/revert`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta_gn/eta_api/controllers:ReportUploadCommonController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers:ReportUploadCommonController"],
         beego.ControllerComments{
             Method: "UploadImg",

+ 16 - 0
routers/router.go

@@ -160,6 +160,7 @@ func init() {
 				&data_manage.FactorEdbSeriesController{},
 				&data_manage.EdbCollectController{},
 				&data_manage.EdbCollectClassifyController{},
+				&data_manage.EdbInfoShareController{},
 			),
 		),
 		web.NSNamespace("/my_chart",
@@ -344,6 +345,21 @@ func init() {
 				&controllers.BIDaShboardController{},
 			),
 		),
+		web.NSNamespace("/report_history",
+			web.NSInclude(
+				&controllers.ReportHistoryController{},
+			),
+		),
+		web.NSNamespace("/ppt_history",
+			web.NSInclude(
+				&controllers.PptV2HistoryController{},
+			),
+		),
+		web.NSNamespace("/image_conf",
+			web.NSInclude(
+				&controllers.ImageConfController{},
+			),
+		),
 	)
 	web.AddNamespace(ns)
 }

+ 47 - 1
services/bi_dashboard.go

@@ -3,13 +3,59 @@ package services
 import (
 	"encoding/json"
 	"eta_gn/eta_api/models/bi_dashboard"
+	"eta_gn/eta_api/models/knowledge"
 	"eta_gn/eta_api/utils"
 	"fmt"
+	"strconv"
 	"time"
-)
 
+	"github.com/go-redis/redis/v8"
+)
 
+func SaveBiDashboardKnowledgeResource(dashboardId, adminId int) (msg string, err error) {
+	ids, err := bi_dashboard.GetBiDashboardDetailIdByBidashboardIdAndType(dashboardId, 3)
+	if err != nil {
+		return
+	}
+	if len(ids) == 0 {
+		return
+	}
 
+	data, er := utils.Rc.RedisBytes(utils.CACHE_KEY_BI_DASHBOARD_PREPARE_RESOURCE + strconv.Itoa(adminId))
+	req := new(knowledge.BiDashboardResourceAddReq)
+	if er != nil {
+		if er == redis.Nil {
+			msg = "暂无知识库"
+			err = nil
+			return
+		}
+		msg = "知识资源库添加失败"
+		return
+	}
+	if err = json.Unmarshal(data, &req); err != nil {
+		msg = "知识资源库添加失败"
+	}
+	defer func() {
+		if err == nil {
+			utils.Rc.Delete(utils.CACHE_KEY_BI_DASHBOARD_PREPARE_RESOURCE + strconv.Itoa(adminId))
+		}
+	}()
+	insertMapping := make([]*knowledge.KnowledgeResourceBiDashboardDetail, 0, len(req.KnowledgeResourceList))
+	for _, v := range req.KnowledgeResourceList {
+		tmp := new(knowledge.KnowledgeResourceBiDashboardDetail)
+		tmp.BiDashboardDetailId = ids[0]
+		tmp.KnowledgeResourceId = v.KnowledgeResourceId
+		tmp.KnowledgeResourceType = 3
+		tmp.CreateTime = time.Now()
+		insertMapping = append(insertMapping, tmp)
+	}
+	obj := new(knowledge.KnowledgeResourceBiDashboardDetail)
+	err = obj.BatchAdd(insertMapping)
+	if err != nil {
+		msg = "知识资源库添加失败"
+	}
+	return
+}
 
 // UpdateBiDashboardEditing 更新看板编辑状态
 func UpdateBiDashboardEditing(boardId, status, userId int, userName string) (ret bi_dashboard.BiDashboardEditingCache, err error) {

+ 6 - 3
services/data/data_manage_permission/data_move.go

@@ -24,7 +24,7 @@ import (
 // @param subSource int
 // @return resp data_manage.EdbChartClassifyResp
 // @return err error
-func GetEdbChartClassifyList(source, subSource int) (resp data_manage.EdbChartClassifyResp, err error) {
+func GetEdbChartClassifyList(source, subSource, sysUserId int) (resp data_manage.EdbChartClassifyResp, err error) {
 	switch source {
 	case 1: //手工数据指标
 		list, e := models.GetEdbdataClassify(0)
@@ -56,8 +56,11 @@ func GetEdbChartClassifyList(source, subSource int) (resp data_manage.EdbChartCl
 		if source == 7 {
 			classifyType = utils.EdbClassifyTypeCalculate
 		}
+		if classifyType == utils.EdbClassifyTypeBase {
+			sysUserId = 0
+		}
 		// 考虑到后面可以会迭代到10层, 这里直接用递归处理
-		classifyAll, e := data_manage.GetAllEdbClassifyByType(classifyType)
+		classifyAll, e := data_manage.GetAllEdbClassifyByType(classifyType, sysUserId)
 		if e != nil && !utils.IsErrNoRow(e) {
 			err = e
 			return
@@ -67,7 +70,7 @@ func GetEdbChartClassifyList(source, subSource int) (resp data_manage.EdbChartCl
 	case 4:
 		//ETA预测指标
 		// 考虑到后面可以会迭代到10层, 这里直接用递归
-		classifyAll, e := data_manage.GetAllEdbClassifyByType(1)
+		classifyAll, e := data_manage.GetAllEdbClassifyByType(1, sysUserId)
 		if e != nil && !utils.IsErrNoRow(e) {
 			err = e
 			return

+ 59 - 0
services/data/data_manage_permission/edb.go

@@ -169,6 +169,7 @@ func CheckEdbPermission(edbIsJoinPermission, edbClassifyIsJoinPermission, userId
 // @return classifyIdList
 // @return err
 func GetUserAllEdbAndClassifyNoPermissionList(userId, edbInfoType, edbType int) (edbIdList, classifyIdList []int, err error) {
+	// TODO 这块需要调整掉,只获取数据查看的
 	edbIdList = make([]int, 0)
 	classifyIdList = make([]int, 0)
 
@@ -231,3 +232,61 @@ func GetUserAllEdbAndClassifyNoPermissionList(userId, edbInfoType, edbType int)
 
 	return
 }
+
+// GetUserAllEdbAndClassifyNoPermissionListV2
+// @Description: 根据用户获取已经未授权的指标ID列表和指标分类ID列表(仅有数据查看(基础的普通指标)的指标了)
+// @param userId
+// @return edbIdList
+// @return classifyIdList
+// @return err
+func GetUserAllEdbAndClassifyNoPermissionListV2(userId int) (edbIdList, classifyIdList []int, err error) {
+	edbIdList = make([]int, 0)
+	classifyIdList = make([]int, 0)
+	// 获取所有无权限指标id列表
+	{
+		isJoinPermissionEdbIdList, tmpErr := data_manage.GetIsJoinPermissionEdbInfoIdList(utils.EDB_INFO_TYPE, utils.EdbTypeBase)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+
+		// 获取有权限的指标ID列表
+		hasPermissionEdbIdList, tmpErr := data_manage_permission.GetPermissionEdbIdList(userId, 0)
+		if tmpErr != nil {
+			err = tmpErr
+			fmt.Println("获取授权指标列表失败, err:", tmpErr)
+			return
+		}
+		for _, edbId := range isJoinPermissionEdbIdList {
+			if !utils.InArrayByInt(hasPermissionEdbIdList, edbId) {
+				edbIdList = append(edbIdList, edbId)
+			}
+		}
+	}
+
+	// 获取所有无权限指标分类id列表
+	{
+		classifyType := 0
+
+		isJoinPermissionEdbClassifyIdList, tmpErr := data_manage.GetIsJoinPermissionEdbClassifyIdList(classifyType)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+
+		// 获取有权限的指标分类ID列表
+		hasPermissionClassifyIdList, tmpErr := data_manage_permission.GetPermissionEdbClassifyIdList(userId, 0)
+		if tmpErr != nil {
+			err = tmpErr
+			fmt.Println("获取授权指标分类列表失败, err:", err)
+			return
+		}
+		for _, classifyId := range isJoinPermissionEdbClassifyIdList {
+			if !utils.InArrayByInt(hasPermissionClassifyIdList, classifyId) {
+				classifyIdList = append(classifyIdList, classifyId)
+			}
+		}
+	}
+
+	return
+}

+ 369 - 240
services/data/edb_classify.go

@@ -288,6 +288,7 @@ func AddEdbClassify(classifyName string, parentId, level int, classifyType uint8
 	}
 	//查询顶级rootId
 	rootId := 0
+	var classifyNamePath, classifyIdPath string
 	if parentId > 0 {
 		parentClassify, tErr := data_manage.GetEdbClassifyById(parentId)
 		if tErr != nil {
@@ -301,30 +302,39 @@ func AddEdbClassify(classifyName string, parentId, level int, classifyType uint8
 			return
 		}
 		rootId = parentClassify.RootId
+
+		classifyNamePath = fmt.Sprint(parentClassify.ClassifyNamePath, "|", classifyName)
+		classifyIdPath = fmt.Sprint(parentClassify.ClassifyIdPath, ",")
+	} else {
+		classifyNamePath = classifyName
 	}
 
 	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
 	classifyInfo = &data_manage.EdbClassify{
 		//ClassifyId:      0,
-		ClassifyType:    classifyType,
-		ClassifyName:    classifyName,
-		ClassifyNameEn:  classifyName,
-		ParentId:        parentId,
-		RootId:          rootId,
-		HasData:         0,
-		CreateTime:      time.Now(),
-		ModifyTime:      time.Now(),
-		SysUserId:       sysUserId,
-		SysUserRealName: sysUserName,
-		Level:           level + 1,
-		UniqueCode:      utils.MD5(utils.DATA_PREFIX + "_" + timestamp),
-		Sort:            maxSort + 1,
+		ClassifyType:     classifyType,
+		ClassifyName:     classifyName,
+		ClassifyNameEn:   classifyName,
+		ParentId:         parentId,
+		RootId:           rootId,
+		HasData:          0,
+		CreateTime:       time.Now(),
+		ModifyTime:       time.Now(),
+		SysUserId:        sysUserId,
+		SysUserRealName:  sysUserName,
+		Level:            level + 1,
+		UniqueCode:       utils.MD5(utils.DATA_PREFIX + "_" + timestamp),
+		Sort:             maxSort + 1,
+		ClassifyNamePath: classifyNamePath,
 	}
-	newId, err := data_manage.AddEdbClassify(classifyInfo)
+	err = data_manage.AddEdbClassify(classifyInfo)
 	if err != nil {
 		errMsg = "保存分类失败"
 		return
 	}
+	// 更改分类id完整路径path
+	classifyInfo.ClassifyIdPath = fmt.Sprint(classifyIdPath, classifyInfo.ClassifyId)
+	_ = classifyInfo.Update([]string{"ClassifyIdPath"})
 
 	// 继承分类权限
 	{
@@ -335,17 +345,22 @@ func AddEdbClassify(classifyName string, parentId, level int, classifyType uint8
 		if classifyType == utils.EdbClassifyTypeCalculate {
 			source = utils.EdbPermissionSourceCalculate
 		}
-		go data_manage_permission.InheritParentClassify(source, int(classifyType), int(newId), classifyInfo.ParentId, classifyInfo.ClassifyName)
+		go data_manage_permission.InheritParentClassify(source, int(classifyType), classifyInfo.ClassifyId, classifyInfo.ParentId, classifyInfo.ClassifyName)
 	}
 
+	// 更改分类id完整路径path
+	updateCols := []string{"ClassifyIdPath"}
+	classifyInfo.ClassifyIdPath = fmt.Sprint(classifyIdPath, classifyInfo.ClassifyId)
+
 	if parentId == 0 { //一级目录的rootId等于自己本身
-		classifyInfo.ClassifyId = int(newId)
-		classifyInfo.RootId = int(newId)
-		err = classifyInfo.Update([]string{"RootId"})
-		if err != nil {
-			errMsg = "更新分类失败"
-			return
-		}
+		classifyInfo.RootId = classifyInfo.ClassifyId
+		updateCols = append(updateCols, "RootId")
+
+	}
+	err = classifyInfo.Update(updateCols)
+	if err != nil {
+		errMsg = "更新分类失败"
+		return
 	}
 
 	return
@@ -392,6 +407,9 @@ func EditEdbClassify(classifyId int, classifyName, lang string, sysUser *system.
 	// 需要变更的字段
 	updateCols := make([]string, 0)
 
+	// 旧完整路径  , 新的完整路径
+	var oldClassifyNamePath, newClassifyNamePath string
+
 	switch lang {
 	case utils.EnLangVersion:
 		// 名字相同,那么就直接返回
@@ -434,15 +452,32 @@ func EditEdbClassify(classifyId int, classifyName, lang string, sysUser *system.
 			err = errors.New(errMsg)
 			return
 		}
+
+		// 旧完整路径
+		oldClassifyNamePath = item.ClassifyNamePath
+
+		if item.ParentId > 0 {
+			parentItem, tmpErr := data_manage.GetEdbClassifyById(item.ParentId)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			newClassifyNamePath = fmt.Sprint(parentItem.ClassifyNamePath, "|", classifyName)
+		} else {
+			newClassifyNamePath = classifyName
+		}
+
+		// 更新自己的信息
 		item.ClassifyName = classifyName
+		item.ClassifyNamePath = newClassifyNamePath
 		item.LastModifyUserId = sysUser.AdminId
 		item.LastModifyUserRealName = sysUser.RealName
-		updateCols = append(updateCols, "ClassifyName", "LastModifyUserId", "LastModifyUserRealName")
+		updateCols = append(updateCols, "ClassifyName", "ClassifyNamePath", "LastModifyUserId", "LastModifyUserRealName")
 	}
 
 	// 修改数据
 	if len(updateCols) > 0 {
-		err = item.Update(updateCols)
+		err = item.UpdateEdbClassifyNameAndNamePath(updateCols, oldClassifyNamePath, newClassifyNamePath)
 		if err != nil {
 			errMsg = "保存失败"
 		}
@@ -1111,67 +1146,84 @@ func MoveEdbClassify(req data_manage.MoveEdbClassifyReq, sysUser *system.Admin,
 		nextSort = nextEdbInfo.Sort
 	}
 
-	err, errMsg = moveEdbClassify(parentEdbClassifyInfo, edbClassifyInfo, prevClassify, nextClassify, edbInfo, prevEdbInfo, nextEdbInfo, parentClassifyId, prevSort, nextSort, classifyType)
+	err, errMsg = moveEdbOrClassify(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)
+// moveEdbOrClassify 移动指标分类
+func moveEdbOrClassify(parentEdbClassifyInfo, edbClassifyInfo, prevClassify, nextClassify *data_manage.EdbClassify, edbInfo, prevEdbInfo, nextEdbInfo *data_manage.EdbInfo, parentClassifyId int, prevSort, nextSort int, classifyType uint8) (err error, errMsg string) {
 
-	// 移动对象为分类, 判断分类是否存在
 	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:" + e.Error() + m)
-				return
-			}
+		// 移动分类
+		return moveEdbClassify(parentEdbClassifyInfo, edbClassifyInfo, prevClassify, nextClassify, prevEdbInfo, nextEdbInfo, parentClassifyId, prevSort, nextSort, classifyType)
+	} else {
+		// 移动指标
+		return moveEdb(prevClassify, nextClassify, edbInfo, prevEdbInfo, nextEdbInfo, parentClassifyId, prevSort, nextSort, classifyType)
+	}
 
-			if len(childList) > 0 {
-				for _, v := range childList {
-					if v.ClassifyId == edbClassifyInfo.ClassifyId {
-						continue
-					}
-					classifyIds = append(classifyIds, v.ClassifyId)
+	return
+}
+
+// moveEdb
+// @Description: 移动指标
+// @author: Roc
+// @datetime 2024-11-26 16:07:37
+// @param prevClassify *data_manage.EdbClassify
+// @param nextClassify *data_manage.EdbClassify
+// @param edbInfo *data_manage.EdbInfo
+// @param prevEdbInfo *data_manage.EdbInfo
+// @param nextEdbInfo *data_manage.EdbInfo
+// @param parentClassifyId int
+// @param prevSort int
+// @param nextSort int
+// @param classifyType uint8
+// @return err error
+// @return errMsg string
+func moveEdb(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 edbInfo == nil {
+		errMsg = "当前指标不存在"
+		err = errors.New(errMsg)
+		return
+	}
+	//如果改变了分类,那么移动该指标数据
+	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`
+
+				//变更分类
+				if prevClassify != nil {
+					_ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, prevClassify.ClassifyId, prevClassify.Sort, updateSortStr, classifyType)
+				} else {
+					_ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, 0, prevSort, updateSortStr, classifyType)
 				}
-			}
-		}
-		//判断上级id是否一致,如果不一致的话,那么需要移动该分类层级
-		if edbClassifyInfo.ParentId != parentClassifyId && parentClassifyId != 0 {
-			if edbClassifyInfo.Level != parentEdbClassifyInfo.Level+1 { //禁止层级调整
-				errMsg = "移动失败"
-				err = errors.New("不支持目录层级变更")
-				return
-			}
-			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 {
-			errMsg = "移动失败"
-			err = errors.New("不支持目录层级变更")
-			return
-		}
 
-		if prevSort > 0 {
-			//如果是移动在两个兄弟节点之间
-			if nextSort > 0 {
-				//下一个兄弟节点
-				//如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
-				if prevSort == nextSort || prevSort == edbClassifyInfo.Sort {
+				//变更指标
+				if prevEdbInfo != nil {
 					//变更兄弟节点的排序
-					updateSortStr := `sort + 2`
-
+					_ = 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, prevClassify.Sort, updateSortStr, classifyType)
+						_ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, prevClassify.ClassifyId, prevSort, updateSortStr, classifyType)
 					} else {
 						_ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, 0, prevSort, updateSortStr, classifyType)
 					}
@@ -1183,128 +1235,167 @@ func moveEdbClassify(parentEdbClassifyInfo, edbClassifyInfo, prevClassify, nextC
 					} 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")
+		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 && !utils.IsErrNoRow(tmpErr) {
+			errMsg = "移动失败"
+			err = errors.New("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tmpErr.Error())
+			return
+		}
+
+		//如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
+		if firstClassify != nil && firstClassify.ClassifyId > 0 && firstClassify.Sort == 0 {
+			updateSortStr := ` sort + 1 `
+			_ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, firstClassify.ClassifyId-1, 0, updateSortStr, classifyType)
+			//该分类下的所有指标也需要+1
+			_ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, 0, 0, updateSortStr)
 		} else {
-			// 拖动到父级分类的第一位
-			firstClassify, tmpErr := data_manage.GetFirstEdbClassifyByParentId(parentClassifyId)
-			if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
+			//如果该分类下存在指标,且第一个指标的排序等于0,那么需要调整排序
+			firstEdb, tErr := data_manage.GetFirstEdbInfoByClassifyId(parentClassifyId)
+			if tErr != nil && !utils.IsErrNoRow(tErr) {
 				errMsg = "移动失败"
-				err = errors.New("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tmpErr.Error())
+				err = errors.New("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tErr.Error())
 				return
 			}
 
 			//如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
-			if firstClassify != nil && firstClassify.ClassifyId > 0 && firstClassify.Sort == 0 {
+			if firstEdb != nil && firstEdb.ClassifyId > 0 && firstEdb.Sort == 0 {
 				updateSortStr := ` sort + 1 `
-				_ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, firstClassify.ClassifyId-1, 0, updateSortStr, classifyType)
-				//该分类下的所有指标也需要+1
-				_ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, 0, 0, updateSortStr)
-			} else {
-				//如果该分类下存在指标,且第一个指标的排序等于0,那么需要调整排序
-				firstEdb, tErr := data_manage.GetFirstEdbInfoByClassifyId(parentClassifyId)
-				if tErr != nil && !utils.IsErrNoRow(tErr) {
-					errMsg = "移动失败"
-					err = errors.New("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tErr.Error())
-					return
-				}
-
-				//如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
-				if firstEdb != nil && firstEdb.ClassifyId > 0 && firstEdb.Sort == 0 {
-					updateSortStr := ` sort + 1 `
-					_ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, 0, firstEdb.EdbInfoId-1, updateSortStr)
-					_ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, 0, 0, updateSortStr, classifyType)
-				}
+				_ = 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")
+	}
 
-			edbClassifyInfo.Sort = 0 //那就是排在第一位
-			edbClassifyInfo.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
 		}
+	}
 
-		//更新
-		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
-					}
+	return
+}
+
+// moveEdbClassify
+// @Description: 移动指标分类
+// @author: Roc
+// @datetime 2024-11-26 16:07:44
+// @param parentEdbClassifyInfo *data_manage.EdbClassify
+// @param edbClassifyInfo *data_manage.EdbClassify
+// @param prevClassify *data_manage.EdbClassify
+// @param nextClassify *data_manage.EdbClassify
+// @param edbInfo *data_manage.EdbInfo
+// @param prevEdbInfo *data_manage.EdbInfo
+// @param nextEdbInfo *data_manage.EdbInfo
+// @param parentClassifyId int
+// @param prevSort int
+// @param nextSort int
+// @param classifyType uint8
+// @return err error
+// @return errMsg string
+func moveEdbClassify(parentEdbClassifyInfo, edbClassifyInfo, prevClassify, nextClassify *data_manage.EdbClassify, prevEdbInfo, nextEdbInfo *data_manage.EdbInfo, parentClassifyId int, prevSort, nextSort int, classifyType uint8) (err error, errMsg string) {
+	updateCol := make([]string, 0)
+
+	// 移动对象为分类, 判断分类是否存在
+	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:" + e.Error() + m)
+			return
+		}
+
+		if len(childList) > 0 {
+			for _, v := range childList {
+				if v.ClassifyId == edbClassifyInfo.ClassifyId {
+					continue
 				}
+				classifyIds = append(classifyIds, v.ClassifyId)
 			}
 		}
-	} else {
-		if edbInfo == nil {
-			errMsg = "当前指标不存在"
-			err = errors.New(errMsg)
+	}
+	//判断上级id是否一致,如果不一致的话,那么需要移动该分类层级
+	if edbClassifyInfo.ParentId != parentClassifyId && parentClassifyId != 0 {
+		if edbClassifyInfo.Level != parentEdbClassifyInfo.Level+1 { //禁止层级调整
+			errMsg = "移动失败"
+			err = errors.New("不支持目录层级变更")
 			return
 		}
-		//如果改变了分类,那么移动该指标数据
-		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 {
+		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 {
+		errMsg = "移动失败"
+		err = errors.New("不支持目录层级变更")
+		return
+	}
+
+	if prevSort > 0 {
+		//如果是移动在两个兄弟节点之间
+		if nextSort > 0 {
+			//下一个兄弟节点
+			//如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
+			if prevSort == nextSort || prevSort == edbClassifyInfo.Sort {
+				//变更兄弟节点的排序
+				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 + 2`
+					updateSortStr := `sort + 1`
 
 					//变更分类
 					if prevClassify != nil {
-						_ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, prevClassify.ClassifyId, prevClassify.Sort, updateSortStr, classifyType)
+						_ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, prevClassify.ClassifyId, prevSort, updateSortStr, classifyType)
 					} else {
 						_ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, 0, prevSort, updateSortStr, classifyType)
 					}
@@ -1316,91 +1407,101 @@ func moveEdbClassify(parentEdbClassifyInfo, edbClassifyInfo, prevClassify, nextC
 					} 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")
+		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 && !utils.IsErrNoRow(tmpErr) {
+			errMsg = "移动失败"
+			err = errors.New("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tmpErr.Error())
+			return
+		}
+
+		//如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
+		if firstClassify != nil && firstClassify.ClassifyId > 0 && firstClassify.Sort == 0 {
+			updateSortStr := ` sort + 1 `
+			_ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, firstClassify.ClassifyId-1, 0, updateSortStr, classifyType)
+			//该分类下的所有指标也需要+1
+			_ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, 0, 0, updateSortStr)
 		} else {
-			// 拖动到父级分类的第一位
-			firstClassify, tmpErr := data_manage.GetFirstEdbClassifyByParentId(parentClassifyId)
-			if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
+			//如果该分类下存在指标,且第一个指标的排序等于0,那么需要调整排序
+			firstEdb, tErr := data_manage.GetFirstEdbInfoByClassifyId(parentClassifyId)
+			if tErr != nil && !utils.IsErrNoRow(tErr) {
 				errMsg = "移动失败"
-				err = errors.New("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tmpErr.Error())
+				err = errors.New("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tErr.Error())
 				return
 			}
 
 			//如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
-			if firstClassify != nil && firstClassify.ClassifyId > 0 && firstClassify.Sort == 0 {
+			if firstEdb != nil && firstEdb.ClassifyId > 0 && firstEdb.Sort == 0 {
 				updateSortStr := ` sort + 1 `
-				_ = data_manage.UpdateEdbClassifySortByParentId(parentClassifyId, firstClassify.ClassifyId-1, 0, updateSortStr, classifyType)
-				//该分类下的所有指标也需要+1
-				_ = data_manage.UpdateEdbInfoSortByClassifyId(parentClassifyId, 0, 0, updateSortStr)
-			} else {
-				//如果该分类下存在指标,且第一个指标的排序等于0,那么需要调整排序
-				firstEdb, tErr := data_manage.GetFirstEdbInfoByClassifyId(parentClassifyId)
-				if tErr != nil && !utils.IsErrNoRow(tErr) {
+				_ = 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")
+	}
+
+	oldClassifyIdPath := edbClassifyInfo.ClassifyIdPath
+	oldClassifyNamePath := edbClassifyInfo.ClassifyNamePath
+	newClassifyNamePath := fmt.Sprint(parentEdbClassifyInfo.ClassifyNamePath, `|`, edbClassifyInfo.ClassifyName)
+	newClassifyIdPath := fmt.Sprint(parentEdbClassifyInfo.ClassifyIdPath, `,`, edbClassifyInfo.ClassifyId)
+
+	//更新
+	if len(updateCol) > 0 {
+		edbClassifyInfo.ClassifyNamePath = newClassifyNamePath
+		edbClassifyInfo.ClassifyIdPath = newClassifyIdPath
+		updateCol = append(updateCol, "ClassifyNamePath", "ClassifyIdPath")
+
+		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:" + tErr.Error())
+					err = errors.New("更新子分类失败,Err:" + err.Error())
 					return
 				}
-
-				//如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
-				if firstEdb != nil && firstEdb.ClassifyId > 0 && 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
+			// 更改了上级分类,那么需要同步去更改自己的分类全路径
+			tmpErr := data_manage.UpdateEdbClassifyNameAndNamePathByOldClassifyIdPath(oldClassifyIdPath, newClassifyIdPath, oldClassifyNamePath, newClassifyNamePath)
+			if tmpErr != nil {
+				utils.FileLog.Error(fmt.Sprintf("更新分类全路径失败,分类id:%d;失败原因Err:%s", edbClassifyInfo.ClassifyId, tmpErr.Error()))
 			}
 		}
+
 	}
+
 	return
 }
 
@@ -1500,3 +1601,31 @@ func GetEdbClassifyMaxSort(parentId int, classifyType uint8) (maxSort int, err e
 	}
 	return
 }
+
+// GetAllChildClassifyByParentId
+// @Description: 根据上级id获取所有的下级id
+// @author: Roc
+// @datetime 2024-12-02 15:14:13
+// @param parentId int
+// @return targetList []*data_manage.EdbClassifyItems
+// @return err error
+// @return errMsg string
+func GetAllChildClassifyByParentId(parentId int) (targetList []*data_manage.EdbClassifyItems, err error, errMsg string) {
+	//判断是否是挂在顶级目录下
+	parentClassify, err := data_manage.GetEdbClassifyById(parentId)
+	if err != nil {
+		if utils.IsErrNoRow(err) {
+			errMsg = "当前分类不存在"
+			err = errors.New(errMsg)
+			return
+		}
+		errMsg = "获取失败"
+		err = errors.New("获取分类信息失败,Err:" + err.Error())
+		return
+	}
+	orderStr := ` order by level asc, sort asc, classify_id asc`
+
+	targetList, err = data_manage.GetChildEdbClassifyListByParentId(fmt.Sprint(parentClassify.ClassifyIdPath, ",%"), orderStr)
+
+	return
+}

+ 16 - 0
services/data/edb_info.go

@@ -703,6 +703,14 @@ func AddEdbInfo(secName, unit, frequency, noticeTime, mobile string, classifyId,
 func AddOrEditEdbInfoToEs(edbInfoId int) {
 	//添加es
 	itemInfo, _ := data_manage.GetEdbInfoByCondition("AND edb_info_id=?", []interface{}{edbInfoId})
+	obj := data_manage.EdbInfoShare{}
+	list, _ := obj.GetListByEdbInfoId(edbInfoId)
+	sharedList := make([]int, 0)
+	for _, v := range list {
+		sharedList = append(sharedList, v.SysUserId)
+	}
+	itemInfo.SharedUserIdList = sharedList
+
 	go elastic.EsAddOrEditEdbInfoData(utils.DATA_INDEX_NAME, strconv.Itoa(itemInfo.EdbInfoId), itemInfo)
 }
 
@@ -710,7 +718,15 @@ func AddOrEditEdbInfoToEs(edbInfoId int) {
 func AddOrEditAllEdbInfoToEs() {
 	//添加es
 	total, itemInfoList, _ := data_manage.GetEdbInfoFilterList("", []interface{}{}, 0, 100000)
+	obj := data_manage.EdbInfoShare{}
 	for k, itemInfo := range itemInfoList {
+		list, _ := obj.GetListByEdbInfoId(itemInfo.EdbInfoId)
+		sharedList := make([]int, 0)
+		for _, v := range list {
+			sharedList = append(sharedList, v.SysUserId)
+		}
+		itemInfo.SharedUserIdList = sharedList
+
 		elastic.EsAddOrEditEdbInfoData(utils.DATA_INDEX_NAME, strconv.Itoa(itemInfo.EdbInfoId), itemInfo)
 		fmt.Println("剩余", int(total)-k-1, "条指标数据")
 	}

+ 203 - 869
services/elastic/elastic.go

@@ -8,9 +8,10 @@ import (
 	"eta_gn/eta_api/models/data_manage"
 	"eta_gn/eta_api/utils"
 	"fmt"
-	"github.com/olivere/elastic/v7"
 	"strconv"
 	"strings"
+
+	"github.com/olivere/elastic/v7"
 )
 
 // indexName:索引名称
@@ -37,6 +38,28 @@ func EsCreateIndex(indexName, mappingJson string) (err error) {
 	return
 }
 
+// EsDeleteIndex 删除索引
+func EsDeleteIndex(indexName string) (err error) {
+	client := utils.EsClient
+
+	//定义表结构
+	exists, err := client.IndexExists(indexName).Do(context.Background()) //<5>
+	if err != nil {
+		return
+	}
+	if exists {
+		resp, err := client.DeleteIndex(indexName).Do(context.Background())
+		if err != nil {
+			fmt.Println("DeleteIndex Err:" + err.Error())
+			return err
+		}
+		fmt.Println(resp.Acknowledged)
+	} else {
+		fmt.Println(indexName + " 不存在")
+	}
+	return
+}
+
 // 删除数据
 func EsDeleteData(indexName, docId string) (err error) {
 	client := utils.EsClient
@@ -86,12 +109,32 @@ func EsAddOrEditEdbInfoData(indexName, docId string, item *data_manage.EdbInfoLi
 	return
 }
 
-// SearchEdbInfoData 查询es中的指标数据
-func SearchEdbInfoData(indexName, keywordStr string, from, size, filterSource, source int, edbInfoType int8, frequency string, noPermissionEdbInfoIdList, noPermissionEdbClassifyIdList []int, edbType int) (total int64, list []*data_manage.EdbInfoList, err error) {
+// SearchEdbInfoData
+// @Description: 查询es中的指标数据
+// @author: Roc
+// @datetime 2024-11-29 10:22:25
+// @param keywordStr string
+// @param from int
+// @param size int
+// @param filterSource int
+// @param source int
+// @param frequency string
+// @param noPermissionEdbInfoIdList []int
+// @param noPermissionEdbClassifyIdList []int
+// @param collectEdbInfoIdList []int
+// @param edbTypeList []int
+// @param edbInfoType int 指标类型,0:ETA指标库(基础指标+计算指标);1:预测指标
+// @param edbAuth int 指标权限范围,0-全部;1-我的;2-公共
+// @param sysUserId int
+// @return total int64
+// @return list []*data_manage.EdbInfoList
+// @return err error
+func SearchEdbInfoData(keywordStr string, from, size, filterSource, source int, frequency string, noPermissionEdbInfoIdList, noPermissionEdbClassifyIdList, collectEdbInfoIdList, edbTypeList []int, edbInfoType, edbAuth, sysUserId int) (total int64, list []*data_manage.EdbInfoList, err error) {
+	indexName := utils.DATA_INDEX_NAME
 	list = make([]*data_manage.EdbInfoList, 0)
 	defer func() {
 		if err != nil {
-			fmt.Println("EsAddOrEditData Err:", err.Error())
+			fmt.Println("SearchEdbInfoData Err:", err.Error())
 		}
 	}()
 
@@ -99,649 +142,55 @@ func SearchEdbInfoData(indexName, keywordStr string, from, size, filterSource, s
 	highlight = highlight.Fields(elastic.NewHighlighterField("EdbCode"), elastic.NewHighlighterField("EdbName"))
 	highlight = highlight.PreTags("<font color='red'>").PostTags("</font>")
 
-	//var source map[string]interface{}
-	//source := map[string]interface{}{
-	//	"query": map[string]interface{}{
-	//		"match_all": map[string]interface{}{},
-	//	},
-	//}
 	mustMap := make([]interface{}, 0)
 	mustNotMap := make([]interface{}, 0)
 
-	//source := map[string]interface{}{
-	//	"query": map[string]interface{}{
-	//		"bool": map[string]interface{}{
-	//			"must": map[string]interface{}{
-	//				"query_string": map[string]interface{}{
-	//					"query":  keywordStr,
-	//					"fields": []string{"EdbCode", "EdbName"},
-	//				},
-	//			},
-	//		},
-	//	},
-	//}
-
 	switch filterSource {
 	case 2:
-		//source = map[string]interface{}{
-		//	"query": map[string]interface{}{
-		//		"bool": map[string]interface{}{
-		//			"must": map[string]interface{}{
-		//				"query_string": map[string]interface{}{
-		//					"query": keywordStr,
-		//				},
-		//			},
-		//			"filter": []interface{}{
-		//				map[string]interface{}{
-		//					"term": map[string]interface{}{
-		//						"Frequency.keyword": "月度",
-		//					},
-		//				}},
-		//		},
-		//	},
-		//}
-		mustMap = []interface{}{
-			map[string]interface{}{
-				"term": map[string]interface{}{
-					"Frequency.keyword": "月度",
-					//"Frequency.keyword": "月度",
-				},
-			},
-		}
-	case 3:
-		//source = map[string]interface{}{
-		//	"query": map[string]interface{}{
-		//		"bool": map[string]interface{}{
-		//			"must": map[string]interface{}{
-		//				"query_string": map[string]interface{}{
-		//					"query": keywordStr,
-		//				},
-		//			},
-		//			"must_not": []interface{}{
-		//				map[string]interface{}{
-		//					"match": map[string]interface{}{
-		//						"Frequency.keyword": "日度",
-		//					},
-		//				}},
-		//		},
-		//	},
-		//}
-
-		////注释掉,所有频度都可以变频 2022-08-31 14:31:28
-		//mustNotMap = []interface{}{
-		//	map[string]interface{}{
-		//		"match": map[string]interface{}{
-		//			"Frequency.keyword": "日度",
-		//			//"Frequency.keyword": "月度",
-		//		},
-		//	},
-		//}
-	case 4:
-		//source = map[string]interface{}{
-		//	"query": map[string]interface{}{
-		//		"bool": map[string]interface{}{
-		//			"must": map[string]interface{}{
-		//				"query_string": map[string]interface{}{
-		//					"query": keywordStr,
-		//				},
-		//			},
-		//			"filter": []interface{}{
-		//				map[string]interface{}{
-		//					"term": map[string]interface{}{
-		//						"EdbType": 1,
-		//					},
-		//				}},
-		//		},
-		//	},
-		//}
-		mustMap = []interface{}{
-			map[string]interface{}{
-				"term": map[string]interface{}{
-					"EdbType": 1,
-				},
-			},
-		}
-	case 5:
-		mustMap = []interface{}{
-			map[string]interface{}{
-				"term": map[string]interface{}{
-					"Source": 6,
-				},
-			},
-		}
-	case 6:
-		mustNotMap = []interface{}{
-			map[string]interface{}{
-				"match": map[string]interface{}{
-					"Frequency.keyword": "年度",
-				},
-			},
-		}
-	}
-
-	//指标来源
-	if source > 0 {
 		mustMap = append(mustMap, map[string]interface{}{
 			"term": map[string]interface{}{
-				"Source": source,
-				//"Frequency.keyword": "月度",
-			},
-		})
-	}
-
-	if frequency != "" {
-		mustMap = append(mustMap, map[string]interface{}{
-			"term": map[string]interface{}{
-				"Frequency.keyword": frequency,
+				"Frequency.keyword": "月度",
 				//"Frequency.keyword": "月度",
 			},
 		})
-	}
-
-	// noPermissionEdbInfoIdList 无权限指标id
-	if len(noPermissionEdbInfoIdList) > 0 {
-		mustNotMap = append(mustNotMap, map[string]interface{}{
-			"terms": map[string]interface{}{
-				"EdbInfoId": noPermissionEdbInfoIdList,
-				//"Frequency.keyword": "月度",
-			},
-		})
-	}
-
-	// noPermissionEdbInfoIdList 无权限指标id
-	if len(noPermissionEdbClassifyIdList) > 0 {
-		mustNotMap = append(mustNotMap, map[string]interface{}{
-			"terms": map[string]interface{}{
-				"ClassifyId": noPermissionEdbClassifyIdList,
-				//"Frequency.keyword": "月度",
-			},
-		})
-	}
-
-	// 指标类型:普通指标、预测指标(小于0 代表不区分指标是普通还是预测)
-	if edbInfoType >= 0 {
-		mustMap = append(mustMap, map[string]interface{}{
-			"term": map[string]interface{}{
-				"EdbInfoType": edbInfoType,
-			},
-		})
-	}
-
-	// 指标类型:0-基础+计算;1-基础指标;2-计算指标
-	if edbType > 0 {
-		mustMap = append(mustMap, map[string]interface{}{
-			"term": map[string]interface{}{
-				"EdbType": edbType,
-			},
-		})
-	}
-
-	//普通指标
-	//mustMap = append(mustMap, map[string]interface{}{
-	//	"term": map[string]interface{}{
-	//		"EdbInfoType": 0,
-	//		//"Frequency.keyword": "月度",
-	//	},
-	//})
-
-	//关键字匹配
-	//shouldMap := map[string]interface{}{
-	//	"should": []interface{}{
-	//		map[string]interface{}{
-	//			"match": map[string]interface{}{
-	//				"EdbCode": keywordStr,
-	//				//"Frequency.keyword": "月度",
-	//			},
-	//		},
-	//		map[string]interface{}{
-	//			"match": map[string]interface{}{
-	//				"EdbName": keywordStr,
-	//				//"Frequency.keyword": "月度",
-	//			},
-	//		},
-	//		map[string]interface{}{
-	//			"match": map[string]interface{}{
-	//				"EdbNameEn": keywordStr,
-	//				//"Frequency.keyword": "月度",
-	//			},
-	//		},
-	//	},
-	//}
-
-	// 默认使用中文名字字段去匹配
-	keywordNameKey := `EdbName`
-	// 如果没有中文,则使用英文名称字段去匹配
-	if !utils.ContainsChinese(keywordStr) {
-		keywordNameKey = `EdbNameEn`
-	}
-	shouldMap := map[string]interface{}{
-		"should": []interface{}{
-			map[string]interface{}{
-				"match": map[string]interface{}{
-					"EdbCode": keywordStr,
-					//"Frequency.keyword": "月度",
-				},
-			},
-			map[string]interface{}{
-				"match": map[string]interface{}{
-					keywordNameKey: keywordStr,
-					//"Frequency.keyword": "月度",
-				},
-			},
-		},
-	}
-
-	//mustMap = append(mustMap, map[string]interface{}{
-	//	"bool": shouldMap,
-	//})
-
-	return searchEdbInfoData(indexName, mustMap, mustNotMap, shouldMap, from, size)
-}
-
-func SearchEdbInfoDataBak(indexName, keywordStr string, from, size, filterSource, source int, frequency string) (total int64, list []*data_manage.EdbInfoList, err error) {
-	list = make([]*data_manage.EdbInfoList, 0)
-	defer func() {
-		if err != nil {
-			fmt.Println("EsAddOrEditData Err:", err.Error())
-		}
-
-		for _, v := range list {
-			v.ConvertToResp()
-		}
-	}()
-	client := utils.EsClient
-
-	//queryString := elastic.NewQueryStringQuery(keywordStr)
-	//boolQueryJson, err := json.Marshal(queryString)
-	//if err != nil {
-	//	fmt.Println("boolQueryJson err:", err)
-	//} else {
-	//	fmt.Println("boolQueryJson ", string(boolQueryJson))
-	//}
-
-	highlight := elastic.NewHighlight()
-	highlight = highlight.Fields(elastic.NewHighlighterField("EdbCode"), elastic.NewHighlighterField("EdbName"))
-	highlight = highlight.PreTags("<font color='red'>").PostTags("</font>")
-
-	//query := elastic.RawStringQuery(`{"match_all":{}}`)
-
-	//var source map[string]interface{}
-	//source := map[string]interface{}{
-	//	"query": map[string]interface{}{
-	//		"match_all": map[string]interface{}{},
-	//	},
-	//}
-	mustMap := make([]interface{}, 0)
-	mustNotMap := make([]interface{}, 0)
-
-	//source := map[string]interface{}{
-	//	"query": map[string]interface{}{
-	//		"bool": map[string]interface{}{
-	//			"must": map[string]interface{}{
-	//				"query_string": map[string]interface{}{
-	//					"query":  keywordStr,
-	//					"fields": []string{"EdbCode", "EdbName"},
-	//				},
-	//			},
-	//		},
-	//	},
-	//}
-
-	switch filterSource {
-	case 2:
-		//source = map[string]interface{}{
-		//	"query": map[string]interface{}{
-		//		"bool": map[string]interface{}{
-		//			"must": map[string]interface{}{
-		//				"query_string": map[string]interface{}{
-		//					"query": keywordStr,
-		//				},
-		//			},
-		//			"filter": []interface{}{
-		//				map[string]interface{}{
-		//					"term": map[string]interface{}{
-		//						"Frequency.keyword": "月度",
-		//					},
-		//				}},
-		//		},
-		//	},
-		//}
-		mustMap = []interface{}{
-			map[string]interface{}{
-				"term": map[string]interface{}{
-					"Frequency.keyword": "月度",
-					//"Frequency.keyword": "月度",
-				},
-			},
-		}
 	case 3:
-		//source = map[string]interface{}{
-		//	"query": map[string]interface{}{
-		//		"bool": map[string]interface{}{
-		//			"must": map[string]interface{}{
-		//				"query_string": map[string]interface{}{
-		//					"query": keywordStr,
-		//				},
-		//			},
-		//			"must_not": []interface{}{
-		//				map[string]interface{}{
-		//					"match": map[string]interface{}{
-		//						"Frequency.keyword": "日度",
-		//					},
-		//				}},
-		//		},
-		//	},
-		//}
-
-		////注释掉,所有频度都可以变频 2022-08-31 14:31:28
-		//mustNotMap = []interface{}{
-		//	map[string]interface{}{
-		//		"match": map[string]interface{}{
-		//			"Frequency.keyword": "日度",
-		//			//"Frequency.keyword": "月度",
-		//		},
-		//	},
-		//}
 	case 4:
-		//source = map[string]interface{}{
-		//	"query": map[string]interface{}{
-		//		"bool": map[string]interface{}{
-		//			"must": map[string]interface{}{
-		//				"query_string": map[string]interface{}{
-		//					"query": keywordStr,
-		//				},
-		//			},
-		//			"filter": []interface{}{
-		//				map[string]interface{}{
-		//					"term": map[string]interface{}{
-		//						"EdbType": 1,
-		//					},
-		//				}},
-		//		},
-		//	},
-		//}
-		mustMap = []interface{}{
-			map[string]interface{}{
-				"term": map[string]interface{}{
-					"EdbType": 1,
-				},
-			},
-		}
-	case 5:
-		mustMap = []interface{}{
-			map[string]interface{}{
-				"term": map[string]interface{}{
-					"Source": 6,
-				},
-			},
-		}
-	case 6:
-		mustNotMap = []interface{}{
-			map[string]interface{}{
-				"match": map[string]interface{}{
-					"Frequency.keyword": "年度",
-				},
-			},
-		}
-	}
-
-	//指标来源
-	if source > 0 {
 		mustMap = append(mustMap, map[string]interface{}{
 			"term": map[string]interface{}{
-				"Source": source,
-				//"Frequency.keyword": "月度",
-			},
-		})
-	}
-
-	if frequency != "" {
-		mustMap = append(mustMap, map[string]interface{}{
-			"term": map[string]interface{}{
-				"Frequency.keyword": frequency,
-				//"Frequency.keyword": "月度",
-			},
-		})
-	}
-
-	//普通指标
-	//mustMap = append(mustMap, map[string]interface{}{
-	//	"term": map[string]interface{}{
-	//		"EdbInfoType": 0,
-	//		//"Frequency.keyword": "月度",
-	//	},
-	//})
-
-	//关键字匹配
-	shouldMap := map[string]interface{}{
-		"should": []interface{}{
-			map[string]interface{}{
-				"match": map[string]interface{}{
-					"EdbCode": keywordStr,
-					//"Frequency.keyword": "月度",
-				},
-			},
-			map[string]interface{}{
-				"match": map[string]interface{}{
-					"EdbName": keywordStr,
-					//"Frequency.keyword": "月度",
-				},
-			},
-
-			// 因为关键词被分了,所以需要用下面的语句来让他 整个词 查询,从而加重整词的权重
-			map[string]interface{}{
-				"match": map[string]interface{}{
-					"EdbCode": map[string]interface{}{
-						"query":    keywordStr,
-						"operator": "and",
-					},
-					//"Frequency.keyword": "月度",
-				},
-			},
-
-			// 因为关键词被分了,所以需要用下面的语句来让他 整个词 查询,从而加重整词的权重
-			map[string]interface{}{
-				"match": map[string]interface{}{
-					"EdbName": map[string]interface{}{
-						"query":    keywordStr,
-						"operator": "and",
-					},
-					//"Frequency.keyword": "月度",
-				},
-			},
-		},
-	}
-	mustMap = append(mustMap, map[string]interface{}{
-		"bool": shouldMap,
-	})
-
-	queryMap := map[string]interface{}{
-		"query": map[string]interface{}{
-			"bool": map[string]interface{}{
-				"must":     mustMap,
-				"must_not": mustNotMap,
-				//"should":   shouldMap,
-			},
-		},
-	}
-
-	//根据条件数量统计
-	requestTotalHits := client.Count(indexName).BodyJson(queryMap)
-	total, err = requestTotalHits.Do(context.Background())
-	if err != nil {
-		return
-	}
-
-	queryMap["from"] = from
-	queryMap["size"] = size
-	jsonBytes, _ := json.Marshal(queryMap)
-	fmt.Println(string(jsonBytes))
-
-	//queryStr := fmt.Sprintf(`{"query":{"bool":{"must":{"query_string":{"query":"%s","fields":["EdbCode","EdbName"]}}}}}`, keywordStr)
-	//switch filterSource {
-	//case 2:
-	//	queryStr = fmt.Sprintf(`{"query":{"bool":{"must":{"query_string":{"query":"%s","fields":["EdbCode","EdbName"]}},"filter":{"term":{"Frequency.keyword":"%s"}}}}}`, keywordStr, "月度")
-	//case 3:
-	//	queryStr = fmt.Sprintf(`{"query":{"bool":{"must":{"query_string":{"query":"%s","fields":["EdbCode","EdbName"]}},"must_not":[{"match":{"Frequency.keyword":"%s"}}]}}}`, keywordStr, "日度")
-	//case 4:
-	//	queryStr = fmt.Sprintf(`{"query":{"bool":{"must":{"query_string":{"query":"%s","fields":["EdbCode","EdbName"]}},"must_not":[{"match":{"EdbType":1}}]}}}`, keywordStr)
-	//}
-	//queryString := elastic.RawStringQuery(queryStr)
-	//fmt.Println("queryString:", queryString)
-
-	//queryString := elastic.NewMatchQuery("EdbCode", keywordStr)
-	//request := client.Search(indexName).Highlight(highlight).From(from).Size(size).Query(queryString)
-
-	request := client.Search(indexName).Highlight(highlight).Source(queryMap) // sets the JSON request
-
-	//requestJson, err := json.Marshal(request)
-	//if err != nil {
-	//	fmt.Println("requestJson err:", err)
-	//}
-	//fmt.Println("requestJson ", string(requestJson))
-	searchMap := make(map[string]string)
-
-	searchResp, err := request.Do(context.Background())
-	if err != nil {
-		return
-	}
-	fmt.Println(searchResp)
-	fmt.Println(searchResp.Status)
-	if searchResp.Status != 0 {
-		return
-	}
-	if searchResp.Hits != nil {
-		for _, v := range searchResp.Hits.Hits {
-			if _, ok := searchMap[v.Id]; !ok {
-				itemJson, tmpErr := v.Source.MarshalJSON()
-				if tmpErr != nil {
-					err = tmpErr
-					fmt.Println("movieJson err:", err)
-					return
-				}
-				edbInfoItem := new(data_manage.EdbInfoList)
-				tmpErr = json.Unmarshal(itemJson, &edbInfoItem)
-				if tmpErr != nil {
-					fmt.Println("json.Unmarshal movieJson err:", tmpErr)
-					err = tmpErr
-					return
-				}
-				if len(v.Highlight["EdbCode"]) > 0 {
-					edbInfoItem.EdbCode = v.Highlight["EdbCode"][0]
-				}
-				if len(v.Highlight["EdbName"]) > 0 {
-					edbInfoItem.EdbCode = v.Highlight["EdbName"][0]
-				}
-				list = append(list, edbInfoItem)
-				searchMap[v.Id] = v.Id
-			}
-		}
-	}
-
-	//for _, v := range result {
-	//	fmt.Println(v)
-	//}
-	return
-}
-
-// SearchAddPredictEdbInfoData 查询允许添加预测指标的数据
-func SearchAddPredictEdbInfoData(indexName, keywordStr string, noPermissionEdbInfoIdList, noPermissionEdbClassifyIdList []int, from, size, edbType int) (total int64, list []*data_manage.EdbInfoList, err error) {
-	list = make([]*data_manage.EdbInfoList, 0)
-	defer func() {
-		if err != nil {
-			fmt.Println("EsAddOrEditData Err:", err.Error())
-		}
-
-		for _, v := range list {
-			v.ConvertToResp()
-		}
-	}()
-
-	highlight := elastic.NewHighlight()
-	highlight = highlight.Fields(elastic.NewHighlighterField("EdbCode"), elastic.NewHighlighterField("EdbName"))
-	highlight = highlight.PreTags("<font color='red'>").PostTags("</font>")
-
-	mustMap := make([]interface{}, 0)
-	mustNotMap := make([]interface{}, 0)
-
-	mustNotMap = []interface{}{
-		//map[string]interface{}{
-		//	"terms": map[string]interface{}{
-		//		"Frequency.keyword": []string{"日度", "周度", "月度"},
-		//	},
-		//	//"match": map[string]interface{}{
-		//	//	"Frequency": []string{"日度", "周度", "月度"},
-		//	//	//"Frequency.keyword": []string{"日度", "周度", "月度"},
-		//	//},
-		//},
+				"EdbType": 1,
+			},
+		})
+	case 5:
+		mustMap = append(mustMap, map[string]interface{}{
+			"term": map[string]interface{}{
+				"Source": 6,
+			},
+		})
+	case 6:
+		mustMap = append(mustMap, map[string]interface{}{
+			"match": map[string]interface{}{
+				"Frequency.keyword": "年度",
+			},
+		})
 	}
 
-	// 指标类型:普通指标、预算指标
-	mustMap = append(mustMap, map[string]interface{}{
-		"term": map[string]interface{}{
-			"EdbInfoType": 0,
-		},
-	})
-	mustMap = append(mustMap, map[string]interface{}{
-		"terms": map[string]interface{}{
-			"Frequency.keyword": []string{"日度", "周度", "月度"},
-		},
-	})
-
-	// 指标类型: 1-基础指标; 2-计算指标
-	if edbType > 0 {
+	//指标来源
+	if source > 0 {
 		mustMap = append(mustMap, map[string]interface{}{
 			"term": map[string]interface{}{
-				"EdbType": edbType,
+				"Source": source,
+				//"Frequency.keyword": "月度",
 			},
 		})
 	}
 
-	//关键字匹配
-	//shouldMap := map[string]interface{}{
-	//	"should": []interface{}{
-	//		map[string]interface{}{
-	//			"match": map[string]interface{}{
-	//				"EdbCode": keywordStr,
-	//				//"Frequency.keyword": "月度",
-	//			},
-	//		},
-	//		map[string]interface{}{
-	//			"match": map[string]interface{}{
-	//				"EdbName": keywordStr,
-	//				//"Frequency.keyword": "月度",
-	//			},
-	//		},
-	//		map[string]interface{}{
-	//			"match": map[string]interface{}{
-	//				"EdbNameEn": keywordStr,
-	//				//"Frequency.keyword": "月度",
-	//			},
-	//		},
-	//	},
-	//}
-
-	// 默认使用中文名字字段去匹配
-	keywordNameKey := `EdbName`
-	// 如果没有中文,则使用英文名称字段去匹配
-	if !utils.ContainsChinese(keywordStr) {
-		keywordNameKey = `EdbNameEn`
-	}
-	shouldMap := map[string]interface{}{
-		"should": []interface{}{
-			map[string]interface{}{
-				"match": map[string]interface{}{
-					"EdbCode": keywordStr,
-					//"Frequency.keyword": "月度",
-				},
-			},
-			map[string]interface{}{
-				"match": map[string]interface{}{
-					keywordNameKey: keywordStr,
-					//"Frequency.keyword": "月度",
-				},
+	if frequency != "" {
+		mustMap = append(mustMap, map[string]interface{}{
+			"term": map[string]interface{}{
+				"Frequency.keyword": frequency,
+				//"Frequency.keyword": "月度",
 			},
-		},
+		})
 	}
 
 	// noPermissionEdbInfoIdList 无权限指标id
@@ -754,7 +203,7 @@ func SearchAddPredictEdbInfoData(indexName, keywordStr string, noPermissionEdbIn
 		})
 	}
 
-	// noPermissionEdbClassifyIdList 无权限指标分类id
+	// noPermissionEdbInfoIdList 无权限指标id
 	if len(noPermissionEdbClassifyIdList) > 0 {
 		mustNotMap = append(mustNotMap, map[string]interface{}{
 			"terms": map[string]interface{}{
@@ -764,11 +213,127 @@ func SearchAddPredictEdbInfoData(indexName, keywordStr string, noPermissionEdbIn
 		})
 	}
 
-	return searchEdbInfoData(indexName, mustMap, mustNotMap, shouldMap, from, size)
+	// collectEdbInfoIdList 收藏的指标id
+	if len(collectEdbInfoIdList) > 0 {
+		mustMap = append(mustMap, map[string]interface{}{
+			"terms": map[string]interface{}{
+				"EdbInfoId": collectEdbInfoIdList,
+			},
+		})
+	}
+
+	// 指标类型:0-基础+计算;1-基础指标;2-计算指标;3-预测指标
+	if len(edbTypeList) > 0 {
+		mustMap = append(mustMap, map[string]interface{}{
+			"terms": map[string]interface{}{
+				"EdbType": edbTypeList,
+			},
+		})
+	}
+
+	if edbInfoType >= 0 {
+		mustMap = append(mustMap, map[string]interface{}{
+			"term": map[string]interface{}{
+				"EdbInfoType": edbInfoType,
+			},
+		})
+	}
+
+	shouldMapList := make([]map[string]interface{}, 0)
+
+	// 指标名称、编码匹配
+	if keywordStr != `` {
+		// 默认使用中文名字字段去匹配
+		keywordNameKey := `EdbName`
+		shouldMap := map[string]interface{}{
+			"should": []interface{}{
+				map[string]interface{}{
+					"match": map[string]interface{}{
+						"EdbCode": keywordStr,
+						//"Frequency.keyword": "月度",
+					},
+				},
+				map[string]interface{}{
+					"match": map[string]interface{}{
+						keywordNameKey: keywordStr,
+						//"Frequency.keyword": "月度",
+					},
+				},
+			},
+		}
+		shouldMapList = append(shouldMapList, shouldMap)
+	}
+
+	// 指标与用户的权限匹配
+	{
+		shouldTermList := make([]map[string]interface{}, 0)
+		//指标权限范围,0-全部;1-我的;2-公共
+		switch edbAuth {
+		case 1:
+			// 自己的指标
+			shouldTermList = append(shouldTermList, map[string]interface{}{
+				"term": map[string]interface{}{
+					"SysUserId": sysUserId,
+				},
+			})
+		case 2:
+			// 公开的指标
+			shouldTermList = append(shouldTermList, map[string]interface{}{
+				"term": map[string]interface{}{
+					"PublicStatus": 3,
+				},
+			})
+		default:
+			// 自己的指标
+			shouldTermList = append(shouldTermList, map[string]interface{}{
+				"term": map[string]interface{}{
+					"SysUserId": sysUserId,
+				},
+			})
+			// 分享给我的指标
+			shouldTermList = append(shouldTermList, map[string]interface{}{
+				"terms": map[string]interface{}{
+					"SharedUserIdList": []int{sysUserId},
+				},
+			})
+			// 公开的指标
+			//shouldTermList = append(shouldTermList,map[string]interface{}{
+			//	"term": map[string]interface{}{
+			//		"PublicStatus": 2,
+			//	},
+			//})
+
+		}
+		// 公开的指标
+		//shouldTermList = append(shouldTermList,map[string]interface{}{
+		//	"term": map[string]interface{}{
+		//		"PublicStatus": 2,
+		//	},
+		//})
+
+		shouldMap := map[string]interface{}{
+			"should": shouldTermList,
+		}
+		shouldMapList = append(shouldMapList, shouldMap)
+	}
+
+	// 排序
+	sortList := make([]interface{}, 0)
+	// 如果没有关键字,那么就走指标id倒序
+	if keywordStr == `` {
+		sortEdbInfoId := map[string]interface{}{
+			"EdbInfoId": map[string]interface{}{
+				"order": "desc",
+			},
+		}
+		sortList = append(sortList, sortEdbInfoId)
+	}
+
+	return searchEdbInfoData(indexName, mustMap, mustNotMap, shouldMapList, sortList, from, size)
 }
 
 // searchEdbInfoData 查询es中的指标数据
-func searchEdbInfoData(indexName string, mustMap, mustNotMap []interface{}, shouldMap map[string]interface{}, from, size int) (total int64, list []*data_manage.EdbInfoList, err error) {
+func searchEdbInfoData(indexName string, mustMap, mustNotMap []interface{}, shouldMapList []map[string]interface{}, sortList []interface{}, from, size int) (total int64, list []*data_manage.EdbInfoList, err error) {
 	list = make([]*data_manage.EdbInfoList, 0)
 	defer func() {
 		if err != nil {
@@ -792,9 +357,11 @@ func searchEdbInfoData(indexName string, mustMap, mustNotMap []interface{}, shou
 	//query := elastic.RawStringQuery(`{"match_all":{}}`)
 
 	//关键字匹配
-	mustMap = append(mustMap, map[string]interface{}{
-		"bool": shouldMap,
-	})
+	for _, shouldMap := range shouldMapList {
+		mustMap = append(mustMap, map[string]interface{}{
+			"bool": shouldMap,
+		})
+	}
 
 	queryMap := map[string]interface{}{
 		"query": map[string]interface{}{
@@ -815,21 +382,15 @@ func searchEdbInfoData(indexName string, mustMap, mustNotMap []interface{}, shou
 
 	queryMap["from"] = from
 	queryMap["size"] = size
+
+	// 如果有指定排序,那么就按照排序来
+	if len(sortList) > 0 {
+		queryMap["sort"] = sortList
+	}
+
 	jsonBytes, _ := json.Marshal(queryMap)
 	fmt.Println(string(jsonBytes))
 
-	//queryStr := fmt.Sprintf(`{"query":{"bool":{"must":{"query_string":{"query":"%s","fields":["EdbCode","EdbName"]}}}}}`, keywordStr)
-	//switch filterSource {
-	//case 2:
-	//	queryStr = fmt.Sprintf(`{"query":{"bool":{"must":{"query_string":{"query":"%s","fields":["EdbCode","EdbName"]}},"filter":{"term":{"Frequency.keyword":"%s"}}}}}`, keywordStr, "月度")
-	//case 3:
-	//	queryStr = fmt.Sprintf(`{"query":{"bool":{"must":{"query_string":{"query":"%s","fields":["EdbCode","EdbName"]}},"must_not":[{"match":{"Frequency.keyword":"%s"}}]}}}`, keywordStr, "日度")
-	//case 4:
-	//	queryStr = fmt.Sprintf(`{"query":{"bool":{"must":{"query_string":{"query":"%s","fields":["EdbCode","EdbName"]}},"must_not":[{"match":{"EdbType":1}}]}}}`, keywordStr)
-	//}
-	//queryString := elastic.RawStringQuery(queryStr)
-	//fmt.Println("queryString:", queryString)
-
 	//queryString := elastic.NewMatchQuery("EdbCode", keywordStr)
 	//request := client.Search(indexName).Highlight(highlight).From(from).Size(size).Query(queryString)
 
@@ -1461,230 +1022,3 @@ func SearchMyChartInfoData(indexName, keywordStr string, adminId int, noPermissi
 	//}
 	return
 }
-
-// SearchEdbInfoDataByAdminId 查询es中的指标数据
-func SearchEdbInfoDataByAdminId(indexName, keywordStr string, from, size, filterSource, source int, edbInfoType uint8, frequency string, adminId int) (total int64, list []*data_manage.EdbInfoList, err error) {
-	list = make([]*data_manage.EdbInfoList, 0)
-	defer func() {
-		if err != nil {
-			fmt.Println("EsAddOrEditData Err:", err.Error())
-		}
-		for _, v := range list {
-			v.ConvertToResp()
-		}
-	}()
-
-	highlight := elastic.NewHighlight()
-	highlight = highlight.Fields(elastic.NewHighlighterField("EdbCode"), elastic.NewHighlighterField("EdbName"))
-	highlight = highlight.PreTags("<font color='red'>").PostTags("</font>")
-
-	//var source map[string]interface{}
-	//source := map[string]interface{}{
-	//	"query": map[string]interface{}{
-	//		"match_all": map[string]interface{}{},
-	//	},
-	//}
-	mustMap := make([]interface{}, 0)
-	mustNotMap := make([]interface{}, 0)
-
-	//source := map[string]interface{}{
-	//	"query": map[string]interface{}{
-	//		"bool": map[string]interface{}{
-	//			"must": map[string]interface{}{
-	//				"query_string": map[string]interface{}{
-	//					"query":  keywordStr,
-	//					"fields": []string{"EdbCode", "EdbName"},
-	//				},
-	//			},
-	//		},
-	//	},
-	//}
-
-	switch filterSource {
-	case 2:
-		//source = map[string]interface{}{
-		//	"query": map[string]interface{}{
-		//		"bool": map[string]interface{}{
-		//			"must": map[string]interface{}{
-		//				"query_string": map[string]interface{}{
-		//					"query": keywordStr,
-		//				},
-		//			},
-		//			"filter": []interface{}{
-		//				map[string]interface{}{
-		//					"term": map[string]interface{}{
-		//						"Frequency.keyword": "月度",
-		//					},
-		//				}},
-		//		},
-		//	},
-		//}
-		mustMap = []interface{}{
-			map[string]interface{}{
-				"term": map[string]interface{}{
-					"Frequency.keyword": "月度",
-					//"Frequency.keyword": "月度",
-				},
-			},
-		}
-	case 3:
-		//source = map[string]interface{}{
-		//	"query": map[string]interface{}{
-		//		"bool": map[string]interface{}{
-		//			"must": map[string]interface{}{
-		//				"query_string": map[string]interface{}{
-		//					"query": keywordStr,
-		//				},
-		//			},
-		//			"must_not": []interface{}{
-		//				map[string]interface{}{
-		//					"match": map[string]interface{}{
-		//						"Frequency.keyword": "日度",
-		//					},
-		//				}},
-		//		},
-		//	},
-		//}
-
-		////注释掉,所有频度都可以变频 2022-08-31 14:31:28
-		//mustNotMap = []interface{}{
-		//	map[string]interface{}{
-		//		"match": map[string]interface{}{
-		//			"Frequency.keyword": "日度",
-		//			//"Frequency.keyword": "月度",
-		//		},
-		//	},
-		//}
-	case 4:
-		//source = map[string]interface{}{
-		//	"query": map[string]interface{}{
-		//		"bool": map[string]interface{}{
-		//			"must": map[string]interface{}{
-		//				"query_string": map[string]interface{}{
-		//					"query": keywordStr,
-		//				},
-		//			},
-		//			"filter": []interface{}{
-		//				map[string]interface{}{
-		//					"term": map[string]interface{}{
-		//						"EdbType": 1,
-		//					},
-		//				}},
-		//		},
-		//	},
-		//}
-		mustMap = []interface{}{
-			map[string]interface{}{
-				"term": map[string]interface{}{
-					"EdbType": 1,
-				},
-			},
-		}
-	case 5:
-		mustMap = []interface{}{
-			map[string]interface{}{
-				"term": map[string]interface{}{
-					"Source": 6,
-				},
-			},
-		}
-	case 6:
-		mustNotMap = []interface{}{
-			map[string]interface{}{
-				"match": map[string]interface{}{
-					"Frequency.keyword": "年度",
-				},
-			},
-		}
-	}
-
-	//指标来源
-	if source > 0 {
-		mustMap = append(mustMap, map[string]interface{}{
-			"term": map[string]interface{}{
-				"Source": source,
-				//"Frequency.keyword": "月度",
-			},
-		})
-	}
-
-	if frequency != "" {
-		mustMap = append(mustMap, map[string]interface{}{
-			"term": map[string]interface{}{
-				"Frequency.keyword": frequency,
-				//"Frequency.keyword": "月度",
-			},
-		})
-	}
-
-	// 指标类型:普通指标、预算指标
-	mustMap = append(mustMap, map[string]interface{}{
-		"term": map[string]interface{}{
-			"EdbInfoType": edbInfoType,
-		},
-	})
-
-	//普通指标
-	//mustMap = append(mustMap, map[string]interface{}{
-	//	"term": map[string]interface{}{
-	//		"EdbInfoType": 0,
-	//		//"Frequency.keyword": "月度",
-	//	},
-	//})
-
-	//关键字匹配
-	//shouldMap := map[string]interface{}{
-	//	"should": []interface{}{
-	//		map[string]interface{}{
-	//			"match": map[string]interface{}{
-	//				"EdbCode": keywordStr,
-	//				//"Frequency.keyword": "月度",
-	//			},
-	//		},
-	//		map[string]interface{}{
-	//			"match": map[string]interface{}{
-	//				"EdbName": keywordStr,
-	//				//"Frequency.keyword": "月度",
-	//			},
-	//		},
-	//	},
-	//}
-
-	// 默认使用中文名字字段去匹配
-	keywordNameKey := `EdbName`
-	// 如果没有中文,则使用英文名称字段去匹配
-	if !utils.ContainsChinese(keywordStr) {
-		keywordNameKey = `EdbNameEn`
-	}
-	shouldMap := map[string]interface{}{
-		"should": []interface{}{
-			map[string]interface{}{
-				"match": map[string]interface{}{
-					"EdbCode": keywordStr,
-					//"Frequency.keyword": "月度",
-				},
-			},
-			map[string]interface{}{
-				"match": map[string]interface{}{
-					keywordNameKey: keywordStr,
-					//"Frequency.keyword": "月度",
-				},
-			},
-		},
-	}
-
-	mustMap = append(mustMap, map[string]interface{}{
-		"bool": shouldMap,
-	})
-
-	//创建人
-	if adminId > 0 {
-		mustMap = append(mustMap, map[string]interface{}{
-			"term": map[string]interface{}{
-				"SysUserId": adminId,
-			},
-		})
-	}
-
-	return searchEdbInfoData(indexName, mustMap, mustNotMap, shouldMap, from, size)
-}

+ 221 - 0
services/knowledge/es.go

@@ -0,0 +1,221 @@
+package knowledge
+
+import (
+	"context"
+	"encoding/json"
+	"eta_gn/eta_api/models/knowledge"
+	"eta_gn/eta_api/utils"
+	"fmt"
+	"html"
+	"strconv"
+	"strings"
+
+	"github.com/PuerkitoBio/goquery"
+)
+
+// SearchChartInfoData 查询es中的图表数据
+func SearchKnowledgeResourceByEs(resourceType int, keywordStr string, showSysIds []int, myId int, classifyIds []int, sourceList []string, tagIds []int, isIncludeFile bool, from, size int) (list []*knowledge.KnowledgeResource, total int64, err error) {
+	indexName := utils.EsKnowledgeResourceIndexName
+	list = make([]*knowledge.KnowledgeResource, 0)
+	defer func() {
+		if err != nil {
+			fmt.Println("SearchKnowledgeResource Err:", err.Error())
+			utils.FileLog.Info("SearchKnowledgeResource Err:", err.Error())
+		}
+	}()
+	client := utils.EsClient
+
+	mustMap := make([]interface{}, 0)
+
+	mustMap = append(mustMap, map[string]interface{}{
+		"term": map[string]interface{}{
+			"ResourceType": resourceType,
+		},
+	})
+
+	//指标来源
+	if len(showSysIds) > 0 {
+		mustMap = append(mustMap, map[string]interface{}{
+			"terms": map[string]interface{}{
+				"AdminId": showSysIds,
+			},
+		})
+	}
+	if myId > 0 {
+		mustMap = append(mustMap, map[string]interface{}{
+			"term": map[string]interface{}{
+				"AdminId": myId,
+			},
+		})
+	}
+	if len(tagIds) > 0 {
+		mustMap = append(mustMap, map[string]interface{}{
+			"terms": map[string]interface{}{
+				"TagId": tagIds,
+			},
+		})
+	}
+	if len(sourceList) > 0 {
+		mustMap = append(mustMap, map[string]interface{}{
+			"terms": map[string]interface{}{
+				"SourceFrom": sourceList,
+			},
+		})
+	}
+	if len(classifyIds) > 0 {
+		mustMap = append(mustMap, map[string]interface{}{
+			"terms": map[string]interface{}{
+				"ClassifyId": classifyIds,
+			},
+		})
+	}
+
+	mustMap = append(mustMap, map[string]interface{}{
+		"term": map[string]interface{}{
+			"IsDelete": 0,
+		},
+	})
+	if !isIncludeFile {
+		mustMap = append(mustMap, map[string]interface{}{
+			"term": map[string]interface{}{
+				"IsFile": 0,
+			},
+		})
+	}
+
+	if keywordStr != "" {
+		shouldMap := map[string]interface{}{
+			"should": []interface{}{
+				map[string]interface{}{
+					"match": map[string]interface{}{
+						"Title": keywordStr,
+					},
+				},
+				// 因为关键词被分了,所以需要用下面的语句来让他 整个词 查询,从而加重整词的权重
+				map[string]interface{}{
+					"match": map[string]interface{}{
+						"Title": map[string]interface{}{
+							"query":    keywordStr,
+							"operator": "and",
+						},
+					},
+				},
+			},
+		}
+		mustMap = append(mustMap, map[string]interface{}{
+			"bool": shouldMap,
+		})
+	}
+
+	queryMap := map[string]interface{}{
+		"query": map[string]interface{}{
+			"bool": map[string]interface{}{
+				"must": mustMap,
+			},
+		},
+	}
+
+	//根据条件数量统计
+	requestTotalHits := client.Count(indexName).BodyJson(queryMap)
+	total, err = requestTotalHits.Do(context.Background())
+	if err != nil {
+		return
+	}
+
+	// 分页查询
+	queryMap["from"] = from
+	queryMap["size"] = size
+
+	if keywordStr == "" {
+		sortMap := []map[string]interface{}{
+			{
+				"StartTime.keyword": map[string]interface{}{
+					"order": "desc", // 按照开始时间倒序排列
+				},
+			},
+		}
+		queryMap["sort"] = sortMap
+
+	}
+
+	request := client.Search(indexName).Source(queryMap) // sets the JSON request
+	searchMap := make(map[string]string)
+
+	searchResp, err := request.Do(context.Background())
+	if err != nil {
+		return
+	}
+	if searchResp.Status != 0 {
+		jsonBytes, _ := json.Marshal(queryMap)
+		utils.FileLog.Info("search json:%s,SearchKnowledgeResourceByEs Status:%d", string(jsonBytes), searchResp.Status)
+		return
+	}
+
+	if searchResp.Hits != nil {
+		for _, v := range searchResp.Hits.Hits {
+			if _, ok := searchMap[v.Id]; !ok {
+				itemJson, tmpErr := v.Source.MarshalJSON()
+				if tmpErr != nil {
+					err = tmpErr
+					utils.FileLog.Info("search json:%s,SearchKnowledgeResourceByEs Hits Source err:%s", string(itemJson), tmpErr.Error())
+					return
+				}
+				knowledgeItem := new(knowledge.KnowledgeResource)
+				tmpErr = json.Unmarshal(itemJson, &knowledgeItem)
+				if err != nil {
+					utils.FileLog.Info("json.Unmarshal KnowledgeResource err:%s", err.Error())
+					err = tmpErr
+					return
+				}
+				list = append(list, knowledgeItem)
+				searchMap[v.Id] = v.Id
+			}
+		}
+	}
+	return
+}
+
+func ExtractTextFromResourceContent(content string) (text string) {
+	content = html.UnescapeString(content)
+	doc, err := goquery.NewDocumentFromReader(strings.NewReader(content))
+	if err != nil {
+		return
+	}
+	text = doc.Text()
+	text = strings.ReplaceAll(text, "\n", "")
+	return
+}
+
+// EsAddOrEditKnowledgeResource 新增/修改es中的知识资源数据
+func EsAddOrEditKnowledgeResource(item *knowledge.KnowledgeResource) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("EsAddOrEditData Err:", err.Error())
+			utils.FileLog.Info("EsAddOrEditKnowledgeResource err:", err)
+		}
+	}()
+	indexName := utils.EsKnowledgeResourceIndexName
+	client := utils.EsClient
+	if item.IsFile == 0 {
+		content := ExtractTextFromResourceContent(item.Content)
+		contentRunes := []rune(content)
+		if len(contentRunes) > 60 {
+			item.Content = string(contentRunes[:60])
+		} else {
+			item.Content = content
+		}
+	}
+	request := client.Index().Index(indexName).Id(strconv.Itoa(item.KnowledgeResourceId)).BodyJson(item)
+	response, err := request.Do(context.Background())
+	if err != nil {
+		jsonBytes, _ := json.Marshal(item)
+		utils.FileLog.Info("add json:%s,EsAddOrEditKnowledgeResource err:%s", string(jsonBytes), err.Error())
+		return
+	}
+	if response.Status == 0 {
+		err = nil
+	} else {
+		fmt.Println("EsAddOrEditKnowledgeResource:", response.Status, response.Result)
+	}
+	return
+}

+ 134 - 2
services/knowledge/resource.go

@@ -1,6 +1,7 @@
 package knowledge
 
 import (
+	"encoding/json"
 	"errors"
 	"eta_gn/eta_api/models/knowledge"
 	"eta_gn/eta_api/models/system"
@@ -8,11 +9,14 @@ import (
 	"eta_gn/eta_api/services/alarm_msg"
 	"eta_gn/eta_api/utils"
 	"fmt"
-	"github.com/tealeg/xlsx"
 	"html"
 	"strconv"
 	"strings"
 	"time"
+
+	"github.com/go-redis/redis/v8"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/tealeg/xlsx"
 )
 
 func AddResource(req *knowledge.AddReq, sysUser *system.Admin) (item *knowledge.KnowledgeResource, err error, errMsg string) {
@@ -148,9 +152,11 @@ func AddResource(req *knowledge.AddReq, sysUser *system.Admin) (item *knowledge.
 		err = fmt.Errorf("保存失败,Err:" + err.Error())
 		return
 	}
-	//todo 是否需要保存到es中
+	// 保存到es中
+	go EsAddOrEditKnowledgeResource(item)
 	return
 }
+
 func EditResource(resourceInfo *knowledge.KnowledgeResource, req knowledge.EditReq, sysUser *system.Admin) (err error, errMsg string) {
 	errMsg = `保存失败`
 	var startTime time.Time
@@ -274,6 +280,7 @@ func EditResource(resourceInfo *knowledge.KnowledgeResource, req knowledge.EditR
 	if err != nil {
 		return
 	}
+	go EsAddOrEditKnowledgeResource(resourceInfo)
 	return
 }
 
@@ -1053,3 +1060,128 @@ func addExcelResource(req *knowledge.AddReq, sysUser *system.Admin) (err error,
 	//todo 是否需要保存到es中
 	return
 }
+
+func GetKnowledgeResourceTmpList(dashboardDetailId, adminId int) (resp *knowledge.BiDashboardResourceAddResp, msg string, err error) {
+	if dashboardDetailId <= 0 {
+		data, er := utils.Rc.RedisBytes(utils.CACHE_KEY_BI_DASHBOARD_PREPARE_RESOURCE + strconv.Itoa(adminId))
+		req := new(knowledge.BiDashboardResourceAddReq)
+		if er != nil {
+			if er == redis.Nil {
+				msg = "暂无知识库"
+				err = nil
+				return
+			}
+			msg = "获取知识库模板列表失败"
+			return
+		}
+		if err = json.Unmarshal(data, &req); err != nil {
+			msg = "获取知识库模板列表失败"
+		}
+
+		selectedIds := make([]int, 0)
+		for _, item := range req.KnowledgeResourceList {
+			selectedIds = append(selectedIds, item.KnowledgeResourceId)
+		}
+		knowledgeList, er := knowledge.GetKnowledgeResourceByIds(selectedIds)
+		if er != nil {
+			msg = "获取知识库模板列表失败"
+			return
+		}
+		resp = new(knowledge.BiDashboardResourceAddResp)
+		resp.KnowledgeResourceList = toKnowledgeResourceList(knowledgeList)
+	} else {
+		condition := ` AND bi_dashboard_detail_id = ? `
+		pars := []interface{}{dashboardDetailId}
+		resourceIds, er := knowledge.GetKnowledgeResourceIdsByCondition(condition, pars)
+		if er != nil {
+			msg = "获取知识库模板列表失败"
+			return
+		}
+		if len(resourceIds) == 0 {
+			msg = "暂无知识库"
+			return
+		}
+		resp = new(knowledge.BiDashboardResourceAddResp)
+		knowledgeList, er := knowledge.GetKnowledgeResourceByIds(resourceIds)
+		if er != nil {
+			msg = "获取知识库模板列表失败"
+			return
+		}
+		resp.BiDashboardDetailId = dashboardDetailId
+		resp.KnowledgeResourceList = toKnowledgeResourceList(knowledgeList)
+	}
+	return
+}
+
+func GetKnowledgeResourceList(dashboardDetailId int) (resp *knowledge.KnowledgeResourceListResp, msg string, err error) {
+	// var startSize int
+	// if pageSize <= 0 {
+	// 	pageSize = utils.PageSize20
+	// }
+	// if currentIndex <= 0 {
+	// 	currentIndex = 1
+	// }
+	// startSize = utils.StartIndex(currentIndex, pageSize)
+
+	condition := ` AND bi_dashboard_detail_id = ? `
+	var pars = []interface{}{dashboardDetailId}
+
+	resourceIds, err := knowledge.GetKnowledgeResourceIdsByCondition(condition, pars)
+	if err != nil {
+		msg = "获取知识库列表失败"
+		return
+	}
+	if len(resourceIds) == 0 {
+		resp = &knowledge.KnowledgeResourceListResp{
+			List:   make([]*knowledge.KnowledgeResourceList, 0),
+			Paging: &paging.PagingItem{},
+		}
+		return
+	}
+
+	knowledgeList, err := knowledge.GetKnowledgeResourceByIds(resourceIds)
+	if err != nil {
+		msg = "获取知识库列表失败"
+		return
+	}
+
+	resp = new(knowledge.KnowledgeResourceListResp)
+	resp.List = toKnowledgeResourceList(knowledgeList)
+
+	return
+}
+
+func toKnowledgeResourceList(list []*knowledge.KnowledgeResource) (res []*knowledge.KnowledgeResourceList) {
+	for _, item := range list {
+		resItem := &knowledge.KnowledgeResourceList{
+			KnowledgeResourceId: item.KnowledgeResourceId,
+			ResourceType:        item.ResourceType,
+			ClassifyId:          item.ClassifyId,
+			Title:               item.Title,
+			State:               item.State,
+			ResourceCode:        item.ResourceCode,
+			AdminId:             item.AdminId,
+			AdminRealName:       item.AdminRealName,
+			SourceFrom:          item.SourceFrom,
+			TagId:               item.TagId,
+			CreateTime:          utils.TimeTransferString(utils.FormatDateTime, item.CreateTime),
+			ModifyTime:          utils.TimeTransferString(utils.FormatDateTime, item.ModifyTime),
+		}
+		if item.StartTime != nil {
+			if item.ResourceType == knowledge.KnowledgeResourceTypeEvent || item.ResourceType == knowledge.KnowledgeResourceTypePolicy {
+				resItem.StartTime = utils.TimeTransferString(utils.FormatDateTime, *item.StartTime)
+			} else {
+				resItem.StartTime = utils.TimeTransferString(utils.FormatDate, *item.StartTime)
+			}
+		}
+		if item.EndTime != nil {
+			if item.ResourceType == knowledge.KnowledgeResourceTypeEvent || item.ResourceType == knowledge.KnowledgeResourceTypePolicy {
+				resItem.EndTime = utils.TimeTransferString(utils.FormatDateTime, *item.EndTime)
+			} else {
+				resItem.EndTime = utils.TimeTransferString(utils.FormatDate, *item.EndTime)
+			}
+		}
+		res = append(res, resItem)
+	}
+	return
+}

+ 2 - 0
utils/config.go

@@ -127,6 +127,7 @@ var (
 	MY_CHART_INDEX_NAME            string //研究图库(MY ETA)索引
 	EsSemanticAnalysisDocIndexName string //ES语义分析文档索引名
 	SmartReportIndexName           string //智能研报ES索引
+	EsKnowledgeResourceIndexName   string //ES知识库索引
 )
 
 var (
@@ -527,6 +528,7 @@ func init() {
 		EsEnglishReportIndexName = config["es_english_report_index_name"]
 		EsSemanticAnalysisDocIndexName = config["es_semantic_analysis_doc_index_name"]
 		SmartReportIndexName = config["es_smart_report_index_name"]
+		EsKnowledgeResourceIndexName = config["es_knowledge_resource_index_name"]
 	}
 
 	CrmEtaServerUrl = config["crm_eta_server_url"]

+ 2 - 1
utils/constants.go

@@ -214,7 +214,8 @@ const (
 
 	CACHE_EDB_TERMINAL_CODE_URL = "edb:terminal_code:edb_code:" // 指标与终端关系的缓存
 
-	CACHE_KEY_REPLACE_EDB = "eta:replace_edb" //系统用户操作日志队列
+	CACHE_KEY_REPLACE_EDB                   = "eta:replace_edb"                   //系统用户操作日志队列
+	CACHE_KEY_BI_DASHBOARD_PREPARE_RESOURCE = "eta:bi_dashboard:prepare_resource" // 准备引用到看板的知识资源
 )
 
 // 模板消息推送类型

部分文件因为文件数量过多而无法显示