gaosp
2024-01-20 c3d5a56a83a8ab420bff5ed01437a806259fa5ef
大屏滚动
已修改6个文件
214 ■■■■■ 文件已修改
src/container/Map/Map.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/container/Map/index.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/container/mapPreview/Map.vue 163 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/container/mapPreviewDetail/index.vue 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/container/preview/index.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/container/workshop/device.vue 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/container/Map/Map.vue
@@ -1,7 +1,7 @@
<!--
 * @Date: 2024-01-05 23:47:53
 * @LastEditors: Sneed
 * @LastEditTime: 2024-01-20 17:24:04
 * @LastEditTime: 2024-01-20 19:40:37
 * @FilePath: /belleson-frontend/Users/mache/Documents/demo/mdc/src/container/Map/Map.vue
-->
<template>
@@ -14,12 +14,12 @@
                <el-button v-show="id" class="input" type="primary" size="mini" @click="del">删除</el-button>
                <el-button class="input" size="mini" type="primary" v-show="status !== 2" @click="createMap">生成地图</el-button>
                <span>行数:</span>
                <el-input style="width: 30px;" class="input" v-show="status !== 2" v-model="rows" />
                <el-input style="width: 70px;" class="input" v-show="status !== 2" v-model="rows" />
                <span>列数:</span>
                <el-input style="width: 30px;" class="input" v-show="status !== 2" v-model="cols" />
                <el-input style="width: 70px;" class="input" v-show="status !== 2" v-model="cols" />
                <!-- <div class="plant-name" v-if="status===2">{{plantName}}</div> -->
                <span>名称:</span>
                <el-input class="plant-name" v-model="plantName" placeholder="请输入厂名" />
                <el-input style="width: 70px;" class="input"  v-model="plantName" placeholder="请输入厂名" />
            </div>
            <div class="table" :class="$route.name === 'preview' ? 'active' : ''">
                <div class="table-action" :style="position" v-show="showAction && status !== 2">
@@ -500,8 +500,6 @@
    align-items: center;
    &>.input {
        min-width: 80px;
        max-width: 200px;
        margin-inline: 10px;
    }
src/container/Map/index.vue
@@ -1,7 +1,7 @@
<!--
 * @Date: 2024-01-05 22:26:22
 * @LastEditors: Sneed
 * @LastEditTime: 2024-01-20 17:23:08
 * @LastEditTime: 2024-01-20 19:41:22
 * @FilePath: /belleson-frontend/Users/mache/Documents/demo/mdc/src/container/Map/index.vue
-->
<template>
@@ -10,7 +10,7 @@
            <template slot="tool">
                <div class="workshop-tool">
                    <span v-show="id">车间地图:</span>
                    <el-select v-show="id" class="wkshoplist" clearable v-model="id" placeholder="请选择">
                    <el-select style="width: 100px" v-show="id" class="wkshoplist" clearable v-model="id" placeholder="请选择">
                        <el-option v-for="item in mapList" :key="item.id" :label="item.name" :value="item.id">
                        </el-option>
                    </el-select>
src/container/mapPreview/Map.vue
@@ -1,23 +1,22 @@
<!--
 * @Date: 2024-01-05 23:47:53
 * @LastEditors: Sneed
 * @LastEditTime: 2024-01-20 17:05:37
 * @LastEditTime: 2024-01-20 20:37:45
 * @FilePath: /belleson-frontend/Users/mache/Documents/demo/mdc/src/container/mapPreview/Map.vue
-->
<template>
    <div class="map">
        <div class="map-container" v-if="!addStatus">
        <div class="map-container">
            <div class="table" :class="$route.name ==='preview' ? 'active' : ''" >
                <div :style="{width: (cols * height + 'px'),height: rows * height + 'px'}">
                <div :style="{width: (cols * height + 'px'),height: rows * height + 'px',marginLeft: -marginLeft + 'px'}">
                    <table >
                        <tr v-for="(item, index) in map" :key="index">
                            <td v-if="v.rowspan !==0 && v.colspan!==0"
                            :class="{aisle: v.type === 1 }"
                            :width="v.colspan* height + 'px'"
                            :height="v.rowspan* height + 'px'"
                            :class="{'active': (range.x !=='' && v.rowIndex >=range.x && v.rowIndex<=range.x1 && v.colIndex>=range.y && v.colIndex<=range.y1),aisle: v.type ===1}" @mousedown="e => onMousedown(e, v)" @mousemove="e => onMouseMove(e, v)" v-for="v in item"
                            v-for="v in item"
                                :rowspan="v.rowspan" :colspan="v.colspan" :key="v.rowIndex + '-' + v.colIndex">
                                <img @click="addDevice($event,v)" @mousedown="e => e.stopPropagation()" v-if="v.type ===2 && status!==2 && !v.id" src="./img/+.png" alt="">
                                <!-- <Device v-if="v.id" :id="v.id" style="width: 100%;height: 100%;"></Device> -->
                                <Device @click.native="toDetail(v)" v-if="v.id" :id="v.id" style="width: 100%;height: 100%;" :deviceList="deviceList"
:plantDeviceList="plantDeviceList" ::info="info"></Device>
                            </td>
@@ -30,6 +29,7 @@
    
</template>
<script>
let timer;
const getParent = (v, layout) => {
    if (v.rowspan === 0) {
        return getParent(layout[v.parent[0]][v.parent[1]], layout)
@@ -59,112 +59,48 @@
            type: [Number,String]
        }
    },
    computed: {
        showEdit() {
            try {
                const { x, x1, y, y1 } = this.range
                if (this.range && x && x1 && y && y1) {
                    let start = this.map[x][y]
                    return this.map[x][y].id && (start.rowIndex + start.rowspan -1) === x1 && (start.colIndex + start.colspan -1) === y1
                }
            } catch (error) {
                return false
            }
        },
        machineid () {
            try {
                const { x, x1, y, y1 } = this.range
                if (this.range && x && x1 && y && y1) {
                    let start = this.map[x][y]
                     if (this.map[x][y].id && (start.rowIndex + start.rowspan -1) === x1 && (start.colIndex + start.colspan -1) === y1) {
                        return start.id
                    } else {
                        return ''
                    }
                }
            } catch (error) {
                return ''
            }
        }
    },
    data() {
        return {
            height: 0,
            plantName: '',
            rows: 20,
            cols: 50,
            map: null, // 地图数据
            addStatus: false,
            position: {},
            selection:[],
            showAction: false,
            tdMounseDown: false,
            range: {x: '',x1: '',y: '',y1: ''},
            currentAdd: {},
            colgroups:[]
            leftMax: 0,
            move: false,
            marginLeft: 0
        }
    },
    watch: {
        selection(val) {
            let select = this.selection
            let range = {}
            if (val.length === 0) {
                range = {}
            } else if (val.length === 1) {
                let x = select[0].rowIndex
                let y = select[0].colIndex
                let x1 = select[0].rowIndex + select[0].rowspan - 1
                let y1 = select[0].colIndex + select[0].colspan - 1
                range = { x, y, x1, y1 }
            } else {
                // 起始行号 不包含合并
                let x = Math.min(select[0].rowIndex, select[1].rowIndex)
                let x1 = Math.max(select[0].rowIndex + select[0].rowspan - 1, select[1].rowIndex + select[1].rowspan - 1)
                let y = Math.min(select[0].colIndex, select[1].colIndex)
                let y1 = Math.max(select[0].colIndex + select[0].colspan - 1, select[1].colIndex + select[1].colspan - 1)
                // 范围内碰到合并格
                for (var i = x; i <= x1; i++) {
                    for (var j = y; j <= y1; j++) {
                        let v = getParent(this.map[i][j], this.map)
                        x = Math.min(x, v.rowIndex)
                        y = Math.min(y, v.colIndex)
                        x1 = Math.max(x1, v.rowIndex + v.rowspan - 1)
                        y1 = Math.max(y1, v.colIndex + v.colspan - 1)
                    }
                }
                range = { x, y, x1, y1 }
            }
            this.$set(this.range,'x',range.x)
            this.$set(this.range,'x1',range.x1)
            this.$set(this.range,'y',range.y)
            this.$set(this.range,'y1',range.y1)
        },
        name: {
            handler () {
                this.plantName = this.name
            },
            immediate: true
        },
        currentMap: {
            handler () {
                if (!this.currentMap || this.currentMap.length === 0) return
                if (this.currentMap.length > 0) this.map = this.currentMap
                this.rows = this.currentMap.length;
                this.cols = this.currentMap[0].length;
                if (this.$route.name === 'preview') {
                    this.$nextTick(() => {
                            let {width} = document.querySelector('.table div').getBoundingClientRect()
                            console.log(document.querySelector('.table div').getBoundingClientRect())
                                // document.querySelector('.table').scrollLeft
                                // document.querySelector('.table').scrollTo({left: })
                    })
                }
            },
            immediate: true
        },
        map () {
            this.height = (document.querySelector('.table').getBoundingClientRect().height - 30) / 20
        },
        id: {
            handler () {
                this.$nextTick(() => {
                    let {width} = document.querySelector('.table div').getBoundingClientRect()
                    let {width: tableW} = document.querySelector('.table').getBoundingClientRect()
                    console.log(width, '>>>>>>>', tableW)
                    if (width > tableW) {
                        this.move = true
                        this.leftMax = width - tableW
                        clearTimeout(timer)
                        this.moveFn()
                    } else {
                        this.move = false
                        this.leftMax = 0
                    }
                })
            },
            immediate: true
        }
    },
    mounted() {
@@ -174,8 +110,23 @@
        }
    },
    methods: {
        moveFn () {
            if (this.marginLeft < this.leftMax) {
                this.marginLeft += 5
                timer = setTimeout(() => {
                    this.moveFn()
                }, 30)
            } else if (this.marginLeft >= this.leftMax){
                this.marginLeft = 0
                timer = setTimeout(() => {
                    this.moveFn()
                }, 30)
            }
        },
        animationFn () {
        },
        toDetail (v) {
            alert(1)
            this.$router.push({
                name: 'mapPreviewDetail',
                query: {
@@ -183,12 +134,6 @@
                }
            })
        },
        out () {
            this.$emit('out')
        },
        close () {
            this.addStatus = false
        }
    },
}
</script>
@@ -196,14 +141,20 @@
@keyframes move {
    0% {
        // left: 100%;
        // transform: translate(0,0);
        // scrollTop: 0
        transform: translate(0,0);
    }
    100% {
        // left: 100%;
        // transform: translate(-100%,0);
        // scrollTop: 100%
        transform: translate(-100%,0);
    }
}
.preview-container {
    .table {
        overflow: hidden;
        overflow-y: auto;
        // margin-left: 100%;
    }
    .table div {
        // animation: move 12s infinite alternate;
    }
}
.map {
@@ -259,7 +210,9 @@
    height: 100%;
    position: relative;
    overflow-x: scroll;
    & > div {
   
    }
    .table-action {
        position: fixed;
        z-index: 999;
src/container/mapPreviewDetail/index.vue
@@ -1,14 +1,14 @@
<!--
 * @Date: 2024-01-05 22:26:22
 * @LastEditors: Sneed
 * @LastEditTime: 2024-01-20 17:12:15
 * @LastEditTime: 2024-01-20 19:36:45
 * @FilePath: /belleson-frontend/Users/mache/Documents/demo/mdc/src/container/mapPreviewDetail/index.vue
-->
<template>
    <div class="workshop">
        <div class="nav">
            车间列表 / 2厂 / YYYYYYYYss
            <span>返回车间地图</span>
            <span @click="back">返回车间地图</span>
        </div>
        <div class="workshop-box">
            <div class="left">1</div>
@@ -36,7 +36,9 @@
        }
    },
    methods: {
        back () {
            this.$router.go(-1)
        }
    },
    mounted() {
        
src/container/preview/index.vue
@@ -1,7 +1,7 @@
<!--
 * @Date: 2024-01-05 22:26:22
 * @LastEditors: Sneed
 * @LastEditTime: 2024-01-20 19:32:59
 * @LastEditTime: 2024-01-20 20:12:55
 * @FilePath: /belleson-frontend/Users/mache/Documents/demo/mdc/src/container/preview/index.vue
-->
<template>
@@ -32,7 +32,7 @@
                    </template>
                </Status>
                <div class="preview-map">
                    <Map v-if="id" :id="id" :status="2" :currentMap="currentMap"  @out="out" />
                    <Map class="preview-container" v-if="id" :id="id" :status="2" :currentMap="currentMap" />
                </div>
            </div>
        </div>
src/container/workshop/device.vue
@@ -1,7 +1,7 @@
<!--
 * @Date: 2024-01-13 20:46:33
 * @LastEditors: Sneed
 * @LastEditTime: 2024-01-17 23:06:46
 * @LastEditTime: 2024-01-20 20:13:21
 * @FilePath: /belleson-frontend/Users/mache/Documents/demo/mdc/src/container/workshop/device.vue
-->
<template>
@@ -86,12 +86,21 @@
        },
        machineName () {
            let machineName = ''
            if (this.deviceList.length > 0) {
            try {
                machineName =  this.deviceList.find(item => item.machineId=== this.id).machineName
            } catch (error) {console.error(error)}
                } catch (error) {
                    // console.info(error)
                }
            }
            if (this.plantDeviceList.length > 0) {
            try {
                machineName =  this.plantDeviceList.find(item => item.machineId=== this.id).machineName
            } catch (error) {console.error(error)}
                } catch (error) {
                    // console.info(error)
                }
            }
            if (machineName) {
                return machineName
            }
@@ -121,12 +130,14 @@
    display: flex;
    flex-direction: column;
    position: relative;
    .care {
        position: absolute;
        right: 5px;
        top: 5px;
        z-index: 999;
    }
    &>p {
        color: #E9FFFF;
        text-shadow: 0px 1px 11px #549BD4;
@@ -136,6 +147,7 @@
        text-align: center;
        position: relative;
    }
    &>p:before {
        content: '';
        position: absolute;
@@ -147,6 +159,7 @@
        height: 1px;
        background: linear-gradient(270deg, #65A5D6 0%, rgba(11,70,115,0) 100%);
    }
    &>p:after {
        content: '';
        position: absolute;
@@ -157,6 +170,7 @@
        height: 1px;
        background: linear-gradient(90deg, #65A5D6 0%, rgba(11,70,115,0) 100%);
    }
    &>div.device-item-box {
        flex: 1 1 auto;
        margin-top: 20px;
@@ -172,6 +186,7 @@
            border: 1px solid #444C55;
            border-radius: 10px;
            position: relative;
            .img-status {
                position: absolute;
                font-size: 12px;
@@ -182,16 +197,20 @@
                // border: 1px solid #FFFFFF;
                padding: 5px 10px;
            }
            .img-status.standby {
                background: linear-gradient(130deg, #FF3333 0%, #F2BF24 100%);
            }
            .img-status.run {
                background: linear-gradient(130deg, #EAF224 0%, #3DF297 100%);
            }
            .img-status.alerm {
                background: #FF3333;
                color: #fff;
            }
            img {
                position: absolute;
                top: 50%;