dataRT/route/api/point.go

136 lines
2.8 KiB
Go
Raw Normal View History

2025-10-23 18:02:29 +08:00
package api
2025-11-06 21:09:50 +08:00
import (
2025-11-20 20:58:51 +08:00
"datart/data"
2025-11-06 21:09:50 +08:00
"datart/data/influx"
2025-11-20 20:58:51 +08:00
"datart/data/postgres"
2025-11-06 21:09:50 +08:00
"datart/log"
"datart/util"
"errors"
"fmt"
2025-11-20 20:58:51 +08:00
"strings"
2025-11-06 21:09:50 +08:00
"github.com/gin-gonic/gin"
)
2025-11-20 20:58:51 +08:00
func (a *Api) GetPoints(ctx *gin.Context) {
request, err := a.checkAndGenGetPointsRequest(ctx)
2025-11-06 21:09:50 +08:00
if err != nil {
log.Error(err)
ctx.JSON(200, gin.H{
"code": 1,
"msg": err.Error(),
})
return
}
2026-03-04 09:42:18 +08:00
var ftvs map[string][]influx.TV
2025-11-06 21:09:50 +08:00
switch {
case request.Begin > 0 && request.End > 0:
2026-03-04 09:42:18 +08:00
ftvs, err = influx.GetSSUPointsDurationData(ctx.Request.Context(), request)
2025-11-06 21:09:50 +08:00
case request.Begin > 0 && request.End < 0:
2026-03-04 09:42:18 +08:00
ftvs, err = influx.GetSSUPointsAfterLimit(ctx.Request.Context(), request, 1)
2025-11-06 21:09:50 +08:00
case request.Begin < 0 && request.End > 0:
2026-03-04 09:42:18 +08:00
ftvs, err = influx.GetSSUPointsBeforeLimit(ctx.Request.Context(), request, 1)
2025-11-06 21:09:50 +08:00
default:
2026-03-04 09:42:18 +08:00
ftvs, err = influx.GetSSUPointsLastLimit(ctx.Request.Context(), request, 1)
2025-11-06 21:09:50 +08:00
}
if err != nil {
log.Error(err, fmt.Sprintf(" params: %v", request))
ctx.JSON(200, gin.H{
"code": 2,
"msg": "query database error",
})
return
}
2026-03-04 09:42:18 +08:00
// handle key value
v, _ := postgres.ChannelSizes.Load(request.Tags[len(request.Tags)-1])
if channelSize, ok := v.(postgres.ChannelSize); ok {
for f, tvs := range ftvs {
for i := range tvs {
tvs[i].Value = data.ToPrimary(f, tvs[i].Value,
channelSize.IRatio, channelSize.URatio, channelSize.IPolar)
}
}
}
2025-11-06 21:09:50 +08:00
ctx.JSON(200, gin.H{
"code": 0,
"msg": "success",
2026-03-04 09:42:18 +08:00
"data": ftvs,
2025-11-06 21:09:50 +08:00
})
}
2025-11-20 20:58:51 +08:00
func (a *Api) checkAndGenGetPointsRequest(ctx *gin.Context) (*influx.Request, error) {
2025-11-06 21:09:50 +08:00
typeStr := ctx.DefaultQuery("type", "")
if len(typeStr) <= 0 {
return nil, errors.New("invalid type")
}
2025-11-20 20:58:51 +08:00
station, mainPos, subPos := "", "", ""
2026-03-04 09:42:18 +08:00
tags := strings.Split(ctx.DefaultQuery("mtag", ""), ".")
v, ok := postgres.ChannelSizes.Load(tags[len(tags)-1])
2025-11-20 20:58:51 +08:00
if ok {
if channelSize, ok := v.(postgres.ChannelSize); ok {
fields := data.GenPhasorFields(channelSize.Channel)
station = channelSize.Station
mainPos = channelSize.Device
subPos = strings.Join(fields, ",")
}
} else {
2026-03-04 09:42:18 +08:00
return nil, errors.New("invalid mtag")
2025-11-06 21:09:50 +08:00
}
beginStr := ctx.DefaultQuery("begin", "")
endStr := ctx.DefaultQuery("end", "")
operate := ctx.DefaultQuery("operate", "")
step := ctx.DefaultQuery("step", "")
defaultV := ctx.DefaultQuery("default", "")
begin := util.ConvertToInt64Default(beginStr, -1)
end := util.ConvertToInt64Default(endStr, -1)
bucket, err := influx.GetDB(typeStr)
if err != nil {
return nil, err
}
measure, err := influx.GetTable(typeStr, mainPos)
if err != nil {
return nil, err
}
return &influx.Request{
2026-03-04 09:42:18 +08:00
DB: bucket,
Table: measure,
Tags: tags,
2025-11-06 21:09:50 +08:00
Type: typeStr,
Station: station,
MainPos: mainPos,
SubPos: subPos,
Begin: begin,
End: end,
Operate: operate,
Step: step,
Default: defaultV,
}, nil
}