Commit 6a97b1d3630ce58dc18c03d1b0d82639e7c111e9

Authored by 张 峰林
Committed by xp.Huang
1 parent 0fc2341a

perf: 流媒体配置新增萤石平台

@@ -24,6 +24,9 @@ export enum DictEnum { @@ -24,6 +24,9 @@ export enum DictEnum {
24 // 实体类型 规则节点 Filter originator types switch 24 // 实体类型 规则节点 Filter originator types switch
25 ORIGINATOR_TYPES = 'originator_types', 25 ORIGINATOR_TYPES = 'originator_types',
26 26
  27 + // 流媒体平台
  28 + STREAMING_MEDIA_TYPE = 'streaming_media_type',
  29 +
27 // 产品品类领域 30 // 产品品类领域
28 CATEGORY_FIELD = 'category_field', 31 CATEGORY_FIELD = 'category_field',
29 } 32 }
@@ -12,7 +12,16 @@ @@ -12,7 +12,16 @@
12 <a-select 12 <a-select
13 placeholder="请选择流媒体配置" 13 placeholder="请选择流媒体配置"
14 v-model:value="model[field]" 14 v-model:value="model[field]"
15 - :options="streamConfigOptions.map((item) => ({ value: item.value, label: item.label }))" 15 + :options="
  16 + streamConfigOptions
  17 + .filter((item) => item.type === model.videoType)
  18 + .map((item) => ({
  19 + value: item.value,
  20 + label: item.label,
  21 + type: item.type,
  22 + }))
  23 + "
  24 + @change="handleChange"
16 > 25 >
17 <template #dropdownRender="{ menuNode: menu }"> 26 <template #dropdownRender="{ menuNode: menu }">
18 <v-nodes :vnodes="menu" /> 27 <v-nodes :vnodes="menu" />
@@ -70,6 +79,7 @@ @@ -70,6 +79,7 @@
70 return { 79 return {
71 label: m.host, 80 label: m.host,
72 value: m.id, 81 value: m.id,
  82 + type: m.type,
73 }; 83 };
74 }); 84 });
75 }); 85 });
@@ -103,7 +113,7 @@ @@ -103,7 +113,7 @@
103 }); 113 });
104 } 114 }
105 const { ...params } = data.record; 115 const { ...params } = data.record;
106 - await setFieldsValue({ ...params }); 116 + await setFieldsValue({ ...params, videoType: params.videoPlatformDTO?.type });
107 } else { 117 } else {
108 editId.value = ''; 118 editId.value = '';
109 } 119 }
@@ -139,6 +149,11 @@ @@ -139,6 +149,11 @@
139 } 149 }
140 } 150 }
141 151
  152 + const handleChange = (e, options) => {
  153 + //流媒体配置
  154 + setFieldsValue({ videoType: e ? options.type : null });
  155 + };
  156 +
142 return { 157 return {
143 getTitle, 158 getTitle,
144 registerDrawer, 159 registerDrawer,
@@ -149,6 +164,7 @@ @@ -149,6 +164,7 @@
149 registerSteramingDrawer, 164 registerSteramingDrawer,
150 handleOpenStreamConfig, 165 handleOpenStreamConfig,
151 handleSuccess, 166 handleSuccess,
  167 + handleChange,
152 }; 168 };
153 }, 169 },
154 }); 170 });
  1 +<script lang="ts" setup>
  2 + import { BasicHelp } from '/@/components/Basic';
  3 + import { createImgPreview } from '/@/components/Preview/index';
  4 + import snStep4 from '/@/assets/images/sn-step4.png';
  5 + const imgList: string[] = [snStep4];
  6 + function handlePreview() {
  7 + createImgPreview({ imageList: imgList, defaultWidth: 1000 });
  8 + }
  9 +</script>
  10 +
  11 +<template>
  12 + <div>监控点编号</div>
  13 + <BasicHelp
  14 + placement="top"
  15 + @click="handlePreview"
  16 + class="mx-1"
  17 + text='点击查看如何获取"监控点编号"'
  18 + />
  19 +</template>
@@ -4,10 +4,13 @@ import { FormSchema as QFormSchema, useComponentRegister } from '/@/components/F @@ -4,10 +4,13 @@ import { FormSchema as QFormSchema, useComponentRegister } from '/@/components/F
4 import { CameraVideoUrl, CameraMaxLength } from '/@/utils/rules'; 4 import { CameraVideoUrl, CameraMaxLength } from '/@/utils/rules';
5 import { h } from 'vue'; 5 import { h } from 'vue';
6 import SnHelpMessage from './SnHelpMessage.vue'; 6 import SnHelpMessage from './SnHelpMessage.vue';
  7 +import SnHelpMessage1 from './SnHelpMessage1.vue';
7 import { OrgTreeSelect } from '../../common/OrgTreeSelect'; 8 import { OrgTreeSelect } from '../../common/OrgTreeSelect';
8 import { FileItem } from '/@/components/Form/src/components/ApiUpload.vue'; 9 import { FileItem } from '/@/components/Form/src/components/ApiUpload.vue';
9 import { createImgPreview } from '/@/components/Preview'; 10 import { createImgPreview } from '/@/components/Preview';
10 import { uploadThumbnail } from '/@/api/configuration/center/configurationCenter'; 11 import { uploadThumbnail } from '/@/api/configuration/center/configurationCenter';
  12 +import { findDictItemByCode } from '/@/api/system/dict';
  13 +import { DictEnum } from '/@/enums/dictEnum';
11 14
12 useComponentRegister('OrgTreeSelect', OrgTreeSelect); 15 useComponentRegister('OrgTreeSelect', OrgTreeSelect);
13 16
@@ -100,6 +103,11 @@ export const searchFormSchema: FormSchema[] = [ @@ -100,6 +103,11 @@ export const searchFormSchema: FormSchema[] = [
100 }, 103 },
101 ]; 104 ];
102 105
  106 +const videTypeNum = {
  107 + SCI: 0,
  108 + FLUORITE: 1,
  109 +};
  110 +
103 // 弹框配置项 111 // 弹框配置项
104 export const formSchema: QFormSchema[] = [ 112 export const formSchema: QFormSchema[] = [
105 { 113 {
@@ -215,7 +223,25 @@ export const formSchema: QFormSchema[] = [ @@ -215,7 +223,25 @@ export const formSchema: QFormSchema[] = [
215 }, 223 },
216 rules: [{ required: true, message: '视频流是必填项' }, ...CameraVideoUrl], 224 rules: [{ required: true, message: '视频流是必填项' }, ...CameraVideoUrl],
217 }, 225 },
218 - 226 + {
  227 + field: 'videoType',
  228 + label: '流媒体平台',
  229 + component: 'ApiRadioGroup',
  230 + required: true,
  231 + defaultValue: videTypeNum.SCI,
  232 + ifShow: ({ values }) => values.accessMode === AccessMode.Streaming,
  233 + componentProps: {
  234 + api: async (params) => {
  235 + const values = await findDictItemByCode(params);
  236 + return values.map((item) => ({ label: item.itemText, value: Number(item.itemValue) }));
  237 + },
  238 + params: {
  239 + dictCode: DictEnum.STREAMING_MEDIA_TYPE,
  240 + },
  241 + getPopupContainer: () => document.body,
  242 + placeholder: `请选择平台类型`,
  243 + },
  244 + },
219 { 245 {
220 field: 'videoPlatformId', 246 field: 'videoPlatformId',
221 label: '流媒体配置', 247 label: '流媒体配置',
@@ -234,7 +260,9 @@ export const formSchema: QFormSchema[] = [ @@ -234,7 +260,9 @@ export const formSchema: QFormSchema[] = [
234 component: 'RadioGroup', 260 component: 'RadioGroup',
235 defaultValue: StreamType.MASTER, 261 defaultValue: StreamType.MASTER,
236 ifShow({ values }) { 262 ifShow({ values }) {
237 - return values.accessMode === AccessMode.Streaming; 263 + return (
  264 + values.accessMode === AccessMode.Streaming && values.videoType !== videTypeNum.FLUORITE
  265 + );
238 }, 266 },
239 componentProps: { 267 componentProps: {
240 placeholder: '请选择码流', 268 placeholder: '请选择码流',
@@ -252,7 +280,9 @@ export const formSchema: QFormSchema[] = [ @@ -252,7 +280,9 @@ export const formSchema: QFormSchema[] = [
252 component: 'RadioGroup', 280 component: 'RadioGroup',
253 defaultValue: PlayProtocol.HTTP, 281 defaultValue: PlayProtocol.HTTP,
254 ifShow({ values }) { 282 ifShow({ values }) {
255 - return values.accessMode === AccessMode.Streaming; 283 + return (
  284 + values.accessMode === AccessMode.Streaming && values.videoType !== videTypeNum.FLUORITE
  285 + );
256 }, 286 },
257 helpMessage: ['平台使用https的hls协议,需联系海康开放平台专家支持。'], 287 helpMessage: ['平台使用https的hls协议,需联系海康开放平台专家支持。'],
258 componentProps: { 288 componentProps: {
@@ -270,7 +300,23 @@ export const formSchema: QFormSchema[] = [ @@ -270,7 +300,23 @@ export const formSchema: QFormSchema[] = [
270 component: 'Input', 300 component: 'Input',
271 rules: [...CameraVideoUrl, { required: true, message: '摄像头编号是必填项' }], 301 rules: [...CameraVideoUrl, { required: true, message: '摄像头编号是必填项' }],
272 ifShow({ values }) { 302 ifShow({ values }) {
273 - return values.accessMode === AccessMode.Streaming; 303 + return (
  304 + values.accessMode === AccessMode.Streaming && values.videoType !== videTypeNum.FLUORITE
  305 + );
  306 + },
  307 + componentProps: {
  308 + placeholder: '请输入监控点编号',
  309 + },
  310 + },
  311 + {
  312 + field: 'sn',
  313 + label: h(SnHelpMessage1) as any,
  314 + component: 'Input',
  315 + rules: [...CameraVideoUrl, { required: true, message: '摄像头编号是必填项' }],
  316 + ifShow({ values }) {
  317 + return (
  318 + values.accessMode === AccessMode.Streaming && values.videoType === videTypeNum.FLUORITE
  319 + );
274 }, 320 },
275 componentProps: { 321 componentProps: {
276 placeholder: '请输入监控点编号', 322 placeholder: '请输入监控点编号',
1 import { PlayProtocol } from '../manage/config.data'; 1 import { PlayProtocol } from '../manage/config.data';
2 import type { StreamingMediaModel } from '/@/api/camera/model/cameraModel'; 2 import type { StreamingMediaModel } from '/@/api/camera/model/cameraModel';
  3 +import { findDictItemByCode } from '/@/api/system/dict';
  4 +import { DictEnum } from '/@/enums/dictEnum';
3 import { BasicColumn, FormSchema } from '/@/components/Table'; 5 import { BasicColumn, FormSchema } from '/@/components/Table';
4 6
5 export interface DrawerParams { 7 export interface DrawerParams {
@@ -9,6 +11,7 @@ export interface DrawerParams { @@ -9,6 +11,7 @@ export interface DrawerParams {
9 11
10 export const streamingMediaTypeMapping = { 12 export const streamingMediaTypeMapping = {
11 0: '海康ISC平台', 13 0: '海康ISC平台',
  14 + 1: '萤石平台',
12 }; 15 };
13 16
14 export const streamingMediaSSLMapping = { 17 export const streamingMediaSSLMapping = {
@@ -37,6 +40,9 @@ export const columnSchema: BasicColumn[] = [ @@ -37,6 +40,9 @@ export const columnSchema: BasicColumn[] = [
37 title: '用户Key', 40 title: '用户Key',
38 dataIndex: 'appKey', 41 dataIndex: 'appKey',
39 width: 80, 42 width: 80,
  43 + format(text) {
  44 + return formatSecret(text);
  45 + },
40 }, 46 },
41 { 47 {
42 title: '用户密钥', 48 title: '用户密钥',
@@ -69,21 +75,34 @@ export const formSchema: FormSchema[] = [ @@ -69,21 +75,34 @@ export const formSchema: FormSchema[] = [
69 }, 75 },
70 ]; 76 ];
71 77
  78 +const videTypeNum = {
  79 + ISC: 0,
  80 + Fluorite: 1,
  81 +};
  82 +
72 export const formDetailSchema: FormSchema[] = [ 83 export const formDetailSchema: FormSchema[] = [
73 { 84 {
74 label: '平台类型', 85 label: '平台类型',
75 field: 'type', 86 field: 'type',
76 - component: 'Select',  
77 - rules: [{ required: true, message: '平台类型为必填项', type: 'number' }], 87 + component: 'ApiSelect',
  88 + required: true,
78 componentProps: { 89 componentProps: {
79 - options: [{ label: '海康ISC平台', value: 0 }],  
80 - placeholder: '请输入选择平台类型', 90 + api: async (params) => {
  91 + const values = await findDictItemByCode(params);
  92 + return values.map((item) => ({ label: item.itemText, value: Number(item.itemValue) }));
  93 + },
  94 + params: {
  95 + dictCode: DictEnum.STREAMING_MEDIA_TYPE,
  96 + },
  97 + getPopupContainer: () => document.body,
  98 + placeholder: `请选择平台类型`,
81 }, 99 },
82 }, 100 },
83 { 101 {
84 label: '部署环境', 102 label: '部署环境',
85 field: 'ssl', 103 field: 'ssl',
86 component: 'RadioGroup', 104 component: 'RadioGroup',
  105 + ifShow: ({ model }) => model.type !== videTypeNum.Fluorite,
87 rules: [{ required: true, message: '流媒体部署环境为必填项', type: 'number' }], 106 rules: [{ required: true, message: '流媒体部署环境为必填项', type: 'number' }],
88 defaultValue: PlayProtocol.HTTP, 107 defaultValue: PlayProtocol.HTTP,
89 componentProps: { 108 componentProps: {
@@ -108,7 +127,7 @@ export const formDetailSchema: FormSchema[] = [ @@ -108,7 +127,7 @@ export const formDetailSchema: FormSchema[] = [
108 { 127 {
109 label: '用户Key', 128 label: '用户Key',
110 field: 'appKey', 129 field: 'appKey',
111 - component: 'Input', 130 + component: 'InputPassword',
112 rules: [{ required: true, message: '用户Key为必填项' }], 131 rules: [{ required: true, message: '用户Key为必填项' }],
113 componentProps: { 132 componentProps: {
114 maxLength: 36, 133 maxLength: 36,
@@ -118,7 +137,7 @@ export const formDetailSchema: FormSchema[] = [ @@ -118,7 +137,7 @@ export const formDetailSchema: FormSchema[] = [
118 { 137 {
119 label: '用户密钥', 138 label: '用户密钥',
120 field: 'appSecret', 139 field: 'appSecret',
121 - component: 'Input', 140 + component: 'InputPassword',
122 rules: [ 141 rules: [
123 { required: true, message: '用户密钥为必填项' }, 142 { required: true, message: '用户密钥为必填项' },
124 { required: true, min: 20, message: '用户密钥不能少于20位字符' }, 143 { required: true, min: 20, message: '用户密钥不能少于20位字符' },
1 <script lang="ts" setup> 1 <script lang="ts" setup>
2 import { BasicModal, useModalInner } from '/@/components/Modal'; 2 import { BasicModal, useModalInner } from '/@/components/Modal';
3 import { BasicForm, useForm } from '/@/components/Form'; 3 import { BasicForm, useForm } from '/@/components/Form';
4 - import { formSchema, PlatformType } from '../config/panelDetail'; 4 + import { formSchema } from '../config/panelDetail';
5 import { addDataBoard, updateDataBoard } from '/@/api/dataBoard'; 5 import { addDataBoard, updateDataBoard } from '/@/api/dataBoard';
6 import { AddDataBoardParams } from '/@/api/dataBoard/model'; 6 import { AddDataBoardParams } from '/@/api/dataBoard/model';
7 import { useMessage } from '/@/hooks/web/useMessage'; 7 import { useMessage } from '/@/hooks/web/useMessage';
@@ -34,9 +34,7 @@ @@ -34,9 +34,7 @@
34 if (!Reflect.get(value, 'accessCredentials')) { 34 if (!Reflect.get(value, 'accessCredentials')) {
35 Reflect.deleteProperty(value, 'accessCredentials'); 35 Reflect.deleteProperty(value, 'accessCredentials');
36 } 36 }
37 - if (value.platform === PlatformType.PC) {  
38 - Reflect.deleteProperty(value, 'phoneModel');  
39 - } 37 +
40 return value as any; 38 return value as any;
41 }; 39 };
42 40