Files
fengjie-datascreen/src/views/scenic/components/box-1.vue
2025-01-27 07:55:15 +08:00

307 lines
8.0 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"
:key="index"
>
<div class="label">{{ item.name }}</div>
<countup :end-val="item.value" />
</div>
</div>
<div>
<div>
<div class="label">游览舒适度</div>
<p class="value">舒适</p>
</div>
<div>
<div class="label">景区安全</div>
<p class="value">安全</p>
</div>
<div>
<div class="label">通景交通</div>
<p class="value">畅通</p>
</div>
<div>
<div class="label">停车场负荷度</div>
<p class="value error">调试中</p>
</div>
</div>
</div>
<div class="main">
<img v-if="scenicSpotId == 'root000000'" src="@/assets/images/bdc.png" alt="" />
<img v-if="scenicSpotId == '三峡之巅'" src="@/assets/images/sxzd.png" alt="" />
<img v-if="scenicSpotId == '龙桥河'" src="@/assets/images/lqh.jpg" alt="" />
</div>
<div class="footer">
<div class="flex">
<div class="item">
<circle-progress
:width="170"
:height="90"
:value="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="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 { useScenicStore } from '@/stores/scenic'
import { useRouter } from 'vue-router'
const router = useRouter()
const scenicStore = useScenicStore()
let props = defineProps({
scenicSpotId: {
type: String,
default: () => ''
}
})
const handleMore = () => {
router.push('/workOrder')
}
</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);
> img {
width: 100%;
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>