factory_web/src/views/home/enp_home.vue

554 lines
15 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 class="widgets-home" ref="main">
<div class="widgets-content">
<div class="retangleWrap retangleWrapTop">
<div class="retangle retangleImg">
<div class="companyName">超低排放系统</div>
<div class="companyDesc">超低排放系统超低排放系统超低排放系统超低排放系统</div>
<div class="companyDesc">超低排放系统超低排放系统超低排放系统超低排放系统超低排放系统</div>
<div class="companyDesc">超低排放系统超低排放系统超低排放系统超低排放系统超低排放系统</div>
<img class="topCardImg" src="img/topCard.png">
</div>
</div>
<el-row style="margin-bottom: 20px;">
<el-col :span="7">
<div class="retangleWrap" style="padding-right: 0;">
<div class="retangle bottomRetangle" style="">
<div style="display: flex;justify-content: space-between;padding: 0 24px;">
<div style="font-size: 16px;font-weight: 400;line-height: 24px;">预警提示</div>
</div>
<div style="padding: 20px 24px 24px 24px;height: 311px;">
<div>
<p style="display: flex;justify-content: space-between;height: 30px;line-height: 30px;">
<span>颗粒物污染上升</span>
<span style="font-size: 24px;">0.035%</span>
</p>
</div>
</div>
</div>
</div>
</el-col>
<el-col :span="10">
<div class="retangleWrap retangleWrapTable" style="padding-right: 0;">
<div class="retangle tableRetangle">
<div style="display: flex;justify-content: space-between;padding: 0 24px;">
<div style="color: rgb(30, 30, 30);font-size: 16px;font-weight: 400;line-height: 24px;">生产设备
</div>
</div>
<div style="padding: 20px 24px 24px 24px;">
<el-table :data="equipList" style="width: 100%;height: 285px;">
<el-table-column prop="number" label="设备编号" />
<el-table-column prop="name" label="设备名称" />
<el-table-column prop="belong_dept_name" label="所在车间" />
<el-table-column prop="state" label="设备状态">
<template #default="scope">
<el-tag class="ml-2" type="success" v-if="scope.row.state == 10">{{
eqState_[scope.row.state] }}</el-tag>
<el-tag class="ml-2" type="warning" v-if="scope.row.state == 20">{{
eqState_[scope.row.state] }}</el-tag>
<el-tag class="ml-2" type="info" v-if="scope.row.state == 30">{{
eqState_[scope.row.state] }}</el-tag>
<el-tag class="ml-2" type="danger" v-if="scope.row.state == 40">{{
eqState_[scope.row.state] }}</el-tag>
</template>
</el-table-column>
</el-table>
</div>
</div>
</div>
</el-col>
<el-col :span="7">
<div class="retangleWrap retangleWrapTable">
<div class="retangle tableRetangle">
<div style="display: flex;justify-content: space-between;padding: 0 24px;">
<div style="color: rgb(30, 30, 30);font-size: 16px;font-weight: 400;line-height: 24px;">日历
</div>
</div>
<div style="">
<el-calendar v-model="calendarValue" />
</div>
</div>
</div>
</el-col>
</el-row>
</div>
</div>
</template>
<script>
import * as echarts from 'echarts';
export default {
data() {
return {
time: '',
day: '',
year_s: '',
day_s: '',
month_s: '',
deptName: '10车间',
yesterday: '',
yesterdayBefore: '',
yearData: [],
monthData: [],
warningNum: 0,
warningNum2: 0,
chartData: [],
tableData: [],
equipList: [],
calendarValue: '',
eqState_: {
10: '完好',
20: '限用',
30: '在修',
40: '禁用',
},
dayPassNum7: 0,
tongbi7: 0,
dayPassNum10: 0,
tongbi10: 0,
dayPayNum6: 0,//交付数
tongbi06: 0,
monthPayNum6: 0,
monthPassRate7: 0,
monthPassRate10: 0,
dayAVGcountOk: 0,
AVGOktongbi: 0,
dayAVGcountDelivered: 0,
AVGDelivertongbi: 0,
monthRateAVG: 0,
monthPayNumAVG: 0,
option: {
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross',
label: {
backgroundColor: '#6a7985'
}
}
},
grid: { // 图表距离边框的距离可用百分比和数字px配置
top: '5%',
left: '1%',
right: '1%',
bottom: '5%',
containLabel: true
},
xAxis: {
type: 'category',
axisLabel: {
// show: false, // X 轴标签文字旋转角度
},
data: []
},
yAxis: {
type: 'value',
axisLabel: {
show: false, // X 轴标签文字旋转角度
},
},
series: {
data: [],
type: 'bar',
barMaxWidth: 50,
emphasis: {
focus: 'series'
},
label: {
show: true,
position: 'top',
color: '#000'
},
itemStyle: {
borderRadius: [5, 5, 0, 0],
normal: { color: 'rgb(20, 141, 255)' }
}
}
}
}
},
mounted() {
this.$emit('on-mounted');
let that = this;
var myDate = new Date();
let year = myDate.getFullYear();
let month = myDate.getMonth() + 1;
let day = myDate.getDate();
that.year_s = year;
that.month_s = month;
that.day_s = day;
let yesterday = new Date(myDate.getTime() - 24 * 60 * 60 * 1000);
this.yesterday = yesterday.getFullYear() + "-" + (yesterday.getMonth() + 1) + "-" + yesterday.getDate();
let yesterdayBefore = new Date(yesterday.getTime() - 24 * 60 * 60 * 1000);
this.yesterdayBefore = yesterdayBefore.getFullYear() + "-" + (yesterdayBefore.getMonth() + 1) + "-" + yesterdayBefore.getDate();
that.getdayData();
that.getMonthData();
this.getAVGDayData();
this.calendarValue = new Date();
this.getEquipList();
this.getMaterialList();
this.getProductStatistic();
},
methods: {
// 动态绑定Class
bindClass(rate) {
let classInfo = {
socketDom: true, redColor: false, greenColor: true
}
if (rate > 0) {
classInfo.greenColor = true
} else if (rate < 0) {
classInfo.redColor = true
}
return classInfo
},
getEquipList() {
this.$API.em.equipment.list.req({ page: 0, type: 10 }).then(res => {
this.equipList = res
})
},
getMaterialList() {
this.$API.mtm.material.list.req({ page: 0, type: 10 }).then(res => {
this.tableData = res.filter(item => {
return item.count > 0;
});
console.log('getMaterialList', res)
})
},
showTime() {
this.time = this.$TOOL.dateFormat(new Date(), 'hh:mm:ss')
this.day = this.$TOOL.dateFormat(new Date(), 'yyyy年MM月dd日')
},
interEquipment() {
this.$router.replace({ path: '/em/equipment' })
},
//昨日数据
getdayData() {
let that = this;
let date = that.yesterday;
let obj6 = {
query: { start_date: date, end_date: date, mio_type: 'sale_out', material_id: '' },
};
let obj7 = {
query: { start_date: date, end_date: date, dept_name: "7车间" },
};
let obj10 = {
query: { start_date: date, end_date: date, dept_name: "10车间" },
};
let date0 = that.yesterdayBefore;
let obj06 = {
query: { start_date: date0, end_date: date0, mio_type: 'sale_out', material_id: '' },
};
let obj07 = {
query: { start_date: date0, end_date: date0, dept_name: "7车间" },
};
let obj010 = {
query: { start_date: date0, end_date: date0, dept_name: "10车间" },
};
//7车间昨日合格数
that.$API.bi.dataset.exec.req('lineDay', obj7).then((res7) => {
let list7 = res7.data2.ds0;
if (list7.length > 0) {
this.dayPassNum7 = list7[0].合格数;
}
//7车间前天合格数
that.$API.bi.dataset.exec.req('lineDay', obj07).then((res07) => {
let list07 = res07.data2.ds0;
if (list07.length > 0) {
this.tongbi7 = Math.round((this.dayPassNum7 - list07[0].合格数) / list07[0].合格数 * 100);
}
});
});
//10车间昨日合格数
that.$API.bi.dataset.exec.req('lineDay', obj10).then((res10) => {
console.log('res10', res10);
let list10 = res10.data2.ds0;
if (list10.length > 0) {
this.dayPassNum10 = list10[0].合格数;
}
//10车间前天合格数
that.$API.bi.dataset.exec.req('lineDay', obj010).then((res010) => {
console.log('res10', res010);
let list010 = res010.data2.ds0;
if (list010.length > 0) {
this.tongbi10 = Math.round((this.dayPassNum10 - list010[0].合格数) / list010[0].合格数 * 100);
}
});
});
//6车昨日交付数
that.$API.bi.dataset.exec.req('saleOutDay', obj6).then((res6) => {
let list6 = res6.data2.ds0;
if (list6.length > 0) {
this.dayPayNum6 = list6[0].交付数;
}
//6车前日交付数
that.$API.bi.dataset.exec.req('saleOutDay', obj06).then((res06) => {
let list06 = res06.data2.ds0;
if (list06.length > 0) {
this.tongbi06 = Math.round((this.dayPayNum6 - list06[0].交付数) / list06[0].交付数 * 100);
}
});
});
},
//本月合格数&本月交付统计
getMonthData() {
let that = this;
let start_date = that.year_s + '-' + that.month_s + '-01';
let end_date = that.year_s + '-' + that.month_s + '-' + that.day_s;
let obj6 = {
query: { start_date: start_date, end_date: end_date, mio_type: 'sale_out', material_id: '' },
};
let obj7 = {
query: { start_date: start_date, end_date: end_date, dept_name: "7车间" },
};
let obj10 = {
query: { start_date: start_date, end_date: end_date, dept_name: "10车间" },
};
//7车间本月合格率
that.$API.bi.dataset.exec.req('lineMonth', obj7).then((res7) => {
// console.log('7车间本月合格率:',res7);
let list7 = res7.data2.ds0;
let sum = 0, rate = 0;
if (list7.length > 0) {
list7.forEach(item => {
sum = sum + item.合格率;
});
rate = sum / list7.length;
}
this.monthPassRate7 = Math.round(rate);
});
//10车间本月合格率
that.$API.bi.dataset.exec.req('lineMonth', obj10).then((res10) => {
this.monthPassRate10 = 0;
let list10 = res10.data2.ds0;
let sum = 0, rate = 0;
if (list10.length > 0) {
list10.forEach(item => {
sum = sum + item.合格率;
});
rate = sum / list10.length;
}
this.monthPassRate10 = Math.round(rate);
});
//6车间本月交付数
that.$API.bi.dataset.exec.req('saleOutMonth', obj6).then((res6) => {
// console.log('6车间本月交付数:',res6);
let list6 = res6.data2.ds0;
let sum = 0;
list6.forEach(item => {
sum = sum + item.交付数;
});
this.monthPayNum6 = sum;
});
//本月合格率
},
//获取昨日AVG的生产记录
getAVGDayData() {
let that = this;
let date = that.yesterday;
let date0 = that.yesterdayBefore;
this.$API.wpm.otherlog.list.req({ product: 'AVG', page: 0, handle_date__gte: date, handle_date__lte: date }).then(res => {
let list = res;
let count_ok = 0, count_delivered = 0;
if (list.length > 0) {
list.forEach(item => {
count_ok = count_ok + item.count_ok;
count_delivered = count_delivered + item.count_delivered;
})
that.dayAVGcountOk = count_ok;
that.dayAVGcountDelivered = count_delivered;
this.$API.wpm.otherlog.list.req({ product: 'AVG', page: 0, handle_date__gte: date0, handle_date__lte: date0 }).then(res0 => {
let list0 = res0;
let count_ok0 = 0, count_delivered0 = 0;
if (list0.length > 0) {
list0.forEach(item0 => {
count_ok0 = count_ok0 + item0.count_ok;
count_delivered0 = count_delivered0 + item0.count_delivered;
})
that.AVGOktongbi = Math.round((count_ok - count_ok0) / count_ok0 * 100);
that.AVGDelivertongbi = Math.round((count_delivered - count_delivered0) / count_delivered0 * 100);
}
})
}
})
},
getAVGMonthData() {
let that = this;
let start_date = that.year_s + '-' + that.month_s + '-01';
let end_date = that.year_s + '-' + that.month_s + '-' + that.day_s;
let obj = {
query: { start_date: start_date, end_date: end_date },
};
that.$API.bi.dataset.exec.req('AVGMonth', obj).then((res) => {
let list = res.data2.ds0;
let sum = 0, count_real = 0, count_ok = 0;
list.forEach(item => {
sum = sum + item.交付数;
count_ok = count_ok + item.count_ok;
count_real = count_real + item.count_real;
});
this.monthPayNumAVG = sum;
if (count_real != 0) {
this.monthRateAVG = Math.round((count_ok / count_real) * 100)
} else {
this.monthRateAVG = 0;
}
});
},
getProductStatistic() {
let that = this;
let start_date = that.year_s + '-' + that.month_s + '-01';
let end_date = that.year_s + '-' + that.month_s + '-' + that.day_s;
let obj = {
query: { start_date: start_date, end_date: end_date, dept_name: this.deptName },
};
that.$API.bi.dataset.exec.req('productStatistic', obj).then((res) => {
console.log('productStatistic:', res);
let list = res.data2.ds0;
let chartData = [], xAxisData = [];
for (let i = 0; i < that.day_s; i++) {
let dindex = i + 1;
xAxisData.push(dindex + '日')
for (let j = 0; j < list.length; j++) {
if (list[j].日 == i) {
chartData[i] = Math.round((list[j].合格数 / list[j].任务数) * 100);
}
}
}
this.chartData = chartData;
this.option.xAxis.data = xAxisData;
this.option.series.data = chartData;
//柱状图
var dom = document.getElementById("barCharts");
var myChart = echarts.init(dom);
myChart.setOption(this.option, true);
});
},
deptNameChange() {
this.getProductStatistic();
},
}
}
</script>
<style scoped lang="scss">
.retangleWrap {
width: 100%;
padding: 20px 20px 0 20px;
box-sizing: border-box;
}
.retangle {
width: 100%;
border-radius: 15px;
box-sizing: border-box;
position: relative;
background: #ffffff;
}
.retangleImg {
height: 188px;
color: #ffffff;
padding-left: 43px;
background: linear-gradient(180.00deg, rgb(58, 149, 255), rgb(27, 92, 255) 100%);
}
.companyName {
padding-top: 28px;
font-size: 24px;
line-height: 28px;
padding-bottom: 23px;
}
.companyDesc {
padding-left: 4px;
font-size: 14px;
line-height: 20px;
}
.topCardImg {
height: 188px;
position: absolute;
right: 10px;
top: 0;
}
.countRetangle {
height: 180px;
padding-top: 20px;
box-sizing: border-box;
}
.countItem {
width: 20%;
padding-left: 24px;
display: inline-block;
box-sizing: border-box;
border-right: 1px solid #eeeeee;
}
.countItem:last-child {
border-right: 0;
}
.countname {
font-size: 14px;
line-height: 22px;
color: rgba(94, 94, 94);
}
.countnum {
font-size: 30px;
padding-bottom: 11px;
line-height: 38px;
}
.countrate {
line-height: 20px;
color: rgba(0, 0, 0, .45);
}
.redColor {
color: rgb(255, 73, 87);
}
.greenColor {
color: rgb(71, 201, 58);
}
.middleRetangle {
border-radius: 2px;
position: relative;
box-sizing: border-box;
}
.middleItem {
width: 25%;
padding-left: 34px;
display: inline-block;
box-sizing: border-box;
}
.middleItem:first-child {
border-right: 1px solid #eeeeee;
}
.tableRetangle {
height: auto;
padding-top: 20px;
}
.bottomRetangle {
padding: 20px 0;
box-sizing: border-box;
background: #ffffff;
}
</style>