Browse Source

test: RNP-223

Yi 2 days ago
parent
commit
1bbf179e43
3 changed files with 92 additions and 47 deletions
  1. 13 47
      module/backend/event_base_more.go
  2. 62 0
      module/backend/event_check.go
  3. 17 0
      module/backend/event_cow_log.go

+ 13 - 47
module/backend/event_base_more.go

@@ -6,9 +6,7 @@ import (
 	"net/http"
 
 	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
-	"gitee.com/xuyiping_admin/pkg/logger/zaplog"
 	"gitee.com/xuyiping_admin/pkg/xerr"
-	"go.uber.org/zap"
 	"gorm.io/gorm"
 )
 
@@ -21,49 +19,9 @@ func (s *StoreEntry) DeathBatch(ctx context.Context, req *pasturePb.EventDeathBa
 	if len(req.Items) <= 0 {
 		return xerr.Custom("请选择相关牛只")
 	}
-
-	newEventDeathList := make([]*model.EventDeathModel, 0)
-	for _, item := range req.Items {
-		cow, err := s.GetCowInfoByEarNumber(ctx, userModel.AppPasture.Id, item.EarNumber)
-		if err != nil {
-			zaplog.Error("DeathBatch", zap.Any("item", item), zap.Any("err", err))
-			return xerr.Customf("获取牛只信息失败: %s", item.EarNumber)
-		}
-
-		if name, ok := s.DeadReasonMap()[item.DeathReasonKind]; ok {
-			item.DeathReasonName = name
-		}
-
-		operationUser, err := s.GetSystemUserById(ctx, int64(item.OperationId))
-		if err != nil {
-			zaplog.Error("DeathBatch", zap.Any("item", item), zap.Any("err", err))
-			return xerr.Customf("获取操作人员信息失败: %d", item.OperationId)
-		}
-
-		if name, ok := s.CowDeathDestinationMap()[item.DeathDestinationKind]; ok {
-			item.DeathDestinationName = name
-		}
-
-		newEventDeath := model.NewEventDeath(userModel.AppPasture.Id, cow, item, userModel.SystemUser, operationUser)
-		eventDeathModel := &model.EventDeathModel{
-			Cow:         cow,
-			EventDeath:  newEventDeath,
-			NeckRing:    nil,
-			CalvingCalf: nil,
-		}
-
-		// 犊牛死亡更新
-		if cow.DayAge <= model.CalfDefaultDayAge {
-			calvingCalf, ok := s.IsExistCalvingCalf(userModel.AppPasture.Id, cow.Id)
-			if ok && calvingCalf != nil {
-				eventDeathModel.CalvingCalf = calvingCalf
-			}
-		}
-
-		if neckRing, ok := s.NeckRingIsExist(userModel.AppPasture.Id, item.EarNumber); ok && neckRing != nil {
-			eventDeathModel.NeckRing = neckRing
-		}
-		newEventDeathList = append(newEventDeathList, eventDeathModel)
+	newEventDeathList, err := s.DeathCheck(ctx, req, userModel)
+	if err != nil {
+		return xerr.WithStack(err)
 	}
 
 	if err = s.DB.Transaction(func(tx *gorm.DB) error {
@@ -92,8 +50,16 @@ func (s *StoreEntry) DeathBatch(ctx context.Context, req *pasturePb.EventDeathBa
 					return xerr.WithStack(err)
 				}
 
-				newNeckRingBindLog := model.NewNeckRingBindLog(userModel.AppPasture.Id, item.NeckRing.NeckRingNumber, item.Cow, userModel.SystemUser, "死亡解绑")
-				if err = tx.Model(new(model.NeckRingBindLog)).Create(newNeckRingBindLog).Error; err != nil {
+				newNeckRingBindLog := model.NewNeckRingBindLog(
+					userModel.AppPasture.Id,
+					item.NeckRing.NeckRingNumber,
+					item.Cow,
+					userModel.SystemUser,
+					"死亡解绑",
+				)
+
+				if err = tx.Model(new(model.NeckRingBindLog)).
+					Create(newNeckRingBindLog).Error; err != nil {
 					return xerr.WithStack(err)
 				}
 			}

+ 62 - 0
module/backend/event_check.go

@@ -342,3 +342,65 @@ func (s *StoreEntry) ForbiddenMatingCheck(ctx context.Context, userModel *model.
 	}
 	return res, nil
 }
+
+func (s *StoreEntry) DeathCheck(ctx context.Context, req *pasturePb.EventDeathBatch, userModel *model.UserModel) ([]*model.EventDeathModel, error) {
+	newEventDeathList := make([]*model.EventDeathModel, 0)
+	for _, item := range req.Items {
+		cow, err := s.GetCowInfoByEarNumber(ctx, userModel.AppPasture.Id, item.EarNumber)
+		if err != nil {
+			zaplog.Error("DeathBatch", zap.Any("item", item), zap.Any("err", err))
+			return nil, xerr.Customf("获取牛只信息失败: %s", item.EarNumber)
+		}
+
+		if cow.BirthAt <= int64(item.DeathAt) {
+			return nil, xerr.Customf("牛只: %s,死亡时间不能早于出生时间", cow.EarNumber)
+		}
+
+		lastEventLog, err := s.GetEventCowLog(ctx, userModel.AppPasture.Id, cow.Id)
+		if err != nil {
+			zaplog.Error("DeathBatch", zap.Any("item", item), zap.Any("err", err))
+			return nil, xerr.Customf("获取牛只信息失败: %s", item.EarNumber)
+		}
+
+		if int64(item.DeathAt) < lastEventLog.EventAt {
+			return nil, xerr.Customf("牛只: %s,死亡时间不能早于上一次事件时间", cow.EarNumber)
+		}
+
+		if name, ok := s.DeadReasonMap()[item.DeathReasonKind]; ok {
+			item.DeathReasonName = name
+		}
+
+		operationUser, err := s.GetSystemUserById(ctx, int64(item.OperationId))
+		if err != nil {
+			zaplog.Error("DeathBatch", zap.Any("item", item), zap.Any("err", err))
+			return nil, xerr.Customf("获取操作人员信息失败: %d", item.OperationId)
+		}
+
+		if name, ok := s.CowDeathDestinationMap()[item.DeathDestinationKind]; ok {
+			item.DeathDestinationName = name
+		}
+
+		newEventDeath := model.NewEventDeath(userModel.AppPasture.Id, cow, item, userModel.SystemUser, operationUser)
+		eventDeathModel := &model.EventDeathModel{
+			Cow:         cow,
+			EventDeath:  newEventDeath,
+			NeckRing:    nil,
+			CalvingCalf: nil,
+		}
+
+		// 犊牛死亡更新
+		if cow.DayAge <= model.CalfDefaultDayAge {
+			calvingCalf, ok := s.IsExistCalvingCalf(userModel.AppPasture.Id, cow.Id)
+			if ok && calvingCalf != nil {
+				eventDeathModel.CalvingCalf = calvingCalf
+			}
+		}
+
+		if neckRing, ok := s.NeckRingIsExist(userModel.AppPasture.Id, item.EarNumber); ok && neckRing != nil {
+			eventDeathModel.NeckRing = neckRing
+		}
+		newEventDeathList = append(newEventDeathList, eventDeathModel)
+	}
+
+	return newEventDeathList, nil
+}

+ 17 - 0
module/backend/event_cow_log.go

@@ -2,6 +2,7 @@ package backend
 
 import (
 	"context"
+	"errors"
 	"fmt"
 	"kpt-pasture/model"
 	"kpt-pasture/util"
@@ -9,6 +10,8 @@ import (
 	"strings"
 	"time"
 
+	"gorm.io/gorm"
+
 	"gitee.com/xuyiping_admin/pkg/xerr"
 
 	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
@@ -213,6 +216,20 @@ func (s *StoreEntry) SubmitEventLog(ctx context.Context, pastureId int64, cow *m
 	return model.NewEventCowLog(newEventCowLogModel)
 }
 
+func (s *StoreEntry) GetEventCowLog(ctx context.Context, pastureId, cowId int64) (*model.EventCowLog, error) {
+	eventLog := &model.EventCowLog{CowId: cowId}
+	if err := s.DB.Table(eventLog.TableName()).
+		Where("cow_id = ?", cowId).
+		Where("pasture_id = ?", pastureId).
+		Order("event_at DESC").
+		First(&eventLog).Error; err != nil {
+		if !errors.Is(err, gorm.ErrRecordNotFound) {
+			return nil, xerr.WithStack(err)
+		}
+	}
+	return eventLog, nil
+}
+
 func (s *StoreEntry) UpdateMatingResultEventCowLogByCowId(ctx context.Context, cowId int64, newResult string) error {
 	newEventCowLog := &model.EventCowLog{CowId: cowId}
 	if err := s.DB.Table(newEventCowLog.TableName()).