Files
fengjie-datascreen/src/views/scenic/components/box-1.vue
2025-03-18 16:59:36 +08:00

346 lines
9.3 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="box-1">
<div class="header">
<div class="header__left">
<img src="@/assets/images/ticket.png" />
<div
class="header__left-item"
v-for="(item, index) in scenicStore.scenicSpotData.data"
:key="index"
>
<div class="label">{{ item.name }}</div>
<countup :end-val="item.value" />
</div>
</div>
<div>
<div v-for="(item, index) in scenicStore.scenicSpotData.infoList" :key="index">
<div class="label">{{ item.name }}</div>
<p class="value" :class="{ error: [3, 4].includes(item.type) }">{{ item.value }}</p>
</div>
</div>
</div>
<div class="main">
<img v-if="scenicSpotId == 'root000000'" src="@/assets/images/bdc.png" alt="" />
<img v-if="scenicSpotId == 'root00000000'" src="@/assets/images/sxzd.png" alt="" />
<img v-if="scenicSpotId == '龙桥河'" src="@/assets/images/lqh.jpg" alt="" />
<!-- <div class="scenic-box" id="scenic-map"></div> -->
</div>
<div class="footer">
<div class="flex">
<div class="item">
<circle-progress
:width="170"
:height="90"
:value="parseFloat(scenicStore.wordkOrderData.toDayData.rate)"
:title="`${scenicStore.wordkOrderData.toDayData.rate}%`"
subTitle="完成率"
/>
<div>
<div class="bg">
<span class="label">今日工单总条数</span>
<span class="value success">
<countup :end-val="scenicStore.wordkOrderData.toDayData.count" />
</span>
</div>
<div class="bg">
<span class="label">工单完成数</span>
<span class="value">
<countup :end-val="scenicStore.wordkOrderData.toDayData.end" />
</span>
</div>
</div>
</div>
<div class="item">
<circle-progress
:width="170"
:height="90"
:value="parseFloat(scenicStore.wordkOrderData.warnData.rate)"
:title="`${scenicStore.wordkOrderData.warnData.rate}%`"
subTitle="完成率"
/>
<div>
<div class="bg">
<span class="label">今日紧急工单数</span>
<span class="value error">
<countup :end-val="scenicStore.wordkOrderData.warnData.count" />
</span>
</div>
<div class="bg">
<span class="label">紧急工单完成数</span>
<span class="value">
<countup :end-val="scenicStore.wordkOrderData.warnData.end" />
</span>
</div>
</div>
</div>
</div>
<div class="flex align-center justify-between">
<div>
<Vue3SeamlessScroll
class="list"
:list="scenicStore.wordkOrderList"
:limitScrollNum="3"
:hover="true"
:step="0.2"
:wheel="true"
:isWatch="true"
>
<div class="cell" v-for="(item, index) in scenicStore.wordkOrderList" :key="index">
<span :class="`tag--${item.level}`">{{ item.level_text }}</span>
<p class="content">
{{ item.title }}
</p>
</div>
</Vue3SeamlessScroll>
</div>
<img class="more" src="@/assets/images/more-col.png" alt="查看更多" @click="handleMore" />
</div>
</div>
</div>
</template>
<script setup>
import countup from 'vue-countup-v3'
import { Vue3SeamlessScroll } from 'vue3-seamless-scroll'
import { useRouter } from 'vue-router'
import { useScenicStore } from '@/stores/scenic'
import { useMap } from '@/hooks/map'
import sxzd from '@/assets/images/sxzd.png'
const router = useRouter()
const scenicStore = useScenicStore()
const { initMap, addMarker, map, marker } = useMap()
let props = defineProps({
scenicSpotId: {
type: String,
default: () => ''
}
})
let scenicChange = null
const handleMore = () => {
router.push('/workOrder')
}
// onMounted(() => {
// scenicChange = PubSub.subscribe('scenicChange', (msg, data) => {
// initMap('scenic-map', data.lng, data.lat, 15)
// map.value.setDisplayOptions({
// poiText: false, // 隐藏poi标注
// poiIcon: false, // 隐藏poi图标
// building: false // 隐藏楼块
// })
// var bounds = new BMapGL.Bounds(
// new BMapGL.Point(109.604998,31.030391),
// new BMapGL.Point(109.624833,31.044965)
// )
// var imgOverlay = new BMapGL.GroundOverlay(bounds, {
// type: 'image',
// url: sxzd,
// opacity: 1
// })
// map.value.addOverlay(imgOverlay)
// })
// })
// onUnmounted(() => {
// PubSub.unsubscribe(scenicChange)
// })
</script>
<style scoped lang="scss">
.box-1 {
margin-top: vh(120);
width: vw(900);
height: vh(950);
padding: vw(10);
box-sizing: border-box;
background-image: url('@/assets/images/bg-3.png');
background-size: 100% 100%;
.header {
display: flex;
margin-top: vh(10);
&__left {
display: flex;
align-items: center;
> img {
width: vw(74);
height: auto;
}
}
&__left-item {
position: relative;
width: vw(120);
height: vh(58);
padding-left: vw(10);
display: flex;
flex-direction: column;
justify-content: center;
background-image: url('@/assets/images/ticket-item-bg.png');
background-size: 100% 100%;
.label {
position: absolute;
top: vh(-4);
font-weight: 400;
font-size: vw(14);
color: #ffffff;
}
}
& > div:nth-child(2) {
flex: 1;
display: flex;
justify-content: space-between;
.label {
font-weight: 400;
font-size: vw(16);
color: #ffffff;
}
.value {
font-weight: bold;
font-size: vw(28);
color: #02f9fa;
text-align: center;
line-height: vh(60);
}
.error {
color: #ff4400;
}
}
.countup-wrap {
color: #02f9fa;
font-size: vw(28);
font-weight: bold;
}
}
.main {
width: 100%;
height: vh(600);
overflow-x: auto;
overflow-y: hidden;
.scenic-box {
width: 100%;
height: 100%;
}
/* 滚动条整体样式 */
&::-webkit-scrollbar {
height: vh(10); /* 滚动条的宽度 */
}
/* 滚动条轨道 */
&::-webkit-scrollbar-track {
background: 'transparent'; /* 轨道的背景色 */
}
/* 滚动条滑块 */
&::-webkit-scrollbar-thumb {
background: rgba(0, 150, 255, 0.63); /* 滑块的背景色 */
border-radius: 5px; /* 滑块的圆角 */
}
> img {
width: auto;
height: 100%;
}
}
.footer {
.item {
flex: 1;
height: vh(140);
display: flex;
align-items: center;
background-image: url('@/assets/images/bg-3.png');
background-size: 100% 100%;
&:nth-child(1) {
margin-right: vw(10);
}
.bg {
padding-left: vw(20);
width: vw(243);
height: vh(40);
display: flex;
align-items: center;
background: linear-gradient(90deg, rgba(0, 150, 255, 0.34) 0%, rgba(0, 150, 255, 0) 100%);
&:nth-child(1) {
margin-bottom: vh(4);
}
.label {
width: vw(120);
font-weight: 400;
font-size: vw(14);
color: #fff;
}
.value {
font-weight: bold;
font-size: vw(28);
color: #fff;
}
.success {
color: #02f9fa;
}
.error {
color: #e21b1b;
}
}
}
.list {
margin-top: vh(4);
height: vh(116);
overflow: hidden;
}
.cell {
display: flex;
margin-left: vw(4);
margin-top: vh(12);
&:nth-last-child(1) {
margin-bottom: 0;
}
.tag {
padding: 0 vw(16);
font-weight: bold;
font-size: vw(14);
color: #fff;
display: flex;
align-items: center;
justify-content: center;
border-radius: vw(2);
}
.tag--important {
@extend .tag;
background: #feae00;
}
.tag--warn {
@extend .tag;
background: #d9011b;
}
.tag--normal {
@extend .tag;
background: #2380fb;
}
.content {
margin-left: vw(4);
padding: 0 vw(10);
width: vw(760);
height: vh(24);
line-height: vh(24);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
font-weight: 400;
font-size: vw(14);
color: #ffffff;
border-radius: vw(2);
background: rgba(0, 150, 255, 0.28);
}
}
.more {
cursor: pointer;
width: auto;
height: vh(100);
margin-top: vh(12);
}
}
}
</style>