Browse Source

fix:调整同步的计算方式

Roc 7 months ago
parent
commit
e76aa8a230
1 changed files with 45 additions and 291 deletions
  1. 45 291
      models/predict_edb_data_calculate_tbz.go

+ 45 - 291
models/predict_edb_data_calculate_tbz.go

@@ -275,31 +275,27 @@ func (obj PredictTb) refresh(to orm.TxOrmer, edbInfo, fromEdbInfo *EdbInfo, edbC
 		return
 	}
 
-	latestDateStr = fromEdbInfo.LatestDate
-	//计算数据
-	var dateArr []string
-	dataMap := make(map[string]*EdbInfoSearchData)
-	var firstDataTimeStr string // 第一条数据的日期
-	for _, v := range dataList {
-		dateArr = append(dateArr, v.DataTime)
-		dataMap[v.DataTime] = v
-		firstDataTimeStr = v.DataTime
-	}
-
-	if firstDataTimeStr == `` {
-		err = errors.New("无数据")
+	// 来源指标数据参与计算
+	calculateDataList, err := EdbInfoSearchDataToEdbInfoData(dataList)
+	if err != nil {
 		return
 	}
-	// 第一条数据的日期
-	firstDataTime, err := time.ParseInLocation(utils.FormatDate, firstDataTimeStr, time.Local)
+	baseCalculate := BaseCalculate{
+		DataList:  calculateDataList,
+		Frequency: fromEdbInfo.Frequency,
+		Source:    3,
+	}
+	dateDataMap, err, _ := baseCalculate.Tbz()
 	if err != nil {
 		return
 	}
-	firstDataTime = firstDataTime.AddDate(1, 0, 0)
+
+	// 真实数据的最后日期
+	latestDateStr = fromEdbInfo.LatestDate
 
 	//获取指标所有数据
 	existDataList := make([]*EdbData, 0)
-	fmt.Println("dataTableName:", dataTableName)
+	//fmt.Println("dataTableName:", dataTableName)
 
 	sql := `SELECT * FROM %s WHERE edb_info_id=? `
 	sql = fmt.Sprintf(sql, dataTableName)
@@ -314,292 +310,50 @@ func (obj PredictTb) refresh(to orm.TxOrmer, edbInfo, fromEdbInfo *EdbInfo, edbC
 		removeDataTimeMap[v.DataTime] = 1
 	}
 
-	fmt.Println("existDataMap:", existDataMap)
+	//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, ok := dataMap[av]
-		if !ok || currentItem == nil {
-			continue
-		}
-
-		//当前日期
-		currentDate, tmpErr := time.ParseInLocation(utils.FormatDate, av, time.Local)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
 
-		// 如果当前日期的日期早于数据最早的日期,那么就不往下执行了
-		if currentDate.Before(firstDataTime) {
-			break
-		}
+	for currentDate, valFloat := range dateDataMap {
+		currentDateStr := currentDate.Format(utils.FormatDate)
+		timestamp := currentDate.UnixNano() / 1e6
+		timestampStr := fmt.Sprintf("%d", timestamp)
+		val := decimal.NewFromFloat(valFloat).String()
 
 		//校验待删除日期数据里面是否存在该元素,如果存在的话,那么移除该日期
-		delete(removeDataTimeMap, av)
-
-		//上一年的日期
-		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
+		delete(removeDataTimeMap, currentDateStr)
 
-					// 实际数据的值
-					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
-					}
-				}
+		if existVal, ok := existDataMap[currentDateStr]; !ok {
+			if _, existOk := existAddDataMap[currentDateStr]; !existOk {
+				addSql += GetAddSql(edbInfoIdStr, edbCode, currentDateStr, timestampStr, val)
+				isAdd = true
 			}
-			continue
+			existAddDataMap[currentDateStr] = currentDateStr
 		} 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
+			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, currentDateStr).Exec()
+				if err != nil {
+					return
 				}
-			} 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
-						}
-					}
-				}
+		// 实际数据的值
+		if fromEdbInfo.LatestDate == currentDateStr {
+			latestValueDecimal, tmpErr := decimal.NewFromString(val)
+			if tmpErr != nil {
+				return
 			}
+			latestValue, _ = latestValueDecimal.Truncate(4).Float64() //保留4位小数
 		}
 	}