123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390 |
- <template>
- <div class="realtime-line">
- <div style="width: 100%;height: 100%;">
- <el-carousel indicator-position="outside" :interval="30000" height="95%" arrow="never">
- <el-carousel-item v-for="(item, index) in Math.ceil(Object.keys(workshopList).length / (x * y))" :key="index">
- <div style="display: flex;flex-wrap: wrap;height: 100%">
- <div
- v-loading="chartLoading"
- class="chart-box"
- :class="indexkey % x === 0 ? 'row-first-chart' : ''"
- v-for="(key, indexkey) in Object.keys(workshopList).slice(index * x * y , (index + 1) * x * y)"
- :key="key"
- :style="chartBoxStyle"
- >
- <div class="chart-box-title">{{ workshopList[key].workshopName }}</div>
- <div class="chart-box-content">
- <div :id="key" style="height: 100%;"/>
- </div>
- </div>
- </div>
- </el-carousel-item>
- </el-carousel>
- </div>
- <!--<div
- v-loading="chartLoading"
- class="chart-box"
- :class="index % x === 0 ? 'row-first-chart' : ''"
- v-for="(key, index) in Object.keys(workshopList)"
- :key="key"
- :style="chartBoxStyle"
- >
- <div class="chart-box-title">{{ workshopList[key].workshopName }}</div>
- <div class="chart-box-content">
- <div :id="key" style="height: 100%"/>
- </div>
- </div>-->
- </div>
- </template>
- <script>
- import { historyChartAllData } from '@/api/HistoryData'
- import { findByAcquisitionStationId } from '@/api/Workshop'
- import { findYMax } from '@/api/DashboardLayout'
- import moment from 'moment'
- import { mapState } from 'vuex'
- export default {
- name: 'RealtimeLine',
- data() {
- return {
- chartLoading: true,
- workshopList: {},
- timeList: [],
- chartData: {},
- chartList: {},
- initCompleted: false,
- canUpdate: true,
- yMaxMap: {},
- }
- },
- computed: {
- ...mapState({
- realtimeDataMap: (state, getter) => state.queue.realtimeDataMap,
- lastTime: (state, getter) => state.queue.lastTime,
- acquisitionStation: state => state.company.acquisitionStation,
- x: state => state.company.acquisitionStation.xQuantity,
- y: state => state.company.acquisitionStation.yQuantity,
- }),
- chartBoxStyle() {
- const baseX = this.x === 1 ? 99 : 90
- const baseY = this.y === 1 ? 99 : 90
- const baseMargin = this.x === 1 ? 10000 : 3
- return {
- width: baseX / this.x + '%',
- height: baseY / this.y + '%',
- marginLeft: baseMargin / (this.x - 1) + '%',
- }
- },
- },
- watch: {
- lastTime() {
- if (this.initCompleted && this.canUpdate) {
- this.updateChart()
- }
- },
- async workshopList(newVal) {
- if (newVal) {
- this.$nextTick(() => {
- this.chartLoading = false
- for (const key in this.chartList) {
- window.removeEventListener('resize', this.chartList[key].resize)
- this.chartList[key].dispose()
- this.chartList[key] = null
- }
- this.chartList = {}
- for (const key in this.workshopList) {
- this.chartList[key] = this.$echarts.init(document.getElementById(key))
- const tagList = this.workshopList[key].tagList
- const legendData = tagList.map(e => this.getLegendName(this.workshopList[key].workshopName, e.name))
- let startType = 'UNKNOWN'
- tagList.forEach(e => {
- if (e.tableColumn === this.workshopList[key].collectEntityList[0].startType) {
- startType = e.desc
- }
- })
- const collectEntityId = this.workshopList[key].collectEntityList[0].id
- const legendSelected = {}
- legendData.forEach(e => {
- legendSelected[e] = e === startType
- })
- const options = {
- legend: {
- right: '4%',
- left: '20%',
- icon: 'roundRect',
- textStyle: {
- fontSize: 12,
- color: '#FFFFFF',
- },
- data: legendData,
- selected: legendSelected,
- },
- tooltip: {
- trigger: 'axis',
- axisPointer: {
- type: 'cross',
- label: {
- backgroundColor: '#6a7985'
- }
- }
- },
- grid: {
- top: '15%',
- left: '5%',
- right: '10%',
- bottom: '3%',
- containLabel: true
- },
- xAxis: {
- type: 'category',
- boundaryGap: false,
- data: [],
- axisTick: {
- show: false
- },
- axisLine: {
- show: true,
- lineStyle: {
- width: 2,
- color: '#FFF',
- }
- },
- axisLabel: { //y轴文字的配置
- color: '#FFF', //Y轴内容文字颜色
- },
- },
- yAxis: {
- type: 'value',
- axisLine: {
- show: true,
- lineStyle: {
- width: 2,
- color: {
- x: 0,
- y: 0,
- colorStops: [{
- offset: 0,
- color: '#AAA7A7' // 100% 处的颜色
- }, {
- offset: 1,
- color: '#FFFFFF' // 0% 处的颜色
- }]
- },
- }
- },
- splitLine: {
- show: false,
- lineStyle: {
- width: 2,
- color: {
- x: 1,
- y: 1,
- colorStops: [{
- offset: 1,
- color: '#AAA7A7' // 100% 处的颜色
- }, {
- offset: 0,
- color: '#FFFFFF' // 0% 处的颜色
- }]
- },
- },
- },
- axisLabel: { //y轴文字的配置
- color: '#FFF', //Y轴内容文字颜色
- },
- max: this.yMaxMap[collectEntityId]
- },
- series: []
- }
- for (const e of tagList) {
- const name = this.getLegendName(this.workshopList[key].workshopName, e.name)
- options.series.push(
- {
- name,
- color: this.getLineColor(name),
- type: 'line',
- smooth: true,
- symbol: 'none',
- connectNulls: true,
- data: [],
- markLine: {
- symbol: ['none', 'none'],
- data: [
- {
- name: '告警线',
- yAxis: e.warnMaxValue
- },
- ],
- lineStyle: {
- type: 'solid',
- color: '#ef0505',
- },
- animation: false,
- }
- }
- )
- }
- this.chartList[key].setOption(options)
- window.addEventListener('resize', this.chartList[key].resize)
- }
- this.fetchData()
- })
- }
- },
- },
- /*mounted () {
- console.log('======================' + Object.keys(this.workshopList).length)
- },*/
- methods: {
- async initData() {
- this.initCompleted = false
- await findYMax().then(res => {
- if (res && res.code === '200') {
- const yMaxMap = {}
- res.data.forEach(e => {
- yMaxMap[e.collectEntityId] = e.yMax
- })
- this.yMaxMap = yMaxMap
- }
- })
- await findByAcquisitionStationId({ acquisitionStationId: this.acquisitionStation.id }).then(res => {
- if (res && res.code === '200') {
- const obj = {}
- const arrNotTags = []
- res.data.forEach((val, index) => {
- if (val.tagList && val.tagList.length > 0) {
- // 过滤运行反馈
- val.tagList = val.tagList.filter(e => !e.code.endsWith('FEEDBACK'))
- obj[val.workshopCode] = val
- } else {
- arrNotTags.push(val)
- }
- })
- this.workshopList = obj
- for (const item of arrNotTags) {
- this.$message.warning(item.workshopName + '未配置标签或者标签未启用!!!')
- }
- }
- })
- },
- async fetchData() {
- const params = {
- start: moment().subtract(5, 'minutes').valueOf(),
- end: moment().valueOf(),
- step: 2,
- acquisitionStationId: this.acquisitionStation.id
- }
- await historyChartAllData(params).then(res => {
- if (res && res.code === '200') {
- this.timeList = res.data.timeList
- for (const key in res.data.dataMap) {
- this.chartData[key] = res.data.dataMap[key]
- }
- for (const k in this.workshopList) {
- const options = {
- xAxis: {
- data: this.timeList
- },
- series: []
- }
- for (const a of this.workshopList[k].tagList) {
- options.series.push({ data: this.chartData[a.code] })
- }
- this.chartList[k].setOption(options)
- }
- this.initCompleted = true
- }
- })
- },
- getLineColor(name) {
- const colors = ['#17f107', '#ec0ad5', '#00DDFF', '#f1ca05']
- switch (name) {
- case '电流':
- return colors[0]
- case '振动':
- return colors[1]
- case '噪声':
- return colors[2]
- case '反馈':
- return colors[3]
- default:
- return colors[4]
- }
- },
- getLegendName(prefix, name) {
- if (name.lastIndexOf(prefix) !== -1) {
- return name.split(prefix)[1]
- } else {
- return name
- }
- },
- updateChart() {
- this.canUpdate = false
- this.timeList.push(this.lastTime)
- this.timeList.shift()
- for (const key in this.chartList) {
- const opt = {
- xAxis: {
- data: this.timeList
- },
- series: []
- }
- for (const e of this.workshopList[key].tagList) {
- this.chartData[e.code].shift()
- this.chartData[e.code].push(this.realtimeDataMap[e.code])
- const data = this.chartData[e.code]
- opt.series.push({ data })
- }
- this.chartList[key].setOption(opt)
- }
- try {
- } catch (e) {
- console.error(e)
- } finally {
- this.canUpdate = true
- }
- },
- },
- }
- </script>
- <style lang="less" scoped>
- .realtime-line {
- height: 100%;
- width: 100%;
- display: flex;
- flex-wrap: wrap;
- /*justify-content: flex-start;*/
- align-items: center;
- .chart-row {
- display: flex; /* 使用 flex 布局 */
- height: 100%;
- }
- .chart-box {
- display: flex;
- flex-direction: column;
- .chart-box-title {
- background-color: #0c3048;
- padding: 5px 16px;
- }
- .chart-box-content {
- flex: 1;
- padding-top: 8px;
- }
- }
- .row-first-chart {
- /*margin-left: 0 !important;*/
- }
- }
- .el-carousel {
- height: 100%;
- }
- </style>
|