customly.vue 6.38 KB
<template>
	<div class="customly">
		<div class="graph-container" v-loading="loading">
			<img :src="floorSrc" class="background-floorimg" alt="" />
			<div id="cusGraphChart" class="graph-box"></div>
		</div>
	</div>
</template>

<script>
import defaultImg from '@/assets/img/manage/defaultFloor.svg'
export default {
	props: {
		propparam: Object
	},
	data() {
		return {
			floorPlanUrl: window._vionConfig.picUrl,
			floorSrc: '',
			loading: true,
			trafficFlowLoading: true,
			emitData: [],
			radioDate: '小时级',
			rowLen: Number,
			naturalWidth: 0,
			naturalHeight: 0,
			firstFlag: true,
			orgids: '',
			starttime: '',
			endtime: '',
			imgWidth: '',
			// hourHeadData: [],
			// minHeadData: [],
		}
	},
	computed: {
	},
	components: {
	},
	watch: {
		propparam: {
            handler: 'refreshHandle',
            immediate: true
        }
	},
	mounted() {
		// this.getTableId();
		// this.loading = true;
		// this.trafficFlowLoading = true;
	},
	methods: {
		refreshHandle(param) {
			if (param.dateType !== '/trafficeline/customly') return;
			this.loading = true;
			this.emitData = param.data;
			if (!param.data.asis_img) {
				this.floorSrc = defaultImg;
			} else {
				this.floorSrc = this.floorPlanUrl + param.data.asis_img;
			}
			this.orgids = param.data.asis_org;
			this.starttime = param.data.asis_time['startTime'];
			this.endtime = param.data.asis_time['endTime'];
			var image = new Image();
			image.src = this.floorSrc;
			var _this = this;
			image.onload = function() {
				_this.naturalWidth = image.width;
				_this.naturalHeight = image.height;
				// let canvasH = parseInt($('.background-floorimg').width()/(_this.naturalWidth/_this.naturalHeight))
				$('#cusGraphChart').height($('.background-floorimg').height());
				_this.getLinkData();
			}
		},
		getLinkData() {
			this.$api.customerReport.flowMovingLineReport({
				orgIds: this.orgids,
				startDate: this.starttime,
				endDate: this.endtime,
				_t: Date.parse(new Date()) / 1000
			}).then(res => {
				if(typeof res.data.data.node === 'undefined' || typeof res.data.data.line === 'undefined') {
					this.loading = false;
					return;
				}
				let data = [];
				let categories = [];
				let symbolMinnum = 999999999;
				let symbolMaxnum = 0;
				let emptyInnum = false;
				res.data.data.node.forEach((item, index) => {
					// var val=1;
					if(!item.innum){
						emptyInnum = true;
					}
					if (item.innum != 0 && item.innum < symbolMinnum) {
						symbolMinnum = item.innum;
					}
					if (item.innum != 0 && item.innum > symbolMaxnum) {
						symbolMaxnum = item.innum;
					}
				})
				res.data.data.node.forEach((item, index) => {
					let SymbolSize = symbolMaxnum == symbolMinnum ? 10 : parseInt((10 + (item.innum - symbolMinnum) / (symbolMaxnum - symbolMinnum) * 90));
					let nodeX = (item.x / this.normalWidth * $('.background-floorimg').width()).toFixed(2);
					let nodeY = (item.y / this.normalHeight * $('.background-floorimg').height()).toFixed(2);
					let dataObj = {
						id: String(item.zondId),
						name: item.zoneName,
						value: item.innum,
						x: nodeX > $('.background-floorimg').width() ? 0 : nodeX,
						y: nodeY > $('.background-floorimg').height() ? 0 : nodeY,
						// fixed: true,
						symbolSize: emptyInnum ? 0 : SymbolSize,
						category: index
					}
					// console.log('dataObj', dataObj, this.naturalWidth, this.naturalHeight)
					data.push(dataObj)
					categories.push({
						name: item.zoneName
					})
				});
				// 设置起始原点, 防止点位不准确
				data.push({
					id:-1,
					name:'22',
					value:-1,
					x:0,
					y:0,
					symbolSize: 0,
					label: {
						show: false,
					}
				},{
					id:-2,
					name:'11',
					value:-1,
					x: $('.background-floorimg').width(),
					y: $('.background-floorimg').height(),
					symbolSize: 0,
					label: {
						show: false,
					}
				})
				let links = [];
				let minNum = 999999999999;
				let maxNum = 0;
				let lineW = null;
				res.data.data.line.forEach(item => {
					links.push({
						target: String(item.target),
						source: String(item.source),
						value: item.value
					})
					if (item.value != 0 && item.value < minNum) {
						minNum = item.value
					}
					if (item.value != 0 && item.value > maxNum) {
						maxNum = item.value
					}
				})
				links.forEach((item, index) => {
					lineW = (1 + (item.value - minNum) / (maxNum - minNum) * 14);
					lineW = lineW < 0 ? 0 : lineW;
					item.lineStyle = {
						normal: {
							// width: item.value / minNum
							width: emptyInnum ? 0 : lineW,
						}
					}
					item.symbolSize = emptyInnum ? 0 : lineW * 2;
				})
				let myChart = {};
				let chartDom = document.getElementById('cusGraphChart');
					chartDom.style.width=$('.background-floorimg').width()+'px';
				if(this.$echarts.getInstanceByDom(chartDom)) {
					this.$echarts.init(chartDom).dispose();
					myChart = this.$echarts.init(chartDom);
				} else {
					myChart = this.$echarts.init(chartDom);
				}
				var option = {
					tooltip: {},
					legend: {
						type: 'plain',
						icon: 'circle',
						top: 0,
						data: categories.map((a) => {
							return a.name;
						})
					},
					series: [{
						top:0,
						left:0,
						right:0,
						bottom:1,
						edgeSymbol: ['none', 'arrow'],
						categories: categories,
						type: 'graph',
						layout: 'none',
						data: data,
						links: links,
						edgeSymbolSize: 0,
						// fixed:true,
						// roam: true,
						label: {
							normal: {
								show: emptyInnum ? false : true,
								position: 'right',
								formatter: '{b}:{c}'
							}
						},
						lineStyle: {
							normal: {
								color: 'source',
								curveness: 0.3
							}
						}
					}],
				};
				if (!this.firstFlag) {
					myChart.clear();
				}
				this.firstFlag = false;
				myChart.clear();
				myChart.setOption(option);
				setTimeout(() => {
					this.loading = false;
				}, 1000)
			})
			.catch(err => {
				this.catchErrorHandle(err)
			})
		}
	}
}
</script>

<style scoped>
.asis-table-wrapper {
	position: relative;
}

.graph-container {
	/* position: relative;
	 height: 800px; 
	background-color: #fff; */
	position: relative;
    background-color: #fff;
    border: 1px solid transparent;
    box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
    padding: 10px;
    box-sizing: border-box;
    text-align: center;
}

.graph-rel {
	position: relative;
}

.graph-box {
	margin: 0 auto;
}


/* .graph-box {
		width: 100%;
		position: absolute;
		top: 0;
		left: 0;
	} */
</style>