1
0
Fork 0
internet-everythings-agricu.../app/Http/Controllers/Api/MonitorModeController.php

93 lines
4.1 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace App\Http\Controllers\Api;
use App\Filters\MonitorModeFilter;
use App\Http\Controllers\Controller;
use App\Http\Resources\DeviceResource;
use App\Http\Resources\MonitorModeResource;
use App\Models\FarmWormPhoto;
use App\Http\Resources\FarmWormPhotoResource;
use App\Models\MeteorologicalDailyReport;
use App\Models\MonitorMode;
use App\Services\Admin\DeviceService;
use Illuminate\Http\Request;
class MonitorModeController extends Controller
{
/**
* 获取监控点列表;
*/
public function getMonitorMode(Request $request)
{
$monitors = MonitorMode::filter($request->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小时数据
$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_METEOROLOGICAL://气象设备--只拿最新的一个值
$fieldNameMap = MonitorMode::fieldMap(MonitorMode::TYPE_METEOROLOGICAL);
$fieldUnitMap = MonitorMode::fieldUnitMap(MonitorMode::TYPE_METEOROLOGICAL);
foreach($monitor->devices as $device){
$_fields = explode(',', $device->pivot->fields);
$reportData = MeteorologicalDailyReport::where('device_id', $device->id)->orderBy('reported_at', 'desc')->first()?->toArray() ?? [];
foreach($_fields as $field){
$data[$field] = [
'name' => $fieldNameMap[$field],
'unit' => $fieldUnitMap[$field],
'value' => $reportData[$field] ?? 0,
];
if($field == 'wind_direction'){//单独处理风向
$formatData = ['北风','东北风','东风','东南风','南风','西南风','西风','西北风'];
$data[$field]['value'] = $formatData[$reportData[$field]]??'未知';
}
}
}
break;
case MonitorMode::TYPE_INSECT://虫情设备
$startTime = now()->subDays(7)->startOfDay()->format('Y-m-d H:i:s');
$endTime = now()->subDays(1)->endOfDay()->format('Y-m-d H:i:s');
$data = (new DeviceService())->getMonitorModeDeviceData($monitor, $startTime, $endTime);
break;
default:
break;
}
}
return $this->json($data);
}
public function getInsectPhoto(Request $request)
{
$monitorId = $request->input('monitor_id');
$monitor = MonitorMode::find($monitorId);
$deviceIds = $monitor->devices()->get()->pluck('id')->toArray();
$query = FarmWormPhoto::whereIn('device_id', $deviceIds)->orderBy('uploaded_at', 'desc');
$list = $query->paginate($request->input('per_page'));
return $this->json(FarmWormPhotoResource::collection($list));
}
}