1
0
Fork 0
internet-everythings-agricu.../app/Admin/Controllers/DeviceController.php

393 lines
19 KiB
PHP

<?php
namespace App\Admin\Controllers;
use Slowlyo\OwlAdmin\Renderers\{Button, Form, Page, TableColumn, TextControl, Json, Component, CRUDTable, Card, Video, DateRangeControl, Mapping, SelectControl};
use Slowlyo\OwlAdmin\Controllers\AdminController;
use App\Services\Admin\DeviceService;
use App\Admin\Components;
use App\Models\Device;
use App\Models\Keyword;
use App\Models\MeteorologicalDailyReport;
use App\Models\MeteorologicalReport;
use App\Models\MonitorMode;
use App\Models\Region;
use Illuminate\Http\Request;
class DeviceController extends AdminController
{
protected string $serviceName = DeviceService::class;
protected string $pageTitle = '设备管理';
public function options(){
$list = $this->service->listQuery()->select(['id as value', 'name as label'])->get();
return $this->response()->success($list);
}
public function list(): Page
{
$crud = $this->baseCRUD()
->filterTogglable(false)
->headerToolbar([
$this->createButton(true, 'lg'),
...$this->baseHeaderToolBar(),
])
->filter($this->baseFilter()->actions([])->body([
TextControl::make()->name('name')->label('名称')->size('md'),
amisMake()->SelectControl()->name('factory')->label('厂家')->options(Keyword::getByParentKey('device-factory')->pluck('name', 'id')->toArray())->size('md'),
amisMake()->SelectControl()->name('type')->label('类型')->options(Device::typeMap())->size('md'),
Button::make()->label(__('admin.reset'))->actionType('clear-and-submit'),
amis('submit')->label(__('admin.search'))->level('primary'),
]))
->columns([
TableColumn::make()->name('id')->label('ID')->sortable(true),
TableColumn::make()->name('name')->label('名称'),
TableColumn::make()->name('factory.name')->label('厂家'),
TableColumn::make()->name('sn')->label('编号'),
TableColumn::make()->name('type')->type('mapping')->map(Device::typeMap())->label('类型'),
TableColumn::make()->name('created_at')->label('创建时间')->type('datetime')->sortable(true),
TableColumn::make()->name('updated_at')->label('更新时间')->type('datetime')->sortable(true),
$this->rowActions(true, 'lg'),
])->debug(true);
return $this->baseList($crud);
}
public function form(): Form
{
return $this->baseForm()->body([
TextControl::make()->name('name')->label('名称')->required(true),
TextControl::make()->name('sn')->label('设备编号')->required(true),
\amisMake()->SelectControl()->name('powered_by')->label('厂家')->options(Keyword::getByParentKey('device-factory')->pluck('name', 'id')->toArray())->required(true),
TextControl::make()->name('model_sn')->label('型号'),
\amisMake()->RadiosControl()->name('type')->label('类型')->options(Device::typeMap())->required(true),
// 监控设备-额外参数
// rtsp://admin:lcdx12345@172.16.40.2:554/Streaming/Channels/5201
TextControl::make()->name('extends.rtsp_url')->hiddenOn('data.type != '.Device::TYPE_MONITOR)->label(__('device.rtsp_url')),
// rtsp://admin:lcdx12345@172.16.40.2:554/Streaming/tracks/5201
TextControl::make()->name('extends.rtsp_history')->hiddenOn('data.type != '.Device::TYPE_MONITOR)->label(__('device.rtsp_history')),
]);
}
public function detail(): Form
{
return $this->baseDetail()->body([
TextControl::make()->static(true)->name('id')->label('ID'),
TextControl::make()->static(true)->name('name')->label('名称'),
TextControl::make()->static(true)->name('sn')->label('编号'),
TextControl::make()->static(true)->name('factory.name')->label('厂家'),
TextControl::make()->static(true)->name('model_sn')->label('型号'),
TextControl::make()->static(true)->name('type')->label('类型')->staticSchema(
Mapping::make()->map(Device::typeMap())),
TextControl::make()->static(true)->name('extends')->label('扩展信息')->staticSchema(
Json::make()),
TextControl::make()->static(true)->name('created_at')->label('创建时间'),
TextControl::make()->static(true)->name('updated_at')->label('更新时间')
]);
}
/**
* 监控设备列表
*/
public function monitorList()
{
if ($this->actionOfGetData()) {
return $this->response()->success($this->service->list());
}
$regionId = request()->input('region_id', 0);
if($regionId){
$region = Region::find($regionId);
$query = $region->monitorModes()->where('type', MonitorMode::TYPE_MONITOR)->pluck('name','monitor_id');
}else{
$query = MonitorMode::where('type', MonitorMode::TYPE_MONITOR)->pluck('name','id');
}
return CRUDTable::make()
->mode('cards')
->hideCheckToggler()
->columnsCount(3)
->perPage(6)
->affixHeader(false)
->filterTogglable(true)
->set('primaryField', $this->service->primaryKey())
->api(admin_url($this->queryPath . '?_action=getData&_type=' . Device::TYPE_MONITOR))
->footerToolbar(['statistics', 'pagination'])
->headerToolbar([])
->filter($this->baseFilter()->actions([])->body([
amisMake()->SelectControl('monitor_mode', '点位名称')->size('md')->options($query->toArray())->selectFirst(true),
Button::make()->label(__('admin.reset'))->actionType('clear-and-submit'),
Component::make()->setType('submit')->label(__('admin.search'))->level('primary'),
]))
->actions([])
->itemClassName('col-sm-4')
->card(Card::make()->header(['title' => '$name'])->body(Video::make()->videoType('video/x-flv')->muted(true)->autoPlay(true)->src('${src}')));
}
/**
* 监控历史视频
*/
public function monitorVideoList()
{
if ($this->actionOfGetData()) {
return $this->response()->success($this->service->list());
}
$regionId = request()->input('region_id', 0);
if($regionId){
$region = Region::find($regionId);
$query = $region->monitorModes()->where('type', MonitorMode::TYPE_MONITOR)->pluck('name','monitor_id');
}else{
$query = MonitorMode::where('type', MonitorMode::TYPE_MONITOR)->pluck('name','id');
}
return CRUDTable::make()
->mode('cards')
->hideCheckToggler()
->columnsCount(3)
->perPage(6)
->affixHeader(false)
->filterTogglable(true)
->set('primaryField', $this->service->primaryKey())
->api(admin_url($this->queryPath . '?_action=getData&_type=' . Device::TYPE_MONITOR . '&_mode=history'))
->footerToolbar(['statistics', 'pagination'])
->headerToolbar([])
->filter($this->baseFilter()->actions([])->body([
amisMake()->SelectControl('monitor_mode', '点位名称')->size('md')->options($query->toArray())->selectFirst(true),
DateRangeControl::make()->name('date')->label('日期')->maxDate('now')->size('md'),
Button::make()->label(__('admin.reset'))->actionType('clear-and-submit'),
Component::make()->setType('submit')->label(__('admin.search'))->level('primary'),
]))
->actions([])
->itemClassName('col-sm-4')
->card(Card::make()->header(['title' => '$name'])->body(Video::make()->videoType('video/x-flv')->muted(true)->autoPlay(true)->src('${src}')));
}
/**
* 气象图表
*/
public function meteorologicalChart(){
$regionId = request()->input('region_id', 0);
if($regionId){
$region = Region::find($regionId);
$options = $region->monitorModes()->where('type', MonitorMode::TYPE_METEOROLOGICAL)->pluck('name','monitor_id')->toArray();
}else{
$options = MonitorMode::where('type', MonitorMode::TYPE_METEOROLOGICAL)->pluck('name','id')->toArray();
}
return $this->basePage()->title('')->body([
\amisMake()->grid()->columns([
\amisMake()->Form()->title('搜索条件')->mode('inline')->body([
amisMake()->SelectControl('monitor_mode', '监测点位')->size('md')->options($options)->selectFirst(true),
\amisMake()->DateRangeControl('date_range', '时间范围')->value('today,today'),
amis('submit')->label(__('admin.search'))->level('primary'),
])->target('meteorological_chart'),
]),
amisMake()->Service()->name('meteorological_chart')
->data([
'monitor_mode'=>array_key_first($options),
'date_range'=>mktime(0,0,0,date('m'),date('d'),date('Y')).','.mktime(0,0,0,date('m'),date('d'),date('Y'))
])->schemaApi(
admin_url('device-chart?monitor_mode=${monitor_mode}&date_range=${date_range}')
),
]);
}
public function deviceChart(Request $request)
{
$dateRange = $request->date_range ?? '';
list($startTime, $endTime) = explode(',', $dateRange);
$startTime = date('Y-m-d', $startTime);
$endTime = date('Y-m-d', $endTime);
$monitorMode = $request->monitor_mode ?? 0;
$monitorMode = MonitorMode::find($monitorMode);
$data = $monitorMode ? $this->service->getMonitorModeDeviceChartConfig($monitorMode, $startTime, $endTime, 2):[];
return $this->response()->success($data);
}
/**
* 水质图表
*/
public function waterChart(){
$regionId = request()->input('region_id', 0);
if($regionId){
$region = Region::find($regionId);
$options = $region->monitorModes()->where('type', MonitorMode::TYPE_WATER_QUALITY)->pluck('name','monitor_id')->toArray();
}else{
$options = MonitorMode::where('type', MonitorMode::TYPE_WATER_QUALITY)->pluck('name','id')->toArray();
}
return $this->basePage()->title('')->body([
\amisMake()->grid()->columns([
\amisMake()->Form()->title('搜索条件')->mode('inline')->body([
amisMake()->SelectControl('monitor_mode', '监测点位')->size('md')->options($options)->selectFirst(true),
\amisMake()->DateRangeControl('date_range', '时间范围')->value('today,today'),
amis('submit')->label(__('admin.search'))->level('primary'),
])->target('water_chart'),
]),
amisMake()->Service()->name('water_chart')
->data([
'monitor_mode'=>array_key_first($options),
'date_range'=>mktime(0,0,0,date('m'),date('d'),date('Y')).','.mktime(0,0,0,date('m'),date('d'),date('Y'))
])->schemaApi(
admin_url('device-chart?monitor_mode=${monitor_mode}&date_range=${date_range}')
),
]);
}
/**
* 土壤图表
*/
public function soilChart(){
$regionId = request()->input('region_id', 0);
if($regionId){
$region = Region::find($regionId);
$options = $region->monitorModes()->where('type', MonitorMode::TYPE_SOIL)->pluck('name','monitor_id')->toArray();
}else{
$options = MonitorMode::where('type', MonitorMode::TYPE_SOIL)->pluck('name','id')->toArray();
}
return $this->basePage()->title('')->body([
\amisMake()->grid()->columns([
\amisMake()->Form()->title('搜索条件')->mode('inline')->body([
amisMake()->SelectControl('monitor_mode', '监测点位')->size('md')->options($options)->selectFirst(true),
\amisMake()->DateRangeControl('date_range', '时间范围')->value('today,today'),
amis('submit')->label(__('admin.search'))->level('primary'),
])->target('soil_chart'),
]),
amisMake()->Service()->name('soil_chart')
->data([
'monitor_mode'=>array_key_first($options),
'date_range'=>mktime(0,0,0,date('m'),date('d'),date('Y')).','.mktime(0,0,0,date('m'),date('d'),date('Y'))
])->schemaApi(
admin_url('device-chart?monitor_mode=${monitor_mode}&date_range=${date_range}')
),
]);
}
/**
* 空气条件设置
*/
public function airDetail(){
return amisMake()->Grid()->columns([
amisMake()->Wrapper()->sm(6)->body([
amisMake()->Panel()->title('智能开关设置')
->labelWidth(100)
->className('Panel--success')
->body([
\amisMake()->Form()->title('')->mode('horizontal')->body([
amisMake()->FieldSetControl()->title('智能开启')->body([
\amisMake()->SwitchControl()->name('open_is_enable')->label('开关'),
\amisMake()->ConditionBuilderControl()->label('条件')->fields([
[
'label' => '温度', 'type'=>'number','step'=>'0.01','name'=>'q',
'operators'=> [
'equal', 'not_equal', 'less', 'less_or_equal', 'greater', 'greater_or_equal', 'between', 'not_between',
// 'is_empty', 'is_not_empty'
]
],
[
'label' => '湿度', 'type'=>'number','step'=>'0.01','name'=>'x',
'operators'=> [
'equal', 'not_equal', 'less', 'less_or_equal', 'greater', 'greater_or_equal', 'between', 'not_between',
// 'is_empty', 'is_not_empty'
]
],
]),
]),
amisMake()->FieldSetControl()->title('智能关闭')->body([
\amisMake()->SwitchControl()->name('close_is_enable')->label('开关'),
\amisMake()->ConditionBuilderControl()->label('条件')->fields([
[
'label' => '温度', 'type'=>'number','step'=>'0.01','name'=>'q',
'operators'=> [
'equal', 'not_equal', 'less', 'less_or_equal', 'greater', 'greater_or_equal', 'between', 'not_between',
// 'is_empty', 'is_not_empty'
]
],
[
'label' => '湿度', 'type'=>'number','step'=>'0.01','name'=>'x',
'operators'=> [
'equal', 'not_equal', 'less', 'less_or_equal', 'greater', 'greater_or_equal', 'between', 'not_between',
// 'is_empty', 'is_not_empty'
]
],
]),
]),
]),
])
]),
amisMake()->Wrapper()->sm(6)->body([
amisMake()->Panel()->title('开关记录')
->className('Panel--success')
->body([
\amisMake()->Table()->title('')
->data([
'items' => [
[
'name'=> '温度>10℃',
'name1'=> '关闭',
'time1'=> '2023-03-21 10:00:00',
]
]
])
->columns([
amisMake()->TableColumn()->name('name')->label('触发条件'),
amisMake()->TableColumn()->name('name1')->label('状态'),
amisMake()->TableColumn()->name('time1')->label('执行时间'),
])
])
]),
]);
}
/**
* 喷灌
*/
public function atomizingDetail(){
return amisMake()->Grid()->columns([
amisMake()->Wrapper()->sm(6)->body([
amisMake()->Panel()->title('智能喷灌设置')
->subFormMode('horizontal')
->labelWidth(80)
->className('Panel--success')
->body([
\amisMake()->Form()->title('')->mode('horizontal')->body([
amisMake()->FieldSetControl()->title('定时喷灌')->body([
\amisMake()->SwitchControl()->name('is_enable')->label('开关'),
\amisMake()->ArrayControl()->name('config')->label('定时')->items([
amisMake()->ComboControl()->items([
\amisMake()->InputTimeRange(),
\amisMake()->TextControl()->name('input')->label('喷灌量')->labelWidth(30),
]),
]),
]),
]),
])
]),
amisMake()->Wrapper()->sm(6)->body([
amisMake()->Panel()->title('开关记录')
->className('Panel--success')
->body([
\amisMake()->Table()->title('')
->data([
'items' => [
[
'name'=> '定时喷灌',
'name1'=> '关闭',
'time1'=> '2023-03-21 10:00:00',
]
]
])
->columns([
amisMake()->TableColumn()->name('name')->label('触发条件'),
amisMake()->TableColumn()->name('name1')->label('状态'),
amisMake()->TableColumn()->name('time1')->label('执行时间'),
])
])
]),
]);
}
}