Browse Source

优化图表新增,改成事务

xyxie 11 months ago
parent
commit
87dc7940e4
2 changed files with 98 additions and 130 deletions
  1. 61 112
      models/chart_info.go
  2. 37 18
      services/chart_info.go

+ 61 - 112
models/chart_info.go

@@ -1,6 +1,7 @@
 package models
 
 import (
+	"errors"
 	"eta/eta_forum_hub/models/system"
 	"eta/eta_forum_hub/utils"
 	"fmt"
@@ -492,7 +493,7 @@ type YData struct {
 	UnitEn         string          `description:"英文单位名称"`
 }
 
-func ModifyChartInfoAndMapping(edbInfoIdStr string, req *SaveChartInfoReq, chartType int) (err error) {
+func AddChartInfoAndMapping(chartInfo *ChartInfo, mapList []*ChartEdbMapping, updateExtraConfigFlag bool) (err error) {
 	o := orm.NewOrm()
 	to, err := o.Begin()
 	if err != nil {
@@ -505,132 +506,80 @@ func ModifyChartInfoAndMapping(edbInfoIdStr string, req *SaveChartInfoReq, chart
 			_ = to.Commit()
 		}
 	}()
-
-	//非季节图
-	if chartType != 2 {
-		updateStr := `edb_info_ids=?,
-			  modify_time = NOW(),
-              date_type=?,
-			  start_date=?,
-			  end_date=?,
- 			  left_min=?,
-			  left_max=?,
-			  right_min=?,
-			  right_max=?,
-			  right2_min=?,
-			  right2_max=?,
-			  min_max_save=?,
-              start_year=?`
-		pars := []interface{}{edbInfoIdStr, req.DateType, req.StartDate, req.EndDate, req.LeftMin, req.LeftMax, req.RightMin, req.RightMax, req.Right2Min, req.Right2Max, req.MinMaxSave, req.StartYear}
-		if req.ExtraConfig != `` {
-			updateStr += `,extra_config=? `
-			pars = append(pars, req.ExtraConfig)
+	newId, err := o.Insert(chartInfo)
+	if err != nil {
+		err = errors.New("保存失败,Err:" + err.Error())
+		return
+	}
+	chartInfo.ChartInfoId = int(newId)
+	if len(mapList) > 0 {
+		for _, v := range mapList {
+			v.ChartInfoId = int(newId)
 		}
-		pars = append(pars, req.ChartInfoId)
+		_, err = o.InsertMulti(len(mapList), mapList)
+	}
 
-		sql := ` UPDATE  chart_info SET ` + updateStr + ` WHERE chart_info_id = ?`
-		_, err = to.Raw(sql, pars).Exec()
-		if err != nil {
-			fmt.Println("UPDATE  chart_info Err:", err.Error())
-			return err
-		}
-	} else {
-		sql := ` UPDATE  chart_info
-			SET
-              edb_info_ids=?,
-			  modify_time = NOW(),
-			  calendar=?,
-			  date_type=?,
-			  start_date=?,
-			  end_date=?,
-			  season_start_date=?,
-			  season_end_date=?,
-			  left_min=?,
-			  left_max=?,
-			  right_min=?,
-			  right_max=?,
-			  right2_min=?,
-			  right2_max=?,
-			  min_max_save=?,
-			  start_year=?
-			WHERE chart_info_id = ?`
-		_, err = to.Raw(sql, edbInfoIdStr, req.Calendar, req.DateType, req.StartDate, req.EndDate, req.StartDate, req.EndDate, req.LeftMin, req.LeftMax, req.RightMin, req.RightMax, req.Right2Min, req.Right2Max, req.MinMaxSave, req.StartYear, req.ChartInfoId).Exec()
+	//更新图表的特殊字段
+	if updateExtraConfigFlag {
+		_, err = o.Update(chartInfo, []string{"ExtraConfig", "BarConfig"}...)
 		if err != nil {
-			fmt.Println("UPDATE  chart_info Err:", err.Error())
-			return err
+			err = errors.New("保存图表配置失败,Err:" + err.Error())
+			return
 		}
 	}
+	return
+}
 
-	var edbInfoIdArr []string
-	mapList := make([]*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 = to.Raw(csql, req.ChartInfoId, v.EdbInfoId).QueryRow(&count)
+func ModifyChartInfoAndMapping(chartInfo *ChartInfo, addMapList []*ChartEdbMapping, updateMapList []*ChartEdbMapping, removeIdStr string, updateExtraConfigFlag bool) (err error) {
+	o := orm.NewOrm()
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
 		if err != nil {
-			fmt.Println("QueryRow Err:", err.Error())
-			return err
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
 		}
-		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 = ?,
-				 predict_chart_color = ?,
-				 chart_width = ?
-				WHERE chart_info_id =? AND edb_info_id=? `
-			_, err = to.Raw(msql, v.MaxData, v.MinData, v.IsOrder, v.IsAxis, v.EdbInfoType, v.LeadValue, v.LeadUnit, v.ChartStyle, v.ChartColor, v.PredictChartColor, v.ChartWidth, req.ChartInfoId, v.EdbInfoId).Exec()
+	}()
+
+	_, err = o.Update(chartInfo, []string{}...)
+	if err != nil {
+		err = errors.New("图表更新失败,Err:" + err.Error())
+		return
+	}
+	if len(updateMapList) > 0 {
+		for _, v := range updateMapList {
+			_, err = o.Update(v, []string{}...)
 			if err != nil {
-				fmt.Println("chart_edb_mapping Err:" + err.Error())
-				return err
+				err = errors.New("更新图表指标映射关系失败,Err:" + err.Error())
+				return
 			}
-		} else {
-			mapItem := new(ChartEdbMapping)
-			mapItem.ChartInfoId = req.ChartInfoId
-			mapItem.EdbInfoId = v.EdbInfoId
-			mapItem.CreateTime = time.Now()
-			mapItem.ModifyTime = time.Now()
-			timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
-			mapItem.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp)
-			mapItem.MaxData = v.MaxData
-			mapItem.MinData = v.MinData
-			mapItem.IsOrder = v.IsOrder
-			mapItem.IsAxis = v.IsAxis
-			mapItem.EdbInfoType = v.EdbInfoType
-			mapItem.LeadValue = v.LeadValue
-			mapItem.LeadUnit = v.LeadUnit
-			mapItem.ChartStyle = v.ChartStyle
-			mapItem.ChartColor = v.ChartColor
-			mapItem.PredictChartColor = v.PredictChartColor
-			mapItem.ChartWidth = v.ChartWidth
-			mapList = append(mapList, mapItem)
 		}
 	}
-	if len(mapList) > 0 {
-		_, err = to.InsertMulti(1, mapList)
+	if len(addMapList) > 0 {
+		_, err = o.InsertMulti(len(addMapList), addMapList)
 		if err != nil {
-			fmt.Println("AddChartEdbMapping Err:" + err.Error())
-			return err
+			err = errors.New("保存图表指标映射关系失败,Err:" + err.Error())
+			return
 		}
 	}
-	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 = to.Raw(dsql, req.ChartInfoId).Exec()
-			if err != nil {
-				fmt.Println("delete err:" + err.Error())
-				return err
-			}
+	if removeIdStr != "" {
+		sql := fmt.Sprintf(` DELETE FROM chart_edb_mapping WHERE chart_edb_mapping_id in (%s) `, removeIdStr)
+		_, err = o.Raw(sql).Exec()
+		if err != nil {
+			err = fmt.Errorf("删除映射关系失败,Err:" + err.Error())
+			return
+		}
+	}
+
+	//更新图表的特殊字段
+	if updateExtraConfigFlag {
+		_, err = o.Update(chartInfo, []string{"ExtraConfig", "BarConfig"}...)
+		if err != nil {
+			err = errors.New("保存图表配置失败,Err:" + err.Error())
+			return
 		}
 	}
 	return

+ 37 - 18
services/chart_info.go

@@ -152,13 +152,13 @@ func AddChartInfo(req *models.AddChartReq, sysUserId int, sysUserRealName string
 	chartInfo.Unit = req.ChartInfo.Unit
 	chartInfo.UnitEn = req.ChartInfo.UnitEn
 	chartInfo.Description = req.Description
-	newId, err := models.AddChartInfo(chartInfo)
+	/*newId, err := models.AddChartInfo(chartInfo)
 	if err != nil {
 		errMsg = `保存失败`
 		err = errors.New("保存失败,Err:" + err.Error())
 		return
 	}
-	chartInfo.ChartInfoId = int(newId)
+	chartInfo.ChartInfoId = int(newId)*/
 
 	// todo 先整理好指标信息,生成指标ID,再将图表和指标ID进行绑定
 	chartEdbInfoList := req.ChartEdbMapping
@@ -166,7 +166,7 @@ func AddChartInfo(req *models.AddChartReq, sysUserId int, sysUserRealName string
 	newEdbInfoIdMap := make(map[int]int) // ETA系统和ETA社区指标ID的映射关系
 	for _, v := range chartEdbInfoList {
 		mapItem := new(models.ChartEdbMapping)
-		mapItem.ChartInfoId = int(newId)
+		//mapItem.ChartInfoId = int(newId)
 		edbCode, ok := originEdbInfoIdMap[v.EdbInfoId]
 		if !ok {
 			err = fmt.Errorf("指标代码不存在,EdbCode:%s", v.EdbCode)
@@ -212,28 +212,36 @@ func AddChartInfo(req *models.AddChartReq, sysUserId int, sysUserRealName string
 		err = errors.New("图表指标映射不能为空")
 		return
 	}
-	err = models.AddChartEdbMapping(mapList)
+	/*err = models.AddChartEdbMapping(mapList)
 	if err != nil {
 		errMsg = `保存失败`
 		err = errors.New("保存失败,Err:" + err.Error())
 		return
-	}
+	}*/
 
 	extraConfig := chartInfo.ExtraConfig
 	barConfig := chartInfo.BarConfig
+	updateExtraConfigFlag := false
 	//更新图表配置里的config信息
 	e, _ := transferChartConfigEdbInfoId(chartInfo, newEdbInfoIdMap)
 	if e == nil {
 		//更新图表的特殊字段
 		if chartInfo.ExtraConfig != extraConfig || chartInfo.BarConfig != barConfig {
-			err = chartInfo.Update([]string{"ExtraConfig", "BarConfig"})
+			updateExtraConfigFlag = true
+			/*err = chartInfo.Update([]string{"ExtraConfig", "BarConfig"})
 			if err != nil {
 				errMsg = `保存失败`
 				err = errors.New("保存图表配置失败,Err:" + err.Error())
 				return
-			}
+			}*/
 		}
 	}
+	err = models.AddChartInfoAndMapping(chartInfo, mapList, updateExtraConfigFlag)
+	if err != nil {
+		errMsg = `保存失败`
+		err = errors.New("保存图表失败,Err:" + err.Error())
+		return
+	}
 	//添加es数据
 	go EsAddOrEditChartInfo(chartInfo.ChartInfoId)
 
@@ -373,12 +381,12 @@ func UpdateChartInfoAndEdbInfo(req *models.AddChartReq, sysUserId int, sysUserRe
 		}
 	}
 
-	err = chartInfo.Update([]string{})
+	/*err = chartInfo.Update([]string{})
 	if err != nil {
 		errMsg = `更新失败`
 		err = errors.New("更新失败,Err:" + err.Error())
 		return
-	}
+	}*/
 
 	// 处理映射,已存在的映射直接更新,不存在的映射再新增,同时删除旧的映射关系
 	oldChartEdbMappingList, err := models.GetChartEdbMappingListV2(chartInfo.ChartInfoId)
@@ -393,6 +401,7 @@ func UpdateChartInfoAndEdbInfo(req *models.AddChartReq, sysUserId int, sysUserRe
 	// todo 先整理好指标信息,生成指标ID,再将图表和指标ID进行绑定
 	chartEdbInfoList := req.ChartEdbMapping
 	addMappingList := make([]*models.ChartEdbMapping, 0)
+	updateMappingList := make([]*models.ChartEdbMapping, 0)
 	newEdbInfoIdMap := make(map[int]int) // ETA系统和ETA社区指标ID的映射关系
 	for _, v := range chartEdbInfoList {
 		mapItem := new(models.ChartEdbMapping)
@@ -435,12 +444,13 @@ func UpdateChartInfoAndEdbInfo(req *models.AddChartReq, sysUserId int, sysUserRe
 			mapItem.ConvertEnUnit = v.ConvertEnUnit
 			mapItem.EdbCode = edbCode
 
-			err = mapItem.Update([]string{})
+			/*err = mapItem.Update([]string{})
 			if err != nil {
 				errMsg = `更新失败`
 				err = errors.New("更新图表指标映射关系失败,Err:" + err.Error())
 				return
-			}
+			}*/
+			updateMappingList = append(updateMappingList, mapItem)
 			delete(removeMapping, mapItem.ChartEdbMappingId)
 		} else {
 			mapItem.EdbInfoId = edbBase.EdbInfoId
@@ -471,46 +481,55 @@ func UpdateChartInfoAndEdbInfo(req *models.AddChartReq, sysUserId int, sysUserRe
 		}
 		newEdbInfoIdMap[v.EdbInfoId] = mapItem.EdbInfoId
 	}
-	if len(addMappingList) > 0 {
+	/*if len(addMappingList) > 0 {
 		err = models.AddChartEdbMapping(addMappingList)
 		if err != nil {
 			errMsg = `保存失败`
 			err = errors.New("保存失败,Err:" + err.Error())
 			return
 		}
-	}
+	}*/
 
 	// 删除原先的绑定关系
+	removeIdStr := ""
 	if len(removeMapping) > 0 {
 		removeIdList := make([]string, 0) //需要移除的日期
 		for k, _ := range removeMapping {
 			removeIdList = append(removeIdList, fmt.Sprint(k))
 		}
-		removeIdStr := strings.Join(removeIdList, `","`)
+		removeIdStr = strings.Join(removeIdList, `","`)
 		removeIdStr = `"` + removeIdStr + `"`
-		err = models.DeleteChartEdbMappingByChartEdbMappingId(removeIdStr)
+		/*err = models.DeleteChartEdbMappingByChartEdbMappingId(removeIdStr)
 		if err != nil {
 			errMsg = `删除失败`
 			err = errors.New("删除失败,Err:" + err.Error())
 			return
-		}
+		}*/
 	}
 
 	extraConfig := chartInfo.ExtraConfig
 	barConfig := chartInfo.BarConfig
+	updateExtraConfigFlag := false
 	//更新图表配置里的config信息
 	e, _ := transferChartConfigEdbInfoId(chartInfo, newEdbInfoIdMap)
 	if e == nil {
 		//更新图表的特殊字段
 		if chartInfo.ExtraConfig != extraConfig || chartInfo.BarConfig != barConfig {
-			err = chartInfo.Update([]string{"ExtraConfig", "BarConfig"})
+			updateExtraConfigFlag = true
+			/*err = chartInfo.Update([]string{"ExtraConfig", "BarConfig"})
 			if err != nil {
 				errMsg = `保存失败`
 				err = errors.New("保存图表配置失败,Err:" + err.Error())
 				return
-			}
+			}*/
 		}
 	}
+	err = models.ModifyChartInfoAndMapping(chartInfo, addMappingList, updateMappingList, removeIdStr, updateExtraConfigFlag)
+	if err != nil {
+		errMsg = `保存失败`
+		err = errors.New("保存图表配置失败,Err:" + err.Error())
+		return
+	}
 	//添加es数据
 	go EsAddOrEditChartInfo(chartInfo.ChartInfoId)