|
@@ -124,6 +124,183 @@ func AddCalculate(edbInfoIdArr []*EdbInfo, edbInfoId int, edbCode, formulaStr st
|
|
|
return
|
|
|
}
|
|
|
|
|
|
+// AddCalculateInfo 新增计算(运算)指标
|
|
|
+func AddCalculateInfo(req EdbInfoCalculateSaveReq, calculateMappingList []*EdbInfoCalculateMapping, edbInfoList []*EdbInfo, edbCode, uniqueCode string, edbInfoIdBytes []string) (edbInfo *EdbInfo, err error) {
|
|
|
+
|
|
|
+ o := orm.NewOrm()
|
|
|
+ to, err := o.Begin()
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("AddCalculateHcz,Err:" + err.Error())
|
|
|
+ _ = to.Rollback()
|
|
|
+ } else {
|
|
|
+ _ = to.Commit()
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ edbInfo = &EdbInfo{
|
|
|
+ EdbInfoId: 0,
|
|
|
+ SourceName: "指标运算",
|
|
|
+ Source: utils.DATA_SOURCE_CALCULATE,
|
|
|
+ EdbCode: edbCode,
|
|
|
+ EdbName: req.EdbName,
|
|
|
+ EdbNameSource: req.EdbName,
|
|
|
+ Frequency: req.Frequency,
|
|
|
+ Unit: req.Unit,
|
|
|
+ StartDate: "",
|
|
|
+ EndDate: "",
|
|
|
+ ClassifyId: req.ClassifyId,
|
|
|
+ SysUserId: req.AdminId,
|
|
|
+ SysUserRealName: req.AdminName,
|
|
|
+ UniqueCode: uniqueCode,
|
|
|
+ CreateTime: time.Now(),
|
|
|
+ ModifyTime: time.Now(),
|
|
|
+ MinValue: 0,
|
|
|
+ MaxValue: 0,
|
|
|
+ CalculateFormula: req.CalculateFormula,
|
|
|
+ EdbType: 2,
|
|
|
+ Sort: 0,
|
|
|
+ MoveType: 0,
|
|
|
+ MoveFrequency: "",
|
|
|
+ NoUpdate: 0,
|
|
|
+ ServerUrl: "",
|
|
|
+ EdbInfoType: 0,
|
|
|
+ EdbNameEn: "",
|
|
|
+ UnitEn: "",
|
|
|
+ LatestDate: "",
|
|
|
+ LatestValue: 0,
|
|
|
+ ChartImage: "",
|
|
|
+ }
|
|
|
+ lastId, err := to.Insert(edbInfo)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ edbInfo.EdbInfoId = int(lastId)
|
|
|
+ //关联关系表
|
|
|
+ {
|
|
|
+ //处理关联指标
|
|
|
+ for _, v := range calculateMappingList {
|
|
|
+ v.EdbCode = edbCode
|
|
|
+ v.EdbInfoId = edbInfo.EdbInfoId
|
|
|
+ }
|
|
|
+ if len(calculateMappingList) > 0 {
|
|
|
+ _, err = to.InsertMulti(len(calculateMappingList), calculateMappingList)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //计算数据
|
|
|
+ err = refreshAllCalculate(to, edbInfoList, edbInfo.EdbInfoId, edbInfo.Source, edbInfo.EdbCode, edbInfo.CalculateFormula, "", "", edbInfoIdBytes)
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// EditCalculateInfo 编辑计算(运算)指标
|
|
|
+func EditCalculateInfo(edbInfo *EdbInfo, req EdbInfoCalculateSaveReq, formulaMap map[string]string, edbInfoIdBytes []string, needCalculate bool) (err error, errMsg string) {
|
|
|
+ o := orm.NewOrm()
|
|
|
+ to, err := o.Begin()
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("AddCalculateHcz,Err:" + err.Error())
|
|
|
+ _ = to.Rollback()
|
|
|
+ } else {
|
|
|
+ _ = to.Commit()
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ // 修改指标信息
|
|
|
+ edbInfo.EdbName = req.EdbName
|
|
|
+ edbInfo.EdbNameSource = req.EdbName
|
|
|
+ edbInfo.Frequency = req.Frequency
|
|
|
+ edbInfo.Unit = req.Unit
|
|
|
+ edbInfo.ClassifyId = req.ClassifyId
|
|
|
+ edbInfo.CalculateFormula = req.CalculateFormula
|
|
|
+ edbInfo.ModifyTime = time.Now()
|
|
|
+ _, err = to.Update(edbInfo, "EdbName", "EdbNameSource", "Frequency", "Unit", "ClassifyId", "CalculateFormula", "ModifyTime")
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if needCalculate {
|
|
|
+ // 清除计算数据
|
|
|
+ sql := `DELETE FROM edb_data_calculate WHERE edb_info_id=?`
|
|
|
+ _, err = to.Raw(sql, edbInfo.EdbInfoId).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 清除关联关系表
|
|
|
+ sql = `DELETE FROM edb_info_calculate_mapping WHERE edb_info_id=?`
|
|
|
+ _, err = to.Raw(sql, edbInfo.EdbInfoId).Exec()
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ edbInfoList := make([]*EdbInfo, 0)
|
|
|
+
|
|
|
+ calculateMappingList := make([]*EdbInfoCalculateMapping, 0)
|
|
|
+ for k, v := range req.EdbInfoIdArr {
|
|
|
+ fromEdbInfo, tmpErr := GetEdbInfoById(v.EdbInfoId)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
+ }
|
|
|
+ edbInfoList = append(edbInfoList, fromEdbInfo)
|
|
|
+
|
|
|
+ //关联关系表
|
|
|
+ {
|
|
|
+ calculateMappingItem := &EdbInfoCalculateMapping{
|
|
|
+ EdbInfoCalculateMappingId: 0,
|
|
|
+ EdbInfoId: req.EdbInfoId,
|
|
|
+ Source: edbInfo.Source,
|
|
|
+ SourceName: edbInfo.SourceName,
|
|
|
+ EdbCode: edbInfo.EdbCode,
|
|
|
+ FromEdbInfoId: fromEdbInfo.EdbInfoId,
|
|
|
+ FromEdbCode: fromEdbInfo.EdbCode,
|
|
|
+ FromEdbName: fromEdbInfo.EdbName,
|
|
|
+ FromSource: fromEdbInfo.Source,
|
|
|
+ FromSourceName: fromEdbInfo.SourceName,
|
|
|
+ FromTag: v.FromTag,
|
|
|
+ Sort: k + 1,
|
|
|
+ CreateTime: time.Now(),
|
|
|
+ ModifyTime: time.Now(),
|
|
|
+ }
|
|
|
+ calculateMappingList = append(calculateMappingList, calculateMappingItem)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //预先计算,判断公式是否正常
|
|
|
+ ok, _ := CheckFormula2(edbInfoList, formulaMap, req.CalculateFormula, edbInfoIdBytes)
|
|
|
+ if !ok {
|
|
|
+ errMsg = "生成计算指标失败,请使用正确的计算公式"
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ //关联关系表
|
|
|
+ {
|
|
|
+ if len(calculateMappingList) > 0 {
|
|
|
+ _, err = to.InsertMulti(len(calculateMappingList), calculateMappingList)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //计算数据
|
|
|
+ err = refreshAllCalculate(to, edbInfoList, edbInfo.EdbInfoId, edbInfo.Source, edbInfo.EdbCode, edbInfo.CalculateFormula, "", "", edbInfoIdBytes)
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
// GetCalculateEdbInfo 获取计算指标的关联指标id
|
|
|
func GetCalculateEdbInfo(edbInfoId int) (from_edb_info_id string, err error) {
|
|
|
o := orm.NewOrm()
|
|
@@ -176,6 +353,15 @@ func RefreshAllCalculate(edbInfoIdArr []*EdbInfo, edbInfoId, source int, edbCode
|
|
|
}
|
|
|
}()
|
|
|
fmt.Println(startDate, endDate)
|
|
|
+
|
|
|
+ //计算数据
|
|
|
+ err = refreshAllCalculate(to, edbInfoIdArr, edbInfoId, source, edbCode, formulaStr, startDate, endDate, edbInfoIdBytes)
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// refreshAllCalculate 刷新全部数据
|
|
|
+func refreshAllCalculate(to orm.TxOrmer, edbInfoIdArr []*EdbInfo, edbInfoId, source int, edbCode, formulaStr, startDate, endDate string, edbInfoIdBytes []string) (err error) {
|
|
|
saveDataMap := make(map[string]map[int]float64)
|
|
|
for _, v := range edbInfoIdArr {
|
|
|
var condition string
|
|
@@ -221,7 +407,7 @@ func RefreshAllCalculate(edbInfoIdArr []*EdbInfo, edbInfoId, source int, edbCode
|
|
|
dataTableName := GetEdbDataTableName(source)
|
|
|
sql := `SELECT * FROM %s WHERE edb_info_id=? `
|
|
|
sql = fmt.Sprintf(sql, dataTableName)
|
|
|
- _, err = o.Raw(sql, edbInfoId).QueryRows(&dataList)
|
|
|
+ _, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
@@ -275,7 +461,7 @@ func RefreshAllCalculate(edbInfoIdArr []*EdbInfo, edbInfoId, source int, edbCode
|
|
|
if existStr != saveValue {
|
|
|
sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
|
|
|
sql = fmt.Sprintf(sql, dataTableName)
|
|
|
- _, err = o.Raw(sql, saveValue, edbInfoId, sk).Exec()
|
|
|
+ _, err = to.Raw(sql, saveValue, edbInfoId, sk).Exec()
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
@@ -290,7 +476,7 @@ func RefreshAllCalculate(edbInfoIdArr []*EdbInfo, edbInfoId, source int, edbCode
|
|
|
|
|
|
if isAdd {
|
|
|
addSql = strings.TrimRight(addSql, ",")
|
|
|
- _, err = o.Raw(addSql).Exec()
|
|
|
+ _, err = to.Raw(addSql).Exec()
|
|
|
if err != nil {
|
|
|
fmt.Println("RefreshAllCalculate add Err", err.Error())
|
|
|
return
|
|
@@ -304,7 +490,7 @@ func RefreshAllCalculate(edbInfoIdArr []*EdbInfo, edbInfoId, source int, edbCode
|
|
|
tableName := GetEdbDataTableName(source)
|
|
|
sql := fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time in (%s) `, tableName, removeDateStr)
|
|
|
|
|
|
- _, err = o.Raw(sql, edbInfoId).Exec()
|
|
|
+ _, err = to.Raw(sql, edbInfoId).Exec()
|
|
|
if err != nil {
|
|
|
err = fmt.Errorf("删除计算失败的计算指标数据失败,Err:" + err.Error())
|
|
|
return
|