onContextmenu(payload, port)"
+ >
{{ index }}
@@ -92,6 +266,12 @@ const getPortClassName = (port: NdmSwitchPortInfo) => {
{{ transformPortSpeed(port, 'in') }}
{{ transformPortSpeed(port, 'out') }}
{{ transformPortSpeed(port, 'total') }}
+
+ navigateToLowerDevice(port)">
+ {{ getLowerDeviceByPort(port)?.name || '-' }}
+
+ -
+
@@ -101,6 +281,19 @@ const getPortClassName = (port: NdmSwitchPortInfo) => {
+
+
+
+
(showContextmenu = false)"
+ />
diff --git a/src/components/device/device-card/ndm-security-box/security-box-current-diag.vue b/src/components/device/device-card/ndm-security-box/security-box-current-diag.vue
index a41d948..3766754 100644
--- a/src/components/device/device-card/ndm-security-box/security-box-current-diag.vue
+++ b/src/components/device/device-card/ndm-security-box/security-box-current-diag.vue
@@ -49,7 +49,7 @@ const circuits = computed(() => lastDiagInfo.value?.info?.at(0)?.circuits);
-
+
diff --git a/src/components/device/device-card/ndm-switch/switch-current-diag.vue b/src/components/device/device-card/ndm-switch/switch-current-diag.vue
index 868518f..33df00d 100644
--- a/src/components/device/device-card/ndm-switch/switch-current-diag.vue
+++ b/src/components/device/device-card/ndm-switch/switch-current-diag.vue
@@ -29,7 +29,7 @@ const ports = computed(() => lastDiagInfo.value?.info?.portInfoList);
-
+
diff --git a/src/composables/device/use-device-management.ts b/src/composables/device/use-device-management.ts
index 5969b7b..50b51b9 100644
--- a/src/composables/device/use-device-management.ts
+++ b/src/composables/device/use-device-management.ts
@@ -1,4 +1,4 @@
-import { deleteDeviceApi, exportDeviceApi, importDeviceApi, type ImportMsg, type NdmDevicePageQuery, type PageParams, type Station } from '@/apis';
+import { deleteDeviceApi, exportDeviceApi, importDeviceApi, type ImportMsg, type NdmDeviceLinkDescription, type NdmDevicePageQuery, type PageParams, type Station } from '@/apis';
import { useStationDevicesMutation } from '@/composables';
import { DEVICE_TYPE_NAMES, type DeviceType } from '@/enums';
import { useDeviceStore, useStationStore } from '@/stores';
@@ -6,6 +6,7 @@ import { downloadByData, parseErrorFeedback } from '@/utils';
import { useMutation } from '@tanstack/vue-query';
import { isCancel } from 'axios';
import dayjs from 'dayjs';
+import destr from 'destr';
import { storeToRefs } from 'pinia';
import { h, onBeforeUnmount } from 'vue';
@@ -152,6 +153,32 @@ export const useDeviceManagement = () => {
window.$loadingBar.start();
+ // 检查要删除的设备是否存在关联设备
+ const stationDevices = lineDevices.value[stationCode];
+ if (!!stationDevices) {
+ const classified = stationDevices[deviceType];
+ if (!!classified) {
+ const device = classified.find((device) => device.id === id);
+ if (!!device) {
+ const maybeLinkDescription = destr(device.linkDescription);
+ if (!!maybeLinkDescription && typeof maybeLinkDescription === 'object') {
+ const linkDescription = maybeLinkDescription as NdmDeviceLinkDescription;
+ // 只要有上游或下游设备,就不能删除
+ const { upstream } = linkDescription;
+ if (!!upstream && upstream.length > 0) {
+ throw new Error('该设备存在关联的上游设备,无法删除');
+ }
+ if ('downstream' in linkDescription) {
+ const { downstream } = linkDescription;
+ if (!!downstream && Object.keys(downstream).length > 0) {
+ throw new Error('该设备存在关联的下游设备,无法删除');
+ }
+ }
+ }
+ }
+ }
+ }
+
return await deleteDeviceApi(deviceType, id, { stationCode, signal });
},
onSuccess: (_, { stationCode, signal }) => {
diff --git a/src/constants/index.ts b/src/constants/index.ts
index f2a2009..e8a8a73 100644
--- a/src/constants/index.ts
+++ b/src/constants/index.ts
@@ -1,3 +1,4 @@
+export * from './injection';
export * from './java';
export * from './mutation';
export * from './query';
diff --git a/src/constants/injection.ts b/src/constants/injection.ts
new file mode 100644
index 0000000..4c639bf
--- /dev/null
+++ b/src/constants/injection.ts
@@ -0,0 +1,5 @@
+import type { UseDeviceTreeReturn } from '@/composables';
+import { createInjectionKey } from '@/utils';
+import { type Ref } from 'vue';
+
+export const SELECT_DEVICE_FN_INJECTION_KEY = createInjectionKey[>('select-device-fn');
diff --git a/src/pages/device-page.vue b/src/pages/device-page.vue
index d4051e0..0e54557 100644
--- a/src/pages/device-page.vue
+++ b/src/pages/device-page.vue
@@ -1,10 +1,12 @@
]