725 lines
22 KiB
Python
725 lines
22 KiB
Python
<template>
|
|
<div id="index" ref="appRef">
|
|
<div class="bg">
|
|
<!--<dv-loading v-show="loading">Loading...</dv-loading>-->
|
|
<div class="host-body">
|
|
<div class="d-flex jc-center" id="firstLine">
|
|
<dv-decoration-10 class="dv-dec-10"/>
|
|
<div class="d-flex jc-center">
|
|
<dv-decoration-8 class="dv-dec-8" :color="['#568aea', '#000000']"/>
|
|
<div class="title">
|
|
<div class="title-text">
|
|
<span style="margin-right: 20px">航玻生产</span><span>管理系统</span>
|
|
</div>
|
|
<dv-decoration-6
|
|
class="dv-dec-6"
|
|
:reverse="true"
|
|
:color="['#50e3c2', '#67a1e5']"
|
|
/>
|
|
</div>
|
|
<dv-decoration-8
|
|
class="dv-dec-8"
|
|
:reverse="true"
|
|
:color="['#568aea', '#000000']"
|
|
/>
|
|
</div>
|
|
<dv-decoration-10 class="dv-dec-10-s"/>
|
|
</div>
|
|
<!-- 第二行 -->
|
|
<div class="d-flex jc-between px-2">
|
|
<div class="d-flex aside-width">
|
|
<div class="react-left ml-4 react-l-s">
|
|
<span class="react-before"></span>
|
|
<span class="text">数据统计</span>
|
|
</div>
|
|
<div class="react-right ml-3">
|
|
<!--<span class="text">数据分析2</span>-->
|
|
</div>
|
|
</div>
|
|
<div class="d-flex aside-width">
|
|
<div class="react-right bg-color-blue mr-3">
|
|
<span class="text fw-b">车间详情</span>
|
|
</div>
|
|
<div class="react-right mr-4 react-l-s">
|
|
<span class="react-after"></span>
|
|
<span class="text">{{ dateYear }} {{ dateWeek }} {{ dateDay }}</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="body-box">
|
|
<!-- 第三行数据 -->
|
|
<div id="centerWrap" class="content-box">
|
|
<!-- 数据统计 -->
|
|
<div>
|
|
<center
|
|
v-if="numberShow"
|
|
:titleItem="titleItem"
|
|
:rate="rate"
|
|
:water="water"
|
|
:ranking="ranking"
|
|
/>
|
|
</div>
|
|
<!--工序成品率-->
|
|
<div>
|
|
<centerRight2
|
|
v-if="processRate"
|
|
:config="config"
|
|
/>
|
|
</div>
|
|
<!--一车间-->
|
|
<div>
|
|
<dv-border-box-1>
|
|
<centerLeft1
|
|
v-if="limitedOne"
|
|
:numberData="numberData"
|
|
/>
|
|
</dv-border-box-1>
|
|
</div>
|
|
<!--二车间-->
|
|
<div>
|
|
<dv-border-box-1>
|
|
<centerLeft2
|
|
v-if="limitedTwo"
|
|
:numberDataTwo="numberDataTwo"
|
|
/>
|
|
</dv-border-box-1>
|
|
</div>
|
|
<!--到岗情况-->
|
|
<div>
|
|
<dv-border-box-10>
|
|
<centerRight1
|
|
v-if="listUser"
|
|
:userConfig="userConfig"
|
|
/>
|
|
</dv-border-box-10>
|
|
</div>
|
|
</div>
|
|
<!-- 第四行数据 -->
|
|
<div class="bototm-box">
|
|
<dv-border-box-3 v-if="listNews">
|
|
<bottomRight
|
|
:configArticle="configArticle"
|
|
/>
|
|
</dv-border-box-3>
|
|
<dv-border-box-13>
|
|
<bottomLeft
|
|
v-if="limitedPlan"
|
|
:category="category"
|
|
:planData="planData"
|
|
:realData="realData"
|
|
/>
|
|
</dv-border-box-13>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import drawMixin from "../../utils/drawMixin";
|
|
import {formatTimeBigScreen} from '../../utils/index.js'
|
|
import centerLeft1 from './centerLeft1'
|
|
import centerLeft2 from './centerLeft2'
|
|
import centerRight1 from './centerRight1'
|
|
import centerRight2 from './centerRight2'
|
|
import center from './center'
|
|
import {getEmployee} from "@/api/hrm";
|
|
import bottomLeft from './bottomLeft'
|
|
import bottomRight from './bottomRight'
|
|
import {getPlanGantt} from "@/api/srm";
|
|
import {getProductionplanList} from "@/api/pm";
|
|
import {getProcessYield, productCount, getProcessNow} from "@/api/srm";
|
|
import {getContractList, getOrderList} from "@/api/sam";
|
|
import {getArticles} from "@/api/cms";
|
|
|
|
export default {
|
|
mixins: [drawMixin],
|
|
data() {
|
|
return {
|
|
timing: null,
|
|
loading: true,
|
|
dateDay: null,
|
|
dateYear: null,
|
|
dateWeek: null,
|
|
numberShow: false,
|
|
processRate: false,
|
|
listUser: false,
|
|
listNews: false,
|
|
limitedPlan: false,
|
|
listProcess: false,
|
|
create_time_start: '',
|
|
titleItem: [
|
|
{
|
|
title: '本月合同数',
|
|
number: {
|
|
number: [12],//数字数值
|
|
toFixed: 0,//小数位数
|
|
textAlign: 'left',//水平对齐方式
|
|
content: '{nt}',//内容模版//rowGap行间距
|
|
style: {//样式配置
|
|
fontSize: 26
|
|
}
|
|
}
|
|
},
|
|
{
|
|
title: '本月生产订单数',
|
|
number: {
|
|
number: [12],
|
|
toFixed: 0,
|
|
textAlign: 'left',
|
|
content: '{nt}',
|
|
style: {
|
|
fontSize: 26
|
|
}
|
|
}
|
|
},
|
|
{
|
|
title: '本月在制任务数',
|
|
number: {
|
|
number: [2],
|
|
toFixed: 0,
|
|
textAlign: 'left',
|
|
content: '{nt}',
|
|
style: {
|
|
fontSize: 26
|
|
}
|
|
}
|
|
},
|
|
{
|
|
title: '本月交付产品数',
|
|
number: {
|
|
number: [8],
|
|
toFixed: 0,
|
|
textAlign: 'left',
|
|
content: '{nt}',
|
|
style: {
|
|
fontSize: 26
|
|
}
|
|
}
|
|
},
|
|
{
|
|
title: '本月不合格产品数',
|
|
number: {
|
|
number: [2],
|
|
toFixed: 0,
|
|
textAlign: 'left',
|
|
content: '{nt}',
|
|
style: {
|
|
fontSize: 26
|
|
}
|
|
}
|
|
},
|
|
{
|
|
title: '本月军检合格率',
|
|
number: {
|
|
number: [99],
|
|
toFixed: 1,
|
|
textAlign: 'left',
|
|
content: '{nt}%',
|
|
style: {
|
|
fontSize: 26
|
|
}
|
|
}
|
|
},
|
|
],
|
|
ranking: {
|
|
data: [
|
|
{
|
|
name: '冷加工',
|
|
value: 100
|
|
},
|
|
{
|
|
name: '热弯成型',
|
|
value: 100
|
|
},
|
|
{
|
|
name: '化学钢化',
|
|
value: 100
|
|
},
|
|
{
|
|
name: '镀膜',
|
|
value: 100
|
|
},
|
|
{
|
|
name: '夹层',
|
|
value: 100
|
|
},
|
|
{
|
|
name: '包边',
|
|
value: 100
|
|
},
|
|
{
|
|
name: '装框',
|
|
value: 100
|
|
}
|
|
],
|
|
carousel: 'single',
|
|
unit: '%'
|
|
},
|
|
water: {
|
|
data: [45, 90],
|
|
shape: 'roundRect',
|
|
formatter: '{value}%',
|
|
waveNum: 3
|
|
},
|
|
// 通过率和达标率的组件复用数据
|
|
rate: [
|
|
{
|
|
id: 'centerRate1',
|
|
tips: 98,
|
|
colorData: {
|
|
textStyle: '#3fc0fb',
|
|
series: {
|
|
color: ['#00bcd44a', 'transparent'],
|
|
dataColor: {
|
|
normal: '#03a9f4',
|
|
shadowColor: '#97e2f5'
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
id: 'centerRate2',
|
|
tips: 99,
|
|
colorData: {
|
|
textStyle: '#67e0e3',
|
|
series: {
|
|
color: ['#faf3a378', 'transparent'],
|
|
dataColor: {
|
|
normal: '#ff9800',
|
|
shadowColor: '#fcebad'
|
|
}
|
|
}
|
|
}
|
|
}
|
|
],
|
|
config: {
|
|
data: []
|
|
},
|
|
//人员到岗
|
|
userConfig: {
|
|
header: ['姓名', '到岗情况'],
|
|
data: [
|
|
['冯宝宝', "<span class='colorGrass'>已到岗</span>"]
|
|
],
|
|
rowNum: 7, //表格行数
|
|
headerHeight: 35,
|
|
headerBGC: '#0f1325', //表头
|
|
oddRowBGC: '#0f1325', //奇数行
|
|
evenRowBGC: '#171c33', //偶数行
|
|
index: false,
|
|
columnWidth: [70],
|
|
align: ['center']
|
|
},
|
|
//车间一
|
|
numberData: [
|
|
{
|
|
number: {
|
|
number: [0],
|
|
toFixed: 0,
|
|
textAlign: 'left',
|
|
content: '{nt}',
|
|
style: {
|
|
fontSize: 24
|
|
}
|
|
},
|
|
text: '今日产量'
|
|
},
|
|
{
|
|
number: {
|
|
number: [0],
|
|
toFixed: 0,
|
|
textAlign: 'left',
|
|
content: '{nt}',
|
|
style: {
|
|
fontSize: 24
|
|
}
|
|
},
|
|
text: '年累计完成量'
|
|
},
|
|
{
|
|
number: {
|
|
number: [0],
|
|
toFixed: 0,
|
|
textAlign: 'left',
|
|
content: '{nt}',
|
|
style: {
|
|
fontSize: 24
|
|
}
|
|
},
|
|
text: '在制品数量'
|
|
},
|
|
{
|
|
number: {
|
|
number: [0],
|
|
toFixed: 0,
|
|
textAlign: 'left',
|
|
content: '{nt}',
|
|
style: {
|
|
fontSize: 24
|
|
}
|
|
},
|
|
text: '不合格数量'
|
|
},
|
|
|
|
],
|
|
limitedOne: false,
|
|
//车间二
|
|
numberDataTwo: [
|
|
{
|
|
number: {
|
|
number: [0],
|
|
toFixed: 0,
|
|
textAlign: 'left',
|
|
content: '{nt}',
|
|
style: {
|
|
fontSize: 24
|
|
}
|
|
},
|
|
text: '今日产量'
|
|
},
|
|
{
|
|
number: {
|
|
number: [0],
|
|
toFixed: 0,
|
|
textAlign: 'left',
|
|
content: '{nt}',
|
|
style: {
|
|
fontSize: 24
|
|
}
|
|
},
|
|
text: '年累计完成量'
|
|
},
|
|
{
|
|
number: {
|
|
number: [0],
|
|
toFixed: 0,
|
|
textAlign: 'left',
|
|
content: '{nt}',
|
|
style: {
|
|
fontSize: 24
|
|
}
|
|
},
|
|
text: '在制品数量'
|
|
},
|
|
{
|
|
number: {
|
|
number: [0],
|
|
toFixed: 0,
|
|
textAlign: 'left',
|
|
content: '{nt}',
|
|
style: {
|
|
fontSize: 24
|
|
}
|
|
},
|
|
text: '不合格数量'
|
|
},
|
|
|
|
],
|
|
limitedTwo: false,
|
|
configArticle: {
|
|
header: ['标题', '置顶', '作者', '发布时间'],
|
|
data: [
|
|
['郑成功', '2022-03-05'],
|
|
['冯宝宝', '2022-03-05']
|
|
],
|
|
rowNum: 15, //表格行数
|
|
headerHeight: 40,
|
|
headerBGC: '#0f1325', //表头
|
|
oddRowBGC: '#0f1325', //奇数行
|
|
evenRowBGC: '#171c33', //偶数行
|
|
index: false,
|
|
// columnWidth: [50],
|
|
align: ['center']
|
|
},
|
|
weekday: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
|
|
category:[],
|
|
planData:[],
|
|
realData:[],
|
|
}
|
|
},
|
|
components: {
|
|
centerLeft1,
|
|
centerLeft2,
|
|
centerRight1,
|
|
centerRight2,
|
|
center,
|
|
bottomLeft,
|
|
bottomRight
|
|
},
|
|
created() {
|
|
// window.open('http://49.232.14.174:2222/#/index');
|
|
// this.$router.go(-1)
|
|
},
|
|
mounted() {
|
|
let that = this;
|
|
this.timeFn();
|
|
this.cancelLoading();
|
|
this.getPageData();
|
|
let bigHeight = document.getElementsByClassName('host-body')[0].clientHeight;
|
|
let firstHeight = document.getElementById('firstLine').clientHeight;
|
|
let secondHeight = document.getElementsByClassName('jc-between')[0].clientHeight;
|
|
let domHeight = (bigHeight / 2) - firstHeight - secondHeight - 30;
|
|
document.getElementById('centerWrap').style.height = domHeight + 'px';
|
|
let dat = new Date();
|
|
that.week = dat.getDay();
|
|
that.currentTime = dat.getTime();
|
|
that.currentYear = dat.getFullYear();
|
|
let month = dat.getMonth() + 1;
|
|
that.currentMonth = month > 9 ? month : '0' + month;
|
|
that.currentDay = dat.getDate();
|
|
that.create_time_start = that.currentYear + '-' + that.currentMonth + '-01';
|
|
that.getCenterData();
|
|
that.getCenterRight2Data();
|
|
that.getUserList();
|
|
that.getOneData();//车间一
|
|
that.getTwoData();//车间二
|
|
that.getArticle();
|
|
},
|
|
beforeDestroy() {
|
|
clearInterval(this.timing)
|
|
},
|
|
methods: {
|
|
timeFn() {
|
|
this.timing = setInterval(() => {
|
|
this.dateDay = formatTimeBigScreen(new Date(), 'HH: mm: ss')
|
|
this.dateYear = formatTimeBigScreen(new Date(), 'yyyy-MM-dd')
|
|
this.dateWeek = this.weekday[new Date().getDay()]
|
|
}, 1000)
|
|
},
|
|
cancelLoading() {
|
|
setTimeout(() => {
|
|
this.loading = false
|
|
}, 500)
|
|
},
|
|
getCenterData() {
|
|
let that = this;
|
|
let dat = new Date();
|
|
let Year = dat.getFullYear();
|
|
let month = dat.getMonth() + 1;
|
|
let searchTime = Year + '-' + month + '-01';
|
|
that.numberShow = false;
|
|
let orderTatalCount = 0;
|
|
//合同
|
|
getContractList({
|
|
type: 'big_screen',
|
|
page: 1,
|
|
page_size: 1,
|
|
create_time_start: that.create_time_start
|
|
}).then((response) => {
|
|
if (response.data) {
|
|
that.titleItem[0].number.number[0] = response.data.count;
|
|
//订单
|
|
getOrderList({
|
|
type: 'big_screen',
|
|
page: 1,
|
|
page_size: 1,
|
|
create_time_start: that.create_time_start
|
|
}).then((respons) => {
|
|
if (respons.data) {
|
|
that.titleItem[1].number.number[0] = respons.data.count;
|
|
getProductionplanList({type: 'big_screen', page: 1, page_size: 1, tag: 'working'}).then((respon) => {
|
|
if (respon.data) {
|
|
that.titleItem[2].number.number[0] = respon.data.count;
|
|
productCount({type: 'big_screen', datetime_start: searchTime, tag: 1}).then(respo => {
|
|
if (respo.data) {
|
|
that.titleItem[3].number.number[0] = respo.data.count_selled;
|
|
that.titleItem[4].number.number[0] = respo.data.count_notok;
|
|
let mtestCount = respo.data.count_mtestok + respo.data.count_mtestnotok;
|
|
that.titleItem[5].number.number[0] = Math.floor((respo.data.count_mtestok / mtestCount) * 100);
|
|
that.rate[0].tips = Math.floor((respo.data.count_ok / respo.data.count) * 100);
|
|
//工序生产进度
|
|
getProcessNow({type: 'big_screen'}).then(res => {
|
|
if (res.data) {
|
|
let list = res.data;
|
|
let data = [];
|
|
list.forEach(item => {
|
|
let obj = new Object();
|
|
obj.name = item.process__name;
|
|
let value = Math.floor(item.count / item.count_real * 100);
|
|
obj.value = value > 100 ? 100 : value;
|
|
data.push(obj)
|
|
});
|
|
that.ranking.data = data;
|
|
//任务完成率
|
|
/* planCount({type: 'big_screen'}).then(res=>{
|
|
debugger;
|
|
})*/
|
|
//准时交付率
|
|
getOrderList({type: 'big_screen', page: 1, page_size: 1,}).then((res1) => {//总数
|
|
if (res1.data) {
|
|
orderTatalCount = res1.data.count;
|
|
getOrderList({
|
|
type: 'big_screen',
|
|
page: 1,
|
|
page_size: 1,
|
|
tag: 'out_delivery'
|
|
}).then((res2) => {//逾期
|
|
if (res2.data) {
|
|
let count = res2.data.count;
|
|
that.water.data = [];
|
|
that.water.data.push((100- count/orderTatalCount*100).toFixed(2));
|
|
that.water.data.push((100- count/orderTatalCount*100).toFixed(2));
|
|
that.numberShow = true;
|
|
}
|
|
});
|
|
}
|
|
});
|
|
}
|
|
})
|
|
}
|
|
});
|
|
}
|
|
});
|
|
}
|
|
});
|
|
}
|
|
});
|
|
},
|
|
getCenterRight2Data() {
|
|
let that = this;
|
|
that.processRate = false;
|
|
let dat = new Date();
|
|
let Year = dat.getFullYear();
|
|
let month = dat.getMonth() + 1;
|
|
let day = dat.getDate();
|
|
let searchTime = Year + '-' + month + '-' + day;
|
|
getProcessYield({datetime_start: searchTime, datetime_end: searchTime, type: 'big_screen'}).then((response) => {
|
|
if (response.data) {
|
|
let list = response.data;
|
|
let data = [];
|
|
list.forEach(item => {
|
|
let obj = new Object();
|
|
obj.name = item.name;
|
|
obj.value = Math.floor(item.rate * 100);
|
|
// obj.value = rate.toFixed(2);
|
|
data.push(obj)
|
|
});
|
|
that.config.data = data;
|
|
that.processRate = true;
|
|
}
|
|
});
|
|
},
|
|
//一车间
|
|
getOneData() {
|
|
let that = this;
|
|
that.limitedOne = false;
|
|
let dat = new Date();
|
|
let Year = dat.getFullYear();
|
|
let month = dat.getMonth() + 1;
|
|
let searchTime = Year + '-' + month + '-01';
|
|
let searchYear = Year + '-' + '01-01';
|
|
productCount({type: 'big_screen', datetime_start: searchTime, tag: 2, dept: 1}).then(response => {
|
|
if (response.data) {
|
|
that.numberData[0].number.number[0] = response.data.count;
|
|
that.numberData[2].number.number[0] = response.data.count_doing;
|
|
that.numberData[3].number.number[0] = response.data.count_notok;
|
|
productCount({type: 'big_screen', datetime_start: searchYear, tag: 2, dept: 1}).then(res => {
|
|
if (res.data) {
|
|
that.numberData[1].number.number[0] = res.data.count;
|
|
that.limitedOne = true;
|
|
}
|
|
});
|
|
}
|
|
});
|
|
},
|
|
//二车间
|
|
getTwoData() {
|
|
let that = this;
|
|
that.limitedTwo = false;
|
|
let dat = new Date();
|
|
let Year = dat.getFullYear();
|
|
let month = dat.getMonth() + 1;
|
|
let searchTime = Year + '-' + month + '-01';
|
|
let searchYear = Year + '-' + '01-01';
|
|
productCount({type: 'big_screen', datetime_start: searchTime, tag: 2, dept: 2}).then(response => {
|
|
if (response.data) {
|
|
that.numberDataTwo[0].number.number[0] = response.data.count;
|
|
that.numberDataTwo[2].number.number[0] = response.data.count_doing;
|
|
that.numberDataTwo[3].number.number[0] = response.data.count_notok;
|
|
productCount({type: 'big_screen', datetime_start: searchYear, tag: 2, dept: 2}).then(res => {
|
|
if (res.data) {
|
|
that.numberDataTwo[1].number.number[0] = res.data.count;
|
|
that.limitedTwo = true;
|
|
}
|
|
});
|
|
}
|
|
});
|
|
},
|
|
//人员到岗情况列表
|
|
getUserList() {
|
|
let that = this;
|
|
that.listUser = false;
|
|
getEmployee({page: 0,type:'big_screen',show_atwork:true}).then((response) => {
|
|
if (response.data) {
|
|
let list = response.data;
|
|
let data = [];
|
|
list.forEach(item => {
|
|
let obj = [];
|
|
obj.push(item.name);
|
|
// obj.push(item.dept_.name);
|
|
if (item.is_atwork) {
|
|
obj.push("<span class='colorGrass'>已到岗</span>")
|
|
} else {
|
|
obj.push("<span class='colorRed'>未到岗</span>")
|
|
}
|
|
data.push(obj)
|
|
});
|
|
that.userConfig.data = data;
|
|
that.listUser = true;
|
|
}
|
|
});
|
|
},
|
|
//企业资讯
|
|
getArticle() {
|
|
let that = this;
|
|
that.listNews = false;
|
|
getArticles({type: 'big_screen', page: 0}).then((response) => {
|
|
if (response.data) {
|
|
// this.configArticle = response.data;
|
|
let list = response.data;
|
|
let data = [];
|
|
list.forEach(item => {
|
|
let obj = [];
|
|
obj.push(item.title);
|
|
if (item.is_top === false) {
|
|
obj.push('未置顶');
|
|
} else {
|
|
obj.push('已置顶');
|
|
}
|
|
obj.push(item.author);
|
|
obj.push(item.create_time);
|
|
data.push(obj)
|
|
});
|
|
that.configArticle.data = data;
|
|
that.listNews = true;
|
|
}
|
|
});
|
|
},
|
|
//任务完成进度
|
|
getPageData() {
|
|
let that = this;
|
|
that.limitedPlan = false;
|
|
getPlanGantt({type: 'big_screen'}).then(res => {
|
|
if (res.code === 200) {
|
|
let list = res.data.results;
|
|
list.forEach(item=>{
|
|
that.category.push(item.number);
|
|
that.planData.push(item.count);
|
|
that.realData.push(item.count_ok);
|
|
});
|
|
that.limitedPlan = true;
|
|
} else {
|
|
that.$message.error(res.msg);
|
|
}
|
|
})
|
|
},
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss">
|
|
@import '../../assets/scss/index';
|
|
</style>
|