package logic import ( "context" "errors" "strings" "unicode" "muyu-apiserver/model" "github.com/mozillazg/go-pinyin" ) const ( defaultProductColor = "本色" defaultYarnColor = "原纱本色" defaultDyeFactory = "无" defaultProcess = "无" ) func normalizeColorNo(colorNo string) string { return strings.ToUpper(strings.TrimSpace(colorNo)) } func normalizeProductColor(color string) string { color = strings.TrimSpace(color) if color == "" { return defaultProductColor } return color } func normalizeYarnColor(color string) string { color = strings.TrimSpace(color) if color == "" { return defaultYarnColor } return color } func normalizeDyeFactory(factory string) string { factory = strings.TrimSpace(factory) if factory == "" { return defaultDyeFactory } return factory } func productNameCodePrefix(productName string) string { args := pinyin.NewArgs() args.Style = pinyin.Normal var b strings.Builder for _, r := range productName { switch { case r >= 'a' && r <= 'z': b.WriteRune(unicode.ToUpper(r)) case r >= 'A' && r <= 'Z': b.WriteRune(r) case r >= '0' && r <= '9': b.WriteRune(r) case unicode.Is(unicode.Han, r): py := pinyin.Pinyin(string(r), args) if len(py) > 0 && len(py[0]) > 0 && py[0][0] != "" { first := []rune(py[0][0]) if len(first) > 0 { b.WriteRune(unicode.ToUpper(first[0])) } } } } code := b.String() if code == "" { return "P" } return code } func generateProductCode(productName, colorNo string) string { return productNameCodePrefix(productName) + normalizeColorNo(colorNo) } func resolveColorNo(ctx context.Context, productModel model.InvProductModel, tenantId, productName, colorNo string) (string, error) { colorNo = normalizeColorNo(colorNo) if colorNo != "" { return colorNo, nil } return productModel.NextColorNo(ctx, tenantId, productName) } func ensureProductCodeAvailable(ctx context.Context, productModel model.InvProductModel, tenantId, productCode string) error { _, err := productModel.FindOneByTenantProductCode(ctx, tenantId, productCode) if err == nil { return errors.New("产品码已存在") } if errors.Is(err, model.ErrNotFound) { return nil } return err }