From f7522636e242a121bb9103765889e7c923b1913f Mon Sep 17 00:00:00 2001 From: ragilap Date: Fri, 9 Jan 2026 09:27:49 +0700 Subject: [PATCH] feat(BE-281): unique uniformity weeks --- .../services/uniformity.service.go | 45 +++++++++++++------ 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/internal/modules/production/uniformities/services/uniformity.service.go b/internal/modules/production/uniformities/services/uniformity.service.go index cde86694..6e03795d 100644 --- a/internal/modules/production/uniformities/services/uniformity.service.go +++ b/internal/modules/production/uniformities/services/uniformity.service.go @@ -199,14 +199,26 @@ func (s uniformityService) MapCharts(c *fiber.Ctx, items []entity.ProjectFlockKa for _, group := range grouped { allWeeks := make(map[int]utypes.UniformityChartWeek) weekOrder := make([]int, 0, len(group)) - weekSeen := make(map[int]struct{}, len(group)) weeksWithData := 0 gaugeWeeks := make([]utypes.UniformityChartGaugeWeek, 0, len(group)) + latestByWeek := make(map[int]entity.ProjectFlockKandangUniformity) for _, item := range group { if item.Week == 0 { continue } + if existing, ok := latestByWeek[item.Week]; !ok || isUniformityNewer(item, existing) { + latestByWeek[item.Week] = item + } + } + + for week := range latestByWeek { + weekOrder = append(weekOrder, week) + } + sort.Ints(weekOrder) + + for _, week := range weekOrder { + item := latestByWeek[week] var weekSummary utypes.UniformityChartWeek if len(item.ChartData) > 0 { if err := json.Unmarshal(item.ChartData, &weekSummary); err != nil { @@ -222,16 +234,11 @@ func (s uniformityService) MapCharts(c *fiber.Ctx, items []entity.ProjectFlockKa if weekSummary.HasData { weeksWithData++ } - allWeeks[item.Week] = weekSummary - - if _, ok := weekSeen[item.Week]; !ok { - weekSeen[item.Week] = struct{}{} - weekOrder = append(weekOrder, item.Week) - } + allWeeks[week] = weekSummary hasData := item.ChickQtyOfWeight > 0 gaugeWeeks = append(gaugeWeeks, utypes.UniformityChartGaugeWeek{ - Week: item.Week, + Week: week, UniformityPercent: item.Uniformity, IdealCount: item.UniformQty, OutsideIdealCount: item.NotUniformQty, @@ -240,11 +247,6 @@ func (s uniformityService) MapCharts(c *fiber.Ctx, items []entity.ProjectFlockKa }) } - sort.Ints(weekOrder) - sort.Slice(gaugeWeeks, func(i, j int) bool { - return gaugeWeeks[i].Week < gaugeWeeks[j].Week - }) - weekIndex := make(map[int]int, len(weekOrder)) for idx, week := range weekOrder { weekIndex[week] = idx @@ -280,6 +282,23 @@ func (s uniformityService) MapCharts(c *fiber.Ctx, items []entity.ProjectFlockKa return result, nil } +func isUniformityNewer(a, b entity.ProjectFlockKandangUniformity) bool { + var aDate, bDate time.Time + if a.UniformDate != nil { + aDate = *a.UniformDate + } + if b.UniformDate != nil { + bDate = *b.UniformDate + } + if !aDate.IsZero() || !bDate.IsZero() { + if aDate.Equal(bDate) { + return a.CreatedAt.After(b.CreatedAt) + } + return aDate.After(bDate) + } + return a.CreatedAt.After(b.CreatedAt) +} + func (s uniformityService) MapDocuments(c *fiber.Ctx, items []entity.ProjectFlockKandangUniformity) (map[uint]string, error) { if s.DocumentSvc == nil || len(items) == 0 { return map[uint]string{}, nil