package backend import ( "context" "fmt" "kpt-pasture/model" "kpt-pasture/util" "net/http" "regexp" "strconv" "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, pagination *pasturePb.PaginationModel) (*pasturePb.CalendarToDoResponse, error) { userModel, err := s.GetUserModel(ctx) if err != nil { return nil, xerr.WithStack(err) } whereSql := fmt.Sprintf(" AND pasture_id = %d AND end_day <= %d ", userModel.AppPasture.Id, util.TimeParseLocalEndUnix(time.Now().Format(model.LayoutDate2))) calendarToDoList := make([]*pasturePb.CalendarToDoList, 0) sql := `SELECT a.cow_id,b.pen_name,a.calendar_type_name,DATE_FORMAT(FROM_UNIXTIME(a.plan_day), '%Y-%m-%d') AS plan_day,a.remaining_days,b.lact,b.ear_number FROM ( SELECT cow_id,plan_day,'免疫' as calendar_type_name,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days FROM event_immunization_plan WHERE status = 2` + whereSql + ` UNION ALL SELECT cow_id,plan_day,'同期' as calendar_type_name,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days FROM event_cow_same_time WHERE status = 2` + whereSql + ` UNION ALL SELECT cow_id,plan_day,'孕检' as calendar_type_name,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days FROM event_pregnant_check WHERE status = 2` + whereSql + ` UNION ALL SELECT cow_id,plan_day,'断奶' as calendar_type_name,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days FROM event_weaning WHERE status = 2` + whereSql + ` UNION ALL SELECT cow_id,plan_day,'配种' as calendar_type_name,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days FROM event_mating WHERE status = 2` + whereSql + ` UNION ALL SELECT cow_id,plan_day,'产犊' as calendar_type_name,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days FROM event_calving WHERE status = 2` + whereSql + ` UNION ALL SELECT cow_id,disease_at as plan_day,'疾病' as calendar_type_name,0 AS remaining_days FROM event_cow_disease WHERE diagnosed_result IN (2,3) AND pasture_id = ` + fmt.Sprintf("%d", userModel.AppPasture.Id) + ` ) as a JOIN cow b ON a.cow_id = b.id WHERE 1 = 1 ` completeSql := fmt.Sprintf("%s ORDER BY a.plan_day DESC", sql) if err = s.DB.Raw(completeSql).Find(&calendarToDoList).Error; err != nil { return nil, err } nowTime := time.Now().Format(model.LayoutDate2) todayCompletedSql := `SELECT a.count as count,a.calendar_type_name as calendar_type_name FROM ( SELECT count('cow_id') as count,'免疫' as calendar_type_name FROM event_immunization_plan WHERE status = 1 AND DATE_FORMAT(FROM_UNIXTIME(reality_day), '%Y-%m-%d') = ? UNION ALL SELECT count('cow_id') as count,'同期' as calendar_type_name FROM event_cow_same_time WHERE status = 1 AND DATE_FORMAT(FROM_UNIXTIME(reality_day), '%Y-%m-%d') = ? UNION ALL SELECT count('cow_id') as count,'孕检' as calendar_type_name FROM event_pregnant_check WHERE status = 1 AND DATE_FORMAT(FROM_UNIXTIME(reality_day), '%Y-%m-%d') = ? UNION ALL SELECT count('cow_id') as count,'断奶' as calendar_type_name FROM event_weaning WHERE status = 1 AND DATE_FORMAT(FROM_UNIXTIME(reality_day), '%Y-%m-%d') = ? UNION ALL SELECT count('cow_id') as count,'配种' as calendar_type_name FROM event_mating WHERE status = 1 AND DATE_FORMAT(FROM_UNIXTIME(reality_day), '%Y-%m-%d') = ? UNION ALL SELECT count('cow_id') as count,'产犊' as calendar_type_name FROM event_calving WHERE status = 1 AND DATE_FORMAT(FROM_UNIXTIME(reality_day), '%Y-%m-%d') = ? UNION ALL SELECT count('cow_id') as count,'疾病' as calendar_type_name FROM event_cow_disease WHERE diagnosed_result = 4 AND DATE_FORMAT(FROM_UNIXTIME(curable_at), '%Y-%m-%d') = ? ) as a ` toDayCompletedList := make([]*model.TodayCompletedData, 0) if err = s.DB.Raw(todayCompletedSql, nowTime, nowTime, nowTime, nowTime, nowTime, nowTime, nowTime).Find(&toDayCompletedList).Error; err != nil { return nil, xerr.WithStack(err) } toDayCompletedCountMap := make(map[string]int32) for _, v := range toDayCompletedList { toDayCompletedCountMap[v.CalendarTypeName] = v.Count } list, total := Paginate(calendarToDoList, req, pagination) return &pasturePb.CalendarToDoResponse{ Code: http.StatusOK, Msg: "ok", Data: &pasturePb.CalendarToDoData{ List: list, Progress: ProgressList(calendarToDoList, toDayCompletedCountMap), Total: total, PageSize: pagination.PageSize, Page: pagination.Page, }, }, nil } func (s *StoreEntry) CalendarList(ctx context.Context, req *pasturePb.CalendarRequest) (*pasturePb.CalendarResponse, error) { userModel, err := s.GetUserModel(ctx) if err != nil { return nil, xerr.WithStack(err) } calendarList := make([]*model.Calendar, 0) if err = s.DB.Model(new(model.Calendar)). Where("start_day BETWEEN ? AND ?", req.ShowStartDay, req.ShowEndDay). Where("pasture_id = ?", userModel.AppPasture.Id). Where("is_show = ?", pasturePb.IsShow_Ok). Find(&calendarList).Error; err != nil { return nil, xerr.WithStack(err) } return &pasturePb.CalendarResponse{ Code: http.StatusOK, Msg: "ok", Data: model.CalendarSlice(calendarList).ToPB(), }, nil } func (s *StoreEntry) CalendarTableDetail(ctx context.Context, req *pasturePb.CalendarTableRequest, pagination *pasturePb.PaginationModel) (interface{}, error) { userModel, err := s.GetUserModel(ctx) if err != nil { return nil, xerr.WithStack(err) } newCalendar := &model.Calendar{} if err = s.DB.Model(&model.Calendar{}). Where("calendar_type = ?", req.CalendarType). Where("start_day = ?", req.Start). Where("is_show = ?", pasturePb.IsShow_Ok). Where("pasture_id = ?", userModel.AppPasture.Id). 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, userModel.AppPasture.Id) } func (s *StoreEntry) getCalendarCowList( ctx context.Context, calendarType pasturePb.CalendarType_Kind, showDay string, pagination *pasturePb.PaginationModel, pastureId int64, ) (interface{}, error) { req := &pasturePb.ItemsRequest{EndDay: showDay, CalendarType: calendarType, PastureId: int32(pastureId)} switch calendarType { case pasturePb.CalendarType_Immunisation: // 免疫 return s.ImmunisationCowList(ctx, req, pagination) case pasturePb.CalendarType_PG, pasturePb.CalendarType_RnGH: // 同期 return s.SameTimeCowList(ctx, req, pagination) case pasturePb.CalendarType_Pregnancy_Check: // 孕检 return s.PregnancyCheckCowList(ctx, req, pagination) case pasturePb.CalendarType_WorkOrder: // 工作单 return s.WorkOrderCowList(ctx, req, pagination) case pasturePb.CalendarType_Weaning: // 断奶 return s.WeaningCowList(ctx, req, pagination) case pasturePb.CalendarType_Disease: // 治疗 return s.TreatmentCowList(ctx, req, pagination) case pasturePb.CalendarType_Mating: // 配种 return s.MatingCowList(ctx, req, pagination) case pasturePb.CalendarType_Calving: // 产犊 return s.CalvingCowList(ctx, req, pagination) default: return nil, xerr.New("不支持的日历类型") } } func (s *StoreEntry) ImmunisationCowList(ctx context.Context, req *pasturePb.ItemsRequest, pagination *pasturePb.PaginationModel) (*pasturePb.ImmunizationItemsResponse, error) { userModel, err := s.GetUserModel(ctx) if err != nil { return nil, xerr.WithStack(err) } eventImmunizationPlanList := make([]*model.EventImmunizationPlan, 0) count := int64(0) pref := s.DB.Table(fmt.Sprintf("%s as a", new(model.EventImmunizationPlan).TableName())). Select("a.id,a.cow_id,a.plan_day,a.plan_name as immunization_plan_name,b.pen_name,b.day_age,b.ear_number"). Joins(fmt.Sprintf("JOIN %s AS b on a.cow_id = b.id", new(model.Cow).TableName())). Where("a.status = ?", pasturePb.IsShow_No). Where("a.pasture_id = ?", userModel.AppPasture.Id) if req.StartDay != "" && req.EndDay != "" { startTime := util.TimeParseLocalUnix(req.StartDay) endTime := util.TimeParseLocalEndUnix(req.EndDay) pref.Where("a.plan_day between ? and ?", startTime, endTime) } if req.CowId > 0 { pref.Where("a.cow_id = ?", req.CowId) } if req.ImmunizationId > 0 { pref.Where("a.plan_id = ?", req.ImmunizationId) } if req.PenId > 0 { pref.Where("b.pen_id = ?", req.PenId) } if err = pref.Count(&count). Limit(int(pagination.PageSize)). Offset(int(pagination.PageOffset)). Order("a.plan_day DESC"). Find(&eventImmunizationPlanList).Error; err != nil { return nil, xerr.WithStack(err) } return &pasturePb.ImmunizationItemsResponse{ Code: http.StatusOK, Msg: "ok", Data: &pasturePb.ImmunizationItemsData{ Total: int32(count), Page: pagination.Page, PageSize: pagination.PageSize, Header: map[string]string{ "id": "编号", "cowId": "牛号", "earNumber": "耳标号", "penName": "栏舍", "dayAge": "日龄", "planDay": "免疫时间", "immunizationPlanName": "免疫名称", }, List: model.EventImmunizationPlanSlice(eventImmunizationPlanList).ToPB(), }, }, nil } func (s *StoreEntry) SameTimeCowList(ctx context.Context, req *pasturePb.ItemsRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SameTimeItemResponse, error) { userModel, err := s.GetUserModel(ctx) if err != nil { return nil, xerr.WithStack(err) } sameTimeBodyList := make([]*model.SameTimeItemBody, 0) count := int64(0) pref := s.DB.Table(fmt.Sprintf("%s as a", new(model.EventCowSameTime).TableName())). Select(`a.id,a.cow_id,a.ear_number,a.pen_name,a.status,a.same_time_type,b.breed_status,a.same_time_name,a.plan_day, b.cow_type,b.day_age,b.calving_age,b.abortion_age,b.last_calving_at,b.last_abortion_at,b.lact,b.pen_name,b.mating_times`). Joins("left join cow as b on a.cow_id = b.id"). Where("b.admission_status = ?", pasturePb.AdmissionStatus_Admission). Where("a.pasture_id = ?", userModel.AppPasture.Id). Where("a.status = ?", pasturePb.IsShow_No) if req.EndDay != "" { dateTime := util.TimeParseLocalEndUnix(req.EndDay) pref.Where("a.plan_day <= ?", dateTime) } if req.CowType > 0 { pref.Where("b.cow_type = ?", req.CowType) } if req.SameTimeId > 0 { pref.Where("a.same_time_id = ?", req.SameTimeId) } if req.SameTimeType > 0 { pref.Where("a.same_time_type = ?", req.SameTimeType) } if err = pref.Order("a.plan_day DESC").Count(&count). Limit(int(pagination.PageSize)). Offset(int(pagination.PageOffset)). Find(&sameTimeBodyList).Error; err != nil { return nil, xerr.WithStack(err) } breedStatusMap := s.CowBreedStatusMap() penMap := s.PenMap(ctx, int64(req.PastureId)) sameTimeTypeMap := s.SameTimeTypeMap() return &pasturePb.SameTimeItemResponse{ Code: http.StatusOK, Msg: "ok", Data: &pasturePb.SameTimeItemsData{ Total: int32(count), Page: pagination.Page, PageSize: pagination.PageSize, Header: map[string]string{ "id": "编号", "cowId": "牛号", "earNumber": "耳标号", "breedStatusName": "繁殖状态", "cowTypeName": "牛只类型", "planDayAtFormat": "执行日期", "penName": "栏舍", "lact": "胎次", "calvingAge": "产后天数", "abortionAge": "流产天数", "dayAge": "日龄", "status": "状态", "sameTimeTypeName": "处理方式", "matingTimes": "本胎次配次", "calvingAtFormat": "产犊日期", "abortionAtFormat": "流产日期", "sameTimeName": "同期名称", }, List: model.SameTimeBodySlice(sameTimeBodyList).ToPB(breedStatusMap, penMap, sameTimeTypeMap), }, }, nil } func (s *StoreEntry) PregnancyCheckCowList(ctx context.Context, req *pasturePb.ItemsRequest, pagination *pasturePb.PaginationModel) (*pasturePb.PregnancyCheckItemsResponse, error) { userModel, err := s.GetUserModel(ctx) if err != nil { return nil, xerr.WithStack(err) } newPregnancyCheckItems := make([]*pasturePb.PregnancyCheckItems, 0) var count int64 pref := s.DB.Table(fmt.Sprintf("%s as a", new(model.EventPregnantCheck).TableName())). Select(`a.id,a.cow_id,a.ear_number,a.pen_id,a.status,b.breed_status,b.pen_name,b.cow_type, CASE a.pregnant_check_name WHEN 'pregnant_check_for_first' THEN '初检' WHEN 'pregnant_check_for_second' THEN '复检' ELSE '其他' END AS check_type_name,b.day_age,b.calving_age,b.abortion_age,a.bull_id`). Joins("left join cow as b on a.cow_id = b.id"). Where("b.admission_status = ?", pasturePb.AdmissionStatus_Admission). Where("a.pasture_id = ?", userModel.AppPasture.Id). Where("a.status = ?", pasturePb.IsShow_No) if req.EndDay != "" { dateTime := util.TimeParseLocalEndUnix(req.EndDay) pref.Where("a.plan_day <= ?", dateTime) } if req.PenId > 0 { pref.Where("b.pen_id = ?", req.PenId) } if req.CowType > 0 { pref.Where("a.cow_type = ?", req.CowType) } if req.PregnantCheckType > 0 { pref.Where("a.pregnant_check_name = ?", model.PregnantCheckNameValueMap[req.PregnantCheckType]) } if err = pref.Order("a.plan_day DESC"). Count(&count). Limit(int(pagination.PageSize)). Offset(int(pagination.PageOffset)). Find(&newPregnancyCheckItems).Error; err != nil { return nil, xerr.WithStack(err) } return &pasturePb.PregnancyCheckItemsResponse{ Code: http.StatusOK, Msg: "ok", Data: &pasturePb.PregnancyCheckItemsData{ Total: int32(count), Page: pagination.Page, PageSize: pagination.PageSize, Header: map[string]string{ "id": "编号", "cowId": "牛号", "earNumber": "耳标号", "cowTypeName": "牛只类型", "penName": "栏舍", "lact": "胎次", "dayAge": "日龄", "planDay": "孕检日期", "checkTypeName": "孕检名称", "status": "状态", "matingTimes": "配次", "calvingAtFormat": "产检日期", "matingAtFormat": "配种日期", "matingAge": "配后天数", "bullId": "配种公牛", }, List: newPregnancyCheckItems, }, }, nil } func (s *StoreEntry) WeaningCowList(ctx context.Context, req *pasturePb.ItemsRequest, pagination *pasturePb.PaginationModel) (*pasturePb.WeaningItemsResponse, error) { userModel, err := s.GetUserModel(ctx) if err != nil { return nil, xerr.WithStack(err) } weaningItems := make([]*pasturePb.WeaningItems, 0) count := int64(0) pref := s.DB.Table(fmt.Sprintf("%s as a", new(model.EventWeaning).TableName())). Select(`a.id,a.cow_id,ROUND(b.current_weight / 1000,2) as current_weight,DATE_FORMAT(FROM_UNIXTIME(a.plan_day), '%Y-%m-%d') AS plan_day_format, b.day_age,b.pen_name,b.ear_number,DATE_FORMAT(FROM_UNIXTIME(b.birth_at), '%Y-%m-%d') AS birth_at_format`). Joins("left join cow as b on a.cow_id = b.id"). Where("b.admission_status = ?", pasturePb.AdmissionStatus_Admission). Where("a.status = ?", pasturePb.IsShow_No). Where("a.pasture_id = ?", userModel.AppPasture.Id) if req.EndDay != "" { dateTime := util.TimeParseLocalEndUnix(req.EndDay) pref.Where("a.plan_day <= ?", dateTime) } if err = pref.Order("a.plan_day DESC").Count(&count). Limit(int(pagination.PageSize)). Offset(int(pagination.PageOffset)). Find(&weaningItems).Error; err != nil { return nil, xerr.WithStack(err) } return &pasturePb.WeaningItemsResponse{ Code: http.StatusOK, Msg: "ok", Data: &pasturePb.WeaningItemsData{ Total: int32(count), Page: pagination.Page, PageSize: pagination.PageSize, Header: map[string]string{ "id": "编号", "cowId": "牛号", "earNumber": "耳标号", "penName": "栏舍", "dayAge": "日龄", "planDayFormat": "断奶日期", "birthAtFormat": "出生日期", "currentWeight": "体重", }, List: weaningItems, }, }, nil } func (s *StoreEntry) MatingCowList(ctx context.Context, req *pasturePb.ItemsRequest, pagination *pasturePb.PaginationModel) (*pasturePb.MatingItemsResponse, error) { userModel, err := s.GetUserModel(ctx) if err != nil { return nil, xerr.WithStack(err) } matingItems := make([]*pasturePb.MatingItems, 0) count := int64(0) pref := s.DB.Table(fmt.Sprintf("%s as a", new(model.EventMating).TableName())). Select(`a.id,a.cow_id,a.status,a.ear_number, CASE a.expose_estrus_type WHEN 1 THEN '脖环揭发' WHEN 2 THEN '脚环/计步器' WHEN 3 THEN '自然发情' WHEN 4 THEN '同期' ELSE '其他' END AS expose_estrus_type_name, CASE WHEN last_calving_at = 0 THEN "" ELSE DATE_FORMAT(FROM_UNIXTIME(last_calving_at), '%Y-%m-%d %H:%i:%s') END AS last_calving_at_format, b.breed_status,b.cow_type,b.pen_id,b.day_age,b.calving_age,b.abortion_age,b.pen_name`). Joins("left join cow as b on a.cow_id = b.id"). Where("a.pasture_id = ?", userModel.AppPasture.Id). Where("a.status = ?", pasturePb.IsShow_No) if req.EndDay != "" { dateTime := util.TimeParseLocalEndUnix(req.EndDay) pref.Where("a.plan_day <= ?", dateTime) } if req.PenId > 0 { pref.Where("b.pen_id = ?", req.PenId) } if req.EarNumber != "" { pref.Where("a.ear_number = ?", req.EarNumber) } if err = pref.Order("a.plan_day DESC"). Count(&count). Limit(int(pagination.PageSize)). Offset(int(pagination.PageOffset)). Find(&matingItems).Error; err != nil { return nil, xerr.WithStack(err) } return &pasturePb.MatingItemsResponse{ Code: http.StatusOK, Msg: "ok", Data: &pasturePb.MatingItemsData{ Total: int32(count), Page: pagination.Page, PageSize: pagination.PageSize, Header: map[string]string{ "id": "编号", "cowId": "牛号", "earNumber": "耳标号", "breedStatusName": "繁殖状态", "cowTypeName": "牛只类型", "penName": "栏舍", "lact": "胎次", "calvingAge": "产后天数", "abortionAge": "流产天数", "dayAge": "日龄", "status": "状态", "exposeEstrusTypeName": "发情揭发方式", "lastCalvingAtFormat": "产犊日期", }, List: matingItems, }, }, nil } func (s *StoreEntry) CalvingCowList(ctx context.Context, req *pasturePb.ItemsRequest, pagination *pasturePb.PaginationModel) (*pasturePb.CalvingItemsResponse, error) { userModel, err := s.GetUserModel(ctx) if err != nil { return nil, xerr.WithStack(err) } calvingItems := make([]*pasturePb.CalvingItems, 0) count := int64(0) pref := s.DB.Table(fmt.Sprintf("%s as a", new(model.EventCalving).TableName())). Select(`a.id,a.cow_id,a.ear_number,a.status,b.breed_status,b.pen_id,ROUND(b.current_weight/100,2) as current_weight,DATE_FORMAT(FROM_UNIXTIME(last_mating_at), '%Y-%m-%d') AS mating_at_format, b.day_age,b.last_bull_number as bull_id,b.pen_name,DATEDIFF(NOW(),FROM_UNIXTIME(last_mating_at)) AS mating_age,DATE_FORMAT(FROM_UNIXTIME(a.plan_day), '%Y-%m-%d') AS plan_day`). Joins("left join cow as b on a.cow_id = b.id"). Where("a.status = ?", pasturePb.IsShow_No). Where("b.admission_status = ?", pasturePb.AdmissionStatus_Admission). Where("a.pasture_id = ?", userModel.AppPasture.Id) if req.EndDay != "" { dateTime := util.TimeParseLocalEndUnix(req.EndDay) pref.Where("a.plan_day <= ?", dateTime) } if req.PenId > 0 { pref.Where("b.pen_id = ?", req.PenId) } if err = pref.Order("a.plan_day DESC"). Count(&count). Limit(int(pagination.PageSize)). Offset(int(pagination.PageOffset)). Find(&calvingItems).Error; err != nil { return nil, xerr.WithStack(err) } breedStatusMap := s.CowBreedStatusMap() for _, v := range calvingItems { breedStatusName := "" if breedStatus, ok := breedStatusMap[v.BreedStatus]; ok { breedStatusName = breedStatus } v.BreedStatusName = breedStatusName } return &pasturePb.CalvingItemsResponse{ Code: http.StatusOK, Msg: "ok", Data: &pasturePb.CalvingItemsData{ Total: int32(count), Page: pagination.Page, PageSize: pagination.PageSize, Header: map[string]string{ "id": "编号", "cowId": "牛号", "earNumber": "耳标号", "breedStatusName": "繁殖状态", "penName": "栏舍", "lact": "胎次", "matingAge": "配后天数", "dayAge": "日龄", "status": "是否完成", "bullId": "配种公牛号", "planDay": "预产时间", "matingAtFormat": "配种时间", "currentWeight": "体重", }, List: calvingItems, }, }, nil } // TreatmentCowList 治疗清单 func (s *StoreEntry) TreatmentCowList(ctx context.Context, req *pasturePb.ItemsRequest, pagination *pasturePb.PaginationModel) (interface{}, error) { userModel, err := s.GetUserModel(ctx) if err != nil { return nil, xerr.WithStack(err) } diseaseItems := make([]*model.EventCowDisease, 0) count := int64(0) pref := s.DB.Table(fmt.Sprintf("%s as a", new(model.EventCowDisease).TableName())). Joins(fmt.Sprintf("JOIN %s AS b on a.cow_id = b.id", new(model.Cow).TableName())). Where("a.pasture_id = ?", userModel.AppPasture.Id). Where("a.health_status IN (?)", []pasturePb.HealthStatus_Kind{pasturePb.HealthStatus_Disease, pasturePb.HealthStatus_Treatment}) if req.PenId > 0 { pref.Where("b.pen_id = ?", req.PenId) } if err = pref.Order("a.disease_at DESC"). Count(&count). Limit(int(pagination.PageSize)). Offset(int(pagination.PageOffset)). Find(&diseaseItems).Error; err != nil { return nil, xerr.WithStack(err) } return &pasturePb.EventCowDiseaseResponse{ Code: http.StatusOK, Msg: "ok", Data: &pasturePb.EventCowDiseaseData{ List: model.EventCowDiseaseSlice(diseaseItems).ToPB(s.HealthStatusMap()), Total: int32(count), PageSize: pagination.PageSize, Page: pagination.Page, Header: map[string]string{ "id": "编号", "cowId": "牛号", "earNumber": "耳标", "diagnoseName": "疾病名称", "healthStatus": "健康状态", "lastPrescriptionName": "处方名称", "treatmentDays": "治疗天数", "onsetDays": "发病天数", "penName": "栏舍名称", }, }, }, nil } // WorkOrderCowList 暂时不处理工单业务 func (s *StoreEntry) WorkOrderCowList(ctx context.Context, req *pasturePb.ItemsRequest, pagination *pasturePb.PaginationModel) (interface{}, error) { return nil, nil } // Paginate 函数用于对切片进行分页 func Paginate(slice []*pasturePb.CalendarToDoList, req *pasturePb.CalendarToDoRequest, pagination *pasturePb.PaginationModel) ([]*pasturePb.CalendarToDoList, int32) { newSlice := make([]*pasturePb.CalendarToDoList, 0) if req.CalendarType > 0 { calendarTypeName := CalendarTypeMap()[req.CalendarType] if len(calendarTypeName) > 0 { re := regexp.MustCompile(`[a-zA-Z]`) // 使用正则表达式替换匹配的字母为空字符串 calendarTypeName = re.ReplaceAllString(calendarTypeName, "") for _, v := range slice { if v.CalendarTypeName != calendarTypeName { continue } newSlice = append(newSlice, v) } } } else { newSlice = append(newSlice, slice...) } if req.CowId > 0 { filteredSlice := make([]*pasturePb.CalendarToDoList, 0) for _, v := range newSlice { if v.CowId != req.CowId { continue } filteredSlice = append(filteredSlice, v) } newSlice = filteredSlice } total := int32(len(newSlice)) // 计算起始索引 start := (pagination.Page - 1) * pagination.PageSize // 如果起始索引超出切片长度,返回空切片 if start >= int32(len(newSlice)) { return []*pasturePb.CalendarToDoList{}, total } // 计算结束索引 end := start + pagination.PageSize // 如果结束索引超出切片长度,调整到切片末尾 if end > int32(len(newSlice)) { end = int32(len(newSlice)) } // 返回分页后的切片 return newSlice[start:end], total } func ProgressList(dataList []*pasturePb.CalendarToDoList, toDayCompletedCountMap map[string]int32) map[string]*pasturePb.ProgressList { res := make(map[string]*pasturePb.ProgressList) for cn, cc := range toDayCompletedCountMap { res[cn] = &pasturePb.ProgressList{ CalendarName: cn, CompletedCount: cc, } for _, d := range dataList { calendarName := CalendarTypeMap()[d.CalendarType] if calendarName != cn { continue } res[cn].CalendarTypeKind = d.CalendarType res[cn].IncompleteTotal += 1 } if res[cn].IncompleteTotal > 0 && res[cn].CompletedCount > 0 { res[cn].Progress = strconv.FormatFloat(float64(res[cn].CompletedCount)/float64(res[cn].IncompleteTotal)*100, 'f', 2, 64) } else { res[cn].Progress = "0%" } } return res }