97 lines
4.1 KiB
PHP
97 lines
4.1 KiB
PHP
<?php
|
||
|
||
namespace App\Http\Controllers\Api;
|
||
|
||
use App\Filters\MonitorModeFilter;
|
||
use App\Http\Controllers\Controller;
|
||
use App\Http\Resources\DeviceResource;
|
||
use App\Http\Resources\FarmWormPhotoResource;
|
||
use App\Http\Resources\MonitorModeResource;
|
||
use App\Models\FarmWormPhoto;
|
||
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)
|
||
->latest('sort')
|
||
->oldest('id')
|
||
->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));
|
||
}
|
||
}
|