|
@@ -2,10 +2,10 @@ package data_manage
|
|
|
|
|
|
import (
|
|
|
"errors"
|
|
|
+ "eta/eta_api/utils"
|
|
|
"fmt"
|
|
|
"github.com/beego/beego/v2/client/orm"
|
|
|
"github.com/yidane/formula"
|
|
|
- "eta/eta_api/utils"
|
|
|
"strconv"
|
|
|
"strings"
|
|
|
"time"
|
|
@@ -71,6 +71,9 @@ type EdbInfoCalculateDetail struct {
|
|
|
ModifyTime time.Time `description:"修改时间"`
|
|
|
StartDate string `description:"开始日期"`
|
|
|
EndDate string `description:"结束日期"`
|
|
|
+ LatestDate string `description:"实际的结束日期"`
|
|
|
+ LatestValue float64 `description:"最近实际数据的值"`
|
|
|
+ EndValue float64 `description:"结束日期的值(可能是插入值)"`
|
|
|
EdbType int `description:"指标类型:1:基础指标,2:计算指标"`
|
|
|
}
|
|
|
|
|
@@ -84,7 +87,7 @@ func GetEdbInfoCalculateDetail(edbInfoId, source int) (list []*EdbInfoCalculateD
|
|
|
//
|
|
|
//sql = fmt.Sprintf(sql, calculateTableName)
|
|
|
|
|
|
- sql := ` SELECT a.edb_info_calculate_mapping_id,a.edb_info_id,a.source,a.source_name,a.edb_code,a.from_edb_info_id,a.from_edb_code,a.from_source,a.from_source_name,a.sort,a.create_time,a.modify_time,a.from_tag,a.move_value,b.edb_name_source as from_edb_name,b.start_date,b.end_date,b.edb_type FROM edb_info_calculate_mapping AS a
|
|
|
+ sql := ` SELECT a.edb_info_calculate_mapping_id,a.edb_info_id,a.source,a.source_name,a.edb_code,a.from_edb_info_id,a.from_edb_code,a.from_source,a.from_source_name,a.sort,a.create_time,a.modify_time,a.from_tag,a.move_value,b.edb_name_source as from_edb_name,b.start_date,b.end_date,b.latest_date,b.latest_value,b.edb_type FROM edb_info_calculate_mapping AS a
|
|
|
INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
|
|
|
WHERE a.edb_info_id=? ORDER BY sort ASC `
|
|
|
|
|
@@ -232,172 +235,6 @@ func GetEdbInfoCalculateMap(edbInfoId, source int) (list []*EdbInfo, err error)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-// 指标运算
|
|
|
-func AddCalculate(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo []*EdbInfoCalculateDetail, edbCode, uniqueCode, formulaStr string, sysUserId int, sysUserRealName string) (edbInfoId int, err error) {
|
|
|
- o := orm.NewOrmUsingDB("data")
|
|
|
- to, err := o.Begin()
|
|
|
- if err != nil {
|
|
|
- return
|
|
|
- }
|
|
|
- defer func() {
|
|
|
- if err != nil {
|
|
|
- _ = to.Rollback()
|
|
|
- } else {
|
|
|
- _ = to.Commit()
|
|
|
- }
|
|
|
- }()
|
|
|
- if req.EdbInfoId <= 0 {
|
|
|
- edbInfo := new(EdbInfo)
|
|
|
- edbInfo.Source = utils.DATA_SOURCE_CALCULATE
|
|
|
- edbInfo.SourceName = "指标运算"
|
|
|
- edbInfo.EdbCode = edbCode
|
|
|
- edbInfo.EdbName = req.EdbName
|
|
|
- edbInfo.EdbNameSource = req.EdbName
|
|
|
- edbInfo.Frequency = req.Frequency
|
|
|
- edbInfo.Unit = req.Unit
|
|
|
- edbInfo.ClassifyId = req.ClassifyId
|
|
|
- edbInfo.SysUserId = sysUserId
|
|
|
- edbInfo.SysUserRealName = sysUserRealName
|
|
|
- edbInfo.CreateTime = time.Now()
|
|
|
- edbInfo.ModifyTime = time.Now()
|
|
|
- edbInfo.UniqueCode = uniqueCode
|
|
|
- edbInfo.CalculateFormula = req.CalculateFormula
|
|
|
- edbInfo.EdbType = 2
|
|
|
- newEdbInfoId, err := to.Insert(edbInfo)
|
|
|
- if err != nil {
|
|
|
- return int(newEdbInfoId), err
|
|
|
- }
|
|
|
- edbInfoId = int(newEdbInfoId)
|
|
|
- //处理同名指标
|
|
|
- {
|
|
|
- edbNameList, err := GetEdbInfoByName(req.EdbName)
|
|
|
- if err != nil {
|
|
|
- return edbInfoId, err
|
|
|
- }
|
|
|
- if len(edbNameList) >= 2 {
|
|
|
- for _, v := range edbNameList {
|
|
|
- edbName := v.EdbName + "(" + v.SourceName + ")"
|
|
|
- err = ModifyEdbInfoNameSource(edbName, v.EdbInfoId)
|
|
|
- if err != nil {
|
|
|
- return edbInfoId, err
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- //calculateList := make([]*EdbInfoCalculate, 0)
|
|
|
- edbInfoList := make([]*EdbInfo, 0)
|
|
|
-
|
|
|
- for _, v := range req.EdbInfoIdArr {
|
|
|
- edbInfo, err := GetEdbInfoById(v.EdbInfoId)
|
|
|
- if err != nil {
|
|
|
- return edbInfoId, err
|
|
|
- }
|
|
|
- //calculateItem := new(EdbInfoCalculate)
|
|
|
- //calculateItem.CreateTime = time.Now()
|
|
|
- //calculateItem.ModifyTime = time.Now()
|
|
|
- //calculateItem.Sort = k + 1
|
|
|
- //calculateItem.EdbCode = edbCode
|
|
|
- //calculateItem.EdbInfoId = int(edbInfoId)
|
|
|
- //calculateItem.FromEdbInfoId = edbInfo.EdbInfoId
|
|
|
- //calculateItem.FromEdbCode = edbInfo.EdbCode
|
|
|
- //calculateItem.FromEdbName = edbInfo.EdbName
|
|
|
- //calculateItem.FromSource = edbInfo.Source
|
|
|
- //calculateItem.FromSourceName = edbInfo.SourceName
|
|
|
- //calculateItem.FromTag = v.FromTag
|
|
|
- //calculateList = append(calculateList, calculateItem)
|
|
|
- edbInfoList = append(edbInfoList, edbInfo)
|
|
|
- }
|
|
|
- //if len(calculateList) > 0 {
|
|
|
- // _, err = to.InsertMulti(1, calculateList)
|
|
|
- // if err != nil {
|
|
|
- // return edbInfoId, err
|
|
|
- // }
|
|
|
- //}
|
|
|
- } else {
|
|
|
- edbInfoId = req.EdbInfoId
|
|
|
- dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE)
|
|
|
- deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
|
|
|
- deleteSql = fmt.Sprintf(deleteSql, dataTableName)
|
|
|
- _, err = to.Raw(deleteSql, req.EdbInfoId).Exec()
|
|
|
- }
|
|
|
- //计算数据
|
|
|
- saveDataMap := make(map[string]map[int]float64)
|
|
|
- for _, v := range fromEdbInfo {
|
|
|
- var condition string
|
|
|
- var pars []interface{}
|
|
|
- condition += " AND edb_info_id=? "
|
|
|
- pars = append(pars, v.FromEdbInfoId)
|
|
|
- dataList, err := GetEdbDataListAll(condition, pars, v.FromSource, 1)
|
|
|
- if err != nil {
|
|
|
- return edbInfoId, err
|
|
|
- }
|
|
|
- dataMap := make(map[string]float64)
|
|
|
- for _, dv := range dataList {
|
|
|
- if val, ok := saveDataMap[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
|
|
|
- }
|
|
|
- }
|
|
|
- item := new(CalculateItems)
|
|
|
- item.EdbInfoId = v.EdbInfoId
|
|
|
- item.DataMap = dataMap
|
|
|
- }
|
|
|
-
|
|
|
- //formulaMap := CheckFormula(formulaStr)
|
|
|
- //addSql := ` INSERT INTO edb_data_calculate(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
|
|
|
- //nowStr := time.Now().Format(utils.FormatDateTime)
|
|
|
- //var isAdd bool
|
|
|
- //
|
|
|
- //for sk, sv := range saveDataMap {
|
|
|
- // formulaStr = strings.ToUpper(formulaStr)
|
|
|
- // formulaFormStr := ReplaceFormula(edbInfoIdArr, sv, formulaMap, formulaStr, edbInfoIdBytes)
|
|
|
- // if formulaFormStr != "" {
|
|
|
- // utils.FileLog.Info("formulaFormStr:%s", formulaFormStr)
|
|
|
- // expression := formula.NewExpression(formulaFormStr)
|
|
|
- // calResult, err := expression.Evaluate()
|
|
|
- // if err != nil {
|
|
|
- // 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
|
|
|
- // }
|
|
|
- //
|
|
|
- // //需要存入的数据
|
|
|
- // {
|
|
|
- // dataTime, _ := time.Parse(utils.FormatDate, sk)
|
|
|
- // timestamp := dataTime.UnixNano() / 1e6
|
|
|
- // timeStr := fmt.Sprintf("%d", timestamp)
|
|
|
- // addSql += "("
|
|
|
- // addSql += strconv.Itoa(edbInfoId) + "," + "'" + edbCode + "'" + "," + "'" + sk + "'" + "," + utils.SubFloatToString(calVal, 4) + "," + "'" + nowStr + "'" +
|
|
|
- // "," + "'" + nowStr + "'" + "," + "1"
|
|
|
- // addSql += "," + "'" + timeStr + "'"
|
|
|
- // addSql += "),"
|
|
|
- // isAdd = true
|
|
|
- // }
|
|
|
- // }
|
|
|
- //}
|
|
|
- //if isAdd {
|
|
|
- // addSql = strings.TrimRight(addSql, ",")
|
|
|
- // AddEdbDataCalculateBySql(addSql)
|
|
|
- // if err != nil {
|
|
|
- // fmt.Println("AddEdbDataCalculate Err:" + err.Error())
|
|
|
- // return
|
|
|
- // }
|
|
|
- //}
|
|
|
- return
|
|
|
-}
|
|
|
-
|
|
|
type CalculateItems struct {
|
|
|
EdbInfoId int
|
|
|
DataMap map[string]float64
|