diff --git a/app/Http/Controllers/AgriculturalBaseController.php b/app/Http/Controllers/AgriculturalBaseController.php index f735888..0a19aff 100644 --- a/app/Http/Controllers/AgriculturalBaseController.php +++ b/app/Http/Controllers/AgriculturalBaseController.php @@ -3,12 +3,13 @@ namespace App\Http\Controllers; use App\Enums\BaseType; +use App\Enums\DeviceType; use App\Helpers\Paginator; +use Illuminate\Http\Request; +use App\Models\AgriculturalBase; +use Illuminate\Support\Facades\DB; use App\Http\Requestes\AgriculturalBaseRequest; use App\Http\Resources\AgriculturalBaseResource; -use App\Models\AgriculturalBase; -use Illuminate\Http\Request; -use Illuminate\Support\Facades\DB; class AgriculturalBaseController extends Controller { @@ -23,7 +24,7 @@ class AgriculturalBaseController extends Controller $query = AgriculturalBase::with('crops')->filter($request->all())->sort(); $list = $query->simplePaginate(Paginator::resolvePerPage('per_page', 20, 50)); - return AgriculturalBaseResource::collection($list); + return $this->json(AgriculturalBaseResource::collection($list)); } public function store(AgriculturalBaseRequest $request) @@ -98,4 +99,16 @@ class AgriculturalBaseController extends Controller return $this->success('删除成功!'); } + + /** + * 获取指定设备类型下有设备的基地 + */ + public function deviceBase(Request $request){ + $deviceType = $request->input('device_type', DeviceType::Monitor); + $list = AgriculturalBase::filter($request->all())->whereHas('devices', function($q) use ($deviceType){ + return $q->where('type', $deviceType); + })->get(); + + return $this->json(AgriculturalBaseResource::collection($list)); + } } diff --git a/app/Http/Controllers/DeviceController.php b/app/Http/Controllers/DeviceController.php index 3acc40f..e614d74 100644 --- a/app/Http/Controllers/DeviceController.php +++ b/app/Http/Controllers/DeviceController.php @@ -93,9 +93,9 @@ class DeviceController extends Controller $data = []; for ($i = 0; $i < 24; $i++){ $_key = date('Y-m-d').' '.str_pad($i, 2, '0',STR_PAD_LEFT).':00:00'; - $data[$_key] = 0; + $data[$_key] = null; if(isset($dataList[$_key])){ - $data[$_key] = $dataList[$_key][$deviceColumn] ?? 0; + $data[$_key] = $dataList[$_key][$deviceColumn] ?? null; } } break; @@ -105,9 +105,9 @@ class DeviceController extends Controller $data = []; for ($i = 0; $i < 24; $i++){ $_key = date('Y-m-d').' '.str_pad($i, 2, '0',STR_PAD_LEFT).':00:00'; - $data[$_key] = 0; + $data[$_key] = null; if(isset($dataList[$_key])){ - $data[$_key] = $dataList[$_key][$deviceColumn] ?? 0; + $data[$_key] = $dataList[$_key][$deviceColumn] ?? null; } } break; @@ -118,4 +118,64 @@ class DeviceController extends Controller ]); } + /** + * 获取指定基地指定设备类型的所有设备指定维度数据 + */ + public function baseDataStatics(Request $request) + { + $baseId = $request->input('base_id'); + $deviceType = $request->input('device_type'); + $deviceColumn = $request->input('device_column');//指定字段 + + //先获取基地下该类型所有设备 + $deviceData = Device::where([ + 'agricultural_base_id' => $baseId, + 'type' => $deviceType + ])->get(); + + $data = []; + switch ($deviceType){ + case DeviceType::Monitor->value://监控设备 + $data = DeviceResource::collection($deviceData); + break; + case DeviceType::Soil->value: + $dataList = SoilMonitoringLog::where('agricultural_base_id', $baseId)->whereDate('monitored_at', now())->get()->groupBy('device_id'); + + foreach ($deviceData as $device){ + $_dataList = $dataList->get($device->id); + $data[$device->monitoring_point] = []; + if($_dataList){ + $_dataList = $_dataList->keyBy('monitored_at')->toArray(); + } + for ($i = 0; $i < 24; $i++){ + $_key = date('Y-m-d').' '.str_pad($i, 2, '0',STR_PAD_LEFT).':00:00'; + $data[$device->monitoring_point][$_key] = null; + if(isset($_dataList[$_key])){ + $data[$device->monitoring_point][$_key] = $_dataList[$_key][$deviceColumn] ?? null; + } + } + } + break; + case DeviceType::WaterQuality->value: + $dataList = WaterQualityMonitoringLog::where('agricultural_base_id', $baseId)->whereDate('monitored_at', now())->get()->groupBy('device_id'); + + foreach ($deviceData as $device){ + $_dataList = $dataList->get($device->id); + $data[$device->monitoring_point] = []; + if($_dataList){ + $_dataList = $_dataList->keyBy('monitored_at')->toArray(); + } + for ($i = 0; $i < 24; $i++){ + $_key = date('Y-m-d').' '.str_pad($i, 2, '0',STR_PAD_LEFT).':00:00'; + $data[$device->monitoring_point][$_key] = null; + if(isset($_dataList[$_key])){ + $data[$device->monitoring_point][$_key] = $_dataList[$_key][$deviceColumn] ?? null; + } + } + } + break; + } + return $this->json($data); + } + } diff --git a/app/Models/AgriculturalBase.php b/app/Models/AgriculturalBase.php index 16a1535..f443a3d 100644 --- a/app/Models/AgriculturalBase.php +++ b/app/Models/AgriculturalBase.php @@ -45,4 +45,8 @@ class AgriculturalBase extends Model public function yieldLogs(){ return $this->hasMany(CropYield::class, 'base_id'); } + + public function devices(){ + return $this->hasMany(Device::class, 'base_id'); + } } diff --git a/routes/api.php b/routes/api.php index 719e740..3e9a138 100644 --- a/routes/api.php +++ b/routes/api.php @@ -28,6 +28,7 @@ Route::group(['middleware' => 'auth:sanctum'], function () { Route::get('citydata-statistics', [CityDataController::class, 'statistics'])->name('citydata_statistics.index'); //基地数据 Route::apiResource('agricultural-basic', AgriculturalBaseController::class)->names('agricultural_basic'); + Route::get('agricultural-device-basic', [DeviceBasicController::class, 'deviceBase'])->name('agricultural_basic.device_bases');//通过设备类型查询基地 //农作物 Route::apiResource('crops', CropController::class)->names('crops'); @@ -46,8 +47,8 @@ Route::group(['middleware' => 'auth:sanctum'], function () { Route::get('crop-yield-category-statics', [CropYieldController::class, 'categoryStaticsChart']);//行业统计产值 Route::get('crop-yield-total-list', [CropYieldController::class, 'totalStaticsList']);//城镇统计产值 Route::get('crop-yield-total-chart', [CropYieldController::class, 'totalStaticsChart']);//城镇统计产值 - - Route::get('device-data-statics', [DeviceController::class, 'dataStatics']); + Route::get('device-data-statics', [DeviceController::class, 'dataStatics']);//指定设备,当天的设备数据 + Route::get('device-base-data-statics', [DeviceController::class, 'baseDataStatics']); /** 系统管理 **/ Route::apiResource('admin-users', AdminUserController::class)->names('admin_users');