1
0
Fork 0

Compare commits

...

5 Commits

Author SHA1 Message Date
vine_liutk e15ea3e8c7 完善预警设置保存 2023-05-19 10:56:31 +08:00
vine_liutk b99678f96e 调整默认预警设置选中或 2023-05-18 20:48:39 +08:00
vine_liutk 7853032f81 改变预警设置表单 2023-05-18 19:14:22 +08:00
vine_liutk 1a251a3625 处理bug 2023-05-17 12:12:19 +08:00
vine_liutk 3a9cdc6d9b 完善图 2023-05-17 12:10:45 +08:00
9 changed files with 305 additions and 303 deletions

View File

@ -47,7 +47,7 @@ class CustomRegionController extends AdminController
'clickAction' => DialogAction::make()->dialog(
Dialog::make()->title($region['name'])->body([
\amisMake()->Tabs()->tabsMode('simple')->tabs($tabs),
])->size('full')
])->size('full')->actions([])
),
];
}

View File

@ -5,10 +5,14 @@ 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
{
@ -128,6 +132,13 @@ class DeviceController extends AdminController
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()
@ -140,7 +151,7 @@ class DeviceController extends AdminController
->footerToolbar(['statistics', 'pagination'])
->headerToolbar([])
->filter($this->baseFilter()->actions([])->body([
TextControl::make()->name('name')->label('点位名称')->size('md'),
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'),
@ -154,221 +165,74 @@ class DeviceController extends AdminController
* 气象图表
*/
public function meteorologicalChart(){
$randArr = function () {
$_arr = [];
for ($i = 0; $i < 7; $i++) {
$_arr[] = random_int(10, 200);
}
return '[' . implode(',', $_arr) . ']';
};
$random1 = $randArr();
$random2 = $randArr();
$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()->TextControl()->label('设备名称'),
\amisMake()->DateRangeControl()->label('时间范围'),
amisMake()->SelectControl('monitor_mode', '设备名称')->size('md')->options($options)->selectFirst(true),
\amisMake()->DateRangeControl('date_range', '时间范围')->value('today,today'),
amis('submit')->label(__('admin.search'))->level('primary'),
]),
]),
\amisMake()->grid()->columns([
amisMake()->Flex()->items([
amisMake()->Card()->className('m-r')->body(
amisMake()->Chart()->config("{
title:{ text: '空气温度', subtext: '℃'},
tooltip: { trigger: 'axis' },
xAxis: { type: 'category', boundaryGap: false, data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] },
yAxis: { type: 'value' },
grid:{ left: '7%', right:'3%', top: 60, bottom: 30, },
series: [
{ name:'空气温度', data: {$random2}, type: 'line', areaStyle: {}, smooth: true, symbol: 'none', },
]}")
),
amisMake()->Card()->className('m-r')->body(
amisMake()->Chart()->config("{
title:{ text: '空气湿度', subtext: '%RH'},
tooltip: { trigger: 'axis' },
xAxis: { type: 'category', boundaryGap: false, data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] },
yAxis: { type: 'value' },
grid:{ left: '7%', right:'3%', top: 60, bottom: 30, },
series: [
{ name: '空气湿度', data: {$random1}, type: 'line', areaStyle: {}, smooth: true, symbol: 'none', },
]}")
),
amisMake()->Card()->className('m-r')->body(
amisMake()->Chart()->config("{
title:{ text: '光照强度LUX', },
tooltip: { trigger: 'axis' },
xAxis: { type: 'category', boundaryGap: false, data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] },
yAxis: { type: 'value' },
grid:{ left: '7%', right:'3%', top: 60, bottom: 30, },
series: [
{ name: '光照强度LUX', data: {$random1}, type: 'line', areaStyle: {}, smooth: true, symbol: 'none', },
]}")
),
amisMake()->Card()->body(
amisMake()->Chart()->config("{
title:{ text: '光照强度LUX', },
tooltip: { trigger: 'axis' },
xAxis: { type: 'category', boundaryGap: false, data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] },
yAxis: { type: 'value' },
grid:{ left: '7%', right:'3%', top: 60, bottom: 30, },
series: [
{ name: '光照强度LUX', data: {$random1}, type: 'line', areaStyle: {}, smooth: true, symbol: 'none', },
]}")
),
]),
]),
\amisMake()->grid()->columns([
amisMake()->Flex()->items([
amisMake()->Card()->className('m-r')->body(
amisMake()->Chart()->config("{
title:{ text: '空气温度', subtext: '℃'},
tooltip: { trigger: 'axis' },
xAxis: { type: 'category', boundaryGap: false, data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] },
yAxis: { type: 'value' },
grid:{ left: '7%', right:'3%', top: 60, bottom: 30, },
series: [
{ name:'空气温度', data: {$random2}, type: 'line', areaStyle: {}, smooth: true, symbol: 'none', },
]}")
),
amisMake()->Card()->className('m-r')->body(
amisMake()->Chart()->config("{
title:{ text: '空气湿度', subtext: '%RH'},
tooltip: { trigger: 'axis' },
xAxis: { type: 'category', boundaryGap: false, data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] },
yAxis: { type: 'value' },
grid:{ left: '7%', right:'3%', top: 60, bottom: 30, },
series: [
{ name: '空气湿度', data: {$random1}, type: 'line', areaStyle: {}, smooth: true, symbol: 'none', },
]}")
),
amisMake()->Card()->className('m-r')->body(
amisMake()->Chart()->config("{
title:{ text: '光照强度LUX', },
tooltip: { trigger: 'axis' },
xAxis: { type: 'category', boundaryGap: false, data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] },
yAxis: { type: 'value' },
grid:{ left: '7%', right:'3%', top: 60, bottom: 30, },
series: [
{ name: '光照强度LUX', data: {$random1}, type: 'line', areaStyle: {}, smooth: true, symbol: 'none', },
]}")
),
amisMake()->Card()->body(
amisMake()->Chart()->config("{
title:{ text: '光照强度LUX', },
tooltip: { trigger: 'axis' },
xAxis: { type: 'category', boundaryGap: false, data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] },
yAxis: { type: 'value' },
grid:{ left: '7%', right:'3%', top: 60, bottom: 30, },
series: [
{ name: '光照强度LUX', data: {$random1}, type: 'line', areaStyle: {}, smooth: true, symbol: 'none', },
]}")
),
]),
])->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(){
$randArr = function () {
$_arr = [];
for ($i = 0; $i < 7; $i++) {
$_arr[] = random_int(10, 200);
}
return '[' . implode(',', $_arr) . ']';
};
$random1 = $randArr();
$random2 = $randArr();
$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()->TextControl()->label('设备名称'),
\amisMake()->DateRangeControl()->label('时间范围'),
amisMake()->SelectControl('monitor_mode', '设备名称')->size('md')->options($options)->selectFirst(true),
\amisMake()->DateRangeControl('date_range', '时间范围')->value('today,today'),
amis('submit')->label(__('admin.search'))->level('primary'),
]),
]),
\amisMake()->grid()->columns([
amisMake()->Flex()->items([
amisMake()->Card()->className('m-r')->body(
amisMake()->Chart()->config("{
title:{ text: '氯', subtext: 'mg/L'},
tooltip: { trigger: 'axis' },
xAxis: { type: 'category', boundaryGap: false, data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] },
yAxis: { type: 'value' },
grid:{ left: '7%', right:'3%', top: 60, bottom: 30, },
series: [
{ name:'氯', data: {$random2}, type: 'line', areaStyle: {}, smooth: true, symbol: 'none', },
]}")
),
amisMake()->Card()->className('m-r')->body(
amisMake()->Chart()->config("{
title:{ text: '电导率', subtext: 'us/cm'},
tooltip: { trigger: 'axis' },
xAxis: { type: 'category', boundaryGap: false, data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] },
yAxis: { type: 'value' },
grid:{ left: '7%', right:'3%', top: 60, bottom: 30, },
series: [
{ name: '电导率', data: {$random1}, type: 'line', areaStyle: {}, smooth: true, symbol: 'none', },
]}")
),
amisMake()->Card()->className('m-r')->body(
amisMake()->Chart()->config("{
title:{ text: '氧气', subtext: 'mg/L'},
tooltip: { trigger: 'axis' },
xAxis: { type: 'category', boundaryGap: false, data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] },
yAxis: { type: 'value' },
grid:{ left: '7%', right:'3%', top: 60, bottom: 30, },
series: [
{ name: '光照强度LUX', data: {$random1}, type: 'line', areaStyle: {}, smooth: true, symbol: 'none', },
]}")
),
amisMake()->Card()->body(
amisMake()->Chart()->config("{
title:{ text: 'PH'},
tooltip: { trigger: 'axis' },
xAxis: { type: 'category', boundaryGap: false, data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] },
yAxis: { type: 'value' },
grid:{ left: '7%', right:'3%', top: 60, bottom: 30, },
series: [
{ name: '光照强度LUX', data: {$random1}, type: 'line', areaStyle: {}, smooth: true, symbol: 'none', },
]}")
),
]),
]),
\amisMake()->grid()->columns([
amisMake()->Flex()->items([
amisMake()->Card()->className('m-r')->body(
amisMake()->Chart()->config("{
title:{ text: '温度', subtext: '℃'},
tooltip: { trigger: 'axis' },
xAxis: { type: 'category', boundaryGap: false, data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] },
yAxis: { type: 'value' },
grid:{ left: '7%', right:'3%', top: 60, bottom: 30, },
series: [
{ name:'温度', data: {$random2}, type: 'line', areaStyle: {}, smooth: true, symbol: 'none', },
]}")
),
amisMake()->Card()->body(
amisMake()->Chart()->config("{
title:{ text: '浊度', subtext: 'NTU'},
tooltip: { trigger: 'axis' },
xAxis: { type: 'category', boundaryGap: false, data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] },
yAxis: { type: 'value' },
grid:{ left: '7%', right:'3%', top: 60, bottom: 30, },
series: [
{ name: '空气湿度', data: {$random1}, type: 'line', areaStyle: {}, smooth: true, symbol: 'none', },
]}")
)
]),
])->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}')
),
]);
}
@ -376,99 +240,29 @@ class DeviceController extends AdminController
* 土壤图表
*/
public function soilChart(){
$randArr = function () {
$_arr = [];
for ($i = 0; $i < 7; $i++) {
$_arr[] = random_int(10, 200);
}
return '[' . implode(',', $_arr) . ']';
};
$random1 = $randArr();
$random2 = $randArr();
$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()->TextControl()->label('设备名称'),
\amisMake()->DateRangeControl()->label('时间范围'),
amisMake()->SelectControl('monitor_mode', '设备名称')->size('md')->options($options)->selectFirst(true),
\amisMake()->DateRangeControl('date_range', '时间范围')->value('today,today'),
amis('submit')->label(__('admin.search'))->level('primary'),
]),
]),
\amisMake()->grid()->columns([
amisMake()->Flex()->items([
amisMake()->Card()->className('m-r')->body(
amisMake()->Chart()->config("{
title:{ text: '氯', subtext: 'mg/L'},
tooltip: { trigger: 'axis' },
xAxis: { type: 'category', boundaryGap: false, data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] },
yAxis: { type: 'value' },
grid:{ left: '7%', right:'3%', top: 60, bottom: 30, },
series: [
{ name:'氯', data: {$random2}, type: 'line', areaStyle: {}, smooth: true, symbol: 'none', },
]}")
),
amisMake()->Card()->className('m-r')->body(
amisMake()->Chart()->config("{
title:{ text: '电导率', subtext: 'us/cm'},
tooltip: { trigger: 'axis' },
xAxis: { type: 'category', boundaryGap: false, data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] },
yAxis: { type: 'value' },
grid:{ left: '7%', right:'3%', top: 60, bottom: 30, },
series: [
{ name: '电导率', data: {$random1}, type: 'line', areaStyle: {}, smooth: true, symbol: 'none', },
]}")
),
amisMake()->Card()->className('m-r')->body(
amisMake()->Chart()->config("{
title:{ text: '氧气', subtext: 'mg/L'},
tooltip: { trigger: 'axis' },
xAxis: { type: 'category', boundaryGap: false, data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] },
yAxis: { type: 'value' },
grid:{ left: '7%', right:'3%', top: 60, bottom: 30, },
series: [
{ name: '光照强度LUX', data: {$random1}, type: 'line', areaStyle: {}, smooth: true, symbol: 'none', },
]}")
),
amisMake()->Card()->body(
amisMake()->Chart()->config("{
title:{ text: 'PH'},
tooltip: { trigger: 'axis' },
xAxis: { type: 'category', boundaryGap: false, data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] },
yAxis: { type: 'value' },
grid:{ left: '7%', right:'3%', top: 60, bottom: 30, },
series: [
{ name: '光照强度LUX', data: {$random1}, type: 'line', areaStyle: {}, smooth: true, symbol: 'none', },
]}")
),
]),
]),
\amisMake()->grid()->columns([
amisMake()->Flex()->items([
amisMake()->Card()->className('m-r')->body(
amisMake()->Chart()->config("{
title:{ text: '温度', subtext: '℃'},
tooltip: { trigger: 'axis' },
xAxis: { type: 'category', boundaryGap: false, data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] },
yAxis: { type: 'value' },
grid:{ left: '7%', right:'3%', top: 60, bottom: 30, },
series: [
{ name:'温度', data: {$random2}, type: 'line', areaStyle: {}, smooth: true, symbol: 'none', },
]}")
),
amisMake()->Card()->body(
amisMake()->Chart()->config("{
title:{ text: '浊度', subtext: 'NTU'},
tooltip: { trigger: 'axis' },
xAxis: { type: 'category', boundaryGap: false, data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] },
yAxis: { type: 'value' },
grid:{ left: '7%', right:'3%', top: 60, bottom: 30, },
series: [
{ name: '空气湿度', data: {$random1}, type: 'line', areaStyle: {}, smooth: true, symbol: 'none', },
]}")
)
]),
])->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}')
),
]);
}

View File

@ -120,14 +120,14 @@ class MonitorModeController extends AdminController
->items(
amisMake()->ComboControl()->items([
\amisMake()->CheckboxesControl('device_fields', '监测字段')->checkAll(true)->options(MonitorMode::fieldMap(MonitorMode::TYPE_WATER_QUALITY)),
\amisMake()->SelectControl('device_id', '监测设备'),
\amisMake()->SelectControl('device_id', '监测设备')->options(Device::where('type', Device::TYPE_WATER_QUALITY)->get()->pluck('name', 'id')),
]),
),
amisMake()->ArrayControl('array_devices', '气象监测')->visibleOn('data.type == '.MonitorMode::TYPE_METEOROLOGICAL)
->items(
amisMake()->ComboControl()->items([
\amisMake()->CheckboxesControl('device_fields', '监测字段')->checkAll(true)->options(MonitorMode::fieldMap(MonitorMode::TYPE_METEOROLOGICAL)),
\amisMake()->SelectControl('device_id', '监测设备'),
\amisMake()->SelectControl('device_id', '监测设备')->options(Device::where('type', Device::TYPE_METEOROLOGICAL)->get()->pluck('name', 'id')),
]),
),
amisMake()->PickerControl('picker_devices', '通风设备')->visibleOn('data.type == '.MonitorMode::TYPE_AIR)

View File

@ -2,6 +2,9 @@
namespace App\Admin\Controllers;
use App\Models\Device;
use App\Models\MonitorMode;
use App\Models\WarningNotice;
use Illuminate\Http\Request;
use Slowlyo\OwlAdmin\Controllers\AdminController;
@ -22,29 +25,61 @@ class WarningSettingController extends AdminController
[
'title' => '气象预警',
'value' => 'meteorological',
'tab'=>$this->meteorologicalForm(),
'unmountOnExit' => true//每次切换tab都要销毁
],
[
'title' => '水质预警',
'value' => 'detail',
'tab'=>'',
'tab'=>$this->modeForm(MonitorMode::TYPE_METEOROLOGICAL),
'unmountOnExit' => true//每次切换tab都要销毁
],
// [
// 'title' => '水质预警',
// 'value' => 'detail',
// 'tab'=>'',
// 'unmountOnExit' => true//每次切换tab都要销毁
// ],
[
'title' => '土壤预警',
'value' => 'detail',
'tab'=>'',
'tab'=>$this->modeForm(MonitorMode::TYPE_SOIL),
'unmountOnExit' => true//每次切换tab都要销毁
],
]);
}
public function meteorologicalForm(){
return \amisMake()->Form()->title('')->body([
\amisMake()->TextControl()->label('设备名称'),
\amisMake()->DateRangeControl()->label('时间范围'),
amis('submit')->label(__('admin.save'))->level('primary'),
]);
private function modeForm($type)
{
$formData = $formBody = $fields = [];
//获取当前已设置警报内容
$data = settings()->get('mode_warning_'.$type);
$data && $formData = $data;
foreach(MonitorMode::fieldMap($type) as $field => $fieldName){
$fields[] = [
'label' => $fieldName, 'type'=>'number','step'=>'0.01','name'=>$field,
'operators'=> ['between']
];
}
foreach(WarningNotice::lvMap() as $lv => $lvName){
if(!isset($formData[str($lv).'.conjunction'] )){
$formData[str($lv).'.conjunction'] = 'or';
}
$formBody[] = amisMake()->ConditionBuilderControl(str($lv), $lvName)->fields( $fields);
}
return \amisMake()->Form()
->data($formData)
->api(admin_url('warning-setting-save'))
->title('')->body(array_merge($formBody, [
amisMake()->TextControl('type', '类别')->value('mode_warning_'.$type)->hidden(true),
amis('submit')->label(__('admin.save'))->level('primary')
])
);
}
public function saveSettingConfig(Request $request){
$data = $request->input();
$key = $data['type'] ?? '';
if($key){
unset($data['type']);
return settings()->set($key, $data);
}
return false;
}
}

View File

@ -44,9 +44,11 @@ Route::group([
$router->resource('keywords', \App\Admin\Controllers\KeywordController::class);
//设备管理
$router->resource('devices', \App\Admin\Controllers\DeviceController::class);
$router->post('device-chart', '\App\Admin\Controllers\DeviceController@deviceChart');
//设备预警
$router->get('warning-setting', '\App\Admin\Controllers\WarningSettingController@settingIndex');
$router->post('warning-setting-save', '\App\Admin\Controllers\WarningSettingController@saveSettingConfig');
$router->get('warning-notice', '\App\Admin\Controllers\WarningNoticeController@index');
//监测点位

View File

@ -75,6 +75,42 @@ class MonitorMode extends Model
return $arr;
}
public static function fieldUnitMap($type)
{
$arr = [];
switch ($type) {
case self::TYPE_SOIL:
$arr = [
'conductivity'=>'us/cm',
'humidity'=>'%RH',
'temperature'=>'℃',
'n'=>'n',
'p'=>'p',
'k'=>'k'
];
break;
case self::TYPE_WATER_QUALITY:
$arr = [
];
break;
case self::TYPE_METEOROLOGICAL:
$arr = [
'box_temperature' => '℃',
'box_humidity' => '%RH',
'box_illumination' => 'Lux',
'moment_rainfall' => 'mm',
'wind_speed' => 'm/s',
'wind_direction' => '',
'box_noise' => 'db',
'pm10' => 'ug/m3',
'pm25' => 'ug/m3',
'box_co2' => 'ppm'
];
break;
}
return $arr;
}
protected function serializeDate(\DateTimeInterface $date){
return $date->format('Y-m-d H:i:s');
}

View File

@ -14,6 +14,15 @@ class WarningNotice extends Model
'reported_at',
];
public static function lvMap(){
return [
'1' => 'Ⅰ级预警',
'2' => 'Ⅱ级预警',
'3' => 'Ⅲ级预警',
'4' => 'Ⅳ级预警',
];
}
public function device(){
return $this->belongsTo(Device::class, 'device_id');
}

View File

@ -3,8 +3,11 @@
namespace App\Services\Admin;
use App\Models\Device;
use App\Models\MonitorMode;
use App\Models\{MeteorologicalDailyReport, MeteorologicalReport};
use App\Filters\Admin\DeviceFilter;
use Carbon\Carbon;
use App\Admin\Components;
/**
* @method Device getModel()
* @method Device|\Illuminate\Database\Query\Builder query()
@ -45,4 +48,127 @@ class DeviceService extends BaseService
return compact('items', 'total');
}
/**
* 根据时间处理X轴横坐标
*/
public function makeChartXkeys($startTime = null, $endTime = null){
$diffDays = 0;
$day = date('Y-m-d');
$xKeys = [];
if($startTime && $endTime){
if($startTime == $endTime){//查询某一天
$day = $startTime;
}else{
$startDay = Carbon::parse($startTime);
$endDay = Carbon::parse($endTime);
$diffDays = $startDay->diffInDays($endDay, false);
}
}
$xKeys = [];
if($diffDays){
for ($i = 0; $i<=$diffDays; $i++) {
$xKeys[] =(clone $startDay)->addDays($i)->startOfDay()->format('Y-m-d');
}
}else{
//调整截至到当前小时
$h = 23;
if($day == date('Y-m-d')){
$h = date('H');
}
for ($i = 0; $i < ($h+1); $i++) {
$xKeys[] = str_pad($i, 2, '0', STR_PAD_LEFT).':00';
}
}
return array($day, $diffDays, $xKeys);
}
public function getMonitorModeDeviceChartConfig($monitorMode, $startTime, $endTime, $columnNum = 3)
{
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;
}
$monitorMode->load('devices');
$configData = $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
];
}
}
$k = 0;
$chartArr = [];
foreach($fieldMap as $key => $field){
$k++;
//特殊字段,特殊统计图;
switch($field){
//点状图;-todo
//柱状图;-todo
default://折线图
$_chartCard = amisMake()->Card()->body(
amisMake()->Chart()->config(
Components::make()->chartLineBarConfig($field['name'], $xKeys, [
[
'name'=> $field['name'],
'type' => 'line',
'data' => $field['data'],
'color' => '#91CC75',
'unit' => $field['unit']
]
])
)
);
break;
}
if($k%$columnNum != 0){
$_chartCard->className('m-r');
}
$chartArr[] = $_chartCard;
}
$i = 0;
$len = round(count($chartArr)/$columnNum);
for($i; $i<=$len; $i++){
$configData[] = \amisMake()->grid()->columns([
amisMake()->Flex()->items(array_splice($chartArr, 0, $columnNum)),
]);
}
return $configData;
}
}

View File

@ -16,7 +16,7 @@ class SettingSeeder extends Seeder
public function run()
{
$settings = [
['key' => 'rtsp_url', 'values' => json_encode('ws://117.176.117.148:8100/rtsp?url=')]
['key' => 'rtsp_url', 'values' => json_encode('ws://117.176.117.148:8100/rtsp?url=')],
];
AdminSetting::truncate();
AdminSetting::insert($settings);