feat: queue and reconcile SYB purchase order numbers (#305)

This commit is contained in:
QiuSW
2026-09-18 10:13:20 +08:00
parent 07a3817591
commit e89de1a085
22 changed files with 1126 additions and 61 deletions
+1
View File
@@ -119,6 +119,7 @@ func run() error {
}
goautoreplacement.RecoverMatching(db)
goautopurchase.RecoverPurchaseMatching(db)
goautopurchase.RecoverOrderWritebacks(db)
goautotask.RecoverReplacementActivations(db)
}
offlineMonitorContext, stopOfflineMonitors := context.WithCancel(context.Background())
@@ -0,0 +1,28 @@
package version_local
import (
"go-admin/app/goauto/models"
"go-admin/cmd/migrate/migration"
common "go-admin/common/models"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"runtime"
)
func init() {
_, file, _, _ := runtime.Caller(0)
migration.Migrate.SetVersion(migration.GetFilename(file), migratePurchaseOrderWriteback)
}
// Append-only schema. Never queues historical purchases or changes job switches.
func migratePurchaseOrderWriteback(db *gorm.DB, version string) error {
return db.Transaction(func(tx *gorm.DB) error {
if err := tx.AutoMigrate(&models.PurchaseOrderWriteback{}, &models.PurchaseOrderWritebackCommand{}, &models.PurchaseOrderWritebackLease{}); err != nil {
return err
}
if err := tx.Clauses(clause.OnConflict{DoNothing: true}).Create(&models.PurchaseOrderWritebackLease{ID: 1}).Error; err != nil {
return err
}
return tx.Create(&common.Migration{Version: version}).Error
})
}
@@ -0,0 +1,50 @@
package version_local
import (
"go-admin/app/goauto/models"
common "go-admin/common/models"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"testing"
)
func TestPurchaseOrderWritebackMigrationPreservesFacts(t *testing.T) {
db, err := gorm.Open(sqlite.Open("file:"+t.Name()+"?mode=memory&cache=shared"), &gorm.Config{})
if err != nil {
t.Fatal(err)
}
if err = db.AutoMigrate(&common.Migration{}); err != nil {
t.Fatal(err)
}
if err = db.Exec("CREATE TABLE purchase_task (id integer primary key, status text)").Error; err != nil {
t.Fatal(err)
}
if err = db.Exec("INSERT INTO purchase_task VALUES (1, 'order_created')").Error; err != nil {
t.Fatal(err)
}
if err = migratePurchaseOrderWriteback(db, "1789800200000"); err != nil {
t.Fatal(err)
}
if err = db.Model(&models.PurchaseOrderWritebackLease{}).Where("id = 1").Update("owner", "active-owner").Error; err != nil {
t.Fatal(err)
}
// Repeating schema work must neither queue history nor reset an active lease.
if err = migratePurchaseOrderWriteback(db, "repeat-schema-test"); err != nil {
t.Fatal(err)
}
var lease models.PurchaseOrderWritebackLease
if err = db.First(&lease, 1).Error; err != nil || lease.Owner != "active-owner" {
t.Fatal("lease reset", err)
}
var count int64
if err = db.Model(&models.PurchaseOrderWriteback{}).Count(&count).Error; err != nil || count != 0 {
t.Fatal("history queued", err)
}
var status string
if err = db.Table("purchase_task").Select("status").Where("id = 1").Scan(&status).Error; err != nil || status != "order_created" {
t.Fatal("purchase changed", err)
}
if err = db.Model(&common.Migration{}).Where("version = ?", "1789800200000").Count(&count).Error; err != nil || count != 1 {
t.Fatal("version missing", err)
}
}