Przeglądaj źródła

Merge branch 'dm' of http://8.136.199.33:3000/eta_gn_server/eta_api into dm

zqbao 5 miesięcy temu
rodzic
commit
cf8ad317dd
92 zmienionych plików z 2801 dodań i 356 usunięć
  1. 4 0
      controllers/base_auth.go
  2. 28 1
      controllers/bi_dashboard.go
  3. 5 2
      controllers/data_manage/chart_info.go
  4. 4 0
      controllers/data_manage/correlation/correlation_chart_info.go
  5. 2 2
      controllers/data_manage/data_manage_permission/data_manage_permission.go
  6. 4 4
      controllers/data_manage/data_manage_permission/data_move.go
  7. 138 18
      controllers/data_manage/edb_classify.go
  8. 352 0
      controllers/data_manage/edb_collect.go
  9. 455 0
      controllers/data_manage/edb_collect_classify.go
  10. 45 7
      controllers/data_manage/edb_info.go
  11. 8 2
      controllers/data_manage/edb_info_calculate.go
  12. 2 2
      controllers/data_manage/future_good/future_good_chart_info.go
  13. 2 2
      controllers/data_manage/future_good/future_good_profit_chart_info.go
  14. 4 4
      controllers/data_manage/line_feature/chart_info.go
  15. 14 9
      controllers/data_manage/multiple_graph_config.go
  16. 5 1
      controllers/data_manage/predict_edb_info.go
  17. 1 1
      controllers/data_manage/supply_analysis/variety.go
  18. 7 7
      controllers/data_manage/supply_analysis/variety_edb.go
  19. 123 44
      controllers/knowledge/classify.go
  20. 52 2
      controllers/knowledge/resource.go
  21. 10 1
      controllers/report.go
  22. 9 7
      controllers/report_approve/report_approve_flow.go
  23. 11 8
      controllers/report_chapter.go
  24. 1 1
      controllers/report_chapter_type.go
  25. 15 2
      controllers/report_v2.go
  26. 15 6
      controllers/sandbox/sandbox.go
  27. 1 1
      controllers/semantic_analysis/sa_compare.go
  28. 1 8
      controllers/voice.go
  29. 29 1
      global/dm.go
  30. 1 1
      models/ai_summary/ai_summary_classify.go
  31. 0 1
      models/bi_dashboard/bi_dashboard.go
  32. 4 2
      models/bi_dashboard/bi_dashboard_home_page.go
  33. 7 8
      models/data_manage/chart_info.go
  34. 2 1
      models/data_manage/chart_info_correlation.go
  35. 1 1
      models/data_manage/chart_info_range_analysis.go
  36. 16 0
      models/data_manage/chart_info_resp.go
  37. 12 2
      models/data_manage/edb_classify.go
  38. 226 0
      models/data_manage/edb_collect.go
  39. 249 0
      models/data_manage/edb_collect_classify.go
  40. 15 8
      models/data_manage/edb_data_insert_config.go
  41. 89 20
      models/data_manage/edb_info.go
  42. 3 2
      models/data_manage/edb_info_relation.go
  43. 97 0
      models/data_manage/edb_info_resp.go
  44. 1 1
      models/data_manage/multiple_graph_config.go
  45. 19 7
      models/data_manage/my_chart.go
  46. 2 3
      models/data_manage/predict_edb_conf.go
  47. 17 1
      models/data_manage/supply_analysis/variety.go
  48. 30 2
      models/data_manage/supply_analysis/variety_edb_info.go
  49. 2 2
      models/data_manage/trade_position_analysis.go
  50. 22 3
      models/knowledge/knowledge_classify.go
  51. 4 2
      models/ppt_v2_grant.go
  52. 89 51
      models/report.go
  53. 4 1
      models/report_approve/report_approve.go
  54. 4 3
      models/report_approve/report_approve_flow.go
  55. 1 1
      models/report_approve/report_approve_record.go
  56. 3 3
      models/report_chapter.go
  57. 9 0
      models/sandbox/sandbox_classify.go
  58. 1 0
      models/semantic_analysis/sa_compare.go
  59. 4 1
      models/speech_recognition/speech_recognition.go
  60. 2 1
      models/speech_recognition/speech_recognition_menu.go
  61. 5 3
      models/target.go
  62. 90 0
      routers/commentsRouter.go
  63. 2 0
      routers/router.go
  64. 1 1
      services/classify.go
  65. 1 1
      services/data/chart_extra_config.go
  66. 18 9
      services/data/chart_info.go
  67. 5 0
      services/data/chart_info_excel_balance.go
  68. 18 4
      services/data/data_manage_permission/data_move.go
  69. 11 3
      services/data/data_manage_permission/edb_permission.go
  70. 3 3
      services/data/edb_classify.go
  71. 58 0
      services/data/edb_collect.go
  72. 31 36
      services/data/edb_info.go
  73. 1 1
      services/data/future_good/profit_chart_info.go
  74. 18 4
      services/data/predict_edb_info.go
  75. 2 2
      services/data_stat/edb_delete_log.go
  76. 3 2
      services/data_stat/edb_info_stat.go
  77. 31 2
      services/elastic/elastic.go
  78. 1 1
      services/english_report.go
  79. 1 2
      services/knowledge/classify.go
  80. 40 3
      services/knowledge/resource.go
  81. 0 3
      services/knowledge/tag.go
  82. 1 1
      services/ppt/ppt_group.go
  83. 8 1
      services/report.go
  84. 13 1
      services/report_v2.go
  85. 7 0
      services/sandbox/sandbox.go
  86. 1 2
      services/video.go
  87. BIN
      static/template/事件库上传模板.xlsx
  88. BIN
      static/template/政策库上传模板.xlsx
  89. BIN
      static/template/知识库上传模板.xlsx
  90. BIN
      static/template/观点库上传模板.xlsx
  91. 135 0
      utils/common.go
  92. 13 0
      utils/constants.go

+ 4 - 0
controllers/base_auth.go

@@ -231,6 +231,10 @@ func (c *BaseAuthController) Prepare() {
 			for _, s := range apis {
 				apiMap[s] = true
 			}
+
+			fmt.Println("uri:", uri)
+
+			//fmt.Println(apiMap)
 			if !apiMap[uri] {
 				c.JSON(models.BaseResponse{Ret: 403, Msg: "无权访问!", ErrMsg: "无权访问!"}, false, false)
 				c.StopRun()

+ 28 - 1
controllers/bi_dashboard.go

@@ -909,6 +909,11 @@ func (this *BIDaShboardController) Public() {
 	// 校验是否开启了审批流
 	opening, e := biapproveSerice.CheckBiOpenApprove(req.ClassifyId)
 	if e != nil {
+		if !utils.IsErrNoRow(e) {
+			br.Msg = "该分类未配置审批流,请先配置审批流"
+			br.ErrMsg = "校验报告是否开启审批流失败, Err: " + e.Error()
+			return
+		}
 		br.Msg = "操作失败"
 		br.ErrMsg = "校验报告是否开启审批流失败, Err: " + e.Error()
 		return
@@ -1062,6 +1067,8 @@ func (this *BIDaShboardController) GrantInfo() {
 	if len(grantInfoList) <= 0 {
 		br.Msg = "未配置"
 		br.IsSendEmail = false
+		br.Success = true
+		br.Ret = 200
 		return
 	}
 
@@ -1164,12 +1171,32 @@ func (this *BIDaShboardController) HomePage() {
 	}()
 
 	item, err := bi_dashboard.GetBiDashboardHomePageById(this.SysUser.AdminId)
-	if err != nil {
+	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "数据不存在"
 		br.ErrMsg = "数据不存在,Err:" + err.Error()
 		return
 	}
 
+	publicCond := ` AND state = 6 AND bi_dashboard_classify_id > 0 `
+	publicPars := []interface{}{this.SysUser.AdminId}
+	publicList, err := bi_dashboard.GetBiDashboardList(publicCond, publicPars)
+	if err != nil {
+		err = errors.New("我的看板列表查询出错:" + err.Error())
+		return
+	}
+
+	if item.BiDashboardHomePageId == 0 && len(publicList) > 0 {
+		item = &bi_dashboard.BiDashboardHomePage{
+			AdminId:               publicList[0].SysAdminId,
+			BiDashboardId:         publicList[0].BiDashboardId,
+			FromType:              3,
+		}
+	}
+
+	if item.BiDashboardId == 0 {
+		item = nil
+	}
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "查询成功"

+ 5 - 2
controllers/data_manage/chart_info.go

@@ -1025,6 +1025,9 @@ func (this *ChartInfoController) ChartInfoDetail() {
 			}
 		}
 	}
+	for _, v := range mappingList {
+		v.ConvertToResp()
+	}
 
 	// 图表额外数据参数
 	extraConfigStr := chartInfo.ExtraConfig
@@ -1983,8 +1986,8 @@ func (this *ChartInfoController) ChartInfoEdbInfoDetail() {
 	mapping.EdbType = edbInfo.EdbType
 	mapping.Frequency = edbInfo.Frequency
 	mapping.Unit = edbInfo.Unit
-	mapping.StartDate = edbInfo.StartDate
-	mapping.EndDate = edbInfo.EndDate
+	mapping.StartDate = utils.TimeToFormatDate(edbInfo.StartDate)
+	mapping.EndDate = utils.TimeToFormatDate(edbInfo.EndDate)
 	mapping.ChartEdbMappingId = 0
 	mapping.ChartInfoId = 0
 	mapping.MaxData = maxData

+ 4 - 0
controllers/data_manage/correlation/correlation_chart_info.go

@@ -584,6 +584,7 @@ func (this *CorrelationChartInfoController) List() {
 				return
 			}
 			for _, v := range edbList {
+				v.ConvertToResp()
 				chartEdbMap[v.ChartInfoId] = append(chartEdbMap[v.ChartInfoId], v)
 			}
 		}
@@ -699,6 +700,8 @@ func (this *CorrelationChartInfoController) Detail() {
 		br.ErrMsg = "获取相关性图表, A指标mapping信息失败, Err:" + e.Error()
 		return
 	}
+	edbInfoMappingA.ConvertToResp()
+
 	edbInfoMappingB := new(data_manage.ChartEdbInfoMapping)
 	// 非多因子
 	if correlationChart.AnalysisMode != 1 {
@@ -708,6 +711,7 @@ func (this *CorrelationChartInfoController) Detail() {
 			br.ErrMsg = "获取相关性图表, B指标mapping信息失败, Err:" + e.Error()
 			return
 		}
+		edbInfoMappingB.ConvertToResp()
 	}
 
 	var dataResp interface{} // 绘图数据返回(目前是滚动相关性的图)

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

@@ -44,7 +44,7 @@ func (c *DataMangePermissionController) SetEdbChartPermission() {
 		return
 	}
 
-	if req.Source <= 0 || req.Source > 6 {
+	if req.Source <= 0 || req.Source > 7 {
 		br.Msg = "错误的来源"
 		br.IsSendEmail = false
 		return
@@ -223,7 +223,7 @@ func (c *DataMangePermissionController) GetEdbChartPermission() {
 	}
 
 	source, _ := c.GetInt("Source")
-	if source <= 0 || source > 6 {
+	if source <= 0 || source > 7 {
 		br.Msg = "错误的来源"
 		br.IsSendEmail = false
 		return

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

@@ -13,7 +13,7 @@ import (
 // EdbChartClassifyList
 // @Title 获取指标/图表分类列表数据接口
 // @Description 获取指标/图表分类列表数据接口
-// @Param   Source   query   int  false       "来源 :1:手工数据指标 2:钢联化工数据库 3:ETA指标库 4:ETA预测指标 5:图库 6:ETA表格"
+// @Param   Source   query   int  false       "来源 :1:手工数据指标 2:钢联化工数据库 3:ETA指标库 4:ETA预测指标 5:图库 6:ETA表格;7-计算指标"
 // @Param   SubSource   query   int  false       "子来源 :ETA表格中的各种表格类型,以及图表的来源(这个是后续的扩展方向)"
 // @Success 200 {object} data_manage.ChartListResp
 // @router /edb_chart/classify [get]
@@ -32,7 +32,7 @@ func (c *DataMangePermissionController) EdbChartClassifyList() {
 	}
 
 	source, _ := c.GetInt("Source")
-	if source <= 0 || source > 6 {
+	if source <= 0 || source > 7 {
 		br.Msg = "错误的来源"
 		br.IsSendEmail = false
 		return
@@ -82,7 +82,7 @@ func (c *DataMangePermissionController) SecretEdbChartClassifyList() {
 	}
 
 	source, _ := c.GetInt("Source")
-	if source <= 0 || source > 6 {
+	if source <= 0 || source > 7 {
 		br.Msg = "错误的来源"
 		br.IsSendEmail = false
 		return
@@ -155,7 +155,7 @@ func (c *DataMangePermissionController) MoveEdbChartList() {
 	}
 
 	source, _ := c.GetInt("Source")
-	if source <= 0 || source > 6 {
+	if source <= 0 || source > 7 {
 		br.Msg = "错误的来源"
 		br.IsSendEmail = false
 		return

+ 138 - 18
controllers/data_manage/edb_classify.go

@@ -9,6 +9,7 @@ import (
 	"eta_gn/eta_api/services/data"
 	"eta_gn/eta_api/services/data/data_manage_permission"
 	"eta_gn/eta_api/utils"
+	"fmt"
 	"sort"
 )
 
@@ -28,13 +29,26 @@ func (this *EdbClassifyController) ListV2() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
-	rootList, err := data_manage.GetEdbClassifyByParentId(0, 0)
+	// 分类来源筛选
+	classifyType, _ := this.GetInt("ClassifyType", utils.EdbClassifyTypeBase) // 默认指标库的
+	if classifyType != utils.EdbClassifyTypeBase && classifyType != utils.EdbClassifyTypeCalculate {
+		br.Msg = "参数有误"
+		br.ErrMsg = fmt.Sprintf("指标分类类型有误, ClassifyType: %d", classifyType)
+		return
+	}
+	edbType := utils.EdbTypeBase
+	if classifyType == utils.EdbClassifyTypeCalculate {
+		edbType = utils.EdbTypeCalculate
+	}
+
+	rootList, err := data_manage.GetEdbClassifyByParentId(0, int8(classifyType))
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
 		return
 	}
-	classifyAll, err := data_manage.GetEdbClassifyAll()
+	//classifyAll, err := data_manage.GetEdbClassifyAll()
+	classifyAll, err := data_manage.GetChildEdbClassifyByClassifyType(classifyType)
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
@@ -66,7 +80,8 @@ func (this *EdbClassifyController) ListV2() {
 	for _, v := range confList {
 		noPermissionEdbInfoIdMap[v.EdbInfoId] = true
 	}
-	allEdbInfo, err := data_manage.GetEdbInfoAll(utils.EDB_INFO_TYPE)
+	//allEdbInfo, err := data_manage.GetEdbInfoAll(utils.EDB_INFO_TYPE)
+	allEdbInfo, err := data_manage.GetEdbInfoByTypes(utils.EDB_INFO_TYPE, edbType)
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
@@ -139,6 +154,7 @@ func (this *EdbClassifyController) ListV2() {
 	br.Data = resp
 }
 
+// Items
 // @Title 获取所有分类接口-不包含指标
 // @Description 获取所有分类接口-不包含指标
 // @Success 200 {object} data_manage.EdbClassifyListResp
@@ -149,14 +165,27 @@ func (this *EdbClassifyController) Items() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
-	rootList, err := data_manage.GetEdbClassifyByParentId(0, 0)
+	// 分类来源筛选
+	classifyType, _ := this.GetInt("ClassifyType", utils.EdbClassifyTypeBase) // 默认指标库的
+	if classifyType != utils.EdbClassifyTypeBase && classifyType != utils.EdbClassifyTypeCalculate {
+		br.Msg = "参数有误"
+		br.ErrMsg = fmt.Sprintf("指标分类类型有误, ClassifyType: %d", classifyType)
+		return
+	}
+	//edbType := utils.EdbTypeBase
+	//if classifyType == utils.EdbClassifyTypeCalculate {
+	//	edbType = utils.EdbTypeCalculate
+	//}
+
+	rootList, err := data_manage.GetEdbClassifyByParentId(0, int8(classifyType))
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
 		return
 	}
 
-	classifyAll, err := data_manage.GetEdbClassifyAll()
+	//classifyAll, err := data_manage.GetEdbClassifyAll()
+	classifyAll, err := data_manage.GetChildEdbClassifyByClassifyType(classifyType)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
@@ -177,6 +206,7 @@ func (this *EdbClassifyController) Items() {
 	br.Data = resp
 }
 
+// AddEdbClassify
 // @Title 新增分类
 // @Description 新增分类接口
 // @Param	request	body data_manage.AddEdbClassifyReq true "type json string"
@@ -205,9 +235,16 @@ func (this *EdbClassifyController) AddEdbClassify() {
 		br.IsSendEmail = false
 		return
 	}
+	// 分类来源筛选
+	classifyType := req.ClassifyType
+	if classifyType != utils.EdbClassifyTypeBase && classifyType != utils.EdbClassifyTypeCalculate {
+		br.Msg = "参数有误"
+		br.ErrMsg = fmt.Sprintf("指标分类类型有误, ClassifyType: %d", classifyType)
+		return
+	}
 
 	//添加指标
-	_, err, errMsg := data.AddEdbClassify(req.ClassifyName, req.ParentId, req.Level, 0, this.SysUser.AdminId, this.SysUser.AdminName, this.Lang)
+	_, err, errMsg := data.AddEdbClassify(req.ClassifyName, req.ParentId, req.Level, classifyType, this.SysUser.AdminId, this.SysUser.AdminName, this.Lang)
 	if errMsg != `` {
 		br.Msg = errMsg
 		br.ErrMsg = errMsg
@@ -258,6 +295,7 @@ func (this *EdbClassifyController) AddEdbClassify() {
 	br.IsAddLog = true
 }
 
+// EditEdbClassify
 // @Title 修改分类
 // @Description 修改分类接口
 // @Param	request	body data_manage.EditEdbClassifyReq true "type json string"
@@ -332,6 +370,7 @@ func (this *EdbClassifyController) EditEdbClassify() {
 	br.IsAddLog = true
 }
 
+// DeleteEdbClassifyCheck
 // @Title 删除检测接口
 // @Description 删除检测接口
 // @Param	request	body data_manage.ClassifyDeleteCheckReq true "type json string"
@@ -442,6 +481,7 @@ func (this *EdbClassifyController) DeleteEdbClassifyCheck() {
 	br.Data = resp
 }
 
+// DeleteEdbClassify
 // @Title 删除分类/指标
 // @Description 删除分类/指标接口
 // @Param	request	body data_manage.DeleteEdbClassifyReq true "type json string"
@@ -535,7 +575,15 @@ func (this *EdbClassifyController) EdbClassifyMove() {
 		return
 	}
 
-	err, errMsg := data.MoveEdbClassify(req, sysUser, 0)
+	// 分类来源筛选
+	classifyType := req.ClassifyType // 默认指标库的
+	if classifyType != utils.EdbClassifyTypeBase && classifyType != utils.EdbClassifyTypeCalculate {
+		br.Msg = "参数有误"
+		br.ErrMsg = fmt.Sprintf("指标分类类型有误, ClassifyType: %d", classifyType)
+		return
+	}
+
+	err, errMsg := data.MoveEdbClassify(req, sysUser, uint8(classifyType))
 	if errMsg != `` {
 		br.Msg = errMsg
 		br.ErrMsg = errMsg
@@ -649,13 +697,26 @@ func (this *EdbClassifyController) ItemsV2() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
-	rootList, err := data_manage.GetEdbClassifyByParentId(0, 0)
+	// 分类来源筛选
+	classifyType, _ := this.GetInt("ClassifyType", utils.EdbClassifyTypeBase) // 默认指标库的
+	if classifyType != utils.EdbClassifyTypeBase && classifyType != utils.EdbClassifyTypeCalculate {
+		br.Msg = "参数有误"
+		br.ErrMsg = fmt.Sprintf("指标分类类型有误, ClassifyType: %d", classifyType)
+		return
+	}
+	//edbType := utils.EdbTypeBase
+	//if classifyType == utils.EdbClassifyTypeCalculate {
+	//	edbType = utils.EdbTypeCalculate
+	//}
+
+	rootList, err := data_manage.GetEdbClassifyByParentId(0, int8(classifyType))
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
 		return
 	}
-	classifyAll, err := data_manage.GetEdbClassifyAll()
+	//classifyAll, err := data_manage.GetEdbClassifyAll()
+	classifyAll, err := data_manage.GetChildEdbClassifyByClassifyType(classifyType)
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
@@ -747,6 +808,7 @@ func (this *EdbClassifyController) ItemsV2() {
 	br.Data = resp
 }
 
+// ClassifyEdbInfoList
 // @Title 获取分类下指标接口
 // @Description 获取分类下指标接口
 // @Param   ClassifyId   query   int  true       "分类id"
@@ -785,7 +847,7 @@ func (this *EdbClassifyController) ClassifyEdbInfoList() {
 		noPermissionEdbInfoIdMap[v.EdbInfoId] = true
 	}
 
-	allEdbInfo, err := data_manage.GetEdbInfoByClassifyId(classifyId, 0, 0)
+	allEdbInfo, err := data_manage.GetEdbInfoByClassifyId(classifyId, utils.EDB_INFO_TYPE, 0)
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
@@ -835,19 +897,32 @@ func (this *EdbClassifyController) ItemsV3() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
-	rootList, err := data_manage.GetEdbClassifyByParentId(0, 0)
+	// 分类来源筛选
+	classifyType, _ := this.GetInt("ClassifyType", utils.EdbClassifyTypeBase) // 默认指标库的
+	if classifyType != utils.EdbClassifyTypeBase && classifyType != utils.EdbClassifyTypeCalculate {
+		br.Msg = "参数有误"
+		br.ErrMsg = fmt.Sprintf("指标分类类型有误, ClassifyType: %d", classifyType)
+		return
+	}
+	//edbType := utils.EdbTypeBase
+	//if classifyType == utils.EdbClassifyTypeCalculate {
+	//	edbType = utils.EdbTypeCalculate
+	//}
+
+	// TODO:9级改造
+	rootList, err := data_manage.GetEdbClassifyByParentId(0, int8(classifyType))
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
 		return
 	}
-	rootTwoList, err := data_manage.GetEdbClassifyByParentIdTwo(0)
+	rootTwoList, err := data_manage.GetEdbClassifyByParentIdTwo(int8(classifyType))
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
 		return
 	}
-	classifyAll, err := data_manage.GetEdbClassifyAllV2(0)
+	classifyAll, err := data_manage.GetEdbClassifyAllV2(int8(classifyType))
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
@@ -963,6 +1038,18 @@ func (this *EdbClassifyController) SimpleList() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
+	// 分类来源筛选
+	classifyType, _ := this.GetInt("ClassifyType", utils.EdbClassifyTypeBase) // 默认指标库的
+	if classifyType != utils.EdbClassifyTypeBase && classifyType != utils.EdbClassifyTypeCalculate {
+		br.Msg = "参数有误"
+		br.ErrMsg = fmt.Sprintf("指标分类类型有误, ClassifyType: %d", classifyType)
+		return
+	}
+	//edbType := utils.EdbTypeBase
+	//if classifyType == utils.EdbClassifyTypeCalculate {
+	//	edbType = utils.EdbTypeCalculate
+	//}
+
 	// 默认查一级分类和一级分类下的指标信息,
 	// 如果是 子级分类,查询该子级分类的下一级分类和指标信息
 	// 增加标识判断是文件夹还是指标列表
@@ -973,7 +1060,7 @@ func (this *EdbClassifyController) SimpleList() {
 	if isOnlyMe {
 		sysUserId = this.SysUser.AdminId
 	}
-	rootList, err := data_manage.GetEdbClassifyByParentId(parentId, 0)
+	rootList, err := data_manage.GetEdbClassifyByParentId(parentId, int8(classifyType))
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
@@ -1044,6 +1131,11 @@ func (this *EdbClassifyController) SimpleList() {
 		}
 
 		for _, v := range rootList {
+			// TODO:(基础指标分类是否加这个判断待定)分类设定了权限且无权限, 那么忽略掉该节点
+			if classifyType == utils.EdbClassifyTypeCalculate && v.IsJoinPermission == 1 && !utils.InArrayByInt(permissionClassifyIdList, v.ClassifyId) {
+				continue
+			}
+
 			// 数据权限
 			v.HaveOperaAuth = data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(v.IsJoinPermission, v.ClassifyId, permissionClassifyIdList)
 			// 按钮权限
@@ -1101,8 +1193,20 @@ func (this *EdbClassifyController) ClassifyTree() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
+	// 分类来源筛选
+	classifyType, _ := this.GetInt("ClassifyType", utils.EdbClassifyTypeBase) // 默认指标库的
+	if classifyType != utils.EdbClassifyTypeBase && classifyType != utils.EdbClassifyTypeCalculate {
+		br.Msg = "参数有误"
+		br.ErrMsg = fmt.Sprintf("指标分类类型有误, ClassifyType: %d", classifyType)
+		return
+	}
+	//edbType := utils.EdbTypeBase
+	//if classifyType == utils.EdbClassifyTypeCalculate {
+	//	edbType = utils.EdbTypeCalculate
+	//}
 
-	allList, err := data_manage.GetNormalEdbClassifyAll()
+	//allList, err := data_manage.GetNormalEdbClassifyAll()
+	allList, err := data_manage.GetAllEdbClassifyByType(classifyType)
 	if err != nil && !utils.IsErrNoRow(err) {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
@@ -1120,14 +1224,30 @@ func (this *EdbClassifyController) ClassifyTree() {
 			return
 		}
 
-		for k, v := range allList {
+		//for k, v := range allList {
+		//	// 数据权限
+		//	v.HaveOperaAuth = data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(v.IsJoinPermission, v.ClassifyId, permissionClassifyIdList)
+		//	// 按钮权限
+		//	button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId, v.HaveOperaAuth)
+		//	allList[k].Button = button
+		//}
+		//nodeAll = data.GetClassifyTreeRecursive(allList, 0)
+		newNodes := make([]*data_manage.EdbClassifyItems, 0)
+		for _, v := range allList {
+			// TODO:(基础指标分类是否加这个判断待定)分类设定了权限且无权限, 那么忽略掉该节点
+			if classifyType == utils.EdbTypeCalculate && v.IsJoinPermission == 1 && !utils.InArrayByInt(permissionClassifyIdList, v.ClassifyId) {
+				continue
+			}
+			newNodes = append(newNodes, v)
+		}
+		for k, v := range newNodes {
 			// 数据权限
 			v.HaveOperaAuth = data_manage_permission.CheckEdbClassifyPermissionByPermissionIdList(v.IsJoinPermission, v.ClassifyId, permissionClassifyIdList)
 			// 按钮权限
 			button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId, v.HaveOperaAuth)
-			allList[k].Button = button
+			newNodes[k].Button = button
 		}
-		nodeAll = data.GetClassifyTreeRecursive(allList, 0)
+		nodeAll = data.GetClassifyTreeRecursive(newNodes, 0)
 		//根据sort值排序
 		sortList = nodeAll
 		sort.Sort(sortList)

+ 352 - 0
controllers/data_manage/edb_collect.go

@@ -0,0 +1,352 @@
+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/services/data"
+	"eta_gn/eta_api/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"strings"
+	"time"
+)
+
+// EdbCollectController 指标收藏
+type EdbCollectController struct {
+	controllers.BaseAuthController
+}
+
+// List
+// @Title 收藏列表-分页
+// @Description 收藏列表-分页
+// @Param   PageSize		query	int		false	"每页数据量"
+// @Param   CurrentIndex	query	int		false	"页码"
+// @Param   ClassifyId		query	int		false	"分类ID"
+// @Param   Keyword			query	string	false	"搜索关键词:指标ID/指标名称"
+// @Success Ret=200 保存成功
+// @router /edb_collect/list [get]
+func (this *EdbCollectController) List() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	//resp := new(response.EdbInfoChartListResp)
+	resp := new(data_manage.CollectEdbInfoListResp)
+	resp.List = make([]*data_manage.CollectEdbInfoItem, 0)
+
+	// 分页
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	var total int
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	// 当前用户
+	var cond string
+	var pars []interface{}
+	cond += ` AND a.sys_user_id = ?`
+	pars = append(pars, sysUser.AdminId)
+
+	// 分类筛选
+	classifyId, _ := this.GetInt("ClassifyId")
+	if classifyId > 0 {
+		classifyIds, e := data.GetEdbCollectClassifyChildIds(classifyId, sysUser.AdminId, true)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = fmt.Sprintf("获取子分类IDs失败, %v", e)
+			return
+		}
+		if len(classifyIds) == 0 {
+			resp.Paging = page
+			br.Data = resp
+			br.Ret = 200
+			br.Success = true
+			br.Msg = "获取成功"
+			return
+		}
+		cond += fmt.Sprintf(` AND a.edb_collect_classify_id IN (%s) `, utils.GetOrmInReplace(len(classifyIds)))
+		pars = append(pars, classifyIds)
+	}
+
+	// 获取当前账号的不可见指标
+	{
+		obj := data_manage.EdbInfoNoPermissionAdmin{}
+		list, e := obj.GetAllListByAdminId(sysUser.AdminId)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取不可见指标配置数据失败,Err:" + e.Error()
+			return
+		}
+		var edbIds []int
+		for _, v := range list {
+			edbIds = append(edbIds, v.EdbInfoId)
+		}
+		edbLen := len(edbIds)
+		if edbLen > 0 {
+			cond += fmt.Sprintf(` AND a.edb_info_id NOT IN (%s)`, utils.GetOrmInReplace(edbLen))
+			pars = append(pars, edbIds)
+		}
+	}
+
+	// 关键词搜索
+	keywords := this.GetString("Keyword")
+	keywords = strings.TrimSpace(keywords)
+	if keywords != "" {
+		kw := fmt.Sprint("%", keywords, "%")
+		cond += fmt.Sprintf(` AND (b.edb_code LIKE ? OR b.edb_name LIKE ?)`)
+		pars = append(pars, kw, kw)
+	}
+
+	// 获取指标列表
+	dataCount, e := data_manage.GetCollectEdbInfoCount(cond, pars)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = fmt.Sprintf("获取收藏指标总数失败, %v", e)
+		return
+	}
+	if dataCount == 0 {
+		resp.Paging = page
+		br.Data = resp
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		return
+	}
+	list, e := data_manage.GetCollectEdbInfoPageList(cond, pars, startSize, pageSize)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = fmt.Sprintf("获取收藏指标列表失败, %v", e)
+		return
+	}
+	for _, v := range list {
+		resp.List = append(resp.List, data_manage.FormatEdbInfo2CollectItem(v))
+	}
+
+	// 指标权限
+	//{
+	//	var edbClassifyIds []int
+	//	for _, v := range list {
+	//		edbClassifyIds = append(edbClassifyIds, v.ClassifyId)
+	//	}
+	//	classifyMap := make(map[int]*data_manage.EdbClassify)
+	//	classifyList, e := data_manage.GetEdbClassifyByIdList(edbClassifyIds)
+	//	if e != nil {
+	//		br.Msg = "获取失败"
+	//		br.ErrMsg = fmt.Sprintf("获取指标分类列表失败, %v", e)
+	//		return
+	//	}
+	//	for _, v := range classifyList {
+	//		classifyMap[v.ClassifyId] = v
+	//	}
+	//
+	//	// 获取所有有权限的指标和分类
+	//	authEdbIds, authEdbClassifyIds, e := data_manage_permission.GetUserEdbAndClassifyPermissionList(sysUser.AdminId, 0, 0)
+	//	if e != nil {
+	//		br.Msg = "获取失败"
+	//		br.ErrMsg = fmt.Sprintf("获取有权限的指标和分类失败, %v", e)
+	//		return
+	//	}
+	//
+	//	// 已被供应商暂停的指标编码
+	//	stopIndexCodes := make(map[string]bool)
+	//	{
+	//		var indexCodes []string
+	//		for _, v := range list {
+	//			if v.Source == utils.DATA_SOURCE_MYSTEEL_CHEMICAL {
+	//				indexCodes = append(indexCodes, v.EdbCode)
+	//			}
+	//		}
+	//		if len(indexCodes) > 0 {
+	//			stopIndexes, e := data_manage.GetNotIsSupplierStopIndexByCodeList(indexCodes, 1)
+	//			if e != nil {
+	//				br.Msg = "获取失败"
+	//				br.ErrMsg = fmt.Sprintf("获取供应商停更的指标失败, %v", e)
+	//				return
+	//			}
+	//			for _, v := range stopIndexes {
+	//				stopIndexCodes[v.IndexCode] = true
+	//			}
+	//		}
+	//	}
+	//
+	//	for _, v := range list {
+	//		// 权限按钮
+	//		if c, ok := classifyMap[v.ClassifyId]; ok {
+	//			v.HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(v.IsJoinPermission, c.IsJoinPermission, v.EdbInfoId, v.ClassifyId, authEdbIds, authEdbClassifyIds)
+	//			v.Button = data.GetEdbOpButton(sysUser, v.SysUserId, v.EdbType, v.EdbInfoType, v.HaveOperaAuth)
+	//		}
+	//		// 供应商停用
+	//		if v.Source == utils.DATA_SOURCE_MYSTEEL_CHEMICAL {
+	//			if _, ok := stopIndexCodes[v.EdbCode]; ok {
+	//				v.IsSupplierStop = 1
+	//			}
+	//		}
+	//	}
+	//}
+	page = paging.GetPaging(currentIndex, pageSize, int(dataCount))
+	resp.Paging = page
+	//resp.List = list
+
+	br.Data = resp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// Collect
+// @Title 新增收藏
+// @Description 新增收藏
+// @Param	request	body data_manage.EdbCollectReq true "type json string"
+// @Success Ret=200 保存成功
+// @router /edb_collect/collect [post]
+func (this *EdbCollectController) Collect() {
+	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 data_manage.EdbCollectReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常"
+		br.ErrMsg = fmt.Sprintf("参数解析异常: %v", e)
+		return
+	}
+	if req.EdbInfoId <= 0 {
+		br.Msg = "请选择指标"
+		return
+	}
+	if req.ClassifyId <= 0 {
+		br.Msg = "请选择分类"
+		return
+	}
+
+	edbItem, e := data_manage.GetEdbInfoById(req.EdbInfoId)
+	if e != nil {
+		if utils.IsErrNoRow(e) {
+			br.Msg = "指标不存在, 请刷新页面"
+			return
+		}
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("获取指标信息失败: %v", e)
+		return
+	}
+
+	// 校验是否重复添加至同一个分类
+	collectOb := new(data_manage.EdbCollect)
+	{
+		cond := fmt.Sprintf(" AND %s = ? AND %s = ? AND %s = ?", collectOb.Cols().SysUserId, collectOb.Cols().EdbCollectClassifyId, collectOb.Cols().EdbInfoId)
+		pars := make([]interface{}, 0)
+		pars = append(pars, sysUser.AdminId, req.ClassifyId, req.EdbInfoId)
+		total, e := collectOb.GetCountByCondition(cond, pars)
+		if e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = fmt.Sprintf("获取分类下同指标失败, %v", e)
+			return
+		}
+		if total > 0 {
+			br.Msg = "该指标已收藏至该分类,请勿重复收藏"
+			return
+		}
+	}
+
+	// 保存收藏
+	collectOb.EdbCollectClassifyId = req.ClassifyId
+	collectOb.EdbInfoId = edbItem.EdbInfoId
+	collectOb.EdbCode = edbItem.EdbCode
+	collectOb.SysUserId = sysUser.AdminId
+	collectOb.SysRealName = sysUser.RealName
+	collectOb.CreateTime = time.Now().Local()
+	collectOb.ModifyTime = time.Now().Local()
+	if e = collectOb.Create(); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("新增指标收藏失败: %v", e)
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// CancelCollect
+// @Title 取消收藏
+// @Description 取消收藏
+// @Param	request	body data_manage.EdbCollectReq true "type json string"
+// @Success Ret=200 保存成功
+// @router /edb_collect/cancel_collect [post]
+func (this *EdbCollectController) CancelCollect() {
+	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 data_manage.EdbCollectReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常"
+		br.ErrMsg = fmt.Sprintf("参数解析异常: %v", e)
+		return
+	}
+	if req.EdbInfoId <= 0 {
+		br.Msg = "请选择指标"
+		return
+	}
+	if req.ClassifyId <= 0 {
+		br.Msg = "请选择分类"
+		return
+	}
+
+	// 取消收藏
+	collectOb := new(data_manage.EdbCollect)
+	cond := fmt.Sprintf("%s = ? AND %s = ? AND %s = ?", collectOb.Cols().SysUserId, collectOb.Cols().EdbCollectClassifyId, collectOb.Cols().EdbInfoId)
+	pars := make([]interface{}, 0)
+	pars = append(pars, sysUser.AdminId, req.ClassifyId, req.EdbInfoId)
+	if e := collectOb.RemoveByCondition(cond, pars); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("取消收藏失败: %v", e)
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 455 - 0
controllers/data_manage/edb_collect_classify.go

@@ -0,0 +1,455 @@
+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/services/data"
+	"eta_gn/eta_api/utils"
+	"fmt"
+	"sort"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// EdbCollectClassifyController 指标收藏分类
+type EdbCollectClassifyController struct {
+	controllers.BaseAuthController
+}
+
+// List
+// @Title 分类列表-含指标
+// @Description 分类列表-含指标
+// @Param   ParentId  query  int  false  "父级ID"
+// @Success 200 {object} data_manage.EdbCollectClassifyListItem
+// @router /edb_collect/classify/list [get]
+func (this *EdbCollectClassifyController) List() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	parentId, _ := this.GetInt("ParentId")
+
+	resp := make([]*data_manage.EdbCollectClassifyListItem, 0)
+	// 查询分类
+	classifyOb := new(data_manage.EdbCollectClassify)
+	{
+		cond := fmt.Sprintf(" AND %s = ? AND %s = ?", classifyOb.Cols().ParentId, classifyOb.Cols().SysUserId)
+		pars := make([]interface{}, 0)
+		pars = append(pars, parentId, sysUser.AdminId)
+		list, e := classifyOb.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf("%s ASC", classifyOb.Cols().Sort))
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = fmt.Sprintf("获取子分类失败, %v", e)
+			return
+		}
+		for _, v := range list {
+			resp = append(resp, &data_manage.EdbCollectClassifyListItem{
+				NodeType:     1,
+				ClassifyId:   v.EdbCollectClassifyId,
+				ClassifyName: v.ClassifyName,
+				ParentId:     v.ParentId,
+				Level:        v.Level,
+				Sort:         v.Sort,
+				UniqueCode:   v.UniqueCode,
+			})
+		}
+	}
+
+	// 查询分类下收藏的指标
+	{
+		list, e := data_manage.GetCollectEdbInfoByClassifyId(parentId)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = fmt.Sprintf("获取分类下指标失败, %v", e)
+			return
+		}
+		for _, v := range list {
+			resp = append(resp, &data_manage.EdbCollectClassifyListItem{
+				NodeType:   2,
+				EdbInfoId:  v.EdbInfoId,
+				EdbCode:    v.EdbCode,
+				EdbName:    v.EdbName,
+				ParentId:   parentId,
+				Sort:       v.Sort,
+				UniqueCode: v.UniqueCode,
+			})
+		}
+	}
+	sort.Slice(resp, func(i, j int) bool {
+		return resp[i].Sort < resp[j].Sort
+	})
+
+	br.Data = resp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// Tree
+// @Title 分类树
+// @Description 分类树
+// @Success 200 {object} data_manage.EdbCollectClassifyItem
+// @router /edb_collect/classify/tree [get]
+func (this *EdbCollectClassifyController) Tree() {
+	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
+	}
+
+	// 获取所有分类
+	classifyOb := new(data_manage.EdbCollectClassify)
+	cond := fmt.Sprintf(" AND %s = ?", classifyOb.Cols().SysUserId)
+	pars := make([]interface{}, 0)
+	pars = append(pars, sysUser.AdminId)
+	list, e := classifyOb.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf("%s ASC, %s ASC", classifyOb.Cols().ParentId, classifyOb.Cols().Sort))
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = fmt.Sprintf("获取分类列表失败, %v", e)
+		return
+	}
+	items := make([]*data_manage.EdbCollectClassifyItem, 0)
+	for _, v := range list {
+		items = append(items, v.Format2Item())
+	}
+	tree := data.GetEdbCollectClassifyTreeRecursive(items, 0)
+
+	br.Data = tree
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// Add
+// @Title 新增分类
+// @Description 新增分类
+// @Param	request	body data_manage.EdbCollectClassifyAddReq true "type json string"
+// @Success Ret=200 保存成功
+// @router /edb_collect/classify/add [post]
+func (this *EdbCollectClassifyController) Add() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req data_manage.EdbCollectClassifyAddReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常"
+		br.ErrMsg = fmt.Sprintf("参数解析异常: %v", e)
+		return
+	}
+	req.ClassifyName = strings.TrimSpace(req.ClassifyName)
+	if req.ClassifyName == "" {
+		br.Msg = "请输入名称"
+		return
+	}
+	classifyOb := new(data_manage.EdbCollectClassify)
+
+	// 校验分类名称
+	//{
+	//	cond := fmt.Sprintf(" AND %s = ? AND %s = ?", classifyOb.Cols().ParentId, classifyOb.Cols().ClassifyName)
+	//	pars := make([]interface{}, 0)
+	//	pars = append(pars, req.ParentId, req.ClassifyName)
+	//	count, e := classifyOb.GetCountByCondition(cond, pars)
+	//	if e != nil {
+	//		br.Msg = "操作失败"
+	//		br.ErrMsg = fmt.Sprintf("获取分类名称重复数失败, %v", e)
+	//		return
+	//	}
+	//	if count > 0 {
+	//		br.Msg = "分类名称已存在"
+	//		return
+	//	}
+	//}
+
+	// 层级路径
+	var levelPath string
+	var rootId int
+	if req.ParentId > 0 {
+		parent, e := classifyOb.GetItemById(req.ParentId)
+		if e != nil {
+			br.Msg = "上级分类有误"
+			br.ErrMsg = fmt.Sprintf("获取上级分类失败, %v", e)
+			return
+		}
+		levelPath = parent.LevelPath
+		rootId = parent.RootId
+	}
+
+	sortMax, e := classifyOb.GetSortMax(req.ParentId)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("获取分类最大排序失败, %v", e)
+		return
+	}
+	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+	classifyOb.ParentId = req.ParentId
+	classifyOb.ClassifyName = req.ClassifyName
+	classifyOb.Level = req.Level + 1
+	classifyOb.Sort = sortMax + 1
+	classifyOb.SysUserId = sysUser.AdminId
+	classifyOb.SysUserRealName = sysUser.RealName
+	classifyOb.UniqueCode = utils.MD5(classifyOb.TableName() + "_" + timestamp)
+	classifyOb.CreateTime = time.Now().Local()
+	classifyOb.ModifyTime = time.Now().Local()
+	if e = classifyOb.Create(); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("新增分类失败, %v", e)
+		return
+	}
+	if req.ParentId > 0 {
+		classifyOb.LevelPath = fmt.Sprintf("%s,%d", levelPath, classifyOb.EdbCollectClassifyId)
+		classifyOb.RootId = rootId
+	} else {
+		classifyOb.LevelPath = fmt.Sprint(classifyOb.EdbCollectClassifyId)
+		classifyOb.RootId = classifyOb.EdbCollectClassifyId
+	}
+	if e = classifyOb.Update([]string{classifyOb.Cols().LevelPath, classifyOb.Cols().RootId}); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("更新分类失败, %v", e)
+		return
+	}
+
+	br.Data = classifyOb.Format2Item()
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// Edit
+// @Title 编辑分类
+// @Description 编辑分类
+// @Param	request	body data_manage.EdbCollectClassifyEditReq true "type json string"
+// @Success Ret=200 保存成功
+// @router /edb_collect/classify/edit [post]
+func (this *EdbCollectClassifyController) Edit() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req data_manage.EdbCollectClassifyEditReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常"
+		br.ErrMsg = fmt.Sprintf("参数解析异常: %v", e)
+		return
+	}
+	if req.ClassifyId < 0 {
+		br.Msg = "请选择分类"
+		return
+	}
+	req.ClassifyName = strings.TrimSpace(req.ClassifyName)
+	if req.ClassifyName == "" {
+		br.Msg = "请输入分类名称"
+		return
+	}
+
+	classifyOb := new(data_manage.EdbCollectClassify)
+	classifyItem, e := classifyOb.GetItemById(req.ClassifyId)
+	if e != nil {
+		if utils.IsErrNoRow(e) {
+			br.Msg = "分类不存在, 请刷新页面"
+			return
+		}
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("获取分类失败, %v", e)
+		return
+	}
+
+	// 校验分类名称
+	//{
+	//	cond := fmt.Sprintf(" AND %s <> ? AND %s = ?", classifyOb.Cols().PrimaryId, classifyOb.Cols().ClassifyName)
+	//	pars := make([]interface{}, 0)
+	//	pars = append(pars, req.ClassifyId, req.ClassifyName)
+	//	count, e := classifyOb.GetCountByCondition(cond, pars)
+	//	if e != nil {
+	//		br.Msg = "操作失败"
+	//		br.ErrMsg = fmt.Sprintf("获取分类名称重复数失败, %v", e)
+	//		return
+	//	}
+	//	if count > 0 {
+	//		br.Msg = "分类名称已存在"
+	//		return
+	//	}
+	//}
+	classifyItem.ClassifyName = req.ClassifyName
+	classifyItem.ModifyTime = time.Now().Local()
+	updateCols := []string{classifyOb.Cols().ClassifyName, classifyOb.Cols().ModifyTime}
+	if e = classifyItem.Update(updateCols); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("更新分类失败, %v", e)
+		return
+	}
+
+	br.Data = classifyItem.Format2Item()
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// Remove
+// @Title 删除分类
+// @Description 删除分类
+// @Param	request	body data_manage.EdbCollectClassifyRemoveReq true "type json string"
+// @Success 200 string "操作成功"
+// @router /edb_collect/classify/remove [post]
+func (this *EdbCollectClassifyController) Remove() {
+	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 data_manage.EdbCollectClassifyRemoveReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常"
+		br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
+		return
+	}
+	if req.ClassifyId < 0 {
+		br.Msg = "请选择分类"
+		return
+	}
+
+	classifyOb := new(data_manage.EdbCollectClassify)
+	_, e := classifyOb.GetItemById(req.ClassifyId)
+	if e != nil {
+		if utils.IsErrNoRow(e) {
+			br.Ret = 200
+			br.Success = true
+			br.Msg = "操作成功"
+			return
+		}
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("获取分类失败, %v", e)
+		return
+	}
+
+	// 获取子分类IDs
+	classifyIds, e := data.GetEdbCollectClassifyChildIds(req.ClassifyId, sysUser.AdminId, true)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("获取子分类IDs失败, %v", e)
+		return
+	}
+	if len(classifyIds) == 0 {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "操作成功"
+		return
+	}
+
+	// 移除所有子分类以及子分类所收藏的指标
+	if e = classifyOb.RemoveClassifyAndCollect(classifyIds); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = fmt.Sprintf("移除分类及收藏失败, %v", e)
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}
+
+// TODO:Move
+// @Title 移动分类
+// @Description 移动分类
+// @Param	request	body data_manage.EdbCollectClassifyMoveReq true "type json string"
+// @Success 200 string "操作成功"
+// @router /edb_collect/classify/move [post]
+func (this *EdbCollectClassifyController) Move() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	//var req data_manage.BaseFromThsHfClassifyMoveReq
+	//if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+	//	br.Msg = "参数解析异常"
+	//	br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
+	//	return
+	//}
+	//if req.ClassifyId <= 0 && req.ItemId <= 0 {
+	//	br.Msg = "请选择分类或指标"
+	//	return
+	//}
+	//
+	//err, errMsg := data.ThsHfMoveClassify(req, sysUser)
+	//if errMsg != `` {
+	//	br.Msg = errMsg
+	//	br.ErrMsg = errMsg
+	//	if err != nil {
+	//		br.ErrMsg = err.Error()
+	//	} else {
+	//		br.IsSendEmail = false
+	//	}
+	//	return
+	//}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 45 - 7
controllers/data_manage/edb_info.go

@@ -146,8 +146,8 @@ func (this *EdbInfoController) EdbInfoSearch() {
 		resp.Status = 1
 		searchItem := new(data_manage.EdbInfoSearch)
 		searchItem.EdbCode = item.EdbCode
-		searchItem.StartDate = item.StartDate
-		searchItem.EndDate = item.EndDate
+		searchItem.StartDate = utils.TimeToFormatDate(item.StartDate)
+		searchItem.EndDate = utils.TimeToFormatDate(item.EndDate)
 		searchItem.EdbName = item.EdbName
 		resp.SearchItem = searchItem
 		//查询目录
@@ -2229,6 +2229,8 @@ func (this *EdbInfoController) EdbInfoList() {
 		br.Msg = "获取成功"
 		return
 	}
+	// 时间转格式
+	edbInfoItem.ConvertToResp()
 
 	//获取英文频度
 	edbInfoItem.FrequencyEn = data.GetFrequencyEn(edbInfoItem.Frequency)
@@ -3235,7 +3237,14 @@ func (this *EdbInfoController) EdbInfoDetail() {
 		}
 	}
 
-	resp.EdbInfo = edbInfo
+	edbInfoResp, err := edbInfo.ConvertToResp()
+	if err != nil {
+		br.Msg = err.Error()
+		br.ErrMsg = errMsg
+		return
+	}
+
+	resp.EdbInfoResp = edbInfoResp
 	resp.ClassifyList = classifyList
 
 	br.Ret = 200
@@ -3342,6 +3351,7 @@ func (this *EdbInfoController) EdbInfoFilter() {
 			return
 		}
 		for _, nv := range newEdbInfoList {
+			nv.ConvertToResp()
 			if _, ok := existMap[nv.EdbInfoId]; !ok {
 				edbInfoList = append(edbInfoList, nv)
 			}
@@ -3356,6 +3366,8 @@ func (this *EdbInfoController) EdbInfoFilter() {
 	edbInfoListLen := len(edbInfoList)
 
 	for i := 0; i < edbInfoListLen; i++ {
+		// 时间转格式
+		edbInfoList[i].ConvertToResp()
 		edbInfoList[i].EdbNameAlias = edbInfoList[i].EdbName
 	}
 
@@ -3390,6 +3402,7 @@ 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-计算指标"
 // @Success 200 {object} data_manage.EdbInfoList
 // @router /edb_info/filter_by_es [get]
 func (this *EdbInfoController) EdbInfoFilterByEs() {
@@ -3426,6 +3439,8 @@ func (this *EdbInfoController) EdbInfoFilterByEs() {
 
 	isAddPredictEdb, _ := this.GetBool("IsAddPredictEdb") //是否查询添加预测指标
 
+	edbType, _ := this.GetInt("EdbType", 0) // 指标类型:0-基础和计算;1-基础指标;2-计算指标
+
 	var edbInfoList []*data_manage.EdbInfoList
 	var err error
 
@@ -3455,10 +3470,10 @@ func (this *EdbInfoController) EdbInfoFilterByEs() {
 
 		// 普通的搜索
 		if !isAddPredictEdb {
-			total, edbInfoList, err = elastic.SearchEdbInfoData(utils.DATA_INDEX_NAME, keyWord, startSize, pageSize, filterSource, source, 0, frequency, noPermissionEdbInfoIdList)
+			total, edbInfoList, err = elastic.SearchEdbInfoData(utils.DATA_INDEX_NAME, keyWord, startSize, pageSize, filterSource, source, 0, frequency, noPermissionEdbInfoIdList, edbType)
 		} else {
 			// 允许添加预测指标的搜索
-			total, edbInfoList, err = elastic.SearchAddPredictEdbInfoData(utils.DATA_INDEX_NAME, keyWord, noPermissionEdbInfoIdList, startSize, pageSize)
+			total, edbInfoList, err = elastic.SearchAddPredictEdbInfoData(utils.DATA_INDEX_NAME, keyWord, noPermissionEdbInfoIdList, startSize, pageSize, edbType)
 		}
 		isEs = true
 	} else {
@@ -3516,6 +3531,7 @@ func (this *EdbInfoController) EdbInfoFilterByEs() {
 
 	classifyIdList := make([]int, 0)
 	for i := 0; i < edbInfoListLen; i++ {
+		edbInfoList[i].ConvertToResp()
 		edbInfoList[i].EdbNameAlias = edbInfoList[i].EdbName
 		classifyIdList = append(classifyIdList, edbInfoList[i].ClassifyId)
 	}
@@ -3691,6 +3707,7 @@ func (this *EdbInfoController) EdbInfoFilter2() {
 	edbInfoListLen := len(edbInfoList)
 
 	for i := 0; i < edbInfoListLen; i++ {
+		edbInfoList[i].ConvertToResp()
 		edbInfoList[i].EdbNameAlias = edbInfoList[i].EdbName
 	}
 
@@ -3728,6 +3745,9 @@ func searchEdbInfoFilter(condition string, pars []interface{}, i int, ch chan ma
 		searchWait.Done()
 	}()
 	newEdbInfoList, err := data_manage.GetEdbInfoFilter(condition, pars)
+	for _, v := range newEdbInfoList {
+		v.ConvertToResp()
+	}
 	newEdbInfoListMap[i] = newEdbInfoList
 	return
 }
@@ -3851,7 +3871,14 @@ func (this *ChartInfoController) EdbInfoData() {
 		br.ErrMsg = errMsg
 		return
 	}
-	fullEdb.EdbInfo = edbInfo
+	edbInfoResp, err := edbInfo.ConvertToResp()
+	if err != nil {
+		br.Msg = err.Error()
+		br.ErrMsg = errMsg
+		return
+	}
+	fullEdb.EdbInfoResp = edbInfoResp
+
 	// 是否供应商停更
 	fullEdb.IsSupplierStop = data.GetIsSupplierStop(edbInfo.Source, edbInfo.EdbCode)
 
@@ -4813,6 +4840,8 @@ func (this *EdbInfoController) AllEdbInfoByEs() {
 
 	isAddPredictEdb, _ := this.GetBool("IsAddPredictEdb") //是否查询添加预测指标
 
+	edbType, _ := this.GetInt("EdbType", 0) // 指标类型:0-基础和计算;1-基础指标;2-计算指标
+
 	var edbInfoList []*data_manage.EdbInfoList
 	var err error
 
@@ -4841,7 +4870,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)
+		total, edbInfoList, err = elastic.SearchEdbInfoData(utils.DATA_INDEX_NAME, keyWord, startSize, pageSize, filterSource, source, -1, frequency, noPermissionEdbInfoIdList, edbType)
 		isEs = true
 	} else {
 		var condition string
@@ -4894,6 +4923,7 @@ func (this *EdbInfoController) AllEdbInfoByEs() {
 
 	classifyIdList := make([]int, 0)
 	for i := 0; i < edbInfoListLen; i++ {
+		edbInfoList[i].ConvertToResp()
 		edbInfoList[i].EdbNameAlias = edbInfoList[i].EdbName
 		classifyIdList = append(classifyIdList, edbInfoList[i].ClassifyId)
 	}
@@ -5422,6 +5452,13 @@ func (this *EdbInfoController) EdbChartList() {
 	condition += ` AND edb_info_type = ? `
 	pars = append(pars, 0)
 
+	// 指标类型
+	edbType, _ := this.GetInt("EdbType", 0)
+	if edbType > 0 {
+		condition += ` AND edb_type = ? `
+		pars = append(pars, edbType)
+	}
+
 	// 分类筛选
 	classifyId, _ := this.GetInt("ClassifyId")
 	if classifyId > 0 {
@@ -5483,6 +5520,7 @@ func (this *EdbInfoController) EdbChartList() {
 	} else {
 		classifyIdList := make([]int, 0)
 		for _, v := range list {
+			v.ConvertToResp()
 			classifyIdList = append(classifyIdList, v.ClassifyId)
 		}
 

+ 8 - 2
controllers/data_manage/edb_info_calculate.go

@@ -240,7 +240,13 @@ func (this *ChartInfoController) CalculateDetail() {
 		return
 	}
 
-	fullEdb.EdbInfo = edbInfo
+	edbInfoResp, err := edbInfo.ConvertToResp()
+	if err != nil {
+		br.Msg = err.Error()
+		br.ErrMsg = errMsg
+		return
+	}
+	fullEdb.EdbInfoResp = edbInfoResp
 	fullEdb.ClassifyList = classifyList
 
 	var currClassifyItem *data_manage.EdbClassifyIdItems
@@ -2465,7 +2471,7 @@ func (this *ChartInfoController) CalculateMultiSearch() {
 				ClassifyId:      info.ClassifyId,
 				SysUserRealName: info.SysUserRealName,
 				SysUserId:       info.SysUserId,
-				EndDate:         info.EndDate,
+				EndDate:         utils.TimeToFormatDate(info.EndDate),
 				EndValue:        info.EndValue,
 				HaveOperaAuth:   haveOperaAuth,
 				EdbInfoType:     info.EdbInfoType,

+ 2 - 2
controllers/data_manage/future_good/future_good_chart_info.go

@@ -2032,8 +2032,8 @@ func (this *FutureGoodChartInfoController) ChartInfoEdbInfoDetail() {
 	mapping.EdbType = edbInfo.EdbType
 	mapping.Frequency = edbInfo.Frequency
 	mapping.Unit = edbInfo.Unit
-	mapping.StartDate = edbInfo.StartDate
-	mapping.EndDate = edbInfo.EndDate
+	mapping.StartDate = utils.TimeToFormatDate(edbInfo.StartDate)
+	mapping.EndDate = utils.TimeToFormatDate(edbInfo.EndDate)
 	mapping.ChartEdbMappingId = 0
 	mapping.ChartInfoId = 0
 	mapping.MaxData = maxData

+ 2 - 2
controllers/data_manage/future_good/future_good_profit_chart_info.go

@@ -993,8 +993,8 @@ func (this *FutureGoodChartInfoController) PreviewProfitChartInfo() {
 			FrequencyEn:    data.GetFrequencyEn(v.Frequency),
 			Unit:           v.Unit,
 			UnitEn:         v.UnitEn,
-			StartDate:      v.StartDate,
-			EndDate:        v.EndDate,
+			StartDate:      utils.TimeToFormatDate(v.StartDate),
+			EndDate:        utils.TimeToFormatDate(v.EndDate),
 			ModifyTime:     v.ModifyTime.Format(utils.FormatDateTime),
 			MappingSource:  1,
 		})

+ 4 - 4
controllers/data_manage/line_feature/chart_info.go

@@ -14,10 +14,11 @@ import (
 	lineFeatureServ "eta_gn/eta_api/services/data/line_feature"
 	"eta_gn/eta_api/utils"
 	"fmt"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"strconv"
 	"strings"
 	"time"
+
+	"github.com/rdlucklib/rdluck_tools/paging"
 )
 
 // LineFeaturesChartInfoController 统计特征图表管理
@@ -558,10 +559,9 @@ func (this *LineFeaturesChartInfoController) MultipleGraphConfigSaveChart() {
 		return
 	}
 
-	err = nil
 	var isAdd bool
 	var chartInfoId int
-	if multipleGraphConfigChartMapping == nil {
+	if multipleGraphConfigChartMapping == nil || utils.IsErrNoRow(err) {
 		isAdd = true
 	} else {
 		chartInfo, err := data_manage.GetChartInfoById(multipleGraphConfigChartMapping.ChartInfoId)
@@ -571,7 +571,7 @@ func (this *LineFeaturesChartInfoController) MultipleGraphConfigSaveChart() {
 			return
 		}
 		// 说明图还在,没有被删除
-		if chartInfo != nil {
+		if chartInfo != nil && chartInfo.ChartInfoId > 0 {
 			chartInfoId = multipleGraphConfigChartMapping.ChartInfoId
 			req.ChartName = chartInfo.ChartName
 			req.ClassifyId = chartInfo.ChartClassifyId

+ 14 - 9
controllers/data_manage/multiple_graph_config.go

@@ -681,7 +681,7 @@ func (this *ChartInfoController) MultipleGraphConfigSaveChart() {
 	err = nil
 	var isAdd bool
 	var chartInfoId int
-	if multipleGraphConfigChartMapping == nil {
+	if multipleGraphConfigChartMapping == nil || multipleGraphConfigChartMapping.Id <= 0 {
 		isAdd = true
 	} else {
 		chartInfo, err := data_manage.GetChartInfoById(multipleGraphConfigChartMapping.ChartInfoId)
@@ -691,7 +691,7 @@ func (this *ChartInfoController) MultipleGraphConfigSaveChart() {
 			return
 		}
 		// 说明图还在,没有被删除
-		if chartInfo != nil {
+		if chartInfo != nil && chartInfo.ChartInfoId > 0 {
 			chartInfoId = multipleGraphConfigChartMapping.ChartInfoId
 			req.ChartName = chartInfo.ChartName
 			req.ClassifyId = chartInfo.ChartClassifyId
@@ -1014,7 +1014,7 @@ func CopyMultipleGraphConfigSaveChart(req request.SaveMultipleGraphChartReq, thi
 	}
 
 	multipleGraphConfigChartMapping, err := data_manage.GetMultipleGraphConfigChartMappingByIdAndSource(req.MultipleGraphConfigId, req.Source)
-	if err != nil && !utils.IsErrNoRow(err) {
+	if err != nil {
 		br.Msg = `保存失败`
 		br.ErrMsg = "获取配置与图表的关联关系失败,ERR:" + err.Error()
 		return
@@ -1022,13 +1022,18 @@ func CopyMultipleGraphConfigSaveChart(req request.SaveMultipleGraphChartReq, thi
 
 	// 原图
 	oldChartInfo, err := data_manage.GetChartInfoById(multipleGraphConfigChartMapping.ChartInfoId)
-	if err != nil && !utils.IsErrNoRow(err) {
-		br.Msg = `保存失败`
-		br.ErrMsg = "获取图表信息失败,ERR:" + err.Error()
+	if err != nil {
+		if !utils.IsErrNoRow(err) {
+			br.Msg = `保存失败`
+			br.ErrMsg = "获取图表信息失败,ERR:" + err.Error()
+			return
+		}
+		br.Msg = "原图不存在"
+		br.IsSendEmail = false
 		return
 	}
 	// 说明图还在,没有被删除
-	if oldChartInfo == nil {
+	if oldChartInfo == nil || oldChartInfo.ChartInfoId <= 0 {
 		br.Msg = "原图不存在"
 		br.IsSendEmail = false
 	}
@@ -1279,7 +1284,7 @@ func (this *ChartInfoController) MultipleGraphConfigSaveEdb() {
 	err = nil
 	var isAdd bool
 	var edbInfoId int
-	if multipleGraphConfigEdbMapping == nil {
+	if multipleGraphConfigEdbMapping == nil || multipleGraphConfigEdbMapping.MultipleGraphConfigId <= 0 {
 		isAdd = true
 	} else {
 		edbInfo, err := data_manage.GetEdbInfoById(multipleGraphConfigEdbMapping.EdbInfoId)
@@ -1289,7 +1294,7 @@ func (this *ChartInfoController) MultipleGraphConfigSaveEdb() {
 			return
 		}
 		// 说明指标还在,没有被删除
-		if edbInfo != nil && !req.IsSaveAs {
+		if edbInfo != nil && edbInfo.EdbInfoId > 0 && !req.IsSaveAs {
 			edbInfoId = multipleGraphConfigEdbMapping.EdbInfoId
 			req.EdbName = edbInfo.EdbName
 			req.ClassifyId = edbInfo.ClassifyId

+ 5 - 1
controllers/data_manage/predict_edb_info.go

@@ -132,6 +132,7 @@ func (this *PredictEdbInfoController) EdbChartList() {
 	} else {
 		classifyIdList := make([]int, 0)
 		for _, v := range list {
+			v.ConvertToResp()
 			classifyIdList = append(classifyIdList, v.ClassifyId)
 		}
 
@@ -262,6 +263,8 @@ func (this *PredictEdbInfoController) List() {
 		return
 	}
 
+	edbInfoItem.ConvertToResp()
+
 	//获取英文频度
 	edbInfoItem.FrequencyEn = data.GetFrequencyEn(edbInfoItem.Frequency)
 
@@ -1189,7 +1192,7 @@ func (this *PredictEdbInfoController) FilterByEs() {
 		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)
+			total, edbInfoList, err = elastic.SearchEdbInfoData(utils.DATA_INDEX_NAME, keyWord, startSize, pageSize, filterSource, source, 1, frequency, noPermissionEdbInfoIdList, 0)
 		}
 		isEs = true
 	} else {
@@ -1242,6 +1245,7 @@ func (this *PredictEdbInfoController) FilterByEs() {
 
 	classifyIdList := make([]int, 0)
 	for i := 0; i < edbInfoListLen; i++ {
+		edbInfoList[i].ConvertToResp()
 		edbInfoList[i].EdbNameAlias = edbInfoList[i].EdbName
 		classifyIdList = append(classifyIdList, edbInfoList[i].ClassifyId)
 	}

+ 1 - 1
controllers/data_manage/supply_analysis/variety.go

@@ -584,7 +584,7 @@ func (this *VarietyController) Analysis() {
 						continue
 					}
 					// 刷新指标数据
-					go data.RefreshEdbData(edbInfo.EdbInfoId, edbInfo.Source, edbInfo.SubSource, edbInfo.EdbCode, edbInfo.StartDate)
+					go data.RefreshEdbData(edbInfo.EdbInfoId, edbInfo.Source, edbInfo.SubSource, edbInfo.EdbCode, utils.TimeToFormatDate(edbInfo.StartDate))
 				}
 			}
 		}

+ 7 - 7
controllers/data_manage/supply_analysis/variety_edb.go

@@ -275,7 +275,7 @@ func (this *VarietyController) AddToEdb() {
 
 	// 更新ETA指标库信息
 	{
-		data.RefreshEdbData(edbInfo.EdbInfoId, edbInfo.Source, edbInfo.SubSource, edbInfo.EdbCode, edbInfo.StartDate)
+		data.RefreshEdbData(edbInfo.EdbInfoId, edbInfo.Source, edbInfo.SubSource, edbInfo.EdbCode, utils.TimeToFormatDate(edbInfo.StartDate))
 	}
 
 	//新增操作日志
@@ -597,8 +597,8 @@ func (this *VarietyController) EdbInfoDataTb() {
 		Frequency:        varietyEdbInfo.Frequency,
 		Unit:             ``,
 		UnitEn:           "",
-		StartDate:        varietyEdbInfo.StartDate.Format(utils.FormatDate),
-		EndDate:          varietyEdbInfo.EndDate.Format(utils.FormatDate),
+		StartDate:        varietyEdbInfo.StartDate,
+		EndDate:          varietyEdbInfo.EndDate,
 		ClassifyId:       0,
 		SysUserId:        0,
 		SysUserRealName:  "",
@@ -726,8 +726,8 @@ func (this *VarietyController) EdbInfoDataSeasonal() {
 		Frequency:        varietyEdbInfo.Frequency,
 		Unit:             ``,
 		UnitEn:           "",
-		StartDate:        varietyEdbInfo.StartDate.Format(utils.FormatDate),
-		EndDate:          varietyEdbInfo.EndDate.Format(utils.FormatDate),
+		StartDate:        varietyEdbInfo.StartDate,
+		EndDate:          varietyEdbInfo.EndDate,
 		ClassifyId:       0,
 		SysUserId:        0,
 		SysUserRealName:  "",
@@ -825,8 +825,8 @@ func (this *VarietyController) EdbDataListV2() {
 		Frequency:        varietyEdbInfo.Frequency,
 		Unit:             ``,
 		UnitEn:           "",
-		StartDate:        varietyEdbInfo.StartDate.Format(utils.FormatDate),
-		EndDate:          varietyEdbInfo.EndDate.Format(utils.FormatDate),
+		StartDate:        varietyEdbInfo.StartDate,
+		EndDate:          varietyEdbInfo.EndDate,
 		ClassifyId:       0,
 		SysUserId:        0,
 		SysUserRealName:  "",

+ 123 - 44
controllers/knowledge/classify.go

@@ -7,6 +7,7 @@ import (
 	"eta_gn/eta_api/models/knowledge"
 	knowledgeServ "eta_gn/eta_api/services/knowledge"
 	"eta_gn/eta_api/utils"
+	"fmt"
 )
 
 // 分类
@@ -96,53 +97,74 @@ func (this *ClassifyController) CheckDeleteClassify() {
 		return
 	}
 
-	//判断分类是否关联了报告
-	if classify.ParentId > 0 {
-		count, err := knowledgeObj.GetResourceCountByClassifyId(classifyId)
-		if err != nil {
-			br.Msg = "获取信息失败"
-			br.ErrMsg = "获取信息失败,Err:" + err.Error()
-			return
-		}
-		if count > 0 {
-			resp.Code = 2
-			resp.Msg = "该分类有关联报告,不允许删除"
-			br.Data = resp
-			br.Ret = 200
-			br.Msg = "该分类有关联报告,不允许删除"
-			br.Success = true
-			return
-		}
-	} else {
-		subCount, err := knowledgeObj.GetClassifySubCountByClassifyId(classifyId)
-		if err != nil {
-			br.Msg = "获取信息失败"
-			br.ErrMsg = "获取信息失败,Err:" + err.Error()
+	count, err := knowledgeObj.GetResourceCountByClassifyId(classifyId)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取信息失败,Err:" + err.Error()
+		return
+	}
+	if count > 0 {
+		resp.Code = 2
+		resp.Msg = "该分类有关联事件,不允许删除"
+		br.Data = resp
+		br.Ret = 200
+		br.Msg = "该分类有关联事件,不允许删除"
+		br.Success = true
+		return
+	}
+	// 查询所有子分类
+	classifyIds, e := knowledgeObj.GetChildClassifyIdByParentId(classifyId)
+	if e != nil && !utils.IsErrNoRow(e) {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取分类信息失败, GetEdbClassify,Err:" + e.Error()
+		return
+	}
+	if len(classifyIds) > 0 {
+		condition := fmt.Sprintf(` AND classify_id IN (?) `)
+		var pars []interface{}
+		pars = append(pars, classifyIds)
+		childCount, err := knowledge.GetKnowledgeResourceListCount(condition, pars)
+		if err != nil && !utils.IsErrNoRow(err) {
+			br.Msg = "删除失败"
+			br.ErrMsg = "查询分类下表格数量失败,Err:" + err.Error()
 			return
 		}
-		if subCount > 0 {
+
+		if childCount > 0 {
 			resp.Code = 3
-			resp.Msg = "二级分类有关联报告,不允许删除"
+			resp.Msg = "子分类有关联事件,不允许删除"
 			br.Data = resp
 			br.Ret = 200
-			br.Msg = "二级分类有关联报告,不允许删除"
+			br.Msg = "子分类有关联事件,不允许删除"
 			br.Success = true
 			return
 		}
-		subTotal, err := knowledgeObj.GetClassifySubCountByParentId(classifyId)
-		if err != nil {
-			br.Msg = "获取信息失败"
-			br.ErrMsg = "获取信息失败,Err:" + err.Error()
+		// 查询三级分类下是否有事件,如果有也不允许删除
+		classifyIds, e = knowledgeObj.GetChildClassifyIdByParentIds(classifyIds)
+		if e != nil && !utils.IsErrNoRow(e) {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取分类信息失败, GetEdbClassify,Err:" + e.Error()
 			return
 		}
-		if subTotal > 0 {
-			resp.Code = 4
-			resp.Msg = "请先删除该分类下关联分类"
-			br.Data = resp
-			br.Ret = 200
-			br.Msg = "请先删除该分类下关联分类"
-			br.Success = true
-			return
+		if len(classifyIds) > 0 {
+			condition = fmt.Sprintf(` AND classify_id IN (?) `)
+			pars = make([]interface{}, 0)
+			pars = append(pars, classifyIds)
+			childCount, e = knowledge.GetKnowledgeResourceListCount(condition, pars)
+			if e != nil && !utils.IsErrNoRow(e) {
+				br.Msg = "删除失败"
+				br.ErrMsg = "查询分类下表格数量失败,Err:" + e.Error()
+				return
+			}
+			if childCount > 0 {
+				resp.Code = 3
+				resp.Msg = "子分类有关联事件,不允许删除"
+				br.Data = resp
+				br.Ret = 200
+				br.Msg = "子分类有关联事件,不允许删除"
+				br.Success = true
+				return
+			}
 		}
 	}
 
@@ -176,12 +198,12 @@ func (this *ClassifyController) Delete() {
 		br.Msg = "参数错误"
 		return
 	}
-	//todo 是否需要删除接口
-	/*br.Msg = "报告分类不允许删除"
-	br.IsSendEmail = false
-	return*/
+	//todo 是否需要删除
 	knowledgeObj := new(knowledge.KnowledgeClassify)
-	item, err := knowledgeObj.GetClassifyById(req.ClassifyId)
+	classifyId := req.ClassifyId
+	deleteClassifyIds := make([]int, 0)
+	deleteClassifyIds = append(deleteClassifyIds, classifyId)
+	classify, err := knowledgeObj.GetClassifyById(req.ClassifyId)
 	if err != nil {
 		if utils.IsErrNoRow(err) {
 			br.Msg = "分类不存在"
@@ -191,12 +213,69 @@ func (this *ClassifyController) Delete() {
 		br.ErrMsg = "获取信息失败,Err:" + err.Error()
 		return
 	}
-	if item.ResourceType != req.ResourceType {
+	if classify.ResourceType != req.ResourceType {
 		br.Msg = "资源类型不匹配"
 		return
 	}
+	count, err := knowledgeObj.GetResourceCountByClassifyId(classifyId)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取信息失败,Err:" + err.Error()
+		return
+	}
+	if count > 0 {
+		br.Msg = "该分类有关联事件,不允许删除"
+		return
+	}
+	// 查询所有子分类
+	classifyIds, e := knowledgeObj.GetChildClassifyIdByParentId(classifyId)
+	if e != nil && !utils.IsErrNoRow(e) {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取分类信息失败, GetEdbClassify,Err:" + e.Error()
+		return
+	}
+	if len(classifyIds) > 0 {
+		condition := fmt.Sprintf(` AND classify_id IN (?) `)
+		var pars []interface{}
+		pars = append(pars, classifyIds)
+		childCount, err := knowledge.GetKnowledgeResourceListCount(condition, pars)
+		if err != nil && !utils.IsErrNoRow(err) {
+			br.Msg = "删除失败"
+			br.ErrMsg = "查询分类下表格数量失败,Err:" + err.Error()
+			return
+		}
+
+		if childCount > 0 {
+			br.Msg = "子分类有关联事件,不允许删除"
+			return
+		}
+		deleteClassifyIds = append(deleteClassifyIds, classifyIds...)
+		// 查询三级分类下是否有事件,如果有也不允许删除
+		classifyIds, e = knowledgeObj.GetChildClassifyIdByParentIds(classifyIds)
+		if e != nil && !utils.IsErrNoRow(e) {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取分类信息失败, GetEdbClassify,Err:" + e.Error()
+			return
+		}
+		if len(classifyIds) > 0 {
+			condition = fmt.Sprintf(` AND classify_id IN (?) `)
+			pars = make([]interface{}, 0)
+			pars = append(pars, classifyIds)
+			childCount, e = knowledge.GetKnowledgeResourceListCount(condition, pars)
+			if e != nil && !utils.IsErrNoRow(e) {
+				br.Msg = "删除失败"
+				br.ErrMsg = "查询分类下表格数量失败,Err:" + e.Error()
+				return
+			}
+			if childCount > 0 {
+				br.Msg = "子分类有关联事件,不允许删除"
+				return
+			}
+			deleteClassifyIds = append(deleteClassifyIds, classifyIds...)
+		}
+	}
 
-	err = knowledgeObj.Delete(req.ClassifyId)
+	err = knowledgeObj.DeleteByIds(deleteClassifyIds)
 	if err != nil {
 		br.Msg = "删除失败"
 		br.ErrMsg = "删除失败,Err:" + err.Error()

+ 52 - 2
controllers/knowledge/resource.go

@@ -8,6 +8,7 @@ import (
 	"eta_gn/eta_api/services"
 	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"
@@ -61,6 +62,8 @@ func (this *ResourceController) List() {
 	keyWord := this.GetString("Keyword")
 	resourceType, _ := this.GetInt("ResourceType")
 
+	sourceFrom := this.GetString("SourceFrom")
+
 	var startSize int
 	if pageSize <= 0 {
 		pageSize = utils.PageSize20
@@ -97,7 +100,11 @@ func (this *ResourceController) List() {
 				}
 			}
 		}
-
+	}
+	if sourceFrom != "" {
+		sourceArr := strings.Split(sourceFrom, ",")
+		condition += ` AND source_from in (?) `
+		pars = append(pars, sourceArr)
 	}
 	if classifyIds != "" {
 		//转成数组,并把类型转成int
@@ -1018,7 +1025,7 @@ func (this *ResourceController) ResourceUpload() {
 	ext := path.Ext(h.Filename)
 	ossFileName := utils.GetRandStringNoSpecialChar(28) + ext
 	filePath := uploadDir + "/" + ossFileName
-	if e = this.SaveToFile("file", filePath); e != nil {
+	if e = this.SaveToFile("File", filePath); e != nil {
 		br.Msg = "文件保存失败"
 		br.ErrMsg = "文件保存失败, Err:" + e.Error()
 		return
@@ -1121,3 +1128,46 @@ func (this *ResourceController) GetAdminList() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// TemplateDownload
+// @Title 下载模板
+// @Description 下载模板
+// @Success 200 {object} models.EdbdataClassifyResp
+// @Param   ResourceType   query   int  false       "来源:1:模板1;2:模板2"
+// @router /resource/template [get]
+func (this *ResourceController) TemplateDownload() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	resourceType, _ := this.GetInt("ResourceType")
+	downUrl := ""
+	fileName := ""
+	switch resourceType {
+	case 1:
+		downUrl = "./static/template/政策库上传模板.xlsx"
+		fileName = "政策库上传模板.xlsx"
+	case 2:
+		downUrl = "./static/template/观点库上传模板.xlsx"
+		fileName = "观点库上传模板.xlsx"
+	case 3:
+		downUrl = "./static/template/知识库上传模板.xlsx"
+		fileName = "知识库上传模板.xlsx"
+	default:
+		downUrl = "./static/template/事件库上传模板.xlsx"
+		fileName = "事件库上传模板.xlsx"
+	}
+	// 判断文件是否存在
+	if _, err := os.Stat(downUrl); os.IsNotExist(err) {
+		br.Msg = "文件不存在"
+		return
+	}
+	fmt.Println(downUrl, fileName)
+	this.Ctx.Output.Download(downUrl, fileName)
+	//this.Ctx.Output.Download("./static/数据导入模板.xlsx", "数据导入模板.xlsx")
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "下载成功"
+}

+ 10 - 1
controllers/report.go

@@ -1233,7 +1233,16 @@ func (this *ReportController) EditDayWeekReport() {
 	}
 
 	reportInfo.Title = req.Title
-	reportInfo.CreateTime = req.CreateTime
+	if req.CreateTime != "" {
+		createTime, tmpErr := time.ParseInLocation(utils.FormatDateTime, req.CreateTime, time.Local)
+		if tmpErr != nil {
+			err = tmpErr
+			br.Msg = "日期解析异常"
+			br.ErrMsg = "日期解析异常,err:" + tmpErr.Error()
+			return
+		}
+		reportInfo.CreateTime = createTime
+	}
 	reportInfo.Author = req.Author
 	err = models.EditReport(reportInfo, int64(req.ReportId))
 

+ 9 - 7
controllers/report_approve/report_approve_flow.go

@@ -8,10 +8,11 @@ import (
 	"eta_gn/eta_api/services"
 	"eta_gn/eta_api/utils"
 	"fmt"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"strings"
 	"sync"
 	"time"
+
+	"github.com/rdlucklib/rdluck_tools/paging"
 )
 
 // ReportApproveFlowController 报告审批流
@@ -243,7 +244,7 @@ func (this *ReportApproveFlowController) Add() {
 			br.ErrMsg = "获取审批流是否已存在失败, Err: " + e.Error()
 			return
 		}
-		if exist != nil {
+		if exist != nil && exist.ReportApproveFlowId > 0 {
 			br.Msg = "该分类已有审批流, 请勿重复添加"
 			return
 		}
@@ -393,7 +394,7 @@ func (this *ReportApproveFlowController) Edit() {
 			br.ErrMsg = "获取审批流是否已存在失败, Err: " + e.Error()
 			return
 		}
-		if exist != nil {
+		if exist != nil && exist.ReportApproveFlowId > 0 {
 			br.Msg = "该分类已有审批流, 请勿重复添加"
 			return
 		}
@@ -750,11 +751,12 @@ func (this *ReportApproveFlowController) ReportClassifyTree() {
 			ClassifyId:   report_approve.FlowReportTypeChinese,
 			ClassifyName: "研报",
 			Children:     cnTree,
-		}, &report_approve.ReportClassifyTreeItem{
-			ClassifyId:   report_approve.FlowReportTypeEnglish,
-			ClassifyName: "英文研报",
-			Children:     enTree,
 		})
+		//&report_approve.ReportClassifyTreeItem{
+		//	ClassifyId:   report_approve.FlowReportTypeEnglish,
+		//	ClassifyName: "英文研报",
+		//	Children:     enTree,
+		//})
 	}
 
 	br.Data = resp

+ 11 - 8
controllers/report_chapter.go

@@ -413,7 +413,16 @@ func (this *ReportController) EditDayWeekChapter() {
 	reportChapterInfo.IsEdit = 1
 	reportChapterInfo.ModifyTime = time.Now()
 	if req.CreateTime != `` {
-		reportChapterInfo.CreateTime = req.CreateTime
+		formatDate := utils.FormatDateTime
+		if !strings.Contains(req.CreateTime, ":") {
+			formatDate = utils.FormatDate
+		}
+		createTime, tmpErr := time.ParseInLocation(formatDate, req.CreateTime, time.Local)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		reportChapterInfo.CreateTime = createTime
 	}
 
 	reportChapterInfo.LastModifyAdminId = sysUser.AdminId
@@ -1218,13 +1227,7 @@ func (this *ReportController) VoiceUpload() {
 	sizeStr := utils.SubFloatToFloatStr(sizeFloat, 2)
 
 	{
-		reportChapterCreateTime, err := time.Parse(utils.FormatDateTime, reportChapterInfo.CreateTime)
-		if err != nil {
-			br.Msg = "上传失败"
-			br.ErrMsg = "上传失败,Err:" + err.Error()
-			return
-		}
-		createTimeStr := reportChapterCreateTime.Format("0102")
+		createTimeStr := reportChapterInfo.CreateTime.Format("0102")
 		videoName := reportChapterInfo.Title + "(" + createTimeStr + ")"
 
 		reportChapterInfo.VideoUrl = resourceUrl

+ 1 - 1
controllers/report_chapter_type.go

@@ -268,7 +268,7 @@ func (this *ReportChapterTypeController) Edit() {
 		br.ErrMsg = "获取重名报告章节失败, Err:" + e.Error()
 		return
 	}
-	if exists != nil && exists.ReportChapterTypeId != req.ReportChapterTypeId {
+	if exists != nil && exists.ReportChapterTypeId > 0 && exists.ReportChapterTypeId != req.ReportChapterTypeId {
 		br.Msg = "章节名称已存在"
 		return
 	}

+ 15 - 2
controllers/report_v2.go

@@ -452,7 +452,19 @@ func (this *ReportController) Add() {
 	item.Content = html.EscapeString(req.Content)
 	item.Stage = maxStage + 1
 	item.ContentSub = html.EscapeString(contentSub)
-	item.CreateTime = req.CreateTime
+	if req.CreateTime != `` {
+		formatDate := utils.FormatDateTime
+		if !strings.Contains(req.CreateTime, ":") {
+			formatDate = utils.FormatDate
+		}
+		createTime, tmpErr := time.ParseInLocation(formatDate, req.CreateTime, time.Local)
+		if tmpErr != nil {
+			br.Msg = "时间解析异常"
+			br.ErrMsg = "时间解析异常,Err:" + err.Error()
+			return
+		}
+		item.CreateTime = createTime
+	}
 	item.ModifyTime = time.Now()
 	item.ReportVersion = req.ReportVersion
 	item.AdminId = sysUser.AdminId
@@ -994,6 +1006,7 @@ func (this *ReportController) BaseDetail() {
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
+	fmt.Println(reportInfo)
 
 	// 基础信息就不获取章节信息了
 	chapterList := make([]*models.ReportChapter, 0)
@@ -1857,7 +1870,7 @@ func fixSmartReport() {
 			Abstract:           v.Abstract,
 			Author:             v.Author,
 			Frequency:          v.Frequency,
-			CreateTime:         v.CreateTime.Format(utils.FormatDateTime),
+			CreateTime:         v.CreateTime,
 			ModifyTime:         v.ModifyTime,
 			State:              v.State,
 			PublishTime:        v.PublishTime,

+ 15 - 6
controllers/sandbox/sandbox.go

@@ -1738,15 +1738,24 @@ func (this *SandboxController) ListV2() {
 		return
 	}
 
+	classifyList, err := sandbox.GetAllSandboxClassify()
+	if err != nil && !utils.IsErrNoRow(err) {
+		br.Msg = "获取分类信息失败"
+		br.ErrMsg = "获取分类信息失败,Err:" + err.Error()
+		return
+	}
+	classsifyMap := make(map[int]*sandbox.SandboxClassifyItems)
+	for _, v := range classifyList {
+		classsifyMap[v.SandboxClassifyId] = v
+	}
+
 	for i, v := range list {
-		ids, err := sandbox.GetSandboxAllParentByClassifyId(v.SandboxClassifyId)
-		if err != nil {
-			br.Msg = "获取父级信息错误!"
-			br.ErrMsg = "获取父级信息错误,Err:" + err.Error()
-			return
-		}
+		parentIds := make([]int, 0)
+		sandboxService.GetSandBoxParentIds(v.SandboxClassifyId, classsifyMap, parentIds)
+		ids := utils.IntArr2joinString(parentIds,",")
 		list[i].ParentIds = ids
 	}
+
 	resp := new(sandbox.SandboxListResp)
 	if list == nil || len(list) <= 0 || (err != nil && utils.IsErrNoRow(err)) {
 		items := make([]*sandbox.SandboxListItems, 0)

+ 1 - 1
controllers/semantic_analysis/sa_compare.go

@@ -694,7 +694,7 @@ func (this *SaCompareController) Search() {
 
 	var list []*saModel.SaCompare
 	saCompare := new(saModel.SaCompare)
-	existCond := fmt.Sprintf(` AND result_img != ""`)
+	existCond := fmt.Sprintf(` AND result_img != ''`)
 	existPars := make([]interface{}, 0)
 	if keyword != "" {
 		existCond += ` AND  ( title LIKE ? )`

+ 1 - 8
controllers/voice.go

@@ -134,14 +134,7 @@ func (this *VoiceController) Upload() {
 
 	// 修改报告的音频信息
 	{
-		reportCreateTime, err := time.Parse(utils.FormatDateTime, reportInfo.CreateTime)
-		if err != nil {
-			br.Msg = "上传失败"
-			br.ErrMsg = "上传失败,Err:" + err.Error()
-			return
-		}
-
-		createTimeStr := reportCreateTime.Format("0102")
+		createTimeStr := reportInfo.CreateTime.Format("0102")
 		videoName := reportInfo.Title + "(" + createTimeStr + ")"
 
 		reportInfo.VideoUrl = resourceUrl

+ 29 - 1
global/dm.go

@@ -1,6 +1,7 @@
 package global
 
 import (
+	"database/sql/driver"
 	_ "dm"
 	dm "dmgorm2"
 	"eta_gn/eta_api/utils"
@@ -16,6 +17,8 @@ import (
 	_ "github.com/go-sql-driver/mysql"
 )
 
+type LocalTime time.Time
+
 // InitDm
 // @Description: 达梦数据库初始化
 func InitDm() {
@@ -85,7 +88,6 @@ func connectDm(dsn, aliasName string, newLogger logger.Interface, dmSqlMap map[s
 		//global.LOG.Errorf("mysql 启动异常,数据库:default;Err:", err)
 		panic(fmt.Errorf("mysql 启动异常,数据库:%s;Err:%s", aliasName, err))
 	}
-
 	//创建连接池
 	sqlDB, err := db.DB()
 	if err != nil {
@@ -110,3 +112,29 @@ func connectDm(dsn, aliasName string, newLogger logger.Interface, dmSqlMap map[s
 	sqlDB.SetConnMaxLifetime(10 * time.Minute)
 
 }
+
+func (t *LocalTime) MarshalJSON() ([]byte, error) {
+	tTime := time.Time(*t)
+	if tTime.IsZero() {
+		return []byte("\"\""), nil
+	}
+	return []byte(fmt.Sprintf("\"%v\"", tTime.Format("2006-01-02 15:04:05"))), nil
+}
+
+func (t LocalTime) Value() (driver.Value, error) {
+	var zeroTime time.Time
+	tlt := time.Time(t)
+	//判断给定时间是否和默认零时间的时间戳相同
+	if tlt.UnixNano() == zeroTime.UnixNano() {
+		return nil, nil
+	}
+	return tlt, nil
+}
+
+func (t *LocalTime) Scan(v interface{}) error {
+	if value, ok := v.(time.Time); ok {
+		*t = LocalTime(value)
+		return nil
+	}
+	return fmt.Errorf("can not convert %v to timestamp", v)
+}

+ 1 - 1
models/ai_summary/ai_summary_classify.go

@@ -41,7 +41,7 @@ type AiSummaryClassifyItems struct {
 	Sort                int                       `gorm:"column:sort;type:int(9) unsigned;default:10"`                // 排序字段,越小越靠前,默认值:10
 	RootId              int                       `gorm:"column:root_id;type:int(11);not null;default:0"`             // 顶级ID
 	HasData             int                       `gorm:"column:has_data;type:tinyint(4);default:0"`                  // 是否存在指标数据:1有,2:无
-	AiSummaryId         int                       `description:"纪要id" gorm:"-"`
+	AiSummaryId         int                       `description:"纪要id" gorm:"ai_summary_id"`
 	UniqueCode          string                    `description:"唯一编码" gorm:"-"`
 	Children            []*AiSummaryClassifyItems `gorm:"-"`
 }

+ 0 - 1
models/bi_dashboard/bi_dashboard.go

@@ -87,7 +87,6 @@ type BiDashboardEditingCache struct {
 type DashboardDetailResp struct {
 	*BiDashboard
 	IsGrant   int                     `description:"是否共享,0:不是,1:是"`
-	IsEditing bool                    `description:"是否有人编辑"`
 	Editor    BiDashboardEditingCache `description:"编辑人信息"`
 	List      []*BiDashboardDetail
 }

+ 4 - 2
models/bi_dashboard/bi_dashboard_home_page.go

@@ -8,7 +8,7 @@ import (
 type BiDashboardHomePage struct {
 	BiDashboardHomePageId int       `gorm:"primaryKey;autoIncrement;comment:'bi首页看板id'"`
 	BiDashboardId         int       `gorm:"type:int(10);default:null;comment:'看板id'"`
-	AdminId               int       `gorm:"type:int(10);default:null;comment:'1图表 2表格'"`
+	AdminId               int       `gorm:"type:int(10);default:null;"`
 	CreateTime            time.Time `gorm:"type:datetime;comment:'创建时间'"`
 	ModifyTime            time.Time `gorm:"type:datetime;comment:'更新时间'"`
 	FromType              int       `gorm:"type:int(10);default:null;comment:'来源,前端跳转用 1我的 2共享 3公共"`
@@ -21,7 +21,9 @@ func (m *BiDashboardHomePage) TableName() string {
 
 // get
 func GetBiDashboardHomePageById(id int) (item *BiDashboardHomePage, err error) {
-	err = global.DEFAULT_DmSQL.Where("admin_id = ?", id).First(&item).Error
+	sql := ` SELECT a.* FROM bi_dashboard_home_page AS a INNER JOIN bi_dashboard AS b 
+ON a.bi_dashboard_id = b.bi_dashboard_id WHERE a.admin_id = ? `
+	err = global.DEFAULT_DmSQL.Raw(sql, id).First(&item).Error
 	return
 }
 

+ 7 - 8
models/data_manage/chart_info.go

@@ -157,7 +157,7 @@ func GetChartInfoById(chartInfoId int) (item *ChartInfo, err error) {
 func GetChartInfoViewById(chartInfoId int) (item *ChartInfoView, err error) {
 	o := global.DmSQL["data"]
 	sql := ` SELECT * FROM chart_info WHERE chart_info_id=? `
-	err = o.Raw(sql, chartInfoId).Scan(&item).Error
+	err = o.Raw(sql, chartInfoId).First(&item).Error
 
 	return
 }
@@ -508,7 +508,7 @@ func getEdbDataListByMysql(source, subSource, edbInfoId int, startDate, endDate
 	}
 	var pars []interface{}
 	//pars = append(pars, edbInfoId)
-	sql := `SELECT edb_data_id,edb_info_id,data_time,value,data_timestamp FROM %s WHERE edb_info_id=? `
+	sql := `SELECT edb_data_id,edb_info_id,data_time,"value",data_timestamp FROM %s WHERE edb_info_id=? `
 	if startDate != "" {
 		sql += ` AND data_time>=? `
 		pars = append(pars, startDate)
@@ -928,7 +928,6 @@ func ModifyChartInfoAndMapping(edbInfoIdStr string, req *SaveChartInfoReq, chart
 			_ = to.Commit()
 		}
 	}()
-
 	//非季节图
 	if chartType != 2 {
 		updateStr := `edb_info_ids=?,
@@ -952,7 +951,7 @@ func ModifyChartInfoAndMapping(edbInfoIdStr string, req *SaveChartInfoReq, chart
 		pars = append(pars, req.ChartInfoId)
 
 		sql := ` UPDATE  chart_info SET ` + updateStr + ` WHERE chart_info_id = ?`
-		err = to.Exec(sql, pars).Error
+		err = to.Exec(sql, pars...).Error
 		if err != nil {
 			fmt.Println("UPDATE  chart_info Err:", err.Error())
 			return err
@@ -1157,7 +1156,7 @@ func EditChartInfoAndMapping(req *EditChartInfoReq, edbInfoIdStr string, calenda
 	sql += `WHERE chart_info_id = ?`
 
 	pars = append(pars, req.ChartInfoId)
-	err = to.Exec(sql, pars).Error
+	err = to.Exec(sql, pars...).Error
 	if err != nil {
 		fmt.Println("UPDATE  chart_info Err:", err.Error())
 		return err
@@ -1315,7 +1314,7 @@ func EditFutureGoodChartInfoAndMapping(req *EditFutureGoodChartInfoReq, edbInfoI
 	sql += `WHERE chart_info_id = ?`
 
 	pars = append(pars, req.ChartInfoId)
-	err = to.Exec(sql, pars).Error
+	err = to.Exec(sql, pars...).Error
 	if err != nil {
 		fmt.Println("UPDATE  chart_info Err:", err.Error())
 		return err
@@ -1807,7 +1806,7 @@ func ChartInfoSearchByEmptyKeyWord(showSysId int, sourceList []int, noPermission
 
 	// 查找数量
 	totalSql := " SELECT count(1) as total " + baseSql
-	err = o.Raw(totalSql, basePars).Scan(&total).Error
+	err = o.Raw(totalSql, basePars...).Scan(&total).Error
 	if err != nil {
 		return
 	}
@@ -1816,7 +1815,7 @@ func ChartInfoSearchByEmptyKeyWord(showSysId int, sourceList []int, noPermission
 	sql := " SELECT *  " + baseSql + ` ORDER BY create_time DESC LIMIT ?,? `
 	basePars = append(basePars, startSize)
 	basePars = append(basePars, pageSize)
-	err = o.Raw(sql, basePars).Scan(&searchList).Error
+	err = o.Raw(sql, basePars...).Scan(&searchList).Error
 
 	return
 }

+ 2 - 1
models/data_manage/chart_info_correlation.go

@@ -10,7 +10,7 @@ import (
 
 // ChartInfoCorrelation 相关性图表-扩展信息
 type ChartInfoCorrelation struct {
-	CorrelationChartInfoId int       `orm:"column(correlation_chart_info_id);pk" gorm:"primaryKey"  description:"相关性图表ID(chart_info表source=3的)"`
+	CorrelationChartInfoId int       `orm:"column(correlation_chart_info_id);pk" gorm:"primaryKey;autoIncrement:false"  description:"相关性图表ID(chart_info表source=3的)"`
 	LeadValue              int       `description:"领先值"`
 	LeadUnit               string    `description:"领先单位"`
 	CalculateValue         int       `description:"计算窗口"`
@@ -127,6 +127,7 @@ func CreateCorrelationChartAndEdb(chartInfo *ChartInfo, edbMappingList []*ChartE
 			return
 		}
 	}
+
 	// 相关性信息
 	correlationInfo.CorrelationChartInfoId = chartInfoId
 	err = tx.Create(correlationInfo).Error

+ 1 - 1
models/data_manage/chart_info_range_analysis.go

@@ -354,7 +354,7 @@ func EditRangeChartInfo(req *SaveChartRangeReq) (err error) {
 	sql += `WHERE chart_info_id = ?`
 
 	pars = append(pars, req.ChartInfoId)
-	err = to.Exec(sql, pars).Error
+	err = to.Exec(sql, pars...).Error
 	if err != nil {
 		fmt.Println("UPDATE  chart_info Err:", err.Error())
 		return err

+ 16 - 0
models/data_manage/chart_info_resp.go

@@ -0,0 +1,16 @@
+package data_manage
+
+import "eta_gn/eta_api/utils"
+
+// ConvertToResp
+// @Description: 转成需要输出的格式
+// @receiver m
+func (m *ChartEdbInfoMapping) ConvertToResp() {
+	m.ModifyTime = utils.GormDateStrToDateTimeStr(m.ModifyTime)
+	m.StartDate = utils.GormDateStrToDateStr(m.StartDate)
+	m.EndDate = utils.GormDateStrToDateStr(m.EndDate)
+	m.LatestDate = utils.GormDateStrToDateStr(m.LatestDate)
+	m.MoveLatestDate = utils.GormDateStrToDateStr(m.MoveLatestDate)
+
+	return
+}

+ 12 - 2
models/data_manage/edb_classify.go

@@ -133,6 +133,7 @@ type DeleteEdbClassifyReq struct {
 	EdbInfoId  int `description:"指标id"`
 }
 
+// TODO: sql优化,后续解决
 func GetEdbInfoCountByClassifyId(classifyId int) (count int, err error) {
 	sql := ` SELECT COUNT(1) AS count FROM edb_info AS a
 				WHERE a.classify_id IN(
@@ -381,6 +382,7 @@ type MoveEdbClassifyReq struct {
 	EdbInfoId        int `description:"指标ID, 如果指标ID有值,则移动对象为指标,否则认为移动对象为分类"`
 	PrevEdbInfoId    int `description:"上一个指标ID"`
 	NextEdbInfoId    int `description:"下一个指标ID"`
+	ClassifyType     int `description:"分类类型:0-指标库;2-计算指标"`
 }
 
 // GetFirstEdbClassifyByParentId 获取当前父级分类下,且排序数相同 的排序第一条的数据
@@ -412,7 +414,7 @@ func (edbClassify *EdbClassify) Update(cols []string) (err error) {
 
 // GetEdbClassifyMaxSort 获取分类下最大的排序数
 func GetEdbClassifyMaxSort(parentId int, classifyType uint8) (sort int, err error) {
-	sql := `SELECT Max(sort) AS sort FROM edb_classify WHERE parent_id=? AND classify_type=? `
+	sql := `SELECT COALESCE(Max(sort), 0) AS sort FROM edb_classify WHERE parent_id=? AND classify_type=? `
 	err = global.DmSQL["data"].Raw(sql, parentId, classifyType).Scan(&sort).Error
 
 	return
@@ -420,7 +422,7 @@ func GetEdbClassifyMaxSort(parentId int, classifyType uint8) (sort int, err erro
 
 // GetEdbInfoMaxSortByClassifyId 获取分类下指标的最大的排序数
 func GetEdbInfoMaxSortByClassifyId(classifyId int) (sort int, err error) {
-	sql := `SELECT Max(sort) AS sort FROM edb_info WHERE classify_id=? `
+	sql := `SELECT COALESCE(Max(sort), 0) AS sort FROM edb_info WHERE classify_id=? `
 	err = global.DmSQL["data"].Raw(sql, classifyId).Scan(&sort).Error
 
 	return
@@ -675,3 +677,11 @@ func GetEdbClassifyRootIdsByClassifyIds(classifyIds []int) (items []int, err err
 
 	return
 }
+
+// GetChildEdbClassifyByClassifyType 根据类型获取非顶级分类
+func GetChildEdbClassifyByClassifyType(classifyType 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`
+	err = o.Raw(sql, classifyType).Find(&items).Error
+	return
+}

+ 226 - 0
models/data_manage/edb_collect.go

@@ -0,0 +1,226 @@
+package data_manage
+
+import (
+	"eta_gn/eta_api/global"
+	"eta_gn/eta_api/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"strings"
+	"time"
+)
+
+// EdbCollect 指标收藏
+type EdbCollect struct {
+	EdbCollectId         int       `gorm:"primaryKey;autoIncrement;column:edb_collect_id;type:int(10) unsigned;not null"`
+	EdbCollectClassifyId int       `gorm:"index:idx_classify_id;column:edb_collect_classify_id;type:int(10) unsigned;not null;default:0"` // 指标收藏分类ID
+	EdbInfoId            int       `gorm:"column:edb_info_id;type:int(10) unsigned;not null;default:0"`                                   // 指标ID
+	EdbCode              string    `gorm:"column:edb_code;type:varchar(255);not null;default:''"`                                         // 指标编码
+	SysUserId            int       `gorm:"column:sys_user_id;type:int(10) unsigned;not null;default:0"`                                   // 创建人ID
+	SysRealName          string    `gorm:"column:sys_real_name;type:int(10) unsigned;not null;default:0"`                                 // 创建人姓名
+	Sort                 int       `gorm:"column:sort;type:int(10);default:0"`                                                            // 排序
+	CreateTime           time.Time `gorm:"column:create_time;type:datetime"`                                                              // 创建时间
+	ModifyTime           time.Time `gorm:"column:modify_time;type:datetime"`                                                              // 更新时间
+}
+
+func (m *EdbCollect) TableName() string {
+	return "edb_collect"
+}
+
+type EdbCollectCols struct {
+	PrimaryId            string
+	EdbCollectClassifyId string
+	EdbInfoId            string
+	EdbCode              string
+	SysUserId            string
+	SysRealName          string
+	Sort                 string
+	CreateTime           string
+	ModifyTime           string
+}
+
+func (m *EdbCollect) Cols() EdbCollectCols {
+	return EdbCollectCols{
+		PrimaryId:            "edb_collect_id",
+		EdbCollectClassifyId: "edb_collect_classify_id",
+		EdbInfoId:            "edb_info_id",
+		EdbCode:              "edb_code",
+		SysUserId:            "sys_user_id",
+		SysRealName:          "sys_real_name",
+		Sort:                 "sort",
+		CreateTime:           "create_time",
+		ModifyTime:           "modify_time",
+	}
+}
+
+func (m *EdbCollect) Create() (err error) {
+	err = global.DmSQL["data"].Create(m).Error
+	return
+}
+
+func (m *EdbCollect) CreateMulti(items []*EdbCollect) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	err = global.DmSQL["data"].CreateInBatches(items, utils.MultiAddNum).Error
+	return
+}
+
+func (m *EdbCollect) Update(cols []string) (err error) {
+	err = global.DmSQL["data"].Select(cols).Updates(m).Error
+	return
+}
+
+func (m *EdbCollect) Remove() (err error) {
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
+	err = global.DmSQL["data"].Exec(sql, m.EdbCollectId).Error
+	return
+}
+
+func (m *EdbCollect) MultiRemove(ids []int) (err error) {
+	if len(ids) == 0 {
+		return
+	}
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.Cols().PrimaryId, utils.GetOrmInReplace(len(ids)))
+	err = global.DmSQL["data"].Exec(sql, ids).Error
+	return
+}
+
+func (m *EdbCollect) RemoveByCondition(condition string, pars []interface{}) (err error) {
+	if condition == "" {
+		return
+	}
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s`, m.TableName(), condition)
+	err = global.DmSQL["data"].Exec(sql, pars...).Error
+	return
+}
+
+func (m *EdbCollect) GetItemById(id int) (item *EdbCollect, err error) {
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
+	err = global.DmSQL["data"].Raw(sql, id).First(&item).Error
+	return
+}
+
+func (m *EdbCollect) GetItemByCondition(condition string, pars []interface{}, orderRule string) (item *EdbCollect, err error) {
+	order := ``
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s %s LIMIT 1`, m.TableName(), condition, order)
+	err = global.DmSQL["data"].Raw(sql, pars...).First(&item).Error
+	return
+}
+
+func (m *EdbCollect) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
+	err = global.DmSQL["data"].Raw(sql, pars...).Scan(&count).Error
+	return
+}
+
+func (m *EdbCollect) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*EdbCollect, err error) {
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := fmt.Sprintf(`ORDER BY %s DESC`, m.Cols().CreateTime)
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	err = global.DmSQL["data"].Raw(sql, pars...).Find(&items).Error
+	return
+}
+
+func (m *EdbCollect) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*EdbCollect, err error) {
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := fmt.Sprintf(`ORDER BY %s DESC`, m.Cols().CreateTime)
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
+	pars = append(pars, startSize, pageSize)
+	err = global.DmSQL["data"].Raw(sql, pars...).Find(&items).Error
+	return
+}
+
+// GetCollectEdbInfoByClassifyId 获取分类下收藏的指标信息
+func GetCollectEdbInfoByClassifyId(classifyId int) (items []*EdbInfo, err error) {
+	sql := `SELECT b.* FROM edb_collect AS a JOIN edb_info AS b ON a.edb_info_id = b.edb_info_id WHERE a.edb_collect_classify_id = ? ORDER BY a.sort ASC`
+	err = global.DmSQL["data"].Raw(sql, classifyId).Find(&items).Error
+	return
+}
+
+// EdbCollectReq 加入/取消收藏
+type EdbCollectReq struct {
+	ClassifyId int `description:"分类ID"`
+	EdbInfoId  int `description:"指标ID"`
+}
+
+// GetCollectEdbInfoCount 获取收藏的指标信息总数
+func GetCollectEdbInfoCount(condition string, pars []interface{}) (total int64, err error) {
+	sql := fmt.Sprintf(`SELECT COUNT(1) AS ct FROM (
+	  SELECT b.* FROM edb_collect AS a JOIN edb_info AS b ON a.edb_info_id = b.edb_info_id
+	  WHERE 1=1 %s
+	  ORDER BY a.create_time DESC
+	) AS sub`, condition)
+	err = global.DmSQL["data"].Raw(sql, pars...).Scan(&total).Error
+	return
+}
+
+// GetCollectEdbInfoPageList 获取收藏的指标信息列表-分页
+func GetCollectEdbInfoPageList(condition string, pars []interface{}, startSize, pageSize int) (list []*CollectEdbInfoQuery, err error) {
+	sql := fmt.Sprintf(`SELECT b.*, a.edb_collect_classify_id AS collect_classify_id FROM edb_collect AS a JOIN edb_info AS b ON a.edb_info_id = b.edb_info_id
+	  WHERE 1=1 %s
+	  ORDER BY a.create_time DESC LIMIT ?,?`, condition)
+	pars = append(pars, startSize, pageSize)
+	err = global.DmSQL["data"].Raw(sql, pars...).Scan(&list).Error
+	return
+}
+
+type CollectEdbInfoQuery struct {
+	EdbInfo
+	CollectClassifyId int `gorm:"column:collect_classify_id" description:"收藏分类ID"`
+}
+
+// CollectEdbInfoItem 收藏列表指标信息
+type CollectEdbInfoItem struct {
+	EdbInfoId         int    `description:"指标ID"`
+	EdbInfoType       int    `description:"指标类型:0-普通指标; 1-预测指标"`
+	EdbType           int    `description:"指标类型:1-基础指标; 2-计算指标"`
+	Source            int    `description:"来源ID"`
+	SourceName        string `description:"来源名称"`
+	EdbCode           string `description:"指标编码"`
+	EdbName           string `description:"指标名称"`
+	Frequency         string `description:"频率"`
+	Unit              string `description:"单位"`
+	UniqueCode        string `description:"唯一编码"`
+	ChartImage        string `description:"图表图片"`
+	ClassifyId        int    `description:"指标分类ID"`
+	CollectClassifyId int    `description:"收藏分类ID"`
+}
+
+func FormatEdbInfo2CollectItem(origin *CollectEdbInfoQuery) (item *CollectEdbInfoItem) {
+	item = new(CollectEdbInfoItem)
+	item.EdbInfoId = origin.EdbInfoId
+	item.EdbInfoType = origin.EdbInfoType
+	item.EdbType = origin.EdbType
+	item.Source = origin.Source
+	item.SourceName = origin.SourceName
+	item.EdbCode = origin.EdbCode
+	item.EdbName = origin.EdbName
+	item.Frequency = origin.Frequency
+	item.Unit = origin.Unit
+	item.UniqueCode = origin.UniqueCode
+	item.ChartImage = origin.ChartImage
+	item.ClassifyId = origin.ClassifyId
+	item.CollectClassifyId = origin.CollectClassifyId
+	return
+}
+
+// CollectEdbInfoListResp 收藏指标分页列表相应
+type CollectEdbInfoListResp struct {
+	Paging *paging.PagingItem
+	List   []*CollectEdbInfoItem
+}

+ 249 - 0
models/data_manage/edb_collect_classify.go

@@ -0,0 +1,249 @@
+package data_manage
+
+import (
+	"eta_gn/eta_api/global"
+	"eta_gn/eta_api/utils"
+	"fmt"
+	"strings"
+	"time"
+)
+
+// EdbCollectClassify 指标收藏分类
+type EdbCollectClassify struct {
+	EdbCollectClassifyId int       `gorm:"primaryKey;autoIncrement;column:edb_collect_classify_id;type:int(10) unsigned;not null"`
+	ClassifyName         string    `gorm:"column:classify_name;type:varchar(255);not null;default:''"`     // 分类名称
+	ParentId             int       `gorm:"column:parent_id;type:int(10) unsigned;not null;default:0"`      // 父级Id
+	SysUserId            int       `gorm:"column:sys_user_id;type:int(10) unsigned;not null;default:0"`    // 创建人Id
+	SysUserRealName      string    `gorm:"column:sys_user_real_name;type:varchar(128);not null"`           // 创建人姓名
+	UniqueCode           string    `gorm:"unique;column:unique_code;type:varchar(64);not null;default:''"` // 唯一编码
+	Level                int       `gorm:"column:level;type:int(10) unsigned;not null;default:0"`          // 层级
+	Sort                 int       `gorm:"column:sort;type:int(10) unsigned;not null;default:0"`           // 排序
+	RootId               int       `gorm:"column:root_id;type:int(10) unsigned;not null;default:0"`        // 顶级Id
+	LevelPath            string    `gorm:"column:level_path;type:varchar(255);not null;default:''"`        // 层级路径,逗号分隔
+	CreateTime           time.Time `gorm:"column:create_time;type:datetime"`                               // 创建时间
+	ModifyTime           time.Time `gorm:"column:modify_time;type:datetime"`                               // 修改时间
+}
+
+func (m *EdbCollectClassify) TableName() string {
+	return "edb_collect_classify"
+}
+
+type EdbCollectClassifyCols struct {
+	PrimaryId       string
+	ClassifyName    string
+	ParentId        string
+	SysUserId       string
+	SysUserRealName string
+	UniqueCode      string
+	Level           string
+	Sort            string
+	RootId          string
+	LevelPath       string
+	CreateTime      string
+	ModifyTime      string
+}
+
+func (m *EdbCollectClassify) Cols() EdbCollectClassifyCols {
+	return EdbCollectClassifyCols{
+		PrimaryId:       "edb_collect_classify_id",
+		ClassifyName:    "classify_name",
+		ParentId:        "parent_id",
+		SysUserId:       "sys_user_id",
+		SysUserRealName: "sys_user_real_name",
+		UniqueCode:      "unique_code",
+		Level:           "level",
+		Sort:            "sort",
+		RootId:          "root_id",
+		LevelPath:       "level_path",
+		CreateTime:      "create_time",
+		ModifyTime:      "modify_time",
+	}
+}
+
+func (m *EdbCollectClassify) Create() (err error) {
+	err = global.DmSQL["data"].Create(m).Error
+	return
+}
+
+func (m *EdbCollectClassify) CreateMulti(items []*EdbCollectClassify) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	err = global.DmSQL["data"].CreateInBatches(items, utils.MultiAddNum).Error
+	return
+}
+
+func (m *EdbCollectClassify) Update(cols []string) (err error) {
+	err = global.DmSQL["data"].Select(cols).Updates(m).Error
+	return
+}
+
+func (m *EdbCollectClassify) Remove() (err error) {
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
+	err = global.DmSQL["data"].Exec(sql, m.EdbCollectClassifyId).Error
+	return
+}
+
+func (m *EdbCollectClassify) MultiRemove(ids []int) (err error) {
+	if len(ids) == 0 {
+		return
+	}
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.Cols().PrimaryId, utils.GetOrmInReplace(len(ids)))
+	err = global.DmSQL["data"].Exec(sql, ids).Error
+	return
+}
+
+func (m *EdbCollectClassify) RemoveByCondition(condition string, pars []interface{}) (err error) {
+	if condition == "" {
+		return
+	}
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s`, m.TableName(), condition)
+	err = global.DmSQL["data"].Exec(sql, pars...).Error
+	return
+}
+
+func (m *EdbCollectClassify) GetItemById(id int) (item *EdbCollectClassify, err error) {
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE %s = ? LIMIT 1`, m.TableName(), m.Cols().PrimaryId)
+	err = global.DmSQL["data"].Raw(sql, id).First(&item).Error
+	return
+}
+
+func (m *EdbCollectClassify) GetItemByCondition(condition string, pars []interface{}, orderRule string) (item *EdbCollectClassify, err error) {
+	order := ``
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s %s LIMIT 1`, m.TableName(), condition, order)
+	err = global.DmSQL["data"].Raw(sql, pars...).First(&item).Error
+	return
+}
+
+func (m *EdbCollectClassify) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
+	err = global.DmSQL["data"].Raw(sql, pars...).Scan(&count).Error
+	return
+}
+
+func (m *EdbCollectClassify) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*EdbCollectClassify, err error) {
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := fmt.Sprintf(`ORDER BY %s DESC`, m.Cols().CreateTime)
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	err = global.DmSQL["data"].Raw(sql, pars...).Find(&items).Error
+	return
+}
+
+func (m *EdbCollectClassify) GetPageItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, startSize, pageSize int) (items []*EdbCollectClassify, err error) {
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := fmt.Sprintf(`ORDER BY %s DESC`, m.Cols().CreateTime)
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
+	pars = append(pars, startSize, pageSize)
+	err = global.DmSQL["data"].Raw(sql, pars...).Find(&items).Error
+	return
+}
+
+func (m *EdbCollectClassify) GetSortMax(parentId int) (sort int, err error) {
+	sql := fmt.Sprintf(`SELECT COALESCE(MAX(%s), 0) FROM %s WHERE %s = ?`, m.Cols().Sort, m.TableName(), m.Cols().ParentId)
+	err = global.DmSQL["data"].Raw(sql, parentId).Scan(&sort).Error
+	return
+}
+
+// EdbCollectClassifyItem 指标收藏分类
+type EdbCollectClassifyItem struct {
+	ClassifyId   int                       `description:"收藏ID"`
+	ClassifyName string                    `description:"指标收藏分类ID"`
+	ParentId     int                       `description:"指标ID"`
+	Level        int                       `description:"指标ID"`
+	Sort         int                       `description:"指标ID"`
+	LevelPath    string                    `description:"层级路径"`
+	UniqueCode   string                    `description:"唯一编码"`
+	Children     []*EdbCollectClassifyItem `description:"子分类"`
+}
+
+func (m *EdbCollectClassify) Format2Item() (item *EdbCollectClassifyItem) {
+	item = new(EdbCollectClassifyItem)
+	item.ClassifyId = m.EdbCollectClassifyId
+	item.ClassifyName = m.ClassifyName
+	item.ParentId = m.ParentId
+	item.Level = m.Level
+	item.Sort = m.Sort
+	item.LevelPath = m.LevelPath
+	item.UniqueCode = m.UniqueCode
+	//item.Children = make([]*EdbCollectClassifyItem, 0)
+	return
+}
+
+// EdbCollectClassifyListItem 指标收藏分类列表
+type EdbCollectClassifyListItem struct {
+	NodeType     int                           `description:"类型: 1-分类; 2-指标"`
+	ClassifyId   int                           `description:"分类ID"`
+	ClassifyName string                        `description:"分类名称"`
+	EdbInfoId    int                           `description:"指标ID"`
+	EdbCode      string                        `description:"指标编码"`
+	EdbName      string                        `description:"指标名称"`
+	ParentId     int                           `description:"父级ID"`
+	Level        int                           `description:"层级"`
+	Sort         int                           `description:"排序"`
+	UniqueCode   string                        `description:"唯一编码, 指标的话用indexCode"`
+	Children     []*EdbCollectClassifyListItem `description:"子分类"`
+}
+
+// EdbCollectClassifyAddReq 新增分类
+type EdbCollectClassifyAddReq struct {
+	ClassifyName string `description:"分类名称"`
+	ParentId     int    `description:"父级ID"`
+	Level        int    `description:"层级"`
+}
+
+// EdbCollectClassifyEditReq 编辑分类
+type EdbCollectClassifyEditReq struct {
+	ClassifyId   int    `description:"分类ID"`
+	ClassifyName string `description:"分类名称"`
+}
+
+// EdbCollectClassifyRemoveReq 删除分类
+type EdbCollectClassifyRemoveReq struct {
+	ClassifyId int `description:"分类ID"`
+}
+
+// RemoveClassifyAndCollect 移除分类及收藏
+func (m *EdbCollectClassify) RemoveClassifyAndCollect(classifyIds []int) (err error) {
+	if len(classifyIds) == 0 {
+		return
+	}
+	tx := global.DmSQL["data"].Begin()
+	defer func() {
+		if err != nil {
+			_ = tx.Rollback()
+			return
+		}
+		_ = tx.Commit()
+	}()
+
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, m.TableName(), m.Cols().PrimaryId, utils.GetOrmInReplace(len(classifyIds)))
+	e := tx.Exec(sql, classifyIds).Error
+	if e != nil {
+		err = fmt.Errorf("remove classify err: %v", e)
+		return
+	}
+
+	collectOb := new(EdbCollect)
+	sql = fmt.Sprintf(`DELETE FROM %s WHERE %s IN (%s)`, collectOb.TableName(), collectOb.Cols().EdbCollectClassifyId, utils.GetOrmInReplace(len(classifyIds)))
+	e = tx.Exec(sql, classifyIds).Error
+	if e != nil {
+		err = fmt.Errorf("remove collect err: %v", e)
+		return
+	}
+	return
+}

+ 15 - 8
models/data_manage/edb_data_insert_config.go

@@ -15,7 +15,7 @@ import (
 
 // EdbDataInsertConfig 指标数据插入配置表
 type EdbDataInsertConfig struct {
-	EdbInfoId  int       `orm:"column(edb_info_id);pk" gorm:"primaryKey"  description:"指标id"`
+	EdbInfoId  int       `orm:"column(edb_info_id);pk" gorm:"primaryKey;autoIncrement:false"  description:"指标id"`
 	Date       time.Time `description:"插入的日期"`
 	Value      string    `description:"插入的值"`
 	RealDate   time.Time `description:"实际数据的值日期"`
@@ -89,7 +89,7 @@ func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value st
 		err = nil
 
 		// 如果是没有配置,那么就需要添加配置
-		if item == nil {
+		if item == nil || item.EdbInfoId <= 0 {
 			var currLatestDate time.Time
 			currLatestDateStr := edbInfo.LatestDate // 实际日期
 			if currLatestDateStr != `` && currLatestDateStr != `0000-00-00` {
@@ -97,7 +97,7 @@ func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value st
 			}
 			if !currLatestDate.IsZero() && (currLatestDate.After(date) || currLatestDate.Equal(date)) {
 				errMsg = `选择日期不能早于/等于数据最新日期`
-				err = errors.New("选择日期不能早于/等于数据最新日期,数据最新日期:" + edbInfo.EndDate + ";填写日期:" + dateStr)
+				err = errors.New("选择日期不能早于/等于数据最新日期,数据最新日期:" + utils.TimeToFormatDate(edbInfo.EndDate) + ";填写日期:" + dateStr)
 				isSendEmail = false
 				return
 			}
@@ -115,7 +115,7 @@ func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value st
 		} else {
 			if date.Equal(item.RealDate) || date.Before(item.RealDate) {
 				errMsg = `选择日期不能早于/等于数据最新日期`
-				err = errors.New("选择日期不能早于/等于数据最新日期,数据最新日期:" + edbInfo.EndDate + ";填写日期:" + dateStr)
+				err = errors.New("选择日期不能早于/等于数据最新日期,数据最新日期:" + utils.TimeToFormatDate(edbInfo.EndDate) + ";填写日期:" + dateStr)
 				isSendEmail = false
 				return
 			}
@@ -144,8 +144,15 @@ func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value st
 	}
 
 	// 指标信息更新
-	edbInfo.EndDate = dateStr
-	err = to.Select("EndDate").Updates(edbInfo).Error
+	if dateStr != `` {
+		endDateTime, tmpErr := utils.FormatDateStrToTime(dateStr)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		edbInfo.EndDate = endDateTime
+		err = to.Select("EndDate").Updates(edbInfo).Error
+	}
 
 	return
 }
@@ -198,7 +205,7 @@ func updateInsertConfigValueByMysql(to *gorm.DB, edbInfo *EdbInfo, oldConfigDate
 
 		// 如果是没有历史数据,那么就需要增加数据
 		if edbDateData == nil {
-			addSql := ` INSERT INTO %s (edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) VALUES ( %d, "%s", "%s", "%s", now(), now(), %s) `
+			addSql := ` INSERT INTO %s (edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) VALUES ( %d, '%s', '%s', '%s', now(), now(), %s) `
 			addSql = fmt.Sprintf(addSql, tableName, edbInfo.EdbInfoId, edbInfo.EdbCode, dateStr, saveValue, timeStr)
 			err = to.Exec(addSql).Error
 		} else if value == "" {
@@ -216,7 +223,7 @@ func updateInsertConfigValueByMysql(to *gorm.DB, edbInfo *EdbInfo, oldConfigDate
 			deleteSql = fmt.Sprintf(deleteSql, tableName, edbDateData.EdbDataId)
 			err = to.Exec(deleteSql).Error
 		} else {
-			updateSql := `UPDATE %s SET data_time = "%s", value = "%s", modify_time= now(), data_timestamp= %s WHERE edb_data_id = %d;`
+			updateSql := `UPDATE %s SET data_time = '%s', value = '%s', modify_time= now(), data_timestamp= %s WHERE edb_data_id = %d;`
 			updateSql = fmt.Sprintf(updateSql, tableName, dateStr, saveValue, timeStr, edbDateData.EdbDataId)
 			err = to.Exec(updateSql).Error
 		}

+ 89 - 20
models/data_manage/edb_info.go

@@ -20,20 +20,20 @@ import (
 )
 
 type EdbInfo struct {
-	EdbInfoId        int    `gorm:"primaryKey" `
-	EdbInfoType      int    `description:"指标类型,0:普通指标,1:预测指标"`
-	SourceName       string `description:"来源名称"`
-	Source           int    `description:"来源id"`
-	EdbCode          string `description:"指标编码"`
-	EdbName          string `description:"指标名称"`
-	EdbNameEn        string `description:"英文指标名称"`
-	EdbNameSource    string `description:"指标名称来源"`
-	Frequency        string `description:"频率"`
-	Unit             string `description:"单位"`
-	UnitEn           string `description:"英文单位"`
-	StartDate        string `description:"起始日期"`
-	EndDate          string `description:"终止日期"`
-	ClassifyId       int    `description:"分类id"`
+	EdbInfoId        int       `gorm:"primaryKey" `
+	EdbInfoType      int       `description:"指标类型,0:普通指标,1:预测指标"`
+	SourceName       string    `description:"来源名称"`
+	Source           int       `description:"来源id"`
+	EdbCode          string    `description:"指标编码"`
+	EdbName          string    `description:"指标名称"`
+	EdbNameEn        string    `description:"英文指标名称"`
+	EdbNameSource    string    `description:"指标名称来源"`
+	Frequency        string    `description:"频率"`
+	Unit             string    `description:"单位"`
+	UnitEn           string    `description:"英文单位"`
+	StartDate        time.Time `description:"起始日期"`
+	EndDate          time.Time `description:"终止日期"`
+	ClassifyId       int       `description:"分类id"`
 	SysUserId        int
 	SysUserRealName  string
 	UniqueCode       string `description:"指标唯一编码"`
@@ -71,7 +71,8 @@ type EdbInfo struct {
 }
 
 type EdbInfoFullClassify struct {
-	*EdbInfo
+	//*EdbInfo
+	*EdbInfoResp
 	CorrelationStr string `description:"相关性系数字符串"`
 	ClassifyList   []*EdbClassifyIdItems
 	HaveOperaAuth  bool `description:"是否有数据权限,默认:false"`
@@ -188,6 +189,25 @@ func GetEdbInfoListByEdbCodes(source int, edbCodes []string) (items []*EdbInfo,
 	return
 }
 
+func (e *EdbInfo) AfterFind(db *gorm.DB) error {
+	tmpTime, err := time.Parse(utils.FormatDateWallWithLoc, e.LatestDate)
+	if err != nil {
+		return nil
+	}
+	e.LatestDate = tmpTime.Format(utils.FormatDate)
+	//tmpTime, err = time.Parse(utils.FormatDateWallWithLoc, e.StartDate)
+	//if err != nil {
+	//	return nil
+	//}
+	//e.StartDate = tmpTime.Format(utils.FormatDate)
+	//tmpTime, err = time.Parse(utils.FormatDateWallWithLoc, e.EndDate)
+	//if err != nil {
+	//	return nil
+	//}
+	//e.EndDate = tmpTime.Format(utils.FormatDate)
+	return nil
+}
+
 func GetEdbInfoById(edbInfoId int) (item *EdbInfo, err error) {
 	sql := ` SELECT * FROM edb_info WHERE edb_info_id=? `
 	err = global.DmSQL["data"].Raw(sql, edbInfoId).First(&item).Error
@@ -472,6 +492,15 @@ type EdbData struct {
 	Value     float64
 }
 
+func (e *EdbData) AfterFind(db *gorm.DB) (err error) {
+	tmpDataTime, err := time.Parse(utils.FormatDateWallWithLoc, e.DataTime)
+	if err != nil {
+		return nil
+	}
+	e.DataTime = utils.TimeTransferString(utils.FormatDate, tmpDataTime)
+	return nil
+}
+
 type EdbInfoListResp struct {
 	Paging       *paging.PagingItem
 	Item         *EdbInfoList
@@ -483,13 +512,44 @@ type WindEdbInfoList struct {
 	ClassifyList []*EdbClassifyIdItems
 }
 
+func (e *EdbInfoList) AfterFind(db *gorm.DB) (err error) {
+	tmpLatestDate, err := time.Parse(utils.FormatDateWallWithLoc, e.LatestDate)
+	if err != nil {
+		return nil
+	}
+	tmpStartDate, err := time.Parse(utils.FormatDateWallWithLoc, e.StartDate)
+	if err != nil {
+		return nil
+	}
+	tmpEndDate, err := time.Parse(utils.FormatDateWallWithLoc, e.EndDate)
+	if err != nil {
+		return nil
+	}
+	tmpCreateTime, err := time.Parse(utils.FormatDateWallWithLoc, e.CreateTime)
+	if err != nil {
+		return nil
+	}
+	tmpModifyTime, err := time.Parse(utils.FormatDateWallWithLoc, e.ModifyTime)
+	if err != nil {
+		return nil
+	}
+
+	e.LatestDate = utils.TimeTransferString(utils.FormatDate, tmpLatestDate)
+	e.StartDate = utils.TimeTransferString(utils.FormatDate, tmpStartDate)
+	e.EndDate = utils.TimeTransferString(utils.FormatDate, tmpEndDate)
+	e.CreateTime = utils.TimeTransferString(utils.FormatDateTime, tmpCreateTime)
+	e.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, tmpModifyTime)
+
+	return nil
+}
+
 func GetEdbInfoByCondition(condition string, pars []interface{}) (item *EdbInfoList, err error) {
 	o := global.DmSQL["data"]
 	sql := ` SELECT * FROM edb_info WHERE 1=1 `
 	if condition != "" {
 		sql += condition
 	}
-	err = o.Raw(sql, pars...).Scan(&item).Error
+	err = o.Raw(sql, pars...).First(&item).Error
 
 	return
 }
@@ -520,7 +580,7 @@ func GetEdbDataListByCondition(condition string, pars []interface{}, source, sub
 	sql += ` LIMIT ?,? `
 	pars = append(pars, startSize)
 	pars = append(pars, pageSize)
-	err = o.Raw(sql, pars...).Scan(&item).Error
+	err = o.Raw(sql, pars...).Find(&item).Error
 
 	return
 }
@@ -757,11 +817,10 @@ func GetEdbInfoAllCalculateByEdbInfoIdList(edbInfoIdList []int) (list []*EdbInfo
 		return
 	}
 
-	sql := ` SELECT b.* FROM edb_info_calculate_mapping AS a
+	sql := ` SELECT DISTINCT b.* FROM edb_info_calculate_mapping AS a
 			 INNER JOIN edb_info AS b ON a.edb_info_id=b.edb_info_id
              WHERE a.from_edb_info_id in (` + utils.GetOrmInReplace(num) + `)
-			 GROUP BY a.edb_info_id
-			 ORDER BY a.edb_info_id ASC `
+			 ORDER BY b.edb_info_id ASC `
 	err = global.DmSQL["data"].Raw(sql, edbInfoIdList).Scan(&list).Error
 
 	return
@@ -1333,6 +1392,8 @@ func GetEdbInfoListByCondition(condition string, pars []interface{}, startSize,
 	sql += orderDesc
 	sql += ` LIMIT ?,? `
 
+	pars = append(pars, startSize)
+	pars = append(pars, pageSize)
 	err = o.Raw(sql, pars...).Scan(&items).Error
 
 	return
@@ -1951,3 +2012,11 @@ func getThsHfAllDataByMongo(edbInfoId, source, subSource int, startDataTime stri
 
 	return
 }
+
+// GetEdbInfoByTypes 根据类型获取所有指标
+func GetEdbInfoByTypes(edbInfoType, edbType int) (items []*EdbClassifyItems, err error) {
+	o := global.DmSQL["data"]
+	sql := `SELECT edb_info_id,classify_id,edb_name_source AS classify_name,edb_name_en AS classify_name_en,unique_code,source_name,source,sys_user_id,sys_user_real_name,start_date,edb_code,edb_type FROM edb_info WHERE edb_info_type = ? AND edb_type = ? order by sort asc,edb_info_id asc`
+	err = o.Raw(sql, edbInfoType, edbType).Scan(&items).Error
+	return
+}

+ 3 - 2
models/data_manage/edb_info_relation.go

@@ -3,8 +3,9 @@ package data_manage
 import (
 	"eta_gn/eta_api/global"
 	"eta_gn/eta_api/utils"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"time"
+
+	"github.com/rdlucklib/rdluck_tools/paging"
 )
 
 type EdbInfoRelation struct {
@@ -42,7 +43,7 @@ func GetEdbInfoRelationByRelationIds(ids []int) (items []*EdbInfoRelation, err e
 // GetEdbInfoRelationByReferObjectId 查询直接引用的指标ID
 func GetEdbInfoRelationByReferObjectId(referObjectId int, referObjectType int) (items []*EdbInfoRelation, err error) {
 	o := global.DmSQL["data"]
-	msql := ` SELECT * FROM edb_info_relation WHERE refer_object_id =? and relation_type=0 AND refer_object_type=?  GROUP BY edb_info_id `
+	msql := ` SELECT * FROM edb_info_relation WHERE refer_object_id =? and relation_type=0 AND refer_object_type=?  GROUP BY edb_info_id,edb_info_relation_id, source, edb_name, edb_code, refer_object_id, refer_object_type, refer_object_sub_type,create_time,modify_time,relation_time,relation_type, root_edb_info_id, child_edb_info_id,relation_code,parent_relation_id `
 	err = o.Raw(msql, referObjectId, referObjectType).Find(&items).Error
 
 	return

+ 97 - 0
models/data_manage/edb_info_resp.go

@@ -0,0 +1,97 @@
+package data_manage
+
+import (
+	"encoding/json"
+	"eta_gn/eta_api/utils"
+	"fmt"
+)
+
+type EdbInfoResp struct {
+	EdbInfoId        int    `gorm:"primaryKey" `
+	EdbInfoType      int    `description:"指标类型,0:普通指标,1:预测指标"`
+	SourceName       string `description:"来源名称"`
+	Source           int    `description:"来源id"`
+	EdbCode          string `description:"指标编码"`
+	EdbName          string `description:"指标名称"`
+	EdbNameEn        string `description:"英文指标名称"`
+	EdbNameSource    string `description:"指标名称来源"`
+	Frequency        string `description:"频率"`
+	Unit             string `description:"单位"`
+	UnitEn           string `description:"英文单位"`
+	StartDate        string `description:"起始日期"`
+	EndDate          string `description:"终止日期"`
+	ClassifyId       int    `description:"分类id"`
+	SysUserId        int
+	SysUserRealName  string
+	UniqueCode       string `description:"指标唯一编码"`
+	CreateTime       string
+	ModifyTime       string
+	BaseModifyTime   string
+	MinValue         float64 `description:"指标最小值"`
+	MaxValue         float64 `description:"指标最大值"`
+	CalculateFormula string  `description:"计算公式"`
+	EdbType          int     `description:"指标类型:1:基础指标,2:计算指标"`
+	Sort             int     `description:"排序字段"`
+	LatestDate       string  `description:"数据最新日期(实际日期)"`
+	LatestValue      float64 `description:"数据最新值(实际值)"`
+	EndValue         float64 `description:"数据的最新值(预测日期的最新值)"`
+	MoveType         int     `description:"移动方式:1:领先(默认),2:滞后"`
+	MoveFrequency    string  `description:"移动频度"`
+	NoUpdate         int8    `description:"是否停止更新,0:继续更新;1:停止更新"`
+	ServerUrl        string  `description:"服务器地址"`
+	ChartImage       string  `description:"图表图片"`
+	Calendar         string  `description:"公历/农历" orm:"default(公历);"`
+	DataDateType     string  `orm:"column(data_date_type);size(255);null;default(交易日)"`
+	ManualSave       int     `description:"是否有手动保存过上下限: 0-否; 1-是"`
+	EmptyType        int     `description:"空值处理类型(0查找前后35天,1不计算,2前值填充,3后值填充,4等于0)"`
+	MaxEmptyType     int     `description:"MAX、MIN公式空值处理类型(1、等于0;2、跳过空值)"`
+	TerminalCode     string  `description:"终端编码,用于配置在机器上"`
+	DataUpdateTime   string  `description:"最近一次数据发生变化的时间"`
+	ErDataUpdateDate string  `description:"本次更新,数据发生变化的最早日期"`
+	SourceIndexName  string  `description:"数据源中的指标名称"`
+	SubSource        int     `description:"子数据来源:0:经济数据库,1:日期序列"`
+	SubSourceName    string  `description:"子数据来源名称"`
+	IndicatorCode    string  `description:"指标代码"`
+	StockCode        string  `description:"证券代码"`
+	Extra            string  `description:"指标额外配置"`
+	IsJoinPermission int     `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
+}
+
+// ConvertToResp
+// @Description:
+// @receiver m
+// @return *EdbInfoResp
+// @return error
+func (m EdbInfo) ConvertToResp() (*EdbInfoResp, error) {
+	result := new(EdbInfoResp)
+
+	jsonBytes, err := json.Marshal(m)
+	if err != nil {
+		return nil, fmt.Errorf("failed to marshal input: %w", err)
+	}
+
+	err = json.Unmarshal(jsonBytes, result)
+	if err != nil {
+		return nil, fmt.Errorf("failed to unmarshal input: %w", err)
+	}
+
+	// 通过反射处理时间字段
+	fieldsToProcess := []string{"CreateTime", "ModifyTime", "BaseModifyTime", "StartDate", "EndDate"}
+
+	err = utils.ReflectSetField(m, result, fieldsToProcess)
+
+	return result, err
+}
+
+// ConvertToResp
+// @Description: 转成需要输出的格式
+// @receiver m
+func (m *EdbInfoList) ConvertToResp() {
+	m.CreateTime = utils.GormDateStrToDateTimeStr(m.CreateTime)
+	m.ModifyTime = utils.GormDateStrToDateTimeStr(m.ModifyTime)
+	m.StartDate = utils.GormDateStrToDateStr(m.StartDate)
+	m.EndDate = utils.GormDateStrToDateStr(m.EndDate)
+	m.LatestDate = utils.GormDateStrToDateStr(m.LatestDate)
+
+	return
+}

+ 1 - 1
models/data_manage/multiple_graph_config.go

@@ -152,7 +152,7 @@ func ReplaceEdbInfoInLineEquationMultipleGraphConfig(oldEdbInfo, newEdbInfo *Edb
 		//	return
 		//}
 
-		csql := `SELECT * FROM multiple_graph_config WHERE edb_info_id_a=0 AND edb_info_id_b=0 AND curve !=""`
+		csql := `SELECT * FROM multiple_graph_config WHERE edb_info_id_a=0 AND edb_info_id_b=0 AND curve !=''`
 		err = to.Raw(csql).Find(&multipleGraphConfigList).Error
 		if err != nil {
 			errmsg = "获取指标关联图表配置信息失败:Err:" + err.Error()

+ 19 - 7
models/data_manage/my_chart.go

@@ -1137,17 +1137,29 @@ func GetMyChartListGroupByCharyInfoIdAndAdminIdByCondition(condition string, par
 	//sql += " GROUP BY a.chart_info_id,a.admin_id ORDER BY c.sort DESC "
 	//_, err = o.Raw(sql, pars).QueryRows(&item)
 
-	sql := ` SELECT a.admin_id,a.my_chart_id,c.sort,b.*,GROUP_CONCAT(DISTINCT d.my_chart_classify_name) AS my_chart_classify_name,GROUP_CONCAT(DISTINCT d.my_chart_classify_id) AS my_chart_classify_id
-			FROM  my_chart AS a
-			INNER JOIN chart_info AS b ON a.chart_info_id=b.chart_info_id
-			INNER JOIN my_chart_classify_mapping AS c ON a.my_chart_id=c.my_chart_id
-			INNER JOIN my_chart_classify AS d ON c.my_chart_classify_id=d.my_chart_classify_id
-			WHERE 1=1 `
+	//sql := ` SELECT a.admin_id,a.my_chart_id,c.sort,b.*,LISTAGG(DISTINCT d.my_chart_classify_name, ',') WITHIN GROUP (ORDER BY d.my_chart_classify_name) AS my_chart_classify_name,LISTAGG(d.my_chart_classify_id, ',') WITHIN GROUP (ORDER BY d.my_chart_classify_id) AS my_chart_classify_id
+	//		FROM  my_chart AS a
+	//		INNER JOIN chart_info AS b ON a.chart_info_id=b.chart_info_id
+	//		INNER JOIN my_chart_classify_mapping AS c ON a.my_chart_id=c.my_chart_id
+	//		INNER JOIN my_chart_classify AS d ON c.my_chart_classify_id=d.my_chart_classify_id
+	//		WHERE 1=1 `
+	//
+	//if condition != "" {
+	//	sql += condition
+	//}
+	//sql += " GROUP BY a.chart_info_id,a.admin_id ORDER BY c.sort DESC "
 
+	sql := `SELECT a.admin_id,a.my_chart_id,c.sort,b.chart_info_id, b.chart_name, b.unique_code, b.chart_classify_id, b.sys_user_id, b.sys_user_real_name, b.create_time, b.modify_time, b.date_type, b.start_date, b.end_date, b.is_set_name, b.edb_info_ids, b.chart_type, b.calendar, b.season_start_date, b.season_end_date, b.chart_image, b.sort, b.edb_end_date, b.x_min, b.x_max, b.left_min, b.left_max, b.right_min, b.right_max, b.right2_min, b.right2_max, b.min_max_save, b.chart_name_en, b.disabled, b.bar_config, b.source, b.extra_config, b.season_extra_config, b.start_year, b.chart_theme_id, b.sources_from, b.instructions, b.markers_lines, b.markers_areas, b.unit, b.unit_en, b.is_join_permission, b.forum_chart_info_id, b.chart_alias, b.date_type_num,LISTAGG(DISTINCT d.my_chart_classify_name, ',') WITHIN GROUP (ORDER BY d.my_chart_classify_name) AS my_chart_classify_name,LISTAGG(d.my_chart_classify_id, ',') WITHIN GROUP (ORDER BY d.my_chart_classify_id) AS my_chart_classify_id
+FROM  "eta_index".my_chart AS a
+INNER JOIN "eta_index".chart_info AS b ON a.chart_info_id=b.chart_info_id
+INNER JOIN "eta_index".my_chart_classify_mapping AS c ON a.my_chart_id=c.my_chart_id
+INNER JOIN "eta_index".my_chart_classify AS d ON c.my_chart_classify_id=d.my_chart_classify_id
+WHERE 1=1  `
 	if condition != "" {
 		sql += condition
 	}
-	sql += " GROUP BY a.chart_info_id,a.admin_id ORDER BY c.sort DESC "
+	sql += " GROUP BY a.chart_info_id,a.admin_id,c.sort,a.my_chart_id,b.chart_info_id, b.chart_name, b.unique_code, b.chart_classify_id, b.sys_user_id, b.sys_user_real_name, b.create_time, b.modify_time, b.date_type, b.start_date, b.end_date, b.is_set_name, b.edb_info_ids, b.chart_type, b.calendar, b.season_start_date, b.season_end_date, b.chart_image, b.sort, b.edb_end_date, b.x_min, b.x_max, b.left_min, b.left_max, b.right_min, b.right_max, b.right2_min, b.right2_max, b.min_max_save, b.chart_name_en, b.disabled, b.bar_config, b.source, b.extra_config, b.season_extra_config, b.start_year, b.chart_theme_id, b.sources_from, b.instructions, b.markers_lines, b.markers_areas, b.unit, b.unit_en, b.is_join_permission, b.forum_chart_info_id, b.chart_alias, b.date_type_num" +
+		" ORDER BY c.sort DESC "
 	err = global.DmSQL["data"].Raw(sql, pars...).Find(&item).Error
 	return
 }

+ 2 - 3
models/data_manage/predict_edb_conf.go

@@ -234,11 +234,10 @@ func GetPredictEdbInfoAllCalculate(edbInfoIdList []int) (list []*EdbInfo, err er
 	//		 ORDER BY a.source_edb_info_id ASC `
 	//_, err = o.Raw(sql, edbInfoIdList).QueryRows(&list)
 
-	sql := ` SELECT b.* FROM predict_edb_conf AS a
+	sql := ` SELECT DISTINCT b.* FROM predict_edb_conf AS a
 			 INNER JOIN edb_info AS b ON a.source_edb_info_id=b.edb_info_id
 	        WHERE a.predict_edb_info_id in (` + utils.GetOrmInReplace(num) + `)
-			 GROUP BY a.source_edb_info_id
-			 ORDER BY a.source_edb_info_id ASC `
+			 ORDER BY b.edb_info_id ASC `
 	err = global.DmSQL["data"].Raw(sql, edbInfoIdList).Find(&list).Error
 	return
 }

+ 17 - 1
models/data_manage/supply_analysis/variety.go

@@ -5,6 +5,8 @@ import (
 	"eta_gn/eta_api/utils"
 	"fmt"
 	"time"
+
+	"gorm.io/gorm"
 )
 
 // Variety variety 品种表
@@ -135,6 +137,20 @@ type VarietyButton struct {
 	Analyse bool `description:"分析权限"`
 }
 
+func (v *VarietyItem) AfterFind(db *gorm.DB) error {
+	tmpCreateTime, err := time.Parse(utils.FormatDateWallWithLoc, v.CreateTime)
+	if err != nil {
+		return err
+	}
+	tmpModifyTime, err := time.Parse(utils.FormatDateWallWithLoc, v.ModifyTime)
+	if err != nil {
+		return err
+	}
+	v.CreateTime = utils.TimeTransferString(utils.FormatDateTime, tmpCreateTime)
+	v.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, tmpModifyTime)
+	return nil
+}
+
 // GetListBySuperAdminPage 不区分是否有分析权限的获取分页数据
 func (item Variety) GetListBySuperAdminPage(condition string, pars []interface{}, startSize, pageSize int) (total int, items []*VarietyItem, err error) {
 	baseSql := ` FROM ( SELECT a.variety_id,a.variety_name,a.last_update_sys_user_id,
@@ -159,7 +175,7 @@ a.last_update_sys_user_real_name,a.production_day,a.sys_user_id,a.sys_user_real_
 	listSql := `SELECT * ` + baseSql + ` ORDER BY modify_time DESC,variety_id DESC LIMIT ?,?`
 	pars = append(pars, startSize)
 	pars = append(pars, pageSize)
-	err = global.DmSQL["data"].Raw(listSql, pars...).Scan(&items).Error
+	err = global.DmSQL["data"].Raw(listSql, pars...).Find(&items).Error
 
 	return
 }

+ 30 - 2
models/data_manage/supply_analysis/variety_edb_info.go

@@ -2,7 +2,10 @@ package supply_analysis
 
 import (
 	"eta_gn/eta_api/global"
+	"eta_gn/eta_api/utils"
 	"time"
+
+	"gorm.io/gorm"
 )
 
 // VarietyEdbInfo variety_edb_info 品种指标表
@@ -75,7 +78,32 @@ type VarietyEdbInfoItem struct {
 	Source       int                  `description:"来源,1:影响周度产量;2:周度产量变动;3:影响月度产量;4:月度产量变动" json:"-"`
 	ModifyTime   string               `description:"最近一次更新时间"`
 	CreateTime   string               `description:"添加时间"`
-	Button       VarietyEdbInfoButton `description:"操作按钮权限"`
+	Button       VarietyEdbInfoButton `description:"操作按钮权限" gorm:"-"`
+}
+
+func (v *VarietyEdbInfoItem) AfterFind(db *gorm.DB) error {
+
+	tmpStartDate, err := time.Parse(utils.FormatDateWallWithLoc, v.StartDate)
+	if err != nil {
+		return nil
+	}
+	tmpEndDate, err := time.Parse(utils.FormatDateWallWithLoc, v.EndDate)
+	if err != nil {
+		return nil
+	}
+	tmpModifyTime, err := time.Parse(utils.FormatDateWallWithLoc, v.ModifyTime)
+	if err != nil {
+		return nil
+	}
+	tmpCreateTime, err := time.Parse(utils.FormatDateWallWithLoc, v.CreateTime)
+	if err != nil {
+		return nil
+	}
+	v.StartDate = utils.TimeTransferString(utils.FormatDate, tmpStartDate)
+	v.EndDate = utils.TimeTransferString(utils.FormatDate, tmpEndDate)
+	v.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, tmpModifyTime)
+	v.CreateTime = utils.TimeTransferString(utils.FormatDateTime, tmpCreateTime)
+	return nil
 }
 
 type VarietyEdbInfoButton struct {
@@ -87,7 +115,7 @@ type VarietyEdbInfoButton struct {
 // GetAllVarietyEdbInfoByVarietyId 根据品种id获取所有的指标
 func GetAllVarietyEdbInfoByVarietyId(varietyId int) (items []*VarietyEdbInfoItem, err error) {
 	sql := `SELECT * FROM variety_edb_info AS a WHERE a.variety_id = ? ORDER BY a.variety_edb_id ASC `
-	err = global.DmSQL["data"].Raw(sql, varietyId).Scan(&items).Error
+	err = global.DmSQL["data"].Raw(sql, varietyId).Find(&items).Error
 
 	return
 }

+ 2 - 2
models/data_manage/trade_position_analysis.go

@@ -226,13 +226,13 @@ func MultiInsertTradeBaseDataToTop(exchange string, startDate, endDate string) (
 
 	now := time.Now().Format(utils.FormatDateTime)
 	sql1 := `INSERT INTO trade_position_` + exchange + `_top(classify_name,classify_type,deal_short_name,deal_value,deal_change,data_time,deal_type,source_type,rank,create_time,modify_time)
-		SELECT classify_name,classify_type,buy_short_name,buy_value,buy_change,data_time,1,0,rank,?,? FROM base_from_trade_` + exchange + `_index where rank <50 and buy_short_name !="" and data_time between ? and ?`
+		SELECT classify_name,classify_type,buy_short_name,buy_value,buy_change,data_time,1,0,rank,?,? FROM base_from_trade_` + exchange + `_index where rank <50 and buy_short_name !='' and data_time between ? and ?`
 	err = global.DmSQL["data"].Exec(sql1, now, now, startDate, endDate).Error
 	if err != nil {
 		return
 	}
 	sql2 := `INSERT INTO trade_position_` + exchange + `_top(classify_name,classify_type,deal_short_name,deal_value,deal_change,data_time,deal_type,source_type,rank,create_time,modify_time)
-	SELECT classify_name,classify_type,sold_short_name,sold_value,sold_change,data_time,2,0,rank,?,? FROM base_from_trade_` + exchange + `_index where rank <50 and sold_short_name !="" and data_time between ? and ?`
+	SELECT classify_name,classify_type,sold_short_name,sold_value,sold_change,data_time,2,0,rank,?,? FROM base_from_trade_` + exchange + `_index where rank <50 and sold_short_name !='' and data_time between ? and ?`
 	err = global.DmSQL["data"].Raw(sql2, now, now, startDate, endDate).Error
 	return
 }

+ 22 - 3
models/knowledge/knowledge_classify.go

@@ -52,6 +52,7 @@ func (k *KnowledgeClassify) GetResourceCountByClassifyId(classifyId int) (count
 	return
 }
 
+// GetClassifySubCountByClassifyId 查询当前分类下的子分类是否关联事件
 func (k *KnowledgeClassify) GetClassifySubCountByClassifyId(classifyId int) (count int, err error) {
 
 	sql := `SELECT COUNT(1) as num FROM knowledge_classify AS a
@@ -71,11 +72,29 @@ func (k *KnowledgeClassify) GetClassifySubCountByParentId(classifyId int) (count
 	return
 }
 
+func (k *KnowledgeClassify) GetChildClassifyIdByParentId(classifyId int) (ids []int, err error) {
+	sqlCount := `
+	SELECT classify_id FROM %s AS a
+	WHERE a.parent_id=? `
+	sqlCount = fmt.Sprintf(sqlCount, k.TableName())
+	err = global.DmSQL["rddp"].Raw(sqlCount, classifyId).Scan(&ids).Error
+	return
+}
+
+func (k *KnowledgeClassify) GetChildClassifyIdByParentIds(classifyIds []int) (ids []int, err error) {
+	sqlCount := `
+	SELECT classify_id FROM %s AS a
+	WHERE a.parent_id in (?) `
+	sqlCount = fmt.Sprintf(sqlCount, k.TableName())
+	err = global.DmSQL["rddp"].Raw(sqlCount, classifyIds).Scan(&ids).Error
+	return
+}
+
 // 删除分类
-func (k *KnowledgeClassify) Delete(classifyId int) (err error) {
-	sql := `DELETE FROM %s WHERE classify_id =? `
+func (k *KnowledgeClassify) DeleteByIds(classifyIds []int) (err error) {
+	sql := `DELETE FROM %s WHERE classify_id in (?) `
 	sql = fmt.Sprintf(sql, k.TableName())
-	err = global.DmSQL["rddp"].Exec(sql, classifyId).Error
+	err = global.DmSQL["rddp"].Exec(sql, classifyIds).Error
 	if err != nil {
 		return
 	}

+ 4 - 2
models/ppt_v2_grant.go

@@ -144,11 +144,13 @@ func GetAllGrantList(sysUserId int) (list []*PptV2InfoGrantItem, err error) {
 // GetGrantList 获取我共享出去/别人共享给我的的ppt列表
 func GetGrantList(condition string, pars []interface{}) (list []*PptV2InfoGrantItem, err error) {
 	//o := orm.NewOrmUsingDB("rddp")
-	sql := `SELECT a.* FROM ppt_v2 a JOIN ppt_v2_grant b on a.ppt_id=b.ppt_id 
+	sql := `SELECT a.ppt_id,a.template_type,a.background_img,a.title,a.report_type,a.ppt_date,a.ppt_url,a.pptx_url,a.content,a.create_time,a.modify_time,
+a.admin_id,a.admin_real_name,a.ppt_version,a.report_id,a.report_code,a.is_share,a.publish_time,a.cover_content,a.ppt_page,a.title_setting FROM ppt_v2 a JOIN ppt_v2_grant b on a.ppt_id=b.ppt_id 
  WHERE 1=1 `
 	sql += condition
 
-	sql += ` GROUP BY a.ppt_id ORDER BY a.modify_time DESC `
+	sql += ` GROUP BY a.ppt_id,a.template_type,a.background_img,a.title,a.report_type,a.ppt_date,a.ppt_url,a.pptx_url,a.content,a.create_time,a.modify_time,
+a.admin_id,a.admin_real_name,a.ppt_version,a.report_id,a.report_code,a.is_share,a.publish_time,a.cover_content,a.ppt_page,a.title_setting ORDER BY a.modify_time DESC `
 	//_, err = o.Raw(sql, pars).QueryRows(&list)
 	err = global.DmSQL["rddp"].Raw(sql, pars...).Find(&list).Error
 	return

+ 89 - 51
models/report.go

@@ -1,6 +1,7 @@
 package models
 
 import (
+	"encoding/json"
 	"errors"
 	"eta_gn/eta_api/global"
 	"eta_gn/eta_api/utils"
@@ -43,7 +44,7 @@ type Report struct {
 	Abstract           string    `gorm:"column:abstract" description:"摘要"`
 	Author             string    `gorm:"column:author" description:"作者"`
 	Frequency          string    `gorm:"column:frequency" description:"频度"`
-	CreateTime         string    `gorm:"column:create_time" description:"创建时间"`
+	CreateTime         time.Time `gorm:"column:create_time" description:"创建时间"`
 	ModifyTime         time.Time `gorm:"column:modify_time;autoUpdateTime" description:"修改时间"`
 	State              int       `gorm:"column:state" description:"1:未发布;2:已发布;3-待提交;4-待审批;5-已驳回;6-已通过"`
 	PublishTime        time.Time `gorm:"column:publish_time" description:"发布时间"`
@@ -102,10 +103,10 @@ type ReportList struct {
 	Abstract           string                    `gorm:"column:abstract" description:"摘要"`
 	Author             string                    `gorm:"column:author" description:"作者"`
 	Frequency          string                    `gorm:"column:frequency" description:"频度"`
-	CreateTime         string                    `gorm:"column:create_time" description:"创建时间"`
-	ModifyTime         time.Time                 `gorm:"column:modify_time;autoUpdateTime" description:"修改时间"`
+	CreateTime         *global.LocalTime         `gorm:"column:create_time" description:"创建时间"`
+	ModifyTime         *global.LocalTime         `gorm:"column:modify_time;autoUpdateTime" description:"修改时间"`
 	State              int                       `gorm:"column:state" description:"1:未发布;2:已发布;3-待提交;4-待审批;5-已驳回;6-已通过"`
-	PublishTime        string                    `gorm:"column:publish_time" description:"发布时间"`
+	PublishTime        *global.LocalTime         `gorm:"column:publish_time" description:"发布时间"`
 	PrePublishTime     string                    `gorm:"column:pre_publish_time" description:"预发布时间"`
 	Stage              int                       `gorm:"column:stage" description:"期数"`
 	MsgIsSend          int                       `gorm:"column:msg_is_send" description:"模板消息是否已发送,0:否,1:是"`
@@ -124,33 +125,33 @@ type ReportList struct {
 	ChapterType        string                    `gorm:"column:chapter_type" description:"章节类型 day-晨报 week-周报"`
 	ChapterVideoList   []*ReportChapterVideoList `gorm:"-" description:"章节音频列表"` // 不映射到数据库
 	OldReportId        int                       `gorm:"column:old_report_id" description:"research_report表ID, 大于0则表示该报告为老后台同步过来的"`
-	MsgSendTime        string                    `gorm:"column:msg_send_time" description:"模版消息发送时间"`
+	MsgSendTime        *global.LocalTime         `gorm:"column:msg_send_time" description:"模版消息发送时间"`
 	CanEdit            bool                      `gorm:"column:can_edit" description:"是否可编辑"`
 	HasAuth            bool                      `gorm:"column:has_auth" description:"是否可操作"`
 	Editor             string                    `gorm:"column:editor" description:"编辑人"`
 	AdminId            int                       `gorm:"column:admin_id" description:"创建者账号"`
 	AdminRealName      string                    `gorm:"column:admin_real_name" description:"创建者姓名"`
-	ApproveTime        string                    `gorm:"column:approve_time" description:"审批时间"`
+	ApproveTime        *global.LocalTime         `gorm:"column:approve_time" description:"审批时间"`
 	DetailImgUrl       string                    `gorm:"column:detail_img_url" description:"报告详情长图地址"`
 	DetailPdfUrl       string                    `gorm:"column:detail_pdf_url" description:"报告详情PDF地址"`
 
-	CollaborateType     int8      `gorm:"column:collaborate_type" description:"协作方式,1:个人,2:多人协作。默认:1"`
-	ReportLayout        int8      `gorm:"column:report_layout" description:"报告布局,1:常规布局,2:智能布局。默认:1"`
-	IsPublicPublish     int8      `gorm:"column:is_public_publish" description:"是否公开发布,1:是,2:否"`
-	ReportCreateTime    time.Time `gorm:"column:report_create_time" description:"报告时间创建时间"`
-	ContentStruct       string    `gorm:"column:content_struct" description:"内容组件"`
-	LastModifyAdminId   int       `gorm:"column:last_modify_admin_id" description:"最后更新人ID"`
-	LastModifyAdminName string    `gorm:"column:last_modify_admin_name" description:"最后更新人姓名"`
-	ContentModifyTime   time.Time `gorm:"column:content_modify_time" description:"内容更新时间"`
-	HeadImg             string    `gorm:"column:head_img" description:"报告头图地址"`
-	EndImg              string    `gorm:"column:end_img" description:"报告尾图地址"`
-	CanvasColor         string    `gorm:"column:canvas_color" description:"画布颜色"`
-	NeedSplice          int       `gorm:"column:need_splice" description:"是否拼接版头版位的标记,主要是为了兼容历史报告。0-不需要 1-需要"`
-	HeadResourceId      int       `gorm:"column:head_resource_id" description:"版头资源ID"`
-	EndResourceId       int       `gorm:"column:end_resource_id" description:"版尾资源ID"`
-	ClassifyIdThird     int       `gorm:"column:classify_id_third" description:"三级分类id"`
-	ClassifyNameThird   string    `gorm:"column:classify_name_third" description:"三级分类名称"`
-	InheritReportId     int       `gorm:"column:inherit_report_id" description:"待继承的报告ID"`
+	CollaborateType     int8              `gorm:"column:collaborate_type" description:"协作方式,1:个人,2:多人协作。默认:1"`
+	ReportLayout        int8              `gorm:"column:report_layout" description:"报告布局,1:常规布局,2:智能布局。默认:1"`
+	IsPublicPublish     int8              `gorm:"column:is_public_publish" description:"是否公开发布,1:是,2:否"`
+	ReportCreateTime    *global.LocalTime `gorm:"column:report_create_time" description:"报告时间创建时间"`
+	ContentStruct       string            `gorm:"column:content_struct" description:"内容组件"`
+	LastModifyAdminId   int               `gorm:"column:last_modify_admin_id" description:"最后更新人ID"`
+	LastModifyAdminName string            `gorm:"column:last_modify_admin_name" description:"最后更新人姓名"`
+	ContentModifyTime   *global.LocalTime `gorm:"column:content_modify_time" description:"内容更新时间"`
+	HeadImg             string            `gorm:"column:head_img" description:"报告头图地址"`
+	EndImg              string            `gorm:"column:end_img" description:"报告尾图地址"`
+	CanvasColor         string            `gorm:"column:canvas_color" description:"画布颜色"`
+	NeedSplice          int               `gorm:"column:need_splice" description:"是否拼接版头版位的标记,主要是为了兼容历史报告。0-不需要 1-需要"`
+	HeadResourceId      int               `gorm:"column:head_resource_id" description:"版头资源ID"`
+	EndResourceId       int               `gorm:"column:end_resource_id" description:"版尾资源ID"`
+	ClassifyIdThird     int               `gorm:"column:classify_id_third" description:"三级分类id"`
+	ClassifyNameThird   string            `gorm:"column:classify_name_third" description:"三级分类名称"`
+	InheritReportId     int               `gorm:"column:inherit_report_id" description:"待继承的报告ID"`
 }
 
 type ReportListResp struct {
@@ -316,7 +317,6 @@ func DeleteReport(reportIds int) (err error) {
 }
 
 type ReportDetail struct {
-	gorm.Model
 	Id                 int    `gorm:"column:id;primary_key;autoIncrement" description:"报告Id"`
 	AddType            int    `gorm:"column:add_type" description:"新增方式:1:新增报告,2:继承报告"`
 	ClassifyIdFirst    int    `gorm:"column:classify_id_first" description:"一级分类id"`
@@ -348,36 +348,74 @@ type ReportDetail struct {
 	ReportCode         string `gorm:"column:report_code" description:"报告唯一编码"`
 
 	// eta1.8.3(研报改版)相关内容
-	ContentStruct       string    `gorm:"column:content_struct" description:"内容组件"`
-	LastModifyAdminId   int       `gorm:"column:last_modify_admin_id" description:"最后更新人ID"`
-	LastModifyAdminName string    `gorm:"column:last_modify_admin_name" description:"最后更新人姓名"`
-	ContentModifyTime   time.Time `gorm:"column:content_modify_time" description:"内容更新时间"`
-	Pv                  int       `gorm:"column:pv" description:"pv"`
-	Uv                  int       `gorm:"column:uv" description:"uv"`
-	HeadImg             string    `gorm:"column:head_img" description:"报告头图地址"`
-	EndImg              string    `gorm:"column:end_img" description:"报告尾图地址"`
-	HeadStyle           string    `gorm:"column:head_style" description:"版头样式"`
-	EndStyle            string    `gorm:"column:end_style" description:"版尾样式"`
-	CanvasColor         string    `gorm:"column:canvas_color" description:"画布颜色"`
-	NeedSplice          int       `gorm:"column:need_splice" description:"是否拼接版头版位的标记,主要是为了兼容历史报告。0-不需要 1-需要"`
-	HeadResourceId      int       `gorm:"column:head_resource_id" description:"版头资源ID"`
-	EndResourceId       int       `gorm:"column:end_resource_id" description:"版尾资源ID"`
-	ClassifyIdThird     int       `gorm:"column:classify_id_third" description:"三级分类id"`
-	ClassifyNameThird   string    `gorm:"column:classify_name_third" description:"三级分类名称"`
-	CollaborateType     int8      `gorm:"column:collaborate_type" description:"协作方式,1:个人,2:多人协作。默认:1"`
-	ReportLayout        int8      `gorm:"column:report_layout" description:"报告布局,1:常规布局,2:智能布局。默认:1"`
-	IsPublicPublish     int8      `gorm:"column:is_public_publish" description:"是否公开发布,1:是,2:否"`
-	ReportCreateTime    time.Time `gorm:"column:report_create_time" description:"报告时间创建时间"`
+	ContentStruct       string `gorm:"column:content_struct" description:"内容组件"`
+	LastModifyAdminId   int    `gorm:"column:last_modify_admin_id" description:"最后更新人ID"`
+	LastModifyAdminName string `gorm:"column:last_modify_admin_name" description:"最后更新人姓名"`
+	ContentModifyTime   string `gorm:"column:content_modify_time" description:"内容更新时间"`
+	Pv                  int    `gorm:"column:pv" description:"pv"`
+	Uv                  int    `gorm:"column:uv" description:"uv"`
+	HeadImg             string `gorm:"column:head_img" description:"报告头图地址"`
+	EndImg              string `gorm:"column:end_img" description:"报告尾图地址"`
+	HeadStyle           string `gorm:"column:head_style" description:"版头样式"`
+	EndStyle            string `gorm:"column:end_style" description:"版尾样式"`
+	CanvasColor         string `gorm:"column:canvas_color" description:"画布颜色"`
+	NeedSplice          int    `gorm:"column:need_splice" description:"是否拼接版头版位的标记,主要是为了兼容历史报告。0-不需要 1-需要"`
+	HeadResourceId      int    `gorm:"column:head_resource_id" description:"版头资源ID"`
+	EndResourceId       int    `gorm:"column:end_resource_id" description:"版尾资源ID"`
+	ClassifyIdThird     int    `gorm:"column:classify_id_third" description:"三级分类id"`
+	ClassifyNameThird   string `gorm:"column:classify_name_third" description:"三级分类名称"`
+	CollaborateType     int8   `gorm:"column:collaborate_type" description:"协作方式,1:个人,2:多人协作。默认:1"`
+	ReportLayout        int8   `gorm:"column:report_layout" description:"报告布局,1:常规布局,2:智能布局。默认:1"`
+	IsPublicPublish     int8   `gorm:"column:is_public_publish" description:"是否公开发布,1:是,2:否"`
+	ReportCreateTime    string `gorm:"column:report_create_time" description:"报告时间创建时间"`
 }
 
 func GetReportById(reportId int) (item *ReportDetail, err error) {
-	//o := orm.NewOrmUsingDB("rddp")
-	sql := `SELECT * FROM report WHERE id=?`
-	//err = o.Raw(sql, reportId).QueryRow(&item)
-	err = global.DmSQL["rddp"].Raw(sql, reportId).First(&item).Error
+	reportInfo, err := GetReportByReportId(reportId)
+	if err != nil {
+		return
+	}
+
+	item, err = convertReportToReportDetail(*reportInfo)
+
 	return
 }
 
+func convertReportToReportDetail(report Report) (*ReportDetail, error) {
+	jsonBytes, err := json.Marshal(report)
+	if err != nil {
+		return nil, fmt.Errorf("failed to marshal input: %w", err)
+	}
+
+	reportDetail := new(ReportDetail)
+	err = json.Unmarshal(jsonBytes, reportDetail)
+	if err != nil {
+		return nil, fmt.Errorf("failed to unmarshal input: %w", err)
+	}
+
+	// 对于时间类型的字段,需要转换为字符串
+	reportDetail.CreateTime = report.CreateTime.Format(utils.FormatDateTime)
+	reportDetail.ModifyTime = report.ModifyTime.Format(utils.FormatDateTime)
+	if !report.PublishTime.IsZero() {
+		reportDetail.PublishTime = report.PublishTime.Format(utils.FormatDateTime)
+	} else {
+		reportDetail.PublishTime = ``
+	}
+	if !report.ContentModifyTime.IsZero() {
+		reportDetail.ContentModifyTime = report.ContentModifyTime.Format(utils.FormatDateTime)
+	} else {
+		reportDetail.ContentModifyTime = ``
+	}
+
+	if !report.ReportCreateTime.IsZero() {
+		reportDetail.ReportCreateTime = report.ReportCreateTime.Format(utils.FormatDateTime)
+	} else {
+		reportDetail.ReportCreateTime = ``
+	}
+
+	return reportDetail, nil
+}
+
 // GetSimpleReportByIds 根据报告ID查询报告基本信息
 func GetSimpleReportByIds(reportIds []int) (list []*Report, err error) {
 	if len(reportIds) == 0 {
@@ -623,7 +661,7 @@ func ModifyReportVideo(reportId int, videoUrl, videoName, videoSize string, play
 // @return err error
 func ModifyReportVideoByNoVideo(reportId int, videoUrl, videoName, videoSize string, playSeconds float64) (err error) {
 	//o := orm.NewOrmUsingDB("rddp")
-	sql := `UPDATE report SET video_url=?,video_name=?,video_play_seconds=?,video_size=? WHERE id=? AND video_url=""`
+	sql := `UPDATE report SET video_url=?,video_name=?,video_play_seconds=?,video_size=? WHERE id=? AND video_url=''`
 	//_, err = o.Raw(sql, videoUrl, videoName, playSeconds, videoSize, reportId).Exec()
 	err = global.DmSQL["rddp"].Exec(sql, videoUrl, videoName, playSeconds, videoSize, reportId).Error
 	return
@@ -1012,7 +1050,7 @@ func UpdateReportPublishTime(reportId int, videoNameDate string) (err error) {
 		return
 	}
 	//修改音频标题
-	sql2 := ` UPDATE report SET video_name=CONCAT(SUBSTRING_INDEX(video_name,"(",1),"` + videoNameDate + `") WHERE id = ? and (video_name !="" and video_name is not null)`
+	sql2 := ` UPDATE report SET video_name=CONCAT(SUBSTRING_INDEX(video_name,"(",1),"` + videoNameDate + `") WHERE id = ? and (video_name !='' and video_name is not null)`
 	//_, err = o.Raw(sql2, reportId).Exec()
 	err = global.DmSQL["rddp"].Exec(sql2, reportId).Error
 	return
@@ -1027,7 +1065,7 @@ func UpdateReportChapterPublishTime(reportId int, videoNameDate string) (err err
 		return
 	}
 	//修改音频标题
-	sql2 := ` UPDATE report_chapter SET video_name=CONCAT(SUBSTRING_INDEX(video_name,"(",1),"` + videoNameDate + `") WHERE report_id = ? and (video_name !="" and video_name is not null)`
+	sql2 := ` UPDATE report_chapter SET video_name=CONCAT(SUBSTRING_INDEX(video_name,"(",1),"` + videoNameDate + `") WHERE report_id = ? and (video_name !='' and video_name is not null)`
 	//_, err = o.Raw(sql2, reportId).Exec()
 	err = global.DmSQL["rddp"].Exec(sql2, reportId).Error
 	return

+ 4 - 1
models/report_approve/report_approve.go

@@ -4,9 +4,10 @@ import (
 	"eta_gn/eta_api/global"
 	"eta_gn/eta_api/utils"
 	"fmt"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"strings"
 	"time"
+
+	"github.com/rdlucklib/rdluck_tools/paging"
 )
 
 // ReportApprove 报告审批表
@@ -338,6 +339,7 @@ func GetApprovingReportApprovePageList(cond string, pars []interface{}, orderRul
 		WHERE 1 = 1 %s %s
 		LIMIT ?,?`, cond, order)
 	//_, err = o.Raw(sql, pars...).QueryRows(&items)
+	pars = append(pars, startSize, pageSize)
 	err = global.DmSQL["rddp"].Raw(sql, pars...).Find(&items).Error
 	return
 }
@@ -368,6 +370,7 @@ func GetApprovedReportApprovePageList(cond string, pars []interface{}, orderRule
 		WHERE 1 = 1 %s %s
 		LIMIT ?,?`, cond, order)
 	//_, err = o.Raw(sql, pars...).QueryRows(&items)
+	pars = append(pars, startSize, pageSize)
 	err = global.DmSQL["rddp"].Raw(sql, pars...).Find(&items).Error
 	return
 }

+ 4 - 3
models/report_approve/report_approve_flow.go

@@ -4,9 +4,10 @@ import (
 	"eta_gn/eta_api/global"
 	"eta_gn/eta_api/utils"
 	"fmt"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"strings"
 	"time"
+
+	"github.com/rdlucklib/rdluck_tools/paging"
 )
 
 // ReportApproveFlow 报告审批流表
@@ -294,7 +295,7 @@ func (m *ReportApproveFlow) CreateFlowAndNodes(flowItem *ReportApproveFlow, node
 	//	prevNode = v
 	//}
 
-	tx := global.DmSQL["data"].Begin()
+	tx := global.DmSQL["rddp"].Begin()
 	prevNodes := make([]*ReportApproveNode, 0)
 	defer func() {
 		if err != nil {
@@ -422,7 +423,7 @@ func (m *ReportApproveFlow) UpdateFlowAndNodes(flowItem *ReportApproveFlow, node
 	//	prevNode = v
 	//}
 
-	tx := global.DmSQL["data"].Begin()
+	tx := global.DmSQL["rddp"].Begin()
 	prevNodes := make([]*ReportApproveNode, 0)
 	defer func() {
 		if err != nil {

+ 1 - 1
models/report_approve/report_approve_record.go

@@ -271,7 +271,7 @@ func (m *ReportApproveRecord) UpdateNodeState(reportApproveId, nodeId, nodeState
 
 	// 更新条件
 	whereParas := []interface{}{reportApproveId, nodeId}
-	pars = append(pars, whereParas)
+	pars = append(pars, whereParas...)
 
 	//o := orm.NewOrmUsingDB("rddp")
 	sql := fmt.Sprintf(`UPDATE %s SET node_state=?,node_approve_user_id=?,node_approve_user_name=?,node_approve_time=? WHERE report_approve_id = ? AND node_id = ?`, m.TableName())

+ 3 - 3
models/report_chapter.go

@@ -9,7 +9,7 @@ import (
 
 // ReportChapter 报告章节
 type ReportChapter struct {
-	ReportChapterId     int       `gorm:"column:report_chapter_id;primaryKey;autoIncrement:false;not null" description:"报告章节ID"`
+	ReportChapterId     int       `gorm:"column:report_chapter_id;primaryKey;autoIncrement:true;not null" description:"报告章节ID"`
 	ReportId            int       `gorm:"column:report_id" description:"报告ID"`
 	ReportType          string    `gorm:"column:report_type" description:"报告类型 day-晨报 week-周报"`
 	ClassifyIdFirst     int       `gorm:"column:classify_id_first" description:"一级分类id"`
@@ -33,7 +33,7 @@ type ReportChapter struct {
 	VideoPlaySeconds    string    `gorm:"column:video_play_seconds" description:"音频播放时长"`
 	VideoSize           string    `gorm:"column:video_size" description:"音频文件大小,单位M"`
 	VideoKind           int       `gorm:"column:video_kind" description:"音频生成方式:1,手动上传,2:自动生成"`
-	CreateTime          string    `gorm:"column:create_time" description:"创建时间"`
+	CreateTime          time.Time `gorm:"column:create_time" description:"创建时间"`
 	ModifyTime          time.Time `gorm:"column:modify_time" description:"修改时间"`
 	OriginalVideoUrl    string    `gorm:"column:original_video_url" description:"原始音频文件URL"`
 	ContentStruct       string    `gorm:"column:content_struct" description:"内容组件"`
@@ -47,7 +47,7 @@ type ReportChapter struct {
 
 // ReportChapterItem 报告章节详情
 type ReportChapterItem struct {
-	ReportChapterId     int    `gorm:"column:report_chapter_id;primaryKey;autoIncrement:false;not null" description:"报告章节ID"`
+	ReportChapterId     int    `gorm:"column:report_chapter_id;primaryKey;autoIncrement:true;not null" description:"报告章节ID"`
 	ReportId            int    `gorm:"column:report_id" description:"报告ID"`
 	ReportType          string `gorm:"column:report_type" description:"报告类型 day-晨报 week-周报"`
 	ClassifyIdFirst     int    `gorm:"column:classify_id_first" description:"一级分类id"`

+ 9 - 0
models/sandbox/sandbox_classify.go

@@ -330,3 +330,12 @@ func UpdateSandboxClassifyChartPermissionById(ChartPermissionId int, ChartPermis
 	err = global.DmSQL["data"].Exec(sql, ChartPermissionId, ChartPermissionName).Error
 	return
 }
+
+// GetAllSandboxClassify
+func GetAllSandboxClassify() (items []*SandboxClassifyItems, err error) {
+	//o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM sandbox_classify `
+	//_, err = o.Raw(sql).QueryRows(&items)
+	err = global.DmSQL["data"].Raw(sql).Find(&items).Error
+	return
+}

+ 1 - 0
models/semantic_analysis/sa_compare.go

@@ -152,6 +152,7 @@ func (m *SaCompare) GetPageItemsByCondition(startSize, pageSize int, condition s
 	}
 	sql += ` LIMIT ?,?`
 	//_, err = o.Raw(sql, pars...).QueryRows(&items)
+	pars = append(pars, startSize, pageSize)
 	err = global.DEFAULT_DmSQL.Raw(sql, pars...).Find(&items).Error
 	return
 }

+ 4 - 1
models/speech_recognition/speech_recognition.go

@@ -205,6 +205,8 @@ func (m *SpeechRecognition) GetPageItemsByCondition(condition string, pars []int
 	}
 	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s LIMIT ?,?`, fields, m.TableName(), condition, order)
 	//_, err = o.Raw(sql, pars...).QueryRows(&items)
+	pars = append(pars, startSize)
+	pars = append(pars, pageSize)
 	err = global.DEFAULT_DmSQL.Raw(sql, pars...).Find(&items).Error
 	return
 }
@@ -555,7 +557,8 @@ func (m *SpeechRecognition) UpdateSortByMenuId(menuId, nowSort int, prevSpeechId
 // GetMaxSortByMenuId 获取分类下最大Sort
 func (m *SpeechRecognition) GetMaxSortByMenuId(menuId int) (sort int, err error) {
 	// o := orm.NewOrm()
-	sql := fmt.Sprintf(`SELECT MAX(sort) AS sort FROM %s WHERE %s = ?`, m.TableName(), SpeechRecognitionCols.MenuId)
+	//sql := fmt.Sprintf(`SELECT MAX(sort) AS sort FROM %s WHERE %s = ?`, m.TableName(), SpeechRecognitionCols.MenuId)
+	sql := fmt.Sprintf(`SELECT COALESCE(MAX(sort),0) AS sort FROM %s WHERE %s = ?`, m.TableName(), SpeechRecognitionCols.MenuId)
 	//err = o.Raw(sql, menuId).QueryRow(&sort)
 	err = global.DEFAULT_DmSQL.Raw(sql, menuId).Scan(&sort).Error
 	return

+ 2 - 1
models/speech_recognition/speech_recognition_menu.go

@@ -251,7 +251,8 @@ func (m *SpeechRecognitionMenu) UpdateSortByParentId(parentId, menuId, nowSort i
 // GetMaxSortByParentId 获取父级分类下最大Sort
 func (m *SpeechRecognitionMenu) GetMaxSortByParentId(parentId int) (sort int, err error) {
 	// o := orm.NewOrm()
-	sql := fmt.Sprintf(`SELECT MAX(sort) AS sort FROM %s WHERE %s = ?`, m.TableName(), SpeechRecognitionMenuCols.ParentId)
+	//sql := fmt.Sprintf(`SELECT  MAX(sort) AS sort FROM %s WHERE %s = ?`, m.TableName(), SpeechRecognitionMenuCols.ParentId)
+	sql := fmt.Sprintf(`SELECT COALESCE(MAX(sort),0) AS sort FROM %s WHERE %s = ?`, m.TableName(), SpeechRecognitionMenuCols.ParentId)
 	//err = o.Raw(sql, parentId).QueryRow(&sort)
 	err = global.DEFAULT_DmSQL.Raw(sql, parentId).Scan(&sort).Error
 	return

+ 5 - 3
models/target.go

@@ -5,12 +5,13 @@ import (
 	"eta_gn/eta_api/models/data_manage"
 	"eta_gn/eta_api/utils"
 	"fmt"
-	"gorm.io/gorm"
 	"sort"
 	"strconv"
 	"strings"
 	"time"
 
+	"gorm.io/gorm"
+
 	"github.com/rdlucklib/rdluck_tools/paging"
 )
 
@@ -285,6 +286,7 @@ func GetEdbinfoItemList(condition string, pars []interface{}, startSize, pageSiz
 		}
 		sql += ` ORDER BY a.create_date DESC LIMIT ?,? `
 		//_, err = o.Raw(sql, pars...).QueryRows(&items)
+		pars = append(pars, startSize, pageSize)
 		err = global.DmSQL["edb"].Raw(sql, pars...).Find(&items).Error
 	}
 	return
@@ -450,7 +452,7 @@ type EdbdataClassifyList struct {
 	ClassifyId   int
 	ClassifyName string
 	ParentId     int
-	Child        []*EdbdataClassify
+	Child        []*EdbdataClassify `gorm:"-"`
 	TradeCode    string
 	UniqueCode   string
 }
@@ -1282,7 +1284,7 @@ func GetLzSurveyClassify() (items []*LzPriceClassify, err error) {
 
 // LongzhongSurveyProduct 结构体
 type LongzhongSurveyProduct struct {
-	SurveyProductId      int    `gorm:"column:survey_product_id;primaryKey;autoIncrement:false;not null" description:"调查产品ID"`
+	SurveyProductId      int    `gorm:"column:survey_product_id;primaryKey;autoIncrement:true;not null" description:"调查产品ID"`
 	ProjectQuotaId       int64  `gorm:"column:project_quota_id" description:"项目配额ID"`
 	BreedId              string `gorm:"column:breed_id" description:"品种ID"`
 	BreedName            string `gorm:"column:breed_name" description:"品种名称"`

+ 90 - 0
routers/commentsRouter.go

@@ -3877,6 +3877,87 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbCollectClassifyController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbCollectClassifyController"],
+        beego.ControllerComments{
+            Method: "Add",
+            Router: `/edb_collect/classify/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbCollectClassifyController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbCollectClassifyController"],
+        beego.ControllerComments{
+            Method: "Edit",
+            Router: `/edb_collect/classify/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbCollectClassifyController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbCollectClassifyController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/edb_collect/classify/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbCollectClassifyController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbCollectClassifyController"],
+        beego.ControllerComments{
+            Method: "Move",
+            Router: `/edb_collect/classify/move`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbCollectClassifyController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbCollectClassifyController"],
+        beego.ControllerComments{
+            Method: "Remove",
+            Router: `/edb_collect/classify/remove`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbCollectClassifyController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbCollectClassifyController"],
+        beego.ControllerComments{
+            Method: "Tree",
+            Router: `/edb_collect/classify/tree`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbCollectController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbCollectController"],
+        beego.ControllerComments{
+            Method: "CancelCollect",
+            Router: `/edb_collect/cancel_collect`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbCollectController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbCollectController"],
+        beego.ControllerComments{
+            Method: "Collect",
+            Router: `/edb_collect/collect`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbCollectController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbCollectController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/edb_collect/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta_gn/eta_api/controllers/data_manage:EdbInfoController"],
         beego.ControllerComments{
             Method: "BaiinfoClassify",
@@ -7360,6 +7441,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: "TemplateDownload",
+            Router: `/resource/template`,
+            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: "ResourceUpload",

+ 2 - 0
routers/router.go

@@ -179,6 +179,8 @@ func init() {
 				&data_manage.EdbInfoRelationController{},
 				&data_manage.FactorEdbSeriesController{},
 				&data_manage.SciHqDataController{},
+				&data_manage.EdbCollectController{},
+				&data_manage.EdbCollectClassifyController{},
 			),
 		),
 		web.NSNamespace("/my_chart",

+ 1 - 1
services/classify.go

@@ -640,7 +640,7 @@ func EditReportClassify(classifyId int, classifyName string, chartPermissionIdLi
 		err = errors.New("获取重名分类失败, Err: " + err.Error())
 		return
 	}
-	if existName != nil && existName.Id != item.Id {
+	if existName != nil && existName.Id > 0 && existName.Id != item.Id {
 		errMsg = "分类名称:" + classifyName + "已存在"
 		err = errors.New(errMsg)
 		isSendEmail = false

+ 1 - 1
services/data/chart_extra_config.go

@@ -628,7 +628,7 @@ func GetChartSectionCombineData(chartInfo *data_manage.ChartInfo, mappingList []
 					extraConfig.DateConfList[i].EdbInfoId = edbItem.EdbInfoId
 					extraConfig.DateConfList[i].EdbInfoType = edbItem.EdbInfoType
 					extraConfig.DateConfList[i].Frequency = edbItem.Frequency
-					extraConfig.DateConfList[i].EndDate = edbItem.EndDate
+					extraConfig.DateConfList[i].EndDate = utils.TimeToFormatDate(edbItem.EndDate)
 				}
 			}
 		}

+ 18 - 9
services/data/chart_info.go

@@ -164,10 +164,10 @@ func refreshBaseEdbInfo(bv *data_manage.EdbInfo) (err error, errMsg string) {
 	edbCode := bv.EdbCode
 	//startDate := bv.StartDate
 	frequency := bv.Frequency
-	if bv.StartDate == "0000-00-00" {
+	if bv.StartDate.IsZero() {
 		return
 	}
-	sTime, err := time.Parse(utils.FormatDate, bv.EndDate)
+	sTime := bv.EndDate
 	if err != nil {
 		return
 	}
@@ -216,17 +216,20 @@ func refreshBaseEdbInfo(bv *data_manage.EdbInfo) (err error, errMsg string) {
 
 // refreshCalculateEdbInfo 刷新计算指标
 func refreshCalculateEdbInfo(edbInfo *data_manage.EdbInfo) (err error, errMsg string) {
-	startDate := edbInfo.StartDate
+	startDate := utils.TimeToFormatDate(edbInfo.StartDate)
 	source := edbInfo.Source
 
 	if source == utils.DATA_SOURCE_CALCULATE {
-		startDate = edbInfo.StartDate
-		sTime, tmpErr := time.Parse(utils.FormatDate, edbInfo.EndDate)
-		if tmpErr != nil {
-			err = tmpErr
-			return
+		//startDate = edbInfo.StartDate
+		//sTime, tmpErr := time.Parse(utils.FormatDate, edbInfo.EndDate)
+		//if tmpErr != nil {
+		//	err = tmpErr
+		//	return
+		//}
+		if !edbInfo.EndDate.IsZero() {
+			startDate = utils.TimeToFormatDate(edbInfo.EndDate)
 		}
-		startDate = sTime.Format(utils.FormatDate)
+
 	}
 
 	result, err := RefreshEdbCalculateData(edbInfo.EdbInfoId, edbInfo.EdbCode, startDate)
@@ -299,6 +302,12 @@ func GetChartEdbData(chartInfoId, chartType int, calendar, startDate, endDate st
 	xEdbIdValue = make([]int, 0)
 	yDataList = make([]data_manage.YData, 0)
 
+	defer func() {
+		for _, v := range edbList {
+			v.ConvertToResp()
+		}
+	}()
+
 	var extraConfig interface{}
 	switch chartType {
 	case 6:

+ 5 - 0
services/data/chart_info_excel_balance.go

@@ -574,6 +574,11 @@ func editBalanceExcelChart(req request.AddBalanceTableChartReq) (chartInfo *data
 }
 
 func GetBalanceExcelChartDetail(chartInfo *data_manage.ChartInfoView, mappingListTmp []*excelModel.ExcelChartEdb, sysUser *system.Admin, dataListMap map[int][]*data_manage.EdbDataList) (resp *data_manage.ChartInfoDetailResp, err error, errMsg string) {
+	defer func() {
+		for _, v := range resp.EdbInfoList {
+			v.ConvertToResp()
+		}
+	}()
 	// 图表数据权限
 	{
 		// 已授权分类id

+ 18 - 4
services/data/data_manage_permission/data_move.go

@@ -95,16 +95,20 @@ func GetEdbChartClassifyList(source, subSource int) (resp data_manage.EdbChartCl
 			resp.List = append(resp.List, &item)
 		}
 
-	case 3:
+	case 3, 7:
 		//ETA指标库
 		//rootList, e := data_manage.GetEdbClassifyByParentId(0, 0)
 		//if e != nil && !utils.IsErrNoRow(e) {
 		//	err = e
 		//	return
 		//}
-
+		// 这里拆分指标库和计算指标
+		classifyType := utils.EdbClassifyTypeBase
+		if source == 7 {
+			classifyType = utils.EdbClassifyTypeCalculate
+		}
 		// 考虑到后面可以会迭代到10层, 这里直接用递归处理
-		classifyAll, e := data_manage.GetAllEdbClassifyByType(0)
+		classifyAll, e := data_manage.GetAllEdbClassifyByType(classifyType)
 		if e != nil && !utils.IsErrNoRow(e) {
 			err = e
 			return
@@ -300,7 +304,7 @@ func GetMoveEdbChartList(source, subSource, userId int, keyword, classify string
 				CreateUserName: v.SysUserRealName,
 			})
 		}
-	case 3, 4: //ETA指标库、ETA预测指标
+	case 3, 4, 7: //ETA指标库、ETA预测指标、指标加工
 		if keyword != `` {
 			condition += " AND (edb_code like ? OR edb_name like ? OR edb_name_en like ? OR sys_user_real_name like ? ) "
 			pars = utils.GetLikeKeywordPars(pars, keyword, 4)
@@ -320,6 +324,16 @@ func GetMoveEdbChartList(source, subSource, userId int, keyword, classify string
 		condition += ` AND edb_info_type = ? `
 		pars = append(pars, edbInfoType)
 
+		// 指标加工
+		if source != 4 {
+			edbType := 1
+			if source == 7 {
+				edbType = 2
+			}
+			condition += ` AND edb_type = ? `
+			pars = append(pars, edbType)
+		}
+
 		total, err = data_manage.GetEdbInfoByConditionCount(condition, pars)
 		if err != nil {
 			return

+ 11 - 3
services/data/data_manage_permission/edb_permission.go

@@ -61,13 +61,17 @@ func SetEdbChartPermission(source, subSource, userId int, authUserList []int, is
 	dataList := make([]data_manage_permission.DataItem, 0)
 
 	switch source {
-	case 3, 4:
+	case 3, 4, 7:
 		//ETA指标库、ETA预测指标
 		if source == 3 {
 			content += `(ETA指标库)`
-		} else {
+		}
+		if source == 4 {
 			content += `(ETA预测指标)`
 		}
+		if source == 7 {
+			content += `(ETA计算指标)`
+		}
 
 		tmpList, tmpErr := data_manage.GetEdbInfoListByEdbInfoId(dataIdList)
 		if tmpErr != nil {
@@ -503,12 +507,16 @@ func GetEdbChartClassifyIdListPermissionByUserId(source, subSource, userId int)
 // @return err error
 func GetUserIdListPermissionByDataId(source, subSource, dataId int) (idList []int, err error) {
 	switch source {
-	case 3, 4:
+	case 3, 4, 7:
 		// ETA指标库、ETA预测指标
 		edbInfoType := 0
 		if source == 4 {
 			edbInfoType = 1
 		}
+		//edbType := 1
+		//if source == 7 {
+		//	edbType = 2
+		//}
 		idList, err = data_manage_permission.GetPermissionUserIdListByEdbId(dataId, edbInfoType)
 	case 5:
 		// 图库

+ 3 - 3
services/data/edb_classify.go

@@ -320,8 +320,8 @@ func AddEdbClassify(classifyName string, parentId, level int, classifyType uint8
 	}
 
 	// 层级校验
-	if level > 6 {
-		errMsg = `最高只支持添加6级分类`
+	if level > 9 {
+		errMsg = `最高只支持添加9级分类`
 		return
 	}
 
@@ -1046,7 +1046,7 @@ func MoveEdbClassify(req data_manage.MoveEdbClassifyReq, sysUser *system.Admin,
 			err = fmt.Errorf("获取父级分类下的同名分类失败, Err: %s", e.Error())
 			return
 		}
-		if exists != nil {
+		if exists != nil && exists.ClassifyId > 0 {
 			errMsg = "移动失败,分类名称已存在"
 			return
 		}

+ 58 - 0
services/data/edb_collect.go

@@ -0,0 +1,58 @@
+package data
+
+import (
+	"eta_gn/eta_api/models/data_manage"
+	"eta_gn/eta_api/utils"
+	"fmt"
+	"strconv"
+	"strings"
+)
+
+// GetEdbCollectClassifyTreeRecursive 递归获取分类树形结构
+func GetEdbCollectClassifyTreeRecursive(list []*data_manage.EdbCollectClassifyItem, parentId int) []*data_manage.EdbCollectClassifyItem {
+	res := make([]*data_manage.EdbCollectClassifyItem, 0)
+	for _, v := range list {
+		if v.ParentId == parentId {
+			t := GetEdbCollectClassifyTreeRecursive(list, v.ClassifyId)
+			if len(t) > 0 {
+				v.Children = t
+			}
+			res = append(res, v)
+		}
+	}
+	return res
+}
+
+// GetEdbCollectClassifyChildIds 获取分类的子分类IDs
+func GetEdbCollectClassifyChildIds(classifyId, adminId int, selfInclude bool) (classifyIds []int, err error) {
+	// DM就不用FIND_IN_SET去查了, 从分类的LevelPath中遍历出来
+	exists := make(map[int]bool)
+	if selfInclude {
+		exists[classifyId] = true
+		classifyIds = append(classifyIds, classifyId)
+	}
+	classifyOb := new(data_manage.EdbCollectClassify)
+	cond := fmt.Sprintf(` AND %s = ?`, classifyOb.Cols().SysUserId)
+	pars := make([]interface{}, 0)
+	pars = append(pars, adminId)
+	list, e := classifyOb.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf(`%s ASC`, classifyOb.Cols().Sort))
+	if e != nil {
+		err = fmt.Errorf("获取用户收藏分类失败, %v", e)
+		return
+	}
+	strClassifyId := strconv.Itoa(classifyId)
+	for _, v := range list {
+		if v.LevelPath == "" {
+			continue
+		}
+		if exists[v.EdbCollectClassifyId] {
+			continue
+		}
+		pathArr := strings.Split(v.LevelPath, ",")
+		if len(pathArr) > 0 && utils.InArrayByStr(pathArr, strClassifyId) {
+			classifyIds = append(classifyIds, v.EdbCollectClassifyId)
+			exists[v.EdbCollectClassifyId] = true
+		}
+	}
+	return
+}

+ 31 - 36
services/data/edb_info.go

@@ -274,22 +274,17 @@ func edbInfoRefreshAll(refreshAll bool, newBaseEdbInfoArr, newBasePredictEdbInfo
 		//source := bv.Source
 		//edbInfoId := bv.EdbInfoId
 		//edbCode := bv.EdbCode
-		if bv.StartDate == "0000-00-00" {
+		fmt.Println(bv.StartDate)
+		if utils.TimeToFormatDate(bv.StartDate) == "0000-00-00" {
 			continue
 		}
 		//开始时间
 		startDate = ``
 		if refreshAll { //刷新所有数据,用开始时间作为起始日期去刷新
-			sTime, err := time.Parse(utils.FormatDate, bv.StartDate)
-			if err != nil {
-				return err
-			}
+			sTime := bv.StartDate
 			startDate = sTime.Format(utils.FormatDate)
 		} else {
-			sTime, err := time.Parse(utils.FormatDate, bv.EndDate)
-			if err != nil {
-				return err
-			}
+			sTime := bv.EndDate
 			frequency := bv.Frequency
 			var limitDay int
 			switch frequency {
@@ -346,16 +341,13 @@ func edbInfoRefreshAll(refreshAll bool, newBaseEdbInfoArr, newBasePredictEdbInfo
 		//计算指标就不用开始时间了吧,因为存在说开始时间变更的情况
 		startDate = ``
 		if !refreshAll { //如果不是全部更新,那么以指标的开始时间作为刷新
-			startDate = edbInfo.StartDate
+			startDate = utils.TimeToFormatDate(edbInfo.StartDate)
 			source := edbInfo.Source
 			if startDate == "" || startDate == "0000-00-00" { //如果没有开始日期,说明还没有计算出来数据,那么就往前面推40年吧(也意味着重新计算了)
 				startDate = time.Now().AddDate(-40, 0, 0).Format(utils.FormatDate)
 			} else {
 				if source == utils.DATA_SOURCE_CALCULATE {
-					sTime, err := time.Parse(utils.FormatDate, edbInfo.EndDate)
-					if err != nil {
-						return err
-					}
+					sTime := edbInfo.EndDate
 					frequency := edbInfo.Frequency
 					var limitDay int
 					switch frequency {
@@ -396,7 +388,7 @@ func edbInfoRefreshAll(refreshAll bool, newBaseEdbInfoArr, newBasePredictEdbInfo
 		if edbInfo == nil {
 			return err
 		}
-		startDate = edbInfo.StartDate
+		startDate = utils.TimeToFormatDate(edbInfo.StartDate)
 		source := edbInfo.Source
 		if startDate == "" || startDate == "0000-00-00" { //如果没有开始日期,说明还没有计算出来数据,那么就往前面推40年吧(也意味着重新计算了)
 			startDate = time.Now().AddDate(-40, 0, 0).Format(utils.FormatDate)
@@ -404,12 +396,9 @@ func edbInfoRefreshAll(refreshAll bool, newBaseEdbInfoArr, newBasePredictEdbInfo
 			if source == utils.DATA_SOURCE_PREDICT_CALCULATE {
 				startDate = ``
 				if refreshAll { //刷新所有数据,用开始时间作为起始日期去刷新
-					startDate = edbInfo.StartDate
+					startDate = utils.TimeToFormatDate(edbInfo.StartDate)
 				} else {
-					sTime, err := time.Parse(utils.FormatDate, edbInfo.EndDate)
-					if err != nil {
-						return err
-					}
+					sTime := edbInfo.EndDate
 					frequency := edbInfo.Frequency
 					var limitDay int
 					switch frequency {
@@ -478,7 +467,7 @@ func edbInfoRefreshAll(refreshAll bool, newBaseEdbInfoArr, newBasePredictEdbInfo
 		if edbInfo == nil {
 			return err
 		}
-		startDate = edbInfo.StartDate
+		startDate = utils.TimeToFormatDate(edbInfo.StartDate)
 		source := edbInfo.Source
 		if startDate == "" || startDate == "0000-00-00" { //如果没有开始日期,说明还没有计算出来数据,那么就往前面推40年吧(也意味着重新计算了)
 			startDate = time.Now().AddDate(-40, 0, 0).Format(utils.FormatDate)
@@ -486,12 +475,9 @@ func edbInfoRefreshAll(refreshAll bool, newBaseEdbInfoArr, newBasePredictEdbInfo
 			if source == utils.DATA_SOURCE_PREDICT_CALCULATE {
 				startDate = ``
 				if refreshAll { //刷新所有数据,用开始时间作为起始日期去刷新
-					startDate = edbInfo.StartDate
+					startDate = utils.TimeToFormatDate(edbInfo.StartDate)
 				} else {
-					sTime, err := time.Parse(utils.FormatDate, edbInfo.EndDate)
-					if err != nil {
-						return err
-					}
+					sTime := edbInfo.EndDate
 					frequency := edbInfo.Frequency
 					var limitDay int
 					switch frequency {
@@ -1875,8 +1861,23 @@ func EdbInfoAdd(source, subSource, classifyId int, edbCode, edbName, frequency,
 	edbInfo.Frequency = frequency
 	edbInfo.Unit = unit
 	edbInfo.UnitEn = unit
-	edbInfo.StartDate = startDate
-	edbInfo.EndDate = endDate
+	if startDate != `` {
+		startDateTime, tmpErr := utils.FormatDateStrToTime(startDate)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		edbInfo.StartDate = startDateTime
+	}
+	if endDate != `` {
+		endDateTime, tmpErr := utils.FormatDateStrToTime(endDate)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		edbInfo.EndDate = endDateTime
+	}
+
 	edbInfo.ClassifyId = classifyId
 	edbInfo.SysUserId = sysUserId
 	edbInfo.SysUserRealName = sysUserRealName
@@ -2324,18 +2325,12 @@ func getEdbRuleTitle(edbInfo, parentEdbInfo *data_manage.EdbInfo, childList []da
 		}
 		for _, v := range childEdbInfoIdList {
 			if childEdbInfo, ok := edbInfoMap[v]; ok {
-				tmpStartDate, tmpErr := time.ParseInLocation(utils.FormatDate, childEdbInfo.StartDate, time.Local)
-				if tmpErr != nil {
-					return
-				}
+				tmpStartDate := childEdbInfo.StartDate
 				if startDate.IsZero() || startDate.After(tmpStartDate) {
 					startDate = tmpStartDate
 				}
 
-				tmpEndDate, tmpErr := time.ParseInLocation(utils.FormatDate, childEdbInfo.EndDate, time.Local)
-				if tmpErr != nil {
-					return
-				}
+				tmpEndDate := childEdbInfo.EndDate
 				if endDate.IsZero() || endDate.Before(tmpEndDate) {
 					endDate = tmpEndDate
 				}

+ 1 - 1
services/data/future_good/profit_chart_info.go

@@ -188,7 +188,7 @@ func GetProfitChartEdbData(baseEdbInfo *data_manage.EdbInfo, edbInfoList []*data
 	}
 	var edbIdList []int
 
-	edbIdList, yDataList, err = ProfitChartChartData(baseEdbInfo, baseDataListMap, futureGoodEdbInfoDateMap, futureGoodDataListMap, chartInfoDateList, baseEdbInfo.EndDate, specialFutureGoodEdbInfoMap, formulaStr, tagEdbIdMap, dateList, maxN, reqEdbInfoIds)
+	edbIdList, yDataList, err = ProfitChartChartData(baseEdbInfo, baseDataListMap, futureGoodEdbInfoDateMap, futureGoodDataListMap, chartInfoDateList, utils.TimeToFormatDate(baseEdbInfo.EndDate), specialFutureGoodEdbInfoMap, formulaStr, tagEdbIdMap, dateList, maxN, reqEdbInfoIds)
 
 	// todo 最后处理数据
 	tmpXDataList, newYDataList, err := handleProfitResultData(xDataList, baseEdbInfo, yDataList, earliestDateTime, edbIdList)

+ 18 - 4
services/data/predict_edb_info.go

@@ -225,7 +225,14 @@ func AddPredictEdbInfo(sourceEdbInfoId, classifyId int, edbName string, ruleList
 			CreateTime: time.Now(),
 		}
 
-		edbInfo.EndDate = v.EndDate
+		if v.EndDate != `` {
+			endDateTime, tmpErr := utils.FormatDateStrToTime(v.EndDate)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			edbInfo.EndDate = endDateTime
+		}
 
 		predictEdbConfList = append(predictEdbConfList, tmpPredictEdbConf)
 	}
@@ -367,7 +374,14 @@ func EditPredictEdbInfo(edbInfoId, classifyId int, edbName string, ruleList []re
 		}
 		predictEdbConfList = append(predictEdbConfList, tmpPredictEdbConf)
 
-		edbInfo.EndDate = v.EndDate
+		if v.EndDate != `` {
+			endDateTime, tmpErr2 := utils.FormatDateStrToTime(v.EndDate)
+			if tmpErr2 != nil {
+				err = tmpErr2
+				return
+			}
+			edbInfo.EndDate = endDateTime
+		}
 	}
 
 	err = data_manage.EditPredictEdb(edbInfo, predictEdbConfList, updateEdbInfoCol)
@@ -960,11 +974,11 @@ func GetPredictDataListByPredictEdbInfo(edbInfo *data_manage.EdbInfo, startDate,
 	// 获取预测指标未来的数据
 	predictDataList := make([]*data_manage.EdbDataList, 0)
 
-	endDateStr := edbInfo.EndDate //预测指标的结束日期
+	endDateStr := utils.TimeToFormatDate(edbInfo.EndDate) //预测指标的结束日期
 
 	if isTimeBetween && endDate != `` { //如果是时间区间,同时截止日期不为空的情况,那么
 		reqEndDateTime, _ := time.ParseInLocation(utils.FormatDate, endDate, time.Local)
-		endDateTime, _ := time.ParseInLocation(utils.FormatDate, edbInfo.EndDate, time.Local)
+		endDateTime := edbInfo.EndDate
 		// 如果选择的时间区间结束日期 晚于 当天,那么预测数据截止到当天
 		if reqEndDateTime.Before(endDateTime) {
 			endDateStr = endDate

+ 2 - 2
services/data_stat/edb_delete_log.go

@@ -23,8 +23,8 @@ func AddEdbDeleteLog(edbInfo *data_manage.EdbInfo, sysUser *system.Admin) (err e
 		log.Frequency = edbInfo.Frequency
 		log.Unit = edbInfo.Unit
 		log.UnitEn = edbInfo.UnitEn
-		log.StartDate = edbInfo.StartDate
-		log.EndDate = edbInfo.EndDate
+		log.StartDate = utils.TimeToFormatDate(edbInfo.StartDate)
+		log.EndDate = utils.TimeToFormatDate(edbInfo.EndDate)
 		log.SysUserId = edbInfo.SysUserId
 		log.SysUserRealName = edbInfo.SysUserRealName
 		log.UniqueCode = edbInfo.UniqueCode

+ 3 - 2
services/data_stat/edb_info_stat.go

@@ -4,6 +4,7 @@ import (
 	"eta_gn/eta_api/models/data_manage"
 	"eta_gn/eta_api/models/data_stat"
 	"eta_gn/eta_api/models/system"
+	"eta_gn/eta_api/utils"
 	"fmt"
 	"time"
 )
@@ -28,8 +29,8 @@ func AddEdbInfoUpdateLog(edbInfoId int, updateResult int, updateFailedReason str
 		log.EdbNameSource = edbInfo.SourceIndexName
 		log.Frequency = edbInfo.Frequency
 		log.Unit = edbInfo.Unit
-		log.StartDate = edbInfo.StartDate
-		log.EndDate = edbInfo.EndDate
+		log.StartDate = utils.TimeToFormatDate(edbInfo.StartDate)
+		log.EndDate = utils.TimeToFormatDate(edbInfo.EndDate)
 		log.SysUserId = edbInfo.SysUserId
 		log.SysUserRealName = edbInfo.SysUserRealName
 		log.UpdateSysUserId = sysUser.AdminId

+ 31 - 2
services/elastic/elastic.go

@@ -87,7 +87,7 @@ func EsAddOrEditEdbInfoData(indexName, docId string, item *data_manage.EdbInfoLi
 }
 
 // SearchEdbInfoData 查询es中的指标数据
-func SearchEdbInfoData(indexName, keywordStr string, from, size, filterSource, source int, edbInfoType int8, frequency string, noPermissionEdbInfoIdList []int) (total int64, list []*data_manage.EdbInfoList, err error) {
+func SearchEdbInfoData(indexName, keywordStr string, from, size, filterSource, source int, edbInfoType int8, frequency string, noPermissionEdbInfoIdList []int, edbType int) (total int64, list []*data_manage.EdbInfoList, err error) {
 	list = make([]*data_manage.EdbInfoList, 0)
 	defer func() {
 		if err != nil {
@@ -257,6 +257,15 @@ func SearchEdbInfoData(indexName, keywordStr string, from, size, filterSource, s
 		})
 	}
 
+	// 指标类型: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{}{
@@ -325,6 +334,10 @@ func SearchEdbInfoDataBak(indexName, keywordStr string, from, size, filterSource
 		if err != nil {
 			fmt.Println("EsAddOrEditData Err:", err.Error())
 		}
+
+		for _, v := range list {
+			v.ConvertToResp()
+		}
 	}()
 	client := utils.EsClient
 
@@ -622,12 +635,16 @@ func SearchEdbInfoDataBak(indexName, keywordStr string, from, size, filterSource
 }
 
 // SearchAddPredictEdbInfoData 查询允许添加预测指标的数据
-func SearchAddPredictEdbInfoData(indexName, keywordStr string, noPermissionEdbInfoIdList []int, from, size int) (total int64, list []*data_manage.EdbInfoList, err error) {
+func SearchAddPredictEdbInfoData(indexName, keywordStr string, noPermissionEdbInfoIdList []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()
@@ -661,6 +678,15 @@ func SearchAddPredictEdbInfoData(indexName, keywordStr string, noPermissionEdbIn
 		},
 	})
 
+	// 指标类型: 1-基础指标; 2-计算指标
+	if edbType > 0 {
+		mustMap = append(mustMap, map[string]interface{}{
+			"term": map[string]interface{}{
+				"EdbType": edbType,
+			},
+		})
+	}
+
 	//关键字匹配
 	//shouldMap := map[string]interface{}{
 	//	"should": []interface{}{
@@ -1422,6 +1448,9 @@ func SearchEdbInfoDataByAdminId(indexName, keywordStr string, from, size, filter
 		if err != nil {
 			fmt.Println("EsAddOrEditData Err:", err.Error())
 		}
+		for _, v := range list {
+			v.ConvertToResp()
+		}
 	}()
 
 	highlight := elastic.NewHighlight()

+ 1 - 1
services/english_report.go

@@ -813,7 +813,7 @@ func MultiEnglishPolicyReportSync() (err error, errMsg string) {
 	var pars []interface{}
 	//startDate := time.Now().Format(utils.FormatDate)
 	startDate := time.Now().AddDate(0, -1, 0).Format(utils.FormatDate)
-	condition += ` AND publish_time >= ? AND state = 1 AND (content !="" AND content is not null)`
+	condition += ` AND publish_time >= ? AND state = 1 AND (content !='' AND content is not null)`
 	pars = append(pars, startDate)
 	policyReports, err := models.GetEnglishPolicyReportByCondition(condition, pars)
 	if err != nil {

+ 1 - 2
services/knowledge/classify.go

@@ -421,7 +421,6 @@ func EditKnowledgeClassify(classifyId, parentId int, classifyName string, resour
 	}
 	item.ClassifyName = classifyName
 
-	// todo 修改父级,修改level,只允许修改同级别
 	item.ParentId = parentId
 	item.ModifyTime = time.Now().Local()
 	cols := make([]string, 0)
@@ -430,7 +429,7 @@ func EditKnowledgeClassify(classifyId, parentId int, classifyName string, resour
 	if err != nil {
 		return
 	}
-	// todo 修改父级分类下相关的事件,找到当前分类的最小分类,把上一级的报告挪到最小分类上
+	// 修改父级分类下相关的事件,找到当前分类的最小分类,把上一级的报告挪到最小分类上
 	// 如果父级分类不为空的话,那么就标记有子级分类,同时
 	if parentClassifyItem != nil {
 		/*parentClassifyItem.HasChild = 1

+ 40 - 3
services/knowledge/resource.go

@@ -409,11 +409,17 @@ func ImportResourceData(path string, resourceType int, sysUser *system.Admin) (s
 	classifyNameMap := make(map[string]int)
 	for _, v := range classifyList {
 		name := fmt.Sprintf("%s/%s/%s", v.RootName, v.ParentName, v.ClassifyName)
+		if v.RootName == "" && v.ParentName == "" { //一级分类
+			name = fmt.Sprintf("%s/%s/%s", v.ClassifyName, "", "")
+		} else if v.RootName == "" { //二级分类
+			name = fmt.Sprintf("%s/%s/%s", v.ParentName, v.ClassifyName, "")
+		}
+
+		fmt.Println("name", name)
 		classifyNameMap[name] = v.ClassifyId
 	}
-	// todo 获取所有tag
+
 	tagNameMap := make(map[string]int)
-	// todo 获取所有tag
 	tagList, err := tagObj.GetAllTag(resourceType)
 	for _, v := range tagList {
 		tagNameMap[v.TagName] = v.TagId
@@ -637,7 +643,7 @@ func getDataByTemplateEvent(sheet *xlsx.Sheet, sysUserId, resourceType int) (ind
 			continue
 		}
 		fmt.Println("lenCell:", lenCell)
-		if lenCell < 12 {
+		if lenCell < 11 {
 			if cells[0].Value == `` {
 				continue
 			}
@@ -662,6 +668,23 @@ func getDataByTemplateEvent(sheet *xlsx.Sheet, sysUserId, resourceType int) (ind
 		tag := strings.TrimSpace(cells[10].Value)          //标签
 
 		if title == "" || content == "" || sourceFrom == "" || classifyName1 == "" { //过滤空白行
+			failDataList = append(failDataList, &knowledge.KnowledgeImportFail{
+				//Id:           0,
+				Title:          title,
+				Content:        content,
+				SourceFrom:     sourceFrom,
+				ClassifyFirst:  classifyName1,
+				ClassifySecond: classifyName2,
+				ClassifyThird:  classifyName3,
+				ResourceType:   resourceType,
+				StartDate:      startDateO,
+				EndDate:        endDateO,
+				StartTime:      startTimeO,
+				EndTime:        endTimeO,
+				Remark:         "标题或正文或来源或分类为空",
+				SysUserId:      strconv.Itoa(sysUserId),
+				CreateTime:     time.Now(),
+			})
 			continue
 		}
 
@@ -900,6 +923,20 @@ func getDataByTemplatePoint(sheet *xlsx.Sheet, sysUserId, resourceType int) (ind
 		tag := strings.TrimSpace(cells[7].Value)           //标签
 
 		if title == "" || content == "" || sourceFrom == "" || classifyName1 == "" { //过滤空白行
+			failDataList = append(failDataList, &knowledge.KnowledgeImportFail{
+				//Id:           0,
+				Title:          title,
+				Content:        content,
+				SourceFrom:     sourceFrom,
+				ClassifyFirst:  classifyName1,
+				ClassifySecond: classifyName2,
+				ClassifyThird:  classifyName3,
+				ResourceType:   resourceType,
+				StartDate:      startDateO,
+				Remark:         "标题或正文或来源或分类为空",
+				SysUserId:      strconv.Itoa(sysUserId),
+				CreateTime:     time.Now(),
+			})
 			continue
 		}
 

+ 0 - 3
services/knowledge/tag.go

@@ -242,9 +242,6 @@ func EditKnowledgeTag(TagId, resourceType int, TagName string) (err error, errMs
 	}
 	item.TagName = TagName
 
-	// ETA1.8.3:不允许修改上级标签  2024-6-17 13:21:01
-	//
-	// todo 修改父级,修改level,只允许修改同级别
 	item.ModifyTime = time.Now().Local()
 	cols := make([]string, 0)
 	cols = append(cols, "TagName", "ModifyTime")

+ 1 - 1
services/ppt/ppt_group.go

@@ -185,7 +185,7 @@ func AddGroup(groupName string, adminId int, isShare int8, isSharedAdd int8) (ne
 		err = errors.New("目录查询出错:" + err.Error())
 		return
 	}
-	if item != nil {
+	if item != nil && item.GroupId > 0 {
 		err = errors.New("目录名称已存在,不可重复添加")
 		return
 	}

+ 8 - 1
services/report.go

@@ -703,7 +703,14 @@ func CreateNewReport(req models.AddReq, adminInfo *system.Admin) (newReportId in
 	item.Content = html.EscapeString(req.Content)
 	item.Stage = maxStage + 1
 	item.ContentSub = html.EscapeString(contentSub)
-	item.CreateTime = req.CreateTime
+	if req.CreateTime != "" {
+		createTime, tmpErr := time.ParseInLocation(utils.FormatDateTime, req.CreateTime, time.Local)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		item.CreateTime = createTime
+	}
 	item.ModifyTime = time.Now()
 	item.ReportVersion = req.ReportVersion
 	item.AdminId = adminInfo.AdminId

+ 13 - 1
services/report_v2.go

@@ -15,6 +15,7 @@ import (
 	"os"
 	"path"
 	"strconv"
+	"strings"
 	"time"
 )
 
@@ -157,7 +158,18 @@ func EditReport(reportInfo *models.Report, req models.EditReq, sysUser *system.A
 	//reportInfo.Stage = stage // 编辑不变更期数
 	//reportInfo.Content = html.EscapeString(req.Content)	// 编辑不变更具体内容
 	//reportInfo.ContentSub = html.EscapeString(contentSub)	// 编辑不变更具体内容
-	reportInfo.CreateTime = req.CreateTime
+	if req.CreateTime != `` {
+		formatDate := utils.FormatDateTime
+		if !strings.Contains(req.CreateTime, ":") {
+			formatDate = utils.FormatDate
+		}
+		createTime, tmpErr := time.ParseInLocation(formatDate, req.CreateTime, time.Local)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		reportInfo.CreateTime = createTime
+	}
 	//reportInfo.CollaborateType = req.CollaborateType
 	//reportInfo.ReportLayout = req.ReportLayout
 	if req.IsPublicPublish <= 0 {

+ 7 - 0
services/sandbox/sandbox.go

@@ -958,3 +958,10 @@ func ReplaceEdbInSandbox(oldEdbInfoId, newEdbInfoId int) (err error) {
 
 	return
 }
+
+func GetSandBoxParentIds(classifyId int, classifymap map[int]*sandbox.SandboxClassifyItems, parentIds []int) {
+	if item, ok := classifymap[classifyId]; ok {
+		parentIds = append(parentIds, item.ParentId)
+		GetSandBoxParentIds(item.ParentId, classifymap, parentIds)
+	}
+}

+ 1 - 2
services/video.go

@@ -47,8 +47,7 @@ func CreateVideo(report *models.Report) (err error) {
 	xfReq.XfAPIKey = conf[models.BusinessConfXfApiKey]
 	xfReq.XfAPISecret = conf[models.BusinessConfXfApiSecret]
 
-	ct, err := time.Parse(utils.FormatDateTime, report.CreateTime)
-	createTime := ct.Format("0102")
+	createTime := report.CreateTime.Format("0102")
 	videoName := report.Title + "(" + createTime + ")"
 	content := html.UnescapeString(report.Content)
 	content = strings.Replace(content, "Powered", "", -1)

BIN
static/template/事件库上传模板.xlsx


BIN
static/template/政策库上传模板.xlsx


BIN
static/template/知识库上传模板.xlsx


BIN
static/template/观点库上传模板.xlsx


+ 135 - 0
utils/common.go

@@ -25,6 +25,7 @@ import (
 	"os"
 	"os/exec"
 	"path"
+	"reflect"
 	"regexp"
 	"sort"
 	"strconv"
@@ -2709,3 +2710,137 @@ func ExcelTimeToTime(excelTime float64) time.Time {
 	// 创建一个只包含时间部分的 time.Time 对象
 	return time.Date(baseTime.Year(), baseTime.Month(), baseTime.Day(), hours, minutes, seconds, 0, time.UTC)
 }
+
+// TimeToFormatDate
+// @Description: 时间格式转日期字符串
+// @param t
+// @return string
+func TimeToFormatDate(t time.Time) string {
+	if t.IsZero() {
+		return "0000-00-00"
+	}
+
+	return t.Format(FormatDate)
+}
+
+// TimeToFormatDateTime
+// @Description: 时间格式转日期+时间字符串
+// @param t
+// @return string
+func TimeToFormatDateTime(t time.Time) string {
+	if t.IsZero() {
+		return "0000-00-00 00:00:00"
+	}
+
+	return t.Format(FormatDateTime)
+}
+
+// FormatDateStrToTime
+// @Description: 日期字符串转日期格式
+// @param timeStr
+// @return currTime
+// @return err
+func FormatDateStrToTime(timeStr string) (currTime time.Time, err error) {
+	if timeStr != `` {
+		return
+	}
+	if strings.Contains(timeStr, "T") {
+		return time.ParseInLocation(FormatDateWallWithLoc, timeStr, time.Local)
+	}
+	if strings.Contains(timeStr, ":") {
+		return time.ParseInLocation(FormatDateTime, timeStr, time.Local)
+	}
+	return time.ParseInLocation(FormatDate, timeStr, time.Local)
+}
+
+// GormDateStrToDateTimeStr
+// @Description: gorm日期字符串格式转正常显示的日期时间字符串
+// @param originalString
+// @return formatStr
+func GormDateStrToDateTimeStr(originalString string) (formatStr string) {
+	formatStr = originalString
+	if !strings.Contains(originalString, "T") {
+		return
+	}
+
+	// 解析原始字符串
+	t, err := time.Parse(FormatDateWallWithLoc, originalString)
+	if err != nil {
+		fmt.Println("Error parsing time:", err)
+		return
+	}
+
+	// 重新格式化时间
+	formatStr = t.Format(FormatDateTime)
+
+	return
+}
+
+// GormDateStrToDateStr
+// @Description: gorm日期字符串格式转正常显示的日期字符串
+// @param originalString
+// @return formatStr
+func GormDateStrToDateStr(originalString string) (formatStr string) {
+	formatStr = originalString
+	if !strings.Contains(originalString, "T") {
+		return
+	}
+
+	// 解析原始字符串
+	t, err := time.Parse(FormatDateWallWithLoc, originalString)
+	if err != nil {
+		fmt.Println("Error parsing time:", err)
+		return
+	}
+
+	// 重新格式化时间
+	formatStr = t.Format(FormatDate)
+
+	return
+}
+
+// ReflectSetField
+// @Description: 通过反射处理时间字段
+// @param original
+// @param result
+// @param fieldsToProcess
+// @return interface{}
+// @return error
+func ReflectSetField(original, result interface{}, fieldsToProcess []string) error {
+	// 通过反射处理时间字段
+	fieldsToProcess = []string{"CreateTime", "ModifyTime", "BaseModifyTime", "StartDate", "EndDate"}
+
+	for _, fieldName := range fieldsToProcess {
+		value := reflect.ValueOf(original).FieldByName(fieldName)
+		if !value.IsValid() {
+			continue
+		}
+		//fmt.Println("fieldName:", fieldName)
+		//fmt.Println(value.Kind())
+		//fmt.Println(value.Type())
+		//fmt.Println(reflect.TypeOf(time.Time{}) == value.Type())
+
+		// 如果是时间类型,那么就写入结果中
+		if reflect.TypeOf(time.Time{}) == value.Type() {
+			t := value.Interface().(time.Time)
+			tmpVal := ``
+			if t.IsZero() {
+				tmpVal = ``
+			} else {
+				tmpVal = t.Format(FormatDateTime)
+			}
+
+			v := reflect.ValueOf(result).Elem()
+			f := v.FieldByName(fieldName)
+
+			if !f.IsValid() {
+				fmt.Printf("Field '%s' not found in the struct.\n", fieldName)
+				continue
+			}
+
+			f.Set(reflect.ValueOf(tmpVal))
+		}
+	}
+
+	return nil
+}

+ 13 - 0
utils/constants.go

@@ -478,3 +478,16 @@ const (
 
 // MultiAddNum 批量插入的数据量
 const MultiAddNum = 500
+
+const EdbClassifyMaxLevel = 9 // 指标库分类最大层级
+
+const (
+	EdbClassifyTypeBase      = 0 // 指标分类-指标库
+	EdbClassifyTypePredict   = 1 // 指标分类-预测指标
+	EdbClassifyTypeCalculate = 2 // 指标分类-计算指标
+)
+
+const (
+	EdbTypeBase      = 1 // 指标类型-基础指标
+	EdbTypeCalculate = 2 // 指标类型-计算指标
+)