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