102 lines
2.2 KiB
Go
102 lines
2.2 KiB
Go
|
|
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
|
||
|
|
}
|