Yi 1 mesiac pred
rodič
commit
e017b00a4d

+ 8 - 8
.drone.yml

@@ -2,15 +2,15 @@ kind: pipeline
 type: docker
 name: kptPasture
 
-#clone:
-#  depth: 1
-#  disable: true
+clone:
+  depth: 1
+  disable: true
 steps:
-#  - name: clone
-#    image: alpine/git
-#    commands:
-#      - git clone -b feature/event http://192.168.1.8:3000/xuyiping/kpt-pasture.git
-#      - cp -R kpt-pasture/* ./
+  - name: clone
+    image: alpine/git
+    commands:
+      - git clone -b feature/event http://192.168.1.8:3000/xuyiping/kpt-pasture.git
+      - cp -R kpt-pasture/* ./
   - name: build
     image: plugins/docker:20.14.2
     volumes:

+ 1 - 0
README.md

@@ -34,6 +34,7 @@ lint:
 ## 初始化系统表
 1. data_warning
 2. data_warning_items
+3. system_basic
 
 
 todo列表:

+ 1 - 1
go.mod

@@ -3,7 +3,7 @@ module kpt-pasture
 go 1.17
 
 require (
-	gitee.com/xuyiping_admin/go_proto v0.0.0-20250212100748-0f1f0b733b1a
+	gitee.com/xuyiping_admin/go_proto v0.0.0-20250213075704-04d28f7cc1b4
 	gitee.com/xuyiping_admin/pkg v0.0.0-20241108060137-caea58c59f5b
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible
 	github.com/eclipse/paho.mqtt.golang v1.4.3

+ 2 - 0
go.sum

@@ -191,6 +191,8 @@ gitee.com/xuyiping_admin/go_proto v0.0.0-20250212083935-9847adaab5cc h1:MENa5LOI
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250212083935-9847adaab5cc/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250212100748-0f1f0b733b1a h1:R8ys1+phiHtAWETRRb88/WWGheExHA6MnH89LXwGVz0=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250212100748-0f1f0b733b1a/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250213075704-04d28f7cc1b4 h1:1og9G9acY6DAQIcDwzebzGln44iN/cQgsxCl2BtIg+U=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250213075704-04d28f7cc1b4/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
 gitee.com/xuyiping_admin/pkg v0.0.0-20241108060137-caea58c59f5b h1:w05MxH7yqveRlaRbxHhbif5YjPrJFodRPfOjYhXn7Zk=
 gitee.com/xuyiping_admin/pkg v0.0.0-20241108060137-caea58c59f5b/go.mod h1:8tF25X6pE9WkFCczlNAC0K2mrjwKvhhp02I7o0HtDxY=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=

+ 5 - 3
http/handler/test.go

@@ -3,6 +3,7 @@ package handler
 import (
 	"kpt-pasture/http/middleware"
 	"net/http"
+	"strconv"
 
 	"gitee.com/xuyiping_admin/pkg/valid"
 
@@ -73,12 +74,13 @@ func UpdateCowPen(c *gin.Context) {
 }
 
 func DataWarning(c *gin.Context) {
-	userId := c.Param("userId")
-	if err := valid.Validate(userId, valid.Required); err != nil {
+	userIdStr := c.Param("userId")
+	if err := valid.Validate(userIdStr, valid.Required); err != nil {
 		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
 		return
 	}
-	if err := middleware.BackendOperation(c).OpsService.TestDataWaring(c); err != nil {
+	userId, _ := strconv.Atoi(userIdStr)
+	if err := middleware.BackendOperation(c).OpsService.TestDataWaring(c, int64(userId)); err != nil {
 		apierr.ClassifiedAbort(c, err)
 		return
 	}

+ 1 - 1
http/route/dashboard_api.go

@@ -13,7 +13,7 @@ func DashboardApi(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 		}
 		// dashboard API 组
 		dashboardRoute := authRouteGroup(s, "/api/v1/dashboard/")
-		dashboardRoute.GET("/bar", dashboard.Bar)
+		//dashboardRoute.GET("/bar", dashboard.Bar)
 		dashboardRoute.GET("/neck_ring/warning", dashboard.NeckRingWarning)
 		dashboardRoute.GET("/focus/indicators/:dimension", dashboard.FocusIndicators)
 		dashboardRoute.POST("/focus/indicators/set", dashboard.FocusIndicatorsSet)

+ 43 - 13
model/data_waring.go

@@ -1,20 +1,25 @@
 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"
+)
 
 const DefaultUserId = 0
 
 type DataWarning struct {
-	Id                int64  `json:"id"`
-	UserId            int64  `json:"userId"`
-	Kind              string `json:"kind"`
-	Name              string `json:"name"`
-	Description       string `json:"description"`
-	DataValue         string `json:"dataValue"`
-	DataUpdateAt      int64  `json:"dataUpdateAt"`
-	ConditionUpdateAt int64  `json:"conditionUpdateAt"`
-	CreatedAt         int64  `json:"createdAt"`
-	UpdatedAt         int64  `json:"updatedAt"`
+	Id                int64                 `json:"id"`
+	UserId            int64                 `json:"userId"`
+	Kind              string                `json:"kind"`
+	Name              string                `json:"name"`
+	Description       string                `json:"description"`
+	DataValue         string                `json:"dataValue"`
+	DataUpdateAt      int64                 `json:"dataUpdateAt"`
+	ConditionUpdateAt int64                 `json:"conditionUpdateAt"`
+	IsShow            pasturePb.IsShow_Kind `json:"isShow"`
+	CreatedAt         int64                 `json:"createdAt"`
+	UpdatedAt         int64                 `json:"updatedAt"`
 }
 
 func (d *DataWarning) TableName() string {
@@ -23,18 +28,43 @@ func (d *DataWarning) TableName() string {
 
 func NewDataWarningList(userId int64, req []*pasturePb.WarningDataSet, warningMap map[string]*DataWarning) []*DataWarning {
 	res := make([]*DataWarning, 0)
+	isAdd := make(map[string]bool)
 	for _, v := range req {
+		if _, ok := isAdd[v.Kind]; ok {
+			continue
+		}
+		isAdd[v.Kind] = true
 		defaultDataWarning := warningMap[v.Kind]
-		res = append(res, NewDataWarning(userId, v.Kind, defaultDataWarning))
+		res = append(res, NewDataWarning(userId, v.Kind, v.IsShow, defaultDataWarning))
 	}
 	return res
 }
 
-func NewDataWarning(userId int64, Kind string, defaultDataWarning *DataWarning) *DataWarning {
+func NewDataWarning(userId int64, Kind string, isShow pasturePb.IsShow_Kind, defaultDataWarning *DataWarning) *DataWarning {
 	return &DataWarning{
 		UserId:      userId,
 		Kind:        Kind,
 		Name:        defaultDataWarning.Name,
 		Description: defaultDataWarning.Description,
+		IsShow:      isShow,
+	}
+}
+
+type DataWarningSlice []*DataWarning
+
+func (d DataWarningSlice) ToPB() []*pasturePb.WarningDataShow {
+	res := make([]*pasturePb.WarningDataShow, len(d))
+	for i, warningData := range d {
+		dataUpdateTimeFormat := ""
+		if warningData.DataUpdateAt > 0 {
+			dataUpdateTimeFormat = time.Unix(warningData.DataUpdateAt, 0).Format(LayoutTime)
+		}
+		res[i] = &pasturePb.WarningDataShow{
+			Name:                 warningData.Name,
+			Number:               warningData.DataValue,
+			Describe:             warningData.Description,
+			DataUpdateTimeFormat: dataUpdateTimeFormat,
+		}
 	}
+	return res
 }

+ 56 - 10
model/data_warning_items.go

@@ -1,18 +1,64 @@
 package model
 
+import (
+	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
+)
+
 type DataWarningItems struct {
-	Id        int64  `json:"id"`
-	UserId    int64  `json:"userId"`
-	WarningId int64  `json:"warningId"`
-	GroupId   int32  `json:"groupId"`
-	FieldName string `json:"fieldName"`
-	FieldDesc string `json:"fieldDesc"`
-	Operator  string `json:"operator"`
-	Value     string `json:"value"`
-	CreatedAt int64  `json:"createdAt"`
-	UpdatedAt int64  `json:"updatedAt"`
+	Id        int64                 `json:"id"`
+	UserId    int64                 `json:"userId"`
+	WarningId int64                 `json:"warningId"`
+	GroupId   int32                 `json:"groupId"`
+	FieldName string                `json:"fieldName"`
+	FieldDesc string                `json:"fieldDesc"`
+	Operator  string                `json:"operator"`
+	Value     string                `json:"value"`
+	IsShow    pasturePb.IsShow_Kind `json:"isShow"`
+	CreatedAt int64                 `json:"createdAt"`
+	UpdatedAt int64                 `json:"updatedAt"`
 }
 
 func (d *DataWarningItems) TableName() string {
 	return "data_warning_items"
 }
+
+func NewDataWarningItems(userId int64, dataWarning *DataWarning, req *pasturePb.WarningDataSet) *DataWarningItems {
+	return &DataWarningItems{
+		UserId:    userId,
+		WarningId: dataWarning.Id,
+		GroupId:   req.GroupId,
+		FieldName: req.FieldName,
+		FieldDesc: req.FieldDesc,
+		Operator:  req.Operator,
+		Value:     req.Value,
+		IsShow:    req.IsShow,
+	}
+}
+
+type DataWarningItemsSlice []*DataWarningItems
+
+func (d DataWarningItemsSlice) ToPB(dataWarning []*DataWarning) []*pasturePb.WarningDataSet {
+	res := make([]*pasturePb.WarningDataSet, len(d))
+	for i, v := range d {
+		name, kind := "", ""
+		for _, w := range dataWarning {
+			if w.Id == v.WarningId {
+				name = w.Name
+				kind = w.Kind
+			}
+		}
+		res[i] = &pasturePb.WarningDataSet{
+			Id:        int32(v.Id),
+			WarningId: int32(v.WarningId),
+			GroupId:   v.GroupId,
+			Name:      name,
+			Kind:      kind,
+			FieldDesc: v.FieldDesc,
+			FieldName: v.FieldName,
+			Operator:  v.Operator,
+			Value:     v.Value,
+			IsShow:    v.IsShow,
+		}
+	}
+	return res
+}

+ 5 - 1
model/event_cow_disease.go

@@ -76,6 +76,10 @@ func (e *EventCowDisease) EventCurableUpdate(cureAt int64) {
 }
 
 func NewEventCowDisease(pastureId int64, cow *Cow, disease *Disease, req *pasturePb.EventCowDiseaseRequest, operation, currUser *SystemUser) *EventCowDisease {
+	penId := req.PenId
+	if penId == 0 {
+		penId = cow.PenId
+	}
 	return &EventCowDisease{
 		PastureId:       pastureId,
 		CowId:           cow.Id,
@@ -87,7 +91,7 @@ func NewEventCowDisease(pastureId int64, cow *Cow, disease *Disease, req *pastur
 		DiseaseName:     disease.Name,
 		DiseaseType:     disease.DiseaseType,
 		DiseaseTypeName: disease.DiseaseTypeName,
-		PenId:           req.PenId,
+		PenId:           penId,
 		HealthStatus:    pasturePb.HealthStatus_Health,
 		DiseaseAt:       int64(req.DiseaseAt),
 		Temperature:     int32(req.Temperature * 10),

+ 2 - 0
model/event_pregnant_check.go

@@ -11,6 +11,7 @@ type EventPregnantCheck struct {
 	Id                  int64                              `json:"id"`
 	PastureId           int64                              `json:"pastureId"`
 	CowId               int64                              `json:"cowId"`
+	EarNumber           string                             `json:"earNumber"`
 	CowType             pasturePb.CowType_Kind             `json:"cowType"`
 	PenId               int32                              `json:"penId"`
 	PenName             string                             `json:"penName"`
@@ -64,6 +65,7 @@ func NewEventPregnantCheck(pastureId int64, cow *Cow, penMap map[int32]*Pen, pre
 	return &EventPregnantCheck{
 		PastureId:         pastureId,
 		CowId:             cow.Id,
+		EarNumber:         cow.EarNumber,
 		CowType:           cow.CowType,
 		PenId:             cow.PenId,
 		PenName:           penName,

+ 14 - 5
model/event_weaning.go

@@ -2,6 +2,7 @@ package model
 
 import (
 	"kpt-pasture/util"
+	"strconv"
 	"time"
 
 	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
@@ -11,12 +12,15 @@ type EventWeaning struct {
 	Id            int64                 `json:"id"`
 	PastureId     int64                 `json:"pastureId"`
 	CowId         int64                 `json:"cowId"`
+	MotherId      int64                 `json:"motherId"`
+	BullNumber    string                `json:"bullNumber"`
 	PlanDay       int64                 `json:"planDay"`
 	EndDay        int64                 `json:"endDay"`
 	RealityDay    int64                 `json:"realityDay"`
 	Status        pasturePb.IsShow_Kind `json:"status"`
 	BeforePenId   int32                 `json:"beforePenId"`
 	AfterPenId    int32                 `json:"afterPenId"`
+	Weight        int32                 `json:"weight"`
 	Remarks       string                `json:"remarks"`
 	OperationId   int32                 `json:"operationId"`
 	OperationName string                `json:"operationName"`
@@ -30,7 +34,7 @@ func (e *EventWeaning) TableName() string {
 	return "event_weaning"
 }
 
-func (e *EventWeaning) EventUpdate(weaningAt int64, remarks string, afterPenId int32, operationUser, currentUser *SystemUser) {
+func (e *EventWeaning) EventUpdate(weaningAt int64, weight int32, remarks string, afterPenId int32, operationUser, currentUser *SystemUser) {
 	e.Status = pasturePb.IsShow_Ok
 	e.RealityDay = weaningAt
 	e.OperationId = int32(operationUser.Id)
@@ -39,23 +43,28 @@ func (e *EventWeaning) EventUpdate(weaningAt int64, remarks string, afterPenId i
 	e.MessageName = currentUser.Name
 	e.Remarks = remarks
 	e.AfterPenId = afterPenId
+	e.Weight = weight
 }
 
-func NewEventWeaning(pastureId, cowId int64, penId int32) *EventWeaning {
+func NewEventWeaning(pastureId int64, cowInfo *Cow) *EventWeaning {
+	motherId, _ := strconv.ParseInt(cowInfo.MotherNumber, 10, 64)
 	return &EventWeaning{
 		PastureId:   pastureId,
-		CowId:       cowId,
+		MotherId:    motherId,
+		BullNumber:  cowInfo.LastBullNumber,
+		CowId:       cowInfo.Id,
 		PlanDay:     util.TimeParseLocalUnix(time.Now().Format(LayoutDate2)),
 		EndDay:      util.TimeParseLocalEndUnix(time.Now().Format(LayoutDate2)),
 		Status:      pasturePb.IsShow_No,
-		BeforePenId: penId,
+		BeforePenId: cowInfo.PenId,
+		Weight:      0,
 	}
 }
 
 func NewEventWeaningList(pastureId int64, cowList []*Cow) []*EventWeaning {
 	var weaningList = make([]*EventWeaning, 0)
 	for _, cow := range cowList {
-		weaningList = append(weaningList, NewEventWeaning(pastureId, cow.Id, cow.PenId))
+		weaningList = append(weaningList, NewEventWeaning(pastureId, cow))
 	}
 	return weaningList
 }

+ 3 - 3
module/backend/calendar.go

@@ -303,7 +303,7 @@ func (s *StoreEntry) PregnancyCheckCowList(ctx context.Context, req *pasturePb.I
 	newPregnancyCheckItems := make([]*pasturePb.PregnancyCheckItems, 0)
 	var count int64
 	pref := s.DB.Table(fmt.Sprintf("%s as a", new(model.EventPregnantCheck).TableName())).
-		Select("a.id,a.cow_id,a.ear_number,a.pen_id,a.status,b.breed_status,b.cow_type,b.day_age,b.calving_age,b.abortion_age,a.bull_id").
+		Select("a.id,a.cow_id,a.ear_number,a.pen_id,a.status,b.breed_status,b.pen_name,b.cow_type,b.day_age,b.calving_age,b.abortion_age,a.bull_id").
 		Joins("left join cow as b on a.cow_id = b.id").
 		Where("b.admission_status = ?", pasturePb.AdmissionStatus_Admission).
 		Where("a.pasture_id = ?", userModel.AppPasture.Id).
@@ -326,7 +326,7 @@ func (s *StoreEntry) PregnancyCheckCowList(ctx context.Context, req *pasturePb.I
 		pref.Where("pregnant_check_name = ?", model.PregnantCheckNameValueMap[req.PregnantCheckType])
 	}
 
-	if err := pref.Order("id desc").
+	if err = pref.Order("id desc").
 		Count(&count).
 		Limit(int(pagination.PageSize)).
 		Offset(int(pagination.PageOffset)).
@@ -345,7 +345,7 @@ func (s *StoreEntry) PregnancyCheckCowList(ctx context.Context, req *pasturePb.I
 			Header: map[string]string{
 				"id":              "编号",
 				"cowId":           "牛号",
-				"ear_number":      "耳标号",
+				"earNumber":       "耳标号",
 				"cowTypeName":     "牛只类型",
 				"penName":         "栏舍",
 				"lact":            "胎次",

+ 1 - 1
module/backend/config_data_breed.go

@@ -437,7 +437,7 @@ func (s *StoreEntry) HealthStatusEnumList(isAll string) []*pasturePb.ConfigOptio
 		Disabled: true,
 	}, &pasturePb.ConfigOptionsList{
 		Value:    int32(pasturePb.HealthStatus_Treatment),
-		Label:    "治疗",
+		Label:    "治疗",
 		Disabled: true,
 	}, &pasturePb.ConfigOptionsList{
 		Value:    int32(pasturePb.HealthStatus_Curable),

+ 147 - 59
module/backend/dashboard.go

@@ -2,8 +2,6 @@ package backend
 
 import (
 	"context"
-	"errors"
-	"fmt"
 	"kpt-pasture/model"
 	"kpt-pasture/util"
 	"net/http"
@@ -11,10 +9,11 @@ import (
 	"strings"
 	"time"
 
+	"gorm.io/gorm"
+
 	"gitee.com/xuyiping_admin/pkg/logger/zaplog"
 	"gitee.com/xuyiping_admin/pkg/xerr"
 	"go.uber.org/zap"
-	"gorm.io/gorm"
 
 	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
 )
@@ -194,24 +193,25 @@ func (s *StoreEntry) DataWarningSet(ctx context.Context, req *pasturePb.IndexDat
 	if err != nil {
 		return xerr.WithStack(err)
 	}
+
 	if len(req.WarningDataSet) <= 0 {
 		return nil
 	}
-	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 {
+
+	defaultDataWarning, _ := s.FindDataWarning(ctx, model.DefaultUserId)
+	if len(defaultDataWarning) <= 0 {
+		return xerr.Custom("默认预警数据不存在,请联系管理员!")
+	}
+
+	userDataWarningList, err := s.FindDataWarning(ctx, userModel.SystemUser.Id)
+	if err != nil {
 		return xerr.WithStack(err)
 	}
 
-	return nil
+	if len(userDataWarningList) <= 0 { // 新增
+		return s.addUserDataWarning(ctx, userModel.SystemUser.Id, defaultDataWarning, req.WarningDataSet)
+	}
+	return s.updateUserDataWarning(ctx, userModel.SystemUser.Id, userDataWarningList, req.WarningDataSet)
 }
 
 func (s *StoreEntry) DataWarningList(ctx context.Context) (*pasturePb.IndexDataWarningResponse, error) {
@@ -220,27 +220,22 @@ func (s *StoreEntry) DataWarningList(ctx context.Context) (*pasturePb.IndexDataW
 		return nil, xerr.WithStack(err)
 	}
 
-	defaultUserDataWarningList, err := s.FindDataWarning(ctx, model.DefaultUserId)
-	if err != nil {
+	defaultDataWarning, _ := s.FindDataWarning(ctx, model.DefaultUserId)
+	if len(defaultDataWarning) <= 0 {
 		return nil, xerr.Custom("默认预警数据有误,请联系管理员!")
 	}
 
 	var isExist bool // 判断是否存在自己的设置的数据
-	currentUserDataWarningList, err := s.FindDataWarning(ctx, userModel.SystemUser.Id)
-	if errors.Is(err, gorm.ErrRecordNotFound) {
+	userDataWarning, _ := s.FindDataWarning(ctx, userModel.SystemUser.Id)
+	if len(userDataWarning) == 0 {
 		// 如果用户没有配置自己的预警数据,则使用默认数据
 		isExist = true
-		currentUserDataWarningList = defaultUserDataWarningList
-	} else {
-		return nil, xerr.WithStack(err)
+		userDataWarning = defaultDataWarning
 	}
 
 	newTime := time.Now().Unix()
 	needUpdateWarningIds := make([]int64, 0)
-	warningMap := make(map[int64]*model.DataWarning)
-	for _, warningData := range currentUserDataWarningList {
-
-		warningMap[warningData.Id] = warningData
+	for _, warningData := range userDataWarning {
 		// 如果预警数据更新时间大于预警条件更新时间,并且更新时间距离当前时间小于2小时,则跳过
 		if warningData.DataUpdateAt > warningData.ConditionUpdateAt && newTime-warningData.DataUpdateAt < int64(2*time.Hour) {
 			continue
@@ -252,69 +247,162 @@ func (s *StoreEntry) DataWarningList(ctx context.Context) (*pasturePb.IndexDataW
 	if len(needUpdateWarningIds) > 0 {
 		s.UpdateWarningData(ctx, needUpdateWarningIds)
 	}
+
+	userDataWarningItems := make([]*model.DataWarningItems, 0)
+	// 计算过后重新获取数据
 	if isExist {
-		currentUserDataWarningList, _ = s.FindDataWarning(ctx, model.DefaultUserId)
+		userDataWarning, _ = s.FindDataWarning(ctx, model.DefaultUserId)
+		userDataWarningItems, _ = s.FindDataWarningItems(ctx, model.DefaultUserId)
 	} else {
-		currentUserDataWarningList, _ = s.FindDataWarning(ctx, userModel.SystemUser.Id)
-	}
-
-	dataSet := make([]*pasturePb.WarningDataSet, 0)
-	dataShow := make([]*pasturePb.WarningDataShow, 0)
-	for _, warningData := range currentUserDataWarningList {
-		dataUpdateTimeFormat := ""
-		if warningData.DataUpdateAt > 0 {
-			dataUpdateTimeFormat = time.Unix(warningData.DataUpdateAt, 0).Format(model.LayoutTime)
-		}
-		dataShow = append(dataShow, &pasturePb.WarningDataShow{
-			Name:                 warningData.Name,
-			Number:               warningData.DataValue,
-			Describe:             warningData.Description,
-			DataUpdateTimeFormat: dataUpdateTimeFormat,
-		})
+		userDataWarning, _ = s.FindDataWarning(ctx, userModel.SystemUser.Id)
+		userDataWarningItems, _ = s.FindDataWarningItems(ctx, userModel.SystemUser.Id)
 	}
 
-	defaultDataWarningItems, err := s.FindDataWarningItems(ctx, model.DefaultUserId)
-	fmt.Println(defaultDataWarningItems)
 	return &pasturePb.IndexDataWarningResponse{
 		Code: http.StatusOK,
 		Msg:  "ok",
 		Data: &pasturePb.DataWarning{
-			DataSet:  dataSet,
-			DataShow: dataShow,
+			DataSet:  model.DataWarningItemsSlice(userDataWarningItems).ToPB(userDataWarning),
+			DataShow: model.DataWarningSlice(userDataWarning).ToPB(),
 		},
 	}, nil
 }
 
+// 新增用户预警数据
+func (s *StoreEntry) addUserDataWarning(ctx context.Context, userId int64, defaultDataWarning []*model.DataWarning, warningDataSet []*pasturePb.WarningDataSet) error {
+	// 将默认预警数据按 Kind 映射
+	defaultDataWarningMap := make(map[string]*model.DataWarning)
+	for _, v := range defaultDataWarning {
+		defaultDataWarningMap[v.Kind] = v
+	}
+
+	// 在事务中执行新增操作
+	return s.DB.Transaction(func(tx *gorm.DB) error {
+		addedKinds := make(map[string]bool) // 记录已添加的 Kind
+		for _, set := range warningDataSet {
+			dataWarning := model.NewDataWarning(userId, set.Kind, pasturePb.IsShow_Ok, defaultDataWarningMap[set.Kind])
+			// 如果该 Kind 已添加,跳过
+			if !addedKinds[set.Kind] {
+				// 创建新的预警数据
+				if err := tx.Create(dataWarning).Error; err != nil {
+					return xerr.WithStack(err)
+				}
+			} else {
+				oldDataWarning := &model.DataWarning{}
+				if err := tx.Model(new(model.DataWarning)).
+					Where("user_id = ?", userId).
+					Where("kind = ?", set.Kind).
+					First(oldDataWarning).Error; err != nil {
+					return xerr.WithStack(err)
+				}
+				dataWarning.Id = oldDataWarning.Id
+			}
+
+			// 创建预警项数据
+			if err := tx.Create(model.NewDataWarningItems(userId, dataWarning, set)).Error; err != nil {
+				return xerr.WithStack(err)
+			}
+			addedKinds[set.Kind] = true
+		}
+
+		return nil
+	})
+}
+
+// 更新用户预警数据
+func (s *StoreEntry) updateUserDataWarning(ctx context.Context, userId int64, userDataWarningList []*model.DataWarning, warningDataSet []*pasturePb.WarningDataSet) error {
+	// 将请求数据按 WarningId 和 Id 映射
+	warningIsShowMap := make(map[int32]pasturePb.IsShow_Kind)
+	warningItemDataMap := make(map[int32]*pasturePb.WarningDataSet)
+	for _, set := range warningDataSet {
+		warningIsShowMap[set.WarningId] = set.IsShow
+		warningItemDataMap[set.Id] = set
+	}
+
+	// 获取用户预警项数据
+	userDataWarningItems, err := s.FindDataWarningItems(ctx, userId)
+	if err != nil {
+		return xerr.WithStack(err)
+	}
+	if len(userDataWarningItems) == 0 {
+		return xerr.Custom("预警数据有误,请联系管理员!")
+	}
+
+	// 在事务中执行更新操作
+	return s.DB.Transaction(func(tx *gorm.DB) error {
+		// 更新预警数据的 IsShow 字段
+		for _, warning := range userDataWarningList {
+			if isShow, ok := warningIsShowMap[int32(warning.Id)]; ok {
+				if err = tx.Model(&model.DataWarning{}).
+					Where("id = ?", warning.Id).
+					Update("is_show", isShow).Error; err != nil {
+					return xerr.WithStack(err)
+				}
+			}
+		}
+
+		// 更新预警项数据的 IsShow 和 Value 字段
+		for _, item := range userDataWarningItems {
+			if set, ok := warningItemDataMap[int32(item.Id)]; ok {
+				if err = tx.Model(&model.DataWarningItems{}).
+					Where("id = ?", item.Id).
+					Updates(map[string]interface{}{
+						"is_show": set.IsShow,
+						"value":   set.Value,
+					}).Error; err != nil {
+					return xerr.WithStack(err)
+				}
+			}
+		}
+
+		return nil
+	})
+}
+
 func (s *StoreEntry) FindDataWarning(ctx context.Context, userId int64) ([]*model.DataWarning, error) {
-	defaultUserDataWarningList := make([]*model.DataWarning, 0)
+	dataWarningList := make([]*model.DataWarning, 0)
 	if err := s.DB.Model(new(model.DataWarning)).
 		Where("user_id = ?", userId).
-		Find(&defaultUserDataWarningList).Error; err != nil {
+		Find(&dataWarningList).Error; err != nil {
 		return nil, xerr.WithStack(err)
 	}
-	return defaultUserDataWarningList, nil
+	return dataWarningList, nil
 }
 
 func (s *StoreEntry) FindDataWarningItems(ctx context.Context, userId int64) ([]*model.DataWarningItems, error) {
-	defaultUserDataWarningItemsList := make([]*model.DataWarningItems, 0)
+	dataWarningItemsList := make([]*model.DataWarningItems, 0)
 	if err := s.DB.Model(new(model.DataWarningItems)).
 		Where("user_id = ?", userId).
-		Find(&defaultUserDataWarningItemsList).Error; err != nil {
+		Find(&dataWarningItemsList).Error; err != nil {
 		return nil, xerr.WithStack(err)
 	}
-	return defaultUserDataWarningItemsList, nil
+	return dataWarningItemsList, nil
 }
 
-func (s *StoreEntry) defaultDataWarningMap(ctx context.Context) (map[string]*model.DataWarning, error) {
-	defaultDataWarning, err := s.FindDataWarning(ctx, model.DefaultUserId)
+func (s *StoreEntry) FindDataWarningMap(ctx context.Context, userId int64) (map[int64]*model.DataWarning, error) {
+	dataWarning, err := s.FindDataWarning(ctx, userId)
 	if err != nil {
 		return nil, xerr.Custom("默认预警数据有误,请联系管理员!")
 	}
-	defaultDataWarningMap := make(map[string]*model.DataWarning)
-	for _, v := range defaultDataWarning {
-		defaultDataWarningMap[v.Kind] = v
+	dataWarningMap := make(map[int64]*model.DataWarning)
+	for _, v := range dataWarning {
+		dataWarningMap[v.Id] = v
+	}
+	return dataWarningMap, nil
+}
+
+func (s *StoreEntry) FindDataWarningItemsMap(ctx context.Context, userId int64) (map[int64]*model.DataWarningItems, error) {
+	dataWarningItemsList := make([]*model.DataWarningItems, 0)
+	if err := s.DB.Model(new(model.DataWarningItems)).
+		Where("user_id = ?", userId).
+		Find(&dataWarningItemsList).Error; err != nil {
+		return nil, xerr.WithStack(err)
+	}
+	dataWarningItemsMap := make(map[int64]*model.DataWarningItems)
+	for _, v := range dataWarningItemsList {
+		dataWarningItemsMap[v.Id] = v
 	}
-	return defaultDataWarningMap, nil
+	return dataWarningItemsMap, nil
 }
 
 // UpdateWarningData 更新计算数据

+ 1 - 1
module/backend/event_breed.go

@@ -654,7 +654,7 @@ func (s *StoreEntry) WeaningBatch(ctx context.Context, req *pasturePb.EventWeani
 	if err = s.DB.Transaction(func(tx *gorm.DB) error {
 		cowInfo := &model.Cow{}
 		for _, v := range eventWeaningList {
-			v.EventUpdate(int64(req.WeaningAt), req.Remarks, req.PenId, operation, userModel.SystemUser)
+			v.EventUpdate(int64(req.WeaningAt), int32(cowWeightMap[cowInfo.Id]*1000), req.Remarks, req.PenId, operation, userModel.SystemUser)
 			if err = tx.Model(new(model.EventWeaning)).
 				Select("status", "reality_day", "operation_id", "operation_name", "message_id", "message_name", "remarks", "after_pen_id").
 				Where("id = ?", v.Id).

+ 8 - 7
module/backend/event_cow_log.go

@@ -4,6 +4,7 @@ import (
 	"context"
 	"fmt"
 	"kpt-pasture/model"
+	"strconv"
 	"strings"
 	"time"
 
@@ -40,12 +41,12 @@ func (s *StoreEntry) SubmitEventLog(
 		if data.Sex == pasturePb.Genders_Female {
 			sex = "母"
 		}
-		desc = fmt.Sprintf("入场时间: %s; 性别: %s; 栏舍: %s; 体重: %f kg; price: %f; 来源: %s;",
+		desc = fmt.Sprintf("入场时间: %s; 性别: %s; 栏舍: %s; 体重: %s kg; price: %s; 来源: %s;",
 			time.Unix(eventAt, 0).Format(model.LayoutDate2),
 			sex,
 			penMap[cow.PenId].Name,
-			data.Weight,
-			data.Price,
+			strconv.FormatFloat(float64(data.Weight), 'f', 2, 64),
+			strconv.FormatFloat(float64(data.Price), 'f', 2, 64),
 			sourceMap[cow.SourceId],
 		)
 	case pasturePb.EventType_Transfer_Ben:
@@ -116,7 +117,7 @@ func (s *StoreEntry) SubmitEventLog(
 	case pasturePb.EventType_Mating:
 		data := req.(*pasturePb.EventMating)
 		eventAt = int64(data.MatingAt)
-		desc = fmt.Sprintf("配种公牛: %s;发情揭发方式:%s;配种结果:未知", data.FrozenSemenNumber, s.ExposeEstrusTypeMap()[exposeEstrusType])
+		desc = fmt.Sprintf("配种公牛: %s;配种结果:未知", data.FrozenSemenNumber)
 		operationUser.Id = int64(data.OperationId)
 		operationUser.Name = data.OperationName
 		remarks = data.Remarks
@@ -164,7 +165,7 @@ func (s *StoreEntry) SubmitEventLog(
 		operationUser.Id = int64(data.OperationId)
 		operationUser.Name = data.OperationName
 		remarks = data.Remarks
-		desc = fmt.Sprintf("日龄: %d;具体体重: %f kg", cow.DayAge, data.Weight)
+		desc = fmt.Sprintf("日龄: %d;体重: %s kg", cow.DayAge, strconv.FormatFloat(float64(data.Weight), 'f', 2, 64))
 	case pasturePb.EventType_Castrated:
 	case pasturePb.EventType_Insect_Repellent:
 	}
@@ -187,7 +188,7 @@ func (s *StoreEntry) UpdateMatingResultEventCowLogByCowId(ctx context.Context, c
 	newEventCowLog := &model.EventCowLog{CowId: cowId}
 	if err := s.DB.Table(newEventCowLog.TableName()).
 		Where("cow_id = ?", cowId).
-		Where("event_category_id = ?", pasturePb.EventCategory_Breed).
+		Where("event_category_kind = ?", pasturePb.EventCategory_Breed).
 		Where("event_type = ?", pasturePb.EventType_Mating).
 		Order("id desc").
 		First(newEventCowLog).Error; err != nil {
@@ -196,7 +197,7 @@ func (s *StoreEntry) UpdateMatingResultEventCowLogByCowId(ctx context.Context, c
 		desc := strings.ReplaceAll(newEventCowLog.EventDescription, "未知 ", newResult)
 		if err = s.DB.Table(newEventCowLog.TableName()).
 			Where("cow_id = ?", cowId).
-			Where("event_category_id = ?", pasturePb.EventCategory_Breed).
+			Where("event_category_kind = ?", pasturePb.EventCategory_Breed).
 			Where("event_type = ?", pasturePb.EventType_Mating).
 			Update("event_description", desc).Error; err != nil {
 			return xerr.WithStack(err)

+ 18 - 20
module/backend/event_health.go

@@ -38,16 +38,17 @@ func (s *StoreEntry) CowDiseaseCreate(ctx context.Context, req *pasturePb.EventC
 	if err != nil {
 		return xerr.WithStack(err)
 	}
-
 	newEventCowDisease := model.NewEventCowDisease(userModel.AppPasture.Id, cow, disease, req, operationUser, userModel.SystemUser)
 	defer func() {
 		// 更新牛只健康状态
 		if newEventCowDisease.HealthStatus == pasturePb.HealthStatus_Disease || newEventCowDisease.HealthStatus == pasturePb.HealthStatus_Treatment {
 			cow.EventHealthStatusUpdate(pasturePb.HealthStatus_Disease)
-			s.DB.Model(new(model.Cow)).
+			if err = s.DB.Model(new(model.Cow)).
 				Select("health_status").
 				Where("id = ?", req.CowId).
-				Updates(cow)
+				Updates(cow).Error; err != nil {
+				zaplog.Error("CowDiseaseCreate", zap.Any("EventHealthStatusUpdate", err))
+			}
 		}
 
 		if req.PenId > 0 {
@@ -57,7 +58,12 @@ func (s *StoreEntry) CowDiseaseCreate(ctx context.Context, req *pasturePb.EventC
 				return
 			}
 			cow.EventPenUpdate(penData)
-			s.DB.Model(new(model.Cow)).Select("pen_id", "pen_name").Where("id = ?", cow.Id).Updates(cow)
+			if err = s.DB.Model(new(model.Cow)).
+				Select("pen_id", "pen_name").
+				Where("id = ?", cow.Id).
+				Updates(cow).Error; err != nil {
+				zaplog.Error("CowDiseaseCreate", zap.Any("EventPenUpdate", err))
+			}
 		}
 	}()
 	// PC端直接跳过诊断过程
@@ -73,16 +79,16 @@ func (s *StoreEntry) CowDiseaseCreate(ctx context.Context, req *pasturePb.EventC
 
 	if req.PrescriptionId > 0 || len(req.PrescriptionDetail) > 0 {
 		newEventCowDisease.HealthStatus = pasturePb.HealthStatus_Treatment
+		newEventCowDisease.DiagnosedResult = pasturePb.IsShow_Ok
 	}
 
-	var newEventCowTreatment *model.EventCowTreatment
-	var newCowTreatmentRequest *pasturePb.CowTreatmentRequest
+	newEventCowTreatment := &model.EventCowTreatment{}
+	newCowTreatmentRequest := &pasturePb.CowTreatmentRequest{}
 	var isCreatePrescription bool
 	diseaseTypeMap := s.DiseaseTypeMap()
 	prescription := &model.Prescription{}
 	if req.PrescriptionId > 0 || len(req.PrescriptionDetail) > 0 {
 		isCreatePrescription = true
-
 		if req.PrescriptionId > 0 {
 			prescription, err = s.GetPrescriptionById(ctx, userModel.AppPasture.Id, req.PrescriptionId)
 			if err != nil {
@@ -96,13 +102,10 @@ func (s *StoreEntry) CowDiseaseCreate(ctx context.Context, req *pasturePb.EventC
 			req.PrescriptionDetail = model.PrescriptionDrugsSlice(prescriptionDrugs).ToPB()
 		}
 	}
-
 	if err = s.DB.Transaction(func(tx *gorm.DB) error {
 		if err = tx.Model(new(model.EventCowDisease)).Create(newEventCowDisease).Error; err != nil {
 			return xerr.WithStack(err)
 		}
-		newEventCowTreatment.CowDiseaseId = newEventCowDisease.Id
-
 		// 已有的处方使用次数+1
 		if req.PrescriptionId > 0 {
 			prescription.EventUseCountUpdate()
@@ -112,7 +115,6 @@ func (s *StoreEntry) CowDiseaseCreate(ctx context.Context, req *pasturePb.EventC
 				return xerr.WithStack(err)
 			}
 		}
-
 		// 新的临时处方
 		if req.PrescriptionId <= 0 && len(req.PrescriptionDetail) > 0 {
 			newPrescriptionRequest := &pasturePb.PrescriptionRequest{
@@ -139,11 +141,7 @@ func (s *StoreEntry) CowDiseaseCreate(ctx context.Context, req *pasturePb.EventC
 			if err = tx.Model(new(model.PrescriptionDrugs)).Create(newPrescriptionDrugs).Error; err != nil {
 				return xerr.WithStack(err)
 			}
-
-			newEventCowTreatment.PrescriptionId = prescription.Id
-			newEventCowTreatment.PrescriptionName = prescription.Name
 		}
-
 		// 创建治疗记录
 		if isCreatePrescription {
 			newCowTreatmentRequest = &pasturePb.CowTreatmentRequest{
@@ -157,8 +155,9 @@ func (s *StoreEntry) CowDiseaseCreate(ctx context.Context, req *pasturePb.EventC
 				Remarks:            req.Remarks,
 				TreatmentAt:        req.DiseaseAt,
 			}
-
 			newEventCowTreatment = model.NewEventCowTreatment(userModel.AppPasture.Id, prescription, newCowTreatmentRequest, diseaseTypeMap, operationUser, userModel.SystemUser)
+			newEventCowTreatment.CowDiseaseId = newEventCowDisease.Id
+
 			// 创建治疗记录
 			if err = tx.Model(new(model.EventCowTreatment)).Create(newEventCowTreatment).Error; err != nil {
 				return xerr.WithStack(err)
@@ -180,9 +179,8 @@ func (s *StoreEntry) CowDiseaseList(ctx context.Context, req *pasturePb.SearchEv
 
 	cowDiseaseList := make([]*model.EventCowDisease, 0)
 	var count int64 = 0
-	pref := s.DB.Select("a.*,b.name").Table(fmt.Sprintf("%s as a", new(model.EventCowDisease).TableName())).
-		Joins(fmt.Sprintf("JOIN %s AS b on a.pen_id = b.id", new(model.Pen).TableName())).
-		Where("a.diagnosed_result < ?", pasturePb.IsShow_No).Where("a.pasture_id = ?", userModel.AppPasture.Id)
+	pref := s.DB.Table(fmt.Sprintf("%s as a", new(model.EventCowDisease).TableName())).
+		Where("a.pasture_id = ?", userModel.AppPasture.Id)
 
 	if len(req.CowIds) > 0 {
 		pref.Where("a.cow_id IN ?", req.CowIds)
@@ -340,7 +338,7 @@ func (s *StoreEntry) CowDiseaseTreatment(ctx context.Context, req *pasturePb.Cow
 		return xerr.Customf("异常牛数据: %d", req.CowId)
 	}
 
-	disease, err := s.GetDiseaseById(ctx, userModel.AppPasture.Id, eventCowDisease.DiagnoseId)
+	disease, err := s.GetDiseaseById(ctx, userModel.AppPasture.Id, eventCowDisease.DiseaseId)
 	if err != nil {
 		return xerr.WithStack(err)
 	}

+ 1 - 1
module/backend/interface.go

@@ -294,5 +294,5 @@ type TestService interface {
 	CowNeckRingNumberBound(ctx context.Context, pagination *pasturePb.PaginationModel) error
 	CowNeckRingNumberBound2(ctx context.Context, pagination *pasturePb.PaginationModel) error
 	UpdateCowPen(ctx context.Context, pagination *pasturePb.PaginationModel) error
-	TestDataWaring(ctx context.Context) error
+	TestDataWaring(ctx context.Context, userId int64) error
 }

+ 1 - 1
module/backend/sql.go

@@ -407,7 +407,7 @@ func (s *StoreEntry) FindEventPregnantCheckIsExIstByCowId(
 	cow *model.Cow,
 ) (*model.EventPregnantCheck, bool, error) {
 	newEventPregnantCheck := &model.EventPregnantCheck{}
-	if err := s.DB.Model(new(model.EventMating)).
+	if err := s.DB.Model(new(model.EventPregnantCheck)).
 		Where("cow_id = ?", cow.Id).
 		Where("lact = ?", cow.Lact).
 		Where("status = ?", pasturePb.IsShow_No).

+ 22 - 21
module/crontab/cow_cron.go

@@ -187,7 +187,7 @@ func (e *Entry) ImmunizationPlan() error {
 		}
 
 		todayCount += int32(len(cowList))
-		penList, _ := e.GetPenMapList()
+		penList, _ := e.GetPenMapList(plan.PastureId)
 		newImmunizationPlanCowList := model.NewCowImmunizationPlanList(cowList, penList, plan)
 		newEventItemList := model.NewEventItemList(cowList, pasturePb.CalendarType_Immunisation)
 
@@ -365,26 +365,27 @@ func (e *Entry) SystemBasicCrontab() error {
 			Where("pasture_id = ?", systemBasic.PastureId)
 
 		switch systemBasic.Name {
-		case model.PregnantCheckForFirst:
-			pref.Where("breed_status = ?", pasturePb.BreedStatus_Breeding)
-		case model.PregnantCheckForSecond: // 过滤初检空怀的牛只
-			pref.Where("breed_status = ?", pasturePb.BreedStatus_Pregnant)
-		case model.WeaningAge:
-			pref.Where("day_age = ?", systemBasic.MinValue)
-		case model.PregnancyAge:
-			pref.Where("pregnancy_age >= ?", systemBasic.MinValue).
-				Where("breed_status = ?", pasturePb.BreedStatus_Pregnant)
+		case model.PregnantCheckForFirst: // 初检清单
+			pref.Where("breed_status = ?", pasturePb.BreedStatus_Breeding).
+				Where("last_mating_at > ?", 0).
+				Where("DATE(FROM_UNIXTIME(last_mating_at)) BETWEEN DATE_SUB(CURDATE(), INTERVAL ? DAY) AND DATE_SUB(CURDATE(), INTERVAL ? DAY)", systemBasic.MaxValue, systemBasic.MinValue).
+				Where("NOT EXISTS (?)", fmt.Sprintf("SELECT 1 FROM event_pregnant_check WHERE event_pregnant_check.cow_id = cow.id AND event_pregnant_check.status = %d", pasturePb.IsShow_No))
+		case model.PregnantCheckForSecond: // 复检清单 过滤初检空怀的牛只
+			pref.Where("breed_status IN (?)", []pasturePb.BreedStatus_Kind{pasturePb.BreedStatus_Pregnant}).
+				Where("last_mating_at > ?", 0).
+				Where("DATE(FROM_UNIXTIME(last_mating_at)) = ?", fmt.Sprintf("DATE_SUB(CURDATE(), INTERVAL %d DAY))", systemBasic.MinValue)).
+				Where("NOT EXISTS (?)", fmt.Sprintf("SELECT 1 FROM event_pregnant_check WHERE event_pregnant_check.cow_id = cow.id AND event_pregnant_check.status = %d", pasturePb.IsShow_No))
+		case model.WeaningAge: // 断奶清单
+			pref.Where("day_age = ?", systemBasic.MinValue).
+				Where("NOT EXISTS (?)", fmt.Sprintf("SELECT 1 FROM event_weaning WHERE event_weaning.cow_id = cow.id AND event_weaning.status = %d", pasturePb.IsShow_No))
+		case model.PregnancyAge: // 产犊清单
+			pref.Where("pregnancy_age = ?", systemBasic.MinValue).
+				Where("breed_status = ?", pasturePb.BreedStatus_Pregnant).
+				Where("NOT EXISTS (?)", fmt.Sprintf("SELECT 1 FROM event_calving WHERE event_calving.cow_id = cow.id AND event_calving.status = %d", pasturePb.IsShow_No))
 		default:
 			continue
 		}
 
-		if systemBasic.ValueType == model.ValueTypeFixed {
-			pref.Where("day_age = ?", systemBasic.MinValue)
-		}
-		if systemBasic.ValueType == model.ValueTypeRange {
-			pref.Where("day_age >= ?", systemBasic.MinValue).Where("day_age <= ?", systemBasic.MaxValue)
-		}
-
 		if err := pref.Find(&cowList).Error; err != nil {
 			zaplog.Error("crontab", zap.Any("PregnancyCheck", err), zap.Any("cowList", cowList))
 			continue
@@ -411,19 +412,19 @@ func (e *Entry) DeleteOldOriginal() error {
 func (e *Entry) InitEventData(cowList []*model.Cow, systemBasic *model.SystemBasic) {
 	switch systemBasic.Name {
 	case model.PregnantCheckForFirst, model.PregnantCheckForSecond:
-		penMap, _ := e.GetPenMapList()
+		penMap, _ := e.GetPenMapList(systemBasic.PastureId)
 		eventPregnantCheckDataList := model.NewEventPregnantCheckList(systemBasic.PastureId, cowList, penMap, systemBasic.Name)
-		if err := e.DB.Create(eventPregnantCheckDataList).Error; err != nil {
+		if err := e.DB.Model(new(model.EventPregnantCheck)).Create(eventPregnantCheckDataList).Error; err != nil {
 			zaplog.Error("crontab", zap.Any("InitEventData", err), zap.Any("eventPregnantCheckDataList", eventPregnantCheckDataList))
 		}
 	case model.WeaningAge:
 		eventWeaningDataList := model.NewEventWeaningList(systemBasic.PastureId, cowList)
-		if err := e.DB.Create(eventWeaningDataList).Error; err != nil {
+		if err := e.DB.Model(new(model.EventWeaning)).Create(eventWeaningDataList).Error; err != nil {
 			zaplog.Error("crontab", zap.Any("InitEventData", err), zap.Any("eventWeaningDataList", eventWeaningDataList))
 		}
 	case model.PregnancyAge:
 		eventCalvingList := model.NewEventCalvingList(systemBasic.PastureId, cowList)
-		if err := e.DB.Create(eventCalvingList).Error; err != nil {
+		if err := e.DB.Model(new(model.EventCalving)).Create(eventCalvingList).Error; err != nil {
 			zaplog.Error("crontab", zap.Any("InitEventData", err), zap.Any("eventCalvingList", eventCalvingList))
 		}
 	}

+ 5 - 3
module/crontab/sql.go

@@ -34,12 +34,14 @@ func (e *Entry) GetCowById(cowId int64) (*model.Cow, error) {
 	}
 	return cowInfo, nil
 }
-func (e *Entry) GetPenMapList() (map[int32]*model.Pen, error) {
+func (e *Entry) GetPenMapList(pastureId int64) (map[int32]*model.Pen, error) {
 	penList := make([]*model.Pen, 0)
-	if err := e.DB.Where("is_delete = ?", pasturePb.IsShow_Ok).Find(&penList).Error; err != nil {
+	if err := e.DB.Model(new(model.Pen)).
+		Where("pasture_id = ?", pastureId).
+		Where("is_delete = ?", pasturePb.IsShow_Ok).
+		Find(&penList).Error; err != nil {
 		return nil, xerr.WithStack(err)
 	}
-
 	penMap := make(map[int32]*model.Pen)
 	for _, v := range penList {
 		penMap[v.Id] = v