Explorar o código

Merge branch 'master' into feature/eta1.4.6_radar_chart

# Conflicts:
#	controllers/data_manage/chart_info.go
#	models/db.go
xyxie hai 1 ano
pai
achega
4236184ea2
Modificáronse 50 ficheiros con 1721 adicións e 333 borrados
  1. 116 95
      controllers/commodity_trade_base_index.go
  2. 10 3
      controllers/data_manage/chart_framework.go
  3. 19 1
      controllers/data_manage/chart_info.go
  4. 11 2
      controllers/data_manage/chart_theme.go
  5. 1 1
      controllers/data_manage/correlation/correlation_chart_info.go
  6. 6 1
      controllers/data_manage/cross_variety/chart_info.go
  7. 157 119
      controllers/data_manage/edb_info.go
  8. 2 2
      controllers/data_manage/edb_info_calculate.go
  9. 1 1
      controllers/data_manage/excel/custom_analysis_edb.go
  10. 13 3
      controllers/data_manage/excel/excel_info.go
  11. 492 0
      controllers/data_manage/fenwei_data.go
  12. 5 0
      controllers/data_manage/line_equation/line_chart_info.go
  13. 1 1
      controllers/data_manage/multiple_graph_config.go
  14. 63 26
      controllers/data_manage/smm_api.go
  15. 173 7
      controllers/data_stat/edb_source_stat.go
  16. 6 0
      controllers/out_link.go
  17. 7 2
      controllers/ppt_english.go
  18. 9 2
      controllers/ppt_v2.go
  19. 144 0
      models/data_manage/base_from_fenwei.go
  20. 55 0
      models/data_manage/base_from_fenwei_classify.go
  21. 26 4
      models/data_manage/base_from_smm.go
  22. 38 25
      models/data_manage/base_from_trade_index.go
  23. 1 1
      models/data_manage/chart_edb_mapping.go
  24. 7 0
      models/data_manage/cross_variety/request/chart.go
  25. 2 0
      models/data_manage/edb_data_base.go
  26. 29 3
      models/data_manage/edb_data_insert_config.go
  27. 1 1
      models/data_manage/edb_info.go
  28. 6 0
      models/data_manage/line_equation/request/line_equation.go
  29. 2 0
      models/data_stat/edb_info_update_log.go
  30. 6 1
      models/data_stat/edb_info_update_stat.go
  31. 1 0
      models/db.go
  32. 3 2
      models/out_link.go
  33. 6 2
      models/ppt_english/ppt_english.go
  34. 6 2
      models/ppt_v2.go
  35. 4 3
      models/roadshow/calendar.go
  36. 57 3
      routers/commentsRouter.go
  37. 1 1
      services/data/chart_theme.go
  38. 11 1
      services/data/correlation/chart_info.go
  39. 13 0
      services/data/cross_variety/chart.go
  40. 139 3
      services/data/edb_info.go
  41. 6 2
      services/data/excel/mixed_table.go
  42. 5 0
      services/data/line_equation/chart_info.go
  43. 5 0
      services/data/line_feature/chart_info.go
  44. 29 7
      services/data/predict_edb_info.go
  45. 2 1
      services/data_stat/edb_info_stat.go
  46. 4 3
      services/english_report.go
  47. 1 1
      services/excel_info.go
  48. 2 0
      services/ppt/ppt_english_group.go
  49. 2 0
      services/ppt/ppt_group.go
  50. 15 1
      utils/common.go

+ 116 - 95
controllers/commodity_trade_base_index.go

@@ -1196,117 +1196,138 @@ func (this *TradeCommonController) CoalMineClassify() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
-	var coalList []data_manage.BaseFromCoalmineClassify
+	var coalList []data_manage.BaseFromCoalmineClassifyItem
 	var suffix string
-	var coal data_manage.BaseFromCoalmineClassify
+	var coal data_manage.BaseFromCoalmineClassifyItem
+	groups := []*string{}
 	var childs []data_manage.CoalChild
 	var child data_manage.CoalChild
-	suffix = "jsm_index"
-	groups, err := data_manage.GetProvinceFromCoalmineIndex(suffix)
-	if err != nil {
+
+	list, err := data_manage.GetCoalmineClassifyList()
+	if err!= nil {
 		br.Msg = "获取煤炭分类数据失败"
 		br.ErrMsg = "获取煤炭度分类数据失败,Err: " + err.Error()
 		return
 	}
-	coal.ClassifyId = 1
-	coal.ClassifyName = "晋陕蒙三省煤矿产量周度数据"
-	jsmId := 100
-	for _, group := range groups {
-		jsmId++
-		child.ClassifyId = jsmId
-		child.ClassifyName = *group
-		childs = append(childs, child)
-	}
+	for _, v := range list {
+		if v.Suffix == "jsm_index" {
+			suffix = "jsm_index"
+			groups, err = data_manage.GetProvinceFromCoalmineIndex(suffix)
+			if err != nil {
+				br.Msg = "获取煤炭分类数据失败"
+				br.ErrMsg = "获取煤炭度分类数据失败,Err: " + err.Error()
+				return
+			}
+			coal.ClassifyId = 1
+			coal.ClassifyName = "晋陕蒙三省煤矿产量周度数据"
+			jsmId := 100
+			for _, group := range groups {
+				jsmId++
+				child.ClassifyId = jsmId
+				child.ClassifyName = *group
+				childs = append(childs, child)
+			}
 
-	coal.Child = childs
-	coalList = append(coalList, coal)
+			coal.Child = childs
+			coalList = append(coalList, coal)
+		}
 
-	suffix = "company_index"
-	groups = []*string{}
-	childs = []data_manage.CoalChild{}
-	groups, err = data_manage.GetGroupNameFromCoalmineIndex(suffix)
-	if err != nil {
-		br.Msg = "获取煤炭分类数据失败"
-		br.ErrMsg = "获取煤炭度分类数据失败,Err: " + err.Error()
-		return
-	}
-	coal.ClassifyId = 2
-	coal.ClassifyName = "442家晋陕蒙煤矿周度产量"
-	companyId := 200
-	for _, group := range groups {
-		companyId++
-		child.ClassifyId = companyId
-		child.ClassifyName = *group
-		childs = append(childs, child)
-	}
-	coal.Child = childs
-	coalList = append(coalList, coal)
+		if v.Suffix == "company_index" {
+			suffix = "company_index"
+			groups = []*string{}
+			childs = []data_manage.CoalChild{}
+			groups, err = data_manage.GetGroupNameFromCoalmineIndex(suffix)
+			if err != nil {
+				br.Msg = "获取煤炭分类数据失败"
+				br.ErrMsg = "获取煤炭度分类数据失败,Err: " + err.Error()
+				return
+			}
+			coal.ClassifyId = 2
+			coal.ClassifyName = "442家晋陕蒙煤矿周度产量"
+			companyId := 200
+			for _, group := range groups {
+				companyId++
+				child.ClassifyId = companyId
+				child.ClassifyName = *group
+				childs = append(childs, child)
+			}
+			coal.Child = childs
+			coalList = append(coalList, coal)
+		}
 
-	suffix = "firm_index"
-	groups = []*string{}
-	childs = []data_manage.CoalChild{}
-	groups, err = data_manage.GetGroupNameFromCoalmineIndex(suffix)
-	if err != nil {
-		br.Msg = "获取煤炭分类数据失败"
-		br.ErrMsg = "获取煤炭度分类数据失败,Err: " + err.Error()
-		return
-	}
-	coal.ClassifyId = 3
-	coal.ClassifyName = "全国分企业煤炭产量旬度数据"
-	firmId := 300
-	for _, group := range groups {
-		firmId++
-		child.ClassifyId = firmId
-		child.ClassifyName = *group
-		childs = append(childs, child)
+		if v.Suffix == "firm_index" {
+			suffix = "firm_index"
+			groups = []*string{}
+			childs = []data_manage.CoalChild{}
+			groups, err = data_manage.GetGroupNameFromCoalmineIndex(suffix)
+			if err != nil {
+				br.Msg = "获取煤炭分类数据失败"
+				br.ErrMsg = "获取煤炭度分类数据失败,Err: " + err.Error()
+				return
+			}
+			coal.ClassifyId = 3
+			coal.ClassifyName = "全国分企业煤炭产量旬度数据"
+			firmId := 300
+			for _, group := range groups {
+				firmId++
+				child.ClassifyId = firmId
+				child.ClassifyName = *group
+				childs = append(childs, child)
 
-	}
-	coal.Child = childs
-	coalList = append(coalList, coal)
+			}
+			coal.Child = childs
+			coalList = append(coalList, coal)
+		}
 
-	suffix = "coastal_index"
-	groups = []*string{}
-	childs = []data_manage.CoalChild{}
-	groups, err = data_manage.GetGroupNameFromCoalmineIndex(suffix)
-	if err != nil {
-		br.Msg = "获取煤炭分类数据失败"
-		br.ErrMsg = "获取煤炭度分类数据失败,Err: " + err.Error()
-		return
-	}
-	coal.ClassifyId = 4
-	coal.ClassifyName = "沿海八省动力煤终端用户供耗存"
-	coastalId := 400
-	for _, group := range groups {
-		coastalId++
-		child.ClassifyId = coastalId
-		child.ClassifyName = *group
-		childs = append(childs, child)
+		if v.Suffix == "coastal_index" {
+			suffix = "coastal_index"
+			groups = []*string{}
+			childs = []data_manage.CoalChild{}
+			groups, err = data_manage.GetGroupNameFromCoalmineIndex(suffix)
+			if err != nil {
+				br.Msg = "获取煤炭分类数据失败"
+				br.ErrMsg = "获取煤炭度分类数据失败,Err: " + err.Error()
+				return
+			}
+			coal.ClassifyId = 4
+			coal.ClassifyName = "沿海八省动力煤终端用户供耗存"
+			coastalId := 400
+			for _, group := range groups {
+				coastalId++
+				child.ClassifyId = coastalId
+				child.ClassifyName = *group
+				childs = append(childs, child)
 
-	}
-	coal.Child = childs
-	coalList = append(coalList, coal)
+			}
+			coal.Child = childs
+			coalList = append(coalList, coal)
+		}
 
-	suffix = "inland_index"
-	groups = []*string{}
-	childs = []data_manage.CoalChild{}
-	groups, err = data_manage.GetGroupNameFromCoalmineIndex(suffix)
-	if err != nil {
-		br.Msg = "获取煤炭分类数据失败"
-		br.ErrMsg = "获取煤炭度分类数据失败,Err: " + err.Error()
-		return
-	}
-	coal.ClassifyId = 5
-	coal.ClassifyName = "内陆17省动力煤终端用户供耗存"
-	inlandId := 500
-	for _, group := range groups {
-		inlandId++
-		child.ClassifyId = inlandId
-		child.ClassifyName = *group
-		childs = append(childs, child)
 
+		if v.Suffix == "inland_index" {
+			suffix = "inland_index"
+			groups = []*string{}
+			childs = []data_manage.CoalChild{}
+			groups, err = data_manage.GetGroupNameFromCoalmineIndex(suffix)
+			if err != nil {
+				br.Msg = "获取煤炭分类数据失败"
+				br.ErrMsg = "获取煤炭度分类数据失败,Err: " + err.Error()
+				return
+			}
+			coal.ClassifyId = 5
+			coal.ClassifyName = "内陆17省动力煤终端用户供耗存"
+			inlandId := 500
+			for _, group := range groups {
+				inlandId++
+				child.ClassifyId = inlandId
+				child.ClassifyName = *group
+				childs = append(childs, child)
+
+			}
+			coal.Child = childs
+			coalList = append(coalList, coal)
+		}
 	}
-	coal.Child = childs
-	coalList = append(coalList, coal)
 
 	br.Ret = 200
 	br.Success = true

+ 10 - 3
controllers/data_manage/chart_framework.go

@@ -249,9 +249,12 @@ func (this *ChartFrameworkController) Add() {
 			t.MyChartClassifyId = v.MyChartClassifyId
 			t.CreateTime = now
 			nodes = append(nodes, t)
-
+			num, ok := chartsNumMap[v.MyChartClassifyId]
+			if !ok {
+				num = 0
+			}
 			// 响应节点数据
-			td := data_manage.FormatChartFrameworkNode2Item(t, chartsNumMap[t.MyChartClassifyId])
+			td := data_manage.FormatChartFrameworkNode2Item(t, num)
 			itemNodes = append(itemNodes, td)
 		}
 	}
@@ -791,7 +794,11 @@ func (this *ChartFrameworkController) Detail() {
 		if v.NodeId == "" {
 			continue
 		}
-		itemNodes = append(itemNodes, data_manage.FormatChartFrameworkNode2Item(v, chartsNumMap[v.MyChartClassifyId]))
+		num, ok := chartsNumMap[v.MyChartClassifyId]
+		if !ok {
+			num = 0
+		}
+		itemNodes = append(itemNodes, data_manage.FormatChartFrameworkNode2Item(v, num))
 	}
 	detail := data_manage.FormatChartFramework2Item(item, itemNodes)
 

+ 19 - 1
controllers/data_manage/chart_info.go

@@ -911,6 +911,11 @@ func (this *ChartInfoController) ChartInfoDetail() {
 		}
 	}
 
+	// 图表的指标来源
+	sourceNameList, sourceNameEnList := data.GetEdbSourceByEdbInfoIdList(edbList)
+	chartInfo.ChartSource = strings.Join(sourceNameList, ",")
+	chartInfo.ChartSourceEn = strings.Join(sourceNameEnList, ",")
+
 	//图表操作权限
 	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
 	//判断是否需要展示英文标识
@@ -2507,9 +2512,13 @@ func (this *ChartInfoController) CopyChartInfo() {
 		ExtraConfig:       oldChartInfo.ExtraConfig,
 		SeasonExtraConfig: oldChartInfo.SeasonExtraConfig,
 		StartYear:         oldChartInfo.StartYear,
-		Instructions:      oldChartInfo.Instructions,
 		Unit:              oldChartInfo.Unit,
 		UnitEn:            oldChartInfo.UnitEn,
+		ChartThemeId:      oldChartInfo.ChartThemeId,
+		SourcesFrom:       oldChartInfo.SourcesFrom,
+		Instructions:      oldChartInfo.Instructions,
+		MarkersLines:      oldChartInfo.MarkersLines,
+		MarkersAreas:      oldChartInfo.MarkersAreas,
 	}
 	newId, err := data_manage.AddChartInfo(chartInfo)
 	if err != nil {
@@ -2682,6 +2691,10 @@ func (this *ChartInfoController) PreviewBarChartInfo() {
 	if len(warnEdbList) > 0 {
 		chartInfo.WarnMsg = `图表引用指标异常,异常指标:` + strings.Join(warnEdbList, ",")
 	}
+	// 图表的指标来源
+	sourceNameList, sourceNameEnList := data.GetEdbSourceByEdbInfoIdList(edbList)
+	chartInfo.ChartSource = strings.Join(sourceNameList, ",")
+	chartInfo.ChartSourceEn = strings.Join(sourceNameEnList, ",")
 
 	//图表操作权限
 	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
@@ -2768,6 +2781,11 @@ func (this *ChartInfoController) PreviewSectionScatterChartInfo() {
 		chartInfo.WarnMsg = `图表引用指标异常,异常指标:` + strings.Join(warnEdbList, ",")
 	}
 
+	// 图表的指标来源
+	sourceNameList, sourceNameEnList := data.GetEdbSourceByEdbInfoIdList(edbList)
+	chartInfo.ChartSource = strings.Join(sourceNameList, ",")
+	chartInfo.ChartSourceEn = strings.Join(sourceNameEnList, ",")
+
 	//图表操作权限
 	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
 	//判断是否需要展示英文标识

+ 11 - 2
controllers/data_manage/chart_theme.go

@@ -164,7 +164,7 @@ func (c *ChartThemeController) GetThemePreviewData() {
 		chartInfo.ChartName = "柱形图"
 	case 10: // 截面散点图
 		edbInfoIdList = []int{9, 10, 11, 12, 13, 14, 15, 16, 17, 18}
-		extraConfigStr = `{"XName":"123","XNameEn":"123","XUnitName":"无","XUnitNameEn":"none","YName":"321","YNameEn":"321","YUnitName":"无","YUnitNameEn":"none","XMinValue":"0.3686","XMaxValue":"0.3686","YMinValue":"-0.1398","YMaxValue":"-0.1398","SeriesList":[{"Name":"2021-11-21","NameEn":"2021-11-21","IsNameDefault":true,"Color":"#00f","EdbInfoList":[{"XEdbInfoId":9,"YEdbInfoId":14,"Name":"指标1","NameEn":"","XDateType":1,"XDate":"","XDateValue":0,"YDateType":1,"YDate":"","YDateValue":0,"IsShow":false},{"XEdbInfoId":10,"YEdbInfoId":15,"Name":"指标2","NameEn":"指标2","XDateType":1,"XDate":"","XDateValue":0,"YDateType":1,"YDate":"","YDateValue":0,"IsShow":false},{"XEdbInfoId":11,"YEdbInfoId":16,"Name":"指标3","NameEn":"","XDateType":1,"XDate":"","XDateValue":0,"YDateType":1,"YDate":"","YDateValue":0,"IsShow":false},{"XEdbInfoId":12,"YEdbInfoId":17,"Name":"指标4","NameEn":"指标4","XDateType":1,"XDate":"","XDateValue":0,"YDateType":1,"YDate":"","YDateValue":0,"IsShow":false},{"XEdbInfoId":13,"YEdbInfoId":18,"Name":"指标5","NameEn":"","XDateType":1,"XDate":"","XDateValue":0,"YDateType":1,"YDate":"","YDateValue":0,"IsShow":false}],"ShowTrendLine":false,"ShowFitEquation":false,"ShowRSquare":false}]}`
+		extraConfigStr = `{"XName":"123","XNameEn":"123","XUnitName":"无","XUnitNameEn":"none","YName":"321","YNameEn":"321","YUnitName":"无","YUnitNameEn":"none","XMinValue":"230","XMaxValue":"395","YMinValue":"380","YMaxValue":"850","SeriesList":[{"Name":"2021-11-21","NameEn":"2021-11-21","IsNameDefault":true,"Color":"","EdbInfoList":[{"XEdbInfoId":9,"YEdbInfoId":14,"Name":"指标1","NameEn":"","XDateType":1,"XDate":"","XDateValue":0,"YDateType":1,"YDate":"","YDateValue":0,"IsShow":false},{"XEdbInfoId":10,"YEdbInfoId":15,"Name":"指标2","NameEn":"指标2","XDateType":1,"XDate":"","XDateValue":0,"YDateType":1,"YDate":"","YDateValue":0,"IsShow":false},{"XEdbInfoId":11,"YEdbInfoId":16,"Name":"指标3","NameEn":"","XDateType":1,"XDate":"","XDateValue":0,"YDateType":1,"YDate":"","YDateValue":0,"IsShow":false},{"XEdbInfoId":12,"YEdbInfoId":17,"Name":"指标4","NameEn":"指标4","XDateType":1,"XDate":"","XDateValue":0,"YDateType":1,"YDate":"","YDateValue":0,"IsShow":false},{"XEdbInfoId":13,"YEdbInfoId":18,"Name":"指标5","NameEn":"","XDateType":1,"XDate":"","XDateValue":0,"YDateType":1,"YDate":"","YDateValue":0,"IsShow":false}],"ShowTrendLine":false,"ShowFitEquation":false,"ShowRSquare":false}]}`
 		chartInfo.ChartName = "截面散点图"
 	case utils.CHART_TYPE_RADAR:
 		edbInfoIdList = []int{19, 20, 21, 22, 23, 24}
@@ -186,7 +186,7 @@ func (c *ChartThemeController) GetThemePreviewData() {
 		return
 	}
 	switch chartType {
-	case 6: // 散点
+	case 6: // 组合
 		mappingList[0].ChartStyle = "spline"
 		mappingList[1].ChartStyle = "spline"
 		mappingList[2].ChartStyle = "spline"
@@ -225,6 +225,14 @@ func (c *ChartThemeController) GetThemePreviewData() {
 		br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error()
 		return
 	}
+
+	switch chartType {
+	case 6: // 组合图
+		edbList[0].MaxData = 1000
+	case 4: // 堆积柱状图
+		edbList[0].MaxData = 2500
+	}
+
 	// 单位
 	if chartType == utils.CHART_TYPE_BAR && len(yDataList) > 0 {
 		chartInfo.Unit = yDataList[0].Unit
@@ -298,6 +306,7 @@ func (c *ChartThemeController) Add() {
 		ChartThemeName:   req.ChartThemeName,
 		ChartThemeTypeId: req.ChartThemeTypeId,
 		Config:           systemChartTheme.Config,
+		ChartImage:       systemChartTheme.ChartImage,
 		IsDelete:         0,
 		SysUserId:        sysUser.AdminId,
 		SysUserRealName:  sysUser.RealName,

+ 1 - 1
controllers/data_manage/correlation/correlation_chart_info.go

@@ -1082,7 +1082,7 @@ func (this *CorrelationChartInfoController) Copy() {
 		},
 	}
 
-	chartInfo, err, errMsg, isSendEmail := correlationServ.CopyChartInfo(multipleGraphConfigChartMapping.MultipleGraphConfigId, req.ChartClassifyId, req.ChartName, correlationChartInfoReq, sysUser)
+	chartInfo, err, errMsg, isSendEmail := correlationServ.CopyChartInfo(multipleGraphConfigChartMapping.MultipleGraphConfigId, req.ChartClassifyId, req.ChartName, correlationChartInfoReq, oldChartInfo, sysUser)
 
 	if err != nil {
 		br.Msg = "保存失败"

+ 6 - 1
controllers/data_manage/cross_variety/chart_info.go

@@ -750,6 +750,11 @@ func (c *ChartInfoController) Copy() {
 	}
 	config.ChartName = req.ChartName
 	config.ChartImage = oldChartInfo.ChartImage
+	config.ChartThemeId = oldChartInfo.ChartThemeId
+	config.SourcesFrom = oldChartInfo.SourcesFrom
+	config.Instructions = oldChartInfo.Instructions
+	config.MarkersLines = oldChartInfo.MarkersLines
+	config.MarkersAreas = oldChartInfo.MarkersAreas
 
 	// 添加图表
 	chartInfo, err, errMsg, isSendEmail := cross_variety.AddChartInfo(config, sysUser)
@@ -1562,7 +1567,7 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 		IsCopy:    true,
 		IsSetName: chartInfo.IsSetName,
 	}
-	
+
 	// 图表的指标来源
 	sourceNameList, sourceNameEnList := data.GetEdbSourceByEdbInfoIdList(edbList)
 	chartInfo.ChartSource = strings.Join(sourceNameList, ",")

+ 157 - 119
controllers/data_manage/edb_info.go

@@ -2183,6 +2183,11 @@ func (this *EdbInfoController) EdbInfoAdd() {
 
 	//新增操作日志
 	{
+		// 添加钢联指标更新日志
+		if edbInfo.Source == utils.DATA_SOURCE_MYSTEEL_CHEMICAL {
+			go data_stat.AddEdbInfoUpdateLog(edbInfo.EdbInfoId, 1, "", sysUser, 2)
+		}
+
 		edbLog := new(data_manage.EdbInfoLog)
 		edbLog.EdbInfoId = edbInfo.EdbInfoId
 		edbLog.SourceName = edbInfo.SourceName
@@ -2358,11 +2363,13 @@ func (this *EdbInfoController) EdbInfoEdit() {
 	data.AddOrEditEdbInfoToEs(req.EdbInfoId)
 
 	// 修改关联的预测指标基础信息
-	go data.ModifyPredictEdbBaseInfoBySourceEdb(edbInfo)
+	go data.ModifyPredictEdbBaseInfoBySourceEdb(edbInfo, req.Frequency, req.Unit)
 
 	// 添加钢联指标更新日志
 	if edbInfo.Source == utils.DATA_SOURCE_MYSTEEL_CHEMICAL {
-		go data_stat.AddEdbInfoUpdateLog(req.EdbInfoId, 1, "", sysUser)
+		if edbInfo.EdbName != req.EdbName || edbInfo.Frequency != req.Frequency || edbInfo.Unit != req.Unit {
+			go data_stat.AddEdbInfoUpdateLog(req.EdbInfoId, 1, "", sysUser, 1)
+		}
 	}
 
 	br.Ret = 200
@@ -2473,7 +2480,7 @@ func (this *EdbInfoController) EdbEnInfoEdit() {
 
 	// 修改关联的预测指标基础信息
 	if edbInfo.EdbInfoType == 0 {
-		go data.ModifyPredictEdbEnBaseInfoBySourceEdb(edbInfo)
+		go data.ModifyPredictEdbEnBaseInfoBySourceEdb(edbInfo, req.UnitEn)
 	}
 
 	br.Ret = 200
@@ -5370,101 +5377,117 @@ func (this *EdbInfoController) EdbInfoBatchAdd() {
 // @Param   EdbCode   query   string  false       "指标编码/指标代码"
 // @Param   StockCode   query   string  false       "证券代码"
 // @Success 200 {object} data_manage.EdbInfoExistCheckResp
-// @router /edb_info/smm/exist/check [get]
+// @router /edb_info/smm/exist/check [post]
 func (this *EdbInfoController) SmmExistCheck() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
-	selectAll, err := this.GetBool("SelectAll", false)
+
+	var req data_manage.SmmIndexExistCheckReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
 	if err != nil {
-		br.Msg = "参数解析失败"
+		br.Msg = "参数解析异常!"
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
 		return
 	}
-	types := this.GetString("Types")
-	frequency := this.GetString("Frequency")
-	dataState := this.GetString("DataState")
-	edbCode := this.GetString("EdbCode")
+
+	types := req.Types
+	frequency := req.Frequency
+	dataState := req.DataState
+	selectAll := req.SelectAll
+	keyword := req.Keyword
+
+	edbCode := req.EdbCode
 	edbCode = strings.Trim(edbCode, "\t")
 	edbCode = strings.Trim(edbCode, " ")
 	edbCode = strings.Replace(edbCode, "\t", "", -1)
 
-	selectCode := this.GetString("SelectCode")
-	selectCode = strings.Trim(selectCode, "\t")
-	selectCode = strings.Trim(selectCode, " ")
-	selectCode = strings.Replace(selectCode, "\t", "", -1)
-
 	var edbCodeArr []string
 	var codeArr []string
 
 	if selectAll {
 		// 如果勾了列表全选,那么EdbCode传的就是排除的code
-		if selectCode == "" {
-			// 无勾选code,走查询
-			var condition string
-			var pars []interface{}
 
-			if types != "" {
-				typeArr := strings.Split(types, ",")
+		var condition string
+		var pars []interface{}
+
+		if len(types) > 0 {
+			condition += " AND ( "
+			for _, v := range types {
+				typeArr := strings.Split(v, ",")
 				for i, v := range typeArr {
+					if i == 0 {
+						condition += " ( "
+					}
 					typeStr := "type_"
 					typeStr += fmt.Sprintf("%d", i+1)
-					condition += " AND " + typeStr + " =? "
+					condition += typeStr + " =? "
 					pars = append(pars, v)
+					if i == len(typeArr)-1 {
+						condition += " ) "
+					} else {
+						condition += " AND "
+					}
 				}
+				condition += " OR "
 			}
+			condition = strings.Trim(condition, "OR ")
+			condition += " ) "
+		}
 
-			if dataState != "" {
-				if dataState == "normal" {
-					condition += " AND (data_state = 'normal' OR data_state = '') "
-					pars = append(pars)
-				} else {
-					condition += " AND data_state = ? "
-					pars = append(pars, dataState)
-				}
-			}
-
-			if frequency != "" {
-				condition += " AND frequency = ? "
-				pars = append(pars, frequency)
-			}
+		if frequency != "" {
+			frequencyArr := strings.Split(frequency, ",")
+			condition += ` AND frequency IN (` + utils.GetOrmInReplace(len(frequencyArr)) + `) `
+			pars = append(pars, frequencyArr)
+		}
 
-			indexList, err := data_manage.GetSmmIndexDataListNoPage(condition, pars)
-			if err != nil {
-				br.Msg = "获取指标列表失败"
-				br.ErrMsg = "获取指标列表失败,Err:" + err.Error()
-				return
+		if dataState != "" {
+			stateArr := strings.Split(dataState, ",")
+			if strings.Contains(dataState, "normal") {
+				stateArr = append(stateArr, "")
+				condition += ` AND data_state IN (` + utils.GetOrmInReplace(len(stateArr)) + `) `
+				pars = append(pars, stateArr)
+			} else {
+				condition += ` AND data_state IN (` + utils.GetOrmInReplace(len(stateArr)) + `) `
+				pars = append(pars, stateArr)
 			}
+		}
 
-			for _, v := range indexList {
-				codeArr = append(codeArr, v.IndexCode)
+		if keyword != "" {
+			keyWordArr := strings.Split(keyword, " ")
+			if len(keyWordArr) > 0 {
+				condition += " AND ( "
+				for _, v := range keyWordArr {
+					condition += ` CONCAT(index_name,index_code) LIKE '%` + v + `%' OR`
+				}
+				condition = strings.TrimRight(condition, "OR")
+				condition += " ) "
 			}
+		}
 
-			noUseCodeArr := strings.Split(edbCode, ",")
+		indexList, err := data_manage.GetSmmIndexDataListNoPage(condition, pars)
+		if err != nil {
+			br.Msg = "获取指标列表失败"
+			br.ErrMsg = "获取指标列表失败,Err:" + err.Error()
+			return
+		}
 
-			for _, code := range codeArr {
-				// 检查code是否在noUseCodeArr数组中
-				if !utils.ArrContainsStr(noUseCodeArr, code) {
-					// 如果不在,将其添加到结果数组中
-					edbCodeArr = append(edbCodeArr, code)
-				}
-			}
-		} else {
-			// 有勾选,不查询
-			codeArr = strings.Split(selectCode, ",")
+		for _, v := range indexList {
+			codeArr = append(codeArr, v.IndexCode)
+		}
 
-			noUseCodeArr := strings.Split(edbCode, ",")
+		noUseCodeArr := strings.Split(edbCode, ",")
 
-			for _, code := range codeArr {
-				// 检查code是否在noUseCodeArr数组中
-				if !utils.ArrContainsStr(noUseCodeArr, code) {
-					// 如果不在,将其添加到结果数组中
-					edbCodeArr = append(edbCodeArr, code)
-				}
+		for _, code := range codeArr {
+			// 检查code是否在noUseCodeArr数组中
+			if !utils.ArrContainsStr(noUseCodeArr, code) {
+				// 如果不在,将其添加到结果数组中
+				edbCodeArr = append(edbCodeArr, code)
 			}
 		}
+
 	} else {
 		//未勾选全选EdbCode就是需要的code
 		edbCodeArr = strings.Split(edbCode, ",")
@@ -5525,101 +5548,116 @@ func (this *EdbInfoController) SmmExistCheck() {
 // @Param   EdbCode   query   string  false       "指标编码/指标代码"
 // @Param   StockCode   query   string  false       "证券代码"
 // @Success 200 {object} data_manage.EdbInfoSearchResp
-// @router /edb_info/smm/search [get]
+// @router /edb_info/smm/search [post]
 func (this *EdbInfoController) EdbInfoSmmSearch() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
-	selectAll, err := this.GetBool("SelectAll", false)
+
+	var req data_manage.SmmIndexExistCheckReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
 	if err != nil {
-		br.Msg = "参数解析失败"
+		br.Msg = "参数解析异常!"
 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
 		return
 	}
-	types := this.GetString("Types")
-	frequency := this.GetString("Frequency")
-	dataState := this.GetString("DataState")
-	edbCode := this.GetString("EdbCode")
+
+	types := req.Types
+	frequency := req.Frequency
+	dataState := req.DataState
+	selectAll := req.SelectAll
+	keyword := req.Keyword
+	edbCode := req.EdbCode
 	edbCode = strings.Trim(edbCode, "\t")
 	edbCode = strings.Trim(edbCode, " ")
 	edbCode = strings.Replace(edbCode, "\t", "", -1)
 
-	selectCode := this.GetString("SelectCode")
-	selectCode = strings.Trim(selectCode, "\t")
-	selectCode = strings.Trim(selectCode, " ")
-	selectCode = strings.Replace(selectCode, "\t", "", -1)
-
 	var edbCodeArr []string
 	var codeArr []string
 
 	if selectAll {
 		// 如果勾了列表全选,那么EdbCode传的就是排除的code
-		if selectCode == "" {
-			// 无勾选code,走查询
-			var condition string
-			var pars []interface{}
 
-			if types != "" {
-				typeArr := strings.Split(types, ",")
+		var condition string
+		var pars []interface{}
+
+		if len(types) > 0 {
+			condition += " AND ( "
+			for _, v := range types {
+				typeArr := strings.Split(v, ",")
 				for i, v := range typeArr {
+					if i == 0 {
+						condition += " ( "
+					}
 					typeStr := "type_"
 					typeStr += fmt.Sprintf("%d", i+1)
-					condition += " AND " + typeStr + " =? "
+					condition += typeStr + " =? "
 					pars = append(pars, v)
+					if i == len(typeArr)-1 {
+						condition += " ) "
+					} else {
+						condition += " AND "
+					}
 				}
+				condition += " OR "
 			}
+			condition = strings.Trim(condition, "OR ")
+			condition += " ) "
+		}
 
-			if dataState != "" {
-				if dataState == "normal" {
-					condition += " AND (data_state = 'normal' OR data_state = '') "
-					pars = append(pars)
-				} else {
-					condition += " AND data_state = ? "
-					pars = append(pars, dataState)
-				}
-			}
-
-			if frequency != "" {
-				condition += " AND frequency = ? "
-				pars = append(pars, frequency)
-			}
+		if frequency != "" {
+			frequencyArr := strings.Split(frequency, ",")
+			condition += ` AND frequency IN (` + utils.GetOrmInReplace(len(frequencyArr)) + `) `
+			pars = append(pars, frequencyArr)
+		}
 
-			indexList, err := data_manage.GetSmmIndexDataListNoPage(condition, pars)
-			if err != nil {
-				br.Msg = "获取指标列表失败"
-				br.ErrMsg = "获取指标列表失败,Err:" + err.Error()
-				return
+		if dataState != "" {
+			stateArr := strings.Split(dataState, ",")
+			if strings.Contains(dataState, "normal") {
+				stateArr = append(stateArr, "")
+				condition += ` AND data_state IN (` + utils.GetOrmInReplace(len(stateArr)) + `) `
+				pars = append(pars, stateArr)
+			} else {
+				condition += ` AND data_state IN (` + utils.GetOrmInReplace(len(stateArr)) + `) `
+				pars = append(pars, stateArr)
 			}
+		}
 
-			for _, v := range indexList {
-				codeArr = append(codeArr, v.IndexCode)
+		if keyword != "" {
+			keyWordArr := strings.Split(keyword, " ")
+			if len(keyWordArr) > 0 {
+				condition += " AND ( "
+				for _, v := range keyWordArr {
+					condition += ` CONCAT(index_name,index_code) LIKE '%` + v + `%' OR`
+				}
+				condition = strings.TrimRight(condition, "OR")
+				condition += " ) "
 			}
+		}
 
-			noUseCodeArr := strings.Split(edbCode, ",")
+		indexList, err := data_manage.GetSmmIndexDataListNoPage(condition, pars)
+		if err != nil {
+			br.Msg = "获取指标列表失败"
+			br.ErrMsg = "获取指标列表失败,Err:" + err.Error()
+			return
+		}
 
-			for _, code := range codeArr {
-				// 检查code是否在noUseCodeArr数组中
-				if !utils.ArrContainsStr(noUseCodeArr, code) {
-					// 如果不在,将其添加到结果数组中
-					edbCodeArr = append(edbCodeArr, code)
-				}
-			}
-		} else {
-			// 有勾选,不查询
-			codeArr = strings.Split(selectCode, ",")
+		for _, v := range indexList {
+			codeArr = append(codeArr, v.IndexCode)
+		}
 
-			noUseCodeArr := strings.Split(edbCode, ",")
+		noUseCodeArr := strings.Split(edbCode, ",")
 
-			for _, code := range codeArr {
-				// 检查code是否在noUseCodeArr数组中
-				if !utils.ArrContainsStr(noUseCodeArr, code) {
-					// 如果不在,将其添加到结果数组中
-					edbCodeArr = append(edbCodeArr, code)
-				}
+		for _, code := range codeArr {
+			// 检查code是否在noUseCodeArr数组中
+			if !utils.ArrContainsStr(noUseCodeArr, code) {
+				// 如果不在,将其添加到结果数组中
+				edbCodeArr = append(edbCodeArr, code)
 			}
 		}
+
 	} else {
 		//未勾选全选EdbCode就是需要的code
 		edbCodeArr = strings.Split(edbCode, ",")

+ 2 - 2
controllers/data_manage/edb_info_calculate.go

@@ -459,7 +459,7 @@ func (this *ChartInfoController) CalculateEdit() {
 	data.AddOrEditEdbInfoToEs(req.EdbInfoId)
 
 	// 修改关联的预测指标基础信息
-	go data.ModifyPredictEdbBaseInfoBySourceEdb(edbInfoDetail)
+	go data.ModifyPredictEdbBaseInfoBySourceEdb(edbInfoDetail, req.Frequency, req.Unit)
 
 	br.Ret = 200
 	br.Success = true
@@ -859,7 +859,7 @@ func (this *ChartInfoController) CalculateBatchEdit() {
 	data.AddOrEditEdbInfoToEs(resp.EdbInfoId)
 
 	// 修改关联的预测指标基础信息
-	go data.ModifyPredictEdbBaseInfoBySourceEdb(edbInfo)
+	go data.ModifyPredictEdbBaseInfoBySourceEdb(edbInfo, req.Frequency, req.Unit)
 
 	br.Ret = 200
 	br.Success = true

+ 1 - 1
controllers/data_manage/excel/custom_analysis_edb.go

@@ -389,7 +389,7 @@ func (c *CustomAnalysisController) EditEdb() {
 	data.AddOrEditEdbInfoToEs(resp.EdbInfoId)
 
 	// 修改关联的预测指标基础信息
-	go data.ModifyPredictEdbBaseInfoBySourceEdb(edbInfo)
+	go data.ModifyPredictEdbBaseInfoBySourceEdb(edbInfo, req.Frequency, req.Unit)
 
 	br.Ret = 200
 	br.Success = true

+ 13 - 3
controllers/data_manage/excel/excel_info.go

@@ -511,13 +511,18 @@ func (c *ExcelInfoController) Edit() {
 	}
 
 	// 标记编辑状态
-	_, err = services.UpdateExcelEditMark(req.ExcelInfoId, sysUser.AdminId, 1, sysUser.RealName)
+	markRet, err := services.UpdateExcelEditMark(req.ExcelInfoId, sysUser.AdminId, 1, sysUser.RealName)
 	if err != nil {
 		br.Msg = "查询标记状态失败"
 		br.ErrMsg = "查询标记状态失败,Err:" + err.Error()
 		return
 	}
-
+	if markRet.Status == 1 {
+		br.Ret = 200
+		br.Success = true
+		br.Data = markRet
+		return
+	}
 	excelClassify, err := excel3.GetExcelClassifyById(req.ExcelClassifyId)
 	if err != nil {
 		if err.Error() == utils.ErrNoRow() {
@@ -2276,8 +2281,13 @@ func (this *ExcelInfoController) MarkEditStatus() {
 		br.Msg = "标记状态异常"
 		return
 	}
+
+	status := 1
+	if req.Status == 2 {
+		status = 0
+	}
 	//更新标记key
-	data, err := services.UpdateExcelEditMark(req.ExcelInfoId, sysUser.AdminId, req.Status, sysUser.RealName)
+	data, err := services.UpdateExcelEditMark(req.ExcelInfoId, sysUser.AdminId, status, sysUser.RealName)
 	if err != nil {
 		br.Msg = err.Error()
 		return

+ 492 - 0
controllers/data_manage/fenwei_data.go

@@ -0,0 +1,492 @@
+package data_manage
+
+import (
+	"eta/eta_api/models"
+	"eta/eta_api/models/data_manage"
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/tealeg/xlsx"
+	"os"
+	"path/filepath"
+	"strings"
+	"time"
+)
+
+// FenweiClassify
+// @Title 汾渭数据分类
+// @Description 汾渭数据分类接口
+// @Success 200 {object} data_manage.BaseFromFenweiClassifyItem
+// @router /fenwei/classify [get]
+func (this *EdbInfoController) FenweiClassify() {
+	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
+	}
+
+	classifies, e := data_manage.GetBaseFromFenweiClassify()
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取汾渭数据分类失败, Err: " + e.Error()
+		return
+	}
+
+	classifyOb := new(data_manage.BaseFromFenweiClassify)
+	resp := make([]*data_manage.BaseFromFenweiClassifyItem, 0)
+	parentMap := make(map[int][]*data_manage.BaseFromFenweiClassifyItem)
+	for _, v := range classifies {
+		t := classifyOb.Format2Item(v)
+		if v.ParentId == 0 {
+			resp = append(resp, t)
+		}
+		if v.ParentId > 0 {
+			if parentMap[v.ParentId] == nil {
+				parentMap[v.ParentId] = make([]*data_manage.BaseFromFenweiClassifyItem, 0)
+			}
+			parentMap[v.ParentId] = append(parentMap[v.ParentId], t)
+		}
+	}
+	for _, v := range resp {
+		v.Child = parentMap[v.ClassifyId]
+	}
+
+	br.Data = resp
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// FenweiIndexData
+// @Title 获取汾渭数据
+// @Description 获取汾渭数据接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   ClassifyId   query   string  true       "分类id"
+// @Success 200 {object} data_manage.LzFrequency
+// @router /fenwei/index/data [get]
+func (this *EdbInfoController) FenweiIndexData() {
+	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
+	}
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	var startSize int
+
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+
+	classifyId, _ := this.GetInt("ClassifyId")
+	if classifyId < 0 {
+		br.Msg = "请选择分类"
+		br.ErrMsg = "请选择分类"
+		return
+	}
+
+	// 获取指标
+	var condition string
+	var pars []interface{}
+	if classifyId >= 0 {
+		condition += ` AND classify_id=? `
+		pars = append(pars, classifyId)
+	}
+
+	indexes, err := data_manage.GetFenweiIndex(condition, pars)
+	if err != nil {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+
+	indexCodes := make([]string, 0)
+	for _, v := range indexes {
+		indexCodes = append(indexCodes, v.IndexCode)
+	}
+	indexCounts, e := data_manage.GetFenweiIndexDataCountGroup(indexCodes)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取指标数据总量失败, Err:" + err.Error()
+		return
+	}
+	countMap := make(map[string]int)
+	for _, v := range indexCounts {
+		countMap[v.IndexCode] = v.Count
+	}
+
+	resultList := make([]*data_manage.BaseFromFenweiIndexList, 0)
+	for _, v := range indexes {
+		product := new(data_manage.BaseFromFenweiIndexList)
+		product.FenweiIndexId = v.FenweiIndexId
+		product.ClassifyId = v.ClassifyId
+		product.Unit = v.Unit
+		product.IndexCode = v.IndexCode
+		product.IndexName = v.IndexName
+		product.Frequency = v.Frequency
+		product.CreateTime = v.CreateTime
+		product.ModifyTime = v.ModifyTime
+
+		total := countMap[v.IndexCode]
+		page := paging.GetPaging(currentIndex, pageSize, total)
+		dataList, e := data_manage.GetFenweiIndexData(v.IndexCode, startSize, pageSize)
+		if e != nil {
+			br.Msg = "获取数据失败"
+			br.ErrMsg = "获取指标数据失败,Err:" + e.Error()
+			return
+		}
+		if dataList == nil {
+			dataList = make([]*data_manage.BaseFromFenweiData, 0)
+		}
+		product.DataList = dataList
+		product.Paging = page
+		resultList = append(resultList, product)
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resultList
+}
+
+// FenweiSearchList
+// @Title Fenwei模糊搜索
+// @Description Fenwei模糊搜索
+// @Param   Keyword   query   string  ture       "关键字搜索"
+// @Success 200 {object} data_manage.BaseFromFenweiIndexSearchItem
+// @router /fenwei/search_list [get]
+func (this *EdbInfoController) FenweiSearchList() {
+	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
+	}
+
+	list := make([]*data_manage.BaseFromFenweiIndexSearchItem, 0)
+	var err error
+	// 关键字
+	keyword := this.GetString("Keyword")
+	if keyword != "" {
+		keyWordArr := strings.Split(keyword, " ")
+
+		if len(keyWordArr) > 0 {
+			condition := ""
+			for _, v := range keyWordArr {
+				condition += ` AND CONCAT(index_name,index_code) LIKE '%` + v + `%'`
+			}
+			list, err = data_manage.GetFenweiItemList(condition)
+			if err != nil {
+				br.ErrMsg = "获取失败,Err:" + err.Error()
+				br.Msg = "获取失败"
+				return
+			}
+		}
+	} else {
+		list, err = data_manage.GetFenweiItemList("")
+		if err != nil {
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			br.Msg = "获取失败"
+			return
+		}
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = list
+}
+
+// FenweiSingleData
+// @Title 获取Fenwei数据
+// @Description 获取Fenwei单条数据接口
+// @Param   IndexCode   query   string  true       "指标唯一编码"
+// @Success 200 {object} models.BaseResponse
+// @router /fenwei/single_data [get]
+func (this *EdbInfoController) FenweiSingleData() {
+	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
+	}
+	indexCode := this.GetString("IndexCode")
+	indexInfo, err := data_manage.GetBaseFromFenweiIndexByIndexCode(indexCode)
+	if err != nil {
+		br.Msg = "获取指标信息失败"
+		br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
+		return
+	}
+	dataTmpList, err := data_manage.GetFenweiIndexDataByCode(indexCode)
+	if err != nil {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	var ret data_manage.FenweiSingleDataResp
+	var dataList []*data_manage.FenweiSingleData
+
+	ret.ClassifyId = indexInfo.ClassifyId
+	ret.FenweiIndexId = indexInfo.FenweiIndexId
+	ret.IndexCode = indexInfo.IndexCode
+	ret.IndexName = indexInfo.IndexName
+	ret.Frequency = indexInfo.Frequency
+	ret.CreateTime = indexInfo.CreateTime.Format(utils.FormatDateTime)
+	ret.ModifyTime = indexInfo.ModifyTime.Format(utils.FormatDateTime)
+	ret.Unit = indexInfo.Unit
+	for _, v := range dataTmpList {
+		tmp := &data_manage.FenweiSingleData{
+			Value:    v.Value,
+			DataTime: v.DataTime,
+		}
+		dataList = append(dataList, tmp)
+	}
+	ret.Data = dataList
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = ret
+}
+
+// ExportFenweiList
+// @Title 导出Fenwei数据
+// @Description 导出Fenwei数据
+// @Param   IndexName   query   string  false       "名称关键词"
+// @Param   IndexCode   query   string  false       "指标唯一编码"
+// @Param   ClassifyId   query   string  true       "分类"
+// @Success 200  导出成功
+// @router /fenwei/export [get]
+func (this *EdbInfoController) ExportFenweiList() {
+	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 = "请重新登录"
+		return
+	}
+
+	indexCode := this.GetString("IndexCode") //指标唯一编码
+	classifyId, _ := this.GetInt("ClassifyId")
+	//secNameList := make([]*models.EdbdataExportList, 0)
+
+	dir, _ := os.Executable()
+	exPath := filepath.Dir(dir)
+
+	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
+	xlsxFile := xlsx.NewFile()
+
+	var pars []interface{}
+	condition := ""
+	if classifyId > 0 {
+		//获取指标
+		condition += " AND classify_id=?"
+		pars = append(pars, classifyId)
+	}
+	if indexCode != "" {
+		//获取指标
+		condition += " AND index_code=?"
+		pars = append(pars, indexCode)
+	}
+	indexList, err := data_manage.GetFenweiIndex(condition, pars)
+	if err != nil {
+		fmt.Println("获取数据失败,Err:" + err.Error())
+		return
+	}
+	if len(indexList) <= 0 {
+		fmt.Println("indexList 为空")
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "success"
+		return
+	}
+	sheetNew := new(xlsx.Sheet)
+	// todo 分类名称
+	sheetNew, err = xlsxFile.AddSheet("汾渭数据")
+	//sheetNew.SetColWidth()
+	//获取指标数据
+	windRow := sheetNew.AddRow()
+	secNameRow := sheetNew.AddRow()
+	indexCodeRow := sheetNew.AddRow()
+	frequencyRow := sheetNew.AddRow()
+	unitRow := sheetNew.AddRow()
+	lastModifyDateRow := sheetNew.AddRow()
+	//获取分类下指标最大数据量
+	var dataMax int
+	setRowIndex := 6
+	indexCodeList := make([]string, 0)
+	for _, v := range indexList {
+		indexCodeList = append(indexCodeList, v.IndexCode)
+	}
+	dataListMap := make(map[string][]*data_manage.BaseFromFenweiData)
+	if len(indexList) > 0 {
+		allDataList, e := data_manage.GetFenweiIndexDataByCodes(indexCodeList)
+		if e != nil {
+			br.Msg = "获取数据失败"
+			br.ErrMsg = "获取数据失败,Err:" + e.Error()
+			return
+		}
+		for _, v := range allDataList {
+			dataListMap[v.IndexCode] = append(dataListMap[v.IndexCode], v)
+		}
+		for _, v := range dataListMap {
+			if len(v) > dataMax {
+				dataMax = len(v)
+			}
+		}
+	}
+
+	for k, sv := range indexList {
+		//获取数据
+		dataList, ok := dataListMap[sv.IndexCode]
+		if !ok {
+			continue
+		}
+		if len(dataList) > 0 {
+			windRow.AddCell().SetValue("汾渭数据")
+			secNameRow.AddCell().SetValue("指标名称")
+			indexCodeRow.AddCell().SetValue("指标ID")
+			frequencyRow.AddCell().SetValue("频率")
+			unitRow.AddCell().SetValue("单位")
+			lastModifyDateRow.AddCell().SetValue("更新时间")
+
+			secNameRow.AddCell().SetValue(sv.IndexName)
+			indexCodeRow.AddCell().SetValue(sv.IndexCode)
+			frequencyRow.AddCell().SetValue(sv.Frequency)
+
+			unitRow.AddCell().SetValue(sv.Unit)
+			lastModifyDateRow.AddCell().SetValue(sv.ModifyTime)
+
+			windRow.AddCell()
+			windRow.AddCell()
+			secNameRow.AddCell()
+			indexCodeRow.AddCell()
+			frequencyRow.AddCell()
+			unitRow.AddCell()
+			lastModifyDateRow.AddCell()
+			min := k * 3
+			sheetNew.SetColWidth(min, min, 15)
+
+			if len(dataList) <= 0 {
+				for n := 0; n < dataMax; n++ {
+					rowIndex := setRowIndex + n
+					row := sheetNew.Row(rowIndex)
+					row.AddCell()
+					row.AddCell()
+					row.AddCell()
+				}
+			} else {
+				endRowIndex := 0
+				for rk, dv := range dataList {
+					rowIndex := setRowIndex + rk
+					row := sheetNew.Row(rowIndex)
+					displayDate, _ := time.Parse(utils.FormatDate, dv.DataTime)
+					displayDateCell := row.AddCell()
+					style := new(xlsx.Style)
+					style.ApplyAlignment = true
+					style.Alignment.WrapText = true
+					displayDateCell.SetStyle(style)
+					displayDateCell.SetDate(displayDate)
+
+					row.AddCell().SetValue(dv.Value)
+					row.AddCell()
+					endRowIndex = rowIndex
+				}
+				if len(dataList) < dataMax {
+					dataLen := dataMax - len(dataList)
+					for n := 0; n < dataLen; n++ {
+						rowIndex := (endRowIndex + 1) + n
+						row := sheetNew.Row(rowIndex)
+						row.AddCell()
+						row.AddCell()
+						row.AddCell()
+					}
+				}
+			}
+		}
+	}
+
+	err = xlsxFile.Save(downLoadnFilePath)
+	if err != nil {
+		//有指标无数据时先导出一遍空表
+		sheet, err := xlsxFile.AddSheet("无数据")
+		if err != nil {
+			br.Msg = "新增Sheet失败"
+			br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
+			return
+		}
+		rowSecName := sheet.AddRow()
+		celSecName := rowSecName.AddCell()
+		celSecName.SetValue("")
+		err = xlsxFile.Save(downLoadnFilePath)
+		if err != nil {
+			br.Msg = "保存文件失败"
+			br.ErrMsg = "保存文件失败"
+			return
+		}
+	}
+	fileName := `汾渭数据`
+	if len(indexList) > 0 {
+		fileName = indexList[0].IndexName
+	}
+	fileName += time.Now().Format("06.01.02") + `.xlsx` //文件名称
+	this.Ctx.Output.Download(downLoadnFilePath, fileName)
+	defer func() {
+		os.Remove(downLoadnFilePath)
+	}()
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "success"
+
+}

+ 5 - 0
controllers/data_manage/line_equation/line_chart_info.go

@@ -1096,6 +1096,11 @@ func (this *LineEquationChartInfoController) Copy() {
 		LeftMin:         oldChartInfo.LeftMin,
 		LeftMax:         oldChartInfo.LeftMax,
 		ChartImage:      oldChartInfo.ChartImage,
+		ChartThemeId:    oldChartInfo.ChartThemeId,
+		SourcesFrom:     oldChartInfo.SourcesFrom,
+		Instructions:    oldChartInfo.Instructions,
+		MarkersLines:    oldChartInfo.MarkersLines,
+		MarkersAreas:    oldChartInfo.MarkersAreas,
 	})
 
 	resp := new(data_manage.AddChartInfoResp)

+ 1 - 1
controllers/data_manage/multiple_graph_config.go

@@ -1088,7 +1088,7 @@ func CopyMultipleGraphConfigSaveChart(req request.SaveMultipleGraphChartReq, thi
 				},
 			}
 
-			chartInfo, err, errMsg, isSendEmail = correlationServ.CopyChartInfo(multipleGraphConfigChartMapping.MultipleGraphConfigId, req.ClassifyId, req.ChartName, correlationChartInfoReq, sysUser)
+			chartInfo, err, errMsg, isSendEmail = correlationServ.CopyChartInfo(multipleGraphConfigChartMapping.MultipleGraphConfigId, req.ClassifyId, req.ChartName, correlationChartInfoReq, oldChartInfo, sysUser)
 		}
 	default:
 		br.Msg = "错误的来源"

+ 63 - 26
controllers/data_manage/smm_api.go

@@ -1,6 +1,7 @@
 package data_manage
 
 import (
+	"encoding/json"
 	"eta/eta_api/models"
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/utils"
@@ -13,7 +14,7 @@ import (
 // @Title 有色api数据指标列表
 // @Description 有色api数据指标列表
 // @Success 200 {object} data_manage.SmmClassify
-// @router /smm/api/list [get]
+// @router /smm/api/list [post]
 func (this *EdbInfoController) SmmApiList() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
@@ -27,15 +28,27 @@ func (this *EdbInfoController) SmmApiList() {
 		br.Ret = 408
 		return
 	}
-	types := this.GetString("Types")
-	frequency := this.GetString("Frequency")
-	dataState := this.GetString("DataState")
-	keyword := this.GetString("Keyword")
-	indexCodes := this.GetString("IndexCodes")
-	sortType := this.GetString("SortType", "desc")
-	sortParam := this.GetString("SortParam")
-	pageSize, _ := this.GetInt("PageSize")
-	currentIndex, _ := this.GetInt("CurrentIndex")
+	var req data_manage.SmmIndexListReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	types := req.Types
+	frequency := req.Frequency
+	dataState := req.DataState
+	keyword := req.Keyword
+	indexCodes := req.IndexCodes
+	sortType := req.SortType
+	sortParam := req.SortParam
+	pageSize := req.PageSize
+	currentIndex := req.CurrentIndex
+
+	if sortType == "" {
+		sortType = "desc"
+	}
 
 	var startSize int
 	if pageSize <= 0 {
@@ -49,34 +62,58 @@ func (this *EdbInfoController) SmmApiList() {
 	var condition string
 	var pars []interface{}
 
-	if types != "" {
-		typeArr := strings.Split(types,",")
-		for i, v := range typeArr {
-			typeStr := "type_"
-			typeStr += fmt.Sprintf("%d", i+1)
-			condition += " AND "+typeStr+" =? "
-			pars = append(pars, v)
+	if len(types) > 0 {
+		condition += " AND ( "
+		for _, v := range types {
+			typeArr := strings.Split(v,",")
+			for i, v := range typeArr {
+				if i == 0 {
+					condition += " ( "
+				}
+				typeStr := "type_"
+				typeStr += fmt.Sprintf("%d", i+1)
+				condition += typeStr+" =? "
+				pars = append(pars, v)
+				if i == len(typeArr) - 1 {
+					condition += " ) "
+				} else {
+					condition += " AND "
+				}
+			}
+			condition += " OR "
 		}
+		condition = strings.Trim(condition, "OR ")
+		condition += " ) "
 	}
 
 	if frequency != "" {
-		condition += " AND frequency = ? "
-		pars = append(pars, frequency)
+		frequencyArr := strings.Split(frequency,",")
+		condition += ` AND frequency IN (` + utils.GetOrmInReplace(len(frequencyArr)) + `) `
+		pars = append(pars, frequencyArr)
 	}
 
 	if dataState != "" {
-		if dataState == "normal" {
-			condition += " AND (data_state = 'normal' OR data_state = '') "
-			pars = append(pars)
+		stateArr := strings.Split(dataState,",")
+		if strings.Contains(dataState, "normal") {
+			stateArr = append(stateArr, "")
+			condition += ` AND data_state IN (` + utils.GetOrmInReplace(len(stateArr)) + `) `
+			pars = append(pars, stateArr)
 		} else {
-			condition += " AND data_state = ? "
-			pars = append(pars, dataState)
+			condition += ` AND data_state IN (` + utils.GetOrmInReplace(len(stateArr)) + `) `
+			pars = append(pars, stateArr)
 		}
 	}
 
 	if keyword != "" {
-		condition += " AND (index_name LIKE ? OR index_code LIKE ?) "
-		pars = utils.GetLikeKeywordPars(pars, keyword, 2)
+		keyWordArr := strings.Split(keyword, " ")
+		if len(keyWordArr) > 0 {
+			condition += " AND ( "
+			for _, v := range keyWordArr {
+				condition += ` CONCAT(index_name,index_code) LIKE '%` + v + `%' OR`
+			}
+			condition = strings.TrimRight(condition, "OR")
+			condition += " ) "
+		}
 	}
 
 	if indexCodes != "" {

+ 173 - 7
controllers/data_stat/edb_source_stat.go

@@ -317,6 +317,7 @@ func (this *EdbSourceStatController) EdbUpdateLog() {
 	sortParamReq := this.GetString("SortParam", "")
 	sortType := this.GetString("SortType", "desc")
 	createTime := this.GetString("CreateTime", "")
+	updateType, _ := this.GetInt("UpdateType", -1)
 
 	pageSize, _ := this.GetInt("PageSize")
 	currentIndex, _ := this.GetInt("CurrentIndex")
@@ -345,7 +346,10 @@ func (this *EdbSourceStatController) EdbUpdateLog() {
 		condition += " AND create_time >= ? AND create_time < ?"
 		pars = append(pars, createTime, endT.Format(utils.FormatDate))
 	}
-
+	if updateType >= 0 {
+		condition += " AND update_type =? "
+		pars = append(pars, updateType)
+	}
 	sortStr := ``
 	sortParam := ``
 	if sortParamReq != `` {
@@ -429,6 +433,7 @@ func (this *EdbSourceStatController) EdbUpdateLog() {
 		if v.ErDataUpdateDate != utils.EmptyDateStr {
 			tmp.ErDataUpdateDate = v.ErDataUpdateDate
 		}
+		tmp.UpdateType = v.UpdateType
 		list = append(list, tmp)
 	}
 
@@ -550,14 +555,14 @@ func (this *EdbSourceStatController) EdbUpdateStat() {
 	total, err := data_stat.GetEdbUpdateStatCount(condition, pars)
 	if err != nil {
 		if err.Error() != utils.ErrNoRow() {
-			br.Msg = "获取指标删除列表总数失败"
-			br.ErrMsg = "获取指标删除列表总数失败,Err:" + err.Error()
+			br.Msg = "获取指标列表总数失败"
+			br.ErrMsg = "获取指标列表总数失败,Err:" + err.Error()
 			return
 		} else {
 			err = nil
 		}
 	}
-	list := make([]*data_stat.EdbInfoUpdateStatItem, 0)
+	list := make([]*data_stat.EdbInfoUpdateStatItemMore, 0)
 	page := paging.GetPaging(currentIndex, pageSize, total)
 	if total == 0 {
 		resp := data_stat.GetEdbUpdateStatResp{
@@ -577,8 +582,28 @@ func (this *EdbSourceStatController) EdbUpdateStat() {
 		return
 	}
 
+	// 获取初始数据源名称
+	var edbCodeList []string
+	for _, v := range tmpList {
+		edbCodeList = append(edbCodeList, v.EdbCode)
+	}
+	initSourceMap := make(map[string]string)
+	if len(edbCodeList) > 0 {
+		baseCond := " and index_code in (" + utils.GetOrmInReplace(len(edbCodeList)) + ")"
+		var basePars []interface{}
+		basePars = append(basePars, edbCodeList)
+		indexList, tErr := data_manage.GetMysteelChemicalIndexList(baseCond, basePars, 0, 1000)
+		if tErr != nil {
+			br.Msg = "获取初始指标信息失败"
+			br.ErrMsg = "获取初始指标信息失败,Err:" + tErr.Error()
+			return
+		}
+		for _, v := range indexList {
+			initSourceMap[v.IndexCode] = v.Source
+		}
+	}
 	for _, v := range tmpList {
-		tmp := new(data_stat.EdbInfoUpdateStatItem)
+		tmp := new(data_stat.EdbInfoUpdateStatItemMore)
 		tmp.Id = v.Id
 		tmp.EdbInfoId = v.EdbInfoId
 		tmp.SourceName = v.SourceName
@@ -608,6 +633,7 @@ func (this *EdbSourceStatController) EdbUpdateStat() {
 		tmp.IsAdd = v.IsAdd
 		tmp.NeedRefresh = v.NeedRefresh
 		tmp.HasRefresh = v.HasRefresh
+		tmp.InitSourceName, _ = initSourceMap[v.EdbCode]
 		list = append(list, tmp)
 	}
 
@@ -757,8 +783,8 @@ func (this *EdbSourceStatController) EdbSourceStat() {
 }
 
 // EdbUpdateFailedList
-// @Title 查询指标更新失败详情列表
-// @Description 查询指标更新失败详情列表
+// @Title 查询指标更新失败详情汇总列表
+// @Description 查询指标更新失败详情汇总列表
 // @Success 200 {object} data_stat.GetEdbUpdateLogResp
 // @router /edb_update_stat/failed [get]
 func (this *EdbSourceStatController) EdbUpdateFailedList() {
@@ -840,3 +866,143 @@ func (this *EdbSourceStatController) EdbUpdateFailedList() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// EdbUpdateFailedDetailList
+// @Title 查询指标更新失败详情列表
+// @Description 查询指标更新失败详情列表
+// @Success 200 {object} data_stat.GetEdbUpdateLogResp
+// @router /edb_update_stat/failed/detail [get]
+func (this *EdbSourceStatController) EdbUpdateFailedDetailList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	terminalCode := this.GetString("TerminalCode", "")
+	createTime := this.GetString("CreateTime", "")
+	frequency := this.GetString("Frequency", "")
+	sourceUpdateFailedReason := this.GetString("SourceUpdateFailedReason", "")
+
+	if createTime == "" {
+		br.Msg = "请选择创建时间"
+		return
+	}
+
+	if terminalCode == "" {
+		br.Msg = "请选择对应的终端信息"
+		return
+	}
+	if frequency == "" {
+		br.Msg = "请选择对应的频度"
+		return
+	}
+
+	condition := " and source = ? and terminal_code = ? and frequency=? and data_update_failed_reason=? and data_update_result = 2"
+	var pars []interface{}
+	pars = append(pars, utils.DATA_SOURCE_MYSTEEL_CHEMICAL, terminalCode, frequency, sourceUpdateFailedReason)
+
+	if createTime != "" {
+		startT, err := time.ParseInLocation(utils.FormatDate, createTime, time.Local)
+		if err != nil {
+			br.Msg = "请求时间格式错误"
+			return
+		}
+		endT := startT.AddDate(0, 0, 1)
+		condition += " AND create_time >= ? AND create_time < ?"
+		pars = append(pars, createTime, endT.Format(utils.FormatDate))
+	}
+
+	total, err := data_stat.GetEdbUpdateStatCount(condition, pars)
+	if err != nil {
+		if err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取指标列表总数失败"
+			br.ErrMsg = "获取指标列表总数失败,Err:" + err.Error()
+			return
+		} else {
+			err = nil
+		}
+	}
+	list := make([]*data_stat.EdbInfoUpdateStatItemMore, 0)
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	if total == 0 {
+		resp := data_stat.GetEdbUpdateStatResp{
+			Paging: page,
+			List:   list,
+		}
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		br.Data = resp
+		return
+	}
+	tmpList, err := data_stat.GetEdbUpdateStatByCondition(condition, pars, "", pageSize, startSize)
+	if err != nil {
+		br.Msg = "获取指标更新列表失败"
+		br.ErrMsg = "获取指标更新列表失败,Err:" + err.Error()
+		return
+	}
+
+	for _, v := range tmpList {
+		tmp := new(data_stat.EdbInfoUpdateStatItemMore)
+		tmp.Id = v.Id
+		tmp.EdbInfoId = v.EdbInfoId
+		tmp.SourceName = v.SourceName
+		tmp.Source = v.Source
+		tmp.EdbCode = v.EdbCode
+		tmp.EdbName = v.EdbName
+		tmp.EdbNameSource = v.EdbNameSource
+		tmp.Frequency = v.Frequency
+		tmp.Unit = v.Unit
+		tmp.StartDate = v.StartDate
+		tmp.SysUserId = v.SysUserId
+		tmp.SysUserRealName = v.SysUserRealName
+		tmp.LatestDate = v.LatestDate
+		tmp.LatestValue = v.LatestValue
+		tmp.TerminalCode = v.TerminalCode
+		tmp.CreateTime = v.CreateTime.Format(utils.FormatDateTime)
+		if v.DataUpdateTime != utils.EmptyDateTimeStr {
+			tmp.DataUpdateTime = v.DataUpdateTime
+		}
+		if v.ErDataUpdateDate != utils.EmptyDateStr {
+			tmp.ErDataUpdateDate = v.ErDataUpdateDate
+		}
+		tmp.DataUpdateResult = v.DataUpdateResult
+		tmp.DataUpdateFailedReason = v.DataUpdateFailedReason
+		if v.UpdateTime != utils.EmptyDateTimeStr {
+			tmp.UpdateTime = v.UpdateTime
+		}
+		tmp.IsAdd = v.IsAdd
+		tmp.NeedRefresh = v.NeedRefresh
+		tmp.HasRefresh = v.HasRefresh
+		list = append(list, tmp)
+	}
+
+	resp := data_stat.GetEdbUpdateStatResp{
+		Paging: page,
+		List:   list,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 6 - 0
controllers/out_link.go

@@ -252,6 +252,12 @@ func (ol *OutLinkController) AllList() {
 	resp := &models.OutLinkListResp{
 		List: respList,
 	}
+	
+	if ol.SysUser.AdminName != "" {
+		desEncrypt := utils.DesBase64Encrypt([]byte(ol.SysUser.AdminName), utils.DesKeySalt)
+		resp.UserCode = string(desEncrypt)
+	}
+
 	br.Data = resp
 	br.Ret = 200
 	br.Success = true

+ 7 - 2
controllers/ppt_english.go

@@ -152,6 +152,7 @@ func (this *PptEnglishController) AddPpt() {
 			ReportType:    req.FirstPage.ReportType,
 			PptDate:       req.FirstPage.PptDate,
 			Content:       req.Content,
+			CoverContent:  req.CoverContent,
 			CreateTime:    time.Now(),
 			ModifyTime:    time.Now(),
 			AdminId:       this.SysUser.AdminId,
@@ -185,9 +186,10 @@ func (this *PptEnglishController) AddPpt() {
 		pptInfo.ReportType = req.FirstPage.ReportType
 		pptInfo.PptDate = req.FirstPage.PptDate
 		pptInfo.Content = req.Content
+		pptInfo.CoverContent = req.CoverContent
 		pptInfo.ModifyTime = time.Now()
 
-		err = pptInfo.Update([]string{"TemplateType", "BackgroundImg", "Title", "ReportType", "PptDate", "Content", "ModifyTime"})
+		err = pptInfo.Update([]string{"TemplateType", "BackgroundImg", "Title", "ReportType", "PptDate", "Content", "ModifyTime", "CoverContent"})
 
 		msg = "保存成功"
 	}
@@ -264,8 +266,9 @@ func (this *PptEnglishController) EditPpt() {
 	pptInfo.ReportType = req.FirstPage.ReportType
 	pptInfo.PptDate = req.FirstPage.PptDate
 	pptInfo.Content = req.Content
+	pptInfo.CoverContent = req.CoverContent
 	pptInfo.ModifyTime = time.Now()
-	err = pptInfo.Update([]string{"TemplateType", "BackgroundImg", "Title", "ReportType", "PptDate", "Content", "ModifyTime"})
+	err = pptInfo.Update([]string{"TemplateType", "BackgroundImg", "Title", "ReportType", "PptDate", "Content", "ModifyTime", "CoverContent"})
 	if err != nil {
 		br.Msg = "编辑失败"
 		br.ErrMsg = "编辑失败,Err:" + err.Error()
@@ -282,6 +285,7 @@ func (this *PptEnglishController) EditPpt() {
 			ReportType:    pptInfo.ReportType,
 			PptDate:       pptInfo.PptDate,
 			Content:       pptInfo.Content,
+			CoverContent:  pptInfo.CoverContent,
 			AdminId:       this.SysUser.AdminId,
 			AdminRealName: this.SysUser.RealName,
 			CreateTime:    time.Now(),
@@ -672,6 +676,7 @@ func (this *PptEnglishController) SaveLog() {
 		ReportType:    req.FirstPage.ReportType,
 		PptDate:       req.FirstPage.PptDate,
 		Content:       req.Content,
+		CoverContent:  req.CoverContent,
 		AdminId:       this.SysUser.AdminId,
 		AdminRealName: this.SysUser.RealName,
 		CreateTime:    time.Now(),

+ 9 - 2
controllers/ppt_v2.go

@@ -152,6 +152,7 @@ func (this *PptV2Controller) AddPpt() {
 			ReportType:    req.FirstPage.ReportType,
 			PptDate:       req.FirstPage.PptDate,
 			Content:       req.Content,
+			CoverContent:  req.CoverContent,
 			CreateTime:    time.Now(),
 			ModifyTime:    time.Now(),
 			AdminId:       this.SysUser.AdminId,
@@ -186,9 +187,10 @@ func (this *PptV2Controller) AddPpt() {
 		pptInfo.ReportType = req.FirstPage.ReportType
 		pptInfo.PptDate = req.FirstPage.PptDate
 		pptInfo.Content = req.Content
+		pptInfo.CoverContent = req.CoverContent
 		pptInfo.ModifyTime = time.Now()
 
-		err = pptInfo.Update([]string{"TemplateType", "BackgroundImg", "Title", "ReportType", "PptDate", "Content", "ModifyTime"})
+		err = pptInfo.Update([]string{"TemplateType", "BackgroundImg", "Title", "ReportType", "PptDate", "Content", "ModifyTime", "CoverContent"})
 
 		msg = "保存成功"
 	}
@@ -265,8 +267,9 @@ func (this *PptV2Controller) EditPpt() {
 	pptInfo.ReportType = req.FirstPage.ReportType
 	pptInfo.PptDate = req.FirstPage.PptDate
 	pptInfo.Content = req.Content
+	pptInfo.CoverContent = req.CoverContent
 	pptInfo.ModifyTime = time.Now()
-	err = pptInfo.Update([]string{"TemplateType", "BackgroundImg", "Title", "ReportType", "PptDate", "Content", "ModifyTime"})
+	err = pptInfo.Update([]string{"TemplateType", "BackgroundImg", "Title", "ReportType", "PptDate", "Content", "ModifyTime", "CoverContent"})
 	if err != nil {
 		br.Msg = "编辑失败"
 		br.ErrMsg = "编辑失败,Err:" + err.Error()
@@ -283,6 +286,7 @@ func (this *PptV2Controller) EditPpt() {
 			ReportType:    pptInfo.ReportType,
 			PptDate:       pptInfo.PptDate,
 			Content:       pptInfo.Content,
+			CoverContent:  pptInfo.CoverContent,
 			AdminId:       this.SysUser.AdminId,
 			AdminRealName: this.SysUser.RealName,
 			CreateTime:    time.Now(),
@@ -673,6 +677,7 @@ func (this *PptV2Controller) SaveLog() {
 		ReportType:    req.FirstPage.ReportType,
 		PptDate:       req.FirstPage.PptDate,
 		Content:       req.Content,
+		CoverContent:  req.CoverContent,
 		AdminId:       this.SysUser.AdminId,
 		AdminRealName: this.SysUser.RealName,
 		CreateTime:    time.Now(),
@@ -1019,6 +1024,7 @@ func (this *PptV2Controller) ToEn() {
 		ReportType:    origin.ReportType,
 		PptDate:       origin.PptDate,
 		Content:       origin.Content,
+		CoverContent:  origin.CoverContent,
 		CreateTime:    time.Now(),
 		ModifyTime:    time.Now(),
 		AdminId:       this.SysUser.AdminId,
@@ -1117,6 +1123,7 @@ func (this *PptV2Controller) BatchToEn() {
 			ReportType:    origin.ReportType,
 			PptDate:       origin.PptDate,
 			Content:       origin.Content,
+			CoverContent:  origin.CoverContent,
 			CreateTime:    nowTime,
 			ModifyTime:    nowTime,
 			AdminId:       this.SysUser.AdminId,

+ 144 - 0
models/data_manage/base_from_fenwei.go

@@ -0,0 +1,144 @@
+package data_manage
+
+import (
+	"eta/eta_api/utils"
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+type BaseFromFenweiIndex struct {
+	FenweiIndexId int `orm:"column(fenwei_index_id);pk"`
+	ClassifyId    int
+	IndexCode     string
+	IndexName     string
+	Frequency     string
+	Unit          string
+	Sort          int
+	CreateTime    time.Time
+	ModifyTime    time.Time
+}
+
+type BaseFromFenweiIndexList struct {
+	FenweiIndexId int `orm:"column(fenwei_index_id);pk"`
+	ClassifyId    int
+	IndexCode     string
+	IndexName     string
+	Frequency     string
+	Unit          string
+	Sort          int
+	CreateTime    string
+	ModifyTime    string
+	DataList      []*BaseFromFenweiData
+	Paging        *paging.PagingItem `description:"分页数据"`
+}
+
+type FenweiSingleDataResp struct {
+	FenweiIndexId int
+	ClassifyId    int
+	IndexCode     string
+	IndexName     string
+	Frequency     string
+	Unit          string
+	CreateTime    string
+	ModifyTime    string
+	Data          []*FenweiSingleData
+}
+
+type FenweiSingleData struct {
+	Value    string `orm:"column(value)" description:"日期"`
+	DataTime string `orm:"column(data_time)" description:"值"`
+}
+
+func GetFenweiIndex(condition string, pars interface{}) (items []*BaseFromFenweiIndexList, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM base_from_fenwei_index WHERE 1=1  `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY sort ASC, fenwei_index_id asc`
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+func GetFenweiIndexDataCount(indexCode string) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT COUNT(1) AS count FROM base_from_fenwei_data WHERE index_code=? `
+	err = o.Raw(sql, indexCode).QueryRow(&count)
+	return
+}
+
+type FenweiIndexDataCountGroup struct {
+	IndexCode string
+	Count     int
+}
+
+func GetFenweiIndexDataCountGroup(indexCodes []string) (items []*FenweiIndexDataCountGroup, err error) {
+	if len(indexCodes) <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT COUNT(1) AS count, index_code FROM base_from_fenwei_data WHERE index_code IN (` + utils.GetOrmInReplace(len(indexCodes)) + `) GROUP BY index_code`
+	_, err = o.Raw(sql, indexCodes).QueryRows(&items)
+	return
+}
+
+func GetFenweiIndexData(indexCode string, startSize, pageSize int) (items []*BaseFromFenweiData, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT *  FROM base_from_fenwei_data WHERE index_code=? ORDER BY data_time DESC LIMIT ?,? `
+	_, err = o.Raw(sql, indexCode, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+func GetFenweiIndexDataByCodes(indexCode []string) (items []*BaseFromFenweiData, err error) {
+	if len(indexCode) <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT *  FROM base_from_fenwei_data WHERE index_code in (` + utils.GetOrmInReplace(len(indexCode)) + `) ORDER BY data_time DESC  `
+	_, err = o.Raw(sql, indexCode).QueryRows(&items)
+	return
+}
+
+type BaseFromFenweiData struct {
+	FenweiDataId  int `orm:"column(fenwei_data_id);pk"`
+	FenweiIndexId int
+	IndexCode     string
+	DataTime      string
+	Value         string
+	CreateTime    string
+	ModifyTime    string
+	DataTimestamp int64
+}
+
+type BaseFromFenweiIndexSearchItem struct {
+	FenweiIndexId int `orm:"column(fenwei_index_id);pk"`
+	ClassifyId    int
+	IndexCode     string
+	IndexName     string
+}
+
+// GetFenweiItemList 模糊查询汾渭数据库指标列表
+func GetFenweiItemList(condition string) (items []*BaseFromFenweiIndexSearchItem, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := "SELECT * FROM base_from_fenwei_index WHERE 1=1"
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+func GetFenweiIndexDataByCode(indexCode string) (list []*BaseFromFenweiData, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_fenwei_data WHERE index_code=? `
+	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	return
+}
+
+func GetBaseFromFenweiIndexByIndexCode(indexCode string) (list *BaseFromFenweiIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM base_from_fenwei_index WHERE index_code=? `
+	err = o.Raw(sql, indexCode).QueryRow(&list)
+	return
+}

+ 55 - 0
models/data_manage/base_from_fenwei_classify.go

@@ -0,0 +1,55 @@
+package data_manage
+
+import (
+	"eta/eta_api/utils"
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// BaseFromFenweiClassify 汾渭原始数据分类表
+type BaseFromFenweiClassify struct {
+	ClassifyId      int       `orm:"column(classify_id);pk"`
+	ClassifyName    string    `description:"分类名称"`
+	ParentId        int       `description:"父级id"`
+	SysUserId       int       `description:"创建人id"`
+	SysUserRealName string    `description:"创建人姓名"`
+	Level           int       `description:"层级"`
+	Sort            int       `description:"排序字段,越小越靠前,默认值:10"`
+	ModifyTime      time.Time `description:"修改时间"`
+	CreateTime      time.Time `description:"创建时间"`
+}
+
+// GetBaseFromFenweiClassify 获取所有分类
+func GetBaseFromFenweiClassify() (items []*BaseFromFenweiClassify, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM base_from_fenwei_classify ORDER BY parent_id ASC, sort ASC, classify_id ASC`
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// BaseFromFenweiClassifyItem 汾渭数据分类信息
+type BaseFromFenweiClassifyItem struct {
+	ClassifyId   int                           `description:"分类ID"`
+	ClassifyName string                        `description:"分类名称"`
+	ParentId     int                           `description:"父级id"`
+	Level        int                           `description:"层级"`
+	Sort         int                           `description:"排序字段"`
+	CreateTime   string                        `description:"创建时间"`
+	ModifyTime   string                        `description:"修改时间"`
+	Child        []*BaseFromFenweiClassifyItem `description:"子分类"`
+}
+
+func (y *BaseFromFenweiClassify) Format2Item(origin *BaseFromFenweiClassify) (item *BaseFromFenweiClassifyItem) {
+	if origin == nil {
+		return
+	}
+	item = new(BaseFromFenweiClassifyItem)
+	item.ClassifyId = origin.ClassifyId
+	item.ClassifyName = origin.ClassifyName
+	item.ParentId = origin.ParentId
+	item.Level = origin.Level
+	item.Sort = origin.Sort
+	item.CreateTime = utils.TimeTransferString(utils.FormatDateTime, origin.CreateTime)
+	item.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, origin.ModifyTime)
+	return
+}

+ 26 - 4
models/data_manage/base_from_smm.go

@@ -394,7 +394,6 @@ type BaseFromSmmIndexTypeList struct {
 	Type3 string `orm:"column(type_3)"`
 }
 
-
 // GetBaseFromSmmIndexTypeList
 func GetBaseFromSmmIndexTypeList() (list []BaseFromSmmIndexTypeList, err error) {
 	o := orm.NewOrmUsingDB("data")
@@ -404,7 +403,7 @@ func GetBaseFromSmmIndexTypeList() (list []BaseFromSmmIndexTypeList, err error)
 }
 
 type TypeListRespItem struct {
-	Type string
+	Type  string
 	Child []TypeListRespItem
 }
 
@@ -422,6 +421,29 @@ func GetSmmIndexDataListNoPage(condition string, pars []interface{}) (items []*B
 func GetBaseFromSmmIndexByIndexCodes(indexCodes string) (list []*BaseFromSmmIndex, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT * FROM base_from_smm_index WHERE index_code IN (` + indexCodes + `)`
-	_,err = o.Raw(sql).QueryRows(&list)
+	_, err = o.Raw(sql).QueryRows(&list)
 	return
-}
+}
+
+// SmmIndexListReq
+type SmmIndexListReq struct {
+	Types        []string `description:"分类"`
+	Frequency    string   `description:"频度"`
+	DataState    string   `description:"数据状态"`
+	Keyword      string   `description:"关键字"`
+	IndexCodes   string   `description:"指标代码"`
+	SortType     string   `description:"排序类型"`
+	SortParam    string   `description:"排序参数"`
+	PageSize     int
+	CurrentIndex int
+}
+
+// SmmIndexExistCheckReq
+type SmmIndexExistCheckReq struct {
+	Types      []string `description:"分类"`
+	Frequency  string   `description:"频度"`
+	DataState  string   `description:"数据状态"`
+	EdbCode    string   `description:"指标代码"`
+	SelectAll  bool     `description:"是否全选"`
+	Keyword    string   `description:"关键字"`
+}

+ 38 - 25
models/data_manage/base_from_trade_index.go

@@ -265,7 +265,7 @@ type BaseFromCoalmineFirmIndex struct {
 	ModifyTime                  string `description:"修改时间"`
 }
 
-//查询指标
+// 查询指标
 func GetBaseFromCoalmineFirmIndex(dataTime string) (items []*BaseFromCoalmineFirmIndex, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM base_from_coalmine_firm_index WHERE data_time LIKE  `
@@ -290,7 +290,7 @@ type BaseFromCoalmineCoastalIndex struct {
 	ModifyTime                     string `description:"修改时间"`
 }
 
-//查询指标
+// 查询指标
 func GetBaseFromCoalmineCoastalIndex(startDate, endDate string) (items []*BaseFromCoalmineCoastalIndex, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM base_from_coalmine_coastal_index WHERE data_time between ? and ? `
@@ -313,7 +313,7 @@ type BaseFromCoalmineInlandIndex struct {
 	ModifyTime                    string `description:"修改时间"`
 }
 
-//查询指标
+// 查询指标
 func GetBaseFromCoalmineInlandIndex(startDate, endDate string) (items []*BaseFromCoalmineInlandIndex, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM base_from_coalmine_inland_index WHERE data_time between ? and ? `
@@ -321,7 +321,7 @@ func GetBaseFromCoalmineInlandIndex(startDate, endDate string) (items []*BaseFro
 	return
 }
 
-type BaseFromCoalmineClassify struct {
+type BaseFromCoalmineClassifyItem struct {
 	ClassifyId   int
 	ClassifyName string
 	Child        []CoalChild
@@ -381,7 +381,7 @@ func GetFrequencyFromCoal(suffix string) (list *string, err error) {
 	return
 }
 
-//查询数据
+// 查询数据
 func GetBaseFromCoalmineIndexByFrequency(frequency, groupName string) (items []*BaseFromCoalmineJsmIndex, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM base_from_coalmine_jsm_index WHERE frequency=? AND province=?`
@@ -389,7 +389,7 @@ func GetBaseFromCoalmineIndexByFrequency(frequency, groupName string) (items []*
 	return
 }
 
-//查询数据
+// 查询数据
 func GetGroupNameFromCoalmineIndex(suffix string) (items []*string, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `SELECT DISTINCT group_name FROM base_from_coalmine_%s `
@@ -398,7 +398,7 @@ func GetGroupNameFromCoalmineIndex(suffix string) (items []*string, err error) {
 	return
 }
 
-//查询数据
+// 查询数据
 func GetProvinceFromCoalmineIndex(suffix string) (items []*string, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `SELECT DISTINCT province FROM base_from_coalmine_%s `
@@ -407,7 +407,7 @@ func GetProvinceFromCoalmineIndex(suffix string) (items []*string, err error) {
 	return
 }
 
-//查询数据
+// 查询数据
 func GetClassifyCoalmineIndexByGroupName(groupName string) (items []*string, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `SELECT DISTINCT index_code FROM base_from_coalmine_jsm_index WHERE province=? `
@@ -415,7 +415,7 @@ func GetClassifyCoalmineIndexByGroupName(groupName string) (items []*string, err
 	return
 }
 
-//查询数据
+// 查询数据
 func GetPageFromCoalmineIndexByFrequency(frequency, classify string, startSize, pageSize int) (items []*BaseFromCoalmineJsmIndex, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM base_from_coalmine_jsm_index WHERE frequency=? AND index_code=? ORDER BY data_time DESC LIMIT ?,?  `
@@ -423,7 +423,7 @@ func GetPageFromCoalmineIndexByFrequency(frequency, classify string, startSize,
 	return
 }
 
-//查询数据
+// 查询数据
 func GetCountFromJsm(indexCode string) (item int, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `SELECT COUNT(1) FROM base_from_coalmine_jsm_index WHERE index_code=? `
@@ -445,7 +445,7 @@ func GetClassifyJsmByGroupName(groupName string) (items []*string, err error) {
 	return
 }
 
-//查询公司指标
+// 查询公司指标
 func GetPageFromCoalmineCompanyIndexByFrequency(frequency, classify string, startSize, pageSize int) (items []*BaseFromCoalmineCompanyIndex, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM base_from_coalmine_company_index WHERE frequency=? AND index_code=? ORDER BY data_time DESC LIMIT ?,? `
@@ -474,7 +474,7 @@ func GetClassifyFirmByGroupName(groupName string) (items []*string, err error) {
 	return
 }
 
-//查询指标
+// 查询指标
 func GetPageFromCoalmineFirmIndexByFrequency(frequency, classify string, startSize, pageSize int) (items []*BaseFromCoalmineFirmIndex, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM base_from_coalmine_firm_index WHERE frequency=? AND index_code=? ORDER BY data_time DESC LIMIT ?,?  `
@@ -496,7 +496,7 @@ func GetClassifyCoastalByGroupName(groupName string) (items []*string, err error
 	return
 }
 
-//查询指标
+// 查询指标
 func GetPageFromCoalmineCoastalIndexByFrequency(frequency, classify string, startSize, pageSize int) (items []*BaseFromCoalmineCoastalIndex, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM base_from_coalmine_coastal_index WHERE frequency=? AND index_code=? ORDER BY data_time DESC LIMIT ?,? `
@@ -518,7 +518,7 @@ func GetClassifyInlandByGroupName(groupName string) (items []*string, err error)
 	return
 }
 
-//查询指标
+// 查询指标
 func GetPageFromCoalmineInlandIndexByFrequency(frequency, classify string, startSize, pageSize int) (items []*BaseFromCoalmineInlandIndex, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM base_from_coalmine_inland_index WHERE frequency=? AND index_code=? ORDER BY data_time DESC LIMIT ?,? `
@@ -526,7 +526,7 @@ func GetPageFromCoalmineInlandIndexByFrequency(frequency, classify string, start
 	return
 }
 
-//查询公司指标
+// 查询公司指标
 func GetBaseFromCoalmineCompanyIndexByFrequency(frequency, groupName string) (items []*BaseFromCoalmineCompanyIndex, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM base_from_coalmine_company_index WHERE frequency=? AND group_name=? `
@@ -534,7 +534,7 @@ func GetBaseFromCoalmineCompanyIndexByFrequency(frequency, groupName string) (it
 	return
 }
 
-//查询指标
+// 查询指标
 func GetBaseFromCoalmineFirmIndexByFrequency(frequency, groupName string) (items []*BaseFromCoalmineFirmIndex, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM base_from_coalmine_firm_index WHERE frequency=? AND group_name=? `
@@ -542,7 +542,7 @@ func GetBaseFromCoalmineFirmIndexByFrequency(frequency, groupName string) (items
 	return
 }
 
-//查询指标
+// 查询指标
 func GetBaseFromCoalmineCoastalIndexByFrequency(frequency, groupName string) (items []*BaseFromCoalmineCoastalIndex, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM base_from_coalmine_coastal_index WHERE frequency=? AND group_name=? `
@@ -550,7 +550,7 @@ func GetBaseFromCoalmineCoastalIndexByFrequency(frequency, groupName string) (it
 	return
 }
 
-//查询指标
+// 查询指标
 func GetBaseFromCoalmineInlandIndexByFrequency(frequency, groupName string) (items []*BaseFromCoalmineInlandIndex, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM base_from_coalmine_inland_index WHERE frequency=? AND group_name=? `
@@ -558,7 +558,7 @@ func GetBaseFromCoalmineInlandIndexByFrequency(frequency, groupName string) (ite
 	return
 }
 
-//查询数据
+// 查询数据
 func GetBaseFromCoalmineIndexByCode(indexCode string) (items []*BaseFromCoalmineJsmIndex, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM base_from_coalmine_jsm_index WHERE index_code=?`
@@ -566,7 +566,7 @@ func GetBaseFromCoalmineIndexByCode(indexCode string) (items []*BaseFromCoalmine
 	return
 }
 
-//查询公司指标
+// 查询公司指标
 func GetBaseFromCoalmineCompanyIndexByCode(indexCode string) (items []*BaseFromCoalmineCompanyIndex, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM base_from_coalmine_company_index WHERE index_code=? `
@@ -574,7 +574,7 @@ func GetBaseFromCoalmineCompanyIndexByCode(indexCode string) (items []*BaseFromC
 	return
 }
 
-//查询指标
+// 查询指标
 func GetBaseFromCoalmineFirmIndexByCode(indexCode string) (items []*BaseFromCoalmineFirmIndex, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM base_from_coalmine_firm_index WHERE index_code=? `
@@ -582,7 +582,7 @@ func GetBaseFromCoalmineFirmIndexByCode(indexCode string) (items []*BaseFromCoal
 	return
 }
 
-//查询指标
+// 查询指标
 func GetBaseFromCoalmineCoastalIndexByCode(indexCode string) (items []*BaseFromCoalmineCoastalIndex, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM base_from_coalmine_coastal_index WHERE index_code=? `
@@ -590,7 +590,7 @@ func GetBaseFromCoalmineCoastalIndexByCode(indexCode string) (items []*BaseFromC
 	return
 }
 
-//查询指标
+// 查询指标
 func GetBaseFromCoalmineInlandIndexByCode(indexCode string) (items []*BaseFromCoalmineInlandIndex, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := `SELECT * FROM base_from_coalmine_inland_index WHERE index_code=? `
@@ -598,7 +598,6 @@ func GetBaseFromCoalmineInlandIndexByCode(indexCode string) (items []*BaseFromCo
 	return
 }
 
-
 type BaseFromTradeEicIndexV2 struct {
 	BaseFromEicIndexId     int `orm:"column(base_from_eic_index_id);pk"`
 	Type                   string
@@ -687,4 +686,18 @@ func GetFirstBaseFromTradeIndexByDate(exchange string) (item *BaseFromTradeShang
 	sql := "SELECT * FROM base_from_trade_" + exchange + "_index where rank < 50 order by data_time asc"
 	err = o.Raw(sql).QueryRow(&item)
 	return
-}
+}
+
+type BaseFromCoalmineClassify struct {
+	BaseFromCoalmineClassifyId int    `orm:"column(base_from_coalmine_classify_id);pk"`
+	ClassifyName               string // 分类名称
+	Suffix                     string // 表名后缀
+	CreateTime                 time.Time
+}
+
+func GetCoalmineClassifyList() (list []*BaseFromCoalmineClassify, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := "SELECT * FROM base_from_coalmine_classify"
+	_,err = o.Raw(sql).QueryRows(&list)
+	return
+}

+ 1 - 1
models/data_manage/chart_edb_mapping.go

@@ -186,7 +186,7 @@ func GetChartEdbMappingListV2(chartInfoId int) (list []*ChartEdbInfoMapping, err
 // GetChartEdbMappingByEdbInfoId 根据指标id获取edb_mapping
 func GetChartEdbMappingByEdbInfoId(edbInfoId int) (item *ChartEdbInfoMapping, err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT edb_info_id,source_name,classify_id,source,sub_source,edb_code,edb_name,edb_name_en,frequency,unit,unit_en,start_date,end_date,modify_time,latest_date,latest_value,unique_code,edb_info_type AS edb_info_category_type,max_value,min_value
+	sql := ` SELECT edb_info_id,source_name,classify_id,source,sub_source,edb_code,edb_name,edb_name_en,frequency,unit,unit_en,start_date,end_date,modify_time,latest_date,latest_value,unique_code,edb_info_type AS edb_info_category_type,edb_type,max_value,min_value
              FROM edb_info
 			 WHERE edb_info_id = ? limit 1`
 	err = o.Raw(sql, edbInfoId).QueryRow(&item)

+ 7 - 0
models/data_manage/cross_variety/request/chart.go

@@ -31,6 +31,13 @@ type AddChartReq struct {
 	CalculateUnit  string            `description:"计算频度"`
 	DateConfigList []ChartConfigDate `description:"日期配置列表"`
 	VarietyList    []int
+
+	// 主题相关
+	ChartThemeId int    `description:"图表应用主题ID"`
+	SourcesFrom  string `description:"图表来源"`
+	Instructions string `description:"图表说明"`
+	MarkersLines string `description:"标识线"`
+	MarkersAreas string `description:"标识区"`
 }
 
 // EditChartReq

+ 2 - 0
models/data_manage/edb_data_base.go

@@ -291,6 +291,8 @@ func GetEdbDataTableNameAndSubSource(source, subSource int) (tableName string) {
 		} else {
 			tableName = "edb_data_ths_ds"
 		}
+	case utils.DATA_SOURCE_YS:
+		tableName = "edb_data_ys"
 	default:
 		edbSource := EdbSourceIdMap[source]
 		if edbSource != nil {

+ 29 - 3
models/data_manage/edb_data_insert_config.go

@@ -5,6 +5,7 @@ import (
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
+	"strconv"
 	"time"
 )
 
@@ -40,7 +41,7 @@ func GetEdbDataInsertConfigByEdbIdList(edbInfoIdList []int) (items []*EdbDataIns
 }
 
 // CreateEdbDataInsertConfigAndData 创建数据插入配置规则,及插入数据
-func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value float64) (err error, errMsg string, isSendEmail bool) {
+func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value string) (err error, errMsg string, isSendEmail bool) {
 	isSendEmail = true
 
 	tableName := GetEdbDataTableName(edbInfo.Source, edbInfo.SubSource)
@@ -52,7 +53,18 @@ func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value fl
 	dateStr := date.Format(utils.FormatDate)
 	timestamp := date.UnixNano() / 1e6
 	timeStr := fmt.Sprintf("%d", timestamp)
-	saveValue := utils.SubFloatToString(value, 30)
+
+	var saveValue string
+	if value != "" {
+		floatValue, e := strconv.ParseFloat(value, 64)
+		if e != nil {
+			err = e
+			fmt.Println("转换失败:", e.Error())
+			return
+		}
+		saveValue = utils.SubFloatToString(floatValue, 30)
+	}
+
 
 	to, err := orm.NewOrmUsingDB("data").Begin()
 	if err != nil {
@@ -120,6 +132,7 @@ func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value fl
 		}
 	}
 
+	var offsetDate string
 	// 更改数据
 	{
 		var edbDateData *EdbDataList
@@ -138,6 +151,20 @@ func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value fl
 			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.Raw(addSql).Exec()
+		} else if value == "" {
+			// 传空值时删除
+			sql := `SELECT data_time FROM %s WHERE edb_info_id=? ORDER BY data_time DESC LIMIT 1 OFFSET 1`
+			sql = fmt.Sprintf(sql, tableName)
+			err = to.Raw(sql, edbInfo.EdbInfoId).QueryRow(&offsetDate)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				return
+			}
+
+			dateStr = offsetDate
+
+			deleteSql := `DELETE FROM %s WHERE edb_data_id = %d;`
+			deleteSql = fmt.Sprintf(deleteSql, tableName, edbDateData.EdbDataId)
+			_, err = to.Raw(deleteSql).Exec()
 		} else {
 			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)
@@ -148,7 +175,6 @@ func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value fl
 		}
 	}
 
-	// 更改指标的数据结束日期
 	edbInfo.EndDate = dateStr
 	_, err = to.Update(edbInfo, "EndDate")
 

+ 1 - 1
models/data_manage/edb_info.go

@@ -1589,7 +1589,7 @@ type EdbInfoDataSeasonalResp struct {
 type SetEdbDataInsertConfigReq struct {
 	EdbInfoId int     `description:"指标ID"`
 	Date      string  `description:"日期"`
-	Value     float64 `description:"值"`
+	Value     string `description:"值"`
 }
 
 // GetEdbInfoByClassifyId 用于分类展示

+ 6 - 0
models/data_manage/line_equation/request/line_equation.go

@@ -23,6 +23,12 @@ type AddChart struct {
 	LeftMin         string `description:"图表左侧最小值"`
 	LeftMax         string `description:"图表左侧最大值"`
 	ChartImage      string `description:"图表截图,复制的时候才用到" json:"-"`
+
+	ChartThemeId int    `description:"图表应用主题ID"`
+	SourcesFrom  string `description:"图表来源"`
+	Instructions string `description:"图表说明"`
+	MarkersLines string `description:"标识线"`
+	MarkersAreas string `description:"标识区"`
 }
 
 // EditChartEnInfoReq 编辑图表英文信息

+ 2 - 0
models/data_stat/edb_info_update_log.go

@@ -37,6 +37,7 @@ type EdbInfoUpdateLog struct {
 	DataUpdateFailedReason string    `description:"数据未正常更新原因"`
 	DataUpdateTime         string    `description:"数据更新时间"`
 	IsSourceRefresh        int       `description:"是否为终端刷新到数据源的刷新操作:0否,1是"`
+	UpdateType             int       `description:"变更类型,0:数据明细变更,1:基础信息变更, 2:新增指标"`
 }
 
 type EdbInfoUpdateLogItem struct {
@@ -62,6 +63,7 @@ type EdbInfoUpdateLogItem struct {
 	TerminalCode          string  `description:"终端编码,用于配置在机器上"`
 	DataUpdateTime        string  `description:"最近一次数据发生变化的时间"`
 	ErDataUpdateDate      string  `description:"本次更新,数据发生变化的最早日期"`
+	UpdateType            int     `description:"变更类型,0:数据明细变更,1:基础信息变更, 2:新增指标"`
 }
 
 func AddEdbUpdateLog(item *EdbInfoUpdateLog) (lastId int64, err error) {

+ 6 - 1
models/data_stat/edb_info_update_stat.go

@@ -70,8 +70,13 @@ type EdbInfoUpdateStatItem struct {
 	HasRefresh             int8    `description:"今日是否已刷新,1是,0否"`
 }
 
+type EdbInfoUpdateStatItemMore struct {
+	EdbInfoUpdateStatItem
+	InitSourceName string `description:"初始数据源"`
+}
+
 type GetEdbUpdateStatResp struct {
-	List   []*EdbInfoUpdateStatItem
+	List   []*EdbInfoUpdateStatItemMore
 	Paging *paging.PagingItem
 }
 

+ 1 - 0
models/db.go

@@ -178,6 +178,7 @@ func init() {
 
 	// 报告审批
 	initReportApprove()
+
 	// 初始化图表主题
 	initChartTheme()
 

+ 3 - 2
models/out_link.go

@@ -27,8 +27,9 @@ type OutLinkItem struct {
 }
 
 type OutLinkListResp struct {
-	List   []*OutLinkItem
-	Paging *paging.PagingItem `description:"分页数据"`
+	List     []*OutLinkItem
+	UserCode string
+	Paging   *paging.PagingItem `description:"分页数据"`
 }
 
 type OutLinkSaveReq struct {

+ 6 - 2
models/ppt_english/ppt_english.go

@@ -24,6 +24,7 @@ type PptEnglish struct {
 	ReportCode    string    `description:"关联的报告code"`
 	IsShare       int8      `description:"是否分享,0:不分享,1:分享"`
 	PublishTime   time.Time `description:"发布时间"`
+	CoverContent  string    `description:"PPT内容-JSON"`
 }
 
 type PptEnglishItem struct {
@@ -44,6 +45,7 @@ type PptEnglishItem struct {
 	ReportCode    string    `description:"关联的报告code"`
 	IsShare       int8      `description:"是否分享,0:不分享,1:分享"`
 	PublishTime   time.Time `description:"发布时间"`
+	CoverContent  string    `description:"PPT内容-JSON"`
 }
 
 func GetPptEnglishList(condition string, pars []interface{}, startSize, pageSize int) (items []*PptEnglishItem, err error) {
@@ -112,8 +114,9 @@ type AddPptEnglishReq struct {
 		BackIndex    int    `description:"背景图片下标"`
 		TemplateType int    `description:"模版id"`
 	} `description:"首页"`
-	Content string `description:"ppt的json数据"`
-	GroupId int64  `description:"目录id"`
+	Content      string `description:"ppt的json数据"`
+	GroupId      int64  `description:"目录id"`
+	CoverContent string `description:"PPT内容-JSON"`
 }
 
 type AddPptEnglishResp struct {
@@ -249,6 +252,7 @@ type PptEnglishSaveLog struct {
 	AdminId       int       `description:"系统用户id"`
 	AdminRealName string    `description:"系统用户名称"`
 	CreateTime    time.Time `description:"创建时间"`
+	CoverContent  string    `description:"PPT内容-JSON"`
 }
 
 // AddPptEnglishSaveLog 新增PPT日志

+ 6 - 2
models/ppt_v2.go

@@ -27,6 +27,7 @@ type PptV2 struct {
 	ReportCode    string    `description:"关联的报告code"`
 	IsShare       int8      `description:"是否分享,0:不分享,1:分享"`
 	PublishTime   time.Time `description:"发布时间"`
+	CoverContent  string    `description:"PPT内容-JSON"`
 }
 
 type PptV2Item struct {
@@ -49,6 +50,7 @@ type PptV2Item struct {
 	ReportCode    string    `description:"关联的报告code"`
 	IsShare       int8      `description:"是否分享,0:不分享,1:分享"`
 	PublishTime   time.Time `description:"发布时间"`
+	CoverContent  string    `description:"PPT内容-JSON"`
 }
 
 func GetPptV2List(condition string, pars []interface{}, startSize, pageSize int) (items []*PptV2Item, err error) {
@@ -117,8 +119,9 @@ type AddPptV2Req struct {
 		BackIndex    int    `description:"背景图片下标"`
 		TemplateType int    `description:"模版id"`
 	} `description:"首页"`
-	Content string `description:"ppt的json数据"`
-	GroupId int64  `description:"目录id"`
+	Content      string `description:"ppt的json数据"`
+	GroupId      int64  `description:"目录id"`
+	CoverContent string `description:"封面图内容-JSON数据"`
 }
 
 type AddPptResp struct {
@@ -200,6 +203,7 @@ type PptV2SaveLog struct {
 	AdminId       int       `description:"系统用户id"`
 	AdminRealName string    `description:"系统用户名称"`
 	CreateTime    time.Time `description:"创建时间"`
+	CoverContent  string    `description:"PPT内容-JSON"`
 }
 
 // AddPptV2SaveLog 新增PPT日志

+ 4 - 3
models/roadshow/calendar.go

@@ -33,9 +33,10 @@ func GetResearcherGroup() (list []*ResearcherGroup, err error) {
 
 func GetResearcher() (list []*Researcher, err error) {
 	o := orm.NewOrm()
-	sql := ` SELECT * FROM admin AS a
-			WHERE a.role_type_code IN('researcher','rai_researcher','ficc_researcher','ficc_admin')
-			AND a.enabled=1 AND a.real_name<>'于菲' `
+	//sql := ` SELECT * FROM admin AS a
+	//		WHERE a.role_type_code IN('researcher','rai_researcher','ficc_researcher','ficc_admin')
+	//		AND a.enabled=1 AND a.real_name<>'于菲' `
+	sql := ` SELECT * FROM admin AS a WHERE a.enabled=1 `
 	_, err = o.Raw(sql).QueryRows(&list)
 	return
 }

+ 57 - 3
routers/commentsRouter.go

@@ -2999,7 +2999,7 @@ func init() {
         beego.ControllerComments{
             Method: "SmmExistCheck",
             Router: `/edb_info/smm/exist/check`,
-            AllowHTTPMethods: []string{"get"},
+            AllowHTTPMethods: []string{"post"},
             MethodParams: param.Make(),
             Filters: nil,
             Params: nil})
@@ -3008,7 +3008,7 @@ func init() {
         beego.ControllerComments{
             Method: "EdbInfoSmmSearch",
             Router: `/edb_info/smm/search`,
-            AllowHTTPMethods: []string{"get"},
+            AllowHTTPMethods: []string{"post"},
             MethodParams: param.Make(),
             Filters: nil,
             Params: nil})
@@ -3193,6 +3193,51 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "FenweiClassify",
+            Router: `/fenwei/classify`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "ExportFenweiList",
+            Router: `/fenwei/export`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "FenweiIndexData",
+            Router: `/fenwei/index/data`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "FenweiSearchList",
+            Router: `/fenwei/search_list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "FenweiSingleData",
+            Router: `/fenwei/single_data`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
         beego.ControllerComments{
             Method: "GlClassify",
@@ -3467,7 +3512,7 @@ func init() {
         beego.ControllerComments{
             Method: "SmmApiList",
             Router: `/smm/api/list`,
-            AllowHTTPMethods: []string{"get"},
+            AllowHTTPMethods: []string{"post"},
             MethodParams: param.Make(),
             Filters: nil,
             Params: nil})
@@ -4246,6 +4291,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"],
+        beego.ControllerComments{
+            Method: "EdbUpdateFailedDetailList",
+            Router: `/edb_update_stat/failed/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"],
         beego.ControllerComments{
             Method: "Column",

+ 1 - 1
services/data/chart_theme.go

@@ -159,7 +159,7 @@ func getThemePreviewEdbDataMapList(chartType int, calendar, startDate, endDate s
 		item.ChartInfoId = v.ChartInfoId
 		item.ChartStyle = v.ChartStyle
 		item.ChartColor = v.ChartColor
-		item.ChartWidth = 1
+		item.ChartWidth = 0
 		item.IsOrder = false
 		item.MaxData = v.MaxValue
 		item.MinData = v.MinValue

+ 11 - 1
services/data/correlation/chart_info.go

@@ -806,6 +806,11 @@ func AddChartInfo(req data_manage.AddChartInfoReq, source int, sysUser *system.A
 	chartInfo.RightMax = req.RightMax
 	chartInfo.Disabled = disableVal
 	chartInfo.Source = source
+	chartInfo.ChartThemeId = req.ChartThemeId
+	chartInfo.SourcesFrom = req.SourcesFrom
+	chartInfo.Instructions = req.Instructions
+	chartInfo.MarkersLines = req.MarkersLines
+	chartInfo.MarkersAreas = req.MarkersAreas
 
 	// 指标信息
 	mapList := make([]*data_manage.ChartEdbMapping, 0)
@@ -1140,7 +1145,7 @@ func EditChartInfo(req data_manage.EditChartInfoReq, sysUser *system.Admin) (cha
 }
 
 // CopyChartInfo 复制图表
-func CopyChartInfo(configId, classifyId int, chartName string, correlationChartInfoReq data_manage.CorrelationChartInfoReq, sysUser *system.Admin) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
+func CopyChartInfo(configId, classifyId int, chartName string, correlationChartInfoReq data_manage.CorrelationChartInfoReq, oldChartInfo *data_manage.ChartInfo, sysUser *system.Admin) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
 	configSource := 2
 	isSendEmail = true
 	// 获取相关性图的配置
@@ -1165,6 +1170,11 @@ func CopyChartInfo(configId, classifyId int, chartName string, correlationChartI
 		ChartType:            utils.CHART_TYPE_CURVE,
 		Calendar:             "公历",
 		CorrelationChartInfo: correlationChartInfoReq,
+		ChartThemeId:         oldChartInfo.ChartThemeId,
+		SourcesFrom:          oldChartInfo.SourcesFrom,
+		Instructions:         oldChartInfo.Instructions,
+		MarkersLines:         oldChartInfo.MarkersLines,
+		MarkersAreas:         oldChartInfo.MarkersAreas,
 	}
 	chartSource := utils.CHART_SOURCE_CORRELATION // 默认是相关性图
 	chartInfo, err, errMsg, isSendEmail = AddChartInfo(addChartReq, chartSource, sysUser)

+ 13 - 0
services/data/cross_variety/chart.go

@@ -352,6 +352,13 @@ func GetChartData(chartInfoId int, config request.ChartConfigReq) (edbList []*da
 		})
 	}
 
+	// 处理颜色
+	colorMap := utils.GetColorMap()
+	for k, _ := range dataList {
+		if c, ok1 := colorMap[k]; ok1 {
+			dataList[k].Color = c
+		}
+	}
 	dataResp = ChartInfoResp{
 		XName:       xTagInfo.ChartTagName + "百分位",
 		XNameEn:     xTagInfo.ChartTagNameEn,
@@ -608,6 +615,12 @@ func AddChartInfo(req request.AddChartReq, sysUser *system.Admin) (chartInfo *da
 	//chartInfo.Disabled = disableVal
 	chartInfo.Source = source
 	chartInfo.ExtraConfig = string(extraConfigByte)
+	chartInfo.ChartImage = req.ChartImage
+	chartInfo.ChartThemeId = req.ChartThemeId
+	chartInfo.SourcesFrom = req.SourcesFrom
+	chartInfo.Instructions = req.Instructions
+	chartInfo.MarkersLines = req.MarkersLines
+	chartInfo.MarkersAreas = req.MarkersAreas
 
 	// 图表品种
 	chartVarietyMappingList := make([]*cross_varietyModel.ChartVarietyMapping, 0)

+ 139 - 3
services/data/edb_info.go

@@ -2299,7 +2299,7 @@ func EdbInfoAdd(source, subSource, classifyId int, edbCode, edbName, frequency,
 		utils.DATA_SOURCE_LT:                  "路透",
 		utils.DATA_SOURCE_COAL:                "中国煤炭网",
 		utils.DATA_SOURCE_GOOGLE_TRAVEL:       "our world in data",
-		utils.DATA_SOURCE_MYSTEEL_CHEMICAL:    "钢联化工",
+		utils.DATA_SOURCE_MYSTEEL_CHEMICAL:    "钢联",
 		utils.DATA_SOURCE_EIA_STEO:            "EIA STEO报告",
 		utils.DATA_SOURCE_COM_TRADE:           "UN",
 		utils.DATA_SOURCE_SCI:                 "SCI",
@@ -2922,7 +2922,7 @@ func GetBaseIndexTableName(source int) (tableName string) {
 	return
 }
 
-// EdbInfoAdd 添加指标到指标库
+// EdbInfoWsdAdd 添加指标到指标库
 func EdbInfoWsdAdd(item *data_manage.EdbInfo) (edbInfo *data_manage.EdbInfo, err error, errMsg string, isSendEmail bool) {
 	isSendEmail = true
 	//判断指标名称是否存在
@@ -2968,7 +2968,7 @@ func EdbInfoWsdAdd(item *data_manage.EdbInfo) (edbInfo *data_manage.EdbInfo, err
 		utils.DATA_SOURCE_LT:                  "路透",
 		utils.DATA_SOURCE_COAL:                "中国煤炭网",
 		utils.DATA_SOURCE_GOOGLE_TRAVEL:       "our world in data",
-		utils.DATA_SOURCE_MYSTEEL_CHEMICAL:    "钢联化工",
+		utils.DATA_SOURCE_MYSTEEL_CHEMICAL:    "钢联",
 		utils.DATA_SOURCE_EIA_STEO:            "EIA STEO报告",
 		utils.DATA_SOURCE_COM_TRADE:           "UN",
 		utils.DATA_SOURCE_SCI:                 "SCI",
@@ -3114,3 +3114,139 @@ func BatchRefreshEdbByEdbIds(edbIdList []int, redisKey string, refreshKeys []str
 	}
 	return
 }
+
+// EdbInfoSmmApiAdd 添加指标到指标库
+func EdbInfoSmmApiAdd(item *data_manage.EdbInfo) (edbInfo *data_manage.EdbInfo, err error, errMsg string, isSendEmail bool) {
+	isSendEmail = true
+	//判断指标名称是否存在
+	var condition string
+	var pars []interface{}
+
+	condition += " AND edb_name=? "
+	pars = append(pars, item.EdbName)
+
+	count, err := data_manage.GetEdbInfoCountByCondition(condition, pars)
+	if err != nil {
+		errMsg = "判断指标名称是否存在失败"
+		err = errors.New("判断指标名称是否存在失败,Err:" + err.Error())
+		return
+	}
+
+	if count > 0 {
+		errMsg = "指标名称已存在,请重新填写"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+
+	source := item.Source
+
+	edbInfo = new(data_manage.EdbInfo)
+	edbInfo.Source = source
+	sourceNameMap := map[int]string{
+		utils.DATA_SOURCE_THS:                 "同花顺",
+		utils.DATA_SOURCE_WIND:                "wind",
+		utils.DATA_SOURCE_PB:                  "彭博",
+		utils.DATA_SOURCE_PB_FINANCE:          "彭博财务",
+		utils.DATA_SOURCE_MANUAL:              "手工数据",
+		utils.DATA_SOURCE_LZ:                  "隆众",
+		utils.DATA_SOURCE_YS:                  "SMM",
+		utils.DATA_SOURCE_GL:                  "钢联",
+		utils.DATA_SOURCE_ZZ:                  "郑商所",
+		utils.DATA_SOURCE_DL:                  "大商所",
+		utils.DATA_SOURCE_SH:                  "上期所",
+		utils.DATA_SOURCE_CFFEX:               "中金所",
+		utils.DATA_SOURCE_SHFE:                "上期能源",
+		utils.DATA_SOURCE_GIE:                 "欧洲天然气",
+		utils.DATA_SOURCE_LT:                  "路透",
+		utils.DATA_SOURCE_COAL:                "中国煤炭网",
+		utils.DATA_SOURCE_GOOGLE_TRAVEL:       "our world in data",
+		utils.DATA_SOURCE_MYSTEEL_CHEMICAL:    "钢联",
+		utils.DATA_SOURCE_EIA_STEO:            "EIA STEO报告",
+		utils.DATA_SOURCE_COM_TRADE:           "UN",
+		utils.DATA_SOURCE_SCI:                 "SCI",
+		utils.DATA_SOURCE_BAIINFO:             "BAIINFO",
+		utils.DATA_SOURCE_STOCK_PLANT:         "存量装置",
+		utils.DATA_SOURCE_NATIONAL_STATISTICS: "国家统计局",
+		utils.DATA_SOURCE_FUBAO:               "富宝数据",
+	}
+
+	sourceName, ok := sourceNameMap[source]
+	if !ok {
+		edbSource := data_manage.EdbSourceIdMap[source]
+		if edbSource != nil {
+			sourceName = edbSource.SourceName
+		}
+		if sourceName == "" {
+			errMsg = "指标来源异常"
+			err = errors.New(errMsg)
+			return
+		}
+	}
+	edbInfo.SourceName = sourceName
+
+	edbType := 1 //基础指标
+	if source == utils.DATA_SOURCE_STOCK_PLANT {
+		edbType = 2 //计算指标
+	}
+	//从缓存中获取
+	serverUrl := ``
+	if edbInfo.Source == utils.DATA_SOURCE_WIND {
+		windCacheKey := utils.CACHE_WIND_URL + ":" + item.EdbCode
+		serverUrl, _ = utils.Rc.RedisString(windCacheKey)
+		if serverUrl == `` {
+			if len(utils.Hz_Data_WIND_Url_List) >= 1 {
+				serverUrl = utils.Hz_Data_WIND_Url_List[len(utils.Hz_Data_WIND_Url_List)-1] //默认是最后一个服务器地址
+			}
+		}
+	}
+	//获取该层级下最大的排序数
+	maxSort, err := GetEdbClassifyMaxSort(item.ClassifyId, 0)
+	if err != nil {
+		errMsg = "获取失败"
+		err = errors.New("查询排序信息失败,Err:" + err.Error())
+		return
+	}
+
+	edbInfo.EdbCode = item.EdbCode
+	edbInfo.EdbName = item.EdbName
+	edbInfo.EdbNameSource = item.EdbName
+	edbInfo.Frequency = item.Frequency
+	edbInfo.Unit = item.Unit
+	edbInfo.ClassifyId = item.ClassifyId
+	edbInfo.SysUserId = item.SysUserId
+	edbInfo.SysUserRealName = item.SysUserRealName
+	edbInfo.CreateTime = time.Now()
+	edbInfo.ModifyTime = time.Now()
+	edbInfo.ServerUrl = serverUrl
+	edbInfo.Sort = maxSort + 1
+	edbInfo.DataDateType = `交易日`
+	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+	edbInfo.UniqueCode = utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
+	edbInfo.EdbType = edbType
+	edbInfo.SubSource = item.SubSource
+	edbInfo.SubSourceName = ""
+	edbInfo.IndicatorCode = item.IndicatorCode
+	edbInfo.StockCode = item.StockCode
+	edbInfoId, err := data_manage.AddEdbInfo(edbInfo)
+	if err != nil {
+		errMsg = "保存失败"
+		err = errors.New("保存失败,Err:" + err.Error())
+		return
+	}
+	edbInfo.EdbInfoId = int(edbInfoId)
+	//保存数据
+	err = data_manage.ModifyEdbInfoWindWsdDataStatus(source, item.SubSource, edbInfoId, item.EdbCode)
+	if err != nil {
+		errMsg = "保存失败"
+		err = errors.New("修改数据对应指标ID失败,Err:" + err.Error())
+		return
+	}
+	maxAndMinItem, _ := data_manage.GetEdbInfoWsdMaxAndMinInfo(source, item.SubSource, item.EdbCode)
+	if maxAndMinItem != nil {
+		err = data_manage.ModifyEdbInfoMaxAndMinInfo(int(edbInfoId), maxAndMinItem)
+	}
+	//添加es
+	AddOrEditEdbInfoToEs(int(edbInfoId))
+	return
+}

+ 6 - 2
services/data/excel/mixed_table.go

@@ -147,8 +147,12 @@ func GetMixedTableCellData(mixedTableReq request.MixedTableReq) (newMixedTableCe
 		for i, cell := range row {
 			switch cell.DataType {
 			case request.EdbDT: // 指标类型
-				if edbInfo, ok := edbInfoMap[cell.EdbInfoId]; ok {
-					cell.ShowValue = edbInfo.EdbName
+				if cell.Value == `` {
+					if edbInfo, ok := edbInfoMap[cell.EdbInfoId]; ok {
+						cell.ShowValue = edbInfo.EdbName
+					}
+				} else {
+					cell.ShowValue = cell.Value
 				}
 			case request.InsertDataDT, request.PopInsertDataDT: // 数据类型
 				// 数值先清空

+ 5 - 0
services/data/line_equation/chart_info.go

@@ -493,6 +493,11 @@ func BatchAddChartInfo(batchAddChartReq []request.AddChart, lineChartInfoConfig
 			BarConfig:       "",
 			Source:          source,
 			ExtraConfig:     string(tmpLineChartInfoConfigByte),
+			ChartThemeId:    v.ChartThemeId,
+			SourcesFrom:     v.SourcesFrom,
+			Instructions:    v.Instructions,
+			MarkersLines:    v.MarkersLines,
+			MarkersAreas:    v.MarkersAreas,
 		}
 
 		// 指标信息

+ 5 - 0
services/data/line_feature/chart_info.go

@@ -606,6 +606,11 @@ func CopyChartInfo(configId, configSource, classifyId int, chartName string, edb
 		Calendar:        "公历",
 		ExtraConfig:     oldChartInfo.ExtraConfig,
 		ChartImage:      oldChartInfo.ChartImage,
+		ChartThemeId:    oldChartInfo.ChartThemeId,
+		SourcesFrom:     oldChartInfo.SourcesFrom,
+		Instructions:    oldChartInfo.Instructions,
+		MarkersLines:    oldChartInfo.MarkersLines,
+		MarkersAreas:    oldChartInfo.MarkersAreas,
 	}
 	chartSource := oldChartInfo.Source // 默认是相关性图
 	chartInfo, err, errMsg, isSendEmail = AddChartInfo(addChartReq, edbInfoMapping, chartSource, sysUser)

+ 29 - 7
services/data/predict_edb_info.go

@@ -1127,29 +1127,51 @@ func GetPredictCalculateDataListByPredictEdbInfo(edbInfo *data_manage.EdbInfo, s
 }
 
 // ModifyPredictEdbBaseInfoBySourceEdb  根据来源ETA指标修改预测指标的基础信息
-func ModifyPredictEdbBaseInfoBySourceEdb(sourceEDdbInfo *data_manage.EdbInfo) {
+func ModifyPredictEdbBaseInfoBySourceEdb(sourceEDdbInfo *data_manage.EdbInfo, frequency, unit string) {
 	list, err := data_manage.GetGroupPredictEdbBySourceEdbInfoId(sourceEDdbInfo.EdbInfoId)
 	if err != nil {
 		return
 	}
 	for _, v := range list {
-		v.Frequency = sourceEDdbInfo.Frequency
-		v.Unit = sourceEDdbInfo.Unit
+		v.Frequency = frequency
+		v.Unit = unit
 		v.Update([]string{"Frequency", "Unit"})
 		AddOrEditEdbInfoToEs(v.EdbInfoId)
 	}
 }
 
 // ModifyPredictEdbEnBaseInfoBySourceEdb  根据来源ETA指标修改预测指标的英文基础信息
-func ModifyPredictEdbEnBaseInfoBySourceEdb(sourceEDdbInfo *data_manage.EdbInfo) {
+func ModifyPredictEdbEnBaseInfoBySourceEdb(sourceEDdbInfo *data_manage.EdbInfo, unitEn string) {
 	list, err := data_manage.GetGroupPredictEdbBySourceEdbInfoId(sourceEDdbInfo.EdbInfoId)
 	if err != nil {
 		return
 	}
 	for _, v := range list {
-		v.Frequency = sourceEDdbInfo.Frequency
-		v.UnitEn = sourceEDdbInfo.UnitEn
-		v.Update([]string{"Frequency", "UnitEn"})
+		v.UnitEn = unitEn
+		v.Update([]string{"UnitEn"})
 		AddOrEditEdbInfoToEs(v.EdbInfoId)
 	}
 }
+
+// ModifyPredictEdbUnitBySourceEdbInfoId
+// @Description: 根据来源ETA指标修改预测指标的频度和单位基础信息
+// @author: Roc
+// @datetime 2024-01-05 11:07:39
+// @param sourceEdbInfoId int
+// @param frequency string
+// @param unit string
+// @return err error
+func ModifyPredictEdbUnitBySourceEdbInfoId(sourceEdbInfoId int, frequency, unit string) (err error) {
+	list, err := data_manage.GetGroupPredictEdbBySourceEdbInfoId(sourceEdbInfoId)
+	if err != nil {
+		return
+	}
+
+	for _, v := range list {
+		v.Frequency = frequency
+		v.Unit = unit
+		v.Update([]string{"Frequency", "Unit"})
+		AddOrEditEdbInfoToEs(v.EdbInfoId)
+	}
+	return
+}

+ 2 - 1
services/data_stat/edb_info_stat.go

@@ -9,7 +9,7 @@ import (
 )
 
 // AddEdbInfoUpdateLog 添加指标编辑/刷新日志
-func AddEdbInfoUpdateLog(edbInfoId int, updateResult int, updateFailedReason string, sysUser *system.Admin) (err error) {
+func AddEdbInfoUpdateLog(edbInfoId int, updateResult int, updateFailedReason string, sysUser *system.Admin, updateType int) (err error) {
 	var edbInfo *data_manage.EdbInfo
 	if edbInfoId > 0 {
 		// 获取指标详情
@@ -45,6 +45,7 @@ func AddEdbInfoUpdateLog(edbInfoId int, updateResult int, updateFailedReason str
 		log.UpdateFailedReason = updateFailedReason
 		log.DataUpdateTime = edbInfo.DataUpdateTime
 		log.ErDataUpdateDate = edbInfo.ErDataUpdateDate
+		log.UpdateType = updateType
 		_, err = data_stat.AddEdbUpdateLog(log)
 		if err != nil {
 			err = fmt.Errorf("新增指标更新日志失败,Err: %s", err)

+ 4 - 3
services/english_report.go

@@ -787,7 +787,8 @@ func MultiEnglishPolicyReportSync() (err error, errMsg string) {
 	//查询发布时间是当天的所有未同步的报告,并更新到英文研报
 	condition := ""
 	var pars []interface{}
-	startDate := time.Now().Format(utils.FormatDate)
+	//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)`
 	pars = append(pars, startDate)
 	policyReports, err := models.GetEnglishPolicyReportByCondition(condition, pars)
@@ -799,8 +800,8 @@ func MultiEnglishPolicyReportSync() (err error, errMsg string) {
 		return
 	}
 	//新增英文研报
-	classifyNameFirst := "Macro"
-	classifySecondName := "China A-share Daily Check-in"
+	classifyNameFirst := "Equity"
+	classifySecondName := "A-share Daily"
 
 	// 根据分类名称查询分类ID
 	classifyInfo, err := models.GetEnglishClassifyByClassifyNameAndParentName(classifyNameFirst, classifySecondName)

+ 1 - 1
services/excel_info.go

@@ -52,7 +52,7 @@ func UpdateExcelEditMark(excelInfoId, nowUserId, status int, nowUserName string)
 		if opUserId > 0 {
 			utils.Rc.Do("SETEX", key, int64(300), string(bt)) //3分钟缓存
 		} else {
-			utils.Rc.SetNX(key, string(bt), time.Second*60*5) //3分钟缓存
+			utils.Rc.SetNX(key, string(bt), time.Second*60*3) //3分钟缓存
 		}
 	} else if status == 0 {
 		//清除编辑缓存

+ 2 - 0
services/ppt/ppt_english_group.go

@@ -209,6 +209,7 @@ func CopyEnglishGroup(groupId int64, adminId int, adminRealName string) (err err
 			ReportType:    v.ReportType,
 			PptDate:       v.PptDate,
 			Content:       v.Content,
+			CoverContent:  v.CoverContent,
 			CreateTime:    time.Now(),
 			ModifyTime:    time.Now(),
 			AdminId:       adminId,
@@ -734,6 +735,7 @@ func CopyPptEnglish(pptId int, groupId int64, adminId int, adminRealName string)
 		ReportType:    pptInfo.ReportType,
 		PptDate:       pptInfo.PptDate,
 		Content:       pptInfo.Content,
+		CoverContent:  pptInfo.CoverContent,
 		CreateTime:    time.Now(),
 		ModifyTime:    time.Now(),
 		AdminId:       adminId,

+ 2 - 0
services/ppt/ppt_group.go

@@ -376,6 +376,7 @@ func CopyGroup(groupId int64, adminId int, adminRealName string) (err error) {
 			ReportType:    v.ReportType,
 			PptDate:       v.PptDate,
 			Content:       v.Content,
+			CoverContent:  v.CoverContent,
 			PptUrl:        v.PptUrl,
 			PptxUrl:       v.PptxUrl,
 			CreateTime:    time.Now(),
@@ -926,6 +927,7 @@ func CopyPpt(pptId int, groupId int64, adminId int, adminRealName string) (resp
 		ReportType:    pptInfo.ReportType,
 		PptDate:       pptInfo.PptDate,
 		Content:       pptInfo.Content,
+		CoverContent:  pptInfo.CoverContent,
 		PptUrl:        pptInfo.PptUrl,
 		PptxUrl:       pptInfo.PptxUrl,
 		CreateTime:    time.Now(),

+ 15 - 1
utils/common.go

@@ -2255,4 +2255,18 @@ func ArrContainsStr(arr []string, str string) bool {
 		}
 	}
 	return false
-}
+}
+
+func GetColorMap() map[int]string {
+	colorMap := make(map[int]string)
+	colors := []string{"#0000FF", "#FF0000", "#999999", "#000000", "#7CB5EC", "#90ED7D", "#F7A35C", "#8085E9",
+		"#F15C80", "#E4D354", "#2B908F", "#F45B5B", "#91E8E1", "#FDA8C7", "#8A4294",
+		"#578B5A", "#0033FF", "#849EC1", "#FFDF0C", "#005496", "#00F0FF", "#4D535B",
+		"#4F4C34", "#804141", "#86BABD", "#8AA3FF", "#960000", "#A173DB", "#A39340",
+		"#CE814A", "#D1D2E6", "#EAB7B7", "#FF2E7A", "#FF4AF8", "#FF785B", "#FF9696", "#FFA800", "#FFBC97", "#FFDFDF"}
+	for k, v := range colors {
+		colorMap[k] = v
+	}
+
+	return colorMap
+}