Forráskód Böngészése

Merge branch 'dev/1.6'

hsun 1 éve
szülő
commit
797acd04b5

+ 2 - 2
controllers/data_manage/chart_classify.go

@@ -103,7 +103,7 @@ func (this *ChartClassifyController) ChartClassifyListV2() {
 		return
 	}
 
-	allChartInfo, err := data_manage.GetChartInfoAll(utils.CHART_SOURCE_DEFAULT)
+	allChartInfo, err := data_manage.GetChartInfoAll([]int{utils.CHART_SOURCE_DEFAULT})
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
@@ -174,7 +174,7 @@ func getChartClassifyListForMe(adminInfo system.Admin, resp *data_manage.ChartCl
 		return
 	}
 
-	allChartInfo, err := data_manage.GetChartInfoByAdminId(utils.CHART_SOURCE_DEFAULT, adminInfo.AdminId)
+	allChartInfo, err := data_manage.GetChartInfoByAdminId([]int{utils.CHART_SOURCE_DEFAULT}, adminInfo.AdminId)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		errMsg = "获取失败"
 		return

+ 3 - 3
controllers/data_manage/chart_info.go

@@ -539,13 +539,13 @@ func (this *ChartInfoController) ChartInfoMove() {
 			if prevChartInfo.Sort == nextChartInfo.Sort || prevChartInfo.Sort == chartInfo.Sort {
 				//变更兄弟节点的排序
 				updateSortStr := `sort + 2`
-				_ = data_manage.UpdateChartInfoSortByClassifyId(prevChartInfo.ChartClassifyId, prevChartInfo.Sort, prevChartInfo.ChartInfoId, chartInfo.Source, updateSortStr)
+				_ = data_manage.UpdateChartInfoSortByClassifyId(prevChartInfo.ChartClassifyId, prevChartInfo.Sort, prevChartInfo.ChartInfoId, []int{chartInfo.Source}, updateSortStr)
 			} else {
 				//如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
 				if nextChartInfo.Sort-prevChartInfo.Sort == 1 {
 					//变更兄弟节点的排序
 					updateSortStr := `sort + 1`
-					_ = data_manage.UpdateChartInfoSortByClassifyId(prevChartInfo.ChartClassifyId, prevChartInfo.Sort, prevChartInfo.ChartInfoId, chartInfo.Source, updateSortStr)
+					_ = data_manage.UpdateChartInfoSortByClassifyId(prevChartInfo.ChartClassifyId, prevChartInfo.Sort, prevChartInfo.ChartInfoId, []int{chartInfo.Source}, updateSortStr)
 				}
 			}
 		}
@@ -565,7 +565,7 @@ func (this *ChartInfoController) ChartInfoMove() {
 		//如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
 		if firstClassify != nil && firstClassify.Sort == 0 {
 			updateSortStr := ` sort + 1 `
-			_ = data_manage.UpdateChartInfoSortByClassifyId(firstClassify.ChartClassifyId, 0, firstClassify.ChartInfoId-1, chartInfo.Source, updateSortStr)
+			_ = data_manage.UpdateChartInfoSortByClassifyId(firstClassify.ChartClassifyId, 0, firstClassify.ChartInfoId-1, []int{chartInfo.Source}, updateSortStr)
 		}
 
 		chartInfo.Sort = 0 //那就是排在第一位

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

@@ -69,7 +69,7 @@ func (this *CorrelationChartClassifyController) ChartClassifyList() {
 		return
 	}
 
-	allChartInfo, err := data_manage.GetChartInfoAll(source)
+	allChartInfo, err := data_manage.GetChartInfoAll([]int{source})
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()

+ 173 - 26
controllers/data_manage/correlation/correlation_chart_info.go

@@ -7,6 +7,7 @@ import (
 	"hongze/hongze_ETA_mobile_api/controllers"
 	"hongze/hongze_ETA_mobile_api/models"
 	"hongze/hongze_ETA_mobile_api/models/data_manage"
+	"hongze/hongze_ETA_mobile_api/models/data_manage/future_good/request"
 	"hongze/hongze_ETA_mobile_api/models/system"
 	"hongze/hongze_ETA_mobile_api/services/data"
 	correlationServ "hongze/hongze_ETA_mobile_api/services/data/correlation"
@@ -110,32 +111,8 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 			return
 		}
 	case utils.CHART_SOURCE_ROLLING_CORRELATION: // 滚动相关性图
-		multipleGraphConfigChartMapping, e := data_manage.GetMultipleGraphConfigChartMappingByChartId(chartInfo.ChartInfoId)
-		if e != nil {
-			msg = "获取失败"
-			errMsg = "获取滚动相关性图表的配置信息失败, Err:" + e.Error()
-			return
-		}
-		baseChartMultipleGraphConfigChartMapping, e := data_manage.GetMultipleGraphConfigChartMappingByIdAndSource(multipleGraphConfigChartMapping.MultipleGraphConfigId, 2)
-		if e != nil {
-			msg = "获取失败"
-			errMsg = "获取相关性图表的配置信息失败, Err:" + e.Error()
-			return
-		}
-		baseChartCorrelationChart := new(data_manage.ChartInfoCorrelation)
-		if e := baseChartCorrelationChart.GetItemById(baseChartMultipleGraphConfigChartMapping.ChartInfoId); e != nil {
-			msg = "获取失败"
-			errMsg = "获取基础相关性图表信息失败, Err:" + e.Error()
-			return
-		}
-		moveUnitDays, ok := utils.FrequencyDaysMap[baseChartCorrelationChart.CalculateUnit]
-		if !ok {
-			msg = "错误的分析周期"
-			errMsg = "错误的分析周期"
-			return
-		}
-		startDate := time.Now().AddDate(0, 0, -baseChartCorrelationChart.CalculateValue*moveUnitDays).Format(utils.FormatDate)
-		endDate := time.Now().Format(utils.FormatDate)
+		startDate, endDate := utils.GetDateByDateType(correlationChart.DateType, correlationChart.StartDate.Format(utils.FormatDate), correlationChart.EndDate.Format(utils.FormatDate))
+
 		xDateTimeValue, yDataList, e = correlationServ.GetRollingCorrelationChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB, correlationChart.LeadValue, correlationChart.LeadUnit, correlationChart.CalculateValue, correlationChart.CalculateUnit, startDate, endDate)
 		dataResp = data_manage.RollingCorrelationChartDataResp{
 			XDateTimeValue: xDateTimeValue,
@@ -396,6 +373,70 @@ func (this *CorrelationChartInfoController) List() {
 	br.Data = resp
 }
 
+// Refresh
+// @Title 图表刷新接口
+// @Description 图表刷新接口
+// @Param   ChartInfoId   query   int  true       "图表id"
+// @Param   UniqueCode   query   string  true       "唯一code"
+// @Success Ret=200 刷新成功
+// @router /chart_info/refresh [get]
+func (this *CorrelationChartInfoController) Refresh() {
+	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
+	}
+	chartInfoId, _ := this.GetInt("ChartInfoId")
+	uniqueCode := this.GetString("UniqueCode")
+	if chartInfoId <= 0 && uniqueCode == `` {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误:chartInfoId:" + strconv.Itoa(chartInfoId) + ",UniqueCode:" + uniqueCode
+		return
+	}
+
+	var chartInfo *data_manage.ChartInfo
+	var err error
+	if chartInfoId > 0 {
+		chartInfo, err = data_manage.GetChartInfoById(chartInfoId)
+	} else {
+		chartInfo, err = data_manage.GetChartInfoByUniqueCode(uniqueCode)
+	}
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "图表已被删除,无需刷新"
+			br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
+			return
+		}
+		br.Msg = "刷新失败"
+		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+		return
+	}
+
+	// 刷新相关性图表
+	if e := correlationServ.ChartInfoRefresh(chartInfo.ChartInfoId); e != nil {
+		br.Msg = "刷新失败"
+		br.ErrMsg = "刷新相关性图表失败, Err:" + err.Error()
+		return
+	}
+
+	//清除图表缓存
+	{
+		key := utils.HZ_CHART_LIB_DETAIL + chartInfo.UniqueCode
+		_ = utils.Rc.Delete(key)
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "刷新成功"
+}
+
 // Copy
 // @Title 复制并新增图表接口
 // @Description 新增图表接口
@@ -525,6 +566,112 @@ func (this *CorrelationChartInfoController) Copy() {
 	br.IsAddLog = true
 }
 
+// EnInfoEdit
+// @Title 编辑图表英文信息接口
+// @Description 编辑图表英文信息接口
+// @Param	request	body data_manage.EditChartEnInfoReq true "type json string"
+// @Success Ret=200 编辑成功
+// @router /chart_info/en/edit [post]
+func (this *CorrelationChartInfoController) EnInfoEdit() {
+	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
+	}
+	var req request.EditChartEnInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	req.ChartNameEn = strings.Trim(req.ChartNameEn, " ")
+	if req.ChartInfoId <= 0 {
+		br.Msg = "请选择图表"
+		return
+	}
+	if req.ChartNameEn == "" {
+		br.Msg = "请输入英文图表名称"
+		return
+	}
+
+	chartItem, _, tips, e := correlationServ.GetChartAndCorrelationInfo(req.ChartInfoId)
+	if e != nil {
+		if tips != "" {
+			br.Msg = tips
+			return
+		}
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取图表信息失败, Err: " + e.Error()
+		return
+	}
+
+	var condition string
+	var pars []interface{}
+	condition += " AND chart_info_id <> ?  AND chart_name_en = ? AND source = ?"
+	pars = append(pars, req.ChartInfoId, req.ChartNameEn, utils.CHART_SOURCE_CORRELATION)
+	existItem, err := data_manage.GetChartInfoByCondition(condition, pars)
+	if err != nil {
+		if err.Error() != utils.ErrNoRow() {
+			br.Msg = "判断英文图表名称是否存在失败"
+			br.ErrMsg = "判断英文图表名称是否存在失败,Err:" + err.Error()
+			return
+		}
+	}
+	if err == nil && existItem.ChartInfoId > 0 {
+		br.Msg = existItem.ChartName + ":" + req.ChartNameEn + "图表名称已存在"
+		return
+	}
+	chartItem.ChartNameEn = req.ChartNameEn
+	chartItem.ModifyTime = time.Now().Local()
+	if e := chartItem.Update([]string{"ChartNameEn", "ModifyTime"}); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "更新图表信息失败, Err: " + e.Error()
+		return
+	}
+
+	//添加es数据
+	go data.EsAddOrEditChartInfo(chartItem.ChartInfoId)
+	//修改my eta es数据
+	go data.EsAddOrEditMyChartInfoByChartInfoId(chartItem.ChartInfoId)
+
+	//指标 修改es信息
+	//go data.AddOrEditEdbInfoToEs(edbInfo.EdbInfoId)
+
+	//新增操作日志
+	{
+		chartLog := new(data_manage.ChartInfoLog)
+		chartLog.ChartName = chartItem.ChartName
+		chartLog.ChartInfoId = req.ChartInfoId
+		chartLog.ChartClassifyId = chartItem.ChartClassifyId
+		chartLog.SysUserId = sysUser.AdminId
+		chartLog.SysUserRealName = sysUser.RealName
+		chartLog.UniqueCode = chartItem.UniqueCode
+		chartLog.CreateTime = time.Now()
+		chartLog.Content = string(this.Ctx.Input.RequestBody)
+		chartLog.Status = "编辑相关性图表英文信息"
+		chartLog.Method = this.Ctx.Input.URL()
+		go data_manage.AddChartInfoLog(chartLog)
+	}
+	// 清除缓存
+	if utils.Re == nil && utils.Rc != nil {
+		_ = utils.Rc.Delete(utils.HZ_CHART_LIB_DETAIL + chartItem.UniqueCode) //图表分享链接缓存
+		_ = utils.Rc.Delete(data.GetChartInfoDataKey(req.ChartInfoId))
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "编辑成功"
+	br.IsAddLog = true
+}
+
 // SearchByEs
 // @Title 图表模糊搜索(从es获取)
 // @Description  图表模糊搜索(从es获取)

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

@@ -70,7 +70,7 @@ func (this *FutureGoodChartClassifyController) ChartClassifyList() {
 		return
 	}
 
-	allChartInfo, err := data_manage.GetChartInfoAll(utils.CHART_SOURCE_FUTURE_GOOD)
+	allChartInfo, err := data_manage.GetChartInfoAll([]int{utils.CHART_SOURCE_FUTURE_GOOD, utils.CHART_SOURCE_FUTURE_GOOD_PROFIT})
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
@@ -110,7 +110,7 @@ func getChartClassifyListForMe(adminInfo system.Admin, resp *data_manage.ChartCl
 		return
 	}
 
-	allChartInfo, err := data_manage.GetChartInfoByAdminId(utils.CHART_SOURCE_FUTURE_GOOD, adminInfo.AdminId)
+	allChartInfo, err := data_manage.GetChartInfoByAdminId([]int{utils.CHART_SOURCE_FUTURE_GOOD, utils.CHART_SOURCE_FUTURE_GOOD_PROFIT}, adminInfo.AdminId)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		errMsg = "获取失败"
 		return

+ 63 - 0
controllers/data_manage/future_good/future_good_chart_info.go

@@ -314,6 +314,69 @@ func (this *FutureGoodChartInfoController) ChartInfoSearchByEs() {
 	br.Data = resp
 }
 
+// ChartInfoRefresh
+// @Title 图表刷新接口
+// @Description 图表刷新接口
+// @Param   ChartInfoId   query   int  true       "图表id"
+// @Param   UniqueCode   query   string  true       "唯一code"
+// @Success Ret=200 刷新成功
+// @router /chart_info/refresh [get]
+func (this *FutureGoodChartInfoController) ChartInfoRefresh() {
+	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
+	}
+	chartInfoId, _ := this.GetInt("ChartInfoId")
+	uniqueCode := this.GetString("UniqueCode")
+	if chartInfoId <= 0 && uniqueCode == `` {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误:chartInfoId:" + strconv.Itoa(chartInfoId) + ",UniqueCode:" + uniqueCode
+		return
+	}
+
+	var chartInfo *data_manage.ChartInfo
+	var err error
+	if chartInfoId > 0 {
+		chartInfo, err = data_manage.GetChartInfoById(chartInfoId)
+	} else {
+		chartInfo, err = data_manage.GetChartInfoByUniqueCode(uniqueCode)
+	}
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "图表已被删除,无需刷新"
+			br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
+			return
+		}
+		br.Msg = "刷新失败"
+		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+		return
+	}
+	err = future_goodServ.FutureGoodChartInfoRefresh(chartInfo.ChartInfoId)
+	if err != nil {
+		br.Msg = "刷新失败"
+		br.ErrMsg = "刷新图表关联指标信息失败,Err:" + err.Error()
+		return
+	}
+
+	//清除图表缓存
+	{
+		key := utils.HZ_CHART_LIB_DETAIL + chartInfo.UniqueCode
+		_ = utils.Rc.Delete(key)
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "刷新成功"
+}
+
 // CopyChartInfo
 // @Title 复制并新增图表接口
 // @Description 新增图表接口

+ 167 - 0
controllers/data_manage/line_equation/line_chart_classify.go

@@ -0,0 +1,167 @@
+package line_equation
+
+import (
+	"hongze/hongze_ETA_mobile_api/controllers"
+	"hongze/hongze_ETA_mobile_api/models"
+	"hongze/hongze_ETA_mobile_api/models/data_manage"
+	"hongze/hongze_ETA_mobile_api/models/system"
+	"hongze/hongze_ETA_mobile_api/utils"
+)
+
+// LineEquationChartClassifyController 拟合方程图表分类
+type LineEquationChartClassifyController struct {
+	controllers.BaseAuthController
+}
+
+// ChartClassifyList
+// @Title 拟合方程图表分类列表
+// @Description 拟合方程图表分类列表接口
+// @Param   IsShowMe   query   bool  true       "是否只看我的,true、false"
+// @Param   Source   query   int  true       "图表类型,3:拟合方程,4:滚动拟合方程"
+// @Success 200 {object} data_manage.ChartClassifyListResp
+// @router /chart_classify/list [get]
+func (this *LineEquationChartClassifyController) ChartClassifyList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	resp := new(data_manage.ChartClassifyListResp)
+
+	// 获取当前账号的不可见指标
+	noPermissionChartIdMap := make(map[int]bool)
+	{
+		obj := data_manage.EdbInfoNoPermissionAdmin{}
+		confList, err := obj.GetAllChartListByAdminId(this.SysUser.AdminId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
+			return
+		}
+		for _, v := range confList {
+			noPermissionChartIdMap[v.ChartInfoId] = true
+		}
+	}
+
+	isShowMe, _ := this.GetBool("IsShowMe")
+	if isShowMe {
+		errMsg, err := getChartClassifyListForMe(*this.SysUser, resp)
+		if err != nil {
+			br.Msg = errMsg
+			br.ErrMsg = err.Error()
+			return
+		}
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		br.Data = resp
+		return
+	}
+
+	source := utils.CHART_SOURCE_LINE_EQUATION
+
+	rootList, err := data_manage.GetChartClassifyByParentId(0, source)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+
+	allChartInfo, err := data_manage.GetChartInfoAll([]int{source})
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+		return
+	}
+
+	chartInfoMap := make(map[int][]*data_manage.ChartClassifyItems)
+	for _, v := range allChartInfo {
+		if !isShowMe {
+			chartInfoMap[v.ChartClassifyId] = append(chartInfoMap[v.ChartClassifyId], v)
+			continue
+		}
+		if v.SysUserId != this.SysUser.AdminId {
+			continue
+		}
+		chartInfoMap[v.ChartClassifyId] = append(chartInfoMap[v.ChartClassifyId], v)
+	}
+	rootChildMap := make(map[int][]*data_manage.ChartClassifyItems)
+	for _, v := range rootList {
+		rootChildMap[v.ParentId] = append(rootChildMap[v.ParentId], v)
+		if existItems, ok := chartInfoMap[v.ChartClassifyId]; ok {
+			v.Children = existItems
+		} else {
+			items := make([]*data_manage.ChartClassifyItems, 0)
+			v.Children = items
+		}
+	}
+
+	// 移除没有权限的图表
+	allNodes := handleNoPermissionChart(rootList, noPermissionChartIdMap)
+	resp.AllNodes = allNodes
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// getChartClassifyListForMe 获取我创建的图表
+func getChartClassifyListForMe(adminInfo system.Admin, resp *data_manage.ChartClassifyListResp) (errMsg string, err error) {
+	// 获取所有的分类
+	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_LINE_EQUATION)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		errMsg = "获取失败"
+		return
+	}
+
+	// /获取所有的图表
+	allChartInfo, err := data_manage.GetChartInfoByAdminId([]int{utils.CHART_SOURCE_LINE_EQUATION}, adminInfo.AdminId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		errMsg = "获取失败"
+		return
+	}
+
+	chartInfoMap := make(map[int][]*data_manage.ChartClassifyItems)
+	for _, v := range allChartInfo {
+		chartInfoMap[v.ChartClassifyId] = append(chartInfoMap[v.ChartClassifyId], v)
+	}
+	for k, v := range rootList {
+		if existItems, ok := chartInfoMap[v.ChartClassifyId]; ok {
+			v.Children = existItems
+		} else {
+			items := make([]*data_manage.ChartClassifyItems, 0)
+			v.Children = items
+		}
+		rootList[k] = v
+	}
+	resp.AllNodes = rootList
+
+	return
+}
+
+// handleNoPermissionChart 图表列表返回,将没有权限的图表移除
+func handleNoPermissionChart(allNodes []*data_manage.ChartClassifyItems, noPermissionChartIdMap map[int]bool) (newAllNodes []*data_manage.ChartClassifyItems) {
+	// 移除没有权限的图表
+	newAllNodes = make([]*data_manage.ChartClassifyItems, 0)
+	for _, node := range allNodes {
+		// 二级分类
+		tmpNodeInfo := *node
+		tmpNodeList := make([]*data_manage.ChartClassifyItems, 0)
+
+		if node.Children != nil {
+			for _, chartInfo := range node.Children {
+				// 如果指标不可见,那么就不返回该指标
+				if _, ok := noPermissionChartIdMap[chartInfo.ChartInfoId]; ok {
+					continue
+				}
+				tmpNodeList = append(tmpNodeList, chartInfo)
+			}
+		}
+
+		tmpNodeInfo.Children = tmpNodeList
+		newAllNodes = append(newAllNodes, &tmpNodeInfo)
+	}
+
+	return
+}

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 341 - 1102
controllers/data_manage/line_equation/line_chart_info.go


+ 607 - 0
controllers/data_manage/line_feature/chart_info.go

@@ -0,0 +1,607 @@
+package line_feature
+
+import (
+	"encoding/json"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"hongze/hongze_ETA_mobile_api/controllers"
+	"hongze/hongze_ETA_mobile_api/models"
+	"hongze/hongze_ETA_mobile_api/models/data_manage"
+	"hongze/hongze_ETA_mobile_api/models/data_manage/line_feature/request"
+	"hongze/hongze_ETA_mobile_api/services/data"
+	lineFeatureServ "hongze/hongze_ETA_mobile_api/services/data/line_feature"
+	"hongze/hongze_ETA_mobile_api/utils"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// LineFeaturesChartInfoController 统计特征图表管理
+type LineFeaturesChartInfoController struct {
+	controllers.BaseAuthController
+}
+
+// List
+// @Title 统计特征图表列表接口
+// @Description 统计特征图表列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   ChartClassifyId   query   int  true       "分类id"
+// @Param   Keyword   query   string  true       "搜索关键词"
+// @Param   IsShowMe   query   bool  true       "是否只看我的,true、false"
+// @Param   Source   query   int  true       "图表类型,3:统计特征,4:滚动统计特征"
+// @Success 200 {object} data_manage.ChartListResp
+// @router /chart_info/list [get]
+func (this *LineFeaturesChartInfoController) List() {
+	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
+	}
+
+	chartClassifyId, _ := this.GetInt("ChartClassifyId")
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	keyword := this.GetString("KeyWord")
+
+	var total int
+	page := paging.GetPaging(currentIndex, pageSize, total)
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	var condition string
+	var pars []interface{}
+
+	// 普通图表
+	condition += ` AND source in(?,?,?) `
+	pars = append(pars, utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION, utils.CHART_SOURCE_LINE_FEATURE_PERCENTILE, utils.CHART_SOURCE_LINE_FEATURE_FREQUENCY)
+
+	if chartClassifyId > 0 {
+		chartClassifyId, err := data_manage.GetChartClassify(chartClassifyId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取图表信息失败"
+			br.ErrMsg = "获取信息失败,GetChartClassify,Err:" + err.Error()
+			return
+		}
+		condition += " AND chart_classify_id IN(" + chartClassifyId + ") "
+	}
+	if keyword != "" {
+		condition += ` AND  ( chart_name LIKE '%` + keyword + `%' )`
+	}
+
+	//只看我的
+	isShowMe, _ := this.GetBool("IsShowMe")
+	if isShowMe {
+		condition += ` AND sys_user_id = ? `
+		pars = append(pars, sysUser.AdminId)
+	}
+
+	// 获取当前账号的不可见指标
+	noPermissionChartIdList := make([]int, 0)
+	{
+		obj := data_manage.EdbInfoNoPermissionAdmin{}
+		confList, err := obj.GetAllChartListByAdminId(this.SysUser.AdminId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
+			return
+		}
+		for _, v := range confList {
+			noPermissionChartIdList = append(noPermissionChartIdList, v.ChartInfoId)
+		}
+	}
+
+	lenNoPermissionChartIdList := len(noPermissionChartIdList)
+	if lenNoPermissionChartIdList > 0 {
+		condition += ` AND chart_info_id not in (` + utils.GetOrmInReplace(lenNoPermissionChartIdList) + `) `
+		pars = append(pars, noPermissionChartIdList)
+	}
+
+	//获取图表信息
+	list, err := data_manage.GetChartListByCondition(condition, pars, startSize, pageSize)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Success = true
+		br.Msg = "获取图表信息失败"
+		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+		return
+	}
+
+	myChartList, err := data_manage.GetMyChartListByAdminId(sysUser.AdminId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取图表信息失败"
+		br.ErrMsg = "获取我的图表信息失败,Err:" + err.Error()
+		return
+	}
+	myChartMap := make(map[int]*data_manage.MyChartView)
+	for _, v := range myChartList {
+		myChartMap[v.ChartInfoId] = v
+	}
+	listLen := len(list)
+	chartEdbMap := make(map[int][]*data_manage.ChartEdbInfoMapping)
+	if listLen > 0 {
+		chartInfoIds := ""
+		for _, v := range list {
+			chartInfoIds += strconv.Itoa(v.ChartInfoId) + ","
+		}
+		if chartInfoIds != "" {
+			chartInfoIds = strings.Trim(chartInfoIds, ",")
+			//判断是否需要展示英文标识
+			edbList, e := data_manage.GetChartEdbMappingListByChartInfoIds(chartInfoIds)
+			if e != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取图表,指标信息失败,Err:" + e.Error()
+				return
+			}
+			for _, v := range edbList {
+				chartEdbMap[v.ChartInfoId] = append(chartEdbMap[v.ChartInfoId], v)
+			}
+		}
+	}
+	for i := 0; i < listLen; i++ {
+		//判断是否需要展示英文标识
+		if _, ok := chartEdbMap[list[i].ChartInfoId]; ok {
+			list[i].IsEnChart = data.CheckIsEnChart(list[i].ChartNameEn, []*data_manage.ChartEdbInfoMapping{}, list[i].Source, list[i].ChartType)
+		}
+
+		if existItem, ok := myChartMap[list[i].ChartInfoId]; ok {
+			list[i].IsAdd = true
+			list[i].MyChartId = existItem.MyChartId
+			list[i].MyChartClassifyId = existItem.MyChartClassifyId
+		}
+	}
+
+	resp := new(data_manage.ChartListResp)
+	if list == nil || len(list) <= 0 || (err != nil && err.Error() == utils.ErrNoRow()) {
+		items := make([]*data_manage.ChartInfoView, 0)
+		resp.Paging = page
+		resp.List = items
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		return
+	}
+
+	dataCount, err := data_manage.GetChartListCountByCondition(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取指标信息失败"
+		br.ErrMsg = "获取指标数据总数失败,Err:" + err.Error()
+		return
+	}
+	page = paging.GetPaging(currentIndex, pageSize, dataCount)
+	resp.Paging = page
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// Refresh
+// @Title 图表刷新接口
+// @Description 图表刷新接口
+// @Param   ChartInfoId   query   int  true       "图表id"
+// @Param   UniqueCode   query   string  true       "唯一code"
+// @Success Ret=200 刷新成功
+// @router /chart_info/refresh [get]
+func (this *LineFeaturesChartInfoController) Refresh() {
+	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
+	}
+	chartInfoId, _ := this.GetInt("ChartInfoId")
+	uniqueCode := this.GetString("UniqueCode")
+	if chartInfoId <= 0 && uniqueCode == `` {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误:chartInfoId:" + strconv.Itoa(chartInfoId) + ",UniqueCode:" + uniqueCode
+		return
+	}
+
+	var chartInfo *data_manage.ChartInfo
+	var err error
+	if chartInfoId > 0 {
+		chartInfo, err = data_manage.GetChartInfoById(chartInfoId)
+	} else {
+		chartInfo, err = data_manage.GetChartInfoByUniqueCode(uniqueCode)
+	}
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "图表已被删除,无需刷新"
+			br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
+			return
+		}
+		br.Msg = "刷新失败"
+		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+		return
+	}
+
+	// 刷新图表的指标信息
+	err = data.ChartInfoRefreshV2(chartInfo.ChartInfoId)
+
+	//清除图表缓存
+	{
+		key := utils.HZ_CHART_LIB_DETAIL + chartInfo.UniqueCode
+		_ = utils.Rc.Delete(key)
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "刷新成功"
+}
+
+// Copy
+// @Title 复制并新增图表接口
+// @Description 复制并新增图表接口
+// @Param	request	body data_manage.CopyAddChartInfoReq true "type json string"
+// @Success 200 {object} data_manage.AddChartInfoResp
+// @router /chart_info/copy [post]
+func (this *LineFeaturesChartInfoController) Copy() {
+	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
+	}
+	deleteCache := true
+	cacheKey := "CACHE_CHART_INFO_ADD_" + strconv.Itoa(sysUser.AdminId)
+	defer func() {
+		if deleteCache {
+			utils.Rc.Delete(cacheKey)
+		}
+	}()
+	if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
+		deleteCache = false
+		br.Msg = "系统处理中,请稍后重试!"
+		br.ErrMsg = "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(this.Ctx.Input.RequestBody)
+		return
+	}
+	var req data_manage.CopyAddChartInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	// 获取原图表信息
+	oldChartInfo, err := data_manage.GetChartInfoById(req.ChartInfoId)
+	if err != nil {
+		br.Msg = "获取原图表信息失败"
+		br.ErrMsg = "获取原图表信息失败,Err:" + err.Error()
+		return
+	}
+	if !utils.InArrayByInt([]int{utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION, utils.CHART_SOURCE_LINE_FEATURE_PERCENTILE, utils.CHART_SOURCE_LINE_FEATURE_FREQUENCY}, oldChartInfo.Source) {
+		br.Msg = `错误的图表类型`
+		br.IsSendEmail = false
+		return
+	}
+
+	multipleGraphConfigChartMapping, err := data_manage.GetMultipleGraphConfigChartMappingByChartId(oldChartInfo.ChartInfoId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = `保存失败`
+		br.ErrMsg = "获取配置与图表的关联关系失败,ERR:" + err.Error()
+		return
+	}
+
+	// 获取图表关联指标
+	edbMappingList, err := data_manage.GetChartEdbMappingList(oldChartInfo.ChartInfoId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取图表关联指标信息失败,Err:" + err.Error()
+		return
+	}
+	if len(edbMappingList) != 1 {
+		br.Msg = "获取失败"
+		br.ErrMsg = fmt.Sprint("获取图表关联指标信息异常,数量:", len(edbMappingList))
+		return
+	}
+	edbInfoMapping := edbMappingList[0]
+
+	// 批量设置图
+	chartInfo, err, errMsg, isSendEmail := lineFeatureServ.CopyChartInfo(multipleGraphConfigChartMapping.MultipleGraphConfigId, multipleGraphConfigChartMapping.Source, req.ChartClassifyId, req.ChartName, edbInfoMapping, oldChartInfo, sysUser)
+
+	if err != nil {
+		br.Msg = "复制失败"
+		if errMsg != `` {
+			br.Msg = errMsg
+		}
+		br.ErrMsg = "复制失败,ERR:" + err.Error()
+		br.IsSendEmail = isSendEmail
+		return
+	}
+
+	resp := data_manage.AddChartInfoResp{
+		ChartInfoId: chartInfo.ChartInfoId,
+		UniqueCode:  chartInfo.UniqueCode,
+		ChartType:   chartInfo.ChartType,
+	}
+
+	//新增操作日志
+	{
+
+		chartLog := new(data_manage.ChartInfoLog)
+		chartLog.ChartInfoId = chartInfo.ChartInfoId
+		chartLog.ChartName = chartInfo.ChartName
+		chartLog.ChartClassifyId = chartInfo.ChartClassifyId
+		chartLog.SysUserId = sysUser.AdminId
+		chartLog.SysUserRealName = sysUser.RealName
+		chartLog.UniqueCode = chartInfo.UniqueCode
+		chartLog.CreateTime = time.Now()
+		chartLog.Content = string(this.Ctx.Input.RequestBody)
+		chartLog.Status = "新增统计特征图表"
+		chartLog.Method = this.Ctx.Input.URI()
+		go data_manage.AddChartInfoLog(chartLog)
+	}
+
+	br.Ret = 200
+	br.Data = resp
+	br.Success = true
+	br.Msg = "保存成功"
+	br.IsAddLog = true
+}
+
+// EnInfoEdit
+// @Title 编辑图表英文信息接口
+// @Description 编辑图表英文信息接口
+// @Param	request	body data_manage.EditChartEnInfoReq true "type json string"
+// @Success Ret=200 编辑成功
+// @router /chart_info/en/edit [post]
+func (this *LineFeaturesChartInfoController) EnInfoEdit() {
+	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
+	}
+	var req request.EditChartEnInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	req.ChartNameEn = strings.Trim(req.ChartNameEn, " ")
+	if req.ChartInfoId <= 0 {
+		br.Msg = "请选择图表"
+		return
+	}
+	if req.ChartNameEn == "" {
+		br.Msg = "请输入英文图表名称"
+		return
+	}
+
+	//判断指标名称是否存在
+	chartItem, err := data_manage.GetChartInfoById(req.ChartInfoId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "图表已被删除,请刷新页面"
+			br.ErrMsg = "图表已被删除,请刷新页面"
+			return
+		}
+		br.Msg = "获取图表信息失败"
+		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+		return
+	}
+
+	// 校验名称是否有重复
+	{
+		var condition string
+		var pars []interface{}
+		condition += " AND chart_info_id <> ?  AND chart_name_en = ? AND source in (?,?,?)"
+		pars = append(pars, req.ChartInfoId, req.ChartNameEn, utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION, utils.CHART_SOURCE_LINE_FEATURE_PERCENTILE, utils.CHART_SOURCE_LINE_FEATURE_FREQUENCY)
+		existItem, err := data_manage.GetChartInfoByCondition(condition, pars)
+		if err != nil {
+			if err.Error() != utils.ErrNoRow() {
+				br.Msg = "判断英文图表名称是否存在失败"
+				br.ErrMsg = "判断英文图表名称是否存在失败,Err:" + err.Error()
+				return
+			}
+		}
+		if err == nil && existItem.ChartInfoId > 0 {
+			br.Msg = existItem.ChartName + ":" + req.ChartNameEn + "图表名称已存在"
+			return
+		}
+	}
+
+	chartItem.ChartNameEn = req.ChartNameEn
+	chartItem.ModifyTime = time.Now().Local()
+	if e := chartItem.Update([]string{"ChartNameEn", "ModifyTime"}); e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "更新图表信息失败, Err: " + e.Error()
+		return
+	}
+
+	//添加es数据
+	go data.EsAddOrEditChartInfo(chartItem.ChartInfoId)
+	//修改my eta es数据
+	go data.EsAddOrEditMyChartInfoByChartInfoId(chartItem.ChartInfoId)
+
+	//指标 修改es信息
+	//go data.AddOrEditEdbInfoToEs(edbInfo.EdbInfoId)
+
+	//新增操作日志
+	{
+		chartLog := new(data_manage.ChartInfoLog)
+		chartLog.ChartName = chartItem.ChartName
+		chartLog.ChartInfoId = req.ChartInfoId
+		chartLog.ChartClassifyId = chartItem.ChartClassifyId
+		chartLog.SysUserId = sysUser.AdminId
+		chartLog.SysUserRealName = sysUser.RealName
+		chartLog.UniqueCode = chartItem.UniqueCode
+		chartLog.CreateTime = time.Now()
+		chartLog.Content = string(this.Ctx.Input.RequestBody)
+		chartLog.Status = "编辑统计特征图表英文信息"
+		chartLog.Method = this.Ctx.Input.URL()
+		go data_manage.AddChartInfoLog(chartLog)
+	}
+	// 清除缓存
+	if utils.Re == nil && utils.Rc != nil {
+		_ = utils.Rc.Delete(utils.HZ_CHART_LIB_DETAIL + chartItem.UniqueCode) //图表分享链接缓存
+		_ = utils.Rc.Delete(data.GetChartInfoDataKey(req.ChartInfoId))
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "编辑成功"
+	br.IsAddLog = true
+}
+
+// SearchByEs
+// @Title 图表模糊搜索(从es获取)
+// @Description  图表模糊搜索(从es获取)
+// @Param   Keyword   query   string  true       "图表名称"
+// @Param   IsShowMe   query   bool  true       "是否只看我的,true、false"
+// @Param   Source   query   int  true       "来源,3:统计特征,4:滚动统计特征,默认0:全部"
+// @Success 200 {object} data_manage.ChartInfo
+// @router /chart_info/search_by_es [get]
+func (this *LineFeaturesChartInfoController) SearchByEs() {
+	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)
+
+	keyword := this.GetString("Keyword")
+
+	//只看我的
+	isShowMe, _ := this.GetBool("IsShowMe")
+	showSysId := 0
+	if isShowMe {
+		showSysId = sysUser.AdminId
+	}
+
+	sourceList := []int{utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION, utils.CHART_SOURCE_LINE_FEATURE_PERCENTILE, utils.CHART_SOURCE_LINE_FEATURE_FREQUENCY}
+
+	var searchList []*data_manage.ChartInfo
+	var total int64
+	var err error
+
+	// 获取当前账号的不可见指标
+	noPermissionChartIdList := make([]int, 0)
+	{
+		obj := data_manage.EdbInfoNoPermissionAdmin{}
+		confList, err := obj.GetAllChartListByAdminId(this.SysUser.AdminId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
+			return
+		}
+		for _, v := range confList {
+			noPermissionChartIdList = append(noPermissionChartIdList, v.ChartInfoId)
+		}
+	}
+
+	if keyword != "" {
+		searchList, total, err = data.EsSearchChartInfo(keyword, showSysId, sourceList, noPermissionChartIdList, startSize, pageSize)
+	} else {
+		total, searchList, err = data_manage.ChartInfoSearchByEmptyKeyWord(showSysId, sourceList, noPermissionChartIdList)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+			return
+		}
+	}
+
+	finalList := make([]*data_manage.ChartInfoMore, 0)
+	if len(searchList) > 0 {
+		chartInfoIds := ""
+		chartEdbMap := make(map[int][]*data_manage.ChartEdbInfoMapping)
+		for _, v := range searchList {
+			chartInfoIds += strconv.Itoa(v.ChartInfoId) + ","
+		}
+		if chartInfoIds != "" {
+			chartInfoIds = strings.Trim(chartInfoIds, ",")
+			//判断是否需要展示英文标识
+			edbList, e := data_manage.GetChartEdbMappingListByChartInfoIds(chartInfoIds)
+			if e != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取图表,指标信息失败,Err:" + e.Error()
+				return
+			}
+			for _, v := range edbList {
+				chartEdbMap[v.ChartInfoId] = append(chartEdbMap[v.ChartInfoId], v)
+			}
+		}
+
+		for _, v := range searchList {
+			tmp := new(data_manage.ChartInfoMore)
+			tmp.ChartInfo = *v
+			//判断是否需要展示英文标识
+			if _, ok := chartEdbMap[v.ChartInfoId]; ok {
+				tmp.IsEnChart = data.CheckIsEnChart(v.ChartNameEn, []*data_manage.ChartEdbInfoMapping{}, v.Source, v.ChartType)
+			}
+			finalList = append(finalList, tmp)
+		}
+	}
+	//新增搜索词记录
+	{
+		searchKeyword := new(data_manage.SearchKeyword)
+		searchKeyword.KeyWord = keyword
+		searchKeyword.CreateTime = time.Now()
+		go data_manage.AddSearchKeyword(searchKeyword)
+	}
+
+	page := paging.GetPaging(currentIndex, pageSize, int(total))
+	resp := data_manage.ChartInfoListByEsResp{
+		Paging: page,
+		List:   finalList,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 167 - 0
controllers/data_manage/line_feature/classify.go

@@ -0,0 +1,167 @@
+package line_feature
+
+import (
+	"hongze/hongze_ETA_mobile_api/controllers"
+	"hongze/hongze_ETA_mobile_api/models"
+	"hongze/hongze_ETA_mobile_api/models/data_manage"
+	"hongze/hongze_ETA_mobile_api/models/system"
+	"hongze/hongze_ETA_mobile_api/utils"
+)
+
+// LineFeaturesChartClassifyController 统计特征图表分类
+type LineFeaturesChartClassifyController struct {
+	controllers.BaseAuthController
+}
+
+// ChartClassifyList
+// @Title 统计特征图表分类列表
+// @Description 统计特征图表分类列表接口
+// @Param   IsShowMe   query   bool  true       "是否只看我的,true、false"
+// @Param   Source   query   int  true       "图表类型,3:统计特征,4:滚动统计特征"
+// @Success 200 {object} data_manage.ChartClassifyListResp
+// @router /chart_classify/list [get]
+func (this *LineFeaturesChartClassifyController) ChartClassifyList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	resp := new(data_manage.ChartClassifyListResp)
+
+	// 获取当前账号的不可见指标
+	noPermissionChartIdMap := make(map[int]bool)
+	{
+		obj := data_manage.EdbInfoNoPermissionAdmin{}
+		confList, err := obj.GetAllChartListByAdminId(this.SysUser.AdminId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
+			return
+		}
+		for _, v := range confList {
+			noPermissionChartIdMap[v.ChartInfoId] = true
+		}
+	}
+
+	isShowMe, _ := this.GetBool("IsShowMe")
+	if isShowMe {
+		errMsg, err := getChartClassifyListForMe(*this.SysUser, resp)
+		if err != nil {
+			br.Msg = errMsg
+			br.ErrMsg = err.Error()
+			return
+		}
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		br.Data = resp
+		return
+	}
+
+	source := utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION
+
+	rootList, err := data_manage.GetChartClassifyByParentId(0, source)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+
+	allChartInfo, err := data_manage.GetChartInfoAll([]int{utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION, utils.CHART_SOURCE_LINE_FEATURE_PERCENTILE, utils.CHART_SOURCE_LINE_FEATURE_FREQUENCY})
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+		return
+	}
+
+	chartInfoMap := make(map[int][]*data_manage.ChartClassifyItems)
+	for _, v := range allChartInfo {
+		if !isShowMe {
+			chartInfoMap[v.ChartClassifyId] = append(chartInfoMap[v.ChartClassifyId], v)
+			continue
+		}
+		if v.SysUserId != this.SysUser.AdminId {
+			continue
+		}
+		chartInfoMap[v.ChartClassifyId] = append(chartInfoMap[v.ChartClassifyId], v)
+	}
+	rootChildMap := make(map[int][]*data_manage.ChartClassifyItems)
+	for _, v := range rootList {
+		rootChildMap[v.ParentId] = append(rootChildMap[v.ParentId], v)
+		if existItems, ok := chartInfoMap[v.ChartClassifyId]; ok {
+			v.Children = existItems
+		} else {
+			items := make([]*data_manage.ChartClassifyItems, 0)
+			v.Children = items
+		}
+	}
+
+	// 移除没有权限的图表
+	allNodes := handleNoPermissionChart(rootList, noPermissionChartIdMap)
+	resp.AllNodes = allNodes
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// getChartClassifyListForMe 获取我创建的图表
+func getChartClassifyListForMe(adminInfo system.Admin, resp *data_manage.ChartClassifyListResp) (errMsg string, err error) {
+	// 获取所有的分类
+	rootList, err := data_manage.GetChartClassifyByParentId(0, utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		errMsg = "获取失败"
+		return
+	}
+
+	// /获取所有的图表
+	allChartInfo, err := data_manage.GetChartInfoByAdminId([]int{utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION, utils.CHART_SOURCE_LINE_FEATURE_PERCENTILE, utils.CHART_SOURCE_LINE_FEATURE_FREQUENCY}, adminInfo.AdminId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		errMsg = "获取失败"
+		return
+	}
+
+	chartInfoMap := make(map[int][]*data_manage.ChartClassifyItems)
+	for _, v := range allChartInfo {
+		chartInfoMap[v.ChartClassifyId] = append(chartInfoMap[v.ChartClassifyId], v)
+	}
+	for k, v := range rootList {
+		if existItems, ok := chartInfoMap[v.ChartClassifyId]; ok {
+			v.Children = existItems
+		} else {
+			items := make([]*data_manage.ChartClassifyItems, 0)
+			v.Children = items
+		}
+		rootList[k] = v
+	}
+	resp.AllNodes = rootList
+
+	return
+}
+
+// handleNoPermissionChart 图表列表返回,将没有权限的图表移除
+func handleNoPermissionChart(allNodes []*data_manage.ChartClassifyItems, noPermissionChartIdMap map[int]bool) (newAllNodes []*data_manage.ChartClassifyItems) {
+	// 移除没有权限的图表
+	newAllNodes = make([]*data_manage.ChartClassifyItems, 0)
+	for _, node := range allNodes {
+		// 二级分类
+		tmpNodeInfo := *node
+		tmpNodeList := make([]*data_manage.ChartClassifyItems, 0)
+
+		if node.Children != nil {
+			for _, chartInfo := range node.Children {
+				// 如果指标不可见,那么就不返回该指标
+				if _, ok := noPermissionChartIdMap[chartInfo.ChartInfoId]; ok {
+					continue
+				}
+				tmpNodeList = append(tmpNodeList, chartInfo)
+			}
+		}
+
+		tmpNodeInfo.Children = tmpNodeList
+		newAllNodes = append(newAllNodes, &tmpNodeInfo)
+	}
+
+	return
+}

+ 46 - 9
models/data_manage/chart_info.go

@@ -61,22 +61,32 @@ type ChartInfoItem struct {
 
 // GetChartInfoAll 用于分类展示
 // @param source int 1:ETA图库;2:商品价格曲线
-func GetChartInfoAll(source int) (items []*ChartClassifyItems, err error) {
+func GetChartInfoAll(sourceList []int) (items []*ChartClassifyItems, err error) {
+	num := len(sourceList)
+	if num <= 0 {
+		return
+	}
+
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT chart_info_id,chart_classify_id,chart_name AS chart_classify_name,
              unique_code,sys_user_id,sys_user_real_name,date_type,start_date,end_date,chart_type,calendar,season_start_date,season_end_date,source
-            FROM chart_info WHERE source = ?  ORDER BY sort asc,create_time ASC `
-	_, err = o.Raw(sql, source).QueryRows(&items)
+            FROM chart_info WHERE source in (` + utils.GetOrmInReplace(num) + `)  ORDER BY sort asc,create_time ASC `
+	_, err = o.Raw(sql, sourceList).QueryRows(&items)
 	return
 }
 
 // GetChartInfoByAdminId 获取所有我创建的图表,用于分类展示
-func GetChartInfoByAdminId(source, adminId int) (items []*ChartClassifyItems, err error) {
+func GetChartInfoByAdminId(sourceList []int, adminId int) (items []*ChartClassifyItems, err error) {
+	num := len(sourceList)
+	if num <= 0 {
+		return
+	}
+
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT chart_info_id,chart_classify_id,chart_name AS chart_classify_name,
              unique_code,sys_user_id,sys_user_real_name,date_type,start_date,end_date,chart_type,calendar,season_start_date,season_end_date
-            FROM chart_info where source = ? AND sys_user_id = ? ORDER BY sort asc,create_time ASC `
-	_, err = o.Raw(sql, source, adminId).QueryRows(&items)
+            FROM chart_info where source in (` + utils.GetOrmInReplace(num) + `)  AND sys_user_id = ? ORDER BY sort asc,create_time ASC `
+	_, err = o.Raw(sql, sourceList, adminId).QueryRows(&items)
 	return
 }
 
@@ -491,6 +501,8 @@ type YData struct {
 	Value          []float64       `description:"每个指标的值"`
 	NoDataEdbList  []int           `description:"没有数据的指标列表"`
 	XEdbInfoIdList []int           `description:"对应X轴的指标id列表"`
+	NameList       []string        `description:"每个值对应的名称"`
+	EnNameList     []string        `description:"每个值对应的英文名称"`
 	EdbValMap      map[int]float64 `description:"指标与值的对应" json:"-"`
 	M              []int           `description:"对应开始日期的间隔值" json:"-"`
 }
@@ -1002,6 +1014,7 @@ type AddChartInfoReq struct {
 	BarChartInfo         BarChartInfoReq         `description:"柱方图的配置"`
 	CorrelationChartInfo CorrelationChartInfoReq `description:"相关性图表配置"`
 	ExtraConfig          string                  `description:"图表额外配置信息,json字符串"`
+	ChartImage           string                  `description:"封面图" json:"-"`
 }
 
 type AddChartInfoResp struct {
@@ -1193,13 +1206,17 @@ func GetFirstChartInfoByClassifyId(classifyId int) (item *ChartInfo, err error)
 }
 
 // UpdateChartInfoSortByClassifyId 根据图表id更新排序
-func UpdateChartInfoSortByClassifyId(classifyId, nowSort, prevChartInfoId, source int, updateSort string) (err error) {
+func UpdateChartInfoSortByClassifyId(classifyId, nowSort, prevChartInfoId int, sourceList []int, updateSort string) (err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := ` update chart_info set sort = ` + updateSort + ` WHERE chart_classify_id=? AND source = ? AND `
+	num := len(sourceList)
+	if num <= 0 {
+		return
+	}
+	sql := ` update chart_info set sort = ` + updateSort + ` WHERE chart_classify_id=? AND source in (` + utils.GetOrmInReplace(num) + `) AND `
 	if prevChartInfoId > 0 {
 		sql += ` (sort > ? or (chart_info_id > ` + fmt.Sprint(prevChartInfoId) + ` and sort = ` + fmt.Sprint(nowSort) + `))`
 	}
-	_, err = o.Raw(sql, classifyId, source, nowSort).Exec()
+	_, err = o.Raw(sql, classifyId, sourceList, nowSort).Exec()
 	return
 }
 
@@ -1420,6 +1437,7 @@ type CorrelationChartInfoReq struct {
 	CalculateUnit      string                           `description:"计算频度"`
 	BaseCalculateValue int                              `description:"基础计算窗口(滚动相关性的时候用到)"`
 	BaseCalculateUnit  string                           `description:"基础计算频度(滚动相关性的时候用到)"`
+	DateType           int                              `description:"日期类型:1:00年至今,2:10年至今,3:15年至今,4:年初至今,5:自定义时间,6:起始日期至今"`
 	StartDate          string                           `description:"开始日期"`
 	EndDate            string                           `description:"结束日期"`
 	EdbInfoIdList      []CorrelationChartInfoEdbItemReq `description:"指标信息"`
@@ -1690,6 +1708,25 @@ type RollingCorrelationChartDataResp struct {
 	YDataList      []YData  `description:"滚动相关性图的y轴数据"`
 }
 
+// GetChartInfoAll 用于分类展示
+// @param source int 1:ETA图库;2:商品价格曲线
+func GetChartInfoAllByClassifyId(source, classifyId int) (items []*ChartClassifyItems, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT chart_info_id,chart_classify_id,chart_name AS chart_classify_name,chart_name_en AS chart_classify_name_en,
+             unique_code,sys_user_id,sys_user_real_name,date_type,start_date,end_date,chart_type,calendar,season_start_date,season_end_date
+            FROM chart_info WHERE chart_classify_id = ? AND source = ?  ORDER BY sort asc,create_time DESC `
+	_, err = o.Raw(sql, classifyId, source).QueryRows(&items)
+	return
+}
+
+// ProfitFutureGoodChartResp 商品利润图
+type ProfitFutureGoodChartResp struct {
+	XDataList    []XData
+	YDataList    []YData
+	ProfitName   string `description:"利润的名称"`
+	ProfitNameEn string `description:"利润的英文名称"`
+}
+
 // ChartInfoLocate 图表位置响应体
 type ChartInfoLocate struct {
 	ChartInfoId       int    `description:"图表ID"`

+ 1 - 0
models/data_manage/chart_info_correlation.go

@@ -16,6 +16,7 @@ type ChartInfoCorrelation struct {
 	CalculateUnit          string    `description:"计算频度"`
 	BaseCalculateValue     int       `description:"基础计算窗口(滚动相关性的时候用到)"`
 	BaseCalculateUnit      string    `description:"基础计算频度(滚动相关性的时候用到)"`
+	DateType               int       `description:"日期类型:1:00年至今,2:10年至今,3:15年至今,4:年初至今,5:自定义时间,6:起始日期至今"`
 	StartDate              time.Time `description:"开始日期"`
 	EndDate                time.Time `description:"结束日期"`
 	EdbInfoIdFirst         int       `description:"A指标ID"`

+ 88 - 4
models/data_manage/future_good/request/future_good_chart.go

@@ -3,10 +3,50 @@ package request
 import "hongze/hongze_ETA_mobile_api/models/data_manage"
 
 type EditChartEnInfoReq struct {
-	ChartInfoId int    `description:"图表ID"`
-	ChartNameEn string `description:"英文图表名称"`
-	EdbNameEn   string `description:"指标英文名称"`
-	UnitEn      string `description:"指标英文单位"`
+	ChartInfoId      int    `description:"图表ID"`
+	ChartNameEn      string `description:"英文图表名称"`
+	EdbNameEn        string `description:"指标英文名称"`
+	UnitEn           string `description:"指标英文单位"`
+	ProfitNameEn     string `description:"利润英文名称"`
+	FutureGoodNameEn string `description:"期货合约英文名称"`
+}
+
+type AddChartInfoReq struct {
+	ChartEdbInfoList []*data_manage.ChartSaveItem `description:"指标及配置信息"`
+	ChartClassifyId  int                          `description:"分类id"`
+	ChartName        string                       `description:"图表名称"`
+	ChartType        int                          `description:"生成样式:1:曲线图,2:季节性图,3:面积图,4:柱状图,5:散点图,6:组合图,7:柱方图"`
+	DateType         int                          `description:"日期类型:1:00年至今,2:10年至今,3:15年至今,4:年初至今,5:自定义时间,6:起始日期至今"`
+	StartDate        string                       `description:"自定义开始日期"`
+	EndDate          string                       `description:"自定义结束日期"`
+	Calendar         string                       `description:"公历/农历"`
+	SeasonStartDate  string                       `description:"季节性图开始日期"`
+	SeasonEndDate    string                       `description:"季节性图开始日期"`
+	LeftMin          string                       `description:"图表左侧最小值"`
+	LeftMax          string                       `description:"图表左侧最大值"`
+	RightMin         string                       `description:"图表右侧最小值"`
+	RightMax         string                       `description:"图表右侧最大值"`
+	Extra            ChartInfoReq                 `description:"图形图的配置"`
+}
+
+// EditChartInfoReq 编辑商品利润图表的请求
+type EditChartInfoReq struct {
+	ChartInfoId      int                          `description:"图表ID"`
+	ChartName        string                       `description:"图表名称"`
+	ChartClassifyId  int                          `description:"分类id"`
+	ChartEdbInfoList []*data_manage.ChartSaveItem `description:"指标及配置信息"`
+	ChartType        int                          `description:"生成样式:1:曲线图,2:季节性图,3:面积图,4:柱状图,5:散点图,6:组合图,7:柱方图,8:商品价格曲线图,9:相关性图,10:截面散点图"`
+	DateType         int                          `description:"日期类型:1:00年至今,2:10年至今,3:15年至今,4:年初至今,5:自定义时间,6:起始日期至今"`
+	StartDate        string                       `description:"自定义开始日期"`
+	EndDate          string                       `description:"自定义结束日期"`
+	Calendar         string                       `description:"公历/农历"`
+	SeasonStartDate  string                       `description:"季节性图开始日期"`
+	SeasonEndDate    string                       `description:"季节性图开始日期"`
+	LeftMin          string                       `description:"图表左侧最小值"`
+	LeftMax          string                       `description:"图表左侧最大值"`
+	RightMin         string                       `description:"图表右侧最小值"`
+	RightMax         string                       `description:"图表右侧最大值"`
+	Extra            ChartInfoReq                 `description:"图形图的配置"`
 }
 
 // ChartInfoReq 图表预览请求数据
@@ -26,3 +66,47 @@ type ChartInfoDateReq struct {
 	Color string `description:"颜色"`
 	Name  string `description:"别名"`
 }
+
+// SectionScatterReq 截面散点请求
+type SectionScatterReq struct {
+	XName       string `description:"x轴名称"`
+	XNameEn     string `description:"x轴名称(英文)"`
+	XUnitName   string `description:"x轴单位名称"`
+	XUnitNameEn string `description:"x轴单位名称(英文)"`
+	YName       string `description:"y轴名称"`
+	YNameEn     string `description:"y轴名称(英文)"`
+	YUnitName   string `description:"y轴单位名称"`
+	YUnitNameEn string `description:"y轴单位名称(英文)"`
+	XMinValue   string `description:"X轴的最小值"`
+	XMaxValue   string `description:"X轴的最大值"`
+	YMinValue   string `description:"Y轴的最小值"`
+	YMaxValue   string `description:"Y轴的最大值"`
+	//EdbList     []SectionScatterEdbItemReq    `description:"指标数据"`
+	SeriesList []SectionScatterSeriesItemReq `description:"系列数据"`
+}
+
+// SectionScatterSeriesItemReq 系列的请求
+type SectionScatterSeriesItemReq struct {
+	Name            string `description:"系列名"`
+	NameEn          string `description:"系列名(英文名)"`
+	Color           string `description:"颜色"`
+	EdbInfoList     []SectionScatterEdbItemReq
+	ShowTrendLine   bool `description:"是否展示趋势线"`
+	ShowFitEquation bool `description:"是否展示方程式"`
+	ShowRSquare     bool `description:"是否展示R平方"`
+}
+
+// SectionScatterEdbItemReq 截面散点请求的指标
+type SectionScatterEdbItemReq struct {
+	XEdbInfoId int    `description:"X轴的指标ID"`
+	YEdbInfoId int    `description:"Y轴的指标ID"`
+	Name       string `description:"别名"`
+	NameEn     string `description:"英文别名"`
+	XDateType  int    `description:"X轴的日期配置类型"`
+	XDate      string `description:"X轴的日期固定日期"`
+	XDateValue int    `description:"X轴的日期N天的值"`
+	YDateType  int    `description:"Y轴的日期配置类型"`
+	YDate      string `description:"Y轴的日期固定日期"`
+	YDateValue int    `description:"Y轴的日期N天的值"`
+	IsShow     bool   `description:"是否展示"`
+}

+ 2 - 2
models/data_manage/line_feature/line_feature.go

@@ -3,8 +3,8 @@ package line_feature
 import (
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
-	"hongze/hongze_admin/models/data_manage"
-	"hongze/hongze_admin/utils"
+	"hongze/hongze_ETA_mobile_api/models/data_manage"
+	"hongze/hongze_ETA_mobile_api/utils"
 	"strconv"
 	"strings"
 	"time"

+ 126 - 0
routers/commentsRouter.go

@@ -25,6 +25,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/correlation:CorrelationChartInfoController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/correlation:CorrelationChartInfoController"],
+        beego.ControllerComments{
+            Method: "EnInfoEdit",
+            Router: `/chart_info/en/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/correlation:CorrelationChartInfoController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/correlation:CorrelationChartInfoController"],
         beego.ControllerComments{
             Method: "List",
@@ -34,6 +43,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/correlation:CorrelationChartInfoController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/correlation:CorrelationChartInfoController"],
+        beego.ControllerComments{
+            Method: "Refresh",
+            Router: `/chart_info/refresh`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/correlation:CorrelationChartInfoController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/correlation:CorrelationChartInfoController"],
         beego.ControllerComments{
             Method: "SearchByEs",
@@ -61,6 +79,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/future_good:FutureGoodChartInfoController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/future_good:FutureGoodChartInfoController"],
+        beego.ControllerComments{
+            Method: "ChartInfoRefresh",
+            Router: `/chart_info/refresh`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/future_good:FutureGoodChartInfoController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/future_good:FutureGoodChartInfoController"],
         beego.ControllerComments{
             Method: "ChartInfoSearchByEs",
@@ -70,7 +97,106 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/line_equation:LineEquationChartClassifyController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/line_equation:LineEquationChartClassifyController"],
+        beego.ControllerComments{
+            Method: "ChartClassifyList",
+            Router: `/chart_classify/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/line_equation:LineEquationChartInfoController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/line_equation:LineEquationChartInfoController"],
+        beego.ControllerComments{
+            Method: "Copy",
+            Router: `/chart_info/copy`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/line_equation:LineEquationChartInfoController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/line_equation:LineEquationChartInfoController"],
+        beego.ControllerComments{
+            Method: "EnInfoEdit",
+            Router: `/chart_info/en/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/line_equation:LineEquationChartInfoController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/line_equation:LineEquationChartInfoController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/chart_info/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/line_equation:LineEquationChartInfoController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/line_equation:LineEquationChartInfoController"],
+        beego.ControllerComments{
+            Method: "Refresh",
+            Router: `/chart_info/refresh`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/line_equation:LineEquationChartInfoController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/line_equation:LineEquationChartInfoController"],
+        beego.ControllerComments{
+            Method: "SearchByEs",
+            Router: `/chart_info/search_by_es`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/line_feature:LineFeaturesChartClassifyController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/line_feature:LineFeaturesChartClassifyController"],
+        beego.ControllerComments{
+            Method: "ChartClassifyList",
+            Router: `/chart_classify/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/line_feature:LineFeaturesChartInfoController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/line_feature:LineFeaturesChartInfoController"],
+        beego.ControllerComments{
+            Method: "Copy",
+            Router: `/chart_info/copy`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/line_feature:LineFeaturesChartInfoController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/line_feature:LineFeaturesChartInfoController"],
+        beego.ControllerComments{
+            Method: "EnInfoEdit",
+            Router: `/chart_info/en/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/line_feature:LineFeaturesChartInfoController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/line_feature:LineFeaturesChartInfoController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/chart_info/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/line_feature:LineFeaturesChartInfoController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/line_feature:LineFeaturesChartInfoController"],
+        beego.ControllerComments{
+            Method: "Refresh",
+            Router: `/chart_info/refresh`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/line_feature:LineFeaturesChartInfoController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/line_feature:LineFeaturesChartInfoController"],
         beego.ControllerComments{
             Method: "SearchByEs",
             Router: `/chart_info/search_by_es`,

+ 8 - 1
routers/router.go

@@ -13,6 +13,7 @@ import (
 	"hongze/hongze_ETA_mobile_api/controllers/data_manage/correlation"
 	"hongze/hongze_ETA_mobile_api/controllers/data_manage/future_good"
 	"hongze/hongze_ETA_mobile_api/controllers/data_manage/line_equation"
+	"hongze/hongze_ETA_mobile_api/controllers/data_manage/line_feature"
 	"hongze/hongze_ETA_mobile_api/controllers/english_report"
 	"hongze/hongze_ETA_mobile_api/controllers/sandbox"
 
@@ -102,10 +103,16 @@ func init() {
 		),
 		web.NSNamespace("/line_equation",
 			web.NSInclude(
-				//&line_equation.LineEquationChartClassifyController{},
+				&line_equation.LineEquationChartClassifyController{},
 				&line_equation.LineEquationChartInfoController{},
 			),
 		),
+		web.NSNamespace("/line_feature",
+			web.NSInclude(
+				&line_feature.LineFeaturesChartClassifyController{},
+				&line_feature.LineFeaturesChartInfoController{},
+			),
+		),
 		web.NSNamespace("/classify",
 			web.NSInclude(
 				&controllers.ClassifyController{},

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

@@ -1,11 +1,13 @@
 package correlation
 
 import (
+	"encoding/json"
 	"errors"
 	"fmt"
 	"github.com/shopspring/decimal"
 	"hongze/hongze_ETA_mobile_api/models/data_manage"
 	"hongze/hongze_ETA_mobile_api/models/system"
+	"hongze/hongze_ETA_mobile_api/services/alarm_msg"
 	"hongze/hongze_ETA_mobile_api/services/data"
 	"hongze/hongze_ETA_mobile_api/utils"
 	"math"
@@ -420,7 +422,7 @@ func GetRollingCorrelationChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB *d
 	case 0:
 		aDataList, err = data_manage.GetEdbDataList(baseEdbInfo.Source, baseEdbInfo.EdbInfoId, startDate, endDate)
 	case 1:
-		_, aDataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(baseEdbInfo.EdbInfoId, startDate, endDate, false)
+		_, aDataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(baseEdbInfo.EdbInfoId, startDate, endDate, true)
 	default:
 		err = errors.New("指标base类型异常")
 		return
@@ -474,7 +476,11 @@ func GetRollingCorrelationChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB *d
 	// 计算 每个日期的相关性值
 	{
 		startDateTime, _ := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
+		if endDate == `` {
+			endDate = baseEdbInfo.EndDate
+		}
 		endDateTime, _ := time.ParseInLocation(utils.FormatDate, endDate, time.Local)
+		endDateTime = endDateTime.AddDate(0, 0, -(calculateDay - 1))
 
 		for currDay := startDateTime; !currDay.After(endDateTime); currDay = currDay.AddDate(0, 0, 1) {
 			yCalculateData := make([]float64, 0)
@@ -513,6 +519,63 @@ func GetRollingCorrelationChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB *d
 	return
 }
 
+// ChartInfoRefresh 图表刷新
+func ChartInfoRefresh(chartInfoId int) (err error) {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("CorrelationChartInfoRefresh: "+errMsg, 3)
+		}
+	}()
+	correlationChart := new(data_manage.ChartInfoCorrelation)
+	if err = correlationChart.GetItemById(chartInfoId); err != nil {
+		errMsg = "获取相关性图表失败, Err: " + err.Error()
+		return
+	}
+
+	// 批量刷新ETA指标
+	err = data.EdbInfoRefreshAllFromBaseV3([]int{correlationChart.EdbInfoIdFirst, correlationChart.EdbInfoIdSecond}, false)
+	if err != nil {
+		return
+	}
+
+	// 重新生成数据并更新
+	edbInfoMappingA, err := data_manage.GetChartEdbMappingByEdbInfoId(correlationChart.EdbInfoIdFirst)
+	if err != nil {
+		errMsg = "获取相关性图表, A指标mapping信息失败, Err:" + err.Error()
+		return
+	}
+	edbInfoMappingB, err := data_manage.GetChartEdbMappingByEdbInfoId(correlationChart.EdbInfoIdSecond)
+	if err != nil {
+		errMsg = "获取相关性图表, B指标mapping信息失败, Err:" + err.Error()
+		return
+	}
+	periodData, correlationData, err := GetChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB, correlationChart.LeadValue, correlationChart.LeadUnit, correlationChart.StartDate.Format(utils.FormatDate), correlationChart.EndDate.Format(utils.FormatDate))
+	if err != nil {
+		errMsg = "获取相关性图表, 图表计算值失败, Err:" + err.Error()
+		return
+	}
+	periodDataByte, err := json.Marshal(periodData)
+	if err != nil {
+		errMsg = "相关性图表, X轴信息有误, Err:" + err.Error()
+		return
+	}
+	correlationDataByte, err := json.Marshal(correlationData[0].Value)
+	if err != nil {
+		errMsg = "相关性图表, Y轴信息有误, Err:" + err.Error()
+		return
+	}
+	correlationChart.PeriodData = string(periodDataByte)
+	correlationChart.CorrelationData = string(correlationDataByte)
+	correlationChart.ModifyTime = time.Now().Local()
+	correlationUpdateCols := []string{"PeriodData", "CorrelationData", "ModifyTime"}
+	if err = correlationChart.Update(correlationUpdateCols); err != nil {
+		errMsg = "更新相关性图表失败, Err:" + err.Error()
+		return
+	}
+	return
+}
+
 // AddChartInfo 添加图表
 func AddChartInfo(req data_manage.AddChartInfoReq, source int, sysUser *system.Admin) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
 	isSendEmail = true

+ 91 - 0
services/data/future_good/base_future_good_lib.go

@@ -0,0 +1,91 @@
+package future_good
+
+import (
+	"encoding/json"
+	"fmt"
+	"hongze/hongze_ETA_mobile_api/models"
+	"hongze/hongze_ETA_mobile_api/models/data_manage"
+	"hongze/hongze_ETA_mobile_api/utils"
+	"io/ioutil"
+	"net/http"
+	"strings"
+)
+
+type AddPredictEdbDataResponse struct {
+	Ret         int
+	Msg         string
+	ErrMsg      string
+	ErrCode     string
+	Data        data_manage.AddEdbInfoResp
+	Success     bool `description:"true 执行成功,false 执行失败"`
+	IsSendEmail bool `json:"-" description:"true 发送邮件,false 不发送邮件"`
+	IsAddLog    bool `json:"-" description:"true 新增操作日志,false 不新增操作日志" `
+}
+
+// AddEdbData 添加指标数据
+func AddEdbData(futureGoodEdbCode string) (resp *models.BaseResponse, err error) {
+	param := make(map[string]interface{})
+	param["EdbCode"] = futureGoodEdbCode
+	urlStr := `future_good/add`
+	resp, err = postRefreshEdbData(param, urlStr)
+	return
+}
+
+// RefreshEdbData 刷新指标数据
+func RefreshEdbData(futureGoodEdbInfoId int, futureGoodEdbCode, startDate string) (resp *models.BaseResponse, err error) {
+	param := make(map[string]interface{})
+	param["FutureGoodEdbCode"] = futureGoodEdbCode
+	param["FutureGoodEdbInfoId"] = futureGoodEdbInfoId
+	param["StartDate"] = startDate
+	urlStr := `future_good/refresh`
+	resp, err = postRefreshEdbData(param, urlStr)
+	return
+}
+
+// RefreshEdbRelation 刷新商品期货指标相关的数据
+func RefreshEdbRelation(futureGoodEdbInfoId int) (resp *models.BaseResponse, err error) {
+	param := make(map[string]interface{})
+	param["FutureGoodEdbInfoId"] = futureGoodEdbInfoId
+	urlStr := `future_good/relation/refresh`
+	resp, err = postRefreshEdbData(param, urlStr)
+	return
+}
+
+// postRefreshEdbData 刷新指标数据
+func postRefreshEdbData(param map[string]interface{}, urlStr string) (resp *models.BaseResponse, err error) {
+	postUrl := utils.EDB_LIB_URL + urlStr
+	postData, err := json.Marshal(param)
+	if err != nil {
+		return
+	}
+	result, err := HttpPost(postUrl, string(postData), "application/json")
+	if err != nil {
+		return
+	}
+	utils.FileLog.Info("postRefreshEdbData:" + postUrl + ";" + string(postData) + ";result:" + string(result))
+	err = json.Unmarshal(result, &resp)
+	if err != nil {
+		return
+	}
+	return resp, nil
+}
+
+func HttpPost(url, postData string, params ...string) ([]byte, error) {
+	body := ioutil.NopCloser(strings.NewReader(postData))
+	client := &http.Client{}
+	req, err := http.NewRequest("POST", url, body)
+	if err != nil {
+		return nil, err
+	}
+	contentType := "application/x-www-form-urlencoded;charset=utf-8"
+	if len(params) > 0 && params[0] != "" {
+		contentType = params[0]
+	}
+	req.Header.Set("Content-Type", contentType)
+	req.Header.Set("authorization", utils.MD5(utils.APP_EDB_LIB_NAME_EN+utils.EDB_LIB_Md5_KEY))
+	resp, err := client.Do(req)
+	defer resp.Body.Close()
+	b, err := ioutil.ReadAll(resp.Body)
+	fmt.Println("HttpPost:" + string(b))
+	return b, err
+}

+ 47 - 0
services/data/future_good/chart_info.go

@@ -6,6 +6,7 @@ import (
 	"github.com/shopspring/decimal"
 	"hongze/hongze_ETA_mobile_api/models/data_manage"
 	future_good2 "hongze/hongze_ETA_mobile_api/models/data_manage/future_good"
+	"hongze/hongze_ETA_mobile_api/services/alarm_msg"
 	"hongze/hongze_ETA_mobile_api/services/data"
 	"hongze/hongze_ETA_mobile_api/utils"
 	"sort"
@@ -876,3 +877,49 @@ func GetNeedDateData(needDateTime time.Time, dataList []*data_manage.EdbDataList
 
 	return
 }
+
+// FutureGoodChartInfoRefresh
+// @author Roc
+// @datetime 2023-2-2 18:44:46
+// @description 商品价格曲线图表刷新
+func FutureGoodChartInfoRefresh(chartInfoId int) (err error) {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("ChartInfoRefresh:"+errMsg, 3)
+			fmt.Println("ChartInfoRefresh Err:" + errMsg)
+		}
+	}()
+
+	edbInfoMapping, err := data_manage.GetEtaEdbChartEdbMapping(chartInfoId)
+	if err != nil {
+		errMsg = "获取需要刷新的ETA指标失败:Err:" + err.Error()
+		return
+	}
+	// 获取期货指标
+	futureGoodEdbInfoMapping, err := data_manage.GetFutureGoodEdbChartEdbMapping(chartInfoId)
+	if err != nil {
+		errMsg = "获取需要刷新的商品期货指标失败:Err:" + err.Error()
+		return
+	}
+
+	// 获取期货指标以及期货数据
+	futureGoodEdbInfoList, err := future_good2.GetFutureGoodEdbInfoListByParentId(futureGoodEdbInfoMapping.EdbInfoId)
+	if err != nil {
+		return
+	}
+
+	// 批量刷新ETA指标
+	err = data.EdbInfoRefreshAllFromBaseV3([]int{edbInfoMapping.EdbInfoId}, false)
+	if err != nil {
+		return
+	}
+
+	// 批量刷新期货指标
+	err = FutureGoodEdbInfoRefreshAllFromBase(futureGoodEdbInfoList, false)
+	if err != nil {
+		return
+	}
+
+	return
+}

+ 64 - 0
services/data/future_good/future_edb_info.go

@@ -0,0 +1,64 @@
+package future_good
+
+import (
+	"fmt"
+	"hongze/hongze_ETA_mobile_api/models/data_manage/future_good"
+	"hongze/hongze_ETA_mobile_api/services/alarm_msg"
+	"hongze/hongze_ETA_mobile_api/utils"
+	"time"
+)
+
+// FutureGoodEdbInfoRefreshAllFromBase 批量刷新商品期货指标
+// @author Roc
+// @datetime 2022-09-16 11:04:44
+// @description 将原有的单个指标刷新,调整为批量多个指标刷新
+func FutureGoodEdbInfoRefreshAllFromBase(futureGoodEdbInfoList []*future_good.FutureGoodEdbInfo, refreshAll bool) (err error) {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			fmt.Println("FutureGoodEdbInfoRefreshAllFromBase Err:" + err.Error() + ";errMsg:" + errMsg)
+			go alarm_msg.SendAlarmMsg("FutureGoodEdbInfoRefreshAllFromBase,Err"+err.Error()+";errMsg:"+errMsg, 3)
+		}
+	}()
+	var startDate string
+	for _, bv := range futureGoodEdbInfoList {
+		if bv.StartDate == "0000-00-00" {
+			continue
+		}
+		//开始时间
+		startDate = ``
+		if refreshAll { //刷新所有数据,用开始时间作为起始日期去刷新
+			sTime, err := time.Parse(utils.FormatDate, bv.StartDate)
+			if err != nil {
+				return err
+			}
+			startDate = sTime.Format(utils.FormatDate)
+		} else {
+			sTime, err := time.Parse(utils.FormatDate, bv.EndDate)
+			if err != nil {
+				return err
+			}
+			limitDay := utils.DATA_START_REFRESH_LIMIT
+			startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
+		}
+		result, err := RefreshEdbData(bv.FutureGoodEdbInfoId, bv.FutureGoodEdbCode, startDate)
+		if err != nil {
+			fmt.Println(bv.FutureGoodEdbInfoId, "FutureGoodRefreshBaseEdbData err", time.Now())
+			errMsg = "FutureGoodRefreshBaseEdbData Err:" + err.Error()
+			return err
+		}
+		if result.Ret != 200 {
+			fmt.Println(bv.FutureGoodEdbInfoId, "FutureGoodRefreshBaseEdbData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+			errMsg = fmt.Sprint(bv.FutureGoodEdbInfoId, "FutureGoodRefreshBaseEdbData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+			return fmt.Errorf("刷新失败, err:%s", errMsg)
+		}
+	}
+
+	// 刷新商品期货指标相关的数据
+	for _, bv := range futureGoodEdbInfoList {
+		if bv.ParentId == 0 {
+			RefreshEdbRelation(bv.FutureGoodEdbInfoId)
+		}
+	}
+	return err
+}

+ 421 - 414
services/data/line_equation/chart_info.go

@@ -1,13 +1,20 @@
 package line_equation
 
 import (
+	"encoding/json"
 	"errors"
+	"fmt"
 	"github.com/shopspring/decimal"
 	"hongze/hongze_ETA_mobile_api/models/data_manage"
+	"hongze/hongze_ETA_mobile_api/models/data_manage/line_equation"
 	"hongze/hongze_ETA_mobile_api/models/data_manage/line_equation/request"
+	"hongze/hongze_ETA_mobile_api/models/system"
 	"hongze/hongze_ETA_mobile_api/services/data"
 	"hongze/hongze_ETA_mobile_api/utils"
 	"math"
+	"sort"
+	"strconv"
+	"strings"
 	"time"
 )
 
@@ -261,9 +268,9 @@ func GetChartEdbData(chartInfoId int, lineChartInfoConfig request.LineChartInfoR
 }
 
 // GetConfigData 获取配置数据
-//func GetConfigData(lineChartInfoConfig request.LineChartInfoReq) (mappingList []*data_manage.ChartEdbInfoMapping, startDate, endDate string, err error, errMsg string) {
-//	return getConfigData(lineChartInfoConfig)
-//}
+func GetConfigData(lineChartInfoConfig request.LineChartInfoReq) (mappingList []*data_manage.ChartEdbInfoMapping, startDate, endDate string, err error, errMsg string) {
+	return getConfigData(lineChartInfoConfig)
+}
 
 // getConfigData 获取配置数据
 func getConfigData(lineChartInfoConfig request.LineChartInfoReq) (mappingList []*data_manage.ChartEdbInfoMapping, startDate, endDate string, err error, errMsg string) {
@@ -359,416 +366,416 @@ func handleData(baseEdbInfoId int, edbDataListMap map[int][]*data_manage.EdbData
 }
 
 // BatchAddChartInfo 批量添加图表
-//func BatchAddChartInfo(batchAddChartReq []request.AddChart, lineChartInfoConfig request.LineChartInfoReq, sysUser *system.Admin) (batchAddChartList []line_equation.BatchAddChart, err error, errMsg string, isSendEmail bool) {
-//	source := utils.CHART_SOURCE_LINE_EQUATION
-//	// 获取需要
-//	for k, v := range batchAddChartReq {
-//		v.ChartName = strings.Trim(v.ChartName, " ")
-//		batchAddChartReq[k] = v
-//
-//		if v.ChartName == "" {
-//			errMsg = "请填写图表名称!"
-//			err = errors.New(errMsg)
-//			isSendEmail = false
-//			return
-//		}
-//		if v.ChartClassifyId <= 0 {
-//			errMsg = "请填写图表名称!"
-//			err = errors.New(errMsg)
-//			isSendEmail = false
-//			return
-//		}
-//
-//		chartClassify, tmpErr := data_manage.GetChartClassifyById(v.ChartClassifyId)
-//		if tmpErr != nil {
-//			if tmpErr.Error() == utils.ErrNoRow() {
-//				errMsg = "分类不存在"
-//				err = errors.New(errMsg)
-//				isSendEmail = false
-//				return
-//			}
-//			errMsg = "获取分类信息失败"
-//			err = errors.New("获取分类信息失败,Err:" + tmpErr.Error())
-//			return
-//		}
-//		if chartClassify == nil {
-//			errMsg = "分类不存在"
-//			err = errors.New(errMsg)
-//			isSendEmail = false
-//			return
-//		}
-//
-//		// 判断图表是否存在
-//		var condition string
-//		var pars []interface{}
-//		condition += " AND chart_name=? AND source = ? "
-//		pars = append(pars, v.ChartName, source)
-//		count, tmpErr := data_manage.GetChartInfoCountByCondition(condition, pars)
-//		if tmpErr != nil {
-//			errMsg = "判断图表名称是否存在失败"
-//			err = errors.New("判断图表名称是否存在失败,Err:" + tmpErr.Error())
-//			return
-//		}
-//
-//		if count > 0 {
-//			errMsg = "图表已存在,请重新填写"
-//			err = errors.New(errMsg)
-//			isSendEmail = false
-//			return
-//		}
-//	}
-//
-//	edbList, _, _, err, errMsg := getConfigData(lineChartInfoConfig)
-//
-//	var edbInfoIdArr []int
-//	for _, v := range edbList {
-//		edbInfoIdArr = append(edbInfoIdArr, v.EdbInfoId)
-//	}
-//	disableVal := data.CheckIsDisableChart(edbInfoIdArr)
-//
-//	sort.Ints(edbInfoIdArr)
-//	var edbInfoIdArrStr []string
-//	for _, v := range edbInfoIdArr {
-//		edbInfoIdArrStr = append(edbInfoIdArrStr, strconv.Itoa(v))
-//	}
-//	edbInfoIdStr := strings.Join(edbInfoIdArrStr, ",")
-//
-//	// 批量配置
-//	lineChartInfoConfigByte, err := json.Marshal(lineChartInfoConfig)
-//	if err != nil {
-//		return
-//	}
-//	multipleGraphConfig := &data_manage.MultipleGraphConfig{
-//		Curve:           string(lineChartInfoConfigByte),
-//		SysUserId:       sysUser.AdminId,
-//		SysUserRealName: sysUser.RealName,
-//		ModifyTime:      time.Now(),
-//		CreateTime:      time.Now(),
-//	}
-//
-//	// 多图
-//	batchAddChartList = make([]line_equation.BatchAddChart, 0)
-//	for _, v := range batchAddChartReq {
-//		tmpLineChartInfoConfig := lineChartInfoConfig
-//		tmpLineChartInfoConfig.Source = v.Source
-//		tmpLineChartInfoConfigByte, tmpErr := json.Marshal(tmpLineChartInfoConfig)
-//		if tmpErr != nil {
-//			err = tmpErr
-//			return
-//		}
-//
-//		chartInfo := &data_manage.ChartInfo{
-//			ChartInfoId: 0,
-//			ChartName:   v.ChartName,
-//			//ChartNameEn:     v.ChartName,
-//			ChartClassifyId: v.ChartClassifyId,
-//			SysUserId:       sysUser.AdminId,
-//			SysUserRealName: sysUser.RealName,
-//			UniqueCode:      utils.MD5(utils.CHART_PREFIX + "_" + fmt.Sprint(v.Source) + "_" + strconv.FormatInt(time.Now().UnixNano(), 10)),
-//			CreateTime:      time.Now(),
-//			ModifyTime:      time.Now(),
-//			DateType:        lineChartInfoConfig.DateType,
-//			StartDate:       lineChartInfoConfig.StartDate,
-//			EndDate:         lineChartInfoConfig.EndDate,
-//			IsSetName:       0,
-//			EdbInfoIds:      edbInfoIdStr,
-//			ChartType:       1,
-//			Calendar:        "公历",
-//			SeasonStartDate: "",
-//			SeasonEndDate:   "",
-//			ChartImage:      v.ChartImage,
-//			Sort:            0,
-//			LeftMin:         v.LeftMin,
-//			LeftMax:         v.LeftMax,
-//			RightMin:        "",
-//			RightMax:        "",
-//			Disabled:        disableVal,
-//			BarConfig:       "",
-//			Source:          source,
-//			ExtraConfig:     string(tmpLineChartInfoConfigByte),
-//		}
-//
-//		// 指标信息
-//		mapList := make([]*data_manage.ChartEdbMapping, 0)
-//		for _, edbInfo := range edbList {
-//			mapItem := new(data_manage.ChartEdbMapping)
-//			mapItem.EdbInfoId = edbInfo.EdbInfoId
-//			mapItem.CreateTime = time.Now()
-//			mapItem.ModifyTime = time.Now()
-//			timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
-//
-//			mapItem.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + fmt.Sprint(v.Source) + "_" + timestamp + "_" + strconv.Itoa(edbInfo.EdbInfoId))
-//			mapItem.IsOrder = true
-//			mapItem.IsAxis = 1
-//			mapItem.EdbInfoType = 1
-//			mapItem.Source = source
-//			mapList = append(mapList, mapItem)
-//		}
-//
-//		// 批量的关系图
-//		multipleGraphConfigChartMapping := &data_manage.MultipleGraphConfigChartMapping{
-//			//Id:                    0,
-//			//MultipleGraphConfigId: 0,
-//			//ChartInfoId:           0,
-//			Source:     v.Source,
-//			ModifyTime: time.Now(),
-//			CreateTime: time.Now(),
-//		}
-//
-//		batchAddChartList = append(batchAddChartList, line_equation.BatchAddChart{
-//			ChartInfo:                       chartInfo,
-//			EdbMappingList:                  mapList,
-//			MultipleGraphConfigChartMapping: multipleGraphConfigChartMapping,
-//		})
-//	}
-//
-//	// 批量创建
-//	err = line_equation.CreateLineEquationChartAndEdb(multipleGraphConfig, batchAddChartList)
-//
-//	// 更改es
-//	for _, v := range batchAddChartList {
-//		//添加es数据
-//		go data.EsAddOrEditChartInfo(v.ChartInfo.ChartInfoId)
-//	}
-//
-//	return
-//}
+func BatchAddChartInfo(batchAddChartReq []request.AddChart, lineChartInfoConfig request.LineChartInfoReq, sysUser *system.Admin) (batchAddChartList []line_equation.BatchAddChart, err error, errMsg string, isSendEmail bool) {
+	source := utils.CHART_SOURCE_LINE_EQUATION
+	// 获取需要
+	for k, v := range batchAddChartReq {
+		v.ChartName = strings.Trim(v.ChartName, " ")
+		batchAddChartReq[k] = v
+
+		if v.ChartName == "" {
+			errMsg = "请填写图表名称!"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
+		if v.ChartClassifyId <= 0 {
+			errMsg = "请填写图表名称!"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
+
+		chartClassify, tmpErr := data_manage.GetChartClassifyById(v.ChartClassifyId)
+		if tmpErr != nil {
+			if tmpErr.Error() == utils.ErrNoRow() {
+				errMsg = "分类不存在"
+				err = errors.New(errMsg)
+				isSendEmail = false
+				return
+			}
+			errMsg = "获取分类信息失败"
+			err = errors.New("获取分类信息失败,Err:" + tmpErr.Error())
+			return
+		}
+		if chartClassify == nil {
+			errMsg = "分类不存在"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
+
+		// 判断图表是否存在
+		var condition string
+		var pars []interface{}
+		condition += " AND chart_name=? AND source = ? "
+		pars = append(pars, v.ChartName, source)
+		count, tmpErr := data_manage.GetChartInfoCountByCondition(condition, pars)
+		if tmpErr != nil {
+			errMsg = "判断图表名称是否存在失败"
+			err = errors.New("判断图表名称是否存在失败,Err:" + tmpErr.Error())
+			return
+		}
+
+		if count > 0 {
+			errMsg = "图表已存在,请重新填写"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
+	}
+
+	edbList, _, _, err, errMsg := getConfigData(lineChartInfoConfig)
+
+	var edbInfoIdArr []int
+	for _, v := range edbList {
+		edbInfoIdArr = append(edbInfoIdArr, v.EdbInfoId)
+	}
+	disableVal := data.CheckIsDisableChart(edbInfoIdArr)
+
+	sort.Ints(edbInfoIdArr)
+	var edbInfoIdArrStr []string
+	for _, v := range edbInfoIdArr {
+		edbInfoIdArrStr = append(edbInfoIdArrStr, strconv.Itoa(v))
+	}
+	edbInfoIdStr := strings.Join(edbInfoIdArrStr, ",")
+
+	// 批量配置
+	lineChartInfoConfigByte, err := json.Marshal(lineChartInfoConfig)
+	if err != nil {
+		return
+	}
+	multipleGraphConfig := &data_manage.MultipleGraphConfig{
+		Curve:           string(lineChartInfoConfigByte),
+		SysUserId:       sysUser.AdminId,
+		SysUserRealName: sysUser.RealName,
+		ModifyTime:      time.Now(),
+		CreateTime:      time.Now(),
+	}
+
+	// 多图
+	batchAddChartList = make([]line_equation.BatchAddChart, 0)
+	for _, v := range batchAddChartReq {
+		tmpLineChartInfoConfig := lineChartInfoConfig
+		tmpLineChartInfoConfig.Source = v.Source
+		tmpLineChartInfoConfigByte, tmpErr := json.Marshal(tmpLineChartInfoConfig)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+
+		chartInfo := &data_manage.ChartInfo{
+			ChartInfoId: 0,
+			ChartName:   v.ChartName,
+			//ChartNameEn:     v.ChartName,
+			ChartClassifyId: v.ChartClassifyId,
+			SysUserId:       sysUser.AdminId,
+			SysUserRealName: sysUser.RealName,
+			UniqueCode:      utils.MD5(utils.CHART_PREFIX + "_" + fmt.Sprint(v.Source) + "_" + strconv.FormatInt(time.Now().UnixNano(), 10)),
+			CreateTime:      time.Now(),
+			ModifyTime:      time.Now(),
+			DateType:        lineChartInfoConfig.DateType,
+			StartDate:       lineChartInfoConfig.StartDate,
+			EndDate:         lineChartInfoConfig.EndDate,
+			IsSetName:       0,
+			EdbInfoIds:      edbInfoIdStr,
+			ChartType:       1,
+			Calendar:        "公历",
+			SeasonStartDate: "",
+			SeasonEndDate:   "",
+			ChartImage:      v.ChartImage,
+			Sort:            0,
+			LeftMin:         v.LeftMin,
+			LeftMax:         v.LeftMax,
+			RightMin:        "",
+			RightMax:        "",
+			Disabled:        disableVal,
+			BarConfig:       "",
+			Source:          source,
+			ExtraConfig:     string(tmpLineChartInfoConfigByte),
+		}
+
+		// 指标信息
+		mapList := make([]*data_manage.ChartEdbMapping, 0)
+		for _, edbInfo := range edbList {
+			mapItem := new(data_manage.ChartEdbMapping)
+			mapItem.EdbInfoId = edbInfo.EdbInfoId
+			mapItem.CreateTime = time.Now()
+			mapItem.ModifyTime = time.Now()
+			timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+
+			mapItem.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + fmt.Sprint(v.Source) + "_" + timestamp + "_" + strconv.Itoa(edbInfo.EdbInfoId))
+			mapItem.IsOrder = true
+			mapItem.IsAxis = 1
+			mapItem.EdbInfoType = 1
+			mapItem.Source = source
+			mapList = append(mapList, mapItem)
+		}
+
+		// 批量的关系图
+		multipleGraphConfigChartMapping := &data_manage.MultipleGraphConfigChartMapping{
+			//Id:                    0,
+			//MultipleGraphConfigId: 0,
+			//ChartInfoId:           0,
+			Source:     v.Source,
+			ModifyTime: time.Now(),
+			CreateTime: time.Now(),
+		}
+
+		batchAddChartList = append(batchAddChartList, line_equation.BatchAddChart{
+			ChartInfo:                       chartInfo,
+			EdbMappingList:                  mapList,
+			MultipleGraphConfigChartMapping: multipleGraphConfigChartMapping,
+		})
+	}
+
+	// 批量创建
+	err = line_equation.CreateLineEquationChartAndEdb(multipleGraphConfig, batchAddChartList)
+
+	// 更改es
+	for _, v := range batchAddChartList {
+		//添加es数据
+		go data.EsAddOrEditChartInfo(v.ChartInfo.ChartInfoId)
+	}
+
+	return
+}
 
 // BatchSaveChartInfo 批量添加编辑图表
-//func BatchSaveChartInfo(multipleGraphConfigId int, batchAddChartReq []request.AddChart, lineChartInfoConfig request.LineChartInfoReq, sysUser *system.Admin) (batchAddChartList []line_equation.BatchAddChart, err error, errMsg string, isSendEmail bool) {
-//	// 获取统一配置
-//	multipleGraphConfig, err := data_manage.GetMultipleGraphConfigById(multipleGraphConfigId)
-//	if err != nil {
-//		errMsg = `获取失败`
-//		err = errors.New(`获取配置失败,ERR:` + err.Error())
-//		return
-//	}
-//	// 获取已经关联的图表
-//	chartMappingList, err := data_manage.GetMultipleGraphConfigChartMappingListById(multipleGraphConfig.MultipleGraphConfigId)
-//	if err != nil {
-//		errMsg = `获取失败`
-//		err = errors.New(`获取关联图表配置失败,ERR:` + err.Error())
-//		return
-//	}
-//
-//	// 已经存在关联的图表map
-//	existSourceChartMap := make(map[int]*data_manage.MultipleGraphConfigChartMapping)
-//	// 已经存在的图表map
-//	existChartInfoMap := make(map[int]*data_manage.ChartInfo)
-//	for _, v := range chartMappingList {
-//		existSourceChartMap[v.Source] = v
-//
-//		chartInfo, tmpErr := data_manage.GetChartInfoById(v.ChartInfoId)
-//		if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
-//			err = tmpErr
-//			return
-//		}
-//		if chartInfo != nil {
-//			existChartInfoMap[v.Source] = chartInfo
-//		}
-//	}
-//
-//	source := utils.CHART_SOURCE_LINE_EQUATION
-//	// 获取需要
-//	for k, v := range batchAddChartReq {
-//		v.ChartName = strings.Trim(v.ChartName, " ")
-//		batchAddChartReq[k] = v
-//
-//		if v.ChartName == "" {
-//			errMsg = "请填写图表名称!"
-//			err = errors.New(errMsg)
-//			isSendEmail = false
-//			return
-//		}
-//		if v.ChartClassifyId <= 0 {
-//			errMsg = "请填写图表名称!"
-//			err = errors.New(errMsg)
-//			isSendEmail = false
-//			return
-//		}
-//
-//		chartClassify, tmpErr := data_manage.GetChartClassifyById(v.ChartClassifyId)
-//		if tmpErr != nil {
-//			if tmpErr.Error() == utils.ErrNoRow() {
-//				errMsg = "分类不存在"
-//				err = errors.New(errMsg)
-//				isSendEmail = false
-//				return
-//			}
-//			errMsg = "获取分类信息失败"
-//			err = errors.New("获取分类信息失败,Err:" + tmpErr.Error())
-//			return
-//		}
-//		if chartClassify == nil {
-//			errMsg = "分类不存在"
-//			err = errors.New(errMsg)
-//			isSendEmail = false
-//			return
-//		}
-//
-//		// 判断图表是否存在
-//		var condition string
-//		var pars []interface{}
-//		condition += " AND chart_name=? AND source = ? "
-//		pars = append(pars, v.ChartName, source)
-//
-//		// 已经创建了图表的类型
-//		if sourceChart, ok := existChartInfoMap[v.Source]; ok {
-//			condition += " AND chart_info_id != ?  "
-//			pars = append(pars, sourceChart.ChartInfoId)
-//		}
-//
-//		count, tmpErr := data_manage.GetChartInfoCountByCondition(condition, pars)
-//		if tmpErr != nil {
-//			errMsg = "判断图表名称是否存在失败"
-//			err = errors.New("判断图表名称是否存在失败,Err:" + tmpErr.Error())
-//			return
-//		}
-//
-//		if count > 0 {
-//			errMsg = "图表已存在,请重新填写"
-//			err = errors.New(errMsg)
-//			isSendEmail = false
-//			return
-//		}
-//	}
-//
-//	edbList, _, _, err, errMsg := getConfigData(lineChartInfoConfig)
-//
-//	var edbInfoIdArr []int
-//	for _, v := range edbList {
-//		edbInfoIdArr = append(edbInfoIdArr, v.EdbInfoId)
-//	}
-//	disableVal := data.CheckIsDisableChart(edbInfoIdArr)
-//
-//	sort.Ints(edbInfoIdArr)
-//	var edbInfoIdArrStr []string
-//	for _, v := range edbInfoIdArr {
-//		edbInfoIdArrStr = append(edbInfoIdArrStr, strconv.Itoa(v))
-//	}
-//	edbInfoIdStr := strings.Join(edbInfoIdArrStr, ",")
-//
-//	// 批量配置
-//	lineChartInfoConfigByte, err := json.Marshal(lineChartInfoConfig)
-//	if err != nil {
-//		return
-//	}
-//	multipleGraphConfig.Curve = string(lineChartInfoConfigByte)
-//	multipleGraphConfig.ModifyTime = time.Now()
-//	updateMultipleGraphConfigCols := []string{"Curve", "ModifyTime"}
-//	updateChartCols := []string{"ChartName", "DateType", "StartDate", "EndDate", "EdbInfoIds", "LeftMin", "LeftMax", "Disabled", "ExtraConfig"}
-//
-//	// 多图
-//	batchAddChartList = make([]line_equation.BatchAddChart, 0)
-//	for _, v := range batchAddChartReq {
-//		tmpLineChartInfoConfig := lineChartInfoConfig
-//		tmpLineChartInfoConfig.Source = v.Source
-//		tmpLineChartInfoConfigByte, tmpErr := json.Marshal(tmpLineChartInfoConfig)
-//		if tmpErr != nil {
-//			err = tmpErr
-//			return
-//		}
-//
-//		var multipleGraphConfigChartMapping *data_manage.MultipleGraphConfigChartMapping
-//		// 已经创建了图表的类型
-//		chartInfo, ok := existChartInfoMap[v.Source]
-//		if ok {
-//			chartInfo.ChartName = v.ChartName
-//			chartInfo.DateType = lineChartInfoConfig.DateType
-//			chartInfo.StartDate = lineChartInfoConfig.StartDate
-//			chartInfo.EndDate = lineChartInfoConfig.EndDate
-//			chartInfo.EdbInfoIds = edbInfoIdStr
-//			chartInfo.LeftMin = v.LeftMin
-//			chartInfo.LeftMax = v.LeftMax
-//			chartInfo.Disabled = disableVal
-//			chartInfo.ExtraConfig = string(tmpLineChartInfoConfigByte)
-//			//updateChartInfoList
-//
-//			tmpMultipleGraphConfigChartMapping, ok2 := existSourceChartMap[v.Source]
-//			if !ok2 {
-//				err = errors.New("找不到对应的统一配置关系")
-//				return
-//			}
-//			multipleGraphConfigChartMapping = tmpMultipleGraphConfigChartMapping
-//		} else {
-//			chartInfo = &data_manage.ChartInfo{
-//				ChartInfoId: 0,
-//				ChartName:   v.ChartName,
-//				//ChartNameEn:     v.ChartName,
-//				ChartClassifyId: v.ChartClassifyId,
-//				SysUserId:       sysUser.AdminId,
-//				SysUserRealName: sysUser.RealName,
-//				UniqueCode:      utils.MD5(utils.CHART_PREFIX + "_" + fmt.Sprint(v.Source) + "_" + strconv.FormatInt(time.Now().UnixNano(), 10)),
-//				CreateTime:      time.Now(),
-//				ModifyTime:      time.Now(),
-//				DateType:        lineChartInfoConfig.DateType,
-//				StartDate:       lineChartInfoConfig.StartDate,
-//				EndDate:         lineChartInfoConfig.EndDate,
-//				IsSetName:       0,
-//				EdbInfoIds:      edbInfoIdStr,
-//				ChartType:       1,
-//				Calendar:        "公历",
-//				SeasonStartDate: "",
-//				SeasonEndDate:   "",
-//				ChartImage:      "",
-//				Sort:            0,
-//				LeftMin:         v.LeftMin,
-//				LeftMax:         v.LeftMax,
-//				RightMin:        "",
-//				RightMax:        "",
-//				Disabled:        disableVal,
-//				BarConfig:       "",
-//				Source:          source,
-//				ExtraConfig:     string(tmpLineChartInfoConfigByte),
-//			}
-//
-//			// 批量配置的关系图
-//			if tmpMultipleGraphConfigChartMapping, ok2 := existSourceChartMap[v.Source]; ok2 {
-//				multipleGraphConfigChartMapping = tmpMultipleGraphConfigChartMapping
-//			} else {
-//				multipleGraphConfigChartMapping = &data_manage.MultipleGraphConfigChartMapping{
-//					//Id:                    0,
-//					//MultipleGraphConfigId: 0,
-//					//ChartInfoId:           0,
-//					Source:     v.Source,
-//					ModifyTime: time.Now(),
-//					CreateTime: time.Now(),
-//				}
-//			}
-//
-//		}
-//
-//		// 指标信息
-//		mapList := make([]*data_manage.ChartEdbMapping, 0)
-//		for _, edbInfo := range edbList {
-//			mapItem := new(data_manage.ChartEdbMapping)
-//			mapItem.EdbInfoId = edbInfo.EdbInfoId
-//			mapItem.CreateTime = time.Now()
-//			mapItem.ModifyTime = time.Now()
-//			timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
-//
-//			mapItem.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + fmt.Sprint(v.Source) + "_" + timestamp + "_" + strconv.Itoa(edbInfo.EdbInfoId))
-//			mapItem.IsOrder = true
-//			mapItem.IsAxis = 1
-//			mapItem.EdbInfoType = 1
-//			mapItem.Source = source
-//			mapList = append(mapList, mapItem)
-//		}
-//
-//		batchAddChartList = append(batchAddChartList, line_equation.BatchAddChart{
-//			ChartInfo:                       chartInfo,
-//			EdbMappingList:                  mapList,
-//			MultipleGraphConfigChartMapping: multipleGraphConfigChartMapping,
-//		})
-//	}
-//
-//	// 批量创建
-//	err = line_equation.CreateAndEditLineEquationChartAndEdb(multipleGraphConfig, batchAddChartList, updateMultipleGraphConfigCols, updateChartCols)
-//
-//	// 更改es
-//	for _, v := range batchAddChartList {
-//		//添加es数据
-//		go data.EsAddOrEditChartInfo(v.ChartInfo.ChartInfoId)
-//	}
-//	return
-//}
+func BatchSaveChartInfo(multipleGraphConfigId int, batchAddChartReq []request.AddChart, lineChartInfoConfig request.LineChartInfoReq, sysUser *system.Admin) (batchAddChartList []line_equation.BatchAddChart, err error, errMsg string, isSendEmail bool) {
+	// 获取统一配置
+	multipleGraphConfig, err := data_manage.GetMultipleGraphConfigById(multipleGraphConfigId)
+	if err != nil {
+		errMsg = `获取失败`
+		err = errors.New(`获取配置失败,ERR:` + err.Error())
+		return
+	}
+	// 获取已经关联的图表
+	chartMappingList, err := data_manage.GetMultipleGraphConfigChartMappingListById(multipleGraphConfig.MultipleGraphConfigId)
+	if err != nil {
+		errMsg = `获取失败`
+		err = errors.New(`获取关联图表配置失败,ERR:` + err.Error())
+		return
+	}
+
+	// 已经存在关联的图表map
+	existSourceChartMap := make(map[int]*data_manage.MultipleGraphConfigChartMapping)
+	// 已经存在的图表map
+	existChartInfoMap := make(map[int]*data_manage.ChartInfo)
+	for _, v := range chartMappingList {
+		existSourceChartMap[v.Source] = v
+
+		chartInfo, tmpErr := data_manage.GetChartInfoById(v.ChartInfoId)
+		if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+			err = tmpErr
+			return
+		}
+		if chartInfo != nil {
+			existChartInfoMap[v.Source] = chartInfo
+		}
+	}
+
+	source := utils.CHART_SOURCE_LINE_EQUATION
+	// 获取需要
+	for k, v := range batchAddChartReq {
+		v.ChartName = strings.Trim(v.ChartName, " ")
+		batchAddChartReq[k] = v
+
+		if v.ChartName == "" {
+			errMsg = "请填写图表名称!"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
+		if v.ChartClassifyId <= 0 {
+			errMsg = "请填写图表名称!"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
+
+		chartClassify, tmpErr := data_manage.GetChartClassifyById(v.ChartClassifyId)
+		if tmpErr != nil {
+			if tmpErr.Error() == utils.ErrNoRow() {
+				errMsg = "分类不存在"
+				err = errors.New(errMsg)
+				isSendEmail = false
+				return
+			}
+			errMsg = "获取分类信息失败"
+			err = errors.New("获取分类信息失败,Err:" + tmpErr.Error())
+			return
+		}
+		if chartClassify == nil {
+			errMsg = "分类不存在"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
+
+		// 判断图表是否存在
+		var condition string
+		var pars []interface{}
+		condition += " AND chart_name=? AND source = ? "
+		pars = append(pars, v.ChartName, source)
+
+		// 已经创建了图表的类型
+		if sourceChart, ok := existChartInfoMap[v.Source]; ok {
+			condition += " AND chart_info_id != ?  "
+			pars = append(pars, sourceChart.ChartInfoId)
+		}
+
+		count, tmpErr := data_manage.GetChartInfoCountByCondition(condition, pars)
+		if tmpErr != nil {
+			errMsg = "判断图表名称是否存在失败"
+			err = errors.New("判断图表名称是否存在失败,Err:" + tmpErr.Error())
+			return
+		}
+
+		if count > 0 {
+			errMsg = "图表已存在,请重新填写"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
+	}
+
+	edbList, _, _, err, errMsg := getConfigData(lineChartInfoConfig)
+
+	var edbInfoIdArr []int
+	for _, v := range edbList {
+		edbInfoIdArr = append(edbInfoIdArr, v.EdbInfoId)
+	}
+	disableVal := data.CheckIsDisableChart(edbInfoIdArr)
+
+	sort.Ints(edbInfoIdArr)
+	var edbInfoIdArrStr []string
+	for _, v := range edbInfoIdArr {
+		edbInfoIdArrStr = append(edbInfoIdArrStr, strconv.Itoa(v))
+	}
+	edbInfoIdStr := strings.Join(edbInfoIdArrStr, ",")
+
+	// 批量配置
+	lineChartInfoConfigByte, err := json.Marshal(lineChartInfoConfig)
+	if err != nil {
+		return
+	}
+	multipleGraphConfig.Curve = string(lineChartInfoConfigByte)
+	multipleGraphConfig.ModifyTime = time.Now()
+	updateMultipleGraphConfigCols := []string{"Curve", "ModifyTime"}
+	updateChartCols := []string{"ChartName", "DateType", "StartDate", "EndDate", "EdbInfoIds", "LeftMin", "LeftMax", "Disabled", "ExtraConfig"}
+
+	// 多图
+	batchAddChartList = make([]line_equation.BatchAddChart, 0)
+	for _, v := range batchAddChartReq {
+		tmpLineChartInfoConfig := lineChartInfoConfig
+		tmpLineChartInfoConfig.Source = v.Source
+		tmpLineChartInfoConfigByte, tmpErr := json.Marshal(tmpLineChartInfoConfig)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+
+		var multipleGraphConfigChartMapping *data_manage.MultipleGraphConfigChartMapping
+		// 已经创建了图表的类型
+		chartInfo, ok := existChartInfoMap[v.Source]
+		if ok {
+			chartInfo.ChartName = v.ChartName
+			chartInfo.DateType = lineChartInfoConfig.DateType
+			chartInfo.StartDate = lineChartInfoConfig.StartDate
+			chartInfo.EndDate = lineChartInfoConfig.EndDate
+			chartInfo.EdbInfoIds = edbInfoIdStr
+			chartInfo.LeftMin = v.LeftMin
+			chartInfo.LeftMax = v.LeftMax
+			chartInfo.Disabled = disableVal
+			chartInfo.ExtraConfig = string(tmpLineChartInfoConfigByte)
+			//updateChartInfoList
+
+			tmpMultipleGraphConfigChartMapping, ok2 := existSourceChartMap[v.Source]
+			if !ok2 {
+				err = errors.New("找不到对应的统一配置关系")
+				return
+			}
+			multipleGraphConfigChartMapping = tmpMultipleGraphConfigChartMapping
+		} else {
+			chartInfo = &data_manage.ChartInfo{
+				ChartInfoId: 0,
+				ChartName:   v.ChartName,
+				//ChartNameEn:     v.ChartName,
+				ChartClassifyId: v.ChartClassifyId,
+				SysUserId:       sysUser.AdminId,
+				SysUserRealName: sysUser.RealName,
+				UniqueCode:      utils.MD5(utils.CHART_PREFIX + "_" + fmt.Sprint(v.Source) + "_" + strconv.FormatInt(time.Now().UnixNano(), 10)),
+				CreateTime:      time.Now(),
+				ModifyTime:      time.Now(),
+				DateType:        lineChartInfoConfig.DateType,
+				StartDate:       lineChartInfoConfig.StartDate,
+				EndDate:         lineChartInfoConfig.EndDate,
+				IsSetName:       0,
+				EdbInfoIds:      edbInfoIdStr,
+				ChartType:       1,
+				Calendar:        "公历",
+				SeasonStartDate: "",
+				SeasonEndDate:   "",
+				ChartImage:      "",
+				Sort:            0,
+				LeftMin:         v.LeftMin,
+				LeftMax:         v.LeftMax,
+				RightMin:        "",
+				RightMax:        "",
+				Disabled:        disableVal,
+				BarConfig:       "",
+				Source:          source,
+				ExtraConfig:     string(tmpLineChartInfoConfigByte),
+			}
+
+			// 批量配置的关系图
+			if tmpMultipleGraphConfigChartMapping, ok2 := existSourceChartMap[v.Source]; ok2 {
+				multipleGraphConfigChartMapping = tmpMultipleGraphConfigChartMapping
+			} else {
+				multipleGraphConfigChartMapping = &data_manage.MultipleGraphConfigChartMapping{
+					//Id:                    0,
+					//MultipleGraphConfigId: 0,
+					//ChartInfoId:           0,
+					Source:     v.Source,
+					ModifyTime: time.Now(),
+					CreateTime: time.Now(),
+				}
+			}
+
+		}
+
+		// 指标信息
+		mapList := make([]*data_manage.ChartEdbMapping, 0)
+		for _, edbInfo := range edbList {
+			mapItem := new(data_manage.ChartEdbMapping)
+			mapItem.EdbInfoId = edbInfo.EdbInfoId
+			mapItem.CreateTime = time.Now()
+			mapItem.ModifyTime = time.Now()
+			timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+
+			mapItem.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + fmt.Sprint(v.Source) + "_" + timestamp + "_" + strconv.Itoa(edbInfo.EdbInfoId))
+			mapItem.IsOrder = true
+			mapItem.IsAxis = 1
+			mapItem.EdbInfoType = 1
+			mapItem.Source = source
+			mapList = append(mapList, mapItem)
+		}
+
+		batchAddChartList = append(batchAddChartList, line_equation.BatchAddChart{
+			ChartInfo:                       chartInfo,
+			EdbMappingList:                  mapList,
+			MultipleGraphConfigChartMapping: multipleGraphConfigChartMapping,
+		})
+	}
+
+	// 批量创建
+	err = line_equation.CreateAndEditLineEquationChartAndEdb(multipleGraphConfig, batchAddChartList, updateMultipleGraphConfigCols, updateChartCols)
+
+	// 更改es
+	for _, v := range batchAddChartList {
+		//添加es数据
+		go data.EsAddOrEditChartInfo(v.ChartInfo.ChartInfoId)
+	}
+	return
+}

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

@@ -4,9 +4,13 @@ import (
 	"errors"
 	"github.com/shopspring/decimal"
 	"hongze/hongze_ETA_mobile_api/models/data_manage"
+	"hongze/hongze_ETA_mobile_api/models/data_manage/line_feature"
 	"hongze/hongze_ETA_mobile_api/models/data_manage/line_feature/response"
+	"hongze/hongze_ETA_mobile_api/models/system"
 	"hongze/hongze_ETA_mobile_api/services/data"
 	"hongze/hongze_ETA_mobile_api/utils"
+	"strconv"
+	"strings"
 	"time"
 )
 
@@ -188,6 +192,7 @@ func GetFrequencyDistributionData(chartInfoId int, mappingInfo *data_manage.Char
 		err = errors.New("指标异常")
 		return
 	}
+
 	startDateTime, _ := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
 	var endDateTime time.Time
 	if endDate != `` {
@@ -347,3 +352,283 @@ func GetFrequencyDistributionData(chartInfoId int, mappingInfo *data_manage.Char
 	}
 	return
 }
+
+// AddChartInfo 添加图表
+func AddChartInfo(req data_manage.AddChartInfoReq, edbInfoMapping *data_manage.ChartEdbInfoMapping, source int, sysUser *system.Admin) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
+	isSendEmail = true
+
+	req.ChartName = strings.Trim(req.ChartName, " ")
+	if req.ChartName == "" {
+		errMsg = "请填写图表名称!"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+	if req.ChartClassifyId <= 0 {
+		errMsg = "分类参数错误!"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+
+	chartClassify, err := data_manage.GetChartClassifyById(req.ChartClassifyId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			errMsg = "分类不存在"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
+		errMsg = "获取分类信息失败"
+		err = errors.New("获取分类信息失败,Err:" + err.Error())
+		return
+	}
+	if chartClassify == nil {
+		errMsg = "分类不存在"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+
+	edbInfoIdArr := []int{edbInfoMapping.EdbInfoId}
+	var edbInfoIdArrStr []string
+	for _, v := range edbInfoIdArr {
+		edbInfoIdArrStr = append(edbInfoIdArrStr, strconv.Itoa(v))
+	}
+	edbInfoIdStr := strings.Join(edbInfoIdArrStr, ",")
+	var chartInfoId int
+	// 判断图表是否存在
+	var condition string
+	var pars []interface{}
+	condition += " AND chart_name=? AND source = ? "
+	pars = append(pars, req.ChartName, source)
+	count, err := data_manage.GetChartInfoCountByCondition(condition, pars)
+	if err != nil {
+		errMsg = "判断图表名称是否存在失败"
+		err = errors.New("判断图表名称是否存在失败,Err:" + err.Error())
+		return
+	}
+
+	if count > 0 {
+		errMsg = "图表已存在,请重新填写"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+
+	disableVal := data.CheckIsDisableChart(edbInfoIdArr)
+
+	chartInfo = new(data_manage.ChartInfo)
+	chartInfo.ChartName = req.ChartName
+	chartInfo.EdbInfoIds = edbInfoIdStr
+	chartInfo.ChartClassifyId = req.ChartClassifyId
+	chartInfo.SysUserId = sysUser.AdminId
+	chartInfo.SysUserRealName = sysUser.RealName
+	chartInfo.CreateTime = time.Now()
+	chartInfo.ModifyTime = time.Now()
+	chartInfo.IsSetName = 0
+	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+	chartInfo.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp)
+	chartInfo.ChartType = 9 // 相关性图
+	chartInfo.Calendar = "公历"
+	chartInfo.DateType = 6
+	chartInfo.StartDate = req.StartDate
+	chartInfo.EndDate = req.EndDate
+	chartInfo.SeasonStartDate = req.SeasonStartDate
+	chartInfo.SeasonEndDate = req.SeasonEndDate
+	chartInfo.ChartImage = req.ChartImage
+	chartInfo.LeftMin = req.LeftMin
+	chartInfo.LeftMax = req.LeftMax
+	chartInfo.RightMin = req.RightMin
+	chartInfo.RightMax = req.RightMax
+	chartInfo.Disabled = disableVal
+	chartInfo.Source = source
+	chartInfo.ExtraConfig = req.ExtraConfig
+
+	// 指标信息
+	mapList := make([]*data_manage.ChartEdbMapping, 0)
+	{
+		mapItem := new(data_manage.ChartEdbMapping)
+		mapItem.EdbInfoId = edbInfoMapping.EdbInfoId
+		mapItem.CreateTime = time.Now()
+		mapItem.ModifyTime = time.Now()
+		mapItem.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + strconv.FormatInt(time.Now().UnixNano(), 10) + "_" + strconv.Itoa(edbInfoMapping.EdbInfoId))
+		mapItem.IsOrder = true
+		mapItem.IsAxis = 1
+		mapItem.EdbInfoType = 1
+		mapItem.Source = utils.CHART_SOURCE_CORRELATION
+		mapList = append(mapList, mapItem)
+	}
+
+	// 新增图表和指标mapping
+	chartInfoId, e := line_feature.CreateLineFeatureChartAndEdb(chartInfo, mapList)
+	if e != nil {
+		errMsg = "操作失败"
+		err = errors.New("新增相关性图表失败, Err: " + e.Error())
+		return
+	}
+
+	//添加es数据
+	go data.EsAddOrEditChartInfo(chartInfoId)
+
+	return
+}
+
+// EditChartInfo 编辑图表
+func EditChartInfo(req data_manage.EditChartInfoReq, edbInfoMapping *data_manage.ChartEdbInfoMapping, sysUser *system.Admin) (chartItem *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
+	isSendEmail = true
+
+	chartItem, err = data_manage.GetChartInfoById(req.ChartInfoId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			errMsg = "图表已被删除,请刷新页面"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
+		errMsg = "获取图表信息失败"
+		err = errors.New("获取图表信息失败,Err:" + err.Error())
+		return
+	}
+
+	if !utils.InArrayByInt([]int{utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION, utils.CHART_SOURCE_LINE_FEATURE_PERCENTILE, utils.CHART_SOURCE_LINE_FEATURE_FREQUENCY}, chartItem.Source) {
+		errMsg = "该图不是统计分析图表!"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+
+	req.ChartName = strings.Trim(req.ChartName, " ")
+	if req.ChartClassifyId <= 0 {
+		errMsg = "分类参数错误!"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+	chartClassify, err := data_manage.GetChartClassifyById(req.ChartClassifyId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			errMsg = "分类不存在"
+			err = errors.New(errMsg)
+			isSendEmail = false
+			return
+		}
+		errMsg = "获取分类信息失败"
+		err = errors.New("获取分类信息失败,Err:" + err.Error())
+		return
+	}
+	if chartClassify == nil {
+		errMsg = "分类不存在"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+
+	// 图表操作权限
+	ok := data.CheckOpChartPermission(sysUser, chartItem.SysUserId)
+	if !ok {
+		errMsg = "没有该图表的操作权限"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+
+	edbInfoIdArr := []int{edbInfoMapping.EdbInfoId}
+	var edbInfoIdArrStr []string
+	for _, v := range edbInfoIdArr {
+		edbInfoIdArrStr = append(edbInfoIdArrStr, strconv.Itoa(v))
+	}
+	edbInfoIdStr := strings.Join(edbInfoIdArrStr, ",")
+
+	//判断图表是否存在
+	var condition string
+	var pars []interface{}
+	condition += " AND chart_info_id <> ? "
+	pars = append(pars, req.ChartInfoId)
+	condition += " AND chart_name=? AND source = ? "
+	pars = append(pars, req.ChartName, chartItem.Source)
+	count, err := data_manage.GetChartInfoCountByCondition(condition, pars)
+	if err != nil {
+		errMsg = "判断图表名称是否存在失败"
+		err = errors.New("判断图表名称是否存在失败,Err:" + err.Error())
+		return
+	}
+	if count > 0 {
+		errMsg = "图表已存在,请重新填写"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+
+	// 图表启用与否
+	disableVal := data.CheckIsDisableChart(edbInfoIdArr)
+
+	// 修改图表与指标mapping
+	err = line_feature.EditLineFeatureChartAndMapping(&req, edbInfoIdStr, "公历", 6, disableVal, req.ExtraConfig)
+	if err != nil {
+		errMsg = "保存失败"
+		err = errors.New("保存失败,Err:" + err.Error())
+		return
+	}
+
+	resp := new(data_manage.AddChartInfoResp)
+	resp.ChartInfoId = chartItem.ChartInfoId
+	resp.UniqueCode = chartItem.UniqueCode
+	resp.ChartType = req.ChartType
+
+	//添加es数据
+	go data.EsAddOrEditChartInfo(chartItem.ChartInfoId)
+	//修改my eta es数据
+	go data.EsAddOrEditMyChartInfoByChartInfoId(chartItem.ChartInfoId)
+
+	return
+}
+
+// CopyChartInfo 复制图表
+func CopyChartInfo(configId, configSource, classifyId int, chartName string, edbInfoMapping *data_manage.ChartEdbInfoMapping, oldChartInfo *data_manage.ChartInfo, sysUser *system.Admin) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
+	isSendEmail = true
+
+	multipleGraphConfig, err := data_manage.GetMultipleGraphConfigById(configId)
+	if err != nil {
+		return
+	}
+	multipleGraphConfig.MultipleGraphConfigId = 0
+	err = data_manage.AddMultipleGraphConfig(multipleGraphConfig)
+	if err != nil {
+		return
+	}
+
+	// 添加图
+	addChartReq := data_manage.AddChartInfoReq{
+		ChartClassifyId: classifyId,
+		ChartName:       chartName,
+		ChartType:       utils.CHART_TYPE_CURVE,
+		Calendar:        "公历",
+		ExtraConfig:     oldChartInfo.ExtraConfig,
+		ChartImage:      oldChartInfo.ChartImage,
+	}
+	chartSource := oldChartInfo.Source // 默认是相关性图
+	chartInfo, err, errMsg, isSendEmail = AddChartInfo(addChartReq, edbInfoMapping, chartSource, sysUser)
+	if err != nil {
+		return
+	}
+
+	// 添加关系
+	multipleGraphConfigChartMapping := &data_manage.MultipleGraphConfigChartMapping{
+		//Id:                    0,
+		MultipleGraphConfigId: multipleGraphConfig.MultipleGraphConfigId,
+		ChartInfoId:           chartInfo.ChartInfoId,
+		Source:                configSource,
+		ModifyTime:            time.Now(),
+		CreateTime:            time.Now(),
+	}
+	err = data_manage.AddMultipleGraphConfigChartMapping(multipleGraphConfigChartMapping)
+	if err != nil {
+		return
+	}
+
+	//添加es数据
+	go data.EsAddOrEditChartInfo(chartInfo.ChartInfoId)
+
+	return
+}

+ 296 - 3
utils/common.go

@@ -635,6 +635,17 @@ func TrimStr(str string) (str2 string) {
 	return strings.Replace(str, " ", "", -1)
 }
 
+// TrimLRStr 移除字符串前后的空格
+func TrimLRStr(str string) (str2 string) {
+	if str == "" {
+		return str
+	}
+	str2 = strings.TrimLeft(str, " ")
+	str2 = strings.TrimRight(str2, " ")
+
+	return
+}
+
 // 字符串转换为time
 func StrTimeToTime(strTime string) time.Time {
 	timeLayout := "2006-01-02 15:04:05"  //转化所需模板
@@ -695,7 +706,11 @@ func TimeRemoveHms(strTime string) string {
 	year := resultTime.Year()
 	month := resultTime.Format("01")
 	day1 := resultTime.Day()
-	Ymd = strconv.Itoa(year) + "." + month + "." + strconv.Itoa(day1)
+	if day1 < 10 {
+		Ymd = strconv.Itoa(year) + "." + month + ".0" + strconv.Itoa(day1)
+	} else {
+		Ymd = strconv.Itoa(year) + "." + month + "." + strconv.Itoa(day1)
+	}
 	return Ymd
 }
 
@@ -706,7 +721,11 @@ func TimeRemoveHms2(strTime string) string {
 	year := resultTime.Year()
 	month := resultTime.Format("01")
 	day1 := resultTime.Day()
-	Ymd = strconv.Itoa(year) + "-" + month + "-" + strconv.Itoa(day1)
+	if day1 < 10 {
+		Ymd = strconv.Itoa(year) + "-" + month + "-0" + strconv.Itoa(day1)
+	} else {
+		Ymd = strconv.Itoa(year) + "-" + month + "-" + strconv.Itoa(day1)
+	}
 	return Ymd
 }
 
@@ -1329,7 +1348,7 @@ func StrDateToDate(strTime string) time.Time {
 	return resultTime
 }
 
-// GetTimeSubDay 计算两个时间的自然日期差
+// GetTimeSubDay 计算两个时间的自然日期差(后面减去前面)
 func GetTimeSubDay(t1, t2 time.Time) int {
 	var day int
 	swap := false
@@ -1389,6 +1408,25 @@ func MinusInt(a []int, b []int) []int {
 	return diff
 }
 
+// IntersectInt 获取两个[]int交集
+func IntersectInt(nums1 []int, nums2 []int) []int {
+	m := make(map[int]int)
+	var res []int
+
+	for _, num := range nums1 {
+		m[num]++
+	}
+
+	for _, num := range nums2 {
+		if m[num] > 0 {
+			res = append(res, num)
+			m[num]--
+		}
+	}
+
+	return res
+}
+
 // MapSorter 对于map 排序
 type MapSorter []Item
 
@@ -1476,6 +1514,112 @@ func GetDaysBetween2Date(format, date1Str, date2Str string) (int, error) {
 	return int(date1.Sub(date2).Hours() / 24), nil
 }
 
+// GetFrequencyEn 获取频度的英文版
+func GetFrequencyEn(frequency string) (frequencyEn string) {
+	switch frequency {
+	case "日度":
+		frequencyEn = "day"
+		return
+	case "周度":
+		frequencyEn = "week"
+		return
+	case "旬度":
+		frequencyEn = "ten days"
+		return
+	case "月度":
+		frequencyEn = "month"
+		return
+	case "季度":
+		frequencyEn = "quarter"
+		return
+	case "年度":
+		frequencyEn = "year"
+		return
+	}
+	return
+}
+
+// GetLeadUnitEn 获取移动单位的英文版
+func GetLeadUnitEn(unit string) (unitEn string) {
+	switch unit {
+	case "天":
+		unitEn = "day"
+		return
+	case "周":
+		unitEn = "week"
+		return
+	case "月":
+		unitEn = "month"
+		return
+	case "季":
+		unitEn = "quarter"
+		return
+	case "年":
+		unitEn = "year"
+		return
+	}
+	return
+}
+
+// GetDateByDateType 通过dateType获取需要的开始/结束日期
+func GetDateByDateType(dateType int, tmpStartDate, tmpEndDate string) (startDate, endDate string) {
+	startDate = tmpStartDate
+	endDate = tmpEndDate
+	switch dateType {
+	case 1:
+		startDate = "2000-01-01"
+		endDate = ""
+	case 2:
+		startDate = "2010-01-01"
+		endDate = ""
+	case 3:
+		startDate = "2015-01-01"
+		endDate = ""
+	case 4:
+		//startDate = strconv.Itoa(time.Now().Year()) + "-01-01"
+		startDate = "2021-01-01"
+		endDate = ""
+	case 5:
+		//startDate = startDate + "-01"
+		//endDate = endDate + "-01"
+	case 6:
+		//startDate = startDate + "-01"
+		endDate = ""
+	case 7:
+		startDate = "2018-01-01"
+		endDate = ""
+	case 8:
+		startDate = "2019-01-01"
+		endDate = ""
+	case 9:
+		startDate = "2020-01-01"
+		endDate = ""
+	case 11:
+		startDate = "2022-01-01"
+		endDate = ""
+	}
+
+	// 兼容日期错误
+	{
+		if strings.Count(startDate, "-") == 1 {
+			startDate = startDate + "-01"
+		}
+		if strings.Count(endDate, "-") == 1 {
+			endDate = endDate + "-01"
+		}
+	}
+
+	return
+}
+
+func TimeTransferString(format string, t time.Time) string {
+	str := t.Format(format)
+	if t.IsZero() {
+		return ""
+	}
+	return str
+}
+
 // GetDateByDateType2 通过dateType获取需要的开始/结束日期(日期类型:1:最近3月;2:最近6月;3:最近1年;4:最近2年;5:最近3年;6:最近5年;7:最近10年,8:自定义时间)
 func GetDateByDateType2(dateType int, currDate time.Time) (startDate time.Time) {
 	switch dateType {
@@ -1682,3 +1826,152 @@ func removeDecimalPoint(str string) string {
 	str = str[strings.Index(str, ".")+1:]
 	return str
 }
+
+// GetPredictEdbDayListByEndDate 根据截止日期获取预测指标日期列表
+func GetPredictEdbDayListByEndDate(startDate, endDate time.Time, frequency string) (dayList []time.Time) {
+	//if !utils.InArrayByStr([]string{"日度", "周度", "月度"}, frequency)
+	switch frequency {
+	case "日度":
+		for currDate := startDate.AddDate(0, 0, 1); currDate.Before(endDate) || currDate.Equal(endDate); currDate = currDate.AddDate(0, 0, 1) {
+			//周六、日排除
+			if currDate.Weekday() == time.Sunday || currDate.Weekday() == time.Saturday {
+				continue
+			}
+			dayList = append(dayList, currDate)
+		}
+	case "周度":
+		//nextDate := startDate.AddDate(0, 0, 7)
+		for currDate := startDate.AddDate(0, 0, 7); currDate.Before(endDate) || currDate.Equal(endDate); currDate = currDate.AddDate(0, 0, 7) {
+			dayList = append(dayList, currDate)
+		}
+	case "旬度":
+		for currDate := startDate.AddDate(0, 0, 1); currDate.Before(endDate) || currDate.Equal(endDate); {
+			nextDate := currDate.AddDate(0, 0, 1)
+			//每个月的10号、20号、最后一天,那么就写入
+			if nextDate.Day() == 11 || nextDate.Day() == 21 || nextDate.Day() == 1 {
+				dayList = append(dayList, currDate)
+			}
+			currDate = nextDate
+		}
+	case "月度":
+		for currDate := startDate; currDate.Before(endDate) || currDate.Equal(endDate); {
+			currDate = time.Date(currDate.Year(), currDate.Month(), 1, 0, 0, 0, 0, time.Now().Location()).AddDate(0, 1, -1)
+			if !currDate.After(endDate) && !currDate.Equal(startDate) {
+				dayList = append(dayList, currDate)
+			}
+			currDate = currDate.AddDate(0, 0, 1)
+		}
+	case "季度":
+		for currDate := startDate; currDate.Before(endDate) || currDate.Equal(endDate); {
+			// 每月的最后一天
+			currDate = time.Date(currDate.Year(), currDate.Month(), 1, 0, 0, 0, 0, time.Now().Location()).AddDate(0, 1, -1)
+			if !currDate.After(endDate) && !currDate.Equal(startDate) {
+				// 季度日期就写入,否则不写入
+				if currDate.Month() == 3 || currDate.Month() == 6 || currDate.Month() == 9 || currDate.Month() == 12 {
+					dayList = append(dayList, currDate)
+				}
+			}
+			currDate = currDate.AddDate(0, 0, 1)
+		}
+	case "半年度":
+		for currDate := startDate; currDate.Before(endDate) || currDate.Equal(endDate); {
+			// 每月的最后一天
+			currDate = time.Date(currDate.Year(), currDate.Month(), 1, 0, 0, 0, 0, time.Now().Location()).AddDate(0, 1, -1)
+			if !currDate.After(endDate) && !currDate.Equal(startDate) {
+				// 半年度日期就写入,否则不写入
+				if currDate.Month() == 6 || currDate.Month() == 12 {
+					dayList = append(dayList, currDate)
+				}
+			}
+			currDate = currDate.AddDate(0, 0, 1)
+		}
+	case "年度":
+		for currDate := startDate; currDate.Before(endDate) || currDate.Equal(endDate); {
+			currDate = time.Date(currDate.Year()+1, 12, 31, 0, 0, 0, 0, time.Now().Location())
+			if !currDate.After(endDate) && !currDate.Equal(startDate) {
+				dayList = append(dayList, currDate)
+			}
+		}
+	}
+	return
+}
+
+// GetPredictEdbDayListByNum 根据期数获取预测指标日期列表
+func GetPredictEdbDayListByNum(startDate time.Time, num int, frequency string) (dayList []time.Time) {
+	switch frequency {
+	case "日度":
+		for i := 1; i <= num; {
+			currDate := startDate.AddDate(0, 0, i)
+			//周六、日排除
+			if currDate.Weekday() == time.Sunday || currDate.Weekday() == time.Saturday {
+				continue
+			}
+			dayList = append(dayList, currDate)
+			i++
+		}
+	case "周度":
+		for i := 1; i <= num; {
+			dayList = append(dayList, startDate.AddDate(0, 0, i*7))
+			i++
+		}
+	case "旬度":
+		currDate := startDate
+		for i := 1; i <= num; {
+			nextDate := currDate.AddDate(0, 0, 1)
+			//每个月的10号、20号、最后一天,那么就写入
+			if nextDate.Day() == 11 || nextDate.Day() == 21 || nextDate.Day() == 1 {
+				dayList = append(dayList, currDate)
+				i++
+			}
+			currDate = nextDate
+		}
+	case "月度":
+		currDate := startDate
+		for i := 1; i <= num; {
+			currDate = time.Date(currDate.Year(), currDate.Month(), 1, 0, 0, 0, 0, time.Now().Location()).AddDate(0, 1, -1)
+			if !currDate.Equal(startDate) {
+				dayList = append(dayList, currDate)
+				i++
+			}
+			currDate = currDate.AddDate(0, 0, 1)
+		}
+	case "季度":
+		currDate := startDate
+		for i := 1; i <= num; {
+			// 每月的最后一天
+			currDate = time.Date(currDate.Year(), currDate.Month(), 1, 0, 0, 0, 0, time.Now().Location()).AddDate(0, 1, -1)
+			if !currDate.Equal(startDate) {
+				// 季度日期就写入,否则不写入
+				if currDate.Month() == 3 || currDate.Month() == 6 || currDate.Month() == 9 || currDate.Month() == 12 {
+					dayList = append(dayList, currDate)
+					i++
+				}
+			}
+			currDate = currDate.AddDate(0, 0, 1)
+		}
+	case "半年度":
+		currDate := startDate
+		for i := 1; i <= num; {
+			// 每月的最后一天
+			currDate = time.Date(currDate.Year(), currDate.Month(), 1, 0, 0, 0, 0, time.Now().Location()).AddDate(0, 1, -1)
+			if !currDate.Equal(startDate) {
+				// 半年度日期就写入,否则不写入
+				if currDate.Month() == 6 || currDate.Month() == 12 {
+					dayList = append(dayList, currDate)
+					i++
+				}
+			}
+			currDate = currDate.AddDate(0, 0, 1)
+		}
+	case "年度":
+		currDate := startDate
+		for i := 1; i <= num; {
+			currDate = time.Date(currDate.Year()+1, 12, 31, 0, 0, 0, 0, time.Now().Location())
+			if !currDate.Equal(startDate) {
+				dayList = append(dayList, currDate)
+				i++
+			}
+		}
+	}
+	return
+}

Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott