Files
2022-02-16 11:17:07 +08:00

947 lines
24 KiB
Vue
Raw 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>
<container2 title="质量问题">
<bigScreenTabs
slot="datePicker"
v-model="index"
:titleArr="['全年', '月度']"
></bigScreenTabs>
<div
style="height: 100%; width: 100%"
ref="chart"
v-if="index == 0"
></div>
<div style="height: 100%; width: 100%" ref="chart1" v-else></div>
</container2>
<container2 title="质量检查分析" style="margin-top: 10px">
<bigScreenTabs
slot="datePicker"
v-model="index2"
:titleArr="['总厂', '部门']"
></bigScreenTabs>
<div
style="height: 100%; width: 100%"
ref="chart2"
v-if="index2 == 0"
></div>
<div style="height: 100%; width: 100%" ref="chart22" v-else></div>
</container2>
<container2 title="质量案例/检查明细" style="margin-top: 10px">
<bigScreenTabs
slot="datePicker"
v-model="index3"
:titleArr="['案例', '明细']"
></bigScreenTabs>
<el-row style="padding: 15px 30px" v-if="index3 == 0">
<el-col :span="24" style="margin-bottom: 1px">
<el-row
style="
font-size: 14px;
height: 42px;
line-height: 42px;
background: rgba(0, 255, 255, 0.3);
"
>
<el-col style="text-align: center" :span="4">序号</el-col>
<el-col style="text-align: center" :span="8">部门</el-col>
<el-col style="text-align: center" :span="12">作业内容</el-col>
</el-row>
</el-col>
<vue-seamless-scroll
:data="scrollList"
class="warp-scroll"
ref="seamlessScroll"
:class-option="{
singleHeight: 43,
}"
>
<ul class="item">
<li v-for="item in scrollList" :key="item.id">
<el-row style="font-size: 14px">
<el-col style="text-align: center" :span="4">{{
item.id
}}</el-col>
<el-col style="text-align: center" :span="8">{{
item.className
}}</el-col>
<el-col
style="text-align: center"
:title="item.faultRevelation"
:span="12"
>{{ item.faultRevelation }}</el-col
>
</el-row>
</li>
</ul>
</vue-seamless-scroll>
</el-row>
<el-row style="padding: 15px 30px" v-if="index3 == 1">
<!-- <el-col :span="24" style="margin-bottom: 1px">
<el-row style="font-size: 14px; height: 42px; line-height: 42px; background: rgba(0, 255, 255, 0.3)">
<el-col style="text-align: center" :span="4">序号</el-col>
<el-col style="text-align: center" :span="8">部门</el-col>
<el-col style="text-align: center" :span="12">作业内容(明细)</el-col>
</el-row>
</el-col>
<vue-seamless-scroll
:data="listData"
class="warp-scroll"
:class-option="{
singleHeight: 43,
}"
>
<ul class="item">
<li v-for="item in scrollList" :key="item.id">
<el-row style="font-size: 14px">
<el-col style="text-align: center" :span="4">{{ item.id }}</el-col>
<el-col style="text-align: center" :span="8">{{ item.name }}</el-col>
<el-col style="text-align: center" :span="12">{{ item.txt }}</el-col>
</el-row>
</li>
</ul>
</vue-seamless-scroll> -->
</el-row>
</container2>
</div>
</template>
<script>
import rocketTit from "../components/rocketTit/index.vue";
import container2 from "./components/container2/index.vue";
import bigScreenTabs from "../components/bigScreenTabs/index.vue";
import progressBar from "@/views/bigScreen/components/progress/index.vue";
import colorList from "@/utils/colorPalette";
import {
blueColorList,
greenColorList,
yelloColorList,
} from "@/utils/gradualColor";
import vueSeamlessScroll from "vue-seamless-scroll";
// import {Liquid} from '@antv/g2plot';
// import resize from '../../dashboard/mixins/resize'
import echarts from "echarts";
require("echarts/theme/macarons"); // echarts theme
export default {
// mixins: [resize],
name: "left1",
components: {
rocketTit,
container2,
bigScreenTabs,
progressBar,
vueSeamlessScroll,
},
data() {
return {
index: 0,
index2: 0,
index3: 0,
colorList,
chart: null,
chart1: null,
chart2: null,
chart22: null,
listData: [1, 2, 3, 4, 5, 6, 7, 8],
scrollList: [],
};
},
mounted() {
this.$nextTick(() => {
this.initChart();
this.initLine();
this.getData();
});
},
watch: {
index(newVal, oldVal) {
if (newVal == 0) {
this.chart1.dispose();
this.chart1 = null;
this.$nextTick(() => {
this.initChart();
});
} else {
this.chart.dispose();
this.chart = null;
this.$nextTick(() => {
this.initChart1();
});
}
},
index2(newVal, oldVal) {
if (newVal == 0) {
this.chart22.dispose();
this.chart22 = null;
this.$nextTick(() => {
this.initLine();
});
} else {
this.chart2.dispose();
this.chart2 = null;
this.$nextTick(() => {
this.initChart22();
});
}
},
},
beforeDestroy() {},
methods: {
// 获取滚动列表数据
getData() {
this.request({
url: "/hx/qualityAssurance/getHxQualityCasePic",
method: "get",
}).then(({ data }) => {
this.scrollList = data;
this.$refs.seamlessScroll.reset();
});
},
// 右上切换前
initChart() {
this.request({
url: "/hx/qualityAssurance/getQualityProblem",
method: "get",
params: {
type: "1",
},
}).then(({ data }) => {
this.chart = echarts.init(this.$refs.chart);
this.setOptions(data.list);
});
},
setOptions(resData) {
resData.map((item, index) => {
if (item.dimension == 1) {
item.dimension = "型号";
} else if (item.dimension == 2) {
item.dimension = "类别";
} else if (item.dimension == 3) {
item.dimension = "部门";
}
item.value.map((i) => {
i.value = i.TOTAL;
});
});
this.chart.setOption({
tooltip: {
trigger: "item",
},
legend: {
top: "5%",
right: "5%",
orient: "vertical",
y: "center",
// left: 'right',
textStyle: {
color: "#fff", //legend字体颜色
},
},
series: [
{
name: resData[0].dimension,
type: "pie",
center: ["35%", "50%"],
radius: ["60%", "80%"],
avoidLabelOverlap: false,
label: {
show: false,
position: "center",
},
emphasis: {
label: {
show: false,
fontSize: "40",
fontWeight: "bold",
},
},
labelLine: {
show: false,
},
data: resData[0].value,
// [
// { value: 1048, name: '型号1' },
// { value: 735, name: '型号2' },
// { value: 580, name: '型号3' },
// { value: 484, name: '型号4' },
// { value: 301, name: '型号5' },
// ],
color: blueColorList,
},
{
name: resData[1].dimension,
type: "pie",
radius: ["35%", "55%"],
center: ["35%", "50%"],
avoidLabelOverlap: false,
label: {
show: false,
position: "center",
},
emphasis: {
label: {
show: false,
fontSize: "40",
fontWeight: "bold",
},
},
labelLine: {
show: false,
},
data: resData[1].value,
// [
// { value: 1048, name: '类别1' },
// { value: 735, name: '类别2' },
// { value: 580, name: '类别3' },
// { value: 484, name: '类别4' },
// { value: 300, name: '类别5' },
// ],
color: greenColorList,
},
{
name: resData[2].dimension,
type: "pie",
radius: ["10%", "30%"],
center: ["35%", "50%"],
avoidLabelOverlap: false,
label: {
show: false,
position: "center",
},
emphasis: {
label: {
show: false,
fontSize: "40",
fontWeight: "bold",
},
},
labelLine: {
show: false,
},
data: resData[2].value,
// [
// { value: 1048, name: '部门1' },
// { value: 735, name: '部门2' },
// { value: 580, name: '部门3' },
// { value: 484, name: '部门4' },
// { value: 300, name: '部门5' },
// ],
color: yelloColorList,
},
],
});
},
// 右上切换后
initChart1() {
this.request({
url: "/hx/qualityAssurance/getQualityProblem",
method: "get",
params: {
type: "2",
},
}).then(({ data }) => {
this.chart1 = echarts.init(this.$refs.chart1);
this.setOptions1(data);
});
},
setOptions1(resData) {
let titData = resData.allName;
delete resData.allName;
let titList = [];
let valList = [];
for (let index = 0; index < titData.length; index++) {
valList.push([]);
}
let newData = {};
for (let i = 0; i < resData.list.length; i++) {
const item = resData.list[i];
for (const key in item) {
newData[key] = item[key];
}
}
for (const key in newData) {
if (Object.hasOwnProperty.call(newData, key)) {
const item = newData[key];
titList.push(key);
for (let i = 0; i < item.length; i++) {
const ele = item[i];
let index = titData.findIndex((e) => e == ele.name);
valList[index][titList.length - 1] = ele.COMPLETED;
}
}
}
this.chart1.setOption({
tooltip: {
trigger: "axis",
axisPointer: {
type: "shadow",
},
},
legend: {
data: titData,
textStyle: {
color: "#fff", //legend字体颜色
},
},
grid: {
left: 20,
right: 20,
top: 30,
bottom: 50,
containLabel: true,
},
// dataZoom: {
// type: "slider",
// start: 0,
// end: this.dataZoomEnd(titList.length, 5),
// textStyle: {
// color: "#fff",
// },
// },
dataZoom: [
{
type: "slider",
textStyle: {
color: "#fff",
},
startValue: this.dataZoomStart(titList.length, 4, "start"),
endValue: this.dataZoomStart(titList.length, 4, "end"),
},
{
type: "inside",
},
],
color: colorList,
xAxis: [
{
type: "category",
data: titList,
axisLine: {
lineStyle: {
color: "rgb(255, 255, 255)",
},
},
},
],
yAxis: [
{
name: "个",
splitLine: {
show: true,
// 改变轴线颜色
lineStyle: {
// 使用深浅的间隔色
color: ["rgba(255, 255, 255,.5)"],
},
},
axisLabel: {
formatter: "{value}",
},
axisLine: {
lineStyle: {
color: "rgb(255, 255, 255)",
},
},
},
{
type: "value",
},
],
series: [
...valList.map((e, index) => {
return {
name: titData[index],
type: "bar",
stack: "Ad",
emphasis: {
focus: "series",
},
barWidth: 30,
data: e,
};
}),
],
});
},
initLine() {
this.request({
url: "/hx/qualityAssurance/getHxQualityInspect",
method: "get",
params: {
type: "1",
},
}).then(({ data }) => {
this.chart2 = echarts.init(this.$refs.chart2);
this.setOptions2(data.factory);
});
},
setOptions2(resData) {
let month = [];
let cate = []; // 率
let completed = []; // 完成
for (let i = 0; i < resData.length; i++) {
const item = resData[i];
month.push(item.month);
cate.push(item.CATE);
completed.push(item.COMPLETED);
}
this.chart2.setOption({
tooltip: {
trigger: "axis",
// formatter: '{a1}<br/>{b1}{c1}',
},
legend: {
data: ["数量", "完成率"],
textStyle: {
color: "#fff",
},
},
grid: {
left: "3%",
right: "6%",
bottom: "3%",
containLabel: true,
},
xAxis: [
{
type: "category",
data: month,
axisPointer: {
type: "shadow",
},
axisLine: {
lineStyle: {
color: "rgb(255, 255, 255)",
},
},
},
],
yAxis: [
{
type: "value",
name: "个",
min: 0,
// max: 250,
// interval: 50,
axisLabel: {
formatter: "{value}",
},
splitLine: {
show: false, //不显示网格线
},
splitArea: {
show: false, //不显示网格区域
},
axisLine: {
lineStyle: {
color: "rgb(255, 255, 255)",
},
},
},
{
type: "value",
min: 0,
max: 100,
// interval: 5,
axisLabel: {
formatter: "{value} %",
},
splitLine: {
show: false, //不显示网格线
},
splitArea: {
show: false, //不显示网格区域
},
axisLine: {
lineStyle: {
color: "rgb(255, 255, 255)",
},
},
},
],
grid: {
containLabel: true,
width: "99%",
left: 0,
top: 50,
bottom: 50,
},
// dataZoom: {
// type: "slider",
// start: 0,
// end: this.dataZoomEnd(month.length, 5),
// textStyle: {
// color: "#fff",
// },
// },
dataZoom: [
{
type: "slider",
textStyle: {
color: "#fff",
},
startValue: this.dataZoomStart(month.length, 4, "start"),
endValue: this.dataZoomStart(month.length, 4, "end"),
},
{
type: "inside",
},
],
series: [
{
name: "数量",
type: "bar",
barWidth: 20,
data: completed,
itemStyle: {
color: {
type: "linear", // 线性渐变
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: "#F49220", // 0%处的颜色为红色
},
{
offset: 1,
color: "#F6D97E", // 100%处的颜色为蓝
},
],
},
},
},
{
name: "完成率",
type: "line",
yAxisIndex: 1,
smooth: false,
data: cate,
itemStyle: {
color: "#55C5A2",
},
symbol: "none",
},
],
// yAxis: {
// type: 'value',
// splitLine: {
// show: false//不显示网格线
// },
// splitArea: {
// show: false//不显示网格区域
// },
// axisLine: {
// lineStyle: {
// color: 'rgb(255, 255, 255)'
// },
// }
// },
// series: [
// {
// name: '利润',
// type: 'bar',
// data: [
// 2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3
// ]
// },
// {
// name: '数量',
// type: 'bar',
// data: [
// 2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3
// ]
// },
// {
// name: '完成率',
// type: 'line',
// yAxisIndex: 1,
// data: [2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 23.4, 23.0, 16.5, 12.0, 6.2]
// }
// ]
});
},
initChart22() {
this.request({
url: "/hx/qualityAssurance/getHxQualityInspect",
method: "get",
params: {
type: "2",
},
}).then(({ data }) => {
this.chart22 = echarts.init(this.$refs.chart22);
this.setOptions22(data.dept);
});
},
setOptions22(resData) {
console.log(resData);
let deptName = [];
let cate = []; // 率
let completed = []; // 完成
let total = []; // 总
for (let i = 0; i < resData.length; i++) {
const item = resData[i];
deptName.push(item.dept_name);
cate.push(item.CATE);
completed.push(item.COMPLETED);
total.push(item.TOTAL);
}
this.chart22.setOption({
tooltip: {
trigger: "axis",
// formatter: '{a1}<br/>{b1}{c1}',
},
// legend: {
// // data: ['收入', '实际', '目标'],
// textStyle: {
// color: '#fff', //legend字体颜色
// },
// // selectedMode: false,
// },
grid: {
containLabel: true,
left: 20,
right: 10,
top: 30,
bottom: 50,
},
xAxis: {
data: deptName,
axisLine: {
lineStyle: {
color: "rgb(255, 255, 255)",
},
},
},
// dataZoom: {
// type: "slider",
// start: 0,
// end: this.dataZoomEnd(deptName.length, 5),
// textStyle: {
// color: "#fff",
// },
// },
dataZoom: [
{
type: "slider",
textStyle: {
color: "#fff",
},
startValue: this.dataZoomStart(deptName.length, 4, "start"),
endValue: this.dataZoomStart(deptName.length, 4, "end"),
},
{
type: "inside",
},
],
color: ["#ccc", "red"],
yAxis: [
{
name: "个",
splitLine: {
show: true,
// 改变轴线颜色
lineStyle: {
// 使用深浅的间隔色
color: ["rgba(255, 255, 255,.5)"],
},
},
axisLabel: {
formatter: "{value}",
},
axisLine: {
lineStyle: {
color: "rgb(255, 255, 255)",
},
},
},
{
type: "value",
min: 0,
max: 100,
interval: 20,
axisLabel: {
formatter: "{value} %",
},
splitLine: {
show: false, //不显示网格线
},
splitArea: {
show: false, //不显示网格区域
},
axisLine: {
lineStyle: {
color: "rgb(255, 255, 255)",
},
},
},
],
series: [
{
name: "收入",
type: "bar",
z: "-1",
barGap: "-75%",
barWidth: 30,
itemStyle: {
color: "rgba(85, 197, 162, .3)",
},
data: total,
},
{
name: "实际",
type: "bar",
barWidth: 15,
position: [0, 0],
itemStyle: {
color: "rgba(90, 216, 166, 0.85)",
},
data: completed,
itemStyle: {
color: {
type: "linear", // 线性渐变
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: "#F49220", // 0%处的颜色为红色
},
{
offset: 1,
color: "#F6D97E", // 100%处的颜色为蓝
},
],
},
},
},
{
name: "目标",
type: "scatter",
symbol: "rect",
symbolSize: [30, 4],
symbolOffset: [3, 0],
position: [0, 0],
itemStyle: {
color: "#F6D97E",
},
yAxisIndex: 1,
data: cate,
},
],
});
},
},
};
</script>
<style lang="scss" scoped>
.warp-scroll {
height: 172px;
width: 100%;
margin: 0 auto;
overflow: hidden;
ul {
list-style: none;
padding: 0;
margin: 0 auto;
li,
a {
display: block;
display: flex;
justify-content: space-between;
font-size: 15px;
}
li {
display: block;
height: 42px;
line-height: 42px;
background: linear-gradient(270deg, rgba(30, 43, 99, 0) 0%, #1e2b63 100%);
// opacity: 0.6;
// box-shadow: 0px 1px 0px 0px rgba(139, 177, 237, 0.5);
margin-bottom: 1px;
img {
vertical-align: sub;
margin-right: 5px;
}
}
}
}
.wrap {
display: flex;
flex-direction: column;
height: 100%;
width: 100%;
.box {
padding: 0 0 5px 15px;
display: flex;
align-items: center;
.num {
font-size: 24px;
font-weight: 600;
margin: 0 10px;
}
}
}
.content1 {
// height: 200px;
height: 100%;
.chart1 {
margin: 0 auto;
width: 100%;
height: 192px;
background: transparent;
}
}
.num {
font-size: 30px;
font-family: Roboto-BlackItalic, Roboto;
font-weight: normal;
color: #91d5fe;
vertical-align: sub;
// margin-right: 3px;
}
.content2 {
padding: 20px;
flex: 1;
height: 100%;
box-sizing: border-box;
display: flex;
flex-direction: column;
.chart2 {
height: 100%;
}
.tit {
font-size: 16px;
font-family: PingFangSC-Semibold, PingFang SC;
font-weight: 600;
color: #ffffff;
line-height: 22px;
position: relative;
padding-left: 15px;
}
.tit::after {
content: "";
display: block;
position: absolute;
top: 3px;
left: 0px;
width: 4px;
height: 16px;
background: #00ffff;
}
}
</style>