SystemlService.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. <?php
  2. namespace App\Service;
  3. use App\Model\Device;
  4. use App\Model\DeviceType;
  5. use App\Model\ScreenDevice;
  6. use App\Model\SystemL;
  7. class SystemlService extends Service
  8. {
  9. public static function getLastData($code = [], $min = -1){
  10. if(empty($code)) {
  11. $codes = Device::where('del_time',0)->select('code','device_type_id')->get()->toArray();
  12. if(empty($codes)) return [];
  13. $code = array_column($codes,'code');
  14. $code_type_map = array_column($codes,'device_type_id','code');
  15. }
  16. $return = [];
  17. foreach ($code as $value){
  18. $return[$value] = [];
  19. }
  20. $time = strtotime($min.' min',time());
  21. $time = $time * 1000;
  22. $result = SystemL::whereIn('device_no',$code)
  23. ->where('push_time','>=',$time)
  24. ->select('data_point_name','value','device_no')
  25. ->orderBy('id','desc')
  26. ->get()->toArray();
  27. if(! empty($result)){
  28. foreach ($result as $value){
  29. if(! empty($return[$value['device_no']])) continue;
  30. //只取每个设备最新的一条数据
  31. $return[$value['device_no']] = [
  32. 'data_point_name' => $value['data_point_name'],
  33. 'value' => $value['value']
  34. ];
  35. if(! empty($code_type_map[$value['device_no']])) $return[$value['device_no']]['device_type_id'] = $code_type_map[$value['device_no']];
  36. }
  37. }
  38. return $return;
  39. }
  40. //'gateway_id' => 键,'screen_id' => 值
  41. public static function getIsOnlineStatus($map = []){
  42. if(empty($map)) return [];
  43. //仓是否在线
  44. $result = $screen_id = $gateway = $tmp = [];
  45. foreach ($map as $value){
  46. $result[$value['screen_id']] = 0;
  47. // $gateway[] = $value['gateway_id'];
  48. // $tmp[$value['screen_id']] = $value['gateway_id'];
  49. $screen_id[] = $value['screen_id'];
  50. }
  51. ;
  52. //设备 和 仓的关系
  53. $return = ScreenDevice::from('screen_device as a')
  54. ->leftJoin('device as b','b.id','a.device_id')
  55. ->whereIn('a.screen_id',$screen_id)
  56. ->where('a.del_time',0)
  57. ->pluck('a.screen_id','b.code')
  58. ->toArray();
  59. // $device = Device::where('del_time',0)
  60. // ->whereIn('gateway_id',$gateway)
  61. // ->select('code','gateway_id')->get()->toArray();dump($tmp);die;
  62. // foreach ($device as $value){
  63. // foreach ($tmp as $k_screen_id => $v){
  64. // if($value['gateway_id'] == $v){
  65. // $return[$value['code']] = $k_screen_id;
  66. // }
  67. // }
  68. // }
  69. //获取最新设备的数据
  70. $data = self::getLastData(array_keys($return));
  71. foreach ($data as $key => $value){
  72. if(isset($return[$key])){
  73. $result[$return[$key]] = 1;
  74. }
  75. }
  76. return $result;
  77. }
  78. public static function getGpsStatus($screen_id){
  79. if(empty($screen_id)) return [];
  80. //仓 载运2/闲置1/停运0
  81. $result = [];
  82. foreach ($screen_id as $value){
  83. $result[$value] = 0;
  84. }
  85. $screen = ScreenDevice::from('screen_device as a')
  86. ->leftJoin('device as b','b.id','a.device_id')
  87. ->leftJoin('screen as c','c.id','a.screen_id')
  88. ->where('b.device_type_id',DeviceType::type_four)
  89. ->whereIn('a.screen_id',$screen_id)
  90. ->select('b.code','c.coordinate','a.screen_id')
  91. ->get()->toArray();
  92. if(empty($screen)) return $result;
  93. $screen_map = array_column($screen,null,'code');
  94. //获取最新设备的数据
  95. $data = self::getLastData(array_column($screen,'code'));
  96. foreach ($data as $key => $value){
  97. if(isset($screen_map[$key]) && ! empty($value)){
  98. $tmp = $screen_map[$key];
  99. $tmp_coordinate = $tmp['coordinate'];
  100. if(isset($result[$tmp['screen_id']]) && $tmp_coordinate){
  101. //计算偏差值
  102. try {
  103. $meter = self::calculateDistance($tmp_coordinate,$value['value']);
  104. if($meter > 200){
  105. $result[$tmp['screen_id']] = 2;
  106. }else{
  107. $result[$tmp['screen_id']] = 1;
  108. }
  109. }catch (\Exception $e){
  110. continue;
  111. }
  112. }
  113. }
  114. }
  115. return $result;
  116. }
  117. public static function calculateDistance($coordinate1, $coordinate2) {
  118. $earthRadius = 6371000; // 地球半径,单位为米
  119. list($lat1,$lon1) = explode(',',$coordinate1);
  120. list($lat2,$lon2) = explode(',',$coordinate2);
  121. $lat1Rad = deg2rad($lat1);
  122. $lon1Rad = deg2rad($lon1);
  123. $lat2Rad = deg2rad($lat2);
  124. $lon2Rad = deg2rad($lon2);
  125. $deltaLat = $lat2Rad - $lat1Rad;
  126. $deltaLon = $lon2Rad - $lon1Rad;
  127. $a = sin($deltaLat / 2) * sin($deltaLat / 2) +
  128. cos($lat1Rad) * cos($lat2Rad) *
  129. sin($deltaLon / 2) * sin($deltaLon / 2);
  130. $c = 2 * atan2(sqrt($a), sqrt(1 - $a));
  131. $distance = $earthRadius * $c;
  132. return $distance;
  133. }
  134. public static function getExceptionStatus($screen_id){
  135. if(empty($screen_id)) return [];
  136. //仓 正常1/异常0
  137. $result = [];
  138. foreach ($screen_id as $value){
  139. $result[$value] = 0;
  140. }
  141. $screen = ScreenDevice::from('screen_device as a')
  142. ->leftJoin('device as b','b.id','a.device_id')
  143. ->whereIn('b.device_type_id',[DeviceType::type_two, DeviceType::type_three])
  144. ->whereIn('a.screen_id',$screen_id)
  145. ->select('b.code','a.screen_id')
  146. ->get()->toArray();
  147. if(empty($screen)) return $result;
  148. $screen_map = array_column($screen,null,'code');
  149. //获取最新设备的数据
  150. $data = self::getLastData(array_column($screen,'code'));
  151. foreach ($data as $key => $value){
  152. if(isset($screen_map[$key]) && ! empty($value)){
  153. $tmp = $screen_map[$key];
  154. if(isset($result[$tmp['screen_id']]) && $value['value'] == 1){
  155. $result[$tmp['screen_id']] = 1;
  156. }
  157. }
  158. }
  159. return $result;
  160. }
  161. public static function getIsOnlineStatusGateWay($gateway){
  162. if(empty($gateway)) return [];
  163. //网关是否在线
  164. $result = [];
  165. foreach ($gateway as $value){
  166. $result[$value] = 0;
  167. }
  168. $device = Device::where('del_time',0)
  169. ->whereIn('gateway_id',$gateway)
  170. ->select('code','gateway_id')
  171. ->get()->toArray();
  172. $gateway_connect_device = [];
  173. foreach ($device as $value){
  174. $gateway_connect_device[$value['gateway_id']][] = $value['code'];
  175. }
  176. //获取最新设备的数据
  177. $data = self::getLastData(array_column($device,'code'));
  178. foreach ($gateway_connect_device as $gateway => $value){
  179. if(! empty($result[$gateway])) continue;
  180. foreach ($value as $code){
  181. if(! empty($data[$code])){
  182. $result[$gateway] = 1;
  183. }
  184. }
  185. }
  186. return $result;
  187. }
  188. }