214 lines
7.7 KiB
PHP
214 lines
7.7 KiB
PHP
<?php
|
||
|
||
namespace App\Http\Controllers;
|
||
|
||
use App\Enums\DeviceStatus;
|
||
use App\Enums\DeviceType;
|
||
use App\Helpers\Paginator;
|
||
use App\Http\Requestes\DeviceRequest;
|
||
use App\Http\Resources\DeviceResource;
|
||
use App\Models\Device;
|
||
use App\Models\MeteorologicalMonitoringLog;
|
||
use App\Models\SoilMonitoringLog;
|
||
use App\Models\WaterQualityMonitoringLog;
|
||
use Illuminate\Http\Request;
|
||
use Illuminate\Support\Facades\DB;
|
||
|
||
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 typeStatusNum(Request $request)
|
||
{
|
||
$baseId = $request->input('base_id');
|
||
|
||
$query = Device::where('agricultural_base_id', $baseId)->groupBy('type')->groupBy('status');
|
||
|
||
$list = $query->select(DB::raw('type, status, count(1) as num '))->get();
|
||
$resData = [];
|
||
foreach ($list as $item) {
|
||
$resData[$item->type->value][$item->status->value] = $item->num;
|
||
}
|
||
|
||
//初始化数据;
|
||
$data = [];
|
||
foreach (DeviceType::types() as $typeKey => $typeName) {
|
||
foreach (DeviceStatus::status() as $statusKey => $statusName) {
|
||
$data[$typeKey][$statusKey] = $resData[$typeKey][$statusKey] ?? 0;
|
||
}
|
||
}
|
||
|
||
return $this->json($data);
|
||
}
|
||
|
||
/**
|
||
* 设备数据
|
||
*/
|
||
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://土壤设备
|
||
//当前时间往前推6个小时;
|
||
$startTime = now()->subHours(6);
|
||
$dataList = SoilMonitoringLog::where('device_id', $deviceId)->where('monitored_at', '>=', $startTime)->get()->keyBy('monitored_at')->toArray();
|
||
$data = [];
|
||
for ($i = 5; $i >= 0; $i--) {
|
||
$_key = now()->subHours($i)->format('Y-m-d H').':00:00';
|
||
$data[$_key] = null;
|
||
if (isset($dataList[$_key])) {
|
||
$data[$_key] = $dataList[$_key][$deviceColumn] ?? null;
|
||
}
|
||
}
|
||
break;
|
||
case DeviceType::WaterQuality://水质设备
|
||
//当天
|
||
$startTime = now()->subHours(6);
|
||
$dataList = WaterQualityMonitoringLog::where('device_id', $deviceId)->where('monitored_at', '>=', $startTime)->get()->keyBy('monitored_at')->toArray();
|
||
$data = [];
|
||
for ($i = 5; $i >= 0; $i--) {
|
||
$_key = now()->subHours($i)->format('Y-m-d H').':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:
|
||
$startTime = now()->subHours(6);
|
||
$dataList = SoilMonitoringLog::where('agricultural_base_id', $baseId)->where('monitored_at', '>=', $startTime)->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 = 5; $i >= 0; $i--) {
|
||
$_key = now()->subHours($i)->format('Y-m-d H').':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:
|
||
$startTime = now()->subHours(6);
|
||
$dataList = WaterQualityMonitoringLog::where('agricultural_base_id', $baseId)->where('monitored_at', '>=', $startTime)->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 = 5; $i >= 0; $i--) {
|
||
$_key = now()->subHours($i)->format('Y-m-d H').':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);
|
||
}
|
||
}
|