diff --git a/cmd/cli/commands/dimensiondispatcher.go b/cmd/cli/commands/dimensiondispatcher.go index 9299f36..5b02134 100644 --- a/cmd/cli/commands/dimensiondispatcher.go +++ b/cmd/cli/commands/dimensiondispatcher.go @@ -14,12 +14,16 @@ type dimensionDispatcher struct { m *dimension.Matcher } -func (d dimensionDispatcher) isDimensionParam(value string) bool { - return d.m.Match(value) != dimension.MatchResultMiss +func pickFirst[T, V any](t T, v V) T { + return t } -func (d dimensionDispatcher) dispatch(ctx context.Context, key, value string, in *entity.GoodsItemSize) (updated bool) { - matchResult := d.m.Match(key) +func (d dimensionDispatcher) isDimensionParam(value string) bool { + return pickFirst(d.m.Match(value)) != dimension.MatchResultMiss +} + +func (d dimensionDispatcher) applyDimensionValue(ctx context.Context, key, value string, in *entity.GoodsItemSize) (updated bool) { + matchResult, priority := d.m.Match(key) if matchResult == dimension.MatchResultMiss { return false } @@ -29,7 +33,7 @@ func (d dimensionDispatcher) dispatch(ctx context.Context, key, value string, in if strings.Contains(value, "/") { dimensionValues := strings.Split(value, "/") for _, dv := range dimensionValues { - updated = updated || d.dispatch(ctx, key, dv, in) + updated = updated || d.applyDimensionValue(ctx, key, dv, in) } } else { out, err := entity.ParseDimention(value, entity.DimensionLocalRU) @@ -42,10 +46,22 @@ func (d dimensionDispatcher) dispatch(ctx context.Context, key, value string, in switch matchResult { case dimension.MatchResultHeight: + if !priority && in.Height.Value != 0 { + return false + } + in.Height = out case dimension.MatchResultLength: + if !priority && in.Length.Value != 0 { + return false + } + in.Length = out case dimension.MatchResultWidth: + if !priority && in.Width.Value != 0 { + return false + } + in.Width = out case dimension.MatchResultDepth: in.UnmatchedDepth = out diff --git a/cmd/cli/commands/exports.go b/cmd/cli/commands/exports.go index 1116b54..b11ad1d 100644 --- a/cmd/cli/commands/exports.go +++ b/cmd/cli/commands/exports.go @@ -144,7 +144,7 @@ func (h exportHandlers) YMLCatalog(ctx context.Context, cmd *cli.Command) error switch { case addToSkip(item.Description == "", reasonNoDescription, sublog): continue - case addToSkip(item.Sizes == (entity.GoodsItemSize{}), reasonNoSize, sublog): + case addToSkip(!item.Sizes.AllSizesSet(), reasonNoSize, sublog): continue case addToSkip(item.Sizes.GetSum(entity.DimensionKindCentimeter) > maximumAllowedSizes, reasonTooLarge, sublog): continue diff --git a/cmd/cli/commands/items.go b/cmd/cli/commands/items.go index c41de64..8860c65 100644 --- a/cmd/cli/commands/items.go +++ b/cmd/cli/commands/items.go @@ -351,7 +351,7 @@ func (itemsHandlers) FixSizes(ctx context.Context, cmd *cli.Command) error { valueBeenUpdated = true } - if dimensionDispatcher.dispatch(ctx, key, value, &item.Sizes) { + if dimensionDispatcher.applyDimensionValue(ctx, key, value, &item.Sizes) { valueBeenUpdated = true log.Debug().Str("key", key).Any("sizes", item.Sizes).Msg("been updated") } diff --git a/internal/dimension/matcher.go b/internal/dimension/matcher.go index 6ce6eb4..050e008 100644 --- a/internal/dimension/matcher.go +++ b/internal/dimension/matcher.go @@ -50,25 +50,29 @@ func makeMatcherByConig(insensitive bool, cfgs ...config.MatcherPredicate) match return m } -func (m *Matcher) Match(value string) MatchResult { +func (m *Matcher) Match(value string) (r MatchResult, priority bool) { switch { case value == "Высота": + priority = true fallthrough case m.height.Match(value): - return MatchResultHeight + return MatchResultHeight, priority case value == "Глубина": - return MatchResultDepth + priority = true + return MatchResultDepth, priority case value == "Длина": + priority = true fallthrough case m.length.Match(value): - return MatchResultLength + return MatchResultLength, priority case value == "Ширина": + priority = true fallthrough case m.width.Match(value): - return MatchResultWidth + return MatchResultWidth, priority } - return MatchResultMiss + return MatchResultMiss, false } func (m *Matcher) GetRegisteredPatterns() map[string][]string { diff --git a/internal/entity/gooditem.go b/internal/entity/gooditem.go index c61af65..ce66650 100644 --- a/internal/entity/gooditem.go +++ b/internal/entity/gooditem.go @@ -52,6 +52,22 @@ func FixupSizes(s GoodsItemSize) (GoodsItemSize, bool) { return s, true } +func (s GoodsItemSize) AllSizesSet() bool { + var count int + for _, d := range []Dimension{ + s.Width, + s.Height, + s.Length, + s.UnmatchedDepth, + } { + if d.IsZero() { + count++ + } + } + + return count >= 3 +} + func (s GoodsItemSize) GetSum(kind DimensionKind) float64 { var value float64 sum := func(ds ...Dimension) { diff --git a/internal/interconnect/eway/client.go b/internal/interconnect/eway/client.go index 7ac2995..a994fdc 100644 --- a/internal/interconnect/eway/client.go +++ b/internal/interconnect/eway/client.go @@ -403,7 +403,10 @@ func (c *client) getProductInfo(ctx context.Context, cartID int64) (pi entity.Go Find(galleryPanelSelector). Find(galleryImageSelector). Each(func(i int, s *goquery.Selection) { - imageURL, ok := s.Attr("src") + imageURL, ok := s.Attr("data-src") + if !ok { + imageURL, ok = s.Attr("src") + } if !ok || len(imageURL) == 0 { return }