ultimatepos/Modules/Maintenance/Http/Controllers/IotController.php

86 lines
3.0 KiB
PHP

<?php
namespace Modules\Maintenance\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\Maintenance\Models\IotAlert;
use Modules\Maintenance\Models\IotDevice;
use Modules\Maintenance\Models\IotPredictiveRule;
use Modules\Maintenance\Models\IotTelemetry;
use Modules\Maintenance\Services\IotIngestionService;
class IotController extends Controller
{
public function index(Request $request)
{
if (! auth()->user()->can('maintenance.view')) {
abort(403);
}
$business_id = $request->session()->get('user.business_id');
$devices = IotDevice::where('business_id', $business_id)->get();
$alerts = IotAlert::where('business_id', $business_id)->where('status', 'open')->latest('id')->limit(20)->get();
return view('maintenance::iot.index', compact('devices', 'alerts'));
}
public function ingest(Request $request, IotIngestionService $ingestion)
{
$validated = $request->validate([
'business_id' => 'required|integer',
'device_uid' => 'required|string',
'readings' => 'required|array',
'readings.*.metric' => 'required|string',
'readings.*.value' => 'required|numeric',
]);
$ingestion->ingest((int) $validated['business_id'], $validated['device_uid'], $validated['readings']);
return response()->json(['success' => true]);
}
public function storeDevice(Request $request)
{
if (! auth()->user()->can('maintenance.equipment.update')) {
abort(403);
}
$business_id = $request->session()->get('user.business_id');
$validated = $request->validate([
'device_uid' => 'required|string|max:100',
'name' => 'required|string|max:255',
'protocol' => 'required|in:mqtt,opcua,http,modbus',
'equipment_id' => 'nullable|integer',
'topic' => 'nullable|string',
]);
IotDevice::create(array_merge($validated, ['business_id' => $business_id]));
return redirect()->back()->with('status', ['success' => 1, 'msg' => __('maintenance::lang.iot_device_created')]);
}
public function storeRule(Request $request)
{
if (! auth()->user()->can('maintenance.equipment.update')) {
abort(403);
}
$business_id = $request->session()->get('user.business_id');
$validated = $request->validate([
'equipment_id' => 'nullable|integer',
'metric' => 'required|string|max:100',
'operator' => 'required|in:gt,lt,gte,lte,eq',
'threshold' => 'required|numeric',
'auto_work_order' => 'nullable|boolean',
]);
IotPredictiveRule::create(array_merge($validated, [
'business_id' => $business_id,
'auto_work_order' => $request->boolean('auto_work_order'),
]));
return redirect()->back()->with('status', ['success' => 1, 'msg' => __('maintenance::lang.iot_rule_created')]);
}
}