Browse Source

fix:新增刷新预测运算指标接口

Roc 2 years ago
parent
commit
6d85a6235a

+ 141 - 279
controllers/base_from_predict_calculate.go

@@ -527,6 +527,11 @@ func (this *PredictCalculateController) CalculateBatchSave() {
 	condition += " AND edb_name=? "
 	pars = append(pars, req.EdbName)
 
+	if req.EdbInfoId > 0 {
+		condition += " AND edb_info_id !=? "
+		pars = append(pars, req.EdbInfoId)
+	}
+
 	count, err := models.GetEdbInfoCountByCondition(condition, pars)
 	if err != nil {
 		br.Msg = "判断指标名称是否存在失败"
@@ -638,283 +643,140 @@ func (this *PredictCalculateController) CalculateBatchSave() {
 // @Description 刷新计算指标接口
 // @Success 200 {object} models.RefreshEdbInfoReq
 // @router /refresh [post]
+func (this *PredictCalculateController) Refresh() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.RefreshEdbInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.EdbCode == "" {
+		br.Msg = "请输入指标编码!"
+		br.ErrMsg = "请输入指标编码,指标编码为空"
+		return
+	}
+	if req.EdbInfoId <= 0 {
+		br.Msg = "请输入指标ID!"
+		br.ErrMsg = "请输入指标ID"
+		return
+	}
+	edbInfo, err := models.GetEdbInfoById(req.EdbInfoId)
+	if err != nil {
+		br.Msg = "指标不存在!"
+		br.ErrMsg = "指标不存在"
+		return
+	}
+
+	cacheKey = utils.CACHE_EDB_DATA_REFRESH + strconv.Itoa(edbInfo.Source) + "_" + req.EdbCode
+	if utils.Rc.IsExist(cacheKey) {
+		br.Ret = 501
+		br.Success = true
+		br.Msg = "系统处理中,请稍后重试"
+		br.IsSendEmail = false
+	}
 
-//func (this *PredictCalculateController) Refresh() {
-//	br := new(models.BaseResponse).Init()
-//	var cacheKey string
-//	defer func() {
-//		this.Data["json"] = br
-//		this.ServeJSON()
-//	}()
-//	var req models.RefreshEdbInfoReq
-//	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
-//	if err != nil {
-//		br.Msg = "参数解析异常!"
-//		br.ErrMsg = "参数解析失败,Err:" + err.Error()
-//		return
-//	}
-//	if req.EdbCode == "" {
-//		br.Msg = "请输入指标编码!"
-//		br.ErrMsg = "请输入指标编码,指标编码为空"
-//		return
-//	}
-//	if req.EdbInfoId <= 0 {
-//		br.Msg = "请输入指标ID!"
-//		br.ErrMsg = "请输入指标ID"
-//		return
-//	}
-//	edbInfo, err := models.GetEdbInfoById(req.EdbInfoId)
-//	if err != nil {
-//		br.Msg = "指标不存在!"
-//		br.ErrMsg = "指标不存在"
-//		return
-//	}
-//
-//	cacheKey = utils.CACHE_EDB_DATA_REFRESH + strconv.Itoa(edbInfo.Source) + "_" + req.EdbCode
-//	if !utils.Rc.IsExist(cacheKey) {
-//		utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
-//		defer func() {
-//			_ = utils.Rc.Delete(cacheKey)
-//
-//		}()
-//		startDate := req.StartDate
-//		var errMsg string
-//		endDate := time.Now().Format(utils.FormatDate)
-//		edbInfoId := edbInfo.EdbInfoId
-//		source := edbInfo.Source
-//
-//		switch source {
-//		case utils.DATA_SOURCE_CALCULATE:
-//			//startDate = edbInfo.StartDate
-//			//sTime, err := time.Parse(utils.FormatDate, edbInfo.EndDate)
-//			//if err != nil {
-//			//	return
-//			//}
-//			//startDate = sTime.Format(utils.FormatDate)
-//			startDate = ""
-//			var edbInfoIdBytes []string
-//			calculateMap, err := models.GetEdbInfoCalculateDetailList(edbInfo.EdbInfoId)
-//			if err != nil {
-//				errMsg = "GetEdbInfoCalculateDetail Err:" + err.Error()
-//				break
-//			}
-//			var formulaStr string
-//			edbInfoList := make([]*models.EdbInfo, 0)
-//
-//			for _, v := range calculateMap {
-//				formulaStr += v.FromTag + ","
-//				edbInfoIdBytes = append(edbInfoIdBytes, v.FromTag)
-//				edbInfo, _ := models.GetEdbInfoById(v.FromEdbInfoId)
-//				edbInfoList = append(edbInfoList, edbInfo)
-//			}
-//			err = models.RefreshAllCalculate(edbInfoList, edbInfo.EdbInfoId, source, edbInfo.EdbCode, edbInfo.CalculateFormula, startDate, endDate, edbInfoIdBytes)
-//			if err != nil && err.Error() != utils.ErrNoRow() {
-//				errMsg = "RefreshCalculate Err:" + err.Error()
-//				break
-//			}
-//		case utils.DATA_SOURCE_CALCULATE_LJZZY: //刷新累计值转月值
-//			calculateLjzzy, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
-//			if err != nil {
-//				errMsg = "GetEdbInfoCalculateLjzzyDetail Err:" + err.Error()
-//				break
-//			}
-//			fromEdbInfo, err := models.GetEdbInfoById(calculateLjzzy.FromEdbInfoId)
-//			if err != nil {
-//				errMsg = "GetEdbInfoById Err:" + err.Error()
-//				break
-//			}
-//			startDate = edbInfo.StartDate
-//			endDate = time.Now().Format(utils.FormatDate)
-//			err = models.RefreshAllCalculateLjzzy(edbInfoId, source, fromEdbInfo, calculateLjzzy.EdbCode, startDate, endDate)
-//			if err != nil && err.Error() != utils.ErrNoRow() {
-//				errMsg = "RefreshAllCalculateLjzzy Err:" + err.Error()
-//				break
-//			}
-//		case utils.DATA_SOURCE_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
-//			endDate = time.Now().Format(utils.FormatDate)
-//			err = models.RefreshAllCalculateTbz(edbInfoId, source, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate)
-//			if err != nil && err.Error() != utils.ErrNoRow() {
-//				errMsg = "RefreshAllCalculateTbz Err:" + err.Error()
-//				break
-//			}
-//		case utils.DATA_SOURCE_CALCULATE_TCZ: //同差值
-//			calculateTcz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
-//			if err != nil {
-//				errMsg = "GetEdbInfoCalculateTczDetail Err:" + err.Error()
-//				break
-//			}
-//			fromEdbInfo, err := models.GetEdbInfoById(calculateTcz.FromEdbInfoId)
-//			if err != nil {
-//				errMsg = "GetEdbInfoById Err:" + err.Error()
-//				break
-//			}
-//			startDate = edbInfo.StartDate
-//			endDate = time.Now().Format(utils.FormatDate)
-//			err = models.RefreshAllCalculateTcz(edbInfoId, source, fromEdbInfo, calculateTcz.EdbCode, startDate, endDate)
-//			if err != nil && err.Error() != utils.ErrNoRow() {
-//				errMsg = "RefreshCalculateTcz Err:" + err.Error()
-//				break
-//			}
-//		case utils.DATA_SOURCE_CALCULATE_NSZYDPJJS: //N数值移动平均计算
-//			calculateNszydpjjs, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
-//			if err != nil {
-//				errMsg = "GetEdbInfoCalculateNszydpjjsDetail Err:" + err.Error()
-//				break
-//			}
-//			fromEdbInfo, err := models.GetEdbInfoById(calculateNszydpjjs.FromEdbInfoId)
-//			if err != nil {
-//				errMsg = "GetEdbInfoById Err:" + err.Error()
-//				break
-//			}
-//			formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
-//			startDate = edbInfo.StartDate
-//			err = models.RefreshAllCalculateNszydpjjs(edbInfoId, edbInfo.Source, formulaInt, fromEdbInfo, calculateNszydpjjs.EdbCode, startDate)
-//			if err != nil && err.Error() != utils.ErrNoRow() {
-//				errMsg = "RefreshCalculateNszydpjjs Err:" + err.Error()
-//				break
-//			}
-//		case utils.DATA_SOURCE_CALCULATE_HBZ: //刷新环比值
-//			calculateTbz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
-//			if err != nil {
-//				errMsg = "GetEdbInfoCalculateHbzDetail Err:" + err.Error()
-//				break
-//			}
-//			fromEdbInfo, err := models.GetEdbInfoById(calculateTbz.FromEdbInfoId)
-//			if err != nil {
-//				errMsg = "GetEdbInfoById Err:" + err.Error()
-//				break
-//			}
-//			startDate = edbInfo.StartDate
-//			endDate = time.Now().Format(utils.FormatDate)
-//			formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
-//			err = models.RefreshAllCalculateHbz(edbInfoId, source, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate, formulaInt)
-//			if err != nil && err.Error() != utils.ErrNoRow() {
-//				errMsg = "RefreshAllCalculateHbz Err:" + err.Error()
-//				break
-//			}
-//		case utils.DATA_SOURCE_CALCULATE_HCZ: //刷新环差值
-//			calculateTbz, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
-//			if err != nil {
-//				errMsg = "GetEdbInfoCalculateHczDetail Err:" + err.Error()
-//				break
-//			}
-//			fromEdbInfo, err := models.GetEdbInfoById(calculateTbz.FromEdbInfoId)
-//			if err != nil {
-//				errMsg = "GetEdbInfoById Err:" + err.Error()
-//				break
-//			}
-//			startDate = edbInfo.StartDate
-//			endDate = time.Now().Format(utils.FormatDate)
-//			formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
-//			err = models.RefreshAllCalculateHcz(edbInfoId, source, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate, formulaInt)
-//			if err != nil && err.Error() != utils.ErrNoRow() {
-//				errMsg = "RefreshAllCalculateHcz Err:" + err.Error()
-//				break
-//			}
-//		case utils.DATA_SOURCE_CALCULATE_BP: //刷新变频
-//			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
-//			endDate = time.Now().Format(utils.FormatDate)
-//			err = models.RefreshAllCalculateBp(edbInfoId, source, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate)
-//			if err != nil && err.Error() != utils.ErrNoRow() {
-//				errMsg = "RefreshAllCalculateBp Err:" + err.Error()
-//				break
-//			}
-//		case utils.DATA_SOURCE_CALCULATE_TIME_SHIFT:
-//			calculate, err := models.GetEdbInfoCalculateMappingDetail(edbInfoId)
-//			if err != nil {
-//				errMsg = "GetEdbInfoCalculateTbzDetail Err:" + err.Error()
-//				break
-//			}
-//			fromEdbInfo, err := models.GetEdbInfoById(calculate.FromEdbInfoId)
-//			if err != nil {
-//				errMsg = "GetEdbInfoById Err:" + err.Error()
-//				break
-//			}
-//			startDate = edbInfo.StartDate
-//			endDate = time.Now().Format(utils.FormatDate)
-//			formulaInt, _ := strconv.Atoi(calculate.CalculateFormula)
-//			err = models.RefreshAllCalculateTimeShift(edbInfoId, source, formulaInt, calculate.MoveType, fromEdbInfo, calculate.EdbCode, startDate, endDate, calculate.MoveFrequency)
-//			if err != nil && err.Error() != utils.ErrNoRow() {
-//				errMsg = "RefreshAllCalculateTimeShift Err:" + err.Error()
-//			}
-//		case utils.DATA_SOURCE_CALCULATE_ZJPJ: //刷新直接拼接
-//			err = models.RefreshAllCalculateZjpj(edbInfo)
-//			if err != nil && err.Error() != utils.ErrNoRow() {
-//				errMsg = "RefreshAllCalculateZjpj Err:" + err.Error()
-//				break
-//			}
-//		case utils.DATA_SOURCE_CALCULATE_LJZTBPJ: //刷新累计值同比拼接
-//			err = models.RefreshAllCalculateLjztbpj(edbInfo)
-//			if err != nil && err.Error() != utils.ErrNoRow() {
-//				errMsg = "RefreshAllCalculateLjztbpj Err:" + err.Error()
-//				break
-//			}
-//		case utils.DATA_SOURCE_PYTHON: //python代码运算
-//			edbPythonCode, err := models.GetEdbPythonCodeById(edbInfo.EdbInfoId)
-//			if err != nil {
-//				errMsg = "获取python代码失败 Err:" + err.Error()
-//				break
-//			}
-//			edbData, err, errMsg := services.ExecPythonCode(edbInfo.EdbCode, edbPythonCode.PythonCode)
-//			if err != nil {
-//				br.Msg = "获取数据失败"
-//				br.ErrMsg = "python代码获取数据失败,err:" + err.Error()
-//				if errMsg != "" {
-//					br.ErrMsg = errMsg
-//				}
-//				return
-//			}
-//			err = models.RefreshAllPythonEdb(edbInfo, edbData)
-//			if err != nil && err.Error() != utils.ErrNoRow() {
-//				errMsg = "RefreshAllPythonEdb Err:" + err.Error()
-//				break
-//			}
-//
-//		default:
-//			br.Msg = "来源异常,请联系相关开发!"
-//			br.ErrMsg = "来源异常,请联系相关开发"
-//			return
-//		}
-//		if errMsg != `` {
-//			br.Msg = "刷新指标失败!"
-//			br.ErrMsg = "刷新指标失败,err:" + errMsg
-//			return
-//		}
-//
-//		// 更新指标最大最小值
-//		err, errMsg := models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
-//		if err != nil {
-//			br.Msg = errMsg
-//			br.ErrMsg = err.Error()
-//			return
-//		}
-//		br.Ret = 200
-//		br.Success = true
-//		br.Msg = "获取成功"
-//	} else {
-//		br.Ret = 501
-//		br.Success = true
-//		br.Msg = "系统处理中,请稍后重试"
-//	}
-//}
+	utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+	defer func() {
+		_ = utils.Rc.Delete(cacheKey)
+
+	}()
+	startDate := req.StartDate
+	var errMsg string
+	edbInfoId := edbInfo.EdbInfoId
+	source := edbInfo.Source
+
+	var latestDateStr string // 最近实际数据的日期
+	var latestValue float64  // 最近实际数据的值
+	switch source {
+	case utils.DATA_SOURCE_PREDICT_CALCULATE:
+		//startDate = edbInfo.StartDate
+		//sTime, err := time.Parse(utils.FormatDate, edbInfo.EndDate)
+		//if err != nil {
+		//	return
+		//}
+		//startDate = sTime.Format(utils.FormatDate)
+		startDate = ""
+		var edbInfoIdBytes []string
+		calculateMap, err := models.GetEdbInfoCalculateDetailList(edbInfo.EdbInfoId)
+		if err != nil {
+			errMsg = "GetEdbInfoCalculateDetail Err:" + err.Error()
+			break
+		}
+		var formulaStr string
+		edbInfoList := make([]*models.EdbInfo, 0)
+
+		for _, v := range calculateMap {
+			formulaStr += v.FromTag + ","
+			edbInfoIdBytes = append(edbInfoIdBytes, v.FromTag)
+			edbInfo, _ := models.GetEdbInfoById(v.FromEdbInfoId)
+			edbInfoList = append(edbInfoList, edbInfo)
+		}
+		latestDateStr, latestValue, err = models.RefreshAllPredictCalculate(edbInfoList, edbInfo.EdbInfoId, source, edbInfo.EdbCode, edbInfo.CalculateFormula, startDate, edbInfoIdBytes)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			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 {
+			errMsg = "GetEdbInfoCalculateTczDetail Err:" + err.Error()
+			break
+		}
+		fromEdbInfo, err := models.GetEdbInfoById(calculateTcz.FromEdbInfoId)
+		if err != nil {
+			errMsg = "GetEdbInfoById Err:" + err.Error()
+			break
+		}
+		startDate = edbInfo.StartDate
+		latestDateStr, latestValue, err = models.RefreshAllPredictCalculateTcz(edbInfoId, source, fromEdbInfo, calculateTcz.EdbCode, startDate)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			errMsg = "RefreshCalculateTcz Err:" + err.Error()
+			break
+		}
+	default:
+		br.Msg = "来源异常,请联系相关开发!"
+		br.ErrMsg = "来源异常,请联系相关开发"
+		return
+	}
+	if errMsg != `` {
+		br.Msg = "刷新指标失败!"
+		br.ErrMsg = "刷新指标失败,err:" + errMsg
+		return
+	}
+
+	// 更新指标最大最小值
+	err, errMsg = models.UnifiedModifyPredictEdbInfoMaxAndMinInfo(edbInfo, latestDateStr, latestValue)
+	if err != nil {
+		br.Msg = errMsg
+		br.ErrMsg = err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}

+ 41 - 29
models/base_predict_from_calculate.go

@@ -194,7 +194,7 @@ func AddPredictCalculateData(edbInfoIdList []*EdbInfo, edbInfoId int, edbCode, f
 }
 
 // RefreshAllPredictCalculate 刷新预测计算指标的全部数据
-func RefreshAllPredictCalculate(edbInfoIdList []*EdbInfo, edbInfoId, source int, edbCode, formulaStr, startDate, endDate string, edbInfoIdBytes []string) (err error) {
+func RefreshAllPredictCalculate(edbInfoIdList []*EdbInfo, edbInfoId, source int, edbCode, formulaStr, startDate string, edbInfoIdBytes []string) (latestDateStr string, latestValue float64, err error) {
 	o := orm.NewOrm()
 	to, err := o.Begin()
 	if err != nil {
@@ -208,25 +208,25 @@ func RefreshAllPredictCalculate(edbInfoIdList []*EdbInfo, edbInfoId, source int,
 			_ = to.Commit()
 		}
 	}()
-	fmt.Println(startDate, endDate)
+	fmt.Println(startDate)
+
+	var minLatestDate time.Time
 	saveDataMap := make(map[string]map[int]float64)
 	for _, v := range edbInfoIdList {
-		var condition string
-		var pars []interface{}
-		condition += " AND edb_info_id=? "
-		pars = append(pars, v.EdbInfoId)
-		if startDate != "" {
-			condition += " AND data_time>=? "
-			pars = append(pars, startDate)
+		tmpLatestDate, tmpErr := time.ParseInLocation(utils.FormatDate, v.LatestDate, time.Local)
+		if tmpErr != nil {
+			err = errors.New(`最近的日期格式化失败;日期:` + v.LatestDate + `;err:` + tmpErr.Error())
+			return
 		}
-		//if endDate != "" {
-		//	condition += " AND data_time<=? "
-		//	pars = append(pars, endDate)
-		//}
-		//fmt.Println("v.Source:", v.Source)
-		dataList, err := GetEdbDataListAll(condition, pars, v.Source, 1)
-		if err != nil {
-			return err
+		if minLatestDate.IsZero() || tmpLatestDate.Before(minLatestDate) {
+			minLatestDate = tmpLatestDate
+		}
+
+		// 获取关联指标数据
+		dataList, tmpErr := GetPredictEdbDataListAllByStartDate(v, 1, startDate)
+		if tmpErr != nil {
+			err = tmpErr
+			return
 		}
 		dataMap := make(map[string]float64)
 		for _, dv := range dataList {
@@ -246,8 +246,11 @@ func RefreshAllPredictCalculate(edbInfoIdList []*EdbInfo, edbInfoId, source int,
 	}
 
 	formulaMap := services.CheckFormula(formulaStr)
-	addSql := ` INSERT INTO edb_data_calculate(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	addSql := ` INSERT INTO edb_data_predict_calculate (edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
 	var isAdd bool
+	if !minLatestDate.IsZero() {
+		latestDateStr = minLatestDate.Format(utils.FormatDate)
+	}
 
 	//获取指标所有数据
 	dataList := make([]*EdbData, 0)
@@ -256,7 +259,7 @@ func RefreshAllPredictCalculate(edbInfoIdList []*EdbInfo, edbInfoId, source int,
 	sql = fmt.Sprintf(sql, dataTableName)
 	_, err = o.Raw(sql, edbInfoId).QueryRows(&dataList)
 	if err != nil {
-		return err
+		return
 	}
 	dataMap := make(map[string]string)
 	for _, v := range dataList {
@@ -273,22 +276,27 @@ func RefreshAllPredictCalculate(edbInfoIdList []*EdbInfo, edbInfoId, source int,
 		if formulaFormStr != "" {
 			utils.FileLog.Info(fmt.Sprintf("formulaFormStr:%s", formulaFormStr))
 			expression := formula.NewExpression(formulaFormStr)
-			calResult, err := expression.Evaluate()
-			if err != nil {
+			calResult, tmpErr := expression.Evaluate()
+			if tmpErr != nil {
 				// 分母为0的报错
 				if strings.Contains(err.Error(), "divide by zero") {
 					removeDateList = append(removeDateList, sk)
 					continue
 				}
-				err = errors.New("计算失败:Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
+				err = errors.New("计算失败:Err:" + tmpErr.Error() + ";formulaStr:" + formulaFormStr)
 				fmt.Println(err)
-				return err
+				return
 			}
-			calVal, err := calResult.Float64()
-			if err != nil {
-				err = errors.New("计算失败:获取计算值失败 Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
+			calVal, tmpErr := calResult.Float64()
+			if tmpErr != nil {
+				err = errors.New("计算失败:获取计算值失败 Err:" + tmpErr.Error() + ";formulaStr:" + formulaFormStr)
 				fmt.Println(err)
-				return err
+				return
+			}
+
+			// 最近实际日期的实际数据
+			if latestDateStr == sk {
+				latestValue, _ = decimal.NewFromFloat(calVal).Truncate(4).Float64() //保留4位小数
 			}
 
 			saveValue := decimal.NewFromFloat(calVal).RoundCeil(4).String() //utils.SubFloatToString(calVal, 4)
@@ -303,14 +311,18 @@ func RefreshAllPredictCalculate(edbInfoIdList []*EdbInfo, edbInfoId, source int,
 				}
 				existDataMap[sk] = sk
 			} else {
-				existValDecimal, err := decimal.NewFromString(existVal)
+				existValDecimal, tmpErr := decimal.NewFromString(existVal)
+				if tmpErr != nil {
+					err = tmpErr
+					return
+				}
 				existStr := existValDecimal.String()
 				if existStr != saveValue {
 					sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
 					sql = fmt.Sprintf(sql, dataTableName)
 					_, err = o.Raw(sql, saveValue, edbInfoId, sk).Exec()
 					if err != nil {
-						return err
+						return
 					}
 				}
 			}

+ 26 - 4
models/edb_info.go

@@ -412,17 +412,17 @@ func getPredictEdbDayList(startDate, endDate time.Time, frequency string) (dayLi
 }
 
 // GetPredictDataListByPredictEdbInfoId 根据预测指标id获取预测指标的数据,order:1升序,其余值为降序
-func GetPredictDataListByPredictEdbInfoId(edbInfoId, order int) (dataList []*EdbInfoSearchData, sourceEdbInfoItem *EdbInfo, predictEdbConf *PredictEdbConf, err error, errMsg string) {
+func GetPredictDataListByPredictEdbInfoId(edbInfoId, order int, startDate string) (dataList []*EdbInfoSearchData, sourceEdbInfoItem *EdbInfo, predictEdbConf *PredictEdbConf, err error, errMsg string) {
 	edbInfo, err := GetEdbInfoById(edbInfoId)
 	if err != nil {
 		errMsg = `获取预测指标信息失败`
 		return
 	}
-	return GetPredictDataListByPredictEdbInfo(edbInfo, order)
+	return GetPredictDataListByPredictEdbInfo(edbInfo, order, startDate)
 }
 
 // GetPredictDataListByPredictEdbInfo 根据预测指标信息获取预测指标的数据,order:1升序,其余值为降序
-func GetPredictDataListByPredictEdbInfo(edbInfo *EdbInfo, order int) (dataList []*EdbInfoSearchData, sourceEdbInfoItem *EdbInfo, predictEdbConf *PredictEdbConf, err error, errMsg string) {
+func GetPredictDataListByPredictEdbInfo(edbInfo *EdbInfo, order int, startDate string) (dataList []*EdbInfoSearchData, sourceEdbInfoItem *EdbInfo, predictEdbConf *PredictEdbConf, err error, errMsg string) {
 	// 查找该预测指标配置
 	predictEdbConf, err = GetPredictEdbConfById(edbInfo.EdbInfoId)
 	if err != nil && err.Error() != utils.ErrNoRow() {
@@ -450,6 +450,10 @@ func GetPredictDataListByPredictEdbInfo(edbInfo *EdbInfo, order int) (dataList [
 	var pars []interface{}
 	condition += " AND edb_info_id=? "
 	pars = append(pars, sourceEdbInfoItem.EdbInfoId)
+	if startDate != "" {
+		condition += " AND data_time>=? "
+		pars = append(pars, startDate)
+	}
 	dataList, err = GetEdbDataListAll(condition, pars, sourceEdbInfoItem.Source, order)
 	if err != nil {
 		return
@@ -484,7 +488,7 @@ func GetPredictDataListByPredictEdbInfo(edbInfo *EdbInfo, order int) (dataList [
 // GetPredictEdbDataListAll 获取该预测指标所有的数据 ,order:1升序,其余值为降序
 func GetPredictEdbDataListAll(edbInfo *EdbInfo, order int) (items []*EdbInfoSearchData, err error) {
 	if edbInfo.Source == utils.DATA_SOURCE_PREDICT { //普通的预测指标是没有入库数据的,直接往配置里面获取
-		items, _, _, err, _ = GetPredictDataListByPredictEdbInfo(edbInfo, 1)
+		items, _, _, err, _ = GetPredictDataListByPredictEdbInfo(edbInfo, 1, "")
 	} else {
 		var condition string
 		var pars []interface{}
@@ -495,6 +499,24 @@ func GetPredictEdbDataListAll(edbInfo *EdbInfo, order int) (items []*EdbInfoSear
 	return
 }
 
+// GetPredictEdbDataListAllByStartDate 根据开始日期获取该预测指标所有的数据 ,order:1升序,其余值为降序
+func GetPredictEdbDataListAllByStartDate(edbInfo *EdbInfo, order int, startDate string) (items []*EdbInfoSearchData, err error) {
+	if edbInfo.Source == utils.DATA_SOURCE_PREDICT { //普通的预测指标是没有入库数据的,直接往配置里面获取
+		items, _, _, err, _ = GetPredictDataListByPredictEdbInfo(edbInfo, 1, startDate)
+	} else {
+		var condition string
+		var pars []interface{}
+		condition += " AND edb_info_id=? "
+		pars = append(pars, edbInfo.EdbInfoId)
+		if startDate != "" {
+			condition += " AND data_time>=? "
+			pars = append(pars, startDate)
+		}
+		items, err = GetEdbDataListAll(condition, pars, edbInfo.Source, order)
+	}
+	return
+}
+
 // ModifyPredictEdbInfoMaxAndMinInfo 修改预测指标的最新数据信息
 func ModifyPredictEdbInfoMaxAndMinInfo(edbInfoId int, item *EdbInfoMaxAndMinInfo) (err error) {
 	o := orm.NewOrm()

+ 106 - 38
models/predict_edb_data_calculate_tbz.go

@@ -311,7 +311,7 @@ func SavePredictCalculateTbz(reqEdbInfoId, classifyId int, edbName, frequency, u
 }
 
 // RefreshAllPredictCalculateTbz 刷新所有同比值数据
-func RefreshAllPredictCalculateTbz(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string) (err error) {
+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 {
@@ -319,7 +319,7 @@ func RefreshAllPredictCalculateTbz(edbInfoId, source int, fromEdbInfo *EdbInfo,
 	}
 	defer func() {
 		if err != nil {
-			fmt.Println("RefreshAllCalculateTbz,Err:" + err.Error())
+			fmt.Println("RefreshAllPredictCalculateTbz,Err:" + err.Error())
 			_ = to.Rollback()
 		} else {
 			_ = to.Commit()
@@ -330,27 +330,15 @@ func RefreshAllPredictCalculateTbz(edbInfoId, source int, fromEdbInfo *EdbInfo,
 		return
 	}
 	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
 
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, fromEdbInfo.EdbInfoId)
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-	//if endDate != "" {
-	//	condition += " AND data_time<=? "
-	//	pars = append(pars, endDate)
-	//}
-
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
+	// 获取关联指标数据
+	dataList, err := GetPredictEdbDataListAllByStartDate(fromEdbInfo, 0, startDate)
 	if err != nil {
-		return err
+		return
 	}
+
+	latestDateStr = fromEdbInfo.LatestDate
+	//计算数据
 	var dateArr []string
 	dataMap := make(map[string]*EdbInfoSearchData)
 	for _, v := range dataList {
@@ -362,27 +350,29 @@ func RefreshAllPredictCalculateTbz(edbInfoId, source int, fromEdbInfo *EdbInfo,
 	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 err
+		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 `
+	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, err := time.Parse(utils.FormatDate, av)
-			if err != nil {
-				return err
+			currentDate, tmpErr := time.Parse(utils.FormatDate, av)
+			if tmpErr != nil {
+				err = tmpErr
+				return
 			}
 			//上一年的日期
 			preDate := currentDate.AddDate(-1, 0, 0)
@@ -397,17 +387,30 @@ func RefreshAllPredictCalculateTbz(edbInfoId, source int, fromEdbInfo *EdbInfo,
 					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, err := decimal.NewFromString(existVal)
+					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 err
+							return
 						}
 					}
 				}
@@ -426,17 +429,30 @@ func RefreshAllPredictCalculateTbz(edbInfoId, source int, fromEdbInfo *EdbInfo,
 								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, err := decimal.NewFromString(existVal)
+								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 err
+										return
 									}
 								}
 							}
@@ -453,17 +469,30 @@ func RefreshAllPredictCalculateTbz(edbInfoId, source int, fromEdbInfo *EdbInfo,
 									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, err := decimal.NewFromString(existVal)
+									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 err
+											return
 										}
 									}
 								}
@@ -481,17 +510,30 @@ func RefreshAllPredictCalculateTbz(edbInfoId, source int, fromEdbInfo *EdbInfo,
 							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, err := decimal.NewFromString(existVal)
+							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 err
+									return
 								}
 							}
 						}
@@ -518,17 +560,30 @@ func RefreshAllPredictCalculateTbz(edbInfoId, source int, fromEdbInfo *EdbInfo,
 								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, err := decimal.NewFromString(existVal)
+								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 err
+										return
 									}
 								}
 							}
@@ -547,17 +602,30 @@ func RefreshAllPredictCalculateTbz(edbInfoId, source int, fromEdbInfo *EdbInfo,
 									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, err := decimal.NewFromString(existVal)
+									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 err
+											return
 										}
 									}
 								}
@@ -573,7 +641,7 @@ func RefreshAllPredictCalculateTbz(edbInfoId, source int, fromEdbInfo *EdbInfo,
 		addSql = strings.TrimRight(addSql, ",")
 		_, err = o.Raw(addSql).Exec()
 		if err != nil {
-			return err
+			return
 		}
 	}
 	return

+ 103 - 284
models/predict_edb_data_calculate_tcz.go

@@ -314,256 +314,8 @@ func SavePredictCalculateTcz(reqEdbInfoId, classifyId int, edbName, frequency, u
 	return
 }
 
-// EditPredictCalculateTcz 同差值
-func EditPredictCalculateTcz(req *EdbInfoCalculateBatchEditReq, fromEdbInfo *EdbInfo, edbCode string) (edbInfoId int, err error) {
-	edbInfoId = req.EdbInfoId
-	o := orm.NewOrm()
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			fmt.Println("EditCalculateTcz,Err:" + err.Error())
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-
-	//修改指标信息
-	sql := ` UPDATE  edb_info
-			SET
-			  edb_name =?,
-			  edb_name_source=?,
-			  frequency = ?,
-			  unit = ?,
-			  classify_id = ?,
-			  modify_time = NOW()
-			WHERE edb_info_id = ? `
-	_, err = o.Raw(sql, req.EdbName, req.EdbName, req.Frequency, req.Unit, req.ClassifyId, edbInfoId).Exec()
-	if err != nil {
-		return
-	}
-
-	var existCondition string
-	var existPars []interface{}
-	existCondition += " AND edb_info_id=? "
-	existPars = append(existPars, edbInfoId)
-
-	existCondition += " AND from_edb_info_id=? "
-	existPars = append(existPars, req.FromEdbInfoId)
-
-	//判断计算指标是否被更换
-	count, err := GetEdbInfoCalculateCountByCondition(existCondition, existPars)
-	if err != nil {
-		err = errors.New("判断指标是否改变失败,Err:" + err.Error())
-		return
-	}
-	if count <= 0 {
-		//删除指标关联计算指标
-		//sql := ` DELETE FROM edb_info_calculate_tcz WHERE edb_info_id = ? `
-		//_, err = o.Raw(sql, edbInfoId).Exec()
-		//if err != nil {
-		//	return
-		//}
-		//
-		//calculateItem := new(EdbInfoCalculateTcz)
-		//calculateItem.CreateTime = time.Now()
-		//calculateItem.ModifyTime = time.Now()
-		//calculateItem.Sort = 1
-		//calculateItem.EdbCode = edbCode
-		//calculateItem.EdbInfoId = edbInfoId
-		//calculateItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
-		//calculateItem.FromEdbCode = fromEdbInfo.EdbCode
-		//calculateItem.FromEdbName = fromEdbInfo.EdbName
-		//calculateItem.FromSource = fromEdbInfo.Source
-		//calculateItem.FromSourceName = fromEdbInfo.SourceName
-		//
-		//_, err = o.Insert(calculateItem)
-		//if err != nil {
-		//	return
-		//}
-
-		//删除,计算指标关联的,基础指标的关联关系
-		sql = ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? `
-		_, err = o.Raw(sql, edbInfoId).Exec()
-		if err != nil {
-			return
-		}
-
-		//清空原有数据
-		sql = ` DELETE FROM edb_data_predict_calculate_tcz WHERE edb_info_id = ? `
-		_, err = o.Raw(sql, edbInfoId).Exec()
-		if err != nil {
-			return edbInfoId, err
-		}
-
-		//关联关系
-		{
-			calculateMappingItem := new(EdbInfoCalculateMapping)
-			calculateMappingItem.CreateTime = time.Now()
-			calculateMappingItem.ModifyTime = time.Now()
-			calculateMappingItem.Sort = 1
-			calculateMappingItem.EdbCode = edbCode
-			calculateMappingItem.EdbInfoId = 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 = utils.DATA_SOURCE_CALCULATE_TCZ
-			calculateMappingItem.SourceName = "同差值"
-			_, err = o.Insert(calculateMappingItem)
-			if err != nil {
-				return
-			}
-		}
-
-		edbInfoIdStr := strconv.Itoa(edbInfoId)
-
-		//计算数据
-		var condition string
-		var pars []interface{}
-		condition += " AND edb_info_id=? "
-		pars = append(pars, req.FromEdbInfoId)
-		fmt.Println("EdbInfoId:", req.FromEdbInfoId)
-		dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
-		if err != nil {
-			return edbInfoId, err
-		}
-		var dateArr []string
-		dataMap := make(map[string]*EdbInfoSearchData)
-		for _, v := range dataList {
-			dateArr = append(dateArr, v.DataTime)
-			dataMap[v.DataTime] = v
-		}
-
-		addSql := ` INSERT INTO edb_data_predict_calculate_tcz(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
-		var isAdd bool
-		for ak, av := range dateArr {
-			fmt.Println(ak, av)
-			currentItem := dataMap[av]
-			if currentItem != nil {
-				//当前日期
-				currentDate, err := time.Parse(utils.FormatDate, av)
-				if err != nil {
-					return edbInfoId, err
-				}
-				//上一年的日期
-				preDate := currentDate.AddDate(-1, 0, 0)
-				preDateStr := preDate.Format(utils.FormatDate)
-				if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
-					//dataTime, _ := time.Parse(utils.FormatDate, date)
-					timestamp := currentDate.UnixNano() / 1e6
-					timestampStr := fmt.Sprintf("%d", timestamp)
-
-					val := TczSub(currentItem.Value, findItem.Value)
-					addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-					isAdd = true
-					utils.FileLog.Info("同期找到:" + av + ";" + preDateStr)
-					continue
-				} else {
-					if fromEdbInfo.Frequency == "月度" { //向上和向下,各找一个月
-						nextDateDay := preDate.AddDate(0, 1, 0)
-						nextDateDayStr := nextDateDay.Format(utils.FormatDate)
-
-						preDateDay := preDate.AddDate(0, -1, 0)
-						preDateDayStr := preDateDay.Format(utils.FormatDate)
-
-						for i := 0; i <= 6; 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 := TczSub(currentItem.Value, findItem.Value)
-
-								addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-								isAdd = true
-								break
-							} else {
-								if i >= 1 {
-									preDateDay = preDate.AddDate(0, 0, -i)
-									preDateDayStr = nextDateDay.Format(utils.FormatDate)
-								}
-								if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
-									timestamp := currentDate.UnixNano() / 1e6
-									timestampStr := fmt.Sprintf("%d", timestamp)
-									val := TczSub(currentItem.Value, findItem.Value)
-
-									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-									isAdd = true
-									break
-								}
-							}
-						}
-					} else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {
-						if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
-							timestamp := currentDate.UnixNano() / 1e6
-							timestampStr := fmt.Sprintf("%d", timestamp)
-							val := TczSub(currentItem.Value, findItem.Value)
-
-							addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-							isAdd = true
-							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 := TczSub(currentItem.Value, findItem.Value)
-
-								addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-								isAdd = true
-								break
-							} else {
-								if i >= 1 {
-									preDateDay = preDate.AddDate(0, 0, -i)
-									preDateDayStr = nextDateDay.Format(utils.FormatDate)
-								}
-								if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
-									timestamp := currentDate.UnixNano() / 1e6
-									timestampStr := fmt.Sprintf("%d", timestamp)
-									val := TczSub(currentItem.Value, findItem.Value)
-
-									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-									isAdd = true
-									break
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-		if isAdd {
-			addSql = strings.TrimRight(addSql, ",")
-			_, err = o.Raw(addSql).Exec()
-			if err != nil {
-				return edbInfoId, err
-			}
-		}
-	}
-	return
-}
-
 // RefreshAllPredictCalculateTcz 刷新全部同差值数据
-func RefreshAllPredictCalculateTcz(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string) (err error) {
+func RefreshAllPredictCalculateTcz(edbInfoId, source int, fromEdbInfo *EdbInfo, edbCode, startDate string) (latestDateStr string, latestValue float64, err error) {
 	o := orm.NewOrm()
 	to, err := o.Begin()
 	if err != nil {
@@ -582,27 +334,15 @@ func RefreshAllPredictCalculateTcz(edbInfoId, source int, fromEdbInfo *EdbInfo,
 		return
 	}
 	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
 
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, fromEdbInfo.EdbInfoId)
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-	//if endDate != "" {
-	//	condition += " AND data_time<=? "
-	//	pars = append(pars, endDate)
-	//}
-
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
+	// 获取关联指标数据
+	dataList, err := GetPredictEdbDataListAllByStartDate(fromEdbInfo, 0, startDate)
 	if err != nil {
-		return err
+		return
 	}
+
+	latestDateStr = fromEdbInfo.LatestDate
+	//计算数据
 	var dateArr []string
 	dataMap := make(map[string]*EdbInfoSearchData)
 	for _, v := range dataList {
@@ -616,7 +356,7 @@ func RefreshAllPredictCalculateTcz(edbInfoId, source int, fromEdbInfo *EdbInfo,
 	sql = fmt.Sprintf(sql, dataTableName)
 	_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
 	if err != nil {
-		return err
+		return
 	}
 	existDataMap := make(map[string]string)
 	for _, v := range existDataList {
@@ -630,9 +370,10 @@ func RefreshAllPredictCalculateTcz(edbInfoId, source int, fromEdbInfo *EdbInfo,
 		currentItem := dataMap[av]
 		if currentItem != nil {
 			//当前日期
-			currentDate, err := time.Parse(utils.FormatDate, av)
-			if err != nil {
-				return err
+			currentDate, tmpErr := time.Parse(utils.FormatDate, av)
+			if tmpErr != nil {
+				err = tmpErr
+				return
 			}
 			//上一年的日期
 			preDate := currentDate.AddDate(-1, 0, 0)
@@ -647,17 +388,30 @@ func RefreshAllPredictCalculateTcz(edbInfoId, source int, fromEdbInfo *EdbInfo,
 					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, err := decimal.NewFromString(existVal)
+					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 err
+							return
 						}
 					}
 				}
@@ -677,17 +431,30 @@ func RefreshAllPredictCalculateTcz(edbInfoId, source int, fromEdbInfo *EdbInfo,
 								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, err := decimal.NewFromString(existVal)
+								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 err
+										return
 									}
 								}
 							}
@@ -704,17 +471,30 @@ func RefreshAllPredictCalculateTcz(edbInfoId, source int, fromEdbInfo *EdbInfo,
 									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, err := decimal.NewFromString(existVal)
+									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 err
+											return
 										}
 									}
 								}
@@ -732,17 +512,30 @@ func RefreshAllPredictCalculateTcz(edbInfoId, source int, fromEdbInfo *EdbInfo,
 							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, err := decimal.NewFromString(existVal)
+							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 err
+									return
 								}
 							}
 						}
@@ -761,17 +554,30 @@ func RefreshAllPredictCalculateTcz(edbInfoId, source int, fromEdbInfo *EdbInfo,
 								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, err := decimal.NewFromString(existVal)
+								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 err
+										return
 									}
 								}
 							}
@@ -788,17 +594,30 @@ func RefreshAllPredictCalculateTcz(edbInfoId, source int, fromEdbInfo *EdbInfo,
 									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, err := decimal.NewFromString(existVal)
+									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 err
+											return
 										}
 									}
 								}
@@ -814,7 +633,7 @@ func RefreshAllPredictCalculateTcz(edbInfoId, source int, fromEdbInfo *EdbInfo,
 		addSql = strings.TrimRight(addSql, ",")
 		_, err = o.Raw(addSql).Exec()
 		if err != nil {
-			return err
+			return
 		}
 	}
 	return