wu
2024-09-26 1f9b919d9eabf39f388b9827f2042dca3603152c
更新页面和后台推送数据
8个文件已修改
3 文件已重命名
10个文件已添加
1920 ■■■■■ 已修改文件
JiuMuMesParent/gateway/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
JiuMuMesParent/gateway/target/classes/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
JiuMuMesParent/moduleService/DeviceInteractionModule/src/main/java/com/mes/job/PLCCleaning.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
JiuMuMesParent/moduleService/DeviceInteractionModule/src/main/java/com/mes/job/PLCEdging.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
JiuMuMesParent/moduleService/DeviceInteractionModule/src/main/java/com/mes/job/PLCFlipSlice.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
JiuMuMesParent/moduleService/DeviceInteractionModule/src/main/java/com/mes/job/PLCScanQrCodesReport.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
JiuMuMesParent/moduleService/DeviceInteractionModule/src/main/resources/application-prod.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
JiuMuMesParent/moduleService/DeviceInteractionModule/target/classes/application-prod.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/上片机.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/扫码识别.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/清洗机.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/磨边扫码.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/翻片台.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/lang/zh.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/router/index.js 251 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Cleaning/cleaning.vue 301 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Edging/edging.vue 298 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/FlipSlice/flipSlice.vue 333 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/MechanicalArm/mechanicalArm.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/ScanQrCodesIdentify/scanQrCodesIdentify.vue 314 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/ScanQrCodesReport/scanQrCodesReport.vue 298 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
JiuMuMesParent/gateway/src/main/resources/application.yml
@@ -6,7 +6,7 @@
  cloud:
    nacos:
      discovery:
        server-addr: 10.153.19.29:8848
        server-addr: 10.153.19.44:8848
    gateway:
      discovery:
        locator:
JiuMuMesParent/gateway/target/classes/application.yml
@@ -6,7 +6,7 @@
  cloud:
    nacos:
      discovery:
        server-addr: 10.153.19.29:8848
        server-addr: 10.153.19.44:8848
    gateway:
      discovery:
        locator:
JiuMuMesParent/moduleService/DeviceInteractionModule/src/main/java/com/mes/job/PLCCleaning.java
File was renamed from JiuMuMesParent/moduleService/DeviceInteractionModule/src/main/java/com/mes/job/PLCRinse.java
@@ -3,7 +3,9 @@
import cn.hutool.json.JSONObject;
import com.mes.common.S7object;
import com.mes.device.PlcParameterObject;
import com.mes.md.entity.Machine;
import com.mes.md.entity.Tasking;
import com.mes.md.mapper.MachineMapper;
import com.mes.md.service.TaskingService;
import com.mes.tools.WebSocketServer;
import lombok.extern.slf4j.Slf4j;
@@ -20,11 +22,13 @@
 */
@Component
@Slf4j
public class PLCRinse {
public class PLCCleaning {
    PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject;
    @Autowired
    TaskingService taskingService;
    @Autowired
    MachineMapper machineMapper;
    //@Scheduled(fixedDelay = 500)
    public void plcRinse() {
        //磨边线速度
@@ -35,16 +39,20 @@
        }
    }
    //@Scheduled(fixedDelay = 1000)
    @Scheduled(fixedDelay = 1000)
    public void edgingWeb() {
        //获取报警状态
        String warning = plcParameterObject.getPlcParameter("rinseWarning").getValue();
        JSONObject jsonObject = new JSONObject();
        if (!Objects.equals(warning, "0")) {
            //log.info("报警信息:"+warning);
            jsonObject.append("rinseWarning", warning);
        }
        ArrayList<WebSocketServer> sendwServer = WebSocketServer.sessionMap.get("rinse");
//        String warning = plcParameterObject.getPlcParameter("rinseWarning").getValue();
//        if (!Objects.equals(warning, "0")) {
//            //log.info("报警信息:"+warning);
//            jsonObject.append("rinseWarning", warning);
//        }
        Machine machine=machineMapper.selectById(7L);
        List<Tasking> taskingList=taskingService.findMachineTask(machine);
        jsonObject.append("taskingList", taskingList);
        jsonObject.append("machine", machine);
        ArrayList<WebSocketServer> sendwServer = WebSocketServer.sessionMap.get("cleaning");
        if (sendwServer != null) {
            for (WebSocketServer webserver : sendwServer) {
                if (webserver != null) {
JiuMuMesParent/moduleService/DeviceInteractionModule/src/main/java/com/mes/job/PLCEdging.java
@@ -3,7 +3,9 @@
import cn.hutool.json.JSONObject;
import com.mes.common.S7object;
import com.mes.device.PlcParameterObject;
import com.mes.md.entity.Machine;
import com.mes.md.entity.Tasking;
import com.mes.md.mapper.MachineMapper;
import com.mes.md.service.TaskingService;
import com.mes.tools.WebSocketServer;
import lombok.extern.slf4j.Slf4j;
@@ -25,6 +27,8 @@
    PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject;
    @Autowired
    TaskingService taskingService;
    @Autowired
    MachineMapper machineMapper;
    //@Scheduled(fixedDelay = 500)
    public void PLCEdging() {
        //磨边进片请求信号
@@ -49,17 +53,25 @@
        }
    }
    //@Scheduled(fixedDelay = 1000)
    @Scheduled(fixedDelay = 1000)
    public void edgingWeb() {
        //获取当前任务表最新的一块任务状态
        //获取报警状态
        String warning = plcParameterObject.getPlcParameter("warning").getValue();
        JSONObject jsonObject = new JSONObject();
        if (!Objects.equals(warning, "0")) {
            //log.info("报警信息:"+warning);
            jsonObject.append("warning", warning);
        }
        ArrayList<WebSocketServer> sendwServer = WebSocketServer.sessionMap.get("scanQrCode");
//        String warning = plcParameterObject.getPlcParameter("warning").getValue();
//        if (!Objects.equals(warning, "0")) {
//            //log.info("报警信息:"+warning);
//            jsonObject.append("warning", warning);
//        }
        Machine machine=machineMapper.selectById(5L);
        List<Tasking> taskingList=taskingService.findMachineTask(machine);
        jsonObject.append("taskingList", taskingList);
        jsonObject.append("machine", machine);
        Machine machineQr=machineMapper.selectById(3L);
        List<Tasking> taskingListQr=taskingService.findMachineTask(machineQr);
        jsonObject.append("taskingListQr",taskingListQr );
        jsonObject.append("machineQR",machineQr );
        ArrayList<WebSocketServer> sendwServer = WebSocketServer.sessionMap.get("edging");
        if (sendwServer != null) {
            for (WebSocketServer webserver : sendwServer) {
                if (webserver != null) {
JiuMuMesParent/moduleService/DeviceInteractionModule/src/main/java/com/mes/job/PLCFlipSlice.java
File was renamed from JiuMuMesParent/moduleService/DeviceInteractionModule/src/main/java/com/mes/job/PLCTurn.java
@@ -3,7 +3,9 @@
import cn.hutool.json.JSONObject;
import com.mes.common.S7object;
import com.mes.device.PlcParameterObject;
import com.mes.md.entity.Machine;
import com.mes.md.entity.Tasking;
import com.mes.md.mapper.MachineMapper;
import com.mes.md.service.TaskingService;
import com.mes.tools.WebSocketServer;
import lombok.extern.slf4j.Slf4j;
@@ -20,11 +22,13 @@
 */
@Component
@Slf4j
public class PLCTurn {
public class PLCFlipSlice {
    PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject;
    @Autowired
    TaskingService taskingService;
    @Autowired
    MachineMapper machineMapper;
    //@Scheduled(fixedDelay = 500)
    public void plcTurn() {
        //清洗机速度
@@ -35,16 +39,21 @@
        }
    }
    //@Scheduled(fixedDelay = 1000)
    @Scheduled(fixedDelay = 1000)
    public void turnWeb() {
        //获取报警状态
        String warning = plcParameterObject.getPlcParameter("turnWarning").getValue();
        JSONObject jsonObject = new JSONObject();
        if (!Objects.equals(warning, "0")) {
            //log.info("报警信息:"+warning);
            jsonObject.append("turnWarning", warning);
        }
        ArrayList<WebSocketServer> sendwServer = WebSocketServer.sessionMap.get("turn");
//        String warning = plcParameterObject.getPlcParameter("turnWarning").getValue();
//
//        if (!Objects.equals(warning, "0")) {
//            //log.info("报警信息:"+warning);
//            jsonObject.append("turnWarning", warning);
//        }
        Machine machine=machineMapper.selectById(25L);
        List<Tasking> taskingList=taskingService.findMachineTask(machine);
        jsonObject.append("taskingList", taskingList);
        jsonObject.append("machine", machine);
        ArrayList<WebSocketServer> sendwServer = WebSocketServer.sessionMap.get("flipSlice");
        if (sendwServer != null) {
            for (WebSocketServer webserver : sendwServer) {
                if (webserver != null) {
JiuMuMesParent/moduleService/DeviceInteractionModule/src/main/java/com/mes/job/PLCScanQrCodesReport.java
File was renamed from JiuMuMesParent/moduleService/DeviceInteractionModule/src/main/java/com/mes/job/PLCScanQR.java
@@ -1,12 +1,13 @@
package com.mes.job;
import cn.hutool.json.JSONObject;
import com.mes.common.S7object;
import com.mes.md.entity.Machine;
import com.mes.md.entity.Tasking;
import com.mes.md.mapper.MachineMapper;
import com.mes.md.service.TaskingService;
import com.mes.tools.WebSocketServer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import com.mes.device.PlcParameterObject;
@@ -19,11 +20,13 @@
 */
@Component
@Slf4j
public class PLCScanQR {
public class PLCScanQrCodesReport {
    PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject;
    @Autowired
    TaskingService taskingService;
    @Autowired
    MachineMapper machineMapper;
    //@Scheduled(fixedDelay = 500)
    public void pLCScanQR() {
        //获取当前任务表最新的一块任务状态
@@ -42,17 +45,22 @@
        }
    }
    //@Scheduled(fixedDelay = 1000)
//    @Scheduled(fixedDelay = 1000)
    public void scanQrCode() {
        //获取当前任务表最新的一块任务状态
        //获取报警状态
        String warning = plcParameterObject.getPlcParameter("warning").getValue();
        JSONObject jsonObject = new JSONObject();
        if (!Objects.equals(warning, "0")) {
            //log.info("报警信息:"+warning);
            jsonObject.append("warning", warning);
        }
        ArrayList<WebSocketServer> sendwServer = WebSocketServer.sessionMap.get("scanQrCode");
        //获取报警状态
//        String warning = plcParameterObject.getPlcParameter("warning").getValue();
//        if (!Objects.equals(warning, "0")) {
//            //log.info("报警信息:"+warning);
//            jsonObject.append("warning", warning);
//        }
        Machine machine=machineMapper.selectById(25L);
        List<Tasking> taskingList=taskingService.findMachineTask(machine);
        jsonObject.append("taskingList", taskingList);
        jsonObject.append("machine", machine);
        ArrayList<WebSocketServer> sendwServer = WebSocketServer.sessionMap.get("scanQrCodesReport");
        if (sendwServer != null) {
            for (WebSocketServer webserver : sendwServer) {
                if (webserver != null) {
JiuMuMesParent/moduleService/DeviceInteractionModule/src/main/resources/application-prod.yml
@@ -12,11 +12,11 @@
  cloud:
    nacos:
      discovery:
        server-addr: 10.153.19.29:8848
        server-addr: 10.153.19.44:8848
  application:
    name: deviceInteraction
  redis:
    database: 0
    host: 10.153.19.29
    host: 10.153.19.44
    port: 6379
    password: 123456
JiuMuMesParent/moduleService/DeviceInteractionModule/target/classes/application-prod.yml
@@ -12,11 +12,11 @@
  cloud:
    nacos:
      discovery:
        server-addr: 10.153.19.29:8848
        server-addr: 10.153.19.44:8848
  application:
    name: deviceInteraction
  redis:
    database: 0
    host: 10.153.19.29
    host: 10.153.19.44
    port: 6379
    password: 123456
UI-Project/src/assets/ÉÏÆ¬»ú.png
UI-Project/src/assets/ɨÂëʶ±ð.png
UI-Project/src/assets/ÇåÏ´»ú.png
UI-Project/src/assets/Ä¥±ßɨÂë.png
UI-Project/src/assets/·­Æ¬Ì¨.png
UI-Project/src/lang/zh.js
@@ -147,6 +147,7 @@
    machine: {
        upperSlice:'自动上片机',
        scanQrCodesIdentify:'扫码识别',
        scanQredging:'扫码磨边',
        edging:'磨边机',
        cleaning:'清洗机',
        flipSlice:'翻片台',
UI-Project/src/router/index.js
@@ -25,14 +25,14 @@
      children: [
        {
          /*----------- è‡ªåŠ¨ä¸Šç‰‡ ----------------*/
          path: 'UpperSlice',
          name: 'upperSlice',
          component: () => import('../views/UpperSlice/upperSlice.vue'),
          path: 'MechanicalArm',
          name: 'mechanicalArm',
          component: () => import('../views/MechanicalArm/mechanicalArm.vue'),
          children: [
            {
              path: '/UpperSlice/upperSlice',
              name: 'upperSlice',
              component: () => import('../views/UpperSlice/upperSlice.vue'),
              path: '/mechanicalArm/mechanicalArm',
              name: 'mechanicalArm',
              component: () => import('../views/MechanicalArm/mechanicalArm.vue'),
            }
          ]
        },
@@ -74,10 +74,10 @@
              component: () => import('../views/Cleaning/cleaning.vue'),
            }
          ]
        },flipSlice
        },
        {
          /*----------- ç¿»ç‰‡å° ----------------*/
          path: 'FlipSlice',
          path: 'FlipSlice',
          name: 'flipSlice',
          component: () => import('../views/FlipSlice/flipSlice.vue'),
          children: [
@@ -89,122 +89,135 @@
          ]
        },
        {
          /*----------- æ‰«ç 2 ----------------*/
          path: 'ScanQrCodesVerify',
          name: 'scanQrCodesVerify',
          component: () => import('../views/ScanQrCodesVerify/scanQrCodesVerify.vue'),
          /*----------- ç¿»ç‰‡å° ----------------*/
          path: 'ScanQrCodesReport',
          name: 'scanQrCodesReport',
          component: () => import('../views/ScanQrCodesReport/scanQrCodesReport.vue'),
          children: [
            {
              path: '/ScanQrCodesVerify/scanQrCodesVerify',
              name: 'scanQrCodesVerify',
              component: () => import('../views/ScanQrCodesVerify/scanQrCodesVerify.vue'),
              path: '/ScanQrCodesReport/scanQrCodesReport',
              name: 'scanQrCodesReport',
              component: () => import('../views/ScanQrCodesReport/scanQrCodesReport.vue'),
            }
          ]
        },
        {
          /*----------- è‡ªåŠ¨æ‰“æ ‡æœº ----------------*/
          path: 'Marking',
          name: 'marking',
          component: () => import('../views/Marking/marking.vue'),
          children: [
            {
              path: '/Marking/marking',
              name: 'marking',
              component: () => import('../views/Marking/marking.vue'),
            }
          ]
        },
        {
          /*----------- è‡ªåŠ¨ä¸å°æœº ----------------*/
          path: 'SilkScreen',
          name: 'silkScreen',
          component: () => import('../views/SilkScreen/silkScreen.vue'),
          children: [
            {
              path: '/SilkScreen/silkScreen',
              name: 'silkScreen',
              component: () => import('../views/SilkScreen/silkScreen.vue'),
            }
          ]
        },
        {
          /*----------- è‡ªåŠ¨ç‚¹èƒ¶æœº ----------------*/
          path: 'GlueDispenser',
          name: 'glueDispenser',
          component: () => import('../views/GlueDispenser/glueDispenser.vue'),
          children: [
            {
              path: '/GlueDispenser/glueDispenser',
              name: 'glueDispenser',
              component: () => import('../views/GlueDispenser/glueDispenser.vue'),
            }
          ]
        },
        {
          /*----------- çƒ˜å¹²çº¿ ----------------*/
          path: 'Drying',
          name: 'drying',
          component: () => import('../views/Drying/drying.vue'),
          children: [
            {
              path: '/Drying/drying',
              name: 'drying',
              component: () => import('../views/Drying/drying.vue'),
            }
          ]
        },
        {
          /*----------- æ—‹è½¬å° ----------------*/
          path: 'Rotate',
          name: 'rotate',
          component: () => import('../views/Rotate/rotate.vue'),
          children: [
            {
              path: '/Rotate/rotate',
              name: 'rotate',
              component: () => import('../views/Rotate/rotate.vue'),
            }
          ]
        },
        {
          /*----------- è‡ªåŠ¨è´´è†œæœº ----------------*/
          path: 'Lamination',
          name: 'lamination',
          component: () => import('../views/Lamination/lamination.vue'),
          children: [
            {
              path: '/Lamination/lamination',
              name: 'lamination',
              component: () => import('../views/Lamination/lamination.vue'),
            }
          ]
        },
        {
          /*----------- æŠ¥å·¥ç®¡ç† ----------------*/
          path: 'ZiDongShangpian',
          name: 'zidongshangpian',
          component: () => import('../views/Marking/marking.vue'),
          children: [
            {
              path: '/Marking/marking',
              name: 'marking',
              component: () => import('../views/Marking/marking.vue'),
            }
          ]
        },
        {
          /*----------- æŠ¥è¡¨ç®¡ç† ----------------*/
          path: 'ZiDongShangpian',
          name: 'zidongshangpian',
          component: () => import('../views/Marking/marking.vue'),
          children: [
            {
              path: '/Marking/marking',
              name: 'marking',
              component: () => import('../views/Marking/marking.vue'),
            }
          ]
        },
        // {
        //   /*----------- æ‰«ç 2 ----------------*/
        //   path: 'ScanQrCodesVerify',
        //   name: 'scanQrCodesVerify',
        //   component: () => import('../views/ScanQrCodesVerify/scanQrCodesVerify.vue'),
        //   children: [
        //     {
        //       path: '/ScanQrCodesVerify/scanQrCodesVerify',
        //       name: 'scanQrCodesVerify',
        //       component: () => import('../views/ScanQrCodesVerify/scanQrCodesVerify.vue'),
        //     }
        //   ]
        // },
        // {
        //   /*----------- è‡ªåŠ¨æ‰“æ ‡æœº ----------------*/
        //   path: 'Marking',
        //   name: 'marking',
        //   component: () => import('../views/Marking/marking.vue'),
        //   children: [
        //     {
        //       path: '/Marking/marking',
        //       name: 'marking',
        //       component: () => import('../views/Marking/marking.vue'),
        //     }
        //   ]
        // },
        // {
        //   /*----------- è‡ªåŠ¨ä¸å°æœº ----------------*/
        //   path: 'SilkScreen',
        //   name: 'silkScreen',
        //   component: () => import('../views/SilkScreen/silkScreen.vue'),
        //   children: [
        //     {
        //       path: '/SilkScreen/silkScreen',
        //       name: 'silkScreen',
        //       component: () => import('../views/SilkScreen/silkScreen.vue'),
        //     }
        //   ]
        // },
        // {
        //   /*----------- è‡ªåŠ¨ç‚¹èƒ¶æœº ----------------*/
        //   path: 'GlueDispenser',
        //   name: 'glueDispenser',
        //   component: () => import('../views/GlueDispenser/glueDispenser.vue'),
        //   children: [
        //     {
        //       path: '/GlueDispenser/glueDispenser',
        //       name: 'glueDispenser',
        //       component: () => import('../views/GlueDispenser/glueDispenser.vue'),
        //     }
        //   ]
        // },
        // {
        //   /*----------- çƒ˜å¹²çº¿ ----------------*/
        //   path: 'Drying',
        //   name: 'drying',
        //   component: () => import('../views/Drying/drying.vue'),
        //   children: [
        //     {
        //       path: '/Drying/drying',
        //       name: 'drying',
        //       component: () => import('../views/Drying/drying.vue'),
        //     }
        //   ]
        // },
        // {
        //   /*----------- æ—‹è½¬å° ----------------*/
        //   path: 'Rotate',
        //   name: 'rotate',
        //   component: () => import('../views/Rotate/rotate.vue'),
        //   children: [
        //     {
        //       path: '/Rotate/rotate',
        //       name: 'rotate',
        //       component: () => import('../views/Rotate/rotate.vue'),
        //     }
        //   ]
        // },
        // {
        //   /*----------- è‡ªåŠ¨è´´è†œæœº ----------------*/
        //   path: 'Lamination',
        //   name: 'lamination',
        //   component: () => import('../views/Lamination/lamination.vue'),
        //   children: [
        //     {
        //       path: '/Lamination/lamination',
        //       name: 'lamination',
        //       component: () => import('../views/Lamination/lamination.vue'),
        //     }
        //   ]
        // },
        // {
        //   /*----------- æŠ¥å·¥ç®¡ç† ----------------*/
        //   path: 'ZiDongShangpian',
        //   name: 'zidongshangpian',
        //   component: () => import('../views/Marking/marking.vue'),
        //   children: [
        //     {
        //       path: '/Marking/marking',
        //       name: 'marking',
        //       component: () => import('../views/Marking/marking.vue'),
        //     }
        //   ]
        // },
        // {
        //   /*----------- æŠ¥è¡¨ç®¡ç† ----------------*/
        //   path: 'ZiDongShangpian',
        //   name: 'zidongshangpian',
        //   component: () => import('../views/Marking/marking.vue'),
        //   children: [
        //     {
        //       path: '/Marking/marking',
        //       name: 'marking',
        //       component: () => import('../views/Marking/marking.vue'),
        //     }
        //   ]
        // },
        /*----------- ç³»ç»Ÿç®¡ç† ----------------*/
        {
          path: 'User',
UI-Project/src/views/Cleaning/cleaning.vue
New file
@@ -0,0 +1,301 @@
<!--  æ‰“标机  -->
<script setup>
import request from "@/utils/request";
import { ElMessage, ElMessageBox } from "element-plus";
import { reactive, ref, onMounted, onBeforeUnmount,onUnmounted } from 'vue'
import { useI18n } from 'vue-i18n'
import { WebSocketHost ,host} from '@/utils/constants'
import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService';
let language = ref(localStorage.getItem('lang') || 'zh')
const { t } = useI18n()
const requestData = reactive({
  account: '',
  password: '',
});
const loadData = ref([]);
const findMachine = ref([]);
const machineId=7;//当前页面的设备ID
//使用WebSocket方式展示数据
let socket = null;
const socketUrl = `ws://${WebSocketHost}:${host}/api/deviceInteraction/api/talk/cleaning`;
// å®šä¹‰æ¶ˆæ¯å¤„理函数,更新 receivedData å˜é‡
const handleMessage = (data) => {
  // æ›´æ–° tableData çš„æ•°æ®
  loadData.value = data.taskingList[0];
  findMachine.value = data.machine[0];
  // console.log(data);
};
onUnmounted(() => {
  if (socket) {
    closeWebSocket(socket);
  }
});
onBeforeUnmount(() => {
  console.log("关闭了")
  closeWebSocket();
});
onMounted(async () => {
  //使用WebSocket方式展示数据
  socket = initializeWebSocket(socketUrl, handleMessage);// åˆå§‹åŒ– WebSocket,并传递消息处理函数
  //使用接口方式展示数据
  //load();
});
// //获取数据
// const load = async() => {
//   //获取设备任务数据
//   try {
//     const response = await request.post('/deviceInteraction/tasking/findMachineTask',
//     {
//       "id": 11
//     }); // æ›¿æ¢ä¸ºä½ çš„API端点
//     if (response.code === 200) {
//       loadData.value.findTaskingData= response.data;
//     } else {
//       ElMessage.warning(res.msg)
//     }
//   } catch (error) {
//     // console.error('Error fetching rects :', error);
//   }
//   //获取设备状态
//   try {
//     const response = await request.post('/deviceInteraction/machine/findMachine',
//     {
//       "id": 11
//     }); // æ›¿æ¢ä¸ºä½ çš„API端点
//     if (response.code === 200) {
//       findMachine.value= response.data;
//     } else {
//       ElMessage.warning(res.msg)
//     }
//   } catch (error) {
//     // console.error('Error fetching rects :', error);
//   }
// }
//修改工作状态 ã€å¤±è´¥/正在工作/完工】
const workStatus = async(row,state) => {
  let url;
  if(state=="重发"){
    url="/deviceInteraction/tasking/loseMachineTask";
  }else if(state=="正在工作"){
    url="/deviceInteraction/tasking/startMachineTask";
  }else if(state=="完工"){
    url="/deviceInteraction/tasking/finishMachineTask";
  }else{
    return;
  }
  ElMessageBox.confirm(
        t('functionState.tips'),
        t('delivery.prompt'),
        {
          confirmButtonText: t('functionState.sure'),
          cancelButtonText: t('functionState.cancel'),
          type: 'warning',
        }
      )
        .then(() => {
          //开始修改
          request.post(url,
            {
              "id": machineId
            }).then((res) => { // æ›¿æ¢ä¸ºä½ çš„API端点
              if (res.code === 200) {
                ElMessage.success(res.message);
              } else {
                ElMessage.warning(res.message)
              }
            })
        })
        .catch(() => {
          ElMessage({
            type: 'info',
            message: t('functionState.cancel'),
          })
        })
}
//开工/暂停
const machineStatus = async(state) => {
  ElMessageBox.confirm(
        t('functionState.tips'),
        t('delivery.prompt'),
        {
          confirmButtonText: t('functionState.sure'),
          cancelButtonText: t('functionState.cancel'),
          type: 'warning',
        }
      )
        .then(() => {
          //下线接口
          request.post("/deviceInteraction/machine/updateMachineState",
            {
              "id": machineId,
              "state": state
            }).then((res) => { // æ›¿æ¢ä¸ºä½ çš„API端点
              if (res.code === 200) {
                ElMessage.success(res.message);
              } else {
                ElMessage.warning(res.message)
              }
            })
        })
        .catch(() => {
          ElMessage({
            type: 'info',
            message: t('functionState.cancel'),
          })
        })
}
//破损
const damagedTask = async(row) => {
  ElMessageBox.confirm(
        t('functionState.tips'),
        t('delivery.prompt'),
        {
          confirmButtonText: t('functionState.sure'),
          cancelButtonText: t('functionState.cancel'),
          type: 'warning',
        }
      )
        .then(() => {
          //下线接口
          request.post("/deviceInteraction/tasking/damagedTask",
            {
              "glassId": row.glassId
            }).then((res) => { // æ›¿æ¢ä¸ºä½ çš„API端点
              if (res.code === 200) {
                ElMessage.success(res.message);
              } else {
                ElMessage.warning(res.message)
              }
            })
        })
        .catch(() => {
          ElMessage({
            type: 'info',
            message: t('functionState.cancel'),
          })
        })
}
//下线(拿走)
const glassDownLine = async(row) => {
  ElMessageBox.confirm(
        t('functionState.tips'),
        t('delivery.prompt'),
        {
          confirmButtonText: t('functionState.sure'),
          cancelButtonText: t('functionState.cancel'),
          type: 'warning',
        }
      )
        .then(() => {
          //下线接口
          request.post("/deviceInteraction/tasking/glassDownLine",
            {
              "glassId": row.glassId,
            }).then((res) => { // æ›¿æ¢ä¸ºä½ çš„API端点
              if (res.code === 200) {
                ElMessage.success(res.message);
              } else {
                ElMessage.warning(res.message)
              }
            })
        })
        .catch(() => {
          ElMessage({
            type: 'info',
            message: t('functionState.cancel'),
          })
        })
}
//上线
const topLine = async() => {
}
</script>
<template>
  <div ref="content" style="padding:0 20px;">
    <div id="div-title" style="font-size: 20px; font-weight: bold; margin:10px 0 10px 0;padding-left: 20px;">
      {{$t('machine.cleaning')}}
    </div>
    <hr />
    <br>
    <div id="search" >
      <!-- åŠŸèƒ½ -->
      <el-button :type="(findMachine['state']=='暂停'?'danger':'success')" id="ButtonMachineStatus" @click="machineStatus((findMachine['state']=='暂停'?'开工':'暂停'))">{{findMachine['state']=='开工'?$t('functionState.start'):$t('functionState.stop')}}</el-button>
      <el-button type="primary" id="ButtonTopLine" @click="topLine">{{$t('functionState.topLine')}}</el-button>
      <!-- <el-button type="primary" id="searchButton" @click="downLine('下线')">下线</el-button>
      <el-button type="primary" id="searchButton" @click="workStatus('破损')">破损</el-button>
      <el-button type="primary" id="searchButton" @click="workStatus('完工')">完工</el-button> -->
    </div>
    <div id="main-body" style="min-height:240px;">
      <!-- è¡¨æ ¼å†…容 -->
      <el-table :data="loadData" stripe
        :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129', textAlign: 'center' }"
        :cell-style="{ textAlign: 'center' }">
        <!-- <el-table-column type="selection" min-width="30" /> -->
        <el-table-column type="index" :label="$t('glassInfo.number')" min-width="30" />
        <el-table-column prop="batchNumber" :label="$t('glassInfo.batchNumber')"/>
        <el-table-column prop="taskType" :label="$t('glassInfo.taskType')"/>
        <el-table-column prop="glassId" :label="$t('glassInfo.glassId')"/>
        <el-table-column prop="length" :label="$t('glassInfo.length')"/>
        <el-table-column prop="width" :label="$t('glassInfo.width')"/>
        <el-table-column prop="thickness" :label="$t('glassInfo.thickness')"/>
        <el-table-column prop="workState" :label="$t('glassInfo.workState')"/>
        <el-table-column fixed="right" :label="$t('productStock.operate')" align="center" width="270">
          <template #default="scope">
            <el-button size="mini" link type="primary" plain @click="workStatus(scope.row, '重发')" >{{$t('functionState.anew')}}</el-button>
            <el-button size="mini" link type="primary" plain @click="workStatus(scope.row, '完工')">{{$t('functionState.finish')}}</el-button>
            <el-button size="mini" link type="primary" plain @click="damagedTask(scope.row)">{{$t('functionState.lose')}}</el-button>
            <el-button size="mini" link type="primary" plain @click="glassDownLine(scope.row)">{{$t('functionState.downLine')}}</el-button>
          </template>
        </el-table-column>
      </el-table>
    </div>
    <div id="main-body"
      style="width: 70%; height: 400px;margin:20px auto;background-image: url(../../src/assets/清洗机.png) ;background-size: 100% 100%;">
      <!-- ç”»å›¾å†…容 -->
      <div style="width: 200px; height: 100px; background-color: red; position: relative; top: 170px; left: 28px">
      </div>
    </div>
  </div>
</template>
<style scoped>
table {
  text-align: center;
  width: 100%;
  height: 100%;
  border-collapse: collapse;
  border-spacing: 0;
}
table td {
  text-align: center;
}
#main-body {
  width: 100%;
  height: 100%;
  border: 1px solid #ccc;
  margin-top: 25px;
}
#searchButton {
  width: 100px;
  height: 40px;
  font-size: 16px;
  border-radius: 5px;
  background-color: #409EFF;
  color: #fff;
  border: none;
  cursor: pointer;
}
</style>
UI-Project/src/views/Edging/edging.vue
New file
@@ -0,0 +1,298 @@
<!--  æ‰“标机  -->
<script setup>
import request from "@/utils/request";
import { ElMessage, ElMessageBox } from "element-plus";
import { reactive, ref, onMounted, onBeforeUnmount,onUnmounted } from 'vue'
import { useI18n } from 'vue-i18n'
import { WebSocketHost ,host} from '@/utils/constants'
import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService';
let language = ref(localStorage.getItem('lang') || 'zh')
const { t } = useI18n()
const requestData = reactive({
  account: '',
  password: '',
});
const loadData = ref([]);
const findMachine = ref([]);
const machineId=5;//当前页面的设备ID
//使用WebSocket方式展示数据
let socket = null;
const socketUrl = `ws://${WebSocketHost}:${host}/api/deviceInteraction/api/talk/edging`;
// å®šä¹‰æ¶ˆæ¯å¤„理函数,更新 receivedData å˜é‡
const handleMessage = (data) => {
  // æ›´æ–° tableData çš„æ•°æ®
  loadData.value = data.taskingList[0];
  findMachine.value = data.machine[0];
};
onUnmounted(() => {
  if (socket) {
    closeWebSocket(socket);
  }
});
onBeforeUnmount(() => {
  console.log("关闭了")
  closeWebSocket();
});
onMounted(async () => {
  //使用WebSocket方式展示数据
  socket = initializeWebSocket(socketUrl, handleMessage);// åˆå§‹åŒ– WebSocket,并传递消息处理函数
  //使用接口方式展示数据
  //load();
});
// //获取数据
// const load = async() => {
//   //获取设备任务数据
//   try {
//     const response = await request.post('/deviceInteraction/tasking/findMachineTask',
//     {
//       "id": 11
//     }); // æ›¿æ¢ä¸ºä½ çš„API端点
//     if (response.code === 200) {
//       loadData.value.findTaskingData= response.data;
//     } else {
//       ElMessage.warning(res.msg)
//     }
//   } catch (error) {
//     // console.error('Error fetching rects :', error);
//   }
//   //获取设备状态
//   try {
//     const response = await request.post('/deviceInteraction/machine/findMachine',
//     {
//       "id": 11
//     }); // æ›¿æ¢ä¸ºä½ çš„API端点
//     if (response.code === 200) {
//       findMachine.value= response.data;
//     } else {
//       ElMessage.warning(res.msg)
//     }
//   } catch (error) {
//     // console.error('Error fetching rects :', error);
//   }
// }
//修改工作状态 ã€å¤±è´¥/正在工作/完工】
const workStatus = async(row,state) => {
  let url;
  if(state=="重发"){
    url="/deviceInteraction/tasking/loseMachineTask";
  }else if(state=="正在工作"){
    url="/deviceInteraction/tasking/startMachineTask";
  }else if(state=="完工"){
    url="/deviceInteraction/tasking/finishMachineTask";
  }else{
    return;
  }
  ElMessageBox.confirm(
        t('marking.tips'),
        t('delivery.prompt'),
        {
          confirmButtonText: t('marking.sure'),
          cancelButtonText: t('marking.cancel'),
          type: 'warning',
        }
      )
        .then(() => {
          //开始修改
          request.post(url,
            {
              "id": machineId
            }).then((res) => { // æ›¿æ¢ä¸ºä½ çš„API端点
              if (res.code === 200) {
                ElMessage.success(res.message);
              } else {
                ElMessage.warning(res.message)
              }
            })
        })
        .catch(() => {
          ElMessage({
            type: 'info',
            message: t('marking.cancel'),
          })
        })
}
//开工/暂停
const machineStatus = async(state) => {
  ElMessageBox.confirm(
        t('marking.tips'),
        t('delivery.prompt'),
        {
          confirmButtonText: t('marking.sure'),
          cancelButtonText: t('marking.cancel'),
          type: 'warning',
        }
      )
        .then(() => {
          //下线接口
          request.post("/deviceInteraction/machine/updateMachineState",
            {
              "id": machineId,
              "state": state
            }).then((res) => { // æ›¿æ¢ä¸ºä½ çš„API端点
              if (res.code === 200) {
                ElMessage.success(res.message);
              } else {
                ElMessage.warning(res.message)
              }
            })
        })
        .catch(() => {
          ElMessage({
            type: 'info',
            message: t('marking.cancel'),
          })
        })
}
//破损
const damagedTask = async(row) => {
  ElMessageBox.confirm(
        t('marking.tips'),
        t('delivery.prompt'),
        {
          confirmButtonText: t('marking.sure'),
          cancelButtonText: t('marking.cancel'),
          type: 'warning',
        }
      )
        .then(() => {
          //下线接口
          request.post("/deviceInteraction/tasking/damagedTask",
            {
              "glassId": row.glassId
            }).then((res) => { // æ›¿æ¢ä¸ºä½ çš„API端点
              if (res.code === 200) {
                ElMessage.success(res.message);
              } else {
                ElMessage.warning(res.message)
              }
            })
        })
        .catch(() => {
          ElMessage({
            type: 'info',
            message: t('marking.cancel'),
          })
        })
}
//下线(拿走)
const glassDownLine = async(row) => {
  ElMessageBox.confirm(
        t('marking.tips'),
        t('delivery.prompt'),
        {
          confirmButtonText: t('marking.sure'),
          cancelButtonText: t('marking.cancel'),
          type: 'warning',
        }
      )
        .then(() => {
          //下线接口
          request.post("/deviceInteraction/tasking/glassDownLine",
            {
              "glassId": row.glassId,
            }).then((res) => { // æ›¿æ¢ä¸ºä½ çš„API端点
              if (res.code === 200) {
                ElMessage.success(res.message);
              } else {
                ElMessage.warning(res.message)
              }
            })
        })
        .catch(() => {
          ElMessage({
            type: 'info',
            message: t('marking.cancel'),
          })
        })
}
//上线
const topLine = async() => {
}
</script>
<template>
  <div ref="content" style="padding:0 20px;">
    <div id="div-title" style="font-size: 20px; font-weight: bold; margin:10px 0 10px 0;padding-left: 20px;">
      {{$t('machine.edging')}}
    </div>
    <hr />
    <br>
    <div id="search" >
      <!-- åŠŸèƒ½ -->
      <el-button type="primary" id="ButtonMachineStatus" @click="machineStatus((findMachine['state']=='暂停'?'开工':'暂停'))">{{findMachine['state']=='开工'?$t('functionState.start'):$t('functionState.stop')}}</el-button>
      <el-button type="primary" id="ButtonTopLine" @click="topLine">{{$t('functionState.topLine')}}</el-button>
      <!-- <el-button type="primary" id="searchButton" @click="downLine('下线')">下线</el-button>
      <el-button type="primary" id="searchButton" @click="workStatus('破损')">破损</el-button>
      <el-button type="primary" id="searchButton" @click="workStatus('完工')">完工</el-button> -->
    </div>
    <div id="main-body" style="min-height:240px;">
      <!-- è¡¨æ ¼å†…容 -->
      <el-table :data="loadData" stripe
        :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129', textAlign: 'center' }"
        :cell-style="{ textAlign: 'center' }">
        <!-- <el-table-column type="selection" min-width="30" /> -->
        <el-table-column type="index" :label="$t('glassInfo.number')" min-width="30" />
        <el-table-column prop="batchNumber" :label="$t('glassInfo.batchNumber')"/>
        <el-table-column prop="taskType" :label="$t('glassInfo.taskType')"/>
        <el-table-column prop="glassId" :label="$t('glassInfo.glassId')"/>
        <el-table-column prop="length" :label="$t('glassInfo.length')"/>
        <el-table-column prop="width" :label="$t('glassInfo.width')"/>
        <el-table-column prop="thickness" :label="$t('glassInfo.thickness')"/>
        <el-table-column prop="workState" :label="$t('glassInfo.workState')"/>
        <el-table-column fixed="right" :label="$t('productStock.operate')" align="center" width="270">
          <template #default="scope">
            <el-button size="mini" link type="primary" plain @click="workStatus(scope.row, '重发')" >{{$t('functionState.anew')}}</el-button>
            <el-button size="mini" link type="primary" plain @click="workStatus(scope.row, '完工')">{{$t('functionState.finish')}}</el-button>
            <el-button size="mini" link type="primary" plain @click="damagedTask(scope.row)">{{$t('functionState.lose')}}</el-button>
            <el-button size="mini" link type="primary" plain @click="glassDownLine(scope.row)">{{$t('functionState.downLine')}}</el-button>
          </template>
        </el-table-column>
      </el-table>
    </div>
    <div id="main-body"
      style="width: 50%; height: 460px; margin: auto;background-image: url(../../src/assets/扫码识别.png) ;background-size: 100% 100%;">
      <!-- ç”»å›¾å†…容 -->
      <div style="width: 150px; height: 100px; background-color: red; position: relative; top: 171px; left: 328px">
      </div>
    </div>
  </div>
</template>
<style scoped>
table {
  text-align: center;
  width: 100%;
  height: 100%;
  border-collapse: collapse;
  border-spacing: 0;
}
table td {
  text-align: center;
}
#main-body {
  width: 100%;
  height: 100%;
  border: 1px solid #ccc;
  margin-top: 25px;
}
#searchButton {
  width: 100px;
  height: 40px;
  font-size: 16px;
  border-radius: 5px;
  background-color: #409EFF;
  color: #fff;
  border: none;
  cursor: pointer;
}
</style>
UI-Project/src/views/FlipSlice/flipSlice.vue
New file
@@ -0,0 +1,333 @@
<!--  æ‰“标机  -->
<script setup>
import request from "@/utils/request";
import { ElMessage, ElMessageBox } from "element-plus";
import { reactive, ref, onMounted, onBeforeUnmount, onUnmounted } from 'vue'
import { useI18n } from 'vue-i18n'
import { WebSocketHost, host } from '@/utils/constants'
import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService';
let language = ref(localStorage.getItem('lang') || 'zh')
const { t } = useI18n()
const requestData = reactive({
  account: '',
  password: '',
});
const loadData = ref([]);
const findMachine = ref([]);
const machineId = 25;//当前页面的设备ID
//使用WebSocket方式展示数据
let socket = null;
const socketUrl = `ws://${WebSocketHost}:${host}/api/deviceInteraction/api/talk/flipSlice`;
// å®šä¹‰æ¶ˆæ¯å¤„理函数,更新 receivedData å˜é‡
const handleMessage = (data) => {
  // æ›´æ–° tableData çš„æ•°æ®
  loadData.value = data.taskingList[0];
  findMachine.value = data.machine[0];
  // console.log(data);
};
onUnmounted(() => {
  if (socket) {
    closeWebSocket(socket);
  }
});
onBeforeUnmount(() => {
  console.log("关闭了")
  closeWebSocket();
});
onMounted(async () => {
  //使用WebSocket方式展示数据
  socket = initializeWebSocket(socketUrl, handleMessage);// åˆå§‹åŒ– WebSocket,并传递消息处理函数
  //使用接口方式展示数据
  //load();
});
// //获取数据
// const load = async() => {
//   //获取设备任务数据
//   try {
//     const response = await request.post('/deviceInteraction/tasking/findMachineTask',
//     {
//       "id": 11
//     }); // æ›¿æ¢ä¸ºä½ çš„API端点
//     if (response.code === 200) {
//       loadData.value.findTaskingData= response.data;
//     } else {
//       ElMessage.warning(res.msg)
//     }
//   } catch (error) {
//     // console.error('Error fetching rects :', error);
//   }
//   //获取设备状态
//   try {
//     const response = await request.post('/deviceInteraction/machine/findMachine',
//     {
//       "id": 11
//     }); // æ›¿æ¢ä¸ºä½ çš„API端点
//     if (response.code === 200) {
//       findMachine.value= response.data;
//     } else {
//       ElMessage.warning(res.msg)
//     }
//   } catch (error) {
//     // console.error('Error fetching rects :', error);
//   }
// }
//修改工作状态 ã€å¤±è´¥/正在工作/完工】
const workStatus = async (row, state) => {
  let url;
  if (state == "重发") {
    url = "/deviceInteraction/tasking/loseMachineTask";
  } else if (state == "正在工作") {
    url = "/deviceInteraction/tasking/startMachineTask";
  } else if (state == "完工") {
    url = "/deviceInteraction/tasking/finishMachineTask";
  } else {
    return;
  }
  ElMessageBox.confirm(
    t('functionState.tips'),
    t('delivery.prompt'),
    {
      confirmButtonText: t('functionState.sure'),
      cancelButtonText: t('functionState.cancel'),
      type: 'warning',
    }
  )
    .then(() => {
      //开始修改
      request.post(url,
        {
          "id": machineId
        }).then((res) => { // æ›¿æ¢ä¸ºä½ çš„API端点
          if (res.code === 200) {
            ElMessage.success(res.message);
          } else {
            ElMessage.warning(res.message)
          }
        })
    })
    .catch(() => {
      ElMessage({
        type: 'info',
        message: t('functionState.cancel'),
      })
    })
}
//开工/暂停
const machineStatus = async (state) => {
  ElMessageBox.confirm(
    t('functionState.tips'),
    t('delivery.prompt'),
    {
      confirmButtonText: t('functionState.sure'),
      cancelButtonText: t('functionState.cancel'),
      type: 'warning',
    }
  )
    .then(() => {
      //下线接口
      request.post("/deviceInteraction/machine/updateMachineState",
        {
          "id": machineId,
          "state": state
        }).then((res) => { // æ›¿æ¢ä¸ºä½ çš„API端点
          if (res.code === 200) {
            ElMessage.success(res.message);
          } else {
            ElMessage.warning(res.message)
          }
        })
    })
    .catch(() => {
      ElMessage({
        type: 'info',
        message: t('functionState.cancel'),
      })
    })
}
//破损
const damagedTask = async (row) => {
  ElMessageBox.confirm(
    t('functionState.tips'),
    t('delivery.prompt'),
    {
      confirmButtonText: t('functionState.sure'),
      cancelButtonText: t('functionState.cancel'),
      type: 'warning',
    }
  )
    .then(() => {
      //下线接口
      request.post("/deviceInteraction/tasking/damagedTask",
        {
          "glassId": row.glassId
        }).then((res) => { // æ›¿æ¢ä¸ºä½ çš„API端点
          if (res.code === 200) {
            ElMessage.success(res.message);
          } else {
            ElMessage.warning(res.message)
          }
        })
    })
    .catch(() => {
      ElMessage({
        type: 'info',
        message: t('functionState.cancel'),
      })
    })
}
//下线(拿走)
const glassDownLine = async (row) => {
  ElMessageBox.confirm(
    t('functionState.tips'),
    t('delivery.prompt'),
    {
      confirmButtonText: t('functionState.sure'),
      cancelButtonText: t('functionState.cancel'),
      type: 'warning',
    }
  )
    .then(() => {
      //下线接口
      request.post("/deviceInteraction/tasking/glassDownLine",
        {
          "glassId": row.glassId,
        }).then((res) => { // æ›¿æ¢ä¸ºä½ çš„API端点
          if (res.code === 200) {
            ElMessage.success(res.message);
          } else {
            ElMessage.warning(res.message)
          }
        })
    })
    .catch(() => {
      ElMessage({
        type: 'info',
        message: t('functionState.cancel'),
      })
    })
}
//上线
const topLine = async () => {
}
</script>
<template>
  <div ref="content" style="padding:0 20px;">
    <div id="div-title" style="font-size: 20px; font-weight: bold; margin:10px 0 10px 0;padding-left: 20px;">
      {{ $t('machine.flipSlice') }}
    </div>
    <hr />
    <br>
    <div id="search">
      <!-- åŠŸèƒ½ -->
      <el-button :type="(findMachine['state'] == '暂停' ? 'danger' : 'success')" id="ButtonMachineStatus"
        @click="machineStatus((findMachine['state'] == '暂停' ? '开工' : '暂停'))">{{ findMachine['state'] == '开工' ? $t('functionState.start') : $t('functionState.stop') }}</el-button>
      <el-button type="primary" id="ButtonTopLine" @click="topLine">{{ $t('functionState.topLine') }}</el-button>
      <!-- <el-button type="primary" id="searchButton" @click="downLine('下线')">下线</el-button>
      <el-button type="primary" id="searchButton" @click="workStatus('破损')">破损</el-button>
      <el-button type="primary" id="searchButton" @click="workStatus('完工')">完工</el-button> -->
    </div>
    <div id="main-body" style="min-height:240px;">
      <!-- è¡¨æ ¼å†…容 -->
      <el-table :data="loadData" stripe
        :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129', textAlign: 'center' }"
        :cell-style="{ textAlign: 'center' }">
        <!-- <el-table-column type="selection" min-width="30" /> -->
        <el-table-column type="index" :label="$t('glassInfo.number')" min-width="30" />
        <el-table-column prop="batchNumber" :label="$t('glassInfo.batchNumber')" />
        <el-table-column prop="taskType" :label="$t('glassInfo.taskType')" />
        <el-table-column prop="glassId" :label="$t('glassInfo.glassId')" />
        <el-table-column prop="length" :label="$t('glassInfo.length')" />
        <el-table-column prop="width" :label="$t('glassInfo.width')" />
        <el-table-column prop="thickness" :label="$t('glassInfo.thickness')" />
        <el-table-column prop="workState" :label="$t('glassInfo.workState')" />
        <el-table-column fixed="right" :label="$t('productStock.operate')" align="center" width="270">
          <template #default="scope">
            <el-button size="mini" link type="primary" plain
              @click="workStatus(scope.row, '重发')">{{ $t('functionState.anew') }}</el-button>
            <el-button size="mini" link type="primary" plain
              @click="workStatus(scope.row, '完工')">{{ $t('functionState.finish') }}</el-button>
            <el-button size="mini" link type="primary" plain
              @click="damagedTask(scope.row)">{{ $t('functionState.lose') }}</el-button>
            <el-button size="mini" link type="primary" plain
              @click="glassDownLine(scope.row)">{{ $t('functionState.downLine') }}</el-button>
          </template>
        </el-table-column>
      </el-table>
    </div>
    <div id="main-body"
      style="width: 70%; height: 400px;margin:20px auto;background-image: url(../../src/assets/翻片台.png) ;background-size: 100% 100%;">
      <!-- ç”»å›¾å†…容 -->
      <div :style="{
        width: loadData.length > 0 ? loadData[0]['length'] + 'px' : '200px',
        height: loadData.length > 0 ? loadData[0]['width'] + 'px' : '100px',
        backgroundColor: 'red',
        position: 'relative',
        top: '110px',
        left: '28px',
        textAlign: 'center'
      }">
        <p v-if="loadData.length > 0">{{ loadData[0]['scanId'] }}</p>
        <p v-if="loadData.length > 0">
          {{ loadData[0]['length'] }} * {{ loadData[0]['width'] }}
        </p>
        <p v-else>暂无数据</p> <!-- å¯é€‰ï¼šæ˜¾ç¤ºé»˜è®¤æ¶ˆæ¯ -->
      </div>
      <div :style="{
        width: loadData.length > 0 ? loadData[1]['length'] + 'px' : '200px',
        height: loadData.length > 0 ? loadData[1]['width'] + 'px' : '100px',
        backgroundColor: 'red',
        position: 'relative',
        top: '-70px',
        left: '878px',
        textAlign: 'center'
      }">
        <p v-if="loadData.length > 0">{{ loadData[1]['scanId'] }}</p>
        <p v-if="loadData.length > 0">
          {{ loadData[1]['length'] }} * {{ loadData[1]['width'] }}
        </p>
        <p v-else>暂无数据</p> <!-- å¯é€‰ï¼šæ˜¾ç¤ºé»˜è®¤æ¶ˆæ¯ -->
      </div>
    </div>
  </div>
</template>
<style scoped>
table {
  text-align: center;
  width: 100%;
  height: 100%;
  border-collapse: collapse;
  border-spacing: 0;
}
table td {
  text-align: center;
}
#main-body {
  width: 100%;
  height: 100%;
  border: 1px solid #ccc;
  margin-top: 25px;
}
#searchButton {
  width: 100px;
  height: 40px;
  font-size: 16px;
  border-radius: 5px;
  background-color: #409EFF;
  color: #fff;
  border: none;
  cursor: pointer;
}
</style>
UI-Project/src/views/MechanicalArm/mechanicalArm.vue
@@ -23,6 +23,7 @@
  // æ›´æ–° tableData çš„æ•°æ®
  loadData.value = data.taskingList[0];
  findMachine.value = data.machine[0];
  // console.log(data);
};
onUnmounted(() => {
  if (socket) {
@@ -37,6 +38,7 @@
onMounted(async () => {
  //使用WebSocket方式展示数据
  socket = initializeWebSocket(socketUrl, handleMessage);// åˆå§‹åŒ– WebSocket,并传递消息处理函数
  //使用接口方式展示数据
  //load();
@@ -261,9 +263,9 @@
      <!-- ç”»å›¾å†…容 -->
      <div style="width: 200px; height: 100px; background-color: red; position: relative; top: 271px; left: 158px">
        <div style="width: 500px; height: 300px; position: relative; top: -250PX; left: 800px">
          <el-table :data="loadData" stripe
        :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129', textAlign: 'center' }"
        :cell-style="{ textAlign: 'center' }">
          <el-table :data="loadData" stripe class="custom-table"
        :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129', textAlign: 'center',height: '80px'}"
        :cell-style="{ textAlign: 'center',height: '80px'}">
        <!-- <el-table-column type="selection" min-width="30" /> -->
        <el-table-column type="index" :label="$t('glassInfo.number')" min-width="55" />
        <el-table-column prop="batchNumber" :label="$t('glassInfo.batchNumber')"/>
@@ -286,6 +288,7 @@
</template>
<style scoped>
table {
  text-align: center;
  width: 100%;
UI-Project/src/views/ScanQrCodesIdentify/scanQrCodesIdentify.vue
New file
@@ -0,0 +1,314 @@
<!--  æ‰“标机  -->
<script setup>
import request from "@/utils/request";
import { ElMessage, ElMessageBox } from "element-plus";
import { reactive, ref, onMounted, onBeforeUnmount, onUnmounted } from 'vue'
import { useI18n } from 'vue-i18n'
import { WebSocketHost, host } from '@/utils/constants'
import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService';
let language = ref(localStorage.getItem('lang') || 'zh')
const { t } = useI18n()
const requestData = reactive({
  account: '',
  password: '',
});
const loadData = ref([]);
const findMachine = ref([]);
const loadDataQr = ref([]);
const machineId = 3;//当前页面的设备ID
//使用WebSocket方式展示数据
let socket = null;
const socketUrl = `ws://${WebSocketHost}:${host}/api/deviceInteraction/api/talk/edging`;
// å®šä¹‰æ¶ˆæ¯å¤„理函数,更新 receivedData å˜é‡
const handleMessage = (data) => {
  // æ›´æ–° tableData çš„æ•°æ®
  loadData.value = data.taskingList[0];
  findMachine.value = data.machine[0];
  loadDataQr.value = data.taskingListQr[0];
};
onUnmounted(() => {
  if (socket) {
    closeWebSocket(socket);
  }
});
onBeforeUnmount(() => {
  console.log("关闭了")
  closeWebSocket();
});
onMounted(async () => {
  //使用WebSocket方式展示数据
  socket = initializeWebSocket(socketUrl, handleMessage);// åˆå§‹åŒ– WebSocket,并传递消息处理函数
  //使用接口方式展示数据
  //load();
});
// //获取数据
// const load = async() => {
//   //获取设备任务数据
//   try {
//     const response = await request.post('/deviceInteraction/tasking/findMachineTask',
//     {
//       "id": 11
//     }); // æ›¿æ¢ä¸ºä½ çš„API端点
//     if (response.code === 200) {
//       loadData.value.findTaskingData= response.data;
//     } else {
//       ElMessage.warning(res.msg)
//     }
//   } catch (error) {
//     // console.error('Error fetching rects :', error);
//   }
//   //获取设备状态
//   try {
//     const response = await request.post('/deviceInteraction/machine/findMachine',
//     {
//       "id": 11
//     }); // æ›¿æ¢ä¸ºä½ çš„API端点
//     if (response.code === 200) {
//       findMachine.value= response.data;
//     } else {
//       ElMessage.warning(res.msg)
//     }
//   } catch (error) {
//     // console.error('Error fetching rects :', error);
//   }
// }
//修改工作状态 ã€å¤±è´¥/正在工作/完工】
const workStatus = async (row, state) => {
  let url;
  if (state == "重发") {
    url = "/deviceInteraction/tasking/loseMachineTask";
  } else if (state == "正在工作") {
    url = "/deviceInteraction/tasking/startMachineTask";
  } else if (state == "完工") {
    url = "/deviceInteraction/tasking/finishMachineTask";
  } else {
    return;
  }
  ElMessageBox.confirm(
    t('marking.tips'),
    t('delivery.prompt'),
    {
      confirmButtonText: t('marking.sure'),
      cancelButtonText: t('marking.cancel'),
      type: 'warning',
    }
  )
    .then(() => {
      //开始修改
      request.post(url,
        {
          "id": machineId
        }).then((res) => { // æ›¿æ¢ä¸ºä½ çš„API端点
          if (res.code === 200) {
            ElMessage.success(res.message);
          } else {
            ElMessage.warning(res.message)
          }
        })
    })
    .catch(() => {
      ElMessage({
        type: 'info',
        message: t('marking.cancel'),
      })
    })
}
//开工/暂停
const machineStatus = async (state) => {
  ElMessageBox.confirm(
    t('marking.tips'),
    t('delivery.prompt'),
    {
      confirmButtonText: t('marking.sure'),
      cancelButtonText: t('marking.cancel'),
      type: 'warning',
    }
  )
    .then(() => {
      //下线接口
      request.post("/deviceInteraction/machine/updateMachineState",
        {
          "id": machineId,
          "state": state
        }).then((res) => { // æ›¿æ¢ä¸ºä½ çš„API端点
          if (res.code === 200) {
            ElMessage.success(res.message);
          } else {
            ElMessage.warning(res.message)
          }
        })
    })
    .catch(() => {
      ElMessage({
        type: 'info',
        message: t('marking.cancel'),
      })
    })
}
//破损
const damagedTask = async (row) => {
  ElMessageBox.confirm(
    t('marking.tips'),
    t('delivery.prompt'),
    {
      confirmButtonText: t('marking.sure'),
      cancelButtonText: t('marking.cancel'),
      type: 'warning',
    }
  )
    .then(() => {
      //下线接口
      request.post("/deviceInteraction/tasking/damagedTask",
        {
          "glassId": row.glassId
        }).then((res) => { // æ›¿æ¢ä¸ºä½ çš„API端点
          if (res.code === 200) {
            ElMessage.success(res.message);
          } else {
            ElMessage.warning(res.message)
          }
        })
    })
    .catch(() => {
      ElMessage({
        type: 'info',
        message: t('marking.cancel'),
      })
    })
}
//下线(拿走)
const glassDownLine = async (row) => {
  ElMessageBox.confirm(
    t('marking.tips'),
    t('delivery.prompt'),
    {
      confirmButtonText: t('marking.sure'),
      cancelButtonText: t('marking.cancel'),
      type: 'warning',
    }
  )
    .then(() => {
      //下线接口
      request.post("/deviceInteraction/tasking/glassDownLine",
        {
          "glassId": row.glassId,
        }).then((res) => { // æ›¿æ¢ä¸ºä½ çš„API端点
          if (res.code === 200) {
            ElMessage.success(res.message);
          } else {
            ElMessage.warning(res.message)
          }
        })
    })
    .catch(() => {
      ElMessage({
        type: 'info',
        message: t('marking.cancel'),
      })
    })
}
//上线
const topLine = async () => {
}
</script>
<template>
  <div ref="content" style="padding:0 20px;">
    <div id="div-title" style="font-size: 20px; font-weight: bold; margin:10px 0 10px 0;padding-left: 20px;">
      {{ $t('machine.scanQredging') }}
    </div>
    <hr />
    <br>
    <div id="search">
      <!-- åŠŸèƒ½ -->
      <el-button type="primary" id="ButtonMachineStatus"
        @click="machineStatus((findMachine['state'] == '暂停' ? '开工' : '暂停'))">{{ findMachine['state'] == '开工' ? $t('functionState.start') : $t('functionState.stop') }}</el-button>
      <el-button type="primary" id="ButtonTopLine" @click="topLine">{{ $t('functionState.topLine') }}</el-button>
      <!-- <el-button type="primary" id="searchButton" @click="downLine('下线')">下线</el-button>
      <el-button type="primary" id="searchButton" @click="workStatus('破损')">破损</el-button>
      <el-button type="primary" id="searchButton" @click="workStatus('完工')">完工</el-button> -->
    </div>
    <div id="main-body" style="min-height:240px;">
      <!-- è¡¨æ ¼å†…容 -->
      <el-table :data="loadData" stripe
        :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129', textAlign: 'center' }"
        :cell-style="{ textAlign: 'center' }">
        <!-- <el-table-column type="selection" min-width="30" /> -->
        <el-table-column type="index" :label="$t('glassInfo.number')" min-width="30" />
        <el-table-column prop="batchNumber" :label="$t('glassInfo.batchNumber')" />
        <el-table-column prop="taskType" :label="$t('glassInfo.taskType')" />
        <el-table-column prop="glassId" :label="$t('glassInfo.glassId')" />
        <el-table-column prop="length" :label="$t('glassInfo.length')" />
        <el-table-column prop="width" :label="$t('glassInfo.width')" />
        <el-table-column prop="thickness" :label="$t('glassInfo.thickness')" />
        <el-table-column prop="workState" :label="$t('glassInfo.workState')" />
        <el-table-column fixed="right" :label="$t('productStock.operate')" align="center" width="270">
          <template #default="scope">
            <el-button size="mini" link type="primary" plain
              @click="workStatus(scope.row, '重发')">{{ $t('functionState.anew') }}</el-button>
            <el-button size="mini" link type="primary" plain
              @click="workStatus(scope.row, '完工')">{{ $t('functionState.finish') }}</el-button>
            <el-button size="mini" link type="primary" plain
              @click="damagedTask(scope.row)">{{ $t('functionState.lose') }}</el-button>
            <el-button size="mini" link type="primary" plain
              @click="glassDownLine(scope.row)">{{ $t('functionState.downLine') }}</el-button>
          </template>
        </el-table-column>
      </el-table>
    </div>
    <div id="main-body"
      style="width: 70%; height: 450px; margin: auto;background-image: url(../../src/assets/磨边扫码.png) ;background-size: 100% 100%;">
      <!-- ç”»å›¾å†…容 -->
      <div
        style="width: 150px; height: 100px; background-color: red; position: relative; top: 200px; left: 128px;text-align: center;">
        <!-- <p>{{ loadDataQr[0]['scanId'] }}</p>
        <p>{{ loadDataQr[0]['length'] }}*{{ loadDataQr[0]['width'] }}</p> -->
        <p v-if="loadDataQr.length > 0">{{ loadDataQr[0]['scanId'] }}</p>
        <p v-if="loadDataQr.length > 0">
          {{ loadDataQr[0]['length'] }} * {{ loadDataQr[0]['width'] }}
        </p>
        <p v-else>暂无数据</p> <!-- å¯é€‰ï¼šæ˜¾ç¤ºé»˜è®¤æ¶ˆæ¯ -->
      </div>
    </div>
  </div>
</template>
<style scoped>
table {
  text-align: center;
  width: 100%;
  height: 100%;
  border-collapse: collapse;
  border-spacing: 0;
}
table td {
  text-align: center;
}
#main-body {
  width: 100%;
  height: 100%;
  border: 1px solid #ccc;
  margin-top: 25px;
}
#searchButton {
  width: 100px;
  height: 40px;
  font-size: 16px;
  border-radius: 5px;
  background-color: #409EFF;
  color: #fff;
  border: none;
  cursor: pointer;
}
</style>
UI-Project/src/views/ScanQrCodesReport/scanQrCodesReport.vue
New file
@@ -0,0 +1,298 @@
<!--  æ‰“标机  -->
<script setup>
import request from "@/utils/request";
import { ElMessage, ElMessageBox } from "element-plus";
import { reactive, ref, onMounted, onBeforeUnmount,onUnmounted } from 'vue'
import { useI18n } from 'vue-i18n'
import { WebSocketHost ,host} from '@/utils/constants'
import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService';
let language = ref(localStorage.getItem('lang') || 'zh')
const { t } = useI18n()
const requestData = reactive({
  account: '',
  password: '',
});
const loadData = ref([]);
const findMachine = ref([]);
const machineId=23;//当前页面的设备ID
//使用WebSocket方式展示数据
let socket = null;
const socketUrl = `ws://${WebSocketHost}:${host}/api/deviceInteraction/api/talk/edging`;
// å®šä¹‰æ¶ˆæ¯å¤„理函数,更新 receivedData å˜é‡
const handleMessage = (data) => {
  // æ›´æ–° tableData çš„æ•°æ®
  loadData.value = data.taskingList[0];
  findMachine.value = data.machine[0];
};
onUnmounted(() => {
  if (socket) {
    closeWebSocket(socket);
  }
});
onBeforeUnmount(() => {
  console.log("关闭了")
  closeWebSocket();
});
onMounted(async () => {
  //使用WebSocket方式展示数据
  socket = initializeWebSocket(socketUrl, handleMessage);// åˆå§‹åŒ– WebSocket,并传递消息处理函数
  //使用接口方式展示数据
  //load();
});
// //获取数据
// const load = async() => {
//   //获取设备任务数据
//   try {
//     const response = await request.post('/deviceInteraction/tasking/findMachineTask',
//     {
//       "id": 11
//     }); // æ›¿æ¢ä¸ºä½ çš„API端点
//     if (response.code === 200) {
//       loadData.value.findTaskingData= response.data;
//     } else {
//       ElMessage.warning(res.msg)
//     }
//   } catch (error) {
//     // console.error('Error fetching rects :', error);
//   }
//   //获取设备状态
//   try {
//     const response = await request.post('/deviceInteraction/machine/findMachine',
//     {
//       "id": 11
//     }); // æ›¿æ¢ä¸ºä½ çš„API端点
//     if (response.code === 200) {
//       findMachine.value= response.data;
//     } else {
//       ElMessage.warning(res.msg)
//     }
//   } catch (error) {
//     // console.error('Error fetching rects :', error);
//   }
// }
//修改工作状态 ã€å¤±è´¥/正在工作/完工】
const workStatus = async(row,state) => {
  let url;
  if(state=="重发"){
    url="/deviceInteraction/tasking/loseMachineTask";
  }else if(state=="正在工作"){
    url="/deviceInteraction/tasking/startMachineTask";
  }else if(state=="完工"){
    url="/deviceInteraction/tasking/finishMachineTask";
  }else{
    return;
  }
  ElMessageBox.confirm(
        t('marking.tips'),
        t('delivery.prompt'),
        {
          confirmButtonText: t('marking.sure'),
          cancelButtonText: t('marking.cancel'),
          type: 'warning',
        }
      )
        .then(() => {
          //开始修改
          request.post(url,
            {
              "id": machineId
            }).then((res) => { // æ›¿æ¢ä¸ºä½ çš„API端点
              if (res.code === 200) {
                ElMessage.success(res.message);
              } else {
                ElMessage.warning(res.message)
              }
            })
        })
        .catch(() => {
          ElMessage({
            type: 'info',
            message: t('marking.cancel'),
          })
        })
}
//开工/暂停
const machineStatus = async(state) => {
  ElMessageBox.confirm(
        t('marking.tips'),
        t('delivery.prompt'),
        {
          confirmButtonText: t('marking.sure'),
          cancelButtonText: t('marking.cancel'),
          type: 'warning',
        }
      )
        .then(() => {
          //下线接口
          request.post("/deviceInteraction/machine/updateMachineState",
            {
              "id": machineId,
              "state": state
            }).then((res) => { // æ›¿æ¢ä¸ºä½ çš„API端点
              if (res.code === 200) {
                ElMessage.success(res.message);
              } else {
                ElMessage.warning(res.message)
              }
            })
        })
        .catch(() => {
          ElMessage({
            type: 'info',
            message: t('marking.cancel'),
          })
        })
}
//破损
const damagedTask = async(row) => {
  ElMessageBox.confirm(
        t('marking.tips'),
        t('delivery.prompt'),
        {
          confirmButtonText: t('marking.sure'),
          cancelButtonText: t('marking.cancel'),
          type: 'warning',
        }
      )
        .then(() => {
          //下线接口
          request.post("/deviceInteraction/tasking/damagedTask",
            {
              "glassId": row.glassId
            }).then((res) => { // æ›¿æ¢ä¸ºä½ çš„API端点
              if (res.code === 200) {
                ElMessage.success(res.message);
              } else {
                ElMessage.warning(res.message)
              }
            })
        })
        .catch(() => {
          ElMessage({
            type: 'info',
            message: t('marking.cancel'),
          })
        })
}
//下线(拿走)
const glassDownLine = async(row) => {
  ElMessageBox.confirm(
        t('marking.tips'),
        t('delivery.prompt'),
        {
          confirmButtonText: t('marking.sure'),
          cancelButtonText: t('marking.cancel'),
          type: 'warning',
        }
      )
        .then(() => {
          //下线接口
          request.post("/deviceInteraction/tasking/glassDownLine",
            {
              "glassId": row.glassId,
            }).then((res) => { // æ›¿æ¢ä¸ºä½ çš„API端点
              if (res.code === 200) {
                ElMessage.success(res.message);
              } else {
                ElMessage.warning(res.message)
              }
            })
        })
        .catch(() => {
          ElMessage({
            type: 'info',
            message: t('marking.cancel'),
          })
        })
}
//上线
const topLine = async() => {
}
</script>
<template>
  <div ref="content" style="padding:0 20px;">
    <div id="div-title" style="font-size: 20px; font-weight: bold; margin:10px 0 10px 0;padding-left: 20px;">
      {{$t('machine.edging')}}
    </div>
    <hr />
    <br>
    <div id="search" >
      <!-- åŠŸèƒ½ -->
      <el-button type="primary" id="ButtonMachineStatus" @click="machineStatus((findMachine['state']=='暂停'?'开工':'暂停'))">{{findMachine['state']=='开工'?$t('functionState.start'):$t('functionState.stop')}}</el-button>
      <el-button type="primary" id="ButtonTopLine" @click="topLine">{{$t('functionState.topLine')}}</el-button>
      <!-- <el-button type="primary" id="searchButton" @click="downLine('下线')">下线</el-button>
      <el-button type="primary" id="searchButton" @click="workStatus('破损')">破损</el-button>
      <el-button type="primary" id="searchButton" @click="workStatus('完工')">完工</el-button> -->
    </div>
    <div id="main-body" style="min-height:240px;">
      <!-- è¡¨æ ¼å†…容 -->
      <el-table :data="loadData" stripe
        :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129', textAlign: 'center' }"
        :cell-style="{ textAlign: 'center' }">
        <!-- <el-table-column type="selection" min-width="30" /> -->
        <el-table-column type="index" :label="$t('glassInfo.number')" min-width="30" />
        <el-table-column prop="batchNumber" :label="$t('glassInfo.batchNumber')"/>
        <el-table-column prop="taskType" :label="$t('glassInfo.taskType')"/>
        <el-table-column prop="glassId" :label="$t('glassInfo.glassId')"/>
        <el-table-column prop="length" :label="$t('glassInfo.length')"/>
        <el-table-column prop="width" :label="$t('glassInfo.width')"/>
        <el-table-column prop="thickness" :label="$t('glassInfo.thickness')"/>
        <el-table-column prop="workState" :label="$t('glassInfo.workState')"/>
        <el-table-column fixed="right" :label="$t('productStock.operate')" align="center" width="270">
          <template #default="scope">
            <el-button size="mini" link type="primary" plain @click="workStatus(scope.row, '重发')" >{{$t('functionState.anew')}}</el-button>
            <el-button size="mini" link type="primary" plain @click="workStatus(scope.row, '完工')">{{$t('functionState.finish')}}</el-button>
            <el-button size="mini" link type="primary" plain @click="damagedTask(scope.row)">{{$t('functionState.lose')}}</el-button>
            <el-button size="mini" link type="primary" plain @click="glassDownLine(scope.row)">{{$t('functionState.downLine')}}</el-button>
          </template>
        </el-table-column>
      </el-table>
    </div>
    <div id="main-body"
      style="width: 50%; height: 460px; margin: auto;background-image: url(../../src/assets/扫码识别.png) ;background-size: 100% 100%;">
      <!-- ç”»å›¾å†…容 -->
      <div style="width: 150px; height: 100px; background-color: red; position: relative; top: 171px; left: 328px">
      </div>
    </div>
  </div>
</template>
<style scoped>
table {
  text-align: center;
  width: 100%;
  height: 100%;
  border-collapse: collapse;
  border-spacing: 0;
}
table td {
  text-align: center;
}
#main-body {
  width: 100%;
  height: 100%;
  border: 1px solid #ccc;
  margin-top: 25px;
}
#searchButton {
  width: 100px;
  height: 40px;
  font-size: 16px;
  border-radius: 5px;
  background-color: #409EFF;
  color: #fff;
  border: none;
  cursor: pointer;
}
</style>