Browse Source

测试数据

cqpCow 1 year ago
parent
commit
7509e67596

+ 1 - 1
app/Http/Kernel.php

@@ -40,7 +40,7 @@ class Kernel extends HttpKernel
         ],
 
         'api' => [
-            'throttle:180,1',
+//            'throttle:180,1',
             \Illuminate\Routing\Middleware\SubstituteBindings::class,
         ],
     ];

+ 20 - 0
app/Model/DeviceType.php

@@ -10,5 +10,25 @@ class DeviceType extends Model
     const CREATED_AT = 'crt_time';
     const UPDATED_AT = 'upd_time';
     protected $dateFormat = 'U';
+
+    const type_one = 1;
+    const type_two = 2;
+    const type_three = 3;
+    const type_four = 4;
+
+    const temperature_normal = '温度正常';
+    const temperature_abnormal = '温度异常';
+    const humidity_normal = '湿度正常';
+    const humidity_abnormal = '湿度异常';
+
+    public static $abnormal = [self::temperature_abnormal,self::humidity_abnormal];
+    public static $normal = [self::temperature_normal,self::humidity_normal];
+
+    //节点一
+    public static $node_one = [2]; //开关类
+    //节点二
+    public static $node_two = [1]; //传感器类
+    //节点三
+    public static $node_three = [3]; // 预警类
 }
 

+ 14 - 2
app/Model/Screen.php

@@ -17,8 +17,20 @@ class Screen extends Model
     public static $name = [
         1 => '移动仓设备',
         2 => '工作仓设备',
-        3 => '社区仓设备',
-        4 => '其他设备'
+        3 => '社区仓设备'
+    ];
+    public static $online = [
+        0 => '离线',
+        1 => '在线'
+    ];
+    public static $gps = [
+        0 => '停运',
+        1 => '闲置',
+        2 => '载运'
+    ];
+    public static $exception = [
+        0 => '异常',
+        1 => '正常'
     ];
 }
 

+ 8 - 1
app/Service/AreaService.php

@@ -18,6 +18,7 @@ class AreaService extends Service
         $model = Area::where('id',$data['id'])->first();
         $model->title = $data['title'];
         $model->code = $data['code'];
+        $model->type = $data['type'];
         $model->save();
 
         return [true,'保存成功!'];
@@ -30,6 +31,7 @@ class AreaService extends Service
         $model = new Area();
         $model->title = $data['title'];
         $model->code = $data['code'];
+        $model->type = $data['type'];
         $model->save();
 
         return [true,'保存成功!'];
@@ -50,10 +52,11 @@ class AreaService extends Service
 
     public function AreaList($data){
         $model = Area::where('del_time',0)
-            ->select('title','id','code')
+            ->select('title','id','code','type')
             ->orderby('id', 'desc');
         if(! empty($data['title'])) $model->where('title', 'LIKE', '%'.$data['title'].'%');
         if(! empty($data['code'])) $model->where('code', 'LIKE', '%'.$data['code'].'%');
+        if(! empty($data['type'])) $model->where('type', $data['type']);
 
         $list = $this->limit($model,'',$data);
 
@@ -63,14 +66,18 @@ class AreaService extends Service
     public function areaRule($data, $is_check = true){
         if(empty($data['title'])) return [false,'区域名称不能为空!'];
         if(empty($data['code'])) return [false,'区域编码不能为空!'];
+        if(empty($data['type'])) return [false,'区域类型不能为空'];
+
         if($is_check){
             $bool = Area::whereRaw("(binary code = '{$data['code']}' OR title = '{$data['title']}')")
+                ->where('type',$data['type'])
                 ->where('del_time',0)
                 ->exists();
         }else{
             if(empty($data['id'])) return [false,'id不能为空!'];
 
             $bool = Area::whereRaw("(binary code = '{$data['code']}' OR title = '{$data['title']}')")
+                ->where('type',$data['type'])
                 ->where('id','<>',$data['id'])
                 ->where('del_time',0)
                 ->exists();

+ 20 - 2
app/Service/DeviceService.php

@@ -107,11 +107,15 @@ class DeviceService extends Service
         if(! empty($data['gateway_id'])) $model->where('gateway_id', $data['gateway_id']);
         if(! empty($data['device_type_id'])) $model->where('device_type_id', $data['device_type_id']);
         if(! empty($data['remark'])) $model->where('remark', 'LIKE', '%'.$data['remark'].'%');
-        if(! empty($data['is_add_to_screen'])){
+        if(! empty($data['screen_id']) || ! empty($data['is_add_to_screen'])){
             $id = ScreenDevice::where('del_time',0)
                 ->select('device_id')
                 ->get()->toArray();
-            $model->whereNotIn('id',array_column($id,'device_id'));
+            if(! empty($data['screen_id'])){
+                $model->whereIn('id',array_column($id,'device_id'));
+            }else{
+                $model->whereNotIn('id',array_column($id,'device_id'));
+            }
         }
 
         $list = $this->limit($model,'',$data);
@@ -129,9 +133,23 @@ class DeviceService extends Service
             ->pluck('title','id')
             ->toArray();
 
+        $message = SystemlService::getLastData(array_column($data['data'],'code'));
         foreach ($data['data'] as $key => $value){
             $data['data'][$key]['gateway'] = $gatewayMap[$value['gateway_id']] ?? '';
             $data['data'][$key]['device_type'] = $deviceTypeMap[$value['device_type_id']] ?? '';
+            $is_online = $is_exception = 0;
+            if(isset($message[$value['code']])){
+                $is_online = 1;
+                $tmp = $message[$value['code']];
+                if(in_array($value['device_type_id'],DeviceType::$node_two)){
+                    //传感器类
+                    if(in_array($tmp['data_point_name'],DeviceType::$normal)) $is_exception = 1;
+                }else{
+                    $is_exception = 1;
+                }
+            }
+            $data['data'][$key]['is_online'] = $is_online;
+            $data['data'][$key]['is_exception'] = $is_exception;
         }
 
         return $data;

+ 49 - 13
app/Service/EmployeeService.php

@@ -95,6 +95,8 @@ class EmployeeService extends Service
     public function employeeDel($data){
         if($this->isEmpty($data,'id')) return [false,'请选择人员!'];
 
+        if($data['id'] == Employee::SPECIAL_ACCOUNT_ID) return [false,'删除失败!'];
+
         Employee::where('id',$data['id'])->update([
             'del_time'=>time()
         ]);
@@ -104,11 +106,16 @@ class EmployeeService extends Service
 
     public function employeeList($data,$user){
         $model = Employee::where('del_time',0)
-            ->select('crt_time','account','upd_time','id','mark')
+            ->select('account','upd_time','id','mark','crt_time')
             ->orderBy('id','desc');
         if($user['id'] != Employee::SPECIAL_ACCOUNT_ID) $model->where('id','<>',Employee::SPECIAL_ACCOUNT_ID);
         if(! empty($data['account'])) $model->where('account', 'LIKE', '%'.$data['account'].'%');
         if(! empty($data['mark'])) $model->where('mark', 'LIKE', '%'.$data['mark'].'%');
+        if(! empty($data['role'])) {
+            $emp = EmployeeRole::where('role_id',$data['role'])
+                ->select('employee_id')->get()->toArray();
+            $model->whereIn('id',array_column($emp,'employee_id'));
+        }
 
         $list = $this->limit($model,'',$data);
 
@@ -122,23 +129,26 @@ class EmployeeService extends Service
         if (empty($data['data'])) return $data;
 
         $res = DB::table('employee_role as a')
-            ->join('role as b','a.employee_id','=','b.id')
+            ->leftJoin('role as b','a.role_id','=','b.id')
             ->where('a.del_time',0)
+            ->where('b.del_time',0)
             ->whereIn("a.employee_id",array_column($data['data'],'id'))
-            ->select('a.employee_id','b.title')
+            ->select('a.employee_id','b.title','b.id')
             ->get()->toArray();
-        $role = [];
+        $role = $role2 = [];
         foreach ($res as $value){
-            if(isset($role[$value['employee_id']])){
-                $role[$value['employee_id']] .= ',' . $value['title'];
+            if(isset($role[$value->employee_id])){
+                $role[$value->employee_id] .= ',' . $value->title;
             }else{
-                $role[$value['employee_id']] = $value['title'];
+                $role[$value->employee_id] = $value->title;
             }
+            $role2[] = $value->id;
         }
 
         foreach ($data['data'] as $key => $value){
-            $data['data'][$key]['role'] = $role[$value['id']] ?? '';
-            $data['data'][$key]['crt_time'] = date("Y-m-d",$value['crt_time']);
+            $data['data'][$key]['role'] = $role2;
+            $data['data'][$key]['role_name'] = $role[$value['id']] ?? '';
+            $data['data'][$key]['crt_time'] = $value['crt_time'] ? date('Y-m-d',$value['crt_time']) : '';
         }
         return $data;
     }
@@ -556,7 +566,7 @@ class EmployeeService extends Service
         //人员角色
         $role = EmployeeService::getPersonRole($res['id']);
         //人员角色的菜单
-        $role_menu = EmployeeService::getMenuByRole($role);
+        $role_menu = EmployeeService::getMenuByRole($role,$res['id']);
 
         return [true, ['id'=>$res['id'], 'account' => $res['account'], 'role' => $role, 'role_menu' => $role_menu]];
     }
@@ -587,13 +597,39 @@ class EmployeeService extends Service
     }
 
     //获取登录账号的角色的菜单
-    public static function getMenuByRole($role_id){
-        if(empty($role_id)) return [];
+    public static function getMenuByRole($role_id,$user_id){
+        $menu = SysMenu::where('del_time',0)->select('id')->get()->toArray();
+        $object = [];//返回的模型
+        if($user_id == Employee::SPECIAL_ACCOUNT_ID){
+            //超级管理员
+            foreach ($menu as $value){
+                $object[] = [
+                    'type' => 0,//所有权限
+                    'menu_id' => $value['id'],
+                ];
+            }
+            return $object;
+        }
 
-        return RoleMenu::whereIn('role_id',$role_id)
+        foreach ($menu as $value){
+            $object[$value['id']] = [
+                'type' => 1,//查看权限
+                'menu_id' => $value['id'],
+            ];
+        }
+        if(empty($role_id)) return $object;
+
+        $search = RoleMenu::whereIn('role_id',$role_id)
             ->where('del_time',0)
             ->select('menu_id','type')
             ->get()->toArray();
+        foreach ($search as $value){
+            if(isset($object[$value['menu_id']])){
+                $object[$value['menu_id']]['type'] = $value['type'];
+            }
+        }
+
+        return array_values($object);
     }
 
     //获取登录账号的权限部门

+ 3 - 2
app/Service/GatewayService.php

@@ -72,17 +72,18 @@ class GatewayService extends Service
     }
 
     public function equipmentRule($data,$is_add = true){
+        if(empty($data['title'])) return [false,'网关编码不能为空'];
         if(empty($data['code'])) return [false,'网关编码不能为空'];
         if(! isset($data['band'])) return [false,'网络频带不能为空'];
         if(empty($data['protocol'])) return [false,'协议不能为空'];
 
         if($is_add){
-            $bool = Gateway::whereRaw("code = '{$data['code']}'")
+            $bool = Gateway::whereRaw("(binary code = '{$data['code']}' OR title = '{$data['title']}')")
                 ->where('del_time',0)
                 ->exists();
         }else{
             if($this->isEmpty($data,'id')) return [false,'id不能为空!'];
-            $bool = Gateway::whereRaw("code = '{$data['code']}'")
+            $bool = Gateway::whereRaw("(binary code = '{$data['code']}' OR title = '{$data['title']}')")
                 ->where('id','<>',$data['id'])
                 ->where('del_time',0)
                 ->exists();

+ 56 - 15
app/Service/ScreenService.php

@@ -3,6 +3,7 @@
 namespace App\Service;
 
 use App\Model\Device;
+use App\Model\DeviceType;
 use App\Model\Screen;
 use App\Model\ScreenDevice;
 use App\Model\ScreenGateway;
@@ -24,6 +25,8 @@ class ScreenService extends Service
             $model->size = $data['size'];
             $model->type = $data['type'];
             $model->remark = $data['remark'];
+            $model->address = $data['address'] ?? '';
+            $model->coordinate = $data['coordinate'] ?? '';
             $model->save();
 
             ScreenGateway::where('screen_id',$data['id'])->update(['del_time' => time()]);
@@ -61,6 +64,8 @@ class ScreenService extends Service
             $model->size = $data['size'];
             $model->type = $data['type'];
             $model->remark = $data['remark'];
+            $model->address = $data['address'] ?? '';
+            $model->coordinate = $data['coordinate'] ?? '';
             $model->save();
 
             if(isset($data['gateway_id'])){
@@ -89,8 +94,6 @@ class ScreenService extends Service
 
         $bool = ScreenDevice::where('del_time',0)->where('screen_id',$data['id'])->exists();
         if($bool) return [false,'仓已绑定设备'];
-        $bool = ScreenGateway::where('del_time',0)->where('screen_id',$data['id'])->exists();
-        if($bool) return [false,'仓已绑定网关'];
 
         Screen::where('id',$data['id'])->update([
             'del_time' => time()
@@ -119,10 +122,39 @@ class ScreenService extends Service
         }
 
         $list = $this->limit($model,'',$data);
+        $list = $this->fillOrderList($list);
 
         return [200,$list];
     }
 
+    public function fillOrderList($data){
+        if(empty($data['data'])) return $data;
+
+        $screen_id = array_column($data['data'],'id');
+        $gateway_id = ScreenGateway::whereIn('screen_id',$screen_id)
+            ->where('del_time',0)
+            ->pluck('screen_id','gateway_id')
+            ->toArray();
+        //获取仓是否在线离线状态
+        $online = SystemlService::getIsOnlineStatus($gateway_id);
+        //获取Gps信号判断状态
+        $gps = SystemlService::getGpsStatus($screen_id);
+        //获取是否异常状态判断
+        $exception = SystemlService::getExceptionStatus($screen_id);
+
+        foreach ($data['data'] as $key => $value){
+            $data['data'][$key]['gateway_id'] = $gateway_id[$value['id']] ?? 0;
+            $tmp_online = $online[$value['id']] ?? 0;
+            $tmp_coordinate = $gps[$value['id']] ?? 0;
+            $tmp_exception = $exception[$value['id']] ?? 0;
+            $data['data'][$key]['is_online'] = Screen::$online[$tmp_online] ?? '';
+            $data['data'][$key]['coordinate'] = Screen::$gps[$tmp_coordinate] ?? '';
+            $data['data'][$key]['is_exception'] = Screen::$exception[$tmp_exception] ?? '';
+        }
+
+        return $data;
+    }
+
     public function screenRule($data,$is_add = true){
         if(empty($data['title'])) return [false,'名称不能为空!'];
         if(empty($data['code'])) return [false,'编码不能为空!'];
@@ -148,12 +180,14 @@ class ScreenService extends Service
 
     public function screenDeviceList($data){
         if(empty($data['screen_id'])) return [false,'仓ID不能为空'];
-        $device = ScreenDevice::from('screen_device as a')
+        $model = ScreenDevice::from('screen_device as a')
             ->leftJoin('device as b','b.id','a.device_id')
+            ->leftJoin('device_type as c','c.id','b.device_type_id')
             ->where('a.screen_id',$data['screen_id'])
-            ->select('a.id','b.id as device_id','b.title','b.code','b.gateway_id','b.device_type_id')
-            ->get()->toArray();
-        return [true,$device];
+            ->select('a.id','b.id as device_id','b.title','b.code','b.gateway_id','b.device_type_id','b.remark','c.title as device_type_name');
+
+        $list = $this->limit($model,'',$data);
+        return [true, $list];
     }
 
     public function screenDevice($data){
@@ -182,6 +216,12 @@ class ScreenService extends Service
             ->whereIn('device_id',$data['device_id'])
             ->exists();
         if($bool) return [false, '设备已经绑定其他仓!'];
+
+        $one = ScreenGateway::where('del_time',0)->where('screen_id',$data['screen_id'])->first();
+        $two = Device::where('del_time',0)->where('id',$data['device_id'])->first();
+        if(empty($one)) return [false,'仓网关不存在!'];
+        if(empty($two)) return [false,'设备网关不存在!'];
+        if($one->gateway_id != $two->gateway_id) return [false,'设备网关与仓网关不一致!'];
     }
 
     public function screenRemoveDevice($data){
@@ -193,11 +233,11 @@ class ScreenService extends Service
     }
 
     public function screenDeviceDataRealTimeList($data){
-        if(empty($data['id'])) return [false,'请选择仓或台'];
+        if(empty($data['screen_id'])) return [false,'请选择仓或台'];
 
         //获取仓或台的设备ID
         $device = ScreenDevice::where('del_time',0)
-            ->where('screen_id',$data['id'])
+            ->where('screen_id',$data['screen_id'])
             ->select('device_id')
             ->get()->toArray();
         $device = array_column($device,'device_id');
@@ -206,31 +246,32 @@ class ScreenService extends Service
         $device = Device::whereIn('id',$device)
             ->select('code','device_type_id')
             ->get()->toArray();
-        $nodeOne = $nodeTwo = $nodeThree = [];
+        $map = $nodeOne = $nodeTwo = $nodeThree = [];
         foreach ($device as $value){
-            if($value['device_type_id'] == 3){
+            if(in_array($value['device_type_id'],DeviceType::$node_one)){
                 $nodeOne[] = $value['code'];
-            }elseif(in_array($value['device_type_id'],[1,2,7])){
+            }elseif(in_array($value['device_type_id'],DeviceType::$node_two)){
                 $nodeTwo[] = $value['code'];
-            }else{
+            }elseif(in_array($value['device_type_id'],DeviceType::$node_three)){
                 $nodeThree[] = $value['code'];
             }
+            $map[$value['code']] = $value['device_type_id'];
         }
 
         $posts_a = SystemL::whereIn('device_no', $nodeOne)
             ->select('data_point_name','value')
             ->orderBy('id','desc')
-            ->limit(10)
+            ->limit(20)
             ->get()->toArray();
         $posts_b = SystemL::whereIn('device_no', $nodeTwo)
             ->select('data_point_name','value')
             ->orderBy('id','desc')
-            ->limit(10)
+            ->limit(20)
             ->get()->toArray();
         $posts_c = SystemL::whereIn('device_no', $nodeThree)
             ->select('data_point_name','value')
             ->orderBy('id','desc')
-            ->limit(10)
+            ->limit(20)
             ->get()->toArray();
 
         return [true,['node_one' => $posts_a,'node_two'=>$posts_b,'node_three'=>$posts_c]];

+ 175 - 0
app/Service/SystemlService.php

@@ -0,0 +1,175 @@
+<?php
+
+namespace App\Service;
+
+use App\Model\Device;
+use App\Model\DeviceType;
+use App\Model\ScreenDevice;
+use App\Model\SystemL;
+
+class SystemlService extends Service
+{
+    public static function getLastData($code = []){
+        if(empty($code)) return [];
+
+        $time = strtotime('-1 min',time());
+        $time = $time * 1000;
+
+        $result = SystemL::whereIn('device_no',$code)
+            ->where('push_time','>=',$time)
+            ->select('data_point_name','value','device_no')
+            ->orderBy('id','desc')
+            ->get()->toArray();
+
+        $return = [];
+        if(! empty($result)){
+            $map = Device::where('del_time',0)
+                ->whereIn('code',$code)
+                ->pluck('device_type_id','code')
+                ->toArray();
+            foreach ($result as $value){
+                $tmp = $map[$value['device_no']] ?? 0;
+                if(! $tmp) continue;
+                if(isset($return[$value['device_no']])) continue;
+                //只取每个设备最新的一条数据
+                $return[$value['device_no']] = [
+                    'data_point_name' => $value['data_point_name'],
+                    'value' => $value['value']
+                ];
+            }
+        }
+
+        return $return;
+    }
+
+    //'gateway_id' => 键,'screen_id' => 值
+    public static function getIsOnlineStatus($map = []){
+        if(empty($map)) return [];
+
+        //仓是否在线
+        $result = [];
+        foreach ($map as $value){
+            $result[$value] = 0;
+        }
+
+        //设备 和 仓的关系
+        $return = [];
+        $device = Device::where('del_time',0)
+            ->whereIn('gateway_id',array_keys($map))
+            ->select('code','gateway_id')->get()->toArray();
+        foreach ($device as $value){
+            if(isset($map[$value['gateway_id']])){
+                $return[$value['code']] = $map[$value['gateway_id']];
+            }
+        }
+
+        //获取最新设备的数据
+        $data = self::getLastData(array_column($device,'code'));
+        foreach ($data as $key => $value){
+            if(isset($return[$key])){
+                $result[$return[$key]] = 1;
+            }
+        }
+
+        return $result;
+    }
+
+    public static function getGpsStatus($screen_id){
+        if(empty($screen_id)) return [];
+
+        //仓 载运2/闲置1/停运0
+        $result = [];
+        foreach ($screen_id as $value){
+            $result[$value] = 0;
+        }
+
+        $screen = ScreenDevice::from('screen_device as a')
+            ->leftJoin('device as b','b.id','a.device_id')
+            ->leftJoin('screen as c','c.id','a.screen_id')
+            ->where('b.device_type_id',DeviceType::type_four)
+            ->whereIn('a.screen_id',$screen_id)
+            ->select('b.code','c.coordinate','a.screen_id')
+            ->get()->toArray();
+        if(empty($screen)) return $result;
+        $screen_map = array_column($screen,null,'code');
+
+        //获取最新设备的数据
+        $data = self::getLastData(array_column($screen,'code'));
+        foreach ($data as $key => $value){
+            if(isset($screen_map[$key])){
+                $tmp = $screen_map[$key];
+                $tmp_coordinate = $tmp['coordinate'];
+                if(isset($result[$tmp['screen_id']]) && $tmp_coordinate){
+                    //计算偏差值
+                    try {
+                        $meter = self::calculateDistance($tmp_coordinate,$value['value']);
+                        if($meter > 200){
+                            $result[$tmp['screen_id']] = 2;
+                        }else{
+                            $result[$tmp['screen_id']] = 1;
+                        }
+                    }catch (\Exception $e){
+                        continue;
+                    }
+                }
+            }
+        }
+
+        return $result;
+    }
+
+    public static function calculateDistance($coordinate1, $coordinate2) {
+        $earthRadius = 6371000; // 地球半径,单位为米
+
+        list($lat1,$lon1) = explode(',',$coordinate1);
+        list($lat2,$lon2) = explode(',',$coordinate2);
+        $lat1Rad = deg2rad($lat1);
+        $lon1Rad = deg2rad($lon1);
+        $lat2Rad = deg2rad($lat2);
+        $lon2Rad = deg2rad($lon2);
+
+        $deltaLat = $lat2Rad - $lat1Rad;
+        $deltaLon = $lon2Rad - $lon1Rad;
+
+        $a = sin($deltaLat / 2) * sin($deltaLat / 2) +
+            cos($lat1Rad) * cos($lat2Rad) *
+            sin($deltaLon / 2) * sin($deltaLon / 2);
+        $c = 2 * atan2(sqrt($a), sqrt(1 - $a));
+
+        $distance = $earthRadius * $c;
+
+        return $distance;
+    }
+
+    public static function getExceptionStatus($screen_id){
+        if(empty($screen_id)) return [];
+
+        //仓 正常1/异常0
+        $result = [];
+        foreach ($screen_id as $value){
+            $result[$value] = 0;
+        }
+
+        $screen = ScreenDevice::from('screen_device as a')
+            ->leftJoin('device as b','b.id','a.device_id')
+            ->whereIn('b.device_type_id',[DeviceType::type_two, DeviceType::type_three])
+            ->whereIn('a.screen_id',$screen_id)
+            ->select('b.code','a.screen_id')
+            ->get()->toArray();
+        if(empty($screen)) return $result;
+        $screen_map = array_column($screen,null,'code');
+
+        //获取最新设备的数据
+        $data = self::getLastData(array_column($screen,'code'));
+        foreach ($data as $key => $value){
+            if(isset($screen_map[$key])){
+                $tmp = $screen_map[$key];
+                if(isset($result[$tmp['screen_id']]) && $value['value'] == 1){
+                    $result[$tmp['screen_id']] = 1;
+                }
+            }
+        }
+
+        return $result;
+    }
+}