package repository import ( "errors" "fmt" "time" "gorm.io/gorm" "wails-app/internal/dao" "wails-app/internal/global" ) // Repository 封装设备接入记录读写,避免 API 层直接拼接 GORM 条件。 type Repository struct{} func New() *Repository { return &Repository{} } func (r *Repository) db() *gorm.DB { return global.GVA_DB } func (r *Repository) CreateDiscovery(record *dao.DeviceDiscovery) error { if r.db() == nil { return errors.New("数据库未初始化") } return r.db().Create(record).Error } func (r *Repository) LatestDiscovery(deviceID string) (*dao.DeviceDiscovery, error) { return r.latestDiscovery(deviceID, "") } func (r *Repository) LatestDiscoveryByMethod(deviceID, method string) (*dao.DeviceDiscovery, error) { return r.latestDiscovery(deviceID, method) } func (r *Repository) latestDiscovery(deviceID, method string) (*dao.DeviceDiscovery, error) { if r.db() == nil { return nil, errors.New("数据库未初始化") } var record dao.DeviceDiscovery query := r.db().Where("device_id = ?", deviceID) if method != "" { query = query.Where("provision_method = ?", method) } result := query.Order("created_at DESC").First(&record) if errors.Is(result.Error, gorm.ErrRecordNotFound) { return nil, fmt.Errorf("设备身份不存在或已过期") } if result.Error != nil { return nil, result.Error } if time.Now().After(record.ExpiredAt) { return nil, fmt.Errorf("设备身份记录已过期,请重新读取") } return &record, nil } func (r *Repository) SaveDiscovery(record *dao.DeviceDiscovery) error { if r.db() == nil { return errors.New("数据库未初始化") } return r.db().Save(record).Error } func (r *Repository) ActiveDiscoveries() ([]dao.DeviceDiscovery, error) { if r.db() == nil { return nil, errors.New("数据库未初始化") } var records []dao.DeviceDiscovery result := r.db().Where("expired_at > ? AND provision_method = ?", time.Now(), "auto_udp").Order("created_at DESC").Find(&records) return records, result.Error } func (r *Repository) ReaderByDeviceID(deviceID string) (*dao.UHFReader, error) { if r.db() == nil { return nil, errors.New("数据库未初始化") } var reader dao.UHFReader result := r.db().Where("device_id = ?", deviceID).First(&reader) if errors.Is(result.Error, gorm.ErrRecordNotFound) { return nil, nil } return &reader, result.Error }