You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

953 lines
26 KiB

7 months ago
<template>
<!-- 垮位分析 -->
<div class="amphiPosition-container">
<!-- 筛选 -->
<div class="formData-box">
<el-form ref="form" :model="formData" label-width="90px">
<el-form-item label="请选择年份" size="mini">
<el-select v-model="formData.year" placeholder="">
<el-option label="2024" :value="2024"></el-option>
<el-option label="2025" :value="2025"></el-option>
</el-select>
</el-form-item>
</el-form>
<div class="query-btn" @click="queryBtn"></div>
</div>
<div class="amphiPosition-box">
<div class="left-box">
<div class="border-out">
<div class="border-inner">
<!-- 表格 -->
<div class="left-top-box">
<table class="table-sum">
<tr>
<td class="radius">月度计划总张数</td>
<td class="radius" colspan="3">{{ tableSumObj.zs }}</td>
</tr>
<tr>
<td>上料张数</td>
<td colspan="3">{{ tableSumObj.sl }}</td>
</tr>
<tr>
<td>跨位</td>
<td>作业区</td>
<td>计划张数</td>
<td>完成张数</td>
</tr>
<tr v-for="(item, index) in tableSumObj.detail" :key="index">
<td>{{ item.kw }}</td>
<td>{{ item.zyq }}</td>
<td>{{ item.sl }}</td>
<td>{{ item.wc }}</td>
</tr>
</table>
<div class="desc-title" style="margin-top: 2%">垮位汇总表</div>
</div>
<!-- 切割饼图 -->
<div class="left-center-box">
<div id="loaderPie" class="loaderPie"></div>
<div id="cutOnePie" class="cutOnePie"></div>
<div id="cutSecondPie" class="cutSecondPie"></div>
<div id="cutThreePie" class="cutThreePie"></div>
<div id="cutSumPie" class="cutSumPie"></div>
</div>
<!-- 上料及各做业务区柱状图 -->
<div class="left-bottom-box">
<div id="loaderBar" class="loaderBar"></div>
<div class="desc-title">各工作区完成计划工张数数据分析</div>
</div>
</div>
</div>
</div>
<div class="right-box">
<div class="border-out">
<div class="border-inner">
<!-- 折线图 -->
<div class="right-top-box">
<div id="TableLine" class="TableLine"></div>
<div class="desc-title">30天作业区完成情况</div>
</div>
<!-- 文字描述 -->
<div class="right-center-box">
<div class="right-center-title">
一区 计划{{ tableConfigObj.jh }} 到货检査{{
tableConfigObj.jc
}} 上料:{{ tableConfigObj.sl }}
</div>
</div>
<!-- 滚动列表 -->
<div class="right-bottom-box">
<dv-scroll-board ref="tableConfig" :config="tableConfig" />
<div class="desc-title">本日各作业区计划完成情况</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { zyjhzxTable, zyjhzx, today_zyjhzx } from "@/api/amphiPosition";
export default {
name: "AmphiPosition",
data() {
return {
formData: {
year: 2024,
},
tableSumObj: {},
tableConfig: {
header: ["作业区", "船号", "批量", "分段", "套料图号", "状态"],
data: [],
rowNum: 6,
align: ["center"],
headerHeight: 35,
headerBGC: "#063079",
oddRowBGC: "",
evenRowBGC: "#12264f",
},
tableConfigObj: {},
};
},
created() {
this.queryBtn();
},
methods: {
// 根据年份查询
queryBtn() {
this.zyjhzxTable(); //垮位汇总表
this.zyjhzx(); //30天作业区完成情况折线图
this.today_zyjhzx(); //本日各作业区计划完成情况
},
zyjhzxTable() {
zyjhzxTable({
nf: this.formData.nf,
}).then((res) => {
this.tableSumObj = res.data;
let wclOneValue = 0;
let wcOneValue = 0;
let slOneValue = 0;
let wclSecondValue = 0;
let wcSecondValue = 0;
let slSecondValue = 0;
let wclThreeValue = 0;
let wcThreeValue = 0;
let slThreeValue = 0;
let wclSumValue = 0;
let wcSumValue = 0;
let slSumValue = 0;
// =======
let zyq1 = 0;
let zyq2 = 0;
let zyq3 = 0;
let zyq4 = 0;
// 切割饼图
this.loaderPie(res.data.zs - res.data.sl, res.data.sl);
res.data.detail.forEach((item) => {
if (item.kw == "一垮") {
wcOneValue += item.wc;
wclOneValue = (slOneValue += item.sl) - wcOneValue;
this.cutOnePie(wclOneValue, wcOneValue);
} else if (item.kw == "二垮") {
wcSecondValue += item.wc;
wclSecondValue = (slSecondValue += item.sl) - wcSecondValue;
this.cutSecondPie(wclSecondValue, wcSecondValue);
} else if (item.kw == "三垮") {
wcThreeValue += item.wc;
wclThreeValue = (slThreeValue += item.sl) - wcThreeValue;
this.cutThreePie(wclThreeValue, wcThreeValue);
} else if (item.kw == "四五六垮") {
wcSumValue += item.wc;
wclSumValue = (slSumValue += item.sl) - wcSumValue;
this.cutSumPie(wclSumValue, wcSumValue);
}
// =================
if (item.zyq == "一区") {
zyq1 += item.sl;
} else if (item.zyq == "二区") {
zyq2 += item.sl;
} else if (item.zyq == "三区") {
zyq3 += item.sl;
} else if (item.zyq == "四区") {
zyq4 += item.sl;
}
});
let zyqDataY = [zyq1, zyq2, zyq3, zyq4];
var bgData = [res.data.zs, res.data.zs, res.data.zs, res.data.zs];
this.$nextTick(() => {
this.loaderBar(zyqDataY, bgData);
});
});
},
zyjhzx() {
zyjhzx({
nf: this.formData.nf,
}).then((res) => {
let dataX = [];
7 months ago
let dataDayX = [];
7 months ago
let legendData = [];
7 months ago
let seriesData = [{}, {}, {}, {}, {}, {}];
let dataY = [];
let dateData = [];
let zyqList = res.data.reduce((prev, current) => {
const key = current.zyq;
if (!prev[key]) {
prev[key] = [];
}
prev[key].push(current);
return prev;
}, {});
// 获取所有作业区
legendData = Object.keys(zyqList);
dataX = this.getAllDatesOfCurrentMonth();
dataX.forEach((item, index) => {
dataDayX.push(item.slice(-2) + "日");
dataY.push({
day: item,
data: 0,
7 months ago
});
7 months ago
dateData.push(0);
});
// 循环数据
legendData.forEach((item, index) => {
if (item == "一区") {
let Y = JSON.parse(JSON.stringify(dataY));
for (let i = 0; i < Y.length; i++) {
let arry1 = Y[i];
let arry2 = zyqList[item].find((item) => item.day === arry1.day);
if (arry2) {
arry1.data = arry2.sl;
}
}
seriesData[0].data = Y;
} else if (item == "二区") {
let Y = JSON.parse(JSON.stringify(dataY));
for (let i = 0; i < Y.length; i++) {
let arry1 = Y[i];
let arry2 = zyqList[item].find((item) => item.day === arry1.day);
if (arry2) {
arry1.data = arry2.sl;
}
}
seriesData[1].data = Y;
} else if (item == "三区") {
let Y = JSON.parse(JSON.stringify(dataY));
for (let i = 0; i < Y.length; i++) {
let arry1 = Y[i];
let arry2 = zyqList[item].find((item) => item.day === arry1.day);
if (arry2) {
arry1.data = arry2.sl;
}
}
seriesData[2].data = Y;
} else if (item == "四区") {
let Y = JSON.parse(JSON.stringify(dataY));
for (let i = 0; i < Y.length; i++) {
let arry1 = Y[i];
let arry2 = zyqList[item].find((item) => item.day === arry1.day);
if (arry2) {
arry1.data = arry2.sl;
}
}
seriesData[3].data = Y;
} else if (item == "五区") {
let Y = JSON.parse(JSON.stringify(dataY));
for (let i = 0; i < Y.length; i++) {
let arry1 = Y[i];
let arry2 = zyqList[item].find((item) => item.day === arry1.day);
if (arry2) {
arry1.data = arry2.sl;
}
}
seriesData[4].data = Y;
} else if (item == "六区") {
let Y = JSON.parse(JSON.stringify(dataY));
for (let i = 0; i < Y.length; i++) {
let arry1 = Y[i];
let arry2 = zyqList[item].find((item) => item.day === arry1.day);
if (arry2) {
arry1.data = arry2.sl;
}
}
seriesData[5].data = Y;
}
7 months ago
});
7 months ago
var oneArr = [];
var twoArr = [];
var threeArr = [];
var fourArr = [];
var fiveArr = [];
var sixArr = [];
if (seriesData[0] && seriesData[0].data) {
seriesData[0].data.forEach((item) => {
oneArr.push(item.data);
});
} else {
oneArr = dateData;
}
if (seriesData[1] && seriesData[1].data) {
seriesData[1].data.forEach((item) => {
twoArr.push(item.data);
});
} else {
twoArr = dateData;
}
if (seriesData[2] && seriesData[2].data) {
seriesData[2].data.forEach((item) => {
threeArr.push(item.data);
});
} else {
threeArr = dateData;
}
if (seriesData[3] && seriesData[3].data) {
seriesData[3].data.forEach((item) => {
fourArr.push(item.data);
});
} else {
fourArr = dateData;
}
if (seriesData[4] && seriesData[4].data) {
seriesData[4].data.forEach((item) => {
fiveArr.push(item.data);
});
} else {
fiveArr = dateData;
}
if (seriesData[5] && seriesData[5].data) {
seriesData[5].data.forEach((item) => {
sixArr.push(item.data);
});
} else {
sixArr = dateData;
}
7 months ago
// 折线图
7 months ago
this.TableLine(
dataDayX,
oneArr,
twoArr,
threeArr,
fourArr,
fiveArr,
sixArr
);
7 months ago
});
},
today_zyjhzx() {
today_zyjhzx({
nf: this.formData.nf,
}).then((res) => {
this.tableConfigObj = res.data;
let data = [];
if (res.data.detail.length) {
res.data.detail.forEach((item, index) => {
data.push({
zyq: item.zyq,
dcCh: item.dcCh,
dcPl: item.dcPl,
dcFd: item.dcFd,
tzbh: item.tzbh,
zt: item.zt,
});
});
let valueArray = data.map((obj) => Object.values(obj));
this.$nextTick(() => {
this.$refs["tableConfig"].updateRows(valueArray);
});
}
});
},
loaderPie(wclValue, wcValue) {
var myChart = this.$echarts.init(document.getElementById("loaderPie"));
var option = {
title: {
text: "上料分析",
left: "center",
bottom: 0,
textStyle: {
color: "#fff",
fontSize: 12,
fontWeight: "normal",
},
},
color: ["#91cc75", "#5470c6"],
tooltip: {
trigger: "item",
formatter: "{a} <br/>{b} : {c} ({d}%)",
},
legend: {
left: "center",
textStyle: {
color: "#e9ebee",
},
},
series: [
{
name: "上料",
type: "pie",
radius: "60%",
center: ["50%", "50%"],
minAngle: wcValue && wclValue ? 20 : "",
avoidLabelOverlap: true,
data: [
{ value: wcValue, name: "完成" },
{ value: wclValue, name: "未完成" },
],
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: "rgba(0, 0, 0, 0.5)",
},
},
},
],
};
myChart.setOption(option);
window.addEventListener("resize", () => {
myChart.resize();
});
},
cutOnePie(wclOneValue, wcOneValue) {
var myChart = this.$echarts.init(document.getElementById("cutOnePie"));
var option = {
title: {
text: "一垮分析",
left: "center",
bottom: 0,
textStyle: {
color: "#fff",
fontSize: 12,
fontWeight: "normal",
},
},
color: ["#91cc75", "#fac858"],
tooltip: {
trigger: "item",
formatter: "{a} <br/>{b} : {c} ({d}%)",
},
legend: {
show: false,
left: "center",
textStyle: {
color: "#e9ebee",
},
itemWidth: 20,
itemHeight: 12,
},
series: [
{
name: "一垮",
type: "pie",
radius: "60%",
center: ["50%", "50%"],
minAngle: wcOneValue && wclOneValue ? 20 : "",
avoidLabelOverlap: true,
data: [
{ value: wcOneValue, name: "完成" },
{ value: wclOneValue, name: "未完成" },
],
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: "rgba(0, 0, 0, 0.5)",
},
},
},
],
};
myChart.setOption(option);
window.addEventListener("resize", () => {
myChart.resize();
});
},
cutSecondPie(wclSecondValue, wcSecondValue) {
var myChart = this.$echarts.init(document.getElementById("cutSecondPie"));
var option = {
title: {
text: "二垮分析",
left: "center",
bottom: 0,
textStyle: {
color: "#fff",
fontSize: 12,
fontWeight: "normal",
},
},
color: ["#fac858", "#ee6666"],
tooltip: {
trigger: "item",
formatter: "{a} <br/>{b} : {c} ({d}%)",
},
legend: {
show: false,
left: "center",
textStyle: {
color: "#e9ebee",
},
itemWidth: 20,
itemHeight: 12,
},
series: [
{
name: "二垮",
type: "pie",
radius: "60%",
center: ["50%", "50%"],
minAngle: wcSecondValue && wclSecondValue ? 20 : "",
avoidLabelOverlap: true,
data: [
{ value: wcSecondValue, name: "完成" },
{ value: wclSecondValue, name: "未完成" },
],
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: "rgba(0, 0, 0, 0.5)",
},
},
},
],
};
myChart.setOption(option);
window.addEventListener("resize", () => {
myChart.resize();
});
},
cutThreePie(wclThreeValue, wcThreeValue) {
var myChart = this.$echarts.init(document.getElementById("cutThreePie"));
var option = {
title: {
text: "三垮分析",
left: "center",
bottom: 0,
textStyle: {
color: "#fff",
fontSize: 12,
fontWeight: "normal",
},
},
color: ["#1afffd", "#2e7cff"],
tooltip: {
trigger: "item",
formatter: "{a} <br/>{b} : {c} ({d}%)",
},
legend: {
show: false,
left: "center",
textStyle: {
color: "#e9ebee",
},
},
series: [
{
name: "三垮",
type: "pie",
radius: "60%",
center: ["50%", "50%"],
minAngle: wcThreeValue && wclThreeValue ? 20 : "",
data: [
{ value: wcThreeValue, name: "完成" },
{ value: wclThreeValue, name: "未完成" },
],
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: "rgba(0, 0, 0, 0.5)",
},
},
},
],
};
myChart.setOption(option);
window.addEventListener("resize", () => {
myChart.resize();
});
},
cutSumPie(wclSumValue, wcSumValue) {
var myChart = this.$echarts.init(document.getElementById("cutSumPie"));
var option = {
title: {
text: "四五六垮",
left: "center",
bottom: 0,
textStyle: {
color: "#fff",
fontSize: 12,
fontWeight: "normal",
},
},
color: ["#ff81cb", "#2865aa"],
tooltip: {
trigger: "item",
formatter: "{a} <br/>{b} : {c} ({d}%)",
},
legend: {
left: "center",
textStyle: {
color: "#e9ebee",
},
},
series: [
{
name: "四五六垮",
type: "pie",
radius: "60%",
center: ["50%", "50%"],
minAngle: wcSumValue && wclSumValue ? 20 : "",
data: [
{ value: wcSumValue, name: "完成" },
{ value: wclSumValue, name: "未完成" },
],
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: "rgba(0, 0, 0, 0.5)",
},
},
},
],
};
myChart.setOption(option);
window.addEventListener("resize", () => {
myChart.resize();
});
},
loaderBar(zyqDataY, bgData) {
var myChart = this.$echarts.init(document.getElementById("loaderBar"));
var option = {
tooltip: {
trigger: "axis",
axisPointer: {
type: "line",
lineStyle: {
color: "rgba(150,150,150,0.2)",
width: 70,
type: "solid",
},
},
formatter: (params) => {
var res = "";
res =
params[1].marker +
params[1].name +
"<br/>" +
params[0].seriesName +
"" +
params[0].value +
"<br/>" +
params[1].seriesName +
"" +
params[1].value;
return res;
},
},
grid: {
top: "10%",
left: "3%",
right: "3%",
bottom: "0",
containLabel: true,
},
xAxis: [
{
type: "category",
data: ["一区", "二区", "三区", "四区"],
axisLabel: {
color: "#e4e4e4",
},
},
],
yAxis: {
type: "value",
splitLine: {
show: false,
},
axisLabel: {
color: "#e4e4e4",
},
data: zyqDataY,
},
series: [
{
name: "总数量",
type: "bar",
barGap: "-100%",
label: {
show: false,
},
barWidth: 40,
itemStyle: {
color: "#2e7cff",
},
data: bgData, // 载入背景数据
z: 0,
},
{
name: "完成数量",
type: "bar",
barWidth: 40,
itemStyle: {
color: "#1afffd",
},
data: zyqDataY, // 载入数据(内含自定义参数)
z: 1,
},
],
};
myChart.setOption(option);
window.addEventListener("resize", () => {
myChart.resize();
});
},
7 months ago
TableLine(dataX, oneArr, twoArr, threeArr, fourArr, fiveArr, sixArr) {
7 months ago
var myChart = this.$echarts.init(document.getElementById("TableLine"));
var option = {
tooltip: {
trigger: "axis",
},
color: [
"#e15828",
"#2e7cff",
"#00c0ef",
"#5470c6",
"#ffcb89",
"#3ba272",
],
legend: {
7 months ago
data: dataX,
7 months ago
top: "5%",
textStyle: {
color: "#e9ebee",
},
},
grid: {
left: "2%",
right: "2%",
top: "10%",
bottom: "3%",
containLabel: true,
},
xAxis: {
type: "category",
boundaryGap: false,
data: dataX,
axisLabel: {
color: "#e4e4e4",
},
nameTextStyle: {
color: "#e4e4e4",
fontSize: 12,
padding: [0, 0, 0, 0],
},
},
yAxis: {
type: "value",
splitLine: {
show: false,
lineStyle: {
color: "#064585",
},
},
axisLabel: {
color: "#e4e4e4",
},
nameTextStyle: {
color: "#e4e4e4",
fontSize: 12,
padding: [0, 40, 10, 0],
},
},
series: [
{
7 months ago
name: "一区",
7 months ago
type: "line",
7 months ago
data: oneArr,
7 months ago
},
{
7 months ago
name: "二区",
7 months ago
type: "line",
7 months ago
data: twoArr,
7 months ago
},
{
7 months ago
name: "三区",
7 months ago
type: "line",
7 months ago
data: threeArr,
7 months ago
},
{
7 months ago
name: "四区",
7 months ago
type: "line",
7 months ago
data: fourArr,
7 months ago
},
{
7 months ago
name: "五区",
7 months ago
type: "line",
7 months ago
data: fiveArr,
7 months ago
},
{
7 months ago
name: "六区",
7 months ago
type: "line",
7 months ago
data: sixArr,
7 months ago
},
],
};
myChart.setOption(option);
window.addEventListener("resize", () => {
myChart.resize();
});
},
7 months ago
getAllDatesOfCurrentMonth() {
const today = new Date();
const firstDayOfMonth = new Date(
today.getFullYear(),
today.getMonth(),
1
);
const lastDayOfMonth = new Date(
today.getFullYear(),
today.getMonth() + 1,
0
);
const dates = [];
for (
let i = firstDayOfMonth;
i <= lastDayOfMonth;
i.setDate(i.getDate() + 1)
) {
dates.push(this.$moment(new Date(i)).format("yyyy/MM/DD"));
}
return dates;
},
7 months ago
},
};
</script>
<style scoped lang="scss">
.amphiPosition-container {
margin-top: 10px;
padding-left: 5px;
padding-right: 5px;
.amphiPosition-box {
display: flex;
align-items: stretch;
height: calc(100vh - 105px);
.left-box {
width: 45%;
height: 100%;
margin-right: 5px;
display: flex;
flex-direction: column;
justify-content: space-between;
.left-top-box {
width: 100%;
height: 31%;
.table-sum {
width: 100%;
border-collapse: collapse;
color: #ffffff;
.radius {
border-top-left-radius: 10px;
}
}
.table-sum tr td {
font-size: 12px;
}
}
// 饼图
.left-center-box {
width: 100%;
height: 33%;
display: flex;
align-items: center;
justify-content: space-between;
.loaderPie,
.cutOnePie,
.cutSecondPie,
.cutThreePie,
.cutSumPie {
width: 100%;
height: 90%;
}
}
// 上料各作业区柱状图
.left-bottom-box {
height: 33%;
padding-top: 2%;
.loaderBar {
height: 80%;
}
}
}
.right-box {
width: 55%;
height: 100%;
// 折线图
.right-top-box {
height: 45%;
.TableLine {
width: 100%;
height: 90%;
}
}
.right-center-box {
margin-top: 2%;
margin-bottom: 3%;
.right-center-title {
color: #fff;
text-align: center;
font-size: 16px;
font-weight: bold;
}
}
// 滚动表格
.right-bottom-box {
height: 37%;
}
}
}
// 共用
.border-out {
width: 100%;
height: 100%;
border-radius: 10px;
border: 1px #0174f5 solid;
padding: 1px;
box-sizing: border-box;
}
.border-inner {
width: 100%;
height: 100%;
box-sizing: border-box;
border: 2px solid #016ae0;
border-radius: 10px;
background-color: rgba(2, 8, 23, 0.54);
overflow: hidden;
}
.box-top {
margin-top: 5px;
}
.desc-title {
color: #fff;
text-align: center;
margin-top: 2vh;
font-size: 12px;
}
}
</style>