You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
608 lines
17 KiB
Vue
608 lines
17 KiB
Vue
<template>
|
|
<div class="app-container">
|
|
<div class="headTitle">京源生产监控平台</div>
|
|
<div v-for="(i,k) in title"
|
|
:style="'top:'+(titlePosition[k]&&titlePosition[k].top||0)+'%;left:'+(titlePosition[k]&&titlePosition[k].left||0)+'%'"
|
|
class="title"
|
|
>
|
|
{{ i }}
|
|
</div>
|
|
<div class="table1">
|
|
<div style="background-color: #1077bc19;height: 50px;line-height: 50px;">
|
|
<div class="scrollTableItem" style="padding:0;color:#65c2f3;font-weight: bold;width: 10%">
|
|
编号
|
|
</div>
|
|
<div class="scrollTableItem" style="padding:0;color:#65c2f3;font-weight: bold;width: 20%">
|
|
生产任务
|
|
</div>
|
|
<div class="scrollTableItem" style="padding:0;color:#65c2f3;font-weight: bold;width: 22%">
|
|
成品名称
|
|
</div>
|
|
<div class="scrollTableItem" style="padding:0;color:#65c2f3;font-weight: bold;width: 12%">
|
|
计划数量
|
|
</div>
|
|
<div class="scrollTableItem" style="padding:0;color:#65c2f3;font-weight: bold;width: 12%">
|
|
实际数量
|
|
</div>
|
|
<div class="scrollTableItem" style="padding:0;color:#65c2f3;font-weight: bold;width: 12%">
|
|
差异值
|
|
</div>
|
|
<div class="scrollTableItem" style="padding:0;color:#65c2f3;font-weight: bold;width: 12%">
|
|
完成率
|
|
</div>
|
|
</div>
|
|
<vue-seamless-scroll
|
|
:class-option="scrollTableOption"
|
|
:data="scrollTableData"
|
|
class="case-item"
|
|
style="height: calc(100% - 50px);overflow: hidden;"
|
|
>
|
|
<div
|
|
v-for="(item, index) in scrollTableData"
|
|
:key="index"
|
|
>
|
|
<div :style='"background-color:" + ((index % 2 === 0)? "#1077bc19":"#1077bc05") '>
|
|
<div
|
|
class="scrollTableItem" style="width: 10%"
|
|
>
|
|
{{ item.no }}
|
|
</div>
|
|
<div
|
|
class="scrollTableItem" style="width: 20%"
|
|
>
|
|
{{ item.orderCode }}
|
|
</div>
|
|
<div
|
|
class="scrollTableItem" style="width: 22%"
|
|
>
|
|
{{ item.materialName }}
|
|
</div>
|
|
<div
|
|
class="scrollTableItem" style="width: 12%"
|
|
>
|
|
{{ item.planAmount }}
|
|
</div>
|
|
<div
|
|
class="scrollTableItem" style="width: 12%"
|
|
>
|
|
{{ item.completeAmount }}
|
|
</div>
|
|
<div
|
|
class="scrollTableItem" style="width: 12%"
|
|
>
|
|
{{ item.quantityAmount }}
|
|
</div>
|
|
<div
|
|
class="scrollTableItem" style="width: 12%"
|
|
>
|
|
{{ item.finishingRate }}%
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</vue-seamless-scroll>
|
|
</div>
|
|
<div class="table2">
|
|
<div style="background-color: #1077bc19;height: 50px;line-height: 50px;">
|
|
<div class="scrollTableItem" style="padding:0;color:#65c2f3;font-weight: bold;width: 12%">
|
|
编号
|
|
</div>
|
|
<div class="scrollTableItem" style="padding:0;color:#65c2f3;font-weight: bold;width: 25%">
|
|
订单号
|
|
</div>
|
|
<div class="scrollTableItem" style="padding:0;color:#65c2f3;font-weight: bold;width: 15%">
|
|
工序名称
|
|
</div>
|
|
<div class="scrollTableItem" style="padding:0;color:#65c2f3;font-weight: bold;width: 18%">
|
|
开始时间
|
|
</div>
|
|
<div class="scrollTableItem" style="padding:0;color:#65c2f3;font-weight: bold;width: 18%">
|
|
结束时间
|
|
</div>
|
|
<div class="scrollTableItem" style="padding:0;color:#65c2f3;font-weight: bold;width: 12%">
|
|
生产用时
|
|
</div>
|
|
</div>
|
|
<vue-seamless-scroll
|
|
:class-option="scrollTableOption"
|
|
:data="scrollTableData1"
|
|
class="case-item"
|
|
style="height: calc(100% - 50px);overflow: hidden;"
|
|
>
|
|
<div
|
|
v-for="(item, index) in scrollTableData1"
|
|
:key="index"
|
|
>
|
|
<div :style='"background-color:" + ((index % 2 === 0)? "#1077bc19":"#1077bc05") '>
|
|
<div
|
|
class="scrollTableItem" style="width: 12%"
|
|
>
|
|
{{ item.processId }}
|
|
</div>
|
|
<div
|
|
class="scrollTableItem" style="width: 25%"
|
|
>
|
|
{{ item.planCode }}
|
|
</div>
|
|
<div
|
|
class="scrollTableItem" style="width: 15%"
|
|
>
|
|
{{ item.processName }}
|
|
</div>
|
|
<div
|
|
class="scrollTableItem" style="width: 18%"
|
|
>
|
|
{{
|
|
parseTime(item.realBeginTime,'{m}-{d} {h}:{i}:{s}')
|
|
}}
|
|
</div>
|
|
<div
|
|
class="scrollTableItem" style="width: 18%"
|
|
>
|
|
{{
|
|
parseTime(item.realEndTime,'{m}-{d} {h}:{i}:{s}')
|
|
}}
|
|
</div>
|
|
<div
|
|
class="scrollTableItem" style="width: 12%"
|
|
>
|
|
{{ (Math.abs(new Date(item.realEndTime) - new Date(item.realBeginTime))/(1000*60*60)).toFixed(2) }}时
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</vue-seamless-scroll>
|
|
</div>
|
|
<div class="chart1">
|
|
<Chart key="chart1" ref="chart1"></Chart>
|
|
</div>
|
|
<div class="chart2">
|
|
<Chart key="chart2" ref="chart2"></Chart>
|
|
</div>
|
|
<div class="num1 num1_1" style="top: 11.9%;left: 11.1%;color:#5fc2f2">{{ topData.planAmount[0] }}</div>
|
|
<div class="num1 num1_2" style="top: 11.9%;left:14.6%;color:#5fc2f2">{{ topData.planAmount[1] }}</div>
|
|
<div class="num1 num1_3" style="top: 11.9%;left:18.1%;color:#5fc2f2">{{ topData.planAmount[2] }}</div>
|
|
<div class="num1 num1_4" style="top: 11.9%;left:21.8%;color:#5fc2f2">{{ topData.planAmount[3] }}</div>
|
|
<div class="num1 num1_5" style="top: 11.9%;left:35.6%;color:#59ee7b">{{ topData.completeAmount[0] }}</div>
|
|
<div class="num1 num1_6" style="top: 11.9%;left:39.2%;color:#59ee7b">{{ topData.completeAmount[1] }}</div>
|
|
<div class="num1 num1_7" style="top: 11.9%;left:42.8%;color:#59ee7b">{{ topData.completeAmount[2] }}</div>
|
|
<div class="num1 num1_8" style="top: 11.9%;left:46.4%;color:#59ee7b">{{ topData.completeAmount[3] }}</div>
|
|
<div class="num1 num1_9" style="top: 11.9%;left:60.3%;color:#f60008">{{ topData.diff[0] }}</div>
|
|
<div class="num1 num1_10" style="top: 11.9%;left:63.9%;color:#f60008">{{ topData.diff[1] }}</div>
|
|
<div class="num1 num1_11" style="top: 11.9%;left:67.4%;color:#f60008">{{ topData.diff[2] }}</div>
|
|
<div class="num1 num1_12" style="top: 11.9%;left:71%;color:#f60008">{{ topData.diff[3] }}</div>
|
|
<div class="num1 num1_13" style="top: 11.9%;left:84.8%;color:#f60008">{{ topData.rate[0] }}</div>
|
|
<div class="num1 num1_14" style="top: 11.9%;left:88.4%;color:#f60008">{{ topData.rate[1] }}</div>
|
|
<div class="num1 num1_15" style="top: 11.9%;left:92%;color:#f60008">{{ topData.rate[2] }}</div>
|
|
<div class="num1 num1_16" style="top: 11.9%;left:95.6%;color:#f60008">%</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import vueSeamlessScroll from 'vue-seamless-scroll'
|
|
import Chart from '@/components/board/Chart'
|
|
import * as echarts from 'echarts'
|
|
import {
|
|
orderEfficiency,
|
|
orderTime,
|
|
productionQualified,
|
|
productProgress,
|
|
workOrderProgress
|
|
} from '@/api/board/fifthFloorProduction'
|
|
|
|
const vw = (document.documentElement.clientWidth || document.body.clientWidth) / 100
|
|
export default {
|
|
name: 'Board1',
|
|
components: {
|
|
vueSeamlessScroll,
|
|
Chart
|
|
},
|
|
data() {
|
|
return {
|
|
topData: {
|
|
planAmount: [0, 0, 0, 0],
|
|
completeAmount: [0, 0, 0, 0],
|
|
diff: [0, 0, 0, 0],
|
|
rate: [0, 0, 0]
|
|
},
|
|
title: [
|
|
'生产任务信息',
|
|
'工位生产效率TOP',
|
|
' ',
|
|
'计划数量:',
|
|
'完成数量:',
|
|
'差异值:',
|
|
'完成进度:'
|
|
],
|
|
titlePosition: [
|
|
{
|
|
top: 41.6,
|
|
left: 5.5
|
|
},
|
|
{
|
|
top: 41.6,
|
|
left: 69
|
|
},
|
|
{
|
|
top: 70.5,
|
|
left: 69
|
|
},
|
|
{
|
|
top: 11.9,
|
|
left: 4
|
|
},
|
|
{
|
|
top: 11.9,
|
|
left: 29
|
|
},
|
|
{
|
|
top: 11.9,
|
|
left: 54
|
|
},
|
|
{
|
|
top: 11.9,
|
|
left: 78
|
|
}
|
|
],
|
|
scrollTableOption: {
|
|
step: 0.5, // 数值越大速度滚动越快
|
|
limitMoveNum: 22, // 开始无缝滚动的数据量 this.dataList.length
|
|
hoverStop: true, // 是否开启鼠标悬停stop
|
|
direction: 1, // 0向下 1向上 2向左 3向右
|
|
openWatch: true, // 开启数据实时监控刷新dom
|
|
singleHeight: 0, // 单步运动停止的高度(默认值0是无缝不停止的滚动) direction => 0/1
|
|
singleWidth: 0, // 单步运动停止的宽度(默认值0是无缝不停止的滚动) direction => 2/3
|
|
waitTime: 0
|
|
},
|
|
scrollTableData: [],
|
|
scrollTableData1: []
|
|
}
|
|
},
|
|
mounted() {
|
|
this.getData()
|
|
|
|
window.onresize = () => {
|
|
this.$refs.chart1.chart.resize()
|
|
this.$refs.chart2.chart.resize()
|
|
}
|
|
},
|
|
methods: {
|
|
getData() {
|
|
workOrderProgress().then(e => {
|
|
this.scrollTableData = e.data.map((v, k) => {
|
|
return {
|
|
no: k + 1,
|
|
orderCode: v.orderCode,
|
|
planAmount: v.planAmount,
|
|
completeAmount: v.completeAmount,
|
|
materialName:v.materialName,
|
|
quantityAmount: parseFloat(v.planAmount) - parseFloat(v.completeAmount),
|
|
finishingRate: parseFloat(v.completeAmount) === 0 ? 0 : (parseFloat(v.completeAmount) / parseFloat(v.completeAmount)) * 100
|
|
}
|
|
})
|
|
})
|
|
productProgress().then(e => {
|
|
this.topData.planAmount = [...[0, 0, 0, 0], ...(e.data.planAmount || 0).toString().split('')].slice(-4)
|
|
this.topData.completeAmount = [...[0, 0, 0, 0], ...(e.data.completeAmount || 0).toString().split('')].slice(-4)
|
|
this.topData.diff = [...[0, 0, 0, 0], ...Math.abs((parseFloat(e.data.planAmount) - parseFloat(e.data.completeAmount)) || 0).toString().split('')].slice(-4)
|
|
this.topData.rate = parseFloat(e.data.planAmount) === 0 ? [0, 0, 0] : [...[0, 0, 0], ...(((parseFloat(e.data.completeAmount) / parseFloat(e.data.planAmount)) || 0)*100).toFixed(0).split('')].slice(-3)
|
|
})
|
|
productionQualified().then(e => {
|
|
// console.log(e)
|
|
this.$refs.chart1.setData({
|
|
color: ['#3398DB'],
|
|
title: {
|
|
text: '组员生产合格率',
|
|
textStyle: {
|
|
color: '#fff'
|
|
}
|
|
},
|
|
tooltip: {
|
|
trigger: 'axis',
|
|
axisPointer: {
|
|
type: 'shadow'
|
|
},
|
|
formatter: '{b} <br> 合格率: {c}%'
|
|
},
|
|
/*legend: {
|
|
data: [date]
|
|
},*/
|
|
grid: {
|
|
top: '30',
|
|
left: '4%',
|
|
right: '4%',
|
|
bottom: '2%',
|
|
containLabel: true
|
|
},
|
|
xAxis: {
|
|
type: 'value',
|
|
boundaryGap: [0, 0.01],
|
|
min: 0,
|
|
max: 100,
|
|
interval: 20,
|
|
axisLabel: {
|
|
formatter: '{value}%',
|
|
textStyle: {
|
|
color: '#fff',
|
|
fontWeight: '80'
|
|
}
|
|
}
|
|
},
|
|
yAxis: {
|
|
type: 'category',
|
|
data: e.data.map(v => v.name),
|
|
axisLabel: {
|
|
show: true,
|
|
interval: 0,
|
|
rotate: 0,
|
|
margin: 10,
|
|
inside: false,
|
|
textStyle: {
|
|
color: '#fff',
|
|
fontWeight: '50'
|
|
}
|
|
}
|
|
},
|
|
series: [
|
|
{
|
|
type: 'bar',
|
|
label: {
|
|
normal: {
|
|
show: true,
|
|
// formatter: '{c}',
|
|
formatter: function(v) {
|
|
var val = v.data
|
|
if (val === 0) {
|
|
return ''
|
|
}
|
|
return val
|
|
},
|
|
color: '#fff'
|
|
}
|
|
},
|
|
data: e.data.map(v => parseFloat(v.passRate))
|
|
}
|
|
]
|
|
})
|
|
})
|
|
orderTime().then(e => {
|
|
|
|
// this.$refs.chart2.setData({
|
|
// tooltip: {
|
|
// trigger: 'axis',
|
|
// axisPointer: {
|
|
// type: 'shadow'
|
|
// }
|
|
// },
|
|
// grid: {
|
|
// top: '5%',
|
|
// left: '3%',
|
|
// right: '4%',
|
|
// bottom: '3%',
|
|
// containLabel: true
|
|
// },
|
|
// yAxis: [
|
|
// {
|
|
// type: 'value',
|
|
// name: '次数',
|
|
// position: 'left'
|
|
// },
|
|
// {
|
|
// show: false
|
|
// }
|
|
// ],
|
|
// xAxis: {
|
|
// type: 'category',
|
|
// data: [
|
|
// '员工1',
|
|
// '员工2',
|
|
// '员工3',
|
|
// '员工4',
|
|
// '员工5',
|
|
// '员工6',
|
|
// '员工7',
|
|
// '员工8',
|
|
// '员工9',
|
|
// '员工10',
|
|
// '员工11',
|
|
// '员工12'
|
|
// ]
|
|
// },
|
|
// series: [
|
|
// {
|
|
// name: '流程1',
|
|
// type: 'bar',
|
|
// stack: '次数',
|
|
// label: {
|
|
// normal: {
|
|
// show: true
|
|
// }
|
|
// },
|
|
// itemStyle: {
|
|
// normal: {
|
|
// color: 'rgb(249,18,243)'
|
|
// }
|
|
// },
|
|
// data: [197, 134, 138, 167, 160, 174, 164, 0, 0, 0, 0, 0]
|
|
// },
|
|
// {
|
|
// name: '流程2',
|
|
// type: 'bar',
|
|
// stack: '次数',
|
|
// label: {
|
|
// normal: {
|
|
// show: true
|
|
// }
|
|
// },
|
|
// itemStyle: {
|
|
// normal: {
|
|
// color: 'rgb(249,205,30)'
|
|
// }
|
|
// },
|
|
// data: [325, 191, 315, 400, 407, 448, 417, 0, 0, 0, 0, 0]
|
|
// },
|
|
// {
|
|
// name: '流程3',
|
|
// type: 'bar',
|
|
// stack: '次数',
|
|
// label: {
|
|
// normal: {
|
|
// show: true
|
|
// }
|
|
// },
|
|
// itemStyle: {
|
|
// normal: {
|
|
// color: 'rgb(0, 137, 239)'
|
|
// }
|
|
// },
|
|
// data: [138, 111, 156, 139, 116, 151, 154, 0, 0, 0, 0, 0]
|
|
// }
|
|
// ]
|
|
// })
|
|
this.$refs.chart2.setData({
|
|
tooltip: {
|
|
trigger: 'axis',
|
|
axisPointer: {
|
|
type: 'shadow'
|
|
}
|
|
},
|
|
grid: {
|
|
top: '15%',
|
|
left: '3%',
|
|
right: '4%',
|
|
bottom: '3%',
|
|
containLabel: true
|
|
},
|
|
yAxis: [
|
|
{
|
|
type: 'value',
|
|
name: '时长(分钟)',
|
|
position: 'left'
|
|
},
|
|
{
|
|
show: false
|
|
}
|
|
],
|
|
xAxis: {
|
|
type: 'category',
|
|
data: e.data.map(v => v.processName)
|
|
},
|
|
series: [
|
|
{
|
|
name: '时长(分钟)',
|
|
type: 'bar',
|
|
barMaxWidth: '100px',
|
|
stack: '次数',
|
|
label: {
|
|
normal: {
|
|
show: true
|
|
}
|
|
},
|
|
itemStyle: {
|
|
normal: {
|
|
color: 'rgb(249,18,243)'
|
|
}
|
|
},
|
|
data: e.data.map(v => (parseFloat(v.produceTime) / 60).toFixed(2))
|
|
}
|
|
]
|
|
})
|
|
})
|
|
orderEfficiency().then(e => {
|
|
console.log(e)
|
|
this.scrollTableData1 = e.data
|
|
})
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
<style lang="less" scoped>
|
|
|
|
.app-container {
|
|
background-image: url("../../../assets/board/productionBg3.jpg");
|
|
background-repeat: no-repeat;
|
|
background-size: 100% 100%;
|
|
width: 100%;
|
|
height: 100%;
|
|
position: absolute;
|
|
top: 0;
|
|
left: 0;
|
|
}
|
|
|
|
.headTitle {
|
|
position: absolute;
|
|
top: 5%;
|
|
left: 50%;
|
|
transform: translate(-50%, -100%);
|
|
font-size: 1.5vw;
|
|
color: #d6eaed;
|
|
letter-spacing: 10px;
|
|
}
|
|
|
|
.title {
|
|
position: absolute;
|
|
transform: translateY(-50%);
|
|
color: #dddddd;
|
|
font-size: 1vw;
|
|
letter-spacing: 2px;
|
|
}
|
|
|
|
.num1 {
|
|
position: absolute;
|
|
font-size: 1.5vw;
|
|
transform: translate(-50%, -50%);
|
|
}
|
|
|
|
.table1 {
|
|
position: absolute;
|
|
top: 44.5%;
|
|
left: 3.3%;
|
|
width: 62.5%;
|
|
height: 48.5%;
|
|
color: #fff;
|
|
}
|
|
|
|
.table2 {
|
|
position: absolute;
|
|
top: 44.5%;
|
|
left: 67.3%;
|
|
width: 29.5%;
|
|
height: 50.5%;
|
|
font-size: 0.7vw;
|
|
color: #fff;
|
|
}
|
|
|
|
.table3 {
|
|
position: absolute;
|
|
top: 73.5%;
|
|
left: 67.3%;
|
|
width: 29.5%;
|
|
height: 19.5%;
|
|
color: #fff;
|
|
}
|
|
|
|
.scrollTableItem {
|
|
display: inline-block;
|
|
width: calc(100% / 6);
|
|
text-align: center;
|
|
padding: 14px 0;
|
|
color: #4e99c5
|
|
}
|
|
|
|
.chart1 {
|
|
position: absolute;
|
|
top: 16%;
|
|
left: 3.4%;
|
|
width: 46%;
|
|
height: 21.5%;
|
|
}
|
|
|
|
.chart2 {
|
|
position: absolute;
|
|
top: 16.2%;
|
|
left: 50.7%;
|
|
width: 45.9%;
|
|
height: 21%;
|
|
}
|
|
|
|
|
|
</style>
|