import { useCallback, useEffect, useState } from 'react'; import { Button, Card, Col, Form, Image, Input, Radio, Row, Select, Tooltip } from 'antd'; import { useIntl, useLocation } from 'umi'; import { RadioCard, UploadImage } from '@/components'; import { PlusOutlined } from '@ant-design/icons'; import { service } from '../index'; import SaveProductModal from './SaveProduct'; import { getButtonPermission } from '@/utils/menu'; import { onlyMessage } from '@/utils/util'; import { PageContainer } from '@ant-design/pro-layout'; import styles from '../../Cascade/Save/index.less'; import { useDomFullHeight } from '@/hooks'; const DefaultAccessType = 'gb28181-2016'; const defaultImage = '/images/device-media.png'; const Save = () => { const location: any = useLocation(); const id = location?.query?.id; const intl = useIntl(); const [form] = Form.useForm(); const { minHeight } = useDomFullHeight(`.mediaDevice`); const [productVisible, setProductVisible] = useState(false); const [accessType, setAccessType] = useState(DefaultAccessType); const [productList, setProductList] = useState([]); const [oldPassword, setOldPassword] = useState(''); const [loading, setLoading] = useState(false); const img1 = require('/public/images/media/doc1.png'); const img2 = require('/public/images/media/doc2.png'); const img3 = require('/public/images/media/doc3.png'); const img4 = require('/public/images/media/doc4.png'); const getProductList = async (productParams: any) => { const resp = await service.queryProductList(productParams); if (resp.status === 200) { setProductList(resp.result); } }; const queryProduct = async (value: string) => { getProductList({ terms: [ { column: 'accessProvider', value: value }, { column: 'state', value: 1 }, ], sorts: [{ name: 'createTime', order: 'desc' }], }); }; useEffect(() => { if (id) { service.getDetail(id).then((res) => { if (res.status === 200) { form.setFieldsValue({ ...res.result, photoUrl: res.result?.photoUrl || defaultImage, channel: res.result?.provider, }); const _accessType = res.result?.provider || DefaultAccessType; setAccessType(_accessType); queryProduct(_accessType); setOldPassword(res.result.password); } }); } else { form.setFieldsValue({ channel: DefaultAccessType, photoUrl: defaultImage, }); queryProduct(DefaultAccessType); setAccessType(DefaultAccessType); } }, []); const handleSave = useCallback(async () => { const formData = await form.validateFields(); if (formData) { const { channel, ...extraFormData } = formData; if (formData?.others?.access_pwd === oldPassword && !id) { delete extraFormData.others?.access_pwd; } if (formData.id === '') { delete extraFormData.id; } setLoading(true); const resp = id ? await service.updateData(channel, id, { ...extraFormData, channel }) : await service.saveData(channel, { ...extraFormData, channel }); setLoading(false); if (resp.status === 200) { form.resetFields(); onlyMessage('操作成功'); history.back(); } else { onlyMessage('操作失败', 'error'); } } }, [oldPassword]); // const intlFormat = ( // id: string, // defaultMessage: string, // paramsID?: string, // paramsMessage?: string, // ) => { // const paramsObj: Record = {}; // if (paramsID) { // const paramsMsg = intl.formatMessage({ // id: paramsID, // defaultMessage: paramsMessage, // }); // paramsObj.name = paramsMsg; // } // return intl.formatMessage( // { // id, // defaultMessage, // }, // paramsObj, // ); // }; return ( <>
{ handleSave(); }} labelCol={{ style: { width: 100 }, }} > { setAccessType(key); queryProduct(key); form.resetFields(['id', 'productId']); }} disabled={id} options={[ { label: 'GB/T28181', value: DefaultAccessType, }, { label: '固定地址', value: 'fixed-media', }, ]} /> {accessType === DefaultAccessType ? ( ) : ( )} )}
{accessType === DefaultAccessType ? (

1.概述

视频设备通过GB/T28181接入平台整体分为2部分,包括平台端配置和设备端配置,不同的设备端配置的路径或页面存在差异,但配置项基本大同小异。

2.配置说明

平台端配置

1、ID

设备唯一标识,请填写设备端配置的设备编号。

2、所属产品

只能选择接入方式为GB/T28281的产品,若当前无对应产品,可点击右侧快速添加按钮,填写产品名称和选择GB/T28181类型的网关完成产品创建

3、接入密码

配置接入密码,设备端配置的密码需与该密码一致。该字段可在产品-设备接入页面进行统一配置,配置后所有设备将继承产品配置。设备单独修改后将脱离继承关系。

设备端配置

各个厂家、不同设备型号的设备端配置页面布局存在差异,但配置项基本大同小异,此处以大华摄像头为例作为接入配置示例

1、SIP服务器编号/SIP域

SIP服务器编号填入该设备所属产品-接入方式页面“连接信息”的SIP。 SIP域通常为SIP服务器编号的前10位。

2、SIP服务器IP/端口

SIP服务器IP/端口填入该设备所属产品-接入方式页面中“连接信息”的IP/端口。

3、设备编号

设备编号为设备唯一性标识,物联网平台的设备接入没有校验该字段,输入任意数字均不影响设备接入平台。

4、注册密码

填入该设备所属产品-接入方式页面中“GB28281配置”处的接入密码

5、其他字段

不影响设备接入平台,可保持设备初始化值。
) : (

1.概述

视频设备通过RTSP、RTMP固定地址接入平台分为2步。
1、添加视频设备
2、添加视频下的通道地址。
注:当前页面为新增视频设备,新增完成后点击设备的“通道”按钮,添加通道。

2.配置说明

1、ID

设备唯一标识,若不填写,系统将自动生成唯一标识。

2、所属产品

只能选择接入方式为固定地址的产品,若当前无对应产品,可点击右侧快速添加按钮,填写产品名称和选择固定地址类型的网关完成产品创建。
)}
{ setProductVisible(false); }} reload={(productId: string, data: any) => { form.setFieldsValue({ productId }); productList.push({ id: productId, name: data.name, }); const pwd = data.configuration ? data.configuration.access_pwd : ''; form.setFieldsValue({ others: { access_pwd: pwd, }, }); setProductList([...productList]); }} />
); }; export default Save;