web
8 天以前 6e6127068f03a7fe655f1fd504c488f20683039f
src/views/screen/index.vue
@@ -1,17 +1,312 @@
<template>
    <div class="home">
        11111
        <!-- 虚化盒子 -->
         <div class="blurBox"></div>
        <!-- 顶部菜单占位符 -->
        <div class="home-t"></div>
        <div class="home-content">
            <div class="hc-position">
                <div class="point" v-for="(item, index) in pointData" :key="index"
                    :style="{left: `${item.left}%`, top: `${item.top}%`, backgroundImage: `url(${getPointImg(item.facilityState)})`}"
                    @click.self="changeShow(index)"
                >
                    <div class="msg-l" v-if="item.showMask && item.boxType === '0'">
                        <div class="msg-item">
                            <span class="name">设备名称:</span>
                            <span class="val">{{ item.facilityName }}</span>
                        </div>
                        <div class="msg-item">
                            <span class="name">设备状态:</span>
                            <span class="val">{{ item.facilityState }}</span>
                        </div>
                        <div class="msg-item">
                            <span class="name">甲烷浓度:</span>
                            <span class="val">{{ item.methaneValue }}%</span>
                        </div>
                        <div class="msg-item">
                            <span class="name">室内温度:</span>
                            <span class="val">{{ item.temperature }}°</span>
                        </div>
                        <div class="msg-item">
                            <span class="name">风机状态:</span>
                            <span class="val">{{ item.facilityFanState }}</span>
                        </div>
                        <div class="msg-item">
                            <span class="name">硫化氢浓度:</span>
                            <span class="val">{{ item.hyrothionValue }}ppm</span>
                        </div>
                    </div>
                    <div class="msg-r" v-if="item.showMask && item.boxType === '1'">
                        <div class="msg-item">
                            <span class="name">设备名称:</span>
                            <span class="val">{{ item.facilityName }}</span>
                        </div>
                        <div class="msg-item">
                            <span class="name">设备状态:</span>
                            <span class="val">{{ item.facilityState }}</span>
                        </div>
                        <div class="msg-item">
                            <span class="name">甲烷浓度:</span>
                            <span class="val">{{ item.methaneValue }}%</span>
                        </div>
                        <div class="msg-item">
                            <span class="name">室内温度:</span>
                            <span class="val">{{ item.temperature }}°</span>
                        </div>
                        <div class="msg-item">
                            <span class="name">风机状态:</span>
                            <span class="val">{{ item.facilityFanState }}</span>
                        </div>
                        <div class="msg-item">
                            <span class="name">硫化氢浓度:</span>
                            <span class="val">{{ item.hyrothionValue }}ppm</span>
                        </div>
                    </div>
                </div>
            </div>
            <div class="hc-info">
                <div class="shebei item">
                    <div class="item-t">辖区内设备数统计</div>
                    <div class="item-c">
                        <el-table
                            :data="facityData"
                            :header-cell-style="headerStyle"
                            :cell-style="rowStyle"
                            style="height: 100%;"
                        >
                            <el-table-column prop="pointName" label="辖区位置" align="center" />
                            <el-table-column prop="methaneCount" label="甲烷传感器" align="center" />
                            <el-table-column prop="hyrothionCount" label="硫化氢传感器" min-width="100" align="center" />
                            <el-table-column prop="boxCount" label="终端控制器" align="center" />
                            <el-table-column prop="facilityFanCount" label="风机设备" align="center" />
                            <el-table-column prop="sumCount" label="总设备数" align="center" />
                        </el-table>
                    </div>
                </div>
                <div class="gongdan item">
                    <div class="item-t">未处理工单统计</div>
                    <div class="item-c">
                        <el-table
                            :data="orderData"
                            :header-cell-style="headerStyle"
                            :cell-style="rowStyle"
                            style="height: 100%;"
                        >
                            <el-table-column prop="code" label="工单号" align="center" />
                            <el-table-column label="工单类型" align="center">
                                <template #default="scope">
                                    <div v-if="scope.row.type === 1">设备维护</div>
                                    <div v-else>设备维修</div>
                                </template>
                            </el-table-column>
                            <el-table-column prop="createTimeView" label="上报时间" align="center" min-width="100" />
                            <el-table-column prop="createUserName" label="上报人" align="center" />
                            <el-table-column prop="address" label="所属地址" align="center" min-width="120" />
                            <el-table-column label="工单状态" align="center">
                                <template #default="scope">
                                    <div v-if="scope.row.executeState === 100" style="color: #ccc;">未执行</div>
                                    <div v-else style="color: #36fc0e;">已执行</div>
                                </template>
                            </el-table-column>
                        </el-table>
                    </div>
                </div>
            </div>
        </div>
    </div>
</template>
<script setup>
    import { onMounted, ref } from 'vue'
    import { getPointFacityList, staticFacity, staticOrder } from '@/api/screen/home'
    import postRun from '@/assets/images/screen/pos-run.png'
    import warnStop from '@/assets/images/screen/pos-stop.png'
    import warnWarn from '@/assets/images/screen/pos-warn.png'
    const headerStyle = {
        "background-color": '#041025 !important'
    }
    const rowStyle = {
        "background-color": '#081C3F !important'
    }
    const pointData = ref([])
    const facityData = ref([])
    const orderData = ref([])
    // 显示隐藏弹窗
    const changeShow = (index) => {
        pointData.value[index].showMask = !pointData.value[index].showMask
    }
    /*
        获取图标
        0停止  1运行  2一级报警  3二级报警
     */
    const getPointImg = (status) => {
        if(status === '运行中') {
            return postRun
        }else if(status === '一级报警' || status === '二级报警'){
            return warnWarn
        }else{
            return warnStop
        }
    }
    const getPointData = () => {
        getPointFacityList().then(res => {
            pointData.value = res.data.map(item => {
                return {
                    ...item,
                    showMask: false
                }
            })
        })
    }
    const getFacity = () => {
        staticFacity().then(res => {
            facityData.value = res.data
        })
    }
    const getOrder = () => {
        const searchdata = {
            limit: 100,
            page: 1
        }
        staticOrder(searchdata).then(res => {
            orderData.value = res.data.list
        })
    }
    onMounted(() => {
        getPointData()
        getFacity()
        getOrder()
    })
</script>
<style scoped lang="scss">
.home{
    height: 100%;
    position: absolute;
    left: 0;
    top: 7%;
    width: 100%;
    height: 93%;
    background-image: url('@/assets/images/map-bg.png');
    background-size: 100% 100%;
    background-repeat: no-repeat;
    z-index: 10;
    .blurBox{ //模糊背景盒子覆盖图片
        position: absolute;
        top: -1rem;
        left: 0;
        width: 100%;
        height: 3%;
        background-color: #000;
        filter: blur(10px);
    }
    &-t{
        height: 1%;
    }
    &-content{
        height: 99%;
        padding: 1rem 1.5rem 0;
        position: relative;
        display: flex;
        .hc-position{
            width: 70%;
            height: 100%;
            position: relative;
            .point{
                position: absolute;
                width: 32px;
                height: 80px;
                background-repeat: no-repeat;
                background-size: 100% 100%;
                .msg-l{
                    width: 250px;
                    height: 160px;
                    position: absolute;
                    left: -245px;
                    top: 0;
                    background-image: url('@/assets/images/screen/msg-box-l.png');
                    background-repeat: no-repeat;
                    background-size: 100% 100%;
                    padding: 0.5rem 1.5rem 0.5rem 0.5rem;
                    display: flex;
                    flex-direction: column;
                    justify-content: space-between;
                }
                .msg-r{
                    width: 250px;
                    height: 160px;
                    position: absolute;
                    left: 30px;
                    top: 0;
                    background-image: url('@/assets/images/screen/msg-box-r.png');
                    background-repeat: no-repeat;
                    background-size: 100% 100%;
                    padding: 0.5rem 0.5rem 0.5rem 1.5rem;
                    display: flex;
                    flex-direction: column;
                    justify-content: space-between;
                }
                .msg-item{
                    width: 100%;
                    color: #fff;
                    overflow: hidden;
                    white-space: nowrap;
                    text-overflow: ellipsis;
                }
            }
        }
        .hc-info{
            width: 30%;
            height: 100%;
            display: flex;
            flex-direction: column;
            gap: 1rem;
            .item{
                width: 100%;
                height: 50%;
                background-image: url("@/assets/images/screen/ct-default.png");
                background-repeat: no-repeat;
                background-size: 100% 100%;
                &-t{
                    color: #fff;
                    height: 3rem;
                    line-height: 3rem;
                    padding-left: 2.5rem;
                }
                &-c{
                    color: #fff;
                    height: calc(100% - 3rem);
                    padding: 1rem 0.5rem;
                }
            }
        }
    }
}
:deep(.el-table){
    --el-table-border-color: #000;
    --el-table-bg-color: transparent;
    th{
        font-size: 12px;
        color: #fff;
    }
    tr{
        font-size: 12px;
        color: #fff;
    }
    .el-table__cell{
        border: none;
    }
}
</style>