flowCharts.vue 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. <template>
  2. <div class="countryLineChart" ref="countryLineChart"></div>
  3. </template>
  4. <script>
  5. // import * as echarts from "echarts";
  6. import config from "@/config/index";
  7. import * as echarts from "echarts/core";
  8. import { LineChart } from "echarts/charts";
  9. import {
  10. TitleComponent,
  11. TooltipComponent,
  12. LegendComponent,
  13. DataZoomComponent,
  14. VisualMapComponent,
  15. GridComponent,
  16. } from "echarts/components";
  17. import { CanvasRenderer } from "echarts/renderers";
  18. echarts.use([
  19. TitleComponent,
  20. TooltipComponent,
  21. GridComponent,
  22. LineChart,
  23. CanvasRenderer,
  24. LegendComponent,
  25. DataZoomComponent,
  26. VisualMapComponent,
  27. ]);
  28. export default {
  29. name: "countryLineChart",
  30. props: ["list", "keys", "xName", "subsection"],
  31. data: function() {
  32. return {
  33. leftList: [],
  34. rightList: [],
  35. chart: undefined,
  36. xText: {},
  37. };
  38. },
  39. filters: {},
  40. methods: {
  41. format(v) {
  42. if (isNaN(v)) return 0;
  43. let o = v.toFixed(4);
  44. if (v > 10000) {
  45. o = (v / 10000).toFixed(4) + "万";
  46. }
  47. return o;
  48. },
  49. formatDate(t) {
  50. const originT = t.split("");
  51. return [originT[8] + originT[9], originT[10] + originT[11]].join(":");
  52. },
  53. formatTitloop() {
  54. let pieces = [];
  55. for (let i = 0; i < this.list.length; i++) {
  56. const v = this.list[i];
  57. this.xText[v.time_stamp] = i;
  58. }
  59. for (let i = 0; i < this.subsection.length; i++) {
  60. const v = this.subsection[i];
  61. pieces.push({
  62. gte: this.xText[v.start_x],
  63. lt: this.xText[v.end_x],
  64. color: v.end_y - v.start_y > 0 ? "#00bed0" : "#fcc543",
  65. });
  66. }
  67. return pieces;
  68. },
  69. formatte(list) {
  70. let values = [],
  71. keys = [];
  72. for (let o = 0; o < list.length; o++) {
  73. const v = list[o], key = v[this.xName];
  74. keys.push(key);
  75. let k = 0, b = 0;
  76. for (let i = 0; i < this.subsection.length; i++) {
  77. const put = this.subsection[i];
  78. if(put.start_x - 0 <= key && put.end_x - 0 >= key){
  79. k = put.k;
  80. b = put.b;
  81. break
  82. }
  83. }
  84. for (let i = 0; i < this.keys.length; i++) {
  85. if (!values[i]) values[i] = [];
  86. values[i][o] = (k * key + b)*100;
  87. }
  88. }
  89. return {
  90. keys,
  91. values,
  92. };
  93. },
  94. getTvName(tvId) {
  95. let li = config.channelNameList || [];
  96. let t = "";
  97. for (let i = 0; i < li.length; i++) {
  98. const v = li[i];
  99. if (v.value !== tvId) continue;
  100. t = v.label;
  101. break;
  102. }
  103. return t;
  104. },
  105. createChart() {
  106. if (!this.$refs.countryLineChart) return;
  107. this.chart = echarts.init(this.$refs.countryLineChart);
  108. let chartData = this.formatte(this.list);
  109. this.chart.resize({
  110. height: (this.$refs.countryLineChart.offsetWidth * 6) / 16,
  111. });
  112. var option = {
  113. tooltip: {
  114. trigger: "axis",
  115. triggerOn: "mousemove",
  116. confine: true,
  117. axisPointer: {
  118. type: "line",
  119. axis: "x",
  120. },
  121. formatter: params => {
  122. const index = params[0].dataIndex,
  123. key = this.list[index].time_stamp - 0,
  124. li = this.subsection || [];
  125. let o = {};
  126. for (let i = 0; i < li.length; i++) {
  127. const v = li[i];
  128. if (v.start_x - 0 <= key && v.end_x - 0 >= key) {
  129. o = v;
  130. break;
  131. }
  132. }
  133. if (!o.start_x) return "";
  134. let t = "<table class='tool'>",
  135. inli = o.input || [],
  136. outli = o.output || [];
  137. t += "<tr><td>流入</td><td></td><td>" + (o.in * 100).toFixed(2) + "% </td></tr>";
  138. for (let i = 0; i < inli.length; i++) {
  139. const v = inli[i];
  140. t += `<tr><td>${v.channel}</td><td>${v.epg_name || ""}</td><td>${(
  141. v.value * 100
  142. ).toFixed(2)}%</td> </tr>`;
  143. }
  144. t += "<tr><td>流出</td><td></td><td>" + (o.out * 100).toFixed(2) + "% </td></tr>";
  145. for (let i = 0; i < outli.length; i++) {
  146. const v = outli[i];
  147. t += `<tr><td>${v.channel}</td> <td>${v.epg_name ||
  148. ""}</td><td>${(v.value * 100).toFixed(2)}%</td></tr>`;
  149. }
  150. t += "</table>";
  151. return t;
  152. },
  153. },
  154. legend: {
  155. data: this.keys.map(v => v.name),
  156. },
  157. grid: { left: 150, top: "10%", buttom: 0, right: 100 },
  158. xAxis: {
  159. type: "category",
  160. boundaryGap: true,
  161. data: chartData.keys,
  162. axisLabel: {
  163. formatter: v => {
  164. return this.formatDate(v);
  165. },
  166. },
  167. },
  168. yAxis: {
  169. type: "value",
  170. scale: true,
  171. },
  172. visualMap: {
  173. show: false,
  174. dimension: 0,
  175. pieces: this.formatTitloop(chartData.values),
  176. },
  177. series: chartData.values.map((v, i) => {
  178. return {
  179. type: "line",
  180. name: this.keys[i].name,
  181. data: v,
  182. showAllSymbol: false,
  183. };
  184. }),
  185. };
  186. option && this.chart.setOption(option);
  187. },
  188. formatsubsection() {
  189. let bei = 100;
  190. for (let i = 0; i < this.subsection.length; i++) {
  191. const v = this.subsection[i];
  192. let sx = v.start_x,
  193. sy = v.start_y,
  194. ex = v.end_x,
  195. ey = v.end_y;
  196. let k = ((ey*bei - sy*bei) / bei / (ex - sx)).toFixed(8) - 0;
  197. let b = sy - k * sx;
  198. if(k === 0) k = 0;
  199. v.k = k;
  200. v.b = b;
  201. }
  202. },
  203. },
  204. watch: {
  205. list() {
  206. if (this.chart) this.chart.dispose();
  207. this.formatsubsection();
  208. this.createChart();
  209. },
  210. },
  211. mounted() {
  212. this.formatsubsection();
  213. this.createChart();
  214. },
  215. beforeUnmount: function() {
  216. this.chart.dispose();
  217. },
  218. components: {},
  219. };
  220. </script>
  221. <style>
  222. .removeHeader {
  223. display: none;
  224. }
  225. </style>