cqpCow 1 anno fa
parent
commit
e17cd9b6f4

+ 12 - 0
app/Http/Controllers/Api/ScreenController.php

@@ -171,4 +171,16 @@ class ScreenController extends BaseController
         if(empty($ext)) return '';
         return response()->file($path.'.'.$ext);
     }
+
+    public function screenMessage(Request $request){
+        $service = new ScreenService();
+        $userData = $request->userData->toArray();
+        list($status,$data) = $service->screenMessage($request->all());
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
 }

+ 0 - 1
app/Service/GatewayService.php

@@ -66,7 +66,6 @@ class GatewayService extends Service
         if(! empty($data['title'])) $model->where('title', 'LIKE', '%'.$data['title'].'%');
         if(! empty($data['code'])) $model->where('code', 'LIKE', '%'.$data['code'].'%');
         if(! empty($data['ip'])) $model->where('ip', 'LIKE', '%'.$data['ip'].'%');
-        if(isset($data['is_online'])) $model->where('is_online', $data['is_online']);
 
         $list = $this->limit($model,'',$data);
         $list = $this->fillData($list);

+ 146 - 30
app/Service/ScreenService.php

@@ -432,40 +432,102 @@ class ScreenService extends Service
     public function screenGps($data){
         if(empty($data['screen_id'])) return [false,'请选择仓'];
 
-        //gps类
-        $gps = ScreenDevice::from('screen_device as a')
+        //返回的参数
+        $result = [
+            'province' => '',
+            'city' => '',
+            'district' => '',
+            'location' => '',
+            'temperature' => [],
+            'humidity' => []
+        ];
+
+        $device = ScreenDevice::from('screen_device as a')
             ->leftJoin('device as b','b.id','a.device_id')
-            ->where('b.device_type_id',4)
+            ->whereIn('b.device_type_id',[DeviceType::type_one,DeviceType::type_four])
             ->where('a.del_time',0)
             ->where('b.del_time',0)
-            ->select('b.code')
-            ->first();
-        if(empty($gps)) return [true,''];
-        $gps = $gps->toArray();
-
-        $sys_data = SystemL::where('device_no',$gps['code'])
-            ->orderBy('id','desc')
-            ->select('value')
-            ->first();
-        if(empty($sys_data)) return [true,''];
-        $location = $sys_data->value;//经纬度
-        $url = 'https://restapi.amap.com/v3/geocode/regeo?location='.$location.'&key='.SystemL::GaoDeMapKey;
-        try{
-            $return = $this->curlOpen($url);
-            $return = json_decode($return,true);
-            if(empty($return['status'])) return [false,'定位失败'];
-
-            $position = $return['regeocode']['addressComponent'] ?? [];
-            $result = [
-                'province' => $position['province'] ?? '',
-                'city' => $position['city'] ?? '',
-                'district' => $position['district'] ?? '',
-                'location' => $location
-            ];
-            return [true, $result];
-        }catch (\Exception $exception){
-            return [false,$exception->getMessage()];
+            ->where('a.screen_id',$data['screen_id'])
+            ->select('b.code','b.device_type_id')
+            ->get()->toArray();
+        $gps = $other = [];
+        foreach ($device as $value){
+            if($value['device_type_id'] == DeviceType::type_four){
+                $gps[] = $value['code'];
+            }else{
+                $other[] = $value['code'];
+            }
+        }
+
+        //gps定位
+        $return_gps = SystemlService::getLastData($gps);
+        if(! empty($return_gps)){
+            $first_position = "";
+            foreach ($return_gps as $value){
+                if(! empty ($first_postition)) continue;
+                $first_position = $value['value'];
+            }
+            $url = 'https://restapi.amap.com/v3/geocode/regeo?location='.$first_position.'&key='.SystemL::GaoDeMapKey;
+            try{
+                $return = $this->curlOpen($url);
+                $return = json_decode($return,true);
+                if(! empty($return['status'])){
+                    $position = $return['regeocode']['addressComponent'] ?? [];
+                    $result = [
+                        'province' => $position['province'] ?? '',
+                        'city' => $position['city'] ?? '',
+                        'district' => $position['district'] ?? '',
+                        'location' => $first_position
+                    ];
+                }
+            }catch (\Exception $exception){
+//                return [false,$exception->getMessage()];
+            }
         }
+
+        //温度湿度
+        $time = strtotime('-2 min',time());
+        $time = $time * 1000;
+        $model = SystemL::whereIn('device_no', $other)
+            ->select('value','time','device_no','data_point_name')
+            ->orderBy('id','asc');
+        $model->where('time','>=',$time);
+        $list = $model->get()->toArray();
+        $chart = $this->fillScreenChart($list);
+        $result['temperature'] = $chart['temperature'];
+        $result['humidity'] = $chart['humidity'];
+
+        return [true, $result];
+    }
+
+    public function fillScreenChart($data){
+        if(empty($data)) return ['temperature' => [], 'humidity'=> []];
+
+        $return1 = $return2 = [];
+        foreach ($data as $value){
+            if (strstr($value['data_point_name'],'温度')){
+                $return1[$value['device_no']][] = [
+                    'time' => date('Y-m-d H:i:s',$value['time'] / 1000),
+                    'value' => $value['value']
+                ];
+            }elseif (strstr($value['data_point_name'],'湿度')){
+                $return2[$value['device_no']][] = [
+                    'time' => date('Y-m-d H:i:s',$value['time'] / 1000),
+                    'value' => $value['value']
+                ];
+            }
+        }
+        $final1 = $final2 = [];
+        foreach ($return1 as $key => $value){
+            if(! empty($final1))  continue;
+            $final1 = $value;
+        }
+        foreach ($return2 as $key => $value){
+            if(empty($final2)) continue;
+            $final2 = $value;
+        }
+
+        return ['temperature' => $final1, 'humidity'=>$final2];
     }
 
     public function uploadScreenFile($file){
@@ -490,4 +552,58 @@ class ScreenService extends Service
 
         return [true, '/api/screen/'.$file_name];
     }
+
+    public function screenMessage($data){
+        $model = Screen::where('del_time',0)
+            ->select('id','code','title','img')
+            ->orderBy('id','asc');
+
+        $list = $model->get()->toArray();
+        $list = $this->fillScreenMessage($list);
+
+        return [200,$list];
+    }
+
+    public function fillScreenMessage($data){
+        if(empty($data)) return $data;
+
+        $screen_id = array_column($data,'id');
+        //设备
+        $result = 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)
+            ->select('a.screen_id','b.code','b.device_type_id','b.unit')
+            ->get()
+            ->toArray();
+        $map = $map2 = $map3 = [];
+        foreach ($result as $value){
+            $map[$value['screen_id']][] = $value['code'];
+            $map2[$value['code']] = $value['device_type_id'];
+            $map3[$value['code']] = $value['unit'];
+        }
+        $return = SystemlService::getLastData(array_column($result,'code'));
+
+        foreach ($data as $key => $value){
+            if(isset($map[$value['id']])){
+                foreach ($return as $code => $val){
+                    if(in_array($code,$map[$value['id']]) && isset($map2[$code])){
+                        if(empty($data[$key]['temperature']) && $map2[$code] == DeviceType::type_one && strstr($val['data_point_name'],'温度')){
+                            $data[$key]['temperature'] = $val['value'] . ($map3[$code] ?? '');
+                        }elseif(empty($data[$key]['humidity']) && $map2[$code] == DeviceType::type_one && strstr($val['data_point_name'],'湿度')){
+                            $data[$key]['humidity'] = $val['value']. ($map3[$code] ?? '');
+                        }elseif(empty($data[$key]['open']) && $map2[$code] == DeviceType::type_two){
+                            $data[$key]['open'] = $val['value'] ? '开' : '关';
+                        }elseif(empty($data[$key]['warning']) && $map2[$code] == DeviceType::type_three){
+                            $data[$key]['warning'] = $val['value'] ? '是' : '否';
+                        }elseif(empty($data[$key]['gps']) && $map2[$code] == DeviceType::type_four){
+                            $data[$key]['gps'] = $val['value'];
+                        }
+                    }
+                }
+            }
+        }
+
+        return $data;
+    }
 }

+ 2 - 8
app/Service/SystemlService.php

@@ -9,10 +9,10 @@ use App\Model\SystemL;
 
 class SystemlService extends Service
 {
-    public static function getLastData($code = []){
+    public static function getLastData($code = [], $min = -1){
         if(empty($code)) return [];
 
-        $time = strtotime('-1 min',time());
+        $time = strtotime($min.' min',time());
         $time = $time * 1000;
 
         $result = SystemL::whereIn('device_no',$code)
@@ -23,13 +23,7 @@ class SystemlService extends Service
 
         $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']] = [

+ 1 - 0
routes/api.php

@@ -80,6 +80,7 @@ Route::group(['middleware'=> ['checkLogin']],function ($route){
     $route->any('screenTrendChart', 'Api\ScreenController@screenTrendChart');//数据趋势图
     $route->any('screenHistoryList', 'Api\ScreenController@screenHistoryList');//历史数据
     $route->any('screenGps', 'Api\ScreenController@screenGps');//gps定位
+    $route->any('screenMessage', 'Api\ScreenController@screenMessage');//仓体信息
 
     //操作日志
     $route->any('systemRecordList', 'Api\SystemRecordController@orderList');