1
0
Fork 0

完善设备管理

develop
vine_liutk 2023-05-04 10:50:16 +08:00
parent cfbd28918d
commit 8f8d5ff8ef
9 changed files with 149 additions and 11 deletions

View File

@ -2,6 +2,7 @@
namespace App\Admin;
use App\Models\Keyword;
use Slowlyo\OwlAdmin\Renderers\BaseRenderer;
class Components extends BaseRenderer {
@ -71,4 +72,10 @@ class Components extends BaseRenderer {
->mode($mode)
->onText(__('admin.extensions.status_map.enabled'))->offText(__('admin.extensions.status_map.disabled'));
}
public function keywordsTagControl($name = 'tags', $label= '标签', $typeKey = ''){
return amisMake()->TagControl()
->name($name)->label($label)
->options(Keyword::getByParentKey($typeKey)->pluck('name', 'id')->toArray());
}
}

View File

@ -10,6 +10,9 @@ use Slowlyo\OwlAdmin\Renderers\CRUDTable;
use Slowlyo\OwlAdmin\Controllers\AdminController;
use App\Services\Admin\DeviceService;
use App\Models\Device;
use App\Models\Keyword;
use App\Admin\Components;
use Slowlyo\OwlAdmin\Renderers\Button;
class DeviceController extends AdminController
{
@ -25,13 +28,27 @@ class DeviceController extends AdminController
$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'),
Components::make()->keywordsTagControl('group_tags', '分组', 'device-group')->size('md'),
Button::make()->label(__('admin.reset'))->actionType('clear-and-submit'),
amis('submit')->label(__('admin.search'))->level('primary'),
]))
->quickSaveItemApi(admin_url('quick-edit/devices/$id'))
->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('is_enable')->type('switch')->label('显示')->quickEdit(Components::make()->enableControl('is_enable', '', 'inline')->saveImmediately(true)),
TableColumn::make()->name('is_recommend')->type('switch')->label('推荐')->quickEdit(Components::make()->enableControl('is_recommend', '', 'inline')->saveImmediately(true)),
TableColumn::make()->name('sort')->label(__('admin.order'))->align('center')->quickEdit(Components::make()->sortControl('sort', __('admin.order'))->saveImmediately(true)),
TableColumn::make()->name('created_at')->label('创建时间')->type('datetime')->sortable(true),
TableColumn::make()->name('updated_at')->label('更新时间')->type('datetime')->sortable(true),
$this->rowActions(true),
$this->rowActions(true, 'lg'),
]);
return $this->baseList($crud);
@ -41,8 +58,8 @@ class DeviceController extends AdminController
{
return $this->baseForm()->body([
TextControl::make()->name('name')->label('名称')->required(true),
TextControl::make()->name('sn')->label('编号'),
\amisMake()->SelectControl()->name('powered_by')->label('厂家')->options(),
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),
//监控设备-额外参数
@ -57,6 +74,10 @@ class DeviceController extends AdminController
\amisMake()->TextControl()->name('extends.back_port')->hiddenOn('data.type != '.Device::TYPE_MONITOR)->label('回放端口'),
\amisMake()->TextControl()->name('extends.back_channel')->hiddenOn('data.type != '.Device::TYPE_MONITOR)->label('回放通道'),
]),
Components::make()->keywordsTagControl('group_tags', '分组', 'device-group'),
Components::make()->sortControl('sort', __('admin.order')),
TextControl::make()->name('is_enable')->type('switch')->default(1)->label('显示'),
TextControl::make()->name('is_recommend')->type('switch')->default(0)->label('推荐'),
]);
}

View File

@ -43,6 +43,7 @@ Route::group([
$router->resource('keywords', \App\Admin\Controllers\KeywordController::class);
//设备管理
$router->resource('devices', \App\Admin\Controllers\DeviceController::class);
$router->post('quick-edit/devices/{device}',[\App\Admin\Controllers\DeviceController::class, 'update']);
//设备预警
$router->get('warning-setting', '\App\Admin\Controllers\WarningSettingController@settingIndex');
$router->get('warning-notice', '\App\Admin\Controllers\WarningNoticeController@index');

View File

@ -0,0 +1,36 @@
<?php
namespace App\Filters\Admin;
use EloquentFilter\ModelFilter;
class DeviceFilter extends ModelFilter
{
/**
* 名称
*/
public function name($name){
return $this->where('name', 'like', '%'.$name.'%');
}
/**
* 厂家
*/
public function factory($factory){
return $this->where('powered_by', $factory);
}
/**
* 类型
*/
public function type($type){
return $this->where('type', $type);
}
/**
* 分组
*/
public function groupTags($groupTags){
return $this->whereRaw("FIND_IN_SET(group_tags,'$groupTags')");
}
}

View File

@ -16,6 +16,7 @@ class Device extends Model
public const TYPE_SOIL = 2; //土壤设备
public const TYPE_WATER_QUALITY = 3; //水质设备
public const TYPE_METEOROLOGICAL = 4; //气象设备
public const TYPE_AIR = 5; //通风设备
public const STATE_DISABLED = 0;
public const STATE_ONLINE = 1;
@ -24,18 +25,14 @@ class Device extends Model
protected $fillable = [
'name', 'sn', 'powered_by', 'type', 'model_sn', 'state', 'extends',
'is_enable', 'sort', 'is_recommend'
'is_enable', 'sort', 'is_recommend',
'group_tags'
];
protected function serializeDate(\DateTimeInterface $date){
return $date->format('Y-m-d H:i:s');
}
public function logs(): HasMany
{
return $this->hasMany(DeviceLog::class);
}
public static function typeMap()
{
return [
@ -43,6 +40,17 @@ class Device extends Model
self::TYPE_SOIL => '土壤设备',
self::TYPE_WATER_QUALITY => '水质设备',
self::TYPE_METEOROLOGICAL => '气象设备',
self::TYPE_AIR => '通风设备'
];
}
public function logs(): HasMany
{
return $this->hasMany(DeviceLog::class);
}
public function factory(){
return $this->belongsTo(Keyword::class, 'powered_by');
}
}

View File

@ -5,6 +5,7 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use EloquentFilter\Filterable;
use Illuminate\Database\Eloquent\Builder;
class Keyword extends Model
{
@ -48,4 +49,9 @@ class Keyword extends Model
return $this->hasMany(static::class, 'parent_id');
}
public static function getByParentKey(String $key)
{
return self::query()->where('type_key', $key)->get();
}
}

View File

@ -3,13 +3,17 @@
namespace App\Services\Admin;
use App\Models\Device;
use Slowlyo\OwlAdmin\Services\AdminService;
use App\Filters\Admin\DeviceFilter;
/**
* @method Device getModel()
* @method Device|\Illuminate\Database\Query\Builder query()
*/
class DeviceService extends AdminService
class DeviceService extends BaseService
{
protected string $modelName = Device::class;
protected array $withRelationships = ['factory'];
protected string $modelFilterName = DeviceFilter::class;
}

View File

@ -25,6 +25,7 @@ return new class extends Migration
$table->unsignedTinyInteger('is_recommend')->default(0)->comment('推荐开关');
$table->unsignedTinyInteger('is_enable')->default(1)->comment('显示开关');
$table->unsignedInteger('sort')->default(0)->comment('排序');
$table->string('group_tags')->nullable()->comment('分组标签');
$table->timestamps();
});
}

View File

@ -0,0 +1,54 @@
<?php
namespace Database\Seeders;
use App\Models\Keyword;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Arr;
class KeywordSeeder extends Seeder
{
use WithoutModelEvents;
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Keyword::truncate();
$list = [
['key' => 'device-factory', 'name' => '厂家', 'list' => [
['name' => 'LINK-OS', 'key'=>'link-os']
]],
['key' => 'device-group', 'name' => '设备组', 'list' => [
['name' => '农机', 'key'=>'machinery']
]],
];
foreach ($list as $item) {
$type = Keyword::create(Arr::except($item, 'list'));
if (isset($item['list'])) {
$keywords = [];
foreach ($item['list'] as $index => $name) {
$template = [
'key' => $type->key . ($index + 1),
'type_key' => $type->key,
'level' => $type->level + 1,
'sort' => $index + 1
];
if (is_array($name)) {
$template = array_merge($template, $name);
} else {
$template['name'] = $name;
}
array_push($keywords, $template);
}
$type->children()->createMany($keywords);
}
}
}
}