Parcourir la source

event: 流产事件批量提交

Yi il y a 7 mois
Parent
commit
2e864e3e67

+ 2 - 2
go.mod

@@ -3,8 +3,8 @@ module kpt-pasture
 go 1.17
 
 require (
-	gitee.com/xuyiping_admin/go_proto v0.0.0-20240926092955-f27b0fa96718
-	gitee.com/xuyiping_admin/pkg v0.0.0-20231218082641-aac597b8a015
+	gitee.com/xuyiping_admin/go_proto v0.0.0-20241010014128-49b4c7bbdc67
+	gitee.com/xuyiping_admin/pkg v0.0.0-20241008063555-121a776fd331
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible
 	github.com/eko/gocache v1.1.0
 	github.com/getsentry/sentry-go v0.23.0

+ 4 - 0
go.sum

@@ -68,8 +68,12 @@ gitee.com/xuyiping_admin/go_proto v0.0.0-20240926090848-43fc51acb679 h1:7gzz8oN4
 gitee.com/xuyiping_admin/go_proto v0.0.0-20240926090848-43fc51acb679/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20240926092955-f27b0fa96718 h1:QB8QkNqfnXB/ox8wsIitfW1IXGEkvDVbi4GkcRgXxD8=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20240926092955-f27b0fa96718/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20241010014128-49b4c7bbdc67 h1:P9y7LRQu0PJrYBTlVD39lriGPwYiqPinXdklUqPKiMI=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20241010014128-49b4c7bbdc67/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=
+gitee.com/xuyiping_admin/pkg v0.0.0-20241008063555-121a776fd331 h1:qJcpJ3o+O7uxDqR0I9LijQmi607IKvhf4mGum/ZUPT0=
+gitee.com/xuyiping_admin/pkg v0.0.0-20241008063555-121a776fd331/go.mod h1:Fk4GYI/v0IK3XFrm1Gn+VkgCz5Y7mfswD5hsTJYOG6A=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=

+ 29 - 6
http/handler/event/event_breed.go

@@ -303,27 +303,50 @@ func SameTimeCreate(c *gin.Context) {
 }
 
 func SameTimeList(c *gin.Context) {
+	var req pasturePb.SearchEventRequest
+	if err := ginutil.BindProto(c, &req); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
 
+	pagination := &pasturePb.PaginationModel{
+		Page:       int32(c.GetInt(middleware.Page)),
+		PageSize:   int32(c.GetInt(middleware.PageSize)),
+		PageOffset: int32(c.GetInt(middleware.PageOffset)),
+	}
+
+	res, err := middleware.Dependency(c).StoreEventHub.OpsService.SameTimeList(c, &req, pagination)
+	if err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+	ginutil.JSONResp(c, res)
 }
 
 func AbortionCreate(c *gin.Context) {
-	var req pasturePb.EventAbortionRequest
+	var req pasturePb.EventAbortionSlice
 	if err := ginutil.BindProto(c, &req); err != nil {
 		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
 		return
 	}
 
 	if err := valid.ValidateStruct(&req,
-		valid.Field(&req.CowId, valid.Required),
-		valid.Field(&req.IsAfterbirth, valid.Required),
-		valid.Field(&req.AbortionReasons, valid.Required),
-		valid.Field(&req.AbortionAt, valid.Required),
+		valid.Field(&req.Item, valid.Required, valid.Each(valid.By(func(value interface{}) error {
+			item := value.(pasturePb.EventAbortionRequest)
+			return valid.ValidateStruct(&item,
+				valid.Field(&item.CowId, valid.Required),
+				valid.Field(&item.IsAfterbirth, valid.Required),
+				valid.Field(&item.AbortionReasons, valid.Required),
+				valid.Field(&item.AbortionAt, valid.Required),
+				valid.Field(&item.OperationId, valid.Required),
+			)
+		}))),
 	); err != nil {
 		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
 		return
 	}
 
-	if err := middleware.BackendOperation(c).OpsService.AbortionCreate(c, &req); err != nil {
+	if err := middleware.BackendOperation(c).OpsService.AbortionCreateSlice(c, &req); err != nil {
 		apierr.ClassifiedAbort(c, err)
 		return
 	}

+ 18 - 0
model/event_cow_same_time.go

@@ -1,6 +1,8 @@
 package model
 
 import (
+	"fmt"
+
 	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
 )
 
@@ -103,3 +105,19 @@ func (s SameTimeBodySlice) ToPB(
 	}
 	return res
 }
+
+type CowSameTimeSlice []*EventCowSameTime
+
+func (s CowSameTimeSlice) ToPB() []*pasturePb.EventSameTime {
+	res := make([]*pasturePb.EventSameTime, len(s))
+	for i, v := range s {
+		res[i] = &pasturePb.EventSameTime{
+			CowId:      fmt.Sprintf("%d", v.CowId),
+			DrugsId:    int32(v.DrugsId),
+			Usage:      v.Usage,
+			Lact:       v.Lact,
+			SameTimeId: int32(v.SameTimeId),
+		}
+	}
+	return res
+}

+ 49 - 0
module/backend/event_breed.go

@@ -2,6 +2,7 @@ package backend
 
 import (
 	"context"
+	"encoding/json"
 	"fmt"
 	"kpt-pasture/model"
 	"kpt-pasture/util"
@@ -572,6 +573,36 @@ func (s *StoreEntry) SameTimeCreate(ctx context.Context, req *pasturePb.EventSam
 	return nil
 }
 
+func (s *StoreEntry) SameTimeList(
+	ctx context.Context,
+	req *pasturePb.SearchEventRequest,
+	pagination *pasturePb.PaginationModel,
+) (*pasturePb.SearchSameTimeResponse, error) {
+	cowSameTimeList := make([]*model.EventCowSameTime, 0)
+	var count int64 = 0
+	pref := s.DB.Table(new(model.EventCowSameTime).TableName())
+	if req.CowId != "" {
+		cowIds := strings.Split(req.CowId, ",")
+		pref.Where("cow_id IN ?", cowIds)
+	}
+
+	if err := pref.Count(&count).Limit(int(pagination.PageSize)).Offset(int(pagination.PageOffset)).Find(&cowSameTimeList).Error; err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
+	return &pasturePb.SearchSameTimeResponse{
+		Code:    http.StatusOK,
+		Message: "ok",
+		Data: &pasturePb.SameTimeData{
+			List:     model.CowSameTimeSlice(cowSameTimeList).ToPB(),
+			Total:    int32(count),
+			PageSize: pagination.PageSize,
+			Page:     pagination.Page,
+		},
+	}, nil
+
+}
+
 func (s *StoreEntry) AbortionCreate(ctx context.Context, req *pasturePb.EventAbortionRequest) error {
 	cow, err := s.GetCowInfoByCowId(ctx, int64(req.CowId))
 	if err != nil {
@@ -620,6 +651,24 @@ func (s *StoreEntry) AbortionCreate(ctx context.Context, req *pasturePb.EventAbo
 	return nil
 }
 
+func (s *StoreEntry) AbortionCreateSlice(ctx context.Context, req *pasturePb.EventAbortionSlice) error {
+	if len(req.Item) <= 0 {
+		return xerr.WithStack(xerr.New("流产数据不能为空"))
+	}
+	errors := make(map[int32]error)
+	for _, v := range req.Item {
+		if err := s.AbortionCreate(ctx, v); err != nil {
+			errors[v.CowId] = err
+		}
+	}
+
+	if len(errors) > 0 {
+		b, _ := json.Marshal(errors)
+		return xerr.WithStack(xerr.Customf("部分流产数据创建失败: %s", string(b)))
+	}
+	return nil
+}
+
 func (s *StoreEntry) AbortionList(
 	ctx context.Context,
 	req *pasturePb.SearchEventRequest,

+ 2 - 0
module/backend/interface.go

@@ -173,8 +173,10 @@ type EventService interface {
 	// AbortionList 流产
 	AbortionList(ctx context.Context, req *pasturePb.SearchEventRequest, pagination *pasturePb.PaginationModel) (*pasturePb.EventAbortionResponse, error)
 	AbortionCreate(ctx context.Context, req *pasturePb.EventAbortionRequest) error
+	AbortionCreateSlice(ctx context.Context, req *pasturePb.EventAbortionSlice) error
 	// SameTimeCreate 同期
 	SameTimeCreate(ctx context.Context, req *pasturePb.EventSameTime) error
+	SameTimeList(ctx context.Context, req *pasturePb.SearchEventRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchSameTimeResponse, error)
 	// WeightList 称重
 	WeightList(ctx context.Context, req *pasturePb.SearchEventRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchWeightEventResponse, error)
 	WeightCreate(ctx context.Context, req *pasturePb.EventWeight) error