From 70b4bdc6f999c55b75138e013abf436100e9987b Mon Sep 17 00:00:00 2001 From: liudl <673013083@qq.com> Date: 星期一, 23 六月 2025 15:33:16 +0800 Subject: [PATCH] 修改手自动 --- Web/src/views/device/deviceMonitor/index.vue | 324 +++++++++++++++++++++++++++++------------------------ 1 files changed, 177 insertions(+), 147 deletions(-) diff --git a/Web/src/views/device/deviceMonitor/index.vue b/Web/src/views/device/deviceMonitor/index.vue index fa6d26f..f66cf15 100644 --- a/Web/src/views/device/deviceMonitor/index.vue +++ b/Web/src/views/device/deviceMonitor/index.vue @@ -1,50 +1,58 @@ <template> <el-container> - <el-aside style="width: auto;height: auto;"> + <el-aside style="width: auto; height: auto;"> <el-card class="box-card"> <div slot="header" class="linefix"> <span>杈撻�佺嚎</span> - <div class="lineStatus"></div> + <div :class="['lineStatus', stationValue.status ? 'device-status-0' : 'device-status-1']"></div> </div> <div class="choosefix"> - <el-select v-model="lineValue" placeholder="璇烽�夋嫨"> - <el-option v-for="item in lineOptions" :key="item.value" :label="item.label" - :value="item.value"> - </el-option> + <el-select v-model="lineValue" placeholder="璇烽�夋嫨" @change="handleLineChange('item', $event)"> + <el-option v-for="item in lineOptions" :key="item.id" :label="item.text" + :value="item.id"></el-option> </el-select> - <el-select v-model="stationValue" placeholder="璇烽�夋嫨" style="margin-top: 10px;"> - <el-option v-for="item in stationOptions" :key="item.value" :label="item.label" - :value="item.value"> + <el-select v-model="stationValue" placeholder="璇烽�夋嫨" style="margin-top: 10px;" filterable + value-key="stationNum"> + <el-option v-for="item in listStationsData" :key="item.id" :label="item.stationNum" + :value="item"> </el-option> </el-select> </div> <div class="lineValuefix"> - <el-form label-position="left" label-width="60px"> + <el-form label-position="left" label-width="80px"> <el-form-item label="浠诲姟鍙�"> - <el-input></el-input> + <el-input v-model="stationValue.taskNo"></el-input> </el-form-item> <el-form-item label="浠诲姟绫诲瀷"> - <el-input></el-input> + <el-select clearable v-model="stationValue.taskType" placeholder="璇烽�夋嫨浠诲姟绫诲瀷"> + <el-option v-for="(item, index) in dl('TaskTypeEnum')" :key="index" + :value="Number(item.value)" :label="`${item.name} [${item.value}]`"></el-option> + </el-select> </el-form-item> <el-form-item label="璧峰宸ヤ綅"> - <el-input></el-input> + <el-input v-model="stationValue.startLocatNo"></el-input> </el-form-item> <el-form-item label="鐩殑宸ヤ綅"> - <el-input></el-input> + <el-input v-model="stationValue.endLocatNo"></el-input> </el-form-item> <el-form-item label="鎵樼洏鐮�"> - <el-input></el-input> + <el-input v-model="stationValue.palletNo"></el-input> + </el-form-item> + <el-form-item label="PLC"> + <el-input v-model="stationValue.plc"></el-input> + </el-form-item> + <el-form-item label="WCS"> + <el-input v-model="stationValue.wcs"></el-input> </el-form-item> <el-form-item label="鐘舵��"> - <el-input></el-input> + <el-input :value="stationValue.status ? '鍦ㄧ嚎' : '绂荤嚎'" readonly></el-input> </el-form-item> </el-form> </div> <div class="lineButtonfix"> - <el-form label-position="left" label-width="60px"> + <el-form label-position="left" label-width="80px"> <el-form-item> - <el-button>鍐欏叆</el-button> - <el-button>璁剧疆</el-button> + <el-button @click="openDialog">璁剧疆</el-button> </el-form-item> </el-form> </div> @@ -52,143 +60,156 @@ </el-aside> <el-main style="padding: 0 0 0 5px;"> <div class="card-container"> - <el-card class="other-box-card" v-for="deviceInfo in deviceList" :key="deviceInfo.id"> + <el-card class="other-box-card" v-for="deviceInfo in listStackingMachineData" :key="deviceInfo.id"> <div slot="header" class="linefix"> - <span>{{ deviceInfo.name }}</span> + <span>{{ deviceInfo.text }}</span> <div - :class="['lineStatus', { 'device-status-0': deviceInfo.status === 0 }, { 'device-status-1': deviceInfo.status === 1 }]"> + :class="['lineStatus', { 'device-status-0': deviceInfo.status === true }, { 'device-status-1': deviceInfo.status === false }]"> </div> </div> <div class="otherValuefix"> - <el-form label-position="left" label-width="60px"> + <el-form label-position="left" label-width="80px"> <el-form-item label="浠诲姟鍙�"> - <el-input v-model="deviceInfo.taskNumber"></el-input> + <el-input v-model="deviceInfo.taskNo"></el-input> </el-form-item> <el-form-item label="浠诲姟绫诲瀷"> - <el-input></el-input> + <el-select clearable="" v-model="deviceInfo.taskType" placeholder="璇烽�夋嫨鐘舵��"> + <el-option v-for="(item, index) in dl('TaskTypeEnum')" :key="index" + :value="Number(item.value)" :label="`${item.name} [${item.value}] `" /> + </el-select> + </el-form-item> + <el-form-item label="璧峰宸ヤ綅"> + <el-input v-model="deviceInfo.startLocatNo"></el-input> + </el-form-item> + <el-form-item label="鐩殑宸ヤ綅"> + <el-input v-model="deviceInfo.endLocatNo"></el-input> + </el-form-item> + <el-form-item label="鎵樼洏鐮�"> + <el-input v-model="deviceInfo.palletNo"></el-input> </el-form-item> <el-form-item label="PLC"> - <el-input></el-input> + <el-input v-model="deviceInfo.plc"></el-input> </el-form-item> <el-form-item label="WCS"> - <el-input></el-input> + <el-input v-model="deviceInfo.wcs"></el-input> </el-form-item> <el-form-item label="鐘舵��"> - <el-input></el-input> + <el-input :value="deviceInfo.status ? '鍦ㄧ嚎' : '绂荤嚎'" readonly></el-input> </el-form-item> </el-form> </div> <div class="otherButtonfix"> <el-form label-position="left"> <el-form-item> - <el-button>鍐欏叆</el-button> - <el-button>璁剧疆</el-button> + <el-button @click="write(deviceInfo)">鍐欏叆</el-button> </el-form-item> </el-form> </div> </el-card> </div> </el-main> + <setting ref="settingDialogRef" :title="title" v-model:listStationsData="listStationsData" + v-model:stationValue="stationValue" /> </el-container> </template> <script lang="ts" setup> -import { ref, reactive } from 'vue'; +import { ref, onMounted } from 'vue'; +import { listWcsDevice, writeValue } from '/@/api/wcs/wcsDevice'; +import { getDictDataItem as di, getDictDataList as dl } from '/@/utils/dict-utils'; +import { listWcsPlc } from '/@/api/wcs/wcsPlc'; +import { ElMessageBox, ElMessage } from 'element-plus'; +import setting from '/@/views/device/deviceMonitor/component/setting.vue' +import { signalR,stopConnection } from './signalR'; +//杩炴帴signalR 鐩戝惉鍙樻洿 +onMounted(async () => { + signalR.off('PublicPlcDevice'); + signalR.on('PublicPlcDevice', (data: any) => { + //todo 闇�瑕佹祴璇� + if (data.type == 0) { + var index = listStackingMachineData.value.findIndex(s => s.id == data.id); + if (index !== -1) { + listStackingMachineData.value.splice(index, 1, data); + } + } + else if (data.type == 1) { + lineOptions.value.forEach(s => { + var index = stations.value[s.id].findIndex(s => s.id == data.id); + if (index !== -1) { + stations.value[s.id].splice(index, 1, data); + } + }); + if (stationValue.value.id == data.id) { + stationValue.value = data; + } + } + }); +}); -const lineOptions = [{ - value: '001', - label: '涓�妤艰緭閫佺嚎' -}, { - value: '002', - label: '浜屾ゼ杈撻�佺嚎' -}, { - value: '003', - label: '涓夋ゼ杈撻�佺嚎' -}]; -const lineValue = '001'; - -const stationOptions = [{ - value: '200', - label: '200' -}, { - value: '202', - label: '202' -}, { - value: '300', - label: '300' -}]; -const stationValue = '200'; - - -const deviceList = [ - { - id: 1, - name: '1鍙风爜鍨涙満鍣ㄤ汉', - taskNumber: 'T000001', - taskType: '', - plc: '', - wcs: '', - status: 0 - }, - { - id: 2, - name: '2鍙风爜鍨涙満鍣ㄤ汉', - taskNumber: '', - taskType: '', - plc: '', - wcs: '', - status: 1 - }, - { - id: 3, - name: '3鍙风爜鍨涙満鍣ㄤ汉', - taskNumber: '', - taskType: '', - plc: '', - wcs: '', - status: 0 - }, { - id: 4, - name: '4鍙风爜鍨涙満鍣ㄤ汉', - taskNumber: '', - taskType: '', - plc: '', - wcs: '', - status: 1 - }, { - id: 5, - name: '5鍙风爜鍨涙満鍣ㄤ汉', - taskNumber: '', - taskType: '', - plc: '', - wcs: '', - status: 0 - }, { - id: 6, - name: '6鍙风爜鍨涙満鍣ㄤ汉', - taskNumber: '', - taskType: '', - plc: '', - wcs: '', - status: 0 - }, { - id: 7, - name: '7鍙风爜鍨涙満鍣ㄤ汉', - taskNumber: '', - taskType: '', - plc: '', - wcs: '', - status: '' - }, { - id: 8, - name: '8鍙风爜鍨涙満鍣ㄤ汉', - taskNumber: '', - taskType: '', - plc: '', - wcs: '', - status: 0 +const stations = ref<any>([]); +const listStationsData = ref<any>([]); +const listStackingMachineData = ref<any>([]); +const lineOptions = ref<any>([]); +const lineValue = ref(1); +const title = ref<string>(''); +const stationValue = ref<any>({ + taskNo: '', + taskType: '', + startLocatNo: '', + endLocatNo: '', + plc: '', + wcs: '', + status: false +}); +const settingDialogRef = ref(); +// 鎵撳紑鎵撳嵃椤甸潰 +const openDialog = async () => { + settingDialogRef.value.openDialog(stationValue); +} +const write = async (row: any) => { + await writeValue(row); + ElMessage.success('鍐欏叆鎴愬姛锛�'); +} +// 鏌ヨ鎿嶄綔 +const handleQuery = async () => { + const listplc = await listWcsPlc({ type: 1 }); + lineOptions.value = listplc.data.result; + lineValue.value = listplc.data.result[0].id; + const res = await listWcsDevice(); + listStackingMachineData.value = res.data.result.filter(s => s.type == 0); + const listConveyorLineData = res.data.result.filter(s => s.type == 1); + listplc.data.result.forEach(s => { + stations.value[s.id] = listConveyorLineData.filter(c => c.plcId === s.id) + }); + if (stations.value[lineValue.value].length > 0) { + listStationsData.value = stations.value[lineValue.value]; + stationValue.value = listStationsData.value[0]; } -] + else { + listStationsData.value = []; + stationValue.value = { + stationNum: '', + taskNo: '', + taskType: '', + startLocatNo: '', + endLocatNo: '', + plc: '', + wcs: '', + status: false + }; + } + title.value = listStationsData.value[0].text; +}; + +handleQuery(); + +const handleLineChange = (field: string, value: number) => { + listStationsData.value = stations.value[value]; + title.value = lineOptions.value.filter(s => s.id == value)[0].text; + if (listStationsData.value.length > 0) + stationValue.value = listStationsData.value[0]; +}; + </script> <style scoped> @@ -196,77 +217,94 @@ font-size: 14px; } -.item { - margin-bottom: 18px; +.el-form-item--small { + margin-bottom: 10px; +} + +.el-button { + background-color: #fff; + border-color: #fff; + color: #000000; } .linefix { border-bottom: 1px solid rgb(197, 195, 195); display: flex; align-items: center; - height: 40px; + height: 30px; position: relative; } .lineStatus { position: absolute; right: 0; - float: right; height: 20px; width: 20px; - border-radius: 20px; + border-radius: 50%; background-color: #67C23A; } .choosefix { width: 100%; - height: auto; padding: 10px; border-bottom: 1px solid rgb(197, 195, 195); } .box-card { - width: 280px; + width: 100%; + max-width: 280px; + background: linear-gradient(135deg, #66ccff, #3399ff); + border-radius: 10px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); + color: #fff; } .lineValuefix { width: 100%; - height: 500px; padding: 10px; border-bottom: 1px solid rgb(197, 195, 195); } .lineButtonfix { width: 100%; - height: 50px; display: flex; - align-items: center; + justify-content: space-between; + padding: 10px; } .otherValuefix { width: 100%; - height: 220px; padding: 10px; border-bottom: 1px solid rgb(197, 195, 195); + display: flex; + flex-direction: column; + gap: 10px; + /* Optional, for spacing between form items */ } .card-container { display: grid; - grid-template-columns: repeat(4, 1fr); + grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 10px; } .other-box-card { box-sizing: border-box; + background: linear-gradient(135deg, #66ccff, #3399ff); + border-radius: 10px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); + color: #fff; + display: flex; + flex-direction: column; + height: auto; + /* Ensure card height adjusts based on content */ } .otherButtonfix { width: 100%; - height: 50px; display: flex; - align-items: center; justify-content: center; - padding: 0; + padding: 10px; } .device-status-0 { @@ -275,14 +313,6 @@ .device-status-1 { background-color: red; -} - -.box-card, -.other-box-card { - background: linear-gradient(135deg, #66ccff, #3399ff); - border-radius: 10px; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); - color: #fff; } .linefix span { -- Gitblit v1.8.0