filter($request->input()); $list = $query->simplePaginate(Paginator::resolvePerPage('per_page', 20, 50)); return $this->json(DeviceResource::collection($list)); } public function store(DeviceRequest $request) { $input = $request->input(); //如果不是监控设备,移除extends if ($input['type'] != DeviceType::Monitor->value) { unset($input['extends']); } Device::create(array_merge($input, [ 'created_by' => auth('api')->user()?->id ?? 0, 'updated_by' => auth('api')->user()?->id ?? 0, ])); return $this->success('添加成功'); } public function show(Device $device) { return $this->json(DeviceResource::make($device)); } public function update(Device $device, DeviceRequest $request) { $input = $request->input(); //如果不是监控设备,移除extends if ($input['type'] != DeviceType::Monitor->value) { $input['extends'] = null; } $device->update(array_merge($input, [ 'updated_by' => auth('api')->user()?->id ?? 0, ])); return $this->success('修改成功'); } public function destroy(Device $device) { $device->delete(); return $this->success('删除成功'); } public function types() { return $this->json(DeviceType::types()); } /** * 统计某个基地下所有设备状态数量 */ public function typeStatusNum(Request $request) { $baseId = $request->input('base_id'); $query = Device::where('agricultural_base_id', $baseId)->groupBy('type')->groupBy('status'); $list = $query->select(DB::raw('type, status, count(1) as num '))->get(); $resData = []; foreach ($list as $item) { $resData[$item->type->value][$item->status->value] = $item->num; } //初始化数据; $data = []; foreach (DeviceType::types() as $typeKey => $typeName) { foreach (DeviceStatus::status() as $statusKey => $statusName) { $data[$typeKey][$statusKey] = $resData[$typeKey][$statusKey] ?? 0; } } return $this->json($data); } /** * 设备数据 */ public function dataStatics(Request $request) { $deviceId = $request->input('device_id'); $deviceColumn = $request->input('device_column'); //指定字段 $device = Device::find($deviceId); $data = null; switch ($device->type) { case DeviceType::Monitor://监控设备 $data = DeviceResource::make($device); break; case DeviceType::Meteorological://气象设备 //当天最新一条 $log = MeteorologicalMonitoringLog::where('device_id', $deviceId)->orderBy('created_at', 'desc')->first(); $data = $log->toArray(); break; case DeviceType::Soil://土壤设备 //当天 $dataList = SoilMonitoringLog::where('device_id', $deviceId)->whereDate('monitored_at', now())->get()->keyBy('monitored_at')->toArray(); $data = []; for ($i = 0; $i < 24; $i++) { $_key = date('Y-m-d').' '.str_pad($i, 2, '0', STR_PAD_LEFT).':00:00'; $data[$_key] = null; if (isset($dataList[$_key])) { $data[$_key] = $dataList[$_key][$deviceColumn] ?? null; } } break; case DeviceType::WaterQuality://水质设备 //当天 $dataList = WaterQualityMonitoringLog::where('device_id', $deviceId)->whereDate('monitored_at', now())->get()->keyBy('monitored_at')->toArray(); $data = []; for ($i = 0; $i < 24; $i++) { $_key = date('Y-m-d').' '.str_pad($i, 2, '0', STR_PAD_LEFT).':00:00'; $data[$_key] = null; if (isset($dataList[$_key])) { $data[$_key] = $dataList[$_key][$deviceColumn] ?? null; } } break; } return $this->json([ 'list' => $data, ]); } /** * 获取指定基地指定设备类型的所有设备指定维度数据 */ public function baseDataStatics(Request $request) { $baseId = $request->input('base_id'); $deviceType = $request->input('device_type'); $deviceColumn = $request->input('device_column'); //指定字段 //先获取基地下该类型所有设备 $deviceData = Device::where([ 'agricultural_base_id' => $baseId, 'type' => $deviceType, ])->get(); $data = []; switch ($deviceType) { case DeviceType::Monitor->value://监控设备 $data = DeviceResource::collection($deviceData); break; case DeviceType::Soil->value: $dataList = SoilMonitoringLog::where('agricultural_base_id', $baseId)->whereDate('monitored_at', now())->get()->groupBy('device_id'); foreach ($deviceData as $device) { $_dataList = $dataList->get($device->id); $data[$device->monitoring_point] = []; if ($_dataList) { $_dataList = $_dataList->keyBy('monitored_at')->toArray(); } for ($i = 0; $i < 24; $i++) { $_key = date('Y-m-d').' '.str_pad($i, 2, '0', STR_PAD_LEFT).':00:00'; $data[$device->monitoring_point][$_key] = null; if (isset($_dataList[$_key])) { $data[$device->monitoring_point][$_key] = $_dataList[$_key][$deviceColumn] ?? null; } } } break; case DeviceType::WaterQuality->value: $dataList = WaterQualityMonitoringLog::where('agricultural_base_id', $baseId)->whereDate('monitored_at', now())->get()->groupBy('device_id'); foreach ($deviceData as $device) { $_dataList = $dataList->get($device->id); $data[$device->monitoring_point] = []; if ($_dataList) { $_dataList = $_dataList->keyBy('monitored_at')->toArray(); } for ($i = 0; $i < 24; $i++) { $_key = date('Y-m-d').' '.str_pad($i, 2, '0', STR_PAD_LEFT).':00:00'; $data[$device->monitoring_point][$_key] = null; if (isset($_dataList[$_key])) { $data[$device->monitoring_point][$_key] = $_dataList[$_key][$deviceColumn] ?? null; } } } break; } return $this->json($data); } }