lcly-data-admin/app/Http/Controllers/DeviceController.php

182 lines
6.6 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;
use App\Models\Device;
use App\Enums\DeviceType;
use App\Helpers\Paginator;
use Illuminate\Http\Request;
use App\Models\SoilMonitoringLog;
use App\Http\Requestes\DeviceRequest;
use App\Http\Resources\DeviceResource;
use App\Models\WaterQualityMonitoringLog;
use App\Models\MeteorologicalMonitoringLog;
class DeviceController extends Controller
{
public function index(Request $request)
{
$query = Device::with('base')->filter($request->input());
$list = $query->simplePaginate(Paginator::resolvePerPage('per_page', 20, 50));
return $this->json(DeviceResource::collection($list));
}
public function store(DeviceRequest $request)
{
$input = $request->input();
//如果不是监控设备移除extends
if ($input['type'] != DeviceType::Monitor->value) {
unset($input['extends']);
}
Device::create(array_merge($input, [
'created_by' => auth('api')->user()?->id ?? 0,
'updated_by' => auth('api')->user()?->id ?? 0,
]));
return $this->success('添加成功');
}
public function show(Device $device)
{
return $this->json(DeviceResource::make($device));
}
public function update(Device $device, DeviceRequest $request)
{
$input = $request->input();
//如果不是监控设备移除extends
if ($input['type'] != DeviceType::Monitor->value) {
$input['extends'] = null;
}
$device->update(array_merge($input, [
'updated_by' => auth('api')->user()?->id ?? 0,
]));
return $this->success('修改成功');
}
public function destroy(Device $device)
{
$device->delete();
return $this->success('删除成功');
}
public function types()
{
return $this->json(DeviceType::types());
}
/**
* 设备数据
*/
public function dataStatics(Request $request)
{
$deviceId = $request->input('device_id');
$deviceColumn = $request->input('device_column');//指定字段
$device = Device::find($deviceId);
$data = null;
switch ($device->type){
case DeviceType::Monitor://监控设备
$data = DeviceResource::make($device);
break;
case DeviceType::Meteorological://气象设备
//当天最新一条
$log = MeteorologicalMonitoringLog::where('device_id', $deviceId)->orderBy('created_at', 'desc')->first();
$data = $log->toArray();
break;
case DeviceType::Soil://土壤设备
//当天
$dataList = SoilMonitoringLog::where('device_id', $deviceId)->whereDate('monitored_at', now())->get()->keyBy('monitored_at')->toArray();
$data = [];
for ($i = 0; $i < 24; $i++){
$_key = date('Y-m-d').' '.str_pad($i, 2, '0',STR_PAD_LEFT).':00:00';
$data[$_key] = null;
if(isset($dataList[$_key])){
$data[$_key] = $dataList[$_key][$deviceColumn] ?? null;
}
}
break;
case DeviceType::WaterQuality://水质设备
//当天
$dataList = WaterQualityMonitoringLog::where('device_id', $deviceId)->whereDate('monitored_at', now())->get()->keyBy('monitored_at')->toArray();
$data = [];
for ($i = 0; $i < 24; $i++){
$_key = date('Y-m-d').' '.str_pad($i, 2, '0',STR_PAD_LEFT).':00:00';
$data[$_key] = null;
if(isset($dataList[$_key])){
$data[$_key] = $dataList[$_key][$deviceColumn] ?? null;
}
}
break;
}
return $this->json([
'list' => $data,
]);
}
/**
* 获取指定基地指定设备类型的所有设备指定维度数据
*/
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);
}
}