package backend import ( "context" "fmt" "kpt-pasture/model" "strings" "time" "gitee.com/xuyiping_admin/pkg/xerr" pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow" ) func (s *StoreEntry) SubmitEventLog( ctx context.Context, pastureId int64, cow *model.Cow, eventType pasturePb.EventType_Kind, exposeEstrusType pasturePb.ExposeEstrusType_Kind, req interface{}, ) *model.EventCowLog { var ( desc, remarks = "", "" eventTypeName = s.EventTypeMap()[eventType] eventAt = int64(0) eventCategoryMap = s.eventCategoryMap() penMap = s.PenMap(ctx, pastureId) cowTypeMap = s.CowTypeMap() operationUser = &model.SystemUser{} ) switch eventType { case pasturePb.EventType_Enter: data := req.(*pasturePb.EventEnterRequest) eventAt = int64(data.EnterAt) remarks = data.Remarks sourceMap := s.CowSourceMap() sex := "公" if data.Sex == pasturePb.Genders_Female { sex = "母" } desc = fmt.Sprintf("入场时间: %s; 性别: %s; 栏舍: %s; 体重: %f kg; price: %f; 来源: %s;", time.Unix(eventAt, 0).Format(model.LayoutDate2), sex, penMap[cow.PenId].Name, data.Weight, data.Price, sourceMap[cow.SourceId], ) case pasturePb.EventType_Transfer_Ben: data := req.(*model.EventTransferGroup) transferAt, _ := time.Parse(model.LayoutDate2, data.TransferDate) eventAt = transferAt.Unix() remarks = data.Remarks operationUser.Id = data.OperationId operationUser.Name = data.OperationName desc = fmt.Sprintf("转出栏舍: %s; 转入栏舍: %s", penMap[data.PenOutId].Name, penMap[data.PenInId].Name) case pasturePb.EventType_Body_Score: case pasturePb.EventType_Pregnancy_Check: data := req.(*pasturePb.EventPregnantCheckBatch) for _, v := range data.Item { if int64(v.CowId) != cow.Id { continue } eventAt = int64(v.PregnantCheckAt) if v.PregnantCheckResult == pasturePb.PregnantCheckResult_Pregnant { desc += fmt.Sprintf("孕检方式: %s; 孕检结果: %s", s.PregnantCheckMethodMap()[v.PregnantCheckMethod], s.MatingResultMap()[pasturePb.MatingResult_Pregnant]) } if v.PregnantCheckResult == pasturePb.PregnantCheckResult_UnPregnant { desc += fmt.Sprintf("孕检方式: %s", s.PregnantCheckMethodMap()[v.PregnantCheckMethod]) if cow.BreedStatus == pasturePb.BreedStatus_Abort { desc += fmt.Sprintf("; 复检结果: %s", s.MatingResultMap()[pasturePb.MatingResult_Abort]) } if cow.BreedStatus == pasturePb.BreedStatus_Empty { desc += fmt.Sprintf("; 孕检结果: %s", s.MatingResultMap()[pasturePb.MatingResult_Empty]) } } operationUser.Id = int64(v.OperationId) operationUser.Name = v.OperationName remarks = v.Remarks } case pasturePb.EventType_Estrus: data := req.(*model.EventEstrus) eventAt = data.PlanDay isMating := "是" if data.IsMating == pasturePb.IsShow_Ok { isMating = "否" } desc = fmt.Sprintf("发情揭发方式:%s;是否配种:%s;", s.ExposeEstrusTypeMap()[exposeEstrusType], isMating) operationUser.Id = int64(data.OperationId) operationUser.Name = data.OperationName remarks = data.Remarks case pasturePb.EventType_Calving: data := req.(*pasturePb.EventCalving) eventAt = int64(data.CalvingAt) desc = fmt.Sprintf("怀孕天数:%d;难产等级: %s;产子数量: %d", cow.PregnancyAge, s.CalvingLevelMap()[data.CalvingLevel], data.ChildNumber) for _, v := range data.CalfItemList { if v.CowId > 0 { desc += fmt.Sprintf(";犊牛ID: %d; 出生体重: %f", v.CowId, v.Weight) } } if data.IsInducingChildbirth == pasturePb.IsShow_Ok { desc += fmt.Sprintf("; 难产原因: %s", s.DystociaReasonMap()[data.DystociaReason]) } operationUser.Id = int64(data.OperationId) operationUser.Name = data.OperationName remarks = data.Remarks case pasturePb.EventType_Seme_Time: data := req.(*pasturePb.EventSameTime) eventAt = int64(data.SameTimeAt) desc = fmt.Sprintf("同期名称: %s;激素名称: %s;剂量:%f;操作人: %s", data.SameTimeTypeName, data.DrugsName, data.Usage, data.OperationName) operationUser.Id = int64(data.OperationId) operationUser.Name = data.OperationName remarks = data.Remarks case pasturePb.EventType_Mating: data := req.(*pasturePb.EventMating) eventAt = int64(data.MatingAt) desc = fmt.Sprintf("配种公牛: %s;发情揭发方式:%s;配种结果:未知", data.FrozenSemenNumber, s.ExposeEstrusTypeMap()[exposeEstrusType]) operationUser.Id = int64(data.OperationId) operationUser.Name = data.OperationName remarks = data.Remarks case pasturePb.EventType_Birth: eventAt = cow.BirthAt desc = fmt.Sprintf("出生体重: %fKG;母号:%s;父号: %s", float32(cow.BirthWeight)/1000, cow.MotherNumber, cow.LastBullNumber) case pasturePb.EventType_Death: data := req.(*model.EventDeparture) eventAt = data.DepartureAt desc = fmt.Sprintf("死亡原因: %s", data.ReasonName) operationUser.Id = data.OperationId operationUser.Name = data.OperationName case pasturePb.EventType_Transfer_Out: case pasturePb.EventType_Transfer_In: case pasturePb.EventType_Out: data := req.(*model.EventDeparture) eventAt = data.DepartureAt desc = fmt.Sprintf("淘汰原因: %s", data.ReasonName) operationUser.Id = data.OperationId operationUser.Name = data.OperationName case pasturePb.EventType_Immunication: case pasturePb.EventType_Weaning: data := req.(*pasturePb.EventWeaningBatchRequest) eventAt = int64(data.WeaningAt) operationUser.Id = int64(data.OperationId) operationUser.Name = data.OperationName remarks = data.Remarks for _, v := range data.Item { if int64(v.CowId) == cow.Id { desc = fmt.Sprintf("具体体重: %f", v.Weight) break } } case pasturePb.EventType_Sale: case pasturePb.EventType_Abort: data := req.(*pasturePb.EventAbortionRequest) eventAt = int64(data.AbortionAt) operationUser.Id = int64(data.OperationId) operationUser.Name = data.OperationName remarks = data.Remarks desc = fmt.Sprintf("流产原因: %s", s.AbortionReasonsMap()[data.AbortionReasons]) case pasturePb.EventType_Weight: data := req.(*pasturePb.EventWeight) eventAt = int64(data.WeightAt) operationUser.Id = int64(data.OperationId) operationUser.Name = data.OperationName remarks = data.Remarks desc = fmt.Sprintf("日龄: %d;具体体重: %f kg", cow.DayAge, data.Weight) case pasturePb.EventType_Castrated: case pasturePb.EventType_Insect_Repellent: } newEventCowLogModel := &model.EventCowLogModel{ Cow: cow, CowTypeName: cowTypeMap[cow.CowType], OperationUser: operationUser, EventCategoryKind: eventCategoryMap[eventType], EventAt: eventAt, EventType: eventType, EventTypeName: eventTypeName, Description: desc, Remarks: remarks, PenName: penMap[cow.PenId].Name, } return model.NewEventCowLog(newEventCowLogModel) } func (s *StoreEntry) UpdateMatingResultEventCowLogByCowId(ctx context.Context, cowId int64, newResult string) error { 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_type = ?", pasturePb.EventType_Mating). Order("id desc"). First(newEventCowLog).Error; err != nil { return xerr.WithStack(err) } else { 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_type = ?", pasturePb.EventType_Mating). Update("event_description", desc).Error; err != nil { return xerr.WithStack(err) } } return nil }