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.
 
 
 
 
 

491 lines
14 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 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, //修改时传来的值
} = 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 [clickNum, setclickNum] = useState(
cameraData.type == "yingshi"
? 1
: cameraData.type == "ipc"
? 3
: cameraData.type == "nvr"
? 2
: cameraData.type == "cascade"
? 4
: 1
); //点击的第几个
useEffect(() => {
dispatch(equipmentWarehouse.getCameraKind());
dispatch(equipmentWarehouse.getAbility());
}, []);
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) {
console.log("44444444444444");
close();
}
}
function handleAfterClose() {
//在关闭之后
}
function handleCancel() {
onReset();
//点击弹框取消 左边按钮
}
function handleChoose(id) {
//选择摄像头接入类型
setclickNum(id);
}
function turnLift() {
//轮播图向左
setcameraList(cameraList.slice(0, 3));
}
function turnRight() {
//轮播图向右
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) {
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) {
} else {
nvrRef.current.resetFluoriteCamera();
}
}
function toTest() {
if (clickNum == 1) {
fluoriteRef.current
.fluoriteCameraForm()
.then((values) => {
//表单校验成功
console.log("111111111", values);
})
.catch((errors) => {
//表单校验失败
console.log("errors", errors);
});
} else if (clickNum == 3) {
ipcRef.current
.ipcCameraForm()
.then((values) => {
//表单校验成功
console.log("111111111", values);
})
.catch((errors) => {
//表单校验失败
console.log("errors", errors);
});
} else if (clickNum == 4) {
cascadeRef.current
.cascadeCameraForm()
.then((values) => {
//表单校验成功
let chooseList = [];
let nvrCameraList = [
{
id: 10,
name: "南昌县1",
number: "111111111111111111",
support: false,
change: false,
},
{
id: 20,
name: "南昌县2",
number: "222222222222222222",
support: false,
change: false,
},
{
id: 30,
name: "南昌县3",
number: "333333333333333333",
support: false,
change: false,
},
{
id: 40,
name: "南昌县4",
number: "444444444444444444",
support: false,
change: false,
},
];
cascadeRef.current.setNVRcameraList(nvrCameraList);
for (let index = 0; index < nvrCameraList.length; index++) {
chooseList.push(nvrCameraList[index].id);
}
cascadeRef.current.setNvrCheckList(chooseList);
cascadeRef.current.setIsAllChoose(true);
})
.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}
>
<Spin tip={loadingTip} spinning={isloading}>
<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)}
>
<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 ? (
<FluoriteCamera
cRef={fluoriteRef}
CameraKind={CameraKind}
CameraAbility={CameraAbility}
cameraData={cameraData}
/>
) : clickNum == 2 ? (
<NvrCamera nvrRef={nvrRef} />
) : clickNum == 3 ? (
<IpcCamera
aRef={ipcRef}
CameraKind={CameraKind}
CameraAbility={CameraAbility}
venderList={venderList}
cameraData={cameraData}
/>
) : (
<CascadeCamera dRef={cascadeRef} />
)}
</div>
</Spin>
</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);