where('push_time','>=',$time) ->select('data_point_name','value','device_no') ->orderBy('id','desc') ->get()->toArray(); $return = []; if(! empty($result)){ foreach ($result as $value){ 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 = $screen_id = $gateway = $tmp = []; foreach ($map as $value){ $result[$value['screen_id']] = 0; // $gateway[] = $value['gateway_id']; // $tmp[$value['screen_id']] = $value['gateway_id']; $screen_id[] = $value['screen_id']; } ; //设备 和 仓的关系 $return = ScreenDevice::from('screen_device as a') ->leftJoin('device as b','b.id','a.device_id') ->whereIn('a.screen_id',$screen_id) ->where('a.del_time',0) ->pluck('a.screen_id','b.code') ->toArray(); // $device = Device::where('del_time',0) // ->whereIn('gateway_id',$gateway) // ->select('code','gateway_id')->get()->toArray();dump($tmp);die; // foreach ($device as $value){ // foreach ($tmp as $k_screen_id => $v){ // if($value['gateway_id'] == $v){ // $return[$value['code']] = $k_screen_id; // } // } // } //获取最新设备的数据 $data = self::getLastData(array_keys($return)); 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; } public static function getIsOnlineStatusGateWay($gateway){ if(empty($gateway)) return []; //网关是否在线 $result = []; foreach ($gateway as $value){ $result[$value] = 0; } $device = Device::where('del_time',0) ->whereIn('gateway_id',$gateway) ->select('code','gateway_id') ->get()->toArray(); $gateway_connect_device = []; foreach ($device as $value){ $gateway_connect_device[$value['gateway_id']][] = $value['code']; } //获取最新设备的数据 $data = self::getLastData(array_column($device,'code')); foreach ($gateway_connect_device as $gateway => $value){ if(! empty($result[$gateway])) continue; foreach ($value as $code){ if(isset($data[$code])){ $result[$gateway] = 1; } } } return $result; } }