瀏覽代碼

Merge remote-tracking branch 'origin/main'

gogs 1 年之前
父節點
當前提交
d2e0adbac6

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

@@ -111,6 +111,18 @@ class ScreenController extends BaseController
         }
     }
 
+    public function screenTrendChart(Request $request){
+        $service = new ScreenService();
+        $userData = $request->userData->toArray();
+        list($status,$data) = $service->screenTrendChart($request->all());
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
     public function screenHistoryList(Request $request){
         $service = new ScreenService();
         $userData = $request->userData->toArray();
@@ -159,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);
+        }
+    }
 }

+ 4 - 0
app/Model/Gateway.php

@@ -10,5 +10,9 @@ class Gateway extends Model
     const CREATED_AT = 'crt_time';
     const UPDATED_AT = 'upd_time';
     protected $dateFormat = 'U';
+    public static $online = [
+        0 => '离线',
+        1 => '在线'
+    ];
 }
 

+ 11 - 0
app/Service/DeviceService.php

@@ -66,6 +66,7 @@ class DeviceService extends Service
         $model->size = $data['size'];
         $model->gateway_id = $data['gateway_id'] ?? 0;
         $model->device_type_id = $data['device_type_id'] ?? 0;
+        $model->unit = $data['unit'] ?? "";
         $model->save();
 
         return [true,'保存成功!'];
@@ -82,6 +83,7 @@ class DeviceService extends Service
         $model->size = $data['size'];
         $model->gateway_id = $data['gateway_id'] ?? 0;
         $model->device_type_id = $data['device_type_id'] ?? 0;
+        $model->unit = $data['unit'] ?? "";
         $model->save();
 
         return [true,'保存成功!'];
@@ -90,10 +92,19 @@ class DeviceService extends Service
     public function equipmentDel($data){
         if($this->isEmpty($data,'id')) return [false,'ID必须!'];
 
+        $bool = ScreenDevice::whereIn('del_time',0)
+            ->whereIn('device_id',$data['id'])
+            ->exists();
+        if($bool) return [false,'设备已经绑定仓!'];
+
         Device::whereIn('id',$data['id'])->update([
             'del_time' => time()
         ]);
 
+        ScreenDevice::whereIn('device_id',$data['id'])->update([
+            'del_time' => time()
+        ]);
+
         return [true,'删除成功'];
     }
 

+ 17 - 0
app/Service/GatewayService.php

@@ -4,6 +4,7 @@ namespace App\Service;
 
 use App\Model\Device;
 use App\Model\Gateway;
+use App\Model\Screen;
 use App\Model\ScreenGateway;
 
 class GatewayService extends Service
@@ -67,6 +68,7 @@ class GatewayService extends Service
         if(! empty($data['ip'])) $model->where('ip', 'LIKE', '%'.$data['ip'].'%');
 
         $list = $this->limit($model,'',$data);
+        $list = $this->fillData($list);
 
         return [true,$list];
     }
@@ -92,4 +94,19 @@ class GatewayService extends Service
 
         return [true,''];
     }
+
+    public function fillData($data){
+        if(empty($data['data'])) return $data;
+
+        //获取仓是否在线离线状态
+        $online = SystemlService::getIsOnlineStatusGateWay(array_column($data['data'],'id'));
+
+        foreach ($data['data'] as $key => $value){
+            $tmp_online = $online[$value['id']] ?? 0;
+            $data['data'][$key]['is_online'] = $tmp_online;
+            $data['data'][$key]['is_online_name'] = Gateway::$online[$tmp_online] ?? '';
+        }
+
+        return $data;
+    }
 }

+ 195 - 36
app/Service/ScreenService.php

@@ -108,7 +108,7 @@ class ScreenService extends Service
     public function orderList($data){
         $model = Screen::where('del_time',0)
             ->select('*')
-            ->orderBy('id','desc');
+            ->orderBy('id','asc');
 
         if(! empty($data['type'])) $model->where('type',$data['type']);
         if(! empty($data['area_id'])) $model->where('area_id', $data['area_id']);
@@ -134,18 +134,22 @@ class ScreenService extends Service
         if(empty($data['data'])) return $data;
 
         $screen_id = array_column($data['data'],'id');
-        $gateway_id = ScreenGateway::whereIn('screen_id',$screen_id)
+        $gateway = ScreenGateway::whereIn('screen_id',$screen_id)
             ->where('del_time',0)
-            ->pluck('screen_id','gateway_id')
+            ->select('screen_id','gateway_id')
+            ->get()
             ->toArray();
         //获取仓是否在线离线状态
-        $online = SystemlService::getIsOnlineStatus($gateway_id);
+        $online = SystemlService::getIsOnlineStatus($gateway);
         //获取Gps信号判断状态
         $gps = SystemlService::getGpsStatus($screen_id);
         //获取是否异常状态判断
         $exception = SystemlService::getExceptionStatus($screen_id);
 
-        $g_map = array_flip($gateway_id);
+        $g_map = [];
+        foreach ($gateway as $value){
+            $g_map[$value['screen_id']] = $value['gateway_id'];
+        }
         foreach ($data['data'] as $key => $value){
             $data['data'][$key]['gateway_id'] = $g_map[$value['id']] ?? 0;
             $tmp_online = $online[$value['id']] ?? 0;
@@ -192,7 +196,8 @@ class ScreenService extends Service
             ->leftJoin('device_type as c','c.id','b.device_type_id')
             ->where('a.screen_id',$data['screen_id'])
             ->where('a.del_time',0)
-            ->select('a.id','b.id as device_id','b.title','b.code','b.gateway_id','b.device_type_id','b.remark','c.title as device_type_name','b.size');
+            ->where('b.del_time',0)
+            ->select('a.id','b.id as device_id','b.title','b.code','b.gateway_id','b.device_type_id','b.remark','c.title as device_type_name','b.size','b.unit');
 
         if(! empty($data['gateway_id'])) $model->where('b.gateway_id',$data['gateway_id']);
         $list = $this->limit($model,'',$data);
@@ -337,6 +342,44 @@ class ScreenService extends Service
         return [true,['node_one' => $posts_a,'node_two'=>$posts_b,'node_three'=>$posts_c]];
     }
 
+    public function screenTrendChart($data){
+        if(empty($data['device_no'])) return [false,'请选择设备'];
+        if(count($data['device_no']) > 4) return [false,'一次最多选择4个设备'];
+        if(empty($data['time'][0]) || empty($data['time'][1])) return [false,'时间不能为空'];
+
+        $time = $this->changeDateToTimeStampAboutRange($data['time']);
+        $model = SystemL::whereIn('device_no', $data['device_no'])
+            ->select('value','time','device_no')
+            ->orderBy('id','asc');
+        $model->where('time','>=',$time[0] * 1000);
+        $model->where('time','<',$time[1] * 1000);
+        $list = $model->get()->toArray();
+        $list = $this->fillScreenTrendChart($list);
+
+        return [true,$list];
+    }
+
+    public function fillScreenTrendChart($data){
+        if(empty($data)) return $data;
+
+        $return = [];
+        foreach ($data as $value){
+            $return[$value['device_no']][] = [
+                'time' => date('Y-m-d H:i:s',$value['time'] / 1000),
+                'value' => $value['value']
+            ];
+        }
+        $final = [];
+        foreach ($return as $key => $value){
+            $final[] = [
+                'device_no' => $key,
+                'detail' => $value
+            ];
+        }
+
+        return $final;
+    }
+
     public function screenHistoryList($data){
         if(empty($data['screen_id'])) return [false,'请选择仓或台'];
         if(empty($data['device_type_id'])) return [false,'设备类型不能为空'];
@@ -389,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){
@@ -447,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;
+    }
 }

+ 58 - 21
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']] = [
@@ -47,24 +41,34 @@ class SystemlService extends Service
         if(empty($map)) return [];
 
         //仓是否在线
-        $result = [];
+        $result = $screen_id = $gateway = $tmp = [];
         foreach ($map as $value){
-            $result[$value] = 0;
+            $result[$value['screen_id']] = 0;
+//            $gateway[] = $value['gateway_id'];
+//            $tmp[$value['screen_id']] = $value['gateway_id'];
+            $screen_id[] = $value['screen_id'];
         }
-
+;
         //设备 和 仓的关系
-        $return = [];
-        $device = Device::where('del_time',0)
-            ->whereIn('gateway_id',array_keys($map))
-            ->select('code','gateway_id')->get()->toArray();
-        foreach ($device as $value){
-            if(isset($map[$value['gateway_id']])){
-                $return[$value['code']] = $map[$value['gateway_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_column($device,'code'));
+        $data = self::getLastData(array_keys($return));
         foreach ($data as $key => $value){
             if(isset($return[$key])){
                 $result[$return[$key]] = 1;
@@ -103,6 +107,7 @@ class SystemlService extends Service
                     //计算偏差值
                     try {
                         $meter = self::calculateDistance($tmp_coordinate,$value['value']);
+
                         if($meter > 200){
                             $result[$tmp['screen_id']] = 2;
                         }else{
@@ -172,4 +177,36 @@ class SystemlService extends Service
 
         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;
+    }
 }

+ 2 - 2
app/Service/ThirdService.php

@@ -23,7 +23,7 @@ class ThirdService extends Service
             $jwkey = [];
             foreach ($list as $k=>$v){
                 $value = 0;
-                $point_name = '';
+                $point_name = $point_name1 = '';
                 switch ($v['device_type_id']){
                     case 1:
                         $value = $this->cgq_rand();
@@ -64,7 +64,7 @@ class ThirdService extends Service
                     'slave_name' => '',
                 ];
                 $insert[] = $detail;
-                if(isset($point_name1)){
+                if(! empty($point_name1)){
                     $detail['data_point_id'] = $k.$k;
                     $detail['data_point_name'] = $point_name1;
                     $detail['value'] = 1;

+ 2 - 0
routes/api.php

@@ -77,8 +77,10 @@ Route::group(['middleware'=> ['checkLogin']],function ($route){
     $route->any('screenDevice', 'Api\ScreenController@screenDevice');//仓绑定设备
     $route->any('screenRemoveDevice', 'Api\ScreenController@screenRemoveDevice');//仓移除设备
     $route->any('screenDeviceDataRealTimeList', 'Api\ScreenController@screenDeviceDataRealTimeList');//仓设备实时数据列表
+    $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');