102 lines
2.2 KiB
Go
Raw Normal View History

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
}