mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-22 14:25:45 +00:00
Merge branch 'development' of https://gitlab.com/mbugroup/lti-api into feat/BE/US-281-adjustment_recording
This commit is contained in:
@@ -48,12 +48,30 @@ type RecordingRepository interface {
|
||||
GetTotalDepletionByProjectFlockID(ctx context.Context, projectFlockID uint) (totalDepletion float64, err error)
|
||||
GetLatestAvgWeightByProjectFlockID(ctx context.Context, projectFlockID uint) (avgWeight float64, err error)
|
||||
GetTotalEggProductionWeightByProjectFlockID(ctx context.Context, projectFlockID uint) (totalWeightKg float64, err error)
|
||||
GetAverageTargetMetricsByProjectFlockKandangID(ctx context.Context, projectFlockKandangID uint, includeTargets bool) (RecordingTargetAverages, error)
|
||||
}
|
||||
|
||||
type RecordingRepositoryImpl struct {
|
||||
*repository.BaseRepositoryImpl[entity.Recording]
|
||||
}
|
||||
|
||||
type RecordingTargetAverages struct {
|
||||
HenDayAvg float64
|
||||
HenDayCount int64
|
||||
HenHouseAvg float64
|
||||
HenHouseCount int64
|
||||
EggWeightAvg float64
|
||||
EggWeightCount int64
|
||||
EggMassAvg float64
|
||||
EggMassCount int64
|
||||
FeedIntakeAvg float64
|
||||
FeedIntakeCount int64
|
||||
FcrAvg float64
|
||||
FcrCount int64
|
||||
CumDepletionRateAvg float64
|
||||
CumDepletionRateCount int64
|
||||
}
|
||||
|
||||
func NewRecordingRepository(db *gorm.DB) RecordingRepository {
|
||||
return &RecordingRepositoryImpl{
|
||||
BaseRepositoryImpl: repository.NewBaseRepository[entity.Recording](db),
|
||||
@@ -442,6 +460,67 @@ func (r *RecordingRepositoryImpl) GetTotalEggProductionWeightByProjectFlockID(ct
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (r *RecordingRepositoryImpl) GetAverageTargetMetricsByProjectFlockKandangID(ctx context.Context, projectFlockKandangID uint, includeTargets bool) (RecordingTargetAverages, error) {
|
||||
var row struct {
|
||||
HenDayTotal float64
|
||||
HenHouseTotal float64
|
||||
EggWeightTotal float64
|
||||
EggMassTotal float64
|
||||
FeedIntakeTotal float64
|
||||
FcrTotal float64
|
||||
CumDepletionRateTotal float64
|
||||
TotalCount int64
|
||||
}
|
||||
|
||||
selectParts := []string{
|
||||
"COALESCE(SUM(feed_intake), 0) AS feed_intake_total",
|
||||
"COALESCE(SUM(fcr_value), 0) AS fcr_total",
|
||||
"COALESCE(SUM(cum_depletion_rate), 0) AS cum_depletion_rate_total",
|
||||
"COUNT(*) AS total_count",
|
||||
}
|
||||
if includeTargets {
|
||||
selectParts = append([]string{
|
||||
"COALESCE(SUM(hen_day), 0) AS hen_day_total",
|
||||
"COALESCE(SUM(hen_house), 0) AS hen_house_total",
|
||||
"COALESCE(SUM(egg_weight), 0) AS egg_weight_total",
|
||||
"COALESCE(SUM(egg_mass), 0) AS egg_mass_total",
|
||||
}, selectParts...)
|
||||
}
|
||||
|
||||
if err := r.DB().WithContext(ctx).
|
||||
Table("recordings").
|
||||
Select(strings.Join(selectParts, ", ")).
|
||||
Where("project_flock_kandangs_id = ? AND deleted_at IS NULL", projectFlockKandangID).
|
||||
Scan(&row).Error; err != nil {
|
||||
return RecordingTargetAverages{}, err
|
||||
}
|
||||
|
||||
result := RecordingTargetAverages{
|
||||
FeedIntakeCount: row.TotalCount,
|
||||
FcrCount: row.TotalCount,
|
||||
CumDepletionRateCount: row.TotalCount,
|
||||
}
|
||||
if includeTargets {
|
||||
result.HenDayCount = row.TotalCount
|
||||
result.HenHouseCount = row.TotalCount
|
||||
result.EggWeightCount = row.TotalCount
|
||||
result.EggMassCount = row.TotalCount
|
||||
}
|
||||
if row.TotalCount > 0 {
|
||||
if includeTargets {
|
||||
result.HenDayAvg = row.HenDayTotal / float64(row.TotalCount)
|
||||
result.HenHouseAvg = row.HenHouseTotal / float64(row.TotalCount)
|
||||
result.EggWeightAvg = row.EggWeightTotal / float64(row.TotalCount)
|
||||
result.EggMassAvg = row.EggMassTotal / float64(row.TotalCount)
|
||||
}
|
||||
result.FeedIntakeAvg = row.FeedIntakeTotal / float64(row.TotalCount)
|
||||
result.FcrAvg = row.FcrTotal / float64(row.TotalCount)
|
||||
result.CumDepletionRateAvg = row.CumDepletionRateTotal
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func nextRecordingDay(days []int) int {
|
||||
if len(days) == 0 {
|
||||
return 1
|
||||
|
||||
Reference in New Issue
Block a user