|  | @@ -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(¤tUserDataWarningList).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))
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +}
 |