From d5d7e33e403a4ffe49f5dd1d073fcdf21bc0bb88 Mon Sep 17 00:00:00 2001 From: Mr.Shi <1878285526@qq.com> Date: 星期二, 22 八月 2023 14:28:02 +0800 Subject: [PATCH] 大屏 --- screen_standard/src/views/index.vue | 413 +++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 343 insertions(+), 70 deletions(-) diff --git a/screen_standard/src/views/index.vue b/screen_standard/src/views/index.vue index 33718ac..0dc7ccb 100644 --- a/screen_standard/src/views/index.vue +++ b/screen_standard/src/views/index.vue @@ -36,11 +36,11 @@ </div> <div @mouseenter="handleMouseEnter" @mouseleave="handleMouseLeave" class="main_container"> <div ref="scrollContainer" class="scroll_container"> - <div v-for="(item, index) in 10" :key="item.id" :class="index % 2 == 0 ? 'scroll_item scroll_item_bg1' : 'scroll_item scroll_item_bg2'"> - <div class="scroll_item_row">鐢靛悏浠� / 鏈ㄥ伐</div> - <div class="scroll_item_row">鎴愬搧搴�</div> - <div class="scroll_item_row">C323</div> - <div class="scroll_item_row">3000鎶�</div> + <div v-for="(item, index) in data.marginStatistics" :key="index" :class="index % 2 == 0 ? 'scroll_item scroll_item_bg1' : 'scroll_item scroll_item_bg2'"> + <div class="scroll_item_row">{{ item.materialName }} / {{ item.procedureName }}</div> + <div class="scroll_item_row">{{ item.warehouseName }}</div> + <div class="scroll_item_row">{{ item.location }}</div> + <div class="scroll_item_row">{{ item.num }}{{ item.unitName }}</div> </div> </div> </div> @@ -66,7 +66,7 @@ </div> <div @mouseenter="handleMouseEnter1" @mouseleave="handleMouseLeave1" class="main_container"> <div ref="scrollContainer1" class="scroll_container"> - <div v-for="(item, index) in 10" :key="item.id" :class="index % 2 == 0 ? 'scroll_item scroll_item_bg1' : 'scroll_item scroll_item_bg2'"> + <div v-for="(item, index) in data.plannedProgress" :key="index" :class="index % 2 == 0 ? 'scroll_item scroll_item_bg1' : 'scroll_item scroll_item_bg2'"> <div class="scroll_item_row">323444112</div> <div class="scroll_item_row">鐢靛悏浠�</div> <div class="scroll_item_row">CP003</div> @@ -101,14 +101,14 @@ </div> <div @mouseenter="handleMouseEnter2" @mouseleave="handleMouseLeave2" class="main_container"> <div ref="scrollContainer2" class="scroll_container"> - <div v-for="(item, index) in 15" :key="item.id" :class="index % 2 == 0 ? 'scroll_item scroll_item_bg1' : 'scroll_item scroll_item_bg2'"> - <div class="scroll_item_row">鏈ㄥ伐</div> - <div class="scroll_item_row">3</div> - <div class="scroll_item_row">1000</div> - <div class="scroll_item_row">959</div> - <div class="scroll_item_row">30</div> - <div class="scroll_item_row">11</div> - <div class="scroll_item_row">3.12%</div> + <div v-for="(item, index) in data.processProgress" :key="index" :class="index % 2 == 0 ? 'scroll_item scroll_item_bg1' : 'scroll_item scroll_item_bg2'"> + <div class="scroll_item_row">{{ item.procedureName }}</div> + <div class="scroll_item_row">{{ item.planCount }}</div> + <div class="scroll_item_row">{{ item.num }}</div> + <div class="scroll_item_row">{{ item.qualifiedNum }}</div> + <div class="scroll_item_row">{{ item.unqualifiedNum }}</div> + <div class="scroll_item_row">{{ item.undoneNum }}</div> + <div class="scroll_item_row">{{ item.unqualifiedRate }}%</div> </div> </div> </div> @@ -131,14 +131,14 @@ </div> <div @mouseenter="handleMouseEnter3" @mouseleave="handleMouseLeave3" class="main_container"> <div ref="scrollContainer3" class="scroll_container"> - <div v-for="(item, index) in 6" :key="item.id" :class="index % 2 == 0 ? 'scroll_item scroll_item_bg1' : 'scroll_item scroll_item_bg2'"> - <div class="scroll_item_row">闊╀紵</div> - <div class="scroll_item_row">鐢靛悏浠�</div> - <div class="scroll_item_row">CP003</div> - <div class="scroll_item_row">2023/08/12 10:12:22</div> - <div class="scroll_item_row">459</div> - <div class="scroll_item_row">2</div> - <div class="scroll_item_row">2.12%</div> + <div v-for="(item, index) in data.log" :key="index" :class="index % 2 == 0 ? 'scroll_item scroll_item_bg1' : 'scroll_item scroll_item_bg2'"> + <div class="scroll_item_row">{{ item.userName }}</div> + <div class="scroll_item_row">{{ item.materialName }}</div> + <div class="scroll_item_row">{{ item.materialCode }}</div> + <div class="scroll_item_row">{{ item.createTime }}</div> + <div class="scroll_item_row">{{ item.qualifiedNum ? item.qualifiedNum : '-' }}</div> + <div class="scroll_item_row">{{ item.unqualifiedNum }}</div> + <div class="scroll_item_row">{{ item.unqualifiedRate ? item.unqualifiedRate : '0' }}%</div> </div> </div> </div> @@ -152,8 +152,12 @@ <span>杩�7澶╀笉鑹搧鍒嗗竷</span> </div> <div class="content_right_top_nr"> - <div class="content_right_top_nr_top"></div> - <div class="content_right_top_nr_bottom"></div> + <div class="content_right_top_nr_bottom_yuan"> + <span>67</span> + <span>涓嶈壇椤瑰垎甯�</span> + </div> + <div class="content_right_top_nr_top" id="lineChrat"></div> + <div class="content_right_top_nr_bottom" id="pieChart"></div> </div> </div> <!-- 璁惧宸℃璁板綍 --> @@ -170,11 +174,11 @@ </div> <div @mouseenter="handleMouseEnter4" @mouseleave="handleMouseLeave4" class="main_container"> <div ref="scrollContainer4" class="scroll_container"> - <div v-for="(item, index) in 10" :key="item.id" :class="index % 2 == 0 ? 'scroll_item scroll_item_bg1' : 'scroll_item scroll_item_bg2'"> - <div class="scroll_item_row">2023-10-12 02:00:23</div> - <div class="scroll_item_row">鏈ㄥ伐璁惧</div> - <div class="scroll_item_row">鍚堟牸</div> - <div class="scroll_item_row">浣曞瓙鏄�</div> + <div v-for="(item, index) in data.patrolInspection" :key="index" :class="index % 2 == 0 ? 'scroll_item scroll_item_bg1' : 'scroll_item scroll_item_bg2'"> + <div class="scroll_item_row">{{ item.checkdate }}</div> + <div class="scroll_item_row">{{ item.deviceName }}</div> + <div class="scroll_item_row">{{ item.status == 0 ? '鍚堟牸' : '涓嶅悎鏍�' }}</div> + <div class="scroll_item_row">{{ item.userName }}</div> </div> </div> </div> @@ -185,12 +189,34 @@ </template> <script setup> - import { reactive, ref, onMounted, onBeforeUnmount, onUnmounted, nextTick, computed } from 'vue' - import { getTop, getStockList } from '@/utils/api.js' + import { reactive, ref, onMounted, onBeforeUnmount, onUnmounted, nextTick, computed, watch } from 'vue' + import { getTop, getStockList, getWorkPlansList, getProcedureProcessList, getRecordLogPage, getDeviceCheckPage } from '@/utils/api.js' import { useCounterStore } from '@/stores/counter.js' + import * as echarts from 'echarts' let data = reactive({ - production: [] + production: [], + marginStatistics: [], + plannedProgress: [], + processProgress: [], + log: [], + patrolInspection: [], + dayDistribution: [ + { date: '8/1', num: '20' }, + { date: '8/2', num: '10' }, + { date: '8/3', num: '20' }, + { date: '8/4', num: '40' }, + { date: '8/5', num: '30' }, + { date: '8/6', num: '10' }, + { date: '8/7', num: '20' }, + ], + typeDistribution: [ + { name: '澶栬涓嶈壇', num: 15 }, + { name: '鏈夋瘺鍒�', num: 12 }, + { name: '灏哄涓嶈壇', num: 22 }, + { name: '鏈夊垝鐥�', num: 5 }, + { name: '鍏朵粬', num: 2 } + ] }) let timer = ref(null) @@ -229,42 +255,245 @@ return enterprise.departId }) - start() - start1() - // start2() - start3() - start4() - // 娉細绀轰緥涓殑 listData 鍐欑殑鏄潤鎬佹暟鎹紝鍙互鐩存帴璋冪敤 start() - // 濡傛灉鏄帴鍙h幏鍙� listData 鍒楄〃鏃讹紝闇�瑕佸湪 nextTick 涓皟鐢� start() - // 鍚﹀垯锛岃繘鍏ラ〉闈笉浼氭粴鍔ㄣ�傚繀椤婚紶鏍囩Щ鍏ョЩ鍑烘墠浼氭粴鍔� - // 鐢� nextTick 鐨勫師鍥犳槸闇�瑕佺瓑 dom 鍏冪礌鍔犺浇瀹屾瘯鍚庡啀鎵ц鏂规硶 - - // let chartData = reactive({ - // data: [] - // }) - // function getSensorData() { - // GetSensorData().then(res=> { - // chartData.data = res.data.data - // nextTick(()=>{ - // start() - // }) - // }) - // } - - onMounted(()=> { - // getSensorData() - getTop(companyId.value, departId.value) - .then(res => { - console.log(res) - if (res.length > 0) { - res.forEach((item, index) => { - if (index > 1) { - item.doneNum1 = res[0].doneNum / item.doneNum - } + watch(() => departId.value, (val) => { + if (val) { + // 褰撴棩鍛樺伐浜ч噺TOP10 + getTop(companyId.value, departId.value) + .then(res => { + if (res.length > 0) { + res.forEach((item, index) => { + if (index > 1) { + item.doneNum1 = res[0].doneNum / item.doneNum + } + }) + data.production = res + } + }) + // 浠撳簱瀹炴椂浣欓噺缁熻 + getStockList(companyId.value, departId.value) + .then(res => { + data.marginStatistics = res + nextTick(() => { + start() }) - data.production = res - } + }) + // 鎴愬搧璁″垝杩涘害 + getWorkPlansList(companyId.value, departId.value) + .then(res => { + data.plannedProgress = res + nextTick(() => { + start1() + }) + }) + // 鎶ュ伐鏃ュ織 + getRecordLogPage(companyId.value, departId.value, { + capacity: 9999, + model: {}, + page: 1 + }).then(res => { + data.log = res.records + nextTick(() => { + start3() + }) }) + // 璁惧宸℃璁板綍 + getDeviceCheckPage(companyId.value, departId.value, { + capacity: 9999, + model: {}, + page: 1 + }).then(res => { + data.patrolInspection = res.records + nextTick(() => { + start4() + }) + }) + } + }) + + start1() + + /** + * 涓冩棩鎶樼嚎鍥� + */ + function setDayChart() { + let dayChartDom = document.getElementById('lineChrat'); + let myChart = echarts.init(dayChartDom); + let dateList = [] + let numList = [] + + data.dayDistribution.forEach(item => { + dateList.push(item.date) + numList.push(item.num) + }) + let option; + option = { + title: { + text: '杩戜竷鏃ヤ笉鑹搧鎬绘暟锛�67', + textStyle: { + color: '#fff', + fontSize: 12 + } + }, + xAxis: { + type: 'category', + boundaryGap: false, + splitLine: { + lineStyle: { + width: 0.5, + color: ['#fff'] + } + }, + axisLabel: { + textStyle: { + color: '#fff' + } + }, + data: dateList + }, + + yAxis: { + type: 'value', + splitLine: { + lineStyle: { + width: 0.5, + color: ['#fff'] + } + }, + axisLabel: { + textStyle: { + color: '#fff' + } + } + }, + series: [ + { + data: numList, + type: 'line', + lineStyle: { + color: '#03D2B5', + width: 1 + }, + areaStyle: { + color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ + { + offset: 0, + color: 'rgba(3, 210, 181, .9)', + }, + { + offset: 1, + color: 'rgba(3, 210, 181, 0)', + } + ]) + } + } + ], + + tooltip: { + trigger: 'axis' + }, + legend: { + name: '1adssad', + itemWidth: 10, + itemHeight: 10, + itemGap: 4, + textStyle: { + color: '#fff' + } + } + } + + option && myChart.setOption(option); + } + + /** + * 涓嶈壇绫诲瀷鍒嗗竷 + */ + function setTypeChart() { + let dayChartDom = document.getElementById('pieChart'); + let myChart = echarts.init(dayChartDom); + let legendData = [] + let seriesData = [] + data.typeDistribution.forEach(item => { + legendData.push(item.name) + seriesData.push({name:item.name, value:item.num}) + }) + let option = { + // title: { + // text: '鍚屽悕鏁伴噺缁熻', + // subtext: '绾睘铏氭瀯', + // left: 'center' + // }, + // tooltip: { + // trigger: 'item', + // formatter: '{a} <br/>{b} : {c} ({d}%)' + // }, + legend: { + show: false, + type: 'scroll', + orient: 'vertical', + right: 10, + top: 20, + bottom: 20, + data: legendData + }, + series: [ + { + // name: '濮撳悕', + type: 'pie', + + radius: ['60%', '70%'], + // avoidLabelOverlap: false, + itemStyle: { + borderRadius: 4, + borderColor: 'rgba(52, 88, 159, 0.4)', + borderWidth: 4 + }, + center: ['50%', '50%'], + labelLine: { + show: false + }, + label: { + formatter:'{dot| } {title|{b} {c}}\n\n{per|{d}%}', + rich: { + title: { + color: '#fff' + }, + per: { + color: '#01D9FE' + }, + dot: { + backgroundColor: 'inherit', + width: 8, + height: 8, + borderRadius: 4 + } + } + }, + // labelLayout: { + // hideOverlap: true + // }, + endLabel: { + show: true, + distance: 5, + color: "red" + }, + data: seriesData, + emphasis: { + itemStyle: { + shadowBlur: 10, + shadowOffsetX: 0, + shadowColor: 'rgba(0, 0, 0, 1)' + } + } + } + ] + } + option && myChart.setOption(option); + } + + onMounted(() => { + setDayChart() + setTypeChart() }) onBeforeUnmount(()=>{ @@ -286,10 +515,25 @@ clearTimeout(timer2.value) cate.value.forEach((item, i) => { if (i === index) { + // 鎴愬搧璁″垝杩涘害 if (i == 0) { - start1() + getWorkPlansList(companyId.value, departId.value) + .then(res => { + console.log(res) + data.plannedProgress = res + nextTick(() => { + start1() + }) + }) } else { - start2() + getProcedureProcessList(companyId.value, departId.value) + .then(res => { + console.log(res) + data.processProgress = res + nextTick(() => { + start2() + }) + }) } item.active = true } else { @@ -985,15 +1229,44 @@ width: 100%; height: calc(100% - 38px); background: linear-gradient(180deg, rgba(52,88,159,0) 0%, rgba(0,86,255,0.4) 100%); + position: relative; + .content_right_top_nr_bottom_yuan { + position: absolute; + top: 299px; + left: 168px; + z-index: 999; + width: 114px; + height: 114px; + border-radius: 50%; + border: 2px dashed #01D9FE; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + span { + &:first-child { + font-size: 26px; + font-family: SourceHanSansSC-Medium, SourceHanSansSC; + font-weight: 500; + color: #FFFFFF; + } + &:last-child { + font-size: 13px; + font-family: SourceHanSansSC-Regular, SourceHanSansSC; + font-weight: 400; + color: rgba(255,255,255,0.8); + } + } + } .content_right_top_nr_top { width: 100%; height: 50%; - background-color: #00B0FF; + padding: 10px 0 0 10px; + box-sizing: border-box; } .content_right_top_nr_bottom { width: 100%; height: 50%; - background-color: #5900ff; } } } -- Gitblit v1.9.3