ソースを参照

event: 事件检查

Yi 4 ヶ月 前
コミット
4799e4f3e6

+ 2 - 0
http/route/event_api.go

@@ -23,6 +23,7 @@ func EventAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 		// 体况评分
 		eventRoute.POST("/body/score/list", event.BodyScoreEventList)
 		eventRoute.POST("/body/score/create", event.BodyScoreEventCreate)
+
 		// 称重
 		eventRoute.POST("/weight/list", event.WeightEventList)
 		eventRoute.POST("/weight/create", event.WeightEventCreate)
@@ -42,6 +43,7 @@ func EventAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 		// 同期
 		eventRoute.POST("/same/time/list", event.SameTimeList)
 		eventRoute.POST("/same/time/create", event.SameTimeCreate)
+
 		// 流产
 		eventRoute.POST("/abortion/list", event.AbortionList)
 		eventRoute.POST("/abortion/create", event.AbortionCreate)

+ 2 - 0
model/event_pregnant_check.go

@@ -26,6 +26,8 @@ type EventPregnantCheck struct {
 	Status              pasturePb.IsShow_Kind              `json:"status"`
 	OperationId         int64                              `json:"operationId"`
 	OperationName       string                             `json:"operationName"`
+	MessageId           int64                              `json:"messageId"`
+	MessageName         string                             `json:"messageName"`
 	Remarks             string                             `json:"remarks"`
 	CreatedAt           int64                              `json:"createdAt"`
 	UpdatedAt           int64                              `json:"updatedAt"`

+ 11 - 8
module/backend/event_base.go

@@ -21,22 +21,25 @@ func (s *StoreEntry) CreateEventTemplate(ctx context.Context, req *pasturePb.Sea
 	return nil
 }
 
-func (s *StoreEntry) ParseCowIds(ctx context.Context, cowId string) ([]*model.Cow, error) {
-	if len(cowId) == 0 {
+func (s *StoreEntry) ParseCowIds(ctx context.Context, cowIds string) ([]*model.Cow, error) {
+	if len(cowIds) == 0 {
 		return nil, xerr.Custom("cow id is required")
 	}
-	cowIdStr := strings.Split(cowId, ",")
-	var cowIds = make([]*model.Cow, 0)
+	cowIdStr := strings.Split(cowIds, ",")
+	var cowIdInts = make([]int64, 0)
 	for _, v := range cowIdStr {
 		cowId, err := strconv.ParseInt(v, 10, 64)
-		cow, err := s.GetCowInfoByCowId(ctx, cowId)
 		if err != nil {
-			return nil, xerr.WithStack(err)
+			return nil, xerr.Customf("错误的牛号: %s", v)
 		}
-		cowIds = append(cowIds, cow)
+		cowIdInts = append(cowIdInts, cowId)
 	}
 
-	return cowIds, nil
+	cowList, err := s.GetCowInfoByCowIds(ctx, cowIdInts)
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
+	return cowList, nil
 }
 
 func (s *StoreEntry) EnterList(ctx context.Context, req *pasturePb.SearchEventRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchEnterEventResponse, error) {

+ 15 - 20
module/backend/event_breed.go

@@ -161,34 +161,26 @@ func (s *StoreEntry) PregnantCheckList(ctx context.Context, req *pasturePb.Searc
 }
 
 func (s *StoreEntry) PregnantCheckCreate(ctx context.Context, req *pasturePb.EventPregnantCheck) error {
-	if len(req.CowId) <= 0 {
-		return xerr.Custom("请选择相关牛只")
-	}
-	cowList, err := s.ParseCowIds(ctx, req.CowId)
+	eventCheckModel, err := s.PregnantCheckCreateCheck(ctx, req)
 	if err != nil {
 		return xerr.WithStack(err)
 	}
-	systemUser, _ := s.GetSystemUserById(ctx, int64(req.OperationId))
 
-	pregnantCheckDay := time.Unix(int64(req.PregnantCheckAt), 0).Format(model.LayoutTime)
 	// 更新怀孕牛只
 	updatePregnantCowIds := make([]int64, 0)
 	// 更新流产牛只
 	updateAbortCowIds := make([]int64, 0)
 	// 更新空怀牛只
 	updateEmptyCowIds := make([]int64, 0)
-	cowIds := make([]int64, 0)
-	for _, cow := range cowList {
-		// 过滤掉没有配种状态的牛只
-		if cow.BreedStatus != pasturePb.BreedStatus_Breeding {
-			continue
-		}
 
+	cowIds := make([]int64, 0)
+	for _, cow := range eventCheckModel.CowList {
 		itemEventPregnantCheck := &model.EventPregnantCheck{}
 		if err = s.DB.Model(new(model.EventPregnantCheck)).
 			Where("lact = ?", cow.Lact).
 			Where("cow_id = ?", cow.Id).
-			Order("id desc").First(itemEventPregnantCheck).Error; err != nil {
+			Order("id desc").
+			First(itemEventPregnantCheck).Error; err != nil {
 			return xerr.WithStack(err)
 		}
 
@@ -212,11 +204,13 @@ func (s *StoreEntry) PregnantCheckCreate(ctx context.Context, req *pasturePb.Eve
 		if err = tx.Model(new(model.EventPregnantCheck)).
 			Where("id IN ?", cowIds).
 			Updates(map[string]interface{}{
-				"reality_day":           pregnantCheckDay,
+				"reality_day":           req.PregnantCheckAt,
 				"pregnant_check_result": req.PregnantCheckResult,
 				"pregnant_check_method": req.PregnantCheckMethod,
-				"operation_id":          systemUser.Id,
-				"operation_name":        systemUser.Name,
+				"operation_id":          eventCheckModel.OperationUser.Id,
+				"operation_name":        eventCheckModel.OperationUser.Name,
+				"message_id":            eventCheckModel.CurrentUser.Id,
+				"message_name":          eventCheckModel.CurrentUser.Name,
 				"remarks":               req.Remarks,
 				"is_pregnant":           req.PregnantCheckResult,
 			}).Error; err != nil {
@@ -224,10 +218,11 @@ func (s *StoreEntry) PregnantCheckCreate(ctx context.Context, req *pasturePb.Eve
 		}
 		// 更新牛只信息和配种事件表怀孕状态
 		if len(updatePregnantCowIds) > 0 {
-			if err = tx.Model(&model.Cow{}).Where("cow_id IN ?", updatePregnantCowIds).
+			if err = tx.Model(&model.Cow{}).
+				Where("cow_id IN ?", updatePregnantCowIds).
 				Updates(map[string]interface{}{
 					"breed_status":           pasturePb.BreedStatus_Pregnant,
-					"last_pregnant_check_at": pregnantCheckDay,
+					"last_pregnant_check_at": req.PregnantCheckAt,
 					"is_pregnant":            pasturePb.IsShow_Ok,
 				}).Error; err != nil {
 				return xerr.WithStack(err)
@@ -247,7 +242,7 @@ func (s *StoreEntry) PregnantCheckCreate(ctx context.Context, req *pasturePb.Eve
 			if err = tx.Model(&model.Cow{}).Where("cow_id IN ?", updateAbortCowIds).
 				Updates(map[string]interface{}{
 					"breed_status":           pasturePb.BreedStatus_Abort,
-					"last_pregnant_check_at": pregnantCheckDay,
+					"last_pregnant_check_at": req.PregnantCheckAt,
 					"is_pregnant":            pasturePb.IsShow_Ok,
 				}).Error; err != nil {
 				return xerr.WithStack(err)
@@ -267,7 +262,7 @@ func (s *StoreEntry) PregnantCheckCreate(ctx context.Context, req *pasturePb.Eve
 			if err = tx.Model(&model.Cow{}).Where("cow_id IN ?", updateEmptyCowIds).
 				Updates(map[string]interface{}{
 					"breed_status":           pasturePb.BreedStatus_Empty,
-					"last_pregnant_check_at": pregnantCheckDay,
+					"last_pregnant_check_at": req.PregnantCheckAt,
 					"is_pregnant":            pasturePb.IsShow_Ok,
 				}).Error; err != nil {
 				return xerr.WithStack(err)

+ 61 - 0
module/backend/event_check.go

@@ -38,6 +38,25 @@ func (s *StoreEntry) MatingCreateCheck(ctx context.Context, req *pasturePb.Event
 		if cow.Sex != pasturePb.Genders_Female {
 			return nil, xerr.Customf("牛只: %d,不是母牛", cow.Id)
 		}
+		if int64(req.MatingAt) < cow.LastMatingAt {
+			return nil, xerr.Customf("牛只: %d,最近一次配种时间: %d,不能小于本次配种时间: %d", cow.Id, cow.LastMatingAt, req.MatingAt)
+		}
+
+		if int64(req.MatingAt) < cow.LastPregnantCheckAt {
+			return nil, xerr.Customf("牛只: %d,最近一次孕检时间: %d,不能小于本次配种时间: %d", cow.Id, cow.LastPregnantCheckAt, req.MatingAt)
+		}
+
+		if int64(req.MatingAt) < cow.LastAbortionAt {
+			return nil, xerr.Customf("牛只: %d,最近一次流产时间: %d,不能小于本次配种时间: %d", cow.Id, cow.LastAbortionAt, req.MatingAt)
+		}
+
+		if int64(req.MatingAt) < cow.BirthAt {
+			return nil, xerr.Customf("牛只: %d,出生时间: %d,不能小于本次配种时间: %d", cow.Id, cow.BirthAt, req.MatingAt)
+		}
+
+		if cow.BreedStatus == pasturePb.BreedStatus_Pregnant || cow.BreedStatus == pasturePb.BreedStatus_No_Mating {
+			return nil, xerr.Customf("牛只: %d,当前状态为: %s,不能进行配种", cow.Id, cow.BreedStatus.String())
+		}
 	}
 	return &EventCheckModel{
 		CowList:       cowList,
@@ -45,3 +64,45 @@ func (s *StoreEntry) MatingCreateCheck(ctx context.Context, req *pasturePb.Event
 		OperationUser: operationUser,
 	}, nil
 }
+
+func (s *StoreEntry) PregnantCheckCreateCheck(ctx context.Context, req *pasturePb.EventPregnantCheck) (*EventCheckModel, error) {
+	if len(req.CowId) <= 0 {
+		return nil, xerr.Custom("请选择相关牛只")
+	}
+
+	operationUser, err := s.GetSystemUserById(ctx, int64(req.OperationId))
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
+	currentUser, err := s.GetCurrentSystemUser(ctx)
+	if err != nil {
+		return nil, xerr.Customf("获取当前用户失败: %s", err.Error())
+	}
+
+	cowList, err := s.ParseCowIds(ctx, req.CowId)
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
+	for _, cow := range cowList {
+		// 过滤掉没有配种状态的牛只
+		if cow.BreedStatus != pasturePb.BreedStatus_Breeding {
+			return nil, xerr.Customf("牛只: %d,当前状态为: %s,不能进行孕检", cow.Id, cow.BreedStatus.String())
+		}
+
+		if int64(req.PregnantCheckAt) < cow.LastMatingAt {
+			return nil, xerr.Customf("牛只: %d,最近一次配种时间: %d,不能小于本次孕检时间: %d", cow.Id, req.PregnantCheckAt)
+		}
+
+		if int64(req.PregnantCheckAt) < cow.LastCalvingAt {
+			return nil, xerr.Customf("牛只: %d,最近一次产犊时间: %d,不能小于本次孕检时间: %d", cow.Id, cow.LastCalvingAt, req.PregnantCheckAt)
+		}
+	}
+
+	return &EventCheckModel{
+		CowList:       cowList,
+		CurrentUser:   currentUser,
+		OperationUser: operationUser,
+	}, nil
+}

+ 6 - 1
module/backend/interface.go

@@ -180,12 +180,17 @@ type EventService interface {
 	WeightList(ctx context.Context, req *pasturePb.SearchEventRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchWeightEventResponse, error)
 	WeightCreate(ctx context.Context, req *pasturePb.EventWeight) error
 
-	// CowDiseaseCreate 牛只发病
+	// CowDiseaseCreate 提交发病牛只
 	CowDiseaseCreate(ctx context.Context, req *pasturePb.EventCowDiseaseRequest) error
+	// CowDiseaseList  发病牛只列表
 	CowDiseaseList(ctx context.Context, req *pasturePb.SearchEventCowTreatmentRequest, pagination *pasturePb.PaginationModel) (*pasturePb.EventCowDiseaseResponse, error)
+	// CowDiseaseDiagnose 诊断
 	CowDiseaseDiagnose(ctx context.Context, req *pasturePb.CowDiagnosedRequest) error
+	// CowDiseaseTreatment 治疗
 	CowDiseaseTreatment(ctx context.Context, req *pasturePb.CowTreatmentRequest) error
+	// CowDiseaseTreatmentDetail 治疗详情
 	CowDiseaseTreatmentDetail(ctx context.Context, req *pasturePb.EventCowTreatmentDetailRequest, pagination *pasturePb.PaginationModel) (*pasturePb.EventCowTreatmentDetailResponse, error)
+	// CowDiseaseCurable 治愈
 	CowDiseaseCurable(ctx context.Context, req *pasturePb.EventCowCurableRequest) error
 }