central_payment_seed.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package initialize
  2. import (
  3. "errors"
  4. "fmt"
  5. "gorm.io/gorm"
  6. "wails-app/internal/dao"
  7. "wails-app/internal/global"
  8. utils "wails-app/internal/pkg"
  9. )
  10. const (
  11. pofSimulatorDeviceID = "POF-SIM-01"
  12. pofSimulatorUsername = "admin"
  13. pofSimulatorPassword = "admin"
  14. legacyPOFSimulatorUsername = "pof-sim"
  15. )
  16. // EnsureCentralPaymentConfiguration creates the POF payment entry and a local
  17. // simulator credential. Real equipment must use a separately created device.
  18. func EnsureCentralPaymentConfiguration() error {
  19. db := global.GVA_DB
  20. if db == nil {
  21. return nil
  22. }
  23. if err := db.AutoMigrate(&dao.CentralPaymentDevice{}, &dao.CentralPaymentToken{}, &dao.CentralPaymentRequestLog{}); err != nil {
  24. return fmt.Errorf("初始化中央缴费机表失败: %w", err)
  25. }
  26. var entry dao.PaymentEntryConfig
  27. err := db.Where("code = ?", "central_payment_machine").First(&entry).Error
  28. if errors.Is(err, gorm.ErrRecordNotFound) {
  29. entry = dao.PaymentEntryConfig{
  30. Code: "central_payment_machine", Name: "中央缴费机", Enabled: true, Sort: 30,
  31. IsSystem: true, Description: "POF 标准协议中央缴费机发起的支付",
  32. }
  33. if err := db.Create(&entry).Error; err != nil {
  34. return fmt.Errorf("初始化中央缴费机支付入口失败: %w", err)
  35. }
  36. } else if err != nil {
  37. return err
  38. }
  39. for index, methodCode := range []string{"cash", "pos"} {
  40. var relationCount int64
  41. if err := db.Model(&dao.PaymentEntryMethod{}).Where("entry_code = ? AND method_code = ?", entry.Code, methodCode).Count(&relationCount).Error; err != nil {
  42. return err
  43. }
  44. if relationCount == 0 {
  45. if err := db.Create(&dao.PaymentEntryMethod{EntryCode: entry.Code, MethodCode: methodCode, Sort: index * 10}).Error; err != nil {
  46. return fmt.Errorf("初始化中央缴费机支付方式失败: %w", err)
  47. }
  48. }
  49. }
  50. var device dao.CentralPaymentDevice
  51. err = db.Where("device_id = ?", pofSimulatorDeviceID).First(&device).Error
  52. if errors.Is(err, gorm.ErrRecordNotFound) {
  53. device = dao.CentralPaymentDevice{
  54. DeviceID: pofSimulatorDeviceID, Username: pofSimulatorUsername,
  55. PasswordHash: utils.BcryptHash(pofSimulatorPassword), Enabled: true,
  56. PaymentEntry: "central_payment_machine", Description: "仅用于本地 POF 模拟桩联调,真机启用前应禁用或删除",
  57. }
  58. if err := db.Create(&device).Error; err != nil {
  59. return fmt.Errorf("初始化 POF 模拟设备失败: %w", err)
  60. }
  61. } else if err != nil {
  62. return err
  63. } else if device.Username == legacyPOFSimulatorUsername {
  64. if err := db.Model(&device).Updates(map[string]interface{}{
  65. "username": pofSimulatorUsername,
  66. "password_hash": utils.BcryptHash(pofSimulatorPassword),
  67. }).Error; err != nil {
  68. return fmt.Errorf("升级 POF 模拟设备登录凭据失败: %w", err)
  69. }
  70. }
  71. return nil
  72. }