From 0307175c4c3631fe68b4d0a3a921bc56678ba68b Mon Sep 17 00:00:00 2001
From: ZengTao <2773468879@qq.com>
Date: 星期二, 03 十二月 2024 09:13:42 +0800
Subject: [PATCH] Merge branch 'master' of http://bore.pub:10439/r/HangZhouMes

---
 UI-Project/src/App.vue                                                                                                                                   |   23 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/entity/TemperingGlass.java                                                     |   82 
 UI-Project/src/views/GlassStorage/rawfilmstorage.vue                                                                                                     |   56 
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/entity/BigStorageCageTask.java                         |   33 
 hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/service/impl/UpPattenUsageServiceImpl.java                           |   40 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/LoadGlassDeviceTaskHistoryService.java                                        |    0 
 hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application.yml                                                                  |   13 
 UI-Project/vue.config.js                                                                                                                                 |   12 
 hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageDeviceTaskMapper.xml                                                |   12 
 hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/changelog/ywChangelog.sql                                                        |  179 +
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/tools/service/impl/BigStorageBaseServiceImpl.java                         |  663 +++++
 hangzhoumesParent/common/servicebase/src/main/resources/mapper/UpPattenUsageMapper.xml                                                                   |   11 
 UI-Project/src/views/Caching/cachingyiwu.vue                                                                                                             |  205 +
 hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-prod.yml                                                             |    4 
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/entity/BigStorageCageHistoryTask.java                  |   55 
 UI-Project/src/views/StockBasicData/stockBasicDatatwo.vue                                                                                                |   45 
 hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/engineering/service/impl/EngineeringServiceImpl.java                               |   10 
 UI-Project/src/utils/evicePixelRatio.js                                                                                                                  |   57 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeProject.java                                                                |    9 
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/BigStorageCageHistoryTaskService.java          |   16 
 UI-Project/src/views/Returns/upreturns.vue                                                                                                               |  695 ++--
 hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageCageMapper.xml                                                      |    2 
 hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/mapper/LoadGlassDeviceTaskMapper.xml                                                  |    1 
 hangzhoumesParent/moduleService/GlassStorageModule/src/main/resources/application-dev.yml                                                                |    7 
 hangzhoumesParent/common/servicebase/src/main/resources/mapper/RawGlassStorageDetailsMapper.xml                                                          |   10 
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/tools/service/BigStorageBaseService.java                                  |   17 
 UI-Project/src/views/Identify/identifwu.vue                                                                                                              |  345 ++
 UI-Project/src/views/Identify/identify.vue                                                                                                               |   67 
 UI-Project/index.html                                                                                                                                    |    2 
 UI-Project/src/views/Caching/cachingbefore.vue                                                                                                           |   29 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/mapper/RawGlassStorageDetailsMapper.java                                      |    2 
 UI-Project/src/views/hollow/hollowequipment.vue                                                                                                          |  270 ++
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/mapper/BigStorageCageHistoryTaskMapper.java            |   16 
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/mapper/BigStorageCageTaskMapper.java                   |   24 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/service/RawGlassStorageDetailsService.java                                    |    2 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/service/impl/RawGlassStorageDetailsServiceImpl.java                           |   20 
 UI-Project/src/views/UnLoadGlass/loadmachinerack.vue                                                                                                     |   68 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/entity/LoadGlassDeviceTaskHistory.java                                                |    0 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeHeatDetailService.java                                                     |    8 
 hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/OpcNGTemperingTask.java                                                   |  157 +
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageInTaskMapper.xml                                        |   38 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/engineering/entity/Engineering.java                                                           |    8 
 hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/opccallback/CacheGlassStartCallback.java                                      |   78 
 hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/service/UpPattenUsageService.java                                    |   16 
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/SlotSequenceDTO.java                                |    4 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeHeatLayoutServiceImpl.java                                            |   14 
 UI-Project/config.js                                                                                                                                     |   10 
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/impl/BigStorageCageHistoryTaskServiceImpl.java |   20 
 UI-Project/src/lang/zh.js                                                                                                                                |   75 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/impl/LoadGlassDeviceOneTaskServiceImpl.java                                   |    0 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/mapper/TemperingGlassMapper.java                                               |   15 
 UI-Project/src/main.js                                                                                                                                   |    7 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/TemperingGlassService.java                                             |   15 
 hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/impl/SysUserServiceImpl.java                                              |    2 
 hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/engineering/service/EngineeringService.java                                        |    2 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/Const.java                                                                      |   37 
 hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-dev.yml                                                                   |    7 
 UI-Project/src/views/PurchaseReturn/purchaseReturn.vue                                                                                                   |   88 
 hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/engineering/controller/EngineeringController.java                                  |   10 
 UI-Project/src/views/Returns/returns.vue                                                                                                                 |  452 +--
 hangzhoumesParent/gateway/src/main/resources/application.yml                                                                                             |    1 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/entity/LoadGlassDeviceTask.java                                                       |    4 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeHeatDetailServiceImpl.java                                            |   12 
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/OpcPlcStorageCageTask.java                                            |  645 +++-
 UI-Project/src/views/Returns/upreturns2.vue                                                                                                              |  699 ++--
 UI-Project/src/views/Identify/ident.vue                                                                                                                  |   53 
 hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/OpcCacheGlassTask.java                                                        |  537 +++
 UI-Project/package.json                                                                                                                                  |    1 
 hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/job/OpcLoadGlassTask.java                                                          |   37 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/uppattenusage/entity/UpPattenUsage.java                                                       |    9 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeHeatDetail.java                                                             |    9 
 hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/entity/EdgStorageDeviceTask.java                                          |   22 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/uppattenusage/mapper/UpPattenUsageMapper.java                                                 |    4 
 hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageCageDetailsMapper.xml                                               |    3 
 UI-Project/src/views/PurchaseReturn/purchaseStorage.vue                                                                                                  |   59 
 UI-Project/src/router/index.js                                                                                                                           |   50 
 hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/mapper/EdgStorageCageDetailsMapper.java                            |    2 
 UI-Project/src/views/StockBasicData/stockBasicyiwu.vue                                                                                                   |  252 ++
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/BigStorageCageTaskService.java                 |   25 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeHeatLayoutService.java                                                     |    9 
 hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/controller/UpPattenUsageController.java                              |   24 
 hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/EdgStorageCageDetailsService.java                          |   10 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/impl/TemperingGlassServiceImpl.java                                    |   19 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/mapper/LoadGlassDeviceTaskHistoryDao.java                                             |    0 
 hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/impl/EdgStorageCageDetailsServiceImpl.java                 |    4 
 hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/job/RawGlassTask.java                                                           |  369 +-
 hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/engineering/entity/Engineering.java                                                |  110 
 UI-Project/src/views/largescreen/largescreen.vue                                                                                                         |   69 
 UI-Project/src/views/StockBasicData/stockBasicData.vue                                                                                                   |   79 
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/impl/BigStorageCageTaskServiceImpl.java        |   43 
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml                                       |    2 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/mapper/LoadGlassDeviceTaskMapper.java                                                 |    0 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/TemperingGlassInfoService.java                                         |    5 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/impl/LoadGlassDeviceTaskHistoryServiceImpl.java                               |    0 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/impl/TemperingGlassInfoServiceImpl.java                                |   17 
 UI-Project/package-lock.json                                                                                                                             |  127 +
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/LoadGlassDeviceTaskService.java                                               |    0 
 97 files changed, 5,605 insertions(+), 1,871 deletions(-)

diff --git a/UI-Project/config.js b/UI-Project/config.js
index 8801d0c..e752fc6 100644
--- a/UI-Project/config.js
+++ b/UI-Project/config.js
@@ -1,10 +1,10 @@
 export default {
-//  serverUrl: "10.153.19.150:88/api",
+    // serverUrl: "10.153.19.150:88/api",
 //  serverUrl: "192.168.1.199:88/api",
- serverUrl: "127.0.0.1:88/api",
-  // serverUrl2: "10.153.19.150:88"
-  // serverUrl2: "192.168.1.199:88"
+    serverUrl: "127.0.0.1:88/api",
+    // serverUrl2: "10.153.19.150:88"
+    // serverUrl2: "192.168.1.199:88"
     serverUrl2: "127.0.0.1:88"
 
-  //serverUrl:"res.abeim.cn"
+    //serverUrl:"res.abeim.cn"
 }
\ No newline at end of file
diff --git a/UI-Project/index.html b/UI-Project/index.html
index e96cd5a..5008a8e 100644
--- a/UI-Project/index.html
+++ b/UI-Project/index.html
@@ -7,7 +7,7 @@
     <title>鍖楃幓</title>
   </head>
   <body>
-    <div id="app"></div>
+    <div id="app" style="width: 100vw;height: 100vh;"></div>
     <script type="module" src="/src/main.js"></script>
   </body>
 </html>
diff --git a/UI-Project/package-lock.json b/UI-Project/package-lock.json
index 352bc93..a357011 100644
--- a/UI-Project/package-lock.json
+++ b/UI-Project/package-lock.json
@@ -35,6 +35,7 @@
       "devDependencies": {
         "@types/sortablejs": "^1.15.7",
         "@vitejs/plugin-vue": "^4.6.2",
+        "babel-polyfill": "^6.26.0",
         "http-proxy-middleware": "^3.0.0",
         "unplugin-auto-import": "^0.17.6",
         "vite": "^4.4.9"
@@ -632,6 +633,33 @@
         "proxy-from-env": "^1.1.0"
       }
     },
+    "node_modules/babel-polyfill": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmmirror.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
+      "integrity": "sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==",
+      "dev": true,
+      "dependencies": {
+        "babel-runtime": "^6.26.0",
+        "core-js": "^2.5.0",
+        "regenerator-runtime": "^0.10.5"
+      }
+    },
+    "node_modules/babel-runtime": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmmirror.com/babel-runtime/-/babel-runtime-6.26.0.tgz",
+      "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
+      "dev": true,
+      "dependencies": {
+        "core-js": "^2.4.0",
+        "regenerator-runtime": "^0.11.0"
+      }
+    },
+    "node_modules/babel-runtime/node_modules/regenerator-runtime": {
+      "version": "0.11.1",
+      "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+      "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+      "dev": true
+    },
     "node_modules/balanced-match": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -773,6 +801,14 @@
       "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.7.tgz",
       "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==",
       "dev": true
+    },
+    "node_modules/core-js": {
+      "version": "2.6.12",
+      "resolved": "https://registry.npmmirror.com/core-js/-/core-js-2.6.12.tgz",
+      "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
+      "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
+      "dev": true,
+      "hasInstallScript": true
     },
     "node_modules/crc-32": {
       "version": "1.2.2",
@@ -1549,6 +1585,12 @@
       "engines": {
         "node": ">=8.10.0"
       }
+    },
+    "node_modules/regenerator-runtime": {
+      "version": "0.10.5",
+      "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
+      "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==",
+      "dev": true
     },
     "node_modules/require-directory": {
       "version": "2.1.1",
@@ -2623,6 +2665,35 @@
         "proxy-from-env": "^1.1.0"
       }
     },
+    "babel-polyfill": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmmirror.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
+      "integrity": "sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.26.0",
+        "core-js": "^2.5.0",
+        "regenerator-runtime": "^0.10.5"
+      }
+    },
+    "babel-runtime": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmmirror.com/babel-runtime/-/babel-runtime-6.26.0.tgz",
+      "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
+      "dev": true,
+      "requires": {
+        "core-js": "^2.4.0",
+        "regenerator-runtime": "^0.11.0"
+      },
+      "dependencies": {
+        "regenerator-runtime": {
+          "version": "0.11.1",
+          "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+          "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+          "dev": true
+        }
+      }
+    },
     "balanced-match": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -2728,6 +2799,12 @@
       "version": "0.1.7",
       "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.7.tgz",
       "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==",
+      "dev": true
+    },
+    "core-js": {
+      "version": "2.6.12",
+      "resolved": "https://registry.npmmirror.com/core-js/-/core-js-2.6.12.tgz",
+      "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
       "dev": true
     },
     "crc-32": {
@@ -3136,6 +3213,7 @@
         "@vitejs/plugin-vue": "^4.6.2",
         "@vue-macros/reactivity-transform": "^0.3.23",
         "axios": "^1.6.8",
+        "babel-polyfill": "*",
         "chart.js": "^4.4.3",
         "echarts": "^5.5.1",
         "element-plus": "^2.4.0",
@@ -3154,7 +3232,7 @@
         "vue-echarts": "^6.7.3",
         "vue-i18n": "^9.10.1",
         "vue-print-nb": "^1.7.5",
-        "vue-router": "4.0.13",
+        "vue-router": "^4.0.13",
         "vue3-print-nb": "^0.1.4",
         "vxe-table": "^4.5.15",
         "xe-utils": "^3.5.14",
@@ -3594,6 +3672,35 @@
             "proxy-from-env": "^1.1.0"
           }
         },
+        "babel-polyfill": {
+          "version": "6.26.0",
+          "resolved": "https://registry.npmmirror.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
+          "integrity": "sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==",
+          "dev": true,
+          "requires": {
+            "babel-runtime": "^6.26.0",
+            "core-js": "^2.5.0",
+            "regenerator-runtime": "^0.10.5"
+          }
+        },
+        "babel-runtime": {
+          "version": "6.26.0",
+          "resolved": "https://registry.npmmirror.com/babel-runtime/-/babel-runtime-6.26.0.tgz",
+          "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
+          "dev": true,
+          "requires": {
+            "core-js": "^2.4.0",
+            "regenerator-runtime": "^0.11.0"
+          },
+          "dependencies": {
+            "regenerator-runtime": {
+              "version": "0.11.1",
+              "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+              "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+              "dev": true
+            }
+          }
+        },
         "balanced-match": {
           "version": "1.0.2",
           "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -3699,6 +3806,12 @@
           "version": "0.1.7",
           "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.7.tgz",
           "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==",
+          "dev": true
+        },
+        "core-js": {
+          "version": "2.6.12",
+          "resolved": "https://registry.npmmirror.com/core-js/-/core-js-2.6.12.tgz",
+          "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
           "dev": true
         },
         "crc-32": {
@@ -4223,6 +4336,12 @@
           "requires": {
             "picomatch": "^2.2.1"
           }
+        },
+        "regenerator-runtime": {
+          "version": "0.10.5",
+          "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
+          "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==",
+          "dev": true
         },
         "require-directory": {
           "version": "2.1.1",
@@ -4781,6 +4900,12 @@
         "picomatch": "^2.2.1"
       }
     },
+    "regenerator-runtime": {
+      "version": "0.10.5",
+      "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
+      "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==",
+      "dev": true
+    },
     "require-directory": {
       "version": "2.1.1",
       "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz",
diff --git a/UI-Project/package.json b/UI-Project/package.json
index 67c31f5..acb0d7e 100644
--- a/UI-Project/package.json
+++ b/UI-Project/package.json
@@ -35,6 +35,7 @@
   "devDependencies": {
     "@types/sortablejs": "^1.15.7",
     "@vitejs/plugin-vue": "^4.6.2",
+    "babel-polyfill": "^6.26.0",
     "http-proxy-middleware": "^3.0.0",
     "unplugin-auto-import": "^0.17.6",
     "vite": "^4.4.9"
diff --git a/UI-Project/src/App.vue b/UI-Project/src/App.vue
index e15be3b..fad63a4 100644
--- a/UI-Project/src/App.vue
+++ b/UI-Project/src/App.vue
@@ -1,14 +1,23 @@
 <template>
-
   <router-view></router-view>
-
 </template>
 <script setup>
-import {ref} from 'vue'
-import { RouterView } from 'vue-router'
+import {onMounted} from 'vue'
+import DevicePixelRatio from '@/utils/evicePixelRatio.js';
 
+// 瀹氫箟涓�涓嚱鏁版潵璋冩暣 body 鐨勭缉鏀炬瘮渚�
+// function bodyScale() {
+//   const deviceheight = document.documentElement.clientHeight;
+//   const scale = deviceheight / 740;
+//   document.body.style.zoom = scale;
+// }
+
+// 鍦ㄧ粍浠舵寕杞芥椂鎵ц
+// onMounted(() => {
+//   new DevicePixelRatio().init();
+//   bodyScale();
+// });
 </script>
-
 <style scoped>
-
-</style>
+/* 浣犵殑鏍峰紡鍐呭 */
+</style>
\ No newline at end of file
diff --git a/UI-Project/src/lang/zh.js b/UI-Project/src/lang/zh.js
index 764f1f3..113d83b 100644
--- a/UI-Project/src/lang/zh.js
+++ b/UI-Project/src/lang/zh.js
@@ -615,23 +615,58 @@
           station :'宸ヤ綅',
       },
       Mounting:{
-          previewproject :'閫夋嫨棰勮宸ョ▼',
-          loadinglinea :'涓婄墖绾�',
-          loadingline :'涓婄墖绾匡細',
-          inloadingline :'璇烽�夋嫨涓婄墖绾�',
-          oneloadingline :'涓�鍙蜂笂鐗囩嚎',
-          twoloadingline :'浜屽彿涓婄墖绾�',
-          waiting :'绛夊緟涓�',
-          setparameters :'璁剧疆鍙傛暟',
-          project :'宸ョ▼鍙�',
-          projecta :'宸ョ▼鍙凤細',
-          width :'鍘熺墖瀹�',
-          height :'鍘熺墖楂�',
-          thickness :'鍘熺墖鍘�',
-          projectnumber :'宸ョ▼鍘熺墖搴忓彿',
-          state :'鐘舵��',
-          createtime :'鍒涘缓鏃堕棿',
-          all :'鍏ㄩ��',
-   
-      }
-  }
\ No newline at end of file
+          previewproject: '閫夋嫨棰勮宸ョ▼',
+          loadinglinea: '涓婄墖绾�',
+          loadingline: '涓婄墖绾匡細',
+          inloadingline: '璇烽�夋嫨涓婄墖绾�',
+          oneloadingline: '涓�鍙蜂笂鐗囩嚎',
+          twoloadingline: '浜屽彿涓婄墖绾�',
+          waiting: '绛夊緟涓�',
+          pass: '閫氳繃',
+          setparameters: '璁剧疆鍙傛暟',
+          project: '宸ョ▼鍙�',
+          projecta: '宸ョ▼鍙凤細',
+          width: '鍘熺墖瀹�',
+          height: '鍘熺墖楂�',
+          thickness: '鍘熺墖鍘�',
+          projectnumber: '宸ョ▼鍘熺墖搴忓彿',
+          state: '鐘舵��',
+          createtime: '鍒涘缓鏃堕棿',
+          all: '鍏ㄩ��',
+          removalmethod: '璇烽�夋嫨闄よ啘鏂瑰紡',
+          removalmethodp: '闄よ啘鏂瑰紡',
+          removalmethoda: '闄よ啘鏂瑰紡锛�',
+          noremoval: '涓嶉櫎鑶�',
+          coarselyground: '绮楃(',
+          finegrinding: '绮剧(',
+      },
+    hellow: {
+        createtask: '鍒涘缓浠诲姟',
+        starttask: '寮�濮嬩换鍔�',
+        pstarttask: '鏄惁寮�濮嬩换鍔★紵',
+        stoptask: '鍋滄浠诲姟',
+        pstoptask: '鏄惁鍋滄浠诲姟锛�',
+        currenttask: '褰撳墠浠诲姟锛�',
+        claimednumber: '宸查鍙栭厤瀵规暟閲忥細',
+        linenumber: '杩涘叆涓┖绾挎暟閲忥細',
+        order: '鍑虹墖椤哄簭',
+        thickness: '鍘氬害',
+        coatingtypes: '鑶滅郴',
+        height: '闀�',
+        width: '瀹�',
+        state: '鐘舵��',
+        cardnumber: '娴佺▼鍗″彿',
+        cardnumbera: '娴佺▼鍗″彿锛�',
+        layernumber: '灞傚彿',
+        totalnumber: '鎬荤墖鏁�',
+        pairsnumber: '宸查厤瀵规暟閲�',
+        missingnumber: '缂虹墖鏁伴噺',
+        operate: '鎿嶄綔',
+        claimquest: '棰嗗彇浠诲姟',
+        pclaimquest: '鏄惁棰嗗彇浠诲姟锛�',
+        missingfilms: '缂虹墖璇︽儏',
+        forcedfilming: '寮哄埗鍑虹墖',
+        pforcedfilming: '鏄惁寮哄埗鍑虹墖锛�',
+        brokenpieces: '鐮存崯鐗囨暟',
+    }
+}
\ No newline at end of file
diff --git a/UI-Project/src/main.js b/UI-Project/src/main.js
index 276e058..999783c 100644
--- a/UI-Project/src/main.js
+++ b/UI-Project/src/main.js
@@ -1,7 +1,6 @@
 import './assets/main.css'
- 
-import { createApp } from 'vue'
-import { createPinia } from 'pinia'
+import {createApp} from 'vue'
+import {createPinia} from 'pinia'
 import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
 import App from './App.vue'
 import router from './router'
@@ -12,12 +11,12 @@
 import 'vxe-table/lib/style.css'
 import i18n from '@/lang'
 // import Echarts from "vue-echarts"
-import * as echarts from "echarts"
 // echarts.registerMap('china', china)
 // Vue.prototype.$echarts = echarts
 // app.component("v-chart", Echarts)
 // app.config.globalProperties.$echarts = echarts
 import * as ElementPlusIconsVue from '@element-plus/icons-vue'
+import 'babel-polyfill'
 
 const app = createApp(App)
 for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
diff --git a/UI-Project/src/router/index.js b/UI-Project/src/router/index.js
index 1d85910..73a2754 100644
--- a/UI-Project/src/router/index.js
+++ b/UI-Project/src/router/index.js
@@ -95,13 +95,18 @@
       /*----------- 鎺扮墖/璇嗗埆 ----------------*/
     {
       path: 'Identify',
-      name: 'Identify',
-      component: () => import('../views/Identify/identify.vue'),
-      children:[
+      name: 'ident',
+      component: () => import('../views/Identify/ident.vue'),
+      children: [
         {
           path: '/Identify/identify',
           name: 'identify',
           component: () => import('../views/Identify/identify.vue')
+        },
+        {
+          path: '/Identify/identifwu',
+          name: 'identifwu',
+          component: () => import('../views/Identify/identifwu.vue')
         },
       ]
     },
@@ -121,6 +126,11 @@
         name: 'cachingun',
         component: () => import('../views/Caching/cachingun.vue')
       },
+      {
+        path: '/Caching/cachingyiwu',
+        name: 'cachingyiwu',
+        component: () => import('../views/Caching/cachingyiwu.vue')
+      },
     ]
   },
   /*----------- 纾ㄨ竟锛堝喎鍔犲伐锛� ----------------*/
@@ -138,6 +148,11 @@
       path: '/StockBasicData/stockBasicDatatwo',
       name: 'stockBasicDatatwo',
       component: () => import('../views/StockBasicData/stockBasicDatatwo.vue')
+    },
+    {
+      path: '/StockBasicData/stockBasicyiwu',
+      name: 'stockBasicyiwu',
+      component: () => import('../views/StockBasicData/stockBasicyiwu.vue')
     },
   ]
 },
@@ -283,7 +298,7 @@
     path: 'reportWork',
     name: 'reportWork',
     component: () => import('../views/ReportWork/reportWork.vue'),
-    children:[
+    children: [
       {
         path: '/ReportWork/reportWork',
         name: 'reportWork',
@@ -291,19 +306,20 @@
       },
     ]
   },
-  /*----------- 鎶ヨ〃绠$悊 ----------------*/
-  {
-    path: 'reportmanage',
-    name: 'reportmanage',
-    component: () => import('../views/Reportmanage/reportmanage.vue'),
-    children:[
-      {
-        path: '/Reportmanage/reportmanage',
-        name: 'reportmanage',
-        component: () => import('../views/Reportmanage/reportmanage.vue')
-      },
-    ]
-  },
+
+        /*----------- 涓┖ ----------------*/
+        {
+          path: 'hollow',
+          name: 'hollowequipment',
+          component: () => import('../views/hollow/hollowequipment.vue'),
+          children: [
+            {
+              path: '/hollow/hollowequipment',
+              name: 'hollowequipment',
+              component: () => import('../views/hollow/hollowequipment.vue')
+            },
+          ]
+        },
         /*----------- 绠$悊绯荤粺 ----------------*/
         {
           path: 'sys',
diff --git a/UI-Project/src/utils/evicePixelRatio.js b/UI-Project/src/utils/evicePixelRatio.js
new file mode 100644
index 0000000..6c29f41
--- /dev/null
+++ b/UI-Project/src/utils/evicePixelRatio.js
@@ -0,0 +1,57 @@
+/**
+ * @description 鏍℃windows椤甸潰鍦ㄧ郴缁熻繘琛岀缉鏀惧悗瀵艰嚧椤甸潰琚斁澶х殑闂锛岄�氬父鏀惧ぇ姣斾緥鏄�125%銆�150%
+ * **/
+
+class DevicePixelRatio {
+	constructor() {
+	}
+
+	//鑾峰彇绯荤粺绫诲瀷
+	_getSystem() {
+		let flag = false;
+		var agent = navigator.userAgent.toLowerCase();
+		if (agent.indexOf("windows") >= 0) {
+			return true;
+		}
+	}
+
+	//鑾峰彇椤甸潰缂╂斁姣斾緥
+	_addHandler(element, type, handler) {
+		if (element.addEventListener) {
+			element.addEventListener(type, handler, false);
+		} else if (element.attachEvent) {
+			element.attachEvent("on" + type, handler);
+		} else {
+			element["on" + type] = handler;
+		}
+	}
+
+	//鏍℃娴忚鍣ㄧ缉鏀炬瘮渚�
+	_correct() {
+		let t = this;
+		//椤甸潰devicePixelRatio锛堣澶囧儚绱犳瘮渚嬶級鍙樺寲鍚庯紝璁$畻椤甸潰body鏍囩zoom淇敼鍏跺ぇ灏忥紝鏉ユ姷娑坉evicePixelRatio甯︽潵鐨勫彉鍖栥��
+		document.getElementsByTagName('body')[0].style.zoom = 1 / window.devicePixelRatio;
+	}
+
+	//鐩戝惉椤甸潰缂╂斁
+	_watch() {
+		let t = this;
+		t._addHandler(window, 'resize', function () { //娉ㄦ剰杩欎釜鏂规硶鏄В鍐冲叏灞�鏈変袱涓獁indow.resize
+			//閲嶆柊鏍℃
+			t._correct()
+		})
+	}
+
+	//鍒濆鍖栭〉闈㈡瘮渚�
+	init() {
+		let t = this;
+		if (t._getSystem()) { //鍒ゆ柇璁惧锛岀洰鍓嶅彧鍦╳indows绯荤粺涓嬫牎姝f祻瑙堝櫒缂╂斁姣斾緥
+			//鍒濆鍖栭〉闈㈡牎姝f祻瑙堝櫒缂╂斁姣斾緥
+			t._correct();
+			//寮�鍚洃鍚〉闈㈢缉鏀�
+			t._watch();
+		}
+	}
+}
+
+export default DevicePixelRatio;
diff --git a/UI-Project/src/views/Caching/cachingbefore.vue b/UI-Project/src/views/Caching/cachingbefore.vue
index 9174570..ae01dab 100644
--- a/UI-Project/src/views/Caching/cachingbefore.vue
+++ b/UI-Project/src/views/Caching/cachingbefore.vue
@@ -1,30 +1,28 @@
 <script setup>
-import {Search} from "@element-plus/icons-vue";
-import {reactive} from "vue";
+import {onBeforeUnmount, onMounted, onUnmounted, ref} from "vue";
 import {useRouter} from "vue-router"
-const router = useRouter()
-const adda = ref(false)
-import { WebSocketHost ,host} from '@/utils/constants'
+import {host, WebSocketHost} from '@/utils/constants'
 
 import request from "@/utils/request"
-import { ref, onMounted , onBeforeUnmount,onUnmounted} from "vue";
-import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService';
+import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
 // import { ref } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
+import {ElMessage, ElMessageBox} from 'element-plus'
 //  import LanguageMixin from './lang/LanguageMixin'
+import {useI18n} from 'vue-i18n'
 
-import { useI18n } from 'vue-i18n'
-  const { t } = useI18n()
-  let language = ref(localStorage.getItem('lang') || 'zh')
+const router = useRouter()
+const adda = ref(false)
+const {t} = useI18n()
+let language = ref(localStorage.getItem('lang') || 'zh')
 const tableData = ref([])
 const slot = ref('')
 const adjustedRects = ref([]);
-onMounted(async () => {  
-  try {  
+onMounted(async () => {
+  try {
     const response = await request.post('/cacheGlass/edgStorageCage/selectEdgStorageCage'); // 鏇挎崲涓轰綘鐨凙PI绔偣  
-    if (response.code === 200) {  
+    if (response.code === 200) {
       const rawRects = response.data; // 璁剧疆鐭╁舰鏁版嵁  
-          tableData.value = response.data
+      tableData.value = response.data
           console.log(response.data);
           adjustedRects.value = rawRects.map(rect => ({  
             ...rect, // 澶嶅埗鍘熷瀵硅薄鐨勫叾浠栧睘鎬�  
@@ -105,7 +103,6 @@
   closeWebSocket();
 });
 </script>
-
 <template>
   <div style="height: 500px;">
     <el-card style="flex: 1;margin-left: 10px;margin-top: 20px;" v-loading="loading">
diff --git a/UI-Project/src/views/Caching/cachingyiwu.vue b/UI-Project/src/views/Caching/cachingyiwu.vue
new file mode 100644
index 0000000..6f75e6a
--- /dev/null
+++ b/UI-Project/src/views/Caching/cachingyiwu.vue
@@ -0,0 +1,205 @@
+<script setup>
+import {onBeforeUnmount, onMounted, onUnmounted, ref} from "vue";
+import {useRouter} from "vue-router"
+import {host, WebSocketHost} from '@/utils/constants'
+
+import request from "@/utils/request"
+import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
+// import { ref } from 'vue'
+import {ElMessage, ElMessageBox} from 'element-plus'
+//  import LanguageMixin from './lang/LanguageMixin'
+import {useI18n} from 'vue-i18n'
+
+const router = useRouter()
+const adda = ref(false)
+const {t} = useI18n()
+let language = ref(localStorage.getItem('lang') || 'zh')
+const tableData = ref([])
+const slot = ref('')
+const adjustedRects = ref([]);
+onMounted(async () => {
+  try {
+    const response = await request.post('/cacheGlass/edgStorageCage/selectEdgStorageCage'); // 鏇挎崲涓轰綘鐨凙PI绔偣  
+    if (response.code === 200) {
+      const rawRects = response.data; // 璁剧疆鐭╁舰鏁版嵁  
+      tableData.value = response.data
+      console.log(response.data);
+      adjustedRects.value = rawRects.map(rect => ({
+        ...rect, // 澶嶅埗鍘熷瀵硅薄鐨勫叾浠栧睘鎬�
+        width: rect.width * 0.5,
+        id: rect.id * 10,
+      }));
+      console.log(adjustedRects.value);
+    } else {
+      ElMessage.warning(res.msg)
+    }
+  } catch (error) {
+    // console.error('Error fetching rects :', error);  
+  }
+});
+const toggleEnableState = async (row) => {
+  const newState = row.enable_state === 1 ? 0 : 1;
+  // 鍙戦�佽姹傚埌鍚庣鏇存柊鐘舵�侊紙杩欓噷鐪佺暐浜嗗疄闄呯殑璇锋眰閫昏緫锛�  
+  const response = await request.post('/cacheGlass/edgStorageCage/updateEdgStorageCage', {
+    id: row.id,
+    enableState: newState
+  });
+  if (response.code === 200) {
+    ElMessage.success(response.message);
+  } else {
+    ElMessage.error(response.message);
+  }
+  row.enable_state = newState;
+};
+const open = async (row) => {
+  try {
+    const confirmResult = await ElMessageBox.confirm(
+        t('sorter.information'),
+        t('sorter.prompt'),
+        {
+          confirmButtonText: t('sorter.yes'),
+          cancelButtonText: t('sorter.cancel'),
+          type: 'warning',
+        }
+    );
+    if (confirmResult === 'confirm') {
+      var url = "/cacheGlass/edgStorageCage/edgStorageCageGlass?edgStorageCageId=" + row.id;
+      console.log(row);
+      const response = await request.post(url, {
+        glassId: row.glass_id
+      })
+      if (response.code === 200) {
+        ElMessage.success(response.message);
+      } else {
+        ElMessage.error(response.msg);
+      }
+    }
+  } catch (error) {
+    console.error('鍙戠敓閿欒:', error);
+  }
+};
+let socket = null;
+const socketUrl = `ws://${WebSocketHost}:${host}/api/cacheGlass/api/talk/cacheGlass`;
+// 瀹氫箟娑堟伅澶勭悊鍑芥暟锛屾洿鏂� receivedData 鍙橀噺
+const handleMessage = (data) => {
+  // 鏇存柊 tableData 鐨勬暟鎹�
+  tableData.value = data.EdgStorageCageinfos[0]
+  // adjustedRects.value = data.EdgStorageCageinfos[0]
+  adjustedRects.value = data.EdgStorageCageinfos[0].map(rect => ({
+    ...rect, // 澶嶅埗鍘熷瀵硅薄鐨勫叾浠栧睘鎬�
+    width: rect.width * 0.5,
+    id: rect.id * 10,
+  }));
+
+};
+// 鍒濆鍖� WebSocket锛屽苟浼犻�掓秷鎭鐞嗗嚱鏁�
+onMounted(() => {
+  socket = initializeWebSocket(socketUrl, handleMessage);
+});
+onUnmounted(() => {
+  if (socket) {
+    closeWebSocket(socket);
+  }
+});
+onBeforeUnmount(() => {
+  console.log("鍏抽棴浜�")
+  closeWebSocket();
+});
+</script>
+<template>
+  <div style="height: 500px;">
+    <el-card style="flex: 1;margin-left: 10px;margin-top: 20px;" v-loading="loading">
+      <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
+        <el-table height="340" ref="table"
+                  @selection-change="handleSelectionChange"
+                  :data="tableData" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
+          <el-table-column prop="slot" align="center" :label="$t('sorter.gridnumber')" min-width="80"/>
+          <el-table-column prop="glass_id" align="center" :label="$t('sorter.glassnumber')" min-width="80"/>
+          <el-table-column prop="width" align="center" :label="$t('sorter.width')" min-width="120"/>
+          <el-table-column prop="height" align="center" :label="$t('sorter.height')" min-width="120"/>
+          <el-table-column
+              align="center"
+              :label="$t('sorter.startstatus')"
+              min-width="80"
+              prop="enable_state"
+          >
+            <template #default="scope">
+              <el-tag
+                  :type="scope.row.enable_state === 1 ? 'success' : 'danger'"
+                  @click="toggleEnableState(scope.row)"
+              >
+                {{ scope.row.enable_state === 1 ? $t('sorter.start') : $t('sorter.disable') }}
+              </el-tag>
+            </template>
+            <!-- <template #default="scope">
+              <el-tag type="success" >{{ scope.row.enable_state==1?"鍚敤":"鏈惎鐢�"  }}</el-tag>
+            </template> -->
+          </el-table-column>
+          <el-table-column fixed="right" :label="$t('sorter.operate')" align="center" width="200">
+            <template #default="scope">
+              <!-- <el-button size="mini" type="text" plain @click="handleBindRacka(scope.row)">鎶ョ己</el-button> -->
+              <el-button size="mini" type="text" plain @click="open(scope.row)">{{
+                  $t('sorter.deficiencieste')
+                }}
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+    </el-card>
+    <div class="awatch">
+      <img src="../../assets/woshihuancun.png" alt=""
+           style="width: 70%;height: 90%;margin-left: 200px;margin-top: 20px;position: relative;">
+      <div style="position: relative; width: 500px;height: 95px;margin-top: -165px;margin-left: 450px;">
+        <div
+            v-for="(rect, index) in adjustedRects"
+            :key="rect"
+            :style="{ position: 'absolute',
+       top: `${rect.id}px`, left: `10px`, width: `${rect.width}px`, height: `5px`,
+      backgroundColor: '#409EFF'
+       }"
+        >
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<style scoped>
+
+#dt {
+  display: block;
+  float: left;
+  line-height: 20px;
+  margin-left: 100px;
+}
+
+#dta {
+  display: block;
+  float: left;
+  line-height: 20px;
+  margin-left: 80%;
+}
+
+#dialog-footer {
+  text-align: center;
+  margin-top: -15px;
+}
+
+#message {
+  text-align: center;
+  align-items: center;
+  color: black;
+  width: 200px;
+  height: 100px;
+  background-color: #337ecc;
+  margin-left: 28%;
+}
+
+.awatch {
+  height: 460px;
+  width: 1500px;
+  max-width: 100%;
+}
+
+</style>
diff --git a/UI-Project/src/views/GlassStorage/rawfilmstorage.vue b/UI-Project/src/views/GlassStorage/rawfilmstorage.vue
index f81a1eb..731eed9 100644
--- a/UI-Project/src/views/GlassStorage/rawfilmstorage.vue
+++ b/UI-Project/src/views/GlassStorage/rawfilmstorage.vue
@@ -1,18 +1,16 @@
 <script lang="ts" setup>
-import {Search} from "@element-plus/icons-vue";
-import {reactive} from "vue";
+import {onBeforeUnmount, onMounted, reactive, ref} from "vue";
 import {useRouter} from "vue-router"
-const router = useRouter()
-import type { TableColumnCtx } from 'element-plus'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { useI18n } from 'vue-i18n'
-import { WebSocketHost ,host} from '@/utils/constants'
+import {ElMessage, ElMessageBox} from 'element-plus'
+import {useI18n} from 'vue-i18n'
+import {host, WebSocketHost} from '@/utils/constants'
 import request from "@/utils/request"
-import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService';
-import { ref, onMounted, onUnmounted, onBeforeUnmount } from "vue";
+import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
+
+const router = useRouter()
 const tableDataa = ref([])
 const tableDatab = ref([])
-const { t } = useI18n()
+const {t} = useI18n()
 const add = ref(false)
 const dialogFormVisiblea = ref(false)
 const dialogFormVisibleb = ref(false)
@@ -59,7 +57,7 @@
           });
 onMounted(() => {
   // closeWebSocket();
-  debugger
+  // debugger  // 鏂偣
   // console.log("--------------webSocket")
     socket = initializeWebSocket(socketUrl, handleMessage);
 });
@@ -324,17 +322,26 @@
 }); 
 </script>
 <template>
-  <div>
-  <div style="display: flex; flex-direction: row; align-items: center; margin-top: 20px;">  
-    <el-button style="margin-left: 20px;" id="searchButton" type="success" @click="dialogFormVisiblea = true">{{ $t('film.mes') }}</el-button>
-  <el-button style="margin-left: 20px;" id="searchButton" type="success" @click="handleBinda">{{ $t('film.warehousing') }}</el-button>
-  <el-button style="margin-left: 20px;" id="searchButton" type="success" @click="handleBindc">{{ $t('film.pwarehousing') }}</el-button>
-  <el-button style="margin-left: 20px;" id="searchButton" type="success" @click="handleBinde">{{ $t('film.pwareout') }}</el-button>
-    <el-date-picker style="margin-left: 10px;"  v-model="timeRange" type="datetimerange"
-        format="YYYY/MM/DD HH:mm:ss"  
-        value-format="YYYY-MM-DD HH:mm:ss"
-        :start-placeholder="$t('film.starttime')" 
-        :end-placeholder="$t('film.endtime')" 
+  <div style="height: 500px;">
+    <div style="display: flex; flex-direction: row; align-items: center; margin-top: 20px;">
+      <el-button style="margin-left: 20px;" id="searchButton" type="success" @click="dialogFormVisiblea = true">
+        {{ $t('film.mes') }}
+      </el-button>
+      <el-button style="margin-left: 20px;" id="searchButton" type="success" @click="handleBinda">
+        {{ $t('film.warehousing') }}
+      </el-button>
+      <el-button style="margin-left: 20px;" id="searchButton" type="success" @click="handleBindc">
+        {{ $t('film.pwarehousing') }}
+      </el-button>
+      <el-button style="margin-left: 20px;" id="searchButton" type="success" @click="handleBinde">{{
+          $t('film.pwareout')
+        }}
+      </el-button>
+      <el-date-picker style="margin-left: 10px;" v-model="timeRange" type="datetimerange"
+                      format="YYYY/MM/DD HH:mm:ss"
+                      value-format="YYYY-MM-DD HH:mm:ss"
+                      :start-placeholder="$t('film.starttime')"
+                      :end-placeholder="$t('film.endtime')"
         :default-time="defaultTime" />
     <el-select v-model="selectValuesa[0]" clearable :placeholder="$t('film.taskstatus')" style="margin-left: 10px;" >
       <el-option :label="$t('film.built')" value="1"></el-option>
@@ -383,8 +390,9 @@
       </div>
     </el-card>
     <div class="awatch">
-    <img src="../../assets/ypcc.png" alt="" style="width: 100%;height: 120%;margin-left: 10px;position: relative;margin-top: -20px;"> 
-</div>
+      <img src="../../assets/ypcc.png" alt=""
+           style="width: 100%;height: 120%;margin-left: -10px;position: relative;margin-top: -20px;">
+    </div>
     <el-dialog v-model="dialogFormVisiblea" top="5vh" width="85%" >
     <el-table  ref="table" style="margin-top: 20px;height: 700px;"
         :data="tableDatab" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
diff --git a/UI-Project/src/views/Identify/ident.vue b/UI-Project/src/views/Identify/ident.vue
new file mode 100644
index 0000000..46345b7
--- /dev/null
+++ b/UI-Project/src/views/Identify/ident.vue
@@ -0,0 +1,53 @@
+<script setup>
+let indexFlag = $ref(1)
+
+function changeRouter(index) {
+  indexFlag = index
+}
+
+</script>
+
+<template>
+  <!-- <div id="main-div"> -->
+
+
+  <div id="main-body">
+    <router-view/>
+  </div>
+  <!-- </div> -->
+</template>
+
+<style scoped>
+#main-div {
+  width: 100%;
+  height: 100%;
+}
+
+#div-title {
+  height: 2%;
+  width: 100%;
+}
+
+#searchButton {
+  margin-top: -5px;
+  margin-left: 1rem;
+}
+
+/* #searchButton1{
+//margin-left: 10rem;
+} */
+/*main-body鏍峰紡*/
+#main-body {
+  width: 100%;
+  height: 95%;
+  /* margin-top: 1%; */
+}
+
+#select {
+  margin-left: 0.5rem;
+}
+
+:deep(.indexTag .el-breadcrumb__inner) {
+  color: #5CADFE !important;
+}
+</style>
\ No newline at end of file
diff --git a/UI-Project/src/views/Identify/identifwu.vue b/UI-Project/src/views/Identify/identifwu.vue
new file mode 100644
index 0000000..651915c
--- /dev/null
+++ b/UI-Project/src/views/Identify/identifwu.vue
@@ -0,0 +1,345 @@
+<template>
+  <div style="height: 500px;">
+    <div style="display: flex;">
+      <el-input v-model="inputValue" style="margin-left: 15px;margin-top: 10px;width: 240px" placeholder="璇疯緭鍏ュ伐绋嬪彿"
+                @blur="handleBlur"/>
+      <el-pagination
+          v-model:current-page="currentPage"
+          :page-size="pageSize"
+          :size="size"
+          :disabled="disabled"
+          layout="prev, pager, next, jumper"
+          :total="totalPages"
+          @current-change="handleCurrentChange"
+      />
+    </div>
+    <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 800px;" v-loading="loading">
+      <el-scrollbar height="750px" width="1400px" style="background-color: #e9e9eb;">
+        <div style="position: relative;">
+          <div
+              v-for="(rect, index) in adjustedRects"
+              :key="rect.glass_id"
+              class="rect"
+              @click="showDialog(rect.glass_id)"
+              :style="{ position: 'absolute',
+      top: `${rect.y_axis}px`, left: `${rect.x_axis}px`, width: `${rect.width}px`, height: `${rect.height}px`,
+      backgroundColor: rect.isActive ? '#ADFF2F' : getRectColor(rect.glass_state)
+       }"
+          >
+            <!-- 绠ご -->
+            <!-- <div id="arrow"></div>
+            <div id="line"></div>   -->
+            <div class="centered-text">
+              <div>{{ rect.glass_id }}</div>
+              <div>{{ rect.widtha }}*{{ rect.heighta }}</div>
+            </div>
+          </div>
+        </div>
+      </el-scrollbar>
+      <el-dialog v-model="blind" top="30vh" width="15%" style="text-align: center;" @close="handleDialogClose">
+        <el-button :disabled="currentGlassRect?.glass_state === 8 || currentGlassRect?.glass_state === 9" type="warning"
+                   plain :icon="Delete" @click="handleDamage(currentGlassId)" style="width: 140px;margin-left: 10px;">
+          {{ $t('order.dilapidation') }}
+        </el-button>
+        <el-button :disabled="currentGlassRect?.glass_state === 9 || currentGlassRect?.glass_state === 8" type="danger"
+                   plain @click="handleManualTake(currentGlassId)" style="width: 140px;margin-top: 10px;">
+          <el-icon class="el-icon--right">
+            <Upload/>
+          </el-icon>
+          {{ $t('order.takeaway') }}
+        </el-button>
+      </el-dialog>
+    </el-card>
+  </div>
+</template>
+<script setup lang="ts">
+import {ElMessage} from 'element-plus'
+import {computed, onMounted, onUnmounted, ref} from 'vue';
+import request from "@/utils/request"
+import {host, WebSocketHost} from '@/utils/constants'
+import {useI18n} from 'vue-i18n'
+
+const {t} = useI18n()
+let language = ref(localStorage.getItem('lang') || 'zh')
+const blind = ref(false)
+const olWidth = ref();
+const olHeight = ref();
+const glass_id = ref();
+const inputValue = ref('');
+const currentGlassId = ref(null); // 瀛樺偍褰撳墠鐐瑰嚮鐭╁舰鐨� glass_id  
+const currentstate = ref(null);
+const adjustedRects = ref([]);
+const raw = ref([]);
+let webSocket: WebSocket | null = null;
+const totalPages = ref(0);
+const pageSize = ref(1);
+const currentPage = ref('');
+const disabled = false;
+const size = 'small';
+const rawData = ref([]);
+// const handleBind = (row) => {
+//   blind.value = true; // 鎵撳紑缁戝畾鏋跺瓙瀵硅瘽妗�
+// };
+// 鏄剧ず瀵硅瘽妗嗗苟璁剧疆褰撳墠 glass_id  
+const currentGlassRect = computed(() => {
+  return adjustedRects.value.find(rect => rect.glass_id === currentGlassId.value);
+});
+
+function showDialog(glassId: number) {
+  currentGlassId.value = glassId;
+  blind.value = true;
+  adjustedRects.value = adjustedRects.value.map(rect =>
+      rect.glass_id === glassId ? {...rect, isActive: true} : rect
+  );
+}
+
+const handleDialogClose = () => {
+  adjustedRects.value = adjustedRects.value.map(rect => ({
+    ...rect,
+    isActive: false
+  }));
+}
+// 鐮存崯
+const handleDamage = async () => {
+  try {
+    const response = await request.post('/cacheGlass/taskCache/identControls', {
+      glassId: currentGlassId.value,
+      state: 8,
+      line: 1001,
+      workingProcedure: '鍒囧壊',
+    })
+    if (response.code == 200) {
+      ElMessage.success(response.message);
+      // window.location.reload() 
+      blind.value = false;
+      updateRectStatus(currentGlassId.value, 8);
+      findEngineering()
+    } else {
+      // 璇锋眰澶辫触锛屾樉绀洪敊璇秷鎭�
+      ElMessage.error(response.msg);
+    }
+  } catch (error) {
+    // 澶勭悊閿欒
+    console.error(error);
+  }
+}
+// 浜哄伐鎷胯蛋
+const handleManualTake = async () => {
+  try {
+    // var url="/cacheGlass/taskCache/identControls?identId="+currentGlassId.value+'&controlsId='+200;
+    //   console.log(url);
+    //   const response = await request.post(url)
+    const response = await request.post('/cacheGlass/taskCache/identControls', {
+      glassId: currentGlassId.value,
+      state: 9,
+      line: 1001,
+      workingProcedure: '鍒囧壊',
+    })
+    if (response.code == 200) {
+      // 缁戝畾鎴愬姛锛屽鐞嗛�昏緫
+      ElMessage.success(response.message);
+      // window.location.reload() 
+      blind.value = false;
+      updateRectStatus(currentGlassId.value, 9);
+      findEngineering()
+    } else {
+      // 璇锋眰澶辫触锛屾樉绀洪敊璇秷鎭�
+      ElMessage.error(response.msg);
+    }
+  } catch (error) {
+    // 澶勭悊閿欒
+    console.error(error);
+  }
+}
+const handleBlur = async () => {
+  if (inputValue.value) {
+    var url = "/cacheGlass/taskCache/cutTerritory?current=" + inputValue.value;
+    const response = await request.post(url)
+    if (response.code === 200) {
+      const rawRects = response.data[0];
+      rawData.value = response.data;
+      totalPages.value = rawData.value.length;
+      const scaleFactor = 1621.78 / 6000;
+      const scaleFactory = 750 / 3300;
+      adjustedRects.value = rawRects.map(rect => ({
+        ...rect,
+        x_axis: (6000 - (rect.x_axis + rect.width)) * scaleFactor,
+        y_axis: rect.y_axis * scaleFactory,
+        width: rect.width * scaleFactor,
+        widtha: rect.width,
+        heighta: rect.height,
+        height: rect.height * scaleFactory,
+        glass_state: rect.glass_state
+      }));
+      // 濡傛灉WebSocket宸茶繛鎺ワ紝鍒欏叧闂�  
+      if (webSocket) {
+        webSocket.close();
+        webSocket = null;
+      }
+      currentPage.value = 1;
+    }
+  } else {
+    connectWebSocket();
+  }
+};
+const findEngineering = async () => {
+  if (inputValue.value) {
+    var url = "/cacheGlass/taskCache/cutTerritory?current=" + inputValue.value;
+    const response = await request.post(url)
+    if (response.code === 200) {
+      rawData.value = response.data;
+    }
+  } else {
+  }
+};
+
+const handleCurrentChange = (val: number) => {
+  currentPage.value = val;
+  // window.localStorage.setItem('pagenumber', currentPage.value).
+  const page = currentPage.value - 1
+  const scaleFactor = 1621.78 / 6000;
+  const scaleFactory = 750 / 3300;
+  adjustedRects.value = rawData.value[page]?.map(rect => ({
+    // adjustedRects.value = rawRects.map(rect => ({
+    ...rect,
+    x_axis: (6000 - (rect.x_axis + rect.width)) * scaleFactor,
+    y_axis: rect.y_axis * scaleFactory,
+    width: rect.width * scaleFactor,
+    widtha: rect.width,
+    heighta: rect.height,
+    height: rect.height * scaleFactory,
+    glass_state: rect.glass_state
+  }));
+};
+
+function getRectColor(state: number): string {
+  switch (state) {
+    case 0:
+      return '#e1f3d8';
+    case 100:
+      return '#c8c9cc';
+    case 110:
+      return '#b3e19d';
+    case 120:
+      return '#f89898';
+    case 8:
+      return '#911005';
+    case 9:
+      return '#f3d19e';
+  }
+}
+
+// 鏇存柊鐭╁舰鐘舵��
+function updateRectStatus(glassId: string, status: number) {
+  adjustedRects.value.forEach(rect => {
+    if (rect.glass_id === glassId) {
+      rect.glass_state = status; // 鏇存柊鐭╁舰鐨勭姸鎬�  
+    }
+  });
+}
+
+const connectWebSocket = () => {
+  if (!webSocket) {
+    const socketUrl = `ws://${WebSocketHost}:${host}/api/cacheGlass/api/talk/cacheGlass`;
+    webSocket = new WebSocket(socketUrl);
+    webSocket.onmessage = (event) => {
+      const data = JSON.parse(event.data);
+      const scaleFactor = 1621.78 / 6000;
+      const scaleFactory = 750 / 3300;
+      if (data.currentCutTerritory && data.currentCutTerritory.length > 0) {
+        const newRects = data.currentCutTerritory[0].map(rect => {
+          const existingRect = adjustedRects.value.find(r => r.glass_id === rect.glass_id);
+
+          if (existingRect) {
+            return {
+              ...existingRect,
+              x_axis: (6000 - (rect.x_axis + rect.width)) * scaleFactor,
+              y_axis: rect.y_axis * scaleFactory,
+              width: rect.width * scaleFactor,
+              height: rect.height * scaleFactory,
+              widtha: rect.width,
+              heighta: rect.height,
+              glass_state: rect.glass_state,
+              // 淇濇寔 isActive 鐘舵�佷笉鍙�
+            };
+          } else {
+            // 濡傛灉涓嶅瓨鍦紝鍒欐坊鍔犳柊鐭╁舰锛岄粯璁� isActive 涓� false
+            return {
+              ...rect,
+              x_axis: (6000 - (rect.x_axis + rect.width)) * scaleFactor,
+              y_axis: rect.y_axis * scaleFactory,
+              width: rect.width * scaleFactor,
+              height: rect.height * scaleFactory,
+              widtha: rect.width,
+              heighta: rect.height,
+              glass_state: rect.glass_state,
+              isActive: false,
+              glass_id: rect.glass_id,
+            };
+          }
+        });
+        adjustedRects.value = newRects;
+      } else if (data.currentCutTerritory == '') {
+        adjustedRects.value = [];
+      }
+    };
+  }
+};
+onMounted(() => {
+  // 鍒濆鏃讹紝濡傛灉杈撳叆妗嗕负绌猴紝鍒欒繛鎺ebSocket  
+  if (!inputValue.value) {
+    connectWebSocket();
+  }
+});
+
+onUnmounted(() => {
+  if (webSocket) {
+    webSocket.close();
+  }
+});
+</script>
+
+<style scoped>
+.rect {
+  border: 1px solid black; /* 璁剧疆鐭╁舰鐨勮竟妗� */
+  /* background-color: lightblue; 璁剧疆鐭╁舰鐨勮儗鏅壊   */
+}
+
+.centered-text {
+  /* 璁剧疆鏂囧瓧灞呬腑鏍峰紡 */
+  /* display: flex; */
+  justify-content: center;
+  align-items: center;
+  height: 100%; /* 纭繚div鍗犳嵁鏁翠釜鐭╁舰鐨勯珮搴� */
+  font-size: small;
+}
+
+#rect {
+  position: relative; /* 纭繚绠ご鍙互鐩稿浜庣煩褰㈠畾浣� */
+  /* 鍏朵粬鏍峰紡 */
+}
+
+#arrow {
+  position: absolute;
+  top: 70%; /* 绠ご浣嶄簬鐭╁舰涓棿 */
+  left: 200px; /* 绠ご鍦ㄧ煩褰㈠乏渚т竴浜涜窛绂� */
+  transform: translateY(-50%); /* 鍨傜洿灞呬腑 */
+  width: 0;
+  height: 0;
+  border-top: 10px solid transparent; /* 涓婅竟妗� */
+  border-bottom: 10px solid transparent; /* 涓嬭竟妗� */
+  border-right: 20px solid #911005; /* 鍙宠竟妗嗭紝褰㈡垚绠ご */
+  /* 鏍规嵁闇�瑕佽皟鏁磋竟妗嗗ぇ灏忓拰棰滆壊 */
+}
+
+#line {
+  position: absolute;
+  top: 70%; /* 鐩寸嚎浣嶄簬鐭╁舰涓棿 */
+  left: 210px; /* 鐩寸嚎鍦ㄧ澶村彸渚т竴浜涜窛绂� */
+  transform: translateY(-50%); /* 鍨傜洿灞呬腑 */
+  height: 2px; /* 鐩寸嚎鐨勯珮搴� */
+  width: 240px; /* 鐩寸嚎鐨勯暱搴︼紝鏍规嵁闇�瑕佽皟鏁� */
+  background-color: #911005; /* 鐩寸嚎鐨勯鑹� */
+}
+
+</style>
\ No newline at end of file
diff --git a/UI-Project/src/views/Identify/identify.vue b/UI-Project/src/views/Identify/identify.vue
index 080aa0b..dc32adf 100644
--- a/UI-Project/src/views/Identify/identify.vue
+++ b/UI-Project/src/views/Identify/identify.vue
@@ -1,15 +1,17 @@
 <template>
-  <div style="display: flex;">
-<el-input v-model="inputValue" style="margin-left: 15px;margin-top: 10px;width: 240px" placeholder="璇疯緭鍏ュ伐绋嬪彿" @blur="handleBlur"/>
-<el-pagination
-      v-model:current-page="currentPage"
-      :page-size="pageSize"
-      :size="size"
-      :disabled="disabled"
-      layout="prev, pager, next, jumper"
-      :total="totalPages"
-      @current-change="handleCurrentChange"
-    />
+  <div style="height: 500px;">
+    <div style="display: flex;">
+      <el-input v-model="inputValue" style="margin-left: 15px;margin-top: 10px;width: 240px" placeholder="璇疯緭鍏ュ伐绋嬪彿"
+                @blur="handleBlur"/>
+      <el-pagination
+          v-model:current-page="currentPage"
+          :page-size="pageSize"
+          :size="size"
+          :disabled="disabled"
+          layout="prev, pager, next, jumper"
+          :total="totalPages"
+          @current-change="handleCurrentChange"
+      />
     </div>
     <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 800px;" v-loading="loading">
       <el-scrollbar height="750px" width="1400px" style="background-color: #e9e9eb;">
@@ -33,29 +35,34 @@
   </div>
   </div> 
    </div>
-  </el-scrollbar>
-  <el-dialog v-model="blind" top="30vh" width="15%" style="text-align: center;" @close="handleDialogClose">
-        <el-button :disabled="currentGlassRect?.glass_state === 8 || currentGlassRect?.glass_state === 9" type="warning" plain :icon="Delete" @click="handleDamage(currentGlassId)"  style="width: 140px;margin-left: 10px;">
+      </el-scrollbar>
+      <el-dialog v-model="blind" top="30vh" width="15%" style="text-align: center;" @close="handleDialogClose">
+        <el-button :disabled="currentGlassRect?.glass_state === 8 || currentGlassRect?.glass_state === 9" type="warning"
+                   plain :icon="Delete" @click="handleDamage(currentGlassId)" style="width: 140px;margin-left: 10px;">
           {{ $t('order.dilapidation') }}
         </el-button>
-        <el-button :disabled="currentGlassRect?.glass_state === 9 || currentGlassRect?.glass_state === 8" type="danger" plain @click="handleManualTake(currentGlassId)" style="width: 140px;margin-top: 10px;">
-          <el-icon class="el-icon--right"><Upload /></el-icon>
-          {{ $t('order.takeaway') }}</el-button>
-  </el-dialog> 
-  </el-card>
-</template>  
-<script setup lang="ts">  
-import { Delete, Upload } from '@element-plus/icons-vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { ref, onMounted, onBeforeUnmount,onUnmounted, computed  } from 'vue';  
+        <el-button :disabled="currentGlassRect?.glass_state === 9 || currentGlassRect?.glass_state === 8" type="danger"
+                   plain @click="handleManualTake(currentGlassId)" style="width: 140px;margin-top: 10px;">
+          <el-icon class="el-icon--right">
+            <Upload/>
+          </el-icon>
+          {{ $t('order.takeaway') }}
+        </el-button>
+      </el-dialog>
+    </el-card>
+  </div>
+</template>
+<script setup lang="ts">
+import {ElMessage} from 'element-plus'
+import {computed, onMounted, onUnmounted, ref} from 'vue';
 import request from "@/utils/request"
-import { WebSocketHost ,host} from '@/utils/constants'
-import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService';
-  import { useI18n } from 'vue-i18n'
-  const { t } = useI18n()
-  let language = ref(localStorage.getItem('lang') || 'zh')
+import {host, WebSocketHost} from '@/utils/constants'
+import {useI18n} from 'vue-i18n'
+
+const {t} = useI18n()
+let language = ref(localStorage.getItem('lang') || 'zh')
 const blind = ref(false)
-const olWidth = ref(); 
+const olWidth = ref();
 const olHeight = ref();
 const glass_id = ref();
 const inputValue = ref('');
diff --git a/UI-Project/src/views/PurchaseReturn/purchaseReturn.vue b/UI-Project/src/views/PurchaseReturn/purchaseReturn.vue
index 3bfe88d..51909ab 100644
--- a/UI-Project/src/views/PurchaseReturn/purchaseReturn.vue
+++ b/UI-Project/src/views/PurchaseReturn/purchaseReturn.vue
@@ -1,15 +1,14 @@
 <script setup lang="ts">
-import {Search ,Delete, Upload,Edit} from "@element-plus/icons-vue";
-import {reactive} from "vue";
+import {nextTick, onBeforeUnmount, onMounted, ref} from "vue";
 import request from "@/utils/request"
-import { ref, onMounted, onBeforeUnmount,nextTick  } from 'vue';  
-import { WebSocketHost ,host} from '@/utils/constants'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService';
-  import { useI18n } from 'vue-i18n'
-  import { useRouter } from 'vue-router'
-  const { t } = useI18n()
-  let language = ref(localStorage.getItem('lang') || 'zh')
+import {host, WebSocketHost} from '@/utils/constants'
+import {ElMessage} from 'element-plus'
+import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
+import {useI18n} from 'vue-i18n'
+import {useRouter} from 'vue-router'
+
+const {t} = useI18n()
+let language = ref(localStorage.getItem('lang') || 'zh')
 const dialogFormVisible = ref(false)
 const dialogFormVisiblea = ref(true)
 const dialogFormVisibleb = ref(false)
@@ -770,9 +769,9 @@
     }
 }
 catch (error) {
-    // 澶勭悊閿欒
-    // console.error(error);
-  }
+  // 澶勭悊閿欒
+  // console.error(error);
+}
 }
 onBeforeUnmount(() => {
   console.log("鍏抽棴浜�")
@@ -780,17 +779,34 @@
 });
 </script>
 <template>
-  <div style="margin-top: 10px;">
-     <el-button style="margin-left: 15px;" id="searchButton" type="primary" @click="dialogFormVisiblea = true;dialogFormVisible = false;dialogFormVisibleb = false;dialogFormVisiblec = false;" >{{ $t('processCard.beforefurnace') }}</el-button>
-     <el-button style="margin-left: 15px;" id="searchButton" type="primary" @click="dialogFormVisible = true;dialogFormVisiblea = false;dialogFormVisibleb = false;dialogFormVisiblec = false;">{{ $t('processCard.intofurnace') }}</el-button>
-    <el-button  id="searchButton" type="success" @click="dialogFormVisibleb = true;dialogFormVisible = false;dialogFormVisiblea = false;dialogFormVisiblec = false;">{{ $t('processCard.outfurnace') }}</el-button>
-    <el-button  id="searchButton" type="info" @click="dialogFormVisiblec = true;dialogFormVisibleb = false;dialogFormVisible = false;dialogFormVisiblea = false">{{ $t('processCard.print') }}</el-button>
-<div v-if="dialogFormVisible" >
-    <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 600px;" v-loading="loading">
-<div style="width: 49%;float: right;background-color: #f4f4f5;height: 430px;">
-    <div v-if="adjustedRects1.length > 0">
-      <!-- <div style="text-align: center;">鐐夊彿锛歿{ engineerIdDisplay }}-{{ adjustedRects[0].temperingLayoutId }}</div>   -->
-    <div style="text-align: center;"> {{ $t('processCard.temperinglayout') }}锛歿{ adjustedRects1[0].engineerId }}-{{ adjustedRects1[0].temperingLayoutId }} </div>
+  <div style="height: 500px;">
+    <div style="margin-top: 10px;">
+      <el-button style="margin-left: 15px;" id="searchButton" type="primary"
+                 @click="dialogFormVisiblea = true;dialogFormVisible = false;dialogFormVisibleb = false;dialogFormVisiblec = false;">
+        {{ $t('processCard.beforefurnace') }}
+      </el-button>
+      <el-button style="margin-left: 15px;" id="searchButton" type="primary"
+                 @click="dialogFormVisible = true;dialogFormVisiblea = false;dialogFormVisibleb = false;dialogFormVisiblec = false;">
+        {{ $t('processCard.intofurnace') }}
+      </el-button>
+      <el-button id="searchButton" type="success"
+                 @click="dialogFormVisibleb = true;dialogFormVisible = false;dialogFormVisiblea = false;dialogFormVisiblec = false;">
+        {{ $t('processCard.outfurnace') }}
+      </el-button>
+      <el-button id="searchButton" type="info"
+                 @click="dialogFormVisiblec = true;dialogFormVisibleb = false;dialogFormVisible = false;dialogFormVisiblea = false">
+        {{ $t('processCard.print') }}
+      </el-button>
+      <div v-if="dialogFormVisible">
+        <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 600px;"
+                 v-loading="loading">
+          <div style="width: 49%;float: right;background-color: #f4f4f5;height: 430px;">
+            <div v-if="adjustedRects1.length > 0">
+              <!-- <div style="text-align: center;">鐐夊彿锛歿{ engineerIdDisplay }}-{{ adjustedRects[0].temperingLayoutId }}</div>   -->
+              <div style="text-align: center;"> {{ $t('processCard.temperinglayout') }}锛歿{
+                  adjustedRects1[0].engineerId
+                }}-{{ adjustedRects1[0].temperingLayoutId }}
+              </div>
     <el-scrollbar height="430px" style="background-color: #e9e9eb;">
     <div  style="position: relative;max-width: 1400px;">  
       <div  
@@ -984,17 +1000,19 @@
       <el-table  
         :data="tableData"  
         style="width: 100%;height: 760px"  
-      >  
-      <el-table-column prop="flowCardId" :label="$t('processCard.flowcard')" width="140" align="center"/>
-      <el-table-column prop="layer" :label="$t('processCard.layer')" align="center" width="52"/>
-      <el-table-column prop="engineerId" :label="$t('processCard.project')" align="center" width="110"/>
-      <el-table-column prop="temperingLayoutId" :label="$t('processCard.temperinglayout')" align="center" width="52"/>
-      <el-table-column prop="temperingFeedSequence" :label="$t('processCard.temperingfeed')" align="center" width="52"/>
-      <el-table-column prop="width" :label="$t('processCard.width')" align="center" width="80"/>
-      <el-table-column prop="height" :label="$t('processCard.height')" align="center" width="80"/>
-      <el-table-column prop="thickness" :label="$t('processCard.thickness')" align="center" width="52"/>
-      </el-table>  
-    </el-dialog>  
+      >
+        <el-table-column prop="flowCardId" :label="$t('processCard.flowcard')" width="140" align="center"/>
+        <el-table-column prop="layer" :label="$t('processCard.layer')" align="center" width="52"/>
+        <el-table-column prop="engineerId" :label="$t('processCard.project')" align="center" width="110"/>
+        <el-table-column prop="temperingLayoutId" :label="$t('processCard.temperinglayout')" align="center" width="52"/>
+        <el-table-column prop="temperingFeedSequence" :label="$t('processCard.temperingfeed')" align="center"
+                         width="52"/>
+        <el-table-column prop="width" :label="$t('processCard.width')" align="center" width="80"/>
+        <el-table-column prop="height" :label="$t('processCard.height')" align="center" width="80"/>
+        <el-table-column prop="thickness" :label="$t('processCard.thickness')" align="center" width="52"/>
+      </el-table>
+  </el-dialog>
+    </div>
   </div>
 </template>
 <style scoped>
diff --git a/UI-Project/src/views/PurchaseReturn/purchaseStorage.vue b/UI-Project/src/views/PurchaseReturn/purchaseStorage.vue
index bba4ca2..f411b80 100644
--- a/UI-Project/src/views/PurchaseReturn/purchaseStorage.vue
+++ b/UI-Project/src/views/PurchaseReturn/purchaseStorage.vue
@@ -1,13 +1,10 @@
 <script setup>
-import {Search} from "@element-plus/icons-vue";
-import {reactive} from "vue";
-import {useRouter} from "vue-router"
-import { ElMessage, ElMessageBox } from 'element-plus'
+import {onBeforeUnmount, onMounted, onUnmounted, ref} from "vue";
+import {ElMessage} from 'element-plus'
 import request from "@/utils/request"
- 
-import { ref, onMounted, onBeforeUnmount,onUnmounted } from 'vue';  
-import { WebSocketHost ,host} from '@/utils/constants'
-import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService';
+import {host, WebSocketHost} from '@/utils/constants'
+import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
+
 const adjustedRects = ref([]);
 const currentGlassId = ref(null);
 const currenttemperingFeedSequence = ref(null);
@@ -161,19 +158,24 @@
   closeWebSocket();
 });
 </script>
- 
+
 <template>
-  <div style="margin-top: 10px;">
-<div>
-    <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 800px;" v-loading="loading">
-      <!-- <el-card style="margin-left: 10px;margin-top: 10px;margin-right: 10px;" v-loading="loading"> -->
-      <div v-if="adjustedRects.length > 0">
-      <div style="text-align: center;">鐐夊彿锛歿{ adjustedRects[0].engineerId }}-{{ adjustedRects[0].temperingLayoutId }}</div>  
-    <el-scrollbar height="750px" width="1400px" style="background-color: #e9e9eb;">
-    <div  style="position: relative;">  
-      <div  
-      v-for="(rect, index) in adjustedRects"
-      :key="index"  
+  <div style="height: 500px;">
+    <div style="margin-top: 10px;">
+      <div>
+        <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 800px;"
+                 v-loading="loading">
+          <!-- <el-card style="margin-left: 10px;margin-top: 10px;margin-right: 10px;" v-loading="loading"> -->
+          <div v-if="adjustedRects.length > 0">
+            <div style="text-align: center;">鐐夊彿锛歿{ adjustedRects[0].engineerId }}-{{
+                adjustedRects[0].temperingLayoutId
+              }}
+            </div>
+            <el-scrollbar height="750px" width="1400px" style="background-color: #e9e9eb;">
+              <div style="position: relative;">
+                <div
+                    v-for="(rect, index) in adjustedRects"
+                    :key="index"
       @click="showDialog(rect)"  
       class="rect"  
       :style="{ position: 'absolute',  top: `${rect.ycoordinate}px`, left: `${rect.xcoordinate}px`,
@@ -187,17 +189,18 @@
   </div>
   </div> 
    </div>
-   </el-scrollbar>
-   </div>
-    </el-card>
-    </div>
-    <el-dialog v-model="blind" top="30vh" width="15%" style="text-align: center;" @close="handleDialogClose">
-        <el-button :disabled="!canSelectProject" type="warning" plain :icon="Delete" @click="handleDamage"  style="width: 140px;margin-left: 10px;">
+            </el-scrollbar>
+          </div>
+        </el-card>
+      </div>
+      <el-dialog v-model="blind" top="30vh" width="15%" style="text-align: center;" @close="handleDialogClose">
+        <el-button :disabled="!canSelectProject" type="warning" plain :icon="Delete" @click="handleDamage"
+                   style="width: 140px;margin-left: 10px;">
           {{ $t('order.dilapidation') }}
         </el-button>
-  </el-dialog> 
+      </el-dialog>
+    </div>
   </div>
- 
 </template>
  
 <style scoped>
diff --git a/UI-Project/src/views/Returns/returns.vue b/UI-Project/src/views/Returns/returns.vue
index 4610faf..f7a9744 100644
--- a/UI-Project/src/views/Returns/returns.vue
+++ b/UI-Project/src/views/Returns/returns.vue
@@ -1,12 +1,14 @@
 <script lang="ts" setup>
-import {Search} from "@element-plus/icons-vue";
-import {reactive} from "vue";
+import {onBeforeUnmount, onMounted, onUnmounted, reactive, ref} from "vue";
 import {useRouter} from "vue-router"
+import {ElMessage} from 'element-plus'
+import {useI18n} from 'vue-i18n'
+import {host, WebSocketHost} from '@/utils/constants'
+import request from "@/utils/request"
+import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
+
 const router = useRouter()
-import type { TableColumnCtx } from 'element-plus'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { useI18n } from 'vue-i18n'
-const { t } = useI18n()
+const {t} = useI18n()
 const dialogFormVisible = ref(false)
 const blind = ref(false)
 const blinda = ref(false)
@@ -30,48 +32,39 @@
 const number = ref('');
 const canSelectProject = ref(true);
 const canStartLoading = ref(false);
-import { WebSocketHost ,host} from '@/utils/constants'
-import request from "@/utils/request"
-const ida = ref(null); 
-import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService';
-import { ref, onMounted, onUnmounted, onBeforeUnmount } from "vue";
-const selectedProjectNo = ref(''); // 褰撳墠閫変腑鐨勫伐绋嬪彿  
-const selectedProjectNoa = ref(''); // 褰撳墠閫変腑鐨勫伐绋嬪彿  
-const selectedValue = ref(''); // 褰撳墠閫変腑鐨勫  
-const selectedValuea = ref('');  
+const ida = ref(null);
+const selectedProjectNo = ref('');
+const selectedProjectNoa = ref('');
+const selectedValue = ref('');
+const selectedValuea = ref('');
 const selectedValueb = ref('');
-const selectedValuec = ref(''); 
-// const upstatus = ref('涓婄墖鏈烘墜鍔ㄧ姸鎬侊細'); // 鍋囪杩欎釜鐢ㄤ簬鏄剧ず鑷姩/鎵嬪姩鐘舵��  
+const selectedValuec = ref('');
 const upstatus = ref(t('basicData.machineaa'));
-const cuttingMachine = ref(''); // 鍋囪杩欎釜鐢ㄤ簬瀛樺偍鍚庣杩斿洖鐨勭姸鎬佸�硷紙0鎴�1锛�  
+const cuttingMachine = ref('');
 const cuttingMachineStatusColor = ref('#911005'); // 鐢ㄤ簬鍔ㄦ�佽缃甶鏍囩鐨勮儗鏅壊 
 const inKageWord = ref(0); // 鐢ㄤ簬瀛樺偍瑕佷紶閫掔粰鎺ュ彛鐨刬nKageWord鍊� 
-const options = ref<any[]>([]); // 涓嬫媺閫夐」鍒楄〃  
-const selectOptions = ref<Array<any>>([]); // 涓嬫媺閫夐�夐」鏁扮粍  
-const selectOptionsa = ref<Array<any>>([]); // 涓嬫媺閫夐�夐」鏁扮粍  
-const selectOptionsb = ref<Array<any>>([]); // 涓嬫媺閫夐�夐」鏁扮粍  
-const selectOptionsc = ref<Array<any>>([]); // 涓嬫媺閫夐�夐」鏁扮粍  
-  const tableDataa = ref([])
-  const tableData = reactive([]);
-  const fetchTableData = async () => {
+const options = ref<any[]>([]);
+const selectOptions = ref<Array<any>>([]);
+const selectOptionsa = ref<Array<any>>([]);
+const selectOptionsb = ref<Array<any>>([]);
+const selectOptionsc = ref<Array<any>>([]);
+const tableDataa = ref([])
+const tableData = reactive([]);
+const fetchTableData = async () => {
   try {
     const response = await request.get("/loadGlass/up-patten-usage/prioritylist");
-    // 妫�鏌ュ搷搴旂姸鎬�
     if (response.code === 200) {
-      // 鏇存柊琛ㄦ牸鏁版嵁
       console.log('鎴愬姛鑾峰彇琛ㄦ牸鏁版嵁:', response.data);
       tableData.splice(0, tableData.length, ...response.data);
-      // window.localStorage.setItem('engineeringId', response.data[0].engineeringId)
-      // 鑾峰彇鍞竴鍊�
-      const uniqueWidths = new Set(response.data.map(item => item.width));  
-      const uniqueHeights = new Set(response.data.map(item => item.height));  
-      const uniqueFilmsIds = new Set(response.data.map(item => item.filmsId));  
+      const uniqueWidths = new Set(response.data.map(item => item.width));
+      const uniqueHeights = new Set(response.data.map(item => item.height));
+      const uniqueFilmsIds = new Set(response.data.map(item => item.filmsId));
       const uniqueThicknesses = new Set(response.data.map(item => item.thickness));  
   
-      selectOptions.value = Array.from(uniqueWidths).map(width => ({ 
-      value: width, // 鍋囪杩欐槸浣犳兂瑕佷綔涓簐alue鐨勫睘鎬�  
-      label: width, // 鍋囪杩欐槸浣犳兂瑕佹樉绀虹殑label  
-    }));  
+      selectOptions.value = Array.from(uniqueWidths).map(width => ({
+        value: width,
+        label: width,
+      }));
       selectOptionsa.value = Array.from(uniqueHeights).map(height => ({ 
       value: height, 
       label: height, 
@@ -93,12 +86,12 @@
   }
 };
 const handlezhiban = () => {
-  dialoglea.value = true; // 鎵撳紑缁戝畾鏋跺瓙瀵硅瘽妗�
+  dialoglea.value = true;
   fetchFlowCardId(); 
 };
 const selectproject = () => {
-  dialogFormVisible.value = true; 
-  selectgong(); 
+  dialogFormVisible.value = true;
+  selectgong();
 };
 // 鍊肩彮淇℃伅
 const fetchFlowCardId = async () => {
@@ -110,14 +103,11 @@
     if (response.code == 200) {
       ElMessage.success(response.message);
       tableDatax.value = response.data;
-      console.log(tableDatax.value);
-      console
     } else {
       ElMessage.error(response.message);
     }
 }
 catch (error) {
-    // 澶勭悊閿欒
     console.error(error);
   }
 }
@@ -131,15 +121,15 @@
   }
 };
 onMounted(() => {
-  list('');  
+  list('');
   fetchOptions('');
   socket = initializeWebSocket(socketUrl, handleMessage);
 });
-  onUnmounted(() => {
-    if (socket) {
+onUnmounted(() => {
+  if (socket) {
     closeWebSocket(socket);
-    }
-    });
+  }
+});
 const list = async () => {  
   try {  
     const response = await request.get('/loadGlass/LoadGlass/list');  
@@ -166,30 +156,6 @@
     console.error('Error fetching options:', error);  
   }  
 }; 
-// 鍋囪杩欐槸鎮ㄧ殑鍝嶅簲澶勭悊鍑芥暟 
-// request.get("/loadGlass/LoadGlass/list").then((res) => {
-//       if (res.code == 200) {
-//           tableDataa.value = res.data
-//           if (tableDataa.value.length === 4) {
-//           if (tableDataa.value[0].patternHeight > 0) {
-//           flake.value = true;
-//           }
-//          if (tableDataa.value[1].patternHeight > 0) {
-//           flakea.value = true;
-//           } 
-//          if (tableDataa.value[2].patternHeight > 0) {
-//           flakeb.value = true;
-//           } 
-//          if (tableDataa.value[3].patternHeight > 0) {
-//           flakec.value = true;
-//           } 
-//            }
-//           } else {
-//           ElMessage.warning(res.message)
-//           // router.push("/login")
-//           }
-//           }); 
-//瀹氫箟鎺ユ敹鍔犺浇琛ㄥご涓嬫媺鏁版嵁
 const titleSelectJson = ref({
   processType: [],
 })
@@ -198,7 +164,6 @@
 })
 let socket = null;
 const socketUrl = `ws://${WebSocketHost}:${host}/api/loadGlass/api/talk/loadGlass`;
-// 瀹氫箟娑堟伅澶勭悊鍑芥暟锛屾洿鏂� receivedData 鍙橀噺
 const handleMessage = (data) => {
   if(data.prioritylist!=null){
   tableData.splice(0, tableData.length, ...data.prioritylist[0]);
@@ -228,15 +193,11 @@
 const requestData = {  
   state: 100  
 };  
- 
- 
- 
- 
 const selectgong = async (queryString: string) => {
   try  {
     const response = await request.post('/loadGlass/optimizeProject/listByState',{
-      ...requestData,  
-      query: queryString
+      ...requestData,
+      projectNo: queryString
     })
     if (response.code == 200) {
       titleSelectJson.value.processType = response.data;
@@ -245,23 +206,20 @@
     }
 }
 catch (error) {
-    // 澶勭悊閿欒
     console.error(error);
   }
 }
-const fetchOptions = async (queryString: string) => {  
-  try {  
-    // 鍙戦�佽姹傚埌鍚庣鎺ュ彛  
-    const response = await request.post('/loadGlass/optimizeProject/listByState', {  
-      ...requestData,  
-      query: queryString // 灏嗘煡璇㈠瓧绗︿覆浣滀负鍙傛暟浼犻��  
-    });  
-    if (response.code == 200) {  
-    // titleSelectJson.value.processType = response.data;
-    console.log(response.data);
- 
-    } else {  
-      ElMessage.warning(response.data);  
+const fetchOptions = async (queryString: string) => {
+  try {
+    const response = await request.post('/loadGlass/optimizeProject/listByState', {
+      ...requestData,
+      query: queryString
+    });
+    if (response.code == 200) {
+      // titleSelectJson.value.processType = response.data;
+      console.log(response.data);
+    } else {
+      ElMessage.warning(response.data);
     }  
   } catch (error) {  
     console.error('Error fetching options:', error);  
@@ -271,8 +229,8 @@
 const handleInputChange = async (value: string) => {  
   if (value) {  
     await fetchOptions(value);  
-  } else {  
-    options.value = []; // 娓呯┖閫夐」鍒楄〃  
+  } else {
+    options.value = [];
   }  
 };  
   // 澶勭悊鐢ㄦ埛杈撳叆鍙樺寲鐨勬柟娉�  
@@ -288,38 +246,27 @@
 });
 // 娣诲姞
 const handleBindRack = (row) => {
-  workstationId.value = row.workstationId; // 鍋囪rackNumber鏄灦鍙峰瓧娈电殑灞炴�у悕
+  workstationId.value = row.workstationId;
   ida.value = row.id;
-  add.value = true; // 鎵撳紑缁戝畾鏋跺瓙瀵硅瘽妗�
+  add.value = true;
 };
 // 娣诲姞
-    const handleConfirm = async () => {
-      // console.log('id.value:', id.value);
-  if ((ida.value === 2 || ida.value === 4) && (parseInt(selectedValuea.value, 10) >= 2700 )) {  
+const handleConfirm = async () => {
+  if ((ida.value === 2 || ida.value === 4) && (parseInt(selectedValuea.value, 10) >= 2700)) {
     try {
-    const response = await request.post('/loadGlass/LoadGlass/updateGlassMessage', {
-      id: workstationId.value,
-      workstationId: workstationId.value,
-      patternHeight: selectedValuea.value,
-      patternWidth: selectedValue.value,
-      filmsId: selectedValueb.value,
-      patternThickness: selectedValuec.value,
-      number: number.value
-    }); 
-      // window.localStorage.setItem('workstationId', workstationId.value)
-      // window.localStorage.setItem('patternHeight', selectedValuea.value)
-      // window.localStorage.setItem('patternWidth', selectedValue.value)
-      // window.localStorage.setItem('number', number.value)
+      const response = await request.post('/loadGlass/LoadGlass/updateGlassMessage', {
+        id: workstationId.value,
+        workstationId: workstationId.value,
+        patternHeight: selectedValuea.value,
+        patternWidth: selectedValue.value,
+        filmsId: selectedValueb.value,
+        patternThickness: selectedValuec.value,
+        number: number.value
+      });
     if (response.code == 200) {
-      // 缁戝畾鎴愬姛锛屽鐞嗛�昏緫
       ElMessage.success(response.message);
-      // window.location.reload() 
       add.value = false;
      tableDataa.value = response.data;
-      // let workstationId = window.localStorage.getItem('workstationId')
-      // let patternHeight = window.localStorage.getItem('patternHeight')
-      // let patternWidth = window.localStorage.getItem('patternWidth')
-      // let number = window.localStorage.getItem('number')
       if (selectedValuea.value !== '0' && selectedValue.value !== '0' && number.value !== '0' && workstationId.value === '1') {
       flake.value = true
     } else if (selectedValuea.value !== '0' && selectedValue.value !== '0' && number.value !== '0' && workstationId.value === '2'){
@@ -329,23 +276,13 @@
     }else if (selectedValuea.value !== '0' && selectedValue.value !== '0' && number.value !== '0' && workstationId.value === '4'){
       flakec.value = true
     }
-    //   if (patternHeight !== '0' && patternWidth !== '0' && number !== '0' && workstationId === '1') {
-    //   flake.value = true
-    // } else if (patternHeight !== '0' && patternWidth !== '0' && number !== '0' && workstationId === '2'){
-    //   flakea.value = true
-    // }else if (patternHeight !== '0' && patternWidth !== '0' && number !== '0' && workstationId === '3'){
-    //   flakeb.value = true
-    // }else if (patternHeight !== '0' && patternWidth !== '0' && number !== '0' && workstationId === '4'){
-    //   flakec.value = true
-    // }
       selectedValuea.value = '';
       selectedValue.value = '';
       selectedValueb.value = '';
       selectedValuec.value = '';
       number.value = '';
-        list()
+      list()
     } else {
-      // 璇锋眰澶辫触锛屾樉绀洪敊璇秷鎭�
       ElMessage.error(response.message);
     }
   } catch (error) {  
@@ -364,9 +301,7 @@
       number: number.value
     }); 
     if (response.code == 200) {
-      // 缁戝畾鎴愬姛锛屽鐞嗛�昏緫
       ElMessage.success(response.message);
-      // window.location.reload() 
       add.value = false;
      tableDataa.value = response.data;
       if (selectedValuea.value !== '0' && selectedValue.value !== '0' && number.value !== '0' && workstationId.value === '1') {
@@ -411,28 +346,23 @@
       number: 0
     });
     if (response.code == 200) {
-      // 缁戝畾鎴愬姛锛屽鐞嗛�昏緫
       ElMessage.success(response.message);
       adda.value = false;
-     tableDataa.value = response.data;
-      // window.localStorage.setItem('workstationId', response.data.workstationId)
-      // let workstationId = window.localStorage.getItem('workstationId')
+      tableDataa.value = response.data;
       if (workstationId.value == '1') {
-      flake.value = false
-    } else if (workstationId.value == '2'){
-      flakea.value = false
-    }else if (workstationId.value == '3'){
-      flakeb.value = false
-    }else if (workstationId.value == '4'){
-      flakec.value = false
-    }
-        list()
-      } else {
-      // 璇锋眰澶辫触锛屾樉绀洪敊璇秷鎭�
+        flake.value = false
+      } else if (workstationId.value == '2') {
+        flakea.value = false
+      } else if (workstationId.value == '3') {
+        flakeb.value = false
+      } else if (workstationId.value == '4') {
+        flakec.value = false
+      }
+      list()
+    } else {
       ElMessage.error(response.message);
     }
   } catch (error) {
-    // 澶勭悊閿欒
     console.error(error);
   }
 };
@@ -444,9 +374,7 @@
     })
       window.localStorage.setItem('engineeringId', selectedProjectNo.value)
     if (response.code == 200) {
-      // 缁戝畾鎴愬姛锛屽鐞嗛�昏緫
       ElMessage.success(response.message);
-      // window.location.reload() 
       dialogFormVisible.value = false;
       tableData.splice(0, tableData.length, ...response.data);
       selectedProjectNo.value = ''
@@ -473,13 +401,10 @@
       label: thickness,  
     })); 
     } else {
-      // 璇锋眰澶辫触锛屾樉绀洪敊璇秷鎭�
       ElMessage.error(response.message);
-      // ElMessage.error(response.msg);
     }
 }
 catch (error) {
-    // 澶勭悊閿欒
     console.error(error);
   }
 }
@@ -493,18 +418,14 @@
     state: 1,
     })
     if (response.code == 200) {
-      // 缁戝畾鎴愬姛锛屽鐞嗛�昏緫
       ElMessage.success(response.message);
-      // window.location.reload() 
       blind.value = false;
       selectedProjectNoa.value = '';
     } else {
-      // 璇锋眰澶辫触锛屾樉绀洪敊璇秷鎭�
       ElMessage.error(response.message);
     }
 }
 catch (error) {
-    // 澶勭悊閿欒
     console.error(error);
   }
     } else if (markingMachineStatus.value === '#911005' || cuttingMachineStatus.value === '#911005') {  
@@ -514,21 +435,20 @@
 }
 // 鏆傚仠
 const handlea = async () => {
-  try  {
-  let engineeringId = window.localStorage.getItem('engineeringId')
-console.log(engineeringId);
-if (engineeringId !== '') {
-  const response = await request.post('/loadGlass/engineering/engineering/pauseTask', {
-      engineeringId: engineeringId,
-      state: 0,
-    })
-    if (response.code == 200) {
-      ElMessage.success(response.message);
-      blinda.value = false;
-      // tableData.splice([]);
-    } else {
-      // 璇锋眰澶辫触锛屾樉绀洪敊璇秷鎭�
-      ElMessage.error(response.message);
+  try {
+    let engineeringId = window.localStorage.getItem('engineeringId')
+    console.log(engineeringId);
+    if (engineeringId !== '') {
+      const response = await request.post('/loadGlass/engineering/engineering/pauseTask', {
+        engineeringId: engineeringId,
+        state: 0,
+      })
+      if (response.code == 200) {
+        ElMessage.success(response.message);
+        blinda.value = false;
+        // tableData.splice([]);
+      } else {
+        ElMessage.error(response.message);
     }
   }
     else  {
@@ -539,7 +459,6 @@
     }
 }
 catch (error) {
-    // 澶勭悊閿欒
     console.error(error);
   }
 }
@@ -554,13 +473,9 @@
       state: 0,
     })
     if (response.code == 200) {
-      // 缁戝畾鎴愬姛锛屽鐞嗛�昏緫
       ElMessage.success(response.message);
-      // window.location.reload() 
       blindb.value = false;
       tableData.splice([]);
- 
-      // 璇锋眰澶辫触锛屾樉绀洪敊璇秷鎭�
       ElMessage.error(response.message);
     }
   }
@@ -572,7 +487,6 @@
     }
 }
 catch (error) {
-    // 澶勭悊閿欒
     console.error(error);
   }
 }
@@ -603,7 +517,7 @@
 }  
 // 寮�濮嬩笂鐗�
 const handleBind = (row) => {
-  blind.value = true; // 鎵撳紑缁戝畾鏋跺瓙瀵硅瘽妗�
+  blind.value = true;
 };
 // 鏆傚仠
 const handleBinda = (row) => {
@@ -613,11 +527,10 @@
 const handleBindb = (row) => {
   blindb.value = true; 
 };
- 
 // 鍒犻櫎
 const handleBindRacka = (row) => {
   workstationId.value = row.workstationId;
-  adda.value = true; 
+  adda.value = true;
 };
 // 瀹氫箟涓�涓搷搴斿紡寮曠敤锛岀敤浜庡瓨鍌ㄩ鑹茬姸鎬�  
 const markingMachineStatus = ref('#911005');  
@@ -638,91 +551,59 @@
   const newState = row.state === 100 ? 0 : 100;  
   try {  
     // 鍙戦�佽姹傚埌鍚庣鏇存柊鐘舵��  
-    const response = await request.post('/loadGlass/up-patten-usage/updateGlassState', { id: row.id, state: newState });  
-    if (response.code === 200) {  
-      ElMessage.success(response.message);  
-      row.state = newState;  
-    } else {  
-      ElMessage.error(response.message);  
-    }  
-  } catch (error) {  
+    const response = await request.post('/loadGlass/up-patten-usage/updateGlassState', { id: row.id, state: newState });
+    if (response.code === 200) {
+      ElMessage.success(response.message);
+      row.state = newState;
+    } else {
+      ElMessage.error(response.message);
+    }
+  } catch (error) {
     // 澶勭悊璇锋眰閿欒  
-    ElMessage.error(t('basicData.glassnull'));   
-  }  
-};  
-// 涓婄墖鏈鸿仈鏈虹姸鎬�
-// const wsUrl = `ws://${WebSocketHost}:${host}/api/loadGlass/api/talk/loadGlass`;
-// const ws = new WebSocket(wsUrl);  
-// ws.onopen = () => {  
-//   console.log('WebSocket杩炴帴宸叉墦寮�');  
-// };  
-  
-// // 鐩戝惉WebSocket鐨勯敊璇簨浠�  
-// ws.onerror = (error) => {  
-//   console.error('WebSocket鍙戠敓閿欒:', error);  
-// };  
-  
-// // 鐩戝惉WebSocket鐨勫叧闂簨浠�  
-// ws.onclose = (event) => {  
-//   if (event.wasClean) {  
-//     console.log('WebSocket杩炴帴宸叉甯稿叧闂�');  
-//   } else {  
-//     console.error('WebSocket杩炴帴寮傚父鍏抽棴');  
-//   }  
-// };  
-// // 鐩戝惉WebSocket鐨勬秷鎭簨浠�  
-// ws.onmessage = (event) => {  
-//   try {   
-//     const data = JSON.parse(event.data.replace('<END>', '')); // 瑙f瀽娑堟伅涓篔SON  
-//     if (data && Array.isArray(data.InkageStatus) && data.InkageStatus.length > 0) {  
-// if(data.InkageStatus!=null){
-//       const status = data.InkageStatus[0]; 
-//       cuttingMachine.value = status; 
-//             upstatus.value = status === '1' ? t('basicData.machine') : t('basicData.machineaa');
-//       cuttingMachineStatusColor.value = status === '1' ? 'green' : '#911005';  
-//       inKageWord.value = status === '1' ? 0 : 1;  
-// }
-//     } else {  
-//       // 澶勭悊閿欒鎯呭喌鎴栨棤鏁堟暟鎹�  
-//       // console.error('鎺ユ敹鍒扮殑鏁版嵁鏃犳晥', data);  
-//     }  
-//   } catch (error) {  
-//     // console.error('瑙f瀽WebSocket娑堟伅鏃跺彂鐢熼敊璇�', error);  
-//   }  
-// };  
-const confirmCutting = async () => {  
-  try {  
-    const response = await request.post('/loadGlass/LoadGlass/updateMesInkageLoad', 
-      inKageWord.value
-  );  
-    if (response.code == 200) {  
-      const status = response.data.status; 
+    ElMessage.error(t('basicData.glassnull'));
+  }
+};
+const confirmCutting = async () => {
+  try {
+    const response = await request.post('/loadGlass/LoadGlass/updateMesInkageLoad',
+        inKageWord.value
+    );
+    if (response.code == 200) {
+      const status = response.data.status;
       upstatus.value = status === '1' ? t('basicData.machine') : t('basicData.machineaa');
-      cuttingMachineStatusColor.value = status === '1' ? 'green' : '#911005';  
-      // 鏄剧ず鎴愬姛娑堟伅  
-      ElMessage.success(response.message);  
-    } else {  
-      ElMessage.error(response.message || '璇锋眰澶辫触');  
-    }  
-  } catch (error) {  
-    // 澶勭悊閿欒  
-    console.error('璇锋眰鏃跺彂鐢熼敊璇�', error);  
-    ElMessage.error('璇锋眰鏃跺彂鐢熼敊璇�');  
-  }  
+      cuttingMachineStatusColor.value = status === '1' ? 'green' : '#911005';
+      ElMessage.success(response.message);
+    } else {
+      ElMessage.error(response.message || '璇锋眰澶辫触');
+    }
+  } catch (error) {
+    console.error('璇锋眰鏃跺彂鐢熼敊璇�', error);
+    ElMessage.error('璇锋眰鏃跺彂鐢熼敊璇�');
+  }
 };
 </script>
 <template>
-  <div>
-    <div id="dotClass">
-      <div>{{ $t('basicData.laserprinting') }}</div>  
-    <i :style="{ marginTop: '2px', backgroundColor: markingMachineStatus, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>  
-    <el-button @click="confirmMarkingMachine" style="margin-left: 30px;margin-top: -3px;">{{ $t('basicData.yes') }}</el-button>
-    <div style="margin-left: 70px;">{{ $t('basicData.cuttingmachine') }}</div>
-    <i :style="{ marginTop: '2px', backgroundColor: cuttingMachineStatus, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>  
-    <el-button @click="confirmCuttingMachine" style="margin-left: 30px;margin-top: -3px;" >{{ $t('basicData.yes') }}</el-button>
-    <div style="margin-left: 70px;">{{ upstatus  }} </div>
-    <i :style="{ marginTop: '2px', backgroundColor: cuttingMachineStatusColor, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>  
-    <el-button @click="confirmCutting" style="margin-left: 30px;margin-top: -3px;" >{{ $t('basicData.change') }}</el-button>
+  <div style="height: 500px;">
+    <div>
+      <div id="dotClass">
+        <div>{{ $t('basicData.laserprinting') }}</div>
+        <i :style="{ marginTop: '2px', backgroundColor: markingMachineStatus, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
+        <el-button @click="confirmMarkingMachine" style="margin-left: 30px;margin-top: -3px;">{{
+            $t('basicData.yes')
+          }}
+        </el-button>
+        <div style="margin-left: 70px;">{{ $t('basicData.cuttingmachine') }}</div>
+        <i :style="{ marginTop: '2px', backgroundColor: cuttingMachineStatus, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
+        <el-button @click="confirmCuttingMachine" style="margin-left: 30px;margin-top: -3px;">{{
+            $t('basicData.yes')
+          }}
+        </el-button>
+        <div style="margin-left: 70px;">{{ upstatus }}</div>
+        <i :style="{ marginTop: '2px', backgroundColor: cuttingMachineStatusColor, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
+        <el-button @click="confirmCutting" style="margin-left: 30px;margin-top: -3px;">{{
+            $t('basicData.change')
+          }}
+        </el-button>
   
   </div>
     <el-button :disabled="!canSelectProject" style="margin-top: 5px;margin-left: 15px;"  type="primary" @click="selectproject">{{ $t('basicData.selectproject') }}</el-button>
@@ -730,14 +611,13 @@
     <el-button style="margin-top: 5px;margin-left: 20px;"  id="searchButton" type="warning" @click="handleBinda">{{ $t('basicData.stop') }}</el-button>
     <el-button style="margin-top: 5px;margin-left: 20px;" id="searchButton" type="info" @click="handlezhiban">{{ $t('searchOrder.dutyinformation') }}</el-button>
     <!-- <el-button style="margin-top: 5px;margin-left: 20px;"  id="searchButton" type="danger" @click="handleBindb">鍋滄浠诲姟</el-button> -->
-    
     <el-card style="flex: 1;margin-left: 10px;margin-top: 15px;" v-loading="loading">
       <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
     <el-table
-    height="350"
-     ref="table" 
-     :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"
-      :data="tableData"
+        height="350"
+        ref="table"
+        :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"
+        :data="tableData"
     >
       <el-table-column prop="layoutSequence" :label="$t('basicData.layoutSequence')" width="100" align="center"/>
       <el-table-column prop="engineeringId" :label="$t('basicData.projectnumber')" width="200" align="center"/>
@@ -790,7 +670,6 @@
       </div>
     </template>
   </el-dialog>
-  
 <el-dialog v-model="dialoglea" top="15vh" width="70%" :title="$t('searchOrder.dutyinformation')">
     <el-table  ref="table" style="margin-top: 20px;height: 300px;"
         :data="tableDatax" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
@@ -860,7 +739,6 @@
         </el-table-column>
         </el-table>
     </div>
-    
   <el-dialog v-model="add" top="23vh" width="45%" :title="$t('basicData.addglass')" >
     <div style="margin-left: -50px;margin-top: 10px;margin-bottom: 10px;">
             <el-form  size="mini" label-width="150px">
@@ -991,23 +869,23 @@
   <el-dialog v-model="dialogFormVisible" top="24vh" width="30%" :title="$t('basicData.project')" >
     <div style="margin-left: 50px;margin-bottom: 10px;">
       <el-form-item :label="$t('basicData.projectnumber')" :required="true">
-        <el-select  
-           v-model="selectedProjectNo"  
-           filterable  
-           clearable  
-           :placeholder="$t('basicData.plselectproject')"
-           style="width: 220px"  
-           @input="handleInputChange"  
-         >  
-      <el-option  
-         v-for="item in titleSelectJson['processType']"  
-         :key="item.id"  
-         :label="item.projectNo"  
-         :value="item.projectNo"  
-      />  
-    </el-select>  
-              </el-form-item>
-          </div>
+        <el-select
+            v-model="selectedProjectNo"
+            filterable
+            clearable
+            :placeholder="$t('basicData.plselectproject')"
+            style="width: 220px"
+            @input="handleInputChange"
+        >
+          <el-option
+              v-for="item in titleSelectJson['processType']"
+              :key="item.id"
+              :label="item.projectNo"
+              :value="item.projectNo"
+          />
+        </el-select>
+      </el-form-item>
+    </div>
     <template #footer>
       <div id="dialog-footer">
         <el-button type="primary" @click="handleup">
@@ -1017,10 +895,9 @@
       </div>
     </template>
   </el-dialog>
+  </div>
 </template>
- 
 <style scoped>
- 
 #dt { display:block; float:left;line-height: 20px;margin-left: 100px;}
 #dta { display:block; float:left;line-height: 20px;margin-left: 80%;}
 #dialog-footer{
@@ -1075,5 +952,4 @@
   margin-top: -45px;
   margin-left: 703px;
 }
- 
 </style>
\ No newline at end of file
diff --git a/UI-Project/src/views/Returns/upreturns.vue b/UI-Project/src/views/Returns/upreturns.vue
index 941cb20..0c37ace 100644
--- a/UI-Project/src/views/Returns/upreturns.vue
+++ b/UI-Project/src/views/Returns/upreturns.vue
@@ -10,178 +10,287 @@
 const router = useRouter()
 const {t} = useI18n()
 const selectValuesa = reactive([]);
-const selectedProjectNo = ref(''); // 褰撳墠閫変腑鐨勫伐绋嬪彿  
-const loadingline = ref(''); // 褰撳墠閫変腑鐨勪笂鐗囩嚎
+const selectedProjectNo = ref('');
+const stationCell = ref('1');
+const filmRemove = ref('');
 const dialogFormVisible = ref(false)
- 
- 
- 
- 
 const blind = ref(false)
 const blinda = ref(false)
-const blindb = ref(false)
-const add = ref(false)
-const adda = ref(false)
 const dialoglea = ref(false)
 const tableDatax = ref([])
-const user = ref('');
-const projectNo = ref('');
-const workstationId = ref('');
-const id = ref('');
-const patternHeight = ref('');
-const patternWidth = ref('');
-const filmsId = ref('');
-const patternThickness = ref('');
-const number = ref('');
-const canSelectProject = ref(true);
-const canStartLoading = ref(false);
-const selectedValue = ref(''); // 褰撳墠閫変腑鐨勫  
-const selectedValuea = ref('');  
-const selectedValueb = ref('');
-const selectedValuec = ref(''); 
-// const upstatus = ref('涓婄墖鏈烘墜鍔ㄧ姸鎬侊細'); // 鍋囪杩欎釜鐢ㄤ簬鏄剧ず鑷姩/鎵嬪姩鐘舵��  
 const upstatus = ref(t('basicData.machineaa'));
-const cuttingMachine = ref(''); // 鍋囪杩欎釜鐢ㄤ簬瀛樺偍鍚庣杩斿洖鐨勭姸鎬佸�硷紙0鎴�1锛�  
 const cuttingMachineStatusColor = ref('#911005'); // 鐢ㄤ簬鍔ㄦ�佽缃甶鏍囩鐨勮儗鏅壊 
-const inKageWord = ref(0); // 鐢ㄤ簬瀛樺偍瑕佷紶閫掔粰鎺ュ彛鐨刬nKageWord鍊� 
-const options = ref<any[]>([]); // 涓嬫媺閫夐」鍒楄〃  
-const ida = ref(null); 
-const selectOptions = ref<Array<any>>([]); // 涓嬫媺閫夐�夐」鏁扮粍  
-const selectOptionsa = ref<Array<any>>([]); // 涓嬫媺閫夐�夐」鏁扮粍  
-const selectOptionsb = ref<Array<any>>([]); // 涓嬫媺閫夐�夐」鏁扮粍  
-const selectOptionsc = ref<Array<any>>([]); // 涓嬫媺閫夐�夐」鏁扮粍  
-  const tableDataa = ref([])
-  const tableData = reactive([]);
+const tableDataa = ref<any[]>([]);
+const tableDatab = ref<any[]>([]);
+const tableData = ref([])
+// const tableData = reactive([]);
+const titleSelectJson = ref({
+  engineerId: [],
+})
 const handlezhiban = () => {
-  dialoglea.value = true; // 鎵撳紑缁戝畾鏋跺瓙瀵硅瘽妗�
+  dialoglea.value = true;
+  fetchFlowCardId();
 };
 const selectproject = () => {
   dialogFormVisible.value = true;
   selectgong();
 };
- 
- 
+const markingMachineStatus = ref('#911005');
+const cuttingMachineStatus = ref('#911005');
+const confirmMarkingMachine = () => {
+  markingMachineStatus.value = 'green';
+};
+const confirmCuttingMachine = () => {
+  cuttingMachineStatus.value = 'green';
+};
 onMounted(() => {
   socket = initializeWebSocket(socketUrl, handleMessage);
 });
-const handleMessage = (data) => {
-
-}
-  onUnmounted(() => {
-    if (socket) {
+onUnmounted(() => {
+  if (socket) {
     closeWebSocket(socket);
+  }
+});
+const fetchTableData = async () => {
+  try {
+    const response = await request.get("/loadGlass/up-patten-usage/prioritylist");
+    if (response.code === 200) {
+      tableData.splice(0, tableData.length, ...response.data);
+      ElMessage.error(response.message);
     }
-    });
-//瀹氫箟鎺ユ敹鍔犺浇琛ㄥご涓嬫媺鏁版嵁
-const titleSelectJson = ref({
-  engineerId: [],
-})
+  } catch (error) {
+    // 澶勭悊璇锋眰澶辫触鐨勬儏鍐�
+    // ElMessage.error('鑾峰彇琛ㄦ牸鏁版嵁澶辫触锛岃閲嶈瘯');
+  }
+};
 let socket = null;
 const socketUrl = `ws://${WebSocketHost}:${host}/api/loadGlass/api/talk/uploadGlass`;
-// 瀹氫箟娑堟伅澶勭悊鍑芥暟锛屾洿鏂� receivedData 鍙橀噺
- 
+const handleMessage = (data: any) => {
+  tableDataa.value = data.list[0].slice(0, 2);
+  // tableDatab.value = data.list[0].slice(2, 4);
+};
 onBeforeUnmount(() => {
   closeWebSocket();
 });
-const selectgong = async () => {
+const requestData = {
+  state: 100
+};
+const selectgong = async (queryString: string) => {
   try {
-    const response = await request.post('/loadGlass/engineering/engineering/selectTask')
+    const response = await request.post('/loadGlass/optimizeProject/listByState', {
+      ...requestData,
+      query: queryString
+    });
     if (response.code == 200) {
       titleSelectJson.value.engineerId = response.data;
     } else {
       ElMessage.error(response.message);
     }
   } catch (error) {
-    // 澶勭悊閿欒
+    console.error(error);
+  }
+};
+//閫夋嫨宸ョ▼棰勮纭
+const handlesure = async () => {
+  try {
+    const response = await request.post('/loadGlass/up-patten-usage/selectUpPattenUsage', {
+      stationCell: 5,
+      engineerId: selectedProjectNo.value,
+      // filmRemove: filmRemove.value,
+      filmRemove: parseInt(filmRemove.value, 10),
+    })
+    window.localStorage.setItem('engineeringId', selectedProjectNo.value)
+    window.localStorage.setItem('filmRemove', filmRemove.value)
+    if (response.code == 200) {
+      ElMessage.success(response.message);
+      tableData.value = response.data;
+      dialogFormVisible.value = false;
+      selectedProjectNo.value = '';
+      filmRemove.value = '';
+      markingMachineStatus.value = '#911005';
+      cuttingMachineStatus.value = '#911005';
+    } else {
+      ElMessage.error(response.message);
+    }
+  } catch (error) {
     console.error(error);
   }
 }
-// 娣诲姞
-const handleBindRack = (row) => {
-  workstationId.value = row.workstationId; // 鍋囪rackNumber鏄灦鍙峰瓧娈电殑灞炴�у悕
-  ida.value = row.id;
-  add.value = true; // 鎵撳紑缁戝畾鏋跺瓙瀵硅瘽妗�
+// 寮�濮嬩笂鐗�
+const handleon = async () => {
+  let filmRemove = window.localStorage.getItem('filmRemove')
+  let engineeringId = window.localStorage.getItem('engineeringId')
+  if (markingMachineStatus.value === 'green' && cuttingMachineStatus.value === 'green') {
+    try {
+      // const response = await request.post('/loadGlass/engineering/engineering/pause', {
+      const response = await request.post('/loadGlass/engineering/engineering/changeTask', {
+        stationCell: 5,
+        filmRemove: filmRemove,
+        engineerId: engineeringId,
+        state: 1,
+      })
+      if (response.code == 200) {
+        ElMessage.success(response.message);
+        blind.value = false;
+      } else {
+        ElMessage.error(response.message);
+      }
+    } catch (error) {
+      console.error(error);
+    }
+  } else if (markingMachineStatus.value === '#911005' || cuttingMachineStatus.value === '#911005') {
+    // 鎻愮ず鐢ㄦ埛鎵撴爣鏈烘湭灏辩华
+    ElMessage.warning(t('basicData.pausea'));
+  }
+}
+// 鏆傚仠
+const handleup = async () => {
+  try {
+    let filmRemove = window.localStorage.getItem('filmRemove')
+    let engineeringId = window.localStorage.getItem('engineeringId')
+    console.log(engineeringId);
+    if (engineeringId !== '') {
+      const response = await request.post('/loadGlass/engineering/engineering/pause', {
+        stationCell: 5,
+        filmRemove: filmRemove,
+        engineerId: engineeringId,
+        state: 0,
+      })
+      if (response.code == 200) {
+        ElMessage.success(response.message);
+        blinda.value = false;
+      } else {
+        ElMessage.error(response.message);
+      }
+    } else {
+      ElMessage({
+        type: 'info',
+        message: t('basicData.infonull'),
+      })
+    }
+  } catch (error) {
+    console.error(error);
+  }
+}
+
+// 鏌ヨ鏁版嵁
+const selectReportData = async () => {
+  let stateList = []
+  if (selectValuesa[0] != null && selectValuesa[0] != 'undefined') {
+    if (selectValuesa[0] != "") {
+      stateList = [selectValuesa[0]];
+    }
+  }
+  const response = await request.post("/loadGlass/up-patten-usage/setUpPattenRequest", {
+    state: selectValuesa[0],
+    // state: stateList,
+    stationCell: 5
+  })
+  if (response.code === 200) {
+    tableData.value = response.data;
+    ElMessage.success(response.message);
+  } else {
+    ElMessage.error(response.message);
+  }
 };
 
-function getStatusText(state: number) {
-  switch (state) {
-    case 0:
-      return t('basicData.waiting');
-    case 1:
-      return t('basicData.up');
-    case 2:
-      return t('basicData.up');
-    case 100:  
-    return t('basicData.finish');
-  }  
-}  
-function getStatusType(state: number) {  
-  switch (state) {  
-    case 0:
-      return 'warning';  
-    case 1: 
-      return 'primary';  
-    case 2: 
-      return 'primary';  
-    case 100:
-      return 'success';  
-  }  
-}  
+// 鍊肩彮淇℃伅
+const fetchFlowCardId = async () => {
+  try {
+    const response = await request.post('/loadGlass/work_assignment/selectWorkAssignment', {
+      line: 2001,
+      workingProcedure: '鍐峰姞宸�'
+    })
+    if (response.code == 200) {
+      ElMessage.success(response.message);
+      tableDatax.value = response.data;
+    } else {
+      ElMessage.error(response.message);
+    }
+  } catch (error) {
+    console.error(error);
+  }
+}
+onMounted(fetchTableData);
 // 寮�濮嬩笂鐗�
 const handleBind = (row) => {
-  blind.value = true; // 鎵撳紑缁戝畾鏋跺瓙瀵硅瘽妗�
+  blind.value = true;
 };
 // 鏆傚仠
 const handleBinda = (row) => {
   blinda.value = true;
 };
-// 鍋滄浠诲姟
-const handleBindb = (row) => {
-  blindb.value = true; 
-};
- 
-
-const toggleEnableState = async (row: any) => {  
+const toggleEnableState = async (row: any) => {
   // 妫�鏌� id 鏄惁涓虹┖  
   if (!row.id) {  
     ElMessage.error(t('basicData.updatanull'));  
     return; // 濡傛灉 id 涓虹┖锛屽垯涓嶆墽琛屽悗缁搷浣�  
   }  
-  const newState = row.state === 100 ? 0 : 100;  
-  try {  
-    // 鍙戦�佽姹傚埌鍚庣鏇存柊鐘舵��  
-    const response = await request.post('/loadGlass/up-patten-usage/updateGlassState', { id: row.id, state: newState });  
-    if (response.code === 200) {  
-      ElMessage.success(response.message);  
-      row.state = newState;  
-    } else {  
-      ElMessage.error(response.message);  
-    }  
-  } catch (error) {  
-    // 澶勭悊璇锋眰閿欒  
-    ElMessage.error(t('basicData.glassnull'));   
-  }  
+  const newState = row.state === 100 ? 0 : 100;
+  try {
+    const response = await request.post('/loadGlass/up-patten-usage/updateGlassState', {id: row.id, state: newState});
+    if (response.code === 200) {
+      ElMessage.success(response.message);
+      row.state = newState;
+    } else {
+      ElMessage.error(response.message);
+    }
+  } catch (error) {
+    ElMessage.error(t('basicData.glassnull'));
+  }
 };
+
+function getStatusType2(filmRemove) {
+  switch (filmRemove) {
+    case 0:
+      return 'success';
+    case 1:
+      return 'info';
+    case 2:
+      return 'warning';
+  }
+}
+
+function getStatusText2(filmRemove) {
+  switch (filmRemove) {
+    case 0:
+      return t('Mounting.noremoval');//瀹屾垚
+    case 1:
+      return t('Mounting.coarselyground');//鏂板缓
+    case 2:
+      return t('Mounting.finegrinding');//鎵ц涓�
+  }
+}
 </script>
 <template>
-  <div>
-    <div id="dotClass">
-      <div>{{ $t('basicData.laserprinting') }}</div>  
-    <i :style="{ marginTop: '2px', backgroundColor: markingMachineStatus, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>  
-    <el-button @click="confirmMarkingMachine" style="margin-left: 30px;margin-top: -3px;">{{ $t('basicData.yes') }}</el-button>
-    <div style="margin-left: 70px;">{{ $t('basicData.cuttingmachine') }}</div>
-    <i :style="{ marginTop: '2px', backgroundColor: cuttingMachineStatus, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>  
-    <el-button @click="confirmCuttingMachine" style="margin-left: 30px;margin-top: -3px;" >{{ $t('basicData.yes') }}</el-button>
-    <div style="margin-left: 70px;">{{ upstatus  }} </div>
-    <i :style="{ marginTop: '2px', backgroundColor: cuttingMachineStatusColor, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>  
-    <el-button @click="confirmCutting" style="margin-left: 30px;margin-top: -3px;" >{{ $t('basicData.change') }}</el-button>
-   
+  <div style="height: 500px;">
+    <div>
+      <div id="dotClass">
+        <div>{{ $t('basicData.laserprinting') }}</div>
+        <i :style="{ marginTop: '2px', backgroundColor: markingMachineStatus, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
+        <el-button @click="confirmMarkingMachine" style="margin-left: 30px;margin-top: -3px;">{{
+            $t('basicData.yes')
+          }}
+        </el-button>
+        <div style="margin-left: 70px;">{{ $t('basicData.cuttingmachine') }}</div>
+        <i :style="{ marginTop: '2px', backgroundColor: cuttingMachineStatus, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
+        <el-button @click="confirmCuttingMachine" style="margin-left: 30px;margin-top: -3px;">{{
+            $t('basicData.yes')
+          }}
+        </el-button>
+        <div style="margin-left: 70px;">{{ upstatus }}</div>
+        <i :style="{ marginTop: '2px', backgroundColor: cuttingMachineStatusColor, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
+        <el-button @click="confirmCutting" style="margin-left: 30px;margin-top: -3px;">{{
+            $t('basicData.change')
+          }}
+        </el-button>
   </div>
     <el-button style="margin-top: 5px;margin-left: 15px;"  type="primary" @click="selectproject">{{ $t('Mounting.previewproject') }}</el-button>
     <el-button style="margin-top: 5px;margin-left: 20px;" type="success" @click="handleBind">{{ $t('basicData.startloading') }}</el-button>
     <el-button style="margin-top: 5px;margin-left: 20px;"  id="searchButton" type="warning" @click="handleBinda">{{ $t('basicData.stop') }}</el-button>
     <el-button style="margin-top: 5px;margin-left: 20px;" id="searchButton" type="info" @click="handlezhiban">{{ $t('searchOrder.dutyinformation') }}</el-button>
-    <el-select v-model="selectValuesa[1]" clearable :placeholder="$t('Mounting.loadinglinea')" style="margin-top: 5px;margin-left: 20px;" >
+    <el-select disabled v-model="selectValuesa[1]" clearable :placeholder="$t('Mounting.oneloadingline')"
+               style="margin-top: 5px;margin-left: 20px;">
       <el-option :label="$t('Mounting.all')" value="0"></el-option>
       <el-option :label="$t('Mounting.oneloadingline')" value="1"></el-option>
       <el-option :label="$t('Mounting.twoloadingline')" value="2"></el-option>
@@ -194,116 +303,127 @@
     <el-button type="primary" style="margin-left: 10px;" @click="selectReportData()">{{ $t('Mounting.setparameters') }}</el-button>
     <el-card style="flex: 1;margin-left: 10px;margin-top: 15px;" v-loading="loading">
       <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
-    <el-table
-    height="350"
-     ref="table" 
-     :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"
-      :data="tableData"
-    >
-      <el-table-column prop="layoutSequence" :label="$t('Mounting.project')" width="100" align="center"/>
-      <el-table-column prop="engineeringId" :label="$t('Mounting.width')" width="200" align="center"/>
-      <el-table-column prop="width" :label="$t('Mounting.height')" align="center"/>
-      <el-table-column prop="height" :label="$t('Mounting.thickness')" align="center"/>
-      <el-table-column prop="filmsId" :label="$t('Mounting.loadinglinea')" align="center"/>
-      <el-table-column :label="$t('Mounting.projectnumber')" align="center">  
-      <template #default="{ row }">  
-        <!-- 杩欓噷鎬绘槸鏄剧ず 1 -->  
-        <span>{{ 1 }}</span>  
-      </template>  
-    </el-table-column>  
-      <el-table-column
-          align="center"
-            :label="$t('Mounting.state')"
+        <el-table
+            height="350"
+            ref="table"
+            :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"
+            :data="tableData"
+        >
+          <el-table-column prop="engineeringId" :label="$t('Mounting.project')" width="100" align="center"/>
+          <el-table-column prop="width" :label="$t('Mounting.width')" width="200" align="center"/>
+          <el-table-column prop="height" :label="$t('Mounting.height')" align="center"/>
+          <el-table-column prop="thickness" :label="$t('Mounting.thickness')" align="center"/>
+          <el-table-column prop="filmsId" :label="$t('Mounting.loadinglinea')" align="center"/>
+          <el-table-column :label="$t('Mounting.projectnumber')" align="center">
+            <template #default="{ row }">
+              <!-- 杩欓噷鎬绘槸鏄剧ず 1 -->
+              <span>{{ 1 }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column
+              align="center"
+              :label="$t('Mounting.state')"
             min-width="80"
             prop="state"
           >
-          <template #default="scope">  
-          <el-tag  
-            :type="scope.row.state === 100 ? 'success' : 'warning'"  
-            @click="toggleEnableState(scope.row)"  
-          >  
-            {{ scope.row.state === 100 ? $t('Mounting.pass') : $t('Mounting.waiting') }}
-          </el-tag>  
-        </template> 
-          </el-table-column>
-      <el-table-column prop="filmsId" :label="$t('Mounting.createtime')" align="center"/>
-    </el-table>
+          <template #default="scope">
+            <el-tag
+                :type="scope.row.state === 100 ? 'success' : 'warning'"
+                @click="toggleEnableState(scope.row)"
+            >
+              {{ scope.row.state === 100 ? $t('Mounting.pass') : $t('Mounting.waiting') }}
+            </el-tag>
+          </template>
+      </el-table-column>
+          <!-- <el-table-column prop="filmRemove" :label="$t('Mounting.removalmethodp')" align="center"/> -->
+          <!-- <el-table-column
+              align="center"
+              :label="$t('Mounting.removalmethodp')"
+              prop="filmRemove"
+          >
+            <template #default="scope">
+              <el-tag :type="getStatusType2(scope.row.filmRemove)">
+                {{ getStatusText2(scope.row.filmRemove) }}
+              </el-tag>
+            </template>
+          </el-table-column> -->
+          <!-- <el-table-column prop="stationCell" :label="$t('Mounting.loadinglinea')" align="center"/> -->
+        </el-table>
       </div>
     </el-card>
     <div style="display: flex;">
-  <div style="width: 49%;float: left;">
-    <div style="display: flex;">
-        <img src="../../assets/shangpianji.png" alt="" style="max-width: 25%;max-height: 25%;margin-left: 10%;margin-top: 5%;">
-        <el-table :data="tableDataa" border style="width: 75%;margin-top: 10%;margin-left: 2%;"
-     :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"
-        >
-          <el-table-column prop="workstationId" align="center" :label="$t('basicData.station')" min-width="60" />
-          <el-table-column prop="patternWidth" align="center" :label="$t('basicData.width')" min-width="80" />
-          <el-table-column prop="patternHeight" align="center" :label="$t('basicData.height')" min-width="80" />
-          <el-table-column prop="filmsId" align="center" :label="$t('basicData.coatingtypes')" min-width="80" />
-          <el-table-column prop="number" align="center" :label="$t('basicData.quantity')" min-width="80" />
-        </el-table>
+      <div style="width: 49%;float: left;margin-left: 300px;">
+        <div style="display: flex;">
+          <img src="../../assets/shangpianji.png" alt=""
+               style="max-width: 20%;max-height: 25%;margin-left: 10%;margin-top: 5%;">
+          <el-table :data="tableDataa" border style="width: 75%;margin-top: 10%;margin-left: 8%;"
+                    :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"
+          >
+            <el-table-column prop="workstationId" align="center" :label="$t('basicData.station')" min-width="60"/>
+            <el-table-column prop="patternWidth" align="center" :label="$t('basicData.width')" min-width="80"/>
+            <el-table-column prop="patternHeight" align="center" :label="$t('basicData.height')" min-width="80"/>
+            <el-table-column prop="filmsId" align="center" :label="$t('basicData.coatingtypes')" min-width="80"/>
+            <el-table-column prop="number" align="center" :label="$t('basicData.quantity')" min-width="80"/>
+          </el-table>
     </div>
   </div>
-    <div style="width: 48%;float: right;">
-      <div style="display: flex;">
-        <img src="../../assets/shangpianji.png" alt="" style="max-width: 25%;max-height: 25%;margin-left: 10%;margin-top: 5%;">
-        <el-table :data="tableDataa" border style="width: 75%;margin-top: 10%;margin-left: 2%;"
-     :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"
-        >
-          <el-table-column prop="workstationId" align="center" :label="$t('basicData.station')" min-width="60" />
-          <el-table-column prop="patternWidth" align="center" :label="$t('basicData.width')" min-width="80" />
-          <el-table-column prop="patternHeight" align="center" :label="$t('basicData.height')" min-width="80" />
-          <el-table-column prop="filmsId" align="center" :label="$t('basicData.coatingtypes')" min-width="80" />
-          <el-table-column prop="number" align="center" :label="$t('basicData.quantity')" min-width="80" />
-        </el-table>
-    </div>
-</div>
+      <!-- <div style="width: 48%;float: right;">
+        <div style="display: flex;">
+          <img src="../../assets/shangpianji.png" alt="" style="max-width: 25%;max-height: 25%;margin-left: 10%;margin-top: 5%;">
+          <el-table :data="tableDatab" border style="width: 75%;margin-top: 10%;margin-left: 2%;"
+       :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"
+          >
+            <el-table-column prop="workstationId" align="center" :label="$t('basicData.station')" min-width="60" />
+            <el-table-column prop="patternWidth" align="center" :label="$t('basicData.width')" min-width="80" />
+            <el-table-column prop="patternHeight" align="center" :label="$t('basicData.height')" min-width="80" />
+            <el-table-column prop="filmsId" align="center" :label="$t('basicData.coatingtypes')" min-width="80" />
+            <el-table-column prop="number" align="center" :label="$t('basicData.quantity')" min-width="80" />
+          </el-table>
+      </div>
+  </div> -->
 </div>
   <el-dialog v-model="blind" top="30vh" width="25%" :title="$t('basicData.startfilm')">
     <template #footer>
       <div id="dialog-footer">
-        <el-button type="primary" @click="handle">
+        <el-button type="primary" @click="handleon">
           {{ $t('basicData.confirm') }}
         </el-button>
         <el-button @click="blind = false">{{ $t('basicData.cancel') }}</el-button>
       </div>
     </template>
   </el-dialog>
-  
-<el-dialog v-model="dialoglea" top="15vh" width="70%" :title="$t('searchOrder.dutyinformation')">
-    <el-table  ref="table" style="margin-top: 20px;height: 300px;"
-        :data="tableDatax" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
-          <el-table-column prop="line" fixed align="center" :label="$t('searchOrder.line')"/>
-          <el-table-column prop="workProcesses" fixed align="center" :label="$t('searchOrder.process')" />
-          <el-table-column prop="teamsGroupsName" align="center" :label="$t('searchOrder.team')">
-        <template #default="{ row }">  
-          <el-input v-model="row.teamsGroupsName" autocomplete="off" min-width="150"/>  
-        </template>  
-      </el-table-column>
-          <el-table-column prop="deviceName" align="center" :label="$t('searchOrder.basic')">
-            <template #default="{ row }">  
-          <el-input v-model="row.deviceName" autocomplete="off" min-width="150"/>  
-        </template>
+
+    <el-dialog v-model="dialoglea" top="15vh" width="70%" :title="$t('searchOrder.dutyinformation')">
+      <el-table ref="table" style="margin-top: 20px;height: 300px;"
+                :data="tableDatax" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
+        <el-table-column prop="line" fixed align="center" :label="$t('searchOrder.line')"/>
+        <el-table-column prop="workProcesses" fixed align="center" :label="$t('searchOrder.process')"/>
+        <el-table-column prop="teamsGroupsName" align="center" :label="$t('searchOrder.team')">
+          <!-- <template #default="{ row }">
+            <el-input v-model="row.teamsGroupsName" autocomplete="off" min-width="150"/>
+          </template>   -->
+        </el-table-column>
+        <el-table-column prop="deviceName" align="center" :label="$t('searchOrder.basic')">
+          <!-- <template #default="{ row }">
+        <el-input v-model="row.deviceName" autocomplete="off" min-width="150"/>
+      </template> -->
         </el-table-column>
         </el-table>
         <template #footer>
       <div id="dialog-footer">
-        <el-button type="primary" @click="handleConfirm">
-          {{ $t('searchOrder.add') }}
-        </el-button>
-        <el-button @click="dialoglea = false">{{ $t('searchOrder.cancel') }}</el-button>
+        <el-button @click="dialoglea = false">{{ $t('large.close') }}</el-button>
       </div>
     </template>
 </el-dialog>
   <el-dialog v-model="blinda" top="24vh" width="30%" :title="$t('basicData.whetherpause')">
     <div style="margin-left: 50px;margin-bottom: 10px;">
     <el-form-item :label="$t('Mounting.loadingline')" :required="true">
-    <el-select v-model="loadingline" clearable :placeholder="$t('Mounting.inloadingline')" style="margin-left: 20px;" >
-      <el-option :label="$t('Mounting.all')" value="0"></el-option>
-      <el-option :label="$t('Mounting.oneloadingline')" value="1"></el-option>
-      <el-option :label="$t('Mounting.twoloadingline')" value="2"></el-option>
-    </el-select>
+      <el-select disabled v-model="stationCell" clearable :placeholder="$t('Mounting.inloadingline')"
+                 style="margin-left: 20px;">
+        <el-option :label="$t('Mounting.all')" value="0"></el-option>
+        <el-option :label="$t('Mounting.oneloadingline')" value="1"></el-option>
+        <el-option :label="$t('Mounting.twoloadingline')" value="2"></el-option>
+      </el-select>
     </el-form-item>
     </div>
     <template #footer>
@@ -315,169 +435,50 @@
       </div>
     </template>
   </el-dialog>
-    
-  <el-dialog v-model="add" top="23vh" width="45%" :title="$t('basicData.addglass')" >
-    <div style="margin-left: -50px;margin-top: 10px;margin-bottom: 10px;">
-            <el-form  size="mini" label-width="150px">
-      <el-form label-width="70px" label-position="right">
-        <el-row style="margin-top: -15px;margin-bottom: -2px;">
-          <el-col :span="6">
-              <div id="dt" style="font-size: 15px;">
-        <div>
-              <el-form-item :label="$t('basicData.widtha')" :required="true" style="width: 14vw">
-               <el-select  
-                      v-model="selectedValue"  
-                      filterable  
-                      clearable  
-                      :placeholder="$t('basicData.selectwidth')"
-                      style="width: 220px"  
-                      @input="handleInputChangea"  
-                    >  
-                 <el-option  
-                    v-for="item in selectOptions"  
-                    :key="item.id"  
-                    :label="item.label"  
-                    :value="item.value"  
-                 />  
-               </el-select>  
-              </el-form-item>
-              </div></div>
-          </el-col>
-          <el-col :span="9">
-            <div id="dta" style="font-size: 15px;">
-        <div>
-          <el-form-item :label="$t('basicData.heighta')" :required="true" style="width: 14vw">
-            <el-select  
-                      v-model="selectedValuea"  
-                      filterable  
-                      clearable  
-                      :placeholder="$t('basicData.selectheight')" 
-                      style="width: 220px"  
-                      @input="handleInputChangea"  
-                    >  
-                 <el-option  
-                    v-for="item in selectOptionsa"  
-                    :key="item.id"  
-                    :label="item.label"  
-                    :value="item.value"  
-                 />  
-               </el-select> 
-              </el-form-item></div>
-              </div>
-          </el-col>
-        </el-row>
-        <el-row style="margin-top: 10px;">
-          <el-col :span="6">
-              <div id="dt" style="font-size: 15px;">
-        <div>
-              <el-form-item :label="$t('basicData.coatingtypesa')"  :required="true" style="width: 14vw;">
-                <el-select  
-                      v-model="selectedValueb"  
-                      filterable  
-                      clearable  
-                      :placeholder="$t('basicData.selectcoatingtypes')"
-                      style="width: 220px"  
-                      @input="handleInputChangea"  
-                    >  
-                 <el-option  
-                    v-for="item in selectOptionsb"  
-                    :key="item.id"  
-                    :label="item.label"  
-                    :value="item.value"  
-                 />  
-               </el-select> 
-              </el-form-item></div></div>
-          </el-col>
-          <el-col :span="9">
-            <div id="dta" style="font-size: 15px;">
-        <div>
-              <el-form-item :label="$t('basicData.thicknessa')" :required="true" style="width: 14vw">
-                <el-select  
-                      v-model="selectedValuec"  
-                      filterable  
-                      clearable  
-                      :placeholder="$t('basicData.selectthickness')"
-                      style="width: 220px"  
-                      @input="handleInputChangea"  
-                    >  
-                 <el-option  
-                    v-for="item in selectOptionsc"  
-                    :key="item.id"  
-                    :label="item.label"  
-                    :value="item.value"  
-                 />  
-               </el-select> 
-                <!-- <el-input v-model="patternThickness" autocomplete="off" /> -->
-              </el-form-item></div></div>
-          </el-col>
-        </el-row>
-        <el-row style="margin-top: 10px;">
-          <el-col :span="6">
-              <div id="dt" style="font-size: 15px;">
-        <div>
-              <el-form-item :label="$t('basicData.quantitya')" :required="true" style="width: 14vw;">
-                <el-input :placeholder="$t('basicData.selectquantity')" v-model="number" autocomplete="off" />
-              </el-form-item></div></div>
-          </el-col>
-        </el-row>
-        </el-form>
-            </el-form>
-          </div>
-    <template #footer>
-      <div id="dialog-footer">
-        <el-button type="primary" @click="handleConfirm">
-          {{ $t('basicData.confirm') }}
-        </el-button>
-        <el-button @click="add = false">{{ $t('basicData.cancel') }}</el-button>
-      </div>
-    </template>
-  </el-dialog>
-  <el-dialog v-model="adda" top="30vh" width="25%" :title="$t('basicData.deletemessage')">
-    <template #footer>
-      <div id="dialog-footer">
-        <el-button type="primary" @click="handleConfirma">
-          {{ $t('basicData.confirm') }}
-        </el-button>
-        <el-button @click="adda = false">{{ $t('basicData.cancel') }}</el-button>
-      </div>
-    </template>
-  </el-dialog>
         </div>
-  <el-dialog v-model="dialogFormVisible" top="24vh" width="50%"  >
+  <el-dialog v-model="dialogFormVisible" top="24vh" width="70%">
     <div class="flex-container" style="margin-left: 50px;margin-bottom: 10px;">
-    <el-form-item :label="$t('Mounting.loadingline')" :required="true">
-    <el-select v-model="loadingline" clearable :placeholder="$t('Mounting.inloadingline')"  >
-      <el-option :label="$t('Mounting.oneloadingline')" value="1"></el-option>
-      <el-option :label="$t('Mounting.twoloadingline')" value="2"></el-option>
-    </el-select>
-              </el-form-item>
+      <el-form-item :label="$t('Mounting.loadingline')" :required="true">
+        <el-select disabled v-model="stationCell" clearable :placeholder="$t('Mounting.inloadingline')">
+          <el-option :label="$t('Mounting.oneloadingline')" value="1"></el-option>
+          <el-option :label="$t('Mounting.twoloadingline')" value="2"></el-option>
+        </el-select>
+      </el-form-item>
       <el-form-item :label="$t('Mounting.projecta')" :required="true">
-        <el-select  
-           v-model="selectedProjectNo"  
-           filterable  
-           clearable  
-           :placeholder="$t('basicData.plselectproject')"
-           style="width: 220px"  
-           @input="handleInputChange"  
-         >
+        <el-select
+            v-model="selectedProjectNo"
+            filterable
+            clearable
+            :placeholder="$t('basicData.plselectproject')"
+            style="width: 220px"
+            @input="handleInputChange"
+        >
           <el-option
               v-for="item in titleSelectJson['engineerId']"
               :key="item.id"
-              :label="item.engineerId"
-              :value="item.engineerId"
+              :label="item.projectNo"
+              :value="item.projectNo"
           />
-    </el-select>  
-              </el-form-item>
-          </div>
+        </el-select>
+      </el-form-item>
+      <el-form-item :label="$t('Mounting.removalmethoda')" :required="true">
+        <el-select v-model="filmRemove" clearable :placeholder="$t('Mounting.removalmethod')">
+          <el-option :label="$t('Mounting.noremoval')" value="0"></el-option>
+          <el-option :label="$t('Mounting.coarselyground')" value="1"></el-option>
+          <el-option :label="$t('Mounting.finegrinding')" value="2"></el-option>
+        </el-select>
+      </el-form-item>
+    </div>
     <template #footer>
       <div id="dialog-footer">
-        <el-button type="primary" @click="handleup">
+        <el-button type="primary" @click="handlesure">
           {{ $t('basicData.confirm') }}
         </el-button>
         <el-button @click="dialogFormVisible = false">{{ $t('basicData.cancel') }}</el-button>
       </div>
     </template>
   </el-dialog>
+  </div>
 </template>
  
 <style scoped>
diff --git a/UI-Project/src/views/Returns/upreturns2.vue b/UI-Project/src/views/Returns/upreturns2.vue
index fd2145d..afa5811 100644
--- a/UI-Project/src/views/Returns/upreturns2.vue
+++ b/UI-Project/src/views/Returns/upreturns2.vue
@@ -1,210 +1,294 @@
 <script lang="ts" setup>
-import {Search} from "@element-plus/icons-vue";
-import {reactive} from "vue";
+import {onBeforeUnmount, onMounted, onUnmounted, reactive, ref} from "vue";
 import {useRouter} from "vue-router"
-const router = useRouter()
-import type { TableColumnCtx } from 'element-plus'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { useI18n } from 'vue-i18n'
-const { t } = useI18n()
-import { WebSocketHost ,host} from '@/utils/constants'
+import {ElMessage} from 'element-plus'
+import {useI18n} from 'vue-i18n'
+import {host, WebSocketHost} from '@/utils/constants'
 import request from "@/utils/request"
-import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService';
-import { ref, onMounted, onUnmounted, onBeforeUnmount } from "vue";
+import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
+
+const router = useRouter()
+const {t} = useI18n()
 const selectValuesa = reactive([]);
-const selectedProjectNo = ref(''); // 褰撳墠閫変腑鐨勫伐绋嬪彿  
-const loadingline = ref(''); // 褰撳墠閫変腑鐨勪笂鐗囩嚎
+const selectedProjectNo = ref('');
+const stationCell = ref('2');
+const filmRemove = ref('');
 const dialogFormVisible = ref(false)
 const blind = ref(false)
 const blinda = ref(false)
-const blindb = ref(false)
-const add = ref(false)
-const adda = ref(false)
 const dialoglea = ref(false)
 const tableDatax = ref([])
-const user = ref('');
-const projectNo = ref('');
-const workstationId = ref('');
-const id = ref('');
-const patternHeight = ref('');
-const patternWidth = ref('');
-const filmsId = ref('');
-const patternThickness = ref('');
-const number = ref('');
-const canSelectProject = ref(true);
-const canStartLoading = ref(false);
-const selectedValue = ref(''); // 褰撳墠閫変腑鐨勫  
-const selectedValuea = ref('');  
-const selectedValueb = ref('');
-const selectedValuec = ref(''); 
-// const upstatus = ref('涓婄墖鏈烘墜鍔ㄧ姸鎬侊細'); // 鍋囪杩欎釜鐢ㄤ簬鏄剧ず鑷姩/鎵嬪姩鐘舵��  
 const upstatus = ref(t('basicData.machineaa'));
-const cuttingMachine = ref(''); // 鍋囪杩欎釜鐢ㄤ簬瀛樺偍鍚庣杩斿洖鐨勭姸鎬佸�硷紙0鎴�1锛�  
 const cuttingMachineStatusColor = ref('#911005'); // 鐢ㄤ簬鍔ㄦ�佽缃甶鏍囩鐨勮儗鏅壊 
-const inKageWord = ref(0); // 鐢ㄤ簬瀛樺偍瑕佷紶閫掔粰鎺ュ彛鐨刬nKageWord鍊� 
-const options = ref<any[]>([]); // 涓嬫媺閫夐」鍒楄〃  
-const ida = ref(null); 
-const selectOptions = ref<Array<any>>([]); // 涓嬫媺閫夐�夐」鏁扮粍  
-const selectOptionsa = ref<Array<any>>([]); // 涓嬫媺閫夐�夐」鏁扮粍  
-const selectOptionsb = ref<Array<any>>([]); // 涓嬫媺閫夐�夐」鏁扮粍  
-const selectOptionsc = ref<Array<any>>([]); // 涓嬫媺閫夐�夐」鏁扮粍  
-  const tableDataa = ref([])
-  const tableData = reactive([]);
+const tableDataa = ref<any[]>([]);
+const tableDatab = ref<any[]>([]);
+const tableData = ref([])
+// const tableData = reactive([]);
+const titleSelectJson = ref({
+  engineerId: [],
+})
 const handlezhiban = () => {
-  dialoglea.value = true; // 鎵撳紑缁戝畾鏋跺瓙瀵硅瘽妗�
+  dialoglea.value = true;
+  fetchFlowCardId();
 };
 const selectproject = () => {
   dialogFormVisible.value = true;
+  selectgong();
 };
- 
- 
+const markingMachineStatus = ref('#911005');
+const cuttingMachineStatus = ref('#911005');
+const confirmMarkingMachine = () => {
+  markingMachineStatus.value = 'green';
+};
+const confirmCuttingMachine = () => {
+  cuttingMachineStatus.value = 'green';
+};
 onMounted(() => {
-  // socket = initializeWebSocket(socketUrl, handleMessage);
+  socket = initializeWebSocket(socketUrl, handleMessage);
 });
-  onUnmounted(() => {
-    if (socket) {
+onUnmounted(() => {
+  if (socket) {
     closeWebSocket(socket);
+  }
+});
+const fetchTableData = async () => {
+  try {
+    const response = await request.get("/loadGlass/up-patten-usage/prioritylist");
+    if (response.code === 200) {
+      tableData.splice(0, tableData.length, ...response.data);
+      ElMessage.error(response.message);
     }
-    });
-//瀹氫箟鎺ユ敹鍔犺浇琛ㄥご涓嬫媺鏁版嵁
-const titleSelectJson = ref({
-  processType: [],
-})
-const titleSelectJsona = ref({
-  processTypea: [],
-})
+  } catch (error) {
+    // 澶勭悊璇锋眰澶辫触鐨勬儏鍐�
+    // ElMessage.error('鑾峰彇琛ㄦ牸鏁版嵁澶辫触锛岃閲嶈瘯');
+  }
+};
 let socket = null;
-const socketUrl = `ws://${WebSocketHost}:${host}/api/loadGlass/api/talk/loadGlass`;
-// 瀹氫箟娑堟伅澶勭悊鍑芥暟锛屾洿鏂� receivedData 鍙橀噺
- 
-const requestData = {  
-  state: 100  
-};  
- 
- 
+const socketUrl = `ws://${WebSocketHost}:${host}/api/loadGlass/api/talk/uploadGlass`;
+const handleMessage = (data: any) => {
+  // tableDataa.value = data.list[0].slice(0, 2);
+  tableDataa.value = data.list[0].slice(2, 4);
+};
 onBeforeUnmount(() => {
   closeWebSocket();
 });
-// 娣诲姞
-const handleBindRack = (row) => {
-  workstationId.value = row.workstationId; // 鍋囪rackNumber鏄灦鍙峰瓧娈电殑灞炴�у悕
-  ida.value = row.id;
-  add.value = true; // 鎵撳紑缁戝畾鏋跺瓙瀵硅瘽妗�
+const requestData = {
+  state: 100
 };
-// 鏆傚仠
-const handlea = async () => {
-  try  {
-  let engineeringId = window.localStorage.getItem('engineeringId')
-console.log(engineeringId);
-if (engineeringId !== '') {
-  const response = await request.post('/loadGlass/engineering/engineering/pauseTask', {
-      engineeringId: engineeringId,
-      state: 0,
-    })
+const selectgong = async (queryString: string) => {
+  try {
+    const response = await request.post('/loadGlass/optimizeProject/listByState', {
+      ...requestData,
+      query: queryString
+    });
     if (response.code == 200) {
-      ElMessage.success(response.message);
-      blinda.value = false;
-      // tableData.splice([]);
+      titleSelectJson.value.engineerId = response.data;
     } else {
-      // 璇锋眰澶辫触锛屾樉绀洪敊璇秷鎭�
       ElMessage.error(response.message);
     }
+  } catch (error) {
+    console.error(error);
   }
-    else  {
+};
+//閫夋嫨宸ョ▼棰勮纭
+const handlesure = async () => {
+  try {
+    const response = await request.post('/loadGlass/up-patten-usage/selectUpPattenUsage', {
+      stationCell: 6,
+      engineerId: selectedProjectNo.value,
+      // filmRemove: filmRemove.value,
+      filmRemove: parseInt(filmRemove.value, 10),
+    })
+    window.localStorage.setItem('engineeringId', selectedProjectNo.value)
+    window.localStorage.setItem('filmRemove', filmRemove.value)
+    if (response.code == 200) {
+      ElMessage.success(response.message);
+      tableData.value = response.data;
+      dialogFormVisible.value = false;
+      selectedProjectNo.value = '';
+      filmRemove.value = '';
+      markingMachineStatus.value = '#911005';
+      cuttingMachineStatus.value = '#911005';
+    } else {
+      ElMessage.error(response.message);
+    }
+  } catch (error) {
+    console.error(error);
+  }
+}
+// 寮�濮嬩笂鐗�
+const handleon = async () => {
+  let filmRemove = window.localStorage.getItem('filmRemove')
+  let engineeringId = window.localStorage.getItem('engineeringId')
+  if (markingMachineStatus.value === 'green' && cuttingMachineStatus.value === 'green') {
+    try {
+      const response = await request.post('/loadGlass/engineering/engineering/pause', {
+        // const response = await request.post('/loadGlass/engineering/engineering/changeTask', {
+        // stationCell: 6,
+        // filmRemove: filmRemove,
+        engineerId: engineeringId,
+        state: 1,
+      })
+      if (response.code == 200) {
+        ElMessage.success(response.message);
+        blind.value = false;
+      } else {
+        ElMessage.error(response.message);
+      }
+    } catch (error) {
+      console.error(error);
+    }
+  } else if (markingMachineStatus.value === '#911005' || cuttingMachineStatus.value === '#911005') {
+    // 鎻愮ず鐢ㄦ埛鎵撴爣鏈烘湭灏辩华
+    ElMessage.warning(t('basicData.pausea'));
+  }
+}
+// 鏆傚仠
+const handleup = async () => {
+  try {
+    let engineeringId = window.localStorage.getItem('engineeringId')
+    console.log(engineeringId);
+    if (engineeringId !== '') {
+      const response = await request.post('/loadGlass/engineering/engineering/pause', {
+        // stationCell: 6,
+        engineerId: engineeringId,
+        state: 0,
+      })
+      if (response.code == 200) {
+        ElMessage.success(response.message);
+        blinda.value = false;
+      } else {
+        ElMessage.error(response.message);
+      }
+    } else {
       ElMessage({
         type: 'info',
         message: t('basicData.infonull'),
       })
     }
-}
-catch (error) {
-    // 澶勭悊閿欒
+  } catch (error) {
     console.error(error);
   }
 }
-function getStatusText(state: number) {
-  switch (state) {
-    case 0:  
-      return t('basicData.waiting');
-    case 1:  
-      return t('basicData.up');
-    case 2:  
-    return t('basicData.up');
-    case 100:  
-    return t('basicData.finish');
-  }  
-}  
-function getStatusType(state: number) {  
-  switch (state) {  
-    case 0:
-      return 'warning';  
-    case 1: 
-      return 'primary';  
-    case 2: 
-      return 'primary';  
-    case 100:
-      return 'success';  
-  }  
-}  
+
+// 鏌ヨ鏁版嵁
+const selectReportData = async () => {
+  let stateList = []
+  if (selectValuesa[0] != null && selectValuesa[0] != 'undefined') {
+    if (selectValuesa[0] != "") {
+      stateList = [selectValuesa[0]];
+    }
+  }
+  const response = await request.post("/loadGlass/up-patten-usage/setUpPattenRequest", {
+    state: selectValuesa[0],
+    // state: stateList,
+    stationCell: 6
+  })
+  if (response.code === 200) {
+    tableData.value = response.data;
+    ElMessage.success(response.message);
+  } else {
+    ElMessage.error(response.message);
+  }
+};
+
+// 鍊肩彮淇℃伅
+const fetchFlowCardId = async () => {
+  try {
+    const response = await request.post('/loadGlass/work_assignment/selectWorkAssignment', {
+      line: 2001,
+      workingProcedure: '鍐峰姞宸�'
+    })
+    if (response.code == 200) {
+      ElMessage.success(response.message);
+      tableDatax.value = response.data;
+    } else {
+      ElMessage.error(response.message);
+    }
+  } catch (error) {
+    console.error(error);
+  }
+}
+onMounted(fetchTableData);
 // 寮�濮嬩笂鐗�
 const handleBind = (row) => {
-  blind.value = true; // 鎵撳紑缁戝畾鏋跺瓙瀵硅瘽妗�
+  blind.value = true;
 };
 // 鏆傚仠
 const handleBinda = (row) => {
   blinda.value = true;
 };
-// 鍋滄浠诲姟
-const handleBindb = (row) => {
-  blindb.value = true; 
-};
- 
-// 鍒犻櫎
-const handleBindRacka = (row) => {
-  workstationId.value = row.workstationId;
-  adda.value = true; 
-};
-const toggleEnableState = async (row: any) => {  
+const toggleEnableState = async (row: any) => {
   // 妫�鏌� id 鏄惁涓虹┖  
   if (!row.id) {  
     ElMessage.error(t('basicData.updatanull'));  
     return; // 濡傛灉 id 涓虹┖锛屽垯涓嶆墽琛屽悗缁搷浣�  
   }  
-  const newState = row.state === 100 ? 0 : 100;  
-  try {  
-    // 鍙戦�佽姹傚埌鍚庣鏇存柊鐘舵��  
-    const response = await request.post('/loadGlass/up-patten-usage/updateGlassState', { id: row.id, state: newState });  
-    if (response.code === 200) {  
-      ElMessage.success(response.message);  
-      row.state = newState;  
-    } else {  
-      ElMessage.error(response.message);  
-    }  
-  } catch (error) {  
-    // 澶勭悊璇锋眰閿欒  
-    ElMessage.error(t('basicData.glassnull'));   
-  }  
+  const newState = row.state === 100 ? 0 : 100;
+  try {
+    const response = await request.post('/loadGlass/up-patten-usage/updateGlassState', {id: row.id, state: newState});
+    if (response.code === 200) {
+      ElMessage.success(response.message);
+      row.state = newState;
+    } else {
+      ElMessage.error(response.message);
+    }
+  } catch (error) {
+    ElMessage.error(t('basicData.glassnull'));
+  }
 };
+
+function getStatusType2(filmRemove) {
+  switch (filmRemove) {
+    case 0:
+      return 'success';
+    case 1:
+      return 'info';
+    case 2:
+      return 'warning';
+  }
+}
+
+function getStatusText2(filmRemove) {
+  switch (filmRemove) {
+    case 0:
+      return t('Mounting.noremoval');//瀹屾垚
+    case 1:
+      return t('Mounting.coarselyground');//鏂板缓
+    case 2:
+      return t('Mounting.finegrinding');//鎵ц涓�
+  }
+}
 </script>
 <template>
-  <div>
-    <div id="dotClass">
-      <div>{{ $t('basicData.laserprinting') }}</div>  
-    <i :style="{ marginTop: '2px', backgroundColor: markingMachineStatus, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>  
-    <el-button @click="confirmMarkingMachine" style="margin-left: 30px;margin-top: -3px;">{{ $t('basicData.yes') }}</el-button>
-    <div style="margin-left: 70px;">{{ $t('basicData.cuttingmachine') }}</div>
-    <i :style="{ marginTop: '2px', backgroundColor: cuttingMachineStatus, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>  
-    <el-button @click="confirmCuttingMachine" style="margin-left: 30px;margin-top: -3px;" >{{ $t('basicData.yes') }}</el-button>
-    <div style="margin-left: 70px;">{{ upstatus  }} </div>
-    <i :style="{ marginTop: '2px', backgroundColor: cuttingMachineStatusColor, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>  
-    <el-button @click="confirmCutting" style="margin-left: 30px;margin-top: -3px;" >{{ $t('basicData.change') }}</el-button>
-   
+  <div style="height: 500px;">
+    <div>
+      <div id="dotClass">
+        <div>{{ $t('basicData.laserprinting') }}</div>
+        <i :style="{ marginTop: '2px', backgroundColor: markingMachineStatus, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
+        <el-button @click="confirmMarkingMachine" style="margin-left: 30px;margin-top: -3px;">{{
+            $t('basicData.yes')
+          }}
+        </el-button>
+        <div style="margin-left: 70px;">{{ $t('basicData.cuttingmachine') }}</div>
+        <i :style="{ marginTop: '2px', backgroundColor: cuttingMachineStatus, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
+        <el-button @click="confirmCuttingMachine" style="margin-left: 30px;margin-top: -3px;">{{
+            $t('basicData.yes')
+          }}
+        </el-button>
+        <div style="margin-left: 70px;">{{ upstatus }}</div>
+        <i :style="{ marginTop: '2px', backgroundColor: cuttingMachineStatusColor, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
+        <el-button @click="confirmCutting" style="margin-left: 30px;margin-top: -3px;">{{
+            $t('basicData.change')
+          }}
+        </el-button>
   </div>
     <el-button style="margin-top: 5px;margin-left: 15px;"  type="primary" @click="selectproject">{{ $t('Mounting.previewproject') }}</el-button>
     <el-button style="margin-top: 5px;margin-left: 20px;" type="success" @click="handleBind">{{ $t('basicData.startloading') }}</el-button>
     <el-button style="margin-top: 5px;margin-left: 20px;"  id="searchButton" type="warning" @click="handleBinda">{{ $t('basicData.stop') }}</el-button>
     <el-button style="margin-top: 5px;margin-left: 20px;" id="searchButton" type="info" @click="handlezhiban">{{ $t('searchOrder.dutyinformation') }}</el-button>
-    <el-select v-model="selectValuesa[1]" clearable :placeholder="$t('Mounting.loadinglinea')" style="margin-top: 5px;margin-left: 20px;" >
+    <el-select disabled v-model="selectValuesa[1]" clearable :placeholder="$t('Mounting.twoloadingline')"
+               style="margin-top: 5px;margin-left: 20px;">
       <el-option :label="$t('Mounting.all')" value="0"></el-option>
       <el-option :label="$t('Mounting.oneloadingline')" value="1"></el-option>
       <el-option :label="$t('Mounting.twoloadingline')" value="2"></el-option>
@@ -240,93 +324,105 @@
             min-width="80"
             prop="state"
           >
-          <template #default="scope">  
-          <el-tag  
-            :type="scope.row.state === 100 ? 'success' : 'warning'"  
-            @click="toggleEnableState(scope.row)"  
-          >  
-            {{ scope.row.state === 100 ? $t('Mounting.pass') : $t('Mounting.waiting') }}
-          </el-tag>  
-        </template> 
-          </el-table-column>
+          <template #default="scope">
+            <el-tag
+                :type="scope.row.state === 100 ? 'success' : 'warning'"
+                @click="toggleEnableState(scope.row)"
+            >
+              {{ scope.row.state === 100 ? $t('Mounting.pass') : $t('Mounting.waiting') }}
+            </el-tag>
+          </template>
+      </el-table-column>
       <el-table-column prop="filmsId" :label="$t('Mounting.createtime')" align="center"/>
+      <!-- <el-table-column prop="filmRemove" :label="$t('Mounting.removalmethodp')" align="center"/> -->
+      <el-table-column
+          align="center"
+          :label="$t('Mounting.removalmethodp')"
+          prop="filmRemove"
+      >
+        <template #default="scope">
+          <el-tag :type="getStatusType2(scope.row.filmRemove)">
+            {{ getStatusText2(scope.row.filmRemove) }}
+          </el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column prop="stationCell" :label="$t('Mounting.loadinglinea')" align="center"/>
     </el-table>
       </div>
     </el-card>
     <div style="display: flex;">
-  <div style="width: 49%;float: left;">
-    <div style="display: flex;">
-        <img src="../../assets/shangpianji.png" alt="" style="max-width: 25%;max-height: 25%;margin-left: 10%;margin-top: 5%;">
-        <el-table :data="tableDataa" border style="width: 75%;margin-top: 10%;margin-left: 2%;"
-     :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"
-        >
-          <el-table-column prop="workstationId" align="center" :label="$t('basicData.station')" min-width="60" />
-          <el-table-column prop="patternWidth" align="center" :label="$t('basicData.width')" min-width="80" />
-          <el-table-column prop="patternHeight" align="center" :label="$t('basicData.height')" min-width="80" />
-          <el-table-column prop="filmsId" align="center" :label="$t('basicData.coatingtypes')" min-width="80" />
-          <el-table-column prop="number" align="center" :label="$t('basicData.quantity')" min-width="80" />
-        </el-table>
+      <div style="width: 49%;float: left;margin-left: 300px;">
+        <div style="display: flex;">
+          <img src="../../assets/shangpianji.png" alt=""
+               style="max-width: 20%;max-height: 25%;margin-left: 10%;margin-top: 5%;">
+          <el-table :data="tableDataa" border style="width: 75%;margin-top: 10%;margin-left: 8%;"
+                    :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"
+          >
+            <el-table-column prop="workstationId" align="center" :label="$t('basicData.station')" min-width="60"/>
+            <el-table-column prop="patternWidth" align="center" :label="$t('basicData.width')" min-width="80"/>
+            <el-table-column prop="patternHeight" align="center" :label="$t('basicData.height')" min-width="80"/>
+            <el-table-column prop="filmsId" align="center" :label="$t('basicData.coatingtypes')" min-width="80"/>
+            <el-table-column prop="number" align="center" :label="$t('basicData.quantity')" min-width="80"/>
+          </el-table>
     </div>
   </div>
-    <div style="width: 48%;float: right;">
-      <div style="display: flex;">
-        <img src="../../assets/shangpianji.png" alt="" style="max-width: 25%;max-height: 25%;margin-left: 10%;margin-top: 5%;">
-        <el-table :data="tableDataa" border style="width: 75%;margin-top: 10%;margin-left: 2%;"
-     :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"
-        >
-          <el-table-column prop="workstationId" align="center" :label="$t('basicData.station')" min-width="60" />
-          <el-table-column prop="patternWidth" align="center" :label="$t('basicData.width')" min-width="80" />
-          <el-table-column prop="patternHeight" align="center" :label="$t('basicData.height')" min-width="80" />
-          <el-table-column prop="filmsId" align="center" :label="$t('basicData.coatingtypes')" min-width="80" />
-          <el-table-column prop="number" align="center" :label="$t('basicData.quantity')" min-width="80" />
-        </el-table>
-    </div>
-</div>
+      <!-- <div style="width: 48%;float: right;">
+        <div style="display: flex;">
+          <img src="../../assets/shangpianji.png" alt="" style="max-width: 25%;max-height: 25%;margin-left: 10%;margin-top: 5%;">
+          <el-table :data="tableDatab" border style="width: 75%;margin-top: 10%;margin-left: 2%;"
+       :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"
+          >
+            <el-table-column prop="workstationId" align="center" :label="$t('basicData.station')" min-width="60" />
+            <el-table-column prop="patternWidth" align="center" :label="$t('basicData.width')" min-width="80" />
+            <el-table-column prop="patternHeight" align="center" :label="$t('basicData.height')" min-width="80" />
+            <el-table-column prop="filmsId" align="center" :label="$t('basicData.coatingtypes')" min-width="80" />
+            <el-table-column prop="number" align="center" :label="$t('basicData.quantity')" min-width="80" />
+          </el-table>
+      </div>
+  </div> -->
 </div>
   <el-dialog v-model="blind" top="30vh" width="25%" :title="$t('basicData.startfilm')">
     <template #footer>
       <div id="dialog-footer">
-        <el-button type="primary" @click="handle">
+        <el-button type="primary" @click="handleon">
           {{ $t('basicData.confirm') }}
         </el-button>
         <el-button @click="blind = false">{{ $t('basicData.cancel') }}</el-button>
       </div>
     </template>
   </el-dialog>
-  
-<el-dialog v-model="dialoglea" top="15vh" width="70%" :title="$t('searchOrder.dutyinformation')">
-    <el-table  ref="table" style="margin-top: 20px;height: 300px;"
-        :data="tableDatax" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
-          <el-table-column prop="line" fixed align="center" :label="$t('searchOrder.line')"/>
-          <el-table-column prop="workProcesses" fixed align="center" :label="$t('searchOrder.process')" />
-          <el-table-column prop="teamsGroupsName" align="center" :label="$t('searchOrder.team')">
-        <template #default="{ row }">  
-          <el-input v-model="row.teamsGroupsName" autocomplete="off" min-width="150"/>  
-        </template>  
-      </el-table-column>
-          <el-table-column prop="deviceName" align="center" :label="$t('searchOrder.basic')">
-            <template #default="{ row }">  
-          <el-input v-model="row.deviceName" autocomplete="off" min-width="150"/>  
-        </template>
+
+    <el-dialog v-model="dialoglea" top="15vh" width="70%" :title="$t('searchOrder.dutyinformation')">
+      <el-table ref="table" style="margin-top: 20px;height: 300px;"
+                :data="tableDatax" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
+        <el-table-column prop="line" fixed align="center" :label="$t('searchOrder.line')"/>
+        <el-table-column prop="workProcesses" fixed align="center" :label="$t('searchOrder.process')"/>
+        <el-table-column prop="teamsGroupsName" align="center" :label="$t('searchOrder.team')">
+          <!-- <template #default="{ row }">
+            <el-input v-model="row.teamsGroupsName" autocomplete="off" min-width="150"/>
+          </template>   -->
+        </el-table-column>
+        <el-table-column prop="deviceName" align="center" :label="$t('searchOrder.basic')">
+          <!-- <template #default="{ row }">
+        <el-input v-model="row.deviceName" autocomplete="off" min-width="150"/>
+      </template> -->
         </el-table-column>
         </el-table>
         <template #footer>
       <div id="dialog-footer">
-        <el-button type="primary" @click="handleConfirm">
-          {{ $t('searchOrder.add') }}
-        </el-button>
-        <el-button @click="dialoglea = false">{{ $t('searchOrder.cancel') }}</el-button>
+        <el-button @click="dialoglea = false">{{ $t('large.close') }}</el-button>
       </div>
     </template>
 </el-dialog>
   <el-dialog v-model="blinda" top="24vh" width="30%" :title="$t('basicData.whetherpause')">
     <div style="margin-left: 50px;margin-bottom: 10px;">
     <el-form-item :label="$t('Mounting.loadingline')" :required="true">
-    <el-select v-model="loadingline" clearable :placeholder="$t('Mounting.inloadingline')" style="margin-left: 20px;" >
-      <el-option :label="$t('Mounting.all')" value="0"></el-option>
-      <el-option :label="$t('Mounting.oneloadingline')" value="1"></el-option>
-      <el-option :label="$t('Mounting.twoloadingline')" value="2"></el-option>
-    </el-select>
+      <el-select disabled v-model="stationCell" clearable :placeholder="$t('Mounting.inloadingline')"
+                 style="margin-left: 20px;">
+        <el-option :label="$t('Mounting.all')" value="0"></el-option>
+        <el-option :label="$t('Mounting.oneloadingline')" value="1"></el-option>
+        <el-option :label="$t('Mounting.twoloadingline')" value="2"></el-option>
+      </el-select>
     </el-form-item>
     </div>
     <template #footer>
@@ -338,169 +434,50 @@
       </div>
     </template>
   </el-dialog>
-    
-  <el-dialog v-model="add" top="23vh" width="45%" :title="$t('basicData.addglass')" >
-    <div style="margin-left: -50px;margin-top: 10px;margin-bottom: 10px;">
-            <el-form  size="mini" label-width="150px">
-      <el-form label-width="70px" label-position="right">
-        <el-row style="margin-top: -15px;margin-bottom: -2px;">
-          <el-col :span="6">
-              <div id="dt" style="font-size: 15px;">
-        <div>
-              <el-form-item :label="$t('basicData.widtha')" :required="true" style="width: 14vw">
-               <el-select  
-                      v-model="selectedValue"  
-                      filterable  
-                      clearable  
-                      :placeholder="$t('basicData.selectwidth')"
-                      style="width: 220px"  
-                      @input="handleInputChangea"  
-                    >  
-                 <el-option  
-                    v-for="item in selectOptions"  
-                    :key="item.id"  
-                    :label="item.label"  
-                    :value="item.value"  
-                 />  
-               </el-select>  
-              </el-form-item>
-              </div></div>
-          </el-col>
-          <el-col :span="9">
-            <div id="dta" style="font-size: 15px;">
-        <div>
-          <el-form-item :label="$t('basicData.heighta')" :required="true" style="width: 14vw">
-            <el-select  
-                      v-model="selectedValuea"  
-                      filterable  
-                      clearable  
-                      :placeholder="$t('basicData.selectheight')" 
-                      style="width: 220px"  
-                      @input="handleInputChangea"  
-                    >  
-                 <el-option  
-                    v-for="item in selectOptionsa"  
-                    :key="item.id"  
-                    :label="item.label"  
-                    :value="item.value"  
-                 />  
-               </el-select> 
-              </el-form-item></div>
-              </div>
-          </el-col>
-        </el-row>
-        <el-row style="margin-top: 10px;">
-          <el-col :span="6">
-              <div id="dt" style="font-size: 15px;">
-        <div>
-              <el-form-item :label="$t('basicData.coatingtypesa')"  :required="true" style="width: 14vw;">
-                <el-select  
-                      v-model="selectedValueb"  
-                      filterable  
-                      clearable  
-                      :placeholder="$t('basicData.selectcoatingtypes')"
-                      style="width: 220px"  
-                      @input="handleInputChangea"  
-                    >  
-                 <el-option  
-                    v-for="item in selectOptionsb"  
-                    :key="item.id"  
-                    :label="item.label"  
-                    :value="item.value"  
-                 />  
-               </el-select> 
-              </el-form-item></div></div>
-          </el-col>
-          <el-col :span="9">
-            <div id="dta" style="font-size: 15px;">
-        <div>
-              <el-form-item :label="$t('basicData.thicknessa')" :required="true" style="width: 14vw">
-                <el-select  
-                      v-model="selectedValuec"  
-                      filterable  
-                      clearable  
-                      :placeholder="$t('basicData.selectthickness')"
-                      style="width: 220px"  
-                      @input="handleInputChangea"  
-                    >  
-                 <el-option  
-                    v-for="item in selectOptionsc"  
-                    :key="item.id"  
-                    :label="item.label"  
-                    :value="item.value"  
-                 />  
-               </el-select> 
-                <!-- <el-input v-model="patternThickness" autocomplete="off" /> -->
-              </el-form-item></div></div>
-          </el-col>
-        </el-row>
-        <el-row style="margin-top: 10px;">
-          <el-col :span="6">
-              <div id="dt" style="font-size: 15px;">
-        <div>
-              <el-form-item :label="$t('basicData.quantitya')" :required="true" style="width: 14vw;">
-                <el-input :placeholder="$t('basicData.selectquantity')" v-model="number" autocomplete="off" />
-              </el-form-item></div></div>
-          </el-col>
-        </el-row>
-        </el-form>
-            </el-form>
-          </div>
-    <template #footer>
-      <div id="dialog-footer">
-        <el-button type="primary" @click="handleConfirm">
-          {{ $t('basicData.confirm') }}
-        </el-button>
-        <el-button @click="add = false">{{ $t('basicData.cancel') }}</el-button>
-      </div>
-    </template>
-  </el-dialog>
-  <el-dialog v-model="adda" top="30vh" width="25%" :title="$t('basicData.deletemessage')">
-    <template #footer>
-      <div id="dialog-footer">
-        <el-button type="primary" @click="handleConfirma">
-          {{ $t('basicData.confirm') }}
-        </el-button>
-        <el-button @click="adda = false">{{ $t('basicData.cancel') }}</el-button>
-      </div>
-    </template>
-  </el-dialog>
         </div>
-  <el-dialog v-model="dialogFormVisible" top="24vh" width="50%"  >
+  <el-dialog v-model="dialogFormVisible" top="24vh" width="70%">
     <div class="flex-container" style="margin-left: 50px;margin-bottom: 10px;">
-    <el-form-item :label="$t('Mounting.loadingline')" :required="true">
-    <el-select v-model="loadingline" clearable :placeholder="$t('Mounting.inloadingline')"  >
-      <el-option :label="$t('Mounting.oneloadingline')" value="1"></el-option>
-      <el-option :label="$t('Mounting.twoloadingline')" value="2"></el-option>
-    </el-select>
-              </el-form-item>
+      <el-form-item :label="$t('Mounting.loadingline')" :required="true">
+        <el-select disabled v-model="stationCell" clearable :placeholder="$t('Mounting.inloadingline')">
+          <el-option :label="$t('Mounting.oneloadingline')" value="1"></el-option>
+          <el-option :label="$t('Mounting.twoloadingline')" value="2"></el-option>
+        </el-select>
+      </el-form-item>
       <el-form-item :label="$t('Mounting.projecta')" :required="true">
-        <el-select  
-           v-model="selectedProjectNo"  
-           filterable  
-           clearable  
-           :placeholder="$t('basicData.plselectproject')"
-           style="width: 220px"  
-           @input="handleInputChange"  
-         >  
-      <el-option  
-         v-for="item in titleSelectJson['processType']"  
-         :key="item.id"  
-         :label="item.projectNo"  
-         :value="item.projectNo"  
-      />  
-    </el-select>  
-              </el-form-item>
-          </div>
+        <el-select
+            v-model="selectedProjectNo"
+            filterable
+            clearable
+            :placeholder="$t('basicData.plselectproject')"
+            style="width: 220px"
+            @input="handleInputChange"
+        >
+          <el-option
+              v-for="item in titleSelectJson['engineerId']"
+              :key="item.id"
+              :label="item.projectNo"
+              :value="item.projectNo"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item :label="$t('Mounting.removalmethoda')" :required="true">
+        <el-select v-model="filmRemove" clearable :placeholder="$t('Mounting.removalmethod')">
+          <el-option :label="$t('Mounting.noremoval')" value="0"></el-option>
+          <el-option :label="$t('Mounting.coarselyground')" value="1"></el-option>
+          <el-option :label="$t('Mounting.finegrinding')" value="2"></el-option>
+        </el-select>
+      </el-form-item>
+    </div>
     <template #footer>
       <div id="dialog-footer">
-        <el-button type="primary" @click="handleup">
+        <el-button type="primary" @click="handlesure">
           {{ $t('basicData.confirm') }}
         </el-button>
         <el-button @click="dialogFormVisible = false">{{ $t('basicData.cancel') }}</el-button>
       </div>
     </template>
   </el-dialog>
+  </div>
 </template>
  
 <style scoped>
diff --git a/UI-Project/src/views/StockBasicData/stockBasicData.vue b/UI-Project/src/views/StockBasicData/stockBasicData.vue
index f83f2e4..a3a214d 100644
--- a/UI-Project/src/views/StockBasicData/stockBasicData.vue
+++ b/UI-Project/src/views/StockBasicData/stockBasicData.vue
@@ -1,25 +1,24 @@
 <script setup>
-import {Search} from "@element-plus/icons-vue";
-import {reactive} from "vue";
+import {onBeforeUnmount, onMounted, onUnmounted, reactive, ref} from "vue";
 import {useRouter} from "vue-router"
+import {host, WebSocketHost} from '@/utils/constants'
+import request from "@/utils/request"
+import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
+// import { ref } from 'vue'
+import {ElMessage, ElMessageBox} from 'element-plus'
+//  import LanguageMixin from './lang/LanguageMixin'
+import {useI18n} from 'vue-i18n'
+
 const router = useRouter()
 const adda = ref(false)
-import { WebSocketHost ,host} from '@/utils/constants'
-import request from "@/utils/request"
-import { ref, onMounted , onBeforeUnmount,onUnmounted} from "vue";
-import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService';
-// import { ref } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-//  import LanguageMixin from './lang/LanguageMixin'
-  import { useI18n } from 'vue-i18n'
-  const { t } = useI18n()
-  let language = ref(localStorage.getItem('lang') || 'zh')
- 
+const {t} = useI18n()
+let language = ref(localStorage.getItem('lang') || 'zh')
+
 const tableData = ref([])
 const slot = ref('')
-const requestData = {  
-  line: 2001  
-};  
+const requestData = {
+  line: 2001
+};
 const timeRange = ref([])
 const selectValuesa = reactive([]);
 // request.post("/cacheGlass/taskCache/selectEdgTask",{
@@ -144,26 +143,29 @@
 });
   onUnmounted(() => {
     if (socket) {
-    closeWebSocket(socket);
+      closeWebSocket(socket);
     }
-    });
+  });
 onBeforeUnmount(() => {
   console.log("鍏抽棴浜�")
   closeWebSocket();
 });
 </script>
 <template>
-  <div>
-    <el-card style="flex: 1;margin-left: 10px;margin-top: 20px;" v-loading="loading">
-      <el-select v-model="selectValuesa[0]" filterable :placeholder="$t('workOrder.cway')" clearable style="margin-left: 20px;margin-bottom: 10px;">
-            <el-option :label="$t('workOrder.edgingone')" value="2001"></el-option>
-            <el-option :label="$t('workOrder.edgingtwo')" value="2002"></el-option>
-          </el-select>
- 
-          <el-select v-model="selectValuesa[1]" filterable :placeholder="$t('workOrder.cstate')" clearable style="margin-left: 20px;margin-bottom: 10px;" >
-            <el-option :label="$t('workOrder.nedging')" value="0"></el-option>
-            <el-option :label="$t('workOrder.edging')" value="1"></el-option>
-            <el-option :label="$t('workOrder.finedging')" value="2"></el-option>
+  <div style="height: 500px;">
+    <div>
+      <el-card style="flex: 1;margin-left: 10px;margin-top: 20px;" v-loading="loading">
+        <el-select v-model="selectValuesa[0]" filterable :placeholder="$t('workOrder.cway')" clearable
+                   style="margin-left: 20px;margin-bottom: 10px;">
+          <el-option :label="$t('workOrder.edgingone')" value="2001"></el-option>
+          <el-option :label="$t('workOrder.edgingtwo')" value="2002"></el-option>
+        </el-select>
+
+        <el-select v-model="selectValuesa[1]" filterable :placeholder="$t('workOrder.cstate')" clearable
+                   style="margin-left: 20px;margin-bottom: 10px;">
+          <el-option :label="$t('workOrder.nedging')" value="0"></el-option>
+          <el-option :label="$t('workOrder.edging')" value="1"></el-option>
+          <el-option :label="$t('workOrder.finedging')" value="2"></el-option>
           </el-select>
           <span class="demonstration" style="margin-left: 20px;margin-bottom: 10px;">{{ $t('workOrder.time') }}</span>
             <el-date-picker v-model="timeRange" type="datetimerange" range-separator="鑷�" :start-placeholder="$t('reportmanage.starttime')"  style="margin-left: 20px;margin-bottom: 10px;" value-format = "YYYY-MM-DD hh:mm:ss"
@@ -189,17 +191,24 @@
               {{ scope.row.status==0?"鏈(杈�":scope.row.status==1?"纾ㄨ竟涓�":"宸茬(杈�" }}
             </template>
         </el-table-column>
- 
- 
+
+
           <el-table-column fixed="right" :label="$t('workOrder.operate')" align="center" width="200">
             <template #default="scope">
-              <el-button size="mini" type="text" plain @click="open(scope.row)">{{ $t('workOrder.breakage') }}</el-button>
-              <el-button size="mini" type="text" plain @click="opena(scope.row)">{{ $t('workOrder.takeout') }}</el-button>
+              <el-button size="mini" type="text" plain @click="open(scope.row)">{{
+                  $t('workOrder.breakage')
+                }}
+              </el-button>
+              <el-button size="mini" type="text" plain @click="opena(scope.row)">{{
+                  $t('workOrder.takeout')
+                }}
+              </el-button>
             </template>
-        </el-table-column>
+          </el-table-column>
         </el-table>
       </div>
-    </el-card>
+      </el-card>
+    </div>
   </div>
 </template>
  
diff --git a/UI-Project/src/views/StockBasicData/stockBasicDatatwo.vue b/UI-Project/src/views/StockBasicData/stockBasicDatatwo.vue
index aef4c24..24dca31 100644
--- a/UI-Project/src/views/StockBasicData/stockBasicDatatwo.vue
+++ b/UI-Project/src/views/StockBasicData/stockBasicDatatwo.vue
@@ -1,25 +1,24 @@
 <script setup>
-import {Search} from "@element-plus/icons-vue";
-import {reactive} from "vue";
+import {onBeforeUnmount, onMounted, onUnmounted, ref} from "vue";
 import {useRouter} from "vue-router"
+import {host, WebSocketHost} from '@/utils/constants'
+import request from "@/utils/request"
+import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
+// import { ref } from 'vue'
+import {ElMessage, ElMessageBox} from 'element-plus'
+//  import LanguageMixin from './lang/LanguageMixin'
+import {useI18n} from 'vue-i18n'
+
 const router = useRouter()
 const adda = ref(false)
-import { WebSocketHost ,host} from '@/utils/constants'
-import request from "@/utils/request"
-import { ref, onMounted , onBeforeUnmount,onUnmounted} from "vue";
-import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService';
-// import { ref } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-//  import LanguageMixin from './lang/LanguageMixin'
-  import { useI18n } from 'vue-i18n'
-  const { t } = useI18n()
-  let language = ref(localStorage.getItem('lang') || 'zh')
+const {t} = useI18n()
+let language = ref(localStorage.getItem('lang') || 'zh')
 
 const tableData = ref([])
 const slot = ref('')
-const requestData = {  
+const requestData = {
   line: 2002
-};  
+};
 // request.post("/cacheGlass/taskCache/selectEdgTask",{
 //   ...requestData,  
 
@@ -122,17 +121,17 @@
 </script>
 
 <template>
-  <div>
+  <div style="height: 500px;">
     <el-card style="flex: 1;margin-left: 10px;margin-top: 20px;" v-loading="loading">
       <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
-        <el-table height="240" ref="table" 
-        @selection-change="handleSelectionChange"
-        :data="tableData" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
-          <el-table-column prop="glass_id" align="center" :label="$t('workOrder.glassID')" min-width="180" />
-          <el-table-column prop="width" align="center" :label="$t('workOrder.width')" min-width="120" />
-          <el-table-column prop="height" align="center" :label="$t('workOrder.height')" min-width="80" />
-          <el-table-column prop="thickness" align="center" :label="$t('workOrder.thickness')" min-width="120" />
-          <el-table-column prop="glass_type" align="center" :label="$t('workOrder.glasstype')" min-width="120" />
+        <el-table height="240" ref="table"
+                  @selection-change="handleSelectionChange"
+                  :data="tableData" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
+          <el-table-column prop="glass_id" align="center" :label="$t('workOrder.glassID')" min-width="180"/>
+          <el-table-column prop="width" align="center" :label="$t('workOrder.width')" min-width="120"/>
+          <el-table-column prop="height" align="center" :label="$t('workOrder.height')" min-width="80"/>
+          <el-table-column prop="thickness" align="center" :label="$t('workOrder.thickness')" min-width="120"/>
+          <el-table-column prop="glass_type" align="center" :label="$t('workOrder.glasstype')" min-width="120"/>
           <el-table-column fixed="right" :label="$t('workOrder.operate')" align="center" width="200">
             <template #default="scope">
               <el-button size="mini" type="text" plain @click="open(scope.row)">{{ $t('workOrder.breakage') }}</el-button>
diff --git a/UI-Project/src/views/StockBasicData/stockBasicyiwu.vue b/UI-Project/src/views/StockBasicData/stockBasicyiwu.vue
new file mode 100644
index 0000000..e06ef18
--- /dev/null
+++ b/UI-Project/src/views/StockBasicData/stockBasicyiwu.vue
@@ -0,0 +1,252 @@
+<script setup>
+import {onBeforeUnmount, onMounted, onUnmounted, reactive, ref} from "vue";
+import {useRouter} from "vue-router"
+import {host, WebSocketHost} from '@/utils/constants'
+import request from "@/utils/request"
+import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
+// import { ref } from 'vue'
+import {ElMessage, ElMessageBox} from 'element-plus'
+//  import LanguageMixin from './lang/LanguageMixin'
+import {useI18n} from 'vue-i18n'
+
+const router = useRouter()
+const adda = ref(false)
+const {t} = useI18n()
+let language = ref(localStorage.getItem('lang') || 'zh')
+
+const tableData = ref([])
+const slot = ref('')
+const requestData = {
+  line: 2001
+};
+const timeRange = ref([])
+const selectValuesa = reactive([]);
+// request.post("/cacheGlass/taskCache/selectEdgTask",{
+//   ...requestData,  
+
+// }).then((res) => {
+//           if (res.code == 200) {
+
+//           console.log(res.data);
+//           tableData.value = res.data
+//           console.log(res.data[0].slot);
+//           } else {
+//           ElMessage.warning(res.msg)
+
+//           }
+//           });
+
+// 纾ㄨ竟浠诲姟鏌ヨ
+const setEdgGlassInfoRequest = async () => {
+  let celllist = []
+  let stateList = []
+  if (selectValuesa[0] != null && selectValuesa[0] != 'undefined') {
+    if (selectValuesa[0] != "") {
+      celllist = [selectValuesa[0]];
+    }
+  }
+  if (selectValuesa[1] != null && selectValuesa[1] != 'undefined') {
+    if (selectValuesa[1] != "") {
+      stateList = [selectValuesa[1]];
+    }
+  }
+  console.log(timeRange.value[0], timeRange.value[1]);
+  const response = await request.post("/cacheGlass/edgGlassTaskInfo/setEdgGlassInfoRequest", {
+    cellList: celllist,
+    stateList: stateList,
+    beginDate: timeRange.value[0],
+    endDate: timeRange.value[1],
+  })
+  if (response.code === 200) {
+    ElMessage.success(response.message);
+  } else {
+    ElMessage.error(response.message);
+  }
+
+}
+
+// 鐮存崯
+const open = async (row) => {
+  try {
+    const confirmResult = await ElMessageBox.confirm(
+        t('workOrder.messagedamaged'),
+        t('workOrder.prompt'),
+        {
+          confirmButtonText: t('workOrder.yes'),
+          cancelButtonText: t('workOrder.cancel'),
+          type: 'warning',
+        }
+    );
+    if (confirmResult === 'confirm') {
+      // 鐢ㄦ埛鐐瑰嚮浜嗏�滄槸鈥濓紝鐜板湪璋冪敤鍒犻櫎鎺ュ彛  
+      const response = await request.post("/cacheGlass/edgStorageCage/edgReportStatus", {
+        glassId: row.glassId,
+        state: 8,
+        line: row.line,
+        workingProcedure: '纾ㄨ竟',
+      })
+      if (response.code === 200) {
+        ElMessage.success(response.message);
+      } else {
+        // 鍒犻櫎澶辫触锛屾偍鍙互澶勭悊閿欒鎴栨樉绀洪敊璇俊鎭粰鐢ㄦ埛  
+        ElMessage.error(response.msg);
+        // alert('鍒犻櫎澶辫触锛�' + deleteResponse.message); 
+      }
+    }
+  } catch (error) {
+    // 澶勭悊鍙兘鍑虹幇鐨勯敊璇紝姣斿 ElMessageBox 鎶涘嚭鐨勫紓甯哥瓑 
+    console.error('鍙戠敓閿欒:', error);
+  }
+};
+// 鎷胯蛋 
+const opena = async (row) => {
+  try {
+    const confirmResult = await ElMessageBox.confirm(
+        t('workOrder.takemessage'),
+        t('workOrder.prompt'),
+        {
+          confirmButtonText: t('workOrder.yes'),
+          cancelButtonText: t('workOrder.cancel'),
+          type: 'warning',
+        }
+    );
+    if (confirmResult === 'confirm') {
+      // 鐢ㄦ埛鐐瑰嚮浜嗏�滄槸鈥濓紝鐜板湪璋冪敤鍒犻櫎鎺ュ彛  
+      const response = await request.post("/cacheGlass/edgStorageCage/edgReportStatus", {
+        glassId: row.glassId,
+        state: 9,
+        line: row.line,
+        workingProcedure: '纾ㄨ竟',
+      })
+      if (response.code === 200) {
+        ElMessage.success(response.message);
+      } else {
+        // 鍒犻櫎澶辫触锛屾偍鍙互澶勭悊閿欒鎴栨樉绀洪敊璇俊鎭粰鐢ㄦ埛  
+        ElMessage.error(response.msg);
+        // alert('鍒犻櫎澶辫触锛�' + deleteResponse.message); 
+      }
+    }
+  } catch (error) {
+    // 澶勭悊鍙兘鍑虹幇鐨勯敊璇紝姣斿 ElMessageBox 鎶涘嚭鐨勫紓甯哥瓑  
+    console.error('鍙戠敓閿欒:', error);
+  }
+};
+let socket = null;
+const socketUrl = `ws://${WebSocketHost}:${host}/api/cacheGlass/api/talk/edgTasks`;
+// 瀹氫箟娑堟伅澶勭悊鍑芥暟锛屾洿鏂� receivedData 鍙橀噺
+const handleMessage = (data) => {
+  // 鏇存柊 tableData 鐨勬暟鎹�
+  tableData.value = data.edgTasks[0]
+};
+onMounted(() => {
+  socket = initializeWebSocket(socketUrl, handleMessage);
+});
+onUnmounted(() => {
+  if (socket) {
+    closeWebSocket(socket);
+  }
+});
+onBeforeUnmount(() => {
+  console.log("鍏抽棴浜�")
+  closeWebSocket();
+});
+</script>
+<template>
+  <div style="height: 500px;">
+    <div>
+      <el-card style="flex: 1;margin-left: 10px;margin-top: 20px;" v-loading="loading">
+        <el-select v-model="selectValuesa[0]" filterable :placeholder="$t('workOrder.cway')" clearable
+                   style="margin-left: 20px;margin-bottom: 10px;">
+          <el-option :label="$t('workOrder.edgingone')" value="2001"></el-option>
+          <el-option :label="$t('workOrder.edgingtwo')" value="2002"></el-option>
+        </el-select>
+
+        <el-select v-model="selectValuesa[1]" filterable :placeholder="$t('workOrder.cstate')" clearable
+                   style="margin-left: 20px;margin-bottom: 10px;">
+          <el-option :label="$t('workOrder.nedging')" value="0"></el-option>
+          <el-option :label="$t('workOrder.edging')" value="1"></el-option>
+          <el-option :label="$t('workOrder.finedging')" value="2"></el-option>
+        </el-select>
+        <span class="demonstration" style="margin-left: 20px;margin-bottom: 10px;">{{ $t('workOrder.time') }}</span>
+        <el-date-picker v-model="timeRange" type="datetimerange" range-separator="鑷�"
+                        :start-placeholder="$t('reportmanage.starttime')" style="margin-left: 20px;margin-bottom: 10px;"
+                        value-format="YYYY-MM-DD hh:mm:ss"
+
+                        :end-placeholder="$t('reportmanage.endtime')">
+        </el-date-picker>
+        <el-button type="primary" style="margin-left: 10px;margin-bottom: 10px;" @click="setEdgGlassInfoRequest()">{{
+            $t('reportmanage.inquire')
+          }}
+        </el-button>
+
+        <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
+          <el-table height="750" ref="table"
+                    @selection-change="handleSelectionChange"
+                    :data="tableData" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
+            <el-table-column prop="glassId" align="center" :label="$t('workOrder.glassID')" min-width="180"/>
+            <el-table-column prop="width" align="center" :label="$t('workOrder.width')" min-width="120"/>
+            <el-table-column prop="height" align="center" :label="$t('workOrder.height')" min-width="80"/>
+            <el-table-column prop="thickness" align="center" :label="$t('workOrder.thickness')" min-width="120"/>
+            <el-table-column prop="glassType" align="center" :label="$t('workOrder.glasstype')" min-width="120"/>
+            <el-table-column prop="line" align="center" :label="$t('workOrder.line')" min-width="120"/>
+            <el-table-column prop="status" :label="$t('workOrder.status')" align="center" width="200">
+              <template #default="scope">
+                {{ scope.row.status == 0 ? "鏈(杈�" : scope.row.status == 1 ? "纾ㄨ竟涓�" : "宸茬(杈�" }}
+              </template>
+            </el-table-column>
+
+
+            <el-table-column fixed="right" :label="$t('workOrder.operate')" align="center" width="200">
+              <template #default="scope">
+                <el-button size="mini" type="text" plain @click="open(scope.row)">{{
+                    $t('workOrder.breakage')
+                  }}
+                </el-button>
+                <el-button size="mini" type="text" plain @click="opena(scope.row)">{{
+                    $t('workOrder.takeout')
+                  }}
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+      </el-card>
+    </div>
+  </div>
+</template>
+
+<style scoped>
+#dt {
+  display: block;
+  float: left;
+  line-height: 20px;
+  margin-left: 100px;
+}
+
+#dta {
+  display: block;
+  float: left;
+  line-height: 20px;
+  margin-left: 80%;
+}
+
+#dialog-footer {
+  text-align: center;
+  margin-top: -15px;
+}
+
+#message {
+  text-align: center;
+  align-items: center;
+  color: black;
+  width: 200px;
+  height: 100px;
+  background-color: #337ecc;
+  margin-left: 28%;
+}
+
+#awatch {
+  height: 460px;
+  /* margin-top: -60px; */
+}
+</style>
\ No newline at end of file
diff --git a/UI-Project/src/views/UnLoadGlass/loadmachinerack.vue b/UI-Project/src/views/UnLoadGlass/loadmachinerack.vue
index 618e73c..a5b99a4 100644
--- a/UI-Project/src/views/UnLoadGlass/loadmachinerack.vue
+++ b/UI-Project/src/views/UnLoadGlass/loadmachinerack.vue
@@ -1,18 +1,14 @@
 <script setup>
-import { onBeforeUnmount, onMounted, onUnmounted, reactive, ref } from "vue";
-import { useRouter } from "vue-router"
-import { useI18n } from 'vue-i18n'
-import { ElMessage } from 'element-plus'
+import {onBeforeUnmount, onMounted, onUnmounted, reactive, ref} from "vue";
+import {useRouter} from "vue-router"
+import {useI18n} from 'vue-i18n'
+import {ElMessage} from 'element-plus'
 import request from "@/utils/request";
-import { closeWebSocket, initializeWebSocket } from '@/utils/WebSocketService';
-import { host, WebSocketHost } from '@/utils/constants'
-import PrintFlow from "@/views/UnLoadGlass/PrintFlow.vue";
-import Landingindication from "./Landingindication.vue";
-import Landingindicationtwo from "./Landingindicationtwo.vue";
-import PrintLabel from "@/views/UnLoadGlass/PrintCustomLabelSemi1.vue";
- 
+import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
+import {host, WebSocketHost} from '@/utils/constants'
+
 const router = useRouter()
-const { t } = useI18n()
+const {t} = useI18n()
 let language = ref(localStorage.getItem('lang') || 'zh')
 const printLoading = ref(true)
 const fullFlowCard = ref('')
@@ -434,27 +430,26 @@
     body.removeChild(style);
   }, 20);
 }
- 
- 
- 
- 
+
+
 // beforeUnmount(() => {
 //   closeWebSocket();
 // });
 // setInterval(fetchTableData, 2000)
 </script>
 <template>
-  <div>
-    <el-button style="margin-top: 10px;margin-left: 10px;margin-bottom: 10px;" id="searchButton" type="primary"
-      @click="dialogFormVisibleaDownGlass = true">{{ $t('reportWork.details') }}
-    </el-button>
-    <el-button style="margin-top: 10px;margin-left: 10px;margin-bottom: 10px;" id="searchButton" type="primary"
-      @click="dialogFormVisibleaDownGlasss = true">{{ $t('reportWork.filming') }}
-    </el-button>
-    <el-switch style="margin-top: 10px;margin-left: 15px;margin-bottom: 10px;" v-model="autoPrint" class="mb-2"
-      :inactive-text="$t('basicData.printing')" @change="handleChange" />
-    <el-card style="flex: 1;" v-loading="loading">
-      <el-card style="flex: 1;margin-left: 4px;margin-top: 1px;" v-loading="loading">
+  <div style="height: 500px;">
+    <div>
+      <el-button style="margin-top: 10px;margin-left: 10px;margin-bottom: 10px;" id="searchButton" type="primary"
+                 @click="dialogFormVisibleaDownGlass = true">{{ $t('reportWork.details') }}
+      </el-button>
+      <el-button style="margin-top: 10px;margin-left: 10px;margin-bottom: 10px;" id="searchButton" type="primary"
+                 @click="dialogFormVisibleaDownGlasss = true">{{ $t('reportWork.filming') }}
+      </el-button>
+      <el-switch style="margin-top: 10px;margin-left: 15px;margin-bottom: 10px;" v-model="autoPrint" class="mb-2"
+                 :inactive-text="$t('basicData.printing')" @change="handleChange"/>
+      <el-card style="flex: 1;" v-loading="loading">
+        <el-card style="flex: 1;margin-left: 4px;margin-top: 1px;" v-loading="loading">
         <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
           <el-table height="350px" ref="table" @selection-change="handleSelectionChange" :data="tableData"
             :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
@@ -586,7 +581,6 @@
     </el-card>
  
   </div>
- 
   <el-dialog v-model="dialogFormVisiblea" top="21vh" width="40%" :title="$t('reportWork.bindingshelves')">
     <div style="margin-left: 50px;margin-top: 10px;margin-bottom: 10px;">
       <el-form size="mini" label-width="100px">
@@ -623,15 +617,15 @@
       </div>
     </template>
   </el-dialog>
- 
-  <el-dialog id="sizePrintCalrd" v-model="dialogTableVisible" destroy-on-close>
-    <print-flow id="child" :printFlowCardId="printFlowCardId" :printLayer="printLayer"
-      style="width: 100%;height: 100%" />
-  </el-dialog>
-  <el-dialog id="sizePrintCalrd1" v-model="dialogTableVisible1" destroy-on-close>
-    <print-label id="printFlowCard" :printFlowCardId="printFlowCardId" :printLayer="printLayer" :printGlassId="printGlassId"  style="" />
-  </el-dialog>
- 
+    <el-dialog id="sizePrintCalrd" v-model="dialogTableVisible" destroy-on-close>
+      <print-flow id="child" :printFlowCardId="printFlowCardId" :printLayer="printLayer"
+                  style="width: 100%;height: 100%"/>
+    </el-dialog>
+    <el-dialog id="sizePrintCalrd1" v-model="dialogTableVisible1" destroy-on-close>
+      <print-label id="printFlowCard" :printFlowCardId="printFlowCardId" :printLayer="printLayer"
+                   :printGlassId="printGlassId" style=""/>
+    </el-dialog>
+  </div>
 </template>
 <style scoped>
 #dt {
diff --git a/UI-Project/src/views/hollow/hollowequipment.vue b/UI-Project/src/views/hollow/hollowequipment.vue
new file mode 100644
index 0000000..7437db2
--- /dev/null
+++ b/UI-Project/src/views/hollow/hollowequipment.vue
@@ -0,0 +1,270 @@
+<template>
+  <div style="height: 600px;">
+    <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;" v-loading="loading">
+      <div style="display: flex; flex-direction: row; align-items: center; margin-bottom: 10px;">
+        <el-button id="searchButton" type="success" @click="dialogFormVisiblea = true">
+          {{ $t('hellow.createtask') }}
+        </el-button>
+        <el-button style="margin-left: 20px;" id="searchButton" type="success" @click="handleBinda">
+          {{ $t('hellow.starttask') }}
+        </el-button>
+        <el-button style="margin-left: 20px;" id="searchButton" type="success" @click="handleBindb">{{
+            $t('hellow.stoptask')
+          }}
+        </el-button>
+      </div>
+      <div style="margin-bottom: -5px;margin-left: 5px;">
+        <el-form>
+          <el-row>
+            <el-col :span="4">
+              <div id="dt" style="font-size: 15px;">
+                <el-form-item :label="$t('hellow.currenttask')" style="width: 14vw">
+                  {{ temperingtotal }}
+                </el-form-item>
+              </div>
+            </el-col>
+            <el-col :span="5">
+              <div id="dta" style="font-size: 15px;">
+                <el-form-item :label="$t('hellow.claimednumber')" style="width: 14vw">
+                  {{ glasstotal }}
+                </el-form-item>
+              </div>
+            </el-col>
+            <el-col :span="4">
+              <div id="dt" style="font-size: 15px;">
+                <el-form-item :label="$t('hellow.linenumber')" style="width: 14vw">
+                  {{ fulltotals }}
+                </el-form-item>
+              </div>
+            </el-col>
+          </el-row>
+        </el-form>
+      </div>
+      <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
+        <el-table height="480" ref="table" :data="tableDataa"
+                  :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
+          <el-table-column prop="layoutSequence" :label="$t('hellow.order')" align="center"/>
+          <el-table-column prop="layoutSequence" :label="$t('hellow.thickness')" align="center"/>
+          <el-table-column prop="layoutSequence" :label="$t('hellow.coatingtypes')" align="center"/>
+          <el-table-column prop="layoutSequence" :label="$t('hellow.height')" align="center"/>
+          <el-table-column prop="layoutSequence" :label="$t('hellow.width')" align="center"/>
+          <el-table-column prop="layoutSequence" :label="$t('hellow.state')" align="center"/>
+        </el-table>
+        <div style="float: right;">
+          <el-pagination layout="prev, pager, next" :total="50"/>
+        </div>
+      </div>
+    </el-card>
+  </div>
+  <el-dialog v-model="dialogFormVisiblea" top="5vh" width="85%">
+    <el-table ref="table" style="margin-top: 20px;height: 500px;"
+              :data="tableDatab" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
+      <el-table-column prop="deviceId" fixed align="center" :label="$t('hellow.cardnumber')" min-width="80"/>
+      <el-table-column prop="slot" fixed align="center" :label="$t('hellow.layernumber')" min-width="80"/>
+      <el-table-column prop="patternWidth" align="center" :label="$t('hellow.thickness')" min-width="80"/>
+      <el-table-column prop="patternHeight" align="center" :label="$t('hellow.coatingtypes')" min-width="80"/>
+      <el-table-column prop="patternHeight" align="center" :label="$t('hellow.totalnumber')" min-width="80"/>
+      <el-table-column prop="patternHeight" align="center" :label="$t('hellow.pairsnumber')" min-width="80"/>
+      <el-table-column prop="patternHeight" align="center" :label="$t('hellow.missingnumber')" min-width="80"/>
+      <el-table-column fixed="right" :label="$t('hellow.operate')" align="center" width="270">
+        <template #default="scope">
+          <el-button size="mini" type="text" plain @click="finisha(scope.row)">{{ $t('hellow.claimquest') }}</el-button>
+          <el-button size="mini" type="text" plain @click="dialogFormVisibleb = true">{{
+              $t('hellow.missingfilms')
+            }}
+          </el-button>
+          <el-button size="mini" type="text" plain @click="finishb(scope.row)">{{
+              $t('hellow.forcedfilming')
+            }}
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+  </el-dialog>
+  <el-dialog v-model="dialogFormVisibleb" top="7vh" width="70%" height="500">
+    <div style="margin-top: -20px;text-align: center;margin-left: 400px;">
+      <el-form-item :label="$t('hellow.cardnumbera')" style="width: 14vw">
+        {{ temperingtotal }}
+      </el-form-item>
+    </div>
+    <el-table ref="table" style="margin-top: 20px;height: 400px;"
+              :data="tableDatac" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
+      <el-table-column prop="patternWidth" align="center" :label="$t('hellow.thickness')" min-width="80"/>
+      <el-table-column prop="patternHeight" align="center" :label="$t('hellow.coatingtypes')" min-width="80"/>
+      <el-table-column prop="patternHeight" align="center" :label="$t('hellow.height')" min-width="80"/>
+      <el-table-column prop="patternHeight" align="center" :label="$t('hellow.width')" min-width="80"/>
+      <el-table-column prop="patternHeight" align="center" :label="$t('hellow.totalnumber')" min-width="80"/>
+      <el-table-column prop="patternHeight" align="center" :label="$t('hellow.missingnumber')" min-width="80"/>
+      <el-table-column prop="patternHeight" align="center" :label="$t('hellow.brokenpieces')" min-width="80"/>
+      <div style="float: right;margin-bottom: 5px;">
+        <el-pagination layout="prev, pager, next" :total="50"/>
+      </div>
+    </el-table>
+  </el-dialog>
+  <el-dialog v-model="blinda" top="30vh" width="25%" :title="$t('hellow.pstarttask')">
+    <template #footer>
+      <div id="dialog-footer">
+        <el-button type="primary" @click="handlea">
+          {{ $t('basicData.confirm') }}
+        </el-button>
+        <el-button @click="blinda = false">{{ $t('basicData.cancel') }}</el-button>
+      </div>
+    </template>
+  </el-dialog>
+  <el-dialog v-model="blindb" top="30vh" width="25%" :title="$t('hellow.pstoptask')">
+    <template #footer>
+      <div id="dialog-footer">
+        <el-button type="primary" @click="handlea">
+          {{ $t('basicData.confirm') }}
+        </el-button>
+        <el-button @click="blindb = false">{{ $t('basicData.cancel') }}</el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+<script setup>
+import {ElMessage, ElMessageBox} from 'element-plus'
+import {onBeforeUnmount, onMounted, onUnmounted, ref} from "vue";
+import request from "@/utils/request"
+import {closeWebSocket} from '@/utils/WebSocketService';
+import {useI18n} from 'vue-i18n'
+
+const {t} = useI18n()
+const blinda = ref(false)
+const blindb = ref(false)
+const tableDataa = ref([])
+const tableDatac = ref([])
+const dialogFormVisiblea = ref(false)
+const dialogFormVisibleb = ref(false)
+
+const tableDatab = [
+  {
+    layoutSequence: 'Tom',
+  },
+  {
+    layoutSequence: '2016-05-02',
+    name: 'Tom',
+    address: 'No. 189, Grove St, Los Angeles',
+  },
+]
+let socket = null;
+// const socketUrl = `ws://${WebSocketHost}:${host}/api/temperingGlass/api/talk/screen`;
+// const handleMessage = (data) => {
+// adjustedRects.value = data.device[0].map(rect => ({
+//       ...rect,
+//       completed: rect.completedQuantity,
+//       breakage: rect.breakageQuantity,
+//       thisProcess: rect.thisProcess,
+//     }));
+// };
+// let socket;
+onMounted(() => {
+  // socket = new WebSocket(socketUrl);
+  // socket.onmessage = (event) => {
+  //   const data = JSON.parse(event.data);
+
+  //   // updateCharts();
+  // };
+  // };  
+});
+// 寮�濮嬩换鍔� 
+const handleBinda = (row) => {
+  blinda.value = true;
+};
+// 鍋滄浠诲姟 
+const handleBindb = (row) => {
+  blindb.value = true;
+};
+// 寮�濮嬩换鍔�
+const handlea = async () => {
+  try {
+    let engineeringId = window.localStorage.getItem('engineeringId')
+    console.log(engineeringId);
+    if (engineeringId !== '') {
+      const response = await request.post('/loadGlass/engineering/engineering/pauseTask', {
+        engineeringId: engineeringId,
+        state: 0,
+      })
+      if (response.code == 200) {
+        ElMessage.success(response.message);
+        blinda.value = false;
+      } else {
+        ElMessage.error(response.message);
+      }
+    } else {
+      ElMessage({
+        type: 'info',
+        message: t('basicData.infonull'),
+      })
+    }
+  } catch (error) {
+    console.error(error);
+  }
+}
+// 棰嗗彇浠诲姟
+const finisha = async (row) => {
+  try {
+    const confirmResult = await ElMessageBox.confirm(
+        t('hellow.pclaimquest'),
+        t('searchOrder.prompt'),
+        {
+          confirmButtonText: t('searchOrder.yes'),
+          cancelButtonText: t('searchOrder.cancel'),
+          type: 'warning',
+        }
+    );
+    if (confirmResult === 'confirm') {
+      const response = await request.post("/cacheVerticalGlass/bigStorageCageDetails/finishBigStorageCageDetails", row)
+      if (response.code === 200) {
+        ElMessage.success(response.message);
+      } else {
+        ElMessage.error(response.message);
+      }
+    }
+  } catch (error) {
+    console.error('鍙戠敓閿欒:', error);
+  }
+};
+// 寮哄埗鍑虹墖
+const finishb = async (row) => {
+  try {
+    const confirmResult = await ElMessageBox.confirm(
+        t('hellow.pforcedfilming'),
+        t('searchOrder.prompt'),
+        {
+          confirmButtonText: t('searchOrder.yes'),
+          cancelButtonText: t('searchOrder.cancel'),
+          type: 'warning',
+        }
+    );
+    if (confirmResult === 'confirm') {
+      const response = await request.post("/cacheVerticalGlass/bigStorageCageDetails/finishBigStorageCageDetails", row)
+      if (response.code === 200) {
+        ElMessage.success(response.message);
+      } else {
+        ElMessage.error(response.message);
+      }
+    }
+  } catch (error) {
+    console.error('鍙戠敓閿欒:', error);
+  }
+};
+onUnmounted(() => {
+  socket.close();
+});
+onMounted(() => {
+  // fetchTableData();
+  // socket = initializeWebSocket(socketUrl, handleMessage);
+});
+onUnmounted(() => {
+  if (socket) {
+    closeWebSocket(socket);
+  }
+});
+onBeforeUnmount(() => {
+  console.log("鍏抽棴浜�")
+  closeWebSocket();
+});
+</script>
+
+<style scoped></style>
\ No newline at end of file
diff --git a/UI-Project/src/views/largescreen/largescreen.vue b/UI-Project/src/views/largescreen/largescreen.vue
index 024ff7a..3f105fa 100644
--- a/UI-Project/src/views/largescreen/largescreen.vue
+++ b/UI-Project/src/views/largescreen/largescreen.vue
@@ -1,15 +1,16 @@
-<template>  
-  <el-card style="flex: 1;margin-left: 1px;margin-top: 10px;margin-right: 1px;" v-loading="loading">
-    <el-scrollbar height="800px">
-  <div style="font-size: 20px;font-weight: bold;">{{ $t('large.loading') }}{{ temperingtotal }} </div>
-  <div id="top" style="height: 150px;display: flex; justify-content: center; align-items: center;">  
-  <div class="echarts-container">
-  <div v-for="(processData, index) in processesData" :key="index" class="echarts-item" @click="showDialog">
-    <div :id="'pieChart_' + index" class="pie-chart"></div>
-  </div>
-</div>
-</div> 
-<div style="display: flex;">
+<template>
+  <div style="height: 500px;">
+    <el-card style="flex: 1;margin-left: 1px;margin-top: 10px;margin-right: 1px;" v-loading="loading">
+      <el-scrollbar height="800px">
+        <div style="font-size: 20px;font-weight: bold;">{{ $t('large.loading') }}{{ temperingtotal }}</div>
+        <div id="top" style="height: 150px;display: flex; justify-content: center; align-items: center;">
+          <div class="echarts-container">
+            <div v-for="(processData, index) in processesData" :key="index" class="echarts-item" @click="showDialog">
+              <div :id="'pieChart_' + index" class="pie-chart"></div>
+            </div>
+          </div>
+        </div>
+        <div style="display: flex;">
 <div class="parter" style="margin-top: 10px;margin-left: 150px; height: 240px;width: 1000px;">
     <img src="../../assets/dpxsa.png" style="margin-left: -10px; width: 100%;height: 100%;" alt="Your Image">
   <div  class="moving-rect lipiana" v-show="woshia"></div>
@@ -104,33 +105,37 @@
   </template>
 </el-dialog>
 <el-dialog v-model="blind" top="10vh" width="70%" >
-  <el-date-picker style="margin-left: 1px;"  v-model="timeRange" type="daterange" format="YYYY/MM/DD" value-format="YYYY-MM-DD"
-  :start-placeholder="$t('large.starttime')" :end-placeholder="$t('large.endtime')" :default-time="defaultTime" />
-    <el-button type="primary" style="margin-left: 10px;margin-top: -6px;" @click="selectReportData()">{{ $t('large.inquire') }}</el-button>
-    <div style="height: 550px;display: flex;margin-top: 10px;justify-content: center; align-items: center;">  
-  <div class="echarts-container">
-  <div v-for="(processData, index) in dialogprocesses" :key="index" class="echarts-item">
-    <div :id="'dialogPieChart_' + index" class="pie-chart"></div>
+  <el-date-picker style="margin-left: 1px;" v-model="timeRange" type="daterange" format="YYYY/MM/DD" value-format="YYYY-MM-DD"
+                  :start-placeholder="$t('large.starttime')" :end-placeholder="$t('large.endtime')"
+                  :default-time="defaultTime"/>
+  <el-button type="primary" style="margin-left: 10px;margin-top: -6px;" @click="selectReportData()">
+    {{ $t('large.inquire') }}
+  </el-button>
+  <div style="height: 550px;display: flex;margin-top: 10px;justify-content: center; align-items: center;">
+    <div class="echarts-container">
+      <div v-for="(processData, index) in dialogprocesses" :key="index" class="echarts-item">
+        <div :id="'dialogPieChart_' + index" class="pie-chart"></div>
+      </div>
+    </div>
   </div>
+</el-dialog>
   </div>
-  </div>
-  </el-dialog> 
-</template>  
-<script setup>  
-import { Delete, Upload } from '@element-plus/icons-vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { ref, onMounted , onBeforeUnmount, reactive, computed, shallowRef, onUnmounted, watchEffect,nextTick  } from "vue";
+</template>
+<script setup>
+import {ElMessage} from 'element-plus'
+import {nextTick, onBeforeUnmount, onMounted, onUnmounted, ref} from "vue";
 import request from "@/utils/request"
-import { WebSocketHost ,host} from '@/utils/constants'
-import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService';
-import { useI18n } from 'vue-i18n'
-const { t } = useI18n()
+import {host, WebSocketHost} from '@/utils/constants'
+import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
+import {useI18n} from 'vue-i18n'
 import * as echarts from 'echarts';
+
+const {t} = useI18n()
 const tableData = ref([])
 const tableDatab = ref([])
 const tableDatac = ref([])
-const adjustedRects = ref([]);  
-const chartRefs = ref([]);  
+const adjustedRects = ref([]);
+const chartRefs = ref([]);
 const timeRange = ref([])
 const flake = ref(false)
 const flakeb = ref(false)
diff --git a/UI-Project/vue.config.js b/UI-Project/vue.config.js
index 1b2c99f..3881acf 100644
--- a/UI-Project/vue.config.js
+++ b/UI-Project/vue.config.js
@@ -2,4 +2,16 @@
     assetsDir: 'static',
     parallel: false,
     publicPath: './',
+    presets: [
+        // '@vue/cli-plugin-babel/preset', 
+        '@vue/app',
+        [
+            '@babel/preset-env',
+            {
+                useBuiltIns: 'entry'
+            }
+        ]
+    ],
+    sourceType: 'unambiguous',
+
 };
\ No newline at end of file
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/Const.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/Const.java
index 29c8e17..a05dfe6 100644
--- a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/Const.java
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/Const.java
@@ -30,8 +30,18 @@
      * A09鍑虹墖鐩爣浣嶇疆  d02鍗ц浆绔� 閽㈠寲鍑虹墖    3001
      * A10鍑虹墖鐩爣浣嶇疆  d05鍗ц浆绔� 浜哄伐鍑虹墖    3002
      */
-    public static final Integer TEMPERING_OUT_TARGET_POSITION = 3001;
-    public static final Integer ARTIFICIAL_OUT_TARGET_POSITION = 3002;
+//    public static final Integer TEMPERING_OUT_TARGET_POSITION = 3001;
+//    public static final Integer ARTIFICIAL_OUT_TARGET_POSITION = 3002;
+//    public static final List<Integer> OUT_TARGET_POSITION_ALL = Arrays.asList(3001, 3002);
+
+    /**
+     * 涔変箤纾ㄨ竟绾�
+     * A09鍑虹墖鐩爣浣嶇疆  d02鍗ц浆绔� 閽㈠寲鍑虹墖    930
+     * A10鍑虹墖鐩爣浣嶇疆  d05鍗ц浆绔� 浜哄伐鍑虹墖    931
+     */
+    public static final Integer TEMPERING_OUT_TARGET_POSITION = 930;
+    public static final Integer ARTIFICIAL_OUT_TARGET_POSITION = 931;
+    public static final List<Integer> OUT_TARGET_POSITION_ALL = Arrays.asList(930, 931);
 
     /**
      * 鍗у紡鐞嗙墖绗艰鎯呰〃鐜荤拑鐘舵��
@@ -85,7 +95,7 @@
     public static final Integer EDG_GLASS_SUCCESS = 2;
 
     /**
-     * 纾ㄨ竟浠诲姟鐜荤拑鐘舵��
+     * 澶х悊鐗囩鐘舵��
      * 1鍗曟満鑷姩鐘舵��
      * 2鑱旀満鑷姩鐘舵��
      * 3鎵嬪姩鐘舵��
@@ -93,6 +103,20 @@
     public static final Integer BIG_STORAGE_STAND_ALONE = 1;
     public static final Integer BIG_STORAGE_ONLINE = 2;
     public static final Integer BIG_STORAGE_MT = 3;
+
+    /**
+     * 澶х悊鐗囩浠诲姟绫诲瀷
+     * 1銆侀挗鍖栧墠杩涚墖
+     * 2銆侀挗鍖栧墠鍑虹墖
+     * 3銆侀挗鍖栧悗杩涚墖
+     * 4銆侀挗鍖栧悗鍑虹墖
+     */
+    public static final Integer BIG_STORAGE_BEFORE_IN = 1;
+    public static final Integer BIG_STORAGE_BEFORE_OUT = 2;
+    public static final Integer BIG_STORAGE_BEFORE_DISPATCH = 3;
+    public static final Integer BIG_STORAGE_AFTER_IN = 4;
+    public static final Integer BIG_STORAGE_AFTER_OUT = 5;
+    public static final Integer BIG_STORAGE_AFTER_DISPATCH = 6;
 
     /**
      * 澶х悊鐗囩璇锋眰
@@ -244,5 +268,12 @@
     public static final Integer LOAD_RAW_GLASS_NEW = 0;
     public static final Integer LOAD_RAW_GLASS_SUCCESS = 100;
 
+    /**
+     * 澶х悊鐗囩浠诲姟鍚姩淇″彿
+     * 0 绌轰换鍔�
+     * 1 鍚姩
+     */
+    public static final Integer BIG_STORAGE_TASK_EMPTY = 0;
+    public static final Integer BIG_STORAGE_TASK_RUNNING = 1;
 
 }
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/engineering/entity/Engineering.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/engineering/entity/Engineering.java
index ecc9fe8..207e536 100644
--- a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/engineering/entity/Engineering.java
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/engineering/entity/Engineering.java
@@ -96,10 +96,14 @@
      * 澶囨敞
      */
     private String notes;
+
     /**
      * 涓婄墖鏈虹嚎璺�
      */
-    private int stationCell;
+    private Integer stationCell;
 
-
+    /**
+     * 闄よ啘鏂瑰紡
+     */
+    private Integer filmRemove;
 }
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/entity/LoadGlassDeviceTask.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/entity/LoadGlassDeviceTask.java
similarity index 89%
rename from hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/entity/LoadGlassDeviceTask.java
rename to hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/entity/LoadGlassDeviceTask.java
index c4bef17..70d14bf 100644
--- a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/entity/LoadGlassDeviceTask.java
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/entity/LoadGlassDeviceTask.java
@@ -31,6 +31,10 @@
     /**
      * 浠诲姟鐘舵�� 0榛樿绌轰换鍔� 1鎵ц涓� 2缁撴潫浠诲姟
      */
+    private Integer inkageState;
+    /**
+     * 浠诲姟鐘舵�� 0榛樿绌轰换鍔� 1鎵ц涓� 2缁撴潫浠诲姟
+     */
     private Integer taskState;
     /**
      * 鍒涘缓鏃堕棿
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/entity/LoadGlassDeviceTaskHistory.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/entity/LoadGlassDeviceTaskHistory.java
similarity index 100%
rename from hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/entity/LoadGlassDeviceTaskHistory.java
rename to hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/entity/LoadGlassDeviceTaskHistory.java
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/mapper/LoadGlassDeviceTaskHistoryDao.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/mapper/LoadGlassDeviceTaskHistoryDao.java
similarity index 100%
rename from hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/mapper/LoadGlassDeviceTaskHistoryDao.java
rename to hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/mapper/LoadGlassDeviceTaskHistoryDao.java
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/mapper/LoadGlassDeviceTaskMapper.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/mapper/LoadGlassDeviceTaskMapper.java
similarity index 100%
rename from hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/mapper/LoadGlassDeviceTaskMapper.java
rename to hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/mapper/LoadGlassDeviceTaskMapper.java
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/service/LoadGlassDeviceTaskHistoryService.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/LoadGlassDeviceTaskHistoryService.java
similarity index 100%
rename from hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/service/LoadGlassDeviceTaskHistoryService.java
rename to hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/LoadGlassDeviceTaskHistoryService.java
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/service/LoadGlassDeviceTaskService.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/LoadGlassDeviceTaskService.java
similarity index 100%
rename from hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/service/LoadGlassDeviceTaskService.java
rename to hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/LoadGlassDeviceTaskService.java
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/service/impl/LoadGlassDeviceOneTaskServiceImpl.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/impl/LoadGlassDeviceOneTaskServiceImpl.java
similarity index 100%
rename from hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/service/impl/LoadGlassDeviceOneTaskServiceImpl.java
rename to hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/impl/LoadGlassDeviceOneTaskServiceImpl.java
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/service/impl/LoadGlassDeviceTaskHistoryServiceImpl.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/impl/LoadGlassDeviceTaskHistoryServiceImpl.java
similarity index 100%
rename from hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/opctask/service/impl/LoadGlassDeviceTaskHistoryServiceImpl.java
rename to hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/impl/LoadGlassDeviceTaskHistoryServiceImpl.java
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeHeatDetail.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeHeatDetail.java
index 8678d22..ad1c1b4 100644
--- a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeHeatDetail.java
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeHeatDetail.java
@@ -113,4 +113,13 @@
     @TableField("strRemark")
     private String strRemark;
 
+    public double getWidth()
+    {
+        return width;
+    }
+
+    public double getHeigth()
+    {
+        return height;
+    }
 }
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeProject.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeProject.java
index ddc80fe..e23597e 100644
--- a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeProject.java
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeProject.java
@@ -189,6 +189,15 @@
      */
     private Date updateTime;
 
+//    /**
+//     * 闄よ啘鏂瑰紡
+//     */
+//    private Integer filmRemove;
+//
+//    /**
+//     * 璁惧
+//     */
+//    private Integer stationCell;
     /**
      * 棰勭暀锛屼娇鐢ㄩ渶娉ㄦ槑
      */
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeHeatDetailService.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeHeatDetailService.java
index 838f47b..882f479 100644
--- a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeHeatDetailService.java
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeHeatDetailService.java
@@ -3,6 +3,9 @@
 import com.github.yulichang.base.MPJBaseService;
 import com.mes.pp.entity.OptimizeDetail;
 import com.mes.pp.entity.OptimizeHeatDetail;
+import com.mes.pp.entity.OptimizeHeatLayout;
+
+import java.util.List;
 
 /**
  * <p>
@@ -14,4 +17,9 @@
  */
 public interface OptimizeHeatDetailService extends MPJBaseService<OptimizeHeatDetail> {
 
+    /**
+     * 杩斿洖鎸囧畾宸ョ▼ 鎸囧畾鐗堝浘鍙风殑灏忕墖鐜荤拑淇℃伅
+     * @return
+     */
+    List<OptimizeHeatDetail> selectHeatDetailGlassInfo(String engineerId, Integer temperingid);
 }
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeHeatLayoutService.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeHeatLayoutService.java
index c28833e..ba1f5ac 100644
--- a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeHeatLayoutService.java
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeHeatLayoutService.java
@@ -3,6 +3,9 @@
 import com.github.yulichang.base.MPJBaseService;
 import com.mes.pp.entity.OptimizeDetail;
 import com.mes.pp.entity.OptimizeHeatLayout;
+import com.mes.temperingglass.entity.TemperingGlassInfo;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,5 +16,9 @@
  * @since 2024-04-16
  */
 public interface OptimizeHeatLayoutService extends MPJBaseService<OptimizeHeatLayout> {
-
+    /**
+     * 杩斿洖鎸囧畾宸ョ▼ 鎸囧畾鐗堝浘鍙风殑鐗堝浘淇℃伅
+     * @return
+     */
+    OptimizeHeatLayout selectHeatLayoutInfo(String engineerId,Integer temperingid);
 }
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeHeatDetailServiceImpl.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeHeatDetailServiceImpl.java
index d25905b..21c578e 100644
--- a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeHeatDetailServiceImpl.java
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeHeatDetailServiceImpl.java
@@ -1,14 +1,18 @@
 package com.mes.pp.service.impl;
 
 import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.mes.pp.entity.OptimizeDetail;
 import com.mes.pp.entity.OptimizeHeatDetail;
+import com.mes.pp.entity.OptimizeHeatLayout;
 import com.mes.pp.mapper.OptimizeDetailMapper;
 import com.mes.pp.mapper.OptimizeHeatDetailMapper;
 import com.mes.pp.service.OptimizeDetailService;
 import com.mes.pp.service.OptimizeHeatDetailService;
 import org.springframework.stereotype.Service;
+
+import java.util.List;
 
 /**
  * <p>
@@ -22,4 +26,12 @@
 @DS("pp")
 public class OptimizeHeatDetailServiceImpl extends MPJBaseServiceImpl<OptimizeHeatDetailMapper, OptimizeHeatDetail> implements OptimizeHeatDetailService {
 
+    @Override
+    public List<OptimizeHeatDetail> selectHeatDetailGlassInfo(String engineerId, Integer temperingid) {
+        QueryWrapper<OptimizeHeatDetail> wrapper = new QueryWrapper<>();
+        wrapper.eq("project_no", engineerId)
+                .eq("layout_id", temperingid)
+        .orderByAsc("sort");
+        return baseMapper.selectList(wrapper);
+    }
 }
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeHeatLayoutServiceImpl.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeHeatLayoutServiceImpl.java
index 6764eae..8d4c429 100644
--- a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeHeatLayoutServiceImpl.java
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeHeatLayoutServiceImpl.java
@@ -1,6 +1,7 @@
 package com.mes.pp.service.impl;
 
 import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.mes.pp.entity.OptimizeDetail;
 import com.mes.pp.entity.OptimizeHeatLayout;
@@ -8,6 +9,9 @@
 import com.mes.pp.mapper.OptimizeHeatLayoutMapper;
 import com.mes.pp.service.OptimizeDetailService;
 import com.mes.pp.service.OptimizeHeatLayoutService;
+import com.mes.temperingglass.entity.TemperingGlassInfo;
+import com.mes.temperingglass.mapper.TemperingGlassInfoMapper;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 /**
@@ -22,4 +26,14 @@
 @DS("pp")
 public class OptimizeHeatLayoutServiceImpl extends MPJBaseServiceImpl<OptimizeHeatLayoutMapper, OptimizeHeatLayout> implements OptimizeHeatLayoutService {
 
+
+
+    @Override
+    public OptimizeHeatLayout selectHeatLayoutInfo(String engineerId, Integer temperingid) {
+
+        QueryWrapper<OptimizeHeatLayout> wrapper = new QueryWrapper<>();
+        wrapper.select("Top 1 *").eq("project_no", engineerId)
+                .eq("layout_id", temperingid);
+        return baseMapper.selectOne(wrapper);
+    }
 }
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/mapper/RawGlassStorageDetailsMapper.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/mapper/RawGlassStorageDetailsMapper.java
index f61e2c5..a646ab1 100644
--- a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/mapper/RawGlassStorageDetailsMapper.java
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/mapper/RawGlassStorageDetailsMapper.java
@@ -23,5 +23,5 @@
      * @param state
      * @return
      */
-    List<Integer> listBySlotState(@Param("leftingStation") List<Integer> liftingStation, @Param("state") List<Integer> state);
+    List<RawGlassStorageDetails> listBySlotState(@Param("leftingStation") List<Integer> liftingStation, @Param("state") List<Integer> state);
 }
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/service/RawGlassStorageDetailsService.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/service/RawGlassStorageDetailsService.java
index e5955cf..c5fc68a 100644
--- a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/service/RawGlassStorageDetailsService.java
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/service/RawGlassStorageDetailsService.java
@@ -35,7 +35,7 @@
 
     String outWarehousing(Long slotId);
 
-    List<Integer> listBySlotState(List<Integer> liftingStation, List<Integer> state);
+    List<RawGlassStorageDetails> listBySlotState(List<Integer> liftingStation, List<Integer> state);
 
     String warehousingRequest(int leftingStation);
 
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/service/impl/RawGlassStorageDetailsServiceImpl.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/service/impl/RawGlassStorageDetailsServiceImpl.java
index 746269b..d370c64 100644
--- a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/service/impl/RawGlassStorageDetailsServiceImpl.java
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/service/impl/RawGlassStorageDetailsServiceImpl.java
@@ -57,17 +57,19 @@
     @Override
     public String warehousingRequest(int leftingStation) {
         RawGlassStorageDetails storageDetails = getOne(new LambdaQueryWrapper<RawGlassStorageDetails>()
-                .in(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN_ALL));
+                .in(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN_ALL)
+                .eq(RawGlassStorageDetails::getSlot, leftingStation));
         if (null != storageDetails) {
             log.info("褰撳墠鍚婅浣嶆湁鏋跺瓙锛岀粨鏉熸湰鍦板叆搴撹姹�");
             return "fail";
         }
-        List<Integer> shelfList = listBySlotState(Const.RAW_GLASS_DEVICE, Const.RAW_GLASS_STATE_IN_ALL);
+        List<RawGlassStorageDetails> shelfList = listBySlotState(Const.RAW_GLASS_DEVICE, Const.RAW_GLASS_STATE_IN_ALL);
         if (CollectionUtils.isEmpty(shelfList)) {
             log.info("褰撳墠宸ヤ綅涓嶅瓨鍦ㄥ彲鐢ㄧ殑绌烘灦瀛�");
             return "fail";
         }
-        Integer shelf = shelfList.get(0);
+        Integer shelf = shelfList.get(0).getSlot();
+        Integer deviceId = shelfList.get(0).getDeviceId();
         log.info("鐢熸垚浠诲姟");
         try {
             generateTask(shelf, leftingStation, shelf, 0, Const.RAW_GLASS_TASK_TYPE_IN_REQUEST);
@@ -78,6 +80,7 @@
         RawGlassStorageDetails details = new RawGlassStorageDetails();
         details.setSlot(shelf);
         details.setShelf(shelf);
+        details.setDeviceId(deviceId);
         details.setState(Const.RAW_GLASS_STATE_RUNNING);
         save(details);
         return "success";
@@ -126,7 +129,7 @@
     }
 
     @Override
-    public List<Integer> listBySlotState(List<Integer> liftingStation, List<Integer> state) {
+    public List<RawGlassStorageDetails> listBySlotState(List<Integer> liftingStation, List<Integer> state) {
         return baseMapper.listBySlotState(liftingStation, state);
     }
 
@@ -173,13 +176,10 @@
                 .shelf(shelf)
                 .createTime(new Date()).build();
         rawGlassStorageTaskService.save(task);
-
-
         List<ReadWriteEntity> list = new ArrayList<>();
-        list.add(generateReadWriteEntity("A01-CC.dev.taskWord", 1));
-//        list.add(generateReadWriteEntity("A01-CC.dev.taskSending", 1));
-        list.add(generateReadWriteEntity("A01-CC.dev.startSlot", startSlot));
-        list.add(generateReadWriteEntity("A01-CC.dev.endSlot", endSlot));
+        list.add(generateReadWriteEntity("PLC.CC.taskWord", 1));
+        list.add(generateReadWriteEntity("PLC.CC.startSlot", startSlot));
+        list.add(generateReadWriteEntity("PLC.CC.endSlot", endSlot));
         miloService.writeToOpcWord(list);
         return Boolean.TRUE;
     }
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/entity/TemperingGlass.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/entity/TemperingGlass.java
new file mode 100644
index 0000000..f5f52fa
--- /dev/null
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/entity/TemperingGlass.java
@@ -0,0 +1,82 @@
+package com.mes.temperingglass.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.mes.base.entity.BigStorageCageBaseInfo;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * (TemperingGlassInfo)琛ㄥ疄浣撶被
+ *
+ * @author makejava
+ * @since 2024-11-18 08:36:18
+ */
+@Data
+@TableName("tempering_glass_info")
+public class TemperingGlass extends BigStorageCageBaseInfo implements Serializable {
+    /**
+     * 閽㈠寲灏忕墖淇℃伅琛╥d
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+    /**
+     * 娴佺▼鍗�
+     */
+    private String flowCardId;
+    /**
+     * 娴佺▼鍗$幓鐠冪被鍨�
+     */
+    private Integer glassType;
+    /**
+     * 鍘氬害
+     */
+    private Double thickness;
+    /**
+     * 鑶滅郴
+     */
+    private String filmsid;
+    /**
+     * 鎬诲眰鏁�
+     */
+    private Integer totalLayer;
+    /**
+     * 灞傛暟
+     */
+    private Integer layer;
+    /**
+     * 閽㈠寲鏄惁鎺ュ彈妯斁
+     */
+    private Integer ishorizontal;
+    /**
+     * 閽㈠寲鐗堝浘id
+     */
+    private Integer temperingLayoutId;
+    /**
+     * 閽㈠寲鐗堝浘鐗囧簭
+     */
+    private Integer temperingFeedSequence;
+    /**
+     * 鏃嬭浆瑙掑害锛堥�嗘椂閽堬級
+     */
+    private Integer angle;
+    /**
+     * 宸ョ▼鍙�
+     */
+    private String engineerId;
+    /**
+     * 鐘舵��
+     */
+    private Integer state;
+    /**
+     * 閽㈠寲绫诲瀷
+     */
+    private Integer temperingType;
+
+    private String deleted;
+
+
+}
+
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/mapper/TemperingGlassMapper.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/mapper/TemperingGlassMapper.java
new file mode 100644
index 0000000..45d4f01
--- /dev/null
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/mapper/TemperingGlassMapper.java
@@ -0,0 +1,15 @@
+package com.mes.temperingglass.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.mes.temperingglass.entity.TemperingGlass;
+
+/**
+ * (TemperingGlassInfo)琛ㄦ暟鎹簱璁块棶灞�
+ *
+ * @author makejava
+ * @since 2024-11-18 08:36:17
+ */
+public interface TemperingGlassMapper extends MPJBaseMapper<TemperingGlass> {
+
+}
+
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/TemperingGlassInfoService.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/TemperingGlassInfoService.java
index 3ebeae3..b62a160 100644
--- a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/TemperingGlassInfoService.java
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/TemperingGlassInfoService.java
@@ -47,5 +47,10 @@
      * @return
      */
     Integer updateTemperingState(TemperingGlassInfo temperingGlassInfo);
+    /**
+     * 鏍规嵁鐐夊彿鏌ラ挗鍖栫増鍥剧幓鐠冧俊鎭�
+     * @return
+     */
+    List<TemperingGlassInfo> selectGlassInfoById(Integer id);
 
 }
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/TemperingGlassService.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/TemperingGlassService.java
new file mode 100644
index 0000000..c66138b
--- /dev/null
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/TemperingGlassService.java
@@ -0,0 +1,15 @@
+package com.mes.temperingglass.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.mes.temperingglass.entity.TemperingGlass;
+
+/**
+ * (TemperingGlassInfo)琛ㄦ湇鍔℃帴鍙�
+ *
+ * @author makejava
+ * @since 2024-11-18 08:36:18
+ */
+public interface TemperingGlassService extends MPJBaseService<TemperingGlass> {
+
+}
+
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/impl/TemperingGlassInfoServiceImpl.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/impl/TemperingGlassInfoServiceImpl.java
index 211ac25..3c358ef 100644
--- a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/impl/TemperingGlassInfoServiceImpl.java
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/impl/TemperingGlassInfoServiceImpl.java
@@ -108,4 +108,21 @@
             return 100;
         }
     }
+
+    @Override
+    public List<TemperingGlassInfo> selectGlassInfoById(Integer id)
+    {
+        List<TemperingGlassInfo> result=null;
+        QueryWrapper<TemperingGlassInfo> wrapper = new QueryWrapper<>();
+        wrapper.select("Top 1 *").in("state",1,0).eq("temperingLayoutId",id);
+        TemperingGlassInfo glass=temperingMapper.selectOne(wrapper);
+        if(glass!=null) {
+            QueryWrapper<TemperingGlassInfo> glassinfo = new QueryWrapper<>();
+            glassinfo.eq("engineer_id", glass.getEngineerId())
+                    .eq("tempering_layout_id", id);
+            //return temperingMapper.selectList(glassinfo);
+            result= temperingMapper.selectByEngineerIdAndLayoutId(glass.getEngineerId(),glass.getTemperingLayoutId());
+        }
+        return result;
+    }
 }
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/impl/TemperingGlassServiceImpl.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/impl/TemperingGlassServiceImpl.java
new file mode 100644
index 0000000..2a9d8f3
--- /dev/null
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/impl/TemperingGlassServiceImpl.java
@@ -0,0 +1,19 @@
+package com.mes.temperingglass.service.impl;
+
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.mes.temperingglass.entity.TemperingGlass;
+import com.mes.temperingglass.mapper.TemperingGlassMapper;
+import com.mes.temperingglass.service.TemperingGlassService;
+import org.springframework.stereotype.Service;
+
+/**
+ * (TemperingGlass)琛ㄦ湇鍔″疄鐜扮被
+ *
+ * @author makejava
+ * @since 2024-11-18 08:36:18
+ */
+@Service
+public class TemperingGlassServiceImpl extends MPJBaseServiceImpl<TemperingGlassMapper, TemperingGlass> implements TemperingGlassService {
+
+}
+
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/uppattenusage/entity/UpPattenUsage.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/uppattenusage/entity/UpPattenUsage.java
index d0beeb5..821c41b 100644
--- a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/uppattenusage/entity/UpPattenUsage.java
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/uppattenusage/entity/UpPattenUsage.java
@@ -62,5 +62,14 @@
      */
     private Integer state;
 
+//    /**
+//     * 闄よ啘鏂瑰紡
+//     */
+//    private Integer filmRemove;
+//
+//    /**
+//     * 璁惧
+//     */
+//    private Integer stationCell;
 
 }
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/uppattenusage/mapper/UpPattenUsageMapper.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/uppattenusage/mapper/UpPattenUsageMapper.java
index 42e4308..b3d3233 100644
--- a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/uppattenusage/mapper/UpPattenUsageMapper.java
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/uppattenusage/mapper/UpPattenUsageMapper.java
@@ -9,7 +9,7 @@
 
 /**
  * <p>
- *  Mapper 鎺ュ彛
+ * Mapper 鎺ュ彛
  * </p>
  *
  * @author zhoush
@@ -18,4 +18,6 @@
 public interface UpPattenUsageMapper extends MPJBaseMapper<UpPattenUsage> {
 
     List<UpPattenUsageVO> queryRawGlassByEngineeringId(@Param("engineeringId") String engineerId);
+
+    List<Integer> queryFinishByEngineering(@Param("stationCell") Integer deviceId, @Param("finishCount") int finishCount);
 }
diff --git a/hangzhoumesParent/common/servicebase/src/main/resources/mapper/RawGlassStorageDetailsMapper.xml b/hangzhoumesParent/common/servicebase/src/main/resources/mapper/RawGlassStorageDetailsMapper.xml
index e9fc32e..53d09c7 100644
--- a/hangzhoumesParent/common/servicebase/src/main/resources/mapper/RawGlassStorageDetailsMapper.xml
+++ b/hangzhoumesParent/common/servicebase/src/main/resources/mapper/RawGlassStorageDetailsMapper.xml
@@ -2,9 +2,15 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.mes.rawglassdetails.mapper.RawGlassStorageDetailsMapper">
 
-    <select id="listBySlotState" resultType="java.lang.Integer">
+    <resultMap id="baseMap" type="com.mes.rawglassdetails.entity.RawGlassStorageDetails">
+        <result column="DEVICE_ID" property="deviceId"/>
+        <result column="SLOT" property="slot"/>
+    </resultMap>
+
+    <select id="listBySlotState" resultMap="baseMap">
         SELECT
-        T.SLOT
+        T.SLOT,
+        T.DEVICE_ID
         FROM
         RAW_GLASS_STORAGE_STATION T
         LEFT JOIN RAW_GLASS_STORAGE_DETAILS AS T1 ON T.DEVICE_ID = T1.DEVICE_ID
diff --git a/hangzhoumesParent/common/servicebase/src/main/resources/mapper/UpPattenUsageMapper.xml b/hangzhoumesParent/common/servicebase/src/main/resources/mapper/UpPattenUsageMapper.xml
index 951829c..e19a528 100644
--- a/hangzhoumesParent/common/servicebase/src/main/resources/mapper/UpPattenUsageMapper.xml
+++ b/hangzhoumesParent/common/servicebase/src/main/resources/mapper/UpPattenUsageMapper.xml
@@ -13,11 +13,10 @@
         <result column="state" property="state"/>
         <result column="group_number" property="groupNumber"/>
     </resultMap>
-    <select id="queryRawGlassByEngineeringId" resultType="com.mes.uppattenusage.entity.vo.UpPattenUsageVO">
+    <select id="queryRawGlassByEngineeringId" resultMap="baseMap">
         SET @prev_width := NULL;
         SET @prev_height := NULL;
         SET @counter := 0;
-
         SELECT t.*,
                @counter := IF(@prev_width = width and @prev_height = height, @counter, @counter + 1) AS group_number,
                @prev_width := width,
@@ -27,6 +26,14 @@
           and t.state = 0
         ORDER BY t.layout_sequence
     </select>
+    <select id="queryFinishByEngineering" resultType="java.lang.Integer">
+        SELECT id
+        FROM up_patten_usage
+        WHERE engineering_id IN (SELECT engineer_id FROM engineering WHERE station_cell = #{stationCell} AND state = 1)
+          and state = 0
+        order by id
+        LIMIT ${finishCount}
+    </select>
 
 
 </mapper>
\ No newline at end of file
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/impl/SysUserServiceImpl.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/impl/SysUserServiceImpl.java
index e47e35e..f6447db 100644
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/impl/SysUserServiceImpl.java
+++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/impl/SysUserServiceImpl.java
@@ -70,7 +70,7 @@
 
     @Resource
     BCryptPasswordEncoder passwordEncoder;
-    @Autowired
+    @Resource
     private SysUserRoleMapper sysUserRoleMapper;
 
     @Override
diff --git a/hangzhoumesParent/gateway/src/main/resources/application.yml b/hangzhoumesParent/gateway/src/main/resources/application.yml
index a369150..3a9215b 100644
--- a/hangzhoumesParent/gateway/src/main/resources/application.yml
+++ b/hangzhoumesParent/gateway/src/main/resources/application.yml
@@ -47,7 +47,6 @@
           filters:
             - StripPrefix=2
 
-
         - id: glassStorage
           uri: lb://glassStorage
           predicates:
diff --git a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/mapper/EdgStorageCageDetailsMapper.java b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/mapper/EdgStorageCageDetailsMapper.java
index c7ddd26..8dd8e31 100644
--- a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/mapper/EdgStorageCageDetailsMapper.java
+++ b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/mapper/EdgStorageCageDetailsMapper.java
@@ -13,5 +13,5 @@
  */
 public interface EdgStorageCageDetailsMapper extends MPJBaseMapper<EdgStorageCageDetails> {
 
-    EdgStorageCageDetails queryEdgStorageDetailsBySize(double width, double height);
+    EdgStorageCageDetails queryEdgStorageDetailsBySize(int deviceId, int currentSlot, double width, double height);
 }
diff --git a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/EdgStorageCageDetailsService.java b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/EdgStorageCageDetailsService.java
index d8be128..43d2024 100644
--- a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/EdgStorageCageDetailsService.java
+++ b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/EdgStorageCageDetailsService.java
@@ -9,7 +9,7 @@
 
 /**
  * <p>
- *  鏈嶅姟绫�
+ * 鏈嶅姟绫�
  * </p>
  *
  * @author zhoush
@@ -21,18 +21,22 @@
 
     /**
      * 鑾峰彇 鍒囧壊褰撳墠鐗堝浘
+     *
      * @return
      */
     List<Map<String, Object>> selectCutTerritory();
 
     /**
      * 鑾峰彇 宸ョ▼涓嬬殑褰撳墠鐗堝浘
+     *
      * @param current
      * @return
      */
     List<List<Map<String, Object>>> selectCurrentCutTerritory(String current);
+
     /**
      * 鑾峰彇 宸ョ▼涓嬬殑閽㈠寲鐗堝浘
+     *
      * @param current
      * @return
      */
@@ -40,6 +44,7 @@
 
     /**
      * 鏌ヨ绗煎唴鐗堝浘宸�艰寖鍥村唴鐨�  姝ゅ昂瀵哥幓鐠�  濡傛棤鍒欐寜鐓� 閽㈠寲鐗堝浘搴忓彿 浠ュ強鐜荤拑搴忓彿
+     *
      * @param glassId
      * @param threshold
      * @return
@@ -82,9 +87,10 @@
     /**
      * 鎸夌収灏哄
      *
+     * @param deviceId
      * @param width
      * @param height
      * @return
      */
-    EdgStorageCageDetails queryEdgStorageDetailsBySize(double width, double height);
+    EdgStorageCageDetails queryEdgStorageDetailsBySize(int deviceId, int currentSlot, double width, double height);
 }
diff --git a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/impl/EdgStorageCageDetailsServiceImpl.java b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/impl/EdgStorageCageDetailsServiceImpl.java
index 08b79ea..a401280 100644
--- a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/impl/EdgStorageCageDetailsServiceImpl.java
+++ b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/impl/EdgStorageCageDetailsServiceImpl.java
@@ -525,7 +525,7 @@
     }
 
     @Override
-    public EdgStorageCageDetails queryEdgStorageDetailsBySize(double width, double height) {
-        return baseMapper.queryEdgStorageDetailsBySize(width, height);
+    public EdgStorageCageDetails queryEdgStorageDetailsBySize(int deviceId, int currentSlot, double width, double height) {
+        return baseMapper.queryEdgStorageDetailsBySize(deviceId, currentSlot, width, height);
     }
 }
diff --git a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/OpcCacheGlassTask.java b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/OpcCacheGlassTask.java
index 452eaaf..68cc6a7 100644
--- a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/OpcCacheGlassTask.java
+++ b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/OpcCacheGlassTask.java
@@ -1,22 +1,36 @@
 package com.mes.job;
 
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.lang.Assert;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.kangaroohy.milo.model.ReadWriteEntity;
-import com.kangaroohy.milo.runner.subscription.SubscriptionCallback;
 import com.kangaroohy.milo.service.MiloService;
 import com.mes.common.config.Const;
 import com.mes.edgglasstaskqueueinfo.entity.EdgGlassTaskQueueInfo;
 import com.mes.edgglasstaskqueueinfo.service.EdgGlassTaskQueueInfoService;
+import com.mes.edgstoragecage.entity.EdgStorageCage;
+import com.mes.edgstoragecage.entity.EdgStorageCageDetails;
+import com.mes.edgstoragecage.service.EdgStorageCageDetailsService;
+import com.mes.edgstoragecage.service.EdgStorageCageService;
+import com.mes.glassinfo.entity.GlassInfo;
+import com.mes.glassinfo.service.GlassInfoService;
 import com.mes.opctask.entity.EdgStorageDeviceTask;
+import com.mes.opctask.entity.EdgStorageDeviceTaskHistory;
+import com.mes.opctask.service.EdgStorageDeviceTaskHistoryService;
 import com.mes.opctask.service.EdgStorageDeviceTaskService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -36,90 +50,497 @@
     MiloService miloService;
 
 
-    @Resource(name = "cacheGlassStartCallback")
-    SubscriptionCallback cacheGlassStartCallback;
-
-    @Resource(name = "cacheGlassTestCallback")
-    SubscriptionCallback cacheGlassTestCallback;
+//    @Resource(name = "cacheGlassStartCallback")
+//    SubscriptionCallback cacheGlassStartCallback;
+//
+//    @Resource(name = "cacheGlassTestCallback")
+//    SubscriptionCallback cacheGlassTestCallback;
 
     @Resource
     EdgStorageDeviceTaskService edgStorageDeviceTaskService;
     @Resource
     EdgGlassTaskQueueInfoService edgGlassTaskQueueInfoService;
-    private int sum = 0;
+    @Resource
+    GlassInfoService glassInfoService;
+    @Resource
+    EdgStorageCageDetailsService edgStorageCageDetailsService;
+    @Resource
+    EdgStorageCageService edgStorageCageService;
+    @Resource
+    EdgStorageDeviceTaskHistoryService edgStorageDeviceTaskHistoryService;
 
-//    @Scheduled(fixedDelay = 10)
-    public void startOpcTask() throws Exception {
-//        miloService.subscriptionFromOpcUa(Arrays.asList("C101-WL.S7-1200.plc_task_state", "D101-WL.S7-1200.plc_task_state"), cacheGlassStartCallback);
-//        miloService.subscriptionFromOpcUa(Arrays.asList("mes.dec.edg_storage_device_one_task[1].task_state", "D101-WL.S7-1200.plc_task_state"), cacheGlassTestCallback);
-//        log.info("--------------------s---------------------------");
-        EdgStorageDeviceTask task = edgStorageDeviceTaskService.queryTaskMessage("edg_storage_device_one_task");
+    @Value("${mes.glassGap}")
+    private int glassGap;
+    @Value("${mes.threshold}")
+    private int threshold;
+    @Value("${mes.cellLength}")
+    private int cellLength;
+
+    private String glassIdOne = "";
+    private String glassIdTwo = "";
+
+//    @Scheduled(fixedDelay = Long.MAX_VALUE)
+//    public void startOneOpcTask() throws Exception {
+//        miloService.subscriptionFromOpcUa(Arrays.asList("mes.WL1.edg_storage_device_one_task[1].task_state"), cacheGlassStartCallback);
+//    }
+//
+//    @Scheduled(fixedDelay = Long.MAX_VALUE)
+//    public void startTwoOpcTask() throws Exception {
+//        miloService.subscriptionFromOpcUa(Arrays.asList("mes.WL2.edg_storage_device_two_task[1].task_state"), cacheGlassStartCallback);
+//    }
+
+    @Scheduled(fixedDelay = 1000)
+    public void startOneOpcTask() {
+        startOneOpcTaskChild(EDG_STORAGE_DEVICE_ONE_TASK, 1);
+    }
+
+    @Scheduled(fixedDelay = 1000)
+    public void startTwoOpcTask() {
+        startOneOpcTaskChild(EDG_STORAGE_DEVICE_TWO_TASK, 2);
+    }
+
+    private void startOneOpcTaskChild(String tableName, int device) {
+        EdgStorageDeviceTask task = edgStorageDeviceTaskService.queryTaskMessage(tableName);
         try {
             if (task == null) {
                 log.info("浠诲姟琛ㄥ熀纭�鏁版嵁褰曞叆澶辫触锛岃妫�鏌ユ暟鎹槸鍚﹀綍鍏ユ垚鍔�");
                 return;
             }
-            if (task.getTaskState() == sum) {
-                return;
+            if (task.getTaskState() == 2) {
+                //闃叉鍑虹墖浠诲姟涓旂鍓嶆湁鐜荤拑鐨勬儏鍐碉紝灏嗚繘鐗噄d缃┖锛屽嵆鍑虹墖浠呰�冭檻绗煎唴鐨勭幓鐠�
+                task.setGlassIdIn("");
             }
-            sum = task.getTaskState();
-            task.setTaskRunning(sum);
-            log.info("褰撳墠绗瑊}娆℃墽琛�", task.getTaskRunning());
-//            task.setTaskState(task.getTaskRunning());
-            edgStorageDeviceTaskService.updateTaskMessage("edg_storage_device_one_task", task);
+            int request = task.getTaskState();
+            log.info("寮�濮嬫墽琛屼换鍔★紝浠诲姟璇蜂俊鎭负{}", task);
+            if (request == 0) {
+                log.info("鏈敹鍒颁换鍔¤姹傦紝缁撴潫鏈浠诲姟");
+            } else if (request == 1) {
+                //杩涚墖浠诲姟
+                log.info("杩涚墖浠诲姟锛氳繘鐗囩幓鐠僫d涓猴細{}", task.getGlassIdIn());
+                intoTask(task, tableName, device);
+            } else if (request == 2) {
+                //鍑虹墖浠诲姟
+                outTask(task, tableName, device);
+            } else if (request == 3) {
+                //鐩撮�氫换鍔�
+                if (!outTask(task, tableName, device)) {
+                    intoTask(task, tableName, device);
+                }
+            } else if (request == 4) {
+                log.info("灏嗗惎鍔ㄥ瓙鏀逛负0");
+                task.setTaskRunning(Const.GLASS_CACHE_TYPE_RUNNING);
+                edgStorageDeviceTaskService.updateTaskMessage(tableName, task);
+            } else {
+                finishTask(task, tableName);
+            }
         } catch (Exception e) {
-            log.info("{}", e.getMessage());
+            log.info("鎵ц浠诲姟杩囩▼涓彂鐢熷紓甯革紝浠诲姟瀛梴}锛寋}", task.getTaskState(), e.getMessage());
+            log.info("灏嗗惎鍔ㄥ瓙鏀逛负0");
+            task.setTaskState(Const.GLASS_CACHE_TYPE_EMPTY);
+            edgStorageDeviceTaskService.updateTaskMessage(tableName, task);
         }
     }
 
-//    mesControlWord glassId
-//    width height
-//    thickness             filmRemove
-//    deviceControlWord             deviceWarnState
 
-    //    @Scheduled(fixedDelay = 1000)
-    public void edgOpcTask() throws Exception {
-        ReadWriteEntity controlEntity = miloService.readFromOpcUa("A001-MB1.dev.deviceControlWord");
-        String deviceControlWord = (String) controlEntity.getValue();
-        if ("0".equals(deviceControlWord)) {
-            ReadWriteEntity messageEntity = miloService.readFromOpcUa("A001-MB1.dev.mesControlWord");
-            String messageValue = (String) messageEntity.getValue();
-            if ("1".equals(messageValue)) {
-                List<ReadWriteEntity> list = new ArrayList<>();
-                list.add(generateReadWriteEntity("A001-MB1.dev.mesControlWord", 0));
-                miloService.writeToOpcWord(list);
-            }
-            log.info("褰撳墠鏈敹鍒扮(杈规満鐨勮姹備换鍔�");
-            return;
-        }
+    @Scheduled(fixedDelay = 1000)
+    public void edgOneOpcTask() throws Exception {
         EdgStorageDeviceTask task = edgStorageDeviceTaskService.queryTaskMessage(EDG_STORAGE_DEVICE_ONE_TASK);
         String glassId = task.getGlassId();
-        if (StringUtils.isBlank(glassId)) {
-            log.info("纾ㄨ竟鍓嶇殑鏋跺瓙娌℃湁鐜荤拑淇℃伅");
+        if (StringUtils.isBlank(glassId) || glassId.equals(glassIdOne)) {
+            log.info("{}鍙风嚎纾ㄨ竟鍓嶇幓鐠冩湭灏变綅锛岀粨鏉熸湰娆′换鍔�", 1);
             return;
         }
-        //鑾峰彇纾ㄨ竟瀵瑰垪
-        EdgGlassTaskQueueInfo edgInfo = edgGlassTaskQueueInfoService.getOne(new LambdaQueryWrapper<EdgGlassTaskQueueInfo>()
-                .eq(EdgGlassTaskQueueInfo::getGlassId, glassId)
-                .eq(EdgGlassTaskQueueInfo::getState, Const.GLASS_STATE_NEW));
-        if (edgInfo == null) {
+        edgTaskChild(glassId, 1);
+    }
+
+    @Scheduled(fixedDelay = 1000)
+    public void edgTwoOpcTask() throws Exception {
+        EdgStorageDeviceTask task = edgStorageDeviceTaskService.queryTaskMessage(EDG_STORAGE_DEVICE_TWO_TASK);
+        String glassId = task.getGlassId();
+        if (StringUtils.isBlank(glassId) || glassId.equals(glassIdTwo)) {
+            log.info("{}鍙风嚎纾ㄨ竟鍓嶇幓鐠冩湭灏变綅锛岀粨鏉熸湰娆′换鍔�", 2);
+            return;
+        }
+        edgTaskChild(glassId, 2);
+    }
+
+    private void edgTaskChild(String glassId, int cell) throws Exception {
+        GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, glassId).last("limit 1"));
+        if (glassInfo == null) {
             log.info("瀵瑰垪琛ㄤ腑鐨勭幓鐠僫d閿欒锛岃妫�鏌ユ暟鎹紝鐜荤拑id锛歿}", glassId);
             return;
         }
+        String toEndingId = glassInfo.getTemperingLayoutId() + "" + glassInfo.getTemperingFeedSequence();
         List<ReadWriteEntity> list = new ArrayList<>();
-        list.add(generateReadWriteEntity("A001-MB1.dev.mesControlWord", 1));
-        list.add(generateReadWriteEntity("A001-MB1.dev.glassId", glassId));
-        list.add(generateReadWriteEntity("A001-MB1.dev.width", edgInfo.getWidth()));
-        list.add(generateReadWriteEntity("A001-MB1.dev.height", edgInfo.getHeight()));
-        list.add(generateReadWriteEntity("A001-MB1.dev.thickness", edgInfo.getThickness()));
-        list.add(generateReadWriteEntity("A001-MB1.dev.filmRemove", 0));
-        miloService.writeToOpcWord(list);
+//        list.add(generateReadWriteEntity("MB" + cell + ".MB" + cell + ".mesControl", true));
+        list.add(generateReadWriteEntity("MB" + cell + ".MB" + cell + ".glassId", Integer.parseInt(toEndingId)));
+        list.add(generateReadWriteEntity("MB" + cell + ".MB" + cell + ".toEdingId", Integer.parseInt(toEndingId)));
+        list.add(generateReadWriteEntity("MB" + cell + ".MB" + cell + ".width", (int) Math.max(glassInfo.getWidth() * 10, glassInfo.getHeight() * 10)));
+        list.add(generateReadWriteEntity("MB" + cell + ".MB" + cell + ".height", (int) Math.min(glassInfo.getWidth() * 10, glassInfo.getHeight() * 10)));
+
+        miloService.writeToOpcUa(list);
+        miloService.writeToOpcWord(generateReadWriteEntity("MB" + cell + ".MB" + cell + ".thickness", (int) glassInfo.getThickness() * 10));
+        //淇敼纾ㄨ竟瀵瑰垪涓殑纾ㄨ竟绾胯矾鍙婄姸鎬�
+        edgGlassTaskQueueInfoService.update(new LambdaUpdateWrapper<EdgGlassTaskQueueInfo>()
+                .set(EdgGlassTaskQueueInfo::getLine, cell)
+                .set(EdgGlassTaskQueueInfo::getState, Const.EDG_GLASS_START)
+                .eq(EdgGlassTaskQueueInfo::getGlassId, glassId)
+                .eq(EdgGlassTaskQueueInfo::getState, Const.EDG_GLASS_BEFORE));
+        if (cell == 1) {
+            glassIdOne = glassId;
+        } else {
+            glassIdTwo = glassId;
+        }
+
+    }
+
+    private boolean intoTask(EdgStorageDeviceTask task, String tableName, int deviceId) {
+        //鑾峰彇鐜荤拑鐨勫熀鏈俊鎭�
+        GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, task.getGlassIdIn()));
+        if (null == glassInfo) {
+            log.info("杩涚墖鐜荤拑淇℃伅涓嶅瓨鍦紝鐜荤拑id:{}", task.getGlassIdIn());
+            return Boolean.FALSE;
+        }
+        //鑾峰彇褰撳墠杩涚墖鐜荤拑id鍜岃繘鐗囨牸瀛�  鐩稿悓灏哄鍙互鏀句笅鐨勬牸瀛�
+        EdgStorageCage edgStorageCage = edgStorageCageService.getEdgStorageCageBySize(deviceId, glassInfo.getWidth(), glassInfo.getHeight(), task.getCurrentCell());
+        if (edgStorageCage == null) {
+            log.info("鐩稿悓灏哄鍙互鏀句笅鐨勬牸瀛愭湭鎵惧埌锛屾牸瀛恑d:{}", task.getCurrentCell());
+//            SELECT * from edg_storage_cage where device_id = 1 and remain_width > 1000 order by abs(slot - 10)
+            List<EdgStorageCage> storageCageList = edgStorageCageService.list(new LambdaQueryWrapper<EdgStorageCage>()
+                    .eq(EdgStorageCage::getDeviceId, deviceId)
+                    .eq(EdgStorageCage::getEnableState, Const.SLOT_ON)
+                    .ge(EdgStorageCage::getRemainWidth, Math.max(glassInfo.getWidth(), glassInfo.getHeight())).last("order by abs(slot - " + task.getCurrentCell() + ")"));
+//            //鐩撮�氫换鍔�
+//            if (flag && CollectionUtil.isNotEmpty(emptyList)) {
+//                return emptyList.get(0);
+//            }
+            if (CollectionUtil.isEmpty(storageCageList) || storageCageList.size() == 1) {
+                log.info("娌℃湁澶氫綑鐨勭┖鏍煎瓙");
+                return Boolean.FALSE;
+            }
+            edgStorageCage = storageCageList.get(0);
+        }
+        log.info("4銆佸皢鐜荤拑淇℃伅鎻掑叆鍗у紡鐞嗙墖绗�,褰撳墠鐜荤拑淇℃伅:{}", glassInfo);
+        EdgStorageCageDetails details = new EdgStorageCageDetails();
+        BeanUtils.copyProperties(glassInfo, details);
+        details.setState(Const.GLASS_STATE_IN);
+        details.setSlot(edgStorageCage.getSlot());
+        details.setDeviceId(edgStorageCage.getDeviceId());
+        edgStorageCageDetailsService.save(details);
+
+        //鏇存柊浠诲姟淇℃伅
+        task.setStartCell(edgStorageCage.getSlot());
+        task.setTaskRunning(Const.GLASS_CACHE_TYPE_IN);
+        edgStorageDeviceTaskService.updateTaskMessage(tableName, task);
+        saveHistoryTask(task);
+        return Boolean.TRUE;
+    }
+
+    private boolean outTask(EdgStorageDeviceTask task, String tableName, int deviceId) {
+        EdgStorageCageDetails edgStorageCageDetails = null;
+        //绗煎唴鏄増鍥剧浉宸槸鍚﹁秴杩囬槇鍊�
+        boolean flag = queryMaxMinDiff(threshold);
+        if (flag) {
+            EdgStorageCageDetails minEdgDetails = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>()
+                    .inSql(EdgStorageCageDetails::getSlot, "select slot from edg_storage_cage where enable_state = " + Const.SLOT_ON)
+                    .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)
+                    .eq(EdgStorageCageDetails::getDeviceId, deviceId)
+                    .orderByAsc(EdgStorageCageDetails::getTemperingLayoutId)
+                    .orderBy(Boolean.TRUE, Boolean.TRUE, EdgStorageCageDetails::getTemperingFeedSequence)
+                    .last("limit 1"));
+//            select * from edg_storage_cage_details where width = 551 and height = 1151 and id in (select min(id ) from edg_storage_cage_details where state = 100 group by slot )
+            edgStorageCageDetails = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>()
+                    .eq(EdgStorageCageDetails::getWidth, minEdgDetails.getWidth())
+                    .eq(EdgStorageCageDetails::getHeight, minEdgDetails.getHeight())
+                    .eq(EdgStorageCageDetails::getDeviceId, deviceId)
+                    .inSql(EdgStorageCageDetails::getId, "select min(id) from edg_storage_cage_details where state = 100 group by slot ")
+                    .last("order by abs(slot - " + task.getCurrentCell() + ")  asc limit 1")
+            );
+            //缁欑洿閫氫换鍔�
+            if (null == edgStorageCageDetails && StringUtils.isNotBlank(task.getGlassIdIn())) {
+                GlassInfo glassInInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>()
+                        .eq(GlassInfo::getGlassId, task.getGlassIdIn())
+                        .eq(GlassInfo::getWidth, minEdgDetails.getWidth())
+                        .eq(GlassInfo::getHeight, minEdgDetails.getHeight()));
+                if (null != glassInInfo) {
+                    edgStorageCageDetails = new EdgStorageCageDetails();
+                    BeanUtils.copyProperties(glassInInfo, edgStorageCageDetails);
+                }
+            }
+            if (null == edgStorageCageDetails) {
+                edgStorageCageDetails = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>()
+                        .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)
+                        .eq(EdgStorageCageDetails::getDeviceId, deviceId)
+                        .eq(EdgStorageCageDetails::getSlot, minEdgDetails.getSlot())
+                        .orderByAsc(EdgStorageCageDetails::getId)
+                        .last("limit 1")
+                );
+            }
+        }
+        if (null == edgStorageCageDetails) {
+            //        鑾峰彇涓婃浠诲姟
+//        鑾峰彇鍘嗗彶琛ㄤ腑涓婃浠诲姟鏈�鍚庝竴鐗囧昂瀵�
+            EdgStorageDeviceTaskHistory edgeData = edgStorageDeviceTaskHistoryService.getOne(new LambdaQueryWrapper<EdgStorageDeviceTaskHistory>()
+                    .eq(EdgStorageDeviceTaskHistory::getTaskState, Const.RAW_GLASS_TASK_SUCCESS)
+                    .in(EdgStorageDeviceTaskHistory::getTaskType, Const.GLASS_CACHE_TYPE_OUT, Const.GLASS_CACHE_TYPE_THROUGH)
+                    .orderByDesc(EdgStorageDeviceTaskHistory::getId).last("limit 1"));
+            if (null != edgeData) {
+                GlassInfo glassOutInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, edgeData.getGlassIdOut()));
+                //绗煎唴鐨勭幓鐠冪殑灏哄鏄惁鍜屼笂涓�娆′换鍔′竴鑷�
+                edgStorageCageDetails = edgStorageCageDetailsService.queryEdgStorageDetailsBySize(deviceId, task.getCurrentCell(), glassOutInfo.getWidth(), glassOutInfo.getHeight());
+                if (null == edgStorageCageDetails && StringUtils.isNotBlank(task.getGlassIdIn())) {
+                    GlassInfo glassInInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>()
+                            .eq(GlassInfo::getGlassId, task.getGlassIdIn())
+                            .eq(GlassInfo::getWidth, glassOutInfo.getWidth())
+                            .eq(GlassInfo::getHeight, glassOutInfo.getHeight()));
+                    if (null != glassInInfo) {
+                        edgStorageCageDetails = new EdgStorageCageDetails();
+                        BeanUtils.copyProperties(glassInInfo, edgStorageCageDetails);
+                    }
+                }
+            }
+        }
+        if (null == edgStorageCageDetails) {
+            edgStorageCageDetails = edgStorageCageDetailsService.queryEdgStorageDetailsBySize(deviceId, task.getCurrentCell(), 0, 0);
+        }
+        if (edgStorageCageDetails == null && StringUtils.isNotBlank(task.getGlassIdIn())) {
+            //鍜屼笂娆′换鍔′笉瀛樺湪鐩稿悓灏哄
+            GlassInfo glassInInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, task.getGlassIdIn()));
+            edgStorageCageDetails = new EdgStorageCageDetails();
+            BeanUtils.copyProperties(glassInInfo, edgStorageCageDetails);
+        }
+        if (edgStorageCageDetails == null) {
+            //鍜屼笂娆′换鍔′笉瀛樺湪鐩稿悓灏哄
+            log.info("绗煎唴娌℃湁鐜荤拑浜�");
+            return Boolean.FALSE;
+        }
+        int taskType = Const.GLASS_CACHE_TYPE_OUT;
+        String glassId = edgStorageCageDetails.getGlassId();
+        if (glassId.equals(task.getGlassIdIn())) {
+            if (3 != task.getTaskState()) {
+                return Boolean.FALSE;
+            }
+            log.info("5銆佺洿閫氫换鍔�,灏嗙幓鐠冧俊鎭彃鍏ュ崸寮忕悊鐗囩,褰撳墠鐜荤拑淇℃伅:{}", edgStorageCageDetails);
+            //鐜荤拑淇℃伅鏇挎崲
+            String glassIdChange = queryAndChangeGlass(glassId);
+            //澶勭悊鍦ㄥ崸鐞嗗唴鐨勭幓鐠冧俊鎭細绗煎唴鐨勬暟鎹鐞�
+            queryEdgAndChangeGlass(edgStorageCageDetails.getGlassId(), glassIdChange);
+            if (StringUtils.isNotBlank(glassIdChange)) {
+                edgStorageCageDetails = new EdgStorageCageDetails();
+                GlassInfo one = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, glassId));
+                BeanUtils.copyProperties(one, edgStorageCageDetails);
+            }
+            EdgStorageCage storageCage = edgStorageCageService.getOne(new LambdaQueryWrapper<EdgStorageCage>()
+                    .eq(EdgStorageCage::getDeviceId, deviceId)
+                    .eq(EdgStorageCage::getEnableState, Const.SLOT_ON)
+                    .ge(EdgStorageCage::getRemainWidth, cellLength)
+                    .last("order by abs(slot - " + task.getCurrentCell() + ") limit 1"));
+            Assert.isTrue(null != storageCage, "鏍煎瓙宸叉弧,鏃犳硶鎵ц鐩撮�氫换鍔�");
+            log.info("3銆佹煡璇㈠崸寮忕悊鐗囩閲岄潰鐨勭┖鏍�:{}", storageCage);
+            edgStorageCageDetails.setSlot(storageCage.getSlot());
+            edgStorageCageDetails.setDeviceId(storageCage.getDeviceId());
+            edgStorageCageDetails.setState(Const.GLASS_STATE_OUT);
+            edgStorageCageDetailsService.save(edgStorageCageDetails);
+            taskType = Const.GLASS_CACHE_TYPE_THROUGH;
+        } else {
+            log.info("5銆侀潪鐩撮�氫换鍔�,灏嗙幓鐠冧俊鎭彃鍏ュ崸寮忕悊鐗囩,褰撳墠鐜荤拑淇℃伅:{}", edgStorageCageDetails);
+            if (!edgStorageCageDetails.getSlot().equals(task.getCurrentCell())) {
+                EdgStorageCageDetails currentGlass = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>()
+                        .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)
+                        .eq(EdgStorageCageDetails::getDeviceId, deviceId)
+                        .eq(EdgStorageCageDetails::getSlot, task.getCurrentCell()).eq(EdgStorageCageDetails::getWidth, edgStorageCageDetails.getWidth())
+                        .eq(EdgStorageCageDetails::getHeight, edgStorageCageDetails.getHeight()).eq(EdgStorageCageDetails::getThickness, edgStorageCageDetails.getThickness())
+                        .orderByAsc(EdgStorageCageDetails::getId).last("limit 1")
+                );
+                if (null != currentGlass) {
+                    edgStorageCageDetails = currentGlass;
+                }
+            }
+            //鐜荤拑淇℃伅鏇挎崲
+            String glassIdChange = queryAndChangeGlass(edgStorageCageDetails.getGlassId());
+            //澶勭悊鍦ㄥ崸鐞嗗唴鐨勭幓鐠冧俊鎭細绗煎唴鐨勬暟鎹鐞�
+            queryEdgAndChangeGlass(edgStorageCageDetails.getGlassId(), glassIdChange);
+            LambdaUpdateWrapper<EdgStorageCageDetails> wrapper = new LambdaUpdateWrapper<>();
+            wrapper.eq(EdgStorageCageDetails::getGlassId, edgStorageCageDetails.getGlassId()).set(EdgStorageCageDetails::getState, Const.GLASS_STATE_OUT);
+            edgStorageCageDetailsService.update(wrapper);
+            log.info("5銆佹洿鏂板嚭鐗囩幓鐠冪殑鐘舵�佷负{}", Const.GLASS_STATE_OUT);
+        }
+        //鐢熸垚鍑虹墖浠诲姟
+        task.setGlassIdOut(edgStorageCageDetails.getGlassId());
+        task.setStartCell(edgStorageCageDetails.getSlot());
+        task.setTaskRunning(taskType);
+
+        edgStorageDeviceTaskService.updateTaskMessage(tableName, task);
+        saveHistoryTask(task);
+        //鏇存柊璇︽儏琛ㄤ换鍔″嚭鐗囦腑
+        edgStorageCageDetailsService.update(new LambdaUpdateWrapper<EdgStorageCageDetails>()
+                .set(EdgStorageCageDetails::getState, Const.GLASS_STATE_OUT)
+                .eq(EdgStorageCageDetails::getGlassId, edgStorageCageDetails.getGlassId()));
+        //纾ㄨ竟瀵瑰垪琛ㄦ柊澧炰竴鏉℃暟鎹�
+        EdgGlassTaskQueueInfo edgInfo = new EdgGlassTaskQueueInfo();
+        BeanUtils.copyProperties(task, edgInfo);
+        edgInfo.setGlassId(edgStorageCageDetails.getGlassId());
+        edgInfo.setCreateTime(new Date());
+        edgInfo.setWidth((int) edgStorageCageDetails.getWidth());
+        edgInfo.setHeight((int) edgStorageCageDetails.getHeight());
+        edgInfo.setThickness((int) edgStorageCageDetails.getThickness());
+        edgInfo.setState(Const.EDG_GLASS_BEFORE);
+        edgGlassTaskQueueInfoService.save(edgInfo);
+        return Boolean.TRUE;
+    }
+
+    private boolean finishTask(EdgStorageDeviceTask task, String tableName) {
+        log.info("褰撳墠浠诲姟淇℃伅涓猴細{}", task);
+        if (task.getTaskState() <= 4 && task.getTaskRunning() == 0) {
+            log.info("鏈夋鍦ㄦ墽琛岀殑浠诲姟鎴栬繖浠诲姟宸叉墽琛屼换鍔$姸鎬亄}锛屼换鍔″惎鍔ㄦ儏鍐祘}锛岀粨鏉�", task.getTaskState(), task.getTaskRunning());
+            return Boolean.FALSE;
+        }
+        Integer cell = task.getStartCell();
+        Integer state = task.getTaskState();
+        task.setTaskRunning(Const.GLASS_CACHE_TYPE_EMPTY);
+        task.setGlassIdOut("");
+        task.setStartCell(0);
+        edgStorageDeviceTaskService.updateTaskMessage(tableName, task);
+        edgStorageDeviceTaskHistoryService.update(new LambdaUpdateWrapper<EdgStorageDeviceTaskHistory>()
+                .eq(EdgStorageDeviceTaskHistory::getTaskState, Const.RAW_GLASS_TASK_NEW)
+                .set(EdgStorageDeviceTaskHistory::getTaskState,
+                        Const.GLASS_CACHE_TYPE_FINISH.equals(state) ? Const.RAW_GLASS_TASK_SUCCESS : Const.RAW_GLASS_TASK_FAILURE)
+        );
+        int device = tableName.equals("edg_storage_device_one_task") ? 1 : 2;
+        updateCellRemainWidth(cell, device);
+        return Boolean.TRUE;
+    }
+
+    /**
+     * 鏌ヨ鐜荤拑骞惰繘琛屼氦鎹�
+     *
+     * @param glassId
+     * @return
+     */
+    public String queryAndChangeGlass(String glassId) {
+        GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, glassId));
+//                .inSql(GlassInfo::getEngineerId, "select engineer_id from engineering where state = 1"));
+        Assert.isFalse(null == glassInfo, "鐜荤拑淇℃伅涓嶅瓨鍦�");        //鎸夌収鐜荤拑灏哄
+        LambdaQueryWrapper<GlassInfo> queryWrapper = new LambdaQueryWrapper<GlassInfo>()
+                .eq(GlassInfo::getWidth, glassInfo.getWidth())
+                .eq(GlassInfo::getHeight, glassInfo.getHeight())
+                .eq(GlassInfo::getThickness, glassInfo.getThickness())
+                .eq(GlassInfo::getFilmsid, glassInfo.getFilmsid())
+                .eq(GlassInfo::getFlowCardId, glassInfo.getFlowCardId())
+                .eq(GlassInfo::getTotalLayer, glassInfo.getTotalLayer())
+                .eq(GlassInfo::getLayer, glassInfo.getLayer())
+                .eq(GlassInfo::getEngineerId, glassInfo.getEngineerId())
+                .notInSql(GlassInfo::getGlassId, "select distinct glass_id from edg_storage_cage_details " +
+                        "where engineer_id = '" + glassInfo.getEngineerId() + "' and width = " + glassInfo.getWidth() + " and height = " + glassInfo.getHeight()
+                        + " and state != 100")
+                .orderByAsc(GlassInfo::getTemperingLayoutId)
+                .orderBy(Boolean.TRUE, Boolean.TRUE, GlassInfo::getTemperingFeedSequence)
+                .last("Limit 1");
+        GlassInfo swapGlassInfo = glassInfoService.getOne(queryWrapper);
+        if (swapGlassInfo != null && !glassInfo.getGlassId().equals(swapGlassInfo.getGlassId())) {
+            String swapGlassId = swapGlassInfo.getGlassId();
+            log.info("灏嗙幓鐠儃}鍜岀幓鐠儃}锛屼俊鎭簰鎹�,杩涚幓鐠� {}", glassInfo, swapGlassInfo, swapGlassInfo);
+            swapGlassInfo.setGlassId(glassId);
+            glassInfo.setGlassId(swapGlassId);
+            glassInfoService.updateById(swapGlassInfo);
+            glassInfoService.updateById(glassInfo);
+            return swapGlassId;
+        }
+        return "";
+    }
+
+
+    /**
+     * 鏌ヨ鍗у紡鐞嗙墖鐜荤拑骞惰繘琛屼氦鎹�
+     *
+     * @param glassId
+     * @return
+     */
+    public void queryEdgAndChangeGlass(String glassId, String swapGlassId) {
+        if (StringUtils.isBlank(swapGlassId)) {
+            log.info("褰撳墠鍑虹鐜荤拑涓嶅瓨鍦ㄩ渶瑕佹浛鎹㈢殑鐜荤拑");
+            return;
+        }
+        //鑾峰彇寰呭嚭绗肩殑鐜荤拑
+        EdgStorageCageDetails glassInfo = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>()
+                .eq(EdgStorageCageDetails::getGlassId, glassId).eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN));
+//        鑾峰彇寰呭嚭绗肩殑鐜荤拑闇�瑕佹浛鎹㈢殑鐜荤拑淇℃伅
+        EdgStorageCageDetails swapGlassDetailInfo = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>()
+                .eq(EdgStorageCageDetails::getGlassId, swapGlassId).eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN));
+
+//      鐜荤拑灏忕墖琛ㄤ腑鐜荤拑宸茬粡鏇挎崲锛屾洿鏂板崸鐞嗙鍐呯幇鏈夌殑鍑嗗鍑虹鐨勭幓鐠冧俊鎭紝
+        if (null == swapGlassDetailInfo) {
+            GlassInfo glassInfoBase = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>()
+                    .eq(GlassInfo::getGlassId, glassId));
+            //闇�瑕佹浛鎹㈢殑鐜荤拑涓哄瓨杩涘崸鐞嗭紝浠呴渶鏇存柊褰撳墠闇�瑕佸嚭绗肩殑鐜荤拑淇℃伅鍗冲彲
+            edgStorageCageDetailsService.update(new LambdaUpdateWrapper<EdgStorageCageDetails>()
+                    .eq(EdgStorageCageDetails::getGlassId, glassId)
+                    .set(EdgStorageCageDetails::getTemperingLayoutId, glassInfoBase.getTemperingLayoutId())
+                    .set(EdgStorageCageDetails::getTemperingFeedSequence, glassInfoBase.getTemperingFeedSequence()));
+        } else {
+            //闇�瑕佹浛鎹㈢殑鐜荤拑閮藉湪鍗х悊鍐咃紝鎸夌収鐜荤拑id瀵硅皟鐜荤拑淇℃伅锛氬璋冪幓鐠僫d鍗冲彲
+            edgStorageCageDetailsService.update(new LambdaUpdateWrapper<EdgStorageCageDetails>()
+                    .eq(EdgStorageCageDetails::getId, glassInfo.getId())
+                    .set(EdgStorageCageDetails::getTemperingLayoutId, swapGlassDetailInfo.getTemperingLayoutId())
+                    .set(EdgStorageCageDetails::getTemperingFeedSequence, swapGlassDetailInfo.getTemperingFeedSequence())
+            );
+            edgStorageCageDetailsService.update(new LambdaUpdateWrapper<EdgStorageCageDetails>()
+                    .eq(EdgStorageCageDetails::getId, swapGlassDetailInfo.getId())
+                    .set(EdgStorageCageDetails::getTemperingLayoutId, glassInfo.getTemperingLayoutId())
+                    .set(EdgStorageCageDetails::getTemperingFeedSequence, glassInfo.getTemperingFeedSequence())
+            );
+        }
+    }
+
+    /**
+     * 鑾峰彇璇︽儏琛ㄥ唴鏈�澶ф渶灏忕増鍥緄d鐨勫樊鍊硷紝鍒ゆ柇鏄惁鍑烘渶灏忕増鍥剧幓鐠�
+     *
+     * @return
+     */
+    public boolean queryMaxMinDiff(int threshold) {
+        //鑾峰彇绗煎瓙鍐呮渶澶х増鍥緄d鍜屾渶灏忕増鍥緄d鎻掑�硷紝鍒ゆ柇鏄惁澶т簬闃堝�硷紝澶т簬闃堝�肩洿鎺ュ嚭鏈�灏忕増鍥剧幓鐠�
+        QueryWrapper<EdgStorageCageDetails> queryWrapper = new QueryWrapper<>();
+        queryWrapper.select("max(tempering_layout_id)-min(tempering_layout_id) as diff")
+                .eq("state", Const.GLASS_STATE_IN)
+                .inSql("slot", "select slot from edg_storage_cage where enable_state = " + Const.SLOT_ON);
+        List<Object> list = edgStorageCageDetailsService.listObjs(queryWrapper);
+        //鑾峰彇绗煎唴鐜荤拑鐗堝浘宸�兼槸鍚﹀ぇ浜庨槇鍊�
+        if (CollectionUtil.isNotEmpty(list)) {
+            Long diff = (Long) list.get(0);
+            return diff > threshold;
+        } else {
+            return Boolean.FALSE;
+        }
+    }
+
+    public boolean saveHistoryTask(EdgStorageDeviceTask task) {
+        EdgStorageDeviceTaskHistory taskHistory = new EdgStorageDeviceTaskHistory();
+        BeanUtils.copyProperties(task, taskHistory);
+        taskHistory.setTaskType(task.getTaskRunning());
+        taskHistory.setCreateTime(new Date());
+        taskHistory.setTaskState(Const.RAW_GLASS_TASK_NEW);
+        edgStorageDeviceTaskHistoryService.save(taskHistory);
+        return Boolean.TRUE;
+    }
+
+    private boolean updateCellRemainWidth(int slot, int device) {
+        List<EdgStorageCageDetails> list = edgStorageCageDetailsService.list(new LambdaQueryWrapper<EdgStorageCageDetails>().eq(EdgStorageCageDetails::getSlot, slot)
+                .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN));
+        int remainWidth = cellLength;
+        if (CollectionUtil.isNotEmpty(list)) {
+            int widthTotal = (int) list.stream().map(e -> Math.max(e.getWidth(), e.getHeight()) + glassGap).mapToDouble(Double::intValue).sum();
+            remainWidth = cellLength - widthTotal >= 0 ? cellLength - widthTotal : 0;
+        }
+        edgStorageCageService.update(new LambdaUpdateWrapper<EdgStorageCage>().
+                set(EdgStorageCage::getRemainWidth, remainWidth).eq(EdgStorageCage::getSlot, slot).eq(EdgStorageCage::getDeviceId, device));
+        return Boolean.TRUE;
     }
 
     private ReadWriteEntity generateReadWriteEntity(String identifier, Object value) {
-        ReadWriteEntity readWriteEntity = new ReadWriteEntity();
-        readWriteEntity.setIdentifier(identifier);
-        readWriteEntity.setValue(value);
-        return readWriteEntity;
+        return ReadWriteEntity.builder()
+                .identifier(identifier)
+                //Kep涓槸Long绫诲瀷锛屽嵆锛欼nt32锛孞ava涓殑int绫诲瀷
+                .value(value)
+                .build();
     }
 }
diff --git a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/opccallback/CacheGlassStartCallback.java b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/opccallback/CacheGlassStartCallback.java
index 68e550d..8941f5c 100644
--- a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/opccallback/CacheGlassStartCallback.java
+++ b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/opccallback/CacheGlassStartCallback.java
@@ -63,30 +63,39 @@
     @Value("${mes.cellLength}")
     private int cellLength;
 
+    private Date startDate;
+
     @Override
     public void onSubscribe(String identifier, Object value) {
+
         log.info("褰撳墠姝e湪鎵ц鐨勪换鍔′负{}", value);
         String tableName = identifier.contains("edg_storage_device_one_task") ? EDG_STORAGE_DEVICE_ONE_TASK : EDG_STORAGE_DEVICE_TWO_TASK;
+        int device = tableName.equals("edg_storage_device_one_task") ? 1 : 2;
         EdgStorageDeviceTask task = edgStorageDeviceTaskService.queryTaskMessage(tableName);
         try {
             if (task == null) {
                 log.info("浠诲姟琛ㄥ熀纭�鏁版嵁褰曞叆澶辫触锛岃妫�鏌ユ暟鎹槸鍚﹀綍鍏ユ垚鍔�");
                 return;
             }
-            int request = task.getTaskState();
+            if (task.getTaskState() == 2) {
+                //闃叉鍑虹墖浠诲姟涓旂鍓嶆湁鐜荤拑鐨勬儏鍐碉紝灏嗚繘鐗噄d缃┖锛屽嵆鍑虹墖浠呰�冭檻绗煎唴鐨勭幓鐠�
+                task.setGlassIdIn("");
+            }
+            int request = Integer.parseInt("" + value);
             log.info("寮�濮嬫墽琛屼换鍔★紝浠诲姟璇蜂俊鎭负{}", task);
             if (request == 0) {
                 log.info("鏈敹鍒颁换鍔¤姹傦紝缁撴潫鏈浠诲姟");
             } else if (request == 1) {
                 //杩涚墖浠诲姟
-                intoTask(task, tableName);
+                log.info("杩涚墖浠诲姟锛氳繘鐗囩幓鐠僫d涓猴細{}", task.getGlassIdIn());
+                intoTask(task, tableName, device);
             } else if (request == 2) {
                 //鍑虹墖浠诲姟
-                outTask(task, tableName);
+                outTask(task, tableName, device);
             } else if (request == 3) {
                 //鐩撮�氫换鍔�
-                if (!outTask(task, tableName)) {
-                    intoTask(task, tableName);
+                if (!outTask(task, tableName, device)) {
+                    intoTask(task, tableName, device);
                 }
             } else if (request == 4) {
                 log.info("灏嗗惎鍔ㄥ瓙鏀逛负0");
@@ -103,7 +112,7 @@
         }
     }
 
-    private boolean intoTask(EdgStorageDeviceTask task, String tableName) {
+    private boolean intoTask(EdgStorageDeviceTask task, String tableName, int deviceId) {
         //鑾峰彇鐜荤拑鐨勫熀鏈俊鎭�
         GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, task.getGlassIdIn()));
         if (null == glassInfo) {
@@ -111,11 +120,12 @@
             return Boolean.FALSE;
         }
         //鑾峰彇褰撳墠杩涚墖鐜荤拑id鍜岃繘鐗囨牸瀛�  鐩稿悓灏哄鍙互鏀句笅鐨勬牸瀛�
-        EdgStorageCage edgStorageCage = edgStorageCageService.getEdgStorageCageBySize(1, glassInfo.getWidth(), glassInfo.getHeight(), task.getCurrentCell());
+        EdgStorageCage edgStorageCage = edgStorageCageService.getEdgStorageCageBySize(deviceId, glassInfo.getWidth(), glassInfo.getHeight(), task.getCurrentCell());
         if (edgStorageCage == null) {
             log.info("鐩稿悓灏哄鍙互鏀句笅鐨勬牸瀛愭湭鎵惧埌锛屾牸瀛恑d:{}", task.getCurrentCell());
 //            SELECT * from edg_storage_cage where device_id = 1 and remain_width > 1000 order by abs(slot - 10)
-            List<EdgStorageCage> storageCageList = edgStorageCageService.list(new LambdaQueryWrapper<EdgStorageCage>().eq(EdgStorageCage::getDeviceId, 1)
+            List<EdgStorageCage> storageCageList = edgStorageCageService.list(new LambdaQueryWrapper<EdgStorageCage>()
+                    .eq(EdgStorageCage::getDeviceId, deviceId)
                     .eq(EdgStorageCage::getEnableState, Const.SLOT_ON)
                     .ge(EdgStorageCage::getRemainWidth, Math.max(glassInfo.getWidth(), glassInfo.getHeight())).last("order by abs(slot - " + task.getCurrentCell() + ")"));
 //            //鐩撮�氫换鍔�
@@ -144,7 +154,7 @@
         return Boolean.TRUE;
     }
 
-    private boolean outTask(EdgStorageDeviceTask task, String tableName) {
+    private boolean outTask(EdgStorageDeviceTask task, String tableName, int deviceId) {
         EdgStorageCageDetails edgStorageCageDetails = null;
         //绗煎唴鏄増鍥剧浉宸槸鍚﹁秴杩囬槇鍊�
         boolean flag = queryMaxMinDiff(threshold);
@@ -152,6 +162,7 @@
             EdgStorageCageDetails minEdgDetails = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>()
                     .inSql(EdgStorageCageDetails::getSlot, "select slot from edg_storage_cage where enable_state = " + Const.SLOT_ON)
                     .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)
+                    .eq(EdgStorageCageDetails::getDeviceId, deviceId)
                     .orderByAsc(EdgStorageCageDetails::getTemperingLayoutId)
                     .orderBy(Boolean.TRUE, Boolean.TRUE, EdgStorageCageDetails::getTemperingFeedSequence)
                     .last("limit 1"));
@@ -159,6 +170,7 @@
             edgStorageCageDetails = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>()
                     .eq(EdgStorageCageDetails::getWidth, minEdgDetails.getWidth())
                     .eq(EdgStorageCageDetails::getHeight, minEdgDetails.getHeight())
+                    .eq(EdgStorageCageDetails::getDeviceId, deviceId)
                     .inSql(EdgStorageCageDetails::getId, "select min(id) from edg_storage_cage_details where state = 100 group by slot ")
                     .last("order by abs(slot - " + task.getCurrentCell() + ")  asc limit 1")
             );
@@ -176,6 +188,7 @@
             if (null == edgStorageCageDetails) {
                 edgStorageCageDetails = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>()
                         .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)
+                        .eq(EdgStorageCageDetails::getDeviceId, deviceId)
                         .eq(EdgStorageCageDetails::getSlot, minEdgDetails.getSlot())
                         .orderByAsc(EdgStorageCageDetails::getId)
                         .last("limit 1")
@@ -192,7 +205,7 @@
             if (null != edgeData) {
                 GlassInfo glassOutInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, edgeData.getGlassIdOut()));
                 //绗煎唴鐨勭幓鐠冪殑灏哄鏄惁鍜屼笂涓�娆′换鍔′竴鑷�
-                edgStorageCageDetails = edgStorageCageDetailsService.queryEdgStorageDetailsBySize(glassOutInfo.getWidth(), glassOutInfo.getHeight());
+                edgStorageCageDetails = edgStorageCageDetailsService.queryEdgStorageDetailsBySize(deviceId, task.getCurrentCell(), glassOutInfo.getWidth(), glassOutInfo.getHeight());
                 if (null == edgStorageCageDetails && StringUtils.isNotBlank(task.getGlassIdIn())) {
                     GlassInfo glassInInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>()
                             .eq(GlassInfo::getGlassId, task.getGlassIdIn())
@@ -206,7 +219,7 @@
             }
         }
         if (null == edgStorageCageDetails) {
-            edgStorageCageDetails = edgStorageCageDetailsService.queryEdgStorageDetailsBySize(0, 0);
+            edgStorageCageDetails = edgStorageCageDetailsService.queryEdgStorageDetailsBySize(deviceId, task.getCurrentCell(), 0, 0);
         }
         if (edgStorageCageDetails == null && StringUtils.isNotBlank(task.getGlassIdIn())) {
             //鍜屼笂娆′换鍔′笉瀛樺湪鐩稿悓灏哄
@@ -222,21 +235,28 @@
         int taskType = Const.GLASS_CACHE_TYPE_OUT;
         String glassId = edgStorageCageDetails.getGlassId();
         if (glassId.equals(task.getGlassIdIn())) {
+            if (3 != task.getTaskState()) {
+                return Boolean.FALSE;
+            }
             log.info("5銆佺洿閫氫换鍔�,灏嗙幓鐠冧俊鎭彃鍏ュ崸寮忕悊鐗囩,褰撳墠鐜荤拑淇℃伅:{}", edgStorageCageDetails);
             //鐜荤拑淇℃伅鏇挎崲
             String glassIdChange = queryAndChangeGlass(glassId);
+            //澶勭悊鍦ㄥ崸鐞嗗唴鐨勭幓鐠冧俊鎭細绗煎唴鐨勬暟鎹鐞�
+            queryEdgAndChangeGlass(edgStorageCageDetails.getGlassId(), glassIdChange);
             if (StringUtils.isNotBlank(glassIdChange)) {
                 edgStorageCageDetails = new EdgStorageCageDetails();
                 GlassInfo one = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, glassId));
                 BeanUtils.copyProperties(one, edgStorageCageDetails);
             }
-            EdgStorageCage storageCage = edgStorageCageService.getOne(new LambdaQueryWrapper<EdgStorageCage>().eq(EdgStorageCage::getDeviceId, 1)
+            EdgStorageCage storageCage = edgStorageCageService.getOne(new LambdaQueryWrapper<EdgStorageCage>()
+                    .eq(EdgStorageCage::getDeviceId, deviceId)
                     .eq(EdgStorageCage::getEnableState, Const.SLOT_ON)
-                    .ge(EdgStorageCage::getRemainWidth, cellLength).last("order by abs(slot - " + task.getCurrentCell() + ")")
-                    .last("limit 1"));
+                    .ge(EdgStorageCage::getRemainWidth, cellLength)
+                    .last("order by abs(slot - " + task.getCurrentCell() + ") limit 1"));
             Assert.isTrue(null != storageCage, "鏍煎瓙宸叉弧,鏃犳硶鎵ц鐩撮�氫换鍔�");
             log.info("3銆佹煡璇㈠崸寮忕悊鐗囩閲岄潰鐨勭┖鏍�:{}", storageCage);
             edgStorageCageDetails.setSlot(storageCage.getSlot());
+            edgStorageCageDetails.setDeviceId(storageCage.getDeviceId());
             edgStorageCageDetails.setState(Const.GLASS_STATE_OUT);
             edgStorageCageDetailsService.save(edgStorageCageDetails);
             taskType = Const.GLASS_CACHE_TYPE_THROUGH;
@@ -245,8 +265,10 @@
             if (!edgStorageCageDetails.getSlot().equals(task.getCurrentCell())) {
                 EdgStorageCageDetails currentGlass = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>()
                         .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)
+                        .eq(EdgStorageCageDetails::getDeviceId, deviceId)
                         .eq(EdgStorageCageDetails::getSlot, task.getCurrentCell()).eq(EdgStorageCageDetails::getWidth, edgStorageCageDetails.getWidth())
                         .eq(EdgStorageCageDetails::getHeight, edgStorageCageDetails.getHeight()).eq(EdgStorageCageDetails::getThickness, edgStorageCageDetails.getThickness())
+                        .orderByAsc(EdgStorageCageDetails::getId).last("limit 1")
                 );
                 if (null != currentGlass) {
                     edgStorageCageDetails = currentGlass;
@@ -261,28 +283,24 @@
             edgStorageCageDetailsService.update(wrapper);
             log.info("5銆佹洿鏂板嚭鐗囩幓鐠冪殑鐘舵�佷负{}", Const.GLASS_STATE_OUT);
         }
-
-        //鐜荤拑淇℃伅鏇挎崲
-//        String glassIdChange = queryAndChangeGlass(edgStorageCageDetails.getGlassId());
-        //澶勭悊鍦ㄥ崸鐞嗗唴鐨勭幓鐠冧俊鎭細绗煎唴鐨勬暟鎹鐞�
-//        queryEdgAndChangeGlass(edgStorageCageDetails.getGlassId(), glassIdChange);
         //鐢熸垚鍑虹墖浠诲姟
         task.setGlassIdOut(edgStorageCageDetails.getGlassId());
         task.setStartCell(edgStorageCageDetails.getSlot());
         task.setTaskRunning(taskType);
-        task.setWidth((int) edgStorageCageDetails.getWidth() * 10);
-        task.setHeight((int) edgStorageCageDetails.getHeight() * 10);
-        task.setThickness((int) edgStorageCageDetails.getThickness() * 10);
-        task.setFilmRemove(0);
+
         edgStorageDeviceTaskService.updateTaskMessage(tableName, task);
         saveHistoryTask(task);
         //鏇存柊璇︽儏琛ㄤ换鍔″嚭鐗囦腑
         edgStorageCageDetailsService.update(new LambdaUpdateWrapper<EdgStorageCageDetails>()
                 .set(EdgStorageCageDetails::getState, Const.GLASS_STATE_OUT)
                 .eq(EdgStorageCageDetails::getGlassId, edgStorageCageDetails.getGlassId()));
-        //todo:纾ㄨ竟瀵瑰垪琛ㄦ柊澧炰竴鏉℃暟鎹�
+        //纾ㄨ竟瀵瑰垪琛ㄦ柊澧炰竴鏉℃暟鎹�
         EdgGlassTaskQueueInfo edgInfo = new EdgGlassTaskQueueInfo();
         BeanUtils.copyProperties(task, edgInfo);
+        edgInfo.setCreateTime(new Date());
+        edgInfo.setWidth((int) edgStorageCageDetails.getWidth());
+        edgInfo.setHeight((int) edgStorageCageDetails.getWidth());
+        edgInfo.setThickness((int) edgStorageCageDetails.getWidth());
         edgInfo.setState(Const.GLASS_STATE_NEW);
         edgGlassTaskQueueInfoService.save(edgInfo);
         return Boolean.TRUE;
@@ -297,20 +315,16 @@
         Integer cell = task.getStartCell();
         Integer state = task.getTaskState();
         task.setTaskRunning(Const.GLASS_CACHE_TYPE_EMPTY);
-//        task.setTaskState(Const.GLASS_CACHE_TYPE_EMPTY);
         task.setGlassIdOut("");
         task.setStartCell(0);
-        task.setWidth(0);
-        task.setHeight(0);
-        task.setThickness(0);
-        task.setFilmRemove(0);
         edgStorageDeviceTaskService.updateTaskMessage(tableName, task);
         edgStorageDeviceTaskHistoryService.update(new LambdaUpdateWrapper<EdgStorageDeviceTaskHistory>()
                 .eq(EdgStorageDeviceTaskHistory::getTaskState, Const.RAW_GLASS_TASK_NEW)
                 .set(EdgStorageDeviceTaskHistory::getTaskState,
                         Const.GLASS_CACHE_TYPE_FINISH.equals(state) ? Const.RAW_GLASS_TASK_SUCCESS : Const.RAW_GLASS_TASK_FAILURE)
         );
-        updateCellRemainWidth(cell);
+        int device = tableName.equals("edg_storage_device_one_task") ? 1 : 2;
+        updateCellRemainWidth(cell, device);
         return Boolean.TRUE;
     }
 
@@ -426,7 +440,7 @@
         return Boolean.TRUE;
     }
 
-    private boolean updateCellRemainWidth(int slot) {
+    private boolean updateCellRemainWidth(int slot, int device) {
         List<EdgStorageCageDetails> list = edgStorageCageDetailsService.list(new LambdaQueryWrapper<EdgStorageCageDetails>().eq(EdgStorageCageDetails::getSlot, slot)
                 .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN));
         int remainWidth = cellLength;
@@ -435,7 +449,7 @@
             remainWidth = cellLength - widthTotal >= 0 ? cellLength - widthTotal : 0;
         }
         edgStorageCageService.update(new LambdaUpdateWrapper<EdgStorageCage>().
-                set(EdgStorageCage::getRemainWidth, remainWidth).eq(EdgStorageCage::getSlot, slot));
+                set(EdgStorageCage::getRemainWidth, remainWidth).eq(EdgStorageCage::getSlot, slot).eq(EdgStorageCage::getDeviceId, device));
         return Boolean.TRUE;
     }
 }
diff --git a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/entity/EdgStorageDeviceTask.java b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/entity/EdgStorageDeviceTask.java
index dccd5ed..f0ff158 100644
--- a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/entity/EdgStorageDeviceTask.java
+++ b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/entity/EdgStorageDeviceTask.java
@@ -21,6 +21,10 @@
      */
     private String glassId;
     /**
+     * 鏄惁灏变綅
+     */
+    private Integer inPlace;
+    /**
      * 杩涚墖鐜荤拑id
      */
     private String glassIdIn;
@@ -48,22 +52,7 @@
      * 浠诲姟绫诲瀷
      */
     private Integer taskType;
-    /**
-     * 瀹�
-     */
-    private Integer width;
-    /**
-     * 楂�
-     */
-    private Integer height;
-    /**
-     * 鍘�
-     */
-    private Integer thickness;
-    /**
-     * 鏄惁闄よ啘
-     */
-    private Integer filmRemove;
+
     /**
      * 鍒涘缓鏃堕棿
      */
@@ -73,4 +62,5 @@
      */
     private Date updateTime;
 
+
 }
diff --git a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageCageDetailsMapper.xml b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageCageDetailsMapper.xml
index 3ef3805..aae437f 100644
--- a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageCageDetailsMapper.xml
+++ b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageCageDetailsMapper.xml
@@ -29,6 +29,7 @@
         select slot, min(id) as id, count(*) as glass_count
         from edg_storage_cage_details
         where state = 100
+        and device_id = #{deviceId}
         group by slot
         ),
         size_max_temp as (
@@ -50,7 +51,7 @@
                 and t.height = #{height}
             </if>
         </where>
-        order by total_count desc, glass_count, abs(t.slot - 10)
+        order by total_count desc, glass_count, abs(t.slot - #{currentSlot})
         )
         select *
         from slot_temp limit 1
diff --git a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageCageMapper.xml b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageCageMapper.xml
index f2cbc0a..4b0946d 100644
--- a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageCageMapper.xml
+++ b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageCageMapper.xml
@@ -16,7 +16,7 @@
                  left join edg_storage_cage_details t1 on t.slot = t1.slot
         where t.device_id = #{deviceId}
           and t1.state = 100
-          and t.remain_width >= #{width}
+          and t.remain_width >= GREATEST(#{width}, #{height})
           and t1.width = #{width}
           and t1.height = #{height}
           and t.enable_state = 1
diff --git a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageDeviceTaskMapper.xml b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageDeviceTaskMapper.xml
index b532cfa..8c76445 100644
--- a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageDeviceTaskMapper.xml
+++ b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageDeviceTaskMapper.xml
@@ -4,6 +4,8 @@
 
     <resultMap id="baseMap" type="com.mes.opctask.entity.EdgStorageDeviceTask">
         <id column="task_running" property="taskRunning"/>
+        <id column="glass_id" property="glassId"/>
+        <id column="in_place" property="inPlace"/>
         <id column="glass_id_in" property="glassIdIn"/>
         <id column="glass_id_out" property="glassIdOut"/>
         <id column="current_cell" property="currentCell"/>
@@ -12,10 +14,6 @@
         <id column="task_state" property="taskState"/>
         <id column="create_time" property="createTime"/>
         <id column="update_time" property="updateTime"/>
-        <id column="width" property="width"/>
-        <id column="height" property="height"/>
-        <id column="thickness" property="thickness"/>
-        <id column="film_remove" property="filmRemove"/>
     </resultMap>
 
     <select id="queryTaskMessage" resultMap="baseMap">
@@ -30,11 +28,7 @@
         glass_id_out = #{task.glassIdOut},
         current_cell = #{task.currentCell},
         start_cell = #{task.startCell},
-        end_cell = #{task.endCell},
-        width = #{task.width},
-        height = #{task.height},
-        thickness = #{task.thickness},
-        film_remove = #{task.filmRemove}
+        end_cell = #{task.endCell}
         <if test="task.taskState == 0">
             ,task_state = #{task.taskState}
         </if>
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/SlotSequenceDTO.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/SlotSequenceDTO.java
index f22b64b..1d12320 100644
--- a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/SlotSequenceDTO.java
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/SlotSequenceDTO.java
@@ -19,6 +19,10 @@
      */
     private Integer temperingLayoutId;
     /**
+     * 鐜荤拑鏁伴噺
+     */
+    private Integer glassCount;
+    /**
      * 澶х悊鐗囪鎯呬腑鏍煎瓙鍙�
      */
     private Integer slot;
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/entity/BigStorageCageHistoryTask.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/entity/BigStorageCageHistoryTask.java
new file mode 100644
index 0000000..00d36cd
--- /dev/null
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/entity/BigStorageCageHistoryTask.java
@@ -0,0 +1,55 @@
+package com.mes.bigstoragecagetask.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * (BigStorageCageHistoryTask)琛ㄥ疄浣撶被
+ *
+ * @author makejava
+ * @since 2024-11-13 22:46:49
+ */
+@Data
+public class BigStorageCageHistoryTask {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 鐜荤拑id
+     */
+    private String glassId;
+    /**
+     * 璧峰鏍煎瓙
+     */
+    private Integer startSlot;
+    /**
+     * 鐩爣鏍煎瓙
+     */
+    private Integer targetSlot;
+    /**
+     * 浠诲姟鐘舵��
+     */
+    private Integer taskState;
+    /**
+     * 鐜荤拑鏁伴噺
+     */
+    private Integer glassCount;
+    /**
+     * 浠诲姟绫诲瀷
+     */
+    private Integer taskType;
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    private Date updateTime;
+
+
+}
+
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/entity/BigStorageCageTask.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/entity/BigStorageCageTask.java
new file mode 100644
index 0000000..9af4e18
--- /dev/null
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/entity/BigStorageCageTask.java
@@ -0,0 +1,33 @@
+package com.mes.bigstoragecagetask.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+/**
+ * (BigStorageCageInOneTask)琛ㄥ疄浣撶被
+ *
+ * @author makejava
+ * @since 2024-11-08 21:40:17
+ */
+@Data
+@AllArgsConstructor
+public class BigStorageCageTask {
+    /**
+     * 鐜荤拑id
+     */
+    private String glassId;
+    /**
+     * 璧峰鏍煎瓙
+     */
+    private Integer startSlot;
+    /**
+     * 鐩爣鏍煎瓙
+     */
+    private Integer targetSlot;
+    /**
+     * 浠诲姟鐘舵��
+     */
+    private Integer taskState;
+
+}
+
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/mapper/BigStorageCageHistoryTaskMapper.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/mapper/BigStorageCageHistoryTaskMapper.java
new file mode 100644
index 0000000..72c7848
--- /dev/null
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/mapper/BigStorageCageHistoryTaskMapper.java
@@ -0,0 +1,16 @@
+package com.mes.bigstoragecagetask.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.mes.bigstoragecagetask.entity.BigStorageCageHistoryTask;
+
+/**
+ * (BigStorageCageHistoryTask)琛ㄦ暟鎹簱璁块棶灞�
+ *
+ * @author makejava
+ * @since 2024-11-13 22:46:47
+ */
+public interface BigStorageCageHistoryTaskMapper extends BaseMapper<BigStorageCageHistoryTask> {
+
+}
+
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/mapper/BigStorageCageTaskMapper.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/mapper/BigStorageCageTaskMapper.java
new file mode 100644
index 0000000..6681b66
--- /dev/null
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/mapper/BigStorageCageTaskMapper.java
@@ -0,0 +1,24 @@
+package com.mes.bigstoragecagetask.mapper;
+
+import com.mes.bigstoragecagetask.entity.BigStorageCageTask;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * (BigStorageCageInOneTask)琛ㄦ暟鎹簱璁块棶灞�
+ *
+ * @author makejava
+ * @since 2024-11-08 21:40:15
+ */
+public interface BigStorageCageTaskMapper {
+
+    List<BigStorageCageTask> queryTaskMessage(String tableName);
+
+    boolean updateTaskMessage(@Param("tableName") String tableName, @Param("task") BigStorageCageTask bigStorageCageInTask);
+
+    int saveTaskMessage(@Param("tableName") String tableName, @Param("list") List<BigStorageCageTask> taskList);
+
+    int removeAll(String tableName);
+}
+
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/BigStorageCageHistoryTaskService.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/BigStorageCageHistoryTaskService.java
new file mode 100644
index 0000000..10d25f1
--- /dev/null
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/BigStorageCageHistoryTaskService.java
@@ -0,0 +1,16 @@
+package com.mes.bigstoragecagetask.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.mes.bigstoragecagetask.entity.BigStorageCageHistoryTask;
+
+/**
+ * (BigStorageCageHistoryTask)琛ㄦ湇鍔℃帴鍙�
+ *
+ * @author makejava
+ * @since 2024-11-13 22:46:53
+ */
+public interface BigStorageCageHistoryTaskService extends IService<BigStorageCageHistoryTask> {
+
+}
+
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/BigStorageCageTaskService.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/BigStorageCageTaskService.java
new file mode 100644
index 0000000..0a5b186
--- /dev/null
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/BigStorageCageTaskService.java
@@ -0,0 +1,25 @@
+package com.mes.bigstoragecagetask.service;
+
+import com.mes.bigstoragecagetask.entity.BigStorageCageTask;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * (BigStorageCageInOneTask)琛ㄦ湇鍔℃帴鍙�
+ *
+ * @author makejava
+ * @since 2024-11-08 21:40:20
+ */
+public interface BigStorageCageTaskService {
+
+
+    List<BigStorageCageTask> queryTaskMessage(String tableName);
+
+    boolean updateTaskMessage(@Param("tableName") String tableName, @Param("task") BigStorageCageTask bigStorageCageInTask);
+
+    int saveTaskMessage(@Param("tableName") String tableName, List<BigStorageCageTask> taskList);
+
+    int removeAll(@Param("tableName") String tableName);
+}
+
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/impl/BigStorageCageHistoryTaskServiceImpl.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/impl/BigStorageCageHistoryTaskServiceImpl.java
new file mode 100644
index 0000000..b050fe9
--- /dev/null
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/impl/BigStorageCageHistoryTaskServiceImpl.java
@@ -0,0 +1,20 @@
+package com.mes.bigstoragecagetask.service.impl;
+
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.mes.bigstoragecagetask.entity.BigStorageCageHistoryTask;
+import com.mes.bigstoragecagetask.mapper.BigStorageCageHistoryTaskMapper;
+import com.mes.bigstoragecagetask.service.BigStorageCageHistoryTaskService;
+import org.springframework.stereotype.Service;
+
+/**
+ * (BigStorageCageHistoryTask)琛ㄦ湇鍔″疄鐜扮被
+ *
+ * @author makejava
+ * @since 2024-11-13 22:46:56
+ */
+@Service
+public class BigStorageCageHistoryTaskServiceImpl extends ServiceImpl<BigStorageCageHistoryTaskMapper, BigStorageCageHistoryTask> implements BigStorageCageHistoryTaskService {
+
+}
+
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/impl/BigStorageCageTaskServiceImpl.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/impl/BigStorageCageTaskServiceImpl.java
new file mode 100644
index 0000000..af12d05
--- /dev/null
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/impl/BigStorageCageTaskServiceImpl.java
@@ -0,0 +1,43 @@
+package com.mes.bigstoragecagetask.service.impl;
+
+import com.mes.bigstoragecagetask.entity.BigStorageCageTask;
+import com.mes.bigstoragecagetask.mapper.BigStorageCageTaskMapper;
+import com.mes.bigstoragecagetask.service.BigStorageCageTaskService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * (BigStorageCageInOneTask)琛ㄦ湇鍔″疄鐜扮被
+ *
+ * @author makejava
+ * @since 2024-11-08 21:40:23
+ */
+@Service
+public class BigStorageCageTaskServiceImpl implements BigStorageCageTaskService {
+
+    @Resource
+    BigStorageCageTaskMapper bigStorageCageInTaskMapper;
+
+    @Override
+    public List<BigStorageCageTask> queryTaskMessage(String tableName) {
+        return bigStorageCageInTaskMapper.queryTaskMessage(tableName);
+    }
+
+    @Override
+    public boolean updateTaskMessage(String tableName, BigStorageCageTask bigStorageCageTask) {
+        return bigStorageCageInTaskMapper.updateTaskMessage(tableName, bigStorageCageTask);
+    }
+
+    @Override
+    public int saveTaskMessage(String tableName, List<BigStorageCageTask> taskList) {
+        return bigStorageCageInTaskMapper.saveTaskMessage(tableName, taskList);
+    }
+
+    @Override
+    public int removeAll(String tableName) {
+        return bigStorageCageInTaskMapper.removeAll(tableName);
+    }
+}
+
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/OpcPlcStorageCageTask.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/OpcPlcStorageCageTask.java
index 97f5f85..000af98 100644
--- a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/OpcPlcStorageCageTask.java
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/OpcPlcStorageCageTask.java
@@ -1,27 +1,37 @@
 package com.mes.job;
 
+import cn.hutool.core.lang.Assert;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
-import com.kangaroohy.milo.runner.subscription.SubscriptionCallback;
+import com.github.yulichang.toolkit.JoinWrappers;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.kangaroohy.milo.model.ReadWriteEntity;
 import com.kangaroohy.milo.service.MiloService;
+import com.mes.base.entity.BigStorageCageBaseInfo;
 import com.mes.bigstorage.entity.BigStorageCage;
 import com.mes.bigstorage.entity.BigStorageCageDetails;
+import com.mes.bigstorage.entity.BigStorageDTO;
+import com.mes.bigstorage.entity.dto.SlotSequenceDTO;
+import com.mes.bigstorage.entity.dto.TemperingLayoutDTO;
 import com.mes.bigstorage.service.BigStorageCageDetailsService;
 import com.mes.bigstorage.service.BigStorageCageService;
-import com.mes.bigstoragetask.entity.BigStorageCageFeedTask;
-import com.mes.bigstoragetask.entity.BigStorageCageOutTask;
+import com.mes.bigstoragecagetask.entity.BigStorageCageHistoryTask;
+import com.mes.bigstoragecagetask.entity.BigStorageCageTask;
+import com.mes.bigstoragecagetask.service.BigStorageCageHistoryTaskService;
+import com.mes.bigstoragecagetask.service.BigStorageCageTaskService;
 import com.mes.bigstoragetask.entity.UpdateBigStorageCageDTO;
-import com.mes.bigstoragetask.service.BigStorageCageFeedTaskService;
-import com.mes.bigstoragetask.service.BigStorageCageOutTaskService;
 import com.mes.common.config.Const;
 import com.mes.damage.entity.Damage;
 import com.mes.damage.service.DamageService;
-import com.mes.edgglasstask.service.EdgGlassTaskInfoService;
+import com.mes.glassinfo.entity.GlassInfo;
 import com.mes.glassinfo.service.GlassInfoService;
+import com.mes.temperingglass.entity.TemperingGlass;
 import com.mes.temperingglass.entity.TemperingGlassInfo;
-import com.mes.temperingglass.service.TemperingGlassInfoService;
+import com.mes.temperingglass.service.TemperingGlassService;
+import com.mes.utils.RedisUtil;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -38,32 +48,26 @@
 @Component
 @Slf4j
 public class OpcPlcStorageCageTask {
-
-    @Resource
-    private BigStorageCageService bigStorageCageService;
     @Resource
     private BigStorageCageDetailsService bigStorageCageDetailsService;
     @Resource
-    private GlassInfoService glassInfoService;
-    @Resource
-    private BigStorageCageFeedTaskService bigStorageCageFeedTaskService;
-    @Resource
-    private BigStorageCageOutTaskService bigStorageCageOutTaskService;
-    @Resource
-    private EdgGlassTaskInfoService edgGlassTaskInfoService;
-    @Resource
-    private TemperingGlassInfoService temperingGlassInfoService;
+    private TemperingGlassService temperingGlassService;
     @Resource
     private DamageService damageService;
+    @Resource
+    private GlassInfoService glassInfoService;
+    @Resource
+    private BigStorageCageService bigStorageCageService;
+    @Resource
+    private BigStorageCageHistoryTaskService bigStorageCageHistoryTaskService;
+    @Resource
+    private BigStorageCageTaskService bigStorageCageTaskService;
 
     @Autowired(required = false)
     MiloService miloService;
 
-    @Resource(name = "bigStorageStartCallback")
-    SubscriptionCallback bigStorageStartCallback;
-
-    @Value("${mes.carWidth}")
-    private Integer carWidth;
+    @Resource
+    private RedisUtil redisUtil;
 
     @Value("${mes.slotWidth}")
     private Integer slotWidth;
@@ -71,200 +75,461 @@
     @Value("${mes.glassGap}")
     private Integer glassGap;
 
-//    @Scheduled(fixedDelay = Long.MAX_VALUE)
-    public void startOpcTask() throws Exception {
-        //璁惧涓�浜岀殑杩涚墖璇锋眰
-        miloService.subscriptionFromOpcUa(Arrays.asList("my.device01.x1", "my.device02.x1"), bigStorageStartCallback);
+    @Value("${mes.carWidth}")
+    private Integer carWidth;
+
+    @Value("${mes.outCarMaxSize}")
+    private Integer outCarMaxSize;
+
+    @Value("${mes.sequence.order}")
+    private boolean sequenceOrder;
+
+
+    @Scheduled(fixedDelay = 1000)
+    public void inBigStorageTask() throws Exception {
+        ReadWriteEntity inkageEntity = miloService.readFromOpcUa("DLP1A.DLP1A.mesControl");
+        if (true != Boolean.parseBoolean(inkageEntity.getValue() + "")) {
+            log.info("褰撳墠涓洪潪鑱旀満鐘舵�侊紝缁撴潫杩涚墖浠诲姟");
+            return;
+        }
+        ReadWriteEntity requestEntity = miloService.readFromOpcUa("DLP1A.DLP1A.RequestMes");
+        if (!"1".equals(requestEntity.getValue() + "")) {
+            log.info("褰撳墠鏈敹鍒拌繘鐗囪姹傦紝缁撴潫杩涚墖浠诲姟");
+            return;
+        }
+        ReadWriteEntity mesReplyEntity = miloService.readFromOpcUa("DLP1A.DLP1A.MesReply");
+        if ("1".equals(mesReplyEntity.getValue() + "")) {
+            log.info("鏈夋鍦ㄦ墽琛岀殑浠诲姟锛岀粨鏉熻繘鐗囦换鍔�");
+            return;
+        }
+        //鑾峰彇杩涚墖浠诲姟琛�
+        List<BigStorageCageTask> inTaskList = bigStorageCageTaskService.queryTaskMessage("big_storage_cage_in_one_task");
+        if (CollectionUtils.isEmpty(inTaskList)) {
+            log.info("褰撳墠澶ц溅鏃犺繘鐗囩幓鐠冿紝缁撴潫杩涚墖浠诲姟");
+        }
+        List<String> glassIdList = inTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList());
+        log.info("鑾峰彇浠诲姟鐨勭幓鐠僫d锛歿}", glassIdList);
+        List<GlassInfo> glassInfoList = glassInfoService.list(new LambdaQueryWrapper<GlassInfo>().in(GlassInfo::getGlassId, glassIdList));
+        Map<String, List<GlassInfo>> glassListMap = glassInfoList.stream().collect(Collectors.groupingBy(GlassInfo::getGlassId));
+
+        //璁$畻鐩爣鏍煎瓙
+        List<BigStorageCageHistoryTask> historyTasks = new ArrayList<>();
+        for (BigStorageCageTask task : inTaskList) {
+            GlassInfo info = glassListMap.get(task.getGlassId()).get(0);
+            //鑾峰彇鐩爣鏍煎瓙淇℃伅
+            BigStorageDTO bigStorageDTO = bigStorageCageDetailsService.queryTargetSlotByTempering(info);
+//            涓存椂鏇存柊鏍煎瓙鐨勫墿浣欏昂瀵革細闃叉鐩搁偦鐜荤拑杩涘悓涓�鏍煎瓙閫犳垚鍓╀綑灏哄涓嶈冻锛岀幓鐠冭秺鐣岀殑鎯呭喌锛屼换鍔″畬鎴愬悗鍐嶆鏇存柊澶х悊鐗囩琛ㄥ墿浣欏搴︼紙鎸夌収绗煎唴鐜荤拑鏁伴噺鏇存柊澶х悊鐗囩鍓╀綑灏哄锛�
+            bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>()
+                    .set(BigStorageCage::getRemainWidth, bigStorageDTO.getWidth() - Math.max(info.getWidth(), info.getHeight()) - glassGap)
+                    .eq(BigStorageCage::getSlot, bigStorageDTO.getSlot()));
+            task.setTargetSlot(bigStorageDTO.getSlot());
+            task.setGlassId(info.getGlassId());
+            bigStorageCageTaskService.updateTaskMessage("big_storage_cage_in_one_task", task);
+            //瀛樻斁鍘嗗彶浠诲姟
+            BigStorageCageHistoryTask historyTask = new BigStorageCageHistoryTask();
+            BeanUtils.copyProperties(task, historyTask);
+            historyTask.setTaskType(Const.BIG_STORAGE_BEFORE_IN);
+            historyTask.setGlassCount(glassInfoList.size());
+            historyTask.setTaskState(Const.ENGINEERING_NEW);
+            historyTasks.add(historyTask);
+            BigStorageCageDetails cageDetails = new BigStorageCageDetails();
+            BeanUtils.copyProperties(info, cageDetails);
+            cageDetails.setSlot(bigStorageDTO.getSlot());
+            cageDetails.setState(Const.GLASS_STATE_NEW);
+            cageDetails.setDeviceId(bigStorageDTO.getDeviceId());
+            cageDetails.setGap(glassGap);
+            cageDetails.setId(null);
+            bigStorageCageDetailsService.save(cageDetails);
+        }
+        //鍘嗗彶鏁版嵁鍏ュ簱
+        bigStorageCageHistoryTaskService.saveBatch(historyTasks);
+        //鍚憃pc鍙戦�佸惎鍔ㄤ俊鍙�
+        miloService.writeToOpcWord(generateReadWriteEntity("DLP1A.DLP1A.MesReply", 1));
     }
 
-//    @Scheduled(fixedDelay = Long.MAX_VALUE)
-    public void outOpcTask() throws Exception {
-        //璁惧1鐨勫嚭鐗囪姹�
-        miloService.subscriptionFromOpcUa(Arrays.asList("my.device03.x1"), bigStorageStartCallback);
-    }
-
-
-//    @Scheduled(fixedDelay = 300)
-    public void updateInGlassStateTask() {
+    @Scheduled(fixedDelay = 1000)
+    public void outBigStorageTask() throws Exception {
         Date startDate = new Date();
-        log.info("1銆佸ぇ鐞嗙墖绗艰繘鐗囧畬鎴愬悗鏇存柊澶х悊鐗囩鏁版嵁浠诲姟寮�濮嬫墽琛屾椂闂达細{}", startDate);
-        //鍥犱负澶х悊鐗囩鍜屽嚭鐗囦换鍔℃槸涓や釜搴撶殑鏁版嵁锛屾墍浠ヨ鍒嗗紑鏌ユ壘
-        List<Object> list = bigStorageCageDetailsService.listObjs(new LambdaQueryWrapper<BigStorageCageDetails>()
-                .select(BigStorageCageDetails::getGlassId).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_NEW));
-        if (CollectionUtils.isNotEmpty(list)) {
-            log.info("2銆佽幏鍙栨墍鏈夋鍦ㄨ繘鐗囩殑鐜荤拑淇℃伅id:{}", list);
-            List<String> glassIds = list.stream().map(String::valueOf).collect(Collectors.toList());
-            List<BigStorageCageFeedTask> inSuccessGlass = bigStorageCageFeedTaskService.list(new LambdaQueryWrapper<BigStorageCageFeedTask>()
-                    .in(BigStorageCageFeedTask::getGlassId, glassIds)
-                    .in(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT));
-            if (CollectionUtils.isNotEmpty(inSuccessGlass)) {
-                log.info("3銆佽幏鍙栬繘鐗囧凡瀹屾垚鐨勭幓鐠冧俊鎭痠d:{}", inSuccessGlass);
-                List<Integer> inSuccessGlassSlot = inSuccessGlass.stream().map(BigStorageCageFeedTask::getTargetSlot).collect(Collectors.toList());
-                List<UpdateBigStorageCageDTO> storageCageDTOList = inSuccessGlass.stream().map(e -> {
+        ReadWriteEntity inkageEntity = miloService.readFromOpcUa("DLP1B.DLP1B.mesControl");
+        if (true != Boolean.parseBoolean(inkageEntity.getValue() + "")) {
+            log.info("褰撳墠涓洪潪鑱旀満鐘舵�侊紝缁撴潫杩涚墖浠诲姟");
+            return;
+        }
+        ReadWriteEntity requestEntity = miloService.readFromOpcUa("DLP1B.DLP1B.RequestMes");
+        if (!"1".equals(requestEntity.getValue() + "")) {
+            log.info("褰撳墠鏈敹鍒板嚭鐗囪姹傦紝缁撴潫鍑虹墖浠诲姟");
+            return;
+        }
+        //鑾峰彇鍑虹墖浠诲姟琛�
+        List<BigStorageCageTask> outTaskList = bigStorageCageTaskService.queryTaskMessage("big_storage_cage_out_one_task");
+        if (CollectionUtils.isNotEmpty(outTaskList)) {
+            log.info("鏈夋鍦ㄦ墽琛岀殑鍑虹墖浠诲姟锛岀粨鏉熸湰娆″嚭鐗囦换鍔�");
+            return;
+        }
+        //todo:鏄惁鍏佽閽㈠寲
+        if (redisUtil.getCacheObject("temperingSwitch")) {
+            //鏄惁鏈夋鍦ㄩ挗鍖栫殑鐜荤拑:閽㈠寲灏忕墖琛ㄥ叧鑱斿巻鍙蹭换鍔¤〃锛岀瓫閫夋湭鍑虹鐨勭幓鐠冧俊鎭�
+            List<TemperingGlass> temperingGlassList = temperingGlassService.selectJoinList(TemperingGlass.class, new MPJLambdaWrapper<TemperingGlass>()
+                    .selectAll(TemperingGlass.class)
+                    .leftJoin(BigStorageCageHistoryTask.class, BigStorageCageHistoryTask::getGlassId, TemperingGlass::getGlassId)
+                    .eq(TemperingGlass::getState, Const.TEMPERING_NEW)
+                    .eq(BigStorageCageHistoryTask::getTaskType, Const.BIG_STORAGE_BEFORE_OUT)
+                    .isNull(BigStorageCageHistoryTask::getGlassId)
+                    .orderBy(Boolean.TRUE, sequenceOrder, TemperingGlass::getTemperingFeedSequence));
+            //todo:鍘嗗彶浠诲姟琛�
+            if (CollectionUtils.isNotEmpty(temperingGlassList)) {
+                log.info("鏈夋鍦ㄥ嚭鐗囩殑閽㈠寲浠诲姟");
+                computeOutGlassInfo(temperingGlassList, "big_storage_cage_out_one_task", Const.TEMPERING_OUT_TARGET_POSITION, Const.GLASS_STATE_OUT_ING, Const.BIG_STORAGE_BEFORE_OUT);
+                Date endDate = new Date();
+                log.info("澶х悊鐗囩鍑虹墖浠诲姟缁撴潫鏃堕棿锛歿}锛屽叡鑰楁椂锛歿}ms,缁撴潫鎵爜浠诲姟", endDate, endDate.getTime() - startDate.getTime());
+                return;
+            }
+            //閽㈠寲浼樺厛锛氳幏鍙栫悊鐗囩  鐜荤拑灏忕墖  鐮存崯琛� 鏁伴噺   鍒ゆ柇绗煎唴鐗堝浘鏄惁鍒伴綈
+            List<TemperingLayoutDTO> temperingLayoutDTOList = bigStorageCageDetailsService.temperingIsAll();
+            if (CollectionUtils.isNotEmpty(temperingLayoutDTOList)) {
+                //鐜荤拑鍒伴綈鍖呮嫭宸插嚭鐗囩殑
+                //鍒伴綈锛屽皢鐜荤拑灏忕墖鏁版嵁瀛樺叆閽㈠寲灏忕墖琛紝閫昏緫鐢熸垚鍑虹墖浠诲姟  缁撴潫
+                for (TemperingLayoutDTO item : temperingLayoutDTOList) {
+//                    if (item.getEngineerId().equals(redisUtil.getCacheObject("temperingengineerId"))) {
+                    List<TemperingGlass> temperingGlassInfos = glassInfoService.selectJoinList(TemperingGlass.class, JoinWrappers.lambda(GlassInfo.class)
+                            .selectAll(GlassInfo.class)
+                            .select("-1 as state")
+                            .selectAs(BigStorageCageDetails::getSlot, TemperingGlassInfo::getSlot)
+                            .innerJoin(BigStorageCageDetails.class, BigStorageCageDetails::getGlassId, GlassInfo::getGlassId)
+                            .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN)
+                            .eq(GlassInfo::getTemperingLayoutId, item.getTemperingLayoutId())
+                            .eq(GlassInfo::getEngineerId, item.getEngineerId())
+                            .orderBy(Boolean.TRUE, sequenceOrder, GlassInfo::getTemperingFeedSequence));
+                    if (CollectionUtils.isNotEmpty(temperingGlassInfos)) {
+                        temperingGlassService.saveBatch(temperingGlassInfos);
+                        computeOutGlassInfo(temperingGlassInfos, "big_storage_cage_out_one_task", Const.TEMPERING_OUT_TARGET_POSITION, Const.GLASS_STATE_OUT_ING, Const.BIG_STORAGE_BEFORE_OUT);
+                        Date endDate = new Date();
+                        log.info("澶х悊鐗囩鍑虹墖浠诲姟缁撴潫鏃堕棿锛歿}锛屽叡鑰楁椂锛歿}ms,缁撴潫鎵爜浠诲姟", endDate, endDate.getTime() - startDate.getTime());
+                        return;
+                    }
+//                    }
+                }
+            }
+        }
+        //鏄惁鏈変汉宸ヤ笅鐗囦换鍔�   鏈夌洿鎺ュ嚭
+        List<BigStorageCageDetails> artificialList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>()
+                .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_ARTIFICIAL)
+                .orderByAsc(BigStorageCageDetails::getSlot)
+                .orderByDesc(BigStorageCageDetails::getId));
+        if (CollectionUtils.isNotEmpty(artificialList)) {
+            computeOutGlassInfo(artificialList, "big_storage_cage_out_one_task", Const.ARTIFICIAL_OUT_TARGET_POSITION, Const.GLASS_STATE_OUT_ING, Const.BIG_STORAGE_BEFORE_OUT);
+            Date endDate = new Date();
+            log.info("澶х悊鐗囩鍑虹墖浠诲姟缁撴潫鏃堕棿锛歿}锛屽叡鑰楁椂锛歿}ms,缁撴潫鎵爜浠诲姟", endDate, endDate.getTime() - startDate.getTime());
+            return;
+        }
+        //鏄惁瀛樺湪闇�瑕佸唴閮ㄨ皟搴︾殑鏍煎瓙:鎵ц鍐呴儴璋冨害浠诲姟
+        List<TemperingLayoutDTO> temperingOccupySlotList = bigStorageCageDetailsService.queryTemperingOccupySlot();
+        if (CollectionUtils.isNotEmpty(temperingOccupySlotList)) {
+            loop:
+            for (TemperingLayoutDTO temperingOccupySlot : temperingOccupySlotList) {
+                List<SlotSequenceDTO> slotSequenceList = bigStorageCageDetailsService.queryGlassMaxAndMin(temperingOccupySlot.getEngineerId(), temperingOccupySlot.getTemperingLayoutId());
+                for (int i = 0; i < slotSequenceList.size() - 1; i++) {
+                    SlotSequenceDTO first = slotSequenceList.get(i);
+                    SlotSequenceDTO second = slotSequenceList.get(i + 1);
+                    int slotWidth = carWidth - first.getRemainWidth() - glassGap;
+                    int totalCount = first.getGlassCount() + second.getGlassCount();
+                    if (totalCount <= 6 && first.getMinSequence() == second.getMaxSequence() + 1
+                            && second.getRemainWidth() > slotWidth && slotWidth >= 0) {
+
+                        List<BigStorageCageDetails> list = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>()
+                                .eq(BigStorageCageDetails::getSlot, first.getSlot()).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN)
+                                .orderBy(Boolean.TRUE, sequenceOrder, BigStorageCageDetails::getTemperingFeedSequence));
+                        if (CollectionUtils.isNotEmpty(list)) {
+                            computeOutGlassInfo(list, "big_storage_cage_out_one_task", second.getSlot(), Const.GLASS_STATE_SCHEDULE_ING, Const.BIG_STORAGE_BEFORE_DISPATCH);
+                        }
+                        updateSlotRemainBySlots(Arrays.asList(second.getSlot()));
+                        break loop;
+                    }
+                }
+            }
+        }
+        Date endDate = new Date();
+        log.info("澶х悊鐗囩鍑虹墖浠诲姟缁撴潫鏃堕棿锛歿}锛屽叡鑰楁椂锛歿}ms,缁撴潫鎵爜浠诲姟", endDate, endDate.getTime() - startDate.getTime());
+        return;
+    }
+
+    @Scheduled(fixedDelay = 1000)
+    public void finishInBigStorageTask() throws Exception {
+        ReadWriteEntity inkageEntity = miloService.readFromOpcUa("DLP1A.DLP1A.mesControl");
+        if (true != Boolean.parseBoolean(inkageEntity.getValue() + "")) {
+            log.info("褰撳墠涓洪潪鑱旀満鐘舵�侊紝缁撴潫瀹屾垚杩涚墖浠诲姟");
+            return;
+        }
+        //鑾峰彇杩涚墖浠诲姟琛�
+        List<BigStorageCageTask> inTaskList = bigStorageCageTaskService.queryTaskMessage("big_storage_cage_in_one_task");
+        if (CollectionUtils.isEmpty(inTaskList)) {
+            log.info("褰撳墠澶ц溅鏃犺繘鐗囩幓鐠冿紝缁撴潫瀹屾垚杩涚墖浠诲姟");
+            return;
+        }
+        List<BigStorageCageTask> unFinishTaskList = inTaskList.stream().filter(e -> e.getTaskState() <= 1 || e.getStartSlot() == 0).collect(Collectors.toList());
+        if (CollectionUtils.isNotEmpty(unFinishTaskList)) {
+            log.info("瀛樺湪鏈畬鎴愮殑鐜荤拑淇℃伅,鐜荤拑锛歿}", unFinishTaskList);
+            return;
+        }
+        Map<Integer, List<BigStorageCageTask>> taskMap = inTaskList.stream().collect(Collectors.groupingBy(BigStorageCageTask::getTaskState));
+        //鎸夌収浠诲姟鐘舵�佷慨鏀瑰ぇ鐞嗙墖绗煎唴鐨勭幓鐠冩暟鎹�
+//        閲嶆柊璁$畻澶х悊鐗囩鍐呯殑鍓╀綑灏哄
+        taskMap.forEach((e1, v) -> {
+            if (e1 == 2) {
+                //杩涚墖瀹屾垚
+                log.info("3銆佽幏鍙栬繘鐗囧凡瀹屾垚鐨勭幓鐠冧俊鎭痠d:{}", v);
+                List<Integer> inSuccessGlassSlot = v.stream().map(BigStorageCageTask::getTargetSlot).collect(Collectors.toList());
+                List<UpdateBigStorageCageDTO> storageCageDTOList = v.stream().map(e -> {
                     UpdateBigStorageCageDTO storageCageDTO = new UpdateBigStorageCageDTO();
                     BeanUtils.copyProperties(e, storageCageDTO);
                     return storageCageDTO;
                 }).collect(Collectors.toList());
                 bigStorageCageDetailsService.updateBySlot(storageCageDTOList, Const.GLASS_STATE_IN);
-                log.info("4銆佸ぇ鐞嗙墖绗艰繘鐗囩姸鎬佸凡瀹屾垚宸插畬鎴愮殑鐜荤拑淇℃伅id:{}", inSuccessGlass);
-                //鏇存柊鐞嗙墖绗肩幓鐠冨昂瀵�
+                log.info("4銆佸ぇ鐞嗙墖绗艰繘鐗囩姸鎬佸凡瀹屾垚宸插畬鎴愮殑鐜荤拑淇℃伅id:{}", v);
                 updateSlotRemainBySlots(inSuccessGlassSlot);
-                log.info("5銆佸ぇ鐞嗙墖绗艰繘鐗囩洰鏍囨牸瀛愬昂瀵告洿鏂板畬鎴�");
+            } else if (e1 == 3) {
+                //鐮存崯澶勭悊
+                dealDamageInTask(v);
+            } else {
+                //娓呯┖鐞嗙墖绗肩┖鏁版嵁
+                noDealInTask(v);
             }
-
+        });
+        for (BigStorageCageTask item : inTaskList) {
+            //鏇存柊鍘嗗彶浠诲姟琛ㄤ腑鐨勪换鍔$姸鎬�
+            bigStorageCageHistoryTaskService.update(new LambdaUpdateWrapper<BigStorageCageHistoryTask>()
+                    .set(BigStorageCageHistoryTask::getTaskState, item.getTaskState())
+                    .eq(BigStorageCageHistoryTask::getTaskType, Const.BIG_STORAGE_BEFORE_IN)
+                    .eq(BigStorageCageHistoryTask::getTargetSlot, item.getTargetSlot())
+                    .eq(BigStorageCageHistoryTask::getGlassId, item.getGlassId()));
+            item.setTargetSlot(0);
+            //娓呯┖浠诲姟琛ㄦ暟鎹�
+            bigStorageCageTaskService.updateTaskMessage("big_storage_cage_in_one_task", item);
         }
-        Date endDate = new Date();
-        log.info("end:澶х悊鐗囩杩涚墖瀹屾垚鍚庢洿鏂板ぇ鐞嗙墖绗兼暟鎹换鍔$粨鏉熸椂闂达細{}锛屽叡鑰楁椂锛歿}ms,缁撴潫浠诲姟", endDate, endDate.getTime() - startDate.getTime());
-        return;
-
+        //娓呯┖鍚姩鐘舵��
+        //鍚憃pc鍙戦�佸惎鍔ㄤ俊鍙�
+        miloService.writeToOpcWord(generateReadWriteEntity("DLP1A.DLP1A.MesReply", 0));
     }
 
-//    @Scheduled(fixedDelay = 300)
-    public void updateOutGlassStateTask() {
-        Date startDate = new Date();
-        log.info("1銆佸ぇ鐞嗙墖绗煎嚭鐗囧畬鎴愬悗鏇存柊澶х悊鐗囩鏁版嵁浠诲姟寮�濮嬫墽琛屾椂闂达細{}", startDate);
-        //鍥犱负澶х悊鐗囩鍜屽嚭鐗囦换鍔℃槸涓や釜搴撶殑鏁版嵁锛屾墍浠ヨ鍒嗗紑鏌ユ壘
-        List<Object> list = bigStorageCageDetailsService.listObjs(new LambdaQueryWrapper<BigStorageCageDetails>()
-                .select(BigStorageCageDetails::getGlassId).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT_ING));
-        if (CollectionUtils.isNotEmpty(list)) {
-            log.info("2銆佽幏鍙栨墍鏈夋鍦ㄥ嚭鐗囩殑鐜荤拑淇℃伅id:{}", list);
-            List<String> glassIds = list.stream().map(String::valueOf).collect(Collectors.toList());
-            List<BigStorageCageOutTask> outSuccessGlass = bigStorageCageOutTaskService.list(new LambdaQueryWrapper<BigStorageCageOutTask>()
-                    .in(BigStorageCageOutTask::getGlassId, glassIds).in(BigStorageCageOutTask::getTaskState, Const.BIG_STORAGE_OUT_ALL));
-            if (CollectionUtils.isNotEmpty(outSuccessGlass)) {
-                for (BigStorageCageOutTask bigStorageCageOutTask : outSuccessGlass
-                ) {
-                    if (bigStorageCageOutTask.getEndSlot().equals(Const.ARTIFICIAL_OUT_TARGET_POSITION)) {
-                        temperingGlassInfoService.update(
-                                new LambdaUpdateWrapper<TemperingGlassInfo>()
-                                        .set(TemperingGlassInfo::getState, Const.TEMPERING_END)
-                                        .eq(TemperingGlassInfo::getGlassId, bigStorageCageOutTask.getGlassId())
-                        );
-                    }
+    @Scheduled(fixedDelay = 1000)
+    public void finishOutBigStorageTask() throws Exception {
+//        ReadWriteEntity inkageEntity = miloService.readFromOpcUa("DLP1B.DLP1B.mesControl");
+//        if (true != Boolean.parseBoolean(inkageEntity.getValue() + "")) {
+//            log.info("褰撳墠涓洪潪鑱旀満鐘舵�侊紝缁撴潫瀹屾垚鍑虹墖浠诲姟");
+//            return;
+//        }
+        //鑾峰彇杩涚墖浠诲姟琛�
+        List<BigStorageCageTask> outTaskList = bigStorageCageTaskService.queryTaskMessage("big_storage_cage_out_one_task");
+        if (CollectionUtils.isEmpty(outTaskList)) {
+            log.info("褰撳墠澶ц溅鏃犺繘鐗囩幓鐠冿紝缁撴潫瀹屾垚杩涚墖浠诲姟");
+            return;
+        }
+        List<BigStorageCageTask> unFinishTaskList = outTaskList.stream().filter(e -> e.getTaskState() <= 1 || e.getStartSlot() == 0).collect(Collectors.toList());
+        if (CollectionUtils.isNotEmpty(unFinishTaskList)) {
+            log.info("瀛樺湪鏈畬鎴愮殑鐜荤拑淇℃伅,鐜荤拑锛歿}", unFinishTaskList);
+            return;
+        }
+        Map<Integer, List<BigStorageCageTask>> taskMap = outTaskList.stream().collect(Collectors.groupingBy(BigStorageCageTask::getTaskState));
+        int taskType = 0;
+        if (Const.OUT_TARGET_POSITION_ALL.contains(outTaskList.get(0).getTargetSlot())) {
+            taskType = Const.BIG_STORAGE_BEFORE_OUT;
+        } else {
+            taskType = Const.BIG_STORAGE_BEFORE_DISPATCH;
+        }
+        //鎸夌収浠诲姟鐘舵�佷慨鏀瑰ぇ鐞嗙墖绗煎唴鐨勭幓鐠冩暟鎹�
+//        閲嶆柊璁$畻澶х悊鐗囩鍐呯殑鍓╀綑灏哄
+        Integer finalTaskType = taskType;
+        taskMap.forEach((e1, v) -> {
+            if (e1 == 2) {
+                //杩涚墖瀹屾垚
+                log.info("3銆佽幏鍙栬繘鐗囧凡瀹屾垚鐨勭幓鐠冧俊鎭痠d:{}", v);
+                List<Integer> outSuccessGlassSlot = new ArrayList<>();
+                if (finalTaskType.equals(Const.BIG_STORAGE_BEFORE_OUT)) {
+                    outSuccessGlassSlot = v.stream().map(BigStorageCageTask::getStartSlot).collect(Collectors.toList());
+                } else {
+                    outSuccessGlassSlot = v.stream().map(BigStorageCageTask::getTargetSlot).collect(Collectors.toList());
                 }
-                log.info("3銆佽幏鍙栧嚭鐗囧凡瀹屾垚鐨勭幓鐠冧俊鎭痠d:{}", outSuccessGlass);
-                List<UpdateBigStorageCageDTO> storageCageDTOList = outSuccessGlass.stream().map(e -> {
+                List<UpdateBigStorageCageDTO> storageCageDTOList = v.stream().map(e -> {
                     UpdateBigStorageCageDTO storageCageDTO = new UpdateBigStorageCageDTO();
                     storageCageDTO.setGlassId(e.getGlassId());
-                    storageCageDTO.setTargetSlot(e.getStartSlot());
+                    if (finalTaskType.equals(Const.BIG_STORAGE_BEFORE_OUT)) {
+                        storageCageDTO.setTargetSlot(e.getStartSlot());
+                    } else {
+                        storageCageDTO.setTargetSlot(e.getTargetSlot());
+                    }
                     return storageCageDTO;
                 }).collect(Collectors.toList());
-                bigStorageCageDetailsService.updateBySlot(storageCageDTOList, Const.GLASS_STATE_OUT);
-                List<Integer> outSuccessSlotList = outSuccessGlass.stream().map(BigStorageCageOutTask::getStartSlot).collect(Collectors.toList());
-                log.info("4銆佸ぇ鐞嗙墖绗煎嚭鐗囩姸鎬佸凡瀹屾垚宸插畬鎴愮殑鐜荤拑淇℃伅id:{}", outSuccessGlass);
-                //鏇存柊鐞嗙墖绗肩幓鐠冨昂瀵�
-                updateSlotRemainBySlots(outSuccessSlotList);
-                log.info("5銆佸ぇ鐞嗙墖绗艰繘鐗囩洰鏍囨牸瀛愬昂瀵告洿鏂板畬鎴�");
+                bigStorageCageDetailsService.updateBySlot(storageCageDTOList, finalTaskType);
+                log.info("4銆佸ぇ鐞嗙墖绗艰繘鐗囩姸鎬佸凡瀹屾垚宸插畬鎴愮殑鐜荤拑淇℃伅id:{}", v);
+                updateSlotRemainBySlots(outSuccessGlassSlot);
+            } else if (e1 == 3) {
+                //鐮存崯澶勭悊
+                dealDamageOutTask(v);
+            } else {
+                //娓呯┖鐞嗙墖绗肩┖鏁版嵁
+                noDealOutTask(v);
             }
+        });
+        for (BigStorageCageTask item : outTaskList) {
+            //鏇存柊鍘嗗彶浠诲姟琛ㄤ腑鐨勪换鍔$姸鎬�
+            bigStorageCageHistoryTaskService.update(new LambdaUpdateWrapper<BigStorageCageHistoryTask>()
+                    .set(BigStorageCageHistoryTask::getTaskState, item.getTaskState())
+                    .eq(BigStorageCageHistoryTask::getTaskType, taskType)
+                    .eq(BigStorageCageHistoryTask::getGlassId, item.getGlassId()));
         }
-        Date endDate = new Date();
-        log.info("end:澶х悊鐗囩鍑虹墖瀹屾垚鍚庢洿鏂板ぇ鐞嗙墖绗兼暟鎹换鍔$粨鏉熸椂闂达細{}锛屽叡鑰楁椂锛歿}ms,缁撴潫浠诲姟", endDate, endDate.getTime() - startDate.getTime());
-        return;
-
+        //娓呯┖浠诲姟琛ㄦ暟鎹�
+        bigStorageCageTaskService.removeAll("big_storage_cage_out_one_task");
+        //娓呯┖鍚姩鐘舵��
+        //鍚憃pc鍙戦�佸惎鍔ㄤ俊鍙�
+        miloService.writeToOpcWord(generateReadWriteEntity("DLP1B.DLP1B.MesReply", 0));
     }
 
-//    @Scheduled(fixedDelay = 300)
-    public void updateScheduleGlassStateTask() {
-        Date startDate = new Date();
-        log.info("1銆佸ぇ鐞嗙墖绗艰皟搴﹀畬鎴愬悗鏇存柊澶х悊鐗囩鏁版嵁浠诲姟寮�濮嬫墽琛屾椂闂达細{}", startDate);
-        //鍥犱负澶х悊鐗囩鍜岃皟搴︿换鍔℃槸涓や釜搴撶殑鏁版嵁锛屾墍浠ヨ鍒嗗紑鏌ユ壘
-        List<Object> list = bigStorageCageDetailsService.listObjs(new LambdaQueryWrapper<BigStorageCageDetails>()
-                .select(BigStorageCageDetails::getGlassId).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_SCHEDULE_ING));
-        if (CollectionUtils.isNotEmpty(list)) {
-            log.info("2銆佽幏鍙栨墍鏈夋鍦ㄥ嚭鐗囩殑鐜荤拑淇℃伅id:{}", list);
-            List<String> glassIds = list.stream().map(String::valueOf).collect(Collectors.toList());
-            List<BigStorageCageOutTask> scheduleSuccessGlass = bigStorageCageOutTaskService.list(new LambdaQueryWrapper<BigStorageCageOutTask>()
-                    .in(BigStorageCageOutTask::getGlassId, glassIds).eq(BigStorageCageOutTask::getTaskState, Const.BIG_STORAGE_OUT_SUCCESS)
-                    .notIn(BigStorageCageOutTask::getEndSlot, Const.TEMPERING_OUT_TARGET_POSITION, Const.ARTIFICIAL_OUT_TARGET_POSITION));
-            if (CollectionUtils.isNotEmpty(scheduleSuccessGlass)) {
-                log.info("3銆佽幏鍙栬皟搴﹀凡瀹屾垚鐨勭幓鐠冧俊鎭痠d:{}", scheduleSuccessGlass);
-                List<UpdateBigStorageCageDTO> storageCageDTOList = scheduleSuccessGlass.stream().map(e -> {
-                    UpdateBigStorageCageDTO storageCageDTO = new UpdateBigStorageCageDTO();
-                    storageCageDTO.setGlassId(e.getGlassId());
-                    storageCageDTO.setTargetSlot(e.getEndSlot());
-                    return storageCageDTO;
-                }).collect(Collectors.toList());
-                bigStorageCageDetailsService.updateBySlot(storageCageDTOList, Const.GLASS_STATE_IN);
-                List<String> scheduleSuccessGlassIds = scheduleSuccessGlass.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList());
-                log.info("4銆佸ぇ鐞嗙墖绗煎嚭鐗囩姸鎬佸凡瀹屾垚宸插畬鎴愮殑鐜荤拑淇℃伅id:{}", scheduleSuccessGlassIds);
-                //鏇存柊鐞嗙墖绗肩幓鐠冨昂瀵�
-                List<Integer> slotList = scheduleSuccessGlass.stream().map(BigStorageCageOutTask::getStartSlot).distinct().collect(Collectors.toList());
-                slotList.addAll(scheduleSuccessGlass.stream().map(BigStorageCageOutTask::getEndSlot).distinct().collect(Collectors.toList()));
-                updateSlotRemainBySlots(slotList);
-                log.info("5銆佸ぇ鐞嗙墖绗艰繘鐗囩洰鏍囨牸瀛愬昂瀵告洿鏂板畬鎴�");
+    private void dealDamageInTask(List<BigStorageCageTask> damageTaskList) {
+//        鑾峰彇杩涚墖浠诲姟琛ㄤ腑鐘舵�佷负鐮存崯鐨勬暟鎹�
+        log.info("鐮存崯鐨勭幓鐠冧俊鎭湁锛歿}", damageTaskList);
+        //绉婚櫎鐞嗙墖绗艰鎯呰〃浠诲姟鎵ц杩囩▼涓牬鎹熺殑鐜荤拑
+        bigStorageCageDetailsService.remove(new LambdaQueryWrapper<BigStorageCageDetails>()
+                .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_NEW)
+                .in(BigStorageCageDetails::getGlassId, damageTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList())));
+        //灏嗙牬鎹熶俊鎭柊澧炲叆鐮存崯琛�
+        List<Integer> slotList = new ArrayList<>();
+        for (BigStorageCageTask item : damageTaskList) {
+            Damage damage = new Damage();
+            damage.setGlassId(item.getGlassId());
+            damage.setLine(item.getStartSlot());
+            damage.setWorkingProcedure("纾ㄨ竟");
+            damage.setRemark("杩涚鍓嶅崸杞珛");
+            damage.setStatus(1);
+            damage.setType(item.getTaskState());
+            damageService.insertDamage(damage);
+            slotList.add(item.getTargetSlot());
+        }
+        //鏇存柊鏍煎瓙鍓╀綑瀹藉害
+        updateSlotRemainBySlots(slotList);
+        log.info("杩涚墖浠诲姟-鐮存崯浠诲姟鎵ц瀹屾垚");
+    }
+
+    private void dealDamageOutTask(List<BigStorageCageTask> damageTaskList) {
+//        鑾峰彇杩涚墖浠诲姟琛ㄤ腑鐘舵�佷负鐮存崯鐨勬暟鎹�
+        log.info("鐮存崯鐨勭幓鐠冧俊鎭湁锛歿}", damageTaskList);
+        //绉婚櫎鐞嗙墖绗艰鎯呰〃浠诲姟鎵ц杩囩▼涓牬鎹熺殑鐜荤拑
+        bigStorageCageDetailsService.remove(new LambdaQueryWrapper<BigStorageCageDetails>()
+                .in(BigStorageCageDetails::getState, Const.GLASS_STATE_IN_ALL_ZERO)
+                .in(BigStorageCageDetails::getGlassId, damageTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList())));
+        //灏嗙牬鎹熶俊鎭柊澧炲叆鐮存崯琛�
+        List<Integer> slotList = new ArrayList<>();
+        for (BigStorageCageTask item : damageTaskList) {
+            Damage damage = new Damage();
+            damage.setGlassId(item.getGlassId());
+            damage.setLine(item.getStartSlot());
+            damage.setWorkingProcedure("閽㈠寲鍓�");
+            damage.setRemark("杩涚鍚庡崸杞珛");
+            damage.setStatus(1);
+            damage.setType(item.getTaskState());
+            damageService.insertDamage(damage);
+            slotList.add(item.getTargetSlot());
+            slotList.add(item.getStartSlot());
+        }
+        //鏇存柊鏍煎瓙鍓╀綑瀹藉害
+        updateSlotRemainBySlots(slotList);
+        log.info("鍑虹墖浠诲姟-鐮存崯浠诲姟鎵ц瀹屾垚");
+    }
+
+    private void noDealInTask(List<BigStorageCageTask> noDealTaskList) {
+//        鑾峰彇杩涚墖浠诲姟琛ㄤ腑鐘舵�佷负鐮存崯鐨勬暟鎹�
+        log.info("鐮存崯鐨勭幓鐠冧俊鎭湁锛歿}", noDealTaskList);
+        //绉婚櫎鐞嗙墖绗艰鎯呰〃鏈墽琛屼换鍔$殑绌鸿褰曚俊鎭�
+        bigStorageCageDetailsService.remove(new LambdaQueryWrapper<BigStorageCageDetails>()
+                .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_NEW)
+                .in(BigStorageCageDetails::getGlassId, noDealTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList())));
+        //璁板綍鏍煎瓙鍙凤紝鎸夋牸瀛愬彿鏇存柊鍓╀綑灏哄
+        List<Integer> slotList = new ArrayList<>();
+        for (BigStorageCageTask item : noDealTaskList) {
+            slotList.add(item.getTargetSlot());
+            slotList.add(item.getStartSlot());
+        }
+        //鏇存柊鏍煎瓙鍓╀綑瀹藉害
+        updateSlotRemainBySlots(slotList);
+        log.info("杩涚墖浠诲姟-鏃犲姩浣滄墽琛屽畬鎴�");
+    }
+
+    private void noDealOutTask(List<BigStorageCageTask> noDealTaskList) {
+//        鑾峰彇杩涚墖浠诲姟琛ㄤ腑鐘舵�佷负鐮存崯鐨勬暟鎹�
+        log.info("鐮存崯鐨勭幓鐠冧俊鎭湁锛歿}", noDealTaskList);
+        if (Const.OUT_TARGET_POSITION_ALL.contains(noDealTaskList.get(0).getTargetSlot())) {
+            //鍑虹墖浠诲姟:灏嗗嚭鐗囦腑鐘舵�佹仮澶嶄负鍦ㄧ鍐�
+            List<String> glassList = noDealTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList());
+            bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>()
+                    .set(BigStorageCageDetails::getState, Const.GLASS_STATE_IN)
+                    .in(BigStorageCageDetails::getGlassId, glassList));
+
+        } else {
+            //璋冨害浠诲姟锛氬皢璋冨害涓姸鎬佹敼涓哄湪绗煎唴锛屾牸瀛愬彿鎭㈠涓鸿皟搴﹀墠鐨勬牸瀛�
+            for (BigStorageCageTask item : noDealTaskList) {
+                bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>()
+                        .set(BigStorageCageDetails::getSlot, item.getStartSlot())
+                        .set(BigStorageCageDetails::getState, Const.GLASS_STATE_IN)
+                        .eq(BigStorageCageDetails::getGlassId, item.getGlassId()));
             }
         }
-        Date endDate = new Date();
-        log.info("end:澶х悊鐗囩鍑虹墖瀹屾垚鍚庢洿鏂板ぇ鐞嗙墖绗兼暟鎹换鍔$粨鏉熸椂闂达細{}锛屽叡鑰楁椂锛歿}ms,缁撴潫浠诲姟", endDate, endDate.getTime() - startDate.getTime());
-        return;
-
+        //灏嗙牬鎹熶俊鎭柊澧炲叆鐮存崯琛�
+        List<Integer> slotList = new ArrayList<>();
+        for (BigStorageCageTask item : noDealTaskList) {
+            slotList.add(item.getTargetSlot());
+            slotList.add(item.getStartSlot());
+        }
+        //鏇存柊鏍煎瓙鍓╀綑瀹藉害
+        updateSlotRemainBySlots(slotList);
+        log.info("鍑虹墖浠诲姟-鏃犲姩浣滄墽琛屽畬鎴�");
     }
 
     /**
-     * 澶勭悊鐮存崯琛ㄤ换鍔�
+     * 鍑虹墖涓�娆′粎鐢熸垚涓�杞︾幓鐠�
+     *
+     * @param list
+     * @param <T>
+     * @return
      */
-//    @Scheduled(fixedDelay = 300)
-    public void dealDamageTask() {
-        Date startDate = new Date();
-        log.info("澶х悊鐗囩鐮存崯鐜荤拑娓呴櫎浠诲姟寮�濮嬫墽琛屾椂闂达細{}", startDate);
-        //鑾峰彇杩涚墖浠诲姟琛ㄤ腑鐘舵�佷负鐮存崯鐨勬暟鎹�
-        List<BigStorageCageFeedTask> inDamageTaskInfoList = bigStorageCageFeedTaskService.list(new LambdaQueryWrapper<BigStorageCageFeedTask>()
-                .in(BigStorageCageFeedTask::getTaskState, Const.GLASS_STATE_DAMAGE_TAKE));
-        if (CollectionUtils.isNotEmpty(inDamageTaskInfoList)) {
-            log.info("鑾峰彇杩涚墖浠诲姟琛ㄤ腑鐮存崯鐨勭幓鐠冧俊鎭瘂}", inDamageTaskInfoList);
-            bigStorageCageFeedTaskService.remove(new LambdaQueryWrapper<BigStorageCageFeedTask>().in(BigStorageCageFeedTask::getTaskState, Const.GLASS_STATE_DAMAGE_TAKE));
-            //鐞嗙墖绗艰鎯呰〃鏁版嵁鐘舵�佹洿鏂�
-            bigStorageCageDetailsService.remove(new LambdaQueryWrapper<BigStorageCageDetails>()
-                    .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_NEW).in(BigStorageCageDetails::getGlassId, inDamageTaskInfoList.stream().map(BigStorageCageFeedTask::getGlassId).collect(Collectors.toList())));
-            //灏嗙牬鎹熶俊鎭柊澧炲叆鐮存崯琛�
-            List<Integer> slotList = new ArrayList<>();
-            for (BigStorageCageFeedTask bigStorageCageFeedTask : inDamageTaskInfoList) {
-                Damage damage = new Damage();
-                damage.setGlassId(bigStorageCageFeedTask.getGlassId());
-                damage.setLine(bigStorageCageFeedTask.getLine());
-                damage.setWorkingProcedure("纾ㄨ竟");
-                damage.setRemark("杩涚鍓嶅崸杞珛");
-                damage.setStatus(1);
-                damage.setType(bigStorageCageFeedTask.getTaskState());
-                damageService.insertDamage(damage);
-                slotList.add(bigStorageCageFeedTask.getTargetSlot());
+    private <T extends BigStorageCageBaseInfo> Boolean computeOutGlassInfo(List<T> list, String tableName, int targetSlot, int state, int taskType) {
+        //浠诲姟鏁版嵁:鑾峰彇杞﹀瓙瀛樻斁鐜荤拑鏈�澶ф暟閲�,鐜荤拑闂撮殧
+        List<BigStorageCageTask> bigStorageCageTaskList = new ArrayList<>();
+        //鎵撹溅鍓╀綑灏哄
+        Integer remainWidth = carWidth;
+        for (T e : list) {
+            if (bigStorageCageTaskList.size() >= outCarMaxSize || Math.max((int) e.getWidth(), (int) e.getHeight()) > remainWidth) {
+                break;
             }
-            //鏇存柊鏍煎瓙鍓╀綑瀹藉害
-            updateSlotRemainBySlots(slotList);
-            log.info("杩涚墖浠诲姟鎵ц瀹屾垚");
+            //璁$畻褰撳墠鍑虹墖杞﹀墿灏哄
+            remainWidth = remainWidth - Math.max((int) e.getWidth(), (int) e.getHeight()) - glassGap;
+            bigStorageCageTaskList.add(new BigStorageCageTask(e.getGlassId(), e.getSlot(), targetSlot,
+                    0));
         }
-        //鑾峰彇鍑虹墖浠诲姟琛ㄤ腑鐘舵�佷负鐮存崯鐨勬暟鎹�
-        List<BigStorageCageOutTask> outDamageTaskInfoList = bigStorageCageOutTaskService.list(new LambdaQueryWrapper<BigStorageCageOutTask>()
-                .in(BigStorageCageOutTask::getTaskState, Const.GLASS_STATE_DAMAGE_TAKE));
-        if (CollectionUtils.isNotEmpty(outDamageTaskInfoList)) {
-            log.info("鑾峰彇鍑虹墖浠诲姟琛ㄤ腑鐮存崯鐨勭幓鐠冧俊鎭瘂}", outDamageTaskInfoList);
-            bigStorageCageOutTaskService.remove(new LambdaQueryWrapper<BigStorageCageOutTask>().in(BigStorageCageOutTask::getTaskState, Const.GLASS_STATE_DAMAGE_TAKE));
-            List<String> glassIdList = outDamageTaskInfoList.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList());
-            //绉婚櫎閽㈠寲涓嬬墖琛ㄦ暟鎹�
-            temperingGlassInfoService.remove(new LambdaQueryWrapper<TemperingGlassInfo>().in(TemperingGlassInfo::getGlassId, glassIdList));
-            //鐞嗙墖绗艰鎯呰〃鏁版嵁鐘舵�佸垹闄�
-            bigStorageCageDetailsService.remove(new LambdaQueryWrapper<BigStorageCageDetails>().in(BigStorageCageDetails::getGlassId, glassIdList));
-            //灏嗙牬鎹熶俊鎭柊澧炲叆鐮存崯琛�
-            List<Integer> slotList = new ArrayList<>();
-            for (BigStorageCageOutTask bigStorageCageOutTask : outDamageTaskInfoList) {
-                Damage damage = new Damage();
-                damage.setGlassId(bigStorageCageOutTask.getGlassId());
-                damage.setLine(bigStorageCageOutTask.getEndSlot());
-                damage.setWorkingProcedure("閽㈠寲");
-                damage.setRemark("鍑虹墖鍚庡崸杞珛");
-                damage.setStatus(1);
-                damage.setType(bigStorageCageOutTask.getTaskState());
-                damageService.insertDamage(damage);
-                slotList.add(bigStorageCageOutTask.getStartSlot());
-            }
-            //鏇存柊鏍煎瓙鍓╀綑瀹藉害
-            updateSlotRemainBySlots(slotList);
-            log.info("鍑虹墖浠诲姟鎵ц瀹屾垚");
+        Assert.isFalse(CollectionUtils.isEmpty(bigStorageCageTaskList), "鏈幏鍙栧嚭鐗囨暟鎹紝缁撴潫鍑虹墖浠诲姟");
+        log.info("鑾峰彇鍑虹墖浠诲姟鏁版嵁{}鏉★紝鎵ц淇濆瓨", bigStorageCageTaskList.size());
+        List<String> glassIds = bigStorageCageTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList());
+        int glassCount = bigStorageCageTaskList.size();
+        //鐢熸垚鍑虹墖浠诲姟鏉℃暟涓嶈冻6琛ュ叏
+        while (bigStorageCageTaskList.size() < 6) {
+            bigStorageCageTaskList.add(new BigStorageCageTask("", 0, 0, 0));
         }
-        Date endDate = new Date();
-        log.info("澶х悊鐗囩鐮存崯鐜荤拑娓呴櫎浠诲姟缁撴潫鏃堕棿锛歿}锛屽叡鑰楁椂锛歿}ms,缁撴潫鎵爜浠诲姟", endDate, endDate.getTime() - startDate.getTime());
-        return;
+        bigStorageCageTaskService.saveTaskMessage(tableName, bigStorageCageTaskList);
+        List<BigStorageCageHistoryTask> historyList = bigStorageCageTaskList.stream().filter(e -> StringUtils.isNotBlank(e.getGlassId())).map(e -> {
+            BigStorageCageHistoryTask history = new BigStorageCageHistoryTask();
+            BeanUtils.copyProperties(e, history);
+            history.setGlassCount(glassCount);
+            history.setTaskType(taskType);
+            return history;
+        }).collect(Collectors.toList());
+        bigStorageCageHistoryTaskService.saveBatch(historyList);
+
+        log.info("灏嗗嚭鐗囩幓鐠儃}鐜荤拑鐘舵�佹敼涓哄嚭鐗囦腑", glassIds);
+        bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>()
+                .set(BigStorageCageDetails::getState, state)
+                .set(Const.GLASS_STATE_SCHEDULE_ING.equals(state), BigStorageCageBaseInfo::getSlot, targetSlot)
+                .in(BigStorageCageDetails::getGlassId, glassIds));
+        return Boolean.TRUE;
     }
+
 
     public void updateSlotRemainBySlots(List<Integer> slotList) {
         //鑾峰彇鏍煎瓙鍐呮墍鏈夌殑鐜荤拑淇℃伅
@@ -291,5 +556,11 @@
         }
     }
 
-
+    private ReadWriteEntity generateReadWriteEntity(String identifier, Object value) {
+        return ReadWriteEntity.builder()
+                .identifier(identifier)
+                //Kep涓槸Long绫诲瀷锛屽嵆锛欼nt32锛孞ava涓殑int绫诲瀷
+                .value(value)
+                .build();
+    }
 }
\ No newline at end of file
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/tools/service/BigStorageBaseService.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/tools/service/BigStorageBaseService.java
new file mode 100644
index 0000000..0402283
--- /dev/null
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/tools/service/BigStorageBaseService.java
@@ -0,0 +1,17 @@
+package com.mes.tools.service;
+
+import com.mes.bigstorage.entity.BigStorageDTO;
+import com.mes.glassinfo.entity.GlassInfo;
+
+import java.util.List;
+
+/**
+ * @Author : zhoush
+ * @Date: 2024/11/8 22:02
+ * @Description:
+ */
+public interface BigStorageBaseService {
+    void updateSlotRemainBySlots(List<Integer> slotList);
+
+    BigStorageDTO queryTargetSlotByTempering(GlassInfo glassInfo);
+}
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/tools/service/impl/BigStorageBaseServiceImpl.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/tools/service/impl/BigStorageBaseServiceImpl.java
new file mode 100644
index 0000000..b7e267c
--- /dev/null
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/tools/service/impl/BigStorageBaseServiceImpl.java
@@ -0,0 +1,663 @@
+package com.mes.tools.service.impl;
+
+import cn.hutool.core.lang.Assert;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.mes.bigstorage.entity.BigStorageCage;
+import com.mes.bigstorage.entity.BigStorageCageDetails;
+import com.mes.bigstorage.entity.BigStorageDTO;
+import com.mes.bigstorage.service.BigStorageCageDetailsService;
+import com.mes.bigstorage.service.BigStorageCageService;
+import com.mes.bigstoragetask.entity.BigStorageCageFeedTask;
+import com.mes.common.S7object;
+import com.mes.common.config.Const;
+import com.mes.device.PlcParameterObject;
+import com.mes.glassinfo.entity.GlassInfo;
+import com.mes.glassinfo.service.GlassInfoService;
+import com.mes.tools.S7control;
+import com.mes.tools.service.BigStorageBaseService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @Author : zhoush
+ * @Date: 2024/11/8 22:03
+ * @Description:
+ */
+@Service
+@Slf4j
+public class BigStorageBaseServiceImpl implements BigStorageBaseService {
+
+    @Resource
+    BigStorageCageDetailsService bigStorageCageDetailsService;
+
+    @Resource
+    BigStorageCageService bigStorageCageService;
+
+    @Resource
+    GlassInfoService glassInfoService;
+
+    @Value("${mes.slotWidth}")
+    private Integer slotWidth;
+
+    @Value("${mes.carWidth}")
+    private Integer carWidth;
+
+    @Value("${mes.outCarMaxSize}")
+    private Integer outCarMaxSize;
+
+    @Value("${mes.glassGap}")
+    private Integer glassGap;
+
+
+    @Override
+    public void updateSlotRemainBySlots(List<Integer> slotList) {
+        //鑾峰彇鏍煎瓙鍐呮墍鏈夌殑鐜荤拑淇℃伅
+        List<BigStorageCageDetails> inSlotGlassList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>()
+                .in(BigStorageCageDetails::getSlot, slotList).in(BigStorageCageDetails::getState, Const.GLASS_STATE_IN_ALL));
+        Map<Integer, Double> slotRemainMap = new HashMap<>();
+        //鏄惁瀛樺湪鏈夋牸瀛愰潪绌虹殑鐜荤拑
+        if (CollectionUtils.isNotEmpty(inSlotGlassList)) {
+            //瀛樺湪  灏嗘牸瀛愬唴鐨勭幓鐠冨垎鍒繘琛屾洿鏂�
+            slotRemainMap = inSlotGlassList.stream()
+                    .collect(Collectors.groupingBy(BigStorageCageDetails::getSlot, Collectors.summingDouble(item -> Math.max(item.getWidth(), item.getHeight()) + glassGap)));
+            slotRemainMap.forEach((e, v) -> {
+                double remainWidth = slotWidth - v >= 0 ? slotWidth - v : 0;
+                bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, remainWidth)
+                        .eq(BigStorageCage::getSlot, e));
+            });
+        }
+        //杩囨护涓嶅瓨鍦ㄧ幓鐠冪殑鏍煎瓙 灏嗗搴﹂噸缃负鍘熷瀹藉害5000
+        Set<Integer> remainSlotList = slotRemainMap.keySet();
+        slotList.removeAll(remainSlotList);
+        if (CollectionUtils.isNotEmpty(slotList)) {
+            bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, slotWidth)
+                    .in(BigStorageCage::getSlot, slotList));
+        }
+    }
+
+    /**
+     * 鎸夌収鐜荤拑id鍒ゆ柇鐜荤拑鐘舵�佸強鍗ц浆绔嬫槸鍚﹀彲鐩存帴鍚姩
+     */
+//    public Boolean judgeGlassTypeStatus(String glassId, Integer line, String mesAddress) {
+//        //鍒ゆ柇姝ょ幓鐠冩槸鍦ㄧ鍐呮垨宸茬敓鎴愯繘鐗囦换鍔�
+//        BigStorageCageFeedTask bigStorageCageFeedTask = bigStorageCageFeedTaskService.getOne(
+//                new LambdaQueryWrapper<BigStorageCageFeedTask>()
+//                        .lt(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT)
+//                        .eq(BigStorageCageFeedTask::getGlassId, glassId)
+//        );
+//        BigStorageCageDetails bigStorageCageDetails = bigStorageCageDetailsService.getOne(
+//                new LambdaQueryWrapper<BigStorageCageDetails>()
+//                        .eq(BigStorageCageDetails::getGlassId, glassId)
+//                        .ne(BigStorageCageDetails::getState, Const.GLASS_STATE_IN)
+//        );
+//        if (bigStorageCageFeedTask != null || bigStorageCageDetails != null) {
+//            log.info("姝ょ幓鐠冨瓨浠诲姟鎴栧凡鍦ㄧ鍐�");
+//            return Boolean.TRUE;
+//        }
+//        //1銆佽幏鍙栦换鍔¤〃涓浉閭荤幓鐠�
+//        List<EdgGlassTaskInfo> edgGlassTaskInfoList;
+//        edgGlassTaskInfoList = edgGlassTaskInfoService.list(new LambdaQueryWrapper<EdgGlassTaskInfo>()
+//                .eq(EdgGlassTaskInfo::getLine, line)
+//                .apply("time >= (select time from edg_glass_task_info where line='" + line + "' and glass_id = '" + glassId + "' and deleted = 0)")
+//                .orderByAsc(EdgGlassTaskInfo::getTime));
+//        if (edgGlassTaskInfoList.size() == 0) {
+//            edgGlassTaskInfoList = edgGlassTaskInfoService.list(new QueryWrapper<EdgGlassTaskInfo>()
+//                    .select("Top 1 *")
+//                    .eq("glass_id", glassId)
+//            );
+//            log.info("鍦ㄥ昂瀵歌〃涓幏鍙栫幓鐠冧俊鎭瘂}", edgGlassTaskInfoList);
+//            if (edgGlassTaskInfoList.size() == 0) {
+//                GlassInfo glassInfo = glassInfoService.getOne(
+//                        new LambdaQueryWrapper<GlassInfo>()
+//                                .eq(GlassInfo::getGlassId, glassId)
+//                );
+//                EdgGlassTaskInfo edgGlassTaskInfo = new EdgGlassTaskInfo();
+//                BeanUtils.copyProperties(glassInfo, edgGlassTaskInfo);
+//                edgGlassTaskInfo.setWidth((int) glassInfo.getWidth());
+//                edgGlassTaskInfo.setHeight((int) glassInfo.getHeight());
+//                edgGlassTaskInfoList.add(edgGlassTaskInfo);
+//                log.info("鍦ㄧ幓鐠冧俊鎭〃涓幏鍙栫幓鐠冧俊鎭瘂}", edgGlassTaskInfoList);
+//            }
+//        }
+//        Assert.isFalse(CollectionUtils.isEmpty(edgGlassTaskInfoList), "璇嗗埆鐜荤拑淇℃伅鏈嚭鐜板湪灏哄琛ㄤ腑,鑾峰彇鐩搁偦涓ゅ潡鐜荤拑澶辫触");
+//        //2銆佽幏鍙栧崸杞珛鍓╀綑瀹藉害
+//        BigStorageDTO sitToUpRemainWidth = bigStorageCageFeedTaskService.querySitToUpRemainWidth(line);
+//        Integer remainWidth;
+//        Integer glassCount;
+//        if (0 == sitToUpRemainWidth.getGlassCount()) {
+//            remainWidth = carWidth;
+//            glassCount = 0;
+//        } else {
+//            remainWidth = sitToUpRemainWidth.getWidth();
+//            glassCount = sitToUpRemainWidth.getGlassCount();
+//        }
+//
+//        Boolean flag = Boolean.TRUE;
+//        //2銆佽幏鍙栧崸杞珛
+//        Integer widthFirst = Math.max(edgGlassTaskInfoList.get(0).getWidth() / 10, edgGlassTaskInfoList.get(0).getHeight() / 10);
+//        Integer heightFirst = Math.min(edgGlassTaskInfoList.get(0).getWidth() / 10, edgGlassTaskInfoList.get(0).getHeight() / 10);
+//        if (edgGlassTaskInfoList.size() == 1) {
+//            if (remainWidth >= widthFirst) {
+//                if (glassCount < inCarMaxSize) {
+//                    addFeedTask(glassId, line, Const.BIG_STORAGE_IN_WAIT, widthFirst, heightFirst);
+//                } else {
+//                    if (glassCount < inCarMaxSize + 1) {
+//                        addFeedTask(glassId, line, Const.BIG_STORAGE_IN_RUN, widthFirst, heightFirst);
+//                    } else {
+//                        return Boolean.FALSE;
+//                    }
+//                }
+//            } else {
+//                flag = Boolean.FALSE;
+//            }
+//        } else {
+//            Integer widthSecond = Math.max(edgGlassTaskInfoList.get(1).getWidth() / 10, edgGlassTaskInfoList.get(1).getHeight() / 10);
+//            Integer heightSecond = Math.min(edgGlassTaskInfoList.get(1).getWidth() / 10, edgGlassTaskInfoList.get(1).getHeight() / 10);
+//            if (remainWidth >= widthFirst) {
+//                if (remainWidth - widthFirst - glassGap >= widthSecond) {
+//                    if (glassCount < inCarMaxSize) {
+//                        addFeedTask(glassId, line, Const.BIG_STORAGE_IN_WAIT, widthFirst, heightFirst);
+//                    } else {
+//                        if (glassCount < inCarMaxSize + 1) {
+//                            addFeedTask(glassId, line, Const.BIG_STORAGE_IN_RUN, widthFirst, heightFirst);
+//                        } else {
+//                            return Boolean.FALSE;
+//                        }
+//                    }
+//                } else {
+//                    if (glassCount < inCarMaxSize + 1) {
+//                        addFeedTask(glassId, line, Const.BIG_STORAGE_IN_RUN, widthFirst, heightFirst);
+//                    } else {
+//                        return Boolean.FALSE;
+//                    }
+//                }
+//            } else {
+//                flag = Boolean.FALSE;
+//            }
+//        }
+//        //鍚憄lc鍙戦�佽繘鐗囩‘璁�
+//        if (flag) {
+//            //鍚憄lc鍐欏叆纭瀛�
+//            PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject;
+//            int returnData = 1;
+//            int count = 1;
+//            while (returnData != 0) {
+//                S7object.getinstance().plccontrol.writeWord(mesAddress, 1);
+//
+//                if (Const.A10_OUT_TARGET_POSITION.equals(line)) {
+//                    returnData = Integer.parseInt(plcParameterObject.getPlcParameter("D04ToMES").getValue());
+//                } else {
+//                    returnData = Integer.parseInt(plcParameterObject.getPlcParameter("D01ToMES").getValue());
+//                }
+////                returnData = S7object.getinstance().plccontrol.readWord(mesAddress, 1).get(0);
+//                log.info("杩涘崸杞珛绗瑊}娆″彂閫佺‘璁ゅ瓧瀹屾垚锛屽湴鍧�涓猴細{},鍐欏叆鐨勫唴瀹逛负{}", count++, mesAddress, 1);
+//            }
+//        }
+//        //璁板綍鏃犳硶鏀句笅鐜荤拑锛屽悗缁垽鏂惎鍔�
+//        return flag;
+//    }
+
+    /**
+     * 娣诲姞浠诲姟淇℃伅
+     */
+//    private Boolean addFeedTask(String glassId, Integer line, Integer taskType, Integer width, Integer height) {
+//        BigStorageCageFeedTask bigStorageCageFeedTask = new BigStorageCageFeedTask();
+//        bigStorageCageFeedTask.setGlassId(glassId);
+//        bigStorageCageFeedTask.setTaskState(Const.BIG_STORAGE_IN_NEW);
+//        bigStorageCageFeedTask.setLine(line);
+//        bigStorageCageFeedTask.setTaskType(taskType);
+//        bigStorageCageFeedTask.setWidth(width);
+//        bigStorageCageFeedTask.setHeight(height);
+//        bigStorageCageFeedTask.setCreateTime(new Date());
+//        //鍒犻櫎鐞嗙墖绗艰〃鎷胯蛋/鐮存崯鏁版嵁鏁版嵁
+//        damageService.deleteByGlassId(glassId);
+//        Damage damage = new Damage();
+//        damage.setGlassId(glassId);
+//        damage.setWorkingProcedure("纾ㄨ竟");
+//        damage.setLine(line);
+//        damage.setType(1);
+//        damage.setRemark("杩涘ぇ鐞嗙墖");
+//        damageService.insertDamage(damage);
+//        return bigStorageCageFeedTaskService.save(bigStorageCageFeedTask);
+//    }
+
+    /**
+     * 鑾峰彇闇�瑕佸惎鍔ㄧ殑绾胯矾锛氫袱鏉$嚎閮藉彲鍚姩 鑾峰彇绗竴鐗囩幓鐠冪増鍥緄d鏈�灏� 鐗堝簭鏈�澶х殑绾胯矾
+     *
+     * @return 闇�瑕佸惎鍔ㄧ殑绾胯矾
+     */
+//    public Integer getStartLine() {
+//        List<BigStorageCageFeedTask> taskList = bigStorageCageFeedTaskService.list(new LambdaQueryWrapper<BigStorageCageFeedTask>()
+//                .inSql(BigStorageCageFeedTask::getId, "select min(id) from big_storage_cage_feed_task where task_state = 2" +
+//                        "and (target_slot = 0 or target_slot is null) group by line"));
+//        Assert.isFalse(CollectionUtils.isEmpty(taskList), "鍗ц浆绔嬩袱鏉$嚎閮芥病鏈夌幓鐠冭繘鐗囦换鍔�");
+//        Map<String, Integer> taskMap = taskList.stream().collect(Collectors.toMap(BigStorageCageFeedTask::getGlassId,
+//                BigStorageCageFeedTask::getLine));
+//        GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>()
+//                .in(GlassInfo::getGlassId, taskMap.keySet())
+//                .orderByAsc(GlassInfo::getTemperingLayoutId)
+//                .orderBy(Boolean.TRUE, sequenceOrder, GlassInfo::getTemperingFeedSequence)
+//                .last("limit 1"));
+//        return taskMap.get(glassInfo.getGlassId());
+//    }
+
+    /**
+     * 璁$畻浠诲姟琛ㄨ繘鐗囩嚎璺殑鐩爣鏍煎瓙锛屽苟鍚姩浠诲姟
+     */
+//    public boolean computeTargetByLine(Integer line) {
+//        //1銆佽幏鍙栦换鍔¤〃涓殑鎵�鏈夌幓鐠冿紙鎸囧畾绾胯矾涓斿凡缁忚繘鍗ц浆绔嬪畬鎴愶級
+//        List<BigStorageCageFeedTask> taskList = bigStorageCageFeedTaskService.list(new LambdaQueryWrapper<BigStorageCageFeedTask>()
+//                .eq(BigStorageCageFeedTask::getLine, line)
+//                .and(e -> e.isNull(BigStorageCageFeedTask::getTargetSlot).or().eq(BigStorageCageFeedTask::getTargetSlot, Const.OUT_TARGET_POSITION_ZERO))
+//                .in(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP_ALL)
+//                .orderByAsc(BigStorageCageFeedTask::getId));
+//        //2銆佸幓绗煎瓙鍐呮煡鎵炬槸鍚﹀彲浠ョ户缁瓨鏀剧殑绗煎瓙
+//        List<String> glassIds = taskList.stream().map(BigStorageCageFeedTask::getGlassId).collect(Collectors.toList());
+//        List<GlassInfo> glassInfos = glassInfoService.list(new LambdaQueryWrapper<GlassInfo>().in(GlassInfo::getGlassId, glassIds));
+//        return computeIsTemperingTargetByLine(glassInfos, taskList);
+//    }
+
+//    /**
+//     * 鏄惁閽㈠寲鐜荤拑杩涚鐩爣浣嶇疆
+//     *
+//     * @param glassInfos 褰撴潯绾垮崸杞珛鎵�鏈夌幓鐠�
+//     * @param taskList   褰撴潯绾垮崸杞珛鎵�鏈変换鍔�
+//     */
+//    private boolean computeIsTemperingTargetByLine(List<GlassInfo> glassInfos, List<BigStorageCageFeedTask> taskList) {
+//        //1銆佸皢鐜荤拑淇℃伅闆嗗悎杞负glassid涓簁ey鐨刴ap
+//        Map<String, GlassInfo> glassInfoMap = glassInfos.stream()
+//                .collect(Collectors.toMap(GlassInfo::getGlassId, p -> p));
+//        for (BigStorageCageFeedTask e : taskList) {
+//            GlassInfo info = glassInfoMap.get(e.getGlassId());
+//            if (info == null) {
+//                continue;
+//            }
+//            BigStorageCageDetails cageDetails = new BigStorageCageDetails();
+//            BeanUtils.copyProperties(info, cageDetails);
+//            //todo:2銆佽幏鍙栫洰鏍囨牸瀛愪俊鎭�
+//            BigStorageDTO bigStorageDTO = bigStorageCageDetailsService.queryTargetSlotByTempering(info);
+//            //3銆佷复鏃舵洿鏂版牸瀛愮殑鍓╀綑灏哄锛氶槻姝㈢浉閭荤幓鐠冭繘鍚屼竴鏍煎瓙閫犳垚鍓╀綑灏哄涓嶈冻锛岀幓鐠冭秺鐣岀殑鎯呭喌锛屼换鍔″畬鎴愬悗鍐嶆鏇存柊澶х悊鐗囩琛ㄥ墿浣欏搴︼紙鎸夌収绗煎唴鐜荤拑鏁伴噺鏇存柊澶х悊鐗囩鍓╀綑灏哄锛�
+//            bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, bigStorageDTO.getWidth() - Math.max(info.getWidth(), info.getHeight()) - glassGap)
+//                    .eq(BigStorageCage::getSlot, bigStorageDTO.getSlot()));
+//            //4銆佹洿鏂拌繘鐗囦换鍔¤〃锛岀洰鏍囨牸瀛愬強鐘舵�侊紙鐘舵�佹敼涓�2 鐢垫皵鎵埌鑷澶勭悊锛�  閬囧埌闂锛氭棤娉曟壒閲忔洿鏂帮紝鎵归噺鏇存柊鏃犳硶璧版寚瀹氫粠搴�
+//            e.setTargetSlot(bigStorageDTO.getSlot());
+//            bigStorageCageFeedTaskService.updateById(e);
+//
+//            //5銆佸皢杩涚墖淇℃伅瀛樺叆澶х悊鐗囩璇︽儏琛�
+//            cageDetails.setSlot(bigStorageDTO.getSlot());
+//            cageDetails.setState(Const.GLASS_STATE_NEW);
+//            cageDetails.setDeviceId(bigStorageDTO.getDeviceId());
+//            cageDetails.setGap(glassGap);
+//            bigStorageCageDetailsService.save(cageDetails);
+//
+//        }
+//        return Boolean.TRUE;
+//    }
+    private void sendTaskListToPLC(List<BigStorageCageFeedTask> taskList, Integer line) {
+        log.info("閫佺墖浠诲姟鍙戦�佽繘鐗囩幓鐠冧俊鎭�");
+        S7control s7control = S7object.getinstance().plccontrol;
+        PlcParameterObject plcMesObject = S7object.getinstance().PlcMesObject;
+        String mesD03Address = plcMesObject.getPlcParameter("MESToD03").getAddress();
+        String mesD05Address = plcMesObject.getPlcParameter("MESToD05").getAddress();
+        String outLine = line.equals(Const.A09_OUT_TARGET_POSITION) ? mesD03Address : mesD05Address;
+        for (int i = 1; i <= taskList.size(); i++) {
+            s7control.writeWord(plcMesObject.getPlcParameter("StartAddToImport" + i).getAddress(), taskList.get(i - 1).getLine());
+            s7control.writeWord(plcMesObject.getPlcParameter("TargetAddToImport" + i).getAddress(), taskList.get(i - 1).getTargetSlot());
+            log.info("鍚憄lc鍙戦�佺{}鐗囩幓鐠冨凡瀹屾垚,璧峰浣嶇疆鏄瘂}锛岀洰鏍囦綅缃槸", i, taskList.get(i - 1).getLine(), taskList.get(i - 1).getTargetSlot());
+        }
+        int returnData = 1;
+        int count = 1;
+        while (returnData != 0) {
+            s7control.writeWord(outLine, 2);
+            if (line.equals(Const.A09_OUT_TARGET_POSITION)) {
+                returnData = Integer.parseInt(plcMesObject.getPlcParameter("D03ToMES").getValue());
+            } else {
+                returnData = Integer.parseInt(plcMesObject.getPlcParameter("D05ToMES").getValue());
+            }
+//            returnData = s7control.readWord(outLine, 1).get(0);
+            log.info("宸插悜plc绗瑊}娆″彂閫佽繘鐗囦换鍔$‘璁わ紝鍦板潃涓猴細{},鍐欏叆鐨勫唴瀹逛负{}", count++, outLine, 2);
+        }
+    }
+
+//    /**
+//     * 鍑虹墖涓�娆′粎鐢熸垚涓�杞︾幓鐠�
+//     *
+//     * @param list
+//     * @param isTempering
+//     * @param mesToPLCAddress
+//     * @param <T>
+//     * @return
+//     */
+//    private <T extends BigStorageCageBaseInfo> Boolean computeOutGlassInfo(List<T> list, Boolean isTempering, String mesToPLCAddress) {
+//        //浠诲姟鏁版嵁  鑾峰彇杞﹀瓙瀛樻斁鐜荤拑鏈�澶ф暟閲�  鐜荤拑闂撮殧
+//        List<BigStorageCageOutTask> bigStorageCageOutTaskList = new ArrayList<>();
+//        //鎵撹溅鍓╀綑灏哄
+//        Integer remainWidth = carWidth;
+//        int maxX = 0;
+//        for (T e : list) {
+//            if (bigStorageCageOutTaskList.size() >= outCarMaxSize || Math.max((int) e.getWidth(), (int) e.getHeight()) > remainWidth) {
+//                break;
+//            }
+//            remainWidth = remainWidth - Math.max((int) e.getWidth(), (int) e.getHeight()) - glassGap;
+//            if (isTempering) {
+//                int minLength = Math.min((int) e.getWidth(), (int) e.getHeight());
+//                if (maxX + minLength <= xMaxSize) {
+//                    bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.TEMPERING_OUT_TARGET_POSITION,
+//                            e.getWidth() * 10, e.getHeight() * 10, 0, 0, 1, new Date()));
+//                    maxX = Math.max(maxX, e.getXCoordinate());
+//                } else {
+//                    break;
+//                }
+//
+//            } else {
+//                bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.ARTIFICIAL_OUT_TARGET_POSITION,
+//                        e.getWidth() * 10, e.getHeight(), 0, 0, 1, new Date()));
+//            }
+//        }
+//        Assert.isFalse(CollectionUtils.isEmpty(bigStorageCageOutTaskList), "鏈幏鍙栧嚭鐗囨暟鎹紝缁撴潫鍑虹墖浠诲姟");
+//        log.info("鑾峰彇鍑虹墖浠诲姟鏁版嵁{}鏉★紝鎵ц淇濆瓨", bigStorageCageOutTaskList.size());
+//        bigStorageCageOutTaskService.saveBatch(bigStorageCageOutTaskList);
+//        List<String> glassIds = bigStorageCageOutTaskList.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList());
+//        log.info("灏嗗嚭鐗囩幓鐠儃}鐜荤拑鐘舵�佹敼涓哄凡鍑虹墖", glassIds);
+//        bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>()
+//                .set(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT_ING)
+//                .in(BigStorageCageDetails::getGlassId, glassIds));
+//        int returnData = 0;
+//        int count = 1;
+//        while (returnData == 0) {
+//            S7object.getinstance().plccontrol.writeWord(mesToPLCAddress, 1);
+//            returnData = S7object.getinstance().plccontrol.readWord(mesToPLCAddress, 1).get(0);
+//            log.info("宸插悜plc绗瑊}娆″彂閫佸嚭鐗囦换鍔$‘璁わ紝鍦板潃涓猴細{},鍐欏叆鐨勫唴瀹逛负{}", count++, mesToPLCAddress, returnData);
+//        }
+//        return Boolean.TRUE;
+//    }
+
+//    /**
+//     * 鍑虹墖涓�娆$敓鎴愪竴鐐夌幓鐠�
+//     *
+//     * @param list
+//     * @param isTempering
+//     * @param mesToPLCAddress
+//     * @param <T>
+//     * @return
+//     */
+//    public <T extends BigStorageCageBaseInfo> Boolean computeOutMoreGlassInfo(List<T> list, Boolean isTempering, String mesToPLCAddress) {
+//        //浠诲姟鏁版嵁  鑾峰彇杞﹀瓙瀛樻斁鐜荤拑鏈�澶ф暟閲�  鐜荤拑闂撮殧
+//        List<BigStorageCageOutTask> bigStorageCageOutTaskList = new ArrayList<>();
+//        //鎵撹溅鍓╀綑灏哄
+//        Integer remainWidth = carWidth;
+//        int trainNumber = 1;
+//        int serialNumber = 1;
+//        int maxX = 0;
+//        for (T e : list) {
+//            int maxLength = Math.max((int) e.getWidth(), (int) e.getHeight());
+//            if (serialNumber > outCarMaxSize || maxLength > remainWidth) {
+//                remainWidth = carWidth;
+//                trainNumber = trainNumber + 1;
+//                serialNumber = 1;
+//                maxX = 0;
+//            }
+//            remainWidth = remainWidth - maxLength - glassGap;
+//            if (isTempering) {
+//                int minLength = Math.min((int) e.getWidth(), (int) e.getHeight());
+//                if (maxX + minLength <= xMaxSize) {
+//                    bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.TEMPERING_OUT_TARGET_POSITION,
+//                            e.getWidth() * 10, e.getHeight() * 10, trainNumber, serialNumber++, 1, new Date()));
+//                    maxX = Math.max(maxX, e.getXCoordinate());
+//                } else {
+//                    remainWidth = carWidth - maxLength - glassGap;
+//                    trainNumber = trainNumber + 1;
+//                    serialNumber = 1;
+//                    maxX = e.getXCoordinate();
+//                    bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.TEMPERING_OUT_TARGET_POSITION,
+//                            e.getWidth() * 10, e.getHeight(), trainNumber, serialNumber++, 1, new Date()));
+//                }
+//            } else {
+//                bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.ARTIFICIAL_OUT_TARGET_POSITION,
+//                        e.getWidth() * 10, e.getHeight(), trainNumber, serialNumber++, 1, new Date()));
+//            }
+//        }
+//        Assert.isFalse(CollectionUtils.isEmpty(bigStorageCageOutTaskList), "鏈幏鍙栧嚭鐗囨暟鎹紝缁撴潫鍑虹墖浠诲姟");
+//        log.info("鑾峰彇鍑虹墖浠诲姟鏁版嵁{}鏉★紝鎵ц淇濆瓨", bigStorageCageOutTaskList.size());
+//        for (BigStorageCageOutTask bigStorageCageOutTask : bigStorageCageOutTaskList
+//        ) {
+//            bigStorageCageOutTaskService.save(bigStorageCageOutTask);
+//        }
+////        bigStorageCageOutTaskService.saveBatch(bigStorageCageOutTaskList);
+//        List<String> glassIds = bigStorageCageOutTaskList.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList());
+//        log.info("灏嗗嚭鐗囩幓鐠儃}鐜荤拑鐘舵�佹敼涓哄凡鍑虹墖", glassIds);
+//        bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>()
+//                .set(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT_ING)
+//                .in(BigStorageCageDetails::getGlassId, glassIds)
+//                .ne(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT));
+//
+//        return Boolean.TRUE;
+//    }
+
+    @Override
+    public BigStorageDTO queryTargetSlotByTempering(GlassInfo glassInfo) {
+//        BigStorageDTO bigStorageDTO = null;
+//        MPJLambdaWrapper<BigStorageCage> wrapper = new MPJLambdaWrapper<>(BigStorageCage.class)
+//                .selectAll(BigStorageCage.class)
+//                .leftJoin(BigStorageCageDetails.class, BigStorageCageDetails::getSlot, BigStorageCage::getSlot)
+//                .eq(BigStorageCage::getEnableState, Const.SLOT_ON)
+//                .in(BigStorageCageDetails::getState, Const.GLASS_STATE_IN_ALL_ZERO)
+//                .eq(BigStorageCageDetails::getEngineerId, glassInfo.getEngineerId())
+//                .eq(BigStorageCageDetails::getTemperingLayoutId, glassInfo.getTemperingLayoutId())
+//                .gt(BigStorageCage::getRemainWidth, Math.max(glassInfo.getWidth(), glassInfo.getHeight()))
+//                .last("limit 1");
+//        if (glassInfo.getTemperingLayoutId() == 0) {
+//            wrapper.eq(BigStorageCageDetails::getFlowCardId, glassInfo.getFlowCardId())
+//                    .eq(BigStorageCageDetails::getLayer, glassInfo.getLayer());
+////            wrapper.eq(BigStorageCageDetails::getWidth, glassInfo.getWidth()).eq(BigStorageCageDetails::getHeight, glassInfo.getHeight());
+//        } else {
+//            wrapper.eq(BigStorageCageDetails::getTemperingFeedSequence, glassInfo.getTemperingFeedSequence() + 1);
+//        }
+//        BigStorageCage bigStorageCage = bigStorageCageService.selectJoinOne(BigStorageCage.class, wrapper);
+//        if (null != bigStorageCage) {
+//            log.info("鏃犻挗鍖栫増鍥緄d鎴栨牴鎹綋鍓嶇幓鐠冪墖搴�+1鎵惧埌鐩爣鏍煎瓙锛歿},鐜荤拑id锛歿}", bigStorageCage.getSlot(), glassInfo.getGlassId());
+//            bigStorageDTO = new BigStorageDTO();
+//            bigStorageDTO.setWidth(bigStorageCage.getRemainWidth());
+//            bigStorageDTO.setSlot(bigStorageCage.getSlot());
+//            bigStorageDTO.setDeviceId(bigStorageCage.getDeviceId());
+//            return bigStorageDTO;
+//        }
+//        bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>()
+//                .eq(BigStorageCage::getEnableState, Const.SLOT_ON)
+//                .eq(BigStorageCage::getRemainWidth, slotWidth)
+////                .notInSql(BigStorageCage::getSlot, "select distinct slot from big_storage_cage_details where state = 0")
+//                .inSql(BigStorageCage::getDeviceId,
+//                        "select distinct device_id from big_storage_cage_details where engineer_id = '" + glassInfo.getEngineerId() + "' and tempering_layout_id = " + glassInfo.getTemperingLayoutId())
+//                .last("limit 1"));
+//        if (null != bigStorageCage) {
+//            log.info("鏍规嵁鐗堝浘id鎵惧埌绗煎瓙鍐呯殑鐩爣鏍煎瓙锛歿},鐜荤拑id锛歿}", bigStorageCage.getSlot(), glassInfo.getGlassId());
+//            bigStorageDTO = new BigStorageDTO();
+//            bigStorageDTO.setWidth(bigStorageCage.getRemainWidth());
+//            bigStorageDTO.setSlot(bigStorageCage.getSlot());
+//            bigStorageDTO.setDeviceId(bigStorageCage.getDeviceId());
+//            return bigStorageDTO;
+//        }
+//
+//        //鑾峰彇鐜荤拑鐨勫帤搴︼細閲嶆柊閫夌瀛愰渶瑕佹寜鐓х瀛愬彲鏀剧幓鐠冨帤搴﹁繘琛岄�夋嫨 鍥犱负瀛愭煡璇㈡帓搴忓涓籹ql鏃犲奖鍝嶏紝鎵�浠ュ厛鎵ц瀛愭煡璇㈣幏鍙栭『搴忥紝鐒跺悗涓�娆″幓鏌ヨ
+//        List<Integer> deviceUsedList = bigStorageCageService.queryFreeDeviceByUsed(glassInfo.getThickness());
+//        List<Integer> deviceUseds = bigStorageCageService.queryFreeDeviceByUsed(glassInfo.getThickness());
+//        List<BigStorageCageDetails> engineerCount1 = baseMapper.selectList(
+//                new LambdaQueryWrapper<BigStorageCageDetails>()
+//                        .notIn(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT, Const.GLASS_STATE_DAMAGE, Const.GLASS_STATE_TAKE)
+//                        .select(BigStorageCageDetails::getEngineerId)
+//                        .groupBy(BigStorageCageDetails::getEngineerId)
+//                        .between(BigStorageCageDetails::getDeviceId, 1, 5)
+//        );
+//        List<BigStorageCageDetails> engineerCount2 = baseMapper.selectList(
+//                new LambdaQueryWrapper<BigStorageCageDetails>()
+//                        .notIn(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT, Const.GLASS_STATE_DAMAGE, Const.GLASS_STATE_TAKE)
+//                        .select(BigStorageCageDetails::getEngineerId)
+//                        .groupBy(BigStorageCageDetails::getEngineerId)
+//                        .between(BigStorageCageDetails::getDeviceId, 6, 8)
+//        );
+//        if (engineerCount1.size() > engineerCount2.size()) {
+//            deviceUsedList.removeIf(device -> device < 6);
+//        } else {
+//            deviceUsedList.removeIf(device -> device > 5);
+//        }
+//        if (CollectionUtils.isEmpty(deviceUsedList)) {
+//            deviceUsedList = deviceUseds;
+//        }
+//        for (Integer item : deviceUsedList) {
+//            bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>()
+//                    .eq(BigStorageCage::getRemainWidth, slotWidth)
+//                    .eq(BigStorageCage::getEnableState, Const.SLOT_ON)
+//                    .eq(BigStorageCage::getDeviceId, item)
+//                    .last("limit 1"));
+//            if (null != bigStorageCage) {
+//                log.info("鎸夌収瀛樼鐜荤拑鏍煎瓙鏁板崰鐢ㄦ渶灏戞柟寮忚幏鍙栦俊鎭牸瀛愪负锛歿},鐜荤拑id锛歿}", bigStorageCage.getSlot(), glassInfo.getGlassId());
+//                bigStorageDTO = new BigStorageDTO();
+//                bigStorageDTO.setWidth(bigStorageCage.getRemainWidth());
+//                bigStorageDTO.setSlot(bigStorageCage.getSlot());
+//                bigStorageDTO.setDeviceId(bigStorageCage.getDeviceId());
+//                return bigStorageDTO;
+//            }
+//        }
+
+        //鑾峰彇鐜荤拑鐨勫帤搴︼細閲嶆柊閫夌瀛愰渶瑕佹寜鐓х瀛愬彲鏀剧幓鐠冨帤搴﹁繘琛岄�夋嫨
+//        List<Integer> deviceNotUsedList = bigStorageCageService.queryFreeDeviceByNotUsed(glassInfo.getThickness());
+//        for (Integer item : deviceNotUsedList) {
+//            bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>()
+//                    .eq(BigStorageCage::getRemainWidth, slotWidth)
+//                    .eq(BigStorageCage::getEnableState, Const.SLOT_ON)
+//                    .eq(BigStorageCage::getDeviceId, item)
+//                    .last("limit 1"));
+//            if (null != bigStorageCage) {
+//                log.info("鎸夌収瀛樼鐜荤拑鏍煎瓙鏁板墿浣欐渶澶氬緱鏂瑰紡鑾峰彇淇℃伅鐗堝浘id:{},鏍煎瓙锛歿},鐜荤拑id锛歿}", glassInfo.getTemperingLayoutId(), bigStorageCage.getSlot(), glassInfo.getGlassId());
+//                bigStorageDTO = new BigStorageDTO();
+//                bigStorageDTO.setWidth(bigStorageCage.getRemainWidth());
+//                bigStorageDTO.setSlot(bigStorageCage.getSlot());
+//                bigStorageDTO.setDeviceId(bigStorageCage.getDeviceId());
+//                return bigStorageDTO;
+//            }
+//        }
+//        Assert.isTrue(null != bigStorageCage, "娌℃湁绌轰綑鐨勭瀛愬瓨鏀剧幓鐠�");
+//        return bigStorageDTO;
+        return null;
+    }
+
+
+    @Scheduled(fixedDelay = 300)
+    public void querySizeByEngineerTask() {
+        log.info("鏌ヨ缁撴灉锛歿}", querySizeByEngineer("P24072402", 1, 10, 8));
+        log.info("鏌ヨ缁撴灉锛歿}", querySizeByEngineer("P24072402", 1, 5, 8));
+
+    }
+
+    public BigStorageDTO querySizeByEngineer(String engineerId, int temperingLayoutId, int temperingFeedSequence, double thickness) {
+        BigStorageDTO bigStorageDTO = null;
+        BigStorageCage bigStorageCage = null;
+        //鑾峰彇绗煎唴褰撳墠鐗堝浘姣忎釜鏍煎瓙宸叉湁鐜荤拑鐨勬渶灏忕増搴� 鑾峰彇绗煎唴褰撳墠鐗堝浘鐨勬墍鏈夌幓鐠冧俊鎭�
+        List<BigStorageCageDetails> cageDetailsList = bigStorageCageDetailsService.list(new QueryWrapper<BigStorageCageDetails>()
+                .select("slot", "min(tempering_feed_sequence) as tempering_feed_sequence")
+                .eq("engineer_id", engineerId).eq("tempering_layout_id", temperingLayoutId)
+                .in("state", Const.GLASS_STATE_IN_ALL_ZERO).groupBy("slot").orderByAsc("min(tempering_feed_sequence)"));
+        if (CollectionUtils.isNotEmpty(cageDetailsList)) {
+            Integer minLength = cageDetailsList.stream().filter(e -> e.getTemperingFeedSequence() > temperingFeedSequence)
+                    .mapToInt(BigStorageCageDetails::getTemperingFeedSequence).min().orElse(1000);
+            List<GlassInfo> infoList = glassInfoService.list(new LambdaQueryWrapper<GlassInfo>()
+                    .notInSql(GlassInfo::getGlassId, "select glass_id from damage where tempering_layout_id = " + temperingLayoutId + " and engineer_id = '" + engineerId + "'")
+                    .eq(GlassInfo::getTemperingLayoutId, temperingLayoutId).eq(GlassInfo::getEngineerId, engineerId).orderByAsc(GlassInfo::getTemperingFeedSequence));
+            int remainWidth = carWidth;
+            int trainNumber = 1;
+            int serialNumber = 0;
+            int min = 0;
+            int temp = infoList.get(0).getTemperingFeedSequence();
+            int slot = 0;
+            int resultTrainNumber = 0;
+            for (GlassInfo e : infoList) {
+                int maxLength = Math.max((int) e.getWidth(), (int) e.getHeight());
+                if (serialNumber >= outCarMaxSize || maxLength > remainWidth || e.getTemperingFeedSequence() >= minLength) {
+                    if (resultTrainNumber != 0) {
+                        min = temp;
+                        break;
+                    }
+                    temp = e.getTemperingFeedSequence();
+                    remainWidth = carWidth;
+                    trainNumber = trainNumber + 1;
+                    serialNumber = 0;
+                }
+                if (temperingFeedSequence == e.getTemperingFeedSequence()) {
+                    resultTrainNumber = trainNumber;
+                }
+                remainWidth = remainWidth - maxLength - glassGap > 0 ? remainWidth - maxLength - glassGap : 0;
+                serialNumber += 1;
+                log.info("{},{},{}", trainNumber, remainWidth, serialNumber);
+                if (e.getTemperingFeedSequence().equals(infoList.get(infoList.size() - 1).getTemperingFeedSequence())) {
+                    min = temp;
+                }
+            }
+            for (BigStorageCageDetails item : cageDetailsList) {
+                if (min <= item.getTemperingFeedSequence() && item.getTemperingFeedSequence() < minLength) {
+                    slot = item.getSlot();
+                    bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>()
+                            .eq(BigStorageCage::getSlot, slot).eq(BigStorageCage::getEnableState, Const.SLOT_ON));
+                    break;
+                }
+            }
+        }
+
+        if (bigStorageCage != null) {
+            bigStorageDTO = new BigStorageDTO();
+            bigStorageDTO.setWidth(bigStorageCage.getRemainWidth());
+            bigStorageDTO.setSlot(bigStorageCage.getSlot());
+            bigStorageDTO.setDeviceId(bigStorageCage.getDeviceId());
+            return bigStorageDTO;
+        }
+
+        bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>()
+                .eq(BigStorageCage::getEnableState, Const.SLOT_ON)
+                .eq(BigStorageCage::getRemainWidth, slotWidth)
+                .inSql(BigStorageCage::getDeviceId,
+                        "select distinct device_id from big_storage_cage_details where engineer_id = '" + engineerId + "' and tempering_layout_id = " + temperingLayoutId)
+                .last("limit 1"));
+        if (null != bigStorageCage) {
+            log.info("鏍规嵁鐗堝浘id鎵惧埌绗煎瓙鍐呯殑鐩爣鏍煎瓙锛歿}", bigStorageCage.getSlot());
+            bigStorageDTO = new BigStorageDTO();
+            bigStorageDTO.setWidth(bigStorageCage.getRemainWidth());
+            bigStorageDTO.setSlot(bigStorageCage.getSlot());
+            bigStorageDTO.setDeviceId(bigStorageCage.getDeviceId());
+            return bigStorageDTO;
+
+        }
+
+        //鑾峰彇鐜荤拑鐨勫帤搴︼細閲嶆柊閫夌瀛愰渶瑕佹寜鐓х瀛愬彲鏀剧幓鐠冨帤搴﹁繘琛岄�夋嫨 鍥犱负瀛愭煡璇㈡帓搴忓涓籹ql鏃犲奖鍝嶏紝鎵�浠ュ厛鎵ц瀛愭煡璇㈣幏鍙栭『搴忥紝鐒跺悗涓�娆″幓鏌ヨ
+        List<Integer> deviceUsedList = bigStorageCageService.queryFreeDeviceByUsed(thickness);
+        for (Integer item : deviceUsedList) {
+            bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>()
+                    .eq(BigStorageCage::getRemainWidth, slotWidth)
+                    .eq(BigStorageCage::getEnableState, Const.SLOT_ON)
+                    .eq(BigStorageCage::getDeviceId, item)
+                    .last("limit 1"));
+            if (null != bigStorageCage) {
+                log.info("鎸夌収瀛樼鐜荤拑鏍煎瓙鏁板崰鐢ㄦ渶灏戞柟寮忚幏鍙栦俊鎭牸瀛愪负锛歿}", bigStorageCage.getSlot());
+                bigStorageDTO = new BigStorageDTO();
+                bigStorageDTO.setWidth(bigStorageCage.getRemainWidth());
+                bigStorageDTO.setSlot(bigStorageCage.getSlot());
+                bigStorageDTO.setDeviceId(bigStorageCage.getDeviceId());
+                return bigStorageDTO;
+            }
+        }
+        Assert.isTrue(null != bigStorageCage, "娌℃湁绌轰綑鐨勭瀛愬瓨鏀剧幓鐠�");
+        return bigStorageDTO;
+    }
+
+
+}
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml
index 30c7cdc..8865de3 100644
--- a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml
@@ -13,6 +13,7 @@
         <result column="engineer_id" property="engineerId"/>
         <result column="tempering_layout_id" property="temperingLayoutId"/>
         <result column="slot" property="slot"/>
+        <result column="glass_count" property="glassCount"/>
         <result column="max_sequence" property="maxSequence"/>
         <result column="min_sequence" property="minSequence"/>
         <result column="remain_width" property="remainWidth"/>
@@ -64,6 +65,7 @@
                  SELECT ENGINEER_ID,
                         TEMPERING_LAYOUT_ID,
                         SLOT,
+                        count(*)                     as glass_count,
                         MAX(TEMPERING_FEED_SEQUENCE) AS MAX_SEQUENCE,
                         MIN(TEMPERING_FEED_SEQUENCE) AS MIN_SEQUENCE
                  FROM BIG_STORAGE_CAGE_DETAILS
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageInTaskMapper.xml b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageInTaskMapper.xml
new file mode 100644
index 0000000..84a0817
--- /dev/null
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageInTaskMapper.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.mes.bigstoragecagetask.mapper.BigStorageCageTaskMapper">
+
+    <resultMap id="baseMap" type="com.mes.bigstoragecagetask.entity.BigStorageCageTask">
+        <result column="glass_id" property="glassId"/>
+        <result column="start_slot" property="startSlot"/>
+        <result column="target_slot" property="targetSlot"/>
+        <result column="task_state" property="taskState"/>
+    </resultMap>
+    <insert id="saveTaskMessage">
+        INSERT INTO ${tableName} (glass_id, start_slot, target_slot,task_state)
+        VALUES
+        <foreach collection="list" item="item" index="index" separator=",">
+            (#{item.glassId}, #{item.startSlot},#{item.targetSlot},#{item.taskState})
+        </foreach>
+    </insert>
+    <delete id="removeAll">
+        delete
+        from ${tableName}
+    </delete>
+
+    <select id="queryTaskMessage" resultMap="baseMap">
+        select *
+        from ${tableName}
+        where glass_id is not null
+          and glass_id != ''
+    </select>
+
+
+    <update id="updateTaskMessage">
+        UPDATE ${tableName}
+        SET target_slot = #{task.targetSlot}
+        where glass_id = #{task.glassId}
+    </update>
+
+
+</mapper>
\ No newline at end of file
diff --git a/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/job/RawGlassTask.java b/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/job/RawGlassTask.java
index 18032eb..f2d1129 100644
--- a/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/job/RawGlassTask.java
+++ b/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/job/RawGlassTask.java
@@ -8,10 +8,15 @@
 import com.mes.common.config.Const;
 import com.mes.engineering.entity.Engineering;
 import com.mes.engineering.mapper.EngineeringMapper;
+import com.mes.opctask.entity.LoadGlassDeviceTask;
+import com.mes.opctask.service.LoadGlassDeviceTaskService;
 import com.mes.rawglassdetails.entity.RawGlassStorageDetails;
 import com.mes.rawglassdetails.service.RawGlassStorageDetailsService;
+import com.mes.rawglassstation.entity.RawGlassStorageStation;
+import com.mes.rawglassstation.service.RawGlassStorageStationService;
 import com.mes.rawglasstask.entity.RawGlassStorageTask;
 import com.mes.rawglasstask.service.RawGlassStorageTaskService;
+import com.mes.uppattenusage.entity.UpPattenUsage;
 import com.mes.uppattenusage.entity.vo.UpPattenUsageVO;
 import com.mes.uppattenusage.mapper.UpPattenUsageMapper;
 import lombok.extern.slf4j.Slf4j;
@@ -38,45 +43,50 @@
 
     @Autowired
     private RawGlassStorageTaskService rawGlassStorageTaskService;
+    @Autowired
+    private RawGlassStorageStationService rawGlassStorageStationService;
 
     @Resource
     private EngineeringMapper engineeringMapper;
     @Resource
     private UpPattenUsageMapper upPattenUsageMapper;
 
+    @Resource
+    private LoadGlassDeviceTaskService loadGlassDeviceTaskService;
+
     @Autowired(required = false)
     private MiloService miloService;
 
-    private static final List<Integer> LIFTING_STATION = Arrays.asList(4);
-    private static final List<String> LOAD_STATION_01 = Arrays.asList("101", "102");
-    private static final List<String> LOAD_STATION_02 = Arrays.asList("103", "104");
-    private static final List<Integer> LOAD_STATION_MAX = Arrays.asList(102, 104);
+
+    private static final String LOAD_GLASS_DEVICE_ONE_TASK = "load_glass_device_one_task";
+
+    private static final String LOAD_GLASS_DEVICE_TWO_TASK = "load_glass_device_two_task";
+
+    private static final List<Integer> LOAD_STATION_01 = Arrays.asList(101, 102);
+    private static final List<Integer> LOAD_STATION_02 = Arrays.asList(103, 104);
     private static final Integer LEFTING_01 = 98;
     private static final Integer LEFTING_02 = 99;
-    private static final Integer LOAD_GLASS_01_01 = 101;
-    private static final Integer LOAD_GLASS_01_02 = 102;
-    private static final Integer LOAD_GLASS_02_01 = 103;
-    private static final Integer LOAD_GLASS_02_02 = 104;
+    private static final Integer LOAD_GLASS_ONE_DEVICE = 5;
+    private static final Integer LOAD_GLASS_TWO_DEVICE = 6;
 
     @Scheduled(fixedDelay = 1000)
     public void rawStorageTask() throws Exception {
-        ReadWriteEntity requestWord = miloService.readFromOpcUa("A01-CC.dev.request");
-        ReadWriteEntity confireWord = miloService.readFromOpcUa("A01-CC.dev.confirmationWord");
-        ReadWriteEntity reportWord = miloService.readFromOpcUa("A01-CC.dev.reportWord");
-        ReadWriteEntity taskWord = miloService.readFromOpcUa("A01-CC.dev.taskWord");
+        ReadWriteEntity requestWord = miloService.readFromOpcUa("PLC.CC.request");
+        ReadWriteEntity confireWord = miloService.readFromOpcUa("PLC.CC.confirmation");
+        ReadWriteEntity reportWord = miloService.readFromOpcUa("PLC.CC.reportWord");
+        ReadWriteEntity taskWord = miloService.readFromOpcUa("PLC.CC.taskWord");
         String requestValue = requestWord.getValue() + "";
         if ("0".equals(requestValue)) {
             if ("1".equals(confireWord.getValue() + "") && "0".equals(reportWord.getValue() + "")) {
                 List<ReadWriteEntity> list = new ArrayList<>();
-                list.add(generateReadWriteEntity("A01-CC.dev.confirmationWord", 0));
+                list.add(generateReadWriteEntity("PLC.CC.confirmation", 0));
                 miloService.writeToOpcWord(list);
             }
             if ("1".equals(taskWord.getValue() + "")) {
                 List<ReadWriteEntity> list = new ArrayList<>();
-                list.add(generateReadWriteEntity("A01-CC.dev.taskWord", 0));
-//                list.add(generateReadWriteEntity("A01-CC.dev.taskSending", 0));
-                list.add(generateReadWriteEntity("A01-CC.dev.startSlot", 0));
-                list.add(generateReadWriteEntity("A01-CC.dev.endSlot", 0));
+                list.add(generateReadWriteEntity("PLC.CC.taskWord", 0));
+                list.add(generateReadWriteEntity("PLC.CC.startSlot", 0));
+                list.add(generateReadWriteEntity("PLC.CC.endSlot", 0));
                 miloService.writeToOpcWord(list);
             }
             return;
@@ -112,7 +122,7 @@
 
     @Scheduled(fixedDelay = 1000)
     public void rawStorageInCar() throws Exception {
-        ReadWriteEntity entity = miloService.readFromOpcUa("A01-CC.dev.inCar");
+        ReadWriteEntity entity = miloService.readFromOpcUa("PLC.CC.inCar");
         String value = entity.getValue() + "";
         if (!"1".equals(value)) {
             log.info("澶ц溅涓婃病鏈夋灦瀛�");
@@ -132,7 +142,7 @@
 
     @Scheduled(fixedDelay = 1000)
     public void rawStorageFinish() throws Exception {
-        ReadWriteEntity entity = miloService.readFromOpcUa("A01-CC.dev.reportWord");
+        ReadWriteEntity entity = miloService.readFromOpcUa("PLC.CC.reportWord");
         String value = entity.getValue() + "";
         if ("0".equals(value)) {
             log.info("褰撳墠浠诲姟鏈眹鎶ワ紝缁撴潫鏈浠诲姟");
@@ -147,6 +157,7 @@
         RawGlassStorageTask task = rawGlassStorageTaskService.getOne(new LambdaQueryWrapper<RawGlassStorageTask>()
                 .in(RawGlassStorageTask::getTaskState, Const.RAW_GLASS_TASK_NEW));
         RawGlassStorageDetails targetDetails = generateDetails(details, task.getEndSlot());
+        int deviceId = details.getDeviceId();
         Integer taskType = task.getTaskType();
         if ("1".equals(value)) {
             log.info("灏嗚鎯呰〃鐨勭姸鎬佹敼涓哄凡鍑哄簱");
@@ -159,6 +170,7 @@
                     .set(RawGlassStorageTask::getTaskState, Const.RAW_GLASS_TASK_SUCCESS));
             switch (taskType) {
                 case 1:
+                case 3:
                     log.info("1銆佸叆搴擄紝3銆佽皟搴︿换鍔°�倇}", taskType);
                     if (targetDetails.getRemainQuantity() > 0) {
                         rawGlassStorageDetailsService.save(targetDetails);
@@ -169,6 +181,7 @@
                     log.info("2銆佸嚭鐗�,4銆佸叆搴撹姹傘�倇}", taskType);
                     targetDetails = new RawGlassStorageDetails();
                     targetDetails.setSlot(task.getEndSlot());
+                    targetDetails.setDeviceId(deviceId);
                     targetDetails.setShelf(task.getStartSlot());
                     targetDetails.setState(Const.RAW_GLASS_STATE_IN);
                     rawGlassStorageDetailsService.save(targetDetails);
@@ -194,7 +207,7 @@
 
         }
         List<ReadWriteEntity> list = new ArrayList<>();
-        list.add(generateReadWriteEntity("A01-CC.dev.confirmationWord", 1));
+        list.add(generateReadWriteEntity("PLC.CC.confirmation", 1));
         miloService.writeToOpcWord(list);
     }
 
@@ -253,10 +266,10 @@
         rawGlassStorageDetailsService.generateTask(startSlot, lefting, startSlot, rawGlassList.get(0).getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_OUT);
 
 //        List<ReadWriteEntity> list = new ArrayList<>();
-//        list.add(generateReadWriteEntity("A01-CC.dev.taskWord", 1));
-//        list.add(generateReadWriteEntity("A01-CC.dev.taskSending", 1));
-//        list.add(generateReadWriteEntity("A01-CC.dev.startSlot", startSlot));
-//        list.add(generateReadWriteEntity("A01-CC.dev.endSlot", lefting));
+//        list.add(generateReadWriteEntity("PLC.CC.taskWord", 1));
+//        list.add(generateReadWriteEntity("PLC.CC.taskSending", 1));
+//        list.add(generateReadWriteEntity("PLC.CC.startSlot", startSlot));
+//        list.add(generateReadWriteEntity("PLC.CC.endSlot", lefting));
 //        miloService.writeToOpcWord(list);
 
         //淇敼鍑虹墖浠诲姟鐘舵��
@@ -287,10 +300,10 @@
         rawGlassStorageDetailsService.generateTask(details.getSlot(), details.getShelf(), details.getShelf(),
                 details.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_IN);
 //        List<ReadWriteEntity> list = new ArrayList<>();
-//        list.add(generateReadWriteEntity("A01-CC.dev.taskWord", 1));
-//        list.add(generateReadWriteEntity("A01-CC.dev.taskSending", 1));
-//        list.add(generateReadWriteEntity("A01-CC.dev.startSlot", details.getSlot()));
-//        list.add(generateReadWriteEntity("A01-CC.dev.endSlot", details.getShelf()));
+//        list.add(generateReadWriteEntity("PLC.CC.taskWord", 1));
+//        list.add(generateReadWriteEntity("PLC.CC.taskSending", 1));
+//        list.add(generateReadWriteEntity("PLC.CC.startSlot", details.getSlot()));
+//        list.add(generateReadWriteEntity("PLC.CC.endSlot", details.getShelf()));
 //        miloService.writeToOpcWord(list);
         //鐢熸垚宸ヤ綅浠诲姟锛屽皢鍚婅浣嶇殑鐜荤拑鐘舵�佹敼浣嶈繘绗间腑
         //淇敼鍚婅浣嶇殑鍘熺墖鐘舵�佷负103 鍑虹墖涓�
@@ -315,149 +328,178 @@
             log.info("姝e湪鎵ц鐨勫伐绋嬪師鐗囨棤鍙笂鐗囩殑鍘熺墖淇℃伅");
             return Boolean.FALSE;
         }
-        //鑾峰彇褰撳墠涓婄墖浣�1鍙锋灦瀛愪俊鎭�
-        int endSlot = stationCell == LOAD_GLASS_01_01 ? LOAD_GLASS_01_01 : LOAD_GLASS_02_01;
-        int endSlot02 = stationCell == LOAD_GLASS_01_02 ? LOAD_GLASS_01_01 : LOAD_GLASS_02_02;
+        //鑾峰彇褰撳墠闇�瑕佷笂鐗囩殑鍘熺墖鏁版嵁
         Map<String, List<UpPattenUsageVO>> upListMap = pattenUsageList.stream()
                 .collect(Collectors.groupingBy(UpPattenUsageVO::getGroupNumber));
-        //1銆佹煡璇�2涓笂鐗囩殑鍘熺墖璇︽儏
-        List<RawGlassStorageDetails> rawGlassDetailsList = rawGlassStorageDetailsService.list(new LambdaQueryWrapper<RawGlassStorageDetails>()
-                .eq(RawGlassStorageDetails::getState, Const.GLASS_STATE_IN).in(RawGlassStorageDetails::getDeviceId, stationCell)
-                .orderByAsc(RawGlassStorageDetails::getSlot));
-        List<UpPattenUsageVO> upPattenUsage01VOS = upListMap.get("1");
-        UpPattenUsageVO usageVO = upPattenUsage01VOS.get(0);
-        if (CollectionUtils.isEmpty(rawGlassDetailsList)) {
-            //琛ㄧず1涓婄墖浣嶆病鏈夋灦瀛愶紝鐩存帴鎵惧師鐗囨斁鍏ュ搴旇矾绾跨殑1鍙蜂笂鐗囦綅
-            RawGlassStorageDetails details = rawGlassStorageDetailsService.getOne(new LambdaQueryWrapper<RawGlassStorageDetails>()
-                            .eq(RawGlassStorageDetails::getFilmsId, usageVO.getFilmsId())
-                            .eq(RawGlassStorageDetails::getPatternWidth, usageVO.getWidth())
-                            .eq(RawGlassStorageDetails::getPatternHeight, usageVO.getHeight())
-                            .eq(RawGlassStorageDetails::getPatternThickness, usageVO.getThickness())
-                            .inSql(RawGlassStorageDetails::getSlot, "select slot from raw_glass_storage_station where enable_state = 1")
-                            .eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
-//                    .gt(RawGlassStorageDetails::getRemainQuantity, upPattenUsage01VOS.size())
-                            .orderByAsc(RawGlassStorageDetails::getRemainQuantity)
-                            .last("limit 1")
-            );
-            rawGlassStorageDetailsService.generateTask(details.getSlot(), endSlot, details.getSlot(), details.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
+        List<UpPattenUsageVO> usageVOS = upListMap.get("1");
+        //鑾峰彇褰撳墠涓婄墖浣�1鍙锋灦瀛愪俊鎭�
+        List<Integer> loadStation = LOAD_GLASS_ONE_DEVICE.equals(stationCell) ? LOAD_STATION_01 : LOAD_STATION_02;
+        List<RawGlassStorageStation> stations = rawGlassStorageStationService.list(new LambdaQueryWrapper<RawGlassStorageStation>()
+                .in(RawGlassStorageStation::getSlot, loadStation)
+                .eq(RawGlassStorageStation::getEnableState, Const.SLOT_ON).orderByAsc(RawGlassStorageStation::getSlot));
+        if (CollectionUtils.isEmpty(stations)) {
+            log.info("娌℃湁鍙敤鐨勪笂鐗囦綅");
+            return Boolean.FALSE;
+        }
 
+
+        List<RawGlassStorageDetails> loadStationList = rawGlassStorageDetailsService.list(new LambdaQueryWrapper<RawGlassStorageDetails>()
+                .inSql(RawGlassStorageDetails::getSlot, "select slot from raw_glass_storage_station where enable_state = 1")
+                .eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
+                .eq(RawGlassStorageDetails::getDeviceId, stationCell));
+        if (stations.size() == 1) {
+            if (CollectionUtils.isEmpty(loadStationList)) {
+                RawGlassStorageDetails rawDetails = getRawGlassStorageDetailsBySize(usageVOS.get(0), usageVOS.size());
+                rawGlassStorageDetailsService.generateTask(rawDetails.getSlot(), stations.get(0).getSlot(), rawDetails.getShelf(), rawDetails.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
+                //缁撴潫璋冨害浠诲姟 淇敼宸ヤ綅鐘舵��(璧峰浣嶏級鐘舵�佷负103 RAW_GLASS_STATE_RUNNING 浠诲姟瀹屾垚鍚庡皢鐘舵�佹敼涓�101  鐩爣浣嶆柊澧炰竴鏉℃暟鎹紝鏋跺瓙鍙蜂负锛堣捣濮嬩綅锛�
+                rawGlassStorageDetailsService.update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
+                        .eq(RawGlassStorageDetails::getSlot, rawDetails.getSlot()).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
+                        .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING));
+                return Boolean.TRUE;
+            }
+            RawGlassStorageDetails oneLoadStation = loadStationList.get(0);
+            if (oneLoadStation.getRemainQuantity() <= 0 || !compareRawSize(usageVOS.get(0), oneLoadStation)) {
+                rawGlassStorageDetailsService.generateTask(stations.get(0).getSlot(), oneLoadStation.getShelf(), oneLoadStation.getShelf(), oneLoadStation.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
+                rawGlassStorageDetailsService.update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
+                        .eq(RawGlassStorageDetails::getSlot, oneLoadStation.getSlot()).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
+                        .set(RawGlassStorageDetails::getDeviceId, Const.RAW_GLASS_STATE_RUNNING));
+                return Boolean.FALSE;
+            }
+        }
+
+        log.info("鑾峰彇{}涓婄墖绾跨殑宸ヤ綅淇℃伅{}", stationCell, loadStationList);
+        if (CollectionUtils.isEmpty(loadStationList)) {
+            log.info("1鍙蜂笂鐗囦綅鐢熸垚璋冨害浠诲姟");
+            RawGlassStorageDetails rawDetails = getRawGlassStorageDetailsBySize(usageVOS.get(0), usageVOS.size());
+            rawGlassStorageDetailsService.generateTask(rawDetails.getSlot(), loadStation.get(0), rawDetails.getShelf(), rawDetails.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
             //缁撴潫璋冨害浠诲姟 淇敼宸ヤ綅鐘舵��(璧峰浣嶏級鐘舵�佷负103 RAW_GLASS_STATE_RUNNING 浠诲姟瀹屾垚鍚庡皢鐘舵�佹敼涓�101  鐩爣浣嶆柊澧炰竴鏉℃暟鎹紝鏋跺瓙鍙蜂负锛堣捣濮嬩綅锛�
             rawGlassStorageDetailsService.update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
-                    .eq(RawGlassStorageDetails::getSlot, details.getSlot()).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
-                    .set(RawGlassStorageDetails::getDeviceId, Const.RAW_GLASS_STATE_RUNNING));
+                    .eq(RawGlassStorageDetails::getSlot, rawDetails.getSlot()).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
+                    .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING));
             return Boolean.TRUE;
         }
-        RawGlassStorageDetails glassStorageDetails = rawGlassDetailsList.get(0);
-        if (rawGlassDetailsList.size() == 2) {
-            if (!((usageVO.getWidth() == glassStorageDetails.getPatternWidth() && usageVO.getHeight() == glassStorageDetails.getPatternHeight() &&
-                    usageVO.getThickness() == glassStorageDetails.getPatternThickness() && usageVO.getFilmsId().equals(glassStorageDetails.getFilmsId())))
-                    || ((usageVO.getWidth() == glassStorageDetails.getPatternWidth() && usageVO.getHeight() == glassStorageDetails.getPatternHeight() &&
-                    usageVO.getThickness() == glassStorageDetails.getPatternThickness() && usageVO.getFilmsId().equals(glassStorageDetails.getFilmsId()))
-                    && glassStorageDetails.getRemainQuantity() == 0)) {
-                //灏嗘灦瀛愭斁鍥炲師宸ヤ綅涓�
-                rawGlassStorageDetailsService.generateTask(endSlot, glassStorageDetails.getShelf(), glassStorageDetails.getShelf(), 0, Const.RAW_GLASS_TASK_TYPE_DISPATCH);
-//                List<ReadWriteEntity> list = new ArrayList<>();
-//                list.add(generateReadWriteEntity("A01-CC.dev.taskWord", 1));
-//                list.add(generateReadWriteEntity("A01-CC.dev.taskSending", 1));
-//                list.add(generateReadWriteEntity("A01-CC.dev.startSlot", endSlot));
-//                list.add(generateReadWriteEntity("A01-CC.dev.endSlot", glassStorageDetails.getShelf()));
-//                miloService.writeToOpcWord(list);
-                rawGlassStorageDetailsService.update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
-                        .eq(RawGlassStorageDetails::getSlot, glassStorageDetails.getSlot()).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
-                        .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING));
-                return Boolean.TRUE;
-            }
-            return Boolean.FALSE;
-        }
-        //todo:1鏉$嚎涓斿綋鏉$嚎涓�2鍙蜂笂鐗囦负
-        if (LOAD_STATION_MAX.contains(glassStorageDetails.getSlot())) {
-            log.info("涓婄墖浣�2鍙锋湁鏋跺瓙锛岀粨鏉熸湰鏉$嚎{}鐨勮皟搴︿换鍔�", stationCell);
-            if (!((usageVO.getWidth() == glassStorageDetails.getPatternWidth() && usageVO.getHeight() == glassStorageDetails.getPatternHeight() &&
-                    usageVO.getThickness() == glassStorageDetails.getPatternThickness() && usageVO.getFilmsId().equals(glassStorageDetails.getFilmsId())))
-                    || ((usageVO.getWidth() == glassStorageDetails.getPatternWidth() && usageVO.getHeight() == glassStorageDetails.getPatternHeight() &&
-                    usageVO.getThickness() == glassStorageDetails.getPatternThickness() && usageVO.getFilmsId().equals(glassStorageDetails.getFilmsId()))
-                    && glassStorageDetails.getRemainQuantity() == 0)) {
-                //灏嗘灦瀛愭斁鍥炲師宸ヤ綅涓�
-                rawGlassStorageDetailsService.generateTask(endSlot02, glassStorageDetails.getShelf(), glassStorageDetails.getShelf(), 0, Const.RAW_GLASS_TASK_TYPE_DISPATCH);
-//                List<ReadWriteEntity> list = new ArrayList<>();
-//                list.add(generateReadWriteEntity("A01-CC.dev.taskWord", 1));
-//                list.add(generateReadWriteEntity("A01-CC.dev.taskSending", 1));
-//                list.add(generateReadWriteEntity("A01-CC.dev.startSlot", endSlot02));
-//                list.add(generateReadWriteEntity("A01-CC.dev.endSlot", glassStorageDetails.getShelf()));
-//                miloService.writeToOpcWord(list);
-                rawGlassStorageDetailsService.update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
-                        .eq(RawGlassStorageDetails::getSlot, glassStorageDetails.getSlot()).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
-                        .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING));
-                return Boolean.TRUE;
-            }
-            return Boolean.FALSE;
-        } else {
-            //姣旇緝褰撳墠1鍙锋灦瀛愪笂鐨勭幓鐠冨墿浣欐暟閲忔槸鍚︿负0鎴栬�呭凡鐢ㄥ畬
-            if (usageVO.getWidth() == glassStorageDetails.getPatternWidth() && usageVO.getHeight() == glassStorageDetails.getPatternHeight() &&
-                    usageVO.getThickness() == glassStorageDetails.getPatternThickness() && usageVO.getFilmsId().equals(glassStorageDetails.getFilmsId())) {
-                RawGlassStorageDetails details = null;
-                if (upPattenUsage01VOS.size() > glassStorageDetails.getRemainQuantity()) {
-                    //2鍙蜂綅涓婄墖锛氱户缁綋鍓嶅昂瀵哥殑鍘熺墖
-                    details = rawGlassStorageDetailsService.getOne(new LambdaQueryWrapper<RawGlassStorageDetails>()
-                            .eq(RawGlassStorageDetails::getFilmsId, usageVO.getFilmsId())
-                            .eq(RawGlassStorageDetails::getPatternWidth, usageVO.getWidth())
-                            .eq(RawGlassStorageDetails::getPatternHeight, usageVO.getHeight())
-                            .eq(RawGlassStorageDetails::getPatternThickness, usageVO.getThickness())
-                            .gt(RawGlassStorageDetails::getRemainQuantity, upPattenUsage01VOS.size())
-                            .orderByAsc(RawGlassStorageDetails::getRemainQuantity)
-                            .last("limit 1"));
+        RawGlassStorageDetails oneLoadStation = loadStationList.stream().filter(e -> e.getSlot().equals(loadStation.get(0))).findFirst().orElse(null);
+        if (null == oneLoadStation) {
+            RawGlassStorageDetails twoLoadStation = loadStationList.stream().filter(e -> e.getSlot().equals(loadStation.get(1))).findFirst().orElse(null);
+            if (twoLoadStation.getRemainQuantity() > 0) {
+                if (compareRawSize(usageVOS.get(0), twoLoadStation)) {
+//                    2鍙蜂笂鐗囦綅鐨勫師鐗囦俊鎭簮宸ョ▼淇℃伅涓�鑷达紝鍙笂鐗囨搷浣滐紝缁撴潫鏈浠诲姟
+                    return Boolean.FALSE;
                 } else {
-                    //2鍙蜂綅涓婄墖锛氳幏鍙栫浜岀灏哄鐨勫師鐗�
-                    List<UpPattenUsageVO> upPattenUsage02VOS = upListMap.get("2");
-                    if (CollectionUtils.isEmpty(upPattenUsage01VOS)) {
-                        return Boolean.FALSE;
-                    }
-                    usageVO = upPattenUsage02VOS.get(0);
-                    details = rawGlassStorageDetailsService.getOne(new LambdaQueryWrapper<RawGlassStorageDetails>()
-                            .eq(RawGlassStorageDetails::getFilmsId, usageVO.getFilmsId())
-                            .eq(RawGlassStorageDetails::getPatternWidth, usageVO.getWidth())
-                            .eq(RawGlassStorageDetails::getPatternHeight, usageVO.getHeight())
-                            .eq(RawGlassStorageDetails::getPatternThickness, usageVO.getThickness())
-                            .gt(RawGlassStorageDetails::getRemainQuantity, upPattenUsage01VOS.size())
-                            .orderByAsc(RawGlassStorageDetails::getRemainQuantity)
-                            .last("limit 1"));
+//                    鐢熸垚1鍙蜂綅鍏ュ簱浠诲姟
+                    log.info("2鍙蜂笂鐗囦綅鐜荤拑灏哄涓嶄竴鑷达紝1鍙蜂笂鐗囦綅鐢熸垚璋冨害浠诲姟");
+                    //鎸夌収灏哄鍙婃暟閲忚幏鍙栨暟閲忔渶鎺ヨ繎鐨勬牸瀛愪俊鎭�
+                    RawGlassStorageDetails rawDetails = getRawGlassStorageDetailsBySize(usageVOS.get(0), usageVOS.size());
+                    rawGlassStorageDetailsService.generateTask(rawDetails.getSlot(), loadStation.get(0), rawDetails.getShelf(), rawDetails.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
+                    //缁撴潫璋冨害浠诲姟 淇敼宸ヤ綅鐘舵��(璧峰浣嶏級鐘舵�佷负103 RAW_GLASS_STATE_RUNNING 浠诲姟瀹屾垚鍚庡皢鐘舵�佹敼涓�101  鐩爣浣嶆柊澧炰竴鏉℃暟鎹紝鏋跺瓙鍙蜂负锛堣捣濮嬩綅锛�
+                    rawGlassStorageDetailsService.update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
+                            .eq(RawGlassStorageDetails::getSlot, rawDetails.getSlot()).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
+                            .set(RawGlassStorageDetails::getDeviceId, Const.RAW_GLASS_STATE_RUNNING));
+                    return Boolean.TRUE;
                 }
-                //灏嗗伐浣嶇殑鏋跺瓙浼犻�佸埌涓婄墖浣�
-                rawGlassStorageDetailsService.generateTask(details.getSlot(), endSlot02, details.getShelf(), details.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
-                rawGlassStorageDetailsService.update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
-                        .eq(RawGlassStorageDetails::getSlot, details.getSlot()).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
-                        .set(RawGlassStorageDetails::getDeviceId, Const.RAW_GLASS_STATE_RUNNING));
-
-//                List<ReadWriteEntity> list = new ArrayList<>();
-//                list.add(generateReadWriteEntity("A01-CC.dev.taskWord", 1));
-//                list.add(generateReadWriteEntity("A01-CC.dev.taskSending", 1));
-//                list.add(generateReadWriteEntity("A01-CC.dev.startSlot", glassStorageDetails.getShelf()));
-//                list.add(generateReadWriteEntity("A01-CC.dev.endSlot", endSlot02));
-//                miloService.writeToOpcWord(list);
-
-                return Boolean.TRUE;
             } else {
-                //灏嗘灦瀛愭斁鍥炲師宸ヤ綅涓�
-                rawGlassStorageDetailsService.generateTask(endSlot, glassStorageDetails.getShelf(), glassStorageDetails.getShelf(), glassStorageDetails.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
+//                鐢熸垚1鍙蜂綅鍏ュ簱浠诲姟
+                log.info("2鍙蜂笂鐗囦綅浠呭墿绌烘灦瀛愶紝1鍙蜂笂鐗囦綅鐢熸垚璋冨害浠诲姟");
+                RawGlassStorageDetails rawDetails = getRawGlassStorageDetailsBySize(usageVOS.get(0), usageVOS.size());
+                rawGlassStorageDetailsService.generateTask(rawDetails.getSlot(), loadStation.get(0), rawDetails.getShelf(), rawDetails.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
                 rawGlassStorageDetailsService.update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
-                        .eq(RawGlassStorageDetails::getSlot, endSlot).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
+                        .eq(RawGlassStorageDetails::getSlot, rawDetails.getSlot()).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
                         .set(RawGlassStorageDetails::getDeviceId, Const.RAW_GLASS_STATE_RUNNING));
+                return Boolean.TRUE;
+            }
+        } else {
+            String tableName = stationCell == 5 ? LOAD_GLASS_DEVICE_ONE_TASK : LOAD_GLASS_DEVICE_TWO_TASK;
+            if (oneLoadStation.getRemainQuantity() > 0) {
+                if (compareRawSize(usageVOS.get(0), oneLoadStation)) {
+                    //缁撴潫浠撳偍璋冨害锛岀瓑寰呬笂鐗囦换鍔�
+                    //鍦ㄤ笂鐗囦换鍔℃墽琛岀┖闂茶繃绋嬩腑,鍙墽琛屼簩鍙蜂綅鍑哄叆搴撲换鍔�  浜屽彿鏋跺瓙鐨勪俊鎭槸鍚﹂渶瑕佽皟搴�,涓嶉渶瑕佽皟搴︾洿鎺ユ斁鍥瀎alse
+                    log.info("鑾峰彇浜屽彿浣嶅師鐗囦俊鎭�");
+                    RawGlassStorageDetails twoLoadStation = loadStationList.stream().filter(e -> e.getSlot().equals(loadStation.get(1))).findFirst().orElse(null);
+                    if (null == twoLoadStation) {
+                        //鎸夌収灏哄鐢熸垚浜屽彿浣嶄笂鐗囦换鍔′俊鎭�
+                        LoadGlassDeviceTask loadTask = loadGlassDeviceTaskService.queryTaskMessage(tableName);
+                        RawGlassStorageDetails rawDetails = null;
+                        if (oneLoadStation.getRemainQuantity() > (loadTask.getTotalCount() + loadTask.getDamageCount())) {
+                            usageVOS = upListMap.get("2");
+                            if (CollectionUtils.isEmpty(usageVOS)) {
+                                log.info("褰撳墠宸ョ▼鐨勫師鐗囧嵆灏嗙敤瀹岋紝缁撴潫鏈璋冨害");
+                                return Boolean.FALSE;
+                            }
+                            rawDetails = getRawGlassStorageDetailsBySize(usageVOS.get(0), usageVOS.size());
+                        } else {
+                            rawDetails = getRawGlassStorageDetailsBySize(usageVOS.get(0), usageVOS.size());
 
-//                List<ReadWriteEntity> list = new ArrayList<>();
-//                list.add(generateReadWriteEntity("A01-CC.dev.taskWord", 1));
-//                list.add(generateReadWriteEntity("A01-CC.dev.taskSending", 1));
-//                list.add(generateReadWriteEntity("A01-CC.dev.startSlot", endSlot));
-//                list.add(generateReadWriteEntity("A01-CC.dev.endSlot", glassStorageDetails.getShelf()));
-//                miloService.writeToOpcWord(list);
+                        }
+                        if (null == rawDetails) {
+                            log.info("鍘熺墖浠撳偍娌℃湁鐩稿悓灏哄鐨勭幓鐠�");
+                            return Boolean.FALSE;
+                        }
+                        rawGlassStorageDetailsService.generateTask(rawDetails.getSlot(), loadStation.get(1), rawDetails.getShelf(), rawDetails.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
+                        //缁撴潫璋冨害浠诲姟 淇敼宸ヤ綅鐘舵��(璧峰浣嶏級鐘舵�佷负103 RAW_GLASS_STATE_RUNNING 浠诲姟瀹屾垚鍚庡皢鐘舵�佹敼涓�101  鐩爣浣嶆柊澧炰竴鏉℃暟鎹紝鏋跺瓙鍙蜂负锛堣捣濮嬩綅锛�
+                        rawGlassStorageDetailsService.update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
+                                .eq(RawGlassStorageDetails::getSlot, rawDetails.getSlot()).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
+                                .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING));
+                        return Boolean.TRUE;
+                    } else {
+                        //todo:褰撲簩鍙蜂负鐨勫昂瀵稿ぇ浜�0鏃讹紝鏄惁鎵ц璋冨害浠诲姟锛屾洿鎹㈠綋鍓嶅師鐗囩殑灏哄锛岀瓑寰呬笅涓�娆′换鍔$殑鐩存帴鎵ц锛涜繕鏄户缁瓑寰咃紝褰撳昂瀵镐笉涓�鏍凤紝绛夊緟涓�鍙峰伐浣嶇殑杩涘嚭搴撹皟搴︿换鍔°��
+                        if (twoLoadStation.getRemainQuantity() > 0) {
+                            LoadGlassDeviceTask loadTask = loadGlassDeviceTaskService.queryTaskMessage(tableName);
+                            if (oneLoadStation.getRemainQuantity() > (loadTask.getTotalCount() + loadTask.getDamageCount())) {
+                                usageVOS = upListMap.get("2");
+                                if (CollectionUtils.isEmpty(usageVOS)) {
+                                    log.info("褰撳墠宸ョ▼鐨勫師鐗囧嵆灏嗙敤瀹岋紝缁撴潫鏈璋冨害");
+                                    return Boolean.FALSE;
+                                }
+                            }
+                            if (compareRawSize(usageVOS.get(0), twoLoadStation)) {
+//                              //2鍙蜂笂鐗囦綅鐨勫師鐗囦俊鎭簮宸ョ▼淇℃伅涓�鑷达紝鍙笂鐗囨搷浣滐紝缁撴潫鏈浠诲姟
+                                return Boolean.FALSE;
+                            } else {
+//                    鐢熸垚1鍙蜂綅鍏ュ簱浠诲姟
+                                log.info("2鍙蜂笂鐗囦綅鐜荤拑灏哄涓嶄竴鑷达紝2鍙蜂笂鐗囦綅鐢熸垚鍑虹墖璋冨害浠诲姟");
+                                //鎸夌収灏哄鍙婃暟閲忚幏鍙栨暟閲忔渶鎺ヨ繎鐨勬牸瀛愪俊鎭�
+                                rawGlassStorageDetailsService.generateTask(loadStation.get(1), twoLoadStation.getShelf(), twoLoadStation.getShelf(), twoLoadStation.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
+                                //缁撴潫璋冨害浠诲姟 淇敼宸ヤ綅鐘舵��(璧峰浣嶏級鐘舵�佷负103 RAW_GLASS_STATE_RUNNING 浠诲姟瀹屾垚鍚庡皢鐘舵�佹敼涓�101  鐩爣浣嶆柊澧炰竴鏉℃暟鎹紝鏋跺瓙鍙蜂负锛堣捣濮嬩綅锛�
+                                rawGlassStorageDetailsService.update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
+                                        .eq(RawGlassStorageDetails::getSlot, loadStation.get(1)).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
+                                        .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING));
+                                return Boolean.TRUE;
+                            }
+                        } else {
+                            //todo:鐢熸垚鍑哄簱浠诲姟
+                            rawGlassStorageDetailsService.generateTask(loadStation.get(1), twoLoadStation.getShelf(), twoLoadStation.getShelf(), twoLoadStation.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
+                            //缁撴潫璋冨害浠诲姟 淇敼宸ヤ綅鐘舵��(璧峰浣嶏級鐘舵�佷负103 RAW_GLASS_STATE_RUNNING 浠诲姟瀹屾垚鍚庡皢鐘舵�佹敼涓�101  鐩爣浣嶆柊澧炰竴鏉℃暟鎹紝鏋跺瓙鍙蜂负锛堣捣濮嬩綅锛�
+                            rawGlassStorageDetailsService.update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
+                                    .eq(RawGlassStorageDetails::getSlot, loadStation.get(1)).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
+                                    .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING));
+                            return Boolean.TRUE;
+                        }
+                    }
+//                    return Boolean.FALSE;
+                } else {
+                    log.info("2鍙蜂笂鐗囦綅浠呭墿绌烘灦瀛愶紝1鍙蜂笂鐗囦綅鐢熸垚鍑哄簱璋冨害浠诲姟");
+                    rawGlassStorageDetailsService.generateTask(loadStation.get(0), oneLoadStation.getShelf(), oneLoadStation.getShelf(), oneLoadStation.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
+                    rawGlassStorageDetailsService.update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
+                            .eq(RawGlassStorageDetails::getSlot, loadStation.get(0)).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
+                            .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING));
+                    return Boolean.TRUE;
+                }
+            } else {
+                log.info("1鍙蜂笂鐗囦綅鐜荤拑灏哄涓嶄竴鑷达紝1鍙蜂笂鐗囦綅鐢熸垚鍑哄簱璋冨害浠诲姟");
+                rawGlassStorageDetailsService.generateTask(loadStation.get(0), oneLoadStation.getSlot(), oneLoadStation.getShelf(), oneLoadStation.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
+                rawGlassStorageDetailsService.update(new LambdaUpdateWrapper<RawGlassStorageDetails>()
+                        .eq(RawGlassStorageDetails::getSlot, loadStation.get(0)).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN)
+                        .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING));
                 return Boolean.TRUE;
             }
         }
     }
 
     private RawGlassStorageDetails generateDetails(RawGlassStorageDetails details, Integer targetSlot) {
-
         RawGlassStorageDetails targetDetails = new RawGlassStorageDetails();
-//        details.setDeviceId();
+        RawGlassStorageStation station = rawGlassStorageStationService.getOne(new LambdaQueryWrapper<RawGlassStorageStation>()
+                .eq(RawGlassStorageStation::getSlot, targetSlot));
+        targetDetails.setDeviceId(station.getDeviceId());
         targetDetails.setSlot(targetSlot);
         targetDetails.setShelf(details.getShelf());
         targetDetails.setPatternWidth(details.getPatternWidth());
@@ -478,5 +520,30 @@
         return readWriteEntity;
     }
 
+    private RawGlassStorageDetails getRawGlassStorageDetailsBySize(UpPattenUsageVO usageVO, int remainQuantity) {
+        return rawGlassStorageDetailsService.getOne(new LambdaQueryWrapper<RawGlassStorageDetails>()
+                .eq(RawGlassStorageDetails::getFilmsId, usageVO.getFilmsId())
+                .eq(RawGlassStorageDetails::getPatternWidth, usageVO.getWidth())
+                .eq(RawGlassStorageDetails::getPatternHeight, usageVO.getHeight())
+                .eq(RawGlassStorageDetails::getPatternThickness, usageVO.getThickness())
+                .eq(RawGlassStorageDetails::getState, Const.GLASS_STATE_IN)
+                .orderByAsc(RawGlassStorageDetails::getRemainQuantity)
+                .last("order by abs(t.remain_quantity - " + remainQuantity + ")  asc")
+                .last("limit 1"));
+    }
+
+    /**
+     * 灏哄涓�鏍峰苟涓斿師鐗囨暟閲忓ぇ浜�0
+     *
+     * @param upPattenUsage
+     * @param details
+     * @return
+     */
+    private boolean compareRawSize(UpPattenUsage upPattenUsage, RawGlassStorageDetails details) {
+        boolean flag = upPattenUsage.getWidth() == details.getPatternWidth() && upPattenUsage.getHeight() == details.getPatternHeight() &&
+                upPattenUsage.getThickness() == details.getPatternThickness() && upPattenUsage.getFilmsId().equals(details.getFilmsId());
+        return flag;
+    }
+
 }
 
diff --git a/hangzhoumesParent/moduleService/GlassStorageModule/src/main/resources/application-dev.yml b/hangzhoumesParent/moduleService/GlassStorageModule/src/main/resources/application-dev.yml
index 974323a..3aa2164 100644
--- a/hangzhoumesParent/moduleService/GlassStorageModule/src/main/resources/application-dev.yml
+++ b/hangzhoumesParent/moduleService/GlassStorageModule/src/main/resources/application-dev.yml
@@ -5,7 +5,7 @@
       strict: false #璁剧疆涓ユ牸妯″紡,榛樿false涓嶅惎鍔�. 鍚姩鍚庡湪鏈尮閰嶅埌鎸囧畾鏁版嵁婧愭椂鍊欏洖鎶涘嚭寮傚父,涓嶅惎鍔ㄤ細浣跨敤榛樿鏁版嵁婧�.
       datasource:
         hangzhoumes:
-          url: jdbc:mysql://127.0.0.1:3306/hangzhoumes?serverTimezone=GMT%2b8
+          url: jdbc:mysql://127.0.0.1:3306/hangzhoumes?serverTimezone=GMT%2b8&allowMultiQueries=true
           username: root
           password: beibo.123/
           driver-class-name: com.mysql.cj.jdbc.Driver
@@ -14,10 +14,13 @@
           username: sa
           password: beibo.123/
           driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
+      druid:
+        wall:
+          multi-statement-allow: true
   cloud:
     nacos:
       discovery:
-        server-addr: 10.153.19.150:8848
+        server-addr: 127.0.0.1:8848
   redis:
     database: 0
     host: 127.0.0.1
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/engineering/controller/EngineeringController.java b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/engineering/controller/EngineeringController.java
index 5e9e82d..07ec598 100644
--- a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/engineering/controller/EngineeringController.java
+++ b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/engineering/controller/EngineeringController.java
@@ -54,11 +54,11 @@
     @ResponseBody
     public  Result <List<UpPattenUsage>> pause(@RequestBody Engineering engineering) {
         boolean work=engineeringService.pauseTask(engineering.getEngineerId(),engineering.getState());
-        List<UpPattenUsage> glass = upPattenUsageService.prioritylist();String message;
+//        List<UpPattenUsage> glass = upPattenUsageService.prioritylist();String message;
         if(work){
-            return Result.build(200,"鎴愬姛",glass);
+            return Result.build(200, "鎴愬姛", null);
         }else {
-            return Result.build(100,"鎴愬姛",glass);
+            return Result.build(100, "鎴愬姛", null);
         }
     }
 
@@ -69,7 +69,7 @@
         log.info("engineeringId:{}", engineering);
         UpPattenUsage upPattenUsage = upPattenUsageService.selectedEngineering(engineering.getEngineerId());
         if (upPattenUsage != null) {
-            boolean work=engineeringService.changeTask(engineering.getEngineerId(),engineering.getState());
+            boolean work = engineeringService.changeTask(engineering.getEngineerId(), engineering.getState());
             List<UpPattenUsage> glass = upPattenUsageService.prioritylist();
             optimizeProjectService.changeTask(engineering.getEngineerId(), 200);
             return Result.build(200, "宸蹭繚瀛樿繃", work);
@@ -85,7 +85,7 @@
             engineeringService.saveEngineering(listEngineering);
             log.info("鏇存敼pp琛ㄧ姸鎬佷负宸查鍙�");
             //灏唀ngineering琛ㄧ姸鎬佷负姝e湪涓婄墖
-            boolean work=engineeringService.changeTask(engineering.getEngineerId(),engineering.getState());
+            boolean work = engineeringService.changeTask(engineering.getEngineerId(), engineering.getState());
             List<UpPattenUsage> glass = upPattenUsageService.prioritylist();
             optimizeProjectService.changeTask(engineering.getEngineerId(), 200);
             if (work) {
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/engineering/entity/Engineering.java b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/engineering/entity/Engineering.java
new file mode 100644
index 0000000..c9576ae
--- /dev/null
+++ b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/engineering/entity/Engineering.java
@@ -0,0 +1,110 @@
+package com.mes.engineering.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author wu
+ * @since 2024-04-22
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class Engineering implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 宸ョ▼琛╥d
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 宸ョ▼鍙�
+     */
+    private String engineerId;
+
+    /**
+     * 璁惧
+     */
+    private Integer stationCell;
+
+    /**
+     * 闄よ啘鏂瑰紡
+     */
+    private Integer filmRemove;
+
+    /**
+     * 宸ョ▼鍚嶇О
+     */
+    private String engineerName;
+
+    /**
+     * 骞冲潎鍒╃敤鐜�
+     */
+    private double avgAvailability;
+
+    /**
+     * 鏈夋晥鍒╃敤鐜�
+     */
+    private double validAvailability;
+
+    /**
+     * 灏剧墖鍒╃敤鐜�
+     */
+    private double lastAvailability;
+
+    /**
+     * 鐘舵��
+     */
+    private Integer state;
+
+    /**
+     * 灏忕墖鎬绘暟
+     */
+    private Integer glassTotal;
+
+    /**
+     * 灏忕墖鎬婚潰绉�
+     */
+    private double glassTotalArea;
+
+    /**
+     * 璁″垝鍘熺墖鎬绘暟
+     */
+    private Integer planPatternTotal;
+
+    /**
+     * 璁″垝鍘熺墖鎬婚潰绉�
+     */
+    private double planPatternTotalArea;
+
+    /**
+     * 瀹為檯鍘熺墖鎬绘暟
+     */
+    private Integer realityPatternTotal;
+
+    /**
+     * 瀹為檯鍘熺墖鎬婚潰绉�
+     */
+    private double realityPatternTotalArea;
+
+    /**
+     * 鑶滅郴id
+     */
+    private String filmsId;
+
+    /**
+     * 澶囨敞
+     */
+    private String notes;
+
+}
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/engineering/service/EngineeringService.java b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/engineering/service/EngineeringService.java
index 7841c36..6dd056b 100644
--- a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/engineering/service/EngineeringService.java
+++ b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/engineering/service/EngineeringService.java
@@ -54,4 +54,6 @@
     List<Engineering> selectTask();
 
     boolean pauseTask(String engineerId, Integer state);
+
+    boolean changeTask(String engineerId, Integer state, Integer filmRemove, Integer stationCell);
 }
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/engineering/service/impl/EngineeringServiceImpl.java b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/engineering/service/impl/EngineeringServiceImpl.java
index 89651e7..64169f1 100644
--- a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/engineering/service/impl/EngineeringServiceImpl.java
+++ b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/engineering/service/impl/EngineeringServiceImpl.java
@@ -98,7 +98,8 @@
     public Engineering selectInitiate(Integer state) {
         //鏌ヨ鏄惁鏈夊紑濮嬩笂鐗囩殑宸ョ▼浠诲姟
         QueryWrapper<Engineering> wrapper = new QueryWrapper<>();
-        wrapper.eq("state", state);
+        wrapper.eq("state", state)
+                .last("limit 1");
         return engineeringMapper.selectOne(wrapper);
     }
 
@@ -119,9 +120,10 @@
     public boolean pauseTask(String engineerId, Integer state) {
         //鏆傚仠姝e湪杩涜宸ョ▼
         LambdaUpdateChainWrapper<Engineering> pauseWrapper = new LambdaUpdateChainWrapper<>(this.getBaseMapper());
-        pauseWrapper.set(Engineering::getState,0);
-        pauseWrapper.eq(Engineering::getState,1);
-        return  pauseWrapper.update();
+        pauseWrapper.set(Engineering::getState, state);
+        pauseWrapper.eq(Engineering::getEngineerId, engineerId);
+        return pauseWrapper.update();
     }
 
+
 }
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/job/OpcLoadGlassTask.java b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/job/OpcLoadGlassTask.java
index 3471b59..6782761 100644
--- a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/job/OpcLoadGlassTask.java
+++ b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/job/OpcLoadGlassTask.java
@@ -17,6 +17,7 @@
 import com.mes.uppattenusage.mapper.UpPattenUsageMapper;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 
@@ -65,19 +66,22 @@
     //2銆�1鍙蜂笂鐗囦綅鏄惁鏈夊師鐗囷紝鍘熺墖灏哄鏄惁鍜屼笂鐗囧緟涓婄墖鐨勫昂瀵镐竴鑷�
     //3銆�1鍙锋棤鍘熺墖锛屼笖娌℃湁鏋跺瓙锛�2鍙蜂笂鐗囦綅灏哄鏄惁鍜屽甫涓婄墖灏哄涓�鑷�
     //4銆佷笉涓�鑷村彲鑳藉嚭鐜扮幓鐠冪牬鎹熷鑷寸殑涓婁竴鏋跺師鐗囨暟閲忎笉澶�
+    @Scheduled(fixedDelay = 300)
     public void opcLoadGlassOne() {
         opcLoadGlassChild(LOAD_GLASS_DEVICE_ONE_TASK, LOAD_GLASS_ONE_DEVICE);
     }
 
+    @Scheduled(fixedDelay = 300)
     public void opcLoadGlassTwo() {
         opcLoadGlassChild(LOAD_GLASS_DEVICE_TWO_TASK, LOAD_GLASS_TWO_DEVICE);
     }
 
-
+    @Scheduled(fixedDelay = 300)
     public void opcLoadGlassOneFinish() {
         opcLoadGlassFinishChid(LOAD_GLASS_DEVICE_ONE_TASK, LOAD_GLASS_ONE_DEVICE);
     }
 
+    @Scheduled(fixedDelay = 300)
     public void opcLoadGlassTwoFinish() {
         opcLoadGlassFinishChid(LOAD_GLASS_DEVICE_TWO_TASK, LOAD_GLASS_TWO_DEVICE);
     }
@@ -87,11 +91,16 @@
                 .eq(Engineering::getState, Const.ENGINEERING_RUNNING).eq(Engineering::getStationCell, deviceId));
         if (null == engineering) {
             log.info("{}涓婄墖绾匡紝娌℃湁宸ョ▼浠诲姟", deviceId);
+            return;
         }
         //浠诲姟鏆傚仠
         LoadGlassDeviceTask task = loadGlassDeviceTaskService.queryTaskMessage(tableName);
-        if ("1".equals(task.getTaskState())) {
-            log.info("鏈夋鍦ㄦ墽琛岀殑涓婄墖浠诲姟锛岀粨鏉熸湰鍦颁笂鐗囪姹�");
+        if (0 == task.getInkageState()) {
+            log.info("{}涓婄墖绾匡紝澶勪簬绂荤嚎鐘舵�侊細{}锛岀粨鏉熸湰鍦颁笂鐗囪姹�", deviceId, task.getInkageState());
+            return;
+        }
+        if (task.getTaskRunning().equals(Const.ENGINEERING_RUNNING)) {
+            log.info("{}涓婄墖绾匡紝鏈夋鍦ㄦ墽琛岀殑浠诲姟锛岀粨鏉熸湰鍦颁笂鐗囪姹�", deviceId);
             return;
         }
         List<UpPattenUsageVO> pattenUsageList = upPattenUsageMapper.queryRawGlassByEngineeringId(engineering.getEngineerId());
@@ -104,7 +113,7 @@
         Map<String, List<UpPattenUsageVO>> upListMap = pattenUsageList.stream()
                 .collect(Collectors.groupingBy(UpPattenUsageVO::getGroupNumber));
         log.info("鑾峰彇褰撳墠闇�瑕佷笂鐗囩殑鍘熺墖鏁版嵁");
-        List<UpPattenUsageVO> usageVOS = upListMap.get(0);
+        List<UpPattenUsageVO> usageVOS = upListMap.get("1");
 //        鑾峰彇1鍙蜂笂鐗囦綅鏄湁鏋跺瓙涓旀湁鐜荤拑
         List<Integer> loadStation = LOAD_GLASS_DEVICE_ONE_TASK.equals(tableName) ? LOAD_STATION_01 : LOAD_STATION_02;
         List<RawGlassStorageDetails> loadStationList = rawGlassStorageDetailsService.list(new LambdaQueryWrapper<RawGlassStorageDetails>()
@@ -118,7 +127,7 @@
         RawGlassStorageDetails oneLoadStation = loadStationList.stream().filter(e -> e.getSlot().equals(loadStation.get(0))).findFirst().orElse(null);
         if (null == oneLoadStation) {
             RawGlassStorageDetails twoLoadStation = loadStationList.stream().filter(e -> e.getSlot().equals(loadStation.get(1))).findFirst().orElse(null);
-            if (!compareRawSize(usageVOS.get(0), oneLoadStation)) {
+            if (!compareRawSize(usageVOS.get(0), twoLoadStation)) {
                 log.info("浜屽彿涓婄墖浣嶆湁鏋跺瓙锛屽師鐗囨暟閲忎负0鎴栬�呭師鐗囦俊鎭笌寰呬笂鐗囧昂瀵镐笉涓�鑷达紝缁撴潫鏈涓婄墖浠诲姟锛岀瓑寰呬粨鍌ㄨ皟搴︿换鍔�");
                 return;
             }
@@ -151,8 +160,12 @@
 
     private void opcLoadGlassFinishChid(String tableName, Integer deviceId) {
         LoadGlassDeviceTask task = loadGlassDeviceTaskService.queryTaskMessage(tableName);
+        if (task.getTaskRunning().equals(Const.ENGINEERING_NEW)) {
+            log.info("鏃犱换鍔�,缁撴潫");
+            return;
+        }
         if (task.getTaskState() <= 1) {
-            log.info("鏃犱换鍔℃垨浠诲姟姝e湪鎵ц涓�");
+            log.info("浠诲姟姝e湪鎵ц,缁撴潫");
             return;
         }
         //鑾峰彇浠诲姟瀹屾垚鎯呭喌
@@ -165,11 +178,15 @@
                 .inSql("slot", "select slot from raw_glass_storage_station where enable_state = 1")
                 .eq("slot", task.getSlot())
                 .eq("state", Const.RAW_GLASS_STATE_IN)
-                .set("remain_quantity", "remain_quantity - " + (finishCount + damageCount)));
+                .setSql("remain_quantity = remain_quantity - " + (finishCount + damageCount)));
         //鏇存柊宸ョ▼涓嬬殑鍘熺墖鏁伴噺 todo:sql寰呬紭鍖�
-        upPattenUsageMapper.update(null, new LambdaUpdateWrapper<UpPattenUsage>()
-                .inSql(UpPattenUsage::getId, " SELECT id FROM up_patten_usage ORDER BY id ASC LIMIT 10")
-                .set(UpPattenUsage::getState, Const.LOAD_RAW_GLASS_SUCCESS));
+
+        if (finishCount > 0) {
+            List<Integer> ids = upPattenUsageMapper.queryFinishByEngineering(deviceId, finishCount);
+            upPattenUsageMapper.update(null, new LambdaUpdateWrapper<UpPattenUsage>()
+                    .in(UpPattenUsage::getId, ids)
+                    .set(UpPattenUsage::getState, Const.LOAD_RAW_GLASS_SUCCESS));
+        }
         //todo:浠诲姟琛ㄦ暟鎹儏鍐�
         task.setTaskRunning(0);
         task.setTotalCount(0);
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/controller/UpPattenUsageController.java b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/controller/UpPattenUsageController.java
index 24d88ef..6ea664c 100644
--- a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/controller/UpPattenUsageController.java
+++ b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/controller/UpPattenUsageController.java
@@ -35,6 +35,8 @@
     private  EngineeringService engineeringService;
     @Autowired
     private OptimizeProjectService optimizeProjectService;
+
+
     @ApiOperation("鏄剧ず閫夋嫨鐨勫伐绋嬩俊鎭�")
     @GetMapping("/prioritylist") //鏌ヨ鐜板湪涓婄墖鏈虹殑鐜荤拑淇℃伅
     @ResponseBody
@@ -48,17 +50,19 @@
     @PostMapping("/selectUpPattenUsage") //鏌ヨ鐜板湪涓婄墖鏈虹殑鐜荤拑淇℃伅
     @ResponseBody
     public Result<List<UpPattenUsage>> selectUpPattenUsage(@RequestBody Engineering engineering) {
-        List<UpPattenUsage> upPattenUsages=null;
+        List<UpPattenUsage> upPattenUsages = null;
         UpPattenUsage upPattenUsage = upPattenUsageService.selectedEngineering(engineering.getEngineerId());
-        if(upPattenUsage == null){
+        if (upPattenUsage == null) {
+//            return Result.build(200, "澶辫触鏃犳暟鎹�", null);
+//            upPattenUsages = upPattenUsageService.selectSaveUpPattenUsage(engineering.getEngineerId(), engineering.getFilmRemove(), engineering.getStationCell());
             upPattenUsages = upPattenUsageService.selectSaveUpPattenUsage(engineering.getEngineerId());
-        }else {
-            upPattenUsages= upPattenUsageService.selectUpPattenUsage(upPattenUsage);
+        } else {
+            upPattenUsages = upPattenUsageService.selectUpPattenUsage(upPattenUsage);
         }
 
         if (!upPattenUsages.isEmpty()) {
             return Result.build(200, "鎴愬姛", upPattenUsages);
-        }else {
+        } else {
             return Result.build(100, "澶辫触", upPattenUsages);
         }
 
@@ -69,13 +73,19 @@
     @ResponseBody
     public Result<Boolean> updateGlassState(@RequestBody UpPattenUsage upPattenUsage) {
         Boolean whether = upPattenUsageService.updateGlassState(upPattenUsage);
-        if (whether){
+        if (whether) {
             return Result.build(200, "鎴愬姛", whether);
-        }else {
+        } else {
             return Result.build(100, "澶辫触", whether);
         }
 
     }
 
+    @ApiOperation("璁剧疆涓婄墖鏌ヨ鏉′欢")
+    @PostMapping("/setUpPattenRequest")
+    public Result setRawGlassTaskRequest(@RequestBody Engineering request) {
+        log.info("鏌ヨ涓婄墖淇℃伅:{}", request);
+        return Result.build(200, "鏌ヨ鎴愬姛", upPattenUsageService.setRawGlassTaskRequest(request));
+    }
 }
 
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/service/UpPattenUsageService.java b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/service/UpPattenUsageService.java
index 9bcefd7..2c1e2f8 100644
--- a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/service/UpPattenUsageService.java
+++ b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/service/UpPattenUsageService.java
@@ -1,5 +1,7 @@
 package com.mes.uppattenusage.service;
+
 import com.github.yulichang.base.MPJBaseService;
+import com.mes.engineering.entity.Engineering;
 import com.mes.uppattenusage.entity.UpPattenUsage;
 
 import java.util.List;
@@ -36,13 +38,17 @@
       * 鏇存柊涓婄墖琛ㄧ姸鎬�
       */
      void updateUpPattenUsageState(UpPattenUsage upPattenUsage, Integer state);
+
      /**
       * 鍒ゆ柇姝ゅ伐绋嬫槸鍚﹀凡淇濆瓨杩�
+      *
       * @return UpPattenUsage
       */
-     UpPattenUsage selectedEngineering(String engineeringId);
+     UpPattenUsage selectedTaskEngineering(String engineeringId);
+
      /**
       * 鏌ヨ姝e湪鎵ц鐨勪笂鐗囦换鍔�
+      *
       * @return UpPattenUsage
       */
      UpPattenUsage selectOverTask();
@@ -54,9 +60,17 @@
 
      /**
       * 鏇存敼涓婄墖鐜荤拑鐘舵��
+      *
       * @return UpPattenUsage
       */
      Boolean updateGlassState(UpPattenUsage upPattenUsage);
 
+     List<Engineering> setRawGlassTaskRequest(Engineering request);
+
+//     List<UpPattenUsage> selectSaveUpPattenUsage(String engineerId, Integer filmRemove, Integer stationCell);
+
+//     UpPattenUsage selectedEngineering(String engineerId, Integer filmRemove, Integer stationCell);
+
+     UpPattenUsage selectedEngineering(String engineerId);
 }
 
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/service/impl/UpPattenUsageServiceImpl.java b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/service/impl/UpPattenUsageServiceImpl.java
index 409cfb2..0cfcb0c 100644
--- a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/service/impl/UpPattenUsageServiceImpl.java
+++ b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/service/impl/UpPattenUsageServiceImpl.java
@@ -7,6 +7,7 @@
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.query.MPJQueryWrapper;
 import com.mes.engineering.entity.Engineering;
+import com.mes.engineering.mapper.EngineeringMapper;
 import com.mes.engineering.service.EngineeringService;
 import com.mes.pp.entity.OptimizeProject;
 import com.mes.pp.mapper.OptimizeProjectMapper;
@@ -44,10 +45,10 @@
         //log.info("灏嗗弬鏁颁紶鍏ュ埌鏌ヨ绫婚噷{}",engineering);
         if(engineering!=null){
             LambdaQueryWrapper<UpPattenUsage> wrapper = new LambdaQueryWrapper<>();
-            wrapper.eq(UpPattenUsage::getEngineeringId,engineering.getEngineerId());
+            wrapper.eq(UpPattenUsage::getEngineeringId, engineering.getEngineerId());
             return this.list(wrapper);
-        }else {
-            return  null;
+        } else {
+            return null;
         }
 
     }
@@ -55,7 +56,10 @@
     @Override
     public List<UpPattenUsage> selectUpPattenUsage(UpPattenUsage upPattenUsage) {
         LambdaQueryWrapper<UpPattenUsage> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(UpPattenUsage::getEngineeringId,upPattenUsage.getEngineeringId());
+        wrapper.eq(UpPattenUsage::getEngineeringId, upPattenUsage.getEngineeringId());
+//                .eq(UpPattenUsage::getStationCell, upPattenUsage.getStationCell())
+//                .eq(UpPattenUsage::getFilmRemove, upPattenUsage.getFilmRemove());
+
         return this.list(wrapper);
     }
 
@@ -103,16 +107,25 @@
     @Override
     public void updateUpPattenUsageState(UpPattenUsage upPattenUsage, Integer state) {
         upPattenUsage.setState(state);
-        boolean updateSuccess=this.updateById(upPattenUsage);
-        log.info("鏇存柊鐘舵�亄}",updateSuccess);
+        boolean updateSuccess = this.updateById(upPattenUsage);
+        log.info("鏇存柊鐘舵�亄}", updateSuccess);
         //鏇存柊鐘舵��
     }
 
     @Override
-    public UpPattenUsage selectedEngineering(String engineeringId) {
-        QueryWrapper<UpPattenUsage>wrapper = new QueryWrapper<>();
-        wrapper.eq("engineering_id",engineeringId)
+    public UpPattenUsage selectedTaskEngineering(String engineeringId) {
+        return null;
+    }
+
+    @Override
+    public UpPattenUsage selectedEngineering(String engineerId) {
+        QueryWrapper<UpPattenUsage> wrapper = new QueryWrapper<>();
+        wrapper.eq("engineering_id", engineerId)
+//                .eq("station_cell", stationCell)
+//                .eq("film_remove", filmRemove)
                 .last("limit 1");
+        log.info("鏌ヨ棰勮鍙傛暟");
+        log.info("鏌ヨ棰勮鍙傛暟{}", this.getOne(wrapper));
         return this.getOne(wrapper);
     }
 
@@ -138,10 +151,15 @@
     @Override
     public Boolean updateGlassState(UpPattenUsage upPattenUsage) {
         UpdateWrapper<UpPattenUsage> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.eq("id",upPattenUsage.getId())
-                .set("state",upPattenUsage.getState());
+        updateWrapper.eq("id", upPattenUsage.getId())
+                .set("state", upPattenUsage.getState());
         return this.update(updateWrapper);
     }
 
+    @Override
+    public Object Engineering(Engineering request) {
+        return null;
+    }
+
 
 }
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-dev.yml b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-dev.yml
index d4558c8..7a4325b 100644
--- a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-dev.yml
+++ b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-dev.yml
@@ -10,15 +10,18 @@
           password: beibo.123/
           driver-class-name: com.mysql.cj.jdbc.Driver
         pp:
-          url: jdbc:mysql://127.0.0.1:3306/pp?serverTimezone=GMT%2b8
+          url: jdbc:mysql://10.153.19.150:3306/pp?serverTimezone=GMT%2b8
           username: root
           password: beibo.123/
           driver-class-name: com.mysql.cj.jdbc.Driver
         sd:
-          url: jdbc:mysql://127.0.0.1:3306/sd?serverTimezone=GMT%2b8
+          url: jdbc:mysql://10.153.19.150:3306/sd?serverTimezone=GMT%2b8
           username: root
           password: beibo.123/
           driver-class-name: com.mysql.cj.jdbc.Driver
+      druid:
+        wall:
+          multi-statement-allow: true
   cloud:
     nacos:
       discovery:
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/mapper/LoadGlassDeviceTaskMapper.xml b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/mapper/LoadGlassDeviceTaskMapper.xml
index 4f11622..2cdaece 100644
--- a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/mapper/LoadGlassDeviceTaskMapper.xml
+++ b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/mapper/LoadGlassDeviceTaskMapper.xml
@@ -8,6 +8,7 @@
         <result column="raw_glass_height" property="rawGlassHeight"/>
         <result column="slot" property="slot"/>
         <result column="task_state" property="taskState"/>
+        <result column="inkage_state" property="inkageState"/>
         <result column="create_time" property="createTime"/>
         <result column="update_time" property="updateTime"/>
         <result column="total_count" property="totalCount"/>
diff --git a/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/OpcNGTemperingTask.java b/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/OpcNGTemperingTask.java
new file mode 100644
index 0000000..cd836a3
--- /dev/null
+++ b/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/OpcNGTemperingTask.java
@@ -0,0 +1,157 @@
+package com.mes.job;
+
+
+import com.kangaroohy.milo.model.ReadWriteEntity;
+import com.kangaroohy.milo.service.MiloService;
+import com.mes.pp.entity.OptimizeHeatDetail;
+import com.mes.pp.entity.OptimizeHeatLayout;
+import com.mes.pp.service.OptimizeHeatDetailService;
+import com.mes.pp.service.OptimizeHeatLayoutService;
+import com.mes.temperingglass.entity.TemperingGlass;
+import com.mes.temperingglass.entity.TemperingGlassInfo;
+import com.mes.temperingglass.service.TemperingGlassInfoService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.Comparator;
+import java.util.List;
+import java.util.Optional;
+
+
+@Component
+@Slf4j
+public class OpcNGTemperingTask {
+
+    @Autowired(required = false)
+    MiloService miloService;
+
+    @Autowired
+    private TemperingGlassInfoService temperingAgoService;
+
+    @Autowired
+    private OptimizeHeatLayoutService optimizeHeatLayoutService;
+
+    @Autowired
+    private OptimizeHeatDetailService optimizeHeatDetailService;
+
+    /**
+     * 鎽嗙墖鍙拌姹傝繘鐗囬�昏緫澶勭悊
+     * fixedRate : 涓婁竴涓皟鐢ㄥ紑濮嬪悗鍐嶆璋冪敤鐨勫欢鏃讹紙涓嶇敤绛夊緟涓婁竴娆¤皟鐢ㄥ畬鎴愶級
+     * fixedDelay : 涓婁竴涓皟鐢ㄧ粨鏉熷悗鍐嶆璋冪敤鐨勫欢鏃�
+     */
+    //@Scheduled(fixedDelay = 1000)
+    public void requestTemperingTask() throws Exception {
+        ReadWriteEntity requestInTempering = miloService.readFromOpcUa("GH1S7.GH1S7.requestInTempering");//璇锋眰杩涚墖
+        ReadWriteEntity requestTemperingId = miloService.readFromOpcUa("GH1S7.GH1S7.requestTemperingId");//璇锋眰杩涚墖 鐐夊彿ID
+        Integer request = Integer.parseInt(requestInTempering.getValue().toString());
+        Integer id = Integer.parseInt(requestTemperingId.getValue().toString());
+        if (request == 0) {
+            miloService.writeToOpcUa(generateReadWriteEntity("GH1S7.GH1S7.responseInTempering", 0));//鍏佽閫佺墖娓呴浂
+        } else {
+            ReadWriteEntity placedNumber = miloService.readFromOpcUa("GH1S7.GH1S7.placedNumber");//宸叉憜鐗囨暟閲�
+            List<TemperingGlassInfo> glassList = temperingAgoService.selectGlassInfoById(id);
+            if (glassList.size() == Integer.parseInt(placedNumber.getValue().toString())) {
+                miloService.writeToOpcUa(generateReadWriteEntity("GH1S7.GH1S7.responseInTempering", 1));//鍐欏叆鍏佽閫佺墖
+            } else {
+                miloService.writeToOpcUa(generateReadWriteEntity("GH1S7.GH1S7.responseInTempering", 2));//涓嶆弧瓒宠繘鐐夋潯浠�
+            }
+        }
+    }
+
+    /**
+     * 閽㈠寲涓婄墖鍙颁笅鍙戝弬鏁伴�昏緫澶勭悊
+     * fixedRate : 涓婁竴涓皟鐢ㄥ紑濮嬪悗鍐嶆璋冪敤鐨勫欢鏃讹紙涓嶇敤绛夊緟涓婁竴娆¤皟鐢ㄥ畬鎴愶級
+     * fixedDelay : 涓婁竴涓皟鐢ㄧ粨鏉熷悗鍐嶆璋冪敤鐨勫欢鏃�
+     */
+    //@Scheduled(fixedDelay = 1000)
+    public void loadTemperingTask() throws Exception {
+        ReadWriteEntity loadTemperingId = miloService.readFromOpcUa("GH1S7.GH1S7.loadTemperingId");//杩涚墖瀹屾垚 鐐夊彿ID
+        getNewTemperingID(Integer.parseInt(loadTemperingId.getValue().toString()));//杩涚墖瀹屾垚 涓嬪彂鍙傛暟
+    }
+
+    //鑾峰彇鍒扮倝鍙穒d鎵ц鍙傛暟涓嬪彂浠诲姟
+    private void getNewTemperingID(Integer temperingid) throws Exception {
+        ReadWriteEntity AutoStatus = miloService.readFromOpcUa("GH1.GH1.AutoStatus");
+        if (1 != Integer.parseInt(AutoStatus.getValue().toString())) {
+            log.info("褰撳墠涓洪潪鑱旀満鐘舵�侊紝缁撴潫閽㈠寲涓嬪彂鍙傛暟浠诲姟");
+            return;
+        }
+        ReadWriteEntity QandA = miloService.readFromOpcUa("GH1.GH1.QandA");
+        ReadWriteEntity RecipeStatus = miloService.readFromOpcUa("GH1.GH1.RecipeStatus");
+        if (1 == Integer.parseInt(QandA.getValue().toString()) && 2 == Integer.parseInt(RecipeStatus.getValue().toString())) {
+            log.info("鐗堥潰淇℃伅宸茬粡涓嬪彂锛屽苟涓斿凡缁忓尮閰嶅弬鏁帮紝缁撴潫閽㈠寲涓嬪彂鍙傛暟浠诲姟");
+            return;
+        }
+        List<TemperingGlassInfo> glassList = temperingAgoService.selectGlassInfoById(temperingid);
+        if (glassList != null && glassList.size() > 0) {
+            int glasstype = GetGlassType(glassList.get(0).getFilmsid());//鑶滅郴
+            int process = 0;//閽㈠寲绫诲瀷
+            int thiness = (int) glassList.get(0).getThickness();//鍘氬害
+            String engineerId = glassList.get(0).getEngineerId();
+            Integer temperingLayoutId = glassList.get(0).getTemperingLayoutId();
+            OptimizeHeatLayout heatLayoutinfo = optimizeHeatLayoutService.selectHeatLayoutInfo(engineerId, temperingLayoutId);
+            int loadingRate = (int) (heatLayoutinfo.getLayoutRate() * 100); //瑁呰浇鐜�
+            loadingRate = loadingRate > 10000 ? 10000 : loadingRate;
+            List<OptimizeHeatDetail> heatDetailGlassInfoList = optimizeHeatDetailService.selectHeatDetailGlassInfo(engineerId, temperingLayoutId);
+
+            Optional<Double> maxProductOpt = heatDetailGlassInfoList.stream()
+                    .map(ohd -> ohd.getWidth() * ohd.getHeight())
+                    .max(Double::compareTo);
+            double totalarea = heatDetailGlassInfoList.stream().mapToDouble(ohd -> ohd.getWidth() * ohd.getHeight()).sum();
+
+            int shape = 0; //鏈�澶х墖鍗犳�婚潰绉殑姣斾緥
+            if (maxProductOpt.isPresent()) {
+                shape = (int) (maxProductOpt.get() / totalarea * 100);
+            }
+            shape = shape > 10000 ? 10000 : shape;
+            int workmode = 0; //宸ヤ綅鏁�
+            int furmode = 0; //鍙屽/鑱斿
+
+            miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.TemperingId", temperingid));//鍐欏叆鐐夊彿
+            miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.GlassType", glasstype));//鍐欏叆鐜荤拑绫诲瀷
+            miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.Process", process));//鍐欏叆閽㈠寲绫诲瀷 鍏ㄩ挗 鍗婇挗 闃茬伀
+            miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.Thickness", thiness));//鍐欏叆鍘氬害
+            miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.LoadingRate", loadingRate));//鍐欏叆瑁呰浇鐜�
+            miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.Shape", shape));//鍐欏叆澶х墖姣斾緥
+            miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.WorkMode", workmode));//鍐欏叆宸ヤ綅鏁�
+            miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.FurnaceMode", furmode));//鍐欏叆鐐変綋宸ヤ綔鏂瑰紡
+            log.info("鐐夊彿" + temperingid + "鐗堥潰淇℃伅灏濊瘯涓嬪彂");
+        }
+    }
+
+
+    //鏍规嵁鑶滅郴杩斿洖鐜荤拑绫诲瀷
+    private int GetGlassType(String glasstype) {
+        int result = 0;
+        String str = glasstype.toLowerCase();
+        if (str.contains("鐧界幓")) {
+            result = 0;
+        }
+        if (str.contains("瓒呯櫧")) {
+            result = 4;
+        }
+        if (str.contains("lowe") || str.contains("low-e")) {
+            result = 1;
+        }
+        if (str.contains("鍙岄摱")) {
+            result = 2;
+        }
+        if (str.contains("涓夐摱")) {
+            result = 3;
+        }
+        if (str.contains("鐑弽灏�")) {
+            result = 5;
+        }
+        return result;
+    }
+
+    private ReadWriteEntity generateReadWriteEntity(String identifier, Object value) {
+        return ReadWriteEntity.builder()
+                .identifier(identifier)
+                //Kep涓槸Long绫诲瀷锛屽嵆锛欼nt32锛孞ava涓殑int绫诲瀷
+                .value(value)
+                .build();
+    }
+}
diff --git a/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-prod.yml b/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-prod.yml
index 71101bf..d8eabe0 100644
--- a/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-prod.yml
+++ b/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-prod.yml
@@ -34,4 +34,6 @@
     database: 0
     host: 10.153.19.150
     port: 6379
-    password: 123456
\ No newline at end of file
+    password: 123456
+  liquibase:
+    change-log: classpath:changelog/changelogBase.xml
\ No newline at end of file
diff --git a/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application.yml b/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application.yml
index b2950e6..5e4b546 100644
--- a/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application.yml
+++ b/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application.yml
@@ -2,20 +2,15 @@
   port: 8084
 spring:
   profiles:
-    active: cz
+    active: prod
   application:
     name: temperingGlass
   liquibase:
-    enabled: false
-  task:
-    scheduling:
-      pool:
-        size: 10
-      thread-name-prefix: task-tempering
+    enabled: true
 mybatis-plus:
   mapper-locations: classpath*:mapper/*.xml
-#  configuration:
-#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  configuration:
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
 mes:
   width: 2800
   height: 5000
diff --git a/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/changelog/ywChangelog.sql b/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/changelog/ywChangelog.sql
index 5892857..9832dd6 100644
--- a/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/changelog/ywChangelog.sql
+++ b/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/changelog/ywChangelog.sql
@@ -9,17 +9,14 @@
     glass_id_in  varchar(20)        DEFAULT NULL COMMENT '杩涚墖鐜荤拑id',
     glass_id_out varchar(20)        DEFAULT NULL COMMENT '鍑虹墖鐜荤拑id',
     glass_id     varchar(20)        DEFAULT NULL COMMENT '纾ㄨ竟鍓嶇幓鐠僫d',
+    in_place     int                DEFAULT 0 COMMENT '灏变綅淇″彿',
     current_cell int                DEFAULT '0' COMMENT '褰撳墠灞傚彿',
     start_cell   int                DEFAULT '0' COMMENT '灞傚彿',
     end_cell     int                DEFAULT NULL COMMENT '棰勭暀灞傚彿',
     task_state   int                DEFAULT NULL COMMENT '浠诲姟鐘舵�� 0榛樿绌轰换鍔� 1鎵ц涓� 2缁撴潫浠诲姟',
     task_type    int                DEFAULT NULL COMMENT '浠诲姟绫诲瀷',
     create_time  timestamp NULL     DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿',
-    update_time  timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿',
-    width        int                DEFAULT NULL COMMENT '瀹�',
-    height       int                DEFAULT NULL COMMENT '楂�',
-    thickness    int                DEFAULT NULL COMMENT '鍘�',
-    film_remove  int                DEFAULT NULL COMMENT '鏄惁闄よ啘'
+    update_time  timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿'
 );
 -- rollback DROP TABLE edg_storage_device_one_task;
 
@@ -27,9 +24,10 @@
 -- changeset zsh:20241107002
 -- preconditions onFail:CONTINUE onError:CONTINUE
 -- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM edg_storage_device_one_task;
-INSERT INTO edg_storage_device_one_task (task_running, glass_id, glass_id_in, glass_id_out, current_cell, start_cell,
-                                         end_cell, task_state, task_type, width, height, thickness, film_remove)
-VALUES (0, NULL, NULL, NULL, 1, 0, NULL, 0, NULL, 0, 0, 0, 0);
+INSERT INTO edg_storage_device_one_task (task_running, glass_id, in_place, glass_id_in, glass_id_out, current_cell,
+                                         start_cell,
+                                         end_cell, task_state, task_type)
+VALUES (0, NULL, 0, NULL, NULL, 1, 0, NULL, 0, NULL, 0, 0, 0, 0);
 
 
 -- changeset zsh:20241107003
@@ -41,26 +39,24 @@
     glass_id_in  varchar(20)        DEFAULT NULL COMMENT '杩涚墖鐜荤拑id',
     glass_id_out varchar(20)        DEFAULT NULL COMMENT '鍑虹墖鐜荤拑id',
     glass_id     varchar(20)        DEFAULT NULL COMMENT '纾ㄨ竟鍓嶇幓鐠僫d',
+    in_place     int                DEFAULT 0 COMMENT '灏变綅淇″彿',
     current_cell int                DEFAULT '0' COMMENT '褰撳墠灞傚彿',
     start_cell   int                DEFAULT '0' COMMENT '灞傚彿',
     end_cell     int                DEFAULT NULL COMMENT '棰勭暀灞傚彿',
     task_state   int                DEFAULT NULL COMMENT '浠诲姟鐘舵�� 0榛樿绌轰换鍔� 1鎵ц涓� 2缁撴潫浠诲姟',
     task_type    int                DEFAULT NULL COMMENT '浠诲姟绫诲瀷',
     create_time  timestamp NULL     DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿',
-    update_time  timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿',
-    width        int                DEFAULT NULL COMMENT '瀹�',
-    height       int                DEFAULT NULL COMMENT '楂�',
-    thickness    int                DEFAULT NULL COMMENT '鍘�',
-    film_remove  int                DEFAULT NULL COMMENT '鏄惁闄よ啘'
+    update_time  timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿'
 );
 -- rollback DROP TABLE edg_storage_device_two_task;
 
 -- changeset zsh:20241107004
 -- preconditions onFail:CONTINUE onError:CONTINUE
 -- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM edg_storage_device_two_task;
-INSERT INTO edg_storage_device_two_task (task_running, glass_id, glass_id_in, glass_id_out, current_cell, start_cell,
-                                         end_cell, task_state, task_type, width, height, thickness, film_remove)
-VALUES (0, NULL, NULL, NULL, 1, 0, NULL, 0, NULL, 0, 0, 0, 0);
+INSERT INTO edg_storage_device_two_task (task_running, glass_id, in_place, glass_id_in, glass_id_out, current_cell,
+                                         start_cell,
+                                         end_cell, task_state, task_type)
+VALUES (0, NULL, 0, NULL, NULL, 1, 0, NULL, 0, NULL, 0, 0, 0, 0);
 
 
 
@@ -72,6 +68,8 @@
     id           bigint    NOT NULL AUTO_INCREMENT COMMENT '宸ョ▼琛╥d',
     glass_id_in  varchar(20)        DEFAULT NULL COMMENT '杩涚墖鐜荤拑id',
     glass_id_out varchar(20)        DEFAULT NULL COMMENT '鍑虹墖鐜荤拑id',
+    glass_id     varchar(20)        DEFAULT NULL COMMENT '纾ㄨ竟鍓嶇幓鐠僫d',
+    in_place     int                DEFAULT 0 COMMENT '灏变綅淇″彿',
     current_cell int                DEFAULT '0' COMMENT '褰撳墠灞傚彿',
     start_cell   int                DEFAULT '0' COMMENT '灞傚彿',
     end_cell     int                DEFAULT NULL COMMENT '棰勭暀灞傚彿',
@@ -108,6 +106,7 @@
     raw_glass_width  int                DEFAULT '0' COMMENT '鍘熺墖瀹�',
     raw_glass_height int                DEFAULT '0' COMMENT '鍘熺墖楂�',
     slot             int                DEFAULT '0' COMMENT '涓婄墖浣嶇紪鍙�',
+    inkage_state     int                DEFAULT '0' COMMENT '鑱旀満鐘舵��',
     task_state       int                DEFAULT NULL COMMENT '浠诲姟鐘舵�� 0榛樿绌轰换鍔� 1鎵ц涓� 2缁撴潫浠诲姟',
     create_time      timestamp NULL     DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿',
     update_time      timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿',
@@ -120,9 +119,9 @@
 -- changeset zsh:20241107008
 -- preconditions onFail:CONTINUE onError:CONTINUE
 -- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM load_glass_device_one_task;
-INSERT INTO load_glass_device_one_task (task_running, raw_glass_width, raw_glass_height, slot, task_state, total_count,
-                                        finish_count, damage_count)
-VALUES (0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO load_glass_device_one_task (task_running, raw_glass_width, raw_glass_height, slot, inkage_state, task_state,
+                                        total_count, finish_count, damage_count)
+VALUES (0, 0, 0, 0, 0, 0, 0, 0, 0);
 
 -- changeset zsh:20241107009
 -- preconditions onFail:CONTINUE onError:CONTINUE
@@ -133,6 +132,7 @@
     raw_glass_width  int                DEFAULT '0' COMMENT '鍘熺墖瀹�',
     raw_glass_height int                DEFAULT '0' COMMENT '鍘熺墖楂�',
     slot             int                DEFAULT '0' COMMENT '涓婄墖浣嶇紪鍙�',
+    inkage_state     int                DEFAULT '0' COMMENT '鑱旀満鐘舵��',
     task_state       int                DEFAULT NULL COMMENT '浠诲姟鐘舵�� 0榛樿绌轰换鍔� 1鎵ц涓� 2缁撴潫浠诲姟',
     create_time      timestamp NULL     DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿',
     update_time      timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿',
@@ -145,9 +145,9 @@
 -- changeset zsh:20241107010
 -- preconditions onFail:CONTINUE onError:CONTINUE
 -- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM load_glass_device_two_task;
-INSERT INTO load_glass_device_two_task (task_running, raw_glass_width, raw_glass_height, slot, task_state, total_count,
-                                        finish_count, damage_count)
-VALUES (0, 0, 0, 0, 0, 0, 0, 0);
+INSERT INTO load_glass_device_two_task (task_running, raw_glass_width, raw_glass_height, slot, inkage_state, task_state,
+                                        total_count, finish_count, damage_count)
+VALUES (0, 0, 0, 0, 0, 0, 0, 0, 0);
 
 
 -- changeset zsh:20241107011
@@ -161,6 +161,7 @@
     raw_glass_height int                DEFAULT '0' COMMENT '鍘熺墖楂�',
     station          int                DEFAULT '0' COMMENT '涓婄墖璁惧缂栧彿',
     slot             int                DEFAULT '0' COMMENT '涓婄墖浣嶇紪鍙�',
+    inkage_state     int                DEFAULT '0' COMMENT '鑱旀満鐘舵��',
     task_state       int                DEFAULT NULL COMMENT '浠诲姟鐘舵�� 0榛樿绌轰换鍔� 1鎵ц涓� 2缁撴潫浠诲姟',
     create_time      timestamp NULL     DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿',
     update_time      timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿',
@@ -169,4 +170,136 @@
     damage_count     int                DEFAULT '0' COMMENT '鐮存崯鏁伴噺',
     PRIMARY KEY (id) USING BTREE
 );
--- rollback DROP TABLE load_glass_device_task_history;
\ No newline at end of file
+-- rollback DROP TABLE load_glass_device_task_history;
+
+-- changeset zsh:20241112001
+-- preconditions onFail:CONTINUE onError:CONTINUE
+-- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'big_storage_cage_history_task' and table_schema = 'hangzhoumes';
+CREATE TABLE big_storage_cage_history_task
+(
+    id          int       NOT NULL AUTO_INCREMENT,
+    glass_id    varchar(32)        DEFAULT NULL COMMENT '鐜荤拑id',
+    start_slot  int                DEFAULT '0' COMMENT '璧峰鏍煎瓙',
+    target_slot int                DEFAULT '0' COMMENT '鐩爣鏍煎瓙',
+    task_state  int                DEFAULT NULL COMMENT '浠诲姟鐘舵�� ',
+    glass_count int                DEFAULT NULL COMMENT '鐜荤拑鏁伴噺',
+    task_type   int                DEFAULT NULL COMMENT '浠诲姟绫诲瀷',
+    create_time timestamp NULL     DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿',
+    update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿',
+    PRIMARY KEY (id)
+);
+-- rollback DROP TABLE big_storage_cage_history_task;
+
+-- changeset zsh:20241112002
+-- preconditions onFail:CONTINUE onError:CONTINUE
+-- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'big_storage_cage_in_one_task' and table_schema = 'hangzhoumes';
+CREATE TABLE big_storage_cage_in_one_task
+(
+    glass_id    varchar(32) DEFAULT NULL COMMENT '鐜荤拑id',
+    start_slot  int         DEFAULT '0' COMMENT '璧峰鏍煎瓙',
+    target_slot int         DEFAULT '0' COMMENT '鐩爣鏍煎瓙',
+    task_state  int         DEFAULT NULL COMMENT '浠诲姟鐘舵�� '
+)
+-- rollback DROP TABLE big_storage_cage_in_one_task;
+
+-- changeset zsh:20241112003
+-- preconditions onFail:CONTINUE onError:CONTINUE
+-- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM big_storage_cage_in_one_task;
+INSERT INTO big_storage_cage_in_one_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_in_one_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_in_one_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_in_one_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_in_one_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_in_one_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+
+
+-- changeset zsh:20241112004
+-- preconditions onFail:CONTINUE onError:CONTINUE
+-- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'big_storage_cage_in_two_task' and table_schema = 'hangzhoumes';
+CREATE TABLE big_storage_cage_in_two_task
+(
+    glass_id    VARCHAR(32) COMMENT '鐜荤拑id',
+    start_slot  INT DEFAULT '0' COMMENT '璧峰鏍煎瓙',
+    target_slot INT DEFAULT '0' COMMENT '鐩爣鏍煎瓙',
+    task_state  INT DEFAULT NULL COMMENT '浠诲姟鐘舵�� '
+);
+-- rollback DROP TABLE big_storage_cage_in_two_task;
+
+-- changeset zsh:20241112005
+-- preconditions onFail:CONTINUE onError:CONTINUE
+-- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM big_storage_cage_in_two_task;
+INSERT INTO big_storage_cage_in_two_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_in_two_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_in_two_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_in_two_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_in_two_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_in_two_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+
+-- changeset zsh:20241113001
+-- preconditions onFail:CONTINUE onError:CONTINUE
+-- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'big_storage_cage_out_one_task' and table_schema = 'hangzhoumes';
+CREATE TABLE big_storage_cage_out_one_task
+(
+    glass_id    varchar(32) DEFAULT NULL COMMENT '鐜荤拑id',
+    start_slot  int         DEFAULT '0' COMMENT '璧峰鏍煎瓙',
+    target_slot int         DEFAULT '0' COMMENT '鐩爣鏍煎瓙',
+    task_state  int         DEFAULT NULL COMMENT '浠诲姟鐘舵�� '
+)
+-- rollback DROP TABLE big_storage_cage_out_one_task;
+
+-- changeset zsh:20241113002
+-- preconditions onFail:CONTINUE onError:CONTINUE
+-- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM big_storage_cage_out_one_task;
+INSERT INTO big_storage_cage_out_one_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_out_one_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_out_one_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_out_one_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_out_one_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_out_one_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+
+
+-- changeset zsh:20241113003
+-- preconditions onFail:CONTINUE onError:CONTINUE
+-- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'big_storage_cage_out_two_task' and table_schema = 'hangzhoumes';
+CREATE TABLE big_storage_cage_out_two_task
+(
+    glass_id    VARCHAR(32) COMMENT '鐜荤拑id',
+    start_slot  INT DEFAULT '0' COMMENT '璧峰鏍煎瓙',
+    target_slot INT DEFAULT '0' COMMENT '鐩爣鏍煎瓙',
+    task_state  INT DEFAULT NULL COMMENT '浠诲姟鐘舵�� '
+);
+-- rollback DROP TABLE big_storage_cage_out_two_task;
+-- changeset zsh:20241113004
+-- preconditions onFail:CONTINUE onError:CONTINUE
+-- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM big_storage_cage_out_two_task;
+INSERT INTO big_storage_cage_out_two_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_out_two_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_out_two_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_out_two_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_out_two_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+INSERT INTO big_storage_cage_out_two_task(glass_id, start_slot, target_slot, task_state)
+VALUES (NULL, 0, 0, 0);
+

--
Gitblit v1.8.0