QHCurve.vue 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. <template>
  2. <div class="main-contents">
  3. <!-- <div class="point-des-box">
  4. <div>工况点</div>
  5. <div>负压(Pa): {{ selectDataObj.dataH }}</div>
  6. <div>风量(m³/min): {{ (selectDataObj.dataQ * 60).toFixed(2) }}</div>
  7. </div> -->
  8. <div class="main" ref="main"></div>
  9. </div>
  10. </template>
  11. <script lang="ts" setup>
  12. import { ref, reactive, nextTick, defineProps, watch } from 'vue';
  13. import * as echarts from 'echarts';
  14. import { get } from 'lodash-es';
  15. // import { useGlobSetting } from '/@/hooks/setting';
  16. // const { sysOrgCode } = useGlobSetting();
  17. const props = defineProps<{ mainfan: Record<string, any>; /** QH */ fan1Prop: [string, string]; fan2Prop: [string, string] }>();
  18. const selectDataObj = ref({
  19. dataQ: 0,
  20. dataH: 0,
  21. });
  22. //echart图表数据
  23. const echartData = reactive<any>({
  24. xdata: [],
  25. ydata: [],
  26. ydata1: [],
  27. });
  28. const maxM3 = ref(150); // 高家梁是150,其他400
  29. const maxMPa = ref(4000);
  30. const main = ref();
  31. function changeSelect(selectData) {
  32. let objParam;
  33. if (!selectData) return;
  34. if (!selectData.readData) return;
  35. const fan2Active = selectData.readData.Fan2StartStatus && selectData.readData.Fan2StartStatus == '1';
  36. if (fan2Active) {
  37. objParam = {
  38. dataQ: get(selectData, props.fan2Prop[0], 0),
  39. dataH: Math.abs(Number(get(selectData, props.fan2Prop[1], 0))),
  40. };
  41. } else {
  42. objParam = {
  43. dataQ: get(selectData, props.fan1Prop[0], 0),
  44. dataH: Math.abs(Number(get(selectData, props.fan1Prop[1], 0))),
  45. };
  46. }
  47. setChart(objParam, {
  48. dataha0: -0.056,
  49. dataha1: 3.6491,
  50. dataha2: 434.4,
  51. dataha3: 100,
  52. dataha4: -1000,
  53. });
  54. getOption();
  55. }
  56. // 设置曲线数据
  57. function setChart(param, character) {
  58. const dataQ = 300;
  59. const dataH = character.dataha0 * dataQ * dataQ + character.dataha1 * dataQ + character.dataha2;
  60. const Q1 = Math.round((parseFloat(param.dataQ) / 60) * 100) / 100;
  61. const H1 = parseFloat(param.dataH);
  62. selectDataObj.value.dataH = H1;
  63. selectDataObj.value.dataQ = Q1;
  64. const q = Q1 - dataQ;
  65. const h = H1 - dataH;
  66. // 风压特性曲线1
  67. const data: [number, number][] = [];
  68. // 风压特性曲线2
  69. const data2: [number, number][] = [];
  70. const datax: number[] = [];
  71. maxM3.value = Q1 < 100 ? 150 : Q1 < 200 ? 250 : Q1 < 300 ? 400 : Q1 < 400 ? 500 : Q1 < 600 ? 800 : 1000;
  72. maxMPa.value = H1 < 2000 ? 4000 : H1 < 2500 ? 5000 : 6000;
  73. for (let i = 30; i <= maxM3.value; i++) {
  74. const x = i;
  75. const y4 = character.dataha0 * (x - q) * (x - q) + character.dataha1 * (x - q) + character.dataha2 + h;
  76. data2.push([x, y4]);
  77. }
  78. for (let i = 0; i <= maxM3.value; i++) {
  79. const x = i;
  80. const y = (H1 / Q1 / Q1) * x * x;
  81. data.push([x, y]);
  82. datax.push(x * 60);
  83. }
  84. echartData.xdata = datax;
  85. echartData.ydata = data;
  86. echartData.ydata1 = data2;
  87. echartData.ydata2 = [[Q1, H1]];
  88. }
  89. function getOption() {
  90. nextTick(() => {
  91. const myChart = echarts.init(main.value);
  92. let option = {
  93. title: {
  94. textStyle: {
  95. color: '#3df6ff',
  96. fontSize: 14, // 字体颜色
  97. },
  98. text: '',
  99. },
  100. grid: {
  101. top: '25%',
  102. left: '5%',
  103. right: '19%',
  104. bottom: '8%',
  105. containLabel: true,
  106. },
  107. legend: {
  108. // x:'right',
  109. top: '5%',
  110. textStyle: {
  111. color: '#ffffff',
  112. fontSize: 14, // 字体颜色
  113. },
  114. data: ['风量', '负压'],
  115. },
  116. tooltip: {
  117. backgroundColor: 'rgba(0,0,0,0.8)',
  118. textStyle: {
  119. color: '#3df6ff',
  120. fontSize: 14, // 字体颜色
  121. },
  122. formatter: function (params) {
  123. // var res = '风量' + ' : ' + Math.round(params.data[0] * 60 * 10) / 10 + '(m³/min)<br/>'
  124. // res = res + '&emsp;&emsp;&emsp;' + params.data[0] + '(m³/s)<br/>'
  125. var res = '风量' + ' : ' + params.data[0] * 60 + '(m³/min)<br/>';
  126. res = res + '&emsp;&emsp;&emsp;' + params.data[0].toFixed(2) + '(m³/s)<br/>';
  127. res = res + '负压' + ' : ' + params.data[1] + '(Pa)<br/>';
  128. return res;
  129. },
  130. trigger: 'item',
  131. },
  132. color: ['#00bb00', '#ffbb00', '#ff0000', '#0000ff'],
  133. xAxis: [
  134. {
  135. name: '风量\r\n(m³/min)\r\n',
  136. nameTextStyle: {
  137. color: '#3df6ff',
  138. fontSize: 12,
  139. },
  140. axisLine: {
  141. lineStyle: {
  142. color: '#0092d5',
  143. width: 1, // 这里是为了突出显示加上的
  144. },
  145. },
  146. splitLine: {
  147. show: false, // 网格线
  148. lineStyle: {
  149. color: '#006c9d',
  150. type: 'dashed', // 设置网格线类型 dotted:虚线 solid:实线
  151. },
  152. },
  153. axisLabel: {
  154. show: true,
  155. position: 'bottom',
  156. textStyle: {
  157. color: '#b3b8cc',
  158. fontSize: 14,
  159. },
  160. formatter: function (value) {
  161. return value * 60 + '';
  162. },
  163. },
  164. type: 'value',
  165. min: 0,
  166. max: maxM3.value, // 高家梁最大9000,
  167. },
  168. {
  169. name: '',
  170. nameTextStyle: {
  171. color: '#3df6ff',
  172. fontSize: 12,
  173. },
  174. axisTick: {
  175. show: false,
  176. },
  177. axisLine: {
  178. show: false,
  179. lineStyle: {
  180. color: '#0092d5',
  181. width: 1, // 这里是为了突出显示加上的
  182. },
  183. },
  184. splitLine: {
  185. show: false, // 网格线
  186. lineStyle: {
  187. color: '#006c9d',
  188. type: 'dashed', // 设置网格线类型 dotted:虚线 solid:实线
  189. },
  190. },
  191. axisLabel: {
  192. show: false,
  193. textStyle: {
  194. color: '#b3b8cc',
  195. fontSize: 14,
  196. },
  197. },
  198. type: 'value',
  199. min: 0,
  200. // max: 400,
  201. data: echartData.xdata,
  202. },
  203. ],
  204. yAxis: [
  205. {
  206. name: '负压(Pa)',
  207. splitNumber: 5,
  208. nameTextStyle: {
  209. color: '#3df6ff',
  210. fontSize: 12,
  211. },
  212. axisLine: {
  213. show: true,
  214. lineStyle: {
  215. color: '#0092d5',
  216. width: 1, // 这里是为了突出显示加上的
  217. },
  218. },
  219. splitLine: {
  220. show: true, // 网格线
  221. lineStyle: {
  222. color: '#006c9d',
  223. type: 'dashed', // 设置网格线类型 dotted:虚线 solid:实线
  224. },
  225. },
  226. axisLabel: {
  227. show: true,
  228. textStyle: {
  229. color: '#b3b8cc',
  230. fontSize: 14,
  231. },
  232. },
  233. type: 'value',
  234. min: 0,
  235. max: maxMPa.value,
  236. },
  237. ],
  238. series: [
  239. {
  240. type: 'effectScatter',
  241. symbolSize: 5,
  242. // symbolOffset:[1, 1],
  243. showEffectOn: 'render',
  244. // 涟漪特效相关配置。
  245. rippleEffect: {
  246. // 波纹的绘制方式,可选 'stroke' 和 'fill'。
  247. brushType: 'stroke',
  248. },
  249. zlevel: 1,
  250. z: 999,
  251. itemStyle: {
  252. color: '#ff0000',
  253. },
  254. data: echartData.ydata2,
  255. },
  256. {
  257. name: '风量',
  258. yAxisIndex: 0,
  259. xAxisIndex: 1,
  260. type: 'line',
  261. smooth: true,
  262. animationDuration: 1000,
  263. showSymbol: false,
  264. data: echartData.ydata,
  265. },
  266. {
  267. name: '负压',
  268. yAxisIndex: 0,
  269. xAxisIndex: 1,
  270. type: 'line',
  271. smooth: true,
  272. animationDuration: 1000,
  273. showSymbol: false,
  274. data: echartData.ydata1,
  275. },
  276. ],
  277. };
  278. myChart.setOption(option);
  279. window.onresize = function () {
  280. myChart.resize();
  281. };
  282. });
  283. }
  284. watch(
  285. () => props.mainfan,
  286. (val) => {
  287. changeSelect(val);
  288. },
  289. {
  290. deep: true,
  291. }
  292. );
  293. </script>
  294. <style lang="less" scoped>
  295. .main-contents {
  296. position: relative;
  297. width: 100%;
  298. height: 100%;
  299. // .point-des-box {
  300. // position: absolute;
  301. // background: #0d0d0dbd;
  302. // padding: 5px 8px;
  303. // border-radius: 10px;
  304. // border: 1px solid #ffffff;
  305. // z-index: 999;
  306. // color: #fff;
  307. // right: 20px;
  308. // top: 10px;
  309. // }
  310. .main {
  311. width: 100%;
  312. height: 100%;
  313. }
  314. }
  315. </style>