From 5b9a1d6cb3a7d59c8f2de83c495bba1a069b2723 Mon Sep 17 00:00:00 2001
From: gaosp <gaosp>
Date: 星期五, 19 一月 2024 00:23:15 +0800
Subject: [PATCH] update

---
 src/container/Map/Map.vue |  450 ++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 308 insertions(+), 142 deletions(-)

diff --git a/src/container/Map/Map.vue b/src/container/Map/Map.vue
index ee18d25..0b2c9b4 100644
--- a/src/container/Map/Map.vue
+++ b/src/container/Map/Map.vue
@@ -1,108 +1,64 @@
 <!--
  * @Date: 2024-01-05 23:47:53
  * @LastEditors: Sneed
- * @LastEditTime: 2024-01-12 00:22:57
+ * @LastEditTime: 2024-01-16 01:03:35
  * @FilePath: /belleson-frontend/Users/mache/Documents/demo/mdc/src/container/Map/Map.vue
 -->
 <template>
     <div class="map">
-        <div class="map-container" v-if="!addStatus">
-            <div class="table-tool" v-if="status !== 2">
-                <el-button style="width: 150px;" type="primary" size="mini" @click="save">淇濆瓨</el-button>
-                <el-button style="width: 150px;" size="mini" @click="out">閫�鍑�</el-button>
-                <el-input v-show="status !==2" v-model="rows" />
-                <el-input v-show="status !==2" v-model="cols" />
-                <el-button size="mini" v-show="status !==2" @click="createMap">鐢熸垚鍦板浘</el-button>
-                <div class="plant-name" v-if="status===2">{{plantName}}</div>
-                <el-input class="plant-name" v-if="status!==2" v-model="plantName" placeholder="璇疯緭鍏ュ巶鍚�"/>
+        <div class="map-container">
+            <div class="table-tool">
+                <slot name="tool"></slot>
+                <el-button v-show="!id" class="input" type="primary" size="mini" @click="out">閫�鍑�</el-button>
+                <el-button class="input" type="primary" size="mini" @click="save">淇濆瓨</el-button>
+                <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 class="input" v-show="status !==2" v-model="rows" />
+                <span>鍒楁暟:</span>
+                <el-input class="input" v-show="status !==2" v-model="cols" />
+                <!-- <div class="plant-name" v-if="status===2">{{plantName}}</div> -->
+                <el-input class="plant-name" v-model="plantName" placeholder="璇疯緭鍏ュ巶鍚�"/>
             </div>
-            <div class="table" >
+            <div class="table" :class="$route.name ==='preview' ? 'active' : ''" >
                 <div class="table-action" :style="position" v-show="showAction && status !== 2">
                     <div @click="merge">鍚堝苟</div>
                     <div @click="split">鎷嗗垎</div>
                     <div @click="sign(1)">杩囬亾</div>
                     <div @click="sign(2)">鏈哄簥</div>
                     <div @click="sign(0)">鍙栨秷</div>
-                    <!-- <div>澧炲姞琛�</div> -->
-                    <!-- <div>鍒犻櫎琛�</div> -->
-                    <!-- <div>澧炲姞鍒�</div> -->
-                    <!-- <div>鍒犻櫎鍒�</div> -->
                 </div>
-                <table>
-                    <tr v-for="(item, index) in mapNew" :key="index">
-                        <td v-if="v.rowspan !==0 && v.colspan!==0"
-                        :style="{
-                            'width': v.type ===1 ? '20px' : v.colspan * 20 + 'px!important',
-                            'height': v.type ===1 ? '20px' : v.rowspan * 20+ 'px!important'
-                        }"
-                        :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"
-                            :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" src="./img/+.png" alt="">
-                        </td>
-                        <!-- <td></td> -->
-                    </tr>
-                    <!-- <tr>
-                        <td></td>
-                    </tr> -->
-                </table>
+                <div :style="{width: (cols * height + 'px'),height: rows * height + 'px'}">
+                    <table >
+                        <tr v-for="(item, index) in map" :key="index">
+                            <td v-if="v.rowspan !==0 && v.colspan!==0"
+                            :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"
+                                :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="娣诲姞鏈哄簥" title="娣诲姞鏈哄簥">
+                                <Device v-if="v.id" :id="v.id" style="width: 100%;height: 100%;" :deviceList="deviceList"
+:plantDeviceList="plantDeviceList" ::info="info"></Device>
+                            </td>
+                        </tr>
+                    </table>
+                </div>
             </div>
         </div>
-        <div class="map-add" v-else>
-            <div class="map-add-item">
-                <span>缁熶竴缂栧彿</span>
-                <el-input class="value"></el-input>
-            </div>
-            <div class="map-add-item">
-                <span>璁惧鍚嶇О</span>
-                <el-input class="value"></el-input>
-            </div>
-            <div class="map-add-item">
-                <span>璁惧鍨嬪彿</span>
-                <el-input class="value"></el-input>
-            </div>
-            <div class="map-add-item">
-                <span>璁惧瑙勬牸</span>
-                <el-input class="value"></el-input>
-            </div>
-            <div class="map-add-item">
-                <span>浣跨敤鍗曚綅</span>
-                <el-input class="value"></el-input>
-            </div>
-            <div class="map-add-item">
-                <span>淇濆吇鑰�</span>
-                <el-input class="value"></el-input>
-            </div>
-            <div class="map-add-item">
-                <span>淇濆吇鍛ㄦ湡</span>
-                <el-input class="value"></el-input>
-            </div>
-            <div class="map-add-item">
-                <span>淇濆吇绫诲瀷</span>
-                <el-input class="value"></el-input>
-            </div>
-            <div class="map-add-item">
-                <span>鏄惁鍚堟牸</span>
-                <el-input class="value"></el-input>
-            </div>
-            <div class="map-add-item">
-                <span>璁″垝寮�濮嬫椂闂�</span>
-                <el-input class="value"></el-input>
-            </div>
-            <div class="map-add-item">
-                <span>璁″垝瀹屾垚鏃堕棿</span>
-                <el-input class="value"></el-input>
-            </div>
-            <div class="map-add-item">
-                <span>淇濆吇鍐呭涓庡瓨鍦ㄩ棶棰�</span>
-                <el-input class="value"></el-input>
-            </div>
-            <div class="map-add-footer">
-                <el-button size="mini" @click="close">鍏抽棴</el-button>
-                <el-button type="primary"  size="mini" @click="saveDevice">淇濆瓨</el-button>
-            </div>
-        </div>
+        <el-dialog
+        title="娣诲姞璁惧"
+        :close-on-click-modal="false"
+        width="20%"
+        :visible.sync="addStatus">
+        <el-select class="wkshoplist" clearable v-model="deviceId" placeholder="璇烽�夋嫨">
+            <el-option v-for="item in deviceList" :key="item.machineId" :label="item.machineName" :value="item.machineId">
+            </el-option>
+        </el-select>
+        <span slot="footer" class="dialog-footer">
+            <el-button size="mini" type="primary" style="background-color: #409EFF;" @click="saveDevice">淇濆瓨</el-button>
+        </span>
+      </el-dialog>
     </div>
-    
 </template>
 <script>
 const getParent = (v, layout) => {
@@ -113,12 +69,14 @@
     }
 }
 import mixins  from '@/mixins/index'
-import AddMachine from './addMachine.vue'
+// import AddMachine from './addMachine.vue'
+import Device from '../workshop/device.vue'
 import  {mapGetters} from 'vuex'
 export default {
     mixins: [mixins],
     components: {
-        AddMachine
+        // AddMachine,
+        Device
     },
     props: {
         status: {
@@ -132,13 +90,42 @@
             type: String,
         },
         id: {
-            type: Number
+            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: 10,
+            rows: 20,
             cols: 50,
             map: null, // 鍦板浘鏁版嵁
             addStatus: false,
@@ -192,13 +179,42 @@
             },
             immediate: true
         },
+        id (val) {
+            if (!val) {
+                this.map = []
+            }else {
+                // getRequest('machineList',{plantId: val}).then(res => {
+                //         this.plantDeviceList = res.list.map(item => {
+                //             return {
+                //                 machineId: item.id,
+                //                 machineName: item.machineName
+                //             }
+                //         }) || []
+                //     })
+            }
+        },
         currentMap: {
             handler () {
+                console.log(this.currentMap)
+                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
+        }
     },
     mounted() {
         this.$el.querySelector('table').addEventListener('contextmenu', this.contextmenu)
@@ -206,11 +222,11 @@
             if(this.status ===2) return 
             this.tdMounseDown = false
         })
-        if (this.id) {
-            // this.getmachineList()
-            this.rows = this.currentMap.length
-            this.cols = this.currentMap[0].length
+        try {
+            this.height = (document.querySelector('.table').getBoundingClientRect().height - 30) / 20
+        } catch (error) {
         }
+        console.log(this.$route.name)
     },
     beforeUpdate() {
         try {
@@ -228,26 +244,38 @@
         }
     },
     methods: {
-        createMap() {
-            let data = []
-            for (var i = 0; i < this.rows; i++) {
-                let arr = []
-                for (var j = 0; j < this.cols; j++) {
-                    arr.push({
-                        rowspan: 1,
-                        colspan: 1,
-                        rowIndex: i,
-                        colIndex: j,
-                        type: ''
-                    })
-                }
-                data.push(arr)
+        async createMap() {
+            let res=true
+            if (this.id) {
+                res = await this.$confirm('鐢熸垚鍦板浘灏嗚鐩栧綋鍓嶆墍鏈夎缃紝纭畾閲嶆柊鐢熸垚?', '鎻愮ず', {
+                    confirmButtonText: '纭畾',
+                    cancelButtonText: '鍙栨秷',
+                    type: 'warning'
+                })
+                console.log(res)
             }
-            this.map = data
+            if (res || res === 'confirm') {
+                let data = []
+                for (var i = 0; i < this.rows; i++) {
+                    let arr = []
+                    for (var j = 0; j < this.cols; j++) {
+                        arr.push({
+                            rowspan: 1,
+                            colspan: 1,
+                            rowIndex: i,
+                            colIndex: j,
+                            type: ''
+                        })
+                    }
+                    data.push(arr)
+                }
+                this.map = data
+            }
         },
         contextmenu(e) {
             console.log(e)
-            if(this.status ===2) return 
+            if(this.status ===2) return
+            if (this.range.x === undefined) return
             // if (this.range.x !=='') return 
             e.preventDefault()
             e.stopPropagation()
@@ -257,12 +285,12 @@
             if (window.innerWidth - left < 100) {
                 this.position = {
                     right: 0,
-                    top: top - t + 10 + 'px'
+                    top: top + 10 + 'px'
                 }
             } else {
                 this.position = {
                     left: left + 'px',
-                    top: top -t + 10 + 'px'
+                    top: top + 10 + 'px'
                 }
             }
             
@@ -332,6 +360,7 @@
                 for(var j=y;j<=y1;j++) {
                     let arr = [...(this.map[i])]
                     arr[j].type = type
+                    arr[j].id = undefined
                     this.$set(this.map,i,arr)
                 }
             }
@@ -339,26 +368,62 @@
             this.$forceUpdate()
         },
         addDevice (e,v) {
-            if(this.status ===2) return 
             e.stopPropagation()
             this.addStatus = true
+            this.deviceId = ''
             this.currentAdd =  v
         },
+        del () {
+            this.$confirm('纭畾瑕佹案涔呭垹闄ゆ鍘傛埧锛屽叧鑱旂殑璁惧灏嗛噸缃�?', '鎻愮ず', {
+                confirmButtonText: '纭畾',
+                cancelButtonText: '鍙栨秷',
+                type: 'warning'
+            }).then(res => {
+                this.$http.postJson('/plant/delete',{
+                    ids: [this.id]
+                }).then(res => {
+                    this.$message({
+                        type: 'info',
+                        message: '鍒犻櫎鎴愬姛'
+                    })
+                    this.$emit('out')
+                }).catch(() => {
+                    this.$message({
+                        type: 'info',
+                        message: '鍒犻櫎澶辫触'
+                    })
+                })
+            }, () => {
+                this.$message({
+                    type: 'info',
+                    message: '鍙栨秷鍒犻櫎'
+                })
+            })
+            
+        },
         save () {
-            if (this.status === 0) {
+            if (!this.id) {
                 this.$http.postJson('/plant/save',{
                     name: this.plantName,
                     gridSetting: JSON.stringify(this.map)
                 }).then(res => {
+                    this.$message({
+                    type: 'info',
+                        message: '鎿嶄綔鎴愬姛'
+                    })
                     this.$emit('out')
                     console.log(res)
                 })
-            } else if(this.status === 1) {
+            } else {
                 this.$http.postJson('/plant/modify',{
                     name: this.plantName,
                     gridSetting: JSON.stringify(this.map),
                     id: this.id
                 }).then(res => {
+                    this.$message({
+                    type: 'info',
+                        message: '鎿嶄綔鎴愬姛'
+                    })
                     this.$emit('out')
                     console.log(res)
                 })
@@ -371,20 +436,46 @@
         close () {
             this.addStatus = false
         },
+        saveDevice () {
+            this.setmachineId(this.deviceId)
+        },
         setmachineId (id) {
-            console.log(id)
             if (!id) return
-            let i = this.currentAdd.rowIndex
-            let j = this.currentAdd.colIndex
-            let arr = [...(this.map[i])];
-            arr[j].id = id
-            this.$set(this.map,i,arr)
-            this.close()
+            try {
+                let i = this.currentAdd.rowIndex
+                let j = this.currentAdd.colIndex
+                let arr = [...(this.map[i])];
+                arr[j].id = id
+                this.$set(this.map,i,arr)
+                this.$message({
+                    type: 'info',
+                    message: '鎿嶄綔鎴愬姛'
+                })
+            } catch (error) {
+                this.$message({
+                    type: 'info',
+                    message: '鎿嶄綔澶辫触锛岃閲嶈瘯'
+                })
+            }
+            this.addStatus = false
         }
     },
 }
 </script>
 <style lang="scss" scoped>
+
+@keyframes move {
+    0% {
+        // left: 100%;
+        // transform: translate(0,0);
+        // scrollTop: 0
+    }
+    100% {
+        // left: 100%;
+        // transform: translate(-100%,0);
+        // scrollTop: 100%
+    }
+}
 .map {
     width: 100%;
     height: 100%;
@@ -392,7 +483,8 @@
     .map-container {
         width: 100%;
         height: 100%;
-        overflow: auto;
+        padding: 20px;
+        overflow: hidden;
         position: relative;
         display: flex;
         flex-direction: column;
@@ -400,18 +492,21 @@
 }
 
 .table-tool {
-    padding: 10px 0;
+    padding-bottom: 50px;
     display: flex;
     justify-content: flex-start;
-
-    &>div {
-        width: 80px;
+    color: #fff;
+    font-size: 12px;
+    align-items: center;
+    &>.input {
+        min-width: 80px;
+        max-width: 200px;
         margin-inline: 10px;
     }
     .plant-name {
         width: 120px;
-        margin-left: auto;
-        margin-right: 30px;
+        margin-left: 20px;
+        // margin-right: 30px;
         text-align: center;
         line-height: 28px;
         background: rgba(23,38,67,0.6);
@@ -424,17 +519,22 @@
     }
 }
 
+.table.active {
+    // position: relative;
+    // left: 100%;
+    // animation: move 6s infinite alternate;
+}
 .table {
     // margin-top: 10px;
-    display: flex;
-    justify-content: flex-start;
-    overflow-y: scroll;
+    // display: flex;
+    // justify-content: flex-start;
     width: 100%;
-    padding: 20px;
     height: 100%;
     position: relative;
+    overflow-x: scroll;
+   
     .table-action {
-        position: absolute;
+        position: fixed;
         z-index: 999;
         color: #fff;
         width: 100px;
@@ -449,13 +549,12 @@
 
     table {
         width: 100%;
-        height: 100%;
-        
         border-collapse: collapse;
-        table-layout: fixed;
-        word-wrap: break-word;
+        // table-layout: fixed;
+        // word-wrap: break-word;
         overflow: hidden;
-        
+        border-radius: 10px;
+        // box-sizing: border-box;
         td {
             // width: 50px;
             // height: 50px;
@@ -463,11 +562,78 @@
             border: 1px solid #1662DB;
             vertical-align: middle;
             text-align: center;
-            img {
+            & > img {
                 width: 20px;
                 height: 20px;
                 cursor: pointer;
             }
+            .machine {
+                width: 100%;
+                height: 100%;
+                display: flex;
+                flex-direction: column;
+                & > p {
+                    margin-top: 20px;
+                    color: #E9FFFF;
+                    text-shadow: 0px 1px 11px #549BD4;
+                    background: linear-gradient(180deg, #9AFEFE 0%, #4B78CD 100%);
+                    -webkit-background-clip: text;
+                    -webkit-text-fill-color: transparent;
+                    text-align: center;
+                }
+                & > div {
+                    flex: 1 1 auto;
+                    margin-top: 20px;
+                    display: flex;
+                    align-items: center;
+                    margin-bottom: 20px;
+                    
+                    overflow: hidden;
+                    .img {
+                        width: 50%;
+                        height: 100%;
+                        margin-left: 20px;
+                        border: 1px solid #444C55;
+                        border-radius: 10px;
+                        position: relative;
+                        img {
+                            position: absolute;
+                            top: 50%;
+                            left: 50%;
+                            transform: translate(-50%, -50%);
+                            width: 80%;
+                        }
+                    }
+                    ul {
+                        flex: 1 1 auto;
+                        height: 100%;
+                        margin-left: 20px;
+                        list-style: none;
+                        display: flex;
+                        flex-direction: column;
+                        align-items: center;
+                        justify-content: space-around;
+                        li {
+                            width: 100%;
+                            display: flex;
+                            font-size: 12px;
+                            align-items: center;
+                            & > div {
+                                margin-left: 20px;;
+                            }
+                            p {
+                                color: #E9FFFF;
+                                text-shadow: 0px 1px 11px #549BD4;
+                            }
+                            img {
+                                width: 40px;
+                                height: 40px;
+                            }
+                        }
+                    }
+                }
+                
+            }
         }
         td.active {
             background: #68D9FF!important;

--
Gitblit v1.9.3