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.

860 lines
23 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<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 = []; // 当月所有日期
let dataDayX = []; //x轴
let legendData = ["一区", "二区", "三区", "四区", "五区", "六区"]; //设置所有作业区
let dataY = []; //所有作业区设置30日数据起始值0
let seriesData = [];
let dateData = []; //设置30天--0
let zyqList = res.data.reduce((prev, current) => {
const key = current.zyq;
if (!prev[key]) {
prev[key] = [];
}
prev[key].push(current);
return prev;
}, {});
// 获取当月所有日期
dataX = this.getAllDatesOfCurrentMonth();
dataX.forEach((item, index) => {
dataDayX.push(item.slice(-2) + "日");
dataY.push({
day: item,
data: 0,
});
dateData.push(0);
});
// 循环数据
legendData.forEach((item, index) => {
let Y = JSON.parse(JSON.stringify(dataY));
seriesData[index] = [];
for (let i = 0; i < Y.length; i++) {
let arry1 = Y[i];
if (zyqList[item]) {
let arry2 = zyqList[item].find((item) => item.day === arry1.day);
if (arry2) {
arry1.data = arry2.sl;
}
seriesData[index] = Y;
} else {
seriesData[index] = [];
}
}
});
let Arr = [];
seriesData.forEach((item, index) => {
Arr[index] = [];
if (item && item.length > 0) {
item.forEach((em) => {
Arr[index].push(em.data ? em.data : 0);
});
} else {
Arr[index] = dateData;
}
});
// 折线图
this.TableLine(dataDayX, Arr);
});
},
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();
});
},
TableLine(dataX, Arr) {
var myChart = this.$echarts.init(document.getElementById("TableLine"));
var option = {
tooltip: {
trigger: "axis",
},
color: [
"#e15828",
"#2e7cff",
"#00c0ef",
"#5470c6",
"#ffcb89",
"#3ba272",
],
legend: {
top: "5%",
textStyle: {
color: "#e9ebee",
},
},
grid: {
left: "2%",
right: "2%",
top: "20%",
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: [
{
name: "一区",
type: "line",
data: Arr[0],
},
{
name: "二区",
type: "line",
data: Arr[1],
},
{
name: "三区",
type: "line",
data: Arr[2],
},
{
name: "四区",
type: "line",
data: Arr[3],
},
{
name: "五区",
type: "line",
data: Arr[4],
},
{
name: "六区",
type: "line",
data: Arr[5],
},
],
};
myChart.setOption(option);
window.addEventListener("resize", () => {
myChart.resize();
});
},
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;
},
},
};
</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>