From caf1732cd37af5cec70e5d579bedc0041701fd54 Mon Sep 17 00:00:00 2001 From: Michael Chus Date: Sun, 24 May 2026 19:14:11 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20=D1=81=D0=BE=D1=80=D1=82=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=BA=D0=B0=D1=82=D0=B5=D0=B3=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=B9=20=D0=B2=20CSV-=D1=8D=D0=BA=D1=81=D0=BF?= =?UTF-8?q?=D0=BE=D1=80=D1=82=D0=B5=20=D0=B1=D0=B5=D0=B7=20=D1=83=D1=87?= =?UTF-8?q?=D1=91=D1=82=D0=B0=20=D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Поиск в categoryOrder не нормализовал регистр — категория "mem" не совпадала с ключом "MEM", получала порядок 9999 и строки шли в произвольном порядке. Заодно заменён bubble-sort на sort.SliceStable. Co-Authored-By: Claude Sonnet 4.6 --- internal/services/export.go | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/internal/services/export.go b/internal/services/export.go index 7606da9..cbed3cf 100644 --- a/internal/services/export.go +++ b/internal/services/export.go @@ -504,29 +504,30 @@ func (s *ExportService) resolveCategories(pricelistID *uint, lotNames []string) return categories } -// defaultCategoryOrder returns a category code → display_order map built from models.DefaultCategories. +// defaultCategoryOrder returns an uppercase category code → display_order map from models.DefaultCategories. func defaultCategoryOrder() map[string]int { m := make(map[string]int, len(models.DefaultCategories)) for _, cat := range models.DefaultCategories { - m[cat.Code] = cat.DisplayOrder + m[strings.ToUpper(cat.Code)] = cat.DisplayOrder } return m } +func categoryDisplayOrder(categoryOrder map[string]int, category string) (int, bool) { + order, ok := categoryOrder[strings.ToUpper(strings.TrimSpace(category))] + return order, ok +} + // sortItemsByCategory sorts items by category display order (items without category go to the end). func sortItemsByCategory(items []ExportItem, categoryOrder map[string]int) { - for i := 0; i < len(items)-1; i++ { - for j := i + 1; j < len(items); j++ { - orderI, hasI := categoryOrder[items[i].Category] - orderJ, hasJ := categoryOrder[items[j].Category] - - if !hasI && hasJ { - items[i], items[j] = items[j], items[i] - } else if hasI && hasJ && orderI > orderJ { - items[i], items[j] = items[j], items[i] - } + sort.SliceStable(items, func(i, j int) bool { + orderI, hasI := categoryDisplayOrder(categoryOrder, items[i].Category) + orderJ, hasJ := categoryDisplayOrder(categoryOrder, items[j].Category) + if hasI && hasJ { + return orderI < orderJ } - } + return hasI && !hasJ + }) } type pricingLevels struct {