fix: 合并多件档口入库码回写 (#240)

This commit is contained in:
chengma
2026-08-15 14:27:31 +08:00
parent 5d72141f2f
commit 8e500606c5
10 changed files with 204 additions and 31 deletions
+79 -7
View File
@@ -6,6 +6,9 @@ import (
"testing"
"github.com/xuri/excelize/v2"
"cmautobuy/admin/model"
"cmautobuy/admin/repository"
)
func TestNormalizeInnerCodeSpecKey(t *testing.T) {
@@ -42,7 +45,7 @@ func TestParseInnerCodeWorkbook_表头前置行与重复业务组(t *testing.T)
if err != nil {
t.Fatal(err)
}
if result.TotalRows != 3 || result.DuplicateRows != 1 || len(imported) != 2 {
if result.TotalRows != 3 || result.MergedRows != 1 || len(imported) != 2 {
t.Fatalf("统计不正确: result=%+v rows=%d", result, len(imported))
}
first := imported[0]
@@ -55,6 +58,9 @@ func TestParseInnerCodeWorkbook_表头前置行与重复业务组(t *testing.T)
if first.SourceRow != 3 || first.PrintSequence != 1 || first.ShopName != "shop-a" {
t.Fatalf("首行来源字段不正确: %+v", first)
}
if first.InnerCode != "DK001" {
t.Fatalf("相同入库码重复行不应重复拼接: %+v", first)
}
}
func TestParseInnerCodeWorkbook_同日入库码指向不同业务键时报错(t *testing.T) {
@@ -74,20 +80,71 @@ func TestParseInnerCodeWorkbook_同日入库码指向不同业务键时报错(t
}
}
func TestParseInnerCodeWorkbook_业务键相同但入库码不同时报错(t *testing.T) {
func TestParseInnerCodeWorkbook_同业务键多个单件码按源行聚合(t *testing.T) {
book := excelize.NewFile()
defaultSheet := book.GetSheetList()[0]
if err := book.SetSheetName(defaultSheet, innerCodeSheetName); err != nil {
t.Fatal(err)
}
setInnerCodeWorkbookRows(t, book, [][]string{
{"内部档口入库码", "Shopee订单编号", "清洗后规格", "档口及货号", "生成日期"},
{"DK001", "ORDER-1", "黑色,M", "A#1", "2026-08-15"},
{"DK002", "ORDER-1", "黑色,M", "A#1", "2026-08-15"},
{"内部档口入库码", "Shopee订单编号", "清洗后规格", "档口及货号", "生成日期", "商品件序"},
{"DK260815A160101", "26081394YBWB17", "黑色【原版好質量】,6XL建議127.5-150.0公斤", "山湖-易興网购#0035", "2026-08-15", "01"},
{"DK260815A160102", "26081394YBWB17", "黑色【原版好質量】,6XL建議127.5-150.0公斤", "山湖-易興网购#0035", "2026-08-15", "02"},
})
result, rows, err := parseInnerCodeWorkbook(book, "labels.xlsx", "user-1")
if err != nil {
t.Fatal(err)
}
if len(rows) != 1 || result.TotalRows != 2 || result.MergedRows != 1 {
t.Fatalf("聚合统计不正确 result=%+v rows=%+v", result, rows)
}
if rows[0].InnerCode != "DK260815A160101,DK260815A160102" || rows[0].SourceDuplicateCount != 2 {
t.Fatalf("多个单件码聚合不正确: %+v", rows[0])
}
}
func TestParseInnerCodeWorkbook_三个单件码稳定去重且超长时报错(t *testing.T) {
book := newInnerCodeCodeGroupTestBook(t, []string{"DK003", "DK001", "DK003", "DK002"})
result, rows, err := parseInnerCodeWorkbook(book, "labels.xlsx", "user-1")
book.Close()
if err != nil {
t.Fatal(err)
}
if len(rows) != 1 || rows[0].InnerCode != "DK003,DK001,DK002" || rows[0].SourceDuplicateCount != 4 || result.MergedRows != 3 {
t.Fatalf("稳定去重结果不正确 result=%+v rows=%+v", result, rows)
}
longBook := newInnerCodeCodeGroupTestBook(t, []string{strings.Repeat("A", 70), strings.Repeat("B", 70)})
defer longBook.Close()
_, _, err = parseInnerCodeWorkbook(longBook, "labels.xlsx", "user-1")
if err == nil || !strings.Contains(err.Error(), "连接后超过 128 个字符") {
t.Fatalf("期望聚合值超长错误,实际 %v", err)
}
}
func TestParseInnerCodeWorkbook_单件码不能占用聚合分隔符(t *testing.T) {
book := newInnerCodeCodeGroupTestBook(t, []string{"DK001,DK002"})
defer book.Close()
_, _, err := parseInnerCodeWorkbook(book, "labels.xlsx", "user-1")
if err == nil || !strings.Contains(err.Error(), "业务键相同") {
t.Fatalf("期望业务键冲突错误,实际 %v", err)
if err == nil || !strings.Contains(err.Error(), "不能包含英文逗号") {
t.Fatalf("期望逗号分隔符错误,实际 %v", err)
}
}
func TestValidateExistingInnerCodeOwners_聚合中的单件码不能串到其他业务键(t *testing.T) {
owners := []repository.InnerCodeCodeOwner{{
ID: 1, OrderNumber: "ORDER-1", Stall: "A#1", SpecKey: "黑色,M", InnerCode: "DK001,DK002",
}}
rows := []model.InnerCodeImportRow{{
BusinessDate: "2026-08-15", SourceRow: 8, OrderNumber: "ORDER-2", Stall: "B#2",
SpecKey: "白色,L", InnerCode: "DK002,DK003",
}}
if err := validateExistingInnerCodeOwners("2026-08-15", owners, rows); err == nil || !strings.Contains(err.Error(), "已属于另一条记录") {
t.Fatalf("期望组成码归属冲突,实际 %v", err)
}
rows[0].OrderNumber, rows[0].Stall, rows[0].SpecKey = "ORDER-1", "A#1", "黑色,M"
if err := validateExistingInnerCodeOwners("2026-08-15", owners, rows); err != nil {
t.Fatalf("同一业务键更新聚合值应允许,实际 %v", err)
}
}
@@ -195,6 +252,21 @@ func newInnerCodeDateTestBook(t *testing.T, businessDate string) *excelize.File
return book
}
func newInnerCodeCodeGroupTestBook(t *testing.T, codes []string) *excelize.File {
t.Helper()
book := excelize.NewFile()
defaultSheet := book.GetSheetList()[0]
if err := book.SetSheetName(defaultSheet, innerCodeSheetName); err != nil {
t.Fatal(err)
}
rows := [][]string{{"内部档口入库码", "Shopee订单编号", "清洗后规格", "档口及货号", "生成日期"}}
for _, code := range codes {
rows = append(rows, []string{code, "ORDER-1", "黑色,M", "A#1", "2026-08-15"})
}
setInnerCodeWorkbookRows(t, book, rows)
return book
}
func setInnerCodeWorkbookRows(t *testing.T, book *excelize.File, rows [][]string) {
t.Helper()
for rowIndex, row := range rows {