package backend import ( "context" "errors" "fmt" "kpt-pasture/model" "net/http" "strings" "time" pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow" "gitee.com/xuyiping_admin/pkg/logger/zaplog" "gitee.com/xuyiping_admin/pkg/xerr" "go.uber.org/zap" "gorm.io/gorm" ) // CowDiseaseTreatmentDetail 发病牛只治疗详情列表 func (s *StoreEntry) CowDiseaseTreatmentDetail(ctx context.Context, req *pasturePb.EventCowTreatmentDetailRequest, pagination *pasturePb.PaginationModel) (*pasturePb.EventCowTreatmentDetailResponse, error) { userModel, err := s.GetUserModel(ctx) if err != nil { return nil, xerr.WithStack(err) } eventCowDisease := &model.EventCowDisease{} var count int64 = 0 pref := s.DB.Model(new(model.EventCowDisease)). Where("cow_id = ?", req.CowId). Where("pasture_id = ?", userModel.AppPasture.Id). Where("id = ?", req.Id) if req.DiseaseId > 0 { pref.Where("disease_id = ?", req.DiseaseId) } if req.DiseaseStartAt > 0 && req.DiseaseEndAt > 0 && req.DiseaseStartAt <= req.DiseaseEndAt { pref.Where("disease_at BETWEEN ? AND ?", req.DiseaseStartAt, req.DiseaseEndAt) } if err = pref.Count(&count). Limit(int(pagination.PageSize)). Offset(int(pagination.PageOffset)). Order("id desc"). First(&eventCowDisease).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return &pasturePb.EventCowTreatmentDetailResponse{ Code: http.StatusOK, Msg: "ok", Data: &pasturePb.EventCowTreatmentDetail{ List: make([]*pasturePb.EventCowTreatment, 0), Total: 0, PageSize: pagination.PageSize, Page: pagination.Page, }, }, nil } else { return nil, xerr.WithStack(err) } } eventCowTreatmentList := make([]*model.EventCowTreatment, 0) if err = s.DB.Model(new(model.EventCowTreatment)). Where("cow_disease_id = ?", req.Id). Where("cow_id = ?", req.CowId). Order("id desc"). Find(&eventCowTreatmentList).Error; err != nil { return nil, xerr.WithStack(err) } return &pasturePb.EventCowTreatmentDetailResponse{ Code: http.StatusOK, Msg: "ok", Data: &pasturePb.EventCowTreatmentDetail{ List: model.EventCowTreatmentSlice(eventCowTreatmentList).ToPB(eventCowDisease), Total: int32(count), PageSize: pagination.Page, Page: pagination.PageSize, }, }, nil } func (s *StoreEntry) DiseaseSuggestPrescription(ctx context.Context, diseaseId int64) (*pasturePb.ConfigOptionsListResponse, error) { userModel, err := s.GetUserModel(ctx) if err != nil { return nil, xerr.WithStack(err) } res := make([]*pasturePb.ConfigOptionsList, 0) prescriptionList := make([]*model.Prescription, 0) if err = s.DB.Model(new(model.Prescription)). Where("is_show = ?", pasturePb.IsShow_Ok). Where("pasture_id = ?", userModel.AppPasture.Id). Find(&prescriptionList).Error; err != nil { return nil, xerr.WithStack(err) } for _, v := range prescriptionList { disabled := false if strings.Contains(v.ApplicableDisease, fmt.Sprintf("%d", diseaseId)) { disabled = true } res = append(res, &pasturePb.ConfigOptionsList{ Value: v.Id, Label: v.Name, Disabled: disabled, }) } return &pasturePb.ConfigOptionsListResponse{ Code: http.StatusOK, Msg: "ok", Data: res, }, nil } func (s *StoreEntry) CowDiseaseCurable(ctx context.Context, req *pasturePb.EventCowCurableRequest) error { userModel, err := s.GetUserModel(ctx) if err != nil { return xerr.WithStack(err) } eventCowDiseaseList := make([]*model.EventCowDisease, 0) if err = s.DB.Where("id IN ?", req.Ids). Where("health_status = ?", pasturePb.HealthStatus_Treatment). Where("pasture_id = ?", userModel.AppPasture.Id). Find(&eventCowDiseaseList).Error; err != nil { zaplog.Error("GetEventCowDiseaseList", zap.Any("err", err), zap.Any("req", req)) return xerr.Custom("异常数据") } if len(eventCowDiseaseList) == 0 { return nil } operationUser, err := s.GetSystemUserById(ctx, int64(req.OperationId)) if err != nil { return xerr.Customf("该用户不存在: %d", req.OperationId) } eventCowTreatmentList := make([]*model.EventCowTreatment, 0) for _, v := range eventCowDiseaseList { newEventCowTreatment := model.NewEventCowCurableTreatment(userModel.AppPasture.Id, userModel.SystemUser, operationUser, v, req.Remarks, int64(req.CurableAt)) eventCowTreatmentList = append(eventCowTreatmentList, newEventCowTreatment) } if len(eventCowTreatmentList) <= 0 { return nil } if err = s.DB.Transaction(func(tx *gorm.DB) error { for _, eventCowDisease := range eventCowDiseaseList { eventCowDisease.EventCurableUpdate(int64(req.CurableAt)) if err = tx.Model(eventCowDisease). Select("health_status", "diagnosed_result", "curable_at"). Where("id = ?", eventCowDisease.Id). Where("health_status = ?", pasturePb.HealthStatus_Treatment). Updates(eventCowDisease).Error; err != nil { return xerr.WithStack(err) } cow, err := s.GetCowInfoByEarNumber(ctx, userModel.AppPasture.Id, eventCowDisease.EarNumber) if err != nil { return xerr.WithStack(err) } // 更新牛只健康状态 cow.EventHealthStatusUpdate(pasturePb.HealthStatus_Curable) if err = tx.Model(cow). Select("health_status"). Where("id = ?", eventCowDisease.CowId). Updates(cow).Error; err != nil { return xerr.WithStack(err) } // 更新发病事件日志 cowLogs := &model.EventCowLog{CowId: cow.Id} curableAtFormat := "" if eventCowDisease.CurableAt > 0 { curableAtFormat = time.Unix(eventCowDisease.CurableAt, 0).Local().Format(model.LayoutDate2) } curableAtParse := time.Unix(eventCowDisease.CurableAt, 0).Local() diseaseAtParse := time.Unix(eventCowDisease.DiseaseAt, 0).Local() curableDays := int64(curableAtParse.Sub(diseaseAtParse).Hours() / 24) if err = tx.Table(cowLogs.TableName()). Where("event_type = ?", pasturePb.EventType_Disease). Where("event_at = ?", eventCowDisease.DiseaseAt). Update("event_description", fmt.Sprintf("疾病名称: %s; 状态: 已治愈; 治愈时间: %s; 治疗天数: %d;", eventCowDisease.DiseaseName, curableAtFormat, curableDays)). Error; err != nil { return xerr.WithStack(err) } } if err = tx.Model(new(model.EventCowTreatment)).Create(eventCowTreatmentList).Error; err != nil { return xerr.WithStack(err) } return nil }); err != nil { return xerr.WithStack(err) } return nil } // NeckRingUpdateHealth 更新牛只脖环揭发疾病信息 func (s *StoreEntry) NeckRingUpdateHealth(ctx context.Context, pastureId, cowId int64, operationUser *model.SystemUser) error { neckRingHealthWarning := &model.NeckRingHealthWarning{} if err := s.DB.Model(new(model.NeckRingHealthWarning)). Where("pasture_id = ?", pastureId). Where("is_show = ?", pasturePb.IsShow_Ok). Where("cow_id = ?", cowId). First(neckRingHealthWarning).Error; err != nil { return xerr.WithStack(err) } neckRingHealth := &model.NeckRingHealth{} if err := s.DB.Model(new(model.NeckRingHealth)). Where("pasture_id = ?", pastureId). Where("is_show = ?", pasturePb.IsShow_Ok). Where("id = ?", neckRingHealthWarning.NeckRingHealthId). First(neckRingHealth).Error; err != nil { return xerr.WithStack(err) } if err := s.DB.Transaction(func(tx *gorm.DB) error { neckRingHealthWarning.EventDiseaseUpdate() if err := tx.Model(neckRingHealthWarning). Select("is_show", pasturePb.IsShow_Ok). Where("id = ?", neckRingHealthWarning.Id). Updates(neckRingHealthWarning).Error; err != nil { return xerr.WithStack(err) } neckRingHealth.EventDiseaseUpdate(operationUser) if err := tx.Model(neckRingHealth). Select("is_show", "check_user_id", "check_user_name", "check_result", "check_at"). Where("id = ?", neckRingHealth.Id). Updates(neckRingHealth).Error; err != nil { return xerr.WithStack(err) } return nil }); err != nil { return xerr.WithStack(err) } return nil }