package collection import ( "time" "git.huangwc.com/pig/pig-farm-controller/internal/domain/device" "git.huangwc.com/pig/pig-farm-controller/internal/infra/logs" "git.huangwc.com/pig/pig-farm-controller/internal/infra/models" "git.huangwc.com/pig/pig-farm-controller/internal/infra/repository" ) // TimedCollector 实现了 Collector 接口,用于定时从数据库获取设备信息并下发采集指令 type TimedCollector struct { deviceRepo repository.DeviceRepository deviceService device.Service logger *logs.Logger interval time.Duration ticker *time.Ticker done chan bool } // NewTimedCollector 创建一个定时采集器实例 func NewTimedCollector( deviceRepo repository.DeviceRepository, deviceService device.Service, logger *logs.Logger, interval time.Duration, ) Collector { return &TimedCollector{ deviceRepo: deviceRepo, deviceService: deviceService, logger: logger, interval: interval, done: make(chan bool), } } // Start 开始定时采集 func (c *TimedCollector) Start() { c.logger.Infof("定时采集器启动,采集间隔: %s", c.interval) c.ticker = time.NewTicker(c.interval) go func() { for { select { case <-c.done: return case <-c.ticker.C: c.collect() } } }() } // Stop 停止定时采集 func (c *TimedCollector) Stop() { c.logger.Info("定时采集器停止") c.ticker.Stop() c.done <- true } // collect 是核心的采集逻辑 func (c *TimedCollector) collect() { c.logger.Info("开始新一轮的设备数据采集") sensors, err := c.deviceRepo.ListAllSensors() if err != nil { c.logger.Errorf("采集周期: 从数据库获取所有传感器失败: %v", err) return } if len(sensors) == 0 { c.logger.Info("采集周期: 未发现任何传感器设备,跳过本次采集") return } sensorsByController := make(map[uint][]*models.Device) for _, sensor := range sensors { sensorsByController[sensor.AreaControllerID] = append(sensorsByController[sensor.AreaControllerID], sensor) } for controllerID, controllerSensors := range sensorsByController { c.logger.Infof("采集周期: 准备为区域主控 %d 下的 %d 个传感器下发采集指令", controllerID, len(controllerSensors)) if err := c.deviceService.Collect(controllerID, controllerSensors); err != nil { c.logger.Errorf("采集周期: 为区域主控 %d 下发采集指令失败: %v", controllerID, err) } } c.logger.Info("本轮设备数据采集完成") }