123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- package backend
- import (
- "context"
- "fmt"
- "kpt-tmr-group/model"
- "kpt-tmr-group/pkg/xerr"
- operationPb "kpt-tmr-group/proto/go/backend/operation"
- "net/http"
- "strconv"
- "strings"
- "time"
- )
- func (s *StoreEntry) SearchFormulaEstimateList(ctx context.Context, req *operationPb.SearchFormulaEstimateRequest) (*operationPb.SearchFormulaEstimateResponse, error) {
- startTime, err := time.Parse(model.LayoutTime, req.StartTime)
- if err != nil {
- return nil, xerr.WithStack(err)
- }
- endTime, err := time.Parse(model.LayoutTime, req.EndTime)
- if err != nil {
- return nil, xerr.WithStack(err)
- }
- startTimeUnix := startTime.Unix()
- endTimeUnix := endTime.Unix()
- formulaEstimate := make([]*model.FormulaEstimate, 0)
- var count int64 = 0
- pref := s.DB.Model(new(model.FormulaEstimate))
- if req.Name != "" {
- pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
- }
- if startTimeUnix > 0 && endTimeUnix > 0 && endTimeUnix >= startTimeUnix {
- pref.Where("created_at BETWEEN ? AND ?", startTimeUnix, endTimeUnix)
- }
- if req.SearchType == 1 {
- pref.Where("feed_formula_name = ?", req.Name)
- } else {
- pref.Where("barn_id = ?", req.Name)
- }
- if err = pref.Order("id desc").Count(&count).Limit(int(req.Pagination.PageSize)).Offset(int(req.Pagination.PageOffset)).
- Find(&formulaEstimate).Error; err != nil {
- return nil, xerr.WithStack(err)
- }
- return &operationPb.SearchFormulaEstimateResponse{
- Code: http.StatusOK,
- Msg: "ok",
- Data: &operationPb.SearchFormulaEstimate{
- Page: req.Pagination.Page,
- Total: int32(count),
- PageSize: req.Pagination.PageSize,
- List: model.FormulaEstimateSlice(formulaEstimate).ToPB(),
- },
- }, nil
- }
- func (s *StoreEntry) SearchAnalysisAccuracy(ctx context.Context, req *operationPb.SearchAnalysisAccuracyRequest) (*model.SearchAnalysisAccuracyResponse, error) {
- dataList := &model.CommonValueRatio{
- MaxValue: "",
- MiddleValue: "",
- MinValue: "",
- PastureName: make([]string, 0),
- DateDay: make([]string, 0),
- DataList: make([][]string, 0),
- PastureIds: make([]int32, 0),
- }
- res := &model.SearchAnalysisAccuracyResponse{
- Code: http.StatusOK,
- Msg: "ok",
- Data: &model.AnalysisAccuracyData{
- Chart: &model.Chart{
- MixedFodderAccurateRatio: dataList,
- MixedFodderCorrectRatio: dataList,
- SprinkleFodderAccurateRatio: dataList,
- SprinkleFodderCorrectRatio: dataList,
- },
- Table: &model.Table{
- TitleList: make([]*model.TableList, 0),
- DataList: make([]*interface{}, 0),
- },
- },
- }
- res.Data.Table.TitleList = append(res.Data.Table.TitleList, &model.TableList{
- Name: "title",
- Value: "牧场",
- })
- analysisAccuracy := make([]*model.OptionsAnalysisAccuracy, 0)
- pref := s.DB.Model(new(model.AnalysisAccuracy))
- if req.EndDate != "" && req.StartDate != "" {
- pref.Where("date_day BETWEEN ? AND ?", req.StartDate, req.EndDate)
- }
- if req.CattleParentCategoryId > 0 {
- pref.Where("cattle_parent_category_id = ?", req.CattleParentCategoryId)
- }
- if req.FeedFormulaId > 0 {
- pref.Where("feed_formula_id = ?", req.FeedFormulaId)
- }
- if len(req.PastureIds) > 0 {
- pref.Where("pasture_id IN ?", req.PastureIds)
- }
- if err := pref.Select("pasture_id,pasture_name,date_day,sum(iweight) as all_iweight,sum(lweight) as all_lweight,sum(oweight) as all_oweight,sum(actual_weight_minus) as all_actual_weight_minus,sum(allow_ratio) as all_allow_ratio,sum(alweight) as all_alweight").
- Group("pasture_id,pasture_name,date_day").Order("pasture_name,date_day").Find(&analysisAccuracy).Debug().Error; err != nil {
- return nil, xerr.WithStack(err)
- }
- mixedFodderAccurateRatio := make([]float64, 0)
- mapPastureName := make(map[string]bool, 0)
- mapDateDay := make(map[string]bool, 0)
- mapRatio := make(map[string]bool, 0)
- tableList := make([]*model.TableList, 0)
- for k, v := range analysisAccuracy {
- if _, ok := mapPastureName[v.PastureName]; !ok {
- res.Data.Chart.MixedFodderAccurateRatio.PastureName = append(res.Data.Chart.MixedFodderAccurateRatio.PastureName, v.PastureName)
- res.Data.Chart.MixedFodderAccurateRatio.PastureIds = append(res.Data.Chart.MixedFodderAccurateRatio.PastureIds, int32(v.PastureId))
- mapPastureName[v.PastureName] = true
- }
- dataDayFormat := strings.TrimRight(v.DateDay, "T00:00:00+08:00")
- if _, ok := mapDateDay[v.DateDay]; !ok {
- res.Data.Chart.MixedFodderAccurateRatio.DateDay = append(res.Data.Chart.MixedFodderAccurateRatio.DateDay, dataDayFormat)
- mapDateDay[v.DateDay] = true
- }
- valueRatio1 := float64(v.AllIweight/v.AllLweight) / 100.0
- if _, ok := mapRatio[v.DateDay]; !ok {
- valueRatio := make([]string, 0)
- for _, a := range analysisAccuracy {
- if a.DateDay == v.DateDay {
- valueRatio = append(valueRatio, strconv.FormatFloat(float64(a.AllIweight/a.AllLweight)/100.0, 'f', 2, 64))
- }
- }
- res.Data.Chart.MixedFodderAccurateRatio.DataList = append(res.Data.Chart.MixedFodderAccurateRatio.DataList, valueRatio)
- mapRatio[v.DateDay] = true
- tableList = append(tableList, &model.TableList{
- Name: fmt.Sprintf("date%d", k),
- Value: dataDayFormat,
- })
- }
- mixedFodderAccurateRatio = append(mixedFodderAccurateRatio, valueRatio1)
- }
- mixedFodderAccurateRatioMaxValue, mixedFodderAccurateRatioMiddleValue, mixedFodderAccurateRatioMinValue := calculateRatio(mixedFodderAccurateRatio)
- res.Data.Chart.MixedFodderAccurateRatio.MaxValue = strconv.FormatFloat(mixedFodderAccurateRatioMaxValue, 'f', 2, 64)
- res.Data.Chart.MixedFodderAccurateRatio.MiddleValue = strconv.FormatFloat(mixedFodderAccurateRatioMiddleValue, 'f', 2, 64)
- res.Data.Chart.MixedFodderAccurateRatio.MinValue = strconv.FormatFloat(mixedFodderAccurateRatioMinValue, 'f', 2, 64)
- res.Data.Table.TitleList = append(res.Data.Table.TitleList, tableList...)
- return res, nil
- }
- func calculateRatio(res []float64) (float64, float64, float64) {
- var maxValue, middleValue, minValue, allValue float64 = 0, 0, 0, 0
- for _, v := range res {
- if v > maxValue {
- maxValue = v
- }
- if v <= maxValue {
- minValue = v
- }
- allValue += v
- }
- middleValue = allValue / float64(len(res))
- return maxValue, middleValue, minValue
- }
|