123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- <?php
- namespace App\Service;
- use App\Model\Device;
- use App\Model\DeviceType;
- use App\Model\Gateway;
- use App\Model\ScreenDevice;
- use App\Model\SystemL;
- class SystemlService extends Service
- {
- public static function getLastData($code = [], $min = -10){
- if(empty($code)) {
- $codes = Device::where('del_time',0)->select('code','device_type_id')->get()->toArray();
- if(empty($codes)) return [];
- $code = array_column($codes,'code');
- $code_type_map = array_column($codes,'device_type_id','code');
- }
- $return = [];
- foreach ($code as $value){
- $return[$value] = [];
- }
- $time = strtotime($min.' 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();
- if(! empty($result)){
- foreach ($result as $value){
- if(! empty($return[$value['device_no']])) continue;
- //只取每个设备最新的一条数据
- $return[$value['device_no']] = [
- 'data_point_name' => $value['data_point_name'],
- 'value' => $value['value']
- ];
- if(! empty($code_type_map[$value['device_no']])) $return[$value['device_no']]['device_type_id'] = $code_type_map[$value['device_no']];
- }
- }
- 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]) && ! empty($value)){
- $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]) && ! empty($value)){
- $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)) {
- $gateway = Gateway::where('del_time',0)->select('id')->get()->toArray();
- if(empty($gateway)) return [];
- $gateway = array_column($gateway,'id');
- }
- //网关是否在线
- $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(! empty($data[$code])){
- $result[$gateway] = 1;
- }
- }
- }
- return $result;
- }
- }
|