diff --git a/app/Casts/AsJsonObject.php b/app/Casts/AsJsonObject.php new file mode 100644 index 0000000..842c219 --- /dev/null +++ b/app/Casts/AsJsonObject.php @@ -0,0 +1,46 @@ +get(); + + // 物联平台目前只有水质监测设备和气象监测设备 + LinkosDeviceLog::orderBy('reported_at', 'asc')->lazy()->each(function ($log) use ($devices) { + if (empty($log->data)) { + return; + } + + foreach ($devices as $device) { + if ($device->sn !== $log->device_id) { + continue; + } + + match ($device->type) { + DeviceType::Soil => $this->handleSoildDeviceLog($device, $log), + DeviceType::WaterQuality => $this->handleWaterQualityDeviceLog($device, $log), + DeviceType::Meteorological => $this->handleMeteorologicalDeviceLog($device, $log), + }; + } + }); + + return Command::SUCCESS; + } + + protected function handleSoildDeviceLog(Device $device, LinkosDeviceLog $log) + { + $attributes = [ + 'conductivity' => 'conductivity', + 'soil_humidity' => 'humidity', + 'soil_temperature' => 'temperature', + 'nitrogen_content' => 'n', + 'phosphorus_content' => 'p', + 'potassium_content' => 'k', + ]; + + if (! Arr::hasAny($log->data, array_keys($attributes))) { + return; + } + + $monitoringLog = SoilMonitoringLog::firstOrCreate([ + 'device_id' => $device->id, + 'monitored_at' => $log->reported_at->startOfHour(), + ], [ + 'agricultural_base_id' => $device->agricultural_base_id, + ]); + + foreach ($attributes as $key => $attribute) { + if (! array_key_exists($key, $log->data)) { + continue; + } + + $monitoringLog->{$attribute} = $log->data[$key]; + } + + $monitoringLog->save(); + } + + protected function handleWaterQualityDeviceLog(Device $device, LinkosDeviceLog $log) + { + $attributes = [ + 'conductivity' => 'conductivity', + 'oxygen' => 'oxygen', + 'chlorine' => 'chlorine', + 'turbidity' => 'turbidity', + 'temp' => 'temperature', + 'ph' => 'ph', + ]; + + if (! Arr::hasAny($log->data, array_keys($attributes))) { + return; + } + + $monitoringLog = WaterQualityMonitoringLog::firstOrCreate([ + 'device_id' => $device->id, + 'monitored_at' => $log->reported_at->startOfHour(), + ], [ + 'agricultural_base_id' => $device->agricultural_base_id, + ]); + + foreach ($attributes as $key => $attribute) { + if (! array_key_exists($key, $log->data)) { + continue; + } + + $monitoringLog->{$attribute} = $log->data[$key]; + } + + $monitoringLog->save(); + } + + protected function handleMeteorologicalDeviceLog(Device $device, LinkosDeviceLog $log) + { + $attributes = [ + 'wind_speed' => 'wind_speed', + 'wind_power' => 'wind_power', + 'wind_direction' => 'wind_direction', + 'wind_degree' => 'wind_degree', + 'box_humidity' => 'air_humidity', + 'box_temperature' => 'air_temperature', + 'box_pressure' => 'air_pressure', + 'box_carbon' => 'co2', + 'box_noise' => 'noise', + 'box_illumination' => 'illumination', + 'accumulate_rainfall' => 'accumulated_rainfall', + 'current_rainfall' => 'current_rainfall', + 'moment_rainfall' => 'moment_rainfall', + 'day_rainfall' => 'day_rainfall', + 'pm25_concentration' => 'pm25', + 'pm10_concentration' => 'pm10', + ]; + + if (! Arr::hasAny($log->data, array_keys($attributes))) { + return; + } + + $monitoringLog = MeteorologicalMonitoringLog::firstOrCreate([ + 'device_id' => $device->id, + 'monitored_at' => $log->reported_at->startOfHour(), + ], [ + 'agricultural_base_id' => $device->agricultural_base_id, + ]); + + foreach ($attributes as $key => $attribute) { + if (! array_key_exists($key, $log->data)) { + continue; + } + + $monitoringLog->{$attribute} = $log->data[$key]; + } + + $monitoringLog->save(); + } +} diff --git a/app/Models/LinkosDeviceLog.php b/app/Models/LinkosDeviceLog.php index ea83355..9b0e379 100644 --- a/app/Models/LinkosDeviceLog.php +++ b/app/Models/LinkosDeviceLog.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Casts\AsJsonObject; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -10,6 +11,7 @@ class LinkosDeviceLog extends Model use HasFactory; protected $casts = [ + 'data' => AsJsonObject::class, 'reported_at' => 'datetime', ]; diff --git a/database/migrations/2022_10_18_164910_create_soil_monitoring_logs_table.php b/database/migrations/2022_10_18_164910_create_soil_monitoring_logs_table.php index 78d973e..7462015 100644 --- a/database/migrations/2022_10_18_164910_create_soil_monitoring_logs_table.php +++ b/database/migrations/2022_10_18_164910_create_soil_monitoring_logs_table.php @@ -27,9 +27,8 @@ return new class extends Migration $table->timestamps(); // 索引 - $table->index('device_id'); $table->index('agricultural_base_id'); - $table->unique('monitored_at'); + $table->unique(['device_id', 'monitored_at']); }); } diff --git a/database/migrations/2022_10_18_172650_create_meteorological_monitoring_logs_table.php b/database/migrations/2022_10_18_172650_create_meteorological_monitoring_logs_table.php index e57dfa3..6dbd19f 100644 --- a/database/migrations/2022_10_18_172650_create_meteorological_monitoring_logs_table.php +++ b/database/migrations/2022_10_18_172650_create_meteorological_monitoring_logs_table.php @@ -37,9 +37,8 @@ return new class extends Migration $table->timestamps(); // 索引 - $table->index('device_id'); $table->index('agricultural_base_id'); - $table->unique('monitored_at'); + $table->unique(['device_id', 'monitored_at']); }); } diff --git a/database/migrations/2022_10_19_102446_create_water_quality_monitoring_logs_table.php b/database/migrations/2022_10_19_102446_create_water_quality_monitoring_logs_table.php index 928cee4..8510797 100644 --- a/database/migrations/2022_10_19_102446_create_water_quality_monitoring_logs_table.php +++ b/database/migrations/2022_10_19_102446_create_water_quality_monitoring_logs_table.php @@ -26,9 +26,8 @@ return new class extends Migration $table->timestamp('monitored_at')->comment('监控时间(小时)'); $table->timestamps(); - $table->index('device_id'); $table->index('agricultural_base_id'); - $table->unique('monitored_at'); + $table->unique(['device_id', 'monitored_at']); }); }