Browse Source

Merge branch 'dev/1.6' into debug

hsun 1 year ago
parent
commit
cf0f37870d

+ 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

@@ -545,13 +545,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)
 				}
 			}
 		}
@@ -571,7 +571,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()

+ 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

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

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

@@ -1310,6 +1310,113 @@ func (this *LineEquationChartInfoController) Refresh() {
 	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 *LineEquationChartInfoController) 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 oldChartInfo.Source != utils.CHART_SOURCE_LINE_EQUATION {
+		br.Msg = `错误的图表类型`
+		br.IsSendEmail = false
+		return
+	}
+
+	var lineChartInfoConf request.LineChartInfoReq
+	err = json.Unmarshal([]byte(oldChartInfo.ExtraConfig), &lineChartInfoConf)
+	addChartList := make([]request.AddChart, 0)
+	addChartList = append(addChartList, request.AddChart{
+		Source:          lineChartInfoConf.Source,
+		ChartClassifyId: req.ChartClassifyId,
+		ChartName:       req.ChartName,
+		LeftMin:         oldChartInfo.LeftMin,
+		LeftMax:         oldChartInfo.LeftMax,
+		ChartImage:      oldChartInfo.ChartImage,
+	})
+
+	resp := new(data_manage.AddChartInfoResp)
+	batchAddChartList, err, errMsg, isSendEmail := line_equation.BatchAddChartInfo(addChartList, lineChartInfoConf, sysUser)
+	if err != nil {
+		br.Msg = "保存失败"
+		if errMsg != `` {
+			br.Msg = errMsg
+		}
+		br.ErrMsg = err.Error()
+		br.IsSendEmail = isSendEmail
+		return
+	}
+
+	resp.ChartInfoId = batchAddChartList[0].ChartInfo.ChartInfoId
+	resp.UniqueCode = batchAddChartList[0].ChartInfo.UniqueCode
+	resp.ChartType = batchAddChartList[0].ChartInfo.ChartType
+	//新增操作日志
+	{
+		for _, v := range batchAddChartList {
+			chartInfo := v.ChartInfo
+			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
+}
+
 // GetChartInfoDetailFromUniqueCode 根据编码获取图表详情
 func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCache bool, sysUser *system.Admin) (resp *data_manage.ChartInfoDetailFromUniqueCodeResp, isOk bool, msg, errMsg string) {
 	resp = new(data_manage.ChartInfoDetailFromUniqueCodeResp)

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

@@ -2,12 +2,14 @@ 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"
@@ -79,6 +81,124 @@ func (this *LineFeaturesChartInfoController) Refresh() {
 	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 编辑图表英文信息接口

+ 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
 }
 
@@ -492,6 +502,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:"-"`
 	Unit           string          `description:"中文单位名称"`
@@ -1005,6 +1017,7 @@ type AddChartInfoReq struct {
 	BarChartInfo         BarChartInfoReq         `description:"柱方图的配置"`
 	CorrelationChartInfo CorrelationChartInfoReq `description:"相关性图表配置"`
 	ExtraConfig          string                  `description:"图表额外配置信息,json字符串"`
+	ChartImage           string                  `description:"封面图" json:"-"`
 }
 
 type AddChartInfoResp struct {
@@ -1196,13 +1209,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
 }
 
@@ -1426,6 +1443,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:"指标信息"`
@@ -1696,6 +1714,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"`

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

+ 36 - 0
routers/commentsRouter.go

@@ -97,6 +97,24 @@ 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",
@@ -124,6 +142,24 @@ func init() {
             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",

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

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