Browse Source

crontab: 复检,产犊

Yi 6 months ago
parent
commit
2382bf59bb

+ 1 - 1
go.mod

@@ -3,7 +3,7 @@ module kpt-pasture
 go 1.17
 
 require (
-	gitee.com/xuyiping_admin/go_proto v0.0.0-20240919061932-a470f1859b92
+	gitee.com/xuyiping_admin/go_proto v0.0.0-20240920080429-e344d4c3c3b7
 	gitee.com/xuyiping_admin/pkg v0.0.0-20231218082641-aac597b8a015
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible
 	github.com/eko/gocache v1.1.0

+ 6 - 0
go.sum

@@ -98,6 +98,12 @@ gitee.com/xuyiping_admin/go_proto v0.0.0-20240919060747-513871220a2c h1:pYRrpTto
 gitee.com/xuyiping_admin/go_proto v0.0.0-20240919060747-513871220a2c/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20240919061932-a470f1859b92 h1:pXV0rGbtId8o7XtpG47I/rNzZFsL53S48GlxrPDjAQY=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20240919061932-a470f1859b92/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240920035636-9f9a4471aecd h1:7Z/tCTztnuocjWbFhfe9dq4SZUhOw+pCPQtjSJyiW0k=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240920035636-9f9a4471aecd/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240920075539-863a9a1eecfe h1:wccYtNFakuPrU0RrJjzqKIJnwu9aATIXp38yl6NGYdY=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240920075539-863a9a1eecfe/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240920080429-e344d4c3c3b7 h1:1U6uvVC4H14uqTc6NgtcPsDVH9XjmmMri3f4QcfFhJo=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240920080429-e344d4c3c3b7/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
 gitee.com/xuyiping_admin/pkg v0.0.0-20231218082641-aac597b8a015 h1:dfb5dRd57L2HKjdwLT93UFmPYFPOmEl56gtZmqcNnaE=
 gitee.com/xuyiping_admin/pkg v0.0.0-20231218082641-aac597b8a015/go.mod h1:Fk4GYI/v0IK3XFrm1Gn+VkgCz5Y7mfswD5hsTJYOG6A=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=

+ 1 - 0
http/handler/event/event_base.go

@@ -50,6 +50,7 @@ func EnterEventCreate(c *gin.Context) {
 		valid.Field(&req.CowSourceId, valid.Required),
 		valid.Field(&req.Lact, valid.Required),
 		valid.Field(&req.EnterAt, valid.Required),
+		valid.Field(&req.CowSourceId, valid.Required),
 	); err != nil {
 		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
 		return

+ 3 - 0
model/calving_calf.go

@@ -6,6 +6,7 @@ type CalvingCalf struct {
 	Id            int64                  `json:"id"`
 	CalvingId     int64                  `json:"calvingId"`
 	CowId         int64                  `json:"cow_id"`
+	BirthAt       int64                  `json:"birthAt"`
 	MotherId      int64                  `json:"motherId"`
 	EarNumber     string                 `json:"earNumber"`
 	Sex           pasturePb.Genders_Kind `json:"sex"`
@@ -35,6 +36,8 @@ func NewEventCalvingCalf(motherId, calvingId int64, req *pasturePb.EventCalving)
 		calvingCalfList = append(calvingCalfList, &CalvingCalf{
 			EarNumber:     v.EarNumber,
 			CalvingId:     calvingId,
+			CowId:         int64(v.CowId),
+			BirthAt:       int64(req.CalvingAt),
 			PenId:         v.PenId,
 			BirthWeight:   int64(v.Weight * 1000),
 			CurrentWeight: int64(v.Weight * 1000),

+ 19 - 18
model/cow.go

@@ -27,8 +27,8 @@ type Cow struct {
 	BirthWeight         int64                      `json:"birthWeight"`
 	CurrentWeight       int64                      `json:"currentWeight"`
 	SourceId            pasturePb.CowSource_Kind   `json:"sourceId"`
-	FatherId            int64                      `json:"fatherId"`
-	MotherId            int64                      `json:"motherId"`
+	FatherNumber        string                     `json:"fatherNumber"`
+	MotherNumber        string                     `json:"motherNumber"`
 	IsRemove            pasturePb.IsShow_Kind      `json:"isRemove"`
 	IsPregnant          pasturePb.IsShow_Kind      `json:"isPregnant"`
 	IsHealth            pasturePb.IsShow_Kind      `json:"isHealth"`
@@ -40,7 +40,7 @@ type Cow struct {
 	LastEstrusAt        int64                      `json:"lastEstrusAt"`
 	LastCalvingAt       int64                      `json:"lastCalvingAt"`
 	LastMatingAt        int64                      `json:"lastMatingAt"`
-	LastBullId          int64                      `json:"lastBullId"`
+	LastBullNumber      string                     `json:"lastBullNumber"`
 	LastPregnantCheckAt int64                      `json:"lastPregnantCheckAt"`
 	LastDryMilkAt       int64                      `json:"lastDryMilkAt"`
 	LastSecondWeight    int64                      `json:"lastSecondWeight"`
@@ -110,8 +110,8 @@ func NewCow(req *pasturePb.EventEnterData) *Cow {
 		BreedStatus:         req.BreedStatusId,
 		CowKind:             req.CowKindId,
 		SourceId:            req.CowSourceId,
-		FatherId:            int64(req.FatherId),
-		MotherId:            int64(req.MotherId),
+		FatherNumber:        req.FatherNumber,
+		MotherNumber:        req.MotherNumber,
 		IsRemove:            pasturePb.IsShow_Ok,
 		IsHealth:            pasturePb.IsShow_Ok,
 		IsPregnant:          isPregnant,
@@ -123,20 +123,21 @@ func NewCow(req *pasturePb.EventEnterData) *Cow {
 	}
 }
 
-func NewCalfCow(motherId, fatherId int64, calf *CalvingCalf) *Cow {
+func NewCalfCow(motherId int64, fatherNumber string, calf *CalvingCalf) *Cow {
 	return &Cow{
-		Sex:         calf.Sex,
-		EarNumber:   calf.EarNumber,
-		PenId:       calf.PenId,
-		CowType:     pasturePb.CowType_Lactating_Calf, // 哺乳犊牛
-		BreedStatus: pasturePb.BreedStatus_UnBreed,    // 未配
-		CowKind:     calf.CowKind,                     // 牛只品种
-		BirthWeight: calf.BirthWeight,
-		SourceId:    pasturePb.CowSource_Calving, // 产犊方式
-		FatherId:    fatherId,
-		MotherId:    motherId,
-		IsRemove:    pasturePb.IsShow_Ok,
-		IsPregnant:  pasturePb.IsShow_No,
+		Sex:          calf.Sex,
+		EarNumber:    calf.EarNumber,
+		PenId:        calf.PenId,
+		CowType:      pasturePb.CowType_Lactating_Calf, // 哺乳犊牛
+		BreedStatus:  pasturePb.BreedStatus_UnBreed,    // 未配
+		CowKind:      calf.CowKind,                     // 牛只品种
+		BirthWeight:  calf.BirthWeight,
+		BirthAt:      calf.BirthAt,
+		SourceId:     pasturePb.CowSource_Calving, // 产犊方式
+		FatherNumber: fatherNumber,
+		MotherNumber: fmt.Sprintf("%d", motherId),
+		IsRemove:     pasturePb.IsShow_Ok,
+		IsPregnant:   pasturePb.IsShow_No,
 	}
 }
 

+ 52 - 43
model/event_calving.go

@@ -1,21 +1,28 @@
 package model
 
-import pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
+import (
+	"time"
+
+	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
+)
 
 type EventCalving struct {
-	Id             int64                         `json:"int_64"`
-	CowId          int64                         `json:"cow_id"`
-	EarNumber      string                        `json:"ear_number"`
+	Id             int64                         `json:"id"`
+	CowId          int64                         `json:"cowId"`
+	EarNumber      string                        `json:"earNumber"`
 	Lact           int32                         `json:"lact"`
-	DayAge         int32                         `json:"day_age"`
-	PenId          int32                         `json:"pen_id"`
-	CalvingAt      int64                         `json:"calving_at"`
-	ChildNumber    int8                          `json:"child_number"`
-	BullId         int64                         `json:"bull_id"`
-	DaysPregnant   int32                         `json:"days_pregnant"`
-	CalvingLevel   pasturePb.CalvingLevel_Kind   `json:"calving_level"`
-	StaffMemberId  int64                         `json:"staff_member_id"`
-	DystociaReason pasturePb.DystociaReason_Kind `json:"dystocia_reason"`
+	DayAge         int32                         `json:"dayAge"`
+	PlanDay        string                        `json:"planDay"`
+	RealityDay     string                        `json:"realityDay"`
+	EndDay         string                        `json:"endDay"`
+	PenId          int32                         `json:"penId"`
+	ChildNumber    int8                          `json:"childNumber"`
+	BullNumber     string                        `json:"bullNumber"`
+	PregnancyAge   int64                         `json:"pregnancyAge"`
+	CalvingLevel   pasturePb.CalvingLevel_Kind   `json:"calvingLevel"`
+	OperationId    int64                         `json:"operationId"`
+	OperationName  string                        `json:"operationName"`
+	DystociaReason pasturePb.DystociaReason_Kind `json:"dystociaReason"`
 	Remarks        string                        `json:"remarks"`
 	CreatedAt      int64                         `json:"created_at"`
 	UpdatedAt      int64                         `json:"updated_at"`
@@ -25,22 +32,23 @@ func (e *EventCalving) TableName() string {
 	return "event_calving"
 }
 
-func NewEventCalving(cow *Cow, req *pasturePb.EventCalving) *EventCalving {
+func NewEventCalving(cow *Cow, planDay int64) *EventCalving {
 	return &EventCalving{
-		CowId:          cow.Id,
-		EarNumber:      cow.EarNumber,
-		Lact:           cow.Lact,
-		DayAge:         cow.GetDayAge(),
-		PenId:          int32(cow.PenId),
-		CalvingAt:      int64(req.CalvingAt),
-		BullId:         cow.LastBullId,
-		CalvingLevel:   req.CalvingLevel,
-		DystociaReason: req.DystociaReason,
-		DaysPregnant:   cow.GetDaysPregnant(),
-		ChildNumber:    int8(req.ChildNumber),
-		Remarks:        req.Remarks,
-		StaffMemberId:  int64(req.StaffMemberId),
+		CowId:      cow.Id,
+		EarNumber:  cow.EarNumber,
+		Lact:       cow.Lact,
+		PenId:      cow.PenId,
+		BullNumber: cow.LastBullNumber,
+		PlanDay:    time.Unix(planDay, 0).Format(LayoutTime),
+	}
+}
+
+func NewEventCalvingList(cowList []*Cow, planDay int64) []*EventCalving {
+	eventCalvingList := make([]*EventCalving, 0)
+	for _, cow := range cowList {
+		eventCalvingList = append(eventCalvingList, NewEventCalving(cow, planDay))
 	}
+	return eventCalvingList
 }
 
 type EventCalvingList struct {
@@ -73,23 +81,24 @@ func (e EventCalvingListSlice) ToPB(req []*CalvingCalf) []*pasturePb.LavingList
 				Id:         int32(v.Id),
 			})
 		}
+		calvingDay, _ := time.Parse(LayoutTime, item.PlanDay)
 		list = append(list, &pasturePb.LavingList{
-			Id:              int32(item.Id),
-			CowId:           int32(item.CowId),
-			Lact:            item.Lact,
-			PenId:           item.PenId,
-			PenName:         item.PenName,
-			CalvingAt:       int32(item.CalvingAt),
-			ChildNumber:     int32(item.ChildNumber),
-			DaysPregnant:    item.DaysPregnant,
-			StaffMemberId:   int32(item.StaffMemberId),
-			StaffMemberName: item.StaffMemberName,
-			CalvingLevel:    item.CalvingLevel,
-			Remarks:         item.Remarks,
-			CreatedAt:       int32(item.CreatedAt),
-			UpdatedAt:       int32(item.UpdatedAt),
-			DystociaReason:  item.DystociaReason,
-			CalfItemList:    CalfItemList,
+			Id:             int32(item.Id),
+			CowId:          int32(item.CowId),
+			Lact:           item.Lact,
+			PenId:          item.PenId,
+			PenName:        item.PenName,
+			CalvingAt:      int32(calvingDay.Unix()),
+			ChildNumber:    int32(item.ChildNumber),
+			DaysPregnant:   int32(item.PregnancyAge),
+			OperationId:    int32(item.OperationId),
+			OperationName:  item.OperationName,
+			CalvingLevel:   item.CalvingLevel,
+			Remarks:        item.Remarks,
+			CreatedAt:      int32(item.CreatedAt),
+			UpdatedAt:      int32(item.UpdatedAt),
+			DystociaReason: item.DystociaReason,
+			CalfItemList:   CalfItemList,
 		})
 	}
 	return list

+ 6 - 6
model/event_enter.go

@@ -22,8 +22,8 @@ type EventEnter struct {
 	DayAge           int32                      `json:"day_age"`
 	PenId            int32                      `json:"pen_id"`
 	CowKind          pasturePb.CowKind_Kind     `json:"cow_kind"`
-	FatherId         int64                      `json:"father_id"`
-	MotherId         int64                      `json:"mother_id"`
+	FatherNumber     string                     `json:"fatherNumber"`
+	MotherNumber     string                     `json:"motherNumber"`
 	MatingAt         int64                      `json:"mating_at"`
 	PregnancyCheckAt int64                      `json:"pregnancy_check_at"`
 	DryMilkAt        int64                      `json:"dry_milk_at"`
@@ -55,8 +55,8 @@ func NewEventEnter(cowId, operationId int64, req *pasturePb.EventEnterData) *Eve
 		DayAge:           int32(math.Floor(float64(int32(time.Now().Unix())-req.BirthAt) / 86400)),
 		PenId:            req.PenId,
 		CowKind:          req.CowKindId,
-		FatherId:         int64(req.FatherId),
-		MotherId:         int64(req.MotherId),
+		FatherNumber:     req.FatherNumber,
+		MotherNumber:     req.MotherNumber,
 		MatingAt:         int64(req.MatingAt),
 		PregnancyCheckAt: int64(req.PregnancyCheckAt),
 		DryMilkAt:        int64(req.DryMilkAt),
@@ -88,8 +88,8 @@ func (e EventEnterSlice) ToPB() []*pasturePb.EventEnterData {
 			Lact:             d.Lact,
 			PenId:            d.PenId,
 			CowKindId:        d.CowKind,
-			FatherId:         int32(d.FatherId),
-			MotherId:         int32(d.MotherId),
+			FatherNumber:     d.FatherNumber,
+			MotherNumber:     d.MotherNumber,
 			MatingAt:         int32(d.MatingAt),
 			PregnancyCheckAt: int32(d.PregnancyCheckAt),
 			DryMilkAt:        int32(d.DryMilkAt),

+ 45 - 56
model/event_pregnant_check.go

@@ -1,89 +1,78 @@
 package model
 
-import pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
+import (
+	"time"
+
+	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
+)
 
 type EventPregnantCheck struct {
 	Id                  int64                              `json:"id"`
-	CowId               int64                              `json:"cow_id"`
-	DayAge              int32                              `json:"day_age"`
+	CowId               int64                              `json:"cowId"`
+	DayAge              int32                              `json:"dayAge"`
 	Lact                int8                               `json:"lact"`
-	PregnantCheckAt     int64                              `json:"pregnant_check_at"`
-	PregnantCheckResult pasturePb.PregnantCheckResult_Kind `json:"pregnant_check_result"`
-	PregnantCheckMethod pasturePb.PregnantCheckMethod_Kind `json:"pregnant_check_method"`
-	StaffMemberId       int64                              `json:"staff_member_id"`
-	OperationId         int64                              `json:"operation_id"`
+	MatingAge           int32                              `json:"matingAge"`
+	PlanDay             string                             `json:"planDay"`
+	RealityDay          string                             `json:"realityDay"`
+	EndDay              string                             `json:"endDay"`
+	PregnantCheckName   string                             `json:"pregnantCheckName"`
+	PregnantCheckResult pasturePb.PregnantCheckResult_Kind `json:"pregnantCheckResult"`
+	PregnantCheckMethod pasturePb.PregnantCheckMethod_Kind `json:"pregnantCheckMethod"`
+	OperationId         int64                              `json:"operationId"`
+	OperationName       string                             `json:"operationName"`
 	Remarks             string                             `json:"remarks"`
-	CreatedAt           int64                              `json:"created_at"`
-	UpdatedAt           int64                              `json:"updated_at"`
+	CreatedAt           int64                              `json:"createdAt"`
+	UpdatedAt           int64                              `json:"updatedAt"`
 }
 
 func (e *EventPregnantCheck) TableName() string {
 	return "event_pregnant_check"
 }
 
-func NewEventPregnantCheck(
-	cow *Cow,
-	systemUser *SystemUser,
-	req *pasturePb.EventPregnantCheck,
-	pregnantCheckResult pasturePb.PregnantCheckResult_Kind,
-) *EventPregnantCheck {
+func NewEventPregnantCheck(cow *Cow, pregnantCheckAt int64, pregnantCheckName string) *EventPregnantCheck {
 	return &EventPregnantCheck{
-		CowId:               cow.Id,
-		DayAge:              cow.GetDayAge(),
-		Lact:                int8(cow.Lact),
-		PregnantCheckAt:     int64(req.PregnantCheckAt),
-		PregnantCheckResult: pregnantCheckResult,
-		PregnantCheckMethod: req.PregnantCheckMethod,
-		StaffMemberId:       int64(req.StaffMemberId),
-		OperationId:         systemUser.Id,
-		Remarks:             req.Remarks,
+		CowId:             cow.Id,
+		DayAge:            cow.GetDayAge(),
+		Lact:              int8(cow.Lact),
+		PlanDay:           time.Unix(pregnantCheckAt, 0).Format(LayoutTime),
+		EndDay:            time.Unix(pregnantCheckAt, 0).Format(LayoutTime),
+		PregnantCheckName: pregnantCheckName,
+	}
+}
+
+func NewEventPregnantCheckList(cowList []*Cow, pregnantCheckAt int64, pregnantCheckName string) []*EventPregnantCheck {
+	res := make([]*EventPregnantCheck, len(cowList))
+	for i, cow := range cowList {
+		if cow.BreedStatus != pasturePb.BreedStatus_Breeding {
+			continue
+		}
+		res[i] = NewEventPregnantCheck(cow, pregnantCheckAt, pregnantCheckName)
 	}
+	return res
 }
 
 type EventPregnantCheckSlice []*EventPregnantCheck
 
-func (e EventPregnantCheckSlice) ToPB(systemUserList []*SystemUser, pregnantCheckResult, pregnantCheckMethod []*pasturePb.ConfigOptionsList) []*pasturePb.SearchPregnantCheckList {
+func (e EventPregnantCheckSlice) ToPB(
+	pregnantCheckResultMap map[pasturePb.PregnantCheckResult_Kind]string,
+	pregnantCheckMethodMap map[pasturePb.PregnantCheckMethod_Kind]string,
+) []*pasturePb.SearchPregnantCheckList {
 	result := make([]*pasturePb.SearchPregnantCheckList, len(e))
 	for i, v := range e {
-		var pregnantCheckResultName, pregnantCheckMethodName, staffMemberName, operationName = "", "", "", ""
-		for _, u := range systemUserList {
-			if v.StaffMemberId == u.Id {
-				staffMemberName = u.Name
-			}
-			if v.OperationId == u.Id {
-				operationName = u.Name
-			}
-		}
-
-		for _, s := range pregnantCheckResult {
-			if int32(v.PregnantCheckResult) != s.Value {
-				continue
-			}
-			pregnantCheckResultName = s.Label
-		}
-
-		for _, m := range pregnantCheckMethod {
-			if int32(v.PregnantCheckMethod) != m.Value {
-				continue
-			}
-			pregnantCheckMethodName = m.Label
-		}
-
+		pregnantCheckAt, _ := time.Parse(LayoutTime, v.PlanDay)
 		result[i] = &pasturePb.SearchPregnantCheckList{
 			Id:                      int32(v.Id),
 			CowId:                   int32(v.CowId),
 			DayAge:                  v.DayAge,
 			Lact:                    int32(v.Lact),
-			PregnantCheckAt:         int32(v.PregnantCheckAt),
+			PregnantCheckAt:         int32(pregnantCheckAt.Unix()),
 			PregnantCheckResult:     v.PregnantCheckResult,
-			PregnantCheckResultName: pregnantCheckResultName,
+			PregnantCheckResultName: pregnantCheckResultMap[v.PregnantCheckResult],
 			PregnantCheckMethod:     v.PregnantCheckMethod,
-			PregnantCheckMethodName: pregnantCheckMethodName,
-			StaffMemberId:           int32(v.StaffMemberId),
-			StaffMemberName:         staffMemberName,
+			PregnantCheckMethodName: pregnantCheckMethodMap[v.PregnantCheckMethod],
 			Remarks:                 v.Remarks,
 			OperationId:             int32(v.OperationId),
-			OperationName:           operationName,
+			OperationName:           v.OperationName,
 			CreatedAt:               int32(v.CreatedAt),
 			UpdatedAt:               int32(v.UpdatedAt),
 		}

+ 1 - 1
model/event_weaning.go

@@ -37,7 +37,7 @@ func NewEventWeaning(cowId int64, planDay int64, penId int32) *EventWeaning {
 	}
 }
 
-func NewCowWeaningList(cowList []*Cow, planDay int64) []*EventWeaning {
+func NewEventWeaningList(cowList []*Cow, planDay int64) []*EventWeaning {
 	var weaningList = make([]*EventWeaning, 0)
 	for _, cow := range cowList {
 		weaningList = append(weaningList, NewEventWeaning(cow.Id, planDay, cow.PenId))

+ 14 - 11
model/system_basic.go

@@ -10,20 +10,23 @@ const (
 	PregnancyAge                     = "pregnancy_age"                        // 怀孕天数
 	WeaningAge                       = "weaning_age"                          // 断奶天数
 
+	ValueTypeFixed = 1 // 固定值
+	ValueTypeRange = 2 // 范围值
 )
 
 type SystemBasic struct {
-	Id           int32               `json:"id"`
-	Name         string              `json:"name"`
-	CategoryName string              `json:"categoryName"`
-	CategoryId   int32               `json:"categoryId"`
-	MinValue     int32               `json:"minValue"`
-	MaxValue     int32               `json:"maxValue"`
-	WeekValue    pasturePb.Week_Kind `json:"weekValue"`
-	ValueType    int8                `json:"valueType"`
-	Remarks      string              `json:"remarks"`
-	CreatedAt    int64               `json:"createdAt"`
-	UpdatedAt    int64               `json:"updatedAt"`
+	Id           int32                 `json:"id"`
+	Name         string                `json:"name"`
+	CategoryName string                `json:"categoryName"`
+	CategoryId   int32                 `json:"categoryId"`
+	MinValue     int32                 `json:"minValue"`
+	MaxValue     int32                 `json:"maxValue"`
+	WeekValue    pasturePb.Week_Kind   `json:"weekValue"`
+	ValueType    int8                  `json:"valueType"`
+	Remarks      string                `json:"remarks"`
+	IsShow       pasturePb.IsShow_Kind `json:"isShow"`
+	CreatedAt    int64                 `json:"createdAt"`
+	UpdatedAt    int64                 `json:"updatedAt"`
 }
 
 func (s *SystemBasic) TableName() string {

+ 16 - 0
module/backend/enum_map.go

@@ -137,3 +137,19 @@ func (s *StoreEntry) AbortionReasonsMap() map[pasturePb.AbortionReasons_Kind]str
 	}
 	return res
 }
+
+func (s *StoreEntry) PregnantCheckMethodMap() map[pasturePb.PregnantCheckMethod_Kind]string {
+	res := make(map[pasturePb.PregnantCheckMethod_Kind]string)
+	for _, v := range s.PregnantCheckMethodEnumList() {
+		res[pasturePb.PregnantCheckMethod_Kind(v.Value)] = v.Label
+	}
+	return res
+}
+
+func (s *StoreEntry) PregnantCheckResultMap() map[pasturePb.PregnantCheckResult_Kind]string {
+	res := make(map[pasturePb.PregnantCheckResult_Kind]string)
+	for _, v := range s.PregnantCheckResultEnumList() {
+		res[pasturePb.PregnantCheckResult_Kind(v.Value)] = v.Label
+	}
+	return res
+}

+ 1 - 0
module/backend/enum_options.go

@@ -158,6 +158,7 @@ func (s *StoreEntry) SystemBaseConfigOptions(ctx context.Context, optionsName st
 		"workOrderPriority":      s.WorkOrderPriorityEnumList,
 		"workOrderCategory":      s.WorkOrderCategoryEnumList,
 		"immunizationConditions": s.ImmunizationConditionsEnumList,
+		"abortionReasons":        s.AbortionReasonsEnumList,
 	}
 
 	getConfigFunc, ok := getConfigFuncMap[optionsName]

+ 95 - 61
module/backend/event_breed.go

@@ -71,21 +71,35 @@ func (s *StoreEntry) CalvingCreate(ctx context.Context, req *pasturePb.EventCalv
 	}
 
 	cow := cowList[0]
+	newEventCalving := &model.EventCalving{}
+	if err = s.DB.Model(new(model.EventCalving)).Where("cow_id = ?", cow.Id).Where("lact = ?", cow.Lact).First(newEventCalving).Error; err != nil {
+		return xerr.Custom("该母牛信息不存在")
+	}
 
 	if err = s.DB.Transaction(func(tx *gorm.DB) error {
 		// 母牛信息
-		newCalving := model.NewEventCalving(cow, req)
-		if err = tx.Create(newCalving).Error; err != nil {
+		if err = tx.Model(new(model.EventCalving)).
+			Where("id = ?", newEventCalving.Id).
+			Updates(map[string]interface{}{
+				"reality_day":   time.Unix(int64(req.CalvingAt), 0).Format(model.LayoutTime),
+				"day_age":       cow.DayAge,
+				"lact":          cow.Lact + 1,
+				"pregnancy_age": cow.PregnancyAge,
+				"calving_level": req.CalvingLevel,
+				"bull_number":   cow.LastBullNumber,
+				"child_number":  len(req.CalfItemList),
+			}).
+			Error; err != nil {
 			return xerr.WithStack(err)
 		}
 		// 犊牛信息
-		newCalvingCalfList := model.NewEventCalvingCalf(cow.Id, newCalving.Id, req)
+		newCalvingCalfList := model.NewEventCalvingCalf(cow.Id, newEventCalving.Id, req)
 		for _, v := range newCalvingCalfList {
 			if v.IsLive == pasturePb.IsShow_No || v.IsAdoption == pasturePb.IsShow_No {
 				continue
 			}
 			// 留养犊牛
-			newCow := model.NewCalfCow(cow.Id, cow.LastBullId, v)
+			newCow := model.NewCalfCow(cow.Id, cow.LastBullNumber, v)
 			if err = tx.Create(newCow).Error; err != nil {
 				return xerr.WithStack(err)
 			}
@@ -100,7 +114,7 @@ func (s *StoreEntry) CalvingCreate(ctx context.Context, req *pasturePb.EventCalv
 			"lact":            cow.Lact + 1,
 			"breed_status":    pasturePb.BreedStatus_Calving,
 			"is_pregnant":     pasturePb.IsShow_No,
-			"calving_at":      time.Now().Unix(),
+			"calving_at":      0,
 			"last_calving_at": time.Now().Unix(),
 		}).Error; err != nil {
 			return xerr.WithStack(err)
@@ -129,15 +143,13 @@ func (s *StoreEntry) PregnantCheckList(ctx context.Context, req *pasturePb.Searc
 		return nil, xerr.WithStack(err)
 	}
 
-	systemUserList, _ := s.SystemUserList(ctx)
-	pregnantCheckResult := s.PregnantCheckResultEnumList()
-	pregnantCheckMethod := s.PregnantCheckMethodEnumList()
-
+	pregnantCheckResultMap := s.PregnantCheckResultMap()
+	pregnantCheckMethodMap := s.PregnantCheckMethodMap()
 	return &pasturePb.PregnantCheckEventResponse{
 		Code:    http.StatusOK,
 		Message: "ok",
 		Data: &pasturePb.SearchPregnantCheckData{
-			List:     model.EventPregnantCheckSlice(pregnantCheckList).ToPB(systemUserList, pregnantCheckResult, pregnantCheckMethod),
+			List:     model.EventPregnantCheckSlice(pregnantCheckList).ToPB(pregnantCheckResultMap, pregnantCheckMethodMap),
 			Total:    int32(count),
 			PageSize: pagination.PageSize,
 			Page:     pagination.Page,
@@ -153,71 +165,111 @@ func (s *StoreEntry) PregnantCheckCreate(ctx context.Context, req *pasturePb.Eve
 	if err != nil {
 		return xerr.WithStack(err)
 	}
-	eventPregnantCheckList := make([]*model.EventPregnantCheck, 0)
-	currentUser, _ := s.GetCurrentSystemUser(ctx)
+	systemUser, _ := s.GetSystemUserById(ctx, int64(req.StaffMemberId))
 
+	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 {
-		// 过滤掉没有配种状态的牛只 todo 是否需要返回前端提示用户
+		// 过滤掉没有配种状态的牛只
 		if cow.BreedStatus != pasturePb.BreedStatus_Breeding {
 			continue
 		}
-		var count int64 = 0
+
+		itemEventPregnantCheck := &model.EventPregnantCheck{}
 		if err = s.DB.Model(new(model.EventPregnantCheck)).
 			Where("lact = ?", cow.Lact).
 			Where("cow_id = ?", cow.Id).
-			Order("id desc").Limit(1).Count(&count).Error; err != nil {
+			Order("id desc").First(itemEventPregnantCheck).Error; err != nil {
 			return xerr.WithStack(err)
 		}
 
-		pregnantCheckResult := req.PregnantCheckResult
 		if req.PregnantCheckResult == pasturePb.PregnantCheckResult_Pregnant {
-			if count > 0 {
-				pregnantCheckResult = pasturePb.PregnantCheckResult_Recheck_Pregnant
-			} else {
-				pregnantCheckResult = pasturePb.PregnantCheckResult_InCheck_Pregnant
-			}
 			updatePregnantCowIds = append(updatePregnantCowIds, cow.Id)
 		}
 
 		if req.PregnantCheckResult == pasturePb.PregnantCheckResult_UnPregnant {
-			if count > 0 {
-				pregnantCheckResult = pasturePb.PregnantCheckResult_Recheck_UnPregnant
+			if itemEventPregnantCheck.PregnantCheckName == model.PregnantCheckForFirst {
 				updateAbortCowIds = append(updateAbortCowIds, cow.Id)
-			} else {
-				pregnantCheckResult = pasturePb.PregnantCheckResult_InCheck_UnPregnant
+			}
+			if itemEventPregnantCheck.PregnantCheckName == model.PregnantCheckForSecond {
 				updateEmptyCowIds = append(updateEmptyCowIds, cow.Id)
 			}
 		}
-		eventPregnantCheckList = append(eventPregnantCheckList, model.NewEventPregnantCheck(cow, currentUser, req, pregnantCheckResult))
+		cowIds = append(cowIds, cow.Id)
 	}
 
 	if err = s.DB.Transaction(func(tx *gorm.DB) error {
-		if err = tx.Create(eventPregnantCheckList).Error; err != nil {
+		// 更新孕检事件表
+		if err = tx.Model(new(model.EventPregnantCheck)).
+			Where("id IN ?", cowIds).
+			Updates(map[string]interface{}{
+				"reality_day":           pregnantCheckDay,
+				"pregnant_check_result": req.PregnantCheckResult,
+				"pregnant_check_method": req.PregnantCheckMethod,
+				"operation_id":          systemUser.Id,
+				"operation_name":        systemUser.Name,
+				"remarks":               req.Remarks,
+				"is_pregnant":           req.PregnantCheckResult,
+			}).Error; err != nil {
 			return xerr.WithStack(err)
 		}
+		// 更新牛只信息和配种事件表怀孕状态
+		if len(updatePregnantCowIds) > 0 {
+			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,
+					"is_pregnant":            pasturePb.IsShow_Ok,
+				}).Error; err != nil {
+				return xerr.WithStack(err)
+			}
 
-		// 抽象公共方法来更新牛只状态
-		err = s.updateCowStatus(tx, updatePregnantCowIds, pasturePb.BreedStatus_Pregnant, pasturePb.MatingResult_Pregnant)
-		if err != nil {
-			return err
+			if err = tx.Model(&model.EventMating{}).Where("cow_id IN ?", updatePregnantCowIds).
+				Group("cow_id").Select("MAX(id) as id").
+				Updates(map[string]interface{}{"mating_result": pasturePb.MatingResult_Pregnant}).Error; err != nil {
+				return xerr.WithStack(err)
+			}
 		}
+		// 更新牛只信息和配种事件表流产状态
+		if len(updateAbortCowIds) > 0 {
+			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,
+					"is_pregnant":            pasturePb.IsShow_Ok,
+				}).Error; err != nil {
+				return xerr.WithStack(err)
+			}
 
-		err = s.updateCowStatus(tx, updateAbortCowIds, pasturePb.BreedStatus_Abort, pasturePb.MatingResult_Abort)
-		if err != nil {
-			return err
+			if err = tx.Model(&model.EventMating{}).Where("cow_id IN ?", updateAbortCowIds).
+				Group("cow_id").Select("MAX(id) as id").
+				Updates(map[string]interface{}{"mating_result": pasturePb.MatingResult_Abort}).Error; err != nil {
+				return xerr.WithStack(err)
+			}
 		}
+		// 更新牛只信息和配种事件表空怀状态
+		if len(updateEmptyCowIds) > 0 {
+			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,
+					"is_pregnant":            pasturePb.IsShow_Ok,
+				}).Error; err != nil {
+				return xerr.WithStack(err)
+			}
 
-		err = s.updateCowStatus(tx, updateEmptyCowIds, pasturePb.BreedStatus_Empty, pasturePb.MatingResult_Empty)
-		if err != nil {
-			return err
+			if err = tx.Model(&model.EventMating{}).Where("cow_id IN ?", updateEmptyCowIds).
+				Group("cow_id").Select("MAX(id) as id").
+				Updates(map[string]interface{}{"mating_result": pasturePb.MatingResult_Empty}).Error; err != nil {
+				return xerr.WithStack(err)
+			}
 		}
-
 		return nil
 	}); err != nil {
 		return xerr.WithStack(err)
@@ -226,28 +278,6 @@ func (s *StoreEntry) PregnantCheckCreate(ctx context.Context, req *pasturePb.Eve
 	return nil
 }
 
-// 抽象公共方法来更新牛只状态
-func (s *StoreEntry) updateCowStatus(
-	tx *gorm.DB,
-	cowIds []int64,
-	breedStatus pasturePb.BreedStatus_Kind,
-	matingResult pasturePb.MatingResult_Kind,
-) error {
-	if len(cowIds) > 0 {
-		if err := tx.Model(&model.Cow{}).Where("cow_id IN ?", cowIds).
-			Updates(map[string]interface{}{"breed_status": breedStatus}).Error; err != nil {
-			return xerr.WithStack(err)
-		}
-
-		if err := tx.Model(&model.EventMating{}).Where("cow_id IN ?", cowIds).
-			Group("cow_id").Select("MAX(id) as id").
-			Updates(map[string]interface{}{"mating_result": matingResult}).Error; err != nil {
-			return xerr.WithStack(err)
-		}
-	}
-	return nil
-}
-
 func (s *StoreEntry) MatingList(ctx context.Context, req *pasturePb.SearchEventRequest, pagination *pasturePb.PaginationModel) (*pasturePb.MatingEventResponse, error) {
 	matingList := make([]*model.EventMating, 0)
 	var count int64 = 0
@@ -379,7 +409,11 @@ func (s *StoreEntry) MatingCreate(ctx context.Context, req *pasturePb.EventMatin
 
 		if err = tx.Table(new(model.Cow).TableName()).
 			Where("id IN ?", cowIds).
-			UpdateColumn("breed_status", pasturePb.BreedStatus_Breeding).Error; err != nil {
+			Updates(map[string]interface{}{
+				"breed_status":     pasturePb.BreedStatus_Breeding,
+				"last_bull_number": req.FrozenSemenNumber,
+				"last_mating_at":   int64(req.MatingAt),
+			}).Error; err != nil {
 			return xerr.WithStack(err)
 		}
 

+ 77 - 1
module/crontab/cow_cron.go

@@ -224,7 +224,7 @@ func (e *Entry) UpdateSameTime() error {
 		if err := e.DB.Model(new(model.EventCowSameTime)).
 			Where("same_time_type = ?", v.Value).
 			Where("status = ?", pasturePb.IsShow_No).
-			Count(&count); err != nil {
+			Count(&count).Error; err != nil {
 			zaplog.Error("crontab", zap.Any("UpdateSameTime", err), zap.Any("count", count))
 		}
 		if count >= 0 {
@@ -254,9 +254,85 @@ func (e *Entry) UpdateSameTime() error {
 
 // PregnancyCheck 妊娠期检查
 func (e *Entry) PregnancyCheck() error {
+	systemBasicList := make([]*model.SystemBasic, 0)
+	if err := e.DB.Model(new(model.SystemBasic)).
+		Where("is_show = ?", pasturePb.IsShow_Ok).
+		Where("name IN ?", []string{
+			model.PregnantCheckForFirst,
+			model.PregnantCheckForSecond,
+			model.WeaningAge,
+			model.PregnancyAge,
+		}).Find(&systemBasicList).Error; err != nil {
+		zaplog.Error("crontab", zap.Any("PregnancyCheck", err))
+		return xerr.WithStack(err)
+	}
+
+	currWeekValue := time.Now().Weekday()
+	planDay := time.Now().Unix()
+	for _, v := range systemBasicList {
+		// 周执行
+		if v.WeekValue >= 0 && time.Weekday(v.WeekValue) != currWeekValue {
+			continue
+		}
+
+		cowList := make([]*model.Cow, 0)
+		pref := e.DB.Model(new(model.Cow)).Where("is_remove = ? ", pasturePb.IsShow_Ok)
+
+		switch v.Name {
+		case model.PregnantCheckForFirst:
+			pref.Where("breed_status = ?", pasturePb.BreedStatus_Breeding)
+		case model.PregnantCheckForSecond: // 过滤初检空怀的牛只
+			pref.Where("breed_status = ?", pasturePb.BreedStatus_Pregnant)
+		case model.WeaningAge:
+		case model.PregnancyAge:
+			pref.Where("pregnancy_age >= ?", v.MinValue).
+				Where("breed_status = ?", pasturePb.BreedStatus_Pregnant)
+		default:
+			continue
+		}
+
+		if v.ValueType == model.ValueTypeFixed {
+			pref.Where("day_age = ?", v.MinValue)
+		}
+		if v.ValueType == model.ValueTypeRange {
+			pref.Where("day_age >= ?", v.MinValue).Where("day_age <= ?", v.MaxValue)
+		}
+
+		if err := pref.Find(&cowList).Error; err != nil {
+			zaplog.Error("crontab", zap.Any("PregnancyCheck", err), zap.Any("cowList", cowList))
+			continue
+		}
+
+		if len(cowList) <= 0 {
+			continue
+		}
+
+		e.InitEventData(cowList, v.Name, planDay)
+	}
+
 	return nil
 }
 
+func (e *Entry) InitEventData(cowList []*model.Cow, systemBasicName string, planDay int64) {
+	switch systemBasicName {
+	case model.PregnantCheckForFirst, model.PregnantCheckForSecond:
+		eventPregnantCheckDataList := model.NewEventPregnantCheckList(cowList, planDay, systemBasicName)
+		if err := e.DB.Create(eventPregnantCheckDataList).Error; err != nil {
+			zaplog.Error("crontab", zap.Any("InitEventData", err), zap.Any("eventPregnantCheckDataList", eventPregnantCheckDataList))
+		}
+	case model.WeaningAge:
+		eventWeaningDataList := model.NewEventWeaningList(cowList, planDay)
+		if err := e.DB.Create(eventWeaningDataList).Error; err != nil {
+			zaplog.Error("crontab", zap.Any("InitEventData", err), zap.Any("eventWeaningDataList", eventWeaningDataList))
+		}
+	case model.PregnancyAge:
+		eventCalvingList := model.NewEventCalvingList(cowList, planDay)
+		if err := e.DB.Create(eventCalvingList).Error; err != nil {
+			zaplog.Error("crontab", zap.Any("InitEventData", err), zap.Any("eventCalvingList", eventCalvingList))
+		}
+	}
+}
+
 // DiseaseCheck 疾病检查
 func (e *Entry) DiseaseCheck() error {
 	return nil