import React, { useEffect, useState, useRef } from 'react'; import { connect } from 'react-redux'; import { Timeline, Card, Button, Modal, Form, Tooltip, Select, Radio, RadioGroup, Spin } from '@douyinfe/semi-ui'; import { push } from 'react-router-redux'; import { Setup, OutHidden } from "$components"; import ReactECharts from 'echarts-for-react'; import moment from "moment"; const AlarmChart = ({ dispatch, actions, user, history, projectPoms, loading, socket, pepProjectId, statisticOnline, strucSeries }) => { const { control, install, problem } = actions const [setup, setSetup] = useState(false); //设置是否显现 const [tableType, setTableType] = useState(''); //localStorage存储名 const [tableSetup, setTableSetup] = useState([]); //单一表格设置信息 const [long, setLong] = useState(''); //最新动态设置 const [pomsList, setPomsList] = useState([]); //项目 const [faultId, setFaultId] = useState(''); //项目id 故障数统计 const [onlineId, setOnlineId] = useState(''); //项目id 数据在线率 const [setData, setSetData] = useState(); //设置总数 const [radioStatistics, setRadioStatistics] = useState('day'); //故障数统计(日,周,月) const [radioRank, setRadioRank] = useState('day'); //故障数排名(日,周,月) const [dataAlarm, setDataAlarm] = useState({}); //故障数统计--数据类 const [videoAlarm, setVideoAlarm] = useState({}); //故障故障数统计--视频 const [useAlarm, setUseAlarm] = useState({}); //故障故障数统计--应用 const [behind, setBehind] = useState(true); //故障数统计下钻 const [behindShow, setBehindShow] = useState([]); //故障数统计展示 const [videoData, setVideoData] = useState([]); //视频故障统计 const [datumData, setDatumData] = useState([]); //数据故障统计 const [useData, setUseData] = useState([]); //应用故障统计 const [rankData, setRankData] = useState([]); //故障排名 const [onlineStruc, setOnlineStruc] = useState([]) const [online, setOnline] = useState([]) const [value, setValue] = useState([]) const [successionId, setSuccessionId] = useState(''); //项目id 数据连续率 const [seriesStruc, setSeriesStruc] = useState([]) //连续率 结构物数据 const [series, setSeries] = useState([]) //连续率 数据 const [seriesValue, setSeriesValue] = useState([]) //连续率 结构物Id const [sensorValue, setSensorValue] = useState([]) //连续率 测点Id const [sensorList, setSensorList] = useState([]) //连续率 测点数数据 const [statisticsSpin, setStatisticsSpin] = useState(false) //故障数统计 加载中 const [rankSpin, setRankSpin] = useState(false) //故障数排名 加载中 useEffect(() => { if (projectPoms?.length > 0) { let data = projectPoms?.filter(v => v.pepProjectIsDelete != 1)?.map(v => ({ value: v.id, label: v.pepProjectName || v.name })) setPomsList(data) } }, [projectPoms]) useEffect(async () => { if (projectPoms?.length > 0) { let data = await getData('day', pepProjectId, true, true) await getRank(data) setRadioStatistics('day') setRadioRank('day') setFaultId('') let ProjectId = pepProjectId ? (pepProjectId?.length > 0 ? pepProjectId.split(",")[0] : pepProjectId) : projectPoms[0]?.id await getStatisticOnline(ProjectId) //始终获取一个项目的数据 await getStrucSeries(ProjectId) //始终获取一个项目的数据 if (pepProjectId) { setPomsList(projectPoms?.filter(v => v.pepProjectIsDelete != 1 && ((pepProjectId?.length > 0 ? pepProjectId.split(",")?.map(p => Number(p)) : [pepProjectId]).includes(v.id)))?.map(v => ({ value: v.id, label: v.pepProjectName || v.name }))) if (!pepProjectId?.length > 0 || pepProjectId.split(",")?.length == 1) { setFaultId(Number(pepProjectId)) } } else { setPomsList(projectPoms?.filter(v => v.pepProjectIsDelete != 1)?.map(v => ({ value: v.id, label: v.pepProjectName || v.name }))) } } }, [pepProjectId, projectPoms]) //数据在线率 const getStatisticOnline = async (id) => { await dispatch(control.getStatisticOnline({ pepProjectId: id })).then(res => { if (res.success) { setOnlineId(Number(id)) let data = res.payload.data setOnlineStruc(data?.map(v => ({ value: v.strucId, label: v.strucName })) || []) setOnline(data?.slice(0, 10) || []) setValue(data?.map(v => v.strucId)?.slice(0, 10) || []) } }) } //数据连续率 const getStrucSeries = async (id) => { await dispatch(control.getStrucSeries({ pepProjectId: id })).then(res => { if (res.success) { let data = res.payload.data setSuccessionId(Number(id)) let struc = [] data?.forEach(f => { if (!struc?.find(h => h.value == f.structure)) { struc.push({ value: f.structure, label: f?.struc?.strucName }) } }) setSeriesStruc(struc) setSeriesValue(struc[0]?.value) let findStruc = data?.filter(d => d.structure == struc[0]?.value) setSeries(findStruc?.slice(0, 10) || []) setSensorList(findStruc?.map(v => ({ value: v.id, label: v.name })) || []) setSensorValue(findStruc?.map(v => v.id)?.slice(0, 10) || []) } }) } const getRank = async (data) => { let dataList = [] if (pepProjectId && (!pepProjectId?.length || pepProjectId.split(",")?.length == 1) || projectPoms?.legend == 1) { data?.AlarmData?.filter(p => p.State < 3)?.forEach(s => { let find = dataList?.find(a => a.StructureId == s.StructureId) if (find) { find.sum += 1 } else { dataList.push({ StructureId: s.StructureId, name: s.StructureName, sum: 1 }) } }) data?.AlarmVideo?.filter(p => !p.confirmTime)?.forEach(s => { s?.struc?.forEach(f => { let find = dataList?.find(a => a.id == s.StructureId) if (find) { find.sum += 1 } else { dataList.push({ StructureId: f.id, name: f.name, sum: 1 }) } }) }) } else { projectPoms?.filter(v => v.pepProjectIsDelete != 1)?.forEach(d => { let data1 = data?.AlarmData?.filter(v => v.pomsProject?.map(p => p.id)?.includes(d.id) && v.State < 3)?.length || 0 let data2 = data?.AlarmVideo?.filter(v => v.pomsProject?.map(p => p.id)?.includes(d.id) && !v.confirmTime)?.length || 0 dataList.push({ name: d.name || d.pepProjectName, sum: data1 + data2 }) }) } setRankData(dataList.sort((a, b) => b.sum - a.sum)?.slice(0, 5) || []) } const getData = async (radio, pepProjectId, diff1, diff2) => { if (diff2) setStatisticsSpin(true) if (diff1) setRankSpin(true) let data = {} await dispatch(control.getAlarmData({ pepProjectId: pepProjectId, startTime: moment().startOf(radio).format('YYYY-MM-DD HH:mm:ss') })).then((res) => { if (res.success) { if (diff1) { data.AlarmData = res.payload.data || [] } if (diff2) { setDatumData(res.payload.data || []) let group = { group1: { sum: 0, untreated: 0 }, group2: { sum: 0, untreated: 0 }, group3: { sum: 0, untreated: 0 }, group4: { sum: 0, untreated: 0 }, group5: { sum: 0, untreated: 0 } } res.payload.data?.forEach(v => { group['group' + v.AlarmGroup].sum += 1 if (v.State < 3) { group['group' + v.AlarmGroup].untreated += 1 } }) setDataAlarm(group) } } }) await dispatch(problem.getAlarmVideoList({ pepProjectId: pepProjectId, startTime: moment().startOf(radio).format('YYYY-MM-DD HH:mm:ss') })).then((res) => { if (res.success) { if (diff1) { data.AlarmVideo = res.payload.data || [] } if (diff2) { setVideoData(res.payload.data || []) let alarmData = { sum: 0, untreated: 0 } res.payload.data?.forEach(v => { alarmData.sum += 1 if (!v.confirmTime) { alarmData.untreated += 1 } }) setVideoAlarm(alarmData) } } }) if (diff2) { await dispatch(control.getAlarmUse({ pepProjectId: pepProjectId, startTime: moment().startOf(radio).format('YYYY-MM-DD HH:mm:ss') })).then((res) => { if (res.success) { setUseData(res.payload.data || []) let alarmData = { sum: 0, untreated: 0 } res.payload.data?.forEach(v => { alarmData.sum += 1 if (!v.confirmTime) { alarmData.untreated += 1 } }) setUseAlarm(alarmData) } }) } setStatisticsSpin(false) setRankSpin(false) return data } const behindHandle = (key) => { let show = [] switch (key) { case '数据中断': dispatch(problem.getAlarmDataGroup()).then((res) => { if (res.success) { let data = res.payload.data?.find(v => v.desc == '数据中断')?.unit || [] let sumData = datumData?.filter(s => s.AlarmGroup == 1) || [] data?.forEach(v => { let dataList = sumData?.filter(s => s.AlarmGroupUnit == v.id) || [] let untreated = dataList?.filter(s => s.State < 3)?.length || 0 show.push({ name: v.name, untreated: untreated, processed: dataList?.length - untreated, num: dataList?.length }) }) setBehindShow(show.sort((a, b) => b.num - a.num)?.slice(0, 5) || []) } }) break; case '数据异常': dispatch(problem.getAlarmDataGroup()).then((res) => { if (res.success) { let data = res.payload.data?.find(v => v.desc == '数据异常')?.unit || [] let sumData = datumData?.filter(s => s.AlarmGroup == 2) || [] data?.forEach(v => { let dataList = sumData?.filter(s => s.AlarmGroupUnit == v.id) || [] let untreated = dataList?.filter(s => s.State < 3)?.length || 0 show.push({ name: v.name, untreated: untreated, processed: dataList?.length - untreated, num: dataList?.length }) }) setBehindShow(show.sort((a, b) => b.num - a.num)?.slice(0, 5) || []) } }) break; case '策略命中': dispatch(problem.getAlarmDataGroup()).then((res) => { if (res.success) { let data = res.payload.data?.find(v => v.desc == '策略命中')?.unit || [] let sumData = datumData?.filter(s => s.AlarmGroup == 3) || [] data?.forEach(v => { let dataList = sumData?.filter(s => s.AlarmGroupUnit == v.id) || [] let untreated = dataList?.filter(s => s.State < 3)?.length || 0 show.push({ name: v.name, untreated: untreated, processed: dataList?.length - untreated, num: dataList?.length }) }) setBehindShow(show.sort((a, b) => b.num - a.num)?.slice(0, 5) || []) } }) break; case '视频异常': dispatch(problem.getAlarmVideoExceptionType()).then((res) => { if (res.success) { res.payload.data?.forEach(v => { let dataList = videoData?.filter(s => s.statusId == v.statusId) || [] let untreated = dataList?.filter(s => !s.confirmTime)?.length || 0 show.push({ name: v.describe, untreated: untreated, processed: dataList?.length - untreated, num: dataList?.length }) }) setBehindShow(show.sort((a, b) => b.num - a.num)?.slice(0, 5) || []) } }) setBehind(false) break; case '应用异常': [{ name: '接口报错', value: 'apiError ' }, { name: '加载超时', value: 'timeout' }, { name: '元素异常', value: 'element' }].forEach(v => { let dataList = useData?.filter(s => s.type == v.value) || [] let untreated = dataList?.filter(s => !s.confirmTime)?.length || 0 show.push({ name: v.name, untreated: untreated, processed: dataList?.length - untreated, num: dataList?.length }) }) setBehindShow(show.sort((a, b) => b.num - a.num)?.slice(0, 5) || []) break; case '设备异常': dispatch(problem.getAlarmDataGroup()).then((res) => { if (res.success) { let data = res.payload.data?.find(v => v.desc == '掉线' || v.desc == '不活跃')?.unit || [] let sumData = datumData?.filter(s => s.AlarmGroup == 4 || s.AlarmGroup == 5) || [] data?.forEach(v => { let dataList = sumData?.filter(s => s.AlarmGroupUnit == v.id) || [] let untreated = dataList?.filter(s => s.State < 3)?.length || 0 show.push({ name: v.name, untreated: untreated, processed: dataList?.length - untreated, num: dataList?.length }) }) setBehindShow(show.sort((a, b) => b.num - a.num)?.slice(0, 5) || []) } }) break; } setBehind(false) } return (<> {/* 数据分析 */} {