| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307 | package groupimport (	"fmt"	"sort"	"tmr-watch/models"	"tmr-watch/module"	"tmr-watch/pkg/logger/zaplog"	"tmr-watch/pkg/util"	operationPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/operation"	"go.uber.org/zap")// DistributeFeedFormulaService 饲料配方下发牧场端func DistributeFeedFormulaService(req *operationPb.DistributeDataRequest) error {	zaplog.Info("DistributeFeedFormulaService", zap.Any("request", req))	feedTemplateList := make([]*models.FeedTemplate, 0)	for _, b := range req.FeedFormulaList {		feedTemplateList = append(feedTemplateList, models.NewFeedTemplateByGroup(b))	}	return module.DistributeFeedFormula(feedTemplateList)}// CancelDistributeFeedFormulaService 取消饲料配方下发牧场端func CancelDistributeFeedFormulaService(req *models.CancelDistributeFeedFormulaRequest) error {	if len(req.PastureDataId) <= 0 {		return nil	}	return module.CancelDistributeFeedFormula(req.PastureId, req.PastureDataId)}func FeedFormulaIsModifyService(req *models.PastureFeedFormulaIsModifyRequest) error {	return module.FeedFormulaIsModify(req)}// FeedFormulaList 配方列表数据func FeedFormulaList(req *models.FeedListRequest) (*models.FeedFormulaData, error) {	res := &models.FeedFormulaData{		Total:    0,		Page:     req.Page,		PageSize: req.PageSize,		List:     make([]*models.FeedTemplate, 0),	}	dataList, total, err := module.FeedTemplateList(req)	if err != nil {		zaplog.Error("FeedFormulaList", zap.Any("dataList", dataList), zap.Any("err", err))		return nil, err	}	res.Total = int32(total)	res.List = dataList	return res, nil}// FeedList 饲料列表数据func FeedList(req *models.FeedListRequest) (*models.FeedData, error) {	res := &models.FeedData{		Total:    0,		Page:     req.Page,		PageSize: req.PageSize,		List:     make([]*models.Feed, 0),	}	dataList, total, err := module.FeedList(req)	if err != nil {		zaplog.Error("FeedList", zap.Any("dataList", dataList), zap.Any("err", err))		return nil, err	}	res.Total = int32(total)	res.List = dataList	return res, nil}// FeedTemplateDetailList 饲料配方详情列表数据func FeedTemplateDetailList(req *models.FeedListRequest) (*models.FeedDetailData, error) {	res := &models.FeedDetailData{		Total:    0,		Page:     req.Page,		PageSize: req.PageSize,		List:     make([]*models.FeedTemplateDetail, 0),	}	dataList, total, err := module.FeedTemplateDetailList(req)	if err != nil {		zaplog.Error("FeedTemplateDetailList", zap.Any("dataList", dataList), zap.Any("err", err))		return nil, err	}	res.Total = int32(total)	res.List = dataList	return res, nil}// AnalysisAccuracyService 首页准确率分析func AnalysisAccuracyService(req *models.AnalysisAccuracyRequest) (*models.AnalysisAccuracyResponse, error) {	response := &models.AnalysisAccuracyResponse{		MixedFodderAccurateRatio:    make([]*models.PastureAnalysisAccuracyDataValue, 0),		MixedFodderCorrectRatio:     make([]*models.PastureAnalysisAccuracyDataValue, 0),		SprinkleFodderAccurateRatio: make([]*models.PastureAnalysisAccuracyDataValue, 0),		SprinkleFodderCorrectRatio:  make([]*models.PastureAnalysisAccuracyDataValue, 0),	}	// 混料准确率和正确率	mixedFodderDataList, err := module.MixedFodderData(req)	if err != nil {		return nil, err	}	// 撒料准确率和撒料正确率	sprinkleFodderDataList, err := module.SprinkleFodderData(req)	if err != nil {		return nil, err	}	timeList := util.TimeBetween(req.StartDate, req.EndDate)	for _, dayTime := range timeList {		var mixedInfo, sprinkleInfo bool		for _, mixed := range mixedFodderDataList {			myDate := mixed.PlanTime.Format(util.LayoutDateFormat)			if myDate != dayTime {				continue			}			// 混料准确率			mixedAccurateValue := &models.PastureAnalysisAccuracyDataValue{				DayTime: dayTime,				Ratio:   mixed.MixedFodderAccurateRatio,			}			// 混料正确率			mixedCorrectValue := &models.PastureAnalysisAccuracyDataValue{				DayTime: dayTime,				Ratio:   mixed.MixedFodderCorrectRatio,			}			response.MixedFodderAccurateRatio = append(response.MixedFodderAccurateRatio, mixedAccurateValue)			response.MixedFodderCorrectRatio = append(response.MixedFodderCorrectRatio, mixedCorrectValue)			mixedInfo = true		}		if !mixedInfo {			noInfo := &models.PastureAnalysisAccuracyDataValue{				DayTime: dayTime,				Ratio:   0,			}			response.MixedFodderAccurateRatio = append(response.MixedFodderAccurateRatio, noInfo)			response.MixedFodderCorrectRatio = append(response.MixedFodderCorrectRatio, noInfo)		}		for _, sprinkle := range sprinkleFodderDataList {			smyDate := sprinkle.PlanTime.Format(util.LayoutDateFormat)			if smyDate != dayTime {				continue			}			// 撒料准确率			sprinkleAccurateValue := &models.PastureAnalysisAccuracyDataValue{				DayTime: dayTime,				Ratio:   sprinkle.SprinkleFodderAccurateRatio,			}			// 撒料正确率			sprinkleCorrectValue := &models.PastureAnalysisAccuracyDataValue{				DayTime: dayTime,				Ratio:   sprinkle.SprinkleFodderCorrectRatio,			}			response.SprinkleFodderCorrectRatio = append(response.SprinkleFodderCorrectRatio, sprinkleCorrectValue)			response.SprinkleFodderAccurateRatio = append(response.SprinkleFodderAccurateRatio, sprinkleAccurateValue)			sprinkleInfo = true		}		if !sprinkleInfo {			noInfo := &models.PastureAnalysisAccuracyDataValue{				DayTime: dayTime,				Ratio:   0,			}			response.SprinkleFodderAccurateRatio = append(response.SprinkleFodderAccurateRatio, noInfo)			response.SprinkleFodderCorrectRatio = append(response.SprinkleFodderCorrectRatio, noInfo)		}	}	return response, nil}// ProcessAnalysisService 过程分析-执行时间func ProcessAnalysisService(req *models.AnalysisAccuracyRequest) (*models.ProcessAnalysisResponse, error) {	response := &models.ProcessAnalysisResponse{		AddFeedTime:  &models.ProcessAnalysisDataValue{},		SprinkleTime: &models.ProcessAnalysisDataValue{},		StirTime:     &models.ProcessAnalysisDataValue{},	}	// 获取指定时间段内tmr设备列表	tmrList, err := module.TMRList(req)	if err != nil {		return nil, err	}	addFeedList := make([]int, 0)	sprinkleFeedList := make([]int, 0)	stirDelayList := make([]int, 0)	for _, v := range tmrList {		mixedProcessTimeList, err := module.MixedProcessTimeList(req.PastureId, v.Id)		if err != nil {			zaplog.Error("ProcessAnalysisService", zap.Any("MixedProcessTimeList", err))		} else {			tmrMixAllTime := 0			for _, t := range mixedProcessTimeList {				tmrMixAllTime += util.TimeParseToMinutes(t.ProcessTime)			}			addFeedList = append(addFeedList, tmrMixAllTime)		}		sprinkleProcessTimeList, err := module.SprinkleProcessTimeList(req.PastureId, v.Id)		if err != nil {			zaplog.Error("ProcessAnalysisService", zap.Any("SprinkleProcessTimeList", err))		} else {			tmrSprinkleAllTime := 0			for _, s := range sprinkleProcessTimeList {				tmrSprinkleAllTime += util.TimeParseToMinutes(s.ProcessTime)			}			sprinkleFeedList = append(sprinkleFeedList, tmrSprinkleAllTime)		}	}	if len(addFeedList) > 0 {		sort.Ints(addFeedList)		response.AddFeedTime.MaxValue = fmt.Sprintf("%.2f", float64(addFeedList[len(addFeedList)-1])/60)		response.AddFeedTime.UpMiddleValue = fmt.Sprintf("%.2f", util.Median(addFeedList[len(addFeedList)/2+1:])/60)		response.AddFeedTime.MiddleValue = fmt.Sprintf("%.2f", util.Median(addFeedList)/60)		response.AddFeedTime.DownMiddleValue = fmt.Sprintf("%.2f", util.Median(addFeedList[0:len(addFeedList)/2])/60)		response.AddFeedTime.MinValue = fmt.Sprintf("%.2f", float64(addFeedList[0])/60)	}	if len(sprinkleFeedList) > 0 {		sort.Ints(sprinkleFeedList)		response.SprinkleTime.MaxValue = fmt.Sprintf("%.2f", float64(sprinkleFeedList[len(sprinkleFeedList)-1])/60)		response.SprinkleTime.UpMiddleValue = fmt.Sprintf("%.2f", util.Median(sprinkleFeedList[len(sprinkleFeedList)/2+1:])/60)		response.SprinkleTime.MiddleValue = fmt.Sprintf("%.2f", util.Median(sprinkleFeedList)/60)		response.SprinkleTime.DownMiddleValue = fmt.Sprintf("%.2f", util.Median(sprinkleFeedList[0:len(sprinkleFeedList)/2])/60)		response.SprinkleTime.MinValue = fmt.Sprintf("%.2f", float64(sprinkleFeedList[0])/60)	}	if len(stirDelayList) > 0 {		sort.Ints(stirDelayList)		response.StirTime.MaxValue = fmt.Sprintf("%d", stirDelayList[len(stirDelayList)-1])		response.StirTime.UpMiddleValue = fmt.Sprintf("%.2f", util.Median(stirDelayList[len(stirDelayList)/2+1:]))		response.StirTime.MiddleValue = fmt.Sprintf("%.2f", util.Median(stirDelayList))		response.StirTime.DownMiddleValue = fmt.Sprintf("%.2f", util.Median(stirDelayList[0:len(stirDelayList)/2]))		response.StirTime.MinValue = fmt.Sprintf("%d", stirDelayList[0])	}	return response, nil}// SprinkleStatisticsService 撒料统计func SprinkleStatisticsService(req *models.SprinkleStatisticsRequest) ([]*models.SprinkleStatisticsDataList, error) {	sprinkleDataList, err := module.SprinkleStatistics(req)	if err != nil {		return nil, err	}	return sprinkleDataList, nil}func AccountDistributionService(req *models.AccountDistributionRequest) error {	return module.AccountDistribution(req)}func ForageCategoryDistributeService(req *models.CategoryRequest) error {	feedClass := &models.FeedClass{		PastureId:        int64(req.PastureId),		FCCode:           req.Number,		FCName:           req.Name,		Enable:           req.IsShow,		BigFeedClassId:   req.ParentId,		BigFeedClassName: req.ParentName,		GroupId:          int64(req.GroupId),	}	return module.ForageCategoryDistribute(feedClass)}func CattleCategoryDistributeService(req *models.CategoryRequest) error {	cowClass := &models.CowClass{		PastureId:  int64(req.PastureId),		ClassCode:  req.Number,		ClassName:  req.Name,		Enable:     req.IsShow,		ParentId:   req.ParentId,		ParentName: req.ParentName,		GroupId:    int64(req.GroupId),	}	return module.CattleCategoryDistribute(cowClass)}func CategoryDeleteService(keyWord string, req *models.CategoryDeleteRequest) error {	switch keyWord {	case "feed_delete":		return module.ForageCategoryDelete(int64(req.PastureId), int64(req.GroupId))	case "cow_delete":		return module.CowCategoryDelete(int64(req.PastureId), int64(req.GroupId))	}	return nil}func FeedUsageService(req *models.FeedFormulaUsageRequest) (*models.FeedFormulaUsageResponse, error) {	return module.FeedTemplateUsageDetail(req)}func FeedFormulaVersionService(pastureId int64, req *models.FeedFormulaUpdateVersionRequest) error {	return module.FeedFormulaVersion(pastureId, req)}
 |