ScreenService.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. <?php
  2. namespace App\Service;
  3. use App\Model\Device;
  4. use App\Model\DeviceType;
  5. use App\Model\Screen;
  6. use App\Model\ScreenDevice;
  7. use App\Model\ScreenGateway;
  8. use App\Model\SystemL;
  9. use Illuminate\Support\Facades\DB;
  10. class ScreenService extends Service
  11. {
  12. public function edit($data){
  13. list($status,$msg) = $this->screenRule($data,false);
  14. if(!$status) return [$status,$msg];
  15. try{
  16. DB::beginTransaction();
  17. $model = Screen::where('id',$data['id'])->first();
  18. $model->code = $data['code'];
  19. $model->title = $data['title'];
  20. $model->area_id = $data['area_id'];
  21. $model->size = $data['size'];
  22. $model->type = $data['type'];
  23. $model->remark = $data['remark'];
  24. $model->address = $data['address'] ?? '';
  25. $model->coordinate = $data['coordinate'] ?? '';
  26. $model->save();
  27. ScreenGateway::where('screen_id',$data['id'])->update(['del_time' => time()]);
  28. if(isset($data['gateway_id'])){
  29. if(! is_array($data['gateway_id'])) $data['gateway_id'] = [$data['gateway_id']];
  30. $insert = [];
  31. foreach ($data['gateway_id'] as $val){
  32. $insert[] = [
  33. 'screen_id' => $model->id,
  34. 'gateway_id' => $val,
  35. 'crt_time' => time()
  36. ];
  37. }
  38. ScreenGateway::insert($insert);
  39. }
  40. DB::commit();
  41. }catch (\Exception $exception){
  42. DB::rollBack();
  43. return [false,$exception->getMessage()];
  44. }
  45. return [true,'保存成功!'];
  46. }
  47. public function add($data){
  48. list($status,$msg) = $this->screenRule($data);
  49. if(!$status) return [$status,$msg];
  50. try{
  51. DB::beginTransaction();
  52. $model = new Screen();
  53. $model->code = $data['code'];
  54. $model->title = $data['title'];
  55. $model->area_id = $data['area_id'];
  56. $model->size = $data['size'];
  57. $model->type = $data['type'];
  58. $model->remark = $data['remark'];
  59. $model->address = $data['address'] ?? '';
  60. $model->coordinate = $data['coordinate'] ?? '';
  61. $model->save();
  62. if(isset($data['gateway_id'])){
  63. if(! is_array($data['gateway_id'])) $data['gateway_id'] = [$data['gateway_id']];
  64. $insert = [];
  65. foreach ($data['gateway_id'] as $val){
  66. $insert[] = [
  67. 'screen_id' => $model->id,
  68. 'gateway_id' => $val,
  69. 'crt_time' => time()
  70. ];
  71. }
  72. ScreenGateway::insert($insert);
  73. }
  74. DB::commit();
  75. }catch (\Exception $exception){
  76. DB::rollBack();
  77. return [false,$exception->getMessage()];
  78. }
  79. return [true,'保存成功!'];
  80. }
  81. public function del($data){
  82. if($this->isEmpty($data,'id')) return [false,'ID必须!'];
  83. $bool = ScreenDevice::where('del_time',0)->where('screen_id',$data['id'])->exists();
  84. if($bool) return [false,'仓已绑定设备'];
  85. Screen::where('id',$data['id'])->update([
  86. 'del_time' => time()
  87. ]);
  88. return [true,'删除成功'];
  89. }
  90. public function orderList($data){
  91. $model = Screen::where('del_time',0)
  92. ->select('*')
  93. ->orderBy('id','desc');
  94. if(! empty($data['type'])) $model->where('type',$data['type']);
  95. if(! empty($data['area_id'])) $model->where('area_id', $data['area_id']);
  96. if(! empty($data['title'])) $model->where('title', 'LIKE', '%'.$data['title'].'%');
  97. if(! empty($data['code'])) $model->where('code', 'LIKE', '%'.$data['code'].'%');
  98. if(! empty($data['device_name'])) {
  99. $device = Device::where('title', 'LIKE', '%'.$data['title'].'%')
  100. ->where('del_time',0)
  101. ->select('id')->get()->toArray();
  102. $screen = ScreenDevice::whereIn('device_id',array_column($device,'id'))
  103. ->where('del_time',0)
  104. ->select('screen_id')->get()->toArray();
  105. $model->whereIn('id',array_column($screen,'screen_id'));
  106. }
  107. $list = $this->limit($model,'',$data);
  108. $list = $this->fillOrderList($list);
  109. return [200,$list];
  110. }
  111. public function fillOrderList($data){
  112. if(empty($data['data'])) return $data;
  113. $screen_id = array_column($data['data'],'id');
  114. $gateway_id = ScreenGateway::whereIn('screen_id',$screen_id)
  115. ->where('del_time',0)
  116. ->pluck('screen_id','gateway_id')
  117. ->toArray();
  118. //获取仓是否在线离线状态
  119. $online = SystemlService::getIsOnlineStatus($gateway_id);
  120. //获取Gps信号判断状态
  121. $gps = SystemlService::getGpsStatus($screen_id);
  122. //获取是否异常状态判断
  123. $exception = SystemlService::getExceptionStatus($screen_id);
  124. foreach ($data['data'] as $key => $value){
  125. $data['data'][$key]['gateway_id'] = $gateway_id[$value['id']] ?? 0;
  126. $tmp_online = $online[$value['id']] ?? 0;
  127. $tmp_coordinate = $gps[$value['id']] ?? 0;
  128. $tmp_exception = $exception[$value['id']] ?? 0;
  129. $data['data'][$key]['is_online'] = Screen::$online[$tmp_online] ?? '';
  130. $data['data'][$key]['coordinate'] = Screen::$gps[$tmp_coordinate] ?? '';
  131. $data['data'][$key]['is_exception'] = Screen::$exception[$tmp_exception] ?? '';
  132. }
  133. return $data;
  134. }
  135. public function screenRule($data,$is_add = true){
  136. if(empty($data['title'])) return [false,'名称不能为空!'];
  137. if(empty($data['code'])) return [false,'编码不能为空!'];
  138. if(empty($data['area_id'])) return [false,'区域不能为空'];
  139. if(empty($data['type'])) return [false,'仓类型不能为空'];
  140. if($is_add){
  141. $bool = Screen::whereRaw("(binary code = '{$data['code']}' OR title = '{$data['title']}')")
  142. ->where('del_time',0)
  143. ->exists();
  144. }else{
  145. if(empty($data['id'])) return [false,'id不能为空!'];
  146. $bool = Screen::whereRaw("(binary code = '{$data['code']}' OR title = '{$data['title']}')")
  147. ->where('id','<>',$data['id'])
  148. ->where('del_time',0)
  149. ->exists();
  150. }
  151. if($bool) return [false,'编码或名称不能重复'];
  152. return [true,$data];
  153. }
  154. public function screenDeviceList($data){
  155. if(empty($data['screen_id'])) return [false,'仓ID不能为空'];
  156. $model = ScreenDevice::from('screen_device as a')
  157. ->leftJoin('device as b','b.id','a.device_id')
  158. ->leftJoin('device_type as c','c.id','b.device_type_id')
  159. ->where('a.screen_id',$data['screen_id'])
  160. ->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');
  161. $list = $this->limit($model,'',$data);
  162. return [true, $list];
  163. }
  164. public function screenDevice($data){
  165. list($status,$msg) = $this->screenDeviceRule($data);
  166. if(! $status) return [false,$msg];
  167. $insert = [];
  168. foreach ($data['device_id'] as $val){
  169. $insert[] = [
  170. 'screen_id' => $data['screen_id'],
  171. 'device_id' => $val,
  172. 'crt_time' => time()
  173. ];
  174. }
  175. ScreenDevice::insert($insert);
  176. return [true,''];
  177. }
  178. public function screenDeviceRule($data){
  179. if(empty($data['screen_id'])) return [false,'请选择仓'];
  180. if(empty($data['device_id'])) return [false,'请选择设备'];
  181. $bool = ScreenDevice::where('del_time',0)
  182. ->where('screen_id','<>',$data['screen_id'])
  183. ->whereIn('device_id',$data['device_id'])
  184. ->exists();
  185. if($bool) return [false, '设备已经绑定其他仓!'];
  186. $one = ScreenGateway::where('del_time',0)->where('screen_id',$data['screen_id'])->first();
  187. $two = Device::where('del_time',0)->where('id',$data['device_id'])->first();
  188. if(empty($one)) return [false,'仓网关不存在!'];
  189. if(empty($two)) return [false,'设备网关不存在!'];
  190. if($one->gateway_id != $two->gateway_id) return [false,'设备网关与仓网关不一致!'];
  191. }
  192. public function screenRemoveDevice($data){
  193. if(empty($data['id'])) return [false,'请选择移除的数据'];
  194. ScreenDevice::where('id',$data['id'])->update(['del_time' => time()]);
  195. return [true,''];
  196. }
  197. public function screenDeviceDataRealTimeList($data){
  198. if(empty($data['screen_id'])) return [false,'请选择仓或台'];
  199. //获取仓或台的设备ID
  200. $device = ScreenDevice::where('del_time',0)
  201. ->where('screen_id',$data['screen_id'])
  202. ->select('device_id')
  203. ->get()->toArray();
  204. $device = array_column($device,'device_id');
  205. //设备的分组信息 按照设备类型
  206. $device = Device::whereIn('id',$device)
  207. ->select('code','device_type_id')
  208. ->get()->toArray();
  209. $map = $nodeOne = $nodeTwo = $nodeThree = [];
  210. foreach ($device as $value){
  211. if(in_array($value['device_type_id'],DeviceType::$node_one)){
  212. $nodeOne[] = $value['code'];
  213. }elseif(in_array($value['device_type_id'],DeviceType::$node_two)){
  214. $nodeTwo[] = $value['code'];
  215. }elseif(in_array($value['device_type_id'],DeviceType::$node_three)){
  216. $nodeThree[] = $value['code'];
  217. }
  218. $map[$value['code']] = $value['device_type_id'];
  219. }
  220. $posts_a = SystemL::whereIn('device_no', $nodeOne)
  221. ->select('data_point_name','value')
  222. ->orderBy('id','desc')
  223. ->limit(20)
  224. ->get()->toArray();
  225. $posts_b = SystemL::whereIn('device_no', $nodeTwo)
  226. ->select('data_point_name','value')
  227. ->orderBy('id','desc')
  228. ->limit(20)
  229. ->get()->toArray();
  230. $posts_c = SystemL::whereIn('device_no', $nodeThree)
  231. ->select('data_point_name','value')
  232. ->orderBy('id','desc')
  233. ->limit(20)
  234. ->get()->toArray();
  235. return [true,['node_one' => $posts_a,'node_two'=>$posts_b,'node_three'=>$posts_c]];
  236. }
  237. }