import React, { useEffect, useRef, useState } from 'react'; import { connect } from 'react-redux'; import { TreeSelect, Tree, Form, Button, Popover, Tag, Switch, Input, Row, Pagination, Checkbox, InputNumber } from '@douyinfe/semi-ui'; import './videoScreen.less' import VideoCard from './videoCard' import { ReminderBox } from "../../../components/index"; import PerfectScrollbar from "perfect-scrollbar"; let timing let projectScrollbar; const VideoScreen = ({ treeData, filterGroup, videoPlay, template, headerName, showHeader }) => { // console.log({ 视频: treeData }); // console.log(filterGroup); // console.log(headerName); // console.log(videoPlay); // console.log(template); // console.log(showHeader); // const treeData = [ // { // label: '公司', // value: '公司', // key: '524252542', // children: [ // { // label: '大门', // value: '大门', // key: '2451245', // videoData: { // channelNo: 1, // content: ['5442542542', '452345', '234524525'], // serialNo: "F61504020", // type: "yingshi", // yingshiToken: "at.6vznnc23bv51vzjt7lnkj7e19bb2z61f-3gnj7m5lxp-10666cy-bgwcjkekk" // } // }, { // label: '机房', // value: '机房', // key: '54252542', // videoData: { // channelNo: 3, // content: ['5442542542', '452345', '234524525'], // serialNo: "F61504020", // type: "yingshi", // yingshiToken: "at.6vznnc23bv51vzjt7lnkj7e19bb2z61f-3gnj7m5lxp-10666cy-bgwcjkekk" // } // }, { // label: '后门', // value: '后门', // key: '52425425642', // videoData: { // channelNo: 2, // content: ['5442542542', '452345', '234524525'], // serialNo: "F61504020", // type: "yingshi", // yingshiToken: "at.6vznnc23bv51vzjt7lnkj7e19bb2z61f-3gnj7m5lxp-10666cy-bgwcjkekk" // } // }, // ] // }, // { // label: '外部', // value: '外部', // key: '25425425', // children: [ // { // label: '水库', // value: '水库', // key: '2542542542542', // children: [ // { // label: '房子', // value: '房子', // key: '2542542542542', // videoData: { // channelNo: null, // content: ['5442542542', '452345', '234524525'], // serialNo: "G56384764", // type: "yingshi", // yingshiToken: "at.c7dnknnvd4irh8zddul3dgkpb4f3oz83-4n6u7zv8st-1gxz7ny-lgffyh25z", // } // }, // ] // }, // ] // }, { // label: '外', // value: '外', // key: '0-3', // children: [ // { // label: '库', // value: '库', // key: '0-3-1', // children: [ // { // label: '子', // value: '子', // key: '0-3-1-1', // }, // ] // }, // ] // }] const [pageSize, setPageSize] = useState(4) //每页视频数量 const [page, setPage] = useState(1) //页码 const [queryData, setQueryData] = useState([{ label: '全部', value: '全部', key: '0' }]) //查询树状数据 const [leftTree, setLefTtree] = useState(treeData) //左侧树状数据 const [playData, setPlayData] = useState([]) //视频数据 const [queryValue, setQueryValue] = useState(['全部']) //查询条件 const [leftValue, setLeftValue] = useState(treeData.map(v => v.value)) //树状被选中的视频 const [selectAll, setSelectAll] = useState(true) //全选 const [searchs, setSearchs] = useState({}) //搜索 const [polling, setPolling] = useState(false) //轮询 const [pollingTime, setPollingTime] = useState(1) //轮询时间 const [reminder, setReminder] = useState(false); //提醒弹框 const [formWidth, setFormWidth] = useState(840); const [multiScreen, setMultiScreen] = useState(''); const api = useRef(); const pageRef = useRef(page); const GONGGESCREEN = 'gonggeScreen' useEffect(() => { projectScrollbar = new PerfectScrollbar("#tree", { suppressScrollX: true, }); const resize_ = () => { setFormWidth(document.getElementById('formSearch').scrollWidth) } resize_() window.addEventListener('resize', resize_); return () => { window.removeEventListener('resize', resize_); } }, []) useEffect(() => { const domProject = document.getElementById("tree"); if (domProject && projectScrollbar) { projectScrollbar.update(); } }) useEffect(() => { let query = [] treeData?.map(v => [ query.push({ label: v.label, value: v.value, key: v.key }) ]) setQueryData([{ label: '全部', value: '全部', key: '00', children: query }]) let values = treeData.map(v => v.value) videoData(treeData, values) setLefTtree(treeData) setLeftValue(treeData.map(v => v.value)) api.current?.reset() }, [treeData, filterGroup]) useEffect(() => { console.log(queryValue); if (treeData && queryValue.includes('全部')) { console.log(54254); setLefTtree(treeData) let values = treeData.map(v => v.value) videoData(treeData, values) } else { console.log(3); let leftData = [] queryValue.map(item => { leftData.push(treeData?.find(({ value }) => item == value)) }) //获取左侧树状数据 setLefTtree(leftData) videoData(treeData, queryValue) } }, [queryValue]) //查询参数改变时 useEffect(() => { let playVideo = [] const videoPlay = (data, values) => { data?.map(v => { if (values?.find(vv => vv == v.value)) { if (v.camera) playVideo.push(v) if (v.children) { v.children.map(vv => { if (vv.camera) playVideo.push(vv) if (vv.children) { vv.children.map(c => { if (c.camera) playVideo.push(c) if (c.children) { c.children.map(cc => { if (cc.camera) playVideo.push(cc) }) } }) } }) } } if (v.children) { videoPlay(v.children, leftValue) } }) } console.log(leftTree, leftValue); videoPlay(leftTree, leftValue) console.log(playVideo); setPlayData(playVideo); for (let v of treeData) { //判断是否全选 if (!leftValue.includes(v.value)) { setSelectAll(false) return } else { setSelectAll(true) } } }, [leftValue]) //树状勾选结果 useEffect(() => { console.log(searchs); let videoData = [] let wholeVideo = treeData?.map(v => { if (v.children) { v.children.map(vv => { if (vv.camera) videoData.push(vv) if (vv.children) { vv.children.map(c => { if (c.camera) videoData.push(c) if (c.children) { c.children.map(cc => { if (cc.camera) videoData.push(cc) }) } }) } }) } }) // console.log(videoData); if (searchs?.name) { videoData = videoData?.filter(v => v.label.includes(searchs.name)) } if (searchs.hasOwnProperty('field0')) { videoData = videoData?.filter(({ cameraId }) => filterGroup[0].filters.find(v => v.num == searchs?.field0).cameraIds.some(v => v == cameraId)) } if (searchs.hasOwnProperty('field1')) { videoData = videoData?.filter(({ cameraId }) => filterGroup[1].filters.find(v => v.num == searchs?.field1).cameraIds.some(v => v == cameraId)) } if (searchs.hasOwnProperty('field2')) { videoData = videoData?.filter(({ cameraId }) => filterGroup[2].filters.find(v => v.num == searchs?.field2).cameraIds.some(v => v == cameraId)) } if (searchs.hasOwnProperty('field3')) { videoData = videoData?.filter(({ cameraId }) => filterGroup[3].filters.find(v => v.num == searchs?.field3).cameraIds.some(v => v == cameraId)) } if (searchs.hasOwnProperty('field4')) { videoData = videoData?.filter(({ cameraId }) => filterGroup[4].filters.find(v => v.num == searchs?.field4).cameraIds.some(v => v == cameraId)) } // console.log(videoData); setPlayData(videoData) }, [searchs]) useEffect(() => { let pollingTimes = pollingTime || 1 if (timing) clearInterval(timing) if (pollingTime && polling) { timing = setInterval(() => { let pages = pageRef.current + 1 if (pages > Math.ceil(playData?.length / pageSize)) { setPage(1) pageRef.current = 1 } else { setPage(pages) pageRef.current = pages } }, pollingTimes * 1000 * 60) } }, [polling, playData, pollingTime]) useEffect(() => { setPage(1) pageRef.current = 1 }, [pageSize]) //确定查询条件下视频总数 const videoData = (d, v) => { console.log(d, v); let playVideo = [] let videos = d.filter(item => v.some(vv => vv == item.value)) const playVideoData = (data) => { data.map(c => { if (c.camera) playVideo.push(c) if (c.children) playVideoData(c.children) }) } playVideoData(videos) setPlayData(playVideo) playVideoData.current = playVideo return playVideo } //宫格设置点击 const flipScreens = (data) => { const remind = localStorage.getItem(GONGGESCREEN) || 'false' console.log(remind); console.log(true); switch (data) { case "单屏": setPageSize(1) break; case "4分屏": setPageSize(4) break; case "6分屏": if (remind == 'false') { setReminder(true) } else { setPageSize(6) } break; case "12分屏": if (remind == 'false') { setReminder(true) } else { setPageSize(12) } break; default: break } } // console.log(playData); const mould = (blue, white, black) => { switch (template) { case 'blue': return blue case 'white': return white case 'black': return black default: break; } } return ( <>
{/* 头部标题 */} {showHeader ?
{headerName}
: ""}
查询: { setQueryValue(e) }} />
{ // console.log(e); setLeftValue(e) setPage(1) pageRef.current = 1 }} onSelect={(e) => { // console.log(e); }} style={{ color: '#FFFFFF' }} />
{ setSelectAll(checked?.target.checked) if (checked?.target.checked) { setLeftValue(treeData.map(v => v.value)) } else { setLeftValue([]) } }} ria-label="Checkbox 示例" style={{ position: 'absolute', right: 10, bottom: 10 }} > 全选
console.log(values)} // onValueChange={values=>console.log(values)} getFormApi={(formApi) => (api.current = formApi)} layout="horizontal" style={{ position: "relative", width: "100%", flex: 1 }} > 设备搜索:} field="name" maxLength="36" placeholder="请输入设备名称" labelPosition="left" style={{ width: 125, color: "#fff", }} /> {filterGroup?.map(v => { let nameLength = 2 let OptionWidth = 75 if (formWidth > 910) { switch (filterGroup.filter(v => v.forbidden).length) { case 1: nameLength = 9 OptionWidth = 130 break; case 2: nameLength = 9 OptionWidth = 130 break; case 3: nameLength = 9 OptionWidth = 130 break; case 4: if (formWidth > 1145) { nameLength = 9 OptionWidth = 130 } else { if (formWidth > 930) { nameLength = 4 OptionWidth = 100 } } break; case 5: if (formWidth > 1380) { nameLength = 9 OptionWidth = 130 } else { if (formWidth > 1100) { nameLength = 4 OptionWidth = 100 } } break; default: break; } } return v.forbidden ? {v.name.length > nameLength ? `${v.name.substr(0, nameLength)}...:` : v.name + ':'}} labelPosition="left" field={"field" + v.num} style={{ width: OptionWidth, background: mould('#01185f', ' #FFFFFF', '#ECECEC'), boxShadow: `inset 0px 0px 5px 1px ${mould('rgba(28, 96, 254, 0.4)', ' rgba(151,151,151,0.5)', 'rgba(39,39,39,0.2)')} ` }} placeholder="全部" showClear > {v.filters.map(vv => {vv.name})} : "" })}
{/* */}
{/* 视频 */}
{playData?.slice((page - 1) * pageSize, page * pageSize)?.map(v => { return })}
共{playData.length}个设备 {playData.length > 0 ? { setPage(currentPage) pageRef.current = currentPage }} /> : ""}
{/* 视频设置 */}
{[{ img: mould('blueGongge', 'whiteGongge', 'blackGongge'), value: '宫格设置', screen: [{ img: mould('blueScreen1', 'whiteScreen1', 'blackScreen1'), value: '单屏' }, { img: mould('blueScreen4', 'whiteScreen4', 'blackScreen4'), value: '4分屏' }, { img: mould('blueScreen6', 'whiteScreen6', 'blackScreen6'), value: '6分屏' }, { img: mould('blueScreen12', 'whiteScreen12', 'blackScreen12'), value: '12分屏' },] }, { img: mould('bluePolling', 'whitePolling', 'blackPolling'), value: '轮询设置', }, { img: mould('blueBackr', 'whiteBack', 'blackBack'), value: '背投', }, { img: mould('blueMonitor', 'whiteMonitor', 'blackMonitor'), value: '监控地图' },].map((v, index) => { return
{ switch (v.value) { case '宫格设置': return
{v.screen.map((item) => { return
{ flipScreens(item.value); setMultiScreen(item.value) }}>
{item.value}
})}
case '轮询设置': return
{ console.log(v); setPolling(v) }} aria-label="a switch for demo" style={{ border: ' 1px solid #D9D9D9', backgroundColor: polling ? mould('#2F53EA', '#4B4B4B', '#555F6D') : mould('#E8F0FF', '#C2C2C2', '#D7D7D7') }} checked={polling} /> 轮询间隔 { if (value) { setPollingTime(Number(value.replace(/[^0-9]/ig, ''))) } else { setPollingTime(null) } }} /> 分钟
default: break; } }} > { if (v.value == '背投') document.getElementById('rearProjection').requestFullscreen() }} />
{v.value}
})}
{ setReminder(false) if (multiScreen == "6分屏") setPageSize(6) if (multiScreen == "12分屏") setPageSize(12) }} close={() => { setReminder(false) setPageSize(pageSize) }} /> ) } function mapStateToProps (state) { const { auth } = state; return { user: auth.user, }; } export default connect(mapStateToProps)(VideoScreen)