Browse Source

fix:指标最新值

Roc 10 months ago
parent
commit
5d28d9275b

+ 1 - 1
controllers/data_manage/edb_info_calculate.go

@@ -1470,7 +1470,7 @@ func (this *EdbInfoController) QueryEdbDataTable() {
 
 	var templateStr string
 	if edbInfo.Source == utils.DATA_SOURCE_BUSINESS {
-		templateStr = fmt.Sprintf("# 查询条件\nquery = {\"edb_code\": \"%s\"}\n# 排序\nsort = [(\"data_time\", -1)]  # -1 表示降序排列,对应 SQL 的 DESC\nprojection = {\"data_time\": 1, \"value\": 1, \"_id\": 0}  # 只选择data_time和value字段,忽略_id字段\n# 使用 find() 方法获取数据,然后使用 aggregate() 转换为列表\nraw_data = list(collection.find(query, projection).sort(sort))\n# 将结果转换为 DataFrame\nraw = pd.DataFrame(raw_data)\n# 转换data_time字段为东八区时间\nraw['data_time'] = raw['data_time'].apply(lambda x: x.replace(tzinfo=utc_tz)).dt.tz_convert(local_tz).dt.strftime('%s')", edbInfo.EdbCode, "%Y-%m-%d")
+		templateStr = fmt.Sprintf("# 查询条件\nquery = {\"edb_code\": \"%s\"}\n# 排序\nsort = [(\"data_time\", -1)]  # -1 表示降序排列,对应 SQL 的 DESC\nprojection = {\"data_time\": 1, \"value\": 1, \"_id\": 0}  # 只选择data_time和value字段,忽略_id字段\n# 使用 find() 方法获取数据,然后使用 aggregate() 转换为列表\nraw_data = list(collection.find(query, projection).sort(sort))\n# 将结果转换为 DataFrame\nraw = pd.DataFrame(raw_data)\n# 转换data_time字段为本地时区时间\nraw['data_time'] = raw['data_time'].apply(lambda x: x.replace(tzinfo=utc_tz)).dt.tz_convert(local_tz).dt.strftime('%s')", edbInfo.EdbCode, "%Y-%m-%d")
 	} else {
 		templateStr = fmt.Sprintf("sql1 = f\"\"\"SELECT data_time,`value` FROM %s WHERE edb_code = '%s' ORDER BY data_time DESC;\"\"\"\nraw = pandas_fetch_all(sql1, db)", tableName, edbInfo.EdbCode)
 	}

+ 161 - 5
models/data_manage/edb_data_insert_config.go

@@ -2,9 +2,12 @@ package data_manage
 
 import (
 	"errors"
+	"eta/eta_api/models/mgo"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
+	"go.mongodb.org/mongo-driver/bson"
+	"go.mongodb.org/mongo-driver/mongo"
 	"strconv"
 	"time"
 )
@@ -51,8 +54,6 @@ func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value st
 	}
 
 	dateStr := date.Format(utils.FormatDate)
-	timestamp := date.UnixNano() / 1e6
-	timeStr := fmt.Sprintf("%d", timestamp)
 
 	var saveValue string
 	if value != "" {
@@ -65,7 +66,6 @@ func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value st
 		saveValue = utils.SubFloatToString(floatValue, 30)
 	}
 
-
 	to, err := orm.NewOrmUsingDB("data").Begin()
 	if err != nil {
 		return
@@ -132,6 +132,55 @@ func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value st
 		}
 	}
 
+	// 指标明细数据更新
+	if edbInfo.Source == utils.DATA_SOURCE_BUSINESS {
+		dateStr, err = updateInsertConfigValueByMongo(to, edbInfo, oldConfigDate, date, value)
+	} else {
+		dateStr, err = updateInsertConfigValueByMysql(to, edbInfo, oldConfigDate, date, value)
+	}
+	if err != nil {
+		return
+	}
+
+	// 指标信息更新
+	edbInfo.EndDate = dateStr
+	_, err = to.Update(edbInfo, "EndDate")
+
+	return
+}
+
+// updateInsertConfigValueByMysql
+// @Description: 从mysql更新或插入配置值
+// @author: Roc
+// @datetime 2024-05-09 11:05:41
+// @param to orm.TxOrmer
+// @param edbInfo *EdbInfo
+// @param oldConfigDate
+// @param date time.Time
+// @param value string
+// @return dateStr string
+// @return err error
+func updateInsertConfigValueByMysql(to orm.TxOrmer, edbInfo *EdbInfo, oldConfigDate, date time.Time, value string) (dateStr string, err error) {
+	tableName := GetEdbDataTableName(edbInfo.Source, edbInfo.SubSource)
+	if tableName == `` {
+		err = errors.New("找不到该指标的数据表")
+		return
+	}
+
+	dateStr = date.Format(utils.FormatDate)
+	timestamp := date.UnixNano() / 1e6
+	timeStr := fmt.Sprintf("%d", timestamp)
+	var saveValue string
+	if value != "" {
+		floatValue, e := strconv.ParseFloat(value, 64)
+		if e != nil {
+			err = e
+			fmt.Println("转换失败:", e.Error())
+			return
+		}
+		saveValue = utils.SubFloatToString(floatValue, 30)
+	}
+
 	var offsetDate string
 	// 更改数据
 	{
@@ -175,8 +224,115 @@ func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value st
 		}
 	}
 
-	edbInfo.EndDate = dateStr
-	_, err = to.Update(edbInfo, "EndDate")
+	return
+}
+
+// updateInsertConfigValueByMongo
+// @Description: 从mongo更新或插入配置值
+// @author: Roc
+// @datetime 2024-05-09 11:05:49
+// @param to orm.TxOrmer
+// @param edbInfo *EdbInfo
+// @param oldConfigDate
+// @param newDate time.Time
+// @param value string
+// @return dateStr string
+// @return err error
+func updateInsertConfigValueByMongo(to orm.TxOrmer, edbInfo *EdbInfo, oldConfigDate, newDate time.Time, value string) (dateStr string, err error) {
+	tableName := GetEdbDataTableName(edbInfo.Source, edbInfo.SubSource)
+	if tableName == `` {
+		err = errors.New("找不到该指标的数据表")
+		return
+	}
+
+	dateStr = newDate.Format(utils.FormatDate)
+	timestamp := newDate.UnixNano() / 1e6
+	var floatValue float64
+	if value != "" {
+		floatValue, err = strconv.ParseFloat(value, 64)
+		if err != nil {
+			fmt.Println("转换失败:", err.Error())
+			return
+		}
+	}
+
+	mogDataObj := mgo.EdbDataBusiness{}
+	coll := mogDataObj.GetCollection()
+
+	var edbDateData *mgo.EdbDataBusiness
+	if !oldConfigDate.IsZero() {
+		// 构建查询条件
+		queryConditions := bson.M{
+			"edb_info_id": edbInfo.EdbInfoId,
+			"data_time":   oldConfigDate,
+		}
+
+		edbDateData, err = mogDataObj.GetItem(queryConditions)
+		//if tmpErr != nil && tmpErr == mongo.ErrNoDocuments {
+		//	err = tmpErr
+		//	return
+		//}
+		if err != nil && err != mongo.ErrNoDocuments {
+			return
+		}
+		err = nil
+
+	}
+
+	// 如果是没有历史数据,那么就需要增加数据
+	if edbDateData == nil {
+		addDataItem := mgo.EdbDataBusiness{
+			//ID:            primitive.ObjectID{},
+			EdbInfoId:     edbInfo.EdbInfoId,
+			EdbCode:       edbInfo.EdbCode,
+			DataTime:      newDate,
+			Value:         floatValue,
+			CreateTime:    time.Now(),
+			ModifyTime:    time.Now(),
+			DataTimestamp: timestamp,
+		}
+		err = mogDataObj.InsertDataByColl(coll, addDataItem)
+		if err != nil {
+			fmt.Println("mogDataObj.BatchInsertData() Err:" + err.Error())
+			return
+		}
+		return
+	}
+
+	// 数据清空
+	if value == "" {
+		queryConditions := bson.M{
+			"edb_info_id": edbInfo.EdbInfoId,
+		}
+
+		// 获取最新的两条数据
+		tmpDataList, tmpErr := mogDataObj.GetLimitDataList(queryConditions, 2, []string{"-data_time"})
+		if tmpErr != nil {
+			fmt.Println("mogDataObj.GetLimitDataList() Err:" + tmpErr.Error())
+			return
+		}
+		// 如果并没有两条数据,那么就返回
+		if len(tmpDataList) < 2 {
+			return
+		}
+
+		// 实际应该是倒数第二条数据的日期
+		dateStr = tmpDataList[1].DataTime.Format(utils.FormatDate)
+
+		// 删除插入的数据
+		err = mogDataObj.RemoveManyByColl(coll, bson.M{"_id": tmpDataList[0].ID})
+
+		return
+	}
+
+	// 更新配置的数据
+	updateData := bson.M{"$set": bson.M{
+		"value":          floatValue,
+		"modify_time":    time.Now(),
+		"data_time":      newDate,
+		"data_timestamp": timestamp,
+	}}
+	err = mogDataObj.UpdateDataByColl(coll, bson.M{"_id": edbDateData.ID}, updateData)
 
 	return
 }

+ 43 - 17
models/data_manage/edb_info.go

@@ -225,26 +225,16 @@ func DeleteEdbInfoAndData(edbInfoId, source, subSource int) (err error) {
 		return
 	}
 
-	var tableName string
-	if subSource == 0 {
-		// 删除指标数据
-		tableName = GetEdbDataTableName(source, subSource)
+	// 删除指标的明细数据
+	if source == utils.DATA_SOURCE_BUSINESS {
+		err = deleteAllEdbDataByMongo(to, edbInfoId, source, subSource)
 	} else {
-		if source == utils.DATA_SOURCE_WIND {
-			tableName = "edb_data_wind_wsd"
-		} else if source == utils.DATA_SOURCE_THS {
-			tableName = "edb_data_ths_ds"
-		}
+		err = deleteAllEdbDataByMysql(to, edbInfoId, source, subSource)
 	}
-
-	if tableName != "" {
-		sql = ` DELETE FROM %s WHERE edb_info_id=? `
-		sql = fmt.Sprintf(sql, tableName)
-		_, err = to.Raw(sql, edbInfoId).Exec()
-		if err != nil {
-			return
-		}
+	if err != nil {
+		return
 	}
+
 	//calculateTableName := GetEdbInfoCalculateTableName(source)
 	//if calculateTableName != "" {
 	//	sql = ` DELETE FROM %s WHERE edb_info_id=? `
@@ -264,6 +254,42 @@ func DeleteEdbInfoAndData(edbInfoId, source, subSource int) (err error) {
 	return
 }
 
+// deleteAllEdbDataByMysql
+// @Description: 删除指标的明细数据(mysql)
+// @author: Roc
+// @datetime 2024-05-09 13:31:54
+// @param to orm.TxOrmer
+// @param edbInfoId int
+// @param source int
+// @param subSource int
+// @return err error
+func deleteAllEdbDataByMysql(to orm.TxOrmer, edbInfoId, source, subSource int) (err error) {
+	tableName := GetEdbDataTableName(source, subSource)
+	if tableName == `` {
+		return
+	}
+
+	sql := fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id=? `, tableName)
+	_, err = to.Raw(sql, edbInfoId).Exec()
+
+	return
+}
+
+// deleteAllEdbDataByMongo
+// @Description: 删除指标的明细数据(mongo)
+// @author: Roc
+// @datetime 2024-05-09 13:31:37
+// @param to orm.TxOrmer
+// @param edbInfoId int
+// @param source int
+// @param subSource int
+// @return err error
+func deleteAllEdbDataByMongo(to orm.TxOrmer, edbInfoId, source, subSource int) (err error) {
+	mogDataObj := mgo.EdbDataBusiness{}
+	err = mogDataObj.RemoveMany(bson.M{"edb_info_id": edbInfoId})
+	return
+}
+
 func GetEdbInfoCountByCondition(condition string, pars []interface{}) (count int, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT COUNT(1) AS count FROM edb_info WHERE 1=1 `

+ 64 - 0
models/mgo/edb_data_business.go

@@ -55,6 +55,52 @@ func (m *EdbDataBusiness) GetCollection() *qmgo.Collection {
 	return db.Collection(m.CollectionName())
 }
 
+// GetItem
+// @Description: 根据条件获取单条数据
+// @author: Roc
+// @receiver m
+// @datetime 2024-05-09 10:00:49
+// @param whereParams interface{}
+// @return item *EdbDataBusiness
+// @return err error
+func (m *EdbDataBusiness) GetItem(whereParams interface{}) (item *EdbDataBusiness, err error) {
+	if utils.MgoDataCli == nil {
+		err = errors.New("mongodb连接失败")
+		return
+	}
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+
+	return m.GetItemByColl(coll, whereParams)
+}
+
+// GetItemByColl
+// @Description: 根据条件获取单条数据
+// @author: Roc
+// @receiver m
+// @datetime 2024-05-09 13:22:06
+// @param coll *qmgo.Collection
+// @param whereParams interface{}
+// @return item *EdbDataBusiness
+// @return err error
+func (m *EdbDataBusiness) GetItemByColl(coll *qmgo.Collection, whereParams interface{}) (item *EdbDataBusiness, err error) {
+	ctx := context.TODO()
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+	err = coll.Find(ctx, whereParams).One(&item)
+	if err != nil {
+		return
+	}
+
+	item.DataTime = item.DataTime.In(time.Local)
+	item.CreateTime = item.CreateTime.In(time.Local)
+	item.ModifyTime = item.ModifyTime.In(time.Local)
+
+	return
+}
+
 // GetAllDataList
 // @Description: 根据条件获取所有数据
 // @author: Roc
@@ -188,6 +234,24 @@ func (m *EdbDataBusiness) GetCountDataList(whereParams interface{}) (count int64
 	return
 }
 
+// InsertDataByColl
+// @Description: 写入单条数据(外部传入集合)
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 14:22:18
+// @param addData EdbDataBusiness
+// @return err error
+func (m *EdbDataBusiness) InsertDataByColl(coll *qmgo.Collection, addData EdbDataBusiness) (err error) {
+	ctx := context.TODO()
+	_, err = coll.InsertOne(ctx, addData)
+	if err != nil {
+		fmt.Println("BatchInsertData:Err:" + err.Error())
+		return
+	}
+
+	return
+}
+
 // BatchInsertData
 // @Description: 批量写入数据
 // @author: Roc