customer-device-info modify
This commit is contained in:
@@ -7,6 +7,7 @@ use App\Models\Customer;
|
||||
use App\Models\User;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Services\CustomerInfoService;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Tymon\JWTAuth\Facades\JWTAuth;
|
||||
|
||||
@@ -23,8 +24,8 @@ class CustomerDeviceInfoController extends Controller
|
||||
|
||||
|
||||
|
||||
// public function customerDeviceInfo(Request $request)
|
||||
// {
|
||||
// public function customerDeviceInfo(Request $request)
|
||||
// {
|
||||
// try {
|
||||
// $tokenPayload = getTokenFromHeader($request);
|
||||
|
||||
@@ -94,166 +95,230 @@ class CustomerDeviceInfoController extends Controller
|
||||
// ], 500);
|
||||
// }
|
||||
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
|
||||
// public function customerDeviceInfo(Request $request)
|
||||
// {
|
||||
// try {
|
||||
// public function customerDeviceInfo(Request $request)
|
||||
// {
|
||||
// try {
|
||||
|
||||
|
||||
// $token = readHeaderToken();
|
||||
// $token = readHeaderToken();
|
||||
|
||||
// if (!$token) {
|
||||
// return response()->json([
|
||||
// 'success' => false,
|
||||
// 'error' => 'Authorization token required'
|
||||
// ], 401);
|
||||
// }
|
||||
// if (!$token) {
|
||||
// return response()->json([
|
||||
// 'success' => false,
|
||||
// 'error' => 'Authorization token required'
|
||||
// ], 401);
|
||||
// }
|
||||
|
||||
|
||||
// $user = User::with(['assets.devices:id,name,asset_id'])
|
||||
// ->find($token['sub']);
|
||||
// $user = User::with(['assets.devices:id,name,asset_id'])
|
||||
// ->find($token['sub']);
|
||||
|
||||
// if (!$user) {
|
||||
// return response()->json([
|
||||
// 'error' => 'user_not_found',
|
||||
// 'message' => 'User not found'
|
||||
// ], 404);
|
||||
// }
|
||||
// if (!$user) {
|
||||
// return response()->json([
|
||||
// 'error' => 'user_not_found',
|
||||
// 'message' => 'User not found'
|
||||
// ], 404);
|
||||
// }
|
||||
|
||||
// $devicesArray = $this->customerInfoService->getThingsBoardDevices($user->customer_id);
|
||||
// $devicesArray = $this->customerInfoService->getThingsBoardDevices($user->customer_id);
|
||||
|
||||
// if (isset($devicesArray['error'])) {
|
||||
// throw new \Exception($devicesArray['message'] ?? 'Failed to fetch devices');
|
||||
// }
|
||||
// if (isset($devicesArray['error'])) {
|
||||
// throw new \Exception($devicesArray['message'] ?? 'Failed to fetch devices');
|
||||
// }
|
||||
|
||||
// if (!is_array($devicesArray)) {
|
||||
// throw new \Exception("Invalid devices data format received from service");
|
||||
// }
|
||||
// if (!is_array($devicesArray)) {
|
||||
// throw new \Exception("Invalid devices data format received from service");
|
||||
// }
|
||||
|
||||
|
||||
// $userDeviceIds = $user->assets->flatMap->devices->pluck('id')->toArray();
|
||||
// $userDeviceIds = $user->assets->flatMap->devices->pluck('id')->toArray();
|
||||
|
||||
// $activeCount = collect($devicesArray)
|
||||
// ->whereIn('id.id', $userDeviceIds)
|
||||
// ->where('active', true)
|
||||
// ->count();
|
||||
// $activeCount = collect($devicesArray)
|
||||
// ->whereIn('id.id', $userDeviceIds)
|
||||
// ->where('active', true)
|
||||
// ->count();
|
||||
|
||||
// $deviceIdCount = count($userDeviceIds);
|
||||
// return response()->json([
|
||||
// 'data' => [
|
||||
// 'active_count' => $activeCount,
|
||||
// 'total_count' => $deviceIdCount,
|
||||
// ],
|
||||
// 'success' => true
|
||||
// ], 200);
|
||||
// $deviceIdCount = count($userDeviceIds);
|
||||
// return response()->json([
|
||||
// 'data' => [
|
||||
// 'active_count' => $activeCount,
|
||||
// 'total_count' => $deviceIdCount,
|
||||
// ],
|
||||
// 'success' => true
|
||||
// ], 200);
|
||||
|
||||
// } catch (\Exception $e) {
|
||||
// Log::error("Device info error: " . $e->getMessage());
|
||||
// $statusCode = ($e->getMessage() === "Invalid devices data format received from service") ? 503 : 500;
|
||||
// } catch (\Exception $e) {
|
||||
// Log::error("Device info error: " . $e->getMessage());
|
||||
// $statusCode = ($e->getMessage() === "Invalid devices data format received from service") ? 503 : 500;
|
||||
|
||||
// return response()->json([
|
||||
// 'error' => 'server_error',
|
||||
// 'message' => 'An error occurred',
|
||||
// 'details' => $e->getMessage()
|
||||
// ], $statusCode);
|
||||
// }
|
||||
// }
|
||||
// return response()->json([
|
||||
// 'error' => 'server_error',
|
||||
// 'message' => 'An error occurred',
|
||||
// 'details' => $e->getMessage()
|
||||
// ], $statusCode);
|
||||
// }
|
||||
// }
|
||||
|
||||
public function customerDeviceInfo(Request $request)
|
||||
{
|
||||
try {
|
||||
$token = readHeaderToken($request);
|
||||
if (!$token) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'error' => 'authorization_required',
|
||||
'message' => 'Authorization token required'
|
||||
], 401);
|
||||
}
|
||||
public function customerDeviceInfo(Request $request)
|
||||
{
|
||||
try {
|
||||
$token = readHeaderToken($request);
|
||||
if (!$token) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'error' => 'authorization_required',
|
||||
'message' => 'Authorization token required'
|
||||
], 401);
|
||||
}
|
||||
|
||||
// Get user with devices
|
||||
$user = User::with(['assets.devices:id,name,asset_id'])
|
||||
->find($token['sub']);
|
||||
// Get user with devices
|
||||
$user = User::with(['assets.devices:id,name,asset_id'])
|
||||
->find($token['sub']);
|
||||
|
||||
if (!$user) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'error' => 'user_not_found',
|
||||
'message' => 'User not found'
|
||||
], 404);
|
||||
}
|
||||
if (!$user) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'error' => 'user_not_found',
|
||||
'message' => 'User not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
// Get user's device IDs
|
||||
$userDeviceIds = $user->assets->flatMap->devices->pluck('id')->toArray();
|
||||
// Get user's device IDs
|
||||
$userDevices = $user->assets->flatMap->devices;
|
||||
$userDeviceIds = $userDevices->pluck('id')->toArray();
|
||||
|
||||
if (empty($userDeviceIds)) {
|
||||
return response()->json([
|
||||
'data' => [
|
||||
'active_count' => 0,
|
||||
'total_count' => 0,
|
||||
'alarms_count' => 0,
|
||||
'red_count' => 0,
|
||||
'yellow_count' => 0,
|
||||
'green_count' => 0
|
||||
],
|
||||
'success' => true
|
||||
], 200);
|
||||
}
|
||||
|
||||
// Get devices and alarms from service
|
||||
$serviceResponse = $this->customerInfoService->getCustomerDevicesAndAlarms(
|
||||
$user->customer_id,
|
||||
$userDeviceIds
|
||||
);
|
||||
|
||||
// Handle service errors
|
||||
if (isset($serviceResponse['error'])) {
|
||||
throw new \Exception($serviceResponse['message'] ?? 'Service request failed');
|
||||
}
|
||||
|
||||
// Process devices
|
||||
$devices = $serviceResponse['devices'] ?? [];
|
||||
$activeCount = collect($devices)
|
||||
->whereIn('id.id', $userDeviceIds)
|
||||
->where('active', true)
|
||||
->count();
|
||||
|
||||
// Process alarms
|
||||
$alarms = $serviceResponse['alarms'] ?? [];
|
||||
$recentAlarms = $this->filterRecentAlarms($alarms);
|
||||
|
||||
$bearerToken = $this->customerInfoService->getToken();
|
||||
$apiBaseUrl = env('THINGSBOARD_URL', 'http://65.0.131.117:8080');
|
||||
|
||||
|
||||
$redCount = 0;
|
||||
$yellowCount = 0;
|
||||
$greenCount = 0;
|
||||
|
||||
foreach ($userDevices as $device) {
|
||||
$telemetryResponse = Http::withHeaders([
|
||||
'accept' => 'application/json',
|
||||
'Authorization' => 'Bearer ' . $bearerToken,
|
||||
])->get("$apiBaseUrl/api/plugins/telemetry/DEVICE/{$device->id}/values/timeseries", [
|
||||
'useStrictDataTypes' => 'false'
|
||||
]);
|
||||
|
||||
if (!$telemetryResponse->successful()) {
|
||||
Log::error("Failed to fetch telemetry for Device ID: {$device->id}, Error: " . $telemetryResponse->body());
|
||||
continue;
|
||||
}
|
||||
|
||||
$telemetryData = $telemetryResponse->json();
|
||||
// Log::info("Telemetry data: " . json_encode($telemetryData));
|
||||
$engineName = $telemetryData['Engine_Name'][0]['value'] ?? null;
|
||||
|
||||
$mechanicalHealthValue1 = isset($telemetryData['MechanicalHealth_value'][0]['value'])
|
||||
? (float) $telemetryData['MechanicalHealth_value'][0]['value']
|
||||
: null;
|
||||
|
||||
$engineEfficiencyValue1 = isset($telemetryData['EngineEfficiency_value'][0]['value'])
|
||||
? (float) $telemetryData['EngineEfficiency_value'][0]['value']
|
||||
: null;
|
||||
|
||||
$engineEfficiencyValue4 = isset($telemetryData['EngineEfficiency_valueInHealth'][0]['value'])
|
||||
? (float) $telemetryData['EngineEfficiency_valueInHealth'][0]['value']
|
||||
: null;
|
||||
|
||||
$powerLossValue1 = isset($telemetryData['PowerLoss_value'][0]['value'])
|
||||
? (float) $telemetryData['PowerLoss_value'][0]['value']
|
||||
: null;
|
||||
|
||||
// Determine health status
|
||||
if ($engineName === "Torque") {
|
||||
$greenCount++;
|
||||
} elseif (
|
||||
($mechanicalHealthValue1 > 0 && $mechanicalHealthValue1 < 31) ||
|
||||
($engineEfficiencyValue1 > 0 && $engineEfficiencyValue1 < 31) ||
|
||||
($engineEfficiencyValue4 > 0 && $engineEfficiencyValue4 < 31) ||
|
||||
($powerLossValue1 > 0 && $powerLossValue1 < 31)
|
||||
) {
|
||||
$redCount++;
|
||||
} elseif (
|
||||
($mechanicalHealthValue1 >= 31 && $mechanicalHealthValue1 < 71) ||
|
||||
($engineEfficiencyValue1 >= 31 && $engineEfficiencyValue1 < 71) ||
|
||||
($engineEfficiencyValue4 >= 31 && $engineEfficiencyValue4 < 71) ||
|
||||
($powerLossValue1 >= 31 && $powerLossValue1 < 71)
|
||||
) {
|
||||
$yellowCount++;
|
||||
} else {
|
||||
$greenCount++;
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($userDeviceIds)) {
|
||||
return response()->json([
|
||||
'data' => [
|
||||
'active_count' => 0,
|
||||
'total_count' => 0,
|
||||
|
||||
'alarms_count' => 0
|
||||
'active_count' => $activeCount,
|
||||
'total_count' => count($userDeviceIds),
|
||||
'alarms_count' => count($recentAlarms),
|
||||
'red_count' => $redCount,
|
||||
'yellow_count' => $yellowCount,
|
||||
'green_count' => $greenCount,
|
||||
],
|
||||
'success' => true
|
||||
], 200);
|
||||
} catch (\Exception $e) {
|
||||
Log::error("Device info error: " . $e->getMessage());
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'error' => 'server_error',
|
||||
'message' => 'An error occurred while fetching device information',
|
||||
'details' => $e->getMessage()
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
// Get devices and alarms from service
|
||||
$serviceResponse = $this->customerInfoService->getCustomerDevicesAndAlarms(
|
||||
$user->customer_id,
|
||||
$userDeviceIds
|
||||
);
|
||||
|
||||
// Handle service errors
|
||||
if (isset($serviceResponse['error'])) {
|
||||
throw new \Exception($serviceResponse['message'] ?? 'Service request failed');
|
||||
}
|
||||
private function filterRecentAlarms(array $alarms): array
|
||||
{
|
||||
$twentyFourHoursAgo = (time() - 86400) * 1000;
|
||||
|
||||
// Process devices
|
||||
$devices = $serviceResponse['devices'] ?? [];
|
||||
$activeCount = collect($devices)
|
||||
->whereIn('id.id', $userDeviceIds)
|
||||
->where('active', true)
|
||||
->count();
|
||||
|
||||
// Process alarms
|
||||
$alarms = $serviceResponse['alarms'] ?? [];
|
||||
|
||||
$recentAlarms = $this->filterRecentAlarms($alarms);
|
||||
|
||||
return response()->json([
|
||||
'data' => [
|
||||
'active_count' => $activeCount,
|
||||
'total_count' => count($userDeviceIds),
|
||||
|
||||
'alarms_count' => count($recentAlarms),
|
||||
|
||||
],
|
||||
'success' => true
|
||||
], 200);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
Log::error("Device info error: " . $e->getMessage());
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'error' => 'server_error',
|
||||
'message' => 'An error occurred while fetching device information',
|
||||
'details' => $e->getMessage()
|
||||
], 500);
|
||||
return array_values(array_filter($alarms, function ($alarm) use ($twentyFourHoursAgo) {
|
||||
return ($alarm['createdTime'] ?? 0) >= $twentyFourHoursAgo;
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
private function filterRecentAlarms(array $alarms): array
|
||||
{
|
||||
$twentyFourHoursAgo = (time() - 86400) * 1000;
|
||||
|
||||
return array_values(array_filter($alarms, function($alarm) use ($twentyFourHoursAgo) {
|
||||
return ($alarm['createdTime'] ?? 0) >= $twentyFourHoursAgo;
|
||||
}));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -8,6 +8,8 @@ use Illuminate\Support\Facades\Log;
|
||||
use App\Services\AdminService;
|
||||
use Exception;
|
||||
use Illuminate\Support\Facades\Request;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
|
||||
|
||||
class CustomerInfoService
|
||||
{
|
||||
@@ -60,7 +62,7 @@ class CustomerInfoService
|
||||
|
||||
|
||||
|
||||
public function getTelemetryData($device, $keyNames, $startTs , $endTs )
|
||||
public function getTelemetryData($device, $keyNames, $startTs, $endTs)
|
||||
{
|
||||
$token = $this->adminService->getToken();
|
||||
|
||||
@@ -271,7 +273,6 @@ class CustomerInfoService
|
||||
}
|
||||
|
||||
return $result;
|
||||
|
||||
} catch (\Exception $e) {
|
||||
Log::error("ThingsBoard service error: " . $e->getMessage());
|
||||
return [
|
||||
@@ -304,7 +305,6 @@ class CustomerInfoService
|
||||
|
||||
$data = $response->json();
|
||||
return $data['data'] ?? [];
|
||||
|
||||
} catch (\Exception $e) {
|
||||
Log::error("Device fetch error: " . $e->getMessage());
|
||||
return [
|
||||
@@ -344,7 +344,6 @@ class CustomerInfoService
|
||||
}
|
||||
|
||||
return $response->json();
|
||||
|
||||
} catch (\Exception $e) {
|
||||
Log::error("Alarm fetch error: " . $e->getMessage());
|
||||
return [
|
||||
@@ -355,4 +354,35 @@ class CustomerInfoService
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public function getToken()
|
||||
{
|
||||
$baseUrl = env('THINGSBOARD_URL', 'http://65.0.131.117:8080');
|
||||
$username = env('THINGSBOARD_USERNAME', 'tenant1@thingsboard.org');
|
||||
$password = env('THINGSBOARD_PASSWORD', 'tenant1');
|
||||
|
||||
|
||||
if (Cache::has('thingsboard_token')) {
|
||||
return Cache::get('thingsboard_token');
|
||||
}
|
||||
|
||||
$response = Http::withHeaders([
|
||||
// 'accept' => 'application/json',
|
||||
'Content-Type' => 'application/json',
|
||||
])
|
||||
->post("{$baseUrl}/api/auth/login", [
|
||||
'username' => $username,
|
||||
'password' => $password,
|
||||
]);
|
||||
|
||||
|
||||
if ($response->successful()) {
|
||||
$token = $response->json('token');
|
||||
Cache::put('thingsboard_token', $token, now()->addMinutes(15));
|
||||
return $token;
|
||||
} else {
|
||||
Log::error("ThingsBoard Authentication Failed: " . $response->body());
|
||||
throw new Exception('Unable to authenticate with ThingsBoard: ' . $response->body());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user