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