feat: 增加顺运宝店铺筛选 (#151)

This commit is contained in:
chengma
2026-08-11 14:39:13 +08:00
parent 30bdab3e2e
commit 9d4d6fc1e5
20 changed files with 313 additions and 56 deletions
+45 -2
View File
@@ -19,7 +19,7 @@ import (
"cmautobuy/admin/spec"
)
const mysqlSchemaVersion = 10
const mysqlSchemaVersion = 11
// OpenMySQL 打开生产 MySQL 8 数据库。错误信息绝不包含完整 DSN 或密码。
func OpenMySQL(cfg config.DatabaseConfig) (*sql.DB, error) {
@@ -543,10 +543,50 @@ func MigrateMySQL(db *sql.DB) error {
if _, err := db.Exec(`INSERT INTO schema_migrations (version, applied_at) VALUES (?, ?)`, 10, time.Now().UTC().Format(time.RFC3339Nano)); err != nil {
return fmt.Errorf("记录 MySQL schema v10 失败: %w", err)
}
current = 10
}
if current < 11 {
if err := migrateMySQLV11(db); err != nil {
return fmt.Errorf("执行 MySQL schema v11 失败: %w", err)
}
if err := checkMySQLV11Shape(db); err != nil {
return fmt.Errorf("MySQL schema v11 自检失败,未记录版本: %w", err)
}
if _, err := db.Exec(`INSERT INTO schema_migrations (version, applied_at) VALUES (?, ?)`, 11, time.Now().UTC().Format(time.RFC3339Nano)); err != nil {
return fmt.Errorf("记录 MySQL schema v11 失败: %w", err)
}
}
return CheckMySQLSchema(db)
}
// migrateMySQLV11 增加顺运宝店铺列,并从保留的原始 JSON 回填历史数据。
// DDL 和 UPDATE 都可重放:中断后再次启动只补缺列和仍为空的记录。
func migrateMySQLV11(db *sql.DB) error {
exists, err := mysqlColumnExists(db, "syb_orders", "shop_name")
if err != nil {
return err
}
if !exists {
if _, err := db.Exec(`ALTER TABLE syb_orders ADD COLUMN shop_name VARCHAR(500) NULL AFTER order_no`); err != nil {
return fmt.Errorf("增加 syb_orders.shop_name 失败: %w", err)
}
}
if _, err := db.Exec(`UPDATE syb_orders
SET shop_name=NULLIF(TRIM(JSON_UNQUOTE(JSON_EXTRACT(
IF(JSON_VALID(syb_data),syb_data,'{}'),'$.stock.shopName'))),'')
WHERE shop_name IS NULL`); err != nil {
return fmt.Errorf("回填顺运宝店铺名失败: %w", err)
}
return nil
}
func checkMySQLV11Shape(db *sql.DB) error {
if err := checkMySQLVarcharColumn(db, "syb_orders", "shop_name", 500, true, "utf8mb4_0900_ai_ci", ""); err != nil {
return err
}
return checkMySQLNullDefault(db, "syb_orders", "shop_name")
}
// migrateMySQLV10 修复曾在 v8/v9 开发中间状态记录过版本的数据库。
// 两版迁移均逐项检查结构,v8 回填只处理空值,因此可安全重放;
// 历史 v8/v9 版本记录保持不变,完整自检通过后再追加 v10。
@@ -564,7 +604,10 @@ func checkMySQLV10Shape(db *sql.DB) error {
if err := checkMySQLV8Shape(db); err != nil {
return err
}
return checkMySQLV9Shape(db)
if err := checkMySQLV9Shape(db); err != nil {
return err
}
return nil
}
func migrateMySQLV9(db *sql.DB) error {