From fd7f1927ff96f61837e268610c2188db27430cfa Mon Sep 17 00:00:00 2001 From: yangsy Date: Thu, 25 Dec 2025 01:45:21 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=AE=BE=E5=A4=87=E5=85=B3=E8=81=94?= =?UTF-8?q?=E4=B8=8E=E8=A7=A3=E9=99=A4=E5=85=B3=E8=81=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 支持配置交换机端口的下游关联设备 - 支持配置安防箱电路的下游关联设备 - 支持解除关联 - 删除设备时校验是否存在上/下游设备 --- src/apis/domain/biz/index.ts | 1 + src/apis/domain/biz/link-description/index.ts | 10 + .../biz/link-description/link-description.ts | 5 + .../ndm-camera-link-description.ts | 3 + .../ndm-security-box-link-description.ts | 8 + .../ndm-switch-link-description.ts | 8 + src/apis/domain/biz/station/device.ts | 8 +- .../current-diag/device-header-card.vue | 123 ++++++--- .../components/current-diag/index.ts | 15 +- .../security-box-circuit-card.vue | 250 ++++++++++++++++-- .../security-box-circuit-link-modal.vue | 212 +++++++++++++++ .../current-diag/switch-port-card.vue | 203 +++++++++++++- .../current-diag/switch-port-link-modal.vue | 222 ++++++++++++++++ .../security-box-current-diag.vue | 2 +- .../ndm-switch/switch-current-diag.vue | 2 +- .../device/use-device-management.ts | 29 +- src/constants/index.ts | 1 + src/constants/injection.ts | 5 + src/pages/device-page.vue | 13 +- 19 files changed, 1055 insertions(+), 65 deletions(-) create mode 100644 src/apis/domain/biz/link-description/index.ts create mode 100644 src/apis/domain/biz/link-description/link-description.ts create mode 100644 src/apis/domain/biz/link-description/ndm-camera-link-description.ts create mode 100644 src/apis/domain/biz/link-description/ndm-security-box-link-description.ts create mode 100644 src/apis/domain/biz/link-description/ndm-switch-link-description.ts create mode 100644 src/components/device/device-card/components/current-diag/security-box-circuit-link-modal.vue create mode 100644 src/components/device/device-card/components/current-diag/switch-port-link-modal.vue create mode 100644 src/constants/injection.ts diff --git a/src/apis/domain/biz/index.ts b/src/apis/domain/biz/index.ts index 7952147..35291e5 100644 --- a/src/apis/domain/biz/index.ts +++ b/src/apis/domain/biz/index.ts @@ -1,2 +1,3 @@ export * from './diag'; +export * from './link-description'; export * from './station'; diff --git a/src/apis/domain/biz/link-description/index.ts b/src/apis/domain/biz/link-description/index.ts new file mode 100644 index 0000000..edbc03c --- /dev/null +++ b/src/apis/domain/biz/link-description/index.ts @@ -0,0 +1,10 @@ +import type { NdmCameraLinkDescription } from './ndm-camera-link-description'; +import type { NdmSecurityBoxLinkDescription } from './ndm-security-box-link-description'; +import type { NdmSwitchLinkDescription } from './ndm-switch-link-description'; + +export * from './link-description'; +export * from './ndm-camera-link-description'; +export * from './ndm-security-box-link-description'; +export * from './ndm-switch-link-description'; + +export type NdmDeviceLinkDescription = NdmCameraLinkDescription | NdmSecurityBoxLinkDescription | NdmSwitchLinkDescription; diff --git a/src/apis/domain/biz/link-description/link-description.ts b/src/apis/domain/biz/link-description/link-description.ts new file mode 100644 index 0000000..2c398dc --- /dev/null +++ b/src/apis/domain/biz/link-description/link-description.ts @@ -0,0 +1,5 @@ +import type { DeviceStoreIndex } from '@/apis'; + +export interface LinkDescription { + upstream?: DeviceStoreIndex[]; +} diff --git a/src/apis/domain/biz/link-description/ndm-camera-link-description.ts b/src/apis/domain/biz/link-description/ndm-camera-link-description.ts new file mode 100644 index 0000000..06c10d2 --- /dev/null +++ b/src/apis/domain/biz/link-description/ndm-camera-link-description.ts @@ -0,0 +1,3 @@ +import type { LinkDescription } from './link-description'; + +export interface NdmCameraLinkDescription extends LinkDescription {} diff --git a/src/apis/domain/biz/link-description/ndm-security-box-link-description.ts b/src/apis/domain/biz/link-description/ndm-security-box-link-description.ts new file mode 100644 index 0000000..b9584c9 --- /dev/null +++ b/src/apis/domain/biz/link-description/ndm-security-box-link-description.ts @@ -0,0 +1,8 @@ +import type { DeviceStoreIndex } from '@/apis'; +import type { LinkDescription } from './link-description'; + +export interface NdmSecurityBoxLinkDescription extends LinkDescription { + downstream?: { + [circuitIndex: number]: DeviceStoreIndex; + }; +} diff --git a/src/apis/domain/biz/link-description/ndm-switch-link-description.ts b/src/apis/domain/biz/link-description/ndm-switch-link-description.ts new file mode 100644 index 0000000..dec8d38 --- /dev/null +++ b/src/apis/domain/biz/link-description/ndm-switch-link-description.ts @@ -0,0 +1,8 @@ +import type { DeviceStoreIndex } from '@/apis'; +import type { LinkDescription } from './link-description'; + +export interface NdmSwitchLinkDescription extends LinkDescription { + downstream?: { + [portName: string]: DeviceStoreIndex; + }; +} diff --git a/src/apis/domain/biz/station/device.ts b/src/apis/domain/biz/station/device.ts index fe94cef..84d1c75 100644 --- a/src/apis/domain/biz/station/device.ts +++ b/src/apis/domain/biz/station/device.ts @@ -10,7 +10,13 @@ import type { NdmVideoServerResultVO, Station, } from '@/apis'; -import { DEVICE_TYPE_LITERALS } from '@/enums'; +import { DEVICE_TYPE_LITERALS, type DeviceType } from '@/enums'; + +export interface DeviceStoreIndex { + stationCode: Station['code']; + deviceType: DeviceType; + deviceDbId: string; +} export interface StationDevices { [DEVICE_TYPE_LITERALS.ndmAlarmHost]: NdmAlarmHostResultVO[]; diff --git a/src/components/device/device-card/components/current-diag/device-header-card.vue b/src/components/device/device-card/components/current-diag/device-header-card.vue index 6827120..28b7522 100644 --- a/src/components/device/device-card/components/current-diag/device-header-card.vue +++ b/src/components/device/device-card/components/current-diag/device-header-card.vue @@ -1,13 +1,16 @@ + + + + diff --git a/src/components/device/device-card/components/current-diag/switch-port-card.vue b/src/components/device/device-card/components/current-diag/switch-port-card.vue index 48476f3..7b8c0d2 100644 --- a/src/components/device/device-card/components/current-diag/switch-port-card.vue +++ b/src/components/device/device-card/components/current-diag/switch-port-card.vue @@ -1,16 +1,33 @@ + + + + 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 @@