瀏覽代碼

event: enter excel 导入

Yi 3 天之前
父節點
當前提交
105742e2f2
共有 5 個文件被更改,包括 166 次插入4 次删除
  1. 1 1
      go.mod
  2. 2 0
      go.sum
  3. 94 0
      model/cow.go
  4. 65 0
      module/backend/event_base.go
  5. 4 3
      module/backend/upload_file.go

+ 1 - 1
go.mod

@@ -3,7 +3,7 @@ module kpt-pasture
 go 1.17
 
 require (
-	gitee.com/xuyiping_admin/go_proto v0.0.0-20250813060227-ac0a14292eb8
+	gitee.com/xuyiping_admin/go_proto v0.0.0-20250822092947-b3acec2e3359
 	gitee.com/xuyiping_admin/pkg v0.0.0-20250613101634-36c36a2d27d0
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible
 	github.com/eclipse/paho.mqtt.golang v1.4.3

+ 2 - 0
go.sum

@@ -1335,6 +1335,8 @@ gitee.com/xuyiping_admin/go_proto v0.0.0-20250812064516-17d87a02cad2 h1:vnNX8F32
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250812064516-17d87a02cad2/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250813060227-ac0a14292eb8 h1:MFeaHtBnwmLb9ljU90N1JpnHZPgXiHhlHGU3M3+5W7E=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250813060227-ac0a14292eb8/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250822092947-b3acec2e3359 h1:HcFY+HPtrZbxYkPnRX+ZjG6sR7szSuqh5rrnr2JXrTc=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250822092947-b3acec2e3359/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
 gitee.com/xuyiping_admin/pkg v0.0.0-20250613101634-36c36a2d27d0 h1:ZCOqEAnGm6+DTAhACigzWKbwMKtleb8/7OzP2xfHG7g=
 gitee.com/xuyiping_admin/pkg v0.0.0-20250613101634-36c36a2d27d0/go.mod h1:8tF25X6pE9WkFCczlNAC0K2mrjwKvhhp02I7o0HtDxY=
 github.com/BurntSushi/toml v0.3.0/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=

+ 94 - 0
model/cow.go

@@ -747,6 +747,100 @@ func NewCalfCow(matherInfo *Cow, calf *CalvingCalf) *Cow {
 	}
 }
 
+// ExcelEnterCow excel导入入场新增牛只
+func ExcelEnterCow(pastureId int64, req *pasturePb.EventEnterRequest) *Cow {
+	var isPregnant = pasturePb.IsShow_No
+	if req.BreedStatus == pasturePb.BreedStatus_Pregnant {
+		isPregnant = pasturePb.IsShow_Ok
+	}
+
+	admissionAt := int64(0)
+	switch req.CowSource {
+	case pasturePb.CowSource_Calving:
+		admissionAt = int64(req.BirthAt)
+	case pasturePb.CowSource_Transfer_In:
+		admissionAt = int64(req.EnterAt)
+	case pasturePb.CowSource_Buy:
+		admissionAt = int64(req.EnterAt)
+	}
+
+	breedStatus := pasturePb.BreedStatus_Invalid
+	if req.Sex == pasturePb.Genders_Female {
+		if req.Lact == 0 && req.MatingAt <= 0 {
+			breedStatus = pasturePb.BreedStatus_UnBreed
+		}
+
+		if req.MatingAt > 0 && (req.PregnantCheckResult != pasturePb.PregnantCheckResult_Pregnant &&
+			req.PregnantCheckResult != pasturePb.PregnantCheckResult_UnPregnant) &&
+			req.MatingAt >= req.CalvingAt && req.MatingAt >= req.AbortionAt {
+			breedStatus = pasturePb.BreedStatus_Breeding
+
+		}
+
+		if req.MatingAt > 0 && req.PregnantCheckResult == pasturePb.PregnantCheckResult_Pregnant &&
+			req.MatingAt >= req.CalvingAt && req.MatingAt >= req.AbortionAt {
+			breedStatus = pasturePb.BreedStatus_Pregnant
+
+		}
+
+		if req.MatingAt > 0 && req.PregnantCheckResult == pasturePb.PregnantCheckResult_UnPregnant &&
+			req.MatingAt >= req.CalvingAt && req.MatingAt >= req.AbortionAt {
+			breedStatus = pasturePb.BreedStatus_Empty
+
+		}
+
+		if req.CalvingAt > 0 && req.CalvingAt >= req.MatingAt && req.CalvingAt >= req.AbortionAt {
+			breedStatus = pasturePb.BreedStatus_Calving
+		}
+
+		if req.AbortionAt > 0 && req.AbortionAt >= req.CalvingAt && req.AbortionAt >= req.MatingAt {
+			breedStatus = pasturePb.BreedStatus_Abort
+		}
+	}
+
+	cow := &Cow{
+		PastureId:           pastureId,
+		Sex:                 req.Sex,
+		EarNumber:           req.EarNumber,
+		PenId:               req.PenId,
+		PenName:             req.PenName,
+		Lact:                req.Lact,
+		CowType:             req.CowType,
+		BreedStatus:         breedStatus,
+		CowKind:             req.CowKind,
+		SourceKind:          req.CowSource,
+		FatherNumber:        req.FatherNumber,
+		MotherNumber:        req.MotherNumber,
+		AdmissionStatus:     pasturePb.AdmissionStatus_Admission,
+		HealthStatus:        pasturePb.HealthStatus_Health,
+		PurposeKind:         req.PurposeKind,
+		EleEarNumber:        req.EleEarNumber,
+		IsPregnant:          isPregnant,
+		IsForbiddenMating:   req.IsForbiddenMatingKind,
+		WeaningAt:           int64(req.WeaningAt),
+		BirthAt:             int64(req.BirthAt),
+		AdmissionWeight:     int64(req.Weight * 1000),
+		FirstMatingAt:       int64(req.MatingAt),
+		LastMatingAt:        int64(req.MatingAt),
+		LastPregnantCheckAt: int64(req.PregnancyCheckAt),
+		AdmissionAt:         admissionAt,
+		BirthWeight:         int64(req.Weight * 1000),
+		LastWeightAt:        int64(req.EstrusAt),
+		CurrentWeight:       int64(req.Weight * 1000),
+		LastDryMilkAt:       int64(req.DryMilkAt),
+		MatingTimes:         req.MatingTimes,
+		LastCalvingAt:       int64(req.CalvingAt),
+		LastBullNumber:      req.BullNumber,
+		LastAbortionAt:      int64(req.AbortionAt),
+		AdmissionPrice:      req.Price,
+		BatchNumber:         req.BatchNumber,
+		NeckRingNumber:      req.NeckRingNumber,
+	}
+	cow.AdmissionAge = cow.GetAdmissionAge()
+	cow.DayAge = cow.GetDayAge()
+	return cow
+}
+
 type BarCowStruct struct {
 	Number int32                  `json:"number"`
 	TypeId pasturePb.CowType_Kind `json:"type_id"`

+ 65 - 0
module/backend/event_base.go

@@ -171,6 +171,71 @@ func (s *StoreEntry) CreateEnter(ctx context.Context, req *pasturePb.EventEnterR
 	return nil
 }
 
+func (s *StoreEntry) ExcelImportEnter(ctx context.Context, req *pasturePb.EventEnterRequest) (err error) {
+	userModel, err := s.GetUserModel(ctx)
+	if err != nil {
+		return xerr.WithStack(err)
+	}
+
+	if err = s.EnterCheck(userModel, req); err != nil {
+		return xerr.WithStack(err)
+	}
+
+	pastureId := userModel.AppPasture.Id
+	req.MessengerId = int32(userModel.SystemUser.Id)
+	req.MessengerName = userModel.SystemUser.Name
+
+	operationSystemUser, err := s.GetSystemUserById(ctx, int64(req.OperationId))
+	if err != nil {
+		return xerr.WithStack(err)
+	}
+	req.OperationName = operationSystemUser.Name
+
+	penMap := s.PenMap(ctx, pastureId)
+	if len(penMap) <= 0 {
+		return xerr.Customf("请先设置牛舍信息")
+	}
+
+	newCow := model.ExcelEnterCow(pastureId, req)
+	if err = s.DB.Transaction(func(tx *gorm.DB) error {
+		// 新增牛只信息
+		if err = tx.Model(new(model.Cow)).Create(newCow).Error; err != nil {
+			return xerr.WithStack(err)
+		}
+
+		// 新增入场事件
+		newEventEnter := model.NewEventEnter(pastureId, newCow, req)
+		if err = tx.Model(new(model.EventEnter)).Create(newEventEnter).Error; err != nil {
+			return xerr.WithStack(err)
+		}
+
+		// 脖环绑定
+		if newCow.NeckRingNumber != "" {
+			newCowNeckRing := model.NewNeckRing(pastureId, newCow.NeckRingNumber, newCow, operationSystemUser)
+			if err = tx.Model(new(model.NeckRing)).
+				Create(newCowNeckRing).Error; err != nil {
+				return xerr.WithStack(err)
+			}
+
+			newNeckRingBindLog := model.NewNeckRingBindLog(pastureId, newCow.NeckRingNumber, newCow, userModel.SystemUser, model.EventEnterBind)
+			if err = tx.Model(new(model.NeckRingBindLog)).
+				Create(newNeckRingBindLog).Error; err != nil {
+				return xerr.WithStack(err)
+			}
+		}
+
+		// 记录事件日志
+		cowLogs := s.SubmitEventLog(ctx, pastureId, newCow, pasturePb.EventType_Enter, req)
+		if err = tx.Table(cowLogs.TableName()).Create(cowLogs).Error; err != nil {
+			return xerr.WithStack(err)
+		}
+		return nil
+	}); err != nil {
+		return xerr.WithStack(err)
+	}
+	return nil
+}
+
 func (s *StoreEntry) GroupTransferList(ctx context.Context, req *pasturePb.SearchEventRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchTransferGroupEventResponse, error) {
 	userModel, err := s.GetUserModel(ctx)
 	if err != nil {

+ 4 - 3
module/backend/upload_file.go

@@ -313,13 +313,15 @@ func (s *StoreEntry) ImportExcel2(ctx context.Context, data [][]string, excelHea
 					ts.AbortionAt = 0
 				}
 			case 17:
+				ts.BreedStatus = pasturePb.BreedStatus_UnBreed
+				ts.IsForbiddenMatingKind = pasturePb.IsShow_No
 				if value == "是" {
 					ts.BreedStatus = pasturePb.BreedStatus_No_Mating
+					ts.IsForbiddenMatingKind = pasturePb.IsShow_Ok
 				}
 			case 18:
 				mts, _ := strconv.Atoi(value)
 				ts.MatingTimes = int32(mts)
-
 			case 19:
 				ts.BullNumber = value
 			case 20:
@@ -386,8 +388,7 @@ func (s *StoreEntry) ExecExcelData(ctx context.Context, pastureId int64, dataLis
 			if count > 0 {
 				continue
 			}
-
-			if err := s.CreateEnter(ctx, data); err != nil {
+			if err := s.ExcelImportEnter(ctx, data); err != nil {
 				return err
 			}
 		}