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 const Control = (props) => { const { dispatch, actions, user, loading, socket, pepProjectId } = props const { control, install } = actions const [timelineList, setTimelineList] = useState(['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''])//最新动态列表 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 [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: 10, page: 0, projectCorrelationId: '', types: '1,2,3,4' }); //最新动态 const [querydata, setQueryData] = useState([]); //最新动态数据 const [long, setLong] = useState(''); //最新动态设置 const [pomsList, setPomsList] = useState([]); //项目 const [projectId, setProjectId] = useState(''); //项目id const exhibition = useRef({ workbench: [], statistical: [] }) //页面结构 const FormApi = useRef() // websocket 使用测试 useEffect(() => { if (socket) { socket.on('alarmSendSocket', function (msg) { console.info(msg); if (msg.type == "alarmAppear") {//告警出现 } else if (msg.type == "alarmConfirm") {//告警确认 } else if (msg.type == "alarmNotice") {//通知 } //console.info(msg); let a = msg; }); return () => { socket.off("alarmSendSocket") } } }, [socket]) 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) }) }, []) useEffect(() => { if (pepProjectId) setProjectId('') if (!pepProjectId) { dispatch(install.getProjectPoms({ global: 1 })).then((res) => { //获取已绑定项目 if (res.success) { 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) } }) } if (!projectId) { // 工作台数据请求 dispatch(control.getConsoleCount({ pepProjectId: pepProjectId })).then(res => { if (res.success) setWorkData(res.payload.data) }) // 查询BI分析数据-数据 dispatch(control.getDataAlarmsAggDay({ pepProjectId: pepProjectId })).then(res => { if (res.success) setDataBI(res.payload.data) }) //查询BI分析数据-视频异常 dispatch(control.getVideoAlarmsAggDay({ pepProjectId: pepProjectId })).then(res => { if (res.success) setVideoBI(res.payload.data) }) //查询BI分析数据-应用 dispatch(control.getAppAlarmsAggDay({ pepProjectId: pepProjectId })).then(res => { if (res.success) setAppBI(res.payload.data) }) dispatch(control.getAlarmsHandleStatistics({ pepProjectId: pepProjectId })).then(res => { if (res.success) setEfficiencyBI(res.payload.data[0]) }) } // 统计概览--异常&问题 dispatch(control.getConsoleAbnormal({ pepProjectId: pepProjectId || projectId })).then(res => { if (res.success) { if (res.payload.data?.length > 4) { setProblemsList([...res.payload.data, ...res.payload.data]) startmarquee(500, 2000, 'problems') } else { setProblemsList(res.payload.data) } } }) // 统计概览--相关成员与web应用 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]) startmarquee(600, 2000, 'member') } else { setMemberList(res.payload.data?.personnel) } if (res.payload.data?.webApp?.length > 3) { setWebList([...res.payload.data?.webApp, ...res.payload.data?.webApp]) startmarquee(600, 2000, 'web') } else { setWebList(res.payload.data?.webApp) } } }) }, [pepProjectId, projectId]) useEffect(() => { //查询最新动态 if (exhibition?.current?.dynamic?.length > 0) { dispatch(control.getLatestDynamic({ ...query, projectCorrelationId: pepProjectId })).then(res => { console.log(res.payload.data); 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, })) } 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, // confirmContent:v.confirmContent, })) } data.sort((a, b) => { if (moment(a.time).isBefore(b.time)) { return 1 } else { return -1 } }) console.log(data); setQueryData(data) } }) } else { setQueryData([]) } }, [pepProjectId, query, exhibition.current]) useEffect(() => { const domProject = document.getElementById("news"); if (domProject) { newScrollbar = new PerfectScrollbar("#news", { suppressScrollX: true, }); if (domProject && newScrollbar) { newScrollbar.update(); } } const pomsList = document.getElementById("pomsList"); if (pomsList) { pomsListScrollbar = new PerfectScrollbar("#pomsList", { suppressScrollX: true, }); if (pomsList && pomsListScrollbar) { pomsListScrollbar.update(); } } const domProject1 = document.getElementById("overview"); if (domProject1) { overviewScrollbar = new PerfectScrollbar("#overview", { suppressScrollY: true, }); if (domProject1 && overviewScrollbar) { overviewScrollbar.update(); } } const domProject2 = document.getElementById("member"); if (domProject2) { memberScrollbar = new PerfectScrollbar("#member", { suppressScrollX: true, }); if (domProject2 && memberScrollbar) { memberScrollbar.update(); } } const domProject3 = document.getElementById("equipment"); if (domProject3) { equipmentScrollbar = new PerfectScrollbar("#equipment", { suppressScrollX: true, }); if (domProject3 && equipmentScrollbar) { equipmentScrollbar.update(); } } const domProject4 = document.getElementById("web"); if (domProject4) { webScrollbar = new PerfectScrollbar("#web", { suppressScrollX: true, }) if (domProject4 && webScrollbar) { webScrollbar.update(); } } const domProject5 = document.getElementById("problems"); if (domProject5) { problemsScrollbar = new PerfectScrollbar("#problems", { suppressScrollX: true, }); if (domProject5 && problemsScrollbar) { problemsScrollbar.update(); } } const domProject6 = document.getElementById("alarm"); if (domProject6) { alarmScrollbar = new PerfectScrollbar("#alarm", { suppressScrollY: true, }); if (domProject6 && alarmScrollbar) { alarmScrollbar.update(); } } // ACTION 示例 // dispatch(actions.example.getMembers(user.orgId)) }) const consoleToollink = () => { dispatch(control.getConsoleToollink()).then(res => { if (res.success) setToolShow(res.payload.data) }) } function startmarquee (speed, delay, name) { /* 函数startmarquee的参数: lh:文字一次向上滚动的距离或高度; speed:滚动速度; delay:滚动停顿的时间间隔; index:可以使封装后的函数应用于页面当中不同的元素; */ var t; var p = false; let top = 0 var o = document.getElementById(name); if (o) { o.onmouseover = () => p = true o.onmouseout = () => p = false o.scrollTop = 0; const start = () => { t = setInterval(() => { if (!p) (top += 10, o.scrollTop = top) if (p) (clearInterval(t), setTimeout(start, delay)) if (o.scrollTop >= o.scrollHeight / 2) (top = 0, o.scrollTop = 0) }, speed); } 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 }]) } console.log(memberList) return ( <>