web-base-h5/components/distribution/recommendPerformance.vue

378 lines
8.9 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="width-auto">
<div class="title">
<div>{{$t('N_I_121')}}</div>
<div style="color: #999;font-size: 14px;margin: 0px 0 0 14px">{{$t('N_I_122')}}</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>