SystemlService.php 7.5 KB

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