Explorar el Código

Merge branch 'bug/3284'

Roc hace 1 año
padre
commit
a3954e1eb1
Se han modificado 3 ficheros con 628 adiciones y 357 borrados
  1. 19 20
      controllers/base_from_predict_calculate.go
  2. 2 0
      models/common.go
  3. 607 337
      models/predict_edb_data_calculate_tbz.go

+ 19 - 20
controllers/base_from_predict_calculate.go

@@ -687,9 +687,9 @@ func (this *PredictCalculateController) CalculateBatchSave() {
 				return
 			}
 		}
-		sourName = "预测同比"
-		edbInfo, latestDateStr, latestValue, err, errMsg = models.SavePredictCalculateTbz(req.EdbInfoId, req.ClassifyId, req.EdbName, req.Frequency, req.Unit, req.Formula, fromEdbInfo, edbCode, uniqueCode, adminId, adminName)
-	} else if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_TCZ {
+	}
+
+	if req.Source == utils.DATA_SOURCE_PREDICT_CALCULATE_TCZ {
 		if req.EdbInfoId <= 0 {
 			if req.Frequency != fromEdbInfo.Frequency {
 				br.Msg = "当前频度和原指标频度不一致"
@@ -912,6 +912,22 @@ func (this *PredictCalculateController) Refresh() {
 		EdbInfo: edbInfo,
 	}
 
+	switch source {
+	case utils.DATA_SOURCE_PREDICT_CALCULATE_TBZ: //刷新同比值
+		calculateTbz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
+		if err != nil {
+			errMsg = "GetEdbInfoCalculateTbzDetail Err:" + err.Error()
+			break
+		}
+		fromEdbInfo, err := models.GetEdbInfoById(calculateTbz.FromEdbInfoId)
+		if err != nil {
+			errMsg = "GetEdbInfoById Err:" + err.Error()
+			break
+		}
+		refreshParams.FromEdbInfo = fromEdbInfo
+		refreshParams.StartDate = edbInfo.StartDate
+	}
+
 	switch source {
 	case utils.DATA_SOURCE_PREDICT_CALCULATE:
 		//startDate = edbInfo.StartDate
@@ -941,23 +957,6 @@ func (this *PredictCalculateController) Refresh() {
 			errMsg = "RefreshCalculate Err:" + err.Error()
 			break
 		}
-	case utils.DATA_SOURCE_PREDICT_CALCULATE_TBZ: //刷新同比值
-		calculateTbz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
-		if err != nil {
-			errMsg = "GetEdbInfoCalculateTbzDetail Err:" + err.Error()
-			break
-		}
-		fromEdbInfo, err := models.GetEdbInfoById(calculateTbz.FromEdbInfoId)
-		if err != nil {
-			errMsg = "GetEdbInfoById Err:" + err.Error()
-			break
-		}
-		startDate = edbInfo.StartDate
-		latestDateStr, latestValue, err = models.RefreshAllPredictCalculateTbz(edbInfoId, source, fromEdbInfo, calculateTbz.EdbCode, startDate)
-		if err != nil && err.Error() != utils.ErrNoRow() {
-			errMsg = "RefreshAllCalculateTbz Err:" + err.Error()
-			break
-		}
 	case utils.DATA_SOURCE_PREDICT_CALCULATE_TCZ: //同差值
 		calculateTcz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
 		if err != nil {

+ 2 - 0
models/common.go

@@ -78,6 +78,8 @@ type BasePredictEdbInfoInterface interface {
 // GetBasePredictEdbInfoModel 获取预测指标的model
 func GetBasePredictEdbInfoModel(source int) (baseEdbInfoModel BasePredictEdbInfoInterface) {
 	switch source {
+	case utils.DATA_SOURCE_PREDICT_CALCULATE_TBZ:
+		baseEdbInfoModel = PredictTb{}
 	case utils.DATA_SOURCE_PREDICT_CALCULATE_LJZZJ:
 		baseEdbInfoModel = PredictLjzzj{}
 	case utils.DATA_SOURCE_PREDICT_CALCULATE_LJZ:

+ 607 - 337
models/predict_edb_data_calculate_tbz.go

@@ -6,11 +6,618 @@ import (
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/shopspring/decimal"
+	"reflect"
 	"strconv"
 	"strings"
 	"time"
 )
 
+// PredictTb 预测同比值
+type PredictTb struct {
+}
+
+// Add 添加
+func (obj PredictTb) Add(params BatchSaveCalculateBatchParams) (edbInfo *EdbInfo, latestDateStr string, latestValue float64, err error, errMsg string) {
+	req := params.Req
+	fromEdbInfo := params.FromEdbInfo
+	edbCode := params.EdbCode
+
+	o := orm.NewOrm()
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+			fmt.Println(reflect.TypeOf(obj).Name(), ";Add,Err:"+err.Error())
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	edbInfo = &EdbInfo{
+		//EdbInfoId:        0,
+		SourceName:       obj.GetSourceName(),
+		Source:           obj.GetSource(),
+		EdbCode:          edbCode,
+		EdbName:          req.EdbName,
+		EdbNameSource:    req.EdbName,
+		Frequency:        req.Frequency,
+		Unit:             req.Unit,
+		StartDate:        "",
+		EndDate:          "",
+		ClassifyId:       req.ClassifyId,
+		SysUserId:        params.SysUserId,
+		SysUserRealName:  params.SysUserRealName,
+		UniqueCode:       params.UniqueCode,
+		CreateTime:       time.Now(),
+		ModifyTime:       time.Now(),
+		MinValue:         0,
+		MaxValue:         0,
+		CalculateFormula: req.Formula,
+		EdbType:          2,
+		Sort:             0,
+		MoveType:         0,
+		MoveFrequency:    "",
+		NoUpdate:         0,
+		ServerUrl:        "",
+		EdbInfoType:      1,
+		EdbNameEn:        "",
+		UnitEn:           "",
+		LatestDate:       "",
+		LatestValue:      0,
+		ChartImage:       "",
+		Calendar:         "",
+	}
+
+	newEdbInfoId, tmpErr := to.Insert(edbInfo)
+	if tmpErr != nil {
+		err = tmpErr
+		return
+	}
+	edbInfo.EdbInfoId = int(newEdbInfoId)
+
+	//关联关系
+	{
+		calculateMappingItem := new(EdbInfoCalculateMapping)
+		calculateMappingItem.CreateTime = time.Now()
+		calculateMappingItem.ModifyTime = time.Now()
+		calculateMappingItem.Sort = 1
+		calculateMappingItem.EdbCode = edbCode
+		calculateMappingItem.EdbInfoId = edbInfo.EdbInfoId
+		calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
+		calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
+		calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
+		calculateMappingItem.FromSource = fromEdbInfo.Source
+		calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
+		calculateMappingItem.FromTag = ""
+		calculateMappingItem.Source = edbInfo.Source
+		calculateMappingItem.SourceName = edbInfo.SourceName
+		_, err = to.Insert(calculateMappingItem)
+		if err != nil {
+			return
+		}
+	}
+
+	//计算数据
+	latestDateStr, latestValue, err = obj.refresh(to, edbInfo, fromEdbInfo, edbInfo.EdbCode, "")
+
+	return
+}
+
+// Edit 编辑
+func (obj PredictTb) Edit(params BatchSaveCalculateBatchParams) (latestDateStr string, latestValue float64, err error, errMsg string) {
+	req := params.Req
+	edbInfo := params.EdbInfo
+	fromEdbInfo := params.FromEdbInfo
+
+	latestDateStr = edbInfo.LatestDate
+	latestValue = edbInfo.LatestValue
+
+	if fromEdbInfo.Frequency != req.Frequency {
+		errMsg = "生成指标频度与原指标频度不同"
+		err = errors.New(errMsg)
+		return
+	}
+	if edbInfo.EdbInfoType != 1 {
+		errMsg = `该指标不是预测指标`
+		err = errors.New(errMsg)
+		return
+	}
+
+	latestDateStr = edbInfo.LatestDate
+	latestValue = edbInfo.LatestValue
+
+	o := orm.NewOrm()
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+			fmt.Println(reflect.TypeOf(obj).Name(), ";Edit,Err:"+err.Error())
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	tableName := GetEdbDataTableName(edbInfo.Source)
+
+	//修改指标信息
+	edbInfo.EdbName = req.EdbName
+	edbInfo.EdbNameSource = req.EdbName
+	edbInfo.Frequency = req.Frequency
+	edbInfo.Unit = req.Unit
+	edbInfo.ClassifyId = req.ClassifyId
+	edbInfo.ModifyTime = time.Now()
+	_, err = to.Update(edbInfo, "EdbName", "EdbNameSource", "Frequency", "Unit", "ClassifyId", "ModifyTime")
+	if err != nil {
+		return
+	}
+
+	//判断计算指标是否被更换
+	var existCondition string
+	var existPars []interface{}
+	existCondition += " AND edb_info_id=? AND from_edb_info_id=? "
+	existPars = append(existPars, edbInfo.EdbInfoId, fromEdbInfo.EdbInfoId)
+
+	var count int
+	count, err = GetEdbInfoCalculateCountByCondition(existCondition, existPars)
+	if err != nil {
+		err = errors.New("判断指标是否改变失败,Err:" + err.Error())
+		return
+	}
+	if count > 0 { // 指标未被替换,无需重新计算
+		return
+	}
+	//删除,计算指标关联的,基础指标的关联关系
+	sql := ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? `
+	_, err = to.Raw(sql, edbInfo.EdbInfoId).Exec()
+	if err != nil {
+		return
+	}
+
+	// 删除该指标所有的同比数据
+	sql = ` DELETE FROM ` + tableName + ` WHERE edb_info_id = ? `
+	_, err = to.Raw(sql, edbInfo.EdbInfoId).Exec()
+	if err != nil {
+		return
+	}
+
+	//关联关系
+	{
+		calculateMappingItem := &EdbInfoCalculateMapping{
+			EdbInfoCalculateMappingId: 0,
+			EdbInfoId:                 edbInfo.EdbInfoId,
+			Source:                    obj.GetSource(),
+			SourceName:                obj.GetSourceName(),
+			EdbCode:                   edbInfo.EdbCode,
+			FromEdbInfoId:             fromEdbInfo.EdbInfoId,
+			FromEdbCode:               fromEdbInfo.EdbCode,
+			FromEdbName:               fromEdbInfo.EdbName,
+			FromSource:                fromEdbInfo.Source,
+			FromSourceName:            fromEdbInfo.SourceName,
+			FromTag:                   "",
+			Sort:                      1,
+			CreateTime:                time.Now(),
+			ModifyTime:                time.Now(),
+		}
+		_, err = to.Insert(calculateMappingItem)
+		if err != nil {
+			return
+		}
+	}
+
+	//计算数据
+	latestDateStr, latestValue, err = obj.refresh(to, edbInfo, fromEdbInfo, edbInfo.EdbCode, "")
+
+	return
+}
+
+// Refresh 刷新
+func (obj PredictTb) Refresh(params RefreshParams) (latestDateStr string, latestValue float64, err error, errMsg string) {
+	calculateMapping, err := GetEdbInfoCalculateMappingDetail(params.EdbInfo.EdbInfoId)
+	if err != nil {
+		return
+	}
+	fromEdbInfo, err := GetEdbInfoById(calculateMapping.FromEdbInfoId)
+	if err != nil {
+		errMsg = "GetEdbInfoById Err:" + err.Error()
+		return
+	}
+
+	o := orm.NewOrm()
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+			fmt.Println(reflect.TypeOf(obj).Name(), ";Refresh,Err:"+err.Error())
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	// 计算数据
+	latestDateStr, latestValue, err = obj.refresh(to, params.EdbInfo, fromEdbInfo, params.EdbInfo.EdbCode, params.StartDate)
+
+	return
+}
+
+// GetSource 获取来源编码id
+func (obj PredictTb) GetSource() int {
+	return utils.DATA_SOURCE_PREDICT_CALCULATE_TBZ
+}
+
+// GetSourceName 获取来源名称
+func (obj PredictTb) GetSourceName() string {
+	return utils.DATA_SOURCE_NAME_PREDICT_CALCULATE_TBZ
+}
+
+func (obj PredictTb) refresh(to orm.TxOrmer, edbInfo, fromEdbInfo *EdbInfo, edbCode, startDate string) (latestDateStr string, latestValue float64, err error) {
+	edbInfoId := edbInfo.EdbInfoId
+	dataTableName := GetEdbDataTableName(edbInfo.Source)
+
+	edbInfoIdStr := strconv.Itoa(edbInfoId)
+
+	// 获取关联指标数据
+	dataList, err := GetPredictEdbDataListAllByStartDate(fromEdbInfo, 1, startDate)
+	if err != nil {
+		return
+	}
+
+	latestDateStr = fromEdbInfo.LatestDate
+	//计算数据
+	var dateArr []string
+	dataMap := make(map[string]*EdbInfoSearchData)
+	for _, v := range dataList {
+		dateArr = append(dateArr, v.DataTime)
+		dataMap[v.DataTime] = v
+	}
+	//获取指标所有数据
+	existDataList := make([]*EdbData, 0)
+	fmt.Println("dataTableName:", dataTableName)
+
+	sql := `SELECT * FROM %s WHERE edb_info_id=? `
+	sql = fmt.Sprintf(sql, dataTableName)
+	_, err = to.Raw(sql, edbInfoId).QueryRows(&existDataList)
+	if err != nil {
+		return
+	}
+	existDataMap := make(map[string]string)
+	removeDataTimeMap := make(map[string]int) //需要移除的日期数据
+	for _, v := range existDataList {
+		existDataMap[v.DataTime] = v.Value
+		removeDataTimeMap[v.DataTime] = 1
+	}
+
+	fmt.Println("existDataMap:", existDataMap)
+	addSql := ` INSERT INTO edb_data_predict_calculate_tbz (edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	var isAdd bool
+	existAddDataMap := make(map[string]string)
+	for _, av := range dateArr {
+		//校验待删除日期数据里面是否存在该元素,如果存在的话,那么移除该日期
+		delete(removeDataTimeMap, av)
+
+		currentItem, ok := dataMap[av]
+		if !ok || currentItem == nil {
+			continue
+		}
+
+		//当前日期
+		currentDate, tmpErr := time.ParseInLocation(utils.FormatDate, av, time.Local)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		//上一年的日期
+		preDate := currentDate.AddDate(-1, 0, 0)
+		preDateStr := preDate.Format(utils.FormatDate)
+		if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
+			//dataTime, _ := time.ParseInLocation(utils.FormatDate, date, time.Local)
+			timestamp := currentDate.UnixNano() / 1e6
+			timestampStr := fmt.Sprintf("%d", timestamp)
+			val := TbzDiv(currentItem.Value, findItem.Value)
+
+			if existVal, ok := existDataMap[av]; !ok {
+				if _, existOk := existAddDataMap[av]; !existOk {
+					addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
+					isAdd = true
+
+					// 实际数据的值
+					if fromEdbInfo.LatestDate == av {
+						latestValueDecimal, tmpErr := decimal.NewFromString(val)
+						if tmpErr != nil {
+							return
+						}
+						latestValue, _ = latestValueDecimal.Truncate(4).Float64() //保留4位小数
+					}
+				}
+				existAddDataMap[av] = av
+			} else {
+				existValDecimal, tmpErr := decimal.NewFromString(existVal)
+				if tmpErr != nil {
+					err = tmpErr
+					return
+				}
+				existStr := existValDecimal.String()
+				if existStr != val {
+					sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+					sql = fmt.Sprintf(sql, dataTableName)
+					_, err = to.Raw(sql, val, edbInfoId, av).Exec()
+					if err != nil {
+						return
+					}
+				}
+			}
+			continue
+		} else {
+			if fromEdbInfo.Frequency == "月度" { //向上和向下,各找一个月
+				for i := 0; i <= 35; i++ {
+					nextDateDay := preDate.AddDate(0, 0, i)
+					nextDateDayStr := nextDateDay.Format(utils.FormatDate)
+					if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
+						timestamp := currentDate.UnixNano() / 1e6
+						timestampStr := fmt.Sprintf("%d", timestamp)
+						val := TbzDiv(currentItem.Value, findItem.Value)
+
+						if existVal, ok := existDataMap[av]; !ok {
+							if _, existOk := existAddDataMap[av]; !existOk {
+								addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
+								isAdd = true
+
+								// 实际数据的值
+								if fromEdbInfo.LatestDate == av {
+									latestValueDecimal, tmpErr := decimal.NewFromString(val)
+									if tmpErr != nil {
+										return
+									}
+									latestValue, _ = latestValueDecimal.Truncate(4).Float64() //保留4位小数
+								}
+							}
+							existAddDataMap[av] = av
+						} else {
+							existValDecimal, tmpErr := decimal.NewFromString(existVal)
+							if tmpErr != nil {
+								err = tmpErr
+								return
+							}
+							existStr := existValDecimal.String()
+							if existStr != val {
+								sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+								sql = fmt.Sprintf(sql, dataTableName)
+								_, err = to.Raw(sql, val, edbInfoId, av).Exec()
+								if err != nil {
+									return
+								}
+							}
+						}
+						break
+					} else {
+						preDateDay := preDate.AddDate(0, 0, -i)
+						preDateDayStr := preDateDay.Format(utils.FormatDate)
+						if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
+							timestamp := currentDate.UnixNano() / 1e6
+							timestampStr := fmt.Sprintf("%d", timestamp)
+							val := TbzDiv(currentItem.Value, findItem.Value)
+
+							if existVal, ok := existDataMap[av]; !ok {
+								if _, existOk := existAddDataMap[av]; !existOk {
+									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
+									isAdd = true
+
+									// 实际数据的值
+									if fromEdbInfo.LatestDate == av {
+										latestValueDecimal, tmpErr := decimal.NewFromString(val)
+										if tmpErr != nil {
+											return
+										}
+										latestValue, _ = latestValueDecimal.Truncate(4).Float64() //保留4位小数
+									}
+								}
+								existAddDataMap[av] = av
+							} else {
+								existValDecimal, tmpErr := decimal.NewFromString(existVal)
+								if tmpErr != nil {
+									err = tmpErr
+									return
+								}
+								existStr := existValDecimal.String()
+								if existStr != val {
+									sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+									sql = fmt.Sprintf(sql, dataTableName)
+									_, err = to.Raw(sql, val, edbInfoId, av).Exec()
+									if err != nil {
+										return
+									}
+								}
+							}
+							break
+						}
+					}
+				}
+			} else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {
+				if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
+					timestamp := currentDate.UnixNano() / 1e6
+					timestampStr := fmt.Sprintf("%d", timestamp)
+					val := TbzDiv(currentItem.Value, findItem.Value)
+
+					if existVal, ok := existDataMap[av]; !ok {
+						if _, existOk := existAddDataMap[av]; !existOk {
+							addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
+							isAdd = true
+
+							// 实际数据的值
+							if fromEdbInfo.LatestDate == av {
+								latestValueDecimal, tmpErr := decimal.NewFromString(val)
+								if tmpErr != nil {
+									return
+								}
+								latestValue, _ = latestValueDecimal.Truncate(4).Float64() //保留4位小数
+							}
+						}
+						existAddDataMap[av] = av
+					} else {
+						existValDecimal, tmpErr := decimal.NewFromString(existVal)
+						if tmpErr != nil {
+							err = tmpErr
+							return
+						}
+						existStr := existValDecimal.String()
+						if existStr != val {
+							sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+							sql = fmt.Sprintf(sql, dataTableName)
+							_, err = to.Raw(sql, val, edbInfoId, av).Exec()
+							if err != nil {
+								return
+							}
+						}
+					}
+					break
+				}
+			} else {
+				nextDateDay := preDate.AddDate(0, 0, 1)
+				nextDateDayStr := nextDateDay.Format(utils.FormatDate)
+
+				preDateDay := preDate.AddDate(0, 0, -1)
+				preDateDayStr := preDateDay.Format(utils.FormatDate)
+
+				for i := 0; i < 35; i++ {
+					if i >= 1 {
+						nextDateDay = nextDateDay.AddDate(0, 0, i)
+						nextDateDayStr = nextDateDay.Format(utils.FormatDate)
+					}
+					if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
+						timestamp := currentDate.UnixNano() / 1e6
+						timestampStr := fmt.Sprintf("%d", timestamp)
+						val := TbzDiv(currentItem.Value, findItem.Value)
+
+						if existVal, ok := existDataMap[av]; !ok {
+							if _, existOk := existAddDataMap[av]; !existOk {
+								addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
+								isAdd = true
+
+								// 实际数据的值
+								if fromEdbInfo.LatestDate == av {
+									latestValueDecimal, tmpErr := decimal.NewFromString(val)
+									if tmpErr != nil {
+										return
+									}
+									latestValue, _ = latestValueDecimal.Truncate(4).Float64() //保留4位小数
+								}
+							}
+							existAddDataMap[av] = av
+						} else {
+							existValDecimal, tmpErr := decimal.NewFromString(existVal)
+							if tmpErr != nil {
+								err = tmpErr
+								return
+							}
+							existStr := existValDecimal.String()
+							if existStr != val {
+								sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+								sql = fmt.Sprintf(sql, dataTableName)
+								_, err = to.Raw(sql, val, edbInfoId, av).Exec()
+								if err != nil {
+									return
+								}
+							}
+						}
+						break
+					} else {
+						if i >= 1 {
+							preDateDay = preDateDay.AddDate(0, 0, -i)
+							preDateDayStr = preDateDay.Format(utils.FormatDate)
+						}
+						if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
+							timestamp := currentDate.UnixNano() / 1e6
+							timestampStr := fmt.Sprintf("%d", timestamp)
+							val := TbzDiv(currentItem.Value, findItem.Value)
+
+							if existVal, ok := existDataMap[av]; !ok {
+								if _, existOk := existAddDataMap[av]; !existOk {
+									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
+									isAdd = true
+
+									// 实际数据的值
+									if fromEdbInfo.LatestDate == av {
+										latestValueDecimal, tmpErr := decimal.NewFromString(val)
+										if tmpErr != nil {
+											return
+										}
+										latestValue, _ = latestValueDecimal.Truncate(4).Float64() //保留4位小数
+									}
+								}
+								existAddDataMap[av] = av
+							} else {
+								existValDecimal, tmpErr := decimal.NewFromString(existVal)
+								if tmpErr != nil {
+									err = tmpErr
+									return
+								}
+								existStr := existValDecimal.String()
+								if existStr != val {
+									sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+									sql = fmt.Sprintf(sql, dataTableName)
+									_, err = to.Raw(sql, val, edbInfoId, av).Exec()
+									if err != nil {
+										return
+									}
+								}
+							}
+							break
+						}
+					}
+				}
+			}
+		}
+	}
+
+	//删除已经不存在的指标数据(由于该指标当日的数据删除了)
+	{
+		removeDateList := make([]string, 0)
+		for dateTime := range removeDataTimeMap {
+			removeDateList = append(removeDateList, dateTime)
+		}
+		removeNum := len(removeDateList)
+		if removeNum > 0 {
+			sql := fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time in (`+utils.GetOrmInReplace(removeNum)+`) `, dataTableName)
+			_, err = to.Raw(sql, edbInfo.EdbInfoId, removeDateList).Exec()
+			if err != nil {
+				fmt.Println(reflect.TypeOf(obj).Name(), " add data ;delete Err", err.Error())
+				err = fmt.Errorf("删除不存在的指标数据失败,Err:" + err.Error())
+				return
+			}
+		}
+	}
+
+	// 批量插入
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return
+		}
+	}
+
+	//确定实际数据的最终值
+	{
+		finalLast, tmpErr := GetFinalLastByTo(to, edbInfoId, edbInfo.Source, fromEdbInfo.LatestDate)
+		if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+			return
+		}
+		if tmpErr == nil {
+			latestDateStr = finalLast.DataTime
+			latestValue = finalLast.Value
+		}
+	}
+
+	return
+}
+
 // SavePredictCalculateTbz 新增/编辑 预测同比指标
 func SavePredictCalculateTbz(reqEdbInfoId, classifyId int, edbName, frequency, unit, formula string, fromEdbInfo *EdbInfo, edbCode, uniqueCode string, sysUserId int, sysUserRealName string) (edbInfo *EdbInfo, latestDateStr string, latestValue float64, err error, errMsg string) {
 	o := orm.NewOrm()
@@ -344,340 +951,3 @@ func SavePredictCalculateTbz(reqEdbInfoId, classifyId int, edbName, frequency, u
 	}
 	return
 }
-
-// RefreshAllPredictCalculateTbz 刷新所有同比值数据
-func RefreshAllPredictCalculateTbz(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode, startDate string) (latestDateStr string, latestValue float64, err error) {
-	o := orm.NewOrm()
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			fmt.Println("RefreshAllPredictCalculateTbz,Err:" + err.Error())
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-
-	// 获取关联指标数据
-	dataList, err := GetPredictEdbDataListAllByStartDate(fromEdbInfo, 1, startDate)
-	if err != nil {
-		return
-	}
-
-	latestDateStr = fromEdbInfo.LatestDate
-	//计算数据
-	var dateArr []string
-	dataMap := make(map[string]*EdbInfoSearchData)
-	for _, v := range dataList {
-		dateArr = append(dateArr, v.DataTime)
-		dataMap[v.DataTime] = v
-	}
-	fmt.Println("source:", source)
-	//获取指标所有数据
-	existDataList := make([]*EdbData, 0)
-	dataTableName := GetEdbDataTableName(source)
-	fmt.Println("dataTableName:", dataTableName)
-
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
-	if err != nil {
-		return
-	}
-	existDataMap := make(map[string]string)
-	for _, v := range existDataList {
-		existDataMap[v.DataTime] = v.Value
-	}
-	fmt.Println("existDataMap:", existDataMap)
-	addSql := ` INSERT INTO edb_data_predict_calculate_tbz (edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
-	var isAdd bool
-	existAddDataMap := make(map[string]string)
-	for _, av := range dateArr {
-		currentItem := dataMap[av]
-		if currentItem != nil {
-			//当前日期
-			currentDate, tmpErr := time.ParseInLocation(utils.FormatDate, av, time.Local)
-			if tmpErr != nil {
-				err = tmpErr
-				return
-			}
-			//上一年的日期
-			preDate := currentDate.AddDate(-1, 0, 0)
-			preDateStr := preDate.Format(utils.FormatDate)
-			if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
-				//dataTime, _ := time.ParseInLocation(utils.FormatDate, date, time.Local)
-				timestamp := currentDate.UnixNano() / 1e6
-				timestampStr := fmt.Sprintf("%d", timestamp)
-				val := TbzDiv(currentItem.Value, findItem.Value)
-
-				if existVal, ok := existDataMap[av]; !ok {
-					if _, existOk := existAddDataMap[av]; !existOk {
-						addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-						isAdd = true
-
-						// 实际数据的值
-						if fromEdbInfo.LatestDate == av {
-							latestValueDecimal, tmpErr := decimal.NewFromString(val)
-							if tmpErr != nil {
-								return
-							}
-							latestValue, _ = latestValueDecimal.Truncate(4).Float64() //保留4位小数
-						}
-					}
-					existAddDataMap[av] = av
-				} else {
-					existValDecimal, tmpErr := decimal.NewFromString(existVal)
-					if tmpErr != nil {
-						err = tmpErr
-						return
-					}
-					existStr := existValDecimal.String()
-					if existStr != val {
-						sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-						sql = fmt.Sprintf(sql, dataTableName)
-						_, err = o.Raw(sql, val, edbInfoId, av).Exec()
-						if err != nil {
-							return
-						}
-					}
-				}
-				continue
-			} else {
-				if fromEdbInfo.Frequency == "月度" { //向上和向下,各找一个月
-					for i := 0; i <= 35; i++ {
-						nextDateDay := preDate.AddDate(0, 0, i)
-						nextDateDayStr := nextDateDay.Format(utils.FormatDate)
-						if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
-							timestamp := currentDate.UnixNano() / 1e6
-							timestampStr := fmt.Sprintf("%d", timestamp)
-							val := TbzDiv(currentItem.Value, findItem.Value)
-
-							if existVal, ok := existDataMap[av]; !ok {
-								if _, existOk := existAddDataMap[av]; !existOk {
-									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-									isAdd = true
-
-									// 实际数据的值
-									if fromEdbInfo.LatestDate == av {
-										latestValueDecimal, tmpErr := decimal.NewFromString(val)
-										if tmpErr != nil {
-											return
-										}
-										latestValue, _ = latestValueDecimal.Truncate(4).Float64() //保留4位小数
-									}
-								}
-								existAddDataMap[av] = av
-							} else {
-								existValDecimal, tmpErr := decimal.NewFromString(existVal)
-								if tmpErr != nil {
-									err = tmpErr
-									return
-								}
-								existStr := existValDecimal.String()
-								if existStr != val {
-									sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-									sql = fmt.Sprintf(sql, dataTableName)
-									_, err = o.Raw(sql, val, edbInfoId, av).Exec()
-									if err != nil {
-										return
-									}
-								}
-							}
-							break
-						} else {
-							preDateDay := preDate.AddDate(0, 0, -i)
-							preDateDayStr := preDateDay.Format(utils.FormatDate)
-							if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
-								timestamp := currentDate.UnixNano() / 1e6
-								timestampStr := fmt.Sprintf("%d", timestamp)
-								val := TbzDiv(currentItem.Value, findItem.Value)
-
-								if existVal, ok := existDataMap[av]; !ok {
-									if _, existOk := existAddDataMap[av]; !existOk {
-										addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-										isAdd = true
-
-										// 实际数据的值
-										if fromEdbInfo.LatestDate == av {
-											latestValueDecimal, tmpErr := decimal.NewFromString(val)
-											if tmpErr != nil {
-												return
-											}
-											latestValue, _ = latestValueDecimal.Truncate(4).Float64() //保留4位小数
-										}
-									}
-									existAddDataMap[av] = av
-								} else {
-									existValDecimal, tmpErr := decimal.NewFromString(existVal)
-									if tmpErr != nil {
-										err = tmpErr
-										return
-									}
-									existStr := existValDecimal.String()
-									if existStr != val {
-										sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-										sql = fmt.Sprintf(sql, dataTableName)
-										_, err = o.Raw(sql, val, edbInfoId, av).Exec()
-										if err != nil {
-											return
-										}
-									}
-								}
-								break
-							}
-						}
-					}
-				} else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {
-					if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
-						timestamp := currentDate.UnixNano() / 1e6
-						timestampStr := fmt.Sprintf("%d", timestamp)
-						val := TbzDiv(currentItem.Value, findItem.Value)
-
-						if existVal, ok := existDataMap[av]; !ok {
-							if _, existOk := existAddDataMap[av]; !existOk {
-								addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-								isAdd = true
-
-								// 实际数据的值
-								if fromEdbInfo.LatestDate == av {
-									latestValueDecimal, tmpErr := decimal.NewFromString(val)
-									if tmpErr != nil {
-										return
-									}
-									latestValue, _ = latestValueDecimal.Truncate(4).Float64() //保留4位小数
-								}
-							}
-							existAddDataMap[av] = av
-						} else {
-							existValDecimal, tmpErr := decimal.NewFromString(existVal)
-							if tmpErr != nil {
-								err = tmpErr
-								return
-							}
-							existStr := existValDecimal.String()
-							if existStr != val {
-								sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-								sql = fmt.Sprintf(sql, dataTableName)
-								_, err = o.Raw(sql, val, edbInfoId, av).Exec()
-								if err != nil {
-									return
-								}
-							}
-						}
-						break
-					}
-				} else {
-					nextDateDay := preDate.AddDate(0, 0, 1)
-					nextDateDayStr := nextDateDay.Format(utils.FormatDate)
-
-					preDateDay := preDate.AddDate(0, 0, -1)
-					preDateDayStr := preDateDay.Format(utils.FormatDate)
-
-					for i := 0; i < 35; i++ {
-						if i >= 1 {
-							nextDateDay = nextDateDay.AddDate(0, 0, i)
-							nextDateDayStr = nextDateDay.Format(utils.FormatDate)
-						}
-						if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
-							timestamp := currentDate.UnixNano() / 1e6
-							timestampStr := fmt.Sprintf("%d", timestamp)
-							val := TbzDiv(currentItem.Value, findItem.Value)
-
-							if existVal, ok := existDataMap[av]; !ok {
-								if _, existOk := existAddDataMap[av]; !existOk {
-									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-									isAdd = true
-
-									// 实际数据的值
-									if fromEdbInfo.LatestDate == av {
-										latestValueDecimal, tmpErr := decimal.NewFromString(val)
-										if tmpErr != nil {
-											return
-										}
-										latestValue, _ = latestValueDecimal.Truncate(4).Float64() //保留4位小数
-									}
-								}
-								existAddDataMap[av] = av
-							} else {
-								existValDecimal, tmpErr := decimal.NewFromString(existVal)
-								if tmpErr != nil {
-									err = tmpErr
-									return
-								}
-								existStr := existValDecimal.String()
-								if existStr != val {
-									sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-									sql = fmt.Sprintf(sql, dataTableName)
-									_, err = o.Raw(sql, val, edbInfoId, av).Exec()
-									if err != nil {
-										return
-									}
-								}
-							}
-							break
-						} else {
-							if i >= 1 {
-								preDateDay = preDateDay.AddDate(0, 0, -i)
-								preDateDayStr = preDateDay.Format(utils.FormatDate)
-							}
-							if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
-								timestamp := currentDate.UnixNano() / 1e6
-								timestampStr := fmt.Sprintf("%d", timestamp)
-								val := TbzDiv(currentItem.Value, findItem.Value)
-
-								if existVal, ok := existDataMap[av]; !ok {
-									if _, existOk := existAddDataMap[av]; !existOk {
-										addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-										isAdd = true
-
-										// 实际数据的值
-										if fromEdbInfo.LatestDate == av {
-											latestValueDecimal, tmpErr := decimal.NewFromString(val)
-											if tmpErr != nil {
-												return
-											}
-											latestValue, _ = latestValueDecimal.Truncate(4).Float64() //保留4位小数
-										}
-									}
-									existAddDataMap[av] = av
-								} else {
-									existValDecimal, tmpErr := decimal.NewFromString(existVal)
-									if tmpErr != nil {
-										err = tmpErr
-										return
-									}
-									existStr := existValDecimal.String()
-									if existStr != val {
-										sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-										sql = fmt.Sprintf(sql, dataTableName)
-										_, err = o.Raw(sql, val, edbInfoId, av).Exec()
-										if err != nil {
-											return
-										}
-									}
-								}
-								break
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = o.Raw(addSql).Exec()
-		if err != nil {
-			return
-		}
-	}
-	return
-}