Browse Source

commit: 解决冲突

Yi 1 month ago
parent
commit
9c48ba65a2
4 changed files with 124 additions and 66 deletions
  1. 7 0
      http/handler/test.go
  2. 1 0
      model/data_warning_items.go
  3. 101 58
      module/backend/dashboard.go
  4. 15 8
      module/backend/data_warning.go

+ 7 - 0
http/handler/test.go

@@ -4,6 +4,8 @@ import (
 	"kpt-pasture/http/middleware"
 	"net/http"
 
+	"gitee.com/xuyiping_admin/pkg/valid"
+
 	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
 
 	"gitee.com/xuyiping_admin/pkg/apierr"
@@ -71,6 +73,11 @@ func UpdateCowPen(c *gin.Context) {
 }
 
 func DataWarning(c *gin.Context) {
+	userId := c.Param("userId")
+	if err := valid.Validate(userId, valid.Required); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
 	if err := middleware.BackendOperation(c).OpsService.TestDataWaring(c); err != nil {
 		apierr.ClassifiedAbort(c, err)
 		return

+ 1 - 0
model/data_warning_items.go

@@ -2,6 +2,7 @@ package model
 
 type DataWarningItems struct {
 	Id        int64  `json:"id"`
+	UserId    int64  `json:"userId"`
 	WarningId int64  `json:"warningId"`
 	GroupId   int32  `json:"groupId"`
 	FieldName string `json:"fieldName"`

+ 101 - 58
module/backend/dashboard.go

@@ -3,6 +3,7 @@ package backend
 import (
 	"context"
 	"errors"
+	"fmt"
 	"kpt-pasture/model"
 	"kpt-pasture/util"
 	"net/http"
@@ -10,12 +11,10 @@ import (
 	"strings"
 	"time"
 
-	"gorm.io/gorm"
-
 	"gitee.com/xuyiping_admin/pkg/logger/zaplog"
-	"go.uber.org/zap"
-
 	"gitee.com/xuyiping_admin/pkg/xerr"
+	"go.uber.org/zap"
+	"gorm.io/gorm"
 
 	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
 )
@@ -182,7 +181,9 @@ func (s *StoreEntry) FocusIndicatorsSet(ctx context.Context, req *pasturePb.Inde
 	}
 
 	userFocusIndicators := strings.Join(req.IndicatorsKind, ",")
-	if err = s.DB.Model(new(model.SystemUser)).Where("id = ?", userModel.SystemUser.Id).Update("indicators_kinds", userFocusIndicators).Error; err != nil {
+	if err = s.DB.Model(new(model.SystemUser)).
+		Where("id = ?", userModel.SystemUser.Id).
+		Update("indicators_kinds", userFocusIndicators).Error; err != nil {
 		return xerr.WithStack(err)
 	}
 	return nil
@@ -196,19 +197,20 @@ func (s *StoreEntry) DataWarningSet(ctx context.Context, req *pasturePb.IndexDat
 	if len(req.WarningDataSet) <= 0 {
 		return nil
 	}
-	userDataWarningList := make([]*model.DataWarning, 0)
-	if err = s.DB.Model(new(model.DataWarning)).
-		Where("user_id = ?", userModel.SystemUser.Id).
-		Find(&userDataWarningList).Error; err != nil {
-		if errors.Is(err, gorm.ErrRecordNotFound) {
-
-		} else {
+	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 {
+		return xerr.WithStack(err)
 	}
-	/*for _, v := range userDataWarningList {
 
-	}*/
 	return nil
 }
 
@@ -218,28 +220,45 @@ func (s *StoreEntry) DataWarningList(ctx context.Context) (*pasturePb.IndexDataW
 		return nil, xerr.WithStack(err)
 	}
 
-	defaultUserDataWarningList, err := s.DefaultDataWarning(ctx)
+	defaultUserDataWarningList, err := s.FindDataWarning(ctx, model.DefaultUserId)
 	if err != nil {
-		return nil, xerr.WithStack(err)
+		return nil, xerr.Custom("默认预警数据有误,请联系管理员!")
 	}
-	currentUserDataWarningList := make([]*model.DataWarning, 0)
-	if err = s.DB.Model(new(model.DataWarning)).
-		Where("user_id = ?", userModel.SystemUser.Id).
-		Find(&currentUserDataWarningList).Error; err != nil {
+
+	var isExist bool // 判断是否存在自己的设置的数据
+	currentUserDataWarningList, err := s.FindDataWarning(ctx, userModel.SystemUser.Id)
+	if errors.Is(err, gorm.ErrRecordNotFound) {
+		// 如果用户没有配置自己的预警数据,则使用默认数据
+		isExist = true
+		currentUserDataWarningList = defaultUserDataWarningList
+	} else {
 		return nil, xerr.WithStack(err)
 	}
 
-	// 如果用户没有配置自己的预警数据,则使用默认数据
-	if len(currentUserDataWarningList) <= 0 {
-		currentUserDataWarningList = defaultUserDataWarningList
+	newTime := time.Now().Unix()
+	needUpdateWarningIds := make([]int64, 0)
+	warningMap := make(map[int64]*model.DataWarning)
+	for _, warningData := range currentUserDataWarningList {
+
+		warningMap[warningData.Id] = warningData
+		// 如果预警数据更新时间大于预警条件更新时间,并且更新时间距离当前时间小于2小时,则跳过
+		if warningData.DataUpdateAt > warningData.ConditionUpdateAt && newTime-warningData.DataUpdateAt < int64(2*time.Hour) {
+			continue
+		}
+		needUpdateWarningIds = append(needUpdateWarningIds, warningData.Id)
 	}
 
-	if len(currentUserDataWarningList) <= 0 {
-		return nil, xerr.Custom("当前用户未配置预警数据,请联系管理员!")
+	// 需要重新计算更新的warningId
+	if len(needUpdateWarningIds) > 0 {
+		s.UpdateWarningData(ctx, needUpdateWarningIds)
+	}
+	if isExist {
+		currentUserDataWarningList, _ = s.FindDataWarning(ctx, model.DefaultUserId)
+	} else {
+		currentUserDataWarningList, _ = s.FindDataWarning(ctx, userModel.SystemUser.Id)
 	}
 
-	warningIds := make([]int64, 0)
-	warningMap := make(map[int64]*model.DataWarning)
+	dataSet := make([]*pasturePb.WarningDataSet, 0)
 	dataShow := make([]*pasturePb.WarningDataShow, 0)
 	for _, warningData := range currentUserDataWarningList {
 		dataUpdateTimeFormat := ""
@@ -252,37 +271,10 @@ func (s *StoreEntry) DataWarningList(ctx context.Context) (*pasturePb.IndexDataW
 			Describe:             warningData.Description,
 			DataUpdateTimeFormat: dataUpdateTimeFormat,
 		})
-		warningMap[warningData.Id] = warningData
-		// 如果预警数据更新时间大于预警条件更新时间,则跳过
-		if warningData.DataUpdateAt > warningData.ConditionUpdateAt {
-			continue
-		}
-		warningIds = append(warningIds, warningData.Id)
-
-	}
-
-	dataWaningItems := make([]*model.DataWarningItems, 0)
-	if err = s.DB.Model(new(model.DataWarningItems)).
-		Where("warning_id in (?)", warningIds).
-		Find(&dataWaningItems).Error; err != nil {
-		return nil, xerr.WithStack(err)
-	}
-
-	dataSet := make([]*pasturePb.WarningDataSet, 0)
-	for _, v := range dataWaningItems {
-		warningData := warningMap[v.WarningId]
-		dataSet = append(dataSet, &pasturePb.WarningDataSet{
-			WarningId: int32(v.WarningId),
-			GroupId:   v.GroupId,
-			Name:      warningData.Name,
-			FieldDesc: v.FieldDesc,
-			Operator:  v.Operator,
-			Value:     v.Value,
-			Kind:      warningData.Kind,
-			IsShow:    pasturePb.IsShow_Ok,
-		})
 	}
 
+	defaultDataWarningItems, err := s.FindDataWarningItems(ctx, model.DefaultUserId)
+	fmt.Println(defaultDataWarningItems)
 	return &pasturePb.IndexDataWarningResponse{
 		Code: http.StatusOK,
 		Msg:  "ok",
@@ -293,12 +285,63 @@ func (s *StoreEntry) DataWarningList(ctx context.Context) (*pasturePb.IndexDataW
 	}, nil
 }
 
-func (s *StoreEntry) DefaultDataWarning(ctx context.Context) ([]*model.DataWarning, error) {
+func (s *StoreEntry) FindDataWarning(ctx context.Context, userId int64) ([]*model.DataWarning, error) {
 	defaultUserDataWarningList := make([]*model.DataWarning, 0)
 	if err := s.DB.Model(new(model.DataWarning)).
-		Where("user_id = ?", model.DefaultUserId).
+		Where("user_id = ?", userId).
 		Find(&defaultUserDataWarningList).Error; err != nil {
 		return nil, xerr.WithStack(err)
 	}
 	return defaultUserDataWarningList, nil
 }
+
+func (s *StoreEntry) FindDataWarningItems(ctx context.Context, userId int64) ([]*model.DataWarningItems, error) {
+	defaultUserDataWarningItemsList := make([]*model.DataWarningItems, 0)
+	if err := s.DB.Model(new(model.DataWarningItems)).
+		Where("user_id = ?", userId).
+		Find(&defaultUserDataWarningItemsList).Error; err != nil {
+		return nil, xerr.WithStack(err)
+	}
+	return defaultUserDataWarningItemsList, nil
+}
+
+func (s *StoreEntry) defaultDataWarningMap(ctx context.Context) (map[string]*model.DataWarning, error) {
+	defaultDataWarning, err := s.FindDataWarning(ctx, model.DefaultUserId)
+	if err != nil {
+		return nil, xerr.Custom("默认预警数据有误,请联系管理员!")
+	}
+	defaultDataWarningMap := make(map[string]*model.DataWarning)
+	for _, v := range defaultDataWarning {
+		defaultDataWarningMap[v.Kind] = v
+	}
+	return defaultDataWarningMap, nil
+}
+
+// UpdateWarningData 更新计算数据
+func (s *StoreEntry) UpdateWarningData(ctx context.Context, needUpdateWarningIds []int64) {
+	if len(needUpdateWarningIds) <= 0 {
+		return
+	}
+	for _, warningId := range needUpdateWarningIds {
+		query, params, err := s.BuildQuery(warningId)
+		if err != nil {
+			zaplog.Error("UpdateWarningData", zap.Any("BuildQuery", err), zap.Any("warningId", warningId))
+		}
+		if len(query) == 0 || len(params) == 0 {
+			continue
+		}
+		var count int64
+		if err = s.DB.Model(new(model.Cow)).Where(query, params...).Count(&count).Error; err != nil {
+			zaplog.Error("UpdateWarningData", zap.Any("err", err), zap.Any("query", query), zap.Any("params", params))
+		}
+
+		if err = s.DB.Model(new(model.DataWarning)).
+			Where("id = ?", warningId).
+			Updates(map[string]interface{}{
+				"data_value":     count,
+				"data_update_at": time.Now().Unix(),
+			}).Error; err != nil {
+			zaplog.Error("UpdateWarningData", zap.Any("update", err))
+		}
+	}
+}

+ 15 - 8
module/backend/data_warning.go

@@ -9,24 +9,31 @@ import (
 	"gitee.com/xuyiping_admin/pkg/xerr"
 )
 
-func (s *StoreEntry) TestDataWaring(ctx context.Context) error {
-	a, params, err := s.buildQuery(1)
-	if err != nil {
+func (s *StoreEntry) TestDataWaring(ctx context.Context, userId int64) error {
+	dataWarningList := make([]*model.DataWarning, 0)
+	if err := s.DB.Model(new(model.DataWarning)).Where("user_id = ?", userId).Error; err != nil {
 		return xerr.WithStack(err)
 	}
-	var count int64
-	if err = s.DB.Model(new(model.Cow)).Where(a, params...).Count(&count).Error; err != nil {
-		return xerr.WithStack(err)
+	for _, v := range dataWarningList {
+		a, params, err := s.BuildQuery(v.Id)
+		if err != nil {
+			return xerr.WithStack(err)
+		}
+		var count int64
+		if err = s.DB.Model(new(model.Cow)).Where(a, params...).Count(&count).Error; err != nil {
+			return xerr.WithStack(err)
+		}
 	}
 	return nil
 }
 
-func (s *StoreEntry) buildQuery(ruleId int64) (string, []interface{}, error) {
+func (s *StoreEntry) BuildQuery(warningId int64) (string, []interface{}, error) {
+
 	conditionsMap := make(map[int32][]string)
 	params := make([]interface{}, 0)
 	res := make([]*model.DataWarningItems, 0)
 	if err := s.DB.Model(new(model.DataWarningItems)).
-		Where("rule_id = ?", ruleId).
+		Where("warning_id = ?", warningId).
 		Order("group_id").
 		Find(&res).Error; err != nil {
 		return "", nil, xerr.WithStack(err)