|
@@ -2,8 +2,6 @@ package backend
|
|
|
|
|
|
import (
|
|
|
"context"
|
|
|
- "errors"
|
|
|
- "fmt"
|
|
|
"kpt-pasture/model"
|
|
|
"kpt-pasture/util"
|
|
|
"net/http"
|
|
@@ -11,10 +9,11 @@ import (
|
|
|
"strings"
|
|
|
"time"
|
|
|
|
|
|
+ "gorm.io/gorm"
|
|
|
+
|
|
|
"gitee.com/xuyiping_admin/pkg/logger/zaplog"
|
|
|
"gitee.com/xuyiping_admin/pkg/xerr"
|
|
|
"go.uber.org/zap"
|
|
|
- "gorm.io/gorm"
|
|
|
|
|
|
pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
|
|
|
)
|
|
@@ -194,24 +193,25 @@ func (s *StoreEntry) DataWarningSet(ctx context.Context, req *pasturePb.IndexDat
|
|
|
if err != nil {
|
|
|
return xerr.WithStack(err)
|
|
|
}
|
|
|
+
|
|
|
if len(req.WarningDataSet) <= 0 {
|
|
|
return nil
|
|
|
}
|
|
|
- currentUserDataWarningList, err := s.FindDataWarning(ctx, userModel.SystemUser.Id)
|
|
|
- fmt.Println(currentUserDataWarningList)
|
|
|
- if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
|
- // 如果不存在则新增
|
|
|
- defaultDataWarningMap, err := s.defaultDataWarningMap(ctx)
|
|
|
- if err != nil {
|
|
|
- return xerr.WithStack(err)
|
|
|
- }
|
|
|
- dataWarningList := model.NewDataWarningList(userModel.SystemUser.Id, req.WarningDataSet, defaultDataWarningMap)
|
|
|
- fmt.Println(dataWarningList)
|
|
|
- } else {
|
|
|
+
|
|
|
+ defaultDataWarning, _ := s.FindDataWarning(ctx, model.DefaultUserId)
|
|
|
+ if len(defaultDataWarning) <= 0 {
|
|
|
+ return xerr.Custom("默认预警数据不存在,请联系管理员!")
|
|
|
+ }
|
|
|
+
|
|
|
+ userDataWarningList, err := s.FindDataWarning(ctx, userModel.SystemUser.Id)
|
|
|
+ if err != nil {
|
|
|
return xerr.WithStack(err)
|
|
|
}
|
|
|
|
|
|
- return nil
|
|
|
+ if len(userDataWarningList) <= 0 { // 新增
|
|
|
+ return s.addUserDataWarning(ctx, userModel.SystemUser.Id, defaultDataWarning, req.WarningDataSet)
|
|
|
+ }
|
|
|
+ return s.updateUserDataWarning(ctx, userModel.SystemUser.Id, userDataWarningList, req.WarningDataSet)
|
|
|
}
|
|
|
|
|
|
func (s *StoreEntry) DataWarningList(ctx context.Context) (*pasturePb.IndexDataWarningResponse, error) {
|
|
@@ -220,27 +220,22 @@ func (s *StoreEntry) DataWarningList(ctx context.Context) (*pasturePb.IndexDataW
|
|
|
return nil, xerr.WithStack(err)
|
|
|
}
|
|
|
|
|
|
- defaultUserDataWarningList, err := s.FindDataWarning(ctx, model.DefaultUserId)
|
|
|
- if err != nil {
|
|
|
+ defaultDataWarning, _ := s.FindDataWarning(ctx, model.DefaultUserId)
|
|
|
+ if len(defaultDataWarning) <= 0 {
|
|
|
return nil, xerr.Custom("默认预警数据有误,请联系管理员!")
|
|
|
}
|
|
|
|
|
|
var isExist bool // 判断是否存在自己的设置的数据
|
|
|
- currentUserDataWarningList, err := s.FindDataWarning(ctx, userModel.SystemUser.Id)
|
|
|
- if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
|
+ userDataWarning, _ := s.FindDataWarning(ctx, userModel.SystemUser.Id)
|
|
|
+ if len(userDataWarning) == 0 {
|
|
|
// 如果用户没有配置自己的预警数据,则使用默认数据
|
|
|
isExist = true
|
|
|
- currentUserDataWarningList = defaultUserDataWarningList
|
|
|
- } else {
|
|
|
- return nil, xerr.WithStack(err)
|
|
|
+ userDataWarning = defaultDataWarning
|
|
|
}
|
|
|
|
|
|
newTime := time.Now().Unix()
|
|
|
needUpdateWarningIds := make([]int64, 0)
|
|
|
- warningMap := make(map[int64]*model.DataWarning)
|
|
|
- for _, warningData := range currentUserDataWarningList {
|
|
|
-
|
|
|
- warningMap[warningData.Id] = warningData
|
|
|
+ for _, warningData := range userDataWarning {
|
|
|
// 如果预警数据更新时间大于预警条件更新时间,并且更新时间距离当前时间小于2小时,则跳过
|
|
|
if warningData.DataUpdateAt > warningData.ConditionUpdateAt && newTime-warningData.DataUpdateAt < int64(2*time.Hour) {
|
|
|
continue
|
|
@@ -252,69 +247,162 @@ func (s *StoreEntry) DataWarningList(ctx context.Context) (*pasturePb.IndexDataW
|
|
|
if len(needUpdateWarningIds) > 0 {
|
|
|
s.UpdateWarningData(ctx, needUpdateWarningIds)
|
|
|
}
|
|
|
+
|
|
|
+ userDataWarningItems := make([]*model.DataWarningItems, 0)
|
|
|
+ // 计算过后重新获取数据
|
|
|
if isExist {
|
|
|
- currentUserDataWarningList, _ = s.FindDataWarning(ctx, model.DefaultUserId)
|
|
|
+ userDataWarning, _ = s.FindDataWarning(ctx, model.DefaultUserId)
|
|
|
+ userDataWarningItems, _ = s.FindDataWarningItems(ctx, model.DefaultUserId)
|
|
|
} else {
|
|
|
- currentUserDataWarningList, _ = s.FindDataWarning(ctx, userModel.SystemUser.Id)
|
|
|
- }
|
|
|
-
|
|
|
- dataSet := make([]*pasturePb.WarningDataSet, 0)
|
|
|
- dataShow := make([]*pasturePb.WarningDataShow, 0)
|
|
|
- for _, warningData := range currentUserDataWarningList {
|
|
|
- dataUpdateTimeFormat := ""
|
|
|
- if warningData.DataUpdateAt > 0 {
|
|
|
- dataUpdateTimeFormat = time.Unix(warningData.DataUpdateAt, 0).Format(model.LayoutTime)
|
|
|
- }
|
|
|
- dataShow = append(dataShow, &pasturePb.WarningDataShow{
|
|
|
- Name: warningData.Name,
|
|
|
- Number: warningData.DataValue,
|
|
|
- Describe: warningData.Description,
|
|
|
- DataUpdateTimeFormat: dataUpdateTimeFormat,
|
|
|
- })
|
|
|
+ userDataWarning, _ = s.FindDataWarning(ctx, userModel.SystemUser.Id)
|
|
|
+ userDataWarningItems, _ = s.FindDataWarningItems(ctx, userModel.SystemUser.Id)
|
|
|
}
|
|
|
|
|
|
- defaultDataWarningItems, err := s.FindDataWarningItems(ctx, model.DefaultUserId)
|
|
|
- fmt.Println(defaultDataWarningItems)
|
|
|
return &pasturePb.IndexDataWarningResponse{
|
|
|
Code: http.StatusOK,
|
|
|
Msg: "ok",
|
|
|
Data: &pasturePb.DataWarning{
|
|
|
- DataSet: dataSet,
|
|
|
- DataShow: dataShow,
|
|
|
+ DataSet: model.DataWarningItemsSlice(userDataWarningItems).ToPB(userDataWarning),
|
|
|
+ DataShow: model.DataWarningSlice(userDataWarning).ToPB(),
|
|
|
},
|
|
|
}, nil
|
|
|
}
|
|
|
|
|
|
+// 新增用户预警数据
|
|
|
+func (s *StoreEntry) addUserDataWarning(ctx context.Context, userId int64, defaultDataWarning []*model.DataWarning, warningDataSet []*pasturePb.WarningDataSet) error {
|
|
|
+ // 将默认预警数据按 Kind 映射
|
|
|
+ defaultDataWarningMap := make(map[string]*model.DataWarning)
|
|
|
+ for _, v := range defaultDataWarning {
|
|
|
+ defaultDataWarningMap[v.Kind] = v
|
|
|
+ }
|
|
|
+
|
|
|
+ // 在事务中执行新增操作
|
|
|
+ return s.DB.Transaction(func(tx *gorm.DB) error {
|
|
|
+ addedKinds := make(map[string]bool) // 记录已添加的 Kind
|
|
|
+ for _, set := range warningDataSet {
|
|
|
+ dataWarning := model.NewDataWarning(userId, set.Kind, pasturePb.IsShow_Ok, defaultDataWarningMap[set.Kind])
|
|
|
+ // 如果该 Kind 已添加,跳过
|
|
|
+ if !addedKinds[set.Kind] {
|
|
|
+ // 创建新的预警数据
|
|
|
+ if err := tx.Create(dataWarning).Error; err != nil {
|
|
|
+ return xerr.WithStack(err)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ oldDataWarning := &model.DataWarning{}
|
|
|
+ if err := tx.Model(new(model.DataWarning)).
|
|
|
+ Where("user_id = ?", userId).
|
|
|
+ Where("kind = ?", set.Kind).
|
|
|
+ First(oldDataWarning).Error; err != nil {
|
|
|
+ return xerr.WithStack(err)
|
|
|
+ }
|
|
|
+ dataWarning.Id = oldDataWarning.Id
|
|
|
+ }
|
|
|
+
|
|
|
+ // 创建预警项数据
|
|
|
+ if err := tx.Create(model.NewDataWarningItems(userId, dataWarning, set)).Error; err != nil {
|
|
|
+ return xerr.WithStack(err)
|
|
|
+ }
|
|
|
+ addedKinds[set.Kind] = true
|
|
|
+ }
|
|
|
+
|
|
|
+ return nil
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+// 更新用户预警数据
|
|
|
+func (s *StoreEntry) updateUserDataWarning(ctx context.Context, userId int64, userDataWarningList []*model.DataWarning, warningDataSet []*pasturePb.WarningDataSet) error {
|
|
|
+ // 将请求数据按 WarningId 和 Id 映射
|
|
|
+ warningIsShowMap := make(map[int32]pasturePb.IsShow_Kind)
|
|
|
+ warningItemDataMap := make(map[int32]*pasturePb.WarningDataSet)
|
|
|
+ for _, set := range warningDataSet {
|
|
|
+ warningIsShowMap[set.WarningId] = set.IsShow
|
|
|
+ warningItemDataMap[set.Id] = set
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取用户预警项数据
|
|
|
+ userDataWarningItems, err := s.FindDataWarningItems(ctx, userId)
|
|
|
+ if err != nil {
|
|
|
+ return xerr.WithStack(err)
|
|
|
+ }
|
|
|
+ if len(userDataWarningItems) == 0 {
|
|
|
+ return xerr.Custom("预警数据有误,请联系管理员!")
|
|
|
+ }
|
|
|
+
|
|
|
+ // 在事务中执行更新操作
|
|
|
+ return s.DB.Transaction(func(tx *gorm.DB) error {
|
|
|
+ // 更新预警数据的 IsShow 字段
|
|
|
+ for _, warning := range userDataWarningList {
|
|
|
+ if isShow, ok := warningIsShowMap[int32(warning.Id)]; ok {
|
|
|
+ if err = tx.Model(&model.DataWarning{}).
|
|
|
+ Where("id = ?", warning.Id).
|
|
|
+ Update("is_show", isShow).Error; err != nil {
|
|
|
+ return xerr.WithStack(err)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新预警项数据的 IsShow 和 Value 字段
|
|
|
+ for _, item := range userDataWarningItems {
|
|
|
+ if set, ok := warningItemDataMap[int32(item.Id)]; ok {
|
|
|
+ if err = tx.Model(&model.DataWarningItems{}).
|
|
|
+ Where("id = ?", item.Id).
|
|
|
+ Updates(map[string]interface{}{
|
|
|
+ "is_show": set.IsShow,
|
|
|
+ "value": set.Value,
|
|
|
+ }).Error; err != nil {
|
|
|
+ return xerr.WithStack(err)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return nil
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
func (s *StoreEntry) FindDataWarning(ctx context.Context, userId int64) ([]*model.DataWarning, error) {
|
|
|
- defaultUserDataWarningList := make([]*model.DataWarning, 0)
|
|
|
+ dataWarningList := make([]*model.DataWarning, 0)
|
|
|
if err := s.DB.Model(new(model.DataWarning)).
|
|
|
Where("user_id = ?", userId).
|
|
|
- Find(&defaultUserDataWarningList).Error; err != nil {
|
|
|
+ Find(&dataWarningList).Error; err != nil {
|
|
|
return nil, xerr.WithStack(err)
|
|
|
}
|
|
|
- return defaultUserDataWarningList, nil
|
|
|
+ return dataWarningList, nil
|
|
|
}
|
|
|
|
|
|
func (s *StoreEntry) FindDataWarningItems(ctx context.Context, userId int64) ([]*model.DataWarningItems, error) {
|
|
|
- defaultUserDataWarningItemsList := make([]*model.DataWarningItems, 0)
|
|
|
+ dataWarningItemsList := make([]*model.DataWarningItems, 0)
|
|
|
if err := s.DB.Model(new(model.DataWarningItems)).
|
|
|
Where("user_id = ?", userId).
|
|
|
- Find(&defaultUserDataWarningItemsList).Error; err != nil {
|
|
|
+ Find(&dataWarningItemsList).Error; err != nil {
|
|
|
return nil, xerr.WithStack(err)
|
|
|
}
|
|
|
- return defaultUserDataWarningItemsList, nil
|
|
|
+ return dataWarningItemsList, nil
|
|
|
}
|
|
|
|
|
|
-func (s *StoreEntry) defaultDataWarningMap(ctx context.Context) (map[string]*model.DataWarning, error) {
|
|
|
- defaultDataWarning, err := s.FindDataWarning(ctx, model.DefaultUserId)
|
|
|
+func (s *StoreEntry) FindDataWarningMap(ctx context.Context, userId int64) (map[int64]*model.DataWarning, error) {
|
|
|
+ dataWarning, err := s.FindDataWarning(ctx, userId)
|
|
|
if err != nil {
|
|
|
return nil, xerr.Custom("默认预警数据有误,请联系管理员!")
|
|
|
}
|
|
|
- defaultDataWarningMap := make(map[string]*model.DataWarning)
|
|
|
- for _, v := range defaultDataWarning {
|
|
|
- defaultDataWarningMap[v.Kind] = v
|
|
|
+ dataWarningMap := make(map[int64]*model.DataWarning)
|
|
|
+ for _, v := range dataWarning {
|
|
|
+ dataWarningMap[v.Id] = v
|
|
|
+ }
|
|
|
+ return dataWarningMap, nil
|
|
|
+}
|
|
|
+
|
|
|
+func (s *StoreEntry) FindDataWarningItemsMap(ctx context.Context, userId int64) (map[int64]*model.DataWarningItems, error) {
|
|
|
+ dataWarningItemsList := make([]*model.DataWarningItems, 0)
|
|
|
+ if err := s.DB.Model(new(model.DataWarningItems)).
|
|
|
+ Where("user_id = ?", userId).
|
|
|
+ Find(&dataWarningItemsList).Error; err != nil {
|
|
|
+ return nil, xerr.WithStack(err)
|
|
|
+ }
|
|
|
+ dataWarningItemsMap := make(map[int64]*model.DataWarningItems)
|
|
|
+ for _, v := range dataWarningItemsList {
|
|
|
+ dataWarningItemsMap[v.Id] = v
|
|
|
}
|
|
|
- return defaultDataWarningMap, nil
|
|
|
+ return dataWarningItemsMap, nil
|
|
|
}
|
|
|
|
|
|
// UpdateWarningData 更新计算数据
|