Browse Source

fix:修改图表

Roc 2 years ago
parent
commit
19a5156eee

+ 83 - 22
controller/chart/chart_info.go

@@ -526,7 +526,7 @@ func EditChartInfo(c *gin.Context) {
 		return
 	}
 
-	if req.ChartInfoId > 0 && len(req.ChartEdbInfoList) <= 0 {
+	if req.ChartInfoId <= 0 {
 		response.Fail("参数异常", c)
 		return
 	}
@@ -553,36 +553,97 @@ func EditChartInfo(c *gin.Context) {
 		response.FailMsg("操作失败", "获取图表信息失败, Err:"+err.Error(), c)
 		return
 	}
-	if chartItem.ChartType == 2 && len(req.ChartEdbInfoList) > 1 {
-		response.Fail("您选择的图表样式为季节性图表,只支持单指标画图!", c)
-		return
-	}
-	if req.Calendar == "" {
-		req.Calendar = "公历"
-	}
 
-	// 指标信息
+	// 图表关联指标id
+	chartEdbInfoList := make([]*chartInfoModel.ChartSaveItem, 0)
+	// 关联指标
 	var edbInfoIdArr []int
-	edbList := make([]*edbInfoModel.EdbInfo, 0)
+	// 非散点截面图的直接通过前端获取,散点截面图需要额外从配置中获取
+	if chartItem.ChartType != 10 {
+		//edbList := make([]*data_manage.EdbInfo, 0)
+		for _, v := range req.ChartEdbInfoList {
+			edbInfoId := v.EdbInfoId
+			edbInfo, err := edbInfoModel.GetEdbInfoById(edbInfoId)
+			if err != nil {
+				if err == utils.ErrNoRow {
+					response.FailMsg("操作失败", "图表不存在,ChartInfoId:"+strconv.Itoa(v.EdbInfoId), c)
+					return
+				}
+				response.FailMsg("操作失败", "获取图表的指标信息失败,Err:"+err.Error(), c)
+				return
+			}
+			if edbInfo == nil {
+				response.FailMsg("操作失败", "指标不存在,ChartInfoId:"+strconv.Itoa(v.EdbInfoId), c)
+				return
+			}
 
-	for _, v := range req.ChartEdbInfoList {
-		edbInfo, err := edbInfoModel.GetEdbInfoById(v.EdbInfoId)
-		if err != nil {
-			if err == utils.ErrNoRow {
-				response.FailMsg("操作失败", "图表不存在,ChartInfoId:"+strconv.Itoa(v.EdbInfoId), c)
+			if edbInfo.EdbInfoId <= 0 {
+				response.FailMsg("指标已被删除,请重新选择!", "指标不存在,ChartInfoId:"+strconv.Itoa(v.EdbInfoId), c)
 				return
 			}
-			response.FailMsg("操作失败", "获取图表的指标信息失败,Err:"+err.Error(), c)
+
+			edbInfoIdArr = append(edbInfoIdArr, edbInfoId)
+			edbInfo.EdbNameSource = edbInfo.EdbName
+			//edbList = append(edbList, edbInfo)
+		}
+		chartEdbInfoList = req.ChartEdbInfoList
+	} else {
+		if req.ExtraConfig == `` {
+			response.FailMsg("请选择指标!", "请选择指标!, Err:"+err.Error(), c)
 			return
 		}
-		if edbInfo == nil {
-			response.FailMsg("操作失败", "指标不存在,ChartInfoId:"+strconv.Itoa(v.EdbInfoId), c)
+
+		// 校验配置的指标列表
+		tmpEdbInfoIdArr, err, errMsg := chart.CheckChartExtraConfig(chartItem.ChartType, req.ExtraConfig)
+		if err != nil {
+			response.FailMsg(errMsg, "修改失败!, Err:"+err.Error(), c)
 			return
 		}
-		edbInfoIdArr = append(edbInfoIdArr, v.EdbInfoId)
-		edbInfo.EdbNameSource = edbInfo.EdbName
-		edbList = append(edbList, edbInfo)
+		edbInfoIdArr = tmpEdbInfoIdArr
+		lenEdbInfoIdArr := len(edbInfoIdArr)
+		if lenEdbInfoIdArr > 0 {
+			tmpEdbList, err := edbInfoModel.GetEdbInfoByIdList(edbInfoIdArr)
+			if err != nil {
+				response.FailMsg("指标异常!", "指标异常!, Err:"+err.Error(), c)
+				return
+			}
+			if len(tmpEdbList) != lenEdbInfoIdArr {
+				response.FailMsg("指标异常!", fmt.Sprint("查找出来的指标数量与选择的指标数量不符!查找出来的指标数量:", len(tmpEdbList), ";用户选择的指标数量:", lenEdbInfoIdArr), c)
+				return
+			}
+			for _, v := range tmpEdbList {
+				chartEdbInfoList = append(chartEdbInfoList, &chartInfoModel.ChartSaveItem{
+					EdbInfoId:   v.EdbInfoId,
+					MaxData:     0,
+					MinData:     0,
+					IsOrder:     false,
+					IsAxis:      1,
+					EdbInfoType: 1,
+					LeadValue:   0,
+					LeadUnit:    "",
+					ChartStyle:  "",
+					ChartColor:  "",
+					//PredictChartColor: "",
+					ChartWidth: 0,
+					Source:     utils.CHART_SOURCE_DEFAULT,
+				})
+			}
+
+		}
+	}
+	if len(edbInfoIdArr) <= 0 {
+		response.Fail("请选择指标!", c)
+		return
 	}
+
+	if chartItem.ChartType == 2 && len(req.ChartEdbInfoList) > 1 {
+		response.Fail("您选择的图表样式为季节性图表,只支持单指标画图!", c)
+		return
+	}
+	if req.Calendar == "" {
+		req.Calendar = "公历"
+	}
+
 	sort.Ints(edbInfoIdArr)
 	var edbInfoIdArrStr []string
 	for _, v := range edbInfoIdArr {
@@ -590,7 +651,7 @@ func EditChartInfo(c *gin.Context) {
 	}
 	edbInfoIdStr := strings.Join(edbInfoIdArrStr, ",")
 
-	err = chart.ModifyChartInfoAndMapping(edbInfoIdStr, &req, chartItem.ChartType)
+	err = chart.ModifyChartInfoAndMapping(edbInfoIdStr, &req, chartItem.ChartType, chartEdbInfoList)
 	if err != nil {
 		response.Fail("图表保存失败, Err:"+err.Error(), c)
 		return

+ 1 - 0
models/tables/chart_edb_mapping/chart_edb_mapping.go

@@ -20,6 +20,7 @@ type ChartEdbMapping struct {
 	ChartStyle        string    `gorm:"column:chart_style;type:varchar(20);default:''" json:"chartStyle"`                         // 图表类型
 	ChartColor        string    `gorm:"column:chart_color;type:varchar(20);default:''" json:"chartColor"`                         // 颜色
 	ChartWidth        float64   `gorm:"column:chart_width;type:double;default:0" json:"chartWidth"`                               // 线条大小
+	Source            float64   `gorm:"column:source;type:tinyint(4);default:1" json:"source"`                                    // 1:ETA图库;2:商品价格"
 }
 
 // TableName get sql table name.获取数据库表名

+ 2 - 0
models/tables/chart_info/query.go

@@ -56,6 +56,7 @@ type SaveChartInfoReq struct {
 	LeftMax          string           `description:"图表左侧最大值"`
 	RightMin         string           `description:"图表右侧最小值"`
 	RightMax         string           `description:"图表右侧最大值"`
+	ExtraConfig      string           `description:"图表额外配置信息,json字符串"`
 }
 
 type ChartSaveItem struct {
@@ -70,6 +71,7 @@ type ChartSaveItem struct {
 	ChartStyle  string  `description:"图表类型"`
 	ChartColor  string  `description:"颜色"`
 	ChartWidth  float64 `description:"线条大小"`
+	Source      int     `description:"1:ETA图库;2:商品价格"`
 }
 
 type ChartSortInfo struct {

+ 93 - 54
services/chart/chart_info.go

@@ -28,7 +28,7 @@ import (
 )
 
 // ModifyChartInfoAndMapping 修改图表信息
-func ModifyChartInfoAndMapping(edbInfoIdStr string, req *chartInfoModel.SaveChartInfoReq, chartType int) (err error) {
+func ModifyChartInfoAndMapping(edbInfoIdStr string, req *chartInfoModel.SaveChartInfoReq, chartType int, chartEdbInfoList []*chartInfoModel.ChartSaveItem) (err error) {
 	// 开启事务
 	tx := global.MYSQL["data"].Begin()
 	defer func() {
@@ -51,9 +51,9 @@ func ModifyChartInfoAndMapping(edbInfoIdStr string, req *chartInfoModel.SaveChar
  				left_min = ?,
 				left_max = ?,
 				right_min = ?,
-				right_max = ?
+				right_max = ?,extra_config = ?
 			WHERE chart_info_id = ?`
-		err = tx.Exec(sql, edbInfoIdStr, req.DateType, req.StartDate, req.EndDate, req.LeftMin, req.LeftMax, req.RightMin, req.RightMax, req.ChartInfoId).Error
+		err = tx.Exec(sql, edbInfoIdStr, req.DateType, req.StartDate, req.EndDate, req.LeftMin, req.LeftMax, req.RightMin, req.RightMax, req.ExtraConfig, req.ChartInfoId).Error
 	} else {
 		sql := ` UPDATE chart_info
 			SET
@@ -65,49 +65,26 @@ func ModifyChartInfoAndMapping(edbInfoIdStr string, req *chartInfoModel.SaveChar
 				left_min = ?,
 				left_max = ?,
 				right_min = ?,
-				right_max = ?
+				right_max = ?,extra_config = ?
 			WHERE chart_info_id = ?`
-		err = tx.Exec(sql, edbInfoIdStr, req.Calendar, req.SeasonStartDate, req.SeasonEndDate, req.LeftMin, req.LeftMax, req.RightMin, req.RightMax, req.ChartInfoId).Error
+		err = tx.Exec(sql, edbInfoIdStr, req.Calendar, req.SeasonStartDate, req.SeasonEndDate, req.LeftMin, req.LeftMax, req.RightMin, req.RightMax, req.ExtraConfig, req.ChartInfoId).Error
 	}
 	if err != nil {
 		fmt.Println("UPDATE chart_info Err:", err.Error())
 		return
 	}
 
-	var edbInfoIdArr []string
-	mapList := make([]*chartEdbMappingModel.ChartEdbMapping, 0)
-	for _, v := range req.ChartEdbInfoList {
-		edbInfoIdArr = append(edbInfoIdArr, strconv.Itoa(v.EdbInfoId))
-		var count int
-		csql := ` SELECT COUNT(1) AS count FROM chart_edb_mapping WHERE chart_info_id = ? AND edb_info_id = ? `
-		err = tx.Raw(csql, req.ChartInfoId, v.EdbInfoId).Scan(&count).Error
-		if err != nil {
+	// 修改图表关联指标
+	chartEdbMappingIdList := make([]string, 0)
+	for _, v := range chartEdbInfoList {
+		var tmpChartEdbMapping *chartEdbMappingModel.ChartEdbMapping
+		csql := `SELECT *  FROM chart_edb_mapping WHERE chart_info_id=? AND edb_info_id=? AND source = ? `
+		err = tx.Raw(csql, req.ChartInfoId, v.EdbInfoId, utils.CHART_SOURCE_DEFAULT).First(&tmpChartEdbMapping).Error
+		if err != nil && err != utils.ErrNoRow {
 			fmt.Println("QueryRow Err:", err.Error())
 			return err
 		}
-		if count > 0 {
-			// 更新指标
-			msql := `UPDATE chart_edb_mapping
-				SET
-                 	modify_time = NOW(),
-				 	max_data = ?,
-				 	min_data = ?,
-				 	is_order = ?,
-				 	is_axis = ?,
-				 	edb_info_type = ?,
-				 	lead_value = ?,
-				 	lead_unit = ?,
-				 	chart_style = ?,
-				 	chart_color = ?,
-				 	chart_width = ? 
-				WHERE chart_info_id =? AND edb_info_id=? `
-
-			err = tx.Exec(msql, v.MaxData, v.MinData, v.IsOrder, v.IsAxis, v.EdbInfoType, v.LeadValue, v.LeadUnit, v.ChartStyle, v.ChartColor, v.ChartWidth, req.ChartInfoId, v.EdbInfoId).Error
-			if err != nil {
-				fmt.Println("chart_edb_mapping Err:" + err.Error())
-				return err
-			}
-		} else {
+		if tmpChartEdbMapping == nil || tmpChartEdbMapping.ChartEdbMappingId == 0 {
 			mapItem := new(chartEdbMappingModel.ChartEdbMapping)
 			mapItem.ChartInfoId = req.ChartInfoId
 			mapItem.EdbInfoId = v.EdbInfoId
@@ -128,29 +105,47 @@ func ModifyChartInfoAndMapping(edbInfoIdStr string, req *chartInfoModel.SaveChar
 			mapItem.ChartStyle = v.ChartStyle
 			mapItem.ChartColor = v.ChartColor
 			mapItem.ChartWidth = v.ChartWidth
-			mapList = append(mapList, mapItem)
-		}
-	}
+			mapItem.Source = utils.CHART_SOURCE_DEFAULT
+			err = tx.Create(mapItem).Error
+			if err != nil {
+				return
+			}
+			chartEdbMappingIdList = append(chartEdbMappingIdList, strconv.Itoa(mapItem.ChartEdbMappingId))
+		} else {
+			chartEdbMappingIdList = append(chartEdbMappingIdList, strconv.Itoa(tmpChartEdbMapping.ChartEdbMappingId))
 
-	// 批量新增指标
-	if len(mapList) > 0 {
-		err = tx.Create(mapList).Error
-		if err != nil {
-			fmt.Println("AddChartEdbMapping Err:" + err.Error())
-			return err
+			tmpChartEdbMapping.ModifyTime = time.Now()
+			tmpChartEdbMapping.MaxData = v.MaxData
+			tmpChartEdbMapping.MinData = v.MinData
+			tmpChartEdbMapping.IsOrder = 0
+			if v.IsOrder {
+				tmpChartEdbMapping.IsOrder = 1
+			}
+			tmpChartEdbMapping.IsAxis = v.IsAxis
+			tmpChartEdbMapping.EdbInfoType = v.EdbInfoType
+			tmpChartEdbMapping.LeadValue = v.LeadValue
+			tmpChartEdbMapping.LeadUnit = v.LeadUnit
+			tmpChartEdbMapping.ChartStyle = v.ChartStyle
+			tmpChartEdbMapping.ChartColor = v.ChartColor
+			//tmpChartEdbMapping.PredictChartColor = v.PredictChartColor
+			tmpChartEdbMapping.ChartWidth = v.ChartWidth
+			err = tx.Model(tmpChartEdbMapping).Select([]string{"ModifyTime", "MaxData", "MinData", "IsOrder", "IsAxis", "EdbInfoType", "LeadValue", "LeadUnit", "ChartStyle", "ChartColor", "PredictChartColor", "ChartWidth"}).Updates(*tmpChartEdbMapping).Error
+			if err != nil {
+				fmt.Println("chart_edb_mapping Err:" + err.Error())
+				return err
+			}
 		}
+
 	}
 
 	// 清除原图表指标
-	if len(edbInfoIdArr) > 0 {
-		edbInfoIdStr := strings.Join(edbInfoIdArr, ",")
-		if edbInfoIdStr != "" {
-			dsql := `DELETE FROM chart_edb_mapping WHERE chart_info_id=? AND edb_info_id NOT IN(` + edbInfoIdStr + `)`
-			err = tx.Exec(dsql, req.ChartInfoId).Error
-			if err != nil {
-				fmt.Println("delete err:" + err.Error())
-				return err
-			}
+	if len(chartEdbMappingIdList) > 0 {
+		chartEdbMappingIdStr := strings.Join(chartEdbMappingIdList, ",")
+		dsql := `DELETE FROM chart_edb_mapping WHERE chart_info_id=? AND chart_edb_mapping_id NOT IN(` + chartEdbMappingIdStr + `)`
+		err = tx.Exec(dsql).Error
+		if err != nil {
+			fmt.Println("delete err:" + err.Error())
+			return err
 		}
 	}
 
@@ -1018,6 +1013,50 @@ func ChartInfoRefreshV2(chartInfoId int) (err error) {
 	return
 }
 
+// CheckChartExtraConfig 校验图表额外配置的信息,并且获取相关联的指标id
+func CheckChartExtraConfig(chartType int, extraConfigStr string) (edbIdList []int, err error, errMsg string) {
+	switch chartType {
+	case 10: //时间截面
+		var extraConfig request.TimeSectionReq
+		err = json.Unmarshal([]byte(extraConfigStr), &extraConfig)
+		if err != nil {
+			return
+		}
+
+		// 判断是否有配置日期序列
+		if len(extraConfig.SeriesList) <= 0 {
+			errMsg = `请配置序列`
+			err = errors.New(errMsg)
+			return
+		}
+
+		// 判断是否有填写指标
+		if len(extraConfig.SeriesList[0].EdbInfoList) <= 0 {
+			errMsg = `请选择指标`
+			err = errors.New(errMsg)
+			return
+		}
+
+		// 遍历指标列表获取指标id
+		edbIdMap := make(map[int]int)
+		for _, v := range extraConfig.SeriesList[0].EdbInfoList {
+			// X 轴的指标id
+			if _, ok := edbIdMap[v.XEdbInfoId]; !ok {
+				edbIdMap[v.XEdbInfoId] = v.XEdbInfoId
+				edbIdList = append(edbIdList, v.XEdbInfoId)
+			}
+
+			// Y 轴的指标id
+			if _, ok := edbIdMap[v.YEdbInfoId]; !ok {
+				edbIdMap[v.YEdbInfoId] = v.YEdbInfoId
+				edbIdList = append(edbIdList, v.YEdbInfoId)
+			}
+		}
+	}
+
+	return
+}
+
 // GetTimeSectionChartData 柱方图的数据处理
 func GetTimeSectionChartData(mappingList []*chartEdbMappingModel.ChartEdbInfoMapping, edbDataListMap map[int][]*edbDataModel.EdbDataList, extraConfig request.TimeSectionReq) (edbIdList []int, chartDataResp request.TimeSectionInfoResp, err error) {
 	// 指标数据数组(10086:{"2022-12-02":100.01,"2022-12-01":102.3})