123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- <template>
- <div class="windMonitor">
- <div class="title-top" @click="getDetail">风量监测</div>
- <div class="wind-contents">
- <div class="wind-bar" ref="windBar"></div>
- </div>
- </div>
- </template>
- <script lang="ts" setup>
- import { ref, reactive, nextTick, onMounted, defineProps, watch } from 'vue';
- import * as echarts from 'echarts';
- const emit = defineEmits(['goDetail'])
- 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';
- const barWidth = 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.8;
- return {
- type: 'group',
- children: [
- {
- // 圆形装饰
- type: 'circle',
- shape: {
- cx: topCenter[0],
- cy: topCenter[1],
- r: ballRadius,
- },
- style: api.style({
- fill: '#66ffff',
- stroke: color,
- lineWidth: 2,
- }),
- },
- ],
- };
- }
- 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;
- },
- },
- 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';
- }
- newParamsName += tempStr; // 最终拼成的字符串
- }
- } else {
- // 将旧标签的值赋给新标签
- newParamsName = params;
- }
- //将最终的字符串返回
- return newParamsName;
- },
- fontSize: 14,
- margin: 10,
- interval: 0,
- textStyle: {
- color: '#b3b8cc',
- },
- },
- axisLine: {
- lineStyle: {
- color: 'rgba(62, 103, 164)',
- },
- },
- splitLine: {
- show: false,
- },
- axisTick: {
- show: false,
- },
- },
- yAxis: {
- type: 'value',
- name: '(m³/min)',
- max: 5000,
- axisLabel: {
- textStyle: {
- fontSize: 14,
- color: '#b3b8cc',
- },
- },
- nameTextStyle: {
- color: '#fff',
- fontSize: 12,
- lineHeight: 10,
- },
- splitLine: {
- lineStyle: {
- color: 'rgba(62, 103, 164,.4)',
- },
- },
- 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: ['-7', '-28'],
- 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();
- };
- });
- }
- watch(
- () => props.flList,
- (val) => {
- console.log(val, '测风数据');
- echartData.xdata.length = 0;
- echartData.ydata.length = 0;
- val.forEach((el) => {
- echartData.xdata.push(el.strinstallpos);
- echartData.ydata.push(el.readData.m3);
- });
- getOption();
- },
- {
- deep: true,
- }
- );
- onMounted(() => {});
- </script>
- <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;
- }
- }
- .wind-contents {
- position: absolute;
- left: 0;
- top: 36px;
- width: 100%;
- height: calc(100% - 36px);
- .wind-bar {
- width: 100%;
- height: 100%;
- }
- }
- }
- </style>
|