subHour()->startOfHour(); if ($hour = $this->argument('hour')) { $time = Carbon::createFromFormat('Y-m-d H:i:s', $hour)->startOfHour(); } $devices = Device::where('type', DeviceType::Soil) ->where('status', DeviceStatus::Online) ->get(); foreach ($devices as $device) { $last = SoilMonitoringLog::where('device_id', $device->id) ->where('monitored_at', $time->copy()->subHour()) ->first(); if ($last === null) { continue; } try { $log = SoilMonitoringLog::firstOrCreate([ 'device_id' => $device->id, 'monitored_at' => $time, ], [ 'agricultural_base_id' => $device->agricultural_base_id, ]); foreach ([ 'conductivity', 'humidity', 'temperature', 'n', 'p', 'k', ] as $key) { if (is_null($log->{$key})) { $log->{$key} = $last->{$key}; } } if ($log->isDirty()) { $log->is_filled = true; } $log->save(); if ($log->wasChanged()) { $linkosDeviceLogService->handleSoilMonitoringDailyLog($device, $time); } } catch (Throwable $e) { report($e); } } return Command::SUCCESS; } }