From ee1365cd4c42d20b64309346bf3f9f7c351025f4 Mon Sep 17 00:00:00 2001 From: 15683799673 Date: Mon, 21 Jul 2025 03:38:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=A7=86=E9=A2=91=E7=9B=91?= =?UTF-8?q?=E6=8E=A7=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/package.json | 1 + .../api/{property => sis}/factory/index.ts | 12 +- .../api/{property => sis}/factory/model.d.ts | 0 apps/web-antd/src/api/sis/stream/index.ts | 13 + apps/web-antd/src/api/sis/stream/model.d.ts | 22 ++ .../src/views/sis/deviceManage/data.ts | 64 ++++- .../sis/deviceManage/deviceManage-modal.vue | 12 +- .../src/views/sis/elevatorInfo/data.ts | 3 - .../views/{property => sis}/factory/data.ts | 40 +-- .../factory/factory-modal.vue | 2 +- .../views/{property => sis}/factory/index.vue | 41 ++- .../src/views/sis/personLibImg/data.tsx | 2 +- .../src/views/sis/video/channel-tree.vue | 18 +- apps/web-antd/src/views/sis/video/data.ts | 4 + apps/web-antd/src/views/sis/video/index.vue | 270 +++++++++++++++++- apps/web-antd/vite.config.mts | 4 +- .../base/shared/src/constants/dict-enum.ts | 1 + 17 files changed, 403 insertions(+), 106 deletions(-) rename apps/web-antd/src/api/{property => sis}/factory/index.ts (70%) rename apps/web-antd/src/api/{property => sis}/factory/model.d.ts (100%) create mode 100644 apps/web-antd/src/api/sis/stream/index.ts create mode 100644 apps/web-antd/src/api/sis/stream/model.d.ts rename apps/web-antd/src/views/{property => sis}/factory/data.ts (65%) rename apps/web-antd/src/views/{property => sis}/factory/factory-modal.vue (96%) rename apps/web-antd/src/views/{property => sis}/factory/index.vue (89%) diff --git a/apps/web-antd/package.json b/apps/web-antd/package.json index 3d0ec1d3..0007c442 100644 --- a/apps/web-antd/package.json +++ b/apps/web-antd/package.json @@ -51,6 +51,7 @@ "echarts-gl": "^2.0.9", "jsencrypt": "^3.3.2", "lodash-es": "^4.17.21", + "mpegts.js": "^1.8.0", "pinia": "catalog:", "tinymce": "^7.3.0", "unplugin-vue-components": "^0.27.3", diff --git a/apps/web-antd/src/api/property/factory/index.ts b/apps/web-antd/src/api/sis/factory/index.ts similarity index 70% rename from apps/web-antd/src/api/property/factory/index.ts rename to apps/web-antd/src/api/sis/factory/index.ts index ae1f1a6e..456248bf 100644 --- a/apps/web-antd/src/api/property/factory/index.ts +++ b/apps/web-antd/src/api/sis/factory/index.ts @@ -12,7 +12,7 @@ import { requestClient } from '#/api/request'; * @returns 厂商管理列表 */ export function factoryList(params?: FactoryQuery) { - return requestClient.get>('/property/factory/list', { params }); + return requestClient.get>('/sis/factory/list', { params }); } /** @@ -21,7 +21,7 @@ export function factoryList(params?: FactoryQuery) { * @returns 厂商管理列表 */ export function factoryExport(params?: FactoryQuery) { - return commonExport('/property/factory/export', params ?? {}); + return commonExport('/sis/factory/export', params ?? {}); } /** @@ -30,7 +30,7 @@ export function factoryExport(params?: FactoryQuery) { * @returns 厂商管理详情 */ export function factoryInfo(id: ID) { - return requestClient.get(`/property/factory/${id}`); + return requestClient.get(`/sis/factory/${id}`); } /** @@ -39,7 +39,7 @@ export function factoryInfo(id: ID) { * @returns void */ export function factoryAdd(data: FactoryForm) { - return requestClient.postWithMsg('/property/factory', data); + return requestClient.postWithMsg('/sis/factory', data); } /** @@ -48,7 +48,7 @@ export function factoryAdd(data: FactoryForm) { * @returns void */ export function factoryUpdate(data: FactoryForm) { - return requestClient.putWithMsg('/property/factory', data); + return requestClient.putWithMsg('/sis/factory', data); } /** @@ -57,5 +57,5 @@ export function factoryUpdate(data: FactoryForm) { * @returns void */ export function factoryRemove(id: ID | IDS) { - return requestClient.deleteWithMsg(`/property/factory/${id}`); + return requestClient.deleteWithMsg(`/sis/factory/${id}`); } diff --git a/apps/web-antd/src/api/property/factory/model.d.ts b/apps/web-antd/src/api/sis/factory/model.d.ts similarity index 100% rename from apps/web-antd/src/api/property/factory/model.d.ts rename to apps/web-antd/src/api/sis/factory/model.d.ts diff --git a/apps/web-antd/src/api/sis/stream/index.ts b/apps/web-antd/src/api/sis/stream/index.ts new file mode 100644 index 00000000..0f07b406 --- /dev/null +++ b/apps/web-antd/src/api/sis/stream/index.ts @@ -0,0 +1,13 @@ +import type { AddStreamProxyResult } from './model'; +import { requestClient } from '#/api/request'; + +/** + * 添加拉流代理,如果成功会返回可播放的视频流地址 + * @param params + * @returns 人像信息列表 + */ +export function addStreamProxy(params?: any) { + return requestClient.post('sis/stream//realtime/add', { + params, + }); +} diff --git a/apps/web-antd/src/api/sis/stream/model.d.ts b/apps/web-antd/src/api/sis/stream/model.d.ts new file mode 100644 index 00000000..8993f651 --- /dev/null +++ b/apps/web-antd/src/api/sis/stream/model.d.ts @@ -0,0 +1,22 @@ +export interface AddStreamProxyResult { + key:string; + rtsp:string; + rtmp:string; + flv:string; + wsFlv:string; + mp4:string; + hls:string; +} + +export interface AddStreamProxyQuery { + videoIp:string; + videoPort:number; + factoryNo:string; + account:string; + pwd:string; + channelId:string; + startTime:string; + endTime:string; + stream:string; + +} diff --git a/apps/web-antd/src/views/sis/deviceManage/data.ts b/apps/web-antd/src/views/sis/deviceManage/data.ts index a4e1c13b..2e1928de 100644 --- a/apps/web-antd/src/views/sis/deviceManage/data.ts +++ b/apps/web-antd/src/views/sis/deviceManage/data.ts @@ -3,6 +3,10 @@ import type { VxeGridProps } from '#/adapter/vxe-table'; import { getPopupContainer } from '@vben/utils'; import { getDictOptions } from '#/utils/dict'; import { DictEnum } from '@vben/constants'; +import type { FactoryQuery } from '#/api/sis/factory/model'; +import { factoryList } from '#/api/sis/factory'; +import { deviceGroupList } from '#/api/sis/deviceGroup'; +import type { DeviceGroupQuery } from '#/api/sis/deviceGroup/model'; export const querySchema: FormSchemaGetter = () => [ { @@ -16,9 +20,13 @@ export const querySchema: FormSchemaGetter = () => [ label: '设备ip', }, { - component: 'Input', + component: 'Select', fieldName: 'deviceType', label: '设备类型', + componentProps: { + getPopupContainer, + options: getDictOptions(DictEnum.sis_ipc_device_type, true), + }, }, { fieldName: 'deviceStatus', @@ -40,12 +48,16 @@ export const columns: VxeGridProps['columns'] = [ field: 'deviceName', }, { - title: '厂商编号', - field: 'factoryNo', + title: '设备厂商', + field: 'factoryName', }, { title: '设备类型', - field: 'device_type', + field: 'deviceTypeName', + }, + { + title: '设备组', + field: 'groupName', }, { title: '设备ip', @@ -90,15 +102,53 @@ export const modalSchema: FormSchemaGetter = () => [ }, { label: '设备厂商', - fieldName: 'facrotyNo', - component: 'Input', + fieldName: 'factoryNo', + component: 'ApiSelect', rules: 'required', + componentProps: { + allowClear: true, + resultField: 'list', // 根据API返回结构调整 + labelField: 'factoryName', + valueField: 'factoryNo', + api: async () => { + const params: FactoryQuery = { + pageNum: 1, + pageSize: 500, + }; + const res = await factoryList(params); + return res.rows; + }, + }, }, { label: '设备类型', fieldName: 'deviceType', - component: 'Input', + component: 'Select', rules: 'required', + componentProps: { + getPopupContainer, + options: getDictOptions(DictEnum.sis_ipc_device_type, true), + }, + }, + { + label: '设备组', + fieldName: 'groupId', + component: 'ApiSelect', + rules: 'required', + componentProps: { + allowClear: true, + resultField: 'list', // 根据API返回结构调整 + labelField: 'name', + valueField: 'id', + api: async () => { + const params: DeviceGroupQuery = { + pageNum: 1, + pageSize: 500, + }; + const res = await deviceGroupList(params); + return res.rows; + }, + }, }, { label: '设备ip', diff --git a/apps/web-antd/src/views/sis/deviceManage/deviceManage-modal.vue b/apps/web-antd/src/views/sis/deviceManage/deviceManage-modal.vue index 762ae10d..526bcf29 100644 --- a/apps/web-antd/src/views/sis/deviceManage/deviceManage-modal.vue +++ b/apps/web-antd/src/views/sis/deviceManage/deviceManage-modal.vue @@ -6,10 +6,16 @@ import { $t } from '@vben/locales'; import { cloneDeep } from '@vben/utils'; import { useVbenForm } from '#/adapter/form'; -import { deviceManageAdd, deviceManageInfo, deviceManageUpdate } from '#/api/sis/deviceManage'; +import { + deviceManageAdd, + deviceManageInfo, + deviceManageUpdate, +} from '#/api/sis/deviceManage'; import { defaultFormValueGetter, useBeforeCloseDiff } from '#/utils/popup'; import { modalSchema } from './data'; +import { getDictOptions } from '#/utils/dict'; +import { DictEnum } from '@vben/constants'; const emit = defineEmits<{ reload: [] }>(); @@ -27,7 +33,7 @@ const [BasicForm, formApi] = useVbenForm({ // 通用配置项 会影响到所有表单项 componentProps: { class: 'w-full', - } + }, }, schema: modalSchema(), showDefaultActions: false, @@ -53,7 +59,6 @@ const [BasicModal, modalApi] = useVbenModal({ return null; } modalApi.modalLoading(true); - const { id } = modalApi.getData() as { id?: number | string }; isUpdate.value = !!id; @@ -98,4 +103,3 @@ async function handleClosed() { - diff --git a/apps/web-antd/src/views/sis/elevatorInfo/data.ts b/apps/web-antd/src/views/sis/elevatorInfo/data.ts index 4c416af8..e3c6c2b7 100644 --- a/apps/web-antd/src/views/sis/elevatorInfo/data.ts +++ b/apps/web-antd/src/views/sis/elevatorInfo/data.ts @@ -1,7 +1,5 @@ import type { FormSchemaGetter } from '#/adapter/form'; import type { VxeGridProps } from '#/adapter/vxe-table'; -import type { DeviceManageQuery } from '#/api/sis/deviceManage/model'; -import { deviceManageList } from '#/api/sis/deviceManage'; export const querySchema: FormSchemaGetter = () => [ { @@ -205,6 +203,5 @@ export const modalSchema: FormSchemaGetter = () => [ fieldName: 'elevatorControlDeviceId', defaultValue: undefined, label: '梯控摄像头', - }, ]; diff --git a/apps/web-antd/src/views/property/factory/data.ts b/apps/web-antd/src/views/sis/factory/data.ts similarity index 65% rename from apps/web-antd/src/views/property/factory/data.ts rename to apps/web-antd/src/views/sis/factory/data.ts index b32215af..7ccf02ff 100644 --- a/apps/web-antd/src/views/property/factory/data.ts +++ b/apps/web-antd/src/views/sis/factory/data.ts @@ -1,7 +1,6 @@ import type { FormSchemaGetter } from '#/adapter/form'; import type { VxeGridProps } from '#/adapter/vxe-table'; - export const querySchema: FormSchemaGetter = () => [ { component: 'Input', @@ -11,17 +10,7 @@ export const querySchema: FormSchemaGetter = () => [ { component: 'Input', fieldName: 'factoryName', - label: '设备厂商名称', - }, - { - component: 'Input', - fieldName: 'dataState', - label: '数据状态:1有效,0无效', - }, - { - component: 'Input', - fieldName: 'searchValue', - label: '搜索值', + label: '厂商名称', }, ]; @@ -29,30 +18,18 @@ export const querySchema: FormSchemaGetter = () => [ // export const columns: () => VxeGridProps['columns'] = () => [ export const columns: VxeGridProps['columns'] = [ { type: 'checkbox', width: 60 }, - { - title: '', - field: 'id', - }, { title: '厂商编码', field: 'factoryNo', }, { - title: '设备厂商名称', + title: '厂商名称', field: 'factoryName', }, { title: '备注', field: 'remark', }, - { - title: '数据状态:1有效,0无效', - field: 'dataState', - }, - { - title: '搜索值', - field: 'searchValue', - }, { field: 'action', fixed: 'right', @@ -79,7 +56,7 @@ export const modalSchema: FormSchemaGetter = () => [ rules: 'required', }, { - label: '设备厂商名称', + label: '厂商名称', fieldName: 'factoryName', component: 'Input', rules: 'required', @@ -89,15 +66,4 @@ export const modalSchema: FormSchemaGetter = () => [ fieldName: 'remark', component: 'Input', }, - { - label: '数据状态:1有效,0无效', - fieldName: 'dataState', - component: 'Input', - rules: 'required', - }, - { - label: '搜索值', - fieldName: 'searchValue', - component: 'Input', - }, ]; diff --git a/apps/web-antd/src/views/property/factory/factory-modal.vue b/apps/web-antd/src/views/sis/factory/factory-modal.vue similarity index 96% rename from apps/web-antd/src/views/property/factory/factory-modal.vue rename to apps/web-antd/src/views/sis/factory/factory-modal.vue index b02cd221..5fc8e9dc 100644 --- a/apps/web-antd/src/views/property/factory/factory-modal.vue +++ b/apps/web-antd/src/views/sis/factory/factory-modal.vue @@ -6,7 +6,7 @@ import { $t } from '@vben/locales'; import { cloneDeep } from '@vben/utils'; import { useVbenForm } from '#/adapter/form'; -import { factoryAdd, factoryInfo, factoryUpdate } from '#/api/property/factory'; +import { factoryAdd, factoryInfo, factoryUpdate } from '#/api/sis/factory'; import { defaultFormValueGetter, useBeforeCloseDiff } from '#/utils/popup'; import { modalSchema } from './data'; diff --git a/apps/web-antd/src/views/property/factory/index.vue b/apps/web-antd/src/views/sis/factory/index.vue similarity index 89% rename from apps/web-antd/src/views/property/factory/index.vue rename to apps/web-antd/src/views/sis/factory/index.vue index fe786028..31e0b201 100644 --- a/apps/web-antd/src/views/property/factory/index.vue +++ b/apps/web-antd/src/views/sis/factory/index.vue @@ -1,25 +1,16 @@ @@ -138,9 +134,10 @@ function handleDownloadExcel() { + type="primary" + v-access:code="['property:factory:remove']" + @click="handleMultiDelete" + > {{ $t('pages.common.delete') }} -import type { PropType } from 'vue'; import { onMounted, ref } from 'vue'; import { SyncOutlined } from '@ant-design/icons-vue'; import { InputSearch, Skeleton, Tree } from 'ant-design-vue'; @@ -11,21 +10,15 @@ defineOptions({ inheritAttrs: false }); withDefaults(defineProps<{ showSearch?: boolean }>(), { showSearch: true }); const emit = defineEmits<{ - /** - * 点击刷新按钮的事件 - */ - reload: []; + + checked: []; /** * 点击节点的事件 */ + reload: []; select: []; }>(); -const channelId = defineModel('channelId', { - required: true, - type: Array as PropType, -}); - const searchValue = defineModel('searchValue', { type: String, default: '', @@ -39,7 +32,6 @@ const showTreeSkeleton = ref(true); async function loadChannelTree() { showTreeSkeleton.value = true; searchValue.value = ''; - channelId.value = []; const ret = await treeList(); channelTree.value = ret; showTreeSkeleton.value = false; @@ -85,14 +77,14 @@ onMounted(loadChannelTree); - + diff --git a/apps/web-antd/vite.config.mts b/apps/web-antd/vite.config.mts index 27bdfd9e..dcbd4d1b 100644 --- a/apps/web-antd/vite.config.mts +++ b/apps/web-antd/vite.config.mts @@ -28,8 +28,8 @@ export default defineConfig(async () => { rewrite: (path) => path.replace(/^\/api/, ''), // mock代理目标地址 // target: 'http://192.168.43.169:8080', - target: 'https://by.missmoc.top/api/', - // target: 'http://192.168.0.108:8080', + // target: 'https://by.missmoc.top/api/', + target: 'http://192.168.0.108:8080', // target: 'http://192.168.0.106:8080', // target: 'http://47.109.37.87:3010', ws: true, diff --git a/packages/@core/base/shared/src/constants/dict-enum.ts b/packages/@core/base/shared/src/constants/dict-enum.ts index 08e1b2ac..457f45ec 100644 --- a/packages/@core/base/shared/src/constants/dict-enum.ts +++ b/packages/@core/base/shared/src/constants/dict-enum.ts @@ -21,6 +21,7 @@ export const DictEnum = { wy_fjzt: 'wy_fjzt', // 房间状态 wy_direction_towards: 'direction_towards', // 房间朝向 sis_device_status: 'sis_device_status', //设备在线状态 + sis_ipc_device_type: 'sis_ipc_device_type', //设备在线状态 wy_sf:'wy_sf',//是否可售 SIS_ACCESS_CONTROL_DEVICE_TYPE: 'sis_access_control_device_type', SIS_LIB_TYPE: 'sis_lib_type',