feat: 安全回写档口入库码并支持核验恢复 (#234)

This commit is contained in:
chengma
2026-08-15 09:10:10 +08:00
parent 15ebda23e3
commit 2778eed29f
11 changed files with 782 additions and 4 deletions
@@ -1083,6 +1083,40 @@ func prepareMySQLV8(t *testing.T, db *sql.DB) {
mustExec(t, db, `INSERT INTO schema_migrations(version,applied_at) VALUES(8,'2026-08-11T00:00:00Z')`)
}
func TestMySQLMigrate_V22升级V23且唯一约束生效(t *testing.T) {
db := openMySQLMigrationTestDB(t)
defer db.Close()
cleanMySQLTestSchema(t, db)
defer cleanMySQLTestSchema(t, db)
if err := MigrateMySQL(db); err != nil {
t.Fatal(err)
}
mustExec(t, db, `SET FOREIGN_KEY_CHECKS=0`)
mustExec(t, db, `DROP TABLE syb_inner_code_records`)
mustExec(t, db, `DELETE FROM schema_migrations WHERE version=23`)
mustExec(t, db, `SET FOREIGN_KEY_CHECKS=1`)
if err := MigrateMySQL(db); err != nil {
t.Fatalf("v22 升级 v23 失败: %v", err)
}
if err := MigrateMySQL(db); err != nil {
t.Fatalf("v23 重复迁移失败: %v", err)
}
if err := checkMySQLV23Shape(db); err != nil {
t.Fatal(err)
}
now := "2026-08-15T00:00:00Z"
mustExec(t, db, `INSERT INTO users(user_id,username,password_hash,role,status,password_changed_at,created_at,updated_at)
VALUES('inner-user','inner-user','hash','purchaser','active',?,?,?)`, now, now, now)
mustExec(t, db, `INSERT INTO syb_inner_code_records
(business_date,source_row,order_number,stall,spec_raw,spec_key,inner_code,status,created_by_user_id,created_at,updated_at)
VALUES('2026-08-15',2,'ORDER-1','A#1','黑色,M','黑色,M','DK-1','pending','inner-user',?,?)`, now, now)
if _, err := db.Exec(`INSERT INTO syb_inner_code_records
(business_date,source_row,order_number,stall,spec_raw,spec_key,inner_code,status,created_by_user_id,created_at,updated_at)
VALUES('2026-08-15',3,'ORDER-2','B#2','白色,L','白色,L','DK-1','pending','inner-user',?,?)`, now, now); err == nil {
t.Fatal("同一业务日期的 inner_code 唯一约束必须拒绝冲突")
}
}
func mustExec(t *testing.T, db *sql.DB, query string, args ...any) {
t.Helper()
if _, err := db.Exec(query, args...); err != nil {