customer-device-info modify

This commit is contained in:
sayliraut
2025-03-31 15:15:12 +05:30
parent 16d1b9a8b1
commit 32a33dbd87
2 changed files with 231 additions and 136 deletions

View File

@@ -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;
}));
}
}

View File

@@ -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());
}
}
}