240 lines
8.0 KiB
JavaScript
240 lines
8.0 KiB
JavaScript
// 核心库
|
||
import React from 'react'
|
||
import { connect } from 'dva'
|
||
// 组件库
|
||
import { Form, Radio, Row, Col, Collapse } from 'antd'
|
||
import { IFComponent, LayoutCard } from '@woowalker/feui'
|
||
import CommonChart from '../../Chart/CommonChart'
|
||
// 工具库
|
||
import moment from 'moment'
|
||
// 样式
|
||
import styles from './index.css'
|
||
|
||
const { Panel } = Collapse
|
||
|
||
class EmAppRealTimePage extends React.Component {
|
||
constructor (props) {
|
||
super(props)
|
||
this.state = {
|
||
data: [],
|
||
realData: [],
|
||
showData: [],
|
||
chartData: {},
|
||
heartbertData: [],
|
||
num: 1,
|
||
time: moment().add(-6, 'hour').format('YYYY-MM-DD HH:mm:ss') + "," + moment().format('YYYY-MM-DD HH:mm:ss')
|
||
}
|
||
this.timer = -1
|
||
this._unmounted = false
|
||
}
|
||
|
||
componentDidMount () {
|
||
this.getRealTimeData()
|
||
this.getChartData()
|
||
}
|
||
|
||
componentWillUnmount () {
|
||
this._unmounted = true
|
||
clearTimeout(this.timer)
|
||
}
|
||
|
||
getRealTimeData = () => {
|
||
const json = {
|
||
OrgId: this.props.login.OrgId,
|
||
Parameter1: this.props.formParam.Parameter1,
|
||
Parameter2: this.props.login.userId,
|
||
Parameter3: this.props.data.id,
|
||
Parameter4: this.props.data.isNode,
|
||
}
|
||
this.props.dispatch({
|
||
type: 'app/getDataByPost',
|
||
url: 'EM/Monitoring/GetAppRealTimeData',
|
||
payload: json
|
||
}).then(res => {
|
||
res && !this._unmounted && this.setState({
|
||
data: res.Data,
|
||
realData: res.realData,
|
||
showData: res.showData,
|
||
heartbertData: res.heartbertData
|
||
})
|
||
}).finally(() => {
|
||
if (!this._unmounted) {
|
||
// 一个接口请求完之后,再定时进行请求
|
||
clearTimeout(this.timer)
|
||
this.timer = setTimeout(this.getRealTimeData, 5000)
|
||
}
|
||
})
|
||
}
|
||
|
||
getChartData = () => {
|
||
this.props.dispatch({
|
||
type: 'app/getDataByPost',
|
||
url: 'EM/Monitoring/GetVarIdByApp',
|
||
payload: {
|
||
OrgId: this.props.login.OrgId,
|
||
Parameter3: this.props.data.id,
|
||
Parameter4: this.props.data.isNode
|
||
}
|
||
}).then(res => {
|
||
if (res) {
|
||
this.props.dispatch({
|
||
type: 'app/getDataByPost',
|
||
url: 'FM/FMSrcTag/GetchartPageApiEntities',
|
||
payload: {
|
||
OrgId: this.props.login.OrgId,
|
||
Parameter1: this.state.time,
|
||
Keyword: res
|
||
}
|
||
}).then(response => {
|
||
if (response) {
|
||
this.setState({
|
||
chartData: {
|
||
xAxis: response.XAxis[0].Data,
|
||
yAxis: response.YAxis,
|
||
data: response.Data
|
||
}
|
||
})
|
||
}
|
||
})
|
||
}
|
||
})
|
||
}
|
||
|
||
handleChange = (e) => {
|
||
let time = ''
|
||
const num = e.target.value
|
||
switch (num) {
|
||
case 1:
|
||
time = moment().add(-6, 'hour').format('YYYY-MM-DD HH:mm:ss') + "," + moment().format('YYYY-MM-DD HH:mm:ss')
|
||
break
|
||
case 2:
|
||
time = moment().add(-12, 'hour').format('YYYY-MM-DD HH:mm:ss') + "," + moment().format('YYYY-MM-DD HH:mm:ss')
|
||
break
|
||
case 3:
|
||
time = moment().add(-1, 'day').format('YYYY-MM-DD HH:mm:ss') + "," + moment().format('YYYY-MM-DD HH:mm:ss')
|
||
break
|
||
default:
|
||
break
|
||
}
|
||
this.setState({ num, time }, this.getChartData)
|
||
}
|
||
|
||
render () {
|
||
let bg_class = styles.electric_bg
|
||
let status_class = styles.electric_status
|
||
let curr_class = styles.electric_curr
|
||
let sum_class = styles.electric_sum
|
||
|
||
switch (this.props.formParam.Parameter1) {
|
||
case 'Water':
|
||
bg_class = styles.water_bg
|
||
status_class = styles.water_status
|
||
curr_class = styles.water_curr
|
||
sum_class = styles.water_sum
|
||
break
|
||
case 'Hot':
|
||
bg_class = styles.hot_bg
|
||
status_class = styles.hot_status
|
||
curr_class = styles.hot_curr
|
||
sum_class = styles.hot_sum
|
||
break
|
||
case 'Gas':
|
||
bg_class = styles.gas_bg
|
||
status_class = styles.gas_status
|
||
curr_class = styles.gas_curr
|
||
sum_class = styles.gas_sum
|
||
break
|
||
default:
|
||
break
|
||
}
|
||
const { data, realData, chartData, showData } = this.state
|
||
return (
|
||
<div className='scroll_page'>
|
||
<LayoutCard style={{ marginBottom: 16 }}>
|
||
<Row gutter={16}>
|
||
<Col span={4} style={{ marginTop: 48 }}>
|
||
<div className={styles.realTimePage_boxWrap}>
|
||
{
|
||
data.map(item => {
|
||
const color = item.State === 0 ? '#a4abb6' : item.State === 1 ? '#70b603' : '#d9001b'
|
||
return (
|
||
<div
|
||
key={item.Key}
|
||
className={styles.meter_box}
|
||
>
|
||
<div className={bg_class}>
|
||
<div className={status_class} style={{ backgroundColor: color }} />
|
||
<div className={curr_class}>
|
||
<span>{item.VarName}({item.Unit})</span>
|
||
<span>{item.Value}</span>
|
||
</div>
|
||
<div className={sum_class}>
|
||
{
|
||
showData.map((attr, attrIndex) => {
|
||
const value = `${attr.Value}${attr.Unit === 'None' || attr.Unit === null ? '' : attr.Unit}`
|
||
return <p key={`${attr.Name}_${attrIndex}`} className={styles.sum_text}>{`${attr.Name}:${value}`}</p>
|
||
})
|
||
}
|
||
</div>
|
||
</div>
|
||
<p className={styles.meter_title}>{item.ApplianceName}</p>
|
||
<p className={styles.meter_detail}>{item.NodeName}</p>
|
||
</div>
|
||
)
|
||
})
|
||
}
|
||
</div>
|
||
</Col>
|
||
<Col span={20} style={{ textAlign: 'center' }}>
|
||
<Radio.Group value={this.state.num} buttonStyle="solid" onChange={this.handleChange}>
|
||
<Radio.Button value={1}>过去六小时</Radio.Button>
|
||
<Radio.Button value={2}>过去十二小时</Radio.Button>
|
||
<Radio.Button value={3}>过去二十四小时</Radio.Button>
|
||
</Radio.Group>
|
||
<CommonChart chartId='EmAppRealTimePage' {...chartData} style={{ height: 300 }} />
|
||
</Col>
|
||
</Row>
|
||
</LayoutCard>
|
||
<IFComponent IF={realData.length}>
|
||
<LayoutCard title='器具属性实时数据'>
|
||
<Collapse
|
||
defaultActiveKey={realData.map((item, index) => `${item.Name}_${index}`)}
|
||
style={{ marginTop: '0.15rem' }}
|
||
>
|
||
{
|
||
realData.map((item, index) => {
|
||
return (
|
||
<Panel header={item.Name} key={`${item.Name}_${index}`}>
|
||
<Form labelCol={{ span: 10 }} wrapperCol={{ span: 14 }} colon={false}>
|
||
<Row>
|
||
{
|
||
item.Items.map((attr, attrIndex) => {
|
||
const value = `${attr.Value}${attr.Unit === 'None' || attr.Unit === null ? '' : attr.Unit}`
|
||
return (
|
||
<Col key={`${attr.Name}_${attrIndex}`} span={6}>
|
||
<Form.Item
|
||
label={<div title={attr.Name} className='text-ellipsis'>{attr.Name}</div>}
|
||
style={{ marginBottom: 0 }}
|
||
>
|
||
<div title={value} className='text-ellipsis'>:<span className={styles.equipmentFont}>{value}</span></div>
|
||
</Form.Item>
|
||
</Col>
|
||
)
|
||
})
|
||
}
|
||
</Row>
|
||
</Form>
|
||
</Panel>
|
||
)
|
||
})
|
||
}
|
||
</Collapse>
|
||
</LayoutCard>
|
||
</IFComponent>
|
||
</div>
|
||
)
|
||
}
|
||
}
|
||
|
||
export default connect(({ login }) => ({ login }))(EmAppRealTimePage)
|