|
@@ -7,6 +7,7 @@ import (
|
|
|
"github.com/shopspring/decimal"
|
|
|
"github.com/yidane/formula"
|
|
|
"hongze/hongze_edb_lib/services"
|
|
|
+ "hongze/hongze_edb_lib/services/alarm_msg"
|
|
|
"hongze/hongze_edb_lib/utils"
|
|
|
"strings"
|
|
|
"time"
|
|
@@ -25,6 +26,27 @@ type CalculateRule struct {
|
|
|
EdbInfoIdArr []EdbInfoFromTag `description:"指标信息"`
|
|
|
}
|
|
|
|
|
|
+// RefreshCalculateByRuleBy9 刷新计算
|
|
|
+func RefreshCalculateByRuleBy9(rule CalculateRule) (err error) {
|
|
|
+ o := orm.NewOrm()
|
|
|
+ to, err := o.Begin()
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ tmpErr := to.Rollback()
|
|
|
+ if tmpErr != nil {
|
|
|
+ go alarm_msg.SendAlarmMsg("RefreshCalculateByRuleBy9 事务回滚失败,Err:"+tmpErr.Error(), 3)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ err = to.Commit()
|
|
|
+ }
|
|
|
+ }()
|
|
|
+ err = CalculateByRuleBy9(to, rule)
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
// CalculateByRuleBy9 动态环差规则计算入库
|
|
|
func CalculateByRuleBy9(to orm.TxOrmer, rule CalculateRule) (err error) {
|
|
|
saveDataMap := make(map[string]map[int]float64)
|
|
@@ -76,62 +98,63 @@ func CalculateByRuleBy9(to orm.TxOrmer, rule CalculateRule) (err error) {
|
|
|
for sk, sv := range saveDataMap {
|
|
|
//fmt.Println(sk, sv)
|
|
|
formulaFormStr := ReplaceFormula(rule.EdbInfoList, sv, formulaMap, formulaStr, rule.EdbInfoIdBytes)
|
|
|
- if formulaFormStr != "" {
|
|
|
- utils.FileLog.Info(fmt.Sprintf("formulaFormStr:%s", formulaFormStr))
|
|
|
- expression := formula.NewExpression(formulaFormStr)
|
|
|
- calResult, err := expression.Evaluate()
|
|
|
- if err != nil {
|
|
|
- // 分母为0的报错
|
|
|
- if strings.Contains(err.Error(), "divide by zero") {
|
|
|
- removeDateList = append(removeDateList, sk)
|
|
|
- continue
|
|
|
- }
|
|
|
- err = errors.New("计算失败:Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
|
|
|
- fmt.Println(err)
|
|
|
- return err
|
|
|
- }
|
|
|
- calVal, err := calResult.Float64()
|
|
|
- if err != nil {
|
|
|
- err = errors.New("计算失败:获取计算值失败 Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
|
|
|
- fmt.Println(err)
|
|
|
- return err
|
|
|
+ //计算公式异常,那么就移除该指标
|
|
|
+ if formulaFormStr == "" {
|
|
|
+ removeDateList = append(removeDateList, sk)
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ utils.FileLog.Info(fmt.Sprintf("formulaFormStr:%s", formulaFormStr))
|
|
|
+ expression := formula.NewExpression(formulaFormStr)
|
|
|
+ calResult, err := expression.Evaluate()
|
|
|
+ if err != nil {
|
|
|
+ // 分母为0的报错
|
|
|
+ if strings.Contains(err.Error(), "divide by zero") {
|
|
|
+ removeDateList = append(removeDateList, sk)
|
|
|
+ continue
|
|
|
}
|
|
|
+ err = errors.New("计算失败:Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
|
|
|
+ fmt.Println(err)
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ calVal, err := calResult.Float64()
|
|
|
+ if err != nil {
|
|
|
+ err = errors.New("计算失败:获取计算值失败 Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
|
|
|
+ fmt.Println(err)
|
|
|
+ return err
|
|
|
+ }
|
|
|
|
|
|
- saveValue := decimal.NewFromFloat(calVal).RoundCeil(4).String() //utils.SubFloatToString(calVal, 4)
|
|
|
- if existPredictEdbRuleData, ok := dataMap[sk]; !ok {
|
|
|
- dataTime, _ := time.Parse(utils.FormatDate, sk)
|
|
|
- timestamp := dataTime.UnixNano() / 1e6
|
|
|
+ saveValue := decimal.NewFromFloat(calVal).RoundCeil(4).String() //utils.SubFloatToString(calVal, 4)
|
|
|
+ existPredictEdbRuleData, ok := dataMap[sk]
|
|
|
+ if !ok {
|
|
|
+ dataTime, _ := time.Parse(utils.FormatDate, sk)
|
|
|
+ timestamp := dataTime.UnixNano() / 1e6
|
|
|
|
|
|
- if _, existOk := existDataMap[sk]; !existOk {
|
|
|
- tmpPredictEdbRuleData := &PredictEdbRuleData{
|
|
|
- //PredictEdbRuleDataId: 0,
|
|
|
- EdbInfoId: rule.EdbInfoId,
|
|
|
- ConfigId: rule.ConfigId,
|
|
|
- DataTime: sk,
|
|
|
- Value: saveValue,
|
|
|
- CreateTime: time.Now(),
|
|
|
- ModifyTime: time.Now(),
|
|
|
- DataTimestamp: timestamp,
|
|
|
- }
|
|
|
- addDataList = append(addDataList, tmpPredictEdbRuleData)
|
|
|
- }
|
|
|
- existDataMap[sk] = sk
|
|
|
- } else {
|
|
|
- existValDecimal, err := decimal.NewFromString(existPredictEdbRuleData.Value)
|
|
|
- existStr := existValDecimal.String()
|
|
|
- if existStr != saveValue {
|
|
|
- existPredictEdbRuleData.Value = saveValue
|
|
|
- existPredictEdbRuleData.ModifyTime = time.Now()
|
|
|
- _, err = to.Update(existPredictEdbRuleData, "Value", "ModifyTime")
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
+ if _, existOk := existDataMap[sk]; !existOk {
|
|
|
+ tmpPredictEdbRuleData := &PredictEdbRuleData{
|
|
|
+ //PredictEdbRuleDataId: 0,
|
|
|
+ EdbInfoId: rule.EdbInfoId,
|
|
|
+ ConfigId: rule.ConfigId,
|
|
|
+ DataTime: sk,
|
|
|
+ Value: saveValue,
|
|
|
+ CreateTime: time.Now(),
|
|
|
+ ModifyTime: time.Now(),
|
|
|
+ DataTimestamp: timestamp,
|
|
|
}
|
|
|
+ addDataList = append(addDataList, tmpPredictEdbRuleData)
|
|
|
}
|
|
|
+ existDataMap[sk] = sk
|
|
|
} else {
|
|
|
- //计算公式异常,那么就移除该指标
|
|
|
- removeDateList = append(removeDateList, sk)
|
|
|
- continue
|
|
|
+ existValDecimal, err := decimal.NewFromString(existPredictEdbRuleData.Value)
|
|
|
+ existStr := existValDecimal.String()
|
|
|
+ if existStr != saveValue {
|
|
|
+ existPredictEdbRuleData.Value = saveValue
|
|
|
+ existPredictEdbRuleData.ModifyTime = time.Now()
|
|
|
+ _, err = to.Update(existPredictEdbRuleData, "Value", "ModifyTime")
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -147,8 +170,6 @@ func CalculateByRuleBy9(to orm.TxOrmer, rule CalculateRule) (err error) {
|
|
|
//删除多余的值
|
|
|
lenRemoveDateList := len(removeDateList)
|
|
|
if lenRemoveDateList > 0 {
|
|
|
- removeDateStr := strings.Join(removeDateList, `","`)
|
|
|
- removeDateStr = `"` + removeDateStr + `"`
|
|
|
//如果拼接指标变更了,那么需要删除所有的指标数据
|
|
|
sql := ` DELETE FROM predict_edb_rule_data WHERE config_id = ? and data_time in (` + utils.GetOrmInReplace(lenRemoveDateList) + `) `
|
|
|
|