package backend import ( "context" "fmt" "kpt-pasture/model" "net/http" "time" pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow" "gitee.com/xuyiping_admin/pkg/xerr" ) // CalendarToDoList 获取日历待办列表 func (s *StoreEntry) CalendarToDoList(ctx context.Context, req *pasturePb.CalendarToDoRequest) (*pasturePb.CalendarToDoResponse, error) { // todo 待办列表 return &pasturePb.CalendarToDoResponse{ Code: http.StatusOK, Message: "ok", Data: nil, }, nil } func (s *StoreEntry) CalendarList(ctx context.Context, req *pasturePb.CalendarRequest) (*pasturePb.CalendarResponse, error) { calendarList := make([]*model.Calendar, 0) if err := s.DB.Model(&model.Calendar{}). Where("show_day >= ?", req.ShowStartDay). Where("show_day <= ?", req.ShowEndDay). Where("is_show = ?", pasturePb.IsShow_Ok). Find(&calendarList).Error; err != nil { return nil, xerr.WithStack(err) } return &pasturePb.CalendarResponse{ Code: http.StatusOK, Message: "ok", Data: model.CalendarSlice(calendarList).ToPB(), }, nil } func (s *StoreEntry) CalendarTableDetail( ctx context.Context, req *pasturePb.CalendarTableRequest, pagination *pasturePb.PaginationModel, ) (interface{}, error) { if req.Start != time.Now().Format(model.LayoutDate2) { return nil, xerr.New("参数错误") } newCalendar := &model.Calendar{} if err := s.DB.Model(&model.Calendar{}). Where("calendar_type = ?", req.CalendarType). Where("show_day = ?", req.Start). Where("is_show = ?", pasturePb.IsShow_Ok). First(newCalendar).Error; err != nil { return nil, xerr.WithStack(err) } if newCalendar.Id == 0 { return nil, xerr.New("不存在该日历数据") } return s.getCalendarCowList(ctx, req.CalendarType, req.Start, pagination) } func (s *StoreEntry) getCalendarCowList( ctx context.Context, calendarType pasturePb.CalendarType_Kind, startDate string, pagination *pasturePb.PaginationModel) (*model.CalendarResponse, error) { switch calendarType { case pasturePb.CalendarType_Immunisation: // 免疫 return s.ImmunisationCowList(ctx, startDate, pagination) case pasturePb.CalendarType_PG, pasturePb.CalendarType_RnGH: // 同期 return s.SameTimeCowList(ctx, startDate, pagination, calendarType) case pasturePb.CalendarType_Pregnancy_Check: // 孕检 return s.PregnancyCheckCowList(ctx, startDate, pagination) case pasturePb.CalendarType_WorkOrder: // 工作单 return s.WorkOrderCowList(ctx, startDate, pagination) case pasturePb.CalendarType_Weaning: // 断奶 return s.WeaningCowList(ctx, startDate, pagination) case pasturePb.CalendarType_Treatment: // 治疗 return s.TreatmentCowList(ctx, startDate, pagination) case pasturePb.CalendarType_Mating: // 配种 return s.MatingCowList(ctx, startDate, pagination) default: return nil, xerr.New("不支持的日历类型") } } func (s *StoreEntry) ImmunisationCowList(ctx context.Context, dateTime string, pagination *pasturePb.PaginationModel) (*model.CalendarResponse, error) { immunizationPlanCowList := make([]*model.CowImmunizationPlan, 0) count := int64(0) if err := s.DB.Model(&model.CowImmunizationPlan{}). Where("plan_start_time <= ?", dateTime). Where("status = ?", pasturePb.IsShow_No). Order("id desc").Count(&count).Limit(int(pagination.PageSize)).Offset(int(pagination.PageOffset)). Find(&immunizationPlanCowList).Error; err != nil { return nil, xerr.WithStack(err) } return &model.CalendarResponse{ Code: http.StatusOK, Message: "ok", Data: &model.CalendarData{ Total: int32(count), Page: pagination.Page, PageSize: pagination.PageSize, Header: model.ImmunizationCalendarHeader{ Id: "编号", CowId: "牛号", PlanStartTime: "免疫开始时间", ImmunizationPlanName: "免疫名称", Status: "状态", }, List: model.ImmunizationPlanCowSlice(immunizationPlanCowList).ToPB(), }, }, nil } func (s *StoreEntry) SameTimeCowList(ctx context.Context, dateTime string, pagination *pasturePb.PaginationModel, calendarType pasturePb.CalendarType_Kind) (*model.CalendarResponse, error) { sameTimeBodyList := make([]*model.SameTimeBody, 0) count := int64(0) pref := s.DB.Table(fmt.Sprintf("%s as a", new(model.EventCowSameTime).TableName())). Select("a.id,a.cow_id,a.status,b.breed_status,b.cow_type,b.pen_id,b.day_age,b.calving_age,b.abortion_age"). Joins("left join cow as b on a.cow_id = b.id"). Where("b.is_remove = ?", pasturePb.IsShow_No). Where("a.plan_day <= ?", dateTime). Where("a.status = ?", pasturePb.IsShow_No) if calendarType == pasturePb.CalendarType_PG { pref.Where("a.same_time_type = ?", calendarType) } if calendarType == pasturePb.CalendarType_RnGH { pref.Where("a.same_time_type = ?", calendarType) } if err := pref.Order("a.id desc").Count(&count). Limit(int(pagination.PageSize)). Offset(int(pagination.PageOffset)). Find(&sameTimeBodyList).Error; err != nil { return nil, xerr.WithStack(err) } cowTypeMap := s.CowTypeMap() breedStatusMap := s.CowBreedStatusMap() penMap := s.PenMap(ctx) return &model.CalendarResponse{ Code: http.StatusOK, Message: "ok", Data: &model.CalendarData{ Total: int32(count), Page: pagination.Page, PageSize: pagination.PageSize, Header: model.SameTimeHeader{ Id: "编号", CowId: "牛号", BreedStatusName: "繁殖状态", CowTypeName: "牛只类型", PenName: "栏舍", Lact: "胎次", CalvingAge: "产后天数", AbortionAge: "流产天数", DayAge: "日龄", Status: "状态", }, List: model.SameTimeBodySlice(sameTimeBodyList).ToPB(cowTypeMap, breedStatusMap, penMap), }, }, nil } func (s *StoreEntry) PregnancyCheckCowList(ctx context.Context, dateTime string, pagination *pasturePb.PaginationModel) (*model.CalendarResponse, error) { return nil, nil } func (s *StoreEntry) WorkOrderCowList(ctx context.Context, dateTime string, pagination *pasturePb.PaginationModel) (*model.CalendarResponse, error) { return nil, nil } func (s *StoreEntry) WeaningCowList(ctx context.Context, dateTime string, pagination *pasturePb.PaginationModel) (*model.CalendarResponse, error) { weaningBodyList := make([]*model.WeaningBody, 0) count := int64(0) pref := s.DB.Table(fmt.Sprintf("%s as a", new(model.EventCowSameTime).TableName())). Select("a.*,b.day_age"). Joins("left join cow as b on a.cow_id = b.id"). Where("b.is_remove = ?", pasturePb.IsShow_No). Where("a.plan_day <= ?", dateTime). Where("a.status = ?", pasturePb.IsShow_No) if err := pref.Order("a.id desc").Count(&count). Limit(int(pagination.PageSize)). Offset(int(pagination.PageOffset)). Find(&weaningBodyList).Error; err != nil { return nil, xerr.WithStack(err) } return &model.CalendarResponse{ Code: http.StatusOK, Message: "ok", Data: &model.CalendarData{ Total: int32(count), Page: pagination.Page, PageSize: pagination.PageSize, Header: model.WeaningHeader{ Id: "编号", CowId: "牛号", PenName: "栏舍", PlanDay: "断奶日期", DayAge: "日龄", Status: "状态", }, List: weaningBodyList, }, }, nil } func (s *StoreEntry) TreatmentCowList(ctx context.Context, dateTime string, pagination *pasturePb.PaginationModel) (*model.CalendarResponse, error) { return nil, nil } func (s *StoreEntry) MatingCowList(ctx context.Context, dateTime string, pagination *pasturePb.PaginationModel) (*model.CalendarResponse, error) { cowMatingBodyList := make([]*model.CowMatingBody, 0) count := int64(0) pref := s.DB.Table(fmt.Sprintf("%s as a", new(model.EventCowSameTime).TableName())). Select("a.id,a.cow_id,a.status,b.breed_status,b.cow_type,b.pen_id,b.day_age,b.calving_age,b.abortion_age"). Joins("left join cow as b on a.cow_id = b.id"). Where("b.is_remove = ?", pasturePb.IsShow_No). Where("a.plan_day <= ?", dateTime). Where("a.status = ?", pasturePb.IsShow_No) if err := pref.Order("a.id desc").Count(&count). Limit(int(pagination.PageSize)). Offset(int(pagination.PageOffset)). Find(&cowMatingBodyList).Error; err != nil { return nil, xerr.WithStack(err) } cowTypeMap := s.CowTypeMap() breedStatusMap := s.CowBreedStatusMap() penMap := s.PenMap(ctx) return &model.CalendarResponse{ Code: http.StatusOK, Message: "ok", Data: &model.CalendarData{ Total: int32(count), Page: pagination.Page, PageSize: pagination.PageSize, Header: model.SameTimeHeader{ Id: "编号", CowId: "牛号", BreedStatusName: "繁殖状态", CowTypeName: "牛只类型", PenName: "栏舍", Lact: "胎次", CalvingAge: "产后天数", AbortionAge: "流产天数", DayAge: "日龄", Status: "状态", }, List: model.CowMatingBodySlice(cowMatingBodyList).ToPB(cowTypeMap, breedStatusMap, penMap), }, }, nil }