c8a6d32d5416e2ba8439a4a6dd222028e388ede62e7965d2199f9084f2b4ea32.json 9.5 KB

1
  1. {"ast":null,"code":"import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport * as echarts from 'echarts';\nimport { getLabBasicStats } from '@/api';\nexport default {\n name: 'BasicStats',\n data() {\n return {\n levels: [],\n usage: {\n using: 0,\n abnormal: 0,\n idle: 0\n },\n chart: null\n };\n },\n async mounted() {\n const res = await getLabBasicStats();\n this.levels = res.data.levels;\n this.usage = res.data.usage;\n this.$nextTick(() => this.initChart(res.data));\n },\n beforeDestroy() {\n if (this.chart) this.chart.dispose();\n },\n methods: {\n initChart(data) {\n this.chart = echarts.init(this.$refs.chart);\n const option = {\n tooltip: {\n trigger: 'item',\n backgroundColor: 'rgba(13,34,71,0.9)',\n borderColor: '#1a3a6a',\n textStyle: {\n color: '#fff',\n fontSize: 12\n }\n },\n series: [{\n type: 'pie',\n radius: ['55%', '78%'],\n center: ['50%', '50%'],\n avoidLabelOverlap: false,\n label: {\n show: true,\n position: 'center',\n formatter: ['{num|' + data.totalLabs + '}', '{txt|实验室总数}'].join('\\n'),\n rich: {\n num: {\n fontSize: 28,\n fontWeight: 'bold',\n color: '#fff',\n fontFamily: 'Courier New',\n lineHeight: 36\n },\n txt: {\n fontSize: 12,\n color: '#8cb8e6',\n lineHeight: 20\n }\n }\n },\n emphasis: {\n label: {\n show: true,\n formatter: ['{num|' + data.totalLabs + '}', '{txt|实验室总数}'].join('\\n'),\n rich: {\n num: {\n fontSize: 28,\n fontWeight: 'bold',\n color: '#fff',\n fontFamily: 'Courier New',\n lineHeight: 36\n },\n txt: {\n fontSize: 12,\n color: '#8cb8e6',\n lineHeight: 20\n }\n }\n }\n },\n labelLine: {\n show: false\n },\n data: data.levels.map(l => ({\n name: l.name,\n value: l.value,\n itemStyle: {\n color: l.color\n }\n }))\n }]\n };\n this.chart.setOption(option);\n }\n }\n};","map":{"version":3,"names":["echarts","getLabBasicStats","name","data","levels","usage","using","abnormal","idle","chart","mounted","res","$nextTick","initChart","beforeDestroy","dispose","methods","init","$refs","option","tooltip","trigger","backgroundColor","borderColor","textStyle","color","fontSize","series","type","radius","center","avoidLabelOverlap","label","show","position","formatter","totalLabs","join","rich","num","fontWeight","fontFamily","lineHeight","txt","emphasis","labelLine","map","l","value","itemStyle","setOption"],"sources":["src/components/LabStats/BasicStats.vue"],"sourcesContent":["<template>\n <div class=\"panel-box basic-stats\">\n <div class=\"panel-title\">实验室基本情况统计</div>\n <div class=\"panel-content\">\n <div class=\"chart-row\">\n <div ref=\"chart\" class=\"chart-area\"></div>\n <div class=\"legend-list\">\n <div class=\"legend-item\" v-for=\"item in levels\" :key=\"item.name\">\n <span class=\"legend-dot\" :style=\"{ background: item.color }\"></span>\n <span class=\"legend-label\">{{ item.name }}</span>\n </div>\n </div>\n </div>\n <div class=\"usage-row\">\n <div class=\"usage-item\">\n <div class=\"usage-label\">使用</div>\n <div class=\"usage-value c-using\">{{ usage.using }}<span class=\"usage-unit\">间</span></div>\n </div>\n <div class=\"usage-item\">\n <div class=\"usage-label\">异常</div>\n <div class=\"usage-value c-abnormal\">{{ usage.abnormal }}<span class=\"usage-unit\">间</span></div>\n </div>\n <div class=\"usage-item\">\n <div class=\"usage-label\">空闲</div>\n <div class=\"usage-value c-idle\">{{ usage.idle }}<span class=\"usage-unit\">间</span></div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script>\nimport * as echarts from 'echarts'\nimport { getLabBasicStats } from '@/api'\n\nexport default {\n name: 'BasicStats',\n data() {\n return {\n levels: [],\n usage: { using: 0, abnormal: 0, idle: 0 },\n chart: null\n }\n },\n async mounted() {\n const res = await getLabBasicStats()\n this.levels = res.data.levels\n this.usage = res.data.usage\n this.$nextTick(() => this.initChart(res.data))\n },\n beforeDestroy() {\n if (this.chart) this.chart.dispose()\n },\n methods: {\n initChart(data) {\n this.chart = echarts.init(this.$refs.chart)\n const option = {\n tooltip: {\n trigger: 'item',\n backgroundColor: 'rgba(13,34,71,0.9)',\n borderColor: '#1a3a6a',\n textStyle: { color: '#fff', fontSize: 12 }\n },\n series: [{\n type: 'pie',\n radius: ['55%', '78%'],\n center: ['50%', '50%'],\n avoidLabelOverlap: false,\n label: {\n show: true,\n position: 'center',\n formatter: [\n '{num|' + data.totalLabs + '}',\n '{txt|实验室总数}'\n ].join('\\n'),\n rich: {\n num: { fontSize: 28, fontWeight: 'bold', color: '#fff', fontFamily: 'Courier New', lineHeight: 36 },\n txt: { fontSize: 12, color: '#8cb8e6', lineHeight: 20 }\n }\n },\n emphasis: {\n label: {\n show: true,\n formatter: [\n '{num|' + data.totalLabs + '}',\n '{txt|实验室总数}'\n ].join('\\n'),\n rich: {\n num: { fontSize: 28, fontWeight: 'bold', color: '#fff', fontFamily: 'Courier New', lineHeight: 36 },\n txt: { fontSize: 12, color: '#8cb8e6', lineHeight: 20 }\n }\n }\n },\n labelLine: { show: false },\n data: data.levels.map(l => ({\n name: l.name,\n value: l.value,\n itemStyle: { color: l.color }\n }))\n }]\n }\n this.chart.setOption(option)\n }\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.basic-stats {\n height: 100%;\n display: flex;\n flex-direction: column;\n\n .panel-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n}\n\n.chart-row {\n flex: 1;\n display: flex;\n align-items: center;\n min-height: 0;\n}\n\n.chart-area {\n flex: 1;\n height: 100%;\n min-height: 0;\n}\n\n.legend-list {\n width: 90px;\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.legend-item {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.legend-dot {\n width: 10px;\n height: 10px;\n border-radius: 2px;\n flex-shrink: 0;\n}\n\n.legend-label {\n font-size: 12px;\n color: $text-secondary;\n white-space: nowrap;\n}\n\n.usage-row {\n display: flex;\n gap: 8px;\n flex-shrink: 0;\n margin-top: 6px;\n}\n\n.usage-item {\n flex: 1;\n text-align: center;\n padding: 8px 0;\n background: rgba(255, 255, 255, 0.03);\n border: 1px solid rgba(255, 255, 255, 0.05);\n border-radius: 4px;\n}\n\n.usage-label {\n font-size: 12px;\n color: $text-muted;\n margin-bottom: 4px;\n}\n\n.usage-value {\n font-size: 22px;\n font-weight: bold;\n font-family: 'Courier New', monospace;\n\n &.c-using { color: #3EBCE3; }\n &.c-abnormal { color: #EE4A4E; }\n &.c-idle { color: #33C793; }\n}\n\n.usage-unit {\n font-size: 12px;\n color: $text-muted;\n font-weight: normal;\n margin-left: 2px;\n}\n</style>\n"],"mappings":";;AAgCA,YAAAA,OAAA;AACA,SAAAC,gBAAA;AAEA;EACAC,IAAA;EACAC,KAAA;IACA;MACAC,MAAA;MACAC,KAAA;QAAAC,KAAA;QAAAC,QAAA;QAAAC,IAAA;MAAA;MACAC,KAAA;IACA;EACA;EACA,MAAAC,QAAA;IACA,MAAAC,GAAA,SAAAV,gBAAA;IACA,KAAAG,MAAA,GAAAO,GAAA,CAAAR,IAAA,CAAAC,MAAA;IACA,KAAAC,KAAA,GAAAM,GAAA,CAAAR,IAAA,CAAAE,KAAA;IACA,KAAAO,SAAA,YAAAC,SAAA,CAAAF,GAAA,CAAAR,IAAA;EACA;EACAW,cAAA;IACA,SAAAL,KAAA,OAAAA,KAAA,CAAAM,OAAA;EACA;EACAC,OAAA;IACAH,UAAAV,IAAA;MACA,KAAAM,KAAA,GAAAT,OAAA,CAAAiB,IAAA,MAAAC,KAAA,CAAAT,KAAA;MACA,MAAAU,MAAA;QACAC,OAAA;UACAC,OAAA;UACAC,eAAA;UACAC,WAAA;UACAC,SAAA;YAAAC,KAAA;YAAAC,QAAA;UAAA;QACA;QACAC,MAAA;UACAC,IAAA;UACAC,MAAA;UACAC,MAAA;UACAC,iBAAA;UACAC,KAAA;YACAC,IAAA;YACAC,QAAA;YACAC,SAAA,GACA,UAAAhC,IAAA,CAAAiC,SAAA,QACA,cACA,CAAAC,IAAA;YACAC,IAAA;cACAC,GAAA;gBAAAb,QAAA;gBAAAc,UAAA;gBAAAf,KAAA;gBAAAgB,UAAA;gBAAAC,UAAA;cAAA;cACAC,GAAA;gBAAAjB,QAAA;gBAAAD,KAAA;gBAAAiB,UAAA;cAAA;YACA;UACA;UACAE,QAAA;YACAZ,KAAA;cACAC,IAAA;cACAE,SAAA,GACA,UAAAhC,IAAA,CAAAiC,SAAA,QACA,cACA,CAAAC,IAAA;cACAC,IAAA;gBACAC,GAAA;kBAAAb,QAAA;kBAAAc,UAAA;kBAAAf,KAAA;kBAAAgB,UAAA;kBAAAC,UAAA;gBAAA;gBACAC,GAAA;kBAAAjB,QAAA;kBAAAD,KAAA;kBAAAiB,UAAA;gBAAA;cACA;YACA;UACA;UACAG,SAAA;YAAAZ,IAAA;UAAA;UACA9B,IAAA,EAAAA,IAAA,CAAAC,MAAA,CAAA0C,GAAA,CAAAC,CAAA;YACA7C,IAAA,EAAA6C,CAAA,CAAA7C,IAAA;YACA8C,KAAA,EAAAD,CAAA,CAAAC,KAAA;YACAC,SAAA;cAAAxB,KAAA,EAAAsB,CAAA,CAAAtB;YAAA;UACA;QACA;MACA;MACA,KAAAhB,KAAA,CAAAyC,SAAA,CAAA/B,MAAA;IACA;EACA;AACA","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}