|
@@ -8,250 +8,268 @@
|
|
</template>
|
|
</template>
|
|
|
|
|
|
<script lang="ts" setup>
|
|
<script lang="ts" setup>
|
|
- import { ref, reactive, nextTick, onMounted, defineProps, watch } from 'vue';
|
|
|
|
- import * as echarts from 'echarts';
|
|
|
|
- const emit = defineEmits(['goDetail'])
|
|
|
|
|
|
+import { ref, reactive, nextTick, onMounted, defineProps, watch } from 'vue';
|
|
|
|
+import * as echarts from 'echarts';
|
|
|
|
+const emit = defineEmits(['goDetail'])
|
|
|
|
|
|
- let props = defineProps({
|
|
|
|
- flList: Array,
|
|
|
|
- });
|
|
|
|
|
|
+let props = defineProps({
|
|
|
|
+ flList: Array,
|
|
|
|
+});
|
|
|
|
|
|
- //获取dom节点
|
|
|
|
- let windBar = ref<any>();
|
|
|
|
- //echart数据
|
|
|
|
- let echartData = reactive<any>({ ydata: [], xdata: [] });
|
|
|
|
- //跳转详情
|
|
|
|
- function getDetail() {
|
|
|
|
- emit('goDetail', 'windrect')
|
|
|
|
- }
|
|
|
|
- function getOption() {
|
|
|
|
- nextTick(() => {
|
|
|
|
- const color = '#66ffff';
|
|
|
|
- let barWidth = echartData.ydata.length>0 && echartData.ydata.length<=1 ? 0.03 : 0.1; // 柱条占比
|
|
|
|
- function renderItem(params, api) {
|
|
|
|
- const topCenter = api.coord([api.value(0), api.value(1)]); // 顶点中心
|
|
|
|
- const width = api.size([0, 1])[0] * barWidth; // 宽度
|
|
|
|
- const ballRadius = width * 0.6;
|
|
|
|
- return {
|
|
|
|
- type: 'group',
|
|
|
|
- children: [
|
|
|
|
- {
|
|
|
|
- // 圆形装饰
|
|
|
|
- type: 'circle',
|
|
|
|
- shape: {
|
|
|
|
- cx: topCenter[0],
|
|
|
|
- cy: topCenter[1],
|
|
|
|
- r: ballRadius,
|
|
|
|
- },
|
|
|
|
- style: api.style({
|
|
|
|
- fill: '#66ffff',
|
|
|
|
- stroke: color,
|
|
|
|
- lineWidth: 2,
|
|
|
|
- }),
|
|
|
|
|
|
+//获取dom节点
|
|
|
|
+let windBar = ref<any>();
|
|
|
|
+//坐标轴最大值
|
|
|
|
+let maxY = ref(0)
|
|
|
|
+//echart数据
|
|
|
|
+let echartData = reactive<any>({ ydata: [], xdata: [] });
|
|
|
|
+//跳转详情
|
|
|
|
+function getDetail() {
|
|
|
|
+ emit('goDetail', 'windrect')
|
|
|
|
+}
|
|
|
|
+function getOption() {
|
|
|
|
+ nextTick(() => {
|
|
|
|
+ const color = '#66ffff';
|
|
|
|
+ let barWidth = echartData.ydata.length > 0 && echartData.ydata.length <= 1 ? 0.03 : 0.1; // 柱条占比
|
|
|
|
+ function renderItem(params, api) {
|
|
|
|
+ const topCenter = api.coord([api.value(0), api.value(1)]); // 顶点中心
|
|
|
|
+ const width = api.size([0, 1])[0] * barWidth; // 宽度
|
|
|
|
+ const ballRadius = width * 0.6;
|
|
|
|
+ return {
|
|
|
|
+ type: 'group',
|
|
|
|
+ children: [
|
|
|
|
+ {
|
|
|
|
+ // 圆形装饰
|
|
|
|
+ type: 'circle',
|
|
|
|
+ shape: {
|
|
|
|
+ cx: topCenter[0],
|
|
|
|
+ cy: topCenter[1],
|
|
|
|
+ r: ballRadius,
|
|
},
|
|
},
|
|
- ],
|
|
|
|
- };
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- const myChart = echarts.init(windBar.value);
|
|
|
|
- let option = {
|
|
|
|
- color: [color],
|
|
|
|
- tooltip: {
|
|
|
|
- trigger: 'item',
|
|
|
|
- show: true,
|
|
|
|
- formatter: function (p) {
|
|
|
|
- // console.info(p);
|
|
|
|
- return p.marker + p.name + ' : ' + p.value;
|
|
|
|
|
|
+ style: api.style({
|
|
|
|
+ fill: '#66ffff',
|
|
|
|
+ stroke: color,
|
|
|
|
+ lineWidth: 2,
|
|
|
|
+ }),
|
|
},
|
|
},
|
|
- },
|
|
|
|
|
|
+ ],
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
|
|
- grid: {
|
|
|
|
- left: '8%',
|
|
|
|
- top: '15%',
|
|
|
|
- bottom: '32%',
|
|
|
|
- right: '8%',
|
|
|
|
- // containLabel: true
|
|
|
|
|
|
+ const myChart = echarts.init(windBar.value);
|
|
|
|
+ let option = {
|
|
|
|
+ color: [color],
|
|
|
|
+ tooltip: {
|
|
|
|
+ trigger: 'item',
|
|
|
|
+ show: true,
|
|
|
|
+ formatter: function (p) {
|
|
|
|
+ // console.info(p);
|
|
|
|
+ return p.marker + p.name + ' : ' + p.value;
|
|
},
|
|
},
|
|
- xAxis: {
|
|
|
|
- type: 'category',
|
|
|
|
- data: echartData.xdata,
|
|
|
|
- axisLabel: {
|
|
|
|
- formatter: function (params) {
|
|
|
|
- var newParamsName = ''; // 最终拼接成的字符串
|
|
|
|
- var paramsNameNumber = params.length; // 实际标签的个数
|
|
|
|
- var provideNumber = 6; // 每行能显示的字的个数
|
|
|
|
- var rowNumber = Math.ceil(paramsNameNumber / provideNumber); // 换行的话,需要显示几行,向上取整
|
|
|
|
- /**
|
|
|
|
- * 判断标签的个数是否大于规定的个数, 如果大于,则进行换行处理 如果不大于,即等于或小于,就返回原标签
|
|
|
|
- */
|
|
|
|
- // 条件等同于rowNumber>1
|
|
|
|
- if (paramsNameNumber > provideNumber) {
|
|
|
|
- /** 循环每一行,p表示行 */
|
|
|
|
- for (var p = 0; p < rowNumber; p++) {
|
|
|
|
- var tempStr = ''; // 表示每一次截取的字符串
|
|
|
|
- var start = p * provideNumber; // 开始截取的位置
|
|
|
|
- var end = start + provideNumber; // 结束截取的位置
|
|
|
|
- // 此处特殊处理最后一行的索引值
|
|
|
|
- if (p == rowNumber - 1) {
|
|
|
|
- // 最后一次不换行
|
|
|
|
- tempStr = params.substring(start, paramsNameNumber);
|
|
|
|
- } else {
|
|
|
|
- // 每一次拼接字符串并换行
|
|
|
|
- tempStr = params.substring(start, end) + '\n';
|
|
|
|
- }
|
|
|
|
- newParamsName += tempStr; // 最终拼成的字符串
|
|
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ grid: {
|
|
|
|
+ left: '8%',
|
|
|
|
+ top: '15%',
|
|
|
|
+ bottom: '32%',
|
|
|
|
+ right: '8%',
|
|
|
|
+ // containLabel: true
|
|
|
|
+ },
|
|
|
|
+ xAxis: {
|
|
|
|
+ type: 'category',
|
|
|
|
+ data: echartData.xdata,
|
|
|
|
+ axisLabel: {
|
|
|
|
+ formatter: function (params) {
|
|
|
|
+ var newParamsName = ''; // 最终拼接成的字符串
|
|
|
|
+ var paramsNameNumber = params.length; // 实际标签的个数
|
|
|
|
+ var provideNumber = 6; // 每行能显示的字的个数
|
|
|
|
+ var rowNumber = Math.ceil(paramsNameNumber / provideNumber); // 换行的话,需要显示几行,向上取整
|
|
|
|
+ /**
|
|
|
|
+ * 判断标签的个数是否大于规定的个数, 如果大于,则进行换行处理 如果不大于,即等于或小于,就返回原标签
|
|
|
|
+ */
|
|
|
|
+ // 条件等同于rowNumber>1
|
|
|
|
+ if (paramsNameNumber > provideNumber) {
|
|
|
|
+ /** 循环每一行,p表示行 */
|
|
|
|
+ for (var p = 0; p < rowNumber; p++) {
|
|
|
|
+ var tempStr = ''; // 表示每一次截取的字符串
|
|
|
|
+ var start = p * provideNumber; // 开始截取的位置
|
|
|
|
+ var end = start + provideNumber; // 结束截取的位置
|
|
|
|
+ // 此处特殊处理最后一行的索引值
|
|
|
|
+ if (p == rowNumber - 1) {
|
|
|
|
+ // 最后一次不换行
|
|
|
|
+ tempStr = params.substring(start, paramsNameNumber);
|
|
|
|
+ } else {
|
|
|
|
+ // 每一次拼接字符串并换行
|
|
|
|
+ tempStr = params.substring(start, end) + '\n';
|
|
}
|
|
}
|
|
- } else {
|
|
|
|
- // 将旧标签的值赋给新标签
|
|
|
|
- newParamsName = params;
|
|
|
|
|
|
+ newParamsName += tempStr; // 最终拼成的字符串
|
|
}
|
|
}
|
|
- //将最终的字符串返回
|
|
|
|
- return newParamsName;
|
|
|
|
- },
|
|
|
|
- fontSize: 14,
|
|
|
|
- margin: 10,
|
|
|
|
- interval: 0,
|
|
|
|
- textStyle: {
|
|
|
|
- color: '#b3b8cc',
|
|
|
|
- },
|
|
|
|
|
|
+ } else {
|
|
|
|
+ // 将旧标签的值赋给新标签
|
|
|
|
+ newParamsName = params;
|
|
|
|
+ }
|
|
|
|
+ //将最终的字符串返回
|
|
|
|
+ return newParamsName;
|
|
},
|
|
},
|
|
- axisLine: {
|
|
|
|
- lineStyle: {
|
|
|
|
- color: 'rgba(62, 103, 164)',
|
|
|
|
- },
|
|
|
|
- },
|
|
|
|
- splitLine: {
|
|
|
|
- show: false,
|
|
|
|
- },
|
|
|
|
- axisTick: {
|
|
|
|
- show: false,
|
|
|
|
|
|
+ fontSize: 14,
|
|
|
|
+ margin: 10,
|
|
|
|
+ interval: 0,
|
|
|
|
+ textStyle: {
|
|
|
|
+ color: '#b3b8cc',
|
|
},
|
|
},
|
|
},
|
|
},
|
|
- yAxis: {
|
|
|
|
- type: 'value',
|
|
|
|
- name: '(m³/min)',
|
|
|
|
- max: 10000,
|
|
|
|
- axisLabel: {
|
|
|
|
- textStyle: {
|
|
|
|
- fontSize: 14,
|
|
|
|
- color: '#b3b8cc',
|
|
|
|
- },
|
|
|
|
- },
|
|
|
|
- nameTextStyle: {
|
|
|
|
- color: '#fff',
|
|
|
|
- fontSize: 12,
|
|
|
|
- lineHeight: 10,
|
|
|
|
|
|
+ axisLine: {
|
|
|
|
+ lineStyle: {
|
|
|
|
+ color: 'rgba(62, 103, 164)',
|
|
},
|
|
},
|
|
- splitLine: {
|
|
|
|
- lineStyle: {
|
|
|
|
- color: 'rgba(62, 103, 164,.4)',
|
|
|
|
- },
|
|
|
|
- },
|
|
|
|
- axisLine: {
|
|
|
|
- show: false,
|
|
|
|
|
|
+ },
|
|
|
|
+ splitLine: {
|
|
|
|
+ show: false,
|
|
|
|
+ },
|
|
|
|
+ axisTick: {
|
|
|
|
+ show: false,
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ yAxis: {
|
|
|
|
+ type: 'value',
|
|
|
|
+ name: '(m³/min)',
|
|
|
|
+ max: maxY.value,
|
|
|
|
+ axisLabel: {
|
|
|
|
+ textStyle: {
|
|
|
|
+ fontSize: 14,
|
|
|
|
+ color: '#b3b8cc',
|
|
},
|
|
},
|
|
- axisTick: {
|
|
|
|
- show: false,
|
|
|
|
|
|
+ },
|
|
|
|
+ nameTextStyle: {
|
|
|
|
+ color: '#fff',
|
|
|
|
+ fontSize: 12,
|
|
|
|
+ lineHeight: 10,
|
|
|
|
+ },
|
|
|
|
+ splitLine: {
|
|
|
|
+ lineStyle: {
|
|
|
|
+ color: 'rgba(62, 103, 164,.4)',
|
|
},
|
|
},
|
|
},
|
|
},
|
|
- series: [
|
|
|
|
- {
|
|
|
|
- data: echartData.ydata,
|
|
|
|
- type: 'bar',
|
|
|
|
- barWidth: barWidth * 100 + '%',
|
|
|
|
- itemStyle: {
|
|
|
|
- color: {
|
|
|
|
- x: 0,
|
|
|
|
- y: 0,
|
|
|
|
- x2: 0,
|
|
|
|
- y2: 1,
|
|
|
|
- colorStops: [
|
|
|
|
- {
|
|
|
|
- offset: 0,
|
|
|
|
- color: 'rgba(85, 255, 237, 1)', // 0% 处的颜色
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- offset: 1,
|
|
|
|
- color: 'rgba(66, 142, 255, 0.1)', // 100% 处的颜色
|
|
|
|
- },
|
|
|
|
- ],
|
|
|
|
- },
|
|
|
|
|
|
+ axisLine: {
|
|
|
|
+ show: false,
|
|
|
|
+ },
|
|
|
|
+ axisTick: {
|
|
|
|
+ show: false,
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ series: [
|
|
|
|
+ {
|
|
|
|
+ data: echartData.ydata,
|
|
|
|
+ type: 'bar',
|
|
|
|
+ barWidth: barWidth * 100 + '%',
|
|
|
|
+ itemStyle: {
|
|
|
|
+ color: {
|
|
|
|
+ x: 0,
|
|
|
|
+ y: 0,
|
|
|
|
+ x2: 0,
|
|
|
|
+ y2: 1,
|
|
|
|
+ colorStops: [
|
|
|
|
+ {
|
|
|
|
+ offset: 0,
|
|
|
|
+ color: 'rgba(85, 255, 237, 1)', // 0% 处的颜色
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ offset: 1,
|
|
|
|
+ color: 'rgba(66, 142, 255, 0.1)', // 100% 处的颜色
|
|
|
|
+ },
|
|
|
|
+ ],
|
|
},
|
|
},
|
|
- label: {
|
|
|
|
- normal: {
|
|
|
|
- show: true,
|
|
|
|
- position: echartData.ydata.length>0 && echartData.ydata.length<=1 ? ['-17', '-30'] : ['-20', '-25'],
|
|
|
|
- formatter: [' {a|{c}}'].join(','),
|
|
|
|
- rich: {
|
|
|
|
- a: {
|
|
|
|
- color: '#fff',
|
|
|
|
- align: 'center',
|
|
|
|
- },
|
|
|
|
|
|
+ },
|
|
|
|
+ label: {
|
|
|
|
+ normal: {
|
|
|
|
+ show: true,
|
|
|
|
+ position: echartData.ydata.length > 0 && echartData.ydata.length <= 1 ? ['-17', '-30'] : ['-16', '-30'],
|
|
|
|
+ formatter: [' {a|{c}}'].join(','),
|
|
|
|
+ rich: {
|
|
|
|
+ a: {
|
|
|
|
+ color: '#fff',
|
|
|
|
+ align: 'center',
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
- {
|
|
|
|
- data: echartData.ydata,
|
|
|
|
- type: 'custom',
|
|
|
|
- renderItem: renderItem,
|
|
|
|
- zlevel: 2,
|
|
|
|
- },
|
|
|
|
- ],
|
|
|
|
- };
|
|
|
|
- myChart.setOption(option);
|
|
|
|
- window.onresize = function () {
|
|
|
|
- myChart.resize();
|
|
|
|
- };
|
|
|
|
- });
|
|
|
|
- }
|
|
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ data: echartData.ydata,
|
|
|
|
+ type: 'custom',
|
|
|
|
+ renderItem: renderItem,
|
|
|
|
+ zlevel: 2,
|
|
|
|
+ },
|
|
|
|
+ ],
|
|
|
|
+ };
|
|
|
|
+ myChart.setOption(option);
|
|
|
|
+ window.onresize = function () {
|
|
|
|
+ myChart.resize();
|
|
|
|
+ };
|
|
|
|
+ });
|
|
|
|
+}
|
|
|
|
|
|
- watch(
|
|
|
|
- () => props.flList,
|
|
|
|
- (val) => {
|
|
|
|
- echartData.xdata.length = 0;
|
|
|
|
- echartData.ydata.length = 0;
|
|
|
|
- val.forEach((el) => {
|
|
|
|
|
|
+function formatRoundNum(num) {
|
|
|
|
+ let interger = Math.ceil(num)
|
|
|
|
+ let leng = String(interger).length
|
|
|
|
+ return Math.ceil(interger / Math.pow(10, leng - 1)) * Math.pow(10, leng - 1)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+watch(
|
|
|
|
+ () => props.flList,
|
|
|
|
+ (val) => {
|
|
|
|
+ echartData.xdata.length = 0;
|
|
|
|
+ echartData.ydata.length = 0;
|
|
|
|
+ val.forEach((el: any) => {
|
|
|
|
+ if (el.readData.m3) {
|
|
echartData.xdata.push(el.strinstallpos);
|
|
echartData.xdata.push(el.strinstallpos);
|
|
echartData.ydata.push(el.readData.m3);
|
|
echartData.ydata.push(el.readData.m3);
|
|
- });
|
|
|
|
- getOption();
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- deep: true,
|
|
|
|
- }
|
|
|
|
- );
|
|
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ let max = echartData.ydata.reduce((acr, cur) => {
|
|
|
|
+ return parseFloat(acr) > parseFloat(cur) ? parseFloat(acr) : parseFloat(cur)
|
|
|
|
+ })
|
|
|
|
+ maxY.value = formatRoundNum(max * 1.5)
|
|
|
|
+ getOption();
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ deep: true,
|
|
|
|
+ }
|
|
|
|
+);
|
|
|
|
|
|
- onMounted(() => {});
|
|
|
|
|
|
+onMounted(() => { });
|
|
</script>
|
|
</script>
|
|
|
|
|
|
<style lang="less" scoped>
|
|
<style lang="less" scoped>
|
|
- .windMonitor {
|
|
|
|
- width: 100%;
|
|
|
|
- height: 100%;
|
|
|
|
- position: relative;
|
|
|
|
- .title-top {
|
|
|
|
- position: absolute;
|
|
|
|
- top: 9px;
|
|
|
|
- left: 46px;
|
|
|
|
- color: #fff;
|
|
|
|
- font-size: 16px;
|
|
|
|
- font-family: 'douyuFont';
|
|
|
|
- cursor: pointer;
|
|
|
|
- &:hover {
|
|
|
|
- color: #66ffff;
|
|
|
|
- }
|
|
|
|
|
|
+.windMonitor {
|
|
|
|
+ width: 100%;
|
|
|
|
+ height: 100%;
|
|
|
|
+ position: relative;
|
|
|
|
+
|
|
|
|
+ .title-top {
|
|
|
|
+ position: absolute;
|
|
|
|
+ top: 9px;
|
|
|
|
+ left: 46px;
|
|
|
|
+ color: #fff;
|
|
|
|
+ font-size: 16px;
|
|
|
|
+ font-family: 'douyuFont';
|
|
|
|
+ cursor: pointer;
|
|
|
|
+
|
|
|
|
+ &:hover {
|
|
|
|
+ color: #66ffff;
|
|
}
|
|
}
|
|
- .wind-contents {
|
|
|
|
- position: absolute;
|
|
|
|
- left: 0;
|
|
|
|
- top: 36px;
|
|
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .wind-contents {
|
|
|
|
+ position: absolute;
|
|
|
|
+ left: 0;
|
|
|
|
+ top: 36px;
|
|
|
|
+ width: 100%;
|
|
|
|
+ height: calc(100% - 36px);
|
|
|
|
+
|
|
|
|
+ .wind-bar {
|
|
width: 100%;
|
|
width: 100%;
|
|
- height: calc(100% - 36px);
|
|
|
|
- .wind-bar {
|
|
|
|
- width: 100%;
|
|
|
|
- height: 100%;
|
|
|
|
- }
|
|
|
|
|
|
+ height: 100%;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+}
|
|
</style>
|
|
</style>
|