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(['factory'])->poweredBy($factory)->get(); foreach ($devices as $device) { switch ($device->factory?->key) { case 'link-os': $this->createReportToLinkosDevice($device); break; } } sleep($sleep); }; } /** * 创建 linkos 设备报告 */ protected function createReportToLinkosDevice(Device $device): void { [$lastReportedAt, $latestReportedAt] = value(function (Device $device) { $lastReportedAt = null; $latestReportedAt = null; switch ($device->type) { case Device::TYPE_WATER_QUALITY: $lastReportedAt = WaterQualityDailyReport::where('device_id', $device->id) ->latest('reported_at') ->value('reported_at'); $lastReportedAt ??= WaterQualityReport::where('device_id', $device->id) ->oldest('reported_at') ->value('reported_at'); if ($lastReportedAt) { $latestReportedAt = WaterQualityReport::where('device_id', $device->id) ->latest('reported_at') ->value('reported_at'); } break; case Device::TYPE_METEOROLOGICAL: $lastReportedAt = MeteorologicalDailyReport::where('device_id', $device->id) ->latest('reported_at') ->value('reported_at'); $lastReportedAt ??= MeteorologicalReport::where('device_id', $device->id) ->oldest('reported_at') ->value('reported_at'); if ($lastReportedAt) { $latestReportedAt = MeteorologicalReport::where('device_id', $device->id) ->latest('reported_at') ->value('reported_at'); } break; case Device::TYPE_SOIL: $lastReportedAt = SoilDailyReport::where('device_id', $device->id) ->latest('reported_at') ->value('reported_at'); $lastReportedAt ??= SoilReport::where('device_id', $device->id) ->oldest('reported_at') ->value('reported_at'); if ($lastReportedAt) { $latestReportedAt = SoilReport::where('device_id', $device->id) ->latest('reported_at') ->value('reported_at'); } break; } return [$lastReportedAt, $latestReportedAt]; }, $device); if ($lastReportedAt === null || $latestReportedAt === null) { return; } /** @var \Carbon\Carbon */ $startAt = $lastReportedAt->copy()->startOfDay(); do { $this->deviceLogService->createDailyReportToLinkosDevice($device, $startAt->copy()); $startAt->addDay(); } while ($latestReportedAt->gte($startAt)); } }