peterguo 2 месяцев назад
Родитель
Сommit
7e1108e4ff

+ 23 - 1
app/Http/Controllers/API/ProjectController.php

@@ -54,6 +54,7 @@ use App\Services\Project\ProjectKanbanService;
 use App\Services\Project\ProjectGanttService;
 use App\Services\Project\ProjectTaskGroupViewService;
 use Carbon\Carbon;
+use Illuminate\Http\JsonResponse;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Cache;
@@ -728,8 +729,29 @@ class ProjectController extends Controller
         ]);
     }
 
-    public function fetchDeviceObjects(Request $request, string $siteId, string $deviceId){
+    /**
+     * 获取指定$siteId的$deviceId的数据
+     * @param Request $request
+     * @param string $siteId
+     * @param string $deviceId
+     * @return JsonResponse
+     */
+    public function fetchDeviceObjects(Request $request, string $siteId, string $deviceId): JsonResponse
+    {
         $data = (new ProjectBACnetService())->fetchDeviceObjects($siteId, $deviceId);
         return $this->success(['data' => $data], [],JSON_UNESCAPED_UNICODE | JSON_NUMERIC_CHECK);
     }
+
+    /**
+     * 获取指定$siteId的$dataKey的数据
+     * @param Request $request
+     * @param string $siteId
+     * @param string $dataKey
+     * @return JsonResponse
+     */
+    public function fetchObjectsValueMulti(Request $request, string $siteId, string $dataKey): JsonResponse
+    {
+        $data = (new ProjectBACnetService())->fetchObjectsValueMulti($siteId, $dataKey);
+        return $this->success(['data' => $data], [],JSON_UNESCAPED_UNICODE | JSON_NUMERIC_CHECK);
+    }
 }

+ 63 - 6
app/Services/Project/ProjectBACnetService.php

@@ -2,14 +2,11 @@
 namespace App\Services\Project;
 use GuzzleHttp\Client;
 use GuzzleHttp\Promise;
-use hisorange\BrowserDetect\Exceptions\Exception;
+use Illuminate\Support\Facades\Http;
 use Illuminate\Support\Facades\Log;
 
 class ProjectBACnetService {
     protected string $baseProxyUrl;
-    protected array $queryParams = [
-        'alt' => 'json'
-    ];
     protected string $username;
     protected string $password;
     protected array $siteDataMap = [];
@@ -22,7 +19,8 @@ class ProjectBACnetService {
         $this->siteDataMap = config('bacnet.site_data_map');
     }
 
-    private function getBasicAuth() {
+    private function getBasicAuth(): array
+    {
         return [
             'auth' => [
                 $this->username,
@@ -33,7 +31,7 @@ class ProjectBACnetService {
 
     public function fetchDeviceObjects($siteId, $deviceId): array
     {
-        $objectList = $this->siteDataMap[$siteId][$deviceId] ?? [];
+        $objectList = $this->siteDataMap[$siteId]['objects'][$deviceId] ?? [];
         if (empty($objectList)) {
             return [];
         }
@@ -66,4 +64,63 @@ class ProjectBACnetService {
 
         return $resData;
     }
+
+    public function fetchObjectsValueMulti($siteId, $dataKey): array
+    {
+        $targetData = $this->siteDataMap[$siteId][$dataKey] ?? [];
+        if (empty($targetData)) {
+            return [];
+        }
+        $responseData = [];
+        $data = [
+            '$base' => 'Object',
+            'lifetime' => [
+                '$base' => 'Unsigned',
+                'value' => 120,
+            ],
+            'values' => [
+                '$base' => 'List',
+            ],
+        ];
+        foreach ($targetData as $dataRef) {
+            $nameKey = "$dataRef/object-name";
+            $valueKey = "$dataRef/present-value";
+            $unitsKey = "$dataRef/units";
+            $data['values'][$nameKey] = [
+                '$base' => 'Any',
+                'via' => "/.bacnet/$siteId/$nameKey",
+            ];
+            $data['values'][$valueKey] = [
+                '$base' => 'Any',
+                'via' => "/.bacnet/$siteId/$valueKey",
+            ];
+            $data['values'][$unitsKey] = [
+                '$base' => 'Any',
+                'via' => "/.bacnet/$siteId/$unitsKey",
+            ];
+        }
+        $url = $this->baseProxyUrl."/.multi?alt=json";
+        $presentValueMap = $this->siteDataMap[$siteId]["{$dataKey}-present-value-map"] ?? [];
+        $response = Http::withBasicAuth($this->username, $this->password)->post($url, $data);
+
+        if ($response->successful()) {
+            $json = json_decode($response->body(), true);
+            foreach ($targetData as $dataRef) {
+                $nameKey = "$dataRef/object-name";
+                $valueKey = "$dataRef/present-value";
+                $unitsKey = "$dataRef/units";
+
+                $objectName = $json['values'][$nameKey]['value'] ?? '';
+                $presentValue = $json['values'][$valueKey]['value'] ?? '';
+                $units = $json['values'][$unitsKey]['value'] ?? '';
+
+                $responseData[] = [
+                    'displayName' => $objectName,
+                    'present-value' => $presentValueMap[$presentValue] ?? $presentValue,
+                    'units' => $units,
+                ];
+            }
+        }
+        return $responseData;
+    }
 }

+ 116 - 98
config/bacnet.php

@@ -10,106 +10,124 @@ return [
     'site_data_map' => [
         /*site*/
         'IFC' => [
-            /*our device number*/
-            'CH1' => [
-                /*bacnet object ref*/
-                '600/analog-value,6',
-                '600/analog-value,7',
-                '600/analog-value,8',
-                '600/analog-value,9',
-                '500/analog-value,1407',
-                '500/analog-value,1408',
+            'objects' => [
+                /*our device number*/
+                'CH1' => [
+                    /*bacnet object ref*/
+                    '600/analog-value,6',
+                    '600/analog-value,7',
+                    '600/analog-value,8',
+                    '600/analog-value,9',
+                    '500/analog-value,1407',
+                    '500/analog-value,1408',
+                ],
+                /*our device number*/
+                'CH2' => [
+                    /*bacnet object ref*/
+                    '600/analog-value,10',
+                    '600/analog-value,11',
+                    '600/analog-value,12',
+                    '600/analog-value,13',
+                    '500/analog-value,807',
+                    '500/analog-value,808',
+                ],
+                /*our device number*/
+                'CH3' => [
+                    /*bacnet object ref*/
+                    '600/analog-value,14',
+                    '600/analog-value,15',
+                    '600/analog-value,16',
+                    '600/analog-value,17',
+                    '500/analog-value,1707',
+                    '500/analog-value,1708',
+                ],
+                /*our device number*/
+                'CH4' => [
+                    /*bacnet object ref*/
+                    '600/analog-value,18',
+                    '600/analog-value,19',
+                    '600/analog-value,20',
+                    '600/analog-value,21',
+                    '500/analog-value,1507',
+                    '500/analog-value,1508',
+                ],
+                /*our device number*/
+                'CH5' => [
+                    /*bacnet object ref*/
+                    '600/analog-value,22',
+                    '600/analog-value,23',
+                    '600/analog-value,24',
+                    '600/analog-value,25',
+                    '500/analog-value,707',
+                    '500/analog-value,708',
+                ],
+                /*our device number*/
+                'CH6' => [
+                    /*bacnet object ref*/
+                    '600/analog-value,26',
+                    '600/analog-value,27',
+                    '600/analog-value,28',
+                    '600/analog-value,29',
+                    '500/analog-value,1107',
+                    '500/analog-value,1108',
+                ],
+                /*our device number*/
+                'CH7' => [
+                    /*bacnet object ref*/
+                    '600/analog-value,30',
+                    '600/analog-value,31',
+                    '600/analog-value,32',
+                    '600/analog-value,33',
+                    '500/analog-value,1207',
+                    '500/analog-value,1208',
+                ],
+                /*our device number*/
+                'CH8' => [
+                    /*bacnet object ref*/
+                    '600/analog-value,34',
+                    '600/analog-value,35',
+                    '600/analog-value,36',
+                    '600/analog-value,37',
+                    '500/analog-value,207',
+                    '500/analog-value,208',
+                ],
+                /*our device number*/
+                'CH9' => [
+                    /*bacnet object ref*/
+                    '600/analog-value,38',
+                    '600/analog-value,39',
+                    '600/analog-value,40',
+                    '600/analog-value,41',
+                    '500/analog-value,107',
+                    '500/analog-value,108',
+                ],
+                /*our device number*/
+                'CH10' => [
+                    /*bacnet object ref*/
+                    '600/analog-value,42',
+                    '600/analog-value,43',
+                    '600/analog-value,44',
+                    '600/analog-value,45',
+                    '500/analog-value,507',
+                    '500/analog-value,508',
+                ],
             ],
-            /*our device number*/
-            'CH2' => [
-                /*bacnet object ref*/
-                '600/analog-value,10',
-                '600/analog-value,11',
-                '600/analog-value,12',
-                '600/analog-value,13',
-                '500/analog-value,807',
-                '500/analog-value,808',
-            ],
-            /*our device number*/
-            'CH3' => [
-                /*bacnet object ref*/
-                '600/analog-value,14',
-                '600/analog-value,15',
-                '600/analog-value,16',
-                '600/analog-value,17',
-                '500/analog-value,1707',
-                '500/analog-value,1708',
-            ],
-            /*our device number*/
-            'CH4' => [
-                /*bacnet object ref*/
-                '600/analog-value,18',
-                '600/analog-value,19',
-                '600/analog-value,20',
-                '600/analog-value,21',
-                '500/analog-value,1507',
-                '500/analog-value,1508',
-            ],
-            /*our device number*/
-            'CH5' => [
-                /*bacnet object ref*/
-                '600/analog-value,22',
-                '600/analog-value,23',
-                '600/analog-value,24',
-                '600/analog-value,25',
-                '500/analog-value,707',
-                '500/analog-value,708',
-            ],
-            /*our device number*/
-            'CH6' => [
-                /*bacnet object ref*/
-                '600/analog-value,26',
-                '600/analog-value,27',
-                '600/analog-value,28',
-                '600/analog-value,29',
-                '500/analog-value,1107',
-                '500/analog-value,1108',
-            ],
-            /*our device number*/
-            'CH7' => [
-                /*bacnet object ref*/
-                '600/analog-value,30',
-                '600/analog-value,31',
-                '600/analog-value,32',
-                '600/analog-value,33',
-                '500/analog-value,1207',
-                '500/analog-value,1208',
-            ],
-            /*our device number*/
-            'CH8' => [
-                /*bacnet object ref*/
-                '600/analog-value,34',
-                '600/analog-value,35',
-                '600/analog-value,36',
-                '600/analog-value,37',
-                '500/analog-value,207',
-                '500/analog-value,208',
-            ],
-            /*our device number*/
-            'CH9' => [
-                /*bacnet object ref*/
-                '600/analog-value,38',
-                '600/analog-value,39',
-                '600/analog-value,40',
-                '600/analog-value,41',
-                '500/analog-value,107',
-                '500/analog-value,108',
-            ],
-            /*our device number*/
-            'CH10' => [
-                /*bacnet object ref*/
-                '600/analog-value,42',
-                '600/analog-value,43',
-                '600/analog-value,44',
-                '600/analog-value,45',
-                '500/analog-value,507',
-                '500/analog-value,508',
+            'objectsStatus' => [
+                '600/binary-value,1',
+                '600/binary-value,2',
+                '600/binary-value,3',
+                '600/binary-value,4',
+                '600/binary-value,5',
+                '600/binary-value,6',
+                '600/binary-value,7',
+                '600/binary-value,8',
+                '600/binary-value,9',
+                '600/binary-value,10',
             ],
+            'objectsStatus-present-value-map' => [
+                'inactive' => 'OFF',
+                'active' => 'ON',
+            ]
         ]
     ]
 ];

+ 2 - 0
routes/api.php

@@ -202,6 +202,8 @@ Route::middleware(['auth:sanctum','account.limit'])->group(function () {
             ->name("project.iot");
         Route::get("project-iot/{siteName}/{deviceNumber}", [API\ProjectController::class, "fetchDeviceObjects"])
             ->name("project.fetchDeviceObjects");
+        Route::get("project-iot/objects-values/{siteName}/{dataKey}", [API\ProjectController::class, "fetchObjectsValueMulti"])
+            ->name("project.fetchObjectsValueMulti");
 
 //        Route::get("project/{project}/not-link-asset-requirement", [API\ProjectController::class, "notLinkAssetRequirement"])
 //            ->name("project.not-link-asset-requirement"); //项目未关联的资产需求