deviceLogService = $deviceLogService; $factory = $this->argument('factory'); $sleep = (int) value(fn ($sleep) => is_numeric($sleep) ? $sleep : 300, $this->option('sleep')); while (true) { /** @var \Illuminate\Database\Eloquent\Collection */ $devices = Device::with(['supplier'])->supplierBy($factory)->get(); foreach ($devices as $device) { switch ($device->supplier?->key) { case 'linkos': $this->createReportToLinkosDevice($device); break; } } sleep($sleep); }; } /** * 创建 linkos 设备报告 */ protected function createReportToLinkosDevice(Device $device): void { $lastReportedAt = match ($device->type) { DeviceType::Soil => SoilMonitoringLog::where('device_id', $device->id)->latest('monitored_at')->value('monitored_at'), DeviceType::WaterQuality => WaterQualityMonitoringLog::where('device_id', $device->id)->latest('monitored_at')->value('monitored_at'), DeviceType::Meteorological => MeteorologicalMonitoringLog::where('device_id', $device->id)->latest('monitored_at')->value('monitored_at'), default => null, }; if (is_null($lastReportedAt ??= LinkosDeviceLog::where('device_id', $device->sn)->oldest('reported_at')->value('reported_at'))) { return; } if (is_null($latestReportedAt = LinkosDeviceLog::where('device_id', $device->sn)->latest('reported_at')->value('reported_at'))) { return; } /** @var \Carbon\Carbon */ $startAt = $lastReportedAt->copy()->startOfHour(); do { $this->deviceLogService->createReportToLinkosDevice($device, $startAt->copy()); $startAt->addHour(); } while ($latestReportedAt->gte($startAt)); } }