diff --git a/app/Admin/Controllers/DeviceController.php b/app/Admin/Controllers/DeviceController.php index 828a2f1..bdb9745 100644 --- a/app/Admin/Controllers/DeviceController.php +++ b/app/Admin/Controllers/DeviceController.php @@ -206,7 +206,7 @@ class DeviceController extends AdminController $monitorMode = $request->monitor_mode ?? 0; $monitorMode = MonitorMode::find($monitorMode); - $data = $monitorMode ? $this->service->getMonitorModeDeviceChartConfig($monitorMode, $startTime, $endTime, 2):[]; + $data = $monitorMode ? $this->service->getMonitorModeDeviceChartConfig($monitorMode, $startTime.' 00:00:00', $endTime.' 23:59:59', 2):[]; return $this->response()->success($data); } diff --git a/app/Filters/MonitorModeFilter.php b/app/Filters/MonitorModeFilter.php new file mode 100644 index 0000000..ed7877c --- /dev/null +++ b/app/Filters/MonitorModeFilter.php @@ -0,0 +1,30 @@ +where('type', $type); + } + + /** + * 类型 + */ + public function typeName($typeName){ + $type = 0; + foreach(Device::typeMap() as $key => $item){ + if($item == $typeName){ + $type = $key; + break; + } + }; + return $this->where('type', $type); + } +} diff --git a/app/Http/Controllers/Api/DeviceController.php b/app/Http/Controllers/Api/DeviceController.php index 0287648..a00a634 100644 --- a/app/Http/Controllers/Api/DeviceController.php +++ b/app/Http/Controllers/Api/DeviceController.php @@ -10,7 +10,19 @@ use DB; class DeviceController extends Controller { /** - * 统计某个基地下所有设备状态数量 + * 获取设备监控的类别列表; + */ + public function getMonitorMode(){ + + } + + public function getMonitorData(Request $request){ + $baseId = $request->input('base_id'); + $deviceType = $request->input('device_type'); + $deviceColumn = $request->input('device_column'); //指定字段 + } + /** + * 统计某个实验田下所有设备状态数量 */ public function typeStateNum(Request $request) { diff --git a/app/Http/Controllers/Api/MonitorModeController.php b/app/Http/Controllers/Api/MonitorModeController.php new file mode 100644 index 0000000..1f2e2d4 --- /dev/null +++ b/app/Http/Controllers/Api/MonitorModeController.php @@ -0,0 +1,57 @@ +all(), MonitorModeFilter::class)->get();//有推荐,排序字段,不过目前没开放; + return $this->json(MonitorModeResource::collection($monitors)); + } + + /** + * 获取监控点位数据-可指定字段 + */ + public function getMonitorDeviceData(Request $request) + { + $monitorId = $request->input('monitor_id'); + $column = $request->input('column'); //指定字段 + //监控类型(气象,土壤为折线图数据;虫情数据待定;监控设备rtsp流;其他类型无数据) + $data = []; + $monitor = MonitorMode::find($monitorId); + if($monitor){ + switch($monitor->type){ + case MonitorMode::TYPE_MONITOR://监控视频 + $data = DeviceResource::collection($monitor->devices); + break; + case MonitorMode::TYPE_SOIL://土壤设备--只拿最近6小时数据 + case MonitorMode::TYPE_METEOROLOGICAL://气象设备--只拿最近6小时数据 + $startTime = now()->subHours(6)->format('Y-m-d H:i:s'); + $endTime = now()->format('Y-m-d H:i:s'); + $data = (new DeviceService())->getMonitorModeDeviceData($monitor, $startTime, $endTime); + if($column){ + $data = $data[$column] ?? []; + } + break; + case MonitorMode::TYPE_INSECT://虫情设备-todo + break; + default: + break; + } + } + + return $this->json($data); + } +} diff --git a/app/Http/Resources/DeviceResource.php b/app/Http/Resources/DeviceResource.php new file mode 100644 index 0000000..4145c91 --- /dev/null +++ b/app/Http/Resources/DeviceResource.php @@ -0,0 +1,27 @@ + $this->id, + 'type' => $this->type, + 'type_name' => Device::typeMap()[$this->type] ?? '未知', + 'state' => $this->state, + 'state_name' => Device::stateMap()[$this->state] ?? '未知', + 'extends' => $this->extends ?? [], + ]; + } +} diff --git a/app/Http/Resources/MonitorModeResource.php b/app/Http/Resources/MonitorModeResource.php new file mode 100644 index 0000000..14d5769 --- /dev/null +++ b/app/Http/Resources/MonitorModeResource.php @@ -0,0 +1,22 @@ + $this->id, + 'name' => $this->name + ]; + } +} diff --git a/app/Services/Admin/DeviceService.php b/app/Services/Admin/DeviceService.php index 5f3a1ec..6cc14d2 100644 --- a/app/Services/Admin/DeviceService.php +++ b/app/Services/Admin/DeviceService.php @@ -56,12 +56,13 @@ class DeviceService extends BaseService $diffDays = 0; $day = date('Y-m-d'); $xKeys = []; + if($startTime && $endTime){ - if($startTime == $endTime){//查询某一天 - $day = $startTime; + $startDay = Carbon::parse($startTime); + $endDay = Carbon::parse($endTime); + if($startDay->format('Y-m-d') == $endDay->format('Y-m-d')){//判断是否同一天 + $day = $startDay->format('Y-m-d'); }else{ - $startDay = Carbon::parse($startTime); - $endDay = Carbon::parse($endTime); $diffDays = $startDay->diffInDays($endDay, false); } } @@ -73,11 +74,15 @@ class DeviceService extends BaseService } }else{ //调整截至到当前小时 - $h = 23; + + $th = $startDay->format('H'); + $eh = $endDay->format('H');; if($day == date('Y-m-d')){ - $h = date('H'); + if($eh > date('H')){ + $eh = date('H'); + } } - for ($i = 0; $i < ($h+1); $i++) { + for ($i = $th; $i < ($eh+1); $i++) { $xKeys[] = str_pad($i, 2, '0', STR_PAD_LEFT).':00'; } } @@ -213,4 +218,58 @@ class DeviceService extends BaseService return $configData; } + + public function getMonitorModeDeviceData($monitorMode, $startTime, $endTime) + { + list($day, $diffDays, $xKeys) = $this->makeChartXkeys($startTime, $endTime); + switch($monitorMode->type){ + case MonitorMode::TYPE_METEOROLOGICAL: + $dayliyReportQuery = MeteorologicalDailyReport::query(); + $reportQuery = MeteorologicalReport::query(); + $fieldNameMap = MonitorMode::fieldMap(MonitorMode::TYPE_METEOROLOGICAL); + $fieldUnitMap = MonitorMode::fieldUnitMap(MonitorMode::TYPE_METEOROLOGICAL); + break; + case MonitorMode::TYPE_SOIL: + $dayliyReportQuery = SoilDailyReport::query(); + $reportQuery = SoilReport::query(); + $fieldNameMap = MonitorMode::fieldMap(MonitorMode::TYPE_SOIL); + $fieldUnitMap = MonitorMode::fieldUnitMap(MonitorMode::TYPE_SOIL); + break; + } + $monitorMode->load('devices'); + $fieldMap = []; + + foreach($monitorMode->devices as $device){ + $_fields = explode(',', $device->pivot->fields); + + if($diffDays) { + $modelQuery = $dayliyReportQuery->whereBetween('reported_at', [$startTime, $endTime]); + }else{ + $modelQuery = $reportQuery->whereDate('reported_at', $day); + } + if($modelQuery){ + $datalist = $modelQuery->where('device_id', $device->id)->get()->keyBy('reported_at')->toArray(); + } + + //组装数据; + foreach($_fields as $field){ + $_data = []; + foreach($xKeys as $key){ + if(!$diffDays) { + $key = date('Y-m-d').' '. $key.':00'; + }else{ + $key .= ' 00:00:00'; + } + $_data[] = $datalist[$key][$field] ?? 0; + } + $fieldMap[$field] = [ + 'name' => $fieldNameMap[$field], + 'unit' => $fieldUnitMap[$field], + 'data' => $_data, + 'xkeys'=> $xKeys + ]; + } + } + return $fieldMap; + } } diff --git a/routes/api.php b/routes/api.php index 2298a02..730060f 100644 --- a/routes/api.php +++ b/routes/api.php @@ -1,6 +1,7 @@ 'auth:sanctum'], function () { Route::get('devices-num', [DeviceController::class, 'typeStateNum'])->name('device.type_state_num'); - + Route::get('monitor-modes', [MonitorModeController::class, 'getMonitorMode'])->name('monitor_modes.list'); + Route::get('monitor-modes/device-data', [MonitorModeController::class, 'getMonitorDeviceData'])->name('monitor_modes.device_data'); + Route::prefix('users')->group(function () { Route::delete('logout', [UserController::class, 'logout']); });