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.
 
 
 
 
 

601 lines
25 KiB

import React, { useState, useRef, useEffect } from "react";
import { connect } from "react-redux";
import { Modal, Spin } from "@douyinfe/semi-ui";
import { IconChevronLeft, IconChevronRight } from "@douyinfe/semi-icons";
import moment from "moment";
import FluoriteCamera from "./fluoriteCamera";
import NvrCamera from "./nvrCamera";
import IpcCamera from "./ipcCamera";
import CascadeCamera from "./cascadeCamera";
import "./cameraModal.less";
function cameraModal (props) {
const {
dispatch,
actions,
modalName,
visible,
close,
venderList,
CameraKind,
CameraAbility,
cameraData, //修改时传来的值
modify,
parentCamera,
addNvr,
nvrNumber,
axyData,
} = props;
const { equipmentWarehouse } = actions;
const fluoriteRef = useRef();
const ipcRef = useRef();
const cascadeRef = useRef();
const nvrRef = useRef();
const [isloading, setloading] = useState(false); //是否显示loading
const [loadingTip, setloadingTip] = useState("测试中..."); //loading tip的值
const [okText, setokText] = useState("确定"); //ok弹框text 右边
const [cancelText, setcancelText] = useState("取消"); //取消弹框text 左边
const testComplete = useRef(false) //测试完成
const [clickNum, setclickNum] = useState(
cameraData.type == "yingshi"
? 1
: cameraData.type == "ipc"
? 3
: cameraData.type == "nvr" || addNvr
? 2
: cameraData.type == "cascade"
? 4
: 1
); //点击的第几个
useEffect(() => {
dispatch(equipmentWarehouse.getCameraKind());
dispatch(equipmentWarehouse.getAbility());
cameraData.type == "nvr" || addNvr ? setcameraList(cameraList.slice(1, 4)) : "";
//axyData安心云参数
if (axyData) {
console.log(axyData)
switch (axyData.openCamera) {
case "nvr":
setcameraList(cameraList.slice(1, 4))
setclickNum(2)
break
case "ipc":
setcameraList(cameraList.slice(0, 3))
setclickNum(3)
break
case "yingshi":
setcameraList(cameraList.slice(0, 3))
setclickNum(1)
break
default:
break
}
}
}, []);
const cameraList = [
//循环摄像头列表
{
id: 1,
img: "/assets/images/background/ysy.png",
title: "萤石云平台摄像头",
text: "通过萤石云平台rtmp地址配置完成推流的平台摄像头。",
},
{
id: 3,
img: "/assets/images/background/ipc.png",
title: "IPC网络摄像头",
text: "通过网络与监控设备直连完成视频流推送的摄像头设备",
},
{
id: 4,
img: "/assets/images/background/cascade.png",
title: "级联摄像头",
text: "通过GB/T28181协议级联的平台摄像头,常用于平台对接推送",
},
{
id: 2,
img: "/assets/images/background/nvr.png",
title: "NVR摄像头",
text: "通过连接NVR(网络硬盘录像机)进行视频流推送的摄像头",
},
];
const [showcameraList, setcameraList] = useState(cameraList.slice(0, 3)); //轮播图
function handleOk () {
//点击弹框确定 右边按钮
if (clickNum == 1) {
//萤石云平台摄像头
fluoriteRef.current.fluoriteCameraForm().then((values) => {
values = JSON.parse(JSON.stringify(values));
values.longitude = values.position.split(",")[0];
values.latitude = values.position.split(",")[1];
delete values.position;
if (cameraData.id) {
values.id = cameraData.id;
}
dispatch(equipmentWarehouse.postCameraYingshi(values)).then((res) => {
if (res.success) {
onReset();
}
});
});
} else if (clickNum == 2) {
//NVR摄像头
let data = nvrRef.current.NVRcameraList.map((v) => {
return { streamid: v.streamid, name: v.name, cloudControl: v.support };
});
dispatch(
equipmentWarehouse.postCameraNvr({
serialNo: nvrRef.current.equipmentNum,
data: data,
})
).then((res) => {
if (res.success) {
onReset();
}
});
} else if (clickNum == 3) {
//IPC网络摄像头
ipcRef.current.ipcCameraForm().then((values) => {
values = JSON.parse(JSON.stringify(values));
values.longitude = values.position.split(",")[0];
values.latitude = values.position.split(",")[1];
delete values.position;
if (cameraData.id) {
values.id = cameraData.id;
}
console.log(values);
dispatch(equipmentWarehouse.postCameraIpc(values)).then((res) => {
if (res.success) {
onReset();
}
});
});
} else if (clickNum == 4) {
//级联摄像头
cascadeRef.current.cascadeCameraForm().then((values) => {
console.log(values);
dispatch(equipmentWarehouse.postAddCascade(values)).then((res) => {
console.log(res);
if (res.success) {
onReset();
}
});
});
}
}
function handleAfterClose () {
//在关闭之后
}
function handleCancel () {
onReset();
//点击弹框取消 左边按钮
}
function handleChoose (id) {
//选择摄像头接入类型
if (!addNvr && !modify && !axyData) {
setclickNum(id);
}
}
function turnLift () {
//轮播图向左
if (!addNvr && !modify && !axyData) {
setcameraList(cameraList.slice(0, 3));
}
}
function turnRight () {
//轮播图向右
if (!addNvr && !modify && !axyData) {
setcameraList(cameraList.slice(1, 4));
}
}
function onReset () {
if (clickNum == 1) {
fluoriteRef.current.resetFluoriteCamera();
fluoriteRef.current.toempty();
close();
} else if (clickNum == 3) {
ipcRef.current.resetIpcCamera();
ipcRef.current.toempty();
close();
} else if (clickNum == 4) {
cascadeRef.current.resetCascadeCamera();
testComplete.current = false
close();
} else {
nvrRef.current.resetFluoriteCamera();
close();
}
}
//重置
function reset () {
if (clickNum == 1) {
fluoriteRef.current.resetFluoriteCamera();
fluoriteRef.current.toempty();
} else if (clickNum == 3) {
ipcRef.current.resetIpcCamera();
ipcRef.current.toempty();
} else if (clickNum == 4) {
cascadeRef.current.resetCascadeCamera();
} else {
nvrRef.current.resetFluoriteCamera();
}
}
//表单验证
function toTest () {
if (clickNum == 1) {
fluoriteRef.current
.fluoriteCameraForm()
.then((values) => {
//表单校验成功
var front = new moment(); //验证前时间
setloading(true);
dispatch(
equipmentWarehouse.postVerifyYingshi({
serialNo: values.serialNo,
})
).then((res) => {
var after = new moment(); //验证后时间
var duration = moment.duration(after.diff(front))._data.milliseconds;
if (res.success) {
setTimeout(() => {
setloadingTip("测试完成");
setTimeout(() => {
setloading(false);
setloadingTip("测试中...");
}, 800);
}, duration > 2000 ? 0 : 2000 - duration)
} else {
setTimeout(() => {
setloadingTip("测试失败");
setTimeout(() => {
setloading(false);
setloadingTip("测试中...");
}, 800);
}, duration > 2000 ? 0 : 2000 - duration)
}
})
})
.catch((errors) => {
//表单校验失败
console.log("errors", errors);
});
} else if (clickNum == 3) {
ipcRef.current
.ipcCameraForm()
.then((values) => {
//表单校验成功
console.log(values);
var front = new moment(); //验证前时间
setloading(true);
dispatch(
equipmentWarehouse.postVerifyIpc({
serialNo: values.serialNo,
})
).then((res) => {
var after = new moment(); //验证后时间
var duration = moment.duration(after.diff(front))._data.milliseconds;
if (res.success) {
setTimeout(() => {
setloadingTip("测试完成");
setTimeout(() => {
setloading(false);
setloadingTip("测试中...");
}, 800);
}, duration > 2000 ? 0 : 2000 - duration)
} else {
setTimeout(() => {
setloadingTip("测试失败");
setTimeout(() => {
setloading(false);
setloadingTip("测试中...");
}, 800);
}, duration > 2000 ? 0 : 2000 - duration)
}
})
})
.catch((errors) => {
//表单校验失败
console.log();
});
} else if (clickNum == 4) {
cascadeRef.current
.cascadeCameraForm()
.then((values) => {
console.log(values);
var front = new moment(); //验证前时间
setloading(true);
dispatch(
equipmentWarehouse.postVerifyCascade({
sip: values.sip,
})
).then((res) => {
var after = new moment(); //验证后时间
var duration = moment.duration(after.diff(front))._data.milliseconds;
if (res.success) {
setTimeout(() => {
setloadingTip("测试完成");
testComplete.current = true
setTimeout(() => {
setloading(false);
setloadingTip("测试中...");
}, 800);
}, duration > 2000 ? 0 : 2000 - duration)
} else {
setTimeout(() => {
setloadingTip("测试失败");
setTimeout(() => {
setloading(false);
setloadingTip("测试中...");
}, 800);
}, duration > 2000 ? 0 : 2000 - duration)
}
})
})
.catch((errors) => {
//表单校验失败
console.log("errors", errors);
});
}
}
return (
<>
<Modal
title={modalName == "add" ? "添加摄像头" : "修改摄像头"}
okText={okText}
cancelText={cancelText} //取消按钮
visible={visible}
onOk={handleOk}
width={966}
afterClose={handleAfterClose}
onCancel={handleCancel}
>
<>
<div
style={{ marginLeft: "-24px", marginRight: "-24px", marginTop: 8 }}
>
<div
style={{
marginLeft: 29,
color: "#1859C1",
fontSize: 14,
fontWeight: 500,
}}
>
接入类型
</div>
<div
style={{
marginTop: 5,
display: "flex",
alignItems: "center",
justifyContent: "space-between",
}}
>
<IconChevronLeft
style={{
color: "rgba(0, 0, 0, 0.45)",
fontSize: 16,
marginLeft: 29,
cursor: "pointer",
}}
onClick={turnLift}
/>
<div
style={{ display: "flex", alignItems: "center", height: 146 }}
>
{showcameraList.map((item, index) => (
<div
key={item.id}
style={{
width: 266,
height: 146,
marginRight: 12,
border:
clickNum === item.id
? "1px solid #1859C1"
: "1px solid #F9F9F9",
borderRadius: 3,
display: "flex",
flexDirection: "column",
alignItems: "center",
cursor: "pointer",
position: "relative",
}}
onClick={() => handleChoose(item.id)}
>
{modify || addNvr || axyData ? item.id == clickNum ? "" : <div style={{
width: 266,
height: 146,
borderRadius: 3,
backgroundColor: "rgba(151, 151, 151, 0.1)",
position: "absolute",
top: 0,
}}></div> : ""}
<div
style={{
marginTop: 5,
height: 65,
width: 116,
display: "flex",
justifyContent: "center",
alignItems: "center",
}}
>
<img src={item.img} alt="设置" />
</div>
<div
style={{
marginTop: 2,
fontSize: 14,
color: "rgba(0, 0, 0, 0.85)",
}}
>
{item.title}
</div>
<div
style={{
width: 210,
height: 34,
marginTop: 9,
fontSize: 12,
color: "rgba(0, 0, 0, 0.45)",
textAlign: "center",
}}
>
{item.text}
</div>
{clickNum === item.id ? (
<div
style={{
position: "absolute",
top: "-3px",
right: "-5px",
}}
>
<img
src="/assets/images/background/topchoose.png"
alt="1"
/>
</div>
) : (
""
)}
</div>
))}
</div>
<IconChevronRight
style={{
color: "rgba(0, 0, 0, 0.45)",
fontSize: 16,
marginRight: 18,
cursor: "pointer",
}}
onClick={turnRight}
/>
</div>
</div>
<div
style={{
height: 30,
marginLeft: "-24px",
marginRight: "-24px",
marginTop: 48,
display: "flex",
alignItems: "center",
justifyContent: "space-between",
}}
>
<div
style={{
marginLeft: 29,
color: "#1859C1",
fontSize: 14,
fontWeight: 500,
}}
>
配置属性
</div>
{clickNum !== 2 ? (
<div style={{ display: "flex", marginRight: 43 }}>
<div
style={{
height: 30,
width: 64,
border: "1px solid #D9D9D9",
borderRadius: "3px",
color: "rgba(0, 0, 0, 0.65)",
display: "flex",
justifyContent: "center",
alignItems: "center",
cursor: "pointer",
marginRight: 16,
}}
onClick={reset}
>
<img
src="/assets/images/background/Reset.png"
alt="1"
style={{ marginRight: 4 }}
/>
重置
</div>
<div
style={{
height: 30,
width: 64,
border: "1px solid #1859C1",
borderRadius: "3px",
color: "#1859C1",
display: "flex",
justifyContent: "center",
alignItems: "center",
cursor: "pointer",
}}
onClick={toTest}
>
<img
src="/assets/images/background/test.png"
alt="1"
style={{ marginRight: 4 }}
/>
测试
</div>
</div>
) : (
""
)}
</div>
<div>
{clickNum == 1 ? (
<Spin tip={loadingTip} spinning={isloading}>
<FluoriteCamera
cRef={fluoriteRef}
CameraKind={CameraKind}
CameraAbility={CameraAbility}
cameraData={cameraData}
/>
</Spin>
) : clickNum == 2 ? (
<Spin tip={loadingTip} spinning={isloading}>
<NvrCamera nvrRef={nvrRef} cameraData={cameraData} addNvr={addNvr} nvrNumber={nvrNumber} />
</Spin>
) : clickNum == 3 ? (
<Spin tip={loadingTip} spinning={isloading}>
<IpcCamera
aRef={ipcRef}
CameraKind={CameraKind}
CameraAbility={CameraAbility}
venderList={venderList}
cameraData={cameraData}
/>
</Spin>
) : (
<Spin tip={loadingTip} spinning={isloading}>
<CascadeCamera dRef={cascadeRef} cameraData={cameraData} parentCamera={parentCamera} testComplete={testComplete.current} />
</Spin>
)}
</div>
</>
</Modal>
</>
);
}
function mapStateToProps (state) {
const { auth, global, members, CameraKind, CameraAbility } = state;
return {
loading: members.isRequesting,
user: auth.user,
actions: global.actions,
CameraKind: CameraKind.data || [],
CameraAbility: CameraAbility.data || [],
};
}
export default connect(mapStateToProps)(cameraModal);