Browse Source

goods: 申请物品相关

Yi 1 month ago
parent
commit
2fe9feb9c9

+ 1 - 1
go.mod

@@ -3,7 +3,7 @@ module kpt-pasture
 go 1.17
 
 require (
-	gitee.com/xuyiping_admin/go_proto v0.0.0-20250210061341-1e50fd31801b
+	gitee.com/xuyiping_admin/go_proto v0.0.0-20250210094803-e3d2418b887d
 	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

+ 6 - 0
go.sum

@@ -157,6 +157,12 @@ gitee.com/xuyiping_admin/go_proto v0.0.0-20250210055925-91dc2754eaec h1:LEPeYOmh
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250210055925-91dc2754eaec/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250210061341-1e50fd31801b h1:j9YojtrHZoz0DT5zBeMdya5+l92c52rCfJjQ6pLuUvs=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250210061341-1e50fd31801b/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250210065209-10ed2f760d20 h1:+BSaQABBlvZ951/PicQtP7foQLiaTm/9l4pvxQY0kXI=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250210065209-10ed2f760d20/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250210090018-576d00ffc2aa h1:x3McivrzNWXfR/6OFE47rry2qf/Z/UFHenwRWXRG7y0=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250210090018-576d00ffc2aa/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250210094803-e3d2418b887d h1:Vi1UHWFH7HqPS/8Hwdlg/yErSojgUA76Teg76MhOPu8=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250210094803-e3d2418b887d/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=

+ 9 - 0
http/handler/dashboard/bar.go

@@ -16,3 +16,12 @@ func Bar(c *gin.Context) {
 	}
 	ginutil.JSONResp(c, res)
 }
+
+func NeckRingWarning(c *gin.Context) {
+	res, err := middleware.Dependency(c).StoreEventHub.OpsService.NeckRingWarning(c)
+	if err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+	ginutil.JSONResp(c, res)
+}

+ 1 - 0
http/route/dashboard.go → http/route/dashboard_api.go

@@ -14,5 +14,6 @@ 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("/neck_ring/warning", dashboard.NeckRingWarning)
 	}
 }

+ 2 - 2
model/cow.go

@@ -251,7 +251,7 @@ func (c CowSlice) ToPB(
 			CurrentWeight:             float32(v.CurrentWeight) / 1000,
 			DayAge:                    v.DayAge,
 			SourceName:                cowSourceMap[v.SourceId],
-			MontherNumber:             v.MotherNumber,
+			MotherNumber:              v.MotherNumber,
 			FatherNumber:              v.FatherNumber,
 			AdmissionStatusName:       admissionStatusMap[v.AdmissionStatus],
 			HealthStatusName:          healthStatusMap[v.HealthStatus],
@@ -260,7 +260,7 @@ func (c CowSlice) ToPB(
 			BirthAtFormat:             birthAtFormat,
 			WeaningAtFormat:           weaningAtFormat,
 			CalvingAge:                int32(v.GetCalvingAge()),
-			AbortionAge:               int32(v.AbortionAge),
+			AbortionAge:               v.AbortionAge,
 			MatingTimes:               v.MatingTimes,
 			FirstMatingAtFormat:       firstMatingAtFormat,
 			LastMatingAtFormat:        lastMatingAtFormat,

+ 3 - 4
model/system_configure.go → model/neck_ring_configure.go

@@ -11,11 +11,10 @@ const (
 	ActiveLow       = "active_low"
 	ActiveMiddle    = "active_middle"
 	ActiveHigh      = "active_high"
-	MaxEstrus       = "max_estrus"
 	MaxHabit        = "max_habit"
 )
 
-type SystemConfigure struct {
+type NeckRingConfigure struct {
 	Id        int64                 `json:"id"`
 	PastureId int64                 `json:"pastureId"`
 	Name      string                `json:"name"`
@@ -26,6 +25,6 @@ type SystemConfigure struct {
 	UpdatedAt int64                 `json:"updatedAt"`
 }
 
-func (s *SystemConfigure) TableName() string {
-	return "system_configure"
+func (s *NeckRingConfigure) TableName() string {
+	return "neck_ring_configure"
 }

+ 1 - 0
model/outbound.go

@@ -81,6 +81,7 @@ func (o OutboundSlice) ToPB(outTypeMap map[pasturePb.OutType_Kind]string, auditS
 			ExamineRemarks:    v.ExamineRemarks,
 			ApplicantAtFormat: applicantAtFormat,
 			ExamineAtFormat:   examineAtFormat,
+			GoodsItem:         &pasturePb.OutboundApplyItem{},
 		}
 	}
 	return res

+ 19 - 27
model/pen.go

@@ -9,21 +9,21 @@ import (
 const IsAllYes = "Yes"
 
 type Pen struct {
-	Id                int32                 `json:"id"`
-	PastureId         int64                 `json:"pastureId"`
-	Name              string                `json:"name"`
-	Remarks           string                `json:"remarks"`
-	PenType           int32                 `json:"penType"`
-	Lengths           int32                 `json:"lengths"`
-	Widths            int32                 `json:"widths"`
-	DoctrinalCapacity int32                 `json:"doctrinalCapacity"`
-	ActualCapacity    int32                 `json:"actualCapacity"`
-	BedNumber         int32                 `json:"bedNumber"`
-	NeckNumber        int32                 `json:"neckNumber"`
-	IsShow            pasturePb.IsShow_Kind `json:"isShow"`
-	IsDelete          pasturePb.IsShow_Kind `json:"isDelete"`
-	CreatedAt         int64                 `json:"createdAt"`
-	UpdatedAt         int64                 `json:"updatedAt"`
+	Id                int32                  `json:"id"`
+	PastureId         int64                  `json:"pastureId"`
+	Name              string                 `json:"name"`
+	Remarks           string                 `json:"remarks"`
+	PenType           pasturePb.PenType_Kind `json:"penType"`
+	Lengths           int32                  `json:"lengths"`
+	Widths            int32                  `json:"widths"`
+	DoctrinalCapacity int32                  `json:"doctrinalCapacity"`
+	ActualCapacity    int32                  `json:"actualCapacity"`
+	BedNumber         int32                  `json:"bedNumber"`
+	NeckNumber        int32                  `json:"neckNumber"`
+	IsShow            pasturePb.IsShow_Kind  `json:"isShow"`
+	IsDelete          pasturePb.IsShow_Kind  `json:"isDelete"`
+	CreatedAt         int64                  `json:"createdAt"`
+	UpdatedAt         int64                  `json:"updatedAt"`
 }
 
 func (p *Pen) TableName() string {
@@ -32,24 +32,16 @@ func (p *Pen) TableName() string {
 
 type PenSlice []*Pen
 
-func (p PenSlice) ToPB(configBarnTypes []*ConfigPenType) []*pasturePb.SearchBarnList {
+func (p PenSlice) ToPB(barnTypeMap map[pasturePb.PenType_Kind]string) []*pasturePb.SearchBarnList {
 	res := make([]*pasturePb.SearchBarnList, len(p))
 	for i, v := range p {
-		barnTypeName := ""
-		for _, c := range configBarnTypes {
-			if c.Id == int64(v.PenType) {
-				barnTypeName = c.Name
-				break
-			}
-		}
-
 		res[i] = &pasturePb.SearchBarnList{
 			Id:                v.Id,
 			Name:              v.Name,
 			IsShow:            v.IsShow,
 			Remarks:           v.Remarks,
-			BarnTypeId:        v.PenType,
-			BarnTypeName:      barnTypeName,
+			BarnTypeId:        int32(v.PenType),
+			BarnTypeName:      barnTypeMap[v.PenType],
 			Lengths:           v.Lengths,
 			Widths:            v.Widths,
 			DoctrinalCapacity: v.DoctrinalCapacity,
@@ -75,7 +67,7 @@ func (p PenSlice) ToPB2(req []*pasturePb.ConfigOptionsList, isAll string) []*pas
 	for _, d := range p {
 		label := d.Name
 		for _, r := range req {
-			if r.Value != d.PenType {
+			if r.Value != int32(d.PenType) {
 				continue
 			}
 			label = fmt.Sprintf("%s-%s", label, r.Label)

+ 7 - 2
module/backend/analysis.go

@@ -438,6 +438,10 @@ func (s *StoreEntry) AbortionRate(ctx context.Context, req *pasturePb.AbortionRa
 }
 
 func (s *StoreEntry) TwentyOnePregnantRate(ctx context.Context, req *pasturePb.TwentyOnePregnantRateRequest) (*pasturePb.TwentyOnePregnantRateResponse, error) {
+	userModel, err := s.GetUserModel(ctx)
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
 	startUnix := util.TimeParseLocalUnix(req.StartDate)
 	endUnix := util.TimeParseLocalUnix(req.EndDate)
 
@@ -487,7 +491,7 @@ func (s *StoreEntry) TwentyOnePregnantRate(ctx context.Context, req *pasturePb.T
 		}
 		middleDayUnix := util.TimeParseLocalEndUnix(middleDay)
 		chart.Header = append(chart.Header, fmt.Sprintf("%s ~ %s", v[0], v[1]))
-		cowList := s.TwentyOnePregnantCowList(ctx, req.CowType, stopBreedingDay, middleDayUnix, []int64{})
+		cowList := s.TwentyOnePregnantCowList(userModel.AppPasture.Id, req.CowType, stopBreedingDay, middleDayUnix, []int64{})
 		twentyOnePregnantRateList = append(twentyOnePregnantRateList, &pasturePb.TwentyOnePregnantRateList{
 			StartDay:             v[0],
 			EndDay:               v[1],
@@ -518,7 +522,7 @@ func (s *StoreEntry) TwentyOnePregnantRate(ctx context.Context, req *pasturePb.T
 
 // TwentyOnePregnantCowList 21天牛只停配期牛只列表
 func (s *StoreEntry) TwentyOnePregnantCowList(
-	ctx context.Context,
+	pastureId int64,
 	cowType pasturePb.CowType_Kind,
 	stopBreedingDay int32,
 	middleDay int64,
@@ -528,6 +532,7 @@ func (s *StoreEntry) TwentyOnePregnantCowList(
 	switch cowType {
 	case pasturePb.CowType_Reserve_Calf:
 		pref := s.DB.Model(new(model.Cow)).
+			Where("pasture_id = ?", pastureId).
 			Where("cow_type = ?", cowType).
 			Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
 			Where("is_pregnant = ?", pasturePb.IsShow_No).

+ 41 - 26
module/backend/analysis_breed.go

@@ -13,12 +13,16 @@ import (
 
 // SingleFactorInfantSurvivalRateAnalysis 单因素受胎率分析
 func (s *StoreEntry) SingleFactorInfantSurvivalRateAnalysis(ctx context.Context, req *pasturePb.SingleFactorPregnancyRateRequest) (*pasturePb.SingleFactorPregnancyRateResponse, error) {
+	userModel, err := s.GetUserModel(ctx)
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
 	startTimeUnix := util.TimeParseLocalUnix(req.StartDayTime)
 	endTimeUnix := util.TimeParseLocalEndUnix(req.EndDayTime)
 	if startTimeUnix == 0 || endTimeUnix == 0 || endTimeUnix <= startTimeUnix {
 		return nil, xerr.Custom("开始时间不能大于结束时间")
 	}
-	var err error
 	list := make([]*pasturePb.SingleFactorPregnancyRateList, 0)
 	chart := &pasturePb.SingleFactorPregnancyRateChart{
 		Headers:             make([]string, 0),
@@ -29,27 +33,27 @@ func (s *StoreEntry) SingleFactorInfantSurvivalRateAnalysis(ctx context.Context,
 	}
 	switch req.AnalysisMethod {
 	case pasturePb.SingleFactorAnalysisMethod_Cycle:
-		list, err = s.SingleFactorAnalysisMethodCycle(ctx, req)
+		list, err = s.SingleFactorAnalysisMethodCycle(userModel.AppPasture.Id, req)
 	case pasturePb.SingleFactorAnalysisMethod_Months:
-		list, err = s.SingleFactorAnalysisMethodMonths(ctx, req)
+		list, err = s.SingleFactorAnalysisMethodMonths(userModel.AppPasture.Id, req)
 	case pasturePb.SingleFactorAnalysisMethod_Mating_Times:
-		list, err = s.SingleFactorAnalysisMethodMatingTimes(ctx, req)
+		list, err = s.SingleFactorAnalysisMethodMatingTimes(userModel.AppPasture.Id, req)
 	case pasturePb.SingleFactorAnalysisMethod_Breeding_Method:
-		list, err = s.SingleFactorAnalysisMethodBreeding(ctx, req)
+		list, err = s.SingleFactorAnalysisMethodBreeding(userModel.AppPasture.Id, req)
 	case pasturePb.SingleFactorAnalysisMethod_Breeding_Company:
-		list, err = s.SingleFactorAnalysisMethodBreedingCompany(ctx, req)
+		list, err = s.SingleFactorAnalysisMethodBreedingCompany(userModel.AppPasture.Id, req)
 	case pasturePb.SingleFactorAnalysisMethod_Operation:
-		list, err = s.SingleFactorAnalysisMethodOperation(ctx, req)
+		list, err = s.SingleFactorAnalysisMethodOperation(userModel.AppPasture.Id, req)
 	case pasturePb.SingleFactorAnalysisMethod_Mating_Interval:
-		list, err = s.SingleFactorAnalysisMethodMatingInterval(ctx, req)
+		list, err = s.SingleFactorAnalysisMethodMatingInterval(userModel.AppPasture.Id, req)
 	case pasturePb.SingleFactorAnalysisMethod_Bull:
-		list, err = s.SingleFactorAnalysisMethodBull(ctx, req)
+		list, err = s.SingleFactorAnalysisMethodBull(userModel.AppPasture.Id, req)
 	case pasturePb.SingleFactorAnalysisMethod_Breeding_Cycle:
-		list, err = s.SingleFactorAnalysisMethodBreedingCycle(ctx, req)
+		list, err = s.SingleFactorAnalysisMethodBreedingCycle(userModel.AppPasture.Id, req)
 	case pasturePb.SingleFactorAnalysisMethod_Week:
-		list, err = s.SingleFactorAnalysisMethodWeek(ctx, req)
+		list, err = s.SingleFactorAnalysisMethodWeek(userModel.AppPasture.Id, req)
 	case pasturePb.SingleFactorAnalysisMethod_Lact:
-		list, err = s.SingleFactorAnalysisMethodLact(ctx, req)
+		list, err = s.SingleFactorAnalysisMethodLact(userModel.AppPasture.Id, req)
 	default:
 		return nil, xerr.Custom("错误的统计方式")
 	}
@@ -104,7 +108,7 @@ func (s *StoreEntry) SingleFactorInfantSurvivalRateAnalysis(ctx context.Context,
 	}, nil
 }
 
-func (s *StoreEntry) SingleFactorAnalysisMethodCycle(ctx context.Context, req *pasturePb.SingleFactorPregnancyRateRequest) ([]*pasturePb.SingleFactorPregnancyRateList, error) {
+func (s *StoreEntry) SingleFactorAnalysisMethodCycle(pastureId int64, req *pasturePb.SingleFactorPregnancyRateRequest) ([]*pasturePb.SingleFactorPregnancyRateList, error) {
 	dateTimeRange, err := util.GetRangeDayByDays(req.StartDayTime, req.EndDayTime, req.Value)
 	if err != nil {
 		return nil, xerr.WithStack(err)
@@ -131,11 +135,11 @@ func (s *StoreEntry) SingleFactorAnalysisMethodCycle(ctx context.Context, req *p
 				COUNT(DISTINCT CASE WHEN mating_result = %d AND mating_result_at > 0 THEN cow_id END) +
 				COUNT(DISTINCT CASE WHEN mating_result IN (%d, %d) THEN cow_id END)
 			) AS total_count -- 总数
-			FROM event_mating WHERE status = %d AND reality_day BETWEEN %d AND %d
+			FROM event_mating WHERE pasture_id = %d AND status = %d AND reality_day BETWEEN %d AND %d
 		UNION ALL `, v[0], v[1], pasturePb.MatingResult_Pregnant, pasturePb.MatingResult_Empty, pasturePb.MatingResult_Abort,
 			pasturePb.MatingResult_Unknown, pasturePb.MatingResult_ReMatch, pasturePb.MatingResult_Pregnant,
 			pasturePb.MatingResult_Empty, pasturePb.MatingResult_Unknown, pasturePb.MatingResult_ReMatch,
-			pasturePb.IsShow_Ok, startDayTimeUnix, endDayTimeUnix)
+			pastureId, pasturePb.IsShow_Ok, startDayTimeUnix, endDayTimeUnix)
 	}
 
 	if len(selectSql) > 0 {
@@ -149,7 +153,7 @@ func (s *StoreEntry) SingleFactorAnalysisMethodCycle(ctx context.Context, req *p
 	return res, nil
 }
 
-func (s *StoreEntry) SingleFactorAnalysisMethodMonths(ctx context.Context, req *pasturePb.SingleFactorPregnancyRateRequest) ([]*pasturePb.SingleFactorPregnancyRateList, error) {
+func (s *StoreEntry) SingleFactorAnalysisMethodMonths(pastureId int64, req *pasturePb.SingleFactorPregnancyRateRequest) ([]*pasturePb.SingleFactorPregnancyRateList, error) {
 	startDayTimeUnix := util.TimeParseLocalUnix(req.StartDayTime)
 	endDayTimeUnix := util.TimeParseLocalEndUnix(req.EndDayTime)
 	if startDayTimeUnix == 0 || endDayTimeUnix == 0 || endDayTimeUnix <= startDayTimeUnix {
@@ -174,6 +178,7 @@ func (s *StoreEntry) SingleFactorAnalysisMethodMonths(ctx context.Context, req *
 			pasturePb.MatingResult_Unknown, pasturePb.MatingResult_ReMatch, pasturePb.MatingResult_Pregnant,
 			pasturePb.MatingResult_Empty, pasturePb.MatingResult_Unknown, pasturePb.MatingResult_ReMatch).
 		Where("status = ?", pasturePb.IsShow_Ok).
+		Where("pasture_id = ?", pastureId).
 		Where("reality_day BETWEEN ? AND ?", startDayTimeUnix, endDayTimeUnix)
 	if req.CowType > 0 {
 		pref.Where("cow_type = ?", req.CowType)
@@ -210,12 +215,12 @@ func (s *StoreEntry) SingleFactorAnalysisMethodMonths(ctx context.Context, req *
 	return res, nil
 }
 
-func (s *StoreEntry) SingleFactorAnalysisMethodMatingTimes(ctx context.Context, req *pasturePb.SingleFactorPregnancyRateRequest) ([]*pasturePb.SingleFactorPregnancyRateList, error) {
+func (s *StoreEntry) SingleFactorAnalysisMethodMatingTimes(pastureId int64, req *pasturePb.SingleFactorPregnancyRateRequest) ([]*pasturePb.SingleFactorPregnancyRateList, error) {
 	res := make([]*pasturePb.SingleFactorPregnancyRateList, 0)
 	return res, nil
 }
 
-func (s *StoreEntry) SingleFactorAnalysisMethodBreeding(ctx context.Context, req *pasturePb.SingleFactorPregnancyRateRequest) ([]*pasturePb.SingleFactorPregnancyRateList, error) {
+func (s *StoreEntry) SingleFactorAnalysisMethodBreeding(pastureId int64, req *pasturePb.SingleFactorPregnancyRateRequest) ([]*pasturePb.SingleFactorPregnancyRateList, error) {
 	startDayTimeUnix := util.TimeParseLocalUnix(req.StartDayTime)
 	endDayTimeUnix := util.TimeParseLocalEndUnix(req.EndDayTime)
 	res := make([]*pasturePb.SingleFactorPregnancyRateList, 0)
@@ -244,6 +249,7 @@ func (s *StoreEntry) SingleFactorAnalysisMethodBreeding(ctx context.Context, req
 			pasturePb.MatingResult_Unknown, pasturePb.MatingResult_ReMatch, pasturePb.MatingResult_Pregnant,
 			pasturePb.MatingResult_Empty, pasturePb.MatingResult_Unknown, pasturePb.MatingResult_ReMatch,
 		).Where("status = ?", pasturePb.IsShow_Ok).
+		Where("pasture_id = ?", pastureId).
 		Where("reality_day BETWEEN ? AND ?", startDayTimeUnix, endDayTimeUnix).
 		Where("cow_type = ?", req.CowType).
 		Group("expose_estrus_type").
@@ -254,7 +260,7 @@ func (s *StoreEntry) SingleFactorAnalysisMethodBreeding(ctx context.Context, req
 	return res, nil
 }
 
-func (s *StoreEntry) SingleFactorAnalysisMethodBreedingCompany(ctx context.Context, req *pasturePb.SingleFactorPregnancyRateRequest) ([]*pasturePb.SingleFactorPregnancyRateList, error) {
+func (s *StoreEntry) SingleFactorAnalysisMethodBreedingCompany(pastureId int64, req *pasturePb.SingleFactorPregnancyRateRequest) ([]*pasturePb.SingleFactorPregnancyRateList, error) {
 	res := make([]*pasturePb.SingleFactorPregnancyRateList, 0)
 	startDayTimeUnix := util.TimeParseLocalUnix(req.StartDayTime)
 	endDayTimeUnix := util.TimeParseLocalEndUnix(req.EndDayTime)
@@ -302,7 +308,7 @@ func (s *StoreEntry) SingleFactorAnalysisMethodBreedingCompany(ctx context.Conte
 		}
 	}
 
-	if err := pref.Where("a.status = ?", pasturePb.IsShow_Ok).
+	if err := pref.Where("a.status = ?", pasturePb.IsShow_Ok).Where("pasture_id = ?", pastureId).
 		Where("a.reality_day BETWEEN ? AND ?", startDayTimeUnix, endDayTimeUnix).
 		Group("b.producer").
 		Find(&res).Error; err != nil {
@@ -312,7 +318,7 @@ func (s *StoreEntry) SingleFactorAnalysisMethodBreedingCompany(ctx context.Conte
 	return res, nil
 }
 
-func (s *StoreEntry) SingleFactorAnalysisMethodOperation(ctx context.Context, req *pasturePb.SingleFactorPregnancyRateRequest) ([]*pasturePb.SingleFactorPregnancyRateList, error) {
+func (s *StoreEntry) SingleFactorAnalysisMethodOperation(pastureId int64, req *pasturePb.SingleFactorPregnancyRateRequest) ([]*pasturePb.SingleFactorPregnancyRateList, error) {
 	res := make([]*pasturePb.SingleFactorPregnancyRateList, 0)
 	startDayTimeUnix := util.TimeParseLocalUnix(req.StartDayTime)
 	endDayTimeUnix := util.TimeParseLocalEndUnix(req.EndDayTime)
@@ -359,6 +365,7 @@ func (s *StoreEntry) SingleFactorAnalysisMethodOperation(ctx context.Context, re
 	}
 
 	if err := pref.Where("status = ?", pasturePb.IsShow_Ok).
+		Where("pasture_id = ?", pastureId).
 		Where("reality_day BETWEEN ? AND ?", startDayTimeUnix, endDayTimeUnix).
 		Group("operation_id").
 		Find(&res).Error; err != nil {
@@ -368,12 +375,12 @@ func (s *StoreEntry) SingleFactorAnalysisMethodOperation(ctx context.Context, re
 	return res, nil
 }
 
-func (s *StoreEntry) SingleFactorAnalysisMethodMatingInterval(ctx context.Context, req *pasturePb.SingleFactorPregnancyRateRequest) ([]*pasturePb.SingleFactorPregnancyRateList, error) {
+func (s *StoreEntry) SingleFactorAnalysisMethodMatingInterval(pastureId int64, req *pasturePb.SingleFactorPregnancyRateRequest) ([]*pasturePb.SingleFactorPregnancyRateList, error) {
 	res := make([]*pasturePb.SingleFactorPregnancyRateList, 0)
 	return res, nil
 }
 
-func (s *StoreEntry) SingleFactorAnalysisMethodBull(ctx context.Context, req *pasturePb.SingleFactorPregnancyRateRequest) ([]*pasturePb.SingleFactorPregnancyRateList, error) {
+func (s *StoreEntry) SingleFactorAnalysisMethodBull(pastureId int64, req *pasturePb.SingleFactorPregnancyRateRequest) ([]*pasturePb.SingleFactorPregnancyRateList, error) {
 	res := make([]*pasturePb.SingleFactorPregnancyRateList, 0)
 	startDayTimeUnix := util.TimeParseLocalUnix(req.StartDayTime)
 	endDayTimeUnix := util.TimeParseLocalEndUnix(req.EndDayTime)
@@ -421,6 +428,7 @@ func (s *StoreEntry) SingleFactorAnalysisMethodBull(ctx context.Context, req *pa
 	}
 
 	if err := pref.Where("status = ?", pasturePb.IsShow_Ok).
+		Where("pasture_id = ?").
 		Where("reality_day BETWEEN ? AND ?", startDayTimeUnix, endDayTimeUnix).
 		Group("frozen_semen_number").
 		Find(&res).Error; err != nil {
@@ -430,12 +438,12 @@ func (s *StoreEntry) SingleFactorAnalysisMethodBull(ctx context.Context, req *pa
 	return res, nil
 }
 
-func (s *StoreEntry) SingleFactorAnalysisMethodBreedingCycle(ctx context.Context, req *pasturePb.SingleFactorPregnancyRateRequest) ([]*pasturePb.SingleFactorPregnancyRateList, error) {
+func (s *StoreEntry) SingleFactorAnalysisMethodBreedingCycle(pastureId int64, req *pasturePb.SingleFactorPregnancyRateRequest) ([]*pasturePb.SingleFactorPregnancyRateList, error) {
 	res := make([]*pasturePb.SingleFactorPregnancyRateList, 0)
 	return res, nil
 }
 
-func (s *StoreEntry) SingleFactorAnalysisMethodWeek(ctx context.Context, req *pasturePb.SingleFactorPregnancyRateRequest) ([]*pasturePb.SingleFactorPregnancyRateList, error) {
+func (s *StoreEntry) SingleFactorAnalysisMethodWeek(pastureId int64, req *pasturePb.SingleFactorPregnancyRateRequest) ([]*pasturePb.SingleFactorPregnancyRateList, error) {
 	res := make([]*pasturePb.SingleFactorPregnancyRateList, 0)
 	startDayTimeUnix := util.TimeParseLocalUnix(req.StartDayTime)
 	endDayTimeUnix := util.TimeParseLocalEndUnix(req.EndDayTime)
@@ -493,6 +501,7 @@ func (s *StoreEntry) SingleFactorAnalysisMethodWeek(ctx context.Context, req *pa
 	}
 
 	if err := pref.Where("status = ?", pasturePb.IsShow_Ok).
+		Where("pasture_id = ?", pastureId).
 		Where("reality_day BETWEEN ? AND ?", startDayTimeUnix, endDayTimeUnix).
 		Group("statistic_method").
 		Find(&res).Error; err != nil {
@@ -502,7 +511,7 @@ func (s *StoreEntry) SingleFactorAnalysisMethodWeek(ctx context.Context, req *pa
 	return res, nil
 }
 
-func (s *StoreEntry) SingleFactorAnalysisMethodLact(ctx context.Context, req *pasturePb.SingleFactorPregnancyRateRequest) ([]*pasturePb.SingleFactorPregnancyRateList, error) {
+func (s *StoreEntry) SingleFactorAnalysisMethodLact(pastureId int64, req *pasturePb.SingleFactorPregnancyRateRequest) ([]*pasturePb.SingleFactorPregnancyRateList, error) {
 	res := make([]*pasturePb.SingleFactorPregnancyRateList, 0)
 	startDayTimeUnix := util.TimeParseLocalUnix(req.StartDayTime)
 	endDayTimeUnix := util.TimeParseLocalEndUnix(req.EndDayTime)
@@ -529,6 +538,7 @@ func (s *StoreEntry) SingleFactorAnalysisMethodLact(ctx context.Context, req *pa
 	}
 
 	if err := pref.Where("status = ?", pasturePb.IsShow_Ok).
+		Where("pasture_id = ?", pastureId).
 		Where("reality_day BETWEEN ? AND ?", startDayTimeUnix, endDayTimeUnix).
 		Group("lact").
 		Find(&res).Error; err != nil {
@@ -539,6 +549,10 @@ func (s *StoreEntry) SingleFactorAnalysisMethodLact(ctx context.Context, req *pa
 }
 
 func (s *StoreEntry) MultipleFactorAnalysis(ctx context.Context, req *pasturePb.MultiFactorPregnancyRateRequest) (*model.MultiFactorPregnancyRateResponse, error) {
+	userModel, err := s.GetUserModel(ctx)
+	if err != nil {
+		return nil, err
+	}
 	startTimeUnix := util.TimeParseLocalUnix(req.StartDayTime)
 	endTimeUnix := util.TimeParseLocalEndUnix(req.EndDayTime)
 	if startTimeUnix == 0 || endTimeUnix == 0 || endTimeUnix <= startTimeUnix {
@@ -586,6 +600,7 @@ func (s *StoreEntry) MultipleFactorAnalysis(ctx context.Context, req *pasturePb.
 		`, pasturePb.MatingResult_Pregnant, pasturePb.MatingResult_Empty, pasturePb.MatingResult_Abort,
 			pasturePb.MatingResult_Unknown, pasturePb.MatingResult_ReMatch, pasturePb.MatingResult_Pregnant,
 			pasturePb.MatingResult_Empty, pasturePb.MatingResult_Unknown, pasturePb.MatingResult_ReMatch).
+		Where("pasture_id = ?", userModel.AppPasture.Id).
 		Where("status = ?", pasturePb.IsShow_Ok).
 		Where("cow_type = ?", req.CowType).
 		Where("reality_day BETWEEN ? AND ?", startTimeUnix, endTimeUnix)

+ 97 - 71
module/backend/analysis_other.go

@@ -15,6 +15,10 @@ import (
 
 // PregnancyReport 孕检报告
 func (s *StoreEntry) PregnancyReport(ctx context.Context, req *pasturePb.PregnancyReportRequest, pagination *pasturePb.PaginationModel) (*pasturePb.PregnancyReportResponse, error) {
+	userModel, err := s.GetUserModel(ctx)
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
 	startDayUnix := util.TimeParseLocalUnix(req.StartDayTime)
 	endDayUnix := util.TimeParseLocalEndUnix(req.EndDayTime)
 	if startDayUnix > endDayUnix || startDayUnix == 0 || endDayUnix == 0 {
@@ -22,7 +26,10 @@ func (s *StoreEntry) PregnancyReport(ctx context.Context, req *pasturePb.Pregnan
 	}
 
 	eventPregnantCheckList := make([]*model.EventPregnantCheck, 0)
-	pref := s.DB.Model(new(model.EventPregnantCheck)).Where("status = ?", pasturePb.IsShow_Ok).Where("cow_type = ?", req.CowType)
+	pref := s.DB.Model(new(model.EventPregnantCheck)).
+		Where("status = ?", pasturePb.IsShow_Ok).
+		Where("cow_type = ?", req.CowType).
+		Where("pasture_id = ?", userModel.AppPasture.Id)
 
 	if startDayUnix > 0 && endDayUnix > 0 && endDayUnix >= startDayUnix {
 		pref = pref.Where("create_time BETWEEN  ? AND ?", startDayUnix, endDayUnix)
@@ -33,7 +40,7 @@ func (s *StoreEntry) PregnancyReport(ctx context.Context, req *pasturePb.Pregnan
 	}
 
 	var count int64 = 0
-	if err := pref.Count(&count).
+	if err = pref.Count(&count).
 		Limit(int(pagination.PageSize)).
 		Offset(int(pagination.PageOffset)).
 		Order("id desc").
@@ -57,6 +64,11 @@ func (s *StoreEntry) PregnancyReport(ctx context.Context, req *pasturePb.Pregnan
 
 // CalvingReport 产犊报告
 func (s *StoreEntry) CalvingReport(ctx context.Context, req *pasturePb.CalvingReportRequest) (*pasturePb.CalvingReportResponse, error) {
+	userModel, err := s.GetUserModel(ctx)
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
 	lastDayOfMonth, err := util.GetLastDayOfMonth(req.EndDayTime)
 	if err != nil {
 		return nil, xerr.WithStack(err)
@@ -76,7 +88,7 @@ func (s *StoreEntry) CalvingReport(ctx context.Context, req *pasturePb.CalvingRe
 			SUM(CASE WHEN pregnancy_age <= %d THEN 1 ELSE 0 END) AS premature_labor_count,
 			SUM(CASE WHEN pregnancy_age >= %d THEN 1 ELSE 0 END) AS late_labor_count,
 			count(*) as total_count`, req.PrematureLabor, req.LateLabor),
-		).Where("status = ?", pasturePb.IsShow_Ok).
+		).Where("status = ?", pasturePb.IsShow_Ok).Where("pasture_id = ?", userModel.AppPasture.Id).
 		Where("reality_day BETWEEN  ? AND ? ", startDayTimeUnix, endDayTimeUnix)
 
 	if req.AnalysisMethod > 0 {
@@ -102,7 +114,8 @@ func (s *StoreEntry) CalvingReport(ctx context.Context, req *pasturePb.CalvingRe
     		SUM(CASE WHEN is_live = 2 AND sex = 1 THEN 1 ELSE 0 END) AS bulls_die_count,
 			SUM(CASE WHEN is_live = 2 AND sex = 2 THEN 1 ELSE 0 END) AS cows_die_count,
     		SUM(CASE WHEN is_adoption = 1 THEN 1 ELSE 0 END) AS adopt_count`)).
-		Where("birth_at BETWEEN ? AND ?", startDayTimeUnix, endDayTimeUnix)
+		Where("birth_at BETWEEN ? AND ?", startDayTimeUnix, endDayTimeUnix).
+		Where("pasture_id = ?", userModel.AppPasture.Id)
 
 	if req.AnalysisMethod > 0 {
 		switch req.AnalysisMethod {
@@ -171,6 +184,11 @@ func (s *StoreEntry) CalvingReport(ctx context.Context, req *pasturePb.CalvingRe
 
 // DiseaseCureReport 疾病治愈率报告
 func (s *StoreEntry) DiseaseCureReport(ctx context.Context, req *pasturePb.DiseaseCureRateRequest) (*pasturePb.DiseaseCureRateResponse, error) {
+	userModel, err := s.GetUserModel(ctx)
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
 	lastDayOfMonth, err := util.GetLastDayOfMonth(req.EndDayTime)
 	if err != nil {
 		return nil, xerr.WithStack(err)
@@ -184,11 +202,11 @@ func (s *StoreEntry) DiseaseCureReport(ctx context.Context, req *pasturePb.Disea
 
 	diseaseCureRateList1 := make([]*pasturePb.DiseaseCureRateList, 0)
 	diseaseCureRateList2 := make([]*pasturePb.DiseaseCureRateList, 0)
-	pref1, err := s.query1(ctx, req.CowType, startDayTimeUnix, endDayTimeUnix)
+	pref1, err := s.query1(userModel.AppPasture.Id, req.CowType, startDayTimeUnix, endDayTimeUnix)
 	if err != nil {
 		return nil, xerr.WithStack(err)
 	}
-	pref2, err := s.query2(ctx, startDayTimeUnix, endDayTimeUnix)
+	pref2, err := s.query2(userModel.AppPasture.Id, startDayTimeUnix, endDayTimeUnix)
 	if err != nil {
 		return nil, xerr.WithStack(err)
 	}
@@ -261,7 +279,75 @@ func (s *StoreEntry) DiseaseCureReport(ctx context.Context, req *pasturePb.Disea
 	}, nil
 }
 
-func (s *StoreEntry) query1(ctx context.Context, cowType pasturePb.CowType_Kind, startDayTimeUnix, endDayTimeUnix int64) (*gorm.DB, error) {
+func (s *StoreEntry) SaleCowReport(ctx context.Context, req *pasturePb.SaleCowReportRequest) (*pasturePb.SaleCowReportResponse, error) {
+	userModel, err := s.GetUserModel(ctx)
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
+	lastDayOfMonth, err := util.GetLastDayOfMonth(req.EndDay)
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
+	endDayTimeUnix := util.TimeParseLocalEndUnix(lastDayOfMonth)
+	startDayTimeUnix := util.TimeParseLocalUnix(fmt.Sprintf("%s-01", req.StartDay))
+	if startDayTimeUnix == 0 || endDayTimeUnix == 0 || endDayTimeUnix <= startDayTimeUnix {
+		return nil, xerr.Custom("开始时间不能大于结束时间")
+	}
+
+	list := make([]*pasturePb.SaleCowReportList, 0)
+	pref := s.DB.Model(new(model.EventSale)).
+		Select(
+			`SUM(sale_cow_count) AS sale_all_count,
+			SUM(sale_all_amount) AS sale_all_amount,
+			SUM(sale_cow_count) AS sale_all_count,
+			SUM(sale_all_weight) AS sale_all_weight`,
+		).Where("sale_at BETWEEN ? AND ?", startDayTimeUnix, endDayTimeUnix).
+		Where("pasture_id = ?", userModel.AppPasture.Id)
+	if req.AnalysisMethod == pasturePb.SaleCowAnalysisMethod_Months {
+		pref.Select(`DATE_FORMAT(FROM_UNIXTIME(sale_at), '%Y-%m') AS statisticMethod`)
+	}
+
+	if req.AnalysisMethod == pasturePb.SaleCowAnalysisMethod_Dealer {
+		pref.Select(`dealer_name as statisticMethod`)
+	}
+
+	if err = pref.Group("statisticMethod").Order("statisticMethod ASC").Find(&list).Error; err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
+	chart := &pasturePb.SaleCowReportChart{
+		Headers:           make([]string, 0),
+		SaleMount:         make([]float32, 0),
+		SaleWeight:        make([]float32, 0),
+		SaleCount:         make([]int32, 0),
+		AverageSaleWeight: make([]float32, 0),
+	}
+	for i, v := range list {
+		if v.SaleAllCount > 0 && v.SaleAllWeight > 0 {
+			v.SaleAvgWeight = float32(util.RoundToTwoDecimals(float64(v.SaleAllWeight / float32(v.SaleAllCount))))
+		}
+		chart.Headers = append(chart.Headers, v.StatisticMethod)
+		chart.SaleMount = append(chart.SaleMount, v.SaleAllMount)
+		chart.SaleWeight = append(chart.SaleWeight, v.SaleAllWeight)
+		chart.SaleCount = append(chart.SaleCount, v.SaleAllCount)
+		chart.AverageSaleWeight = append(chart.AverageSaleWeight, v.SaleAvgWeight)
+		v.Id = int32(i)
+	}
+
+	return &pasturePb.SaleCowReportResponse{
+		Code: http.StatusOK,
+		Msg:  "ok",
+		Data: &pasturePb.SaleCowReportData{
+			Chart: chart,
+			List:  list,
+			Total: int32(len(list)),
+		},
+	}, err
+}
+
+func (s *StoreEntry) query1(pastureId int64, cowType pasturePb.CowType_Kind, startDayTimeUnix, endDayTimeUnix int64) (*gorm.DB, error) {
 	pref := s.DB.Model(new(model.EventCowDisease)).
 		Select(
 			`DATE_FORMAT(FROM_UNIXTIME(diagnosed_at), '%Y-%m') AS months,
@@ -294,6 +380,7 @@ func (s *StoreEntry) query1(ctx context.Context, cowType pasturePb.CowType_Kind,
 			pasturePb.HealthStatus_Dead, pasturePb.HealthStatus_Curable, pasturePb.HealthStatus_Curable, pasturePb.HealthStatus_Curable,
 		).
 		Where("diagnosed_result = ?", pasturePb.IsShow_Ok).
+		Where("pastureI_id = ?", pastureId).
 		Where("diagnosed_at BETWEEN ? AND ?", startDayTimeUnix, endDayTimeUnix)
 	if cowType > 0 {
 		pref.Where("cow_type = ?", cowType)
@@ -302,7 +389,7 @@ func (s *StoreEntry) query1(ctx context.Context, cowType pasturePb.CowType_Kind,
 	return pref, nil
 }
 
-func (s *StoreEntry) query2(ctx context.Context, startDayTimeUnix, endDayTimeUnix int64) (*gorm.DB, error) {
+func (s *StoreEntry) query2(pastureId int64, startDayTimeUnix, endDayTimeUnix int64) (*gorm.DB, error) {
 	pref := s.DB.Model(new(model.EventCowTreatment)).
 		Select(`
 		DATE_FORMAT(FROM_UNIXTIME(treatment_at), '%Y-%m') AS months,
@@ -314,7 +401,8 @@ func (s *StoreEntry) query2(ctx context.Context, startDayTimeUnix, endDayTimeUni
 		operation_id,
 		operation_name,
 		COUNT(DISTINCT cow_id) AS disease_treatment_count`,
-		).Where("treatment_at BETWEEN ? AND ?", startDayTimeUnix, endDayTimeUnix)
+		).Where("treatment_at BETWEEN ? AND ?", startDayTimeUnix, endDayTimeUnix).
+		Where("pasture_id = ?", pastureId)
 	return pref, nil
 }
 
@@ -374,65 +462,3 @@ func processDiseaseCureRateList(diseaseCureRateList1, diseaseCureRateList2 []*pa
 		}
 	}
 }
-
-func (s *StoreEntry) SaleCowReport(ctx context.Context, req *pasturePb.SaleCowReportRequest) (*pasturePb.SaleCowReportResponse, error) {
-	lastDayOfMonth, err := util.GetLastDayOfMonth(req.EndDay)
-	if err != nil {
-		return nil, xerr.WithStack(err)
-	}
-
-	endDayTimeUnix := util.TimeParseLocalEndUnix(lastDayOfMonth)
-	startDayTimeUnix := util.TimeParseLocalUnix(fmt.Sprintf("%s-01", req.StartDay))
-	if startDayTimeUnix == 0 || endDayTimeUnix == 0 || endDayTimeUnix <= startDayTimeUnix {
-		return nil, xerr.Custom("开始时间不能大于结束时间")
-	}
-
-	list := make([]*pasturePb.SaleCowReportList, 0)
-	pref := s.DB.Model(new(model.EventSale)).
-		Select(
-			`SUM(sale_cow_count) AS sale_all_count,
-			SUM(sale_all_amount) AS sale_all_amount,
-			SUM(sale_cow_count) AS sale_all_count,
-			SUM(sale_all_weight) AS sale_all_weight`,
-		).Where("sale_at BETWEEN ? AND ?", startDayTimeUnix, endDayTimeUnix)
-	if req.AnalysisMethod == pasturePb.SaleCowAnalysisMethod_Months {
-		pref.Select(`DATE_FORMAT(FROM_UNIXTIME(sale_at), '%Y-%m') AS statisticMethod`)
-	}
-
-	if req.AnalysisMethod == pasturePb.SaleCowAnalysisMethod_Dealer {
-		pref.Select(`dealer_name as statisticMethod`)
-	}
-
-	if err = pref.Group("statisticMethod").Order("statisticMethod ASC").Find(&list).Error; err != nil {
-		return nil, xerr.WithStack(err)
-	}
-
-	chart := &pasturePb.SaleCowReportChart{
-		Headers:           make([]string, 0),
-		SaleMount:         make([]float32, 0),
-		SaleWeight:        make([]float32, 0),
-		SaleCount:         make([]int32, 0),
-		AverageSaleWeight: make([]float32, 0),
-	}
-	for i, v := range list {
-		if v.SaleAllCount > 0 && v.SaleAllWeight > 0 {
-			v.SaleAvgWeight = float32(util.RoundToTwoDecimals(float64(v.SaleAllWeight / float32(v.SaleAllCount))))
-		}
-		chart.Headers = append(chart.Headers, v.StatisticMethod)
-		chart.SaleMount = append(chart.SaleMount, v.SaleAllMount)
-		chart.SaleWeight = append(chart.SaleWeight, v.SaleAllWeight)
-		chart.SaleCount = append(chart.SaleCount, v.SaleAllCount)
-		chart.AverageSaleWeight = append(chart.AverageSaleWeight, v.SaleAvgWeight)
-		v.Id = int32(i)
-	}
-
-	return &pasturePb.SaleCowReportResponse{
-		Code: http.StatusOK,
-		Msg:  "ok",
-		Data: &pasturePb.SaleCowReportData{
-			Chart: chart,
-			List:  list,
-			Total: int32(len(list)),
-		},
-	}, err
-}

+ 45 - 0
module/backend/dashboard.go

@@ -5,6 +5,9 @@ import (
 	"kpt-pasture/model"
 	"net/http"
 
+	"gitee.com/xuyiping_admin/pkg/logger/zaplog"
+	"go.uber.org/zap"
+
 	"gitee.com/xuyiping_admin/pkg/xerr"
 
 	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
@@ -34,3 +37,45 @@ func (s *StoreEntry) Bar(ctx context.Context) (*pasturePb.BarCowStructResponse,
 		},
 	}, nil
 }
+
+func (s *StoreEntry) NeckRingWarning(ctx context.Context) (*pasturePb.IndexNeckRingResponse, error) {
+	userModel, err := s.GetUserModel(ctx)
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
+	estrusWarningCowList := make([]*model.EventEstrus, 0)
+	estrusWarningLevelItems := make(map[int32]int32)
+	if err = s.DB.Model(new(model.EventEstrus)).
+		Where("pasture_id = ?", userModel.AppPasture.Id).
+		Where("is_show = ?", pasturePb.IsShow_Ok).
+		Group("cow_id").Find(&estrusWarningCowList).Error; err != nil {
+		zaplog.Error("NeckRingWarning", zap.Any("estrusWarningNumber", err))
+	}
+
+	for _, v := range estrusWarningCowList {
+		estrusWarningLevelItems[int32(v.Level)] += estrusWarningLevelItems[int32(v.Level)]
+	}
+
+	healthWarningNumber := int64(0)
+	if err = s.DB.Model(new(model.NeckRingHealthWarning)).
+		Where("pasture_id = ?", userModel.AppPasture.Id).
+		Where("is_show = ?", pasturePb.IsShow_Ok).
+		Group("cow_id").
+		Count(&healthWarningNumber).Error; err != nil {
+		zaplog.Error("NeckRingWarning", zap.Any("estrusWarningNumber", err))
+	}
+
+	return &pasturePb.IndexNeckRingResponse{
+		Code: http.StatusOK,
+		Msg:  "ok",
+		Data: &pasturePb.NeckRingData{
+			EstrusWarningNumber:     int32(len(estrusWarningCowList)),
+			HealthWarningNumber:     int32(healthWarningNumber),
+			AbortionWarningNumber:   0,
+			StressWarningNumber:     0,
+			EstrusWarningLevelItems: estrusWarningLevelItems,
+		},
+	}, nil
+
+}

+ 8 - 0
module/backend/enum_map.go

@@ -294,3 +294,11 @@ func (s *StoreEntry) TransferPenMap() map[int32]string {
 	}
 	return res
 }
+
+func (s *StoreEntry) BarnTypeMap() map[pasturePb.PenType_Kind]string {
+	res := make(map[pasturePb.PenType_Kind]string)
+	for _, v := range s.BarnTypeEnumList() {
+		res[pasturePb.PenType_Kind(v.Value)] = v.Label
+	}
+	return res
+}

+ 3 - 3
module/backend/goods.go

@@ -62,7 +62,7 @@ func (s *StoreEntry) DrugsCreateOrUpdate(ctx context.Context, req *pasturePb.Sea
 
 	req.CategoryName = s.DrugCategoryMaps()[req.CategoryId]
 	req.UnitName = s.UnitMap()[req.Unit]
-	req.UnitName = s.DrugUsageMaps()[req.Usage]
+	req.UsageName = s.DrugUsageMaps()[req.Usage]
 
 	newDrugs := model.NewDrugs(userModel.AppPasture.Id, req, userModel.SystemUser)
 	if req.Id <= 0 {
@@ -292,7 +292,7 @@ func (s *StoreEntry) OutboundApply(ctx context.Context, req *pasturePb.OutboundA
 		}
 	} else {
 		// 创建出库申请
-		outbound = model.NewOutbound(userModel.SystemUser.Id, req, userModel.SystemUser)
+		outbound = model.NewOutbound(userModel.AppPasture.Id, req, userModel.SystemUser)
 	}
 	goodsItems := make([]*pasturePb.OutboundApplyGoodsItem, 0)
 	switch req.OutType {
@@ -420,7 +420,7 @@ func (s *StoreEntry) OutboundList(ctx context.Context, req *pasturePb.SearchOutb
 		pref.Where("examine_id = ?", req.ExamineId)
 	}
 
-	if err := pref.Order("id desc").
+	if err = pref.Order("id desc").
 		Count(&count).
 		Limit(int(pagination.PageSize)).
 		Offset(int(pagination.PageOffset)).

+ 1 - 0
module/backend/interface.go

@@ -260,6 +260,7 @@ type AnalyseService interface {
 //go:generate mockgen -destination mock/DashboardService.go -package kptservicemock kpt-pasture/module/backend DashboardService
 type DashboardService interface {
 	Bar(ctx context.Context) (*pasturePb.BarCowStructResponse, error)
+	NeckRingWarning(ctx context.Context) (*pasturePb.IndexNeckRingResponse, error)
 }
 
 //go:generate mockgen -destination mock/WorkService.go -package kptservicemock kpt-pasture/module/backend WorkService

+ 3 - 6
module/backend/pasture.go

@@ -27,16 +27,13 @@ func (s *StoreEntry) SearchBarnList(ctx context.Context, req *pasturePb.SearchNa
 		return nil, xerr.WithStack(err)
 	}
 
-	configBarnTypeList := make([]*model.ConfigPenType, 0)
-	if err := s.DB.Model(new(model.ConfigPenType)).Find(&configBarnTypeList).Error; err != nil {
-		return nil, xerr.WithStack(err)
-	}
-
+	//configBarnTypeList := make([]*model.ConfigPenType, 0)
+	barnTypeMap := s.BarnTypeMap()
 	return &pasturePb.SearchBarnResponse{
 		Code: http.StatusOK,
 		Msg:  "ok",
 		Data: &pasturePb.SearchBarnData{
-			List:     model.PenSlice(penList).ToPB(configBarnTypeList),
+			List:     model.PenSlice(penList).ToPB(barnTypeMap),
 			Total:    int32(count),
 			PageSize: pagination.PageSize,
 			Page:     pagination.Page,

+ 17 - 0
module/backend/sql.go

@@ -6,6 +6,7 @@ import (
 	"fmt"
 	"kpt-pasture/model"
 	"kpt-pasture/store/kptstore"
+	"strings"
 
 	"gitee.com/xuyiping_admin/pkg/logger/zaplog"
 	"go.uber.org/zap"
@@ -26,6 +27,22 @@ func (s *StoreEntry) GetUserModel(ctx context.Context) (*model.UserModel, error)
 	if err != nil {
 		return nil, xerr.WithStack(err)
 	}
+
+	systemUserPastureIds := strings.Split(systemUser.PastureIds, ",")
+	if len(systemUserPastureIds) == 0 {
+		return nil, xerr.Custom("当前用户未配置相关牧场数据,请联系管理员!")
+	}
+
+	var info bool
+	for _, v := range systemUserPastureIds {
+		if v == fmt.Sprintf("%d", appPasture.Id) {
+			info = true
+		}
+	}
+	if !info {
+		return nil, xerr.Custom("该用户未没有该牧场操作权限,请联系管理员开通牧场权限")
+	}
+
 	return &model.UserModel{
 		SystemUser: systemUser,
 		AppPasture: appPasture,

+ 1 - 1
module/crontab/neck_ring_handle.go

@@ -252,7 +252,7 @@ func (e *Entry) EntryUpdateActiveHabit(pastureId int64) (err error) {
 	defer func() {
 		// 更新最后一次执行的id值
 		if err == nil {
-			e.DB.Model(new(model.SystemConfigure)).
+			e.DB.Model(new(model.NeckRingConfigure)).
 				Where("name = ?", model.MaxHabit).
 				Where("pasture_id = ?", pastureId).
 				Update("value", currMaxHabit.Id)

+ 3 - 3
module/crontab/sql.go

@@ -114,9 +114,9 @@ func (e *Entry) IsExistNeckActiveHabit(neckRingNumber, heatDate string, frameId
 	return neckActiveHabit, count
 }
 
-func (e *Entry) GetSystemConfigure(pastureId int64) ([]*model.SystemConfigure, error) {
-	res := make([]*model.SystemConfigure, 0)
-	if err := e.DB.Model(new(model.SystemConfigure)).
+func (e *Entry) GetSystemConfigure(pastureId int64) ([]*model.NeckRingConfigure, error) {
+	res := make([]*model.NeckRingConfigure, 0)
+	if err := e.DB.Model(new(model.NeckRingConfigure)).
 		Where("pasture_id = ?", pastureId).
 		Where("is_show = ?", pasturePb.IsShow_Ok).
 		Find(&res).Error; err != nil {