378 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			Vue
		
	
	
	
			
		
		
	
	
			378 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			Vue
		
	
	
	
| <template>
 | ||
| 	<div class="width-auto">
 | ||
| 		<div class="title">
 | ||
| 			<div>{{'推荐业绩分布'}}</div>
 | ||
| 			<div style="color: #999;font-size: 14px;margin: 0px 0 0 14px">{{'本人及伞下前十'}}</div>
 | ||
| 		</div>
 | ||
| 		<div class="color-s">
 | ||
| 			<div id="mounthData4" :style="myChartStyle">
 | ||
| 			</div>
 | ||
| 		</div>
 | ||
| 		<view class="flex-s">
 | ||
| 			<div class="item-s" v-for="item in gradeList">
 | ||
| 				<div>
 | ||
| 					<div class="bg-color" :style="{background:`${item.color}`}"></div>
 | ||
| 					<div style="color: #333;text-align: center;">{{item.gradeName}}</div>
 | ||
| 				</div>
 | ||
| 			</div>
 | ||
| 		</view>
 | ||
| 	</div>
 | ||
| </template>
 | ||
| 
 | ||
| <script>
 | ||
| 	import * as api from '@/config/distribute.js'
 | ||
| 	import {
 | ||
| 		parentAchieveLeft,
 | ||
| 		systemGrandeRange
 | ||
| 	} from "@/config/distribute.js";
 | ||
| 	import * as echarts from "echarts";
 | ||
| 
 | ||
| 	export default {
 | ||
| 		data() {
 | ||
| 			return {
 | ||
| 				arr: [],
 | ||
| 				barList: {},
 | ||
| 				gradeList: [],
 | ||
| 				dataLists: {},
 | ||
| 				myChartStyle: {
 | ||
| 					width: "690rpx",
 | ||
| 					height: "1000rpx",
 | ||
| 					margin: "10rpx 0 10rpx 20rpx",
 | ||
| 				}, //图表样式
 | ||
| 			}
 | ||
| 		},
 | ||
| 		mounted() {
 | ||
| 
 | ||
| 		},
 | ||
| 		created() {
 | ||
| 			this.systemGrandeRange()
 | ||
| 			this.upDateCover2()
 | ||
| 		},
 | ||
| 		methods: {
 | ||
| 			systemGrandeRange() {
 | ||
| 				// 所有等级名称
 | ||
| 				systemGrandeRange().then((res) => {
 | ||
| 					this.gradeList = res.data
 | ||
| 					let _barList = {
 | ||
| 						id: [],
 | ||
| 						name: [],
 | ||
| 						color: []
 | ||
| 					}
 | ||
| 					res.data.forEach((item) => {
 | ||
| 						_barList.id.push(item.pkId)
 | ||
| 						_barList.name.push(item.gradeName)
 | ||
| 						_barList.color.push(item.color)
 | ||
| 					});
 | ||
| 					this.barList = _barList
 | ||
| 				})
 | ||
| 			},
 | ||
| 			initArrData(_data) {
 | ||
| 				let _barList = {};
 | ||
| 				let _barList1 = {};
 | ||
| 				let arr = this.arr;
 | ||
| 				this.systemGrandeRange();
 | ||
| 				_data.forEach((item) => {
 | ||
| 					if (item.umbrellaList.length > 0) {
 | ||
| 						let lists = this.sortBy(item.umbrellaList, "gradeValue")
 | ||
| 						this.barList.id.forEach((_item, index) => {
 | ||
| 							lists.forEach((items) => {
 | ||
| 								if (_item == items.pkGrade) {
 | ||
| 									_barList[_item] = this.barList.name[index];
 | ||
| 									_barList1[_item] = this.barList.color[index];
 | ||
| 								}
 | ||
| 							})
 | ||
| 						});
 | ||
| 					} else if (item.umbrellaList.length == 0) {
 | ||
| 						this.barList.id.forEach((_item, index) => {
 | ||
| 							_barList[_item] = this.barList.name[index];
 | ||
| 							_barList1[_item] = this.barList.color[index];
 | ||
| 						});
 | ||
| 					}
 | ||
| 				});
 | ||
| 				let _list = {
 | ||
| 					id: [],
 | ||
| 					name: [],
 | ||
| 					color: []
 | ||
| 				};
 | ||
| 				for (let key in _barList) {
 | ||
| 					_list.id.push(key);
 | ||
| 					_list.name.push(_barList[key]);
 | ||
| 				}
 | ||
| 				for (let key in _barList1) {
 | ||
| 					_list.color.push(_barList1[key])
 | ||
| 				}
 | ||
| 
 | ||
| 				this.barList = _list;
 | ||
| 				let _arrList = {};
 | ||
| 				this.barList.id.forEach((item) => {
 | ||
| 					let _arrs = [];
 | ||
| 					for (let i = 0; i < _data.length; i++) {
 | ||
| 						_arrs.push(0);
 | ||
| 					}
 | ||
| 					_arrList[item] = _arrs;
 | ||
| 				});
 | ||
| 				return this.initServiceData(_data, _arrList);
 | ||
| 			},
 | ||
| 			initServiceData(_data, _arrList) {
 | ||
| 				//初始化data值
 | ||
| 				_data.forEach((item, index) => {
 | ||
| 					if (item.umbrellaList != undefined) {
 | ||
| 						item.umbrellaList.forEach((items) => {
 | ||
| 							if (_arrList[items.pkGrade] != undefined) {
 | ||
| 								_arrList[items.pkGrade][index] = items.achieve;
 | ||
| 							}
 | ||
| 						})
 | ||
| 					}
 | ||
| 				});
 | ||
| 				return _arrList;
 | ||
| 			},
 | ||
| 			getStartTime() {
 | ||
| 				let date = new Date()
 | ||
| 				date.setDate(1) // 将当前时间的日期设置成第一天
 | ||
| 				let year = date.getFullYear() // 得到当前年份
 | ||
| 				let month = date.getMonth() + 1 // 得到当前月份(0-11月份,+1是当前月份)
 | ||
| 				month = month > 9 ? month : '0' + month // 补零
 | ||
| 				return year + '-' + month
 | ||
| 			},
 | ||
| 			getEndTime() {
 | ||
| 				var date = new Date();
 | ||
| 				var year = date.getFullYear() // 年
 | ||
| 				var month = date.getMonth() + 1; // 月
 | ||
| 				var day = date.getDate(); // 日
 | ||
| 				var hour = date.getHours(); // 时
 | ||
| 				var minutes = date.getMinutes(); // 分
 | ||
| 				var seconds = date.getSeconds() //秒
 | ||
| 				// 给一位数的数据前面加 “0”
 | ||
| 				if (month >= 1 && month <= 9) {
 | ||
| 					month = "0" + month;
 | ||
| 				}
 | ||
| 				if (day >= 0 && day <= 9) {
 | ||
| 					day = "0" + day;
 | ||
| 				}
 | ||
| 				if (hour >= 0 && hour <= 9) {
 | ||
| 					hour = "0" + hour;
 | ||
| 				}
 | ||
| 				if (minutes >= 0 && minutes <= 9) {
 | ||
| 					minutes = "0" + minutes;
 | ||
| 				}
 | ||
| 				if (seconds >= 0 && seconds <= 9) {
 | ||
| 					seconds = "0" + seconds;
 | ||
| 				}
 | ||
| 				return year + "-" + month + "-" + day + " "
 | ||
| 			},
 | ||
| 			sortBy(array, field, sort = "asc") {
 | ||
| 				const sortOpt = {
 | ||
| 					asc: (a, b, sortField) => a[sortField] - b[sortField],
 | ||
| 					desc: (a, b, sortField) => b[sortField] - a[sortField],
 | ||
| 				};
 | ||
| 				array.sort((a, b) => sortOpt[sort](a, b, field));
 | ||
| 				return array;
 | ||
| 			},
 | ||
| 			upDateCover2(val) {
 | ||
| 				console.error(val)
 | ||
| 				api
 | ||
| 					.parentAchieveLeft({
 | ||
| 						month: val ? val.startDate : this.getStartTime()
 | ||
| 						// startDate:val? val.startDate :this.getStartTime(),
 | ||
| 						// endDate: val?val.endDate:this.getEndTime(),
 | ||
| 						// endDate: val?val[1]:'2023-06-29',
 | ||
| 						// startDate:val? val[0] :'2023-06-01',
 | ||
| 					})
 | ||
| 					.then((res) => {
 | ||
| 						let xAxisData = []
 | ||
| 						//初始化services数组
 | ||
| 						let _arrList = this.initArrData(res.data);
 | ||
| 						//初始化data值
 | ||
| 						res.data.forEach((item, index) => {
 | ||
| 							xAxisData.push(item.memberName)
 | ||
| 						})
 | ||
| 						let _series = [];
 | ||
| 						this.barList.name.forEach((item, index) => {
 | ||
| 							let _service = {
 | ||
| 								name: item,
 | ||
| 								showSymbol: false,
 | ||
| 								type: 'bar',
 | ||
| 								stack: 'one',
 | ||
| 								color: this.barList.color[index],
 | ||
| 								data: _arrList[this.barList.id[index]]
 | ||
| 							};
 | ||
| 							_series.push(_service);
 | ||
| 						});
 | ||
| 						this.$nextTick(() => { //结合$nextTick使用
 | ||
| 							this.drawChart(xAxisData, _series);
 | ||
| 						})
 | ||
| 					})
 | ||
| 			},
 | ||
| 			drawChart(arr1, series) {
 | ||
| 				// 基于准备好的dom,初始化echarts实例  这个和上面的main对应
 | ||
| 				let myChart = echarts.init(document.getElementById('mounthData4'))
 | ||
| 				// 指定图表的配置项和数据
 | ||
| 				let option = {
 | ||
| 					// legend: {
 | ||
| 					//     data: this.barList.name,
 | ||
| 					//     left: '10%',
 | ||
| 					//
 | ||
| 					// },
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 					tooltip: {},
 | ||
| 					textStyle: {
 | ||
| 						fontSize: 10,
 | ||
| 					},
 | ||
| 					xAxis: {
 | ||
| 						data: arr1,
 | ||
| 						bottom: 10,
 | ||
| 						axisLabel: {
 | ||
| 							formatter: function(params) {
 | ||
| 								var newParamsName = ''; // 拼接后的新字符串
 | ||
| 								var paramsNameNumber = params.length; // 实际标签数
 | ||
| 								var provideNumber = 2; // 每行显示的字数
 | ||
| 								var rowNumber = Math.ceil(paramsNameNumber / provideNumber); // 如需换回,算出要显示的行数
 | ||
| 
 | ||
| 								if (paramsNameNumber > provideNumber) {
 | ||
| 									/** 循环每一行,p表示行 */
 | ||
| 
 | ||
| 									for (var i = 0; i < rowNumber; i++) {
 | ||
| 										var tempStr = ''; // 每次截取的字符串
 | ||
| 										var start = i * provideNumber; // 截取位置开始
 | ||
| 										var end = start + provideNumber; // 截取位置结束
 | ||
| 
 | ||
| 										// 最后一行的需要单独处理
 | ||
| 
 | ||
| 										if (i == rowNumber - 1) {
 | ||
| 											tempStr = params.substring(start, paramsNameNumber);
 | ||
| 										} else {
 | ||
| 											tempStr = params.substring(start, end) + '\n';
 | ||
| 										}
 | ||
| 										newParamsName += tempStr;
 | ||
| 									}
 | ||
| 								} else {
 | ||
| 									newParamsName = params;
 | ||
| 								}
 | ||
| 
 | ||
| 								return newParamsName;
 | ||
| 							},
 | ||
| 							interval: 0,
 | ||
| 							textStyle: {
 | ||
| 								fontSize: 8,
 | ||
| 							},
 | ||
| 							axisLabel: {
 | ||
| 								// 轴文字
 | ||
| 								show: false,
 | ||
| 								color: "#A0B2D3",
 | ||
| 								fontSize: 8,
 | ||
| 							},
 | ||
| 						}
 | ||
| 					},
 | ||
| 					// xAxis: {
 | ||
| 					//     data: arr1,
 | ||
| 					//     bottom:10,
 | ||
| 					//     axisLabel: {
 | ||
| 					//         interval: 0,
 | ||
| 					//         margin:10,
 | ||
| 					//         textStyle:{
 | ||
| 					//             fontSize:10,
 | ||
| 					//         },
 | ||
| 					//         formatter:function(value,index)
 | ||
| 					//         {
 | ||
| 					//             return value;
 | ||
| 					//         }
 | ||
| 					//     },
 | ||
| 					// },
 | ||
| 					yAxis: {
 | ||
| 						axisLabel: {
 | ||
| 							// 轴文字
 | ||
| 							show: true,
 | ||
| 							fontSize: 8,
 | ||
| 						},
 | ||
| 					},
 | ||
| 					grid: {
 | ||
| 						bottom: 100,
 | ||
| 						left: '15%', // 调整y轴字体显示不完整,原来值是
 | ||
| 					},
 | ||
| 					series: series
 | ||
| 				}
 | ||
| 
 | ||
| 				// myChart.clear();
 | ||
| 				myChart.setOption(option);
 | ||
| 			},
 | ||
| 		},
 | ||
| 	}
 | ||
| </script>
 | ||
| 
 | ||
| <style lang="scss" scoped>
 | ||
| 	.item-s {
 | ||
| 		padding-bottom: 10px;
 | ||
| 		display: flex;
 | ||
| 		justify-content: center;
 | ||
| 		align-items: center;
 | ||
| 		// width: 100%;
 | ||
| 		line-height: 30px;
 | ||
| 		margin-left: 20rpx;
 | ||
| 		// margin-right: 20rpx;
 | ||
| 	}
 | ||
| 
 | ||
| 	.bg-color {
 | ||
| 		width: 40px;
 | ||
| 		height: 20px;
 | ||
| 		border-radius: 4px;
 | ||
| 		margin: 0 auto;
 | ||
| 	}
 | ||
| 
 | ||
| 	.flex-s {
 | ||
| 		display: flex;
 | ||
| 		justify-content: center;
 | ||
| 		flex-wrap: wrap;
 | ||
| 		//align-items: center;
 | ||
| 		text-align: center;
 | ||
| 		background-color: #fff;
 | ||
| 		position: absolute;
 | ||
| 		//justify-content: center;
 | ||
| 		bottom: 10rpx;
 | ||
| 		// height: 80rpx;
 | ||
| 		// line-height: 80rpx;
 | ||
| 	}
 | ||
| 
 | ||
| 	.width-auto {
 | ||
| 		position: relative;
 | ||
| 		height: 1400rpx;
 | ||
| 		background-color: #fff;
 | ||
| 		width: 690rpx;
 | ||
| 
 | ||
| 		border-radius: 20rpx;
 | ||
| 		margin: 20rpx auto;
 | ||
| 	}
 | ||
| 
 | ||
| 	.title {
 | ||
| 		padding: 20rpx 30rpx;
 | ||
| 		height: 80rpx;
 | ||
| 		line-height: 80rpx;
 | ||
| 		border-bottom: 10rpx solid #f3f3f3;
 | ||
| 		margin-top: 10rpx;
 | ||
| 		font-size: 28rpx;
 | ||
| 		display: flex;
 | ||
| 	}
 | ||
| 
 | ||
| 	.color-s {
 | ||
| 		// width: 790px;
 | ||
| 		// height: 646px;
 | ||
| 		// border: 4px solid #979797;
 | ||
| 		// margin: 80px;
 | ||
| 		// position: absolute;
 | ||
| 		// left: 0px;
 | ||
| 		// top: 10px;
 | ||
| 	}
 | ||
| 
 | ||
| 	.title1 {
 | ||
| 		position: absolute;
 | ||
| 		left: 80px;
 | ||
| 		top: 40px;
 | ||
| 		display: flex;
 | ||
| 		color: #333333;
 | ||
| 		font-size: 20px;
 | ||
| 
 | ||
| 		div {}
 | ||
| 	}
 | ||
| </style>
 |