package initialize import ( "errors" "fmt" "gorm.io/gorm" "wails-app/internal/dao" "wails-app/internal/global" utils "wails-app/internal/pkg" ) const ( pofSimulatorDeviceID = "POF-SIM-01" pofSimulatorUsername = "admin" pofSimulatorPassword = "admin" legacyPOFSimulatorUsername = "pof-sim" ) // EnsureCentralPaymentConfiguration creates the POF payment entry and a local // simulator credential. Real equipment must use a separately created device. func EnsureCentralPaymentConfiguration() error { db := global.GVA_DB if db == nil { return nil } if err := db.AutoMigrate(&dao.CentralPaymentDevice{}, &dao.CentralPaymentToken{}, &dao.CentralPaymentRequestLog{}); err != nil { return fmt.Errorf("初始化中央缴费机表失败: %w", err) } var entry dao.PaymentEntryConfig err := db.Where("code = ?", "central_payment_machine").First(&entry).Error if errors.Is(err, gorm.ErrRecordNotFound) { entry = dao.PaymentEntryConfig{ Code: "central_payment_machine", Name: "中央缴费机", Enabled: true, Sort: 30, IsSystem: true, Description: "POF 标准协议中央缴费机发起的支付", } if err := db.Create(&entry).Error; err != nil { return fmt.Errorf("初始化中央缴费机支付入口失败: %w", err) } } else if err != nil { return err } for index, methodCode := range []string{"cash", "pos"} { var relationCount int64 if err := db.Model(&dao.PaymentEntryMethod{}).Where("entry_code = ? AND method_code = ?", entry.Code, methodCode).Count(&relationCount).Error; err != nil { return err } if relationCount == 0 { if err := db.Create(&dao.PaymentEntryMethod{EntryCode: entry.Code, MethodCode: methodCode, Sort: index * 10}).Error; err != nil { return fmt.Errorf("初始化中央缴费机支付方式失败: %w", err) } } } var device dao.CentralPaymentDevice err = db.Where("device_id = ?", pofSimulatorDeviceID).First(&device).Error if errors.Is(err, gorm.ErrRecordNotFound) { device = dao.CentralPaymentDevice{ DeviceID: pofSimulatorDeviceID, Username: pofSimulatorUsername, PasswordHash: utils.BcryptHash(pofSimulatorPassword), Enabled: true, PaymentEntry: "central_payment_machine", Description: "仅用于本地 POF 模拟桩联调,真机启用前应禁用或删除", } if err := db.Create(&device).Error; err != nil { return fmt.Errorf("初始化 POF 模拟设备失败: %w", err) } } else if err != nil { return err } else if device.Username == legacyPOFSimulatorUsername { if err := db.Model(&device).Updates(map[string]interface{}{ "username": pofSimulatorUsername, "password_hash": utils.BcryptHash(pofSimulatorPassword), }).Error; err != nil { return fmt.Errorf("升级 POF 模拟设备登录凭据失败: %w", err) } } return nil }