repo.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package repository
  2. import (
  3. "errors"
  4. "fmt"
  5. "time"
  6. "gorm.io/gorm"
  7. "wails-app/internal/dao"
  8. "wails-app/internal/global"
  9. )
  10. // Repository 封装设备接入记录读写,避免 API 层直接拼接 GORM 条件。
  11. type Repository struct{}
  12. func New() *Repository { return &Repository{} }
  13. func (r *Repository) db() *gorm.DB { return global.GVA_DB }
  14. func (r *Repository) CreateDiscovery(record *dao.DeviceDiscovery) error {
  15. if r.db() == nil {
  16. return errors.New("数据库未初始化")
  17. }
  18. return r.db().Create(record).Error
  19. }
  20. func (r *Repository) LatestDiscovery(deviceID string) (*dao.DeviceDiscovery, error) {
  21. return r.latestDiscovery(deviceID, "")
  22. }
  23. func (r *Repository) LatestDiscoveryByMethod(deviceID, method string) (*dao.DeviceDiscovery, error) {
  24. return r.latestDiscovery(deviceID, method)
  25. }
  26. func (r *Repository) latestDiscovery(deviceID, method string) (*dao.DeviceDiscovery, error) {
  27. if r.db() == nil {
  28. return nil, errors.New("数据库未初始化")
  29. }
  30. var record dao.DeviceDiscovery
  31. query := r.db().Where("device_id = ?", deviceID)
  32. if method != "" {
  33. query = query.Where("provision_method = ?", method)
  34. }
  35. result := query.Order("created_at DESC").First(&record)
  36. if errors.Is(result.Error, gorm.ErrRecordNotFound) {
  37. return nil, fmt.Errorf("设备身份不存在或已过期")
  38. }
  39. if result.Error != nil {
  40. return nil, result.Error
  41. }
  42. if time.Now().After(record.ExpiredAt) {
  43. return nil, fmt.Errorf("设备身份记录已过期,请重新读取")
  44. }
  45. return &record, nil
  46. }
  47. func (r *Repository) SaveDiscovery(record *dao.DeviceDiscovery) error {
  48. if r.db() == nil {
  49. return errors.New("数据库未初始化")
  50. }
  51. return r.db().Save(record).Error
  52. }
  53. func (r *Repository) ActiveDiscoveries() ([]dao.DeviceDiscovery, error) {
  54. if r.db() == nil {
  55. return nil, errors.New("数据库未初始化")
  56. }
  57. var records []dao.DeviceDiscovery
  58. result := r.db().Where("expired_at > ? AND provision_method = ?", time.Now(), "auto_udp").Order("created_at DESC").Find(&records)
  59. return records, result.Error
  60. }
  61. func (r *Repository) ReaderByDeviceID(deviceID string) (*dao.UHFReader, error) {
  62. if r.db() == nil {
  63. return nil, errors.New("数据库未初始化")
  64. }
  65. var reader dao.UHFReader
  66. result := r.db().Where("device_id = ?", deviceID).First(&reader)
  67. if errors.Is(result.Error, gorm.ErrRecordNotFound) {
  68. return nil, nil
  69. }
  70. return &reader, result.Error
  71. }