fix(query): 支持12位纯数字时间编号(如202609040184)商品编号的精准索引路由
This commit is contained in:
@@ -1,6 +1,12 @@
|
||||
package listing
|
||||
|
||||
import "testing"
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"gorm.io/driver/sqlite"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func TestFilterAdminListingsByAssetLevels(t *testing.T) {
|
||||
items := []ListingDTO{
|
||||
@@ -92,3 +98,49 @@ func TestFilterAdminListingsBySkinGroupOnly(t *testing.T) {
|
||||
t.Fatalf("expected only listing 2 by gold skin group, got %#v", filtered)
|
||||
}
|
||||
}
|
||||
|
||||
func TestApplyAdminListFiltersSmartRouting(t *testing.T) {
|
||||
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{DryRun: true})
|
||||
if err != nil {
|
||||
t.Fatalf("打开测试数据库失败: %v", err)
|
||||
}
|
||||
repo := &Repository{}
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
query AdminListQuery
|
||||
wantSQLFrag string
|
||||
}{
|
||||
{
|
||||
name: "12位时间计算的纯数字商品编号路由至rental_listings(listing_no)",
|
||||
query: AdminListQuery{Keyword: "202609040184"},
|
||||
wantSQLFrag: "l.listing_no = ?",
|
||||
},
|
||||
{
|
||||
name: "L前缀商品编号路由至rental_listings(listing_no)",
|
||||
query: AdminListQuery{Keyword: "L20260905100"},
|
||||
wantSQLFrag: "l.listing_no = ?",
|
||||
},
|
||||
{
|
||||
name: "RO前缀订单号路由至EXISTS订单唯一索引",
|
||||
query: AdminListQuery{Keyword: "RO202609051000"},
|
||||
wantSQLFrag: "o.order_no = ?",
|
||||
},
|
||||
{
|
||||
name: "短数字ID路由至主键及关联ID",
|
||||
query: AdminListQuery{Keyword: "12345"},
|
||||
wantSQLFrag: "l.listing_no = ? OR EXISTS (SELECT 1 FROM rental_orders AS o WHERE o.listing_id = l.id AND o.order_no = ?) OR l.id = ?",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
stmt := repo.applyAdminListFilters(db.Table("rental_listings AS l"), tt.query).Find(&[]struct{}{}).Statement
|
||||
sql := stmt.SQL.String()
|
||||
if !strings.Contains(sql, tt.wantSQLFrag) {
|
||||
t.Fatalf("期望 SQL 包含 %q, 实际生成: %s", tt.wantSQLFrag, sql)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -104,8 +104,8 @@ func (r *Repository) applyAdminListFilters(db *gorm.DB, query AdminListQuery) *g
|
||||
if strings.HasPrefix(upper, "RO") || strings.HasPrefix(upper, "ORD") {
|
||||
// 订单号:命中 rental_orders(order_no) 唯一索引
|
||||
db = db.Where("EXISTS (SELECT 1 FROM rental_orders AS o WHERE o.listing_id = l.id AND o.order_no = ?)", keyword)
|
||||
} else if strings.HasPrefix(upper, "L") {
|
||||
// 商品编号:命中 rental_listings(listing_no) 唯一索引
|
||||
} else if strings.HasPrefix(upper, "L") || (len(keyword) >= 12 && isAllDigits(keyword)) {
|
||||
// 商品编号(如 L前缀或时间计算生成的 12位纯数字如 202609040184):命中 rental_listings(listing_no) 唯一索引
|
||||
db = db.Where("l.listing_no = ?", keyword)
|
||||
} else if id, err := strconv.ParseUint(keyword, 10, 64); err == nil && id > 0 && keyword[0] != '0' && id < 100000000 {
|
||||
db = db.Where(
|
||||
@@ -277,3 +277,16 @@ func (r *Repository) nextListingNo(tx *gorm.DB, now time.Time) (string, error) {
|
||||
}
|
||||
return fmt.Sprintf("%s%04d", bizDate, seq), nil
|
||||
}
|
||||
|
||||
func isAllDigits(s string) bool {
|
||||
if s == "" {
|
||||
return false
|
||||
}
|
||||
for i := 0; i < len(s); i++ {
|
||||
if s[i] < '0' || s[i] > '9' {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user