1
0
Fork 0

添加大屏设备数据接口

develop
vine_liutk 2023-06-21 15:20:14 +08:00
parent ba69244e2d
commit 3cd7f6c206
8 changed files with 220 additions and 10 deletions

View File

@ -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);
}

View File

@ -0,0 +1,30 @@
<?php
namespace App\Filters;
use EloquentFilter\ModelFilter;
use App\Models\Device;
class MonitorModeFilter extends ModelFilter
{
/**
* 类型
*/
public function type($type){
return $this->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);
}
}

View File

@ -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)
{

View File

@ -0,0 +1,57 @@
<?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\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小时数据
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);
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace App\Http\Resources;
use App\Models\Device;
use Illuminate\Http\Resources\Json\JsonResource;
class DeviceResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
*/
public function toArray($request)
{
return [
'id' => $this->id,
'type' => $this->type,
'type_name' => Device::typeMap()[$this->type] ?? '未知',
'state' => $this->state,
'state_name' => Device::stateMap()[$this->state] ?? '未知',
'extends' => $this->extends ?? [],
];
}
}

View File

@ -0,0 +1,22 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class MonitorModeResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
*/
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name
];
}
}

View File

@ -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;
}
}

View File

@ -1,6 +1,7 @@
<?php
namespace App\Http\Controllers\Api;
use App\Models\MonitorMode;
use Illuminate\Support\Facades\Route;
/*
@ -37,7 +38,9 @@ Route::post('auth/login', [AuthController::class, 'login']);
Route::group(['middleware' => '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']);
});