package service import ( "fmt" "github.com/astaxie/beego/logs" "kpt.xdmy/apiserver/model" "kpt.xdmy/apiserver/model/http" "kpt.xdmy/pkg/util" "strconv" "time" ) type pastureStatistics struct { Psum float64 `gorm:"column:psum"` Name string `gorm:"column:name"` PastureId int `gorm:"column:pastureId"` } type monthBudget struct { MonthBudget float64 `gorm:"column:monthBudget"` Name string `gorm:"column:name"` } //各牧场年度用水量对比 func (s *Service) GetWaterYieldByPasture(center, startTime, endTime string) (*http.StatementResp, error) { resp := new(http.StatementResp) layout := "2006-01-02" startdate, err := time.Parse(layout, startTime) if err != nil { logs.Error("时间转换失败:", err) } enddate, err := time.Parse(layout, endTime) if err != nil { logs.Error("时间转换失败:", err) } enddate = enddate.AddDate(0, 1, -1) nowYearList := make([]*pastureStatistics, 0) lastYearList := make([]*pastureStatistics, 0) sqlstr := `SELECT round( IFNULL(SUM(w.waterConsumption),0) ,2)psum, p.name as name FROM water w INNER JOIN measure ms ON w.measureId = ms.id INNER JOIN pasture p ON ms.pastureId = p.id WHERE (w.date between ? and ? ) AND ms.useType = '1级表' and p.name <> '现代牧业' and (p.center = ? or ? = '' ) and p.IsEnergy = 0 GROUP BY ms.pastureId ` err = s.d.DB.Debug().Raw(sqlstr, startdate.Format("2006-01-02"), enddate.Format("2006-01-02"), center, center).Find(&nowYearList).Error if err != nil { logs.Error(err) return nil, err } err = s.d.DB.Raw(sqlstr, startdate.AddDate(-1, 0, 0).Format("2006-01-02"), enddate.AddDate(-1, 0, 0).Format("2006-01-02"), center, center).Find(&lastYearList).Error if err != nil { logs.Error(err) return nil, err } pastureList := make([]*model.Pasture, 0) err = s.d.DB.Where(" vendor = 1 ").Where(" IsEnergy = 0").Order("id").Find(&pastureList).Error if err != nil { logs.Error(err) return resp, err } var pastureName []string var nowYearData, lastYearData []float64 var all float64 for _, nowYear := range nowYearList { pastureName = append(pastureName, nowYear.Name) nowYearData = append(nowYearData, util.Round(nowYear.Psum, 2)) all += nowYear.Psum exist := false for _, lastYear := range lastYearList { if lastYear.Name == nowYear.Name { exist = true lastYearData = append(lastYearData, util.Round(lastYear.Psum, 2)) break } } if !exist { lastYearData = append(lastYearData, 0) } } for _, pasture := range pastureList { exist := false for _, name := range pastureName { if pasture.Name == name { exist = true break } } if !exist { pastureName = append(pastureName, pasture.Name) nowYearData = append(nowYearData, 0) lastYearData = append(lastYearData, 0) } } resp.Pasture = pastureName resp.LastYear = lastYearData resp.NowYear = nowYearData resp.All = util.Round(all, 2) return resp, nil } func (s *Service) GetWaterSingleCowByPasture(center, startTime, endTime string) (*http.StatementResp, error) { resp := new(http.StatementResp) layout := "2006-01-02" startdate, err := time.Parse(layout, startTime) if err != nil { logs.Error("时间转换失败:", err) } enddate, err := time.Parse(layout, endTime) if err != nil { logs.Error("时间转换失败:", err) } enddate = enddate.AddDate(0, 1, -1) nowYearList := make([]*pastureStatistics, 0) lastYearList := make([]*pastureStatistics, 0) sqlstr := `SELECT round( IFNULL(SUM(w.waterConsumption),0) ,2)psum, p.name FROM water w INNER JOIN measure ms ON w.measureId = ms.id INNER JOIN pasture p ON ms.pastureId = p.id WHERE (w.date between ? and ? ) AND ms.useType = '1级表' and p.name <> '现代牧业' and (p.center = ? or ? = '' ) and p.IsEnergy = 0 GROUP BY ms.pastureId desc ` err = s.d.DB.Raw(sqlstr, startdate.Format("2006-01-02"), enddate.Format("2006-01-02"), center, center).Find(&nowYearList).Error if err != nil { logs.Error(err) return nil, err } err = s.d.DB.Raw(sqlstr, startdate.AddDate(-1, 0, 0).Format("2006-01-02"), enddate.AddDate(-1, 0, 0).Format("2006-01-02"), center, center).Find(&lastYearList).Error if err != nil { logs.Error(err) return nil, err } pastureList := make([]*model.Pasture, 0) err = s.d.DB.Where(" vendor = 1 ").Where(" IsEnergy = 0").Order("id").Find(&pastureList).Error if err != nil { logs.Error(err) return resp, err } cowNumList := make([]*model.FeedSumAndPasture, 0) lastCowNumList := make([]*model.FeedSumAndPasture, 0) err = s.d.DB.Raw(`select sum(cowNum)cowNum ,p.name from feed_sum fd join pasture p on p.id = fd.pastureid where fd.feedDay between ? and ? and (p.center = ? or ? = '' ) group by pastureid `, startdate.Format("2006-01-02"), enddate.Format("2006-01-02"), center, center).Find(&cowNumList).Error if err != nil { logs.Error(err) return nil, err } err = s.d.DB.Raw(`select sum(cowNum)cowNum ,p.name from feed_sum fd join pasture p on p.id = fd.pastureid where fd.feedDay between ? and ? and (p.center = ? or ? = '' ) group by pastureid `, startdate.AddDate(-1, 0, 0).Format("2006-01-02"), enddate.AddDate(-1, 0, 0).Format("2006-01-02"), center, center).Find(&lastCowNumList).Error if err != nil { logs.Error(err) return nil, err } cowNum := make(map[string]int64, 0) var cowNumAll, lastCowNumAll int64 for _, item := range cowNumList { cowNumAll += item.FeedSum.CowNum cowNum[item.Pasture.Name] = item.FeedSum.CowNum } lastCowNum := make(map[string]int64, 0) for _, item := range lastCowNumList { lastCowNumAll += item.FeedSum.CowNum lastCowNum[item.Pasture.Name] = item.FeedSum.CowNum } var pastureName []string var nowYearData, lastYearData []float64 var all, lastAll float64 for _, nowYear := range nowYearList { pastureName = append(pastureName, nowYear.Name) if _, ok := cowNum[nowYear.Name]; ok { all += nowYear.Psum nowYearData = append(nowYearData, nowYear.Psum/float64(cowNum[nowYear.Name])) } else { nowYearData = append(nowYearData, 0) } exist := false for _, lastYear := range lastYearList { if lastYear.Name == nowYear.Name { exist = true if _, ok := lastCowNum[lastYear.Name]; ok { lastAll += nowYear.Psum lastYearData = append(lastYearData, lastYear.Psum/float64(lastCowNum[nowYear.Name])) } else { lastYearData = append(lastYearData, 0) } break } } if !exist { lastYearData = append(lastYearData, 0) } } for _, pasture := range pastureList { exist := false for _, name := range pastureName { if pasture.Name == name { exist = true break } } if !exist { pastureName = append(pastureName, pasture.Name) nowYearData = append(nowYearData, 0) lastYearData = append(lastYearData, 0) } } //resp.Pasture = append(resp.Pasture, "集团") resp.Pasture = append(resp.Pasture, pastureName...) //resp.LastYear = append(resp.LastYear, util.Round(lastAll/float64(lastCowNumAll), 3)) //resp.LastYear = append(resp.LastYear, lastYearData...) for _, item := range lastYearData { resp.LastYear = append(resp.LastYear, util.Round(item, 3)) } //resp.NowYear = append(resp.NowYear, util.Round(all/float64(cowNumAll), 3)) for _, item := range nowYearData { resp.NowYear = append(resp.NowYear, util.Round(item, 3)) } resp.All = all resp.Line = util.Round(all/float64(cowNumAll), 3) return resp, nil } //单头牛水费 func (s *Service) GetWaterRateByPasture(center, startTime, endTime string) (*http.GetWaterRateByPastureResp, error) { resp := new(http.GetWaterRateByPastureResp) layout := "2006-01-02" startdate, err := time.Parse(layout, startTime) if err != nil { logs.Error("时间转换失败:", err) } enddate, err := time.Parse(layout, endTime) if err != nil { logs.Error("时间转换失败:", err) } enddate = enddate.AddDate(0, 1, -1) cowNumList := make([]*model.FeedSumAndPasture, 0) err = s.d.DB.Raw(`select sum(cowNum)cowNum ,p.name from feed_sum fd join pasture p on p.id = fd.pastureid where fd.feedDay between ? and ? and (p.center = ? or ? = '' ) group by pastureid `, startdate.Format("2006-01-02"), enddate.Format("2006-01-02"), center, center).Find(&cowNumList).Error if err != nil { logs.Error(err) return nil, err } cowNum := make(map[string]int64, 0) var cowNumAll int64 for _, item := range cowNumList { //cowNumAll += cowNum[feequery.Pasture.Name] cowNum[item.Pasture.Name] = item.FeedSum.CowNum } pastureList := make([]*model.Pasture, 0) err = s.d.DB.Where(" vendor = 1 ").Where(" IsEnergy = 0").Order("id").Find(&pastureList).Error if err != nil { logs.Error(err) return resp, err } feequeryList := make([]*model.FeeQueryAndPasture, 0) err = s.d.DB.Debug().Raw(`select sum(HSL) HSL ,p.name from feequery fd join pasture p on p.id = fd.pastureid where fd.Date between ? and ? and fd.FYLX ='水费' and (p.center = ? or ? = '' ) group by fd.pastureId order by p.id`, startdate.Format("2006-01"), enddate.Format("2006-01"), center, center).Find(&feequeryList).Error if err != nil { logs.Error(err) return resp, err } var pastureName []string var hslList []float64 var all float64 for _, feequery := range feequeryList { pastureName = append(pastureName, feequery.Pasture.Name) var hsl float64 hsl, err = strconv.ParseFloat(feequery.HSL, 64) if err != nil { logs.Error("转换失败:", err) hslList = append(hslList, 0) } if _, ok := cowNum[feequery.Name]; ok { all += hsl cowNumAll += cowNum[feequery.Pasture.Name] hslList = append(hslList, hsl/float64(cowNum[feequery.Pasture.Name])) } else { hslList = append(hslList, 0) } } for _, item := range pastureList { exist := false for _, f := range feequeryList { if item.Name == f.Name { exist = true break } } if !exist { pastureName = append(pastureName, item.Name) hslList = append(hslList, 0) } } resp.Pasture = append(resp.Pasture, "集团") resp.Pasture = append(resp.Pasture, pastureName...) resp.Actual = append(resp.Actual, util.Round(all/float64(cowNumAll), 3)) //select 1748193.91/8271863 for _, item := range hslList { resp.Actual = append(resp.Actual, util.Round(item, 3)) } resp.Line = util.Round(all/float64(cowNumAll), 3) //resp.Actual = append(resp.Actual, hslList...) return resp, err } func (s *Service) GetWaterRateCompleteByPasture(center, startTime, endTime string) (*http.GetWaterRateCompleteByPastureResp, error) { resp := new(http.GetWaterRateCompleteByPastureResp) layout := "2006-01-02" startdate, err := time.Parse(layout, startTime) if err != nil { logs.Error("时间转换失败:", err) } enddate, err := time.Parse(layout, endTime) if err != nil { logs.Error("时间转换失败:", err) } feequeryList := make([]*model.FeeQueryAndPasture, 0) err = s.d.DB.Raw(`select ifnull(sum(HSL),0) HSL ,p.name from feequery fd join pasture p on p.id = fd.pastureid where fd.Date between ? and ? and fd.FYLX ='水费' and (p.center = ? or ? = '' ) group by fd.pastureId`, startdate.Format("2006-01"), enddate.Format("2006-01"), center, center).Find(&feequeryList).Error if err != nil { logs.Error(err) return resp, err } monthBudgetList := make([]*monthBudget, 0) err = s.d.DB.Raw(`select ifnull(sum(monthBudget),0) monthBudget,p.name from month_budget mb join pasture p on p.id = mb.pastureId where mb.feeType = '水费' and mb.budgetMonth between ? and ? and (p.center = ? or ? = '' ) group by mb.pastureId`, startdate.Format("2006-01"), enddate.Format("2006-01"), center, center).Find(&monthBudgetList).Error if err != nil { logs.Error(err) return resp, err } pastureList := make([]*model.Pasture, 0) err = s.d.DB.Where(" vendor = 1 ").Where(" IsEnergy = 0").Order("id").Find(&pastureList).Error if err != nil { logs.Error(err) return resp, err } var pastureName []string var budgetList, actualList, complete []float64 var budgetAll, actualAll float64 for _, monthBudget := range monthBudgetList { pastureName = append(pastureName, monthBudget.Name) budgetList = append(budgetList, util.Round(monthBudget.MonthBudget, 2)) budgetAll += monthBudget.MonthBudget exist := false var hsl float64 for _, feequery := range feequeryList { if feequery.Name == monthBudget.Name { exist = true hsl, err = strconv.ParseFloat(feequery.HSL, 64) if err != nil { actualList = append(actualList, 0) logs.Error("转换失败:", err) } else { actualAll += hsl actualList = append(actualList, util.Round(hsl, 2)) continue } break } } if !exist { actualList = append(actualList, 0) } //预算减实际除预算加1 if monthBudget.MonthBudget > 0 && hsl > 0 { complete = append(complete, util.Round(((monthBudget.MonthBudget-hsl)/monthBudget.MonthBudget+1)*100, 2)) } else { complete = append(complete, 0) } } for _, pasture := range pastureList { exist := false for _, name := range pastureName { if pasture.Name == name { exist = true break } } if !exist { pastureName = append(pastureName, pasture.Name) actualList = append(actualList, 0) budgetList = append(budgetList, 0) complete = append(complete, 0) } } resp.Pasture = append(resp.Pasture, "集团") resp.Pasture = append(resp.Pasture, pastureName...) resp.Actual = append(resp.Actual, util.Round(actualAll, 2)) resp.Actual = append(resp.Actual, actualList...) resp.Budget = append(resp.Budget, util.Round(budgetAll, 2)) resp.Budget = append(resp.Budget, budgetList...) if budgetAll > 0 && actualAll > 0 { resp.Complete = append(resp.Complete, util.Round(((budgetAll-actualAll)/budgetAll+1)*100, 2)) } else { resp.Complete = append(resp.Complete, 0) } resp.Complete = append(resp.Complete, complete...) return resp, nil } type dosagePerCow struct { Psum float64 `gorm:"column:psum"` Date string `gorm:"column:date"` Name string `gorm:"column:name"` CowNum int64 `gorm:"column:cowNum"` } //每月单头牛用水量对比 func (s *Service) GetWaterPerHeadByPasture(pastureId, startTime, endTime string) (map[string]interface{}, error) { layout := "2006-01-02" startdate, err := time.Parse(layout, startTime) if err != nil { logs.Error("时间转换失败:", err) } enddate, err := time.Parse(layout, endTime) if err != nil { logs.Error("时间转换失败:", err) } enddate = enddate.AddDate(0, 1, -1) dosagePerCowList := make([]*dosagePerCow, 0) err = s.d.DB.Debug().Raw(`SELECT round( IFNULL(SUM(w.waterConsumption),0) ,2)psum, p.name,DATE_FORMAT( w.date, '%Y-%m') date, ifnull((select sum(cowNum) from feed_sum where DATE_FORMAT( feedDay, '%Y-%m') = DATE_FORMAT( w.date, '%Y-%m') and pastureId = p.id ),0)cowNum FROM water w INNER JOIN measure ms ON w.measureId = ms.id INNER JOIN pasture p ON ms.pastureId = p.id WHERE (w.date between ? and ? ) AND ms.useType = '1级表' and p.name <> '现代牧业' and FIND_IN_SET(p.id,?) GROUP BY DATE_FORMAT( w.date, '%Y-%m'),ms.pastureId order by DATE_FORMAT( w.date, '%Y-%m'),p.name asc `, startdate.Format("2006-01-02"), enddate.Format("2006-01-02"), pastureId).Find(&dosagePerCowList).Error if err != nil { logs.Error(err) return nil, err } data := dosagePerCowFormat(dosagePerCowList) return data, nil } func dosagePerCowFormat(dosagePerCowList []*dosagePerCow) map[string]interface{} { var dateList, pastureNameList []string var dataList []interface{} data := make(map[string]interface{}, 0) data["data1"] = []string{} data["data2"] = []string{} data["data3"] = []interface{}{} for _, item := range dosagePerCowList { if len(dateList) == 0 { dateList = append(dateList, item.Date) } dateExist := false for _, date := range dateList { if date == item.Date { dateExist = true break } } if !dateExist { dateList = append(dateList, item.Date) } if len(pastureNameList) == 0 { pastureNameList = append(pastureNameList, item.Name) } pastureNameExist := false for _, pastureName := range pastureNameList { if pastureName == item.Name { pastureNameExist = true break } } if !pastureNameExist { pastureNameList = append(pastureNameList, item.Name) } } for _, pastureName := range pastureNameList { var number []float64 for _, date := range dateList { exist := false for _, item := range dosagePerCowList { if item.Date == date && item.Name == pastureName { exist = true number = append(number, util.Round(item.Psum/float64(item.CowNum), 2)) break } } if !exist { number = append(number, 0) } } dataList = append(dataList, number) } data["data1"] = pastureNameList data["data2"] = dateList data["data3"] = dataList return data } //----------------------- //各牧场年度用电量对比 func (s *Service) GetElectricityYieldByPasture(center, startTime, endTime string) (*http.StatementResp, error) { resp := new(http.StatementResp) layout := "2006-01-02" startdate, err := time.Parse(layout, startTime) if err != nil { logs.Error("时间转换失败:", err) } enddate, err := time.Parse(layout, endTime) if err != nil { logs.Error("时间转换失败:", err) } enddate = enddate.AddDate(0, 1, -1) nowYearList := make([]*pastureStatistics, 0) lastYearList := make([]*pastureStatistics, 0) sqlstr := `SELECT round( IFNULL(SUM(w.elecConsumption),0) ,2)psum, p.name as name FROM electricity w INNER JOIN measure ms ON w.measureId = ms.id INNER JOIN pasture p ON ms.pastureId = p.id WHERE (w.date between ? and ? ) AND ms.useType = '1级表' and p.name <> '现代牧业' and (p.center = ? or ? = '' ) GROUP BY ms.pastureId ` err = s.d.DB.Debug().Raw(sqlstr, startdate.Format("2006-01-02"), enddate.Format("2006-01-02"), center, center).Find(&nowYearList).Error if err != nil { logs.Error(err) return nil, err } err = s.d.DB.Raw(sqlstr, startdate.AddDate(-1, 0, 0).Format("2006-01-02"), enddate.AddDate(-1, 0, 0).Format("2006-01-02"), center, center).Find(&lastYearList).Error if err != nil { logs.Error(err) return nil, err } pastureList := make([]*model.Pasture, 0) err = s.d.DB.Where(" vendor = 1 ").Where(" IsEnergy = 0").Order("id").Find(&pastureList).Error if err != nil { logs.Error(err) return resp, err } var pastureName []string var nowYearData, lastYearData []float64 var all float64 for _, nowYear := range nowYearList { pastureName = append(pastureName, nowYear.Name) nowYearData = append(nowYearData, util.Round(nowYear.Psum, 2)) all += nowYear.Psum exist := false for _, lastYear := range lastYearList { if lastYear.Name == nowYear.Name { exist = true lastYearData = append(lastYearData, util.Round(lastYear.Psum, 2)) break } } if !exist { lastYearData = append(lastYearData, 0) } } for _, pasture := range pastureList { exist := false for _, name := range pastureName { if pasture.Name == name { exist = true break } } if !exist { pastureName = append(pastureName, pasture.Name) nowYearData = append(nowYearData, 0) lastYearData = append(lastYearData, 0) } } resp.Pasture = pastureName resp.LastYear = lastYearData resp.NowYear = nowYearData resp.All = util.Round(all, 2) return resp, nil } func (s *Service) GetElectricitySingleCowByPasture(center, startTime, endTime string) (*http.StatementResp, error) { resp := new(http.StatementResp) layout := "2006-01-02" startdate, err := time.Parse(layout, startTime) if err != nil { logs.Error("时间转换失败:", err) } enddate, err := time.Parse(layout, endTime) if err != nil { logs.Error("时间转换失败:", err) } enddate = enddate.AddDate(0, 1, -1) nowYearList := make([]*pastureStatistics, 0) lastYearList := make([]*pastureStatistics, 0) sqlstr := `SELECT round( IFNULL(SUM(w.elecConsumption),0) ,2)psum, p.name,ms.pastureId FROM electricity w INNER JOIN measure ms ON w.measureId = ms.id INNER JOIN pasture p ON ms.pastureId = p.id WHERE (w.date between ? and ? ) AND ms.useType = '1级表' and ms.meterType = '电表' and p.name <> '现代牧业' and (p.center = ? or ? = '' ) and p.vendor = 1 and IsEnergy = 0 GROUP BY ms.pastureId ` err = s.d.DB.Raw(sqlstr, startdate.Format("2006-01-02"), enddate.Format("2006-01-02"), center, center).Find(&nowYearList).Error if err != nil { logs.Error(err) return nil, err } err = s.d.DB.Raw(sqlstr, startdate.AddDate(-1, 0, 0).Format("2006-01-02"), enddate.AddDate(-1, 0, 0).Format("2006-01-02"), center, center).Find(&lastYearList).Error if err != nil { logs.Error(err) return nil, err } pastureList := make([]*model.Pasture, 0) err = s.d.DB.Where(" vendor = 1 ").Where(" IsEnergy = 0").Order("id").Find(&pastureList).Error if err != nil { logs.Error(err) return resp, err } cowNumList := make([]*model.FeedSumAndPasture, 0) lastCowNumList := make([]*model.FeedSumAndPasture, 0) err = s.d.DB.Raw(`select sum(cowNum)cowNum ,p.name,fd.pastureId from feed_sum fd join pasture p on p.id = fd.pastureid where fd.feedDay between ? and ? and (p.center = ? or ? = '' ) and p.vendor = 1 and IsEnergy = 0 group by p.id `, startdate.Format("2006-01-02"), enddate.Format("2006-01-02"), center, center).Find(&cowNumList).Error if err != nil { logs.Error(err) return nil, err } err = s.d.DB.Raw(`select sum(cowNum)cowNum ,p.name,fd.pastureId from feed_sum fd join pasture p on p.id = fd.pastureid where fd.feedDay between ? and ? and (p.center = ? or ? = '' ) and p.vendor = 1 and IsEnergy = 0 group by p.id `, startdate.AddDate(-1, 0, 0).Format("2006-01-02"), enddate.AddDate(-1, 0, 0).Format("2006-01-02"), center, center).Find(&lastCowNumList).Error if err != nil { logs.Error(err) return nil, err } cowNum := make(map[string]int64, 0) var cowNumAll, lastCowNumAll int64 for _, item := range cowNumList { //cowNumAll += item.FeedSum.CowNum cowNum[item.Pasture.Name] = item.FeedSum.CowNum } lastCowNum := make(map[string]int64, 0) for _, item := range lastCowNumList { //lastCowNumAll += item.FeedSum.CowNum lastCowNum[item.Pasture.Name] = item.FeedSum.CowNum } var pastureName []string var nowYearData, lastYearData []float64 var all, lastAll float64 for _, nowYear := range nowYearList { pastureName = append(pastureName, nowYear.Name) if _, ok := cowNum[nowYear.Name]; ok { all += nowYear.Psum cowNumAll += cowNum[nowYear.Name] nowYearData = append(nowYearData, util.Round(nowYear.Psum/float64(cowNum[nowYear.Name]), 3)) } else { nowYearData = append(nowYearData, 0) } exist := false for _, lastYear := range lastYearList { if lastYear.Name == nowYear.Name { exist = true if _, ok := lastCowNum[lastYear.Name]; ok { lastAll += nowYear.Psum lastCowNumAll += lastCowNum[nowYear.Name] lastYearData = append(lastYearData, util.Round(lastYear.Psum/float64(lastCowNum[nowYear.Name]), 3)) } else { lastYearData = append(lastYearData, 0) } break } } if !exist { lastYearData = append(lastYearData, 0) } } for _, pasture := range pastureList { exist := false for _, name := range pastureName { if pasture.Name == name { exist = true break } } if !exist { pastureName = append(pastureName, pasture.Name) nowYearData = append(nowYearData, 0) lastYearData = append(lastYearData, 0) } } resp.Pasture = append(resp.Pasture, "集团") resp.Pasture = append(resp.Pasture, pastureName...) resp.LastYear = append(resp.LastYear, util.Round(lastAll/float64(lastCowNumAll), 3)) //resp.LastYear = append(resp.LastYear, lastYearData...) for _, item := range lastYearData { resp.LastYear = append(resp.LastYear, util.Round(item, 3)) } resp.NowYear = append(resp.NowYear, util.Round(all/float64(cowNumAll), 3)) num := 0.0 for _, item := range nowYearData { num += item resp.NowYear = append(resp.NowYear, util.Round(item, 3)) } fmt.Println(num) resp.All = util.Round(all, 3) cowNumAll1 := float64(cowNumAll) resp.Line = util.Round(all/cowNumAll1, 3) return resp, nil } //单头牛电费 func (s *Service) GetElectricityRateByPasture(center, startTime, endTime string) (*http.GetWaterRateByPastureResp, error) { resp := new(http.GetWaterRateByPastureResp) layout := "2006-01-02" startdate, err := time.Parse(layout, startTime) if err != nil { logs.Error("时间转换失败:", err) } enddate, err := time.Parse(layout, endTime) if err != nil { logs.Error("时间转换失败:", err) } enddate = enddate.AddDate(0, 1, -1) cowNumList := make([]*model.FeedSumAndPasture, 0) err = s.d.DB.Raw(`select sum(cowNum)cowNum ,p.name from feed_sum fd join pasture p on p.id = fd.pastureid where fd.feedDay between ? and ? and (p.center = ? or ? = '' ) group by pastureid `, startdate.Format("2006-01-02"), enddate.Format("2006-01-02"), center, center).Find(&cowNumList).Error if err != nil { logs.Error(err) return nil, err } cowNum := make(map[string]int64, 0) var cowNumAll int64 for _, item := range cowNumList { cowNum[item.Pasture.Name] = item.FeedSum.CowNum } pastureList := make([]*model.Pasture, 0) err = s.d.DB.Where(" vendor = 1 ").Where(" IsEnergy = 0").Order("id").Find(&pastureList).Error if err != nil { logs.Error(err) return resp, err } feequeryList := make([]*model.FeeQueryAndPasture, 0) err = s.d.DB.Debug().Raw(`select sum(HSL) HSL ,p.name from feequery fd join pasture p on p.id = fd.pastureid where fd.Date between ? and ? and fd.FYLX ='电费' and (p.center = ? or ? = '' ) group by fd.pastureId order by p.id`, startdate.Format("2006-01"), enddate.Format("2006-01"), center, center).Find(&feequeryList).Error if err != nil { logs.Error(err) return resp, err } var pastureName []string var hslList []float64 var all float64 for _, feequery := range feequeryList { pastureName = append(pastureName, feequery.Pasture.Name) var hsl float64 hsl, err = strconv.ParseFloat(feequery.HSL, 64) if err != nil { logs.Error("转换失败:", err) hslList = append(hslList, 0) } if _, ok := cowNum[feequery.Name]; ok { all += hsl cowNumAll += cowNum[feequery.Pasture.Name] hslList = append(hslList, hsl/float64(cowNum[feequery.Pasture.Name])) } else { hslList = append(hslList, 0) } } for _, item := range pastureList { exist := false for _, f := range feequeryList { if item.Name == f.Name { exist = true break } } if !exist { pastureName = append(pastureName, item.Name) hslList = append(hslList, 0) } } resp.Pasture = append(resp.Pasture, "集团") resp.Pasture = append(resp.Pasture, pastureName...) resp.Actual = append(resp.Actual, util.Round(all/float64(cowNumAll), 3)) for _, item := range hslList { resp.Actual = append(resp.Actual, util.Round(item, 3)) } resp.Line = util.Round(all/float64(cowNumAll), 3) //resp.Actual = append(resp.Actual, hslList...) return resp, err } func (s *Service) GetElectricityRateCompleteByPasture(center, startTime, endTime string) (*http.GetWaterRateCompleteByPastureResp, error) { resp := new(http.GetWaterRateCompleteByPastureResp) layout := "2006-01-02" startdate, err := time.Parse(layout, startTime) if err != nil { logs.Error("时间转换失败:", err) } enddate, err := time.Parse(layout, endTime) if err != nil { logs.Error("时间转换失败:", err) } enddate = enddate.AddDate(0, 1, -1) feequeryList := make([]*model.FeeQueryAndPasture, 0) err = s.d.DB.Raw(`select ifnull(sum(HSL),0) HSL ,p.name from feequery fd join pasture p on p.id = fd.pastureid where fd.Date between ? and ? and fd.FYLX ='电费' and (p.center = ? or ? = '' ) group by fd.pastureId`, startdate.Format("2006-01"), enddate.Format("2006-01"), center, center).Find(&feequeryList).Error if err != nil { logs.Error(err) return resp, err } monthBudgetList := make([]*monthBudget, 0) err = s.d.DB.Raw(`select ifnull(sum(monthBudget),0) monthBudget,p.name from month_budget mb join pasture p on p.id = mb.pastureId where mb.feeType = '电费' and mb.budgetMonth between ? and ? and (p.center = ? or ? = '' ) group by mb.pastureId`, startdate.Format("2006-01"), enddate.Format("2006-01"), center, center).Find(&monthBudgetList).Error if err != nil { logs.Error(err) return resp, err } pastureList := make([]*model.Pasture, 0) err = s.d.DB.Where(" vendor = 1 ").Where(" IsEnergy = 0").Order("id").Find(&pastureList).Error if err != nil { logs.Error(err) return resp, err } var pastureName []string var budgetList, actualList, complete []float64 var budgetAll, actualAll float64 for _, monthBudget := range monthBudgetList { pastureName = append(pastureName, monthBudget.Name) budgetList = append(budgetList, util.Round(monthBudget.MonthBudget/10000, 2)) budgetAll += monthBudget.MonthBudget exist := false var hsl float64 for _, feequery := range feequeryList { if feequery.Name == monthBudget.Name { exist = true hsl, err = strconv.ParseFloat(feequery.HSL, 64) if err != nil { actualList = append(actualList, 0) logs.Error("转换失败:", err) } else { actualAll += hsl actualList = append(actualList, util.Round(hsl/10000, 2)) continue } break } } if !exist { actualList = append(actualList, 0) } //预算减实际除预算加1 if monthBudget.MonthBudget > 0 && hsl > 0 { complete = append(complete, util.Round(((monthBudget.MonthBudget-hsl)/monthBudget.MonthBudget+1)*100, 2)) } else { complete = append(complete, 0) } } for _, pasture := range pastureList { exist := false for _, name := range pastureName { if pasture.Name == name { exist = true break } } if !exist { pastureName = append(pastureName, pasture.Name) actualList = append(actualList, 0) budgetList = append(budgetList, 0) complete = append(complete, 0) } } //resp.Pasture = append(resp.Pasture, "集团") resp.Pasture = append(resp.Pasture, pastureName...) //resp.Actual = append(resp.Actual, util.Round(actualAll/10000, 2)) resp.Actual = append(resp.Actual, actualList...) //resp.Budget = append(resp.Budget, util.Round(budgetAll/10000, 2)) resp.Budget = append(resp.Budget, budgetList...) //if budgetAll > 0 && actualAll > 0 { // resp.Complete = append(resp.Complete, util.Round(((budgetAll-actualAll)/budgetAll+1)*100, 2)) //} else { // resp.Complete = append(resp.Complete, 0) //} resp.Complete = append(resp.Complete, complete...) return resp, nil } //每月单头牛用电量对比 func (s *Service) GetElectricityPerHeadByPasture(pastureId, startTime, endTime string) (map[string]interface{}, error) { layout := "2006-01-02" startdate, err := time.Parse(layout, startTime) if err != nil { logs.Error("时间转换失败:", err) } enddate, err := time.Parse(layout, endTime) if err != nil { logs.Error("时间转换失败:", err) } enddate = enddate.AddDate(0, 1, -1) dosagePerCowList := make([]*dosagePerCow, 0) err = s.d.DB.Debug().Raw(`SELECT round( IFNULL(SUM(w.elecConsumption),0) ,2)psum, p.name,DATE_FORMAT( w.date, '%Y-%m') date, ifnull((select sum(cowNum) from feed_sum where DATE_FORMAT( feedDay, '%Y-%m') = DATE_FORMAT( w.date, '%Y-%m') and pastureId = p.id ),0)cowNum FROM electricity w INNER JOIN measure ms ON w.measureId = ms.id INNER JOIN pasture p ON ms.pastureId = p.id WHERE (w.date between ? and ? ) AND ms.useType = '1级表' and p.name <> '现代牧业' and FIND_IN_SET(p.id,?) GROUP BY DATE_FORMAT( w.date, '%Y-%m'),ms.pastureId order by DATE_FORMAT( w.date, '%Y-%m'),p.id `, startdate.Format("2006-01-02"), enddate.Format("2006-01-02"), pastureId).Find(&dosagePerCowList).Error if err != nil { logs.Error(err) return nil, err } data := dosagePerCowFormat(dosagePerCowList) return data, nil } //--------------------------------------- 维修 //各牧场年度维修对比 func (s *Service) GetWxYieldByPasture(deptname, center, startTime, endTime string) (*http.StatementResp, error) { resp := new(http.StatementResp) layout := "2006-01-02" startdate, err := time.Parse(layout, startTime) if err != nil { logs.Error("时间转换失败:", err) } enddate, err := time.Parse(layout, endTime) if err != nil { logs.Error("时间转换失败:", err) } enddate = enddate.AddDate(0, 1, -1) nowYearList := make([]*pastureStatistics, 0) //lastYearList := make([]*pastureStatistics, 0) sqlstr := `SELECT round(ifnull(SUM( pu.sumPrice - pu.quitNumber * pu.price),0),4) psum, p.name FROM partuse pu INNER JOIN bigpartuse bpu ON pu.bigId = bpu.id INNER JOIN pasture p ON bpu.pastureId = p.id #INNER JOIN department dpt #on dpt.id = bpu.departmentId WHERE bpu.useType <> 3 and p.IsEnergy = 0 AND (SELECT name FROM department d WHERE d.id=bpu.departmentId) not in ('挤奶处','牧场办公室','财务部','餐厅','信息处') AND ( pu.useTypeV = '维修' OR pu.useTypeV = '保养' ) and ( bpu.receiveTime between ? and ?) AND (bpu.departmentId in (select id from department where pastureId = bpu.pastureId and name = ? ) or if(? = 1 ,bpu.departmentId in(select id from department where pastureId = bpu.pastureId and name != '挤奶处' and name != '牧场办公室' ),0=1) or ?='' ) and p.name <> '现代牧业' and (p.center = ? or ? = '' ) and pu.dflag != 1 GROUP BY bpu.pastureId ` err = s.d.DB.Debug().Raw(sqlstr, startdate.Format("2006-01-02"), enddate.Format("2006-01-02"), deptname, deptname, deptname, center, center).Find(&nowYearList).Error if err != nil { logs.Error(err) return nil, err } monthBudgetList := make([]*monthBudget, 0) err = s.d.DB.Debug().Raw(`select ifnull(sum(monthBudget),0) monthBudget,p.name from month_budget mb join pasture p on p.id = mb.pastureId where mb.feeType = '维修费' and mb.budgetMonth between ? and ? AND (mb.deptId in (select id from department where pastureId = mb.pastureId and name = ? ) or if(? = 1 ,mb.deptId in(select id from department where pastureId = mb.pastureId and name != '挤奶处' and name != '牧场办公室' ),0=1) or ?='' ) and (p.center = ? or ? = '' ) group by mb.pastureId`, startdate.Format("2006-01-02"), enddate.Format("2006-01-02"), deptname, deptname, deptname, center, center).Find(&monthBudgetList).Error if err != nil { logs.Error(err) return resp, err } //err = s.d.DB.Raw(sqlstr, startdate.AddDate(-1, 0, 0).Format("2006-01-02"), // enddate.AddDate(-1, 0, 0).Format("2006-01-02"), deptname, deptname, deptname, deptname, deptname, center, center).Find(&lastYearList).Error //if err != nil { // logs.Error(err) // return nil, err //} pastureList := make([]*model.Pasture, 0) err = s.d.DB.Where(" vendor = 1 ").Where("IsEnergy = 0").Order("id").Find(&pastureList).Error if err != nil { logs.Error(err) return resp, err } var pastureName []string var nowYearData, lastYearData []float64 var all float64 for _, nowYear := range nowYearList { pastureName = append(pastureName, nowYear.Name) nowYearData = append(nowYearData, util.Round(nowYear.Psum, 2)) all += nowYear.Psum //exist := false //for _, lastYear := range lastYearList { // if lastYear.Name == nowYear.Name { // exist = true // // break // } //} //if !exist { // lastYearData = append(lastYearData, 0) //} } for _, pasture := range pastureList { exist := false for _, name := range pastureName { if pasture.Name == name { exist = true break } } if !exist { pastureName = append(pastureName, pasture.Name) nowYearData = append(nowYearData, 0) //lastYearData = append(lastYearData, 0) } } for _, name := range pastureName { exist := false for _, monthBudget := range monthBudgetList { if monthBudget.Name == name { exist = true lastYearData = append(lastYearData, util.Round(monthBudget.MonthBudget, 2)) break } } if !exist { lastYearData = append(lastYearData, 0) } } resp.Pasture = pastureName resp.LastYear = lastYearData resp.NowYear = nowYearData resp.All = util.Round(all, 2) return resp, nil } func (s *Service) GetWxSingleCowByPasture(center, startTime, endTime string) (*http.StatementResp, error) { resp := new(http.StatementResp) layout := "2006-01-02" startdate, err := time.Parse(layout, startTime) if err != nil { logs.Error("时间转换失败:", err) } enddate, err := time.Parse(layout, endTime) if err != nil { logs.Error("时间转换失败:", err) } enddate = enddate.AddDate(0, 1, -1) nowYearList := make([]*pastureStatistics, 0) //lastYearList := make([]*pastureStatistics, 0) sqlstr := `SELECT round(ifnull(SUM( pu.sumPrice - pu.quitNumber * pu.price),0),4) psum, p.name FROM partuse pu INNER JOIN bigpartuse bpu ON pu.bigId = bpu.id INNER JOIN pasture p ON bpu.pastureId = p.id #INNER JOIN department dpt #on dpt.id = bpu.departmentId WHERE bpu.useType <> 3 AND ( pu.useTypeV = '维修' OR pu.useTypeV = '保养' ) and ( bpu.receiveTime between ? and ?) and p.name <> '现代牧业' and (p.center = ? or ? = '' ) and pu.dflag != 1 AND (SELECT name FROM department d WHERE d.id=bpu.departmentId) not in ('挤奶处','牧场办公室','财务部','餐厅','信息处') GROUP BY bpu.pastureId ` err = s.d.DB.Raw(sqlstr, startdate.Format("2006-01-02"), enddate.Format("2006-01-02"), center, center).Find(&nowYearList).Error if err != nil { logs.Error(err) return nil, err } pastureList := make([]*model.Pasture, 0) err = s.d.DB.Where(" vendor = 1 ").Where(" IsEnergy = 0").Order("id").Find(&pastureList).Error if err != nil { logs.Error(err) return resp, err } cowNumList := make([]*model.FeedSumAndPasture, 0) //lastCowNumList := make([]*model.FeedSumAndPasture, 0) err = s.d.DB.Raw(`select sum(cowNum)cowNum ,p.name from feed_sum fd join pasture p on p.id = fd.pastureid where fd.feedDay between ? and ? and (p.center = ? or ? = '' ) group by pastureid `, startdate.Format("2006-01-02"), enddate.Format("2006-01-02"), center, center).Find(&cowNumList).Error if err != nil { logs.Error(err) return nil, err } monthBudgetList := make([]*monthBudget, 0) err = s.d.DB.Raw(`select ifnull(sum(monthBudget),0) monthBudget,p.name from month_budget mb join pasture p on p.id = mb.pastureId where mb.feeType = '维修费' and mb.budgetMonth between ? and ? and (p.center = ? or ? = '' ) group by mb.pastureId`, startdate.Format("2006-01-02"), enddate.Format("2006-01-02"), center, center).Find(&monthBudgetList).Error if err != nil { logs.Error(err) return resp, err } cowNum := make(map[string]int64, 0) var cowNumAll int64 for _, item := range cowNumList { cowNum[item.Pasture.Name] = item.FeedSum.CowNum } //lastCowNum := make(map[string]int64, 0) //for _, item := range lastCowNumList { // lastCowNumAll += item.FeedSum.CowNum // lastCowNum[item.Pasture.Name] = item.FeedSum.CowNum //} var pastureName []string var nowYearData, lastYearData []float64 var all, lastAll float64 for _, nowYear := range nowYearList { pastureName = append(pastureName, nowYear.Name) if _, ok := cowNum[nowYear.Name]; ok { all += nowYear.Psum cowNumAll += cowNum[nowYear.Name] nowYearData = append(nowYearData, nowYear.Psum/float64(cowNum[nowYear.Name])) } else { nowYearData = append(nowYearData, 0) } } for _, pasture := range pastureList { exist := false for _, name := range pastureName { if pasture.Name == name { exist = true break } } if !exist { pastureName = append(pastureName, pasture.Name) nowYearData = append(nowYearData, 0) lastYearData = append(lastYearData, 0) } } for _, name := range pastureName { exist := false for _, monthBudget := range monthBudgetList { if monthBudget.Name == name { exist = true if _, ok := cowNum[monthBudget.Name]; ok { lastAll += monthBudget.MonthBudget lastYearData = append(lastYearData, monthBudget.MonthBudget/float64(cowNum[monthBudget.Name])) } else { lastYearData = append(lastYearData, 0) } break } } if !exist { lastYearData = append(lastYearData, 0) } } resp.Pasture = append(resp.Pasture, "集团") resp.Pasture = append(resp.Pasture, pastureName...) resp.LastYear = append(resp.LastYear, util.Round(lastAll/float64(cowNumAll), 3)) //resp.LastYear = append(resp.LastYear, lastYearData...) for _, item := range lastYearData { resp.LastYear = append(resp.LastYear, util.Round(item, 3)) } resp.NowYear = append(resp.NowYear, util.Round(all/float64(cowNumAll), 3)) for _, item := range nowYearData { resp.NowYear = append(resp.NowYear, util.Round(item, 3)) } resp.All = all resp.Line = util.Round(all/float64(cowNumAll), 2) return resp, nil } //每月单头牛维修对比 func (s *Service) GetWxPerHeadByPasture(pastureId, startTime, endTime string) (map[string]interface{}, error) { layout := "2006-01-02" startdate, err := time.Parse(layout, startTime) if err != nil { logs.Error("时间转换失败:", err) } enddate, err := time.Parse(layout, endTime) if err != nil { logs.Error("时间转换失败:", err) } enddate = enddate.AddDate(0, 1, -1) dosagePerCowList := make([]*dosagePerCow, 0) err = s.d.DB.Debug().Raw(`SELECT round(ifnull(SUM( pu.sumPrice - pu.quitNumber * pu.price),0),4) psum, p.name,DATE_FORMAT( bpu.receiveTime, '%Y-%m') date, ifnull((select sum(cowNum) from feed_sum where DATE_FORMAT( feedDay, '%Y-%m') = DATE_FORMAT( bpu.receiveTime, '%Y-%m') and pastureId = p.id ),0)cowNum FROM partuse pu INNER JOIN bigpartuse bpu ON pu.bigId = bpu.id INNER JOIN pasture p ON bpu.pastureId = p.id #INNER JOIN department dpt #on dpt.id = bpu.departmentId WHERE bpu.useType <> 3 AND ( pu.useTypeV = '维修' OR pu.useTypeV = '保养' ) and ( bpu.receiveTime between ? and ?) AND (SELECT name FROM department d WHERE d.id=bpu.departmentId) not in ('挤奶处','牧场办公室','财务部','餐厅','信息处') and p.name <> '现代牧业' and FIND_IN_SET(p.id,?) and pu.dflag != 1 GROUP BY DATE_FORMAT( bpu.receiveTime, '%Y-%m'),p.id order by DATE_FORMAT( bpu.receiveTime, '%Y-%m'),p.id `, startdate.Format("2006-01-02"), enddate.Format("2006-01-02"), pastureId).Find(&dosagePerCowList).Error if err != nil { logs.Error(err) return nil, err } data := dosagePerCowFormat(dosagePerCowList) return data, nil } //各牧场年度燃动费对比 func (s *Service) GetIgnitionYieldByPasture(center, startTime, endTime string) (*http.StatementResp, error) { resp := new(http.StatementResp) layout := "2006-01-02" startdate, err := time.Parse(layout, startTime) if err != nil { logs.Error("时间转换失败:", err) } enddate, err := time.Parse(layout, endTime) if err != nil { logs.Error("时间转换失败:", err) } feequeryList := make([]*model.FeeQueryAndPasture, 0) err = s.d.DB.Debug().Raw(`select sum(HSL) HSL ,p.name from feequery fd join pasture p on p.id = fd.pastureid where fd.Date between ? and ? and fd.FYLX ='燃动费' and (p.center = ? or ? = '' ) group by fd.pastureId order by p.id`, startdate.Format("2006-01"), enddate.Format("2006-01"), center, center).Find(&feequeryList).Error if err != nil { logs.Error(err) return resp, err } monthBudgetList := make([]*monthBudget, 0) err = s.d.DB.Raw(`select ifnull(sum(monthBudget),0) monthBudget,p.name from month_budget mb join pasture p on p.id = mb.pastureId where mb.feeType = '燃动费' and mb.budgetMonth between ? and ? and (p.center = ? or ? = '' ) group by mb.pastureId`, startTime, endTime, center, center).Find(&monthBudgetList).Error if err != nil { logs.Error(err) return resp, err } pastureList := make([]*model.Pasture, 0) err = s.d.DB.Where(" vendor = 1 ").Where(" IsEnergy = 0").Order("id").Find(&pastureList).Error if err != nil { logs.Error(err) return resp, err } var pastureName []string var hslList, monthBudgets []float64 var all float64 for _, feequery := range feequeryList { pastureName = append(pastureName, feequery.Pasture.Name) var hsl float64 hsl, err = strconv.ParseFloat(feequery.HSL, 64) if err != nil { logs.Error("转换失败:", err) hslList = append(hslList, 0) continue } all += util.Round(hsl, 2) hslList = append(hslList, hsl) } for _, item := range pastureList { exist := false for _, f := range feequeryList { if item.Name == f.Name { exist = true break } } if !exist { pastureName = append(pastureName, item.Name) hslList = append(hslList, 0) } } for _, name := range pastureName { exist := false for _, monthBudget := range monthBudgetList { if name == monthBudget.Name { exist = true monthBudgets = append(monthBudgets, util.Round(monthBudget.MonthBudget, 2)) break } } if !exist { monthBudgets = append(monthBudgets, 0) } } resp.Pasture = pastureName resp.LastYear = monthBudgets resp.NowYear = hslList resp.All = util.Round(all, 2) return resp, nil } //各牧场年度柴油对比 func (s *Service) GetDieselYieldByPasture(center, startTime, endTime string) (*http.StatementResp, error) { resp := new(http.StatementResp) layout := "2006-01-02" startdate, err := time.Parse(layout, startTime) if err != nil { logs.Error("时间转换失败:", err) } enddate, err := time.Parse(layout, endTime) if err != nil { logs.Error("时间转换失败:", err) } enddate = enddate.AddDate(0, 1, -1) nowYearList := make([]*pastureStatistics, 0) lastYearList := make([]*pastureStatistics, 0) sqlstr := `SELECT ROUND( IFNULL(SUM(w.oilAmount),0) ,2)psum, p.name FROM diesel w INNER JOIN oilcard ms ON w.oilcardId = ms.id INNER JOIN pasture p ON ms.pastureId = p.id WHERE w.selTime between ? and ? and p.name <> '现代牧业' and (p.center = ? or ? = '' ) GROUP BY ms.pastureId ` err = s.d.DB.Debug().Raw(sqlstr, startdate.Format("2006-01-02"), enddate.Format("2006-01-02"), center, center).Find(&nowYearList).Error if err != nil { logs.Error(err) return nil, err } err = s.d.DB.Raw(sqlstr, startdate.AddDate(-1, 0, 0).Format("2006-01-02"), enddate.AddDate(-1, 0, 0).Format("2006-01-02"), center, center).Find(&lastYearList).Error if err != nil { logs.Error(err) return nil, err } pastureList := make([]*model.Pasture, 0) err = s.d.DB.Where(" vendor = 1 ").Where(" IsEnergy = 0").Order("id").Find(&pastureList).Error if err != nil { logs.Error(err) return resp, err } var pastureName []string var nowYearData, lastYearData []float64 var all float64 for _, nowYear := range nowYearList { pastureName = append(pastureName, nowYear.Name) nowYearData = append(nowYearData, util.Round(nowYear.Psum, 2)) all += nowYear.Psum exist := false for _, lastYear := range lastYearList { if lastYear.Name == nowYear.Name { exist = true lastYearData = append(lastYearData, util.Round(lastYear.Psum, 2)) break } } if !exist { lastYearData = append(lastYearData, 0) } } for _, pasture := range pastureList { exist := false for _, name := range pastureName { if pasture.Name == name { exist = true break } } if !exist { pastureName = append(pastureName, pasture.Name) nowYearData = append(nowYearData, 0) lastYearData = append(lastYearData, 0) } } resp.Pasture = pastureName resp.LastYear = lastYearData resp.NowYear = nowYearData resp.All = util.Round(all, 2) return resp, nil } //单头牛柴油 func (s *Service) GetDieselRateByPasture(center, startTime, endTime string) (*http.GetWaterRateByPastureResp, error) { resp := new(http.GetWaterRateByPastureResp) layout := "2006-01-02" startdate, err := time.Parse(layout, startTime) if err != nil { logs.Error("时间转换失败:", err) } enddate, err := time.Parse(layout, endTime) if err != nil { logs.Error("时间转换失败:", err) } enddate = enddate.AddDate(0, 1, -1) cowNumList := make([]*model.FeedSumAndPasture, 0) err = s.d.DB.Raw(`select sum(cowNum)cowNum ,p.name from feed_sum fd join pasture p on p.id = fd.pastureid where fd.feedDay between ? and ? and (p.center = ? or ? = '' ) group by pastureid `, startdate.Format("2006-01-02"), enddate.Format("2006-01-02"), center, center).Find(&cowNumList).Error if err != nil { logs.Error(err) return nil, err } cowNum := make(map[string]int64, 0) var cowNumAll int64 for _, item := range cowNumList { cowNum[item.Pasture.Name] = item.FeedSum.CowNum } pastureList := make([]*model.Pasture, 0) err = s.d.DB.Where(" vendor = 1 ").Where("IsEnergy = 0").Order("id").Find(&pastureList).Error if err != nil { logs.Error(err) return resp, err } dieselList := make([]*pastureStatistics, 0) sqlstr := `SELECT ROUND( IFNULL(SUM(w.oilAmount),0) ,2)psum, p.name FROM diesel w INNER JOIN oilcard ms ON w.oilcardId = ms.id INNER JOIN pasture p ON ms.pastureId = p.id WHERE w.selTime between ? and ? and p.name <> '现代牧业' and (p.center = ? or ? = '' ) GROUP BY ms.pastureId ` err = s.d.DB.Debug().Raw(sqlstr, startdate.Format("2006-01-02"), enddate.Format("2006-01-02"), center, center).Find(&dieselList).Error if err != nil { logs.Error(err) return nil, err } var pastureName []string var hslList []float64 var all float64 for _, diesel := range dieselList { pastureName = append(pastureName, diesel.Name) if _, ok := cowNum[diesel.Name]; ok { all += diesel.Psum cowNumAll += cowNum[diesel.Name] hslList = append(hslList, diesel.Psum/float64(cowNum[diesel.Name])) } else { hslList = append(hslList, 0) } } for _, item := range pastureList { exist := false for _, f := range dieselList { if item.Name == f.Name { exist = true break } } if !exist { pastureName = append(pastureName, item.Name) hslList = append(hslList, 0) } } resp.Pasture = append(resp.Pasture, "集团") resp.Pasture = append(resp.Pasture, pastureName...) resp.Actual = append(resp.Actual, util.Round(all/float64(cowNumAll), 3)) for _, item := range hslList { resp.Actual = append(resp.Actual, util.Round(item, 3)) } resp.Line = util.Round(all/float64(cowNumAll), 3) return resp, err } //单头牛燃动费 func (s *Service) GetIgnitionRateByPasture(center, startTime, endTime string) (*http.GetWaterRateCompleteByPastureResp, error) { resp := new(http.GetWaterRateCompleteByPastureResp) layout := "2006-01-02" startdate, err := time.Parse(layout, startTime) if err != nil { logs.Error("时间转换失败:", err) } enddate, err := time.Parse(layout, endTime) if err != nil { logs.Error("时间转换失败:", err) } enddate = enddate.AddDate(0, 1, -1) cowNumList := make([]*model.FeedSumAndPasture, 0) err = s.d.DB.Raw(`select sum(cowNum)cowNum ,p.name from feed_sum fd join pasture p on p.id = fd.pastureid where fd.feedDay between ? and ? and (p.center = ? or ? = '' ) group by pastureid `, startdate.Format("2006-01-02"), enddate.Format("2006-01-02"), center, center).Find(&cowNumList).Error if err != nil { logs.Error(err) return nil, err } cowNum := make(map[string]int64, 0) var cowNumAll int64 for _, item := range cowNumList { cowNum[item.Pasture.Name] = item.FeedSum.CowNum } pastureList := make([]*model.Pasture, 0) err = s.d.DB.Where(" vendor = 1 ").Where(" IsEnergy = 0").Order("id").Find(&pastureList).Error if err != nil { logs.Error(err) return resp, err } feequeryList := make([]*model.FeeQueryAndPasture, 0) err = s.d.DB.Debug().Raw(`select sum(HSL) HSL ,p.name from feequery fd join pasture p on p.id = fd.pastureid where fd.Date between ? and ? and fd.FYLX ='燃动费' and (p.center = ? or ? = '' ) group by fd.pastureId order by p.id`, startdate.Format("2006-01"), enddate.Format("2006-01"), center, center).Find(&feequeryList).Error if err != nil { logs.Error(err) return resp, err } monthBudgetList := make([]*monthBudget, 0) err = s.d.DB.Raw(`select ifnull(sum(monthBudget),0) monthBudget,p.name from month_budget mb join pasture p on p.id = mb.pastureId where mb.feeType = '燃动费' and mb.budgetMonth between ? and ? and (p.center = ? or ? = '' ) group by mb.pastureId`, startdate.Format("2006-01"), enddate.Format("2006-01"), center, center).Find(&monthBudgetList).Error if err != nil { logs.Error(err) return resp, err } var pastureName []string var hslList []float64 var monthBudgets []float64 var all, monthBudgetAll float64 for _, feequery := range feequeryList { pastureName = append(pastureName, feequery.Name) var hsl float64 hsl, err = strconv.ParseFloat(feequery.HSL, 64) if err != nil { logs.Error("转换失败:", err) hslList = append(hslList, 0) } if _, ok := cowNum[feequery.Name]; ok { all += hsl cowNumAll += cowNum[feequery.Name] hslList = append(hslList, hsl/float64(cowNum[feequery.Name])) } else { hslList = append(hslList, 0) } } for _, item := range pastureList { exist := false for _, f := range feequeryList { if item.Name == f.Name { exist = true break } } if !exist { pastureName = append(pastureName, item.Name) hslList = append(hslList, 0) } } for _, name := range pastureName { exist := false for _, monthBudget := range monthBudgetList { if name == monthBudget.Name { exist = true if _, ok := cowNum[name]; ok { monthBudgetAll += monthBudget.MonthBudget monthBudgets = append(monthBudgets, monthBudget.MonthBudget/float64(cowNum[name])) } else { monthBudgets = append(monthBudgets, 0) } break } } if !exist { monthBudgets = append(monthBudgets, 0) } } resp.Pasture = append(resp.Pasture, "集团") resp.Pasture = append(resp.Pasture, pastureName...) resp.Actual = append(resp.Actual, util.Round(all/float64(cowNumAll), 3)) for _, item := range hslList { resp.Actual = append(resp.Actual, util.Round(item, 3)) } resp.Line = util.Round(all/float64(cowNumAll), 3) resp.Budget = append(resp.Budget, util.Round(monthBudgetAll/float64(cowNumAll), 3)) for _, item := range monthBudgets { resp.Budget = append(resp.Budget, util.Round(item, 3)) } return resp, err } //每月单头牛柴油对比 func (s *Service) GetDieselPerHeadByPasture(pastureId, startTime, endTime string) (map[string]interface{}, error) { layout := "2006-01-02" startdate, err := time.Parse(layout, startTime) if err != nil { logs.Error("时间转换失败:", err) } enddate, err := time.Parse(layout, endTime) if err != nil { logs.Error("时间转换失败:", err) } enddate = enddate.AddDate(0, 1, -1) dosagePerCowList := make([]*dosagePerCow, 0) err = s.d.DB.Debug().Raw(`SELECT round( IFNULL(SUM(w.oilAmount),0) ,2)psum, p.name,DATE_FORMAT( w.selTime, '%Y-%m') date, ifnull((select sum(cowNum) from feed_sum where DATE_FORMAT( feedDay, '%Y-%m') = DATE_FORMAT( w.selTime, '%Y-%m') and pastureId = p.id ),0)cowNum FROM diesel w INNER JOIN oilcard ms ON w.oilcardId = ms.id INNER JOIN pasture p ON ms.pastureId = p.id WHERE (w.selTime between ? and ? ) and p.name <> '现代牧业' and FIND_IN_SET(p.id,?) GROUP BY DATE_FORMAT( w.selTime, '%Y-%m'),ms.pastureId order by DATE_FORMAT( w.selTime, '%Y-%m'),p.id `, startdate.Format("2006-01-02"), enddate.Format("2006-01-02"), pastureId).Find(&dosagePerCowList).Error if err != nil { logs.Error(err) return nil, err } data := dosagePerCowFormat(dosagePerCowList) return data, nil }