feat: 顺运宝支持输入 PDD 商品 ID (#95)

This commit is contained in:
chengma
2026-08-10 14:26:03 +08:00
parent 701d512d2d
commit 775e38894e
6 changed files with 154 additions and 7 deletions
+35 -1
View File
@@ -12,6 +12,36 @@ import (
// ErrPddAssociationReplaceRequired 表示当前蝦皮商品已经关联了另一个 PDD 商品。
var ErrPddAssociationReplaceRequired = errors.New("更换 PDD 商品需要明确确认")
const canonicalPddGoodsURL = "https://mobile.yangkeduo.com/goods.html?goods_id="
// normalizeSybPddReference 只在顺运宝详情入口兼容纯商品 ID。
// 其他入口仍沿用完整 PDD 链接校验,避免无意扩大已经确认的输入范围。
func normalizeSybPddReference(raw string) (string, error) {
value := strings.TrimSpace(raw)
if value == "" {
return "", fmt.Errorf("%w: PDD 商品链接或商品 ID 不能为空", ErrBadPddURL)
}
if isGoodsID(value) {
return canonicalPddGoodsURL + value, nil
}
if isASCIIDigits(value) {
return "", fmt.Errorf("%w: PDD 商品 ID 必须是 6~24 位纯数字", ErrBadPddURL)
}
if !strings.Contains(value, "://") {
return "", fmt.Errorf("%w: 请输入带 goods_id 的完整拼多多链接,或 6~24 位纯数字商品 ID", ErrBadPddURL)
}
return value, nil
}
func isASCIIDigits(value string) bool {
for _, char := range value {
if char < '0' || char > '9' {
return false
}
}
return true
}
// AssociateShopeePdd 把蝦皮商品关联到 PDD 商品档案。
// 解析、建档/复活和关联更新在同一事务内完成,任一步失败都不留下半成品。
func AssociateShopeePdd(db *sql.DB, shopeeGoodsID, rawURL string, confirmReplace bool) (string, error) {
@@ -81,7 +111,11 @@ func AssociateSybPdd(db *sql.DB, sybID, rawURL string, confirmReplace bool) (str
if context.Order.SpecKey == "" {
return "", fmt.Errorf("顺运宝未提供规格,不能进入采购流程")
}
return AssociateShopeePdd(db, context.Order.ShopeeGoodsID, rawURL, confirmReplace)
normalizedURL, err := normalizeSybPddReference(rawURL)
if err != nil {
return "", err
}
return AssociateShopeePdd(db, context.Order.ShopeeGoodsID, normalizedURL, confirmReplace)
}
// CreateSybPddCollectTask 按顺运宝明细当前关联创建采集任务。