import React, { useEffect, useState } from 'react' import { connect } from 'react-redux' import { IconAlertCircle } from '@douyinfe/semi-icons' import { Button, Form, Modal, Skeleton, Pagination, TextArea, Tooltip } from "@douyinfe/semi-ui"; import Statistics from '../components/statistics' import TableData from '../components/tableData' import SideSheets from '../components/sideSheet' import Set from './set' import { Setup, OutHidden } from "$components"; import moment from "moment"; import '../style.less' import { request } from 'screenfull'; import { useRef } from 'react'; import { render } from 'less'; const DataAlarm = ({ match, dispatch, actions, user, loading, socket, iotVcmpWeb }) => { let route = match.url.substring(match.url.lastIndexOf("/") + 1, match.url.length) const { problem } = actions const [abnormalLenght, setAbnormalLenght] = useState(0) //异常数量 const [collect, setCollect] = useState([]) //搜索结构 const [setup, setSetup] = useState(false); //表格设置是否显现 const [tableSetup, setTableSetup] = useState([]); //单一表格设置信息 const [exhibition, setExhibition] = useState([]); //表格结构 const [anomaly, setAnomaly] = useState(); //单条异常对应的图片 const [pictures, setPictures] = useState(false); //单条异常对应的图片是否显示 const [confirm, setConfirm] = useState(false); //表格确认弹框 const [ifBulk, setIfBulk] = useState(false); //是否批量确认 const [content, setContent] = useState(false); //确认内容 const [selected, setSelected] = useState([]) //表格被勾选项 const [genre, setGenre] = useState([]) //搜索类型 const [checkPop, setCheckPop] = useState(false) //查看弹框是否显现 const [alarmId, setAlarmId] = useState(false) //查看alarmId const [query, setQuery] = useState({ limit: 10, page: 0 }) //分页 const [tableData, setTableData] = useState([]) //表格数据 const [videoModal, setVideoModal] = useState(false) //视频播放弹框 const [videoData, setVideoData] = useState({}) //视频播放参数 const [videoToken, setVideoToken] = useState() //视频token const TextAreaApi = useRef('') const tableType = { dataLnterrupt: 'dataLnterrupt', dataAbnormal: 'dataAbnormal', strategyHit: 'strategyHit', videoAbnormal: 'videoAbnormal', useAbnormal: 'useAbnormal', deviceAbnormal: 'deviceAbnormal' } const statistic = { dataLnterrupt: '数据中断统计', dataAbnormal: '数据异常统计', strategyHit: '策略命中统计', videoAbnormal: '视频异常统计', useAbnormal: '应用半自动化巡检', deviceAbnormal: '设备异常统计' } useEffect(() => { if (route) { //初始化表格显示设置 let data = columns[route] localStorage.getItem(tableType[route]) == null ? localStorage.setItem( tableType[route], JSON.stringify(data) ) : ""; } attribute(tableType[route], route); //视频平台token dispatch(problem.getVcmpAuth({})).then((res) => { if (res.success) setVideoToken(res.payload.data?.token) }) }, []) // console.log(videoData); //搜索结构 const collectData = { dataLnterrupt: [ //数据中断(dataLnterrupt) { name: '搜索', field: '1' }, { name: '中断类型', field: 'groupUnitId', data: genre }, { name: '中断状态', field: 'state', data: [ { name: '当前', value: 'new' }, { name: '历史', value: 'histroy' }] }], dataAbnormal: [ //数据异常(dataAbnormal) { name: '搜索', field: '1' }, { name: '异常类型', field: 'groupUnitId', data: genre }, { name: '异常状态', field: 'state', data: [ { name: '当前', value: 'new' }, { name: '历史', value: 'histroy' }] }], strategyHit: [ // 策略命中(strategyHit) { name: '搜索', field: '1' }, { name: '策略类型', field: 'groupUnitId', data: genre }, { name: '命中状态', field: 'state', data: [ { name: '当前', value: 'new' }, { name: '历史', value: 'histroy' }] }], videoAbnormal: [ // 视频异常(videoAbnormal) { name: '搜索', field: '1' }, { name: '设备类型', field: 'kindId', data: genre, }, { name: '异常状态', field: 'state', data: [ { name: '当前', value: 'new' }, { name: '历史', value: 'histroy' }] }], useAbnormal: [ // 应用异常(useAbnormal) { name: '搜索', field: 'keyword' }, { name: '异常类型', field: 'errType', data: [ { name: '接口报错', value: 'apiError ' }, { name: '加载超时', value: 'timeout' }, { name: '元素异常', value: 'element' }] }, { name: '异常状态', field: 'confirmState', data: [ { name: '当前', value: 'unconfirmed' }, { name: '历史', value: 'confirmd' }] }], deviceAbnormal: [ // 设备告警(deviceAbnormal) { name: '搜索', field: '1' }, { name: '设备类型', field: 'groupUnitId', data: genre }, { name: '异常状态', field: 'state', data: [ { name: '当前', value: 'new' }, { name: '历史', value: 'histroy' }] }, { name: '异常类型', field: '4', data: [ { name: '离线', value: '11' }] } ], common: { name: '告警时间', field: 'time' } } //表格设置信息 const tableList = { dataLnterrupt: ['index', 'projectName', 'StructureName', 'SourceName', 'AlarmGroupUnit', 'AlarmCodeName', 'sustainTime', 'createTime', 'AlarmContent', 'CurrentLevel', 'updateTime', 'detailCount', 'confirm', 'confirmTime',], dataAbnormal: ['index', 'projectName', 'StructureName', 'SourceName', 'type', 'alarmType', 'createTime', 'sustainTime', 'AlarmContent', 'CurrentLevel', 'updateTime', 'detailCount', 'confirm', 'confirmTime'], strategyHit: ['index', 'projectName', 'StructureName', 'SourceName', 'Strategy', 'State', 'createTime', 'sustainTime', 'AlarmContent', 'CurrentLevel', 'updateTime', 'detailCount', 'confirm', 'confirmTime'], videoAbnormal: ['index', 'projectName', 'StructureName', 'SourceName', 'station', 'cameraKindId', 'venderName', 'point', 'cameraSerialNo', 'cameraChannelNo', 'platform', 'AlarmContent', 'resolve', 'createTime', 'updateTime', 'confirm', 'confirmTime', 'camerOnline'], useAbnormal: ['index', 'projectName', 'appName', 'url', 'type', 'alarmContent', 'createTime', 'updateTime', 'confirm', 'confirmTime'], deviceAbnormal: ['index', 'projectName', 'StructureName', 'SourceName', 'station', 'alarmContent', 'venderName', 'AlarmContent', 'AlarmCodeName', 'createTime', 'updateTime', 'confirm', 'confirmTime'], } //表格默认配置信息 const columns = { dataLnterrupt: ['projectName', 'StructureName', 'SourceName', 'AlarmGroupUnit', 'AlarmContent', 'AlarmCodeName', 'createTime', 'updateTime',], dataAbnormal: ['projectName', 'StructureName', 'SourceName', 'AlarmContent', 'AlarmCodeName', 'createTime', 'updateTime'], strategyHit: ['projectName', 'StructureName', 'SourceName', 'Strategy', 'AlarmContent', 'CurrentLevel', 'detailCount', 'updateTime'], videoAbnormal: ['projectName', 'StructureName', 'SourceName', 'venderName', 'cameraKindId', 'AlarmContent', 'createTime', 'updateTime'], useAbnormal: ['appName', 'projectName', 'url', 'type', 'alarmContent', 'createTime', 'updateTime'], deviceAbnormal: ['projectName', 'StructureName', 'SourceName', 'alarmContent', 'station', 'AlarmContent', 'createTime', 'updateTime'], } //所有表格信息 const columnAll = [ { name: "序号", sort: 1, value: "index", render: (_, r, index) => { return index + 1; }, }, { name: '问题编号', sort: 1, value: 'serialNumber', render: (_, r, index) => r.serialNumber }, { name: '项目名称', sort: 3, value: 'projectName', render: (_, r, index) => { return <> {r.projectName?.map((v, index) => { return v.name ?
{OutHidden({ number: 7, name: v.name })}
{v.state}
: "" }) } } }, { name: '结构物名称', sort: 4, value: 'StructureName', render: (_, r, index) => { if (route == 'videoAbnormal') { return r.StructureName?.map((v, index) =>
{v.name}
) } else { return r.StructureName } } }, { name: '告警源', sort: 2, value: 'SourceName', render: (_, r, index) => { let data = '' if (route == 'dataLnterrupt' || route == 'dataAbnormal') { data = '传感器' } if (route == 'strategyHit') data = '测点' return r.SourceName ?
{r.SourceName}
{data ?
{data}
: ""}
: "" } }, { name: '测点', sort: 4.1, value: 'point', render: (_, r, index) => r.station?.map(v =>
{v.name}
) }, { name: '中断类型', sort: 6, value: 'AlarmGroupUnit' }, { name: '告警信息', sort: 5, value: 'AlarmContent' }, { name: '常见原因', sort: 7, value: 'AlarmCodeName' }, { name: '产生时间', sort: 22, value: 'createTime', render: (_, r, index) =>
{r.createTime || '无'}
}, { name: '更新时间', sort: 23, value: 'updateTime', render: (_, r, index) =>
{r.updateTime || '无'}
}, // { name: '服务器地址', sort: 12, value: '9' }, { name: '告警等级', sort: 13, value: 'CurrentLevel', render: (_, r, index) => { let data = { 1: '一级', 2: '二级', 3: '三级' } return
{data[r.CurrentLevel]}
} }, { name: '产生次数', sort: 19, value: 'detailCount', render: (_, r, index) => r.detailCount + '次' }, { name: '确认信息', sort: 20, value: 'confirm', render: (_, r, index) => { return r.State == 3 ? '无' : r.State == 4 ? r.confirm : r.confirm || '未确认' } }, { name: '确认/恢复时间', sort: 21, value: 'confirmTime', render: (_, r, index) =>
{r.confirmTime ? r.confirmTime : "无"}
}, { name: '持续时间', sort: 19.5, value: 'sustainTime', render: (_, r, index) => { // console.log(r.updateTime); let time = moment(r.updateTime).diff(moment(r.createTime), 'seconds') // console.log(time); return time < 60 ? '< 1分钟' : time > 3600 ? Math.floor(time / 3600) + '小时' + Math.floor((time - Math.floor(time / 3600) * 3600) / 60) + '分钟' : Math.floor((time - Math.floor(time / 3600) * 3600) / 60) + '分钟' } }, { name: '异常信息', sort: 14, value: 'alarmContent', render: (_, r, index) => { return <>{r.alarmContent} {r.screenshot ? (setAnomaly(r.screenshot), setPictures(true))} /> : ""} } }, { name: '异常原因', sort: 8, value: 'alarmType' }, { name: '策略类型', sort: 6, value: 'Strategy' }, { name: '命中状态', sort: 15, value: 'State', render: (_, r, index) => { if (r.State == 3 || r.State == 4) { return '历史' } return '当前' } }, { name: '位置信息', sort: 11, value: 'station', render: (_, r, index) => r.station?.map(v =>
{v.position}
) }, { name: '设备类型', sort: 6, value: 'cameraKindId', render: (_, r, index) => { } }, { name: '设备厂家', sort: 10, value: 'venderName', render: (_, r, index) => r.platform ? '未知' : r.venderName }, { name: '通道号', sort: 10.1, value: 'cameraChannelNo' }, { name: '序列号', sort: 10.2, value: 'cameraSerialNo' }, { name: '接入方式', sort: 9, value: 'platform', render: (_, r, index) => { let accessType = { yingshi: "萤石云", nvr: "NVR", ipc: "IPC", cascade: "级联" } return accessType[r.platform] || '无' } }, { name: '应用名称', sort: 2, value: 'appName' }, { name: 'URL地址', sort: 16, value: 'url' }, { name: '异常类型', sort: 6, value: 'type' }, { name: '解决方案', sort: 17, value: 'resolve', render: (_, r, index) => r.resolve?.map(v =>
{v.resolve}
) }, { name: '在离线', sort: 18, value: 'camerOnline', render: (_, r, index) => { let data = { ON: '在线', ONLINE: "在线", OFF: "离线" } return data[r.camerOnline] || '未知' } }, { name: '操作', sort: 25, value: 'text', render: (_, r, index) => { return
{r.State && r.State >= 0 && r.State < 3 || route && ['videoAbnormal', 'useAbnormal'].includes(route) && !r.confirmTime ? : r.State == 3 ? : } {route && ['dataLnterrupt', 'dataAbnormal', 'strategyHit'].includes(route) ? <> : route == 'videoAbnormal' ? <> : "" }
} }, ] const attribute = (name, route) => { let arr = localStorage.getItem(name) ? JSON.parse(localStorage.getItem(name)) : []; // console.log(arr); if (route) { let setup = tableList[route].map(v => columnAll.find(vv => v == vv.value)) let data = [] // if (tableType[route] == 'dataAbnormal') { // data = ['AlarmCodeName'] // data.splice(1, 0, ...arr) // } else { data.splice(1, 0, ...arr, 'text') // } // console.log(data) // let TableDisplay = [] let TableDisplay = data?.map(v => { let datas = columnAll?.find(vv => v == vv.value) if (datas) { return { title: datas.name, sort: datas.sort, dataIndex: datas.value, rowKey: datas.value, render: datas.render } } }) TableDisplay.sort((a, b) => a.sort - b.sort) // console.log(TableDisplay); // console.log(setup); setExhibition(TableDisplay) setTableSetup([{ list: setup }]) } // for (let i = 0; i < arr.length; i++) { // let colum = column.filter((item) => { // return item.key === arr[i]; // }); // columns.splice(i + 2, 0, colum[0]); // } // setSetupp(columns); } // console.log(selected); return ( // route=='dataLnterrupt'|| route=='dataAbnormal'|| route=='strategyHit'?
{/* 滞留提醒 */}
{abnormalLenght > 0 ?
当前滞留5个工单即将超时,请尽快处理!
: ""}
{setup ? ( { setSetup(false); attribute(tableType[route], route); // setcameraSetup(false); }} /> ) : ( "" )} {pictures ? setPictures(false)} > : ""} {confirm ? setConfirm(false)} onOk={() => { if (route == 'useAbnormal') { TextAreaApi.current.validate().then((v) => { dispatch(problem.postApiConfirm({ appAlarmId: selected, confirm: content })).then(res => { if (res.success) { setConfirm(false) setSelected([]) setQuery({ limit: query.limit, page: query.page }) } }) }) } else if (route == 'videoAbnormal') { TextAreaApi.current.validate().then((v) => { dispatch(problem.putAlarmVideoConfirm({ alarmId: selected, content: content })).then(res => { if (res.success) { setConfirm(false) setSelected([]) setQuery({ limit: query.limit, page: query.page }) } }) }) } else { TextAreaApi.current.validate().then((v) => { dispatch(problem.putAlarmdataConfirm({ alarmId: selected, content: content })).then(res => { if (res.success) { setConfirm(false) let data = tableData?.map(v => { if (selected.find(vv => vv == v.key)) { return { ...v, confirm: '告警确认:' + content, confirmTime: moment().format("YYYY-MM-DD HH:mm:ss"), State: 4 } } else { return { ...v } } }) || tableData setTableData(data) setConfirm(false) setSelected([]) // console.log(data) } }) }) } }} >
console.log(values)} getFormApi={(formApi) => (TextAreaApi.current = formApi)} > setContent(e)} /> {(() => { let data if (selected.length == 1) { data = tableData.find(v => v.key == selected[0]) } return data ?
当前告警源-{data?.SourceName},在项目{data?.projectName?.map((v, index) => { if (index > 0) { return '、' + v.name } else { return v.name } })}中被多次绑定(可能拥有不同的名称),确认后,该设备的同类型告警也会被一同确认。
: "" })()}
: ""} {videoModal ? setVideoModal(false)} onOk={() => { }} >
: ""} {checkPop ? { setCheckPop(false) }} /> : "" }
// : ) } function mapStateToProps (state) { const { auth, global, members, webSocket } = state return { // loading: members.isRequesting, user: auth.user, actions: global.actions, iotVcmpWeb: global.iotVcmpWeb, // members: members.data, // socket: webSocket.socket } } export default connect(mapStateToProps)(DataAlarm)