import React, { useState, useEffect, useRef } from 'react'; import styles from './index.less'; import PropTypes from 'prop-types'; import { Tag, Tooltip, Modal } from 'antd'; import { EnvironmentOutlined } from '@ant-design/icons'; import { monitorService } from './api'; import moment from 'moment'; import classnames from 'classnames'; import { switchTimeToPeriod } from './utils'; import NormChart from './NormChart/NormChart'; import { Swiper, SwiperSlide } from 'swiper/react'; import 'swiper/swiper.min.css'; import 'swiper/components/pagination/pagination.min.css'; import 'swiper/components/navigation/navigation.min.css'; import SwiperCore, { Autoplay, Pagination, Navigation } from 'swiper/core'; SwiperCore.use([Autoplay, Pagination, Navigation]); /* * 1. 获取当前所有数据; * 2. 倒序滚动播放; * 3. 初始化进入时,取截止到当前时间为止的所有的实时报警数据。 * 4. 播放结束后,重新获取实时报警数据进行第二轮的播放。 * */ const InfoItem = ({ info }) => { const returnClassName = (type, key) => { let _className = ''; if (type === '普通') { _className = 'normal'; } else if (type === '紧急') { _className = 'warning'; } return `${_className}${key}`; }; const { alertLevel, startTime, stationName, alertMsg, deviceAddress } = info; return ( <div className={styles[returnClassName(alertLevel, 'Wrapper')]}> <Tag className={styles[returnClassName(alertLevel, 'Tag')]}>{alertLevel}</Tag> <span className={classnames(styles.time, styles.fontSize13)}>{startTime}</span> <Tooltip title={deviceAddress} placement={'topLeft'}> <span className={styles.location}> <EnvironmentOutlined style={{ fontSize: 12, color: '#666666', marginRight: 5, verticalAlign: 'middle' }} /> {deviceAddress} </span> </Tooltip> <Tooltip title={alertMsg} placement={'topLeft'}> <span className={styles[returnClassName(alertLevel, 'Content')]}>{alertMsg}</span> </Tooltip> <div className={styles.periodWrapper}> <span className={styles.period}>{switchTimeToPeriod(startTime)}</span> </div> </div> ); }; const AlarmScrollAssembly = (props) => { const [modalVisible, setModalVisible] = useState(false); const [currentInfo, setCurrentInfo] = useState({}); const constanceRef = useRef({ level: '1,2', type: '直接取值,取变化量,取变化率,取是否', userID: window.globalConfig.userInfo.OID, userAccess: true, }); const [realTimeDataList, setRealTimeDataList] = useState(null); const getDeviceNumber = () => { return monitorService.getEquipmentInfo({ deviceTypes: props.deviceType, pageIndex: 1, pageSize: 1, ...constanceRef.current, }); }; const getRealTimeData = (pagination) => { return monitorService.GetAlarmListRealTime({ deviceType: props.deviceType, ...constanceRef.current, pageIndex: pagination.pageIndex, pageSize: pagination.pageSize, userAccess: props.userAccess === void 0 ? true : props.userAccess, /* dateFrom: moment().subtract(1, 'days').format('YYYY-MM-DD 00:00:00'), dateTo: moment().format('YYYY-MM-DD 23:59:59'),*/ }); }; const getData = async () => { let firstRequest = await getDeviceNumber(); let secondRequest = await getRealTimeData({ pageIndex: 1, pageSize: firstRequest.data.totalCount, }); setRealTimeDataList(secondRequest.data.list); }; useEffect(() => { getData(); }, []); return ( <div className={styles.alarScrollAssembly} id={'alarmListDiv'}> {realTimeDataList && realTimeDataList.length ? ( <Swiper slidesPerView={1} modules={[Pagination]} pagination={{ type: 'fraction', formatFractionCurrent: (num) => `第${num}条`, formatFractionTotal: (num) => `共${num}条`, }} navigation autoplay={{ delay: 3000, disableOnInteraction: false, }} loop direction="vertical" onSlideChange={(e) => { if (e.activeIndex === realTimeDataList.length - 1) getData(); }} > {realTimeDataList.map((item, index) => { return ( <SwiperSlide key={index} virtualIndex={index} onClick={() => { setCurrentInfo(item); setModalVisible(true); }} > <InfoItem key={index} info={item} /> </SwiperSlide> ); })} </Swiper> ) : ( '' )} {modalVisible && ( <Modal visible={modalVisible} onCancel={() => setModalVisible(false)} width={'80%'} destroyOnClose > <NormChart info={currentInfo} deviceType={currentInfo.deviceType} deviceCode={currentInfo.stationCode} /> </Modal> )} </div> ); }; AlarmScrollAssembly.defaultProps = { deviceType: '二供泵房,二供机组', }; AlarmScrollAssembly.propTypes = { deviceType: PropTypes.string, }; export default AlarmScrollAssembly;