You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

335 lines
14 KiB

import React, { useState, useRef, useEffect, useImperativeHandle } from "react";
import { connect } from "react-redux";
import { Form, Row, Col, Checkbox, Radio, CheckboxGroup, } from "@douyinfe/semi-ui";
import { IconEdit, IconPlayCircle, } from "@douyinfe/semi-icons";
import "./cameraModal.less";
import PerfectScrollbar from "perfect-scrollbar";
let equipmentScrollbar;
function cascadeCamera ({ dRef, dispatch, actions, cameraData, parentCamera, testComplete }) {
const form = useRef();
const { equipmentWarehouse } = actions;
const [sip, setSip] = useState([]);
const [NVRcameraList, setNVRcameraList] = useState([]); //nvr视频流列表
const [nvrCheckList, setNvrCheckList] = useState([]); //nvr视频流多选
const [isAllChoose, setIsAllChoose] = useState(false); //全选
const cameraDataNvr = cameraData.nvr || "";
useEffect(() => {
dispatch(equipmentWarehouse.getCascadeSIP()).then((res) => {
setSip(res.payload.data);
});
const videoStreaming = document.getElementById("video_streaming");
if (videoStreaming && equipmentScrollbar) {
equipmentScrollbar.update();
}
}, []);
useEffect(() => {
NVRcameraList
? (equipmentScrollbar = new PerfectScrollbar("#video_streaming", {
suppressScrollX: true,
}))
: "";
}, [NVRcameraList]);
useEffect(() => {
//测试成功后获取级联视频流
console.log(testComplete)
if (testComplete) {
dispatch(equipmentWarehouse.getCascadeStream({ sip: "111" })).then((res) => {
console.log(res.payload.data);
let chooseList = [];
let data = res.payload.data.map((item, index) => {
item.change = false;
return item;
})
setNVRcameraList(data)
for (let index = 0; index < data.length; index++) {
chooseList.push(data[index].id);
}
setNvrCheckList(chooseList);
setIsAllChoose(true);
});
}
}, [testComplete])
//内存卡列表
const memoryList = [
{
id: 1,
value: "8g",
},
{
id: 2,
value: "16g",
},
{
id: 3,
value: "32g",
},
{
id: 4,
value: "64g",
},
{
id: 5,
value: "128g",
},
{
id: 6,
value: "256g",
},
{
id: 7,
value: ">256g",
},
];
function NvrChangeName (e, index, name) {
//级联摄像头视频流获取修改名称
let NvrchangeList = JSON.parse(JSON.stringify(NVRcameraList));
if (cameraData.name == name) {
NvrchangeList[index].change = true;
setNVRcameraList(NvrchangeList);
}
e.stopPropagation();
}
function nvronBlur (index) {
//nvr摄像头名称修改失去焦点
let NvrchangeList = JSON.parse(JSON.stringify(NVRcameraList));
NvrchangeList[index].change = false;
setNVRcameraList(NvrchangeList);
}
function inputchange (e, index) {
//nvr摄像头名称修改
let NvrchangeList = JSON.parse(JSON.stringify(NVRcameraList));
NvrchangeList[index].name = e;
setNVRcameraList(NvrchangeList);
}
function allChoose (e) {
//全选/全不选
let chooseList = [];
if (NVRcameraList.length == nvrCheckList.length) {
setNvrCheckList([]);
setIsAllChoose(false);
} else {
for (let index = 0; index < NVRcameraList.length; index++) {
chooseList.push(NVRcameraList[index].id);
}
setNvrCheckList(chooseList);
setIsAllChoose(true);
}
}
function playVideo (e) {
//nvr播放视频
console.log("22222222222222222");
e.stopPropagation();
}
function onDisabled (name) {
if ((cameraDataNvr && cameraData.name == name) || !cameraDataNvr) {
return false;
} else {
return true;
}
}
useImperativeHandle(dRef, () => ({
//传给父组件方法
//子组件暴露给父组件的方法
cascadeCameraForm: form.current.validate,
resetCascadeCamera: form.current.reset,
}));
return (
<>
<Form
allowEmpty
labelPosition="left"
labelAlign="left"
labelWidth="115px"
onValueChange={(values) => {
console.log(values);
}}
getFormApi={(formApi) => (form.current = formApi)}
>
<Row>
<Col span={12}>
<Form.Input
field="externalDomain"
label="外域名称:"
maxLength="36"
initValue={cameraData.externalDomain || ""}
placeholder="请输入外域 名称,例如“xxx市级平台”"
style={{ width: 307 }}
rules={[{ required: true, message: "请输入外域名称" }]}
/>
</Col>
<Col span={12}>
<Form.Select
label="级联方式:"
field="cascadeType"
initValue={cameraData.cascadeType || "上级域"}
style={{ width: 307 }}
rules={[{ required: true, message: "请选择输入级联方式" }]}
>
<Form.Select.Option value="上级域">
上级域
</Form.Select.Option>
</Form.Select>
</Col>
<Col span={14}>
<Form.Select
label="SIP编号:"
field="sip"
initValue={parentCamera || ""}
placeholder="请选择SIP编号"
style={{ width: 307 }}
rules={[{ required: true, message: "请选择SIP编号" }]}
>
{sip.map((item, index) => (
<Form.Select.Option key={index} value={item.sipip}>
{item.sipip}
</Form.Select.Option>
))}
</Form.Select>
</Col>
</Row>
<Row>
<div
id="video_streaming"
style={{ maxHeight: 300, position: "relative" }}
>
{NVRcameraList.length > 0 ? (
<div
style={{ display: "flex", alignItems: "center", marginLeft: 211 }}
>
<Radio
checked={isAllChoose}
mode="advanced"
disabled={true}
onChange={(e) => allChoose(e)}
aria-label="全选"
>
全选
</Radio>
</div>
) : (
""
)}
<CheckboxGroup
type="pureCard"
direction="vertical"
aria-label="视频流获取"
value={nvrCheckList}
onChange={(nvrCheck) => {
setNvrCheckList(nvrCheck);
if (NVRcameraList.length == nvrCheck.length) {
setIsAllChoose(true);
} else {
setIsAllChoose(false);
}
}}>
{NVRcameraList.length > 0
? NVRcameraList.map((item, index) => (
<Col
key={index}
span={12}
style={{
display: "flex",
justifyContent: "center",
marginTop: 12,
}}
>
<Checkbox
value={item.id}
disabled={onDisabled(item.name)}
extra={
<div>
<div
style={{
display: "flex",
alignItems: "center",
justifyContent: "space-between",
height: 30,
}}
>
<div>
通道名称
{item.change ? (
<Input
autofocus
style={{ width: 100 }}
value={item.name}
onChange={(e) => inputchange(e, index)}
onBlur={() => nvronBlur(index)}
onClick={(e) => e.stopPropagation()}
></Input>
) : (
item.name
)}
</div>
<div
style={{
display: "flex",
alignItems: "center",
}}
>
<IconEdit
style={{
fontSize: 16,
marginLeft: 18,
cursor: "pointer",
color: "#1859C1",
}}
onClick={(e) =>
NvrChangeName(e, index, item.name)
}
/>
</div>
</div>
<div style={{ marginTop: 8, width: 246 }}>
设备编号{item.streamid}
</div>
<div
style={{
marginTop: 12,
display: "flex",
justifyContent: "space-between",
alignItems: "center",
}}
>
<IconPlayCircle
size="extra-large"
style={{ color: "#1859C1" }}
onClick={(e) => playVideo(e)}
/>
</div>
</div>
}
style={{ width: 280, border: "1px solid #F9F9F9" }}
></Checkbox>
</Col>
))
: ""}
</CheckboxGroup>
</div>
</Row>
</Form>
</>
);
}
function mapStateToProps (state) {
const { auth, global, members } = state;
return {
loading: members.isRequesting,
user: auth.user,
actions: global.actions,
members: members.data,
};
}
export default connect(mapStateToProps)(cascadeCamera);