import React, { useEffect, useState, useRef } from 'react'; import { connect } from 'react-redux'; import { Timeline, Card, Button, Modal, Form, Tooltip } from '@douyinfe/semi-ui'; import { push } from 'react-router-redux'; import './control.less' import PerfectScrollbar from "perfect-scrollbar"; import repairFQA from '../../means/containers/repairFQA'; import { Setup, OutHidden } from "$components"; import ReactECharts from 'echarts-for-react'; import moment from "moment"; let newScrollbar; let overviewScrollbar; let memberScrollbar; let equipmentScrollbar; let webScrollbar; let problemsScrollbar; let alarmScrollbar; let pomsListScrollbar let problems let member let web const Control = ({ dispatch, actions, user, history, loading, socket, pepProjectId }) => { const { control, install } = actions const [memberList, setMemberList] = useState([])//相关成员列表 const [equipmentList, setEquipmentList] = useState(['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''])//平台设备接入列表 const [webList, setWebList] = useState([])//关联web应用列表 const [problemsList, setProblemsList] = useState([])//异常&问题列表 const [setup, setSetup] = useState(false); //设置是否显现 const [tableType, setTableType] = useState(''); //localStorage存储名 const [tool, setTool] = useState(false); //工具添加修改弹窗 const [alter, setAlter] = useState(false); //工具添加或编辑 const [compile, setCompile] = useState({}); //工具编辑的内容 const [toolShow, setToolShow] = useState([]); //工具展示 const [toolData, setToolData] = useState(0); //工具数 const [tableSetup, setTableSetup] = useState([]); //单一表格设置信息 const [workData, setWorkData] = useState({}); //我的工作台数据 const [dataBI, setDataBI] = useState({}); //查询BI分析数据-数据 const [videoBI, setVideoBI] = useState([]); //查询BI分析数据-视频 const [appBI, setAppBI] = useState([]); //查询BI分析数据-应用 const [efficiencyBI, setEfficiencyBI] = useState({}); //查询BI分析数据-问题处置 const [query, setQuery] = useState({ limit: 23, page: 0, projectCorrelationId: '', types: '1' }); //最新动态 const [querydata1, setQueryData1] = useState([]); //最新动态数据 const [long, setLong] = useState(''); //最新动态设置 const [pomsList, setPomsList] = useState([]); //项目 const [projectId, setProjectId] = useState(''); //项目id const [ask, setASk] = useState(true); //是否继续请求 const [setData, setSetData] = useState(); //设置总数 const [projectData, setProjectData] = useState([]); //项目总信息 const [socketData, setSocketData] = useState(); //推送数据 const [socketDat] = useState(); //推送数据 const exhibition = useRef({ workbench: [], statistical: [] }) //页面结构 const FormApi = useRef() const querydata = useRef([])//最新动态数据 // const socketData = useRef(1) //推送数据 // websocket 使用测试 useEffect(() => { if (socket) { socket.on('alarmSendSocket', (msg) => { if (msg?.msgDataMap) { setSocketData(msg?.msgDataMap) } let a = msg; }); return () => { socket.off("alarmSendSocket") } } }, [socket]) useEffect(() => { if (socketData) { console.log(socketData) console.log(problemsList) let workbench = workData let newest = [] let ProblemAlarm = [] if (socketData?.appear?.length > 0) { socketData?.appear?.map(v => { if (v.type == '应用异常') { workbench.appNewAdd++ } else if (v.type == '设备异常') { workbench.toolNewAdd++ } else { workbench.dataNewAdd++ } ProblemAlarm.push({ ...v, url: v.alarmGroup, groupName: v.type, SourceName: v.source, StartTime: v.time, typeName: v.alarmGroup }) if (exhibition?.current?.dynamic?.find(v => v.key == 'discovery')) { newest.push({ seed: 'discovery', project: v.project, sources: v.source, type: v.type, time: v.time, id: v.id, }) } }) } if (socketData?.confirm?.length > 0) { socketData?.confirm?.map(v => { if (v.type == '应用异常') { workbench.appConfirme++ } else if (v.type == '设备异常') { workbench.toolConfirme++ } else { workbench.dataConfirme++ } if (exhibition?.current?.dynamic?.find(v => v.key == 'confirm')) { newest.push({ seed: 'confirm', project: v.project, sources: v.source, type: v.type, time: v.time, userName: v.user ? '' : v.user, id: v.id, }) } }) dispatch(control.getConsoleAbnormal({ pepProjectId: pepProjectId || projectId })).then(res => { if (res.success) { if (res.payload.data?.length > 4) { setProblemsList([...res.payload.data, ...res.payload.data]) let problemstop = 0 let problemsId = document.getElementById('problems'); if (problems) clearInterval(problems) if (problemsId) { function problemstart () { problems = setInterval(() => { problemstop += 5 problemsId.scrollTop = problemstop if (problemsId.scrollTop >= problemsId.scrollHeight / 2) problemstop = 0, problemsId.scrollTop = problemstop }, 500); problemsId.onmouseover = () => clearInterval(problems) } problemsId.onmouseout = () => problemstart() setTimeout(problemstart(), 1000); } } else { setProblemsList(res.payload.data) } } }) } else { if (ProblemAlarm?.length > 0) { ProblemAlarm.sort((a, b) => (moment(a.StartTime).isBefore(b.StartTime) ? 1 : -1)) setProblemsList([...ProblemAlarm, ...problemsList]) } } workbench.appSurplus += (workbench.appNewAdd - workbench.appConfirme) workbench.toolSurplus += (workbench.toolNewAdd - workbench.toolConfirme) workbench.dataSurplus += (workbench.dataNewAdd - workbench.dataConfirme) setWorkData({ ...workbench }) if (socketData?.notice?.length > 0) { socketData?.notice?.map(v => { if (exhibition?.current?.dynamic?.find(v => v.key == 'notice') && pomsList?.map(u => u.pepProjectId)?.includes(v.projectCorrelationId)) { newest.push({ seed: 'notice', time: v.time, project: v.project, userName: v.pepUsers?.map(u => u.name), alarmPushConfig: v.pushConfig?.cfgName, tactics: v.pushConfig?.tactics, interval: v.pushConfig?.tacticsParams?.interval, deviceProportion: v.pushConfig?.tacticsParams?.deviceProportion, id: v.projectCorrelationId, }) } }) } newest.sort((a, b) => (moment(a.time).isBefore(b.time) ? 1 : -1)) querydata.current = [...newest, ...querydata.current] setQueryData1([...querydata.current]) } }, [socketData]) useEffect(() => { consoleToollink() //初始化表格显示设置 let data = ['overall', 'workbench', 'statistical', 'analyse', 'dynamic'] data.map(v => { localStorage.getItem(v) == null ? localStorage.setItem(v, JSON.stringify(show[v])) : "" attribute(v) }) async function concentration2 () { await dispatch(install.getProjectPoms({ global: 1 })).then((res) => { //获取已绑定项目 if (res.success) { setProjectData(res.payload.data?.rows?.filter(v => v.pepProjectIsDelete !== 1)) let data = res.payload.data?.rows?.filter(v => v.pepProjectIsDelete !== 1)?.map(v => ({ pepProjectId: v.id, pepProjectName: v.pepProjectName || v.name })) setPomsList(data) setProjectId(data[0]?.pepProjectId) } }) } concentration2() const domProject = document.getElementById("news"); if (domProject) { newScrollbar = new PerfectScrollbar("#news", { suppressScrollX: true, }); } const domProject2 = document.getElementById("member"); if (domProject2) { memberScrollbar = new PerfectScrollbar("#member", { suppressScrollX: true, }); } const domProject3 = document.getElementById("equipment"); if (domProject3) { equipmentScrollbar = new PerfectScrollbar("#equipment", { suppressScrollX: true, }); } const domProject4 = document.getElementById("web"); if (domProject4) { webScrollbar = new PerfectScrollbar("#web", { suppressScrollX: true, }) } const domProject5 = document.getElementById("problems"); if (domProject5) { problemsScrollbar = new PerfectScrollbar("#problems", { suppressScrollX: true, }); } const domProject6 = document.getElementById("alarm"); if (domProject6) { alarmScrollbar = new PerfectScrollbar("#alarm", { suppressScrollY: true, }); } return () => { } }, []) useEffect(() => { async function concentration1 () { if (pepProjectId) setProjectId(pepProjectId) // 工作台数据请求 await dispatch(control.getConsoleCount({ pepProjectId: pepProjectId })).then(res => { if (res.success) setWorkData(res.payload.data) }) // 查询BI分析数据-数据 await dispatch(control.getDataAlarmsAggDay({ pepProjectId: pepProjectId })).then(res => { if (res.success) setDataBI(res.payload.data) }) // 查询BI分析数据-视频异常 await dispatch(control.getVideoAlarmsAggDay({ pepProjectId: pepProjectId })).then(res => { if (res.success) setVideoBI(res.payload.data) }) // 查询BI分析数据-应用 await dispatch(control.getAppAlarmsAggDay({ pepProjectId: pepProjectId })).then(res => { if (res.success) setAppBI(res.payload.data) }) await dispatch(control.getAlarmsHandleStatistics({ projectCorrelationId: pepProjectId })).then(res => { if (res.success) setEfficiencyBI(res.payload.data[0]) }) } concentration1() }, [pepProjectId]) useEffect(() => { async function concentration4 () { // 统计概览--异常&问题 await dispatch(control.getConsoleAbnormal({ pepProjectId: pepProjectId || projectId })).then(res => { if (res.success) { if (res.payload.data?.length > 4) { setProblemsList([...res.payload.data, ...res.payload.data]) let problemstop = 0 let problemsId = document.getElementById('problems'); if (problems) clearInterval(problems) if (problemsId) { function problemstart () { problems = setInterval(() => { problemstop += 5 problemsId.scrollTop = problemstop if (problemsId.scrollTop >= problemsId.scrollHeight / 2) problemstop = 0, problemsId.scrollTop = problemstop }, 500); problemsId.onmouseover = () => clearInterval(problems) } problemsId.onmouseout = () => problemstart() setTimeout(problemstart(), 1000); } } else { setProblemsList(res.payload.data) } } }) // 统计概览--相关成员与web应用 await dispatch(control.getConsoleUser({ pepId: pepProjectId || projectId })).then(res => { if (res.success) { if (res.payload.data?.personnel?.length > 5) { setMemberList([...res.payload.data?.personnel, ...res.payload.data?.personnel]) let membertop = 0 let memberId = document.getElementById('member'); if (member) clearInterval(member) if (memberId) { function startmember () { member = setInterval(() => { membertop += 5 memberId.scrollTop = membertop if (memberId.scrollTop >= memberId.scrollHeight / 2) membertop = 0, memberId.scrollTop = membertop }, 500); memberId.onmouseover = () => clearInterval(member) } memberId.onmouseout = () => startmember() setTimeout(startmember(), 1000); } } else { setMemberList(res.payload.data?.personnel) } if (res.payload.data?.webApp?.length > 3) { setWebList([...res.payload.data?.webApp, ...res.payload.data?.webApp]) let webtop = 0 let webId = document.getElementById('web'); if (web) clearInterval(web) let memberId = document.getElementById('member'); if (memberId) { function webstart () { member = setInterval(() => { webtop += 5 webId.scrollTop = webtop if (webId.scrollTop >= webId.scrollHeight / 2) webtop = 0, webId.scrollTop = webtop }, 500); webId.onmouseover = () => clearInterval(web) } webId.onmouseout = () => webstart() setTimeout(webstart(), 1000); } } else { setWebList(res.payload.data?.webApp) } } }) } concentration4() }, [projectId]) useEffect(() => { //查询最新动态 async function concentration3 () { if (exhibition?.current?.dynamic?.length > 0) { let type = [] if (exhibition?.current?.dynamic?.find(v => v.key == 'discovery')) type.push(1) if (exhibition?.current?.dynamic?.find(v => v.key == 'confirm')) type.push(4) if (exhibition?.current?.dynamic?.find(v => v.key == 'notice')) type.push(2) setQuery({ ...query, page: 0 }) await dispatch(control.getLatestDynamic({ ...query, projectCorrelationId: pepProjectId, page: 0, types: type.join(','), })).then(res => { if (res.payload.data?.appear?.length || 0 + res.payload.data?.confirm?.length + res.payload.data?.notice?.length < 10) setASk(false) let data = [] if (res.success) { if (exhibition?.current?.dynamic?.find(v => v.key == 'discovery')) { res.payload.data?.appear?.map(v => data.push({ seed: 'discovery', project: v.projectName, sources: v.alarmInfo?.sourceName, type: v.type, time: v.time, id: v.id, })) } if (exhibition?.current?.dynamic?.find(v => v.key == 'confirm')) { res.payload.data?.confirm?.map(v => data.push({ seed: 'confirm', project: v.projectName, sources: v.alarmInfo?.source, type: v.alarmInfo?.type, time: v.confirmTime, userName: v.userName == '自动恢复' ? '' : v.userName, id: v.id, })) } if (exhibition?.current?.dynamic?.find(v => v.key == 'notice')) { // EM 推送 res.payload.data?.notice?.map(v => data.push({ seed: 'notice', time: v.time, project: v.projectName, userName: v.userName?.map(u => u.name), alarmPushConfig: v.alarmPushConfig?.name, tactics: v.tactics, interval: v.tacticsParams?.interval, deviceProportion: v.tacticsParams?.deviceProportion, id: v.id, })) } data.sort((a, b) => (moment(a.time).isBefore(b.time) ? 1 : -1)) // console.log(data) querydata.current = data setQueryData1(data) } }) } } concentration3() const domProject1 = document.getElementById("overviewCalc"); if (domProject1) { overviewScrollbar = new PerfectScrollbar("#overviewCalc", { suppressScrollY: true, }); } const pomsList = document.getElementById("pomsList"); if (pomsList) { pomsListScrollbar = new PerfectScrollbar("#pomsList", { suppressScrollX: true, }); } const domProject5 = document.getElementById("problems"); if (domProject5) { problemsScrollbar = new PerfectScrollbar("#problems", { suppressScrollX: true, }); } }, [pepProjectId, exhibition.current]) useEffect(() => { const line = document.getElementById("line") const news = document.getElementById("news") if (line && news) { news.onscroll = (e) => { e.stopPropagation(); if ((line.clientHeight - 578) < news.scrollTop + 10) { setQuery({ ...query, page: query.page + 1 }) if (exhibition?.current?.dynamic?.length > 0) { dispatch(control.getLatestDynamic({ ...query, projectCorrelationId: pepProjectId, page: query.page + 1 })).then(res => { // news.scrollTop = news.scrollTop - 640 let data = querydata.current if (res.success) { let returnJudge = true for (let k in res.payload.data) { if (res.payload.data[k].length) { returnJudge = false break } } if (returnJudge) { return } if (exhibition?.current?.dynamic?.find(v => v.key == 'discovery')) { res.payload.data?.appear?.map(v => data.push({ seed: 'discovery', project: v.projectName, sources: v.alarmInfo?.sourceName, type: v.type, time: v.time, id: v.id, })) } if (exhibition?.current?.dynamic?.find(v => v.key == 'confirm')) { res.payload.data?.confirm?.map(v => data.push({ seed: 'confirm', project: v.projectName, sources: v.alarmInfo?.source, type: v.alarmInfo?.type, time: v.confirmTime, userName: v.userName, id: v.id, })) } if (exhibition?.current?.dynamic?.find(v => v.key == 'notice')) { res.payload.data?.notice?.map(v => data.push({ seed: 'notice', time: v.time, project: v.projectName, userName: v.userName?.map(u => u.name), alarmPushConfig: v.alarmPushConfig?.name, tactics: v.tactics, interval: v.tacticsParams?.interval, deviceProportion: v.tacticsParams?.deviceProportion, id: v.id, })) } data.sort((a, b) => (moment(a.time).isBefore(b.time) ? 1 : -1)) querydata.current = data setQueryData1(data) } }) } } } } }, [query]) useEffect(() => { const domProject = document.getElementById("news"); if (domProject) { if (domProject && newScrollbar) { newScrollbar.update(); } } const pomsList = document.getElementById("pomsList"); if (pomsList) { if (pomsList && pomsListScrollbar) { pomsListScrollbar.update(); } } const domProject1 = document.getElementById("overviewCalc"); if (domProject1) { if (domProject1 && overviewScrollbar) { overviewScrollbar.update(); } } const domProject2 = document.getElementById("member"); if (domProject2) { if (domProject2 && memberScrollbar) { memberScrollbar.update(); } } const domProject3 = document.getElementById("equipment"); if (domProject3) { if (domProject3 && equipmentScrollbar) { equipmentScrollbar.update(); } } const domProject4 = document.getElementById("web"); if (domProject4) { if (domProject4 && webScrollbar) { webScrollbar.update(); } } const domProject5 = document.getElementById("problems"); if (domProject5) { if (domProject5 && problemsScrollbar) { problemsScrollbar.update(); } } const domProject6 = document.getElementById("alarm"); if (domProject6) { if (domProject6 && alarmScrollbar) { alarmScrollbar.update(); } } }) const consoleToollink = () => { dispatch(control.getConsoleToollink()).then(res => { if (res.success) { setToolShow(res.payload.data) setToolData(res.payload.data?.length) } }) } //轮播 function startmarquee (name) { /* 函数startmarquee的参数: lh:文字一次向上滚动的距离或高度; speed:滚动速度; delay:滚动停顿的时间间隔; index:可以使封装后的函数应用于页面当中不同的元素; */ let t; let p = false let top = 0 let o = document.getElementById(name); if (t) clearInterval(t) if (o) { function start () { t = setInterval(() => { top += 5 o.scrollTop = top if (o.scrollTop >= o.scrollHeight / 2) top = 0, o.scrollTop = top }, 500); o.onmouseover = () => clearInterval(t) } o.onmouseout = () => start() setTimeout(start(), 1000); } } let Select = { overall: ['workbench', 'statistical', 'analyse', 'dynamic', 'tool'], workbench: ['project', 'data', 'app', 'device'], statistical: ['milestone', 'personnel', 'DeviceAccess', 'web', 'problem'], analyse: ['dataInterrupt', 'dataAbnormal', 'policyHit', 'videoException', 'appAbnormal', 'deviceAbnormal', 'problemAnalysis'], dynamic: ['discovery', 'notice', 'handle', 'confirm'], } let show = { overall: ['workbench', 'statistical', 'analyse', 'dynamic', 'tool'], workbench: ['project', 'data', 'app', 'device'], statistical: ['milestone', 'personnel', 'web', 'problem'], analyse: ['dataInterrupt', 'dataAbnormal', 'policyHit', 'videoException', 'appAbnormal', 'deviceAbnormal', 'problemAnalysis'], dynamic: ['discovery', 'notice', 'confirm'], } let listAll = [ { name: '关注的项目', sort: 1, key: 'project', data: workData?.projects || 0, img: 'url(/assets/images/console/lan_1.png)' }, { name: '数据告警', sort: 2, key: 'data', data: workData?.dataSurplus || 0, img: 'url(/assets/images/console/lv_1.png)', url: '/problem/dataAlarm/dataLnterrupt' }, { name: '应用告警', sort: 2, key: 'app', data: workData?.appSurplus || 0, img: 'url(/assets/images/console/hong_1.png)', url: '/problem/useAlarm/useAbnormal' }, { name: '设备告警', sort: 2, key: 'device', data: workData?.toolSurplus || 0, img: 'url(/assets/images/console/hong_1.png)', url: '/problem/deviceAlarm/deviceAbnormal' }, { name: '项目里程碑', sort: 1, key: 'milestone', }, { name: '相关成员', sort: 2, key: 'personnel', }, { name: '平台设备接入', sort: 3, key: 'DeviceAccess', }, { name: '关联web应用', sort: 4, key: 'web', }, { name: '异常&问题', sort: 5, key: 'problem', }, { name: '数据中断', sort: 1, key: 'dataInterrupt', }, { name: '数据异常', sort: 2, key: 'dataAbnormal', }, { name: '策略命中', sort: 3, key: 'policyHit', }, { name: '视频异常', sort: 4, key: 'videoException', }, { name: '应用异常', sort: 5, key: 'appAbnormal', }, { name: '设备异常', sort: 6, key: 'deviceAbnormal', }, { name: '问题处置效率分析', sort: 7, key: 'problemAnalysis', }, { name: '发现:系统主动感知到的异常问题动态', sort: 1, key: 'discovery', }, { name: '通知:系统通过邮件、短信、企业微信等方式通知到运维人员的动态', sort: 2, key: 'notice', }, { name: '处置:工单信息处理流程的动态', sort: 3, key: 'handle', }, { name: '确认:完结状态的信息动态', sort: 4, key: 'confirm', }, { name: '我的工作台', sort: 1, key: 'workbench', }, { name: '统计概览', sort: 2, key: 'statistical', }, { name: 'BI分析模块', sort: 3, key: 'analyse', }, { name: '最新动态', sort: 4, key: 'dynamic', }, { name: '我常用的工具', sort: 5, key: 'tool', }, ] useEffect(() => { attribute('workbench') }, [workData]) const attribute = (title) => { let take = localStorage.getItem(title) ? JSON.parse(localStorage.getItem(title)) : []; let data = Select[title].map(v => { let dataTitle = listAll.find(vv => v == vv.key) || {} return { name: dataTitle.name, value: dataTitle.key } }) let TableDisplay = take?.map(v => listAll?.find(vv => v == vv.key)) TableDisplay.sort((a, b) => a.sort - b.sort) exhibition.current = { ...exhibition.current, [title]: TableDisplay } setTableSetup([{ list: data }]) } return ( <>