运维服务中台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

288 lines
12 KiB

import React, { useState, useEffect,useRef } from "react";
import { connect } from "react-redux";
import moment from 'moment';
import { Form, Tooltip, Select, Checkbox, Modal, Input, Button, Switch, DatePicker, Row } from "@douyinfe/semi-ui";
import {IconLineChartStroked} from "@douyinfe/semi-icons"
import { TimeAbnValueLineChart } from '../components/TimeAbnValueLineChart';
import PropTypes from 'prop-types';
const TrendModal = (props) => {
const { modalData,dispatch,actions,sensorId, closeModal, visible,project } = props
const{install}=actions
const [currStartTime, setCurrStartTime] = useState(moment().add('days', -1).format('YYYY-MM-DD HH:mm:ss'))
const [currEndTime, setcurrEndTime] = useState(moment().format('YYYY-MM-DD HH:mm:ss'))
const form = useRef()
//初始化
useEffect(() => {
}, [])
const checkPoint = (rule, value) => {
const pattern = /^[1-9]*[1-9][0-9]*$/;
if (pattern.test(value) && value != 1) {
return true
}
return false
}
const checkNumber = (rule, val) => {
const strRegex = /^-?\d+(\.\d+)?$/
if (strRegex.test(val)) {
return true
}
return false
}
const btnFormSubmit = () => {
let data = modalData
form.current.validate().then(value=>{
let paramJson = {
"thr_burr": Number(value.burr),//毛刺阈值
"win_med": Number(value.ws),//滑动中值
"win_avg": Number(value.rc),//滑动均值
"thr_der": Number(value.dv), //导数阈值
"win_grad": Number(value.pn),//渐变点个数
"thr_grad": Number(value.gv),//渐变阈值
"days_Last": Number(value.timeRange),//分析时长
}
let pushData = {
station: data.sensorId,//测点
factorId: data.factorId,
itemId: data.itemIndex,
abnType: 3,//异常趋势
enabled: value.checked,
params: paramJson
};
dispatch(install.editAbnParams(data.id,pushData)).then(res => {
if (res.success) {
const id=[...sensorId?.map(item=>project+'-'+item), -1].join(',')
dispatch(install.getAbnParamList({ sensorId:id}))
closeModal()
}
})
})
}
const checkInterger = (rule, val) => {
// if(val){
const strRegex = /^[1-9]*[1-9][0-9]*$/
if (strRegex.test(val)) {
return true
}
return false
// }
};
const timeOnChange = (dates, dateStrings) => {
if (dates.length == 0) {
setCurrStartTime(null)
setCurrEndTime(null)
return Notification.warning({
content: `请选择时间`,
duration: 3,
})
}
setCurrStartTime(dates[0].format('YYYY-MM-DD HH:mm:ss'))
setCurrEndTime(dates[1].format('YYYY-MM-DD HH:mm:ss'))
}
//数据对比
// const dataCompare = () => {
// this.props.form.validateFields((err, values) => {
// if (!err) {
// let paramJson = {
// "thr_burr": values.burr,//毛刺阈值
// "win_med": values.ws,//滑动中值
// "win_avg": values.rc,//滑动均值
// "thr_der": values.dv, //导数阈值
// "win_grad": values.pn,//渐变点个数
// "thr_grad": values.gv,//渐变阈值
// "days_Last": values.timeRange,//分析时长
// }
// let data = {
// station: this.props.modalData.stationId,
// factorId: this.props.modalData.factorId,
// itemId: this.props.modalData.itemId,
// abnType: 'trend',//算法类型
// enabled: true,
// params: paramJson
// };
// let start = this.state.currStartTime;
// let end = this.state.currEndTime;
// this.props.dispatch(getItemAbnResult_tr(this.props.structId, start, end, data)).then(res => {
// })
// }
// });
// }
// let originalData = ['还没查询'], calcArray = [], key, itemName, start, end;
// let stationsData = [];
// if (abnItemCompData) {
// originalData = abnItemCompData.stationData;
// calcArray = abnItemCompData.resultArray;
// key = abnItemCompData.itemKey;
// itemName = abnItemCompData.itemName;
// start = originalData && originalData.length > 0 ? originalData[0].time : '';
// end = originalData && originalData.length > 0 ? originalData[originalData.length - 1].time : '';
// for (let i = 0; i < originalData.length; i++) {
// let one = { name: itemName + "(单位:" + abnItemCompData.unit + ")", value: originalData[i][key], time: originalData[i].time };
// stationsData.push(one);
// }
// if (calcArray) {
// let preLineData = calcArray.calcPreprocess;
// let abnTrends = calcArray.calcFinal;
// for (let j = 0; j < preLineData.length; j++) {
// let one = { name: "预处理+滑动均值后数据", value: preLineData[j].value, time: preLineData[j].time };
// stationsData.push(one);
// }
// for (let t = 0; t < abnTrends.length; t++) {
// let name = abnTrends[t].startTime + "至" + abnTrends[t].endTime + abnTrends[t].des + ",渐变差值:" + abnTrends[t].value.toFixed(2) + abnItemCompData.unit;
// let start = { name: name, value: abnTrends[t].startValue, time: abnTrends[t].startTime };
// let end = { name: name, value: abnTrends[t].endValue, time: abnTrends[t].endTime };
// stationsData.push(start);
// stationsData.push(end);
// }
// }
// }
TrendModal.propTypes = {
visible: PropTypes.bool.isRequired,
closeModal: PropTypes.func.isRequired
};
return <div>
<Modal title="异常参数编辑" maskClosable={false} visible={visible} onCancel={closeModal} width={1000}
footer={[<div>
<Button type="primary" theme='borderless' htmlType="submit" onClick={btnFormSubmit}>保存</Button>
<Button key="cancel" onClick={closeModal}>关闭</Button>
</div>]}>
<Form getFormApi={formApi => {
form.current = formApi
}} labelPosition='left'
>
<Row>
<Form.Input label='测点位置' field='stationName'
rules={[{ required: true, message: '测点位置' }]}
disabled={true}
initValue={modalData.sensorName}
>
</Form.Input>
<Form.Input label='监测因素' field='factorName'
rules={[{ required: true, message: '监测因素' }]}
disabled={true}
initValue={modalData.factorName}
>
</Form.Input>
<Form.Switch label='是否启用' field='checked'
rules={[{ required: true, message: '是否启用' }]}
initValue={modalData.enabled}
>
</Form.Switch>
<Form.Select showSearch filter label="分析时长" field="timeRange"
placeholder="请选择分析时长" style={{ width: 127, marginBottom: 0 }}
initValue={modalData.params.days_Last} rules={[{
required: true, message: "请选择分析时长"
}]}
>
<Select.Option value="1">1个月</Select.Option>
<Select.Option value="2">2个月</Select.Option>
<Select.Option value="3">3个月</Select.Option>
</Form.Select>
</Row>
<Row style={{ marginTop: 18 }}>
<Form.Input
initValue={ modalData.params.thr_burr}
field='burr'
placeholder="毛刺阈值:数字" label="毛刺阈值"
rules={[{
required: true, message: "请输入正整数", validator: checkInterger
}]} t
trigger='blur' />
<Form.Input
initValue={ modalData.params.win_med}
field='ws'
placeholder="滑动中值:正值" label="滑动中值"
rules={[{
required: true, message: "请输入正整数", validator: checkInterger
}]}
trigger='blur' />
<Form.Input
field='rc'
initValue={ modalData.params.win_avg}
placeholder="滑动均值:正值" label="滑动均值"
rules={[{
required: true, message: "请输入正整数", validator: checkInterger
}]}
trigger='blur' />
</Row>
<Row style={{ marginTop: 18 }}>
<Form.Input
field='dv'
initValue={modalData.params.thr_der}
placeholder="导数阈值:数字" label="导数阈值"
rules={[{
required: true, message: "请输入数字", validator: checkNumber
}]}
trigger='blur' />
<Form.Input
field='pn'
initValue={modalData.params.win_grad}
placeholder="渐变点个数:正值" label="渐变点数"
rules={[{
required: true, message: "请输入大于1的正整数", validator: checkPoint
}]}
trigger='blur' />
<Form.Input
field='gv'
initValue={modalData.params.thr_grad}
placeholder="渐变阈值:数字" label="渐变阈值"
rules={[{
required: true, message: "请输入数字", validator: checkNumber
}]} trigger='blur'
/>
</Row>
<Row style={{ marginTop: 28 }}>
<Form.DatePicker
placeholder={['开始时间', '结束时间']}
field="timeSelected"
label="查询时间"
initValue={[moment().subtract(24, 'hours').format('YYYY-MM-DD HH:mm:ss'), moment().format('YYYY-MM-DD HH:mm:ss')]}
type="dateTimeRange" density="compact"
onChange={timeOnChange}
/>
{/* <Button size='default' type="primary" onClick={dataCompare}>数据对比</Button> */}
</Row>
{/* <div className="data-chart-container">
{originalData && originalData[0] == '还没查询' ?
<div style={{ margin: '30px 0' }}><IconLineChartStroked/> 输入参数,点击数据对比展示数据对比图</div>
:
originalData && originalData[0] != '还没查询' && originalData.length > 0 ?
<TimeAbnValueLineChart contentType={'trend'} data={stationsData} width={300} height={300}
itemName={itemName} configs={{ slider: { start: start, end: end } }} />
:
<div style={{ margin: '30px 0' }}><IconLineChartStroked/> 没有查询到任何有效数据!</div>}
</div> */}
</Form>
</Modal>
</div>;
}
function mapStateToProps(state) {
const { abnItemState_tr, global} = state;
return {
abnItemCompData: abnItemState_tr.items,
actions:global.actions
}
}
export default connect(mapStateToProps)(TrendModal)