|
@@ -35,7 +35,7 @@ type PredictCalculateItems struct {
|
|
|
}
|
|
|
|
|
|
// AddPredictCalculate 新增预测计算(运算)指标的数据
|
|
|
-func AddPredictCalculate(edbInfoIdArr []*EdbInfo, edbInfoId int, edbCode, formulaStr string, edbInfoIdBytes []string) (err error) {
|
|
|
+func AddPredictCalculate(edbInfoIdList []*EdbInfo, edbInfoId int, edbCode, formulaStr string, edbInfoIdBytes []string) (latestDateStr string, latestValue float64, err error) {
|
|
|
o := orm.NewOrm()
|
|
|
defer func() {
|
|
|
if err != nil {
|
|
@@ -43,11 +43,24 @@ func AddPredictCalculate(edbInfoIdArr []*EdbInfo, edbInfoId int, edbCode, formul
|
|
|
}
|
|
|
}()
|
|
|
|
|
|
+ var minLatestDate time.Time
|
|
|
saveDataMap := make(map[string]map[int]float64)
|
|
|
- for _, v := range edbInfoIdArr {
|
|
|
- dataList, err := GetPredictEdbDataListAll(v, 1)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
+ for _, v := range edbInfoIdList {
|
|
|
+ tmpLatestDate, tmpErr := time.ParseInLocation(utils.FormatDate, v.LatestDate, time.Local)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = errors.New(`最近的日期格式化失败;日期:` + v.LatestDate + `;err:` + tmpErr.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 如果不存在最小的真实数据日期,那么将当前指标的真实数据日期给赋值;
|
|
|
+ // 如果存在最小的真实数据日期,同时当前指标的真实数据日期 早于 最小的真实数据日期, 那么将当前指标的真实数据日期给赋值;
|
|
|
+ if minLatestDate.IsZero() || tmpLatestDate.Before(minLatestDate) {
|
|
|
+ minLatestDate = tmpLatestDate
|
|
|
+ }
|
|
|
+
|
|
|
+ dataList, tmpErr := GetPredictEdbDataListAll(v, 1)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
}
|
|
|
dataMap := make(map[string]float64)
|
|
|
for _, dv := range dataList {
|
|
@@ -69,30 +82,37 @@ func AddPredictCalculate(edbInfoIdArr []*EdbInfo, edbInfoId int, edbCode, formul
|
|
|
addSql := ` INSERT INTO edb_predict_data_calculate (edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
|
|
|
nowStr := time.Now().Format(utils.FormatDateTime)
|
|
|
var isAdd bool
|
|
|
+
|
|
|
+ if !minLatestDate.IsZero() {
|
|
|
+ latestDateStr = minLatestDate.Format(utils.FormatDate)
|
|
|
+ }
|
|
|
for sk, sv := range saveDataMap {
|
|
|
formulaStr = strings.ToUpper(formulaStr)
|
|
|
- formulaFormStr := ReplaceFormula(edbInfoIdArr, sv, formulaMap, formulaStr, edbInfoIdBytes)
|
|
|
+ formulaFormStr := ReplaceFormula(edbInfoIdList, sv, formulaMap, formulaStr, edbInfoIdBytes)
|
|
|
if formulaStr == "" {
|
|
|
return
|
|
|
}
|
|
|
if formulaFormStr != "" {
|
|
|
expression := formula.NewExpression(formulaFormStr)
|
|
|
- calResult, err := expression.Evaluate()
|
|
|
- if err != nil {
|
|
|
- err = errors.New("计算失败:Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
|
|
|
+ calResult, tmpErr := expression.Evaluate()
|
|
|
+ if tmpErr != nil {
|
|
|
+ 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
|
|
|
}
|
|
|
|
|
|
//需要存入的数据
|
|
|
{
|
|
|
- dataTime, _ := time.Parse(utils.FormatDate, sk)
|
|
|
+ if latestDateStr == sk {
|
|
|
+ latestValue, _ = decimal.NewFromFloat(calVal).Truncate(4).Float64() //保留4位小数
|
|
|
+ }
|
|
|
+ dataTime, _ := time.ParseInLocation(utils.FormatDate, sk, time.Local)
|
|
|
timestamp := dataTime.UnixNano() / 1e6
|
|
|
timeStr := fmt.Sprintf("%d", timestamp)
|
|
|
addSql += "("
|
|
@@ -118,7 +138,7 @@ func AddPredictCalculate(edbInfoIdArr []*EdbInfo, edbInfoId int, edbCode, formul
|
|
|
}
|
|
|
|
|
|
// RefreshAllPredictCalculate 刷新预测计算指标的全部数据
|
|
|
-func RefreshAllPredictCalculate(edbInfoIdArr []*EdbInfo, edbInfoId, source int, edbCode, formulaStr, startDate, endDate string, edbInfoIdBytes []string) (err error) {
|
|
|
+func RefreshAllPredictCalculate(edbInfoIdList []*EdbInfo, edbInfoId, source int, edbCode, formulaStr, startDate, endDate string, edbInfoIdBytes []string) (err error) {
|
|
|
o := orm.NewOrm()
|
|
|
to, err := o.Begin()
|
|
|
if err != nil {
|
|
@@ -134,7 +154,7 @@ func RefreshAllPredictCalculate(edbInfoIdArr []*EdbInfo, edbInfoId, source int,
|
|
|
}()
|
|
|
fmt.Println(startDate, endDate)
|
|
|
saveDataMap := make(map[string]map[int]float64)
|
|
|
- for _, v := range edbInfoIdArr {
|
|
|
+ for _, v := range edbInfoIdList {
|
|
|
var condition string
|
|
|
var pars []interface{}
|
|
|
condition += " AND edb_info_id=? "
|
|
@@ -193,7 +213,7 @@ func RefreshAllPredictCalculate(edbInfoIdArr []*EdbInfo, edbInfoId, source int,
|
|
|
for sk, sv := range saveDataMap {
|
|
|
//fmt.Println(sk, sv)
|
|
|
formulaStr = strings.ToUpper(formulaStr)
|
|
|
- formulaFormStr := ReplaceFormula(edbInfoIdArr, sv, formulaMap, formulaStr, edbInfoIdBytes)
|
|
|
+ formulaFormStr := ReplaceFormula(edbInfoIdList, sv, formulaMap, formulaStr, edbInfoIdBytes)
|
|
|
if formulaFormStr != "" {
|
|
|
utils.FileLog.Info(fmt.Sprintf("formulaFormStr:%s", formulaFormStr))
|
|
|
expression := formula.NewExpression(formulaFormStr)
|