| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518 |
- <template>
- <div class="curve_statistical_box">
- <div v-show="show_org" class="station_tree">
- <div style="padding:5px;">
- <el-input
- size="small"
- v-model="search_data"
- prefix-icon="el-icon-search"
- placeholder="请输入关键字搜索"
- >
- </el-input>
- </div>
- <el-tree
- node-key="id"
- ref="zzj_tree"
- :data="station_tree"
- :default-expanded-keys="defaultShowNodes"
- :props="defaultProps"
- :highlight-current="isHighlight"
- :expand-on-click-node="true"
- :filter-node-method="filterNode"
- >
- <span slot-scope="{ node, data }">
- <span
- :class="{
- is_disabled: computed_is_disabled(data),
- }"
- :style="{ backgroundColor: data.id == click_id ? '#304156' : '' }"
- @click="handle_node_click(data, node)"
- >{{ data.name }}</span
- >
- </span>
- </el-tree>
- </div>
- <div class="charts">
- <div class="times">
- <i
- :class="[show_org ? 'el-icon-s-fold' : 'el-icon-s-unfold', 'show_org']"
- @click="show_org = !show_org"
- ></i>
- <el-date-picker
- v-model="times"
- size="small"
- :clearable="false"
- type="datetimerange"
- style="width:280px;margin:0px 5px;"
- value-format="timestamp"
- format="yyyy-MM-dd"
- @change="get_has_records"
- range-separator="至"
- start-placeholder="开始日期"
- end-placeholder="结束日期"
- >
- </el-date-picker>
- <el-button
- style="margin-left:8px;"
- icon="el-icon-search"
- type="primary"
- size="small"
- @click="get_has_records"
- >查询</el-button>
- <el-button
- style="margin-left:8px;"
- type="primary"
- size="small"
- @click="alarm_warn_setting('dw_alarm_low_drop')"
- >保持力报警设置</el-button
- >
- <el-button
- style="margin-left:8px;"
- icon="el-icon-download"
- type="primary"
- size="small"
- v-debounce="export_img"
- >导出图片</el-button
- >
- <el-button style="margin-left: 5px;" type="primary" size="mini" @click="localtion_history">历史数据</el-button>
- </div>
- <div
- v-loading="loading"
- element-loading-text="拼命加载中"
- element-loading-spinner="el-icon-loading"
- element-loading-background="rgba(31, 31, 31, 0.6)"
- class="charts_box"
- id="export_img"
- >
- <div ref="one" id="one" class="curve"></div>
- </div>
- </div>
- <!-- 转换阻力设置 -->
- <div class="dw_alarm_low_drop">
- <el-dialog
- width="400px"
- title="保持力报警配置"
- :lock-scroll="true"
- :show-close="true"
- @close="val => cancel_setting(val, 'dw_alarm_low_drop')"
- :close-on-click-modal="false"
- :close-on-press-escape="false"
- :visible.sync="dialogVisible"
- >
- <div class=" position_left" style="text-align: left;">
- <span class="mark"></span>状态
- <el-radio-group v-model="retension_enable">
- <el-radio :label=true>启用</el-radio>
- <el-radio :label=false>未启用</el-radio>
- </el-radio-group>
- </div>
- <div class="position_top_20 position_left" style="text-align: left;">
- <span class="mark"></span>位置
- <el-radio-group v-model="retension_posi" @change="posi_change()">
- <el-radio :label="100">定位</el-radio>
- <el-radio :label="101">反位</el-radio>
- </el-radio-group>
- </div>
- <div class="position_top_20 position_left" style="text-align: left;">
- <span class="mark">*</span>最低报警值:
- <!-- <el-input style="width:200px;margin-left: 58px;" v-model="dw_alarm_low_drop" oninput="value=value.replace(/^0|[^0-9]/g,'')" size="small" maxlength="5" placeholder="请输入0~40000之间的数字" ></el-input> -->
- <el-input style="width:180px;" v-model="dw_alarm_low_drop" size="small" maxlength="7" placeholder="请输入-100000~100000之间的数字" ></el-input>
- </div>
- <!-- <div class="position_top_20">
- <span class="mark">*</span>下降超限百分比(%):
- <el-input style="width:200px" v-model="alarm_low_percent" oninput="value=value.replace(/^0|[^0-9]/g,'')" size="small" maxlength="2" placeholder="请输入5~95之间的数字"></el-input>
- </div>
- <div class="position_top_20">
- <span class="mark">*</span>上升超限百分比(%):
- <el-input style="width:200px" v-model="alarm_high_percent" oninput="value=value.replace(/^0|[^0-9]/g,'')" size="small" maxlength="2" placeholder="请输入5~95之间的数字"></el-input>
- </div> -->
- <span slot="footer" class="dialog-footer">
- <el-button size="small" @click="cancel_setting('convert_resist')">关 闭</el-button>
- <el-button
- v-if="$store.state.admin && $store.state.backend_type == 1"
- size="small"
- type="primary"
- @click="save_settting()"
- >保 存</el-button
- >
- </span>
- </el-dialog>
- </div>
- </div>
- </template>
- <script>
- /**
- * 增加温度
- */
- import { retension_curve, commit_record } from '../api'
- import curveRetentivityOption from '../chart/curve-retentivity'
- import { today } from '../utils/time'
- import { exportImage } from '../plugin/html2canvas' // 引入
- import { treeCorrelation } from '../mixins/treeCorrelation'
- import {get_retension_force,set_retension_force} from '../api'
- export default {
- name: 'CurveRetentivity',
- mixins: [treeCorrelation],
- data() {
- return {
- send_data: {
- type: 1,
- mo: '',
- mp: '',
- name: '',
- time: '',
- end_time: '',
- }, //获取阻力曲线图
- dialogVisible:false,
- retension_enable: true, // 保持力是否启用
- retension_posi: 100,
- dw_alarm_low_drop: '', // 最低报警值
- alarm_low_percent: '', // 下降超限百分比
- alarm_high_percent: '', // 上升超限百分比
- times: [],
- click_id: '', //确认是否激活
- curve_data: new Object(), // 曲线数据
- loading: false,
- myCharts: null,
- show_org: true, //是否显示机构
- /**曲线数据*/
- one_curve: {},
- has_data: false, // 当天是否有数据
- // 浏览记录
- commit_data: {
- module: 9,
- dura: '', // 必传
- analyze_type: 1, // 必传
- station: '', // 必传
- station_name: '', // 必传
- mo: '', // 必传
- mo_name: '', // 必传
- mp: '', // 必传
- mp_name: '', // 必传
- start_time: '', // 必传
- end_time: '',
- time: '', // 必传
- name: this.$store.state.name, // 必传
- username: this.$store.state.user_name, // 必传
- },
- res_time: null,
- }
- },
- methods: {
- // 位置变化
- posi_change() {
- if (!this.click_id) return this.$message.warning('请先选择设备...')
- let [mo, mp] = this.click_id.split('.')
- let send_data = { mo, mp, posi: this.retension_posi }
- get_retension_force(send_data)
- .then(res => {
- this.retension_enable = res.enable;
- this.dw_alarm_low_drop = res.dw_alarm_low_drop;
- this.alarm_high_percent = res.alarm_high_percent;
- this.alarm_low_percent = res.alarm_low_percent;
- })
- .catch(e => {
- console.log(e)
- })
- },
- // 导出Image
- export_img() {
- if (!this.send_data.mo || !this.send_data.mp)
- return this.$message({
- type: 'warning',
- showClose: true,
- duration: 1500,
- message: '请选择重要信息',
- })
- if (!this.has_data)
- return this.$message({
- type: 'warning',
- showClose: true,
- duration: 1500,
- message: '无数据,无法导出...',
- })
- let self_node = this.$refs.zzj_tree.getNode(`${this.send_data.mo}.${this.send_data.mp}`) // 自身所在的node
- let parent_name = self_node.parent.data.name || self_node.parent.data.id // 上级node的name或id
- let file_name = `${parent_name}_${this.send_data.name.replace('.', '')}-${this.$dayjs(
- this.one_curve.time * 1000
- ).format('YYYY_MM_DD')}` // 文件名
- let target_dom = document.getElementById('export_img') // 需要导出的dom元素
- exportImage(file_name, target_dom) // 调用导出Image方法
- return this.$message({
- type: 'success',
- showClose: true,
- duration: 1500,
- message: '导出成功!',
- })
- },
- // 前往历史数据
- localtion_history() {
- if (!this.send_data.mo || !this.send_data.mp)
- return this.$message({
- type: 'warning',
- showClose: true,
- duration: 1500,
- message: '请选择重要信息',
- })
- let route_data = {
- name: 'force',
- query: {
- tag: this.click_id,
- time: this.times[0] / 1000,
- endtime: this.times[1] / 1000 + 24 * 60 * 60 - 1,
- title: this.send_data.name,
- },
- }
- this.$router.push(route_data)
- this.$store.state.defaultActive = '/layout/force'
- this.$store.commit('handle_save_defaultActive', '/layout/force')
- },
- // 点击树结构
- handle_node_click(data, node) {
- if (data.type != 'mo.mp') return
- if (!data['IMEI'] && this.$store.state.backend_type == 1)
- return this.$message({
- type: 'warning',
- showClose: true,
- duration: 1500,
- message: '未绑定设备...',
- })
- /**浏览记录*/
- if (this.res_time) {
- this.commit_data.dura = +new Date() - this.res_time
- let copy_data = _.cloneDeep(this.commit_data)
- this.send_record(copy_data)
- }
- this.res_time = +new Date()
- this.commit_data.station = node.parent.data.id
- this.commit_data.station_name = node.parent.data.name
- let mo_mp = data.id.split('.')
- let mo_mp_name = data.name.split('.')
- this.commit_data.mo = mo_mp[0]
- this.commit_data.mp = mo_mp[1]
- this.commit_data.mo_name = mo_mp_name[0]
- this.commit_data.mp_name = mo_mp_name[1]
- this.commit_data.time = +new Date()
- this.commit_data.start_time = this.times[0]
- this.commit_data.end_time = this.times[1]
- /**结束*/
- this.click_id = data.id
- this.send_data.mo = mo_mp[0]
- this.send_data.mp = mo_mp[1]
- this.send_data.name = data.name
- if (this.myCharts) {
- this.myCharts.dispose()
- this.myCharts = null
- }
- // this.loading = true
- setTimeout(() => {
- return this.get_curve_data()
- }, 16)
- },
- // 获取曲线前先看看有没有浏览记录
- get_has_records() {
- if (this.res_time) {
- this.commit_data.dura = +new Date() - this.res_time
- let copy_data = _.cloneDeep(this.commit_data)
- this.send_record(copy_data)
- }
- return this.get_curve_data()
- },
- // 获取曲线数据
- get_curve_data() {
- if (!this.send_data.mo || !this.send_data.mp)
- return this.$message({
- type: 'warning',
- showClose: true,
- duration: 1500,
- message: '请选择重要信息',
- })
- if (this.times[1] - this.times[0] > 7 * 24 * 60 * 60 * 1000)
- return this.$message.warning('最多不超过7天,请重新选择范围')
- this.send_data.time = this.times[0] / 1000
- this.send_data.end_time = this.times[1] / 1000 + 24 * 60 * 60 - 1
- this.loading = true
- let send_data = _.cloneDeep(this.send_data)
- retension_curve(send_data)
- .then(res => {
- if (send_data.name != res.name) return
- this.loading = false
- this.one_curve = {}
- let one_has_data = res.data.curve_data.every(item => item.data.length == 0)
- if (one_has_data) {
- this.has_data = false
- this.$message({
- type: 'warning',
- showClose: true,
- duration: 1500,
- message: '无数据...',
- })
- } else {
- this.has_data = true
- res.data.name = res.name
- res.data.unit = res.unit
- res.data.time = send_data.time
- res.data.endtime = send_data.end_time
- this.one_curve = _.cloneDeep(res.data)
- }
- this.draw_position_curve()
- })
- .catch(e => {
- console.log(e)
- this.loading = false
- this.has_data = false
- this.one_curve = {}
- this.draw_position_curve()
- })
- },
- // 第一个图
- draw_position_curve() {
- let myCharts = this.$echarts.getInstanceByDom(document.getElementById('one'))
- if (myCharts == null) {
- myCharts = this.$echarts.init(document.getElementById('one'))
- }
- let option = curveRetentivityOption(this.one_curve)
- myCharts.setOption(option, true)
- window.addEventListener('resize', () => {
- myCharts.resize()
- })
- const resizeOb = new ResizeObserver(entries => {
- for (const entry of entries) {
- this.$echarts.getInstanceByDom(entry.target).resize()
- }
- })
- resizeOb.observe(this.$refs.one)
- },
- // 点击获取预报警值
- alarm_warn_setting(type) {
- let send_data = {};
- if (!this.click_id) return this.$message.warning('请先选择设备...')
- let [mo, mp] = this.click_id.split('.')
- send_data = { mo, mp, posi: this.retension_posi }
- get_retension_force(send_data)
- .then(res => {
- this.retension_enable = res.enable;
- this.dw_alarm_low_drop = res.dw_alarm_low_drop;
- this.alarm_high_percent = res.alarm_high_percent;
- this.alarm_low_percent = res.alarm_low_percent;
- this.dialogVisible = true;
- })
- .catch(e => {
- console.log(e)
- })
- return
- },// 关闭预告警设置
- cancel_setting(type) {
- this.dialogVisible= false;
- this.retension_enable= true;
- this.retension_posi=100;
- this.dw_alarm_low_drop= '';
- this.alarm_low_percent= '';
- this.alarm_high_percent= '';
- },// 保存预告警设置
- save_settting() {
- if (!this.click_id) return this.$message.warning('请先选择设备...')
- let dw_alarm_low_drop = '';
- let alarm_low_percent = '';
- let alarm_high_percent= '';
- let regex = /^-?\d+$/;
- if (this.dw_alarm_low_drop) {
- if(!regex.test(this.dw_alarm_low_drop) || Math.abs(this.dw_alarm_low_drop) > 100000){
- return this.$message.warning('最低报警值要求:-100000~100000之间的数字');
- }else{
- dw_alarm_low_drop = Number(this.dw_alarm_low_drop);
- }
- }
- if (this.alarm_low_percent ){
- if(this.alarm_low_percent < 5 || this.alarm_low_percent > 95){
- return this.$message.warning('下降超限百分比要求:5~95之间的数字');
- }else{
- alarm_low_percent= Number(this.alarm_low_percent);
- }
- }
- if (this.alarm_high_percent ){
- if(this.alarm_high_percent < 5 || this.alarm_high_percent > 95){
- return this.$message.warning('上升超限百分比要求:5~95之间的数字');
- }else{
- alarm_high_percent= Number(this.alarm_high_percent);
- }
-
- }
- let [mo, mp] = this.click_id.split('.')
- let send_data = {
- mo,
- mp,
- posi: this.retension_posi,
- conf: {
- enable: this.retension_enable,
- dw_alarm_low_drop:dw_alarm_low_drop,
- alarm_low_percent:alarm_low_percent,
- alarm_high_percent:alarm_high_percent,
- },
- }
- set_retension_force(send_data)
- .then(res => {
- return this.$message.success('设置成功...')
- })
- .catch(e => {
- console.log(e)
- })
- },
- // 发送浏览记录
- send_record(commit_data) {
- if (commit_data.dura <= 500) return
- if (!commit_data.station || !commit_data.station_name) return
- if (!commit_data.mo || !commit_data.mo_name) return
- if (!commit_data.mp || !commit_data.mp_name) return
- commit_record([commit_data])
- .then(res => {})
- .catch(e => {})
- },
- // 离开界面时
- leave_page() {
- if (!this.res_time) return
- this.commit_data.dura = +new Date() - this.res_time
- let copy_data = _.cloneDeep(this.commit_data)
- return this.send_record(copy_data)
- },
- // 获取默认时间
- get_time() {
- let times = this.$dayjs().format('YYYY-MM-DD 00:00:00')
- let unix_time = this.$dayjs(times).unix() * 1000
- this.times = [unix_time - 24 * 60 * 60 * 1000, unix_time]
- this.draw_position_curve()
- },
- },
- mounted() {
- this.get_time()
- },
- activated() {
- if (this.click_id) {
- this.res_time = +new Date()
- } else {
- this.res_time = null
- }
- },
- deactivated() {
- this.leave_page()
- },
- beforeDestroy() {
- this.leave_page()
- },
- }
- </script>
- <style lang="scss">
- .station_tree {
- .el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content {
- background-color: transparent;
- }
- }
- </style>
- <style lang="scss" scoped>
- @import '../../static/css/curve-retentivity.scss';
- </style>
|