From b428c0236e74b043e4141db7a228837c349d4573 Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 13 Dec 2019 18:39:54 +0800 Subject: [PATCH] =?UTF-8?q?GenFakeUPC=E8=80=83=E8=99=91=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxutils/jxutils.go | 23 ++++++++++++++++++++++- business/jxutils/jxutils_test.go | 12 +++++++++--- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/business/jxutils/jxutils.go b/business/jxutils/jxutils.go index e6662dd29..65f23bdc7 100644 --- a/business/jxutils/jxutils.go +++ b/business/jxutils/jxutils.go @@ -409,8 +409,29 @@ func SplitSkuName(skuName string) (prefix, name, comment, specUnit, unit string, return prefix, name, comment, specUnit, unit, specQuality } +// https://my.oschina.net/hyller/blog/700414 +func CalUpcCheckSum(upc12 int64) (checkSum int) { + var sum [2]int + for i := 0; i < 12; i++ { + base := int64(math.Pow10(i)) + sum[i%2] += int((upc12 / base) % 10) + } + sum[0] *= 3 + return (10 - (sum[0]+sum[1])%10) +} + +func IsUpcValid(upc string) bool { + if len(upc) != 13 { + return false + } + upcInt := utils.Str2Int64WithDefault(upc, 0) + checkSum := CalUpcCheckSum(upcInt / 10) + return int(utils.Str2Int64(upc[12:])) == checkSum +} + func GenFakeUPC(skuID int) string { - return fmt.Sprintf("%013d", int64(skuID)+6666000000000) + id := int64(skuID) + 666600000000 + return fmt.Sprintf("%012d%d", id, CalUpcCheckSum(id)) } func MakeValidationMapFromSlice(validValues []string, flag int) map[string]int { diff --git a/business/jxutils/jxutils_test.go b/business/jxutils/jxutils_test.go index f1bab58e6..d6ecd5e26 100644 --- a/business/jxutils/jxutils_test.go +++ b/business/jxutils/jxutils_test.go @@ -288,11 +288,11 @@ func TestGetOneEmailFromStr(t *testing.T) { func TestGenFakeUPC(t *testing.T) { for _, v := range [][]string{ []string{ - "6666000000123", - "123", + "6666000298034", + "29803", }, []string{ - "6666007654321", + "6666076543212", "7654321", }, } { @@ -300,4 +300,10 @@ func TestGenFakeUPC(t *testing.T) { t.Errorf("%s failed, result:%s, expect:%s", v[1], str, v[0]) } } + if !IsUpcValid("6666076543212") { + t.Fatal("wrong1") + } + if IsUpcValid("6666076543210") { + t.Fatal("wrong2") + } }