index.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658
  1. <script setup name="rateAnalysis">
  2. import searchCop from './components/search.vue'
  3. import excelCop from '@/components/excel.vue'
  4. import treeCop from '@/components/tree.vue'
  5. import chartCop from './components/chart.vue'
  6. import lineChartCop from './components/lineChart.vue'
  7. import scatterSingleChartCop from './components/scatterSingleChart.vue'
  8. import { ElMessage } from 'element-plus';
  9. import { onMounted, ref, onActivated, shallowRef, reactive } from 'vue'
  10. import request from '@/api/axios.js'
  11. // import flowerRes from '@/data/flower.json'
  12. import lineChartRes from '@/data/lineNew.json'
  13. /**配置参数 */
  14. const treeHeight = ref(window.innerHeight - 140 + 'px') //tree高度
  15. const excelHeight = ref(window.innerHeight - 140 + 'px') //excel高度
  16. const tableHeight = ref(window.innerHeight - 140 + 'px')
  17. /**excel 开始 */
  18. const excelCheckIds = ref([])
  19. const excelList = ref([])
  20. //点击excel项时
  21. const funExcelChange = async (obj) => {
  22. excelCheckIds.value = [obj.id] //当为单选展示风机图表时
  23. chartExcelList.value = excelList.value.map(o=> {
  24. return {
  25. ...o,
  26. name: o.windturbine
  27. }
  28. }) // 选中excel当前项时, excel列表赋值给dialog 下拉框
  29. queryForm.checkIds = excelList.value.map(o => o.id)
  30. funSubmit()
  31. }
  32. const funExcelCheckChange = ({ checkArr, data }) => {
  33. excelCheckIds.value = checkArr
  34. }
  35. /**tree 开始 */
  36. const treeData = ref([])
  37. const actTreeNode = ref(null)
  38. const funRepeatMap = (arr) => {
  39. return arr.map(o => {
  40. if (o.children) {
  41. const findIndex = o.children.findIndex(p => !!p.type)
  42. if (findIndex !== -1) {
  43. o.childs = o.children
  44. o.children = []
  45. if(!actTreeNode.value){
  46. actTreeNode.value = o
  47. }
  48. }
  49. }
  50. return {
  51. ...o,
  52. children: o.children?.length ? funRepeatMap(o.children) : []
  53. }
  54. })
  55. }
  56. const funGetTree = async () => {
  57. const res = await request.get("/power/process/tree")
  58. actTreeNode.value = null
  59. excelList.value = []
  60. treeData.value = funRepeatMap(res.data)
  61. if(actTreeNode.value){
  62. funCurrentChange({current: actTreeNode.value, currentNode: null})
  63. funExcelChange({id: actTreeNode.value.childs[0].id})
  64. }
  65. }
  66. const funTreeCheckChange = ({ current, checkedNodes, checkedKeys, halfCheckedNodes, halfCheckedKeys }) => { //tree change -> excel change
  67. funCurrentChange({ current, currentNode: '' })
  68. const checkIds = []
  69. if (checkedNodes.length) {
  70. for (const node of checkedNodes) {
  71. if (node.childs && node.childs.length) {
  72. for (const child of node.childs) {
  73. checkIds.push(child.id)
  74. }
  75. }
  76. }
  77. }
  78. excelCheckIds.value = checkIds
  79. }
  80. const funCurrentChange = ({ current, currentNode }) => {
  81. if (current.childs) {
  82. excelList.value = current.childs.map(o => {
  83. return {
  84. id: o.id,
  85. interval: o.interval,
  86. path: o.path,
  87. prepareid: o.prepareid,
  88. station: o.station,
  89. time: o.time,
  90. type: o.type,
  91. windturbine: o.windturbine,
  92. name: o.path.substring(o.path.indexOf(o.station + '_') + (o.station + '_').length)
  93. }
  94. })
  95. } else {
  96. excelList.value = []
  97. }
  98. }
  99. /**chart */
  100. const funText = (index) => {
  101. let str = ''
  102. switch (index) {
  103. case 0:
  104. str = '0-2.5'
  105. break
  106. case 1:
  107. str = '2.5-5'
  108. break
  109. case 2:
  110. str = '5-7.5'
  111. break
  112. case 3:
  113. str = '7.5-10'
  114. break
  115. case 4:
  116. str = '10-12.5'
  117. break
  118. case 5:
  119. str = '12.5-15'
  120. break
  121. case 6:
  122. str = '15-17.5'
  123. break
  124. case 7:
  125. str = '17.5-20'
  126. break
  127. case 8:
  128. str = '20-22.5'
  129. break
  130. case 9:
  131. str = '22.5-25'
  132. break
  133. case 10:
  134. str = '25-inf'
  135. break
  136. }
  137. return str
  138. }
  139. const chartData = ref([]) //roses的chartList
  140. let chartId = 1
  141. /**submit */
  142. const funSubmit = async () => {
  143. const rosesRes = await request.get('/wind/roses', {
  144. params: {
  145. ids: excelCheckIds.value.join(','),
  146. mode: 0
  147. }
  148. })
  149. const lineRes = await request.get('/wind/deviation/ratio', {
  150. params: {
  151. ids: excelCheckIds.value.join(','),
  152. mode: 0
  153. }
  154. })
  155. // const rosesRes = flowerRes
  156. // const lineRes = lineChartRes
  157. if (rosesRes.code === 200) {
  158. if (rosesRes.data?.length) {
  159. console.log(rosesRes.data)
  160. chartData.value = []
  161. for (const chart of rosesRes.data) {
  162. chartData.value.push({
  163. id: chartId,
  164. title: '',
  165. subtext: '风速风向分布图',
  166. xAxis: {
  167. type: 'category',
  168. boundaryGap: false,
  169. data: ['N','', 'N-E','', 'E','', 'S-E','', 'S','', 'S-W','', 'W','', 'W-N',''],
  170. splitLine: {
  171. show: true
  172. },
  173. },
  174. isRadar: false,
  175. series: chart.roses?.length ?chart.roses.map((o, index) => {
  176. return {
  177. type: 'bar',
  178. data: o,
  179. coordinateSystem: 'polar',
  180. name: funText(index),
  181. stack: 'a',
  182. emphasis: {
  183. focus: 'series'
  184. }
  185. }
  186. }): []
  187. })
  188. chartId++
  189. chartData.value.push({
  190. id: chartId,
  191. title: '',
  192. subtext: '风速风向频次图',
  193. xAxis: {
  194. type: 'category',
  195. boundaryGap: false,
  196. data: ['N','', 'N-E','', 'E','', 'S-E','', 'S','', 'S-W','', 'W','', 'W-N',''],
  197. splitLine: {
  198. show: true
  199. }
  200. },
  201. isRadar: true, //显示雷达图
  202. series: chart.count?.length? [...chart.count.map((o,index) => {
  203. return {
  204. type: 'bar',
  205. data: o,
  206. coordinateSystem: 'polar',
  207. name: funText(index),
  208. stack: 'a',
  209. emphasis: {
  210. focus: 'series'
  211. }
  212. }
  213. }), {
  214. type: 'radar',
  215. tooltip: {
  216. trigger: 'item'
  217. },
  218. // areaStyle: {},
  219. data: [
  220. {
  221. // value: [1,2,3,4,5,6,7,8],
  222. value: chart.radar,
  223. name: '对风风向'
  224. }
  225. ]
  226. }]: []
  227. })
  228. chartId++
  229. }
  230. }
  231. }
  232. if(lineRes.code === 200){
  233. console.log(lineRes.data)
  234. if(lineRes.data?.length){
  235. lineDataSet.value[0].source = lineRes.data[0].scatter.map(o => {
  236. return [o.x+'', o.y]
  237. })
  238. lineSeries.value = [{
  239. name: "偏差率",
  240. type: "line",
  241. symbol: "line", //设定为实心点
  242. symbolSize: 0, //设定实心点的大小
  243. smooth: true, //这个是把线变成曲线
  244. data: lineRes.data[0].count,
  245. xAxisIndex: 0,
  246. yAxisIndex: 1,
  247. },
  248. {
  249. type: 'effectScatter',
  250. showEffectOn: "emphasis",
  251. rippleEffect: {
  252. scale: 1
  253. },
  254. legendHoverLink: false,
  255. name: '数据散点',
  256. symbolSize: 5,
  257. datasetIndex: 0,
  258. encode: {
  259. x: 'x',
  260. y: 'y'
  261. },
  262. xAxisIndex: 0,
  263. yAxisIndex: 0,
  264. }]
  265. }
  266. }
  267. }
  268. /**lineChart */
  269. const linexAxis = ref({
  270. type: 'category',
  271. data: new Array(101).fill(-50).map((o,index) => Number((o + index).toFixed(1))),
  272. splitLine: {
  273. show: false
  274. },
  275. axisTick: {
  276. show: true
  277. }
  278. })
  279. const lineyAxis = ref([
  280. {
  281. type: 'value',
  282. name: 'm/s',
  283. splitLine: {
  284. show: false
  285. },
  286. axisTick: {
  287. show: true
  288. }
  289. },{
  290. type: 'value',
  291. splitLine: {
  292. show: false
  293. },
  294. axisTick: {
  295. show: true
  296. }
  297. }
  298. ])
  299. const lineSeries = ref([])
  300. const lineDataSet = ref([
  301. {
  302. source: []
  303. }
  304. ])
  305. /**scatter chart */
  306. const scatterxData = ref([
  307. {
  308. type: 'category',
  309. data: [
  310. '12a', '1a', '2a', '3a', '4a', '5a', '6a',
  311. '7a', '8a', '9a', '10a', '11a',
  312. '12p', '1p', '2p', '3p', '4p', '5p',
  313. '6p', '7p', '8p', '9p', '10p', '11p'
  314. ],
  315. boundaryGap: false,
  316. splitLine: {
  317. show: true
  318. },
  319. axisLine: {
  320. show: true
  321. }
  322. }
  323. ])
  324. const scatteryData = ref([
  325. {
  326. type: 'category',
  327. data: [
  328. 'Saturday', 'Friday', 'Thursday',
  329. 'Wednesday', 'Tuesday', 'Monday', 'Sunday'
  330. ],
  331. axisLine: {
  332. show: false
  333. },
  334. splitLine: {
  335. show: false
  336. },
  337. },
  338. ])
  339. const scatterSeries = ref(
  340. [
  341. {
  342. name: 'Punch Card',
  343. type: 'scatter',
  344. symbolSize: function (val) {
  345. return val[2] * 2;
  346. },
  347. data: [[0, 0, 5], [0, 1, 1], [0, 2, 0], [0, 3, 0], [0, 4, 0], [0, 5, 0], [0, 6, 0], [0, 7, 0], [0, 8, 0], [0, 9, 0], [0, 10, 0], [0, 11, 2], [0, 12, 4], [0, 13, 1], [0, 14, 1], [0, 15, 3], [0, 16, 4], [0, 17, 6], [0, 18, 4], [0, 19, 4], [0, 20, 3], [0, 21, 3], [0, 22, 2], [0, 23, 5], [1, 0, 7], [1, 1, 0], [1, 2, 0], [1, 3, 0], [1, 4, 0], [1, 5, 0], [1, 6, 0], [1, 7, 0], [1, 8, 0], [1, 9, 0], [1, 10, 5], [1, 11, 2], [1, 12, 2], [1, 13, 6], [1, 14, 9], [1, 15, 11], [1, 16, 6], [1, 17, 7], [1, 18, 8], [1, 19, 12], [1, 20, 5], [1, 21, 5], [1, 22, 7], [1, 23, 2], [2, 0, 1], [2, 1, 1], [2, 2, 0], [2, 3, 0], [2, 4, 0], [2, 5, 0], [2, 6, 0], [2, 7, 0], [2, 8, 0], [2, 9, 0], [2, 10, 3], [2, 11, 2], [2, 12, 1], [2, 13, 9], [2, 14, 8], [2, 15, 10], [2, 16, 6], [2, 17, 5], [2, 18, 5], [2, 19, 5], [2, 20, 7], [2, 21, 4], [2, 22, 2], [2, 23, 4], [3, 0, 7], [3, 1, 3], [3, 2, 0], [3, 3, 0], [3, 4, 0], [3, 5, 0], [3, 6, 0], [3, 7, 0], [3, 8, 1], [3, 9, 0], [3, 10, 5], [3, 11, 4], [3, 12, 7], [3, 13, 14], [3, 14, 13], [3, 15, 12], [3, 16, 9], [3, 17, 5], [3, 18, 5], [3, 19, 10], [3, 20, 6], [3, 21, 4], [3, 22, 4], [3, 23, 1], [4, 0, 1], [4, 1, 3], [4, 2, 0], [4, 3, 0], [4, 4, 0], [4, 5, 1], [4, 6, 0], [4, 7, 0], [4, 8, 0], [4, 9, 2], [4, 10, 4], [4, 11, 4], [4, 12, 2], [4, 13, 4], [4, 14, 4], [4, 15, 14], [4, 16, 12], [4, 17, 1], [4, 18, 8], [4, 19, 5], [4, 20, 3], [4, 21, 7], [4, 22, 3], [4, 23, 0], [5, 0, 2], [5, 1, 1], [5, 2, 0], [5, 3, 3], [5, 4, 0], [5, 5, 0], [5, 6, 0], [5, 7, 0], [5, 8, 2], [5, 9, 0], [5, 10, 4], [5, 11, 1], [5, 12, 5], [5, 13, 10], [5, 14, 5], [5, 15, 7], [5, 16, 11], [5, 17, 6], [5, 18, 0], [5, 19, 5], [5, 20, 3], [5, 21, 4], [5, 22, 2], [5, 23, 0], [6, 0, 1], [6, 1, 0], [6, 2, 0], [6, 3, 0], [6, 4, 0], [6, 5, 0], [6, 6, 0], [6, 7, 0], [6, 8, 0], [6, 9, 0], [6, 10, 1], [6, 11, 0], [6, 12, 2], [6, 13, 1], [6, 14, 3], [6, 15, 4], [6, 16, 0], [6, 17, 0], [6, 18, 0], [6, 19, 0], [6, 20, 1], [6, 21, 2], [6, 22, 2], [6, 23, 6]]
  348. .map(function (item) {
  349. return [item[1], item[0], item[2]];
  350. }),
  351. animationDelay: function (idx) {
  352. return idx * 5;
  353. }
  354. }
  355. ]
  356. )
  357. /**dialog */
  358. const dialog = ref(false)
  359. const actChartName = ref('')
  360. const actCop = shallowRef(chartCop)
  361. const actCopList = ref([
  362. // {
  363. // xAxis: [],
  364. // subtext: '',
  365. // title: '',
  366. // isRadar: false,
  367. // series: [],
  368. // yAxis: [],
  369. // dataset: []
  370. // }
  371. ])
  372. const queryForm = reactive({
  373. checkIds: []
  374. })
  375. const chartExcelList = ref([]) //dialog 下拉项
  376. const funActCop = (obj, type) => {
  377. switch(type){
  378. case 'chartCop1':
  379. actChartName.value = 'chartCop1'
  380. actCop.value = chartCop
  381. break
  382. case 'chartCop2':
  383. actChartName.value = 'chartCop2'
  384. actCop.value = chartCop
  385. break
  386. case 'lineChartCop':
  387. actChartName.value = 'lineChartCop'
  388. actCop.value = lineChartCop
  389. break
  390. case 'scatterSingleChartCop':
  391. actChartName.value = 'scatterSingleChartCop'
  392. actCop.value = scatterSingleChartCop
  393. break
  394. }
  395. dialog.value = true
  396. actCopList.value = [{...obj, id: 0}]
  397. }
  398. const funDiaSubmit = async () => {
  399. let url = ''
  400. switch(actChartName.value){
  401. case 'chartCop1':
  402. url = '/wind/roses'
  403. break
  404. case 'chartCop2':
  405. url = '/wind/roses'
  406. break
  407. case 'lineChartCop':
  408. url = '/wind/deviation/ratio'
  409. break
  410. case 'scatterSingleChartCop':
  411. url = '' //暂无接口
  412. break
  413. }
  414. if(url){
  415. let chartId = 1
  416. const res = await request.get(url, {
  417. params: {
  418. ids: queryForm.checkIds.join(','),
  419. mode: 0
  420. }
  421. })
  422. console.log(res)
  423. if(res.code===200){
  424. actCopList.value = []
  425. if(res.data?.length){
  426. for(const chart of res.data){
  427. if(actChartName.value==='chartCop1'){
  428. actCopList.value.push({
  429. id: chartId,
  430. title: chart.wt,
  431. subtext: '风速风向分布图',
  432. xAxis: {
  433. type: 'category',
  434. boundaryGap: false,
  435. data: ['N','', 'N-E','', 'E','', 'S-E','', 'S','', 'S-W','', 'W','', 'W-N',''],
  436. splitLine: {
  437. show: true
  438. },
  439. },
  440. isRadar: false,
  441. series: chart.roses?.length ?chart.roses.map((o, index) => {
  442. return {
  443. type: 'bar',
  444. data: o,
  445. coordinateSystem: 'polar',
  446. name: funText(index),
  447. stack: 'a',
  448. emphasis: {
  449. focus: 'series'
  450. }
  451. }
  452. }): []
  453. })
  454. chartId++
  455. }
  456. if(actChartName.value === 'chartCop2'){
  457. actCopList.value.push({
  458. id: chartId,
  459. title: chart.wt,
  460. subtext: '风速风向频次图',
  461. xAxis: {
  462. type: 'category',
  463. boundaryGap: false,
  464. data: ['N','', 'N-E','', 'E','', 'S-E','', 'S','', 'S-W','', 'W','', 'W-N',''],
  465. splitLine: {
  466. show: true
  467. }
  468. },
  469. isRadar: true, //显示雷达图
  470. series: chart.count?.length? [...chart.count.map((o,index) => {
  471. return {
  472. type: 'bar',
  473. data: o,
  474. coordinateSystem: 'polar',
  475. name: funText(index),
  476. stack: 'a',
  477. emphasis: {
  478. focus: 'series'
  479. }
  480. }
  481. }), {
  482. type: 'radar',
  483. tooltip: {
  484. trigger: 'item'
  485. },
  486. // areaStyle: {},
  487. data: [
  488. {
  489. // value: [1,2,3,4,5,6,7,8],
  490. value: chart.radar,
  491. name: '对风风向'
  492. }
  493. ]
  494. }]: []
  495. })
  496. chartId++
  497. }
  498. if(actChartName.value === 'lineChartCop'){
  499. actCopList.value.push({
  500. id: chartId,
  501. title: chart.wtId,
  502. xAxis: {
  503. type: 'category',
  504. data: new Array(101).fill(-50).map((o,index) => Number((o + index).toFixed(1))),
  505. splitLine: {
  506. show: false
  507. },
  508. axisTick: {
  509. show: true
  510. }
  511. },
  512. yAxis: [
  513. {
  514. type: 'value',
  515. name: 'm/s',
  516. splitLine: {
  517. show: false
  518. },
  519. axisTick: {
  520. show: true
  521. }
  522. },{
  523. type: 'value',
  524. splitLine: {
  525. show: false
  526. },
  527. axisTick: {
  528. show: true
  529. }
  530. }
  531. ],
  532. dataset: [{
  533. source: chart.scatter.map(o => {
  534. return [o.x+'', o.y]
  535. })
  536. }],
  537. series: [{
  538. name: "偏差率",
  539. type: "line",
  540. symbol: "line", //设定为实心点
  541. symbolSize: 0, //设定实心点的大小
  542. smooth: true, //这个是把线变成曲线
  543. data: chart.count,
  544. xAxisIndex: 0,
  545. yAxisIndex: 1,
  546. },
  547. {
  548. type: 'effectScatter',
  549. showEffectOn: "emphasis",
  550. rippleEffect: {
  551. scale: 1
  552. },
  553. legendHoverLink: false,
  554. name: '数据散点',
  555. symbolSize: 5,
  556. datasetIndex: 0,
  557. encode: {
  558. x: 'x',
  559. y: 'y'
  560. },
  561. xAxisIndex: 0,
  562. yAxisIndex: 0,
  563. }]
  564. })
  565. chartId++
  566. }
  567. }
  568. }
  569. }
  570. }
  571. }
  572. /**created */
  573. // funGetTree()
  574. /**activated */
  575. onMounted(() => {
  576. //test
  577. // funSubmit()
  578. //
  579. tableHeight.value = window.innerHeight - 140 + 'px'
  580. excelHeight.value =(window.innerHeight - 140) + 'px'
  581. treeHeight.value = (window.innerHeight - 140) + 'px'
  582. window.addEventListener('resize', () => {
  583. tableHeight.value = window.innerHeight - 140 + 'px'
  584. excelHeight.value = (window.innerHeight - 140) + 'px'
  585. treeHeight.value = (window.innerHeight - 140) + 'px'
  586. })
  587. })
  588. onActivated(() => {
  589. funGetTree()
  590. })
  591. </script>
  592. <template>
  593. <div class="bg-white py-[10px] px-[10px] relative">
  594. <!-- <search-cop class="mb-[20px] shadow rounded-[6px] shadow-blue-500" @submit="funSubmit">
  595. </search-cop> -->
  596. <el-dialog width="1000px" v-model="dialog" title="图表">
  597. <el-form class="whitespace-nowrap" :inline="true" :model="queryForm">
  598. <el-form-item label="" class="!mb-0">
  599. <el-select v-model="queryForm.checkIds" clearable collapse-tags multiple>
  600. <el-option v-for="item in chartExcelList" :key="item.id" :value="item.id" :label="item.name"></el-option>
  601. </el-select>
  602. </el-form-item>
  603. <el-form-item class="!mb-0">
  604. <submit-btn desc="多台展示" @click="funDiaSubmit"></submit-btn>
  605. </el-form-item>
  606. </el-form>
  607. <div class="flex flex-wrap justify-center items-center h-[600px] w-[950px] overflow-y-auto overflow-x-hidden">
  608. <component :is="actCop" :width="actCopList.length>1?'470px':'700px'" height="400px" v-for="item in actCopList" :key="item.id" :xAxis="item.xAxis" :subtext="item.subtext" :title="item.title"
  609. :isRadar="item.isRadar" :series="item.series" :yAxis="item.yAxis" :dataset="item.dataset"></component>
  610. </div>
  611. </el-dialog>
  612. <div class="relative shadow rounded-[6px] shadow-blue-500 px-[10px] pt-[10px] pb-[10px]">
  613. <div class="text-[14px] absolute top-[-7px] text-[#B3B3B3] left-[20px]">数据展示</div>
  614. <el-row :gutter="10">
  615. <el-col :span="5">
  616. <tree-cop :data="treeData" @checkChange="funTreeCheckChange" :show-checkbox="false" :height="treeHeight"
  617. @currentChange="funCurrentChange" @refresh="funGetTree">
  618. </tree-cop>
  619. </el-col>
  620. <el-col :span="3">
  621. <excel-cop :checkIds="excelCheckIds" :showCheckbox="false" :data="excelList" :height="excelHeight"
  622. @excelChange="funExcelChange" @checkChange="funExcelCheckChange"></excel-cop>
  623. </el-col>
  624. <el-col :span="16">
  625. <div :style="{ height: tableHeight }"
  626. class="flex flex-wrap justify-center items-center overflow-x-hidden overflow-y-auto ">
  627. <div class="mb-[10px] w-[49%] h-[49%] flex flex-col items-end shadow rounded-[6px] shadow-blue-500" v-for="(item, index) in chartData" :key="item.id" :class="{ 'mr-[10px]': index % 2 === 0 }">
  628. <el-icon class="mr-[10px] mt-[10px] cursor-pointer" size="18" @click="funActCop(item, 'chartCop'+ (index+1))">
  629. <ZoomIn />
  630. </el-icon>
  631. <chart-cop class="" height="100%" width="100%"
  632. :xAxis="item.xAxis" :subtext="item.subtext" :title="item.title" :isRadar="item.isRadar"
  633. :series="item.series">
  634. </chart-cop>
  635. </div>
  636. <div class="mr-[10px] w-[49%] h-[49%] flex flex-col items-end shadow rounded-[6px] shadow-blue-500">
  637. <el-icon class="mr-[10px] mt-[10px] cursor-pointer" size="18" @click="funActCop({xAxis: linexAxis, yAxis: lineyAxis, series: lineSeries, dataset: lineDataSet}, 'lineChartCop')">
  638. <ZoomIn />
  639. </el-icon>
  640. <line-chart-cop class="" height="100%" width="100%" :xAxis="linexAxis"
  641. :yAxis="lineyAxis" :series="lineSeries" :dataset="lineDataSet"></line-chart-cop>
  642. </div>
  643. <div class="w-[49%] h-[49%] flex flex-col items-end shadow rounded-[6px] shadow-blue-500">
  644. <el-icon class="mr-[10px] mt-[10px] cursor-pointer" size="18" @click="funActCop({xAxis: scatterxData, yAxis: scatteryData, series: scatterSeries}, 'scatterSingleChartCop')">
  645. <ZoomIn />
  646. </el-icon>
  647. <scatter-single-chart-cop class="" height="100%" width="100%"
  648. :xAxis="scatterxData" :yAxis="scatteryData" :series="scatterSeries"></scatter-single-chart-cop>
  649. </div>
  650. </div>
  651. </el-col>
  652. </el-row>
  653. </div>
  654. </div>
  655. </template>