| | |
| | | :content="'已报工良品数' + child.doneNum + ';工序计划数' + child.planNum" placement="top"> |
| | | <div class="scroll_item_row_item" @click="jump(child.procedureId, child.procedureName)"> |
| | | <div class="scroll_item_row_item_x"></div> |
| | | <span v-if="child.rate < 100">{{ Math.floor(child.rate) }}%</span> |
| | | <span v-if="child.rate < 100">{{ child.rate.toFixed(0) }}%</span> |
| | | <img v-else src="@/assets/img/ic_complete@2x.png" alt="" /> |
| | | <span class="scroll_item_row_item_wz">{{ child.procedureName.substring(0, 3) }}</span> |
| | | <span class="scroll_item_row_item_wz">{{ child.procedureName }}</span> |
| | | </div> |
| | | </el-tooltip> |
| | | </div> |
| | |
| | | <div class="content_left_item1_head"> |
| | | <span>当日员工产量TOP10</span> |
| | | </div> |
| | | <div class="content_left_item1_content" @mouseenter="handleMouseEnter" @mouseleave="handleMouseLeave" ref="scrollContainer"> |
| | | <div class="content_left_item1_content" ref="scrollContainer"> |
| | | <div class="content_left_item1_content_row" v-for="(item, index) in data.production" :key="index"> |
| | | <div class="content_left_item1_content_row_name"> |
| | | <div :class="index > 2 ? 'num bg1' : 'num bg2'">{{ index + 1 }}</div> |
| | |
| | | <span>近7天不良品分布</span> |
| | | </div> |
| | | <div class="content_right_top_nr"> |
| | | |
| | | |
| | | <div class="content_right_top_nr_top" id="lineChrat"></div> |
| | | <div class="content_right_top_nr_bottom"> |
| | | <div class="content_right_top_nr_bottom_yuan" v-if="data.typeDistribution.length > 0"> |
| | |
| | | </div> |
| | | <div id="pieChart"></div> |
| | | </div> |
| | | |
| | | |
| | | </div> |
| | | </div> |
| | | <!-- 设备巡检记录 --> |
| | |
| | | |
| | | <script setup> |
| | | import { dateToSub } from '@/utils' |
| | | import { reactive, ref, onMounted, onUnmounted, computed, watch, toRefs } from 'vue' |
| | | import { getPlanData, getTop, getWorkPlansList, getProcedureProcessList, getRecordLogPage, getDeviceCheckPage, getUnqualified7DayData, getUnqualifiedCateData } from '@/utils/api.js' |
| | | import { reactive, ref, onMounted, nextTick, onUnmounted, computed, watch, toRefs } from 'vue' |
| | | import { getPlanData, getTop, getStockList, getWorkPlansList, getProcedureProcessList, getRecordLogPage, getDeviceCheckPage, getUnqualified7DayData, getUnqualifiedCateData } from '@/utils/api.js' |
| | | import { useCounterStore } from '@/stores/counter.js' |
| | | import * as echarts from 'echarts' |
| | | import { useRouter } from 'vue-router' |
| | |
| | | typeDistribution: [], |
| | | num: 0, |
| | | baseNum: 0, |
| | | firstScroll: false, |
| | | secondScroll: false, |
| | | thirdScroll: false, |
| | | fourthScroll: false, |
| | | fifthScroll: false, |
| | | bottomAuthHeight: 284 |
| | | }) |
| | | |
| | | let { baseNum } = toRefs(data) |
| | | let { baseNum, bottomAuthHeight } = toRefs(data) |
| | | |
| | | let timer = ref(null) |
| | | let timer1 = ref(null) |
| | | let timer2 = ref(null) |
| | | let timer3 = ref(null) |
| | | let timer4 = ref(null) |
| | | let timer5 = ref(null) |
| | | let scrollContainer = ref(null) |
| | | let scrollContainer1 = ref(null) |
| | |
| | | |
| | | watch(() => departId.value, (val) => { |
| | | if (val) { |
| | | clearTimeout(timer.value) |
| | | clearTimeout(timer5.value) |
| | | init() |
| | | timer5.value = setInterval(init, 60000) |
| | | timer.value = setInterval(scrillAction, 100) |
| | | } |
| | | }) |
| | | |
| | | start1() |
| | | |
| | | const init = () => { |
| | | setBottomHeight(); |
| | | // 当日员工产量TOP10 |
| | | getTop(companyId.value, departId.value) |
| | | .then(res => { |
| | | if (res.length > 0) { |
| | | data.baseNum = res[0].doneNum |
| | | data.production = res |
| | | data.fifthScroll = true |
| | | } else { |
| | | data.baseNum = 0 |
| | | } |
| | | data.production = res |
| | | data.fifthScroll = true |
| | | }) |
| | | // 仓库实时余量统计 |
| | | // getStockList(companyId.value, departId.value) |
| | |
| | | getProcedureProcessList(companyId.value, departId.value) |
| | | .then(res => { |
| | | data.processProgress = res |
| | | data.thirdScroll = true |
| | | nextTick(() => { |
| | | start2() |
| | | }) |
| | | }) |
| | | } else { |
| | | // 成品计划进度 |
| | | getWorkPlansList(companyId.value, departId.value) |
| | | .then(res => { |
| | | data.plannedProgress = res |
| | | data.secondScroll = true |
| | | nextTick(() => { |
| | | start1() |
| | | }) |
| | | }) |
| | | } |
| | | } |
| | | }) |
| | | |
| | | |
| | | |
| | | |
| | | // 报工日志 |
| | | getRecordLogPage(companyId.value, departId.value, { |
| | | capacity: 20, |
| | |
| | | page: 1 |
| | | }).then(res => { |
| | | data.log = res.records |
| | | data.fourthScroll = true |
| | | nextTick(() => { |
| | | start3() |
| | | }) |
| | | }) |
| | | // 设备巡检记录 |
| | | getDeviceCheckPage(companyId.value, departId.value, { |
| | |
| | | page: 1 |
| | | }).then(res => { |
| | | data.patrolInspection = res.records |
| | | data.fifthScroll = true |
| | | nextTick(() => { |
| | | start4() |
| | | }) |
| | | }) |
| | | // 近七天不良数 |
| | | getUnqualified7DayData(companyId.value, departId.value, '') |
| | |
| | | enterprise.setNum(res) |
| | | }) |
| | | } |
| | | function setBottomHeight(){ |
| | | const pageHeight = window.innerHeight; |
| | | bottomAuthHeight = pageHeight - 700; |
| | | } |
| | | |
| | | /** |
| | | * 七日折线图 |
| | |
| | | let myChart = echarts.init(dayChartDom); |
| | | let dateList = [] |
| | | let numList = [] |
| | | let num = 0 |
| | | data.dayDistribution.forEach(item => { |
| | | dateList.push(item.date) |
| | | numList.push(item.num) |
| | | num += item.num |
| | | }) |
| | | let option; |
| | | option = { |
| | | title: { |
| | | text: ` 近七日不良品总数:${data.num}`, |
| | | text: `近七日不良品总数:${num}`, |
| | | textStyle: { |
| | | color: '#fff', |
| | | fontSize: 12 |
| | |
| | | }, |
| | | grid: { |
| | | top: 40, |
| | | bottom: 30 |
| | | bottom: 30, |
| | | left: 60, |
| | | right: 10 |
| | | }, |
| | | xAxis: { |
| | | type: 'category', |
| | |
| | | lineStyle: { |
| | | width: 0.5, |
| | | color: ['#fff'] |
| | | } |
| | | }, |
| | | axisLine: { |
| | | show: true, |
| | | onZero: true, |
| | | lineStyle: { |
| | | width: 0.5, |
| | | color: '#fff', |
| | | opacity: .5 |
| | | } |
| | | }, |
| | | axisLabel: { |
| | |
| | | lineStyle: { |
| | | width: 0.5, |
| | | color: ['#fff'] |
| | | } |
| | | }, |
| | | axisLine: { |
| | | show: true, |
| | | onZero: true, |
| | | lineStyle: { |
| | | width: 1, |
| | | color: '#fff', |
| | | opacity: .5 |
| | | } |
| | | }, |
| | | axisLabel: { |
| | |
| | | } |
| | | } |
| | | }, |
| | | // labelLayout: { |
| | | // hideOverlap: true |
| | | // }, |
| | | endLabel: { |
| | | show: true, |
| | | distance: 5, |
| | |
| | | } |
| | | option && myChart.setOption(option); |
| | | } |
| | | |
| | | onUnmounted(() => { |
| | | clearTimeout(timer.value) |
| | | clearTimeout(timer1.value) |
| | | clearTimeout(timer2.value) |
| | | clearTimeout(timer3.value) |
| | | clearTimeout(timer4.value) |
| | | clearTimeout(timer5.value) |
| | | }) |
| | | const clickCate = (index) => { |
| | | clearTimeout(timer1.value) |
| | | clearTimeout(timer2.value) |
| | | cate.value.forEach((item, i) => { |
| | | if (i === index) { |
| | | // 成品计划进度 |
| | |
| | | getWorkPlansList(companyId.value, departId.value) |
| | | .then(res => { |
| | | data.plannedProgress = res |
| | | data.secondScroll = true |
| | | nextTick(() => { |
| | | start1() |
| | | }) |
| | | }) |
| | | } else { |
| | | getProcedureProcessList(companyId.value, departId.value) |
| | | .then(res => { |
| | | data.processProgress = res |
| | | data.thirdScroll = true |
| | | nextTick(() => { |
| | | start2() |
| | | }) |
| | | }) |
| | | } |
| | | item.active = true |
| | |
| | | }) |
| | | } |
| | | function handleMouseEnter() { |
| | | data.firstScroll = false |
| | | clearTimeout(timer.value) |
| | | } |
| | | function handleMouseEnter1() { |
| | | data.secondScroll = false |
| | | clearTimeout(timer1.value) |
| | | } |
| | | function handleMouseEnter2() { |
| | | data.thirdScroll = false |
| | | clearTimeout(timer2.value) |
| | | } |
| | | function handleMouseEnter3() { |
| | | data.fourthScroll = false |
| | | clearTimeout(timer3.value) |
| | | } |
| | | function handleMouseEnter4() { |
| | | data.fifthScroll = false |
| | | clearTimeout(timer4.value) |
| | | } |
| | | function handleMouseLeave() { |
| | | data.firstScroll = true |
| | | start() |
| | | } |
| | | function handleMouseLeave1() { |
| | | data.secondScroll = true |
| | | start1() |
| | | } |
| | | function handleMouseLeave2() { |
| | | data.thirdScroll = true |
| | | start2() |
| | | } |
| | | function handleMouseLeave3() { |
| | | data.fourthScroll = true |
| | | start3() |
| | | } |
| | | function handleMouseLeave4() { |
| | | data.fifthScroll = true |
| | | start4() |
| | | } |
| | | |
| | | // 开启定时器 |
| | | function start() { |
| | | clearTimeout(timer.value) |
| | | // 定时器触发周期 |
| | | let speed = ref(100) |
| | | timer.value = setInterval(ListScroll, speed.value) |
| | | } |
| | | // 开启定时器 |
| | | function start1() { |
| | | clearTimeout(timer1.value) |
| | | // 定时器触发周期 |
| | | let speed1 = ref(100) |
| | | timer1.value = setInterval(ListScroll1, speed1.value) |
| | | } |
| | | // 开启定时器 |
| | | function start2() { |
| | | clearTimeout(timer2.value) |
| | | // 定时器触发周期 |
| | | let speed2 = ref(100) |
| | | timer2.value = setInterval(ListScroll2, speed2.value) |
| | | } |
| | | // 开启定时器 |
| | | function start3() { |
| | | clearTimeout(timer3.value) |
| | | // 定时器触发周期 |
| | | let speed3 = ref(100) |
| | | timer3.value = setInterval(ListScroll3, speed3.value) |
| | | } |
| | | // 开启定时器 |
| | | function start4() { |
| | | clearTimeout(timer4.value) |
| | | // 定时器触发周期 |
| | | let speed4 = ref(100) |
| | | timer4.value = setInterval(ListScroll4, speed4.value) |
| | | } |
| | | function ListScroll() { |
| | | if (!data.firstScroll) return |
| | | // console.log('ListScroll'); |
| | | let scrollDom = scrollContainer.value |
| | | if (!scrollDom) return |
| | | // 判读组件是否渲染完成 |
| | |
| | | let maxLength = scrollDom.clientHeight/34 |
| | | // 如果列表数量过少不进行滚动 |
| | | if (scrollDom.children.length <= maxLength) { |
| | | data.firstScroll = false |
| | | clearTimeout(timer.value) |
| | | return |
| | | } |
| | | // 组件进行滚动 |
| | | scrollDom.scrollTop += 2 |
| | | // console.log(scrollDom.scrollHeight - scrollDom.clientHeight); |
| | | // console.log(scrollDom.scrollTop); |
| | | // 判断是否滚动到底部 |
| | | if (scrollDom.scrollTop >= (scrollDom.scrollHeight - scrollDom.clientHeight - 2)) { |
| | | if (Math.floor(scrollDom.scrollTop) >= (scrollDom.scrollHeight - scrollDom.clientHeight)) { |
| | | // 获取组件第一个节点 |
| | | let first = scrollDom.children[0] |
| | | // 删除节点 |
| | |
| | | } |
| | | } |
| | | function ListScroll1() { |
| | | if (!data.secondScroll) return |
| | | // console.log('ListScroll1'); |
| | | let scrollDom = scrollContainer1.value |
| | | // 判读组件是否渲染完成 |
| | | if (!scrollDom) return |
| | |
| | | scrollDom = scrollContainer1.value |
| | | } else { |
| | | // 如果列表数量过少不进行滚动 |
| | | if (scrollDom.children.length < 7) { |
| | | data.secondScroll = false |
| | | if (scrollDom.children.length <= 6) { |
| | | clearTimeout(timer1.value) |
| | | return |
| | | } |
| | | // console.log(data.plannedProgress); |
| | | // 组件进行滚动 |
| | | scrollDom.scrollTop += 2 |
| | | |
| | | // scrollDom.scrollTo(0, scrollDom.scrollTop + 3) |
| | | // console.log('2-----',scrollDom.scrollTop, scrollDom.scrollHeight, scrollDom.clientHeight ); |
| | | // 判断是否滚动到底部 |
| | | if (scrollDom.scrollTop >= (scrollDom.scrollHeight - scrollDom.clientHeight-0.5)) { |
| | | console.log(scrollDom.scrollTop); |
| | | console.log(scrollDom.scrollHeight, scrollDom.clientHeight); |
| | | if (scrollDom.scrollTop && scrollDom.scrollTop >= (scrollDom.scrollHeight - scrollDom.clientHeight)) { |
| | | // 获取组件第一个节点 |
| | | let first = scrollDom.children[0] |
| | | // 删除节点 |
| | |
| | | } |
| | | } |
| | | function ListScroll2() { |
| | | if (!data.thirdScroll) return |
| | | // console.log('ListScroll2'); |
| | | let scrollDom = scrollContainer2.value |
| | | if (!scrollDom) return |
| | | // 判读组件是否渲染完成 |
| | |
| | | scrollDom = scrollContainer2.value |
| | | } else { |
| | | // 如果列表数量过少不进行滚动 |
| | | if (scrollDom.children.length < 10) { |
| | | data.thirdScroll = false |
| | | if (scrollDom.children.length <= 10) { |
| | | clearTimeout(timer2.value) |
| | | return |
| | | } |
| | | // 组件进行滚动 |
| | | scrollDom.scrollTop += 2 |
| | | scrollDom.scrollTo(0, scrollDom.scrollTop + 1) // += 1 |
| | | // scrollDom.scrollTop(scrollDom.scrollTop + 1) |
| | | // console.log('scrollDom.scrollTop', scrollDom.scrollTop); |
| | | // console.log('scrollDom.scrollHeight - scrollDom.clientHeight', scrollDom.scrollHeight - scrollDom.clientHeight); |
| | | // 判断是否滚动到底部 |
| | | if (scrollDom.scrollTop >= (scrollDom.scrollHeight - scrollDom.clientHeight - 2)) { |
| | | if (scrollDom.scrollTop &&scrollDom.scrollTop >= (scrollDom.scrollHeight - scrollDom.clientHeight)) { |
| | | // 获取组件第一个节点 |
| | | let first = scrollDom.children[0] |
| | | // 删除节点 |
| | |
| | | } |
| | | } |
| | | function ListScroll3() { |
| | | |
| | | if (!data.fourthScroll) return |
| | | // console.log('ListScroll3'); |
| | | let scrollDom = scrollContainer3.value |
| | | if (!scrollDom) return |
| | | // 判读组件是否渲染完成 |
| | |
| | | // alert(scrollDom.children.length +"---------------"+num) |
| | | // 如果列表数量过少不进行滚动 |
| | | if (scrollDom.children.length <= num) { |
| | | data.fourthScroll = false |
| | | clearTimeout(timer3.value) |
| | | return |
| | | } |
| | | // 组件进行滚动 |
| | | scrollDom.scrollTop = scrollDom.scrollTop+2 |
| | | // 判断是否滚动到底部 |
| | | if (scrollDom.scrollTop >= (scrollDom.scrollHeight - scrollDom.clientHeight -2)) { |
| | | if (scrollDom.scrollTop && scrollDom.scrollTop >= (scrollDom.scrollHeight - scrollDom.clientHeight)) { |
| | | // 获取组件第一个节点 |
| | | let first = scrollDom.children[0] |
| | | // 删除节点 |
| | |
| | | } |
| | | } |
| | | function ListScroll4() { |
| | | if (!data.fifthScroll) return |
| | | // console.log('ListScroll4'); |
| | | let scrollDom = scrollContainer4.value |
| | | if (!scrollDom) return |
| | | // 判读组件是否渲染完成 |
| | | if (scrollDom.offsetHeight == 0) { |
| | | if (scrollDom.scrollTop && scrollDom.offsetHeight == 0) { |
| | | scrollDom = scrollContainer4.value |
| | | } else { |
| | | // console.log(bottom1.value.height); |
| | | let num = scrollContainer4.value.offsetHeight / 35; |
| | | // alert(scrollDom.children.length +"---------------"+num) |
| | | // 如果列表数量过少不进行滚动 |
| | | // console.log(scrollDom.offsetHeight); |
| | | let num = scrollDom.offsetHeight / 35; |
| | | num = num + (scrollDom.offsetHeight % 35 > 0 ? 1 : 0) |
| | | if (scrollDom.children.length <= num) { |
| | | data.fifthScroll = false |
| | | clearTimeout(timer4.value) |
| | | return |
| | | } |
| | | // 组件进行滚动 |
| | | scrollDom.scrollTop += 2 |
| | | scrollDom.scrollTop += 1 |
| | | |
| | | // 判断是否滚动到底部 |
| | | if (scrollDom.scrollTop >= (scrollDom.scrollHeight - scrollDom.clientHeight - 2)) { |
| | | if (scrollDom.scrollTop && scrollDom.scrollTop >= (scrollDom.scrollHeight - scrollDom.clientHeight)) { |
| | | // if (scrollDom.scrollTop >= 35) { |
| | | |
| | | // 获取组件第一个节点 |
| | | let first = scrollDom.children[0] |
| | | // 删除节点 |
| | |
| | | } |
| | | } |
| | | } |
| | | function scrillAction() { |
| | | ListScroll() |
| | | ListScroll1() |
| | | ListScroll2() |
| | | ListScroll3() |
| | | ListScroll4() |
| | | } |
| | | |
| | | // onUnmounted(() => { |
| | | |
| | | // }) |
| | | |
| | | onMounted(() => { |
| | | if (departId.value) { |
| | | console.log('onMounted'); |
| | | init() |
| | | timer5.value = setInterval(init, 60000) |
| | | timer.value = setInterval(scrillAction, 100) |
| | | // timer.value = setInterval(scrillAction, 100) |
| | | } |
| | | window.addEventListener('resize', () => { |
| | | setTypeChart() |
| | |
| | | }) |
| | | |
| | | onUnmounted(() => { |
| | | console.log('停止滴答'); |
| | | clearTimeout(timer.value) |
| | | clearTimeout(timer5.value) |
| | | |
| | |
| | | |
| | | $fixed-height: 690px; |
| | | .content1 { |
| | | |
| | | flex: 1; |
| | | width: 100%; |
| | | height: auto; |
| | |
| | | |
| | | &:nth-child(5) { |
| | | flex: 3; |
| | | } |
| | | &:nth-child(4) { |
| | | flex: 0.7; |
| | | } |
| | | &:nth-child(6) { |
| | | flex: 0.7; |
| | | |
| | | } |
| | | } |
| | | } |
| | |
| | | justify-content: center; |
| | | color: #FFFFFF; |
| | | font-size: 13px; |
| | | &:nth-child(4) { |
| | | flex: 0.7; |
| | | } |
| | | |
| | | &:nth-child(5) { |
| | | flex: 3; |
| | | justify-content: start; |
| | | } |
| | | &:nth-child(6) { |
| | | flex: 0.7; |
| | | } |
| | | .scroll_item_row_item { |
| | | margin-top: -11px; |
| | |
| | | font-weight: 500; |
| | | color: #01D9FE; |
| | | |
| | | &:nth-child(5) { |
| | | flex: 0.5; |
| | | &:nth-child(4) { |
| | | flex: 2; |
| | | } |
| | | &:nth-child(6) { |
| | | flex: 0.5; |
| | | } |
| | | &:nth-child(7) { |
| | | flex: 0.7; |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | justify-content: center; |
| | | color: #FFFFFF; |
| | | |
| | | &:nth-child(5) { |
| | | flex: 0.5; |
| | | &:nth-child(4) { |
| | | flex: 2; |
| | | } |
| | | &:nth-child(6) { |
| | | flex: 0.5; |
| | | } |
| | | &:nth-child(7) { |
| | | flex: 0.7; |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |
| | |
| | | font-weight: 500; |
| | | color: #01D9FE; |
| | | |
| | | // &:first-child { |
| | | // flex: 2; |
| | | // } |
| | | &:nth-child(3) { |
| | | flex: 0.7; |
| | | &:first-child { |
| | | flex: 2; |
| | | } |
| | | } |
| | | } |
| | |
| | | align-items: center; |
| | | justify-content: center; |
| | | color: #FFFFFF; |
| | | &:nth-child(3) { |
| | | flex: 0.7; |
| | | |
| | | &:first-child { |
| | | flex: 2; |
| | | } |
| | | // &:first-child { |
| | | // flex: 2; |
| | | // } |
| | | } |
| | | } |
| | | } |