Explorar o código

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

xyxie hai 6 meses
pai
achega
ccfb66cf88
Modificáronse 80 ficheiros con 2532 adicións e 289 borrados
  1. 4 0
      controllers/base_auth.go
  2. 25 2
      controllers/bi_dashboard.go
  3. 1 1
      controllers/data_manage/chart_classify.go
  4. 5 2
      controllers/data_manage/chart_info.go
  5. 4 0
      controllers/data_manage/correlation/correlation_chart_info.go
  6. 2 2
      controllers/data_manage/data_manage_permission/data_manage_permission.go
  7. 4 4
      controllers/data_manage/data_manage_permission/data_move.go
  8. 138 18
      controllers/data_manage/edb_classify.go
  9. 352 0
      controllers/data_manage/edb_collect.go
  10. 455 0
      controllers/data_manage/edb_collect_classify.go
  11. 45 7
      controllers/data_manage/edb_info.go
  12. 8 2
      controllers/data_manage/edb_info_calculate.go
  13. 2 2
      controllers/data_manage/future_good/future_good_chart_info.go
  14. 2 2
      controllers/data_manage/future_good/future_good_profit_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. 10 1
      controllers/report.go
  20. 6 5
      controllers/report_approve/report_approve_flow.go
  21. 11 8
      controllers/report_chapter.go
  22. 1 1
      controllers/report_chapter_type.go
  23. 15 2
      controllers/report_v2.go
  24. 15 6
      controllers/sandbox/sandbox.go
  25. 1 1
      controllers/semantic_analysis/sa_compare.go
  26. 3 3
      controllers/speech_recognition/speech_recognition_menu.go
  27. 1 8
      controllers/voice.go
  28. 29 1
      global/dm.go
  29. 1 1
      models/ai_summary/ai_summary_classify.go
  30. 6 0
      models/bi_dashboard/bi_dashboard_classify.go
  31. 3 3
      models/data_manage/chart_classify.go
  32. 98 2
      models/data_manage/chart_edb_mapping.go
  33. 3 4
      models/data_manage/chart_info.go
  34. 2 1
      models/data_manage/chart_info_correlation.go
  35. 2 2
      models/data_manage/chart_info_range_analysis.go
  36. 16 0
      models/data_manage/chart_info_resp.go
  37. 1 1
      models/data_manage/cross_variety/chart_info_cross_variety.go
  38. 9 0
      models/data_manage/edb_classify.go
  39. 226 0
      models/data_manage/edb_collect.go
  40. 249 0
      models/data_manage/edb_collect_classify.go
  41. 15 8
      models/data_manage/edb_data_insert_config.go
  42. 36 25
      models/data_manage/edb_info.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 2
      models/data_manage/trade_position_analysis.go
  47. 4 2
      models/ppt_v2_grant.go
  48. 89 51
      models/report.go
  49. 1 1
      models/report_approve/report_approve_flow.go
  50. 3 3
      models/report_chapter.go
  51. 9 0
      models/sandbox/sandbox_classify.go
  52. 1 0
      models/semantic_analysis/sa_compare.go
  53. 4 1
      models/speech_recognition/speech_recognition.go
  54. 2 1
      models/speech_recognition/speech_recognition_menu.go
  55. 1 1
      models/target.go
  56. 81 0
      routers/commentsRouter.go
  57. 2 0
      routers/router.go
  58. 1 1
      services/data/chart_classify.go
  59. 1 1
      services/data/chart_extra_config.go
  60. 18 9
      services/data/chart_info.go
  61. 5 0
      services/data/chart_info_excel_balance.go
  62. 18 4
      services/data/data_manage_permission/data_move.go
  63. 11 3
      services/data/data_manage_permission/edb_permission.go
  64. 2 2
      services/data/edb_classify.go
  65. 58 0
      services/data/edb_collect.go
  66. 32 36
      services/data/edb_info.go
  67. 1 1
      services/data/future_good/profit_chart_info.go
  68. 18 4
      services/data/predict_edb_info.go
  69. 2 2
      services/data_stat/edb_delete_log.go
  70. 3 2
      services/data_stat/edb_info_stat.go
  71. 31 2
      services/elastic/elastic.go
  72. 1 1
      services/english_report.go
  73. 1 1
      services/ppt/ppt_group.go
  74. 8 1
      services/report.go
  75. 13 1
      services/report_v2.go
  76. 7 0
      services/sandbox/sandbox.go
  77. 1 1
      services/speech_recognition.go
  78. 1 2
      services/video.go
  79. 135 0
      utils/common.go
  80. 15 2
      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()

+ 25 - 2
controllers/bi_dashboard.go

@@ -555,7 +555,7 @@ func (this *BIDaShboardController) PublicList() {
 	resp := make([]*bi_dashboard.RespPublicGroupListItem, 0)
 	// 获取公共看板列表
 	publicCond := ` AND state = 6 AND bi_dashboard_classify_id > 0 `
-	publicPars := []interface{}{this.SysUser.AdminId}
+	publicPars := make([]interface{}, 0)
 	publicList, err := bi_dashboard.GetBiDashboardList(publicCond, publicPars)
 	if err != nil {
 		err = errors.New("我的看板列表查询出错:" + err.Error())
@@ -686,6 +686,16 @@ func (this *BIDaShboardController) AddDashboardClassify() {
 		br.ErrMsg = "获取最大排序值失败,Err:" + err.Error()
 		return
 	}
+	count, err := bi_dashboard.GetBiDashboardClassifyByName(req.ClassifyName)
+	if err != nil {
+		br.Msg = "获取分类名称失败"
+		br.ErrMsg = "获取分类名称失败,Err:" + err.Error()
+		return
+	}
+	if count > 0 {
+		br.Msg = "分类名称已存在"
+		return
+	}
 
 	item := &bi_dashboard.BiDashboardClassify{
 		BiDashboardClassifyName: req.ClassifyName,
@@ -785,6 +795,20 @@ func (this *BIDaShboardController) DelDashboardClassify() {
 		return
 	}
 
+	publicCond := ` AND state = 6 AND bi_dashboard_classify_id = ? `
+	publicPars := make([]interface{}, 0)
+	publicPars = append(publicPars, req.BiDashboardClassifyId)
+	publicList, err := bi_dashboard.GetBiDashboardList(publicCond, publicPars)
+	if err != nil {
+		err = errors.New("我的看板列表查询出错:" + err.Error())
+		return
+	}
+	if len(publicList) > 0 {
+		br.Msg = "该分类下有关联看板,无法删除"
+		return
+	}
+
+
 	err = bi_dashboard.DelBiDashboardClassify(req.BiDashboardClassifyId)
 	if err != nil {
 		br.Msg = "编辑失败"
@@ -910,7 +934,6 @@ func (this *BIDaShboardController) Public() {
 	opening, e := biapproveSerice.CheckBiOpenApprove(req.ClassifyId)
 	if e != nil {
 		if !utils.IsErrNoRow(e) {
-			br.Ret = 200
 			br.Msg = "该分类未配置审批流,请先配置审批流"
 			br.ErrMsg = "校验报告是否开启审批流失败, Err: " + e.Error()
 			return

+ 1 - 1
controllers/data_manage/chart_classify.go

@@ -791,7 +791,7 @@ func (this *ChartClassifyController) ChartClassifyMove() {
 	}
 
 	// 校验移动的父级目录下是否有重名分类
-	exists, e := data_manage.GetChartClassifyByParentIdAndName(req.ParentClassifyId, chartClassifyInfo.ChartClassifyName, req.ClassifyId)
+	exists, e := data_manage.GetChartClassifyByParentIdAndName(utils.CHART_SOURCE_DEFAULT, req.ParentClassifyId, chartClassifyInfo.ChartClassifyName, req.ClassifyId)
 	if e != nil && !utils.IsErrNoRow(e) {
 		br.Msg = "移动失败"
 		br.ErrMsg = "获取父级目录下的同名分类失败, Err: " + e.Error()

+ 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,
 		})

+ 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:  "",

+ 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))
 

+ 6 - 5
controllers/report_approve/report_approve_flow.go

@@ -394,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
 		}
@@ -751,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 ? )`

+ 3 - 3
controllers/speech_recognition/speech_recognition_menu.go

@@ -521,10 +521,10 @@ func (this *SpeechRecognitionMenuController) Move() {
 		return
 	}
 
-	e, _ := services.MoveSpeechMenu(req)
-	if e != nil {
+	e, errMsg := services.MoveSpeechMenu(req)
+	if e != nil || errMsg != "" {
 		br.Msg = "操作失败"
-		br.ErrMsg = "移动目录/语音识别失败, Err: " + e.Error()
+		br.ErrMsg = "移动目录/语音识别失败, Err: " + e.Error() + ";errMsg:" + errMsg
 		return
 	}
 

+ 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:"-"`
 }

+ 6 - 0
models/bi_dashboard/bi_dashboard_classify.go

@@ -118,3 +118,9 @@ type RespPublicGroupListItem struct {
 	DashboardList []*BiDashboard
 	Children      []*RespPublicGroupListItem
 }
+
+// getByName
+func GetBiDashboardClassifyByName(classifyName string) (count int64, err error) {
+	err = global.DEFAULT_DmSQL.Model(&BiDashboardClassify{}).Where("bi_dashboard_classify_name = ?", classifyName).Count(&count).Error
+	return
+}

+ 3 - 3
models/data_manage/chart_classify.go

@@ -346,10 +346,10 @@ func GetCrossVarietyChartClassifyBySysUserId(sysUserId int) (item *ChartClassify
 }
 
 // GetChartClassifyByParentIdAndName 根据父级ID和名称获取分类
-func GetChartClassifyByParentIdAndName(parentId int, classifyName string, classifyId int) (item *ChartClassify, err error) {
+func GetChartClassifyByParentIdAndName(source, parentId int, classifyName string, classifyId int) (item *ChartClassify, err error) {
 	o := global.DmSQL["data"]
-	sql := `SELECT * FROM chart_classify WHERE parent_id = ? AND chart_classify_name = ? AND chart_classify_id <> ? LIMIT 1`
-	err = o.Raw(sql, parentId, classifyName, classifyId).First(&item).Error
+	sql := `SELECT * FROM chart_classify WHERE source = ? AND parent_id = ? AND chart_classify_name = ? AND chart_classify_id <> ? LIMIT 1`
+	err = o.Raw(sql, source, parentId, classifyName, classifyId).First(&item).Error
 
 	return
 }

+ 98 - 2
models/data_manage/chart_edb_mapping.go

@@ -54,6 +54,14 @@ a.is_convert, a.convert_type, a.convert_value, a.convert_unit, a.convert_en_unit
 			 WHERE chart_info_id=? 
              ORDER BY chart_edb_mapping_id ASC `
 	err = o.Raw(sql, chartInfoId).Scan(&list).Error
+	if err != nil {
+		return
+	}
+
+	// 日期格式转换
+	for _, v := range list {
+		v.ConvertToResp()
+	}
 
 	return
 }
@@ -77,6 +85,14 @@ func GetChartEdbMappingListByChartInfoIds(chartInfoIds string) (list []*ChartEdb
 			 WHERE chart_info_id in (` + chartInfoIds + `) 
              ORDER BY chart_edb_mapping_id ASC `
 	err = o.Raw(sql).Scan(&list).Error
+	if err != nil {
+		return
+	}
+
+	// 日期格式转换
+	for _, v := range list {
+		v.ConvertToResp()
+	}
 
 	return
 }
@@ -89,6 +105,14 @@ func GetChartEdbMappingListByEdbInfoId(edbInfoStr string) (list []*ChartEdbInfoM
 			ORDER BY FIELD(edb_info_id,` + edbInfoStr + `)
               `
 	err = o.Raw(sql).Scan(&list).Error
+	if err != nil {
+		return
+	}
+
+	// 日期格式转换
+	for _, v := range list {
+		v.ConvertToResp()
+	}
 
 	return
 }
@@ -115,6 +139,14 @@ func GetChartEdbMappingListByEdbInfoIdList(edbIdList []int) (list []*ChartEdbInf
 			 WHERE edb_info_id IN(` + edbIdStr + `)
 			ORDER BY FIELD(edb_info_id,` + edbIdStr + `) `
 	err = o.Raw(sql).Find(&list).Error
+	if err != nil {
+		return
+	}
+
+	// 日期格式转换
+	for _, v := range list {
+		v.ConvertToResp()
+	}
 
 	return
 }
@@ -132,6 +164,14 @@ func GetChartEdbMappingListByIdList(chartInfoIdList []int) (list []*ChartEdbInfo
 			 WHERE chart_info_id in (` + utils.GetOrmInReplace(num) + `) 
              ORDER BY chart_edb_mapping_id ASC `
 	err = o.Raw(sql, chartInfoIdList).Scan(&list).Error
+	if err != nil {
+		return
+	}
+
+	// 日期格式转换
+	for _, v := range list {
+		v.ConvertToResp()
+	}
 
 	return
 }
@@ -181,6 +221,12 @@ func GetEtaEdbChartEdbMapping(chartInfoId int) (item *ChartEdbInfoMapping, err e
 			 WHERE a.chart_info_id=? AND a.source = ?
              ORDER BY chart_edb_mapping_id ASC `
 	err = o.Raw(sql, chartInfoId, utils.CHART_SOURCE_DEFAULT).Scan(&item).Error
+	if err != nil {
+		return
+	}
+
+	// 日期格式转换
+	item.ConvertToResp()
 
 	return
 }
@@ -196,6 +242,14 @@ func GetEtaEdbChartEdbMappingList(chartInfoId int) (items []*ChartEdbInfoMapping
 			 WHERE a.chart_info_id=? AND a.source = ?
              ORDER BY chart_edb_mapping_id ASC `
 	err = o.Raw(sql, chartInfoId, utils.CHART_SOURCE_DEFAULT).Scan(&items).Error
+	if err != nil {
+		return
+	}
+
+	// 日期格式转换
+	for _, v := range items {
+		v.ConvertToResp()
+	}
 
 	return
 }
@@ -210,6 +264,12 @@ func GetFutureGoodEdbChartEdbMapping(chartInfoId int) (item *ChartEdbInfoMapping
 			 WHERE a.chart_info_id=? AND a.source = ?
              ORDER BY chart_edb_mapping_id ASC `
 	err = o.Raw(sql, chartInfoId, utils.CHART_SOURCE_FUTURE_GOOD).Scan(&item).Error
+	if err != nil {
+		return
+	}
+
+	// 日期格式转换
+	item.ConvertToResp()
 
 	return
 }
@@ -224,6 +284,14 @@ func GetFutureGoodEdbChartEdbMappingList(chartInfoId int) (items []*ChartEdbInfo
 			 WHERE a.chart_info_id=? AND a.source = ?
              ORDER BY chart_edb_mapping_id ASC `
 	err = o.Raw(sql, chartInfoId, utils.CHART_SOURCE_FUTURE_GOOD).Scan(&items).Error
+	if err != nil {
+		return
+	}
+
+	// 日期格式转换
+	for _, v := range items {
+		v.ConvertToResp()
+	}
 
 	return
 }
@@ -235,6 +303,14 @@ func GetChartEdbMappingListV2(chartInfoId int) (list []*ChartEdbInfoMapping, err
 			 WHERE chart_info_id=? 
              ORDER BY chart_edb_mapping_id ASC `
 	err = o.Raw(sql, chartInfoId).Scan(&list).Error
+	if err != nil {
+		return
+	}
+
+	// 日期格式转换
+	for _, v := range list {
+		v.ConvertToResp()
+	}
 
 	return
 }
@@ -246,16 +322,30 @@ func GetChartEdbMappingByEdbInfoId(edbInfoId int) (item *ChartEdbInfoMapping, er
              FROM edb_info
 			 WHERE edb_info_id = ? `
 	err = o.Raw(sql, edbInfoId).First(&item).Error
+	if err != nil {
+		return
+	}
+
+	// 日期格式转换
+	item.ConvertToResp()
 
 	return
 }
 
 // GetEdbMappingListByEdbInfoId 根据指标id获取edb_mapping
-func GetEdbMappingListByEdbInfoId(edbInfoId int) (item []*ChartEdbInfoMapping, err error) {
+func GetEdbMappingListByEdbInfoId(edbInfoId int) (list []*ChartEdbInfoMapping, err error) {
 	o := global.DmSQL["data"]
 	sql := ` SELECT * FROM chart_edb_mapping
 			 WHERE edb_info_id = ? `
-	err = o.Raw(sql, edbInfoId).Scan(&item).Error
+	err = o.Raw(sql, edbInfoId).Scan(&list).Error
+	if err != nil {
+		return
+	}
+
+	// 日期格式转换
+	for _, v := range list {
+		v.ConvertToResp()
+	}
 
 	return
 }
@@ -267,6 +357,12 @@ func GetChartEdbMappingByFutureGoodEdbInfoId(edbInfoId int) (item *ChartEdbInfoM
              FROM future_good_edb_info b
 			 WHERE future_good_edb_info_id = ?  limit 1 `
 	err = o.Raw(sql, edbInfoId).Scan(&item).Error
+	if err != nil {
+		return
+	}
+
+	// 日期格式转换
+	item.ConvertToResp()
 
 	return
 }

+ 3 - 4
models/data_manage/chart_info.go

@@ -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

+ 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

+ 2 - 2
models/data_manage/chart_info_range_analysis.go

@@ -224,7 +224,7 @@ func EditRangeChartInfoAndMapping(req *EditChartInfoReq, edbInfoIdStr, lang stri
 	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
@@ -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
+}

+ 1 - 1
models/data_manage/cross_variety/chart_info_cross_variety.go

@@ -214,7 +214,7 @@ func EditChart(chartInfo *data_manage.ChartInfo, chartVarietyMappingList []*Char
 	currVarietyMappingList := make([]*ChartVarietyMapping, 0)
 	//sql := `SELECT * FROM chart_variety_mapping WHERE chart_info_id = ? `
 	sql := `SELECT * FROM chart_variety_mapping WHERE chart_info_id = ? `
-	err = to.Raw(sql, chartInfo.ChartInfoId).Find(currVarietyMappingList).Error
+	err = to.Raw(sql, chartInfo.ChartInfoId).Find(&currVarietyMappingList).Error
 	if err != nil {
 		return
 	}

+ 9 - 0
models/data_manage/edb_classify.go

@@ -382,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 获取当前父级分类下,且排序数相同 的排序第一条的数据
@@ -676,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
 		}

+ 36 - 25
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"`
@@ -194,16 +195,16 @@ func (e *EdbInfo) AfterFind(db *gorm.DB) error {
 		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)
+	//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
 }
 
@@ -1391,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
@@ -2009,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
+}

+ 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 - 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
 }

+ 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

+ 1 - 1
models/report_approve/report_approve_flow.go

@@ -423,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 {

+ 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

+ 1 - 1
models/target.go

@@ -1284,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:"品种名称"`

+ 81 - 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",

+ 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/data/chart_classify.go

@@ -469,7 +469,7 @@ func MoveChartClassify(req data_manage.MoveChartClassifyReq, sysUser *system.Adm
 			return
 		}
 		// 如果是移动目录, 那么校验一下父级目录下是否有重名目录
-		exists, e := data_manage.GetChartClassifyByParentIdAndName(parentClassifyId, chartClassifyInfo.ChartClassifyName, classifyId)
+		exists, e := data_manage.GetChartClassifyByParentIdAndName(utils.CHART_SOURCE_RANGE_ANALYSIS, parentClassifyId, chartClassifyInfo.ChartClassifyName, classifyId)
 		if e != nil && !utils.IsErrNoRow(e) {
 			errMsg = "移动失败"
 			err = fmt.Errorf("获取父级分类下的同名分类失败, Err: %s", e.Error())

+ 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:
 		// 图库

+ 2 - 2
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
 	}
 

+ 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
+}

+ 32 - 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 {
@@ -1174,6 +1160,7 @@ func AddOrEditAllEdbInfoToEs() {
 	//添加es
 	total, itemInfoList, _ := data_manage.GetEdbInfoFilterList("", []interface{}{}, 0, 100000)
 	for k, itemInfo := range itemInfoList {
+		itemInfo.ConvertToResp()
 		elastic.EsAddOrEditEdbInfoData(utils.DATA_INDEX_NAME, strconv.Itoa(itemInfo.EdbInfoId), itemInfo)
 		fmt.Println("剩余", int(total)-k-1, "条数据")
 	}
@@ -1875,8 +1862,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 +2326,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 - 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 - 1
services/speech_recognition.go

@@ -333,7 +333,7 @@ func MoveSpeechMenu(req speech_recognition.SpeechRecognitionMenuMoveReq) (err er
 				err = fmt.Errorf("获取父级目录下的同名目录失败, Err: %s", e.Error())
 				return
 			}
-			if exists != nil {
+			if exists != nil && exists.SpeechRecognitionMenuId > 0 {
 				errMsg = "移动失败,目录名称已存在"
 				return
 			}

+ 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)

+ 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
+}

+ 15 - 2
utils/constants.go

@@ -278,8 +278,8 @@ const (
 
 // 图表类型
 const (
-	CHART_SOURCE_DEFAULT                         = 1
-	CHART_SOURCE_FUTURE_GOOD                     = 2
+	CHART_SOURCE_DEFAULT                         = 1  //图表
+	CHART_SOURCE_FUTURE_GOOD                     = 2  //商品价格曲线
 	CHART_SOURCE_CORRELATION                     = 3  // 相关性图表
 	CHART_SOURCE_ROLLING_CORRELATION             = 4  // 滚动相关性图表
 	CHART_SOURCE_FUTURE_GOOD_PROFIT              = 5  // 商品利润曲线
@@ -478,3 +478,16 @@ const (
 
 // MultiAddNum 批量插入的数据量
 const MultiAddNum = 500
+
+const EdbClassifyMaxLevel = 9 // 指标库分类最大层级
+
+const (
+	EdbClassifyTypeBase      = 0 // 指标分类-指标库
+	EdbClassifyTypePredict   = 1 // 指标分类-预测指标
+	EdbClassifyTypeCalculate = 2 // 指标分类-计算指标
+)
+
+const (
+	EdbTypeBase      = 1 // 指标类型-基础指标
+	EdbTypeCalculate = 2 // 指标类型-计算指标
+)