添加设备增删改

dev
vine_liutk 2022-10-18 10:40:01 +08:00
parent b694bb992a
commit 347aed7b14
9 changed files with 212 additions and 6 deletions

View File

@ -8,4 +8,25 @@ enum DeviceType: int
case Soil = 2; // 土壤设备
case WaterQuality = 3; // 水质设备
case Meteorological = 4; // 气象设备
/**
* @return string
*/
public function typeName(): string
{
return static::types()[$this->value];
}
/**
* @return array
*/
public static function types(): array
{
return [
static::Monitor->value => '监控设备',
static::Soil->value => '土壤设备',
static::WaterQuality->value => '水质设备',
static::Meteorological->value => '气象设备',
];
}
}

View File

@ -0,0 +1,62 @@
<?php
namespace App\Http\Controllers;
use App\Models\Device;
use App\Enums\DeviceType;
use App\Helpers\Paginator;
use Illuminate\Http\Request;
use App\Http\Requestes\DeviceRequest;
use App\Http\Resources\DeviceResource;
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());
}
}

View File

@ -18,7 +18,7 @@ class CropFlowUpdateRequest extends FormRequest
return [
'time_year' => 'required|date_format:Y',
'crop_id' => 'required|integer|min:0',
'sale' => 'required|integer|min:1',
'sale' => 'required|regex:/^\d+(\.\d{1,2})?$/',
'flow_name'=> 'required|string|max:100',
];
}

View File

@ -0,0 +1,59 @@
<?php
namespace App\Http\Requestes;
use App\Enums\DeviceType;
use Illuminate\Validation\Rules\Enum;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;
class DeviceRequest extends FormRequest
{
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'type' => ['required', new Enum(DeviceType::class)],
'agricultural_base_id' => 'required|integer|min:0',
'sn' => 'required|string|max:64',
'monitoring_point' => 'required|string|max:100',
'extends' => 'required_if:type,1',
'extends.ip'=> 'required_if:type,1|string',
'extends.port'=> 'required_if:type,1|string',
'extends.rtsp_url'=> 'required_if:type,1|string',
'extends.username'=> 'required_if:type,1|string',
'extends.password'=> 'required_if:type,1|string',
'extends.passage'=> 'required_if:type,1|string',
];
}
public function messages()
{
$messages = [
'type' => '请选择设备类型',
'agricultural_base_id' => '请选择基地',
'sn' => '请填写设备编号',
'monitoring_point' => '请填写监控点',
'extends.required_if' =>'请填写监控设备信息',
'extends.ip.required_if' =>'请填写监控设备IP',
'extends.port.required_if' =>'请填写监控设备端口',
'extends.rtsp_url.required_if' =>'请填写监控设备RTSP地址',
'extends.username.required_if' =>'请填写监控设备登录名',
'extends.password.required_if' =>'请填写监控设备登录密码',
'extends.passage.required_if' =>'请填写监控设备播放通道',
];
return $messages;
}
protected function failedValidation(Validator $validator)
{
$error = $validator->errors()->all();
throw new HttpResponseException(response()->json(['data' => [], 'code' => 400, 'message' => $error[0]]));
}
}

View File

@ -0,0 +1,34 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class DeviceResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
*/
public function toArray($request)
{
return [
'id' => $this->id,
'type' => $this->type?->typeName() ?? '未知',
'sn' => $this->sn,
'base_name' => $this->whenLoaded('base', function (){
return $this->base?->name ?? '';
}, ''),
'base_id' => $this->agricultural_base_id,
'monitoring_point' => $this->monitoring_point ?? '',
'status' => $this->status?->value,
'extends' => $this->extends ?? [],
'created_by' => $this->whenLoaded('createdBy', function (){
return $this->createdBy?->name;
}, ''),//录入人
'created_at' => strtotime($this->created_at) ?? 0,//录入时间
];
}
}

View File

@ -0,0 +1,21 @@
<?php
namespace App\ModelFilters;
use Carbon\Carbon;
use EloquentFilter\ModelFilter;
class DeviceFilter extends ModelFilter
{
public function point($point){
return $this->where('monitoring_point', 'like', $point.'%');
}
public function base($base){
return $this->where('agricultural_base_id', $base);
}
public function type($type){
return $this->where('type', $type);
}
}

View File

@ -2,15 +2,16 @@
namespace App\Models;
use App\Enums\DeviceStatus;
use App\Enums\DeviceType;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use App\Enums\DeviceStatus;
use EloquentFilter\Filterable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Factories\HasFactory;
class Device extends Model
{
use HasFactory;
use HasFactory, Filterable;
protected $attributes = [
'status' => DeviceStatus::Offline,
@ -19,6 +20,7 @@ class Device extends Model
protected $casts = [
'type' => DeviceType::class,
'status' => DeviceStatus::class,
'extends' => 'array'
];
protected $fillable = [
@ -34,6 +36,10 @@ class Device extends Model
'updated_by',
];
public function base(){
return $this->belongsTo(AgriculturalBase::class, 'agricultural_base_id');
}
public function createdBy(): BelongsTo
{
return $this->belongsTo(AdminUser::class, 'created_by');

View File

@ -17,8 +17,8 @@ return new class extends Migration
$table->id();
$table->unsignedBigInteger('agricultural_base_id')->comment('农业基地ID');
$table->string('sn')->comment('序列号');
$table->string('name')->comment('名称');
$table->string('model')->comment('型号');
$table->string('name')->nullable()->comment('名称');
$table->string('model')->nullable()->comment('型号');
$table->string('monitoring_point')->nullable()->comment('监控点');
$table->tinyInteger('type')->comment('类型: 1 监控设备, 2 土壤设备, 3 水质设备, 4 气象设备');
$table->tinyInteger('status')->default(2)->comment('状态: 0 禁用, 1 在线, 2 离线, 3 故障');

View File

@ -21,6 +21,7 @@ Route::group(['middleware' => 'auth:sanctum'], function () {
Route::get('keywords-crops', [KeywordController::class, 'crops']); //农作物
Route::get('keywords-crops-cate', [KeywordController::class, 'cropsCate']); //农作物产业分类
Route::get('permissions', [AdminPermissionController::class, 'index']);
Route::get('device-types', [DeviceController::class, 'types']);
Route::group(['as'=>'endpoint.'], function (){
@ -34,6 +35,8 @@ Route::group(['middleware' => 'auth:sanctum'], function () {
Route::apiResource('crop-yields', CropYieldController::class)->names('crops_output');
//流向
Route::apiResource('crop-flows', CropFlowController::class)->names('crops_flow');
//设备管理
Route::apiResource('devices', DeviceController::class)->names('device');
/** 系统管理 **/
Route::apiResource('admin-users', AdminUserController::class)->names('admin_users');