|
@@ -362,8 +362,10 @@ func RefreshAllCalculate(edbInfoIdArr []*EdbInfo, edbInfoId, source int, edbCode
|
|
|
|
|
|
// refreshAllCalculate 刷新全部数据
|
|
|
func refreshAllCalculate(to orm.TxOrmer, edbInfoIdArr []*EdbInfo, edbInfoId, source int, edbCode, formulaStr, startDate, endDate string, edbInfoIdBytes []string) (err error) {
|
|
|
+ oldSaveDataMap := make(map[string]map[int]float64)
|
|
|
saveDataMap := make(map[string]map[int]float64)
|
|
|
- for _, v := range edbInfoIdArr {
|
|
|
+ dateList := make([]string, 0)
|
|
|
+ for edbInfoIndex, v := range edbInfoIdArr {
|
|
|
var condition string
|
|
|
var pars []interface{}
|
|
|
condition += " AND edb_info_id=? "
|
|
@@ -381,22 +383,35 @@ func refreshAllCalculate(to orm.TxOrmer, edbInfoIdArr []*EdbInfo, edbInfoId, sou
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
- dataMap := make(map[string]float64)
|
|
|
for _, dv := range dataList {
|
|
|
- if val, ok := saveDataMap[dv.DataTime]; ok {
|
|
|
+ if val, ok := oldSaveDataMap[dv.DataTime]; ok {
|
|
|
if _, ok := val[v.EdbInfoId]; !ok {
|
|
|
val[v.EdbInfoId] = dv.Value
|
|
|
}
|
|
|
} else {
|
|
|
temp := make(map[int]float64)
|
|
|
temp[v.EdbInfoId] = dv.Value
|
|
|
- saveDataMap[dv.DataTime] = temp
|
|
|
+ oldSaveDataMap[dv.DataTime] = temp
|
|
|
+ }
|
|
|
+
|
|
|
+ // saveDataMap
|
|
|
+ if val, ok := saveDataMap[dv.DataTime]; ok {
|
|
|
+ if _, ok := val[v.EdbInfoId]; !ok {
|
|
|
+ val[v.EdbInfoId] = dv.Value
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ temp2 := make(map[int]float64)
|
|
|
+ temp2[v.EdbInfoId] = dv.Value
|
|
|
+ saveDataMap[dv.DataTime] = temp2
|
|
|
+ }
|
|
|
+
|
|
|
+ // 以第一个指标的日期作为基准日期
|
|
|
+ if edbInfoIndex == 0 {
|
|
|
+ dateList = append(dateList, dv.DataTime)
|
|
|
}
|
|
|
}
|
|
|
- item := new(CalculateItems)
|
|
|
- item.EdbInfoId = v.EdbInfoId
|
|
|
- item.DataMap = dataMap
|
|
|
}
|
|
|
+ handleDateSaveDataMap(dateList, oldSaveDataMap, saveDataMap, edbInfoIdArr)
|
|
|
|
|
|
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 `
|
|
@@ -423,54 +438,54 @@ func refreshAllCalculate(to orm.TxOrmer, edbInfoIdArr []*EdbInfo, edbInfoId, sou
|
|
|
//fmt.Println(sk, sv)
|
|
|
formulaStr = strings.ToUpper(formulaStr)
|
|
|
formulaFormStr := ReplaceFormula(edbInfoIdArr, sv, formulaMap, formulaStr, 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))
|
|
|
+ fmt.Println(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 existVal, ok := dataMap[sk]; !ok {
|
|
|
- dataTime, _ := time.Parse(utils.FormatDate, sk)
|
|
|
- timestamp := dataTime.UnixNano() / 1e6
|
|
|
- timeStr := fmt.Sprintf("%d", timestamp)
|
|
|
+ saveValue := decimal.NewFromFloat(calVal).RoundCeil(4).String() //utils.SubFloatToString(calVal, 4)
|
|
|
+ if existVal, ok := dataMap[sk]; !ok {
|
|
|
+ dataTime, _ := time.Parse(utils.FormatDate, sk)
|
|
|
+ timestamp := dataTime.UnixNano() / 1e6
|
|
|
+ timeStr := fmt.Sprintf("%d", timestamp)
|
|
|
|
|
|
- if _, existOk := existDataMap[sk]; !existOk {
|
|
|
- addSql += GetAddSql(edbInfoIdStr, edbCode, sk, timeStr, saveValue)
|
|
|
- isAdd = true
|
|
|
- }
|
|
|
- existDataMap[sk] = sk
|
|
|
- } else {
|
|
|
- existValDecimal, err := decimal.NewFromString(existVal)
|
|
|
- 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 = to.Raw(sql, saveValue, edbInfoId, sk).Exec()
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
- }
|
|
|
+ if _, existOk := existDataMap[sk]; !existOk {
|
|
|
+ addSql += GetAddSql(edbInfoIdStr, edbCode, sk, timeStr, saveValue)
|
|
|
+ isAdd = true
|
|
|
}
|
|
|
+ existDataMap[sk] = sk
|
|
|
} else {
|
|
|
- //计算公式异常,那么就移除该指标
|
|
|
- removeDateList = append(removeDateList, sk)
|
|
|
- continue
|
|
|
+ existValDecimal, err := decimal.NewFromString(existVal)
|
|
|
+ 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 = to.Raw(sql, saveValue, edbInfoId, sk).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -609,3 +624,70 @@ func CheckFormula2(edbInfoArr []*EdbInfo, formulaMap map[string]string, formulaS
|
|
|
}
|
|
|
return
|
|
|
}
|
|
|
+
|
|
|
+// 处理整个数据
|
|
|
+func handleDateSaveDataMap(dateList []string, oldSaveDataMap, saveDataMap map[string]map[int]float64, edbInfoIdArr []*EdbInfo) {
|
|
|
+ for _, date := range dateList {
|
|
|
+ tmpDataMap := oldSaveDataMap[date]
|
|
|
+ for _, edbInfo := range edbInfoIdArr {
|
|
|
+ tmpEdbInfoId := edbInfo.EdbInfoId // 当前指标id
|
|
|
+ // 如果该日期不存在该指标数据,那么需要找寻前后日期的数据,进行填补
|
|
|
+ if _, ok := tmpDataMap[tmpEdbInfoId]; !ok {
|
|
|
+ day := 0
|
|
|
+ switch edbInfo.Frequency {
|
|
|
+ case "周度":
|
|
|
+ day = 7
|
|
|
+ case "旬度":
|
|
|
+ day = 15
|
|
|
+ case "月度":
|
|
|
+ day = 30
|
|
|
+ case "季度":
|
|
|
+ day = 90
|
|
|
+ case "年度":
|
|
|
+ day = 365
|
|
|
+ }
|
|
|
+ handleDataMap(oldSaveDataMap, saveDataMap, date, tmpEdbInfoId, day)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// handleDataMap 处理单个日期的数据
|
|
|
+func handleDataMap(oldSaveDataMap, saveDataMap map[string]map[int]float64, date string, edbInfoId, day int) {
|
|
|
+ currDate, _ := time.ParseInLocation(utils.FormatDate, date, time.Local)
|
|
|
+
|
|
|
+ // 后一天
|
|
|
+ nextDateDayStr := currDate.AddDate(0, 0, 1).Format(utils.FormatDate)
|
|
|
+
|
|
|
+ // 前一天
|
|
|
+ preDateDayStr := currDate.AddDate(0, 0, -1).Format(utils.FormatDate)
|
|
|
+
|
|
|
+ for i := 1; i <= day; i++ {
|
|
|
+
|
|
|
+ // 下个日期的数据
|
|
|
+ {
|
|
|
+ if i >= 1 {
|
|
|
+ nextDateDayStr = currDate.AddDate(0, 0, i).Format(utils.FormatDate)
|
|
|
+ }
|
|
|
+ if findDataMap, hasFindDataMap := oldSaveDataMap[nextDateDayStr]; hasFindDataMap { // 下一个日期有数据
|
|
|
+ if val, hasFindItem := findDataMap[edbInfoId]; hasFindItem {
|
|
|
+ saveDataMap[date][edbInfoId] = val
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 上个日期的数据
|
|
|
+ {
|
|
|
+ if i >= 1 {
|
|
|
+ preDateDayStr = currDate.AddDate(0, 0, -i).Format(utils.FormatDate)
|
|
|
+ }
|
|
|
+ if findDataMap, hasFindDataMap := oldSaveDataMap[preDateDayStr]; hasFindDataMap { // 下一个日期有数据
|
|
|
+ if val, hasFindItem := findDataMap[edbInfoId]; hasFindItem {
|
|
|
+ saveDataMap[date][edbInfoId] = val
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|