measure-point.vue 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. <template>
  2. <div class="measure-point">
  3. <div class="title">{{ roadTitle }}</div>
  4. <div class="measure-content">
  5. <div class="echart-box">
  6. <div ref="measureRef" class="measure"></div>
  7. </div>
  8. </div>
  9. </div>
  10. </template>
  11. <script lang="ts" setup>
  12. // 该组件和wind-road组件基本上一摸一样,只不过该组件是适配首页中间的卡片而做的
  13. import { ref, reactive, nextTick, defineProps, watch, onMounted } from 'vue';
  14. import { SvgIcon } from '/@/components/Icon';
  15. import * as echarts from 'echarts';
  16. import { useRouter } from 'vue-router';
  17. let props = defineProps({
  18. measureData: {
  19. type: Object,
  20. default: () => {
  21. return {};
  22. },
  23. },
  24. });
  25. const roadTitle = '监测点位统计与分析';
  26. const measureRef = ref();
  27. let router = useRouter(); //路由
  28. // let xData = ref<any[]>([]);
  29. // let yData = ref<any[]>([]);
  30. // let maxData = reactive<any[]>([]);
  31. function getOption() {
  32. nextTick(() => {
  33. const myChart = echarts.init(measureRef.value);
  34. // let color = ['#FF9A22', '#FFD56E', '#00EC28', '#5DF076', '#12B9DB', '#6F8EF2'];
  35. let option = {
  36. tooltip: {
  37. trigger: 'axis',
  38. axisPointer: {
  39. type: 'shadow',
  40. },
  41. },
  42. legend: {
  43. textStyle: {
  44. color: '#ffffff', // 字体颜色
  45. },
  46. },
  47. grid: {
  48. top: '40',
  49. left: '10',
  50. bottom: '10',
  51. right: '10',
  52. containLabel: true,
  53. },
  54. xAxis: {
  55. type: 'category',
  56. data: [
  57. '柳塔矿',
  58. '寸草塔二矿',
  59. '布尔台矿',
  60. '乌兰木伦矿',
  61. '寸草塔矿',
  62. '石圪台矿',
  63. '补连塔矿',
  64. '哈拉沟矿',
  65. '上湾矿',
  66. '活鸡兔井',
  67. '大柳塔井',
  68. '锦界矿',
  69. '榆家梁矿',
  70. '保德矿',
  71. ],
  72. // data: [5, 7, 5, 8, 10, 6, 9, 11, 6, 7, 4, 8, 9, 7],
  73. //data: [0, 1, 0, 0, 2, 0, 1, 0, 0, 0, 0, 1, 2, 0],
  74. axisLabel: {
  75. show: true,
  76. color: '#ffffff',
  77. rotate: 0,
  78. formatter: function (params) {
  79. let newParamsName = '';
  80. const paramsNameNumber = params.length;
  81. const provideNumber = 3; // 单行显示文字个数
  82. const rowNumber = Math.ceil(paramsNameNumber / provideNumber);
  83. if (paramsNameNumber > provideNumber) {
  84. for (let p = 0; p < rowNumber; p++) {
  85. let tempStr = '';
  86. const start = p * provideNumber;
  87. const end = start + provideNumber;
  88. if (p === rowNumber - 1) {
  89. tempStr = params.substring(start, paramsNameNumber);
  90. } else {
  91. tempStr = params.substring(start, end) + '\n';
  92. }
  93. newParamsName += tempStr;
  94. }
  95. } else {
  96. newParamsName = params;
  97. }
  98. return newParamsName;
  99. },
  100. },
  101. // data: xData.value,
  102. },
  103. yAxis: [
  104. {
  105. type: 'value',
  106. max: 20,
  107. splitLine: {
  108. lineStyle: {
  109. color: 'rgba(21,80,126,.3)',
  110. type: 'dashed', //设置网格线类型 dotted:虚线 solid:实线
  111. },
  112. // show: item.linetype == 'line' ? true : false,
  113. show: true,
  114. },
  115. },
  116. ],
  117. series: [
  118. {
  119. name: '测点异常数',
  120. type: 'bar',
  121. stack: 'Ad',
  122. barMaxWidth: '24',
  123. emphasis: {
  124. focus: 'series',
  125. },
  126. itemStyle: {
  127. color: '#F56731',
  128. },
  129. label: {
  130. show: true,
  131. formatter: (params) => (params.value > 0 ? params.value : ''),
  132. },
  133. data: [0, 1, 0, 0, 2, 0, 1, 0, 0, 0, 0, 1, 2, 0],
  134. },
  135. {
  136. name: '测点正常数',
  137. type: 'bar',
  138. stack: 'Ad',
  139. barMaxWidth: '24',
  140. emphasis: {
  141. focus: 'series',
  142. },
  143. itemStyle: {
  144. color: '#00E8FFBB',
  145. },
  146. label: {
  147. show: true,
  148. textStyle: {
  149. //数值样式
  150. color: '#000',
  151. },
  152. },
  153. data: [5, 6, 5, 8, 8, 6, 8, 11, 6, 7, 4, 7, 7, 7],
  154. },
  155. {
  156. name: '',
  157. type: 'bar',
  158. // stack: 'Ad',
  159. barGap: '-100%',
  160. barMaxWidth: '24',
  161. z: 1,
  162. emphasis: {
  163. focus: 'series',
  164. },
  165. itemStyle: {
  166. color: '#00E8FF00',
  167. },
  168. tooltip: {
  169. show: false,
  170. },
  171. label: {
  172. show: true,
  173. position: 'top', //在上方显示
  174. textStyle: {
  175. //数值样式
  176. color: '#fff',
  177. fontSize: 14,
  178. },
  179. },
  180. data: [5, 7, 5, 8, 10, 6, 9, 11, 6, 7, 4, 8, 9, 7],
  181. },
  182. ],
  183. };
  184. myChart.setOption(option);
  185. // 监听柱状图的点击事件
  186. myChart.on('click', function (params) {
  187. if (params.componentType === 'series') {
  188. // alert('您点击的是第 ' + (params.dataIndex + 1) + ' 个柱子,其值为 ' + params.value);
  189. router.push('/micro-vent-3dModal/dashboard/analysis?type=tunMonitor&deviceType=dusting');
  190. }
  191. });
  192. window.onresize = function () {
  193. myChart.resize();
  194. };
  195. });
  196. }
  197. watch(
  198. () => props.measureData,
  199. (newV, oldV) => {
  200. if (JSON.stringify(newV) != '{}') {
  201. getOption();
  202. }
  203. },
  204. {
  205. immediate: true,
  206. deep: true,
  207. }
  208. );
  209. onMounted(() => {
  210. getOption();
  211. });
  212. </script>
  213. <style lang="less" scoped>
  214. @font-face {
  215. font-family: 'douyuFont';
  216. src: url('../../../../assets/font/douyuFont.otf');
  217. }
  218. .measure-point {
  219. width: 100%;
  220. height: 100%;
  221. position: relative;
  222. .title {
  223. position: absolute;
  224. left: 50px;
  225. top: 10px;
  226. color: #fff;
  227. font-family: 'douyuFont';
  228. font-size: 14px;
  229. }
  230. .measure-content {
  231. // width: 100%;
  232. // position: relative;
  233. height: 100%;
  234. padding: 42px 40px 15px 40px;
  235. box-sizing: border-box;
  236. .echart-box {
  237. // position: absolute;
  238. width: 100%;
  239. height: 100%;
  240. .measure {
  241. width: 100%;
  242. height: 100%;
  243. }
  244. }
  245. }
  246. }
  247. </style>