From 3a38edcb5e9c15a9591e1e913d3583f3d437caf1 Mon Sep 17 00:00:00 2001
From: ZengTao <2773468879@qq.com>
Date: 星期三, 16 十月 2024 10:05:29 +0800
Subject: [PATCH] Merge remote-tracking branch '公司服务器/master'

---
 UI-Project/src/views/Returns/returns.vue                                                                                                     |   12 
 hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/mapper/xml/RawGlassStorageDetailsMapper.xml         |   16 
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/BigStorageCageDetailsService.java          |    2 
 hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application.yml                                                      |   17 
 UI-Project/src/views/Returns/return.vue                                                                                                      |   49 
 hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/service/impl/RawGlassStorageDetailsServiceImpl.java |   17 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/uppattenusage/entity/vo/UpPattenUsageVO.java                                      |   14 
 hangzhoumesParent/common/servicebase/src/main/resources/mapper/FlowCardMapper.xml                                                            |    2 
 UI-Project/src/views/LoginView.vue                                                                                                           |    3 
 hangzhoumesParent/common/servicebase/src/main/java/com/kangaroohy/milo/configuration/MiloAutoConfiguration.java                              |    8 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeHeatLayout.java                                                 |   70 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeHeatDetailServiceImpl.java                                |   25 
 hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglasstask/entity/RawGlassStorageTask.java                        |    9 
 hangzhoumesParent/common/servicebase/src/main/java/com/kangaroohy/milo/pool/MiloConnectFactory.java                                          |   10 
 hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opccallback/CacheGlassSubscriptionCallback.java                       |   33 
 hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/OpcCacheGlassTask.java                                            |   22 
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcStorageCageTask.java                                   |   67 
 hangzhoumesParent/common/servicebase/src/main/resources/mapper/UpPattenUsageMapper.xml                                                       |   32 
 UI-Project/package.json                                                                                                                      |    2 
 hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/application.yml                                                          |    5 
 UI-Project/src/lang/py.js                                                                                                                    |  300 ++++
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeHeatDetail.java                                                 |  116 +
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/controller/BigStorageCageDetailsController.java    |    4 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/uppattenusage/mapper/UpPattenUsageMapper.java                                     |    6 
 hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/mapper/RawGlassStorageDetailsMapper.java            |   15 
 README.md                                                                                                                                    |    1 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/OptimizeHeatLayoutMapper.java                                           |   19 
 hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/service/RawGlassStorageDetailsService.java          |    4 
 UI-Project/src/views/Returns/upreturns.vue                                                                                                   | 1115 +++++++++++++++
 UI-Project/src/router/index.js                                                                                                               |   26 
 UI-Project/src/lang/index.js                                                                                                                 |    2 
 hangzhoumesParent/moduleService/pom.xml                                                                                                      |    5 
 hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/changelog/changelog.sql                                              |   43 
 UI-Project/src/views/UnLoadGlass/PrintCustomLabelSemi1.vue                                                                                   |   16 
 UI-Project/src/layout/MainErpView.vue                                                                                                        |  139 -
 hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/job/DownLoadCacheGlassTask.java                                      |    6 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeHeatLayoutService.java                                         |   17 
 hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/TemperingTask.java                                            |    2 
 hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/EdgStorageCageDetailsService.java              |   14 
 UI-Project/src/views/UnLoadGlass/loadmachinerack.vue                                                                                         |   32 
 hangzhoumesParent/moduleService/CacheGlassModule/src/test/java/com/mes/CacheGlassModuleApplicationTest.java                                  |   11 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/OptimizeHeatDetailMapper.java                                           |   19 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeHeatDetailService.java                                         |   17 
 hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/impl/EdgStorageCageDetailsServiceImpl.java     |  100 +
 hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/job/RawGlassTask.java                                               |  235 +++
 hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/service/impl/DownGlassInfoServiceImpl.java             |   17 
 hangzhoumesParent/common/servicebase/pom.xml                                                                                                 |    7 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeHeatLayoutServiceImpl.java                                |   25 
 hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/entity/RawGlassStorageDetails.java                  |    4 
 hangzhoumesParent/common/pom.xml                                                                                                             |    1 
 hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/CacheGlassTask.java                                               |  233 ++
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/test/java/com/mes/CacheVerticalGlassModuleApplicationTest.java                  |    9 
 UI-Project/src/lang/en.js                                                                                                                    |  858 +++++++---
 UI-Project/src/lang/zh.js                                                                                                                    |   61 
 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java |   25 
 hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-dev.yml                                                  |    4 
 hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/job/RawGlassPushMessage.java                                        |   72 
 UI-Project/src/views/Slicecage/slicecage.vue                                                                                                 |   55 
 /dev/null                                                                                                                                    |   12 
 hangzhoumesParent/readMe-OPC.md                                                                                                              |    6 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/impl/TemperingGlassInfoServiceImpl.java                    |    4 
 UI-Project/package-lock.json                                                                                                                 |   28 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/Const.java                                                          |   19 
 hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/taskcache/controller/TaskCacheController.java                         |    8 
 UI-Project/src/views/PurchaseReturn/purchaseReturn.vue                                                                                       |    2 
 UI-Project/src/views/NewPage.vue                                                                                                             |  151 ++
 66 files changed, 3,604 insertions(+), 676 deletions(-)

diff --git a/README.md b/README.md
index f71d789..6990012 100644
--- a/README.md
+++ b/README.md
@@ -37,3 +37,4 @@
 4.  [GVP](https://gitee.com/gvp) 鍏ㄧО鏄� Gitee 鏈�鏈変环鍊煎紑婧愰」鐩紝鏄患鍚堣瘎瀹氬嚭鐨勪紭绉�寮�婧愰」鐩�
 5.  Gitee 瀹樻柟鎻愪緵鐨勪娇鐢ㄦ墜鍐� [https://gitee.com/help](https://gitee.com/help)
 6.  Gitee 灏侀潰浜虹墿鏄竴妗g敤鏉ュ睍绀� Gitee 浼氬憳椋庨噰鐨勬爮鐩� [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
+
diff --git a/UI-Project/package-lock.json b/UI-Project/package-lock.json
index 1762ec0..352bc93 100644
--- a/UI-Project/package-lock.json
+++ b/UI-Project/package-lock.json
@@ -26,7 +26,7 @@
         "vue-echarts": "^6.7.3",
         "vue-i18n": "^9.10.1",
         "vue-print-nb": "^1.7.5",
-        "vue-router": "^4.2.4",
+        "vue-router": "^4.0.13",
         "vue3-print-nb": "^0.1.4",
         "vxe-table": "^4.5.15",
         "xe-utils": "^3.5.14",
@@ -2036,11 +2036,11 @@
       }
     },
     "node_modules/vue-router": {
-      "version": "4.2.5",
-      "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.5.tgz",
-      "integrity": "sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==",
+      "version": "4.0.13",
+      "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.0.13.tgz",
+      "integrity": "sha512-LmXrC+BkDRLak+d5xTMgUYraT3Nj0H/vCbP+7usGvIl9Viqd1UP6AsP0i69pSbn9O0dXK/xCdp4yPw21HqV9Jw==",
       "dependencies": {
-        "@vue/devtools-api": "^6.5.0"
+        "@vue/devtools-api": "^6.0.0"
       },
       "funding": {
         "url": "https://github.com/sponsors/posva"
@@ -3154,7 +3154,7 @@
         "vue-echarts": "^6.7.3",
         "vue-i18n": "^9.10.1",
         "vue-print-nb": "^1.7.5",
-        "vue-router": "^4.2.4",
+        "vue-router": "4.0.13",
         "vue3-print-nb": "^0.1.4",
         "vxe-table": "^4.5.15",
         "xe-utils": "^3.5.14",
@@ -4536,11 +4536,11 @@
           }
         },
         "vue-router": {
-          "version": "4.2.5",
-          "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.5.tgz",
-          "integrity": "sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==",
+          "version": "4.0.13",
+          "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.0.13.tgz",
+          "integrity": "sha512-LmXrC+BkDRLak+d5xTMgUYraT3Nj0H/vCbP+7usGvIl9Viqd1UP6AsP0i69pSbn9O0dXK/xCdp4yPw21HqV9Jw==",
           "requires": {
-            "@vue/devtools-api": "^6.5.0"
+            "@vue/devtools-api": "^6.0.0"
           }
         },
         "vue3-print-nb": {
@@ -5093,11 +5093,11 @@
       }
     },
     "vue-router": {
-      "version": "4.2.5",
-      "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.5.tgz",
-      "integrity": "sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==",
+      "version": "4.0.13",
+      "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.0.13.tgz",
+      "integrity": "sha512-LmXrC+BkDRLak+d5xTMgUYraT3Nj0H/vCbP+7usGvIl9Viqd1UP6AsP0i69pSbn9O0dXK/xCdp4yPw21HqV9Jw==",
       "requires": {
-        "@vue/devtools-api": "^6.5.0"
+        "@vue/devtools-api": "^6.0.0"
       }
     },
     "vue3-print-nb": {
diff --git a/UI-Project/package.json b/UI-Project/package.json
index c08443f..67c31f5 100644
--- a/UI-Project/package.json
+++ b/UI-Project/package.json
@@ -26,7 +26,7 @@
     "vue-echarts": "^6.7.3",
     "vue-i18n": "^9.10.1",
     "vue-print-nb": "^1.7.5",
-    "vue-router": "^4.2.4",
+    "vue-router": "^4.0.13",
     "vue3-print-nb": "^0.1.4",
     "vxe-table": "^4.5.15",
     "xe-utils": "^3.5.14",
diff --git a/UI-Project/src/lang/en.js b/UI-Project/src/lang/en.js
index 869758b..07b45d6 100644
--- a/UI-Project/src/lang/en.js
+++ b/UI-Project/src/lang/en.js
@@ -1,300 +1,586 @@
 export  default {
-    "northglassMESsystem": '小懈褋褌械屑邪 "NorthGlass MES"' ,
-      login:{
-          userErr:'袙胁械写懈褌械 薪芯屑械褉 褋褔械褌邪.',
-          pwErr:'袙胁械写懈褌械 锌邪褉芯谢褜.',
-          user:'袗泻泻邪褍薪褌',
-          password:'袣芯写',
-          login:'袟邪谢芯谐懈薪',
-          loginSuccessful:'袙褏芯写 胁 褋懈褋褌械屑褍 胁褘锌芯谢薪械薪 褍褋锌械褕薪芯锛�',
-          register:'袟邪褉械谐懈褋褌褉懈褉芯胁邪',
-          namea:'袠屑褟 薪械 屑芯卸械褌 斜褘褌褜 锌褍褋褌褘屑',
-          len:'袛谢懈薪邪 薪械 写芯谢卸薪邪 锌褉械胁褘褕邪褌褜 16',
-          passnull:'袩邪褉芯谢褜 薪械 屑芯卸械褌 斜褘褌褜 锌褍褋褌褘屑',
-          leng:'袛谢懈薪邪 锌邪褉芯谢褟 薪械 写芯谢卸薪邪 斜褘褌褜 屑械薪褜褕械 6 懈谢懈 斜芯谢褜褕械 16.',
-          spwn:'袩邪褉芯谢褜 锌芯写褌胁械褉卸写械薪懈褟 薪械 屑芯卸械褌 斜褘褌褜 锌褍褋褌褘屑',
-          depass:'袛胁邪 褉邪蟹薪褘褏 锌邪褉芯谢褟.',
-      },
-      register:{
-          registerSuccessful:'袪械谐懈褋褌褉邪褑懈褟 褍褋锌械褕薪芯',
-          newuserregister:'袧芯胁褘泄 褉械械褋褌褉 锌芯谢褜蟹芯胁邪褌械谢械泄',
-          name:'袠屑褟锛�',
-          inputname:'袙胁械写懈褌械 懈屑褟',
-          password:'袣芯写:',
-          pwErr:'袙胁械写懈褌械 锌邪褉芯谢褜.',
-          passwordation:'袩芯写褌胁械褉写懈褌械 锌邪褉芯谢褜:',
-          pwErration:'袩芯卸邪谢褍泄褋褌邪, 锌芯写褌胁械褉褌懈褌械 锌邪褉芯谢褜',
-          registration:'袩芯写褌胁械褉卸写械薪懈械 芯 褉械谐懈褋褌褉邪褑懈懈',
-          false:'袨褌屑械薪邪',
-      },
-      main:{
-          connectErr:'袧械芯斜褘褔薪芯械 锌芯写泻谢褞褔械薪懈械 泻 褋械褉胁械褉褍, 锌芯锌褉芯斜褍泄褌械 锌芯蟹卸械',
-          titleFirst:"袛芯斜褉芯 锌芯卸邪谢芯胁邪褌褜 ",
-          titleLast:' 胁 褋懈褋褌械屑褍 NorthGlass MES锛�',
-          quit:"袙褘褏芯写",
-      },
-      basicData:{
-          deletemessage:'校写邪谢懈褌褜 褝褌褍 懈薪褎芯褉屑邪褑懈褞 懈谢懈 薪械褌?',
-          laserprinting:'袦邪褕懈薪邪 谢邪蟹械褉薪芯泄 屑邪褉泻懈褉芯胁泻懈 谐芯褌芯胁邪锛�',
-          cuttingmachine:'袦邪褕懈薪邪 写谢褟 褉械蟹泻懈 谐芯褌芯胁邪锛�',
-          machine:'小芯褋褌芯褟薪懈械 褋褌邪薪芯泻 蟹邪谐褉褍蟹泻懈 胁 褉械卸懈屑械 芯薪谢邪泄薪锛�',
-          machineaa:'袪褍褔薪芯械 褋芯褋褌芯褟薪懈械 褋褌邪薪芯泻 蟹邪谐褉褍蟹泻懈:',
-          selectproject:"袙褘斜械褉懈褌械 锌褉芯械泻褌",
-          startloading:'袧邪褔邪谢芯 蟹邪谐褉褍蟹泻懈',
-          stop:'袩邪褍蟹邪',
-          yes:'锌芯写褌胁械褉写',
-          change:'锌械褉械泻谢褞褔邪',
-          projectnumber:'袧芯屑械褉 锌褉芯械泻褌邪',
-          glasswidth:'楔懈褉懈薪邪 褋褌械泻谢邪',
-          glassheight:'袙褘褋芯褌邪 褋褌械泻谢邪',
-          coatingtypes:'孝懈锌褘 锌芯泻褉褘褌懈泄',
-          coatingtypesa:'孝懈锌褘 锌芯泻褉褘褌懈泄锛�',
-          quantity:'袣芯谢懈褔械褋褌胁芯',
-          quantitya:'袣芯谢懈褔械褋褌胁芯锛�',
-          thickness:'孝芯谢褖懈薪邪',
-          thicknessa:'孝芯谢褖懈薪邪锛�',
-          startstatus:'小褌邪褌褍褋 薪邪褔邪谢邪 芯锌械褉邪褑懈懈',
-          pass:'效械褉械蟹',
-          waiting:'袞写械屑.',
-          up:'袟邪谐褉褍蟹泻邪',
-          finish:'袟邪胁械褉褕械薪芯',
-          project:'懈薪卸械薪械褉懈褟',
-          plselectproject:'袩芯卸邪谢褍泄褋褌邪, 胁褘斜械褉懈褌械 锌褉芯械泻褌.',
-          confirm:'锌芯写褌胁械褉写',
-          cancel:'袨褌屑械薪邪',
-          startfilm:'袧邪褔懈薪邪褌褜 懈谢懈 薪械褌锛�',
-          whetherpause:'袩邪褍蟹邪 懈谢懈 薪械褌锛�',
-          station:'袪邪斜芯褔械械 屑械褋褌芯',
-          width:'楔懈褉懈薪邪',
-          widtha:'楔懈褉懈薪邪锛�',
-          height:'袙褘褋芯褌邪',
-          heighta:'袙褘褋芯褌邪锛�',
-          operate:'袨锌械褉邪褑懈褟',
-          add:'袛芯斜邪胁谢褟',
-          delete:'校写邪谢',
-          addglass:'袛芯斜邪胁懈褌褜 褋褌械泻谢芯',
-          selectwidth:'袙褘斜懈褉懈褌械 褕懈褉懈薪褍',
-          selectheight:'袙褘斜懈褉懈褌械 胁褘褋芯褌褍',
-          selectcoatingtypes:'袙褘斜械褉懈褌械 褌懈锌褘 锌芯泻褉褘褌懈泄',
-          selectthickness:'袙褘斜械褉懈褌械 褌芯谢褖懈薪褍',
-          selectquantity:'袙胁械写懈褌械 泻芯谢褜褔械褋褌胁芯.',
-          pause:'袙褌芯褉邪褟 懈 褔械褌胁械褉褌邪褟 褋褌褉芯泻懈 写芯谢卸薪褘 斜褘褌褜 胁褘褕械 2700 写谢褟 褋芯褏褉邪薪械薪懈褟!',
-          pausea:'袩芯卸邪谢褍泄褋褌邪, 褍斜械写懈褌械褋褜, 褔褌芯 屑邪褉泻懈褉芯胁芯褔薪邪褟 懈 褉械卸褍褖邪褟 屑邪褕懈薪褘 谐芯褌芯胁褘!',
-          infonull:'袧芯屑械褉 锌褉芯械泻褌邪 薪械 屑芯卸械褌 斜褘褌褜 锌褍褋褌褘屑!',
-          updatanull:'袩褉芯械泻褌 薪械 褋芯褏褉邪薪懈谢懈褋褜 薪邪 谢懈褋褌械 蟹邪谐褉褍蟹泻懈!',
-          glassnull:'袨褕懈斜泻邪 锌褉懈 芯斜薪芯胁谢械薪懈懈 褋褌械泻谢邪',
-      },
-      sorter:{
-          gridnumber:'携褔械械泻 褋械褌泻谢邪',
-          glassnumber:'袧芯屑械褉 褋褌邪泻谢邪',
-          width:'楔懈褉懈薪邪',
-          height:'袙褘褋芯褌邪',
-          startstatus:'小褌邪褌褍褋 薪邪褔邪谢邪 芯锌械褉邪褑懈懈',
-          disable:'袨褌泻谢褞褔',
-          start:'袧邪褔邪谢芯',
-          deficiencieste:'袧械写芯褋褌邪褌泻懈 胁 芯褌褔械褌薪芯褋褌懈',
-          operate:'袨锌械褉邪褑懈褟',
-          prompt:'袩芯写褋泻邪蟹泻',
-          information:'小谢械写褍械褌 谢懈 褋芯芯斜褖邪褌褜 薪械写芯褋褌邪褞褖褍褞 懈薪褎芯褉屑邪褑懈褞锛�',
-          yes:'袛邪',
-          cancel:'袨褌屑械薪邪',
-      },
-      order:{
-          dilapidation:'袩芯胁褉械卸写械薪懈械',
-          Takeaway:'袙蟹褟褌褜 胁褉褍褔薪褍褞',
-      },
-
-      searchOrder:{
-        cageinformation:'袠薪褎芯褉屑邪褑懈褟 斜褍褎械褉邪',
-        productionqueue:'袩褉芯懈蟹胁芯写褋褌胁械薪薪邪褟 芯褔械褉械写褜',
-        outputglassID:'袙褘褏芯写薪芯械 褋褌械泻谢芯 ID',
-        startposition:'袟邪薪褟褌褜 锌芯蟹懈褑懈懈',
-        targetlocation:'袩芯蟹懈褑懈褟 褑械谢懈',
-        trips:'鈩� 锌芯械蟹写邪',
-        number:'小械褉懈泄薪 薪芯屑械褉',
-        taskstatus:'小芯褋褌芯褟薪懈械 蟹邪写邪褔懈',
-        filmenter:'袨卸懈写邪薪懈械 褋褌械泻谢褟薪薪芯泄 胁褏芯写',
-        infilm:'袙 薪邪褋褌芯褟褖械械 胁褉械屑褟',
-        endtask:'袟邪写邪褔邪 薪邪 泻芯薪械褑',
-        completetask:'袙褘锌芯谢薪械薪懈械 蟹邪写邪薪懈褟',
-        intoglassid:'袙褏芯写薪芯泄 褋褌械泻谢褟薪薪褘泄 ID',
-        line:'袥懈薪懈褟',
-        Usage:'小泻芯褉芯褋褌褜 懈褋锌芯谢褜蟹芯胁邪薪懈褟',
-        free:'袘械褋锌谢邪褌薪芯 (褟褔械械泻)',
-        addcage:'袛芯斜邪胁懈褌褜 懈薪褎芯褉屑邪褑懈褞 芯 斜褍褎械褉械',
-        glassIDa:'小褌械泻谢褟薪薪褘泄 ID锛�',
-        glassID:'小褌械泻谢褟薪薪褘泄 ID',
-        inglassID:'袙胁械写懈褌械 褋褌械泻谢芯 ID',
-        pieceingrid:'袩芯褉褟写芯泻 褉邪褋锌芯谢芯卸械薪懈褟 屑邪谢械薪褜泻懈褏 褋褌械泻谢褟薪薪褘褏 锌谢邪褋褌懈薪 胁 泻谢械褌泻械',
-        pieceingrida:'袩芯褉褟写芯泻 褉邪褋锌芯谢芯卸械薪懈褟 屑邪谢械薪褜泻懈褏 褋褌械泻谢褟薪薪褘褏 锌谢邪褋褌懈薪 胁 泻谢械褌泻械锛�',
-        inpieceingrid:'袙胁械写懈褌械 锌芯褉褟写芯泻 褉邪褋锌芯谢芯卸械薪懈褟 褋褌械泻谢褟薪薪褘褏 谢懈褋褌芯胁 胁 褟褔械械泻械',
-        cardnumber:'袧芯屑械褉 泻邪褉褌芯褔泻懈 锌褉芯褑械褋褋邪',
-        cardnumbera:'袧芯屑械褉 泻邪褉褌芯褔泻懈 锌褉芯褑械褋褋邪锛�',
-        incardnumber:'袙胁械写懈褌械 薪芯屑械褉 锌褉芯褑械褋褋邪 .',
-        typeglass:'孝懈锌 褋褌械泻谢邪',
-        typeglassa:'孝懈锌 褋褌械泻谢邪锛�',
-        intypeglass:'袙胁械写懈褌械 褌懈锌 褋褌械泻谢邪',
-        coatingtypes:'孝懈锌褘 锌芯泻褉褘褌懈泄',
-        width:'楔懈褉懈薪邪',
-        widtha:'楔懈褉懈薪邪锛�',
-        inwidth:'袙胁械写懈褌械 褕懈褉懈薪褍',
-        height:'袙褘褋芯褌邪',
-        heighta:'袙褘褋芯褌邪锛�',
-        inheight:'袙胁械写懈褌械 胁褘褋芯褌褍',
-        thickness:'孝芯谢褖懈薪邪',
-        thicknessa:'孝芯谢褖懈薪邪锛�',
-        inthickness:'袙胁械写懈褌械 褌芯谢褖懈薪褍.',
-        layoutID:'效械褉褌械卸 ID 蟹邪谐褉褍蟹泻懈 锌械褔懈 写谢褟 蟹邪泻邪谢泻懈',
-        layoutIDa:'效械褉褌械卸 ID 蟹邪谐褉褍蟹泻懈 锌械褔懈 写谢褟 蟹邪泻邪谢泻懈锛�',
-        inlayoutID:'袙胁械写懈褌械 褔械褉褌械卸 蟹邪泻邪谢泻懈 ID',
-        picturesequence:'效械褉褌械卸 褋械褉懈泄薪 薪芯屑械褉 蟹邪谐褉褍蟹泻懈 锌械褔懈 写谢褟 蟹邪泻邪谢泻懈',
-        picturesequencea:'效械褉褌械卸 褋械褉懈泄薪 薪芯屑械褉 蟹邪谐褉褍蟹泻懈 锌械褔懈 写谢褟 蟹邪泻邪谢泻懈锛�',
-        inpicturesequence:'袙胁械写懈褌械 锌芯褉褟写芯泻 褔械褉褌械卸懈 蟹邪泻邪谢泻懈 褋褌械泻谢邪.',
-        startstatus:'小褌邪褌褍褋 薪邪褔邪谢邪 芯锌械褉邪褑懈懈',
-        startstatusa:'小褌邪褌褍褋 薪邪褔邪谢邪 芯锌械褉邪褑懈懈锛�',
-        instartstatus:'袙胁械写懈褌械 褋芯褋褌芯褟薪懈械 邪泻褌懈胁邪褑懈懈',
-        glassgaps:'小褌械泻谢褟薪薪褘泄 蟹邪蟹芯褉',
-        glassgapsa:'小褌械泻谢褟薪薪褘泄 蟹邪蟹芯褉锛�',
-        inglassgaps:'袙胁械写懈褌械 褋褌械泻谢芯 蟹邪蟹芯褉',
-        sure:'锌芯写褌胁械褉写',
-        cancel:'袨褌屑械薪邪',
-        operate:'袨锌械褉邪褑懈褟',
-        breakage:'袩芯胁褉械卸写械薪懈械',
-        delete:'校写邪谢',
-        outfilm:'袙褘锌褍褋泻 褋褌械泻谢邪',
-        cagetableID:'ID 斜褍褎械褉薪芯泄 褌邪斜谢懈褑褘',
-        cagenumber:'袘褍褎械褉 薪芯屑械褉邪',
-        gridnumber:'携褔械械泻 褋械褌泻谢邪',
-        enable:'袧邪褔邪谢芯',
-        disable:'袨褌泻谢褞褔',
-        remainingwidth:'袨褋褌邪褌芯褔薪邪褟 褕懈褉懈薪邪',
-        add:'袛芯斜邪胁谢褟',
-        sheetID:'袟邪泻邪谢泻邪 屑邪谢械薪褜泻懈泄 褋褌械泻谢褟薪薪褘泄 ID 褌邪斜谢懈褑褘 懈薪褎芯褉屑邪褑懈懈',
-        processcards:'袣邪褉褌芯褔泻邪 锌褉芯褑械褋褋邪',
-        processcardtype:'孝懈锌 褋褌械泻谢邪 泻邪褉褌芯褔泻懈 锌褉芯褑械褋褋邪',
-        acceptshorizontal:'校屑械褉械薪薪芯械 锌褉懈薪褟褌懈械 谐芯褉懈蟹芯薪褌邪谢懈',
-        xcoordinates:'X-泻芯芯褉写懈薪邪褌褘',
-        ycoordinates:'Y-泻芯芯褉写懈薪邪褌褘',
-        rotationangle:'校谐芯谢 胁褉邪褖械薪懈褟 (锌褉芯褌懈胁 褔邪褋芯胁芯泄 褋褌褉械谢泻懈)',
-        state:'小芯褋褌芯褟薪懈械',
-        takeout:'袙蟹褟褌褜',
-        deletemessage:'校写邪谢懈褌褜 褝褌褍 懈薪褎芯褉屑邪褑懈褞 懈谢懈 薪械褌?',
-        prompt:'袩芯写褋泻邪蟹泻',
-        yes:'袛邪',
-        accept:'袩褉懈薪褟褌褜',
-        noaccept:'袧械 锌褉懈薪懈屑邪褌褜',
-        filmcomplete:'小褌械泻谢芯 谐芯褌芯胁芯',
-        waiting:'袞写械屑.',
+  "northglassMESsystem": "NorthGlass MES System",
+    login:{
+        userErr:'Please enter account number',
+        pwErr:'Please input a password',
+        user:'Account number',
+        password:'Password',
+        login:'Log on',
+        loginSuccessful:'Log on was successful锛�',
+        register:'Register',
+        namea:'Name cannot be empty',
+        len:'The length cannot exceed 16',
+        passnull:'Password cannot be empty',
+        leng:'The password length cannot be less than 6 or more than 16',
+        spwn:'Confirm password cannot be empty',
+        depass:'The two passwords are not the same',
+    },
+    register:{
+        registerSuccessful:'login was successful',
+        newuserregister:'New user register',
+        name:'Full name锛�',
+        inputname:'Please enter your name',
+        password:'Password:',
+        pwErr:'Please input a password',
+        passwordation:'Confirm password:',
+        pwErration:'Please confirm password',
+        registration:'Registration Confirm',
+        false:'Cancel',
+    },
+    main:{
+        connectErr:'The server connection is abnormal. Please try again later',
+        titleFirst:"Welcome ",
+        titleLast:' to use NorthGlass MES system锛�',
+        quit:"Exit",
+    },
+    basicData:{
+        laserprinting:'Laser printing machine ready status锛�',
+        cuttingmachine:'Cutting machine ready status锛�',
+        machine:'Online status of the loading table锛�',
+        machineaa:'Manual state of the loading table锛�',
+        selectproject:"Select project",
+        startloading:'Start loading',
+        stop:'Pause',
+        yes:'Confirm',
+        change:'Switch',
+        projectnumber:'Project number',
+        glasswidth:'Glass width',
+        glassheight:'Glass height',
+        coatingtypes:'Coating types',
+        coatingtypesa:'Coating types锛�',
+        quantity:'Quantity',
+        quantitya:'Quantity锛�',
+        thickness:'Thickness',
+        thicknessa:'Thickness锛�',
+        startstatus:'Start status',
+        pass:'Pass',
+        waiting:'Waiting',
+        up:'Loading',
+        finish:'Completed',
+        project:'Project ',
+        plselectproject:'Please select project',
+        confirm:'Confirm',
+        cancel:'Cancel',
+        startfilm:'Whether start loading锛�',
+        whetherpause:'Whether pause锛�',
+        station:'Station',
+        width:'Width',
+        widtha:'Width锛�',
+        height:'Height',
+        heighta:'Height锛�',
+        operate:'Operate',
+        add:'Increase',
+        delete:'Delete',
+        addglass:'Add glass',
+        selectwidth:'Please select width',
+        selectheight:'Please select high',
+        selectcoatingtypes:'Please select the coating types',
+        selectthickness:'Please select thickness',
+        selectquantity:'Please enter the quantity',
+        pause:'The height of the second and fourth rows must be greater than 2700 in order to save锛�',
+        pausea:'Please confirm the ready status of marking machine and cutting machine锛�',
+        infonull:'Project number cannot be empty锛�',
+        updatanull:'This project has not been saved to the loading list锛�',
+        glassnull:'An error occurred while updating the glass status',
+        deletemessage:'Do you want to delete this message?',
+        layoutSequence:'Serial Number',
+    },
+    sorter:{
+        gridnumber:'Grid number',
+        glassnumber:'Glass number',
+        width:'Width',
+        height:'Height',
+        startstatus:'Start status',
+        disable:'Disabled',
+        start:'Enabled',
+        deficiencieste:'Report deficiencies',
+        updown:'Artificial filming',
+        operate:'Operate',
+        prompt:'Prompt',
+        information:'Is the missing information reported锛�',
+        infor:'Whether to manually download this information锛�',
+        yes:'Yes',
+        cancel:'Cancel',
+    },
+    order:{
+        dilapidation:'Breakage',
+        takeaway:'Manual removal',
+        takeon:'The arrangement is complete',
+    },
+    searchOrder:{
+        cageinformation:'Sorter information',
+        productionqueue:'Production queue',
+        outputglassID:'Output glass ID',
+        startposition:'Start position',
+        targetlocation:'Target Position',
+        trips:'Train number',
+        number:'Serial Number',
+        taskstatus:'Task state',
+        filmenter:'Waiting for input glass',
+        infilm:'In progress',
+        endtask:'End task',
+        completetask:'Complete the task',
+        intoglassid:'Input glass ID',
+        line:'Wire',
+        Usage:'Usage rate',
+        free:'Free(pieces)',
+        addcage:'Add information on sorter',
+        glassIDa:'Glass ID锛�',
+        glassID:'Glass ID',
+        inglassID:'Please enter the glass ID',
+        pieceingrid:'The order of small pieces within the grid',
+        pieceingrida:'The order of small pieces within the grid锛�',
+        inpieceingrid:'Please enter the order of small pieces within the grid',
+        cardnumber:'Process card number',
+        cardnumbera:'Process card number锛�',
+        incardnumber:'Please enter the process card number',
+        typeglass:'Glass type',
+        typeglassa:'Glass type锛�',
+        intypeglass:'Please enter the glass type',
+        width:'Width',
+        widtha:'Width锛�',
+        inwidth:'Please enter width',
+        height:'Height',
+        heighta:'Height锛�',
+        inheight:'Please enter height',
+        coatingtypes:'Coating types',
+        thickness:'Thickness',
+        thicknessa:'Thickness锛�',
+        inthickness:'Please enter the thickness',
+        layoutID:'Drawing ID of loading for tempering furnace',
+        layoutIDa:'Drawing ID of loading for tempering furnace锛�',
+        inlayoutID:'Please enter the drawing ID of loading for tempering furnace',
+        picturesequence:'Drawing sequence of loading for tempering furnace',
+        picturesequencea:'Drawing sequence of loading for tempering furnace锛�',
+        inpicturesequence:'Please enter the drawing sequence of loading for tempering furnace',
+        startstatus:'Start status',
+        startstatusa:'Start status锛�',
+        instartstatus:'Please enter the enabled status',
+        glassgaps:'Glass gap',
+        glassgapsa:'Glass gap锛�',
+        inglassgaps:'Please enter the glass gap',
+        sure:'Confirm',
+        cancel:'Cancel',
+        operate:'Operate',
+        breakage:'Breakage',
+        delete:'Delete',
+        outfilm:'Output glass',
+        cagetableID:'Sorter table ID',
+        cagenumber:'Sorter number',
+        gridnumber:'Grid number',
+        gridnumbera:'Grid number锛�',
+        grid:'Please enter a grid number',
+        enable:'Enabled',
+        disable:'Disabled',
+        remainingwidth:'Remaining width',
+        add:'Add',
+        sheetID:'Tempered small piece information table ID',
+        processcards:'Process card',
+        processcardtype:'Process card glass type',
+        acceptshorizontal:'Does tempering accept horizontal placement',
+        xcoordinates:'x coordinate',
+        ycoordinates:'Y coordinate',
+        rotationangle:'Rotation angle (counterclockwise)',
+        state:'Status',
+        takeout:'Take away',
+        deletemessage:'Do you want to delete this message?',
+        prompt:'Prompt',
+        yes:'Yes',
+        accept:'Accept',
+        noaccept:'Not accept',
+        filmcomplete:'Glass output completed',
+        waiting:'Waiting',
+        broke:'Is this information damaged锛�',
+        brokeb:'Do you need to delete the message锛�',
+        outfil:'Whether the film is released or not锛�',
+        inputid:'Please enter the glass ID',
+        search:'Search',
+        tabid:'Dali film cage details table ID',
+        tid:'Device ID',
+        tida:'Device ID锛�',
+        fin:'Whether or not the task was completed锛�',
+        sureadd:'Confirm the addition',
+        sureadda:'Whether to confirm the addition锛�',
+        zailong:'In a cage',
+        rengongxp:'Artificial filming',
+        up:'Previous',
+        down:'Next',
+        now:'The current page is displayed',
+        tit:'data',
+        temperingqueries:'Tempering queries',
+        specifytempering:'Specify a furnace',
+        specifyengineerid:'Specify the project',
+        projectnumber:'Project number',
+        layoutnumber:'Drawing number of loading for tempering furnace',
+        numberglasses:'Number of glasses',
+        specifytemperinga:'Whether to specify the tempering of this information锛�',
+        temperedswitch:'Tempered switch',
+        dutyinformation:'Duty information',
+        process:'Process',
+        team:'Team',
+        basic:'equipment',
+        makesure:'Confirm the save',
+        // cancel:'鍙栨秷',
+        temperingtotal:'Number of tempering furnaces锛�',
+        glasstotal:'Total number of glasses锛�',
     },
     workOrder:{
-        glassID:'小褌械泻谢褟薪薪褘泄 ID',
-        height:'袙褘褋芯褌邪',
-        width:'楔懈褉懈薪邪',
-        thickness:'孝芯谢褖懈薪邪',
-        coatingtypes:'孝懈锌褘 锌芯泻褉褘褌懈泄',
-        productionsequence:'袩芯褋谢械写芯胁邪褌械谢褜薪芯褋褌褜 锌褉芯懈蟹胁芯写褋褌胁邪',
-        cardnumber:'袧芯屑械褉 泻邪褉褌芯褔泻懈 锌褉芯褑械褋褋邪',
-        operate:'袨锌械褉邪褑懈褟',
-        messagedamaged:'袩芯胁褉械卸写械薪芯 谢懈 褋芯芯斜褖械薪懈械锛�',
-        prompt:'袩芯写褋泻邪蟹泻',
-        yes:'袛邪',
-        cancel:'袨褌屑械薪邪',
-        takemessage:'小谢械写褍械褌 谢懈 褍写邪谢褟褌褜 褋芯芯斜褖械薪懈械锛�',
-        breakage:'袩芯胁褉械卸写械薪懈械',
-        takeout:'袙蟹褟褌褜',
+        glassID:'Glass ID',
+        height:'Height',
+        width:'Width',
+        thickness:'Thickness',
+        coatingtypes:'Coating types',
+        productionsequence:'Production sequence',
+        cardnumber:'Process card number',
+        operate:'Operate',
+        messagedamaged:'Is this information damaged?',
+        prompt:'Prompt',
+        yes:'Yes',
+        cancel:'Cancel',
+        takemessage:'Do you need to delete the message锛�',
+        breakage:'Breakage',
+        takeout:'Take away',
+        glasstype:'Glass type',
+        line:'Wire',
+        status:'Status',
     },
     processCard:{
-        intofurnace:'袙 锌械褔褜',
-        beforefurnace:'袛芯 锌械褔泻懈.',
-        outfurnace:'袨泻芯薪褔械薪芯 褋褌械泻谢芯 懈蟹 锌械褔懈 写谢褟 蟹邪泻邪谢泻懈',
+        intofurnace:'Entering the furnace',
+        beforefurnace:'Before entering the furnace',
+        outfurnace:'Glass finished from tempering furnace',
+        print:'Take away the print',
+        printing:'print',
+        projectnumber:'Please enter the project number',
+        inquire:'Inquire',
+        project:'Project number',
+        awayprocess:'Take away the process',
+        awayequipment:'Take away the equipment',
+        awayteam:'Take away the crew',
+        flowcard:'Process card',
+        layer:'Layer number',
+        temperinglayout:'Heat number',
+        temperingfeed:'Preface',
+        width:'Width',
+        height:'Height',
+        thickness:'Thickness',
+        glasstakeout:'Glass take away list',
+        layoutID:'Drawing ID of loading for tempering furnace',
+        glassID:'Glass ID',
     },
     reportWork:{
-        lowerbit:'小褌邪薪褑懈褟 褉邪蟹谐褉褍蟹泻懈',
-        shelfnumber:'袧芯屑械褉 褋褌芯泄泻懈 褉械谐懈褋褌褉邪褑懈懈',
-        cardnumber:'袧芯屑械褉 泻邪褉褌芯褔泻懈 锌褉芯褑械褋褋邪',
-        totalquantity:'袨斜褖械械 泻芯谢懈褔械褋褌胁芯',
-        beendropped:'袣芯谢懈褔械褋褌胁芯 褋褌械泻谢邪 褉邪蟹谐褉褍蟹泻懈',
-        state:'小芯褋褌芯褟薪懈械',
-        devicenumber:'袧芯屑械褉 芯斜芯褉褍写芯胁邪薪懈褟.',
-        startstatus:'小褌邪褌褍褋 薪邪褔邪谢邪 芯锌械褉邪褑懈懈',
-        enable:'袧邪褔邪谢芯',
-        unenable:'袧械 薪邪褔邪褌',
-        operate:'袨锌械褉邪褑懈褟',
-        bindingshelves:'袧邪蟹薪邪褔械薪薪邪褟 褋褌械谢谢邪卸泻邪',
-        clear:'效懈褋褌芯.',
-        workstation:'小褌邪薪褑懈褟 薪芯屑械褉',
-        cardnumbera:'袧芯屑械褉 泻邪褉褌芯褔泻懈 锌褉芯褑械褋褋邪锛�',
-        incardnumber:'袩芯卸邪谢褍泄褋褌邪, 胁褘斜械褉懈褌械 薪芯屑械褉 锌褉芯谐褉邪屑屑褘',
-        clearglass:'袨褔懈褋褌懈褌褜 褋褌械泻谢芯 褋 锌芯谢泻懈',
-        sure:'锌芯写褌胁械褉写',
-        cancel:'袨褌屑械薪邪',
-        glassinformation:'袠薪褎芯褉屑邪褑懈褟 褋褌械泻谢邪',
-        glassID:'小褌械泻谢褟薪薪褘泄 ID',
-        coatingtypes:'孝懈锌褘 锌芯泻褉褘褌懈泄',
-        thickness:'孝芯谢褖懈薪邪',
-        width:'楔懈褉懈薪邪',
-        height:'袙褘褋芯褌邪',
+        lowerbit:'Unloading station',
+        shelfnumber:'Rack number',
+        cardnumber:'Process card number',
+        totalquantity:'Total quantity',
+        beendropped:'Quantity of unloaded glass',
+        state:'Status',
+        devicenumber:'Equipment No.',
+        startstatus:'Start status',
+        enable:'Start',
+        unenable:'Unstart',
+        operate:'Operate',
+        bindingshelves:'Assigned rack',
+        clear:'Clear',
+        workstation:'Station No.',
+        shelfnumbera:'Rack number锛�',
+        cardnumbera:'Process card number锛�',
+        incardnumber:'Please select the process card number',
+        clearglass:'Clear the glass on the shelf',
+        sure:'Operate',
+        cancel:'Cancel',
+        glassinformation:'Glass information',
+        glassID:'Glass ID',
+        coatingtypes:'Coating types',
+        thickness:'Thickness',
+        width:'Width',
+        height:'Height',
     },
+
     productStock:{
-        addusers:'袛芯斜邪胁褜褌械 锌芯谢褜蟹芯胁邪褌械谢械泄.',
-        username:'袠屑褟 锌芯谢褜蟹芯胁邪褌械谢褟.',
-        usernamea:'袠屑褟 锌芯谢褜蟹芯胁邪褌械谢褟.锛�',
-        inusername:'袙胁械写懈褌械 懈屑褟 锌芯谢褜蟹芯胁邪褌械谢褟',
-        role:'袪芯谢褜',
-        rolea:'袪芯谢褜锛�',
-        inrole:'袙褘斜械褉懈褌械 褉芯谢褜',
-        test:'孝械褋褌',
-        admin:'袗写屑懈薪懈褋褌褉邪褌芯褉.',
-        operate:'袨锌械褉邪褑懈褟',
-        resetpassword:'小斜褉芯褋懈褌褜 锌邪褉芯谢褜',
-        exit:'袪械写邪泻褌芯褉',
-        delete:'校写邪谢',
-        prompt:'袩芯写褋泻邪蟹泻',
-        repassword:'袩械褉械蟹邪谐褉褍蟹泻邪 锌芯谢褜蟹芯胁邪褌械谢褜褋泻芯谐芯 锌邪褉芯谢褟 懈谢懈 薪械褌锛�',
-        yes:'袛邪',
-        cancel:'袨褌屑械薪邪',
-        reusername:'袠蟹屑械薪械薪懈械 锌芯谢褜蟹芯胁邪褌械谢褟',
-        addusername:'袛芯斜邪胁褜褌械 锌芯谢褜蟹芯胁邪褌械谢械泄.',
-        password:'袣芯写锛�',
-        sure:'锌芯写褌胁械褉写',
-        inpassword:'袙胁械写懈褌械 锌邪褉芯谢褜.',
-        deusername:'校写邪谢械薪懈械 锌芯谢褜蟹芯胁邪褌械谢褟 懈谢懈 薪械褌锛�',
+        addusers:'Add user',
+        username:'User name',
+        usernamea:'User name锛�',
+        inusername:'Enter one user name',
+        role:'Role',
+        rolea:'Role锛�',
+        inrole:'Please select a role',
+        test:'Test',
+        admin:'Administrator',
+        operate:'Operate',
+        resetpassword:'Reset password',
+        exit:'Edit',
+        delete:'Delete',
+        prompt:'Prompt',
+        repassword:'Do you want to reset the user password锛�',
+        yes:'Yes',
+        cancel:'Cancel',
+        reusername:'Modify Users',
+        addusername:'Add user',
+        password:'Password锛�',
+        sure:'Confirm',
+        inpassword:'Please input a password',
+        deusername:'Do you want to delete the user锛�',
     },
     customer:{
-        addmenu:'袛芯斜邪胁褜褌械 屑械薪褞.',
-        firstmenu:'孝邪斜谢懈褑邪 屑械薪褞 锌械褉胁芯泄 褋褌械锌械薪懈',
-        link:'小褋褘谢泻',
-        linka:'小褋褘谢泻锛�',
-        inlink:'袙胁械写懈褌械 褋褋褘谢泻褍',
-        sort:'小芯褉褌懈褉芯胁泻',
-        sorta:'小芯褉褌懈褉芯胁泻锛�',
-        insort:'袙胁械写懈褌械 褋芯褉褌懈褉芯胁泻褍',
-        operate:'袨锌械褉邪褑懈褟',
-        exit:'袪械写邪泻褌芯褉',
-        inmenu:'袙胁械写懈褌械 屑械薪褞',
-        delete:'校写邪谢',
-        semenu:'孝邪斜谢懈褑邪 屑械薪褞 胁褌芯褉芯泄 褋褌械锌械薪懈',
-        menu:'袦械薪褞.锛�',
-        sure:'锌芯写褌胁械褉写',
-        cancel:'袨褌屑械薪邪',
-        exmene:'袠蟹屑械薪械薪懈械 屑械薪褞.',
-        yes:'袛邪',
-        demenu:'校写邪谢懈褌褜 屑械薪褞 懈谢懈 薪械褌锛�',
-        prompt:'袩芯写褋泻邪蟹泻',
+        addmenua:'Add secondary menus',
+        addmenu:'Add a first-level menu',
+        firstmenu:'First level menu bar',
+        firstmenuname:'The name of the first-level menu:',
+        link:'Link',
+        inlink:'Please enter the link',
+        linka:'Link锛�',
+        sort:'Sort',
+        insort:'Please enter sorting',
+        sorta:'Sort锛�',
+        operate:'Operate',
+        exit:'Edit',
+        delete:'Delete',
+        semenu:'Secondary menu bar',
+        semenuname:'Secondary menu name:',
+        menu:'Menu bar锛�',
+        inmenu:'Please enter a menu name',
+        sure:'Confirm',
+        cancel:'Cancel',
+        exmene:'Modify the first-level menu',
+        exmenea:'Modify the secondary menu',
+        yes:'Yes',
+        demenu:'Do you want to delete this menu锛�', 
+        prompt:'Prompt',
     },
     delivery:{
-        addrole:'袛芯斜邪胁褜褌械 褉芯谢懈.',
-        editrole:'袠蟹屑械薪械薪懈械 褉芯谢懈.',
-        role :'袪芯谢褜',
-        rolea :'袪芯谢褜锛�',
-        inrole :'袙胁械写懈褌械 褉芯谢懈.',
-        operate :'袨锌械褉邪褑懈褟',
-        edit :'袪械写邪泻褌芯褉',
-        delete :'校写邪谢',
-        sure :'锌芯写褌胁械褉写',
-        cancel :'袨褌屑械薪邪',
-        yes:'袛邪',
-        derole :'校写邪谢懈褌褜 锌械褉褋芯薪邪卸 懈谢懈 薪械褌锛�',
-        prompt:'袩芯写褋泻邪蟹泻',
+        addrole:'Add Role',
+        editrole:'Modify role',
+        role :'Role',
+        rolea :'Role锛�',
+        inrole :'Please enter the role',
+        operate :'Operate',
+        edit :'Edit',
+        delete :'Delete',
+        yes:'Yes',
+        sure :'Confirm',
+        cancel :'Cancel',
+        derole :'Do you want to delete this role',
+        prompt:'Prompt',
+        choice:'Menu permissions锛�',
+        inchoice:'Please select Menu Permissions',
     },
-  }
\ No newline at end of file
+    replenish:{
+        patchManagement:'Mesh management',
+
+    },
+    rework:{
+        reworkManagement:'Rework management',
+        addRework:"Rework added ",
+    },
+
+
+    role:{
+        id:'ID',
+        characterHomepage:'Character Home',
+    },
+    user:{
+        userId:'User ID',
+        userHomepage:'User Home',
+    },
+    orderBasicData:{
+        order:'orders',
+        orderType:'The type of order',
+    },
+    machine:{
+        basicId:'Device number',
+        basicName:'The name of the device',
+        basicCategory:'The process in which it is located',
+        tempering:'Steel',
+    },
+    report:{
+        productionReport:'Production reports',
+        workInProgressReport:'WIP report',
+    },
+    productionBasicData:{
+        basicDataQuery :'Basic data query',
+    },
+    mainIngredient:{
+        materialInformation :'Material information',
+    },
+    mainIngredientStock:{
+        materialName :'The name of the item',
+        createTime :'Return date',
+    },
+    large:{
+        time: 'The time of the break',
+        number: 'Order number',
+        jobnumber: 'Job number',
+        productionnumber: 'The production order number',
+        cardnumber: 'Process card number',
+        projectname: 'The name of the project',
+        batch: 'batch',
+        detailID: 'Detail ID',
+        building: 'Building No',
+        serialnumber: 'Order serial number',
+        productname: 'Product name',
+        serial: 'Process validation number',
+        slicemarker: 'Frame marker (position)',
+        numberpatches: 'Number of patches',
+        width: 'Width',
+        height: 'Height',
+        shape: 'Shape',
+        responsibleprocess: 'Responsible process',
+        process: 'This process',
+        numberfractions: 'The number of unfilled fractions',
+        breakreason: 'The reason for the break',
+        breaktype: 'Sub-break type',
+        responsiblepersonnel: 'Responsible Personnel',
+        responsiblequipment: 'Responsible Equipment',
+        responsibleteam: 'Responsible team',
+        area: 'Sub-broken area',
+        inspector: 'Quality inspector',
+        operate: 'Operate',
+        mes: 'Detail',
+        projectnumber: 'The project order number',
+        brokeno: 'The report is broken and not filled',
+        close: 'Shut down',
+        orderId: 'Order ID',
+        customerName: 'The name of the customer',
+        project: 'The name of the project',
+        are: 'are',
+        quantity: 'quantity',
+        warehousing: 'State',
+        deliveryDate: 'Delivery time',
+        notstocked: 'Not yet in stock',
+        inboundstatus: 'Partial inventory status',
+        allstatus: 'All in stock status',
+        completedquantity: 'Completed quantity',
+        scrapquantity: 'Scrap Quantity',
+        method: 'Processing method',
+        innumber: 'Quantity already entered',
+        productstatus: 'Production status',
+        right: 'normal',
+        stop: 'termination',
+        inquire: 'query',
+        starttime :'Start Time',
+        endtime :'End Time',
+        loading :'In the process of uploading锛�',
+    },
+    reportmanage:{
+        productiontime :'production time',
+        starttime :'Start Time',
+        endtime :'End Time',
+        ctype :'Please select type',
+        cstate :'Please select the status',
+        cprocess :'Please select the process',
+        all :'All',
+        completed :'Completed',
+        broke :'Damaged',
+        takeout :'Takeout',
+        dreportwork :'Unreported work',
+        pendingwork :'Pending job application',
+        reportwork :'Reported work',
+        incise :'slicing',
+        edging :'edging',
+        steel :'toughened',
+        inquire :'query',
+        signingwork :'Reporting for work',
+        reporteam :'Report work team',
+        reportingequipment :'Reporting equipment',
+        line :'line',
+        process :'production processes',
+        glassID :'Glass ID',
+        projectnumber :'Project number',
+        layoutID :'Tempered layout ID',
+        type :'type',
+        state :'state',
+        processcards :'Flow Card',
+        number :'Serial Number',
+        layer :'storey',
+        typebreakage :'Damage type',
+        ptypebreakage :' Please select the type of damage',
+        causebreakage :'Reason for damage',
+        pcausebreakage :'Please select the reason for the damage',
+        responsibleprocess :'Responsibility Process',
+        responsiblepersonnel :'Responsible personnel',
+        presponsiblepersonnel :'Please enter the responsible personnel',
+        responsibleteam :'Responsible team',
+        presponsibleteam :'Please select the responsible team',
+        responsibleequipment :'Responsible equipment',
+        presponsibleequipment :'Please select the responsible device',
+        remark :'notes',
+        premark :'Please enter a note',
+    },
+    film:{
+        mes:'Original film storage details',
+        warehousing:'store',
+        operate: 'Operate',
+        exit:'Edit',
+        delete:'Delete',
+        outbound:'Outbound',
+        deviceid:'device ID',
+        slot:'Grid number',
+        enablestatea:'Enable tagging',
+        disable:'Disable',
+        start:'Enable',
+        startslot:'Start workstation',
+        endslot:'Target workstation',
+        slotid:'Grid ID',
+        width:'Width',
+        widtha:'Width锛�',
+        inwidth:'Please enter width',
+        height:'Height',
+        inheight:'Please enter height',
+        heighta:'Height锛�',
+        thickness:'Thickness',
+        inthickness:'Please enter thickness',
+        thicknessa:'Thickness锛�',
+        films:'Films',
+        infilms:'Please enter films',
+        filmsa:'Films锛�',
+        createtime:'Creation time',
+        remainquantity:'Remaining Quantity',
+        thickremainquantity:'Remaining quantity of original film (sheets)锛�',
+        inquantity:'Please enter the quantity',
+        quantitya:'Number锛�',
+        enableid:'Task ID',
+        originateslot:'Starting grid',
+        patternquantity:'Number',
+        enabletype:'Task Type',
+        enablestate:'Workstation status',
+        finish:'Completed',
+        unfinish:'Incomplete',
+        dedelete:'Do you want to delete this content锛�',
+        dedisable:'Do you want to disable this content锛�',
+        deoutbound:'Whether to release the content of this item from the warehouse锛�',
+        selectwarehousing:'Please select the lifting position',
+        inwarehousing:'Lifting position锛�',
+        warehousing1:'Lifting position 1',
+        warehousing2:'Lifting position 2',
+        starttime :'Start Time',
+        endtime :'End Time',
+        taskstatus :'Status',
+        built :'newly built',
+        execution :'In progress',
+        tasktype :'Task Type',
+        stocke :'store',
+        dispatch :'dispatch',
+        inquire :'query',
+        station :'station',
+    },
+    Mounting:{
+        previewproject :'Select Preview Project',
+        loadinglinea :'Upper film line',
+        loadingline :'Upper film line锛�',
+        inloadingline :'Please select the upper film line',
+        oneloadingline :'Line 1 on film',
+        twoloadingline :'Line 2 on film',
+        waiting :'Waiting',
+        setparameters :'Set parameters',
+        project :'Project number',
+        projecta :'Project number锛�',
+        width :'Width',
+        height :'Height',
+        thickness :'Thickness',
+        projectnumber :'Project original piece number',
+        state :'state',
+        createtime :'Creation time',
+        all :'Select All',
+
+    }
+}
\ No newline at end of file
diff --git a/UI-Project/src/lang/index.js b/UI-Project/src/lang/index.js
index 2a371f6..b2d76c4 100644
--- a/UI-Project/src/lang/index.js
+++ b/UI-Project/src/lang/index.js
@@ -1,10 +1,12 @@
 
 import { createI18n}  from 'vue-i18n'
 import zh from "./zh"
+import py from "./py"
 import en from "./en"
 
 let messages = {
     zh:zh,
+    py:py,
     en: en
 }
 
diff --git a/UI-Project/src/lang/py.js b/UI-Project/src/lang/py.js
new file mode 100644
index 0000000..869758b
--- /dev/null
+++ b/UI-Project/src/lang/py.js
@@ -0,0 +1,300 @@
+export  default {
+    "northglassMESsystem": '小懈褋褌械屑邪 "NorthGlass MES"' ,
+      login:{
+          userErr:'袙胁械写懈褌械 薪芯屑械褉 褋褔械褌邪.',
+          pwErr:'袙胁械写懈褌械 锌邪褉芯谢褜.',
+          user:'袗泻泻邪褍薪褌',
+          password:'袣芯写',
+          login:'袟邪谢芯谐懈薪',
+          loginSuccessful:'袙褏芯写 胁 褋懈褋褌械屑褍 胁褘锌芯谢薪械薪 褍褋锌械褕薪芯锛�',
+          register:'袟邪褉械谐懈褋褌褉懈褉芯胁邪',
+          namea:'袠屑褟 薪械 屑芯卸械褌 斜褘褌褜 锌褍褋褌褘屑',
+          len:'袛谢懈薪邪 薪械 写芯谢卸薪邪 锌褉械胁褘褕邪褌褜 16',
+          passnull:'袩邪褉芯谢褜 薪械 屑芯卸械褌 斜褘褌褜 锌褍褋褌褘屑',
+          leng:'袛谢懈薪邪 锌邪褉芯谢褟 薪械 写芯谢卸薪邪 斜褘褌褜 屑械薪褜褕械 6 懈谢懈 斜芯谢褜褕械 16.',
+          spwn:'袩邪褉芯谢褜 锌芯写褌胁械褉卸写械薪懈褟 薪械 屑芯卸械褌 斜褘褌褜 锌褍褋褌褘屑',
+          depass:'袛胁邪 褉邪蟹薪褘褏 锌邪褉芯谢褟.',
+      },
+      register:{
+          registerSuccessful:'袪械谐懈褋褌褉邪褑懈褟 褍褋锌械褕薪芯',
+          newuserregister:'袧芯胁褘泄 褉械械褋褌褉 锌芯谢褜蟹芯胁邪褌械谢械泄',
+          name:'袠屑褟锛�',
+          inputname:'袙胁械写懈褌械 懈屑褟',
+          password:'袣芯写:',
+          pwErr:'袙胁械写懈褌械 锌邪褉芯谢褜.',
+          passwordation:'袩芯写褌胁械褉写懈褌械 锌邪褉芯谢褜:',
+          pwErration:'袩芯卸邪谢褍泄褋褌邪, 锌芯写褌胁械褉褌懈褌械 锌邪褉芯谢褜',
+          registration:'袩芯写褌胁械褉卸写械薪懈械 芯 褉械谐懈褋褌褉邪褑懈懈',
+          false:'袨褌屑械薪邪',
+      },
+      main:{
+          connectErr:'袧械芯斜褘褔薪芯械 锌芯写泻谢褞褔械薪懈械 泻 褋械褉胁械褉褍, 锌芯锌褉芯斜褍泄褌械 锌芯蟹卸械',
+          titleFirst:"袛芯斜褉芯 锌芯卸邪谢芯胁邪褌褜 ",
+          titleLast:' 胁 褋懈褋褌械屑褍 NorthGlass MES锛�',
+          quit:"袙褘褏芯写",
+      },
+      basicData:{
+          deletemessage:'校写邪谢懈褌褜 褝褌褍 懈薪褎芯褉屑邪褑懈褞 懈谢懈 薪械褌?',
+          laserprinting:'袦邪褕懈薪邪 谢邪蟹械褉薪芯泄 屑邪褉泻懈褉芯胁泻懈 谐芯褌芯胁邪锛�',
+          cuttingmachine:'袦邪褕懈薪邪 写谢褟 褉械蟹泻懈 谐芯褌芯胁邪锛�',
+          machine:'小芯褋褌芯褟薪懈械 褋褌邪薪芯泻 蟹邪谐褉褍蟹泻懈 胁 褉械卸懈屑械 芯薪谢邪泄薪锛�',
+          machineaa:'袪褍褔薪芯械 褋芯褋褌芯褟薪懈械 褋褌邪薪芯泻 蟹邪谐褉褍蟹泻懈:',
+          selectproject:"袙褘斜械褉懈褌械 锌褉芯械泻褌",
+          startloading:'袧邪褔邪谢芯 蟹邪谐褉褍蟹泻懈',
+          stop:'袩邪褍蟹邪',
+          yes:'锌芯写褌胁械褉写',
+          change:'锌械褉械泻谢褞褔邪',
+          projectnumber:'袧芯屑械褉 锌褉芯械泻褌邪',
+          glasswidth:'楔懈褉懈薪邪 褋褌械泻谢邪',
+          glassheight:'袙褘褋芯褌邪 褋褌械泻谢邪',
+          coatingtypes:'孝懈锌褘 锌芯泻褉褘褌懈泄',
+          coatingtypesa:'孝懈锌褘 锌芯泻褉褘褌懈泄锛�',
+          quantity:'袣芯谢懈褔械褋褌胁芯',
+          quantitya:'袣芯谢懈褔械褋褌胁芯锛�',
+          thickness:'孝芯谢褖懈薪邪',
+          thicknessa:'孝芯谢褖懈薪邪锛�',
+          startstatus:'小褌邪褌褍褋 薪邪褔邪谢邪 芯锌械褉邪褑懈懈',
+          pass:'效械褉械蟹',
+          waiting:'袞写械屑.',
+          up:'袟邪谐褉褍蟹泻邪',
+          finish:'袟邪胁械褉褕械薪芯',
+          project:'懈薪卸械薪械褉懈褟',
+          plselectproject:'袩芯卸邪谢褍泄褋褌邪, 胁褘斜械褉懈褌械 锌褉芯械泻褌.',
+          confirm:'锌芯写褌胁械褉写',
+          cancel:'袨褌屑械薪邪',
+          startfilm:'袧邪褔懈薪邪褌褜 懈谢懈 薪械褌锛�',
+          whetherpause:'袩邪褍蟹邪 懈谢懈 薪械褌锛�',
+          station:'袪邪斜芯褔械械 屑械褋褌芯',
+          width:'楔懈褉懈薪邪',
+          widtha:'楔懈褉懈薪邪锛�',
+          height:'袙褘褋芯褌邪',
+          heighta:'袙褘褋芯褌邪锛�',
+          operate:'袨锌械褉邪褑懈褟',
+          add:'袛芯斜邪胁谢褟',
+          delete:'校写邪谢',
+          addglass:'袛芯斜邪胁懈褌褜 褋褌械泻谢芯',
+          selectwidth:'袙褘斜懈褉懈褌械 褕懈褉懈薪褍',
+          selectheight:'袙褘斜懈褉懈褌械 胁褘褋芯褌褍',
+          selectcoatingtypes:'袙褘斜械褉懈褌械 褌懈锌褘 锌芯泻褉褘褌懈泄',
+          selectthickness:'袙褘斜械褉懈褌械 褌芯谢褖懈薪褍',
+          selectquantity:'袙胁械写懈褌械 泻芯谢褜褔械褋褌胁芯.',
+          pause:'袙褌芯褉邪褟 懈 褔械褌胁械褉褌邪褟 褋褌褉芯泻懈 写芯谢卸薪褘 斜褘褌褜 胁褘褕械 2700 写谢褟 褋芯褏褉邪薪械薪懈褟!',
+          pausea:'袩芯卸邪谢褍泄褋褌邪, 褍斜械写懈褌械褋褜, 褔褌芯 屑邪褉泻懈褉芯胁芯褔薪邪褟 懈 褉械卸褍褖邪褟 屑邪褕懈薪褘 谐芯褌芯胁褘!',
+          infonull:'袧芯屑械褉 锌褉芯械泻褌邪 薪械 屑芯卸械褌 斜褘褌褜 锌褍褋褌褘屑!',
+          updatanull:'袩褉芯械泻褌 薪械 褋芯褏褉邪薪懈谢懈褋褜 薪邪 谢懈褋褌械 蟹邪谐褉褍蟹泻懈!',
+          glassnull:'袨褕懈斜泻邪 锌褉懈 芯斜薪芯胁谢械薪懈懈 褋褌械泻谢邪',
+      },
+      sorter:{
+          gridnumber:'携褔械械泻 褋械褌泻谢邪',
+          glassnumber:'袧芯屑械褉 褋褌邪泻谢邪',
+          width:'楔懈褉懈薪邪',
+          height:'袙褘褋芯褌邪',
+          startstatus:'小褌邪褌褍褋 薪邪褔邪谢邪 芯锌械褉邪褑懈懈',
+          disable:'袨褌泻谢褞褔',
+          start:'袧邪褔邪谢芯',
+          deficiencieste:'袧械写芯褋褌邪褌泻懈 胁 芯褌褔械褌薪芯褋褌懈',
+          operate:'袨锌械褉邪褑懈褟',
+          prompt:'袩芯写褋泻邪蟹泻',
+          information:'小谢械写褍械褌 谢懈 褋芯芯斜褖邪褌褜 薪械写芯褋褌邪褞褖褍褞 懈薪褎芯褉屑邪褑懈褞锛�',
+          yes:'袛邪',
+          cancel:'袨褌屑械薪邪',
+      },
+      order:{
+          dilapidation:'袩芯胁褉械卸写械薪懈械',
+          Takeaway:'袙蟹褟褌褜 胁褉褍褔薪褍褞',
+      },
+
+      searchOrder:{
+        cageinformation:'袠薪褎芯褉屑邪褑懈褟 斜褍褎械褉邪',
+        productionqueue:'袩褉芯懈蟹胁芯写褋褌胁械薪薪邪褟 芯褔械褉械写褜',
+        outputglassID:'袙褘褏芯写薪芯械 褋褌械泻谢芯 ID',
+        startposition:'袟邪薪褟褌褜 锌芯蟹懈褑懈懈',
+        targetlocation:'袩芯蟹懈褑懈褟 褑械谢懈',
+        trips:'鈩� 锌芯械蟹写邪',
+        number:'小械褉懈泄薪 薪芯屑械褉',
+        taskstatus:'小芯褋褌芯褟薪懈械 蟹邪写邪褔懈',
+        filmenter:'袨卸懈写邪薪懈械 褋褌械泻谢褟薪薪芯泄 胁褏芯写',
+        infilm:'袙 薪邪褋褌芯褟褖械械 胁褉械屑褟',
+        endtask:'袟邪写邪褔邪 薪邪 泻芯薪械褑',
+        completetask:'袙褘锌芯谢薪械薪懈械 蟹邪写邪薪懈褟',
+        intoglassid:'袙褏芯写薪芯泄 褋褌械泻谢褟薪薪褘泄 ID',
+        line:'袥懈薪懈褟',
+        Usage:'小泻芯褉芯褋褌褜 懈褋锌芯谢褜蟹芯胁邪薪懈褟',
+        free:'袘械褋锌谢邪褌薪芯 (褟褔械械泻)',
+        addcage:'袛芯斜邪胁懈褌褜 懈薪褎芯褉屑邪褑懈褞 芯 斜褍褎械褉械',
+        glassIDa:'小褌械泻谢褟薪薪褘泄 ID锛�',
+        glassID:'小褌械泻谢褟薪薪褘泄 ID',
+        inglassID:'袙胁械写懈褌械 褋褌械泻谢芯 ID',
+        pieceingrid:'袩芯褉褟写芯泻 褉邪褋锌芯谢芯卸械薪懈褟 屑邪谢械薪褜泻懈褏 褋褌械泻谢褟薪薪褘褏 锌谢邪褋褌懈薪 胁 泻谢械褌泻械',
+        pieceingrida:'袩芯褉褟写芯泻 褉邪褋锌芯谢芯卸械薪懈褟 屑邪谢械薪褜泻懈褏 褋褌械泻谢褟薪薪褘褏 锌谢邪褋褌懈薪 胁 泻谢械褌泻械锛�',
+        inpieceingrid:'袙胁械写懈褌械 锌芯褉褟写芯泻 褉邪褋锌芯谢芯卸械薪懈褟 褋褌械泻谢褟薪薪褘褏 谢懈褋褌芯胁 胁 褟褔械械泻械',
+        cardnumber:'袧芯屑械褉 泻邪褉褌芯褔泻懈 锌褉芯褑械褋褋邪',
+        cardnumbera:'袧芯屑械褉 泻邪褉褌芯褔泻懈 锌褉芯褑械褋褋邪锛�',
+        incardnumber:'袙胁械写懈褌械 薪芯屑械褉 锌褉芯褑械褋褋邪 .',
+        typeglass:'孝懈锌 褋褌械泻谢邪',
+        typeglassa:'孝懈锌 褋褌械泻谢邪锛�',
+        intypeglass:'袙胁械写懈褌械 褌懈锌 褋褌械泻谢邪',
+        coatingtypes:'孝懈锌褘 锌芯泻褉褘褌懈泄',
+        width:'楔懈褉懈薪邪',
+        widtha:'楔懈褉懈薪邪锛�',
+        inwidth:'袙胁械写懈褌械 褕懈褉懈薪褍',
+        height:'袙褘褋芯褌邪',
+        heighta:'袙褘褋芯褌邪锛�',
+        inheight:'袙胁械写懈褌械 胁褘褋芯褌褍',
+        thickness:'孝芯谢褖懈薪邪',
+        thicknessa:'孝芯谢褖懈薪邪锛�',
+        inthickness:'袙胁械写懈褌械 褌芯谢褖懈薪褍.',
+        layoutID:'效械褉褌械卸 ID 蟹邪谐褉褍蟹泻懈 锌械褔懈 写谢褟 蟹邪泻邪谢泻懈',
+        layoutIDa:'效械褉褌械卸 ID 蟹邪谐褉褍蟹泻懈 锌械褔懈 写谢褟 蟹邪泻邪谢泻懈锛�',
+        inlayoutID:'袙胁械写懈褌械 褔械褉褌械卸 蟹邪泻邪谢泻懈 ID',
+        picturesequence:'效械褉褌械卸 褋械褉懈泄薪 薪芯屑械褉 蟹邪谐褉褍蟹泻懈 锌械褔懈 写谢褟 蟹邪泻邪谢泻懈',
+        picturesequencea:'效械褉褌械卸 褋械褉懈泄薪 薪芯屑械褉 蟹邪谐褉褍蟹泻懈 锌械褔懈 写谢褟 蟹邪泻邪谢泻懈锛�',
+        inpicturesequence:'袙胁械写懈褌械 锌芯褉褟写芯泻 褔械褉褌械卸懈 蟹邪泻邪谢泻懈 褋褌械泻谢邪.',
+        startstatus:'小褌邪褌褍褋 薪邪褔邪谢邪 芯锌械褉邪褑懈懈',
+        startstatusa:'小褌邪褌褍褋 薪邪褔邪谢邪 芯锌械褉邪褑懈懈锛�',
+        instartstatus:'袙胁械写懈褌械 褋芯褋褌芯褟薪懈械 邪泻褌懈胁邪褑懈懈',
+        glassgaps:'小褌械泻谢褟薪薪褘泄 蟹邪蟹芯褉',
+        glassgapsa:'小褌械泻谢褟薪薪褘泄 蟹邪蟹芯褉锛�',
+        inglassgaps:'袙胁械写懈褌械 褋褌械泻谢芯 蟹邪蟹芯褉',
+        sure:'锌芯写褌胁械褉写',
+        cancel:'袨褌屑械薪邪',
+        operate:'袨锌械褉邪褑懈褟',
+        breakage:'袩芯胁褉械卸写械薪懈械',
+        delete:'校写邪谢',
+        outfilm:'袙褘锌褍褋泻 褋褌械泻谢邪',
+        cagetableID:'ID 斜褍褎械褉薪芯泄 褌邪斜谢懈褑褘',
+        cagenumber:'袘褍褎械褉 薪芯屑械褉邪',
+        gridnumber:'携褔械械泻 褋械褌泻谢邪',
+        enable:'袧邪褔邪谢芯',
+        disable:'袨褌泻谢褞褔',
+        remainingwidth:'袨褋褌邪褌芯褔薪邪褟 褕懈褉懈薪邪',
+        add:'袛芯斜邪胁谢褟',
+        sheetID:'袟邪泻邪谢泻邪 屑邪谢械薪褜泻懈泄 褋褌械泻谢褟薪薪褘泄 ID 褌邪斜谢懈褑褘 懈薪褎芯褉屑邪褑懈懈',
+        processcards:'袣邪褉褌芯褔泻邪 锌褉芯褑械褋褋邪',
+        processcardtype:'孝懈锌 褋褌械泻谢邪 泻邪褉褌芯褔泻懈 锌褉芯褑械褋褋邪',
+        acceptshorizontal:'校屑械褉械薪薪芯械 锌褉懈薪褟褌懈械 谐芯褉懈蟹芯薪褌邪谢懈',
+        xcoordinates:'X-泻芯芯褉写懈薪邪褌褘',
+        ycoordinates:'Y-泻芯芯褉写懈薪邪褌褘',
+        rotationangle:'校谐芯谢 胁褉邪褖械薪懈褟 (锌褉芯褌懈胁 褔邪褋芯胁芯泄 褋褌褉械谢泻懈)',
+        state:'小芯褋褌芯褟薪懈械',
+        takeout:'袙蟹褟褌褜',
+        deletemessage:'校写邪谢懈褌褜 褝褌褍 懈薪褎芯褉屑邪褑懈褞 懈谢懈 薪械褌?',
+        prompt:'袩芯写褋泻邪蟹泻',
+        yes:'袛邪',
+        accept:'袩褉懈薪褟褌褜',
+        noaccept:'袧械 锌褉懈薪懈屑邪褌褜',
+        filmcomplete:'小褌械泻谢芯 谐芯褌芯胁芯',
+        waiting:'袞写械屑.',
+    },
+    workOrder:{
+        glassID:'小褌械泻谢褟薪薪褘泄 ID',
+        height:'袙褘褋芯褌邪',
+        width:'楔懈褉懈薪邪',
+        thickness:'孝芯谢褖懈薪邪',
+        coatingtypes:'孝懈锌褘 锌芯泻褉褘褌懈泄',
+        productionsequence:'袩芯褋谢械写芯胁邪褌械谢褜薪芯褋褌褜 锌褉芯懈蟹胁芯写褋褌胁邪',
+        cardnumber:'袧芯屑械褉 泻邪褉褌芯褔泻懈 锌褉芯褑械褋褋邪',
+        operate:'袨锌械褉邪褑懈褟',
+        messagedamaged:'袩芯胁褉械卸写械薪芯 谢懈 褋芯芯斜褖械薪懈械锛�',
+        prompt:'袩芯写褋泻邪蟹泻',
+        yes:'袛邪',
+        cancel:'袨褌屑械薪邪',
+        takemessage:'小谢械写褍械褌 谢懈 褍写邪谢褟褌褜 褋芯芯斜褖械薪懈械锛�',
+        breakage:'袩芯胁褉械卸写械薪懈械',
+        takeout:'袙蟹褟褌褜',
+    },
+    processCard:{
+        intofurnace:'袙 锌械褔褜',
+        beforefurnace:'袛芯 锌械褔泻懈.',
+        outfurnace:'袨泻芯薪褔械薪芯 褋褌械泻谢芯 懈蟹 锌械褔懈 写谢褟 蟹邪泻邪谢泻懈',
+    },
+    reportWork:{
+        lowerbit:'小褌邪薪褑懈褟 褉邪蟹谐褉褍蟹泻懈',
+        shelfnumber:'袧芯屑械褉 褋褌芯泄泻懈 褉械谐懈褋褌褉邪褑懈懈',
+        cardnumber:'袧芯屑械褉 泻邪褉褌芯褔泻懈 锌褉芯褑械褋褋邪',
+        totalquantity:'袨斜褖械械 泻芯谢懈褔械褋褌胁芯',
+        beendropped:'袣芯谢懈褔械褋褌胁芯 褋褌械泻谢邪 褉邪蟹谐褉褍蟹泻懈',
+        state:'小芯褋褌芯褟薪懈械',
+        devicenumber:'袧芯屑械褉 芯斜芯褉褍写芯胁邪薪懈褟.',
+        startstatus:'小褌邪褌褍褋 薪邪褔邪谢邪 芯锌械褉邪褑懈懈',
+        enable:'袧邪褔邪谢芯',
+        unenable:'袧械 薪邪褔邪褌',
+        operate:'袨锌械褉邪褑懈褟',
+        bindingshelves:'袧邪蟹薪邪褔械薪薪邪褟 褋褌械谢谢邪卸泻邪',
+        clear:'效懈褋褌芯.',
+        workstation:'小褌邪薪褑懈褟 薪芯屑械褉',
+        cardnumbera:'袧芯屑械褉 泻邪褉褌芯褔泻懈 锌褉芯褑械褋褋邪锛�',
+        incardnumber:'袩芯卸邪谢褍泄褋褌邪, 胁褘斜械褉懈褌械 薪芯屑械褉 锌褉芯谐褉邪屑屑褘',
+        clearglass:'袨褔懈褋褌懈褌褜 褋褌械泻谢芯 褋 锌芯谢泻懈',
+        sure:'锌芯写褌胁械褉写',
+        cancel:'袨褌屑械薪邪',
+        glassinformation:'袠薪褎芯褉屑邪褑懈褟 褋褌械泻谢邪',
+        glassID:'小褌械泻谢褟薪薪褘泄 ID',
+        coatingtypes:'孝懈锌褘 锌芯泻褉褘褌懈泄',
+        thickness:'孝芯谢褖懈薪邪',
+        width:'楔懈褉懈薪邪',
+        height:'袙褘褋芯褌邪',
+    },
+    productStock:{
+        addusers:'袛芯斜邪胁褜褌械 锌芯谢褜蟹芯胁邪褌械谢械泄.',
+        username:'袠屑褟 锌芯谢褜蟹芯胁邪褌械谢褟.',
+        usernamea:'袠屑褟 锌芯谢褜蟹芯胁邪褌械谢褟.锛�',
+        inusername:'袙胁械写懈褌械 懈屑褟 锌芯谢褜蟹芯胁邪褌械谢褟',
+        role:'袪芯谢褜',
+        rolea:'袪芯谢褜锛�',
+        inrole:'袙褘斜械褉懈褌械 褉芯谢褜',
+        test:'孝械褋褌',
+        admin:'袗写屑懈薪懈褋褌褉邪褌芯褉.',
+        operate:'袨锌械褉邪褑懈褟',
+        resetpassword:'小斜褉芯褋懈褌褜 锌邪褉芯谢褜',
+        exit:'袪械写邪泻褌芯褉',
+        delete:'校写邪谢',
+        prompt:'袩芯写褋泻邪蟹泻',
+        repassword:'袩械褉械蟹邪谐褉褍蟹泻邪 锌芯谢褜蟹芯胁邪褌械谢褜褋泻芯谐芯 锌邪褉芯谢褟 懈谢懈 薪械褌锛�',
+        yes:'袛邪',
+        cancel:'袨褌屑械薪邪',
+        reusername:'袠蟹屑械薪械薪懈械 锌芯谢褜蟹芯胁邪褌械谢褟',
+        addusername:'袛芯斜邪胁褜褌械 锌芯谢褜蟹芯胁邪褌械谢械泄.',
+        password:'袣芯写锛�',
+        sure:'锌芯写褌胁械褉写',
+        inpassword:'袙胁械写懈褌械 锌邪褉芯谢褜.',
+        deusername:'校写邪谢械薪懈械 锌芯谢褜蟹芯胁邪褌械谢褟 懈谢懈 薪械褌锛�',
+    },
+    customer:{
+        addmenu:'袛芯斜邪胁褜褌械 屑械薪褞.',
+        firstmenu:'孝邪斜谢懈褑邪 屑械薪褞 锌械褉胁芯泄 褋褌械锌械薪懈',
+        link:'小褋褘谢泻',
+        linka:'小褋褘谢泻锛�',
+        inlink:'袙胁械写懈褌械 褋褋褘谢泻褍',
+        sort:'小芯褉褌懈褉芯胁泻',
+        sorta:'小芯褉褌懈褉芯胁泻锛�',
+        insort:'袙胁械写懈褌械 褋芯褉褌懈褉芯胁泻褍',
+        operate:'袨锌械褉邪褑懈褟',
+        exit:'袪械写邪泻褌芯褉',
+        inmenu:'袙胁械写懈褌械 屑械薪褞',
+        delete:'校写邪谢',
+        semenu:'孝邪斜谢懈褑邪 屑械薪褞 胁褌芯褉芯泄 褋褌械锌械薪懈',
+        menu:'袦械薪褞.锛�',
+        sure:'锌芯写褌胁械褉写',
+        cancel:'袨褌屑械薪邪',
+        exmene:'袠蟹屑械薪械薪懈械 屑械薪褞.',
+        yes:'袛邪',
+        demenu:'校写邪谢懈褌褜 屑械薪褞 懈谢懈 薪械褌锛�',
+        prompt:'袩芯写褋泻邪蟹泻',
+    },
+    delivery:{
+        addrole:'袛芯斜邪胁褜褌械 褉芯谢懈.',
+        editrole:'袠蟹屑械薪械薪懈械 褉芯谢懈.',
+        role :'袪芯谢褜',
+        rolea :'袪芯谢褜锛�',
+        inrole :'袙胁械写懈褌械 褉芯谢懈.',
+        operate :'袨锌械褉邪褑懈褟',
+        edit :'袪械写邪泻褌芯褉',
+        delete :'校写邪谢',
+        sure :'锌芯写褌胁械褉写',
+        cancel :'袨褌屑械薪邪',
+        yes:'袛邪',
+        derole :'校写邪谢懈褌褜 锌械褉褋芯薪邪卸 懈谢懈 薪械褌锛�',
+        prompt:'袩芯写褋泻邪蟹泻',
+    },
+  }
\ No newline at end of file
diff --git a/UI-Project/src/lang/zh.js b/UI-Project/src/lang/zh.js
index d1de9eb..d2fa6e0 100644
--- a/UI-Project/src/lang/zh.js
+++ b/UI-Project/src/lang/zh.js
@@ -199,26 +199,27 @@
         tid:'璁惧id',
         tida:'璁惧id锛�',
         fin:'鏄惁瀹屾垚浠诲姟锛�',
-        sureadd:'纭娣诲姞',
-        sureadda:'鏄惁纭娣诲姞锛�',
-        zailong:'鍦ㄧ涓�',
-        rengongxp:'浜哄伐涓嬬墖',
-        up:'涓婁竴椤�',
-        down:'涓嬩竴椤�',
-        now:'褰撳墠椤垫樉绀�',
-        tit:'鏉℃暟鎹�',
-        temperingqueries:'閽㈠寲鏌ヨ',
-        specifytempering:'鎸囧畾涓�鐐�',
-        specifyengineerid:'鎸囧畾宸ョ▼',
-        projectnumber:'宸ョ▼鍙�',
-        layoutnumber:'閽㈠寲鐗堝浘鍙�',
-        numberglasses:'鐜荤拑鏁伴噺',
-        specifytemperinga:'鏄惁鎸囧畾閽㈠寲璇ユ潯淇℃伅锛�',
-        temperedswitch:'閽㈠寲寮�鍏�',
-        dutyinformation:'鍊肩彮淇℃伅',
-        process:'宸ュ簭',
-        team:'鐝粍',
-        basic:'璁惧',
+        sureadd: '纭娣诲姞',
+        sureadda: '鏄惁纭娣诲姞锛�',
+        zailong: '鍦ㄧ涓�',
+        rengongxp: '浜哄伐涓嬬墖',
+        up: '涓婁竴椤�',
+        down: '涓嬩竴椤�',
+        now: '褰撳墠椤垫樉绀�',
+        tit: '鏉℃暟鎹�',
+        temperingqueries: '閽㈠寲鏌ヨ',
+        specifytempering: '鎸囧畾涓�鐐�',
+        specifyout: '鎸囧畾浜哄伐鍑虹墖',
+        specifyengineerid: '鎸囧畾宸ョ▼',
+        projectnumber: '宸ョ▼鍙�',
+        layoutnumber: '閽㈠寲鐗堝浘鍙�',
+        numberglasses: '鐜荤拑鏁伴噺',
+        specifytemperinga: '鏄惁鎸囧畾閽㈠寲璇ユ潯淇℃伅锛�',
+        temperedswitch: '閽㈠寲寮�鍏�',
+        dutyinformation: '鍊肩彮淇℃伅',
+        process: '宸ュ簭',
+        team: '鐝粍',
+        basic: '璁惧',
         makesure:'纭淇濆瓨',
         // cancel:'鍙栨秷',
         temperingtotal:'閽㈠寲鐐夋暟锛�',
@@ -563,4 +564,24 @@
         inquire :'鏌ヨ',
         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
diff --git a/UI-Project/src/layout/MainErpView.vue b/UI-Project/src/layout/MainErpView.vue
index e2f4b57..5528ee9 100644
--- a/UI-Project/src/layout/MainErpView.vue
+++ b/UI-Project/src/layout/MainErpView.vue
@@ -29,60 +29,66 @@
               })
   router.push('/login')  
 }
-// const quit = async () => {
-//   try  {
-//       store.$patch({user: null})
-//     const response = await request.post('/loadGlass/sys/user/logout')
-//     if (response.code === 200) {  
-//         console.log('鐧诲嚭鎴愬姛');  
-//       } else {  
-//         // 澶勭悊閿欒鎯呭喌  
-//         console.error('鐧诲嚭澶辫触', response);  
-//       } 
-// }
-// catch (error) {
-//     // 澶勭悊閿欒
-//     console.error(error);
-//   }
-// }
-// store.createWebSocket();
-// function quit() {
-//   userStore.$patch({
-//     user: null,
-//   })
-//   // router.push('/login')
-//   request.get("/loadGlass/sys/user/login").then((res) => {
-//     if (res.code === 200) {
-//     ElMessage.success(res.msg);
-//      console.log(res.data);
-//     } else {
-//     ElMessage.warning(res.msg);
-//     // router.push("/login");
-//     }
-//    });
-// }
-
-
   function replaceChineseWithEnglish(menuData) {  
+      // 瀹氫箟涓縿鏂囧鐓у叧绯诲璞�
+       const translation  = {  
+    '涓婄墖鏈�': '小褌芯谢 蟹邪谐褉褍蟹泻懈',
+    '涓婄墖': '袙械褉褏薪褟褟 褔邪褋褌褜',
+    '鎺扮墖/璇嗗埆': '袪邪蟹谢芯屑/懈写械薪褌懈褎懈泻邪褑懈褟',
+    '鍗у紡缂撳瓨': ' 袚芯褉懈蟹芯薪褌邪谢褜薪褘泄 斜褍褎械褉',
+    '纾ㄨ竟鍓嶅崸寮忕紦瀛�': '袚芯褉懈蟹芯薪褌邪谢褜薪褘泄 斜褍褎械褉 锌械褉械写 褕谢懈褎芯胁泻芯泄',
+    '涓嬬墖鍗у紡缂撳瓨': '袚芯褉懈蟹芯薪褌邪谢褜薪褘泄 斜褍褎械褉 褋褌械泻谢邪 褉邪蟹谐褉褍蟹泻懈',
+    '纾ㄨ竟锛堝喎鍔犲伐锛�': '楔谢懈褎芯胁邪褌褜 泻褉邪褟 (褏芯谢芯写薪邪褟 芯斜褉邪斜芯褌泻邪)',
+    '1绾跨(杈�(鍐峰姞宸�)': '楔谢懈褎芯胁邪褌褜 泻褉邪褟 1 谢懈薪懈懈 (褏芯谢芯写薪邪褟 芯斜褉邪斜芯褌泻邪)',
+    '2绾跨(杈�(鍐峰姞宸�)': '楔谢懈褎芯胁邪褌褜 泻褉邪褟 2 谢懈薪懈懈 (褏芯谢芯写薪邪褟 芯斜褉邪斜芯褌泻邪)',
+    '澶х悊鐗囩': '袘褍褎械褉薪邪褟 褋懈褋褌械屑邪',
+    '閽㈠寲': '袟邪泻邪谢泻邪',
+    '閽㈠寲鍓�': '袩械褉械写 蟹邪泻邪谢泻懈',
+    '閽㈠寲鍚�': '袩芯褋谢械 蟹邪泻邪谢泻懈',
+    '涓嬬墖鍙�': '小褌芯谢 褉邪蟹谐褉褍蟹泻懈',
+    '绯荤粺绠$悊': '校锌褉邪胁谢械薪懈械 褋懈褋褌械屑芯泄',
+    '鐢ㄦ埛绠$悊': '校锌褉邪胁谢械薪懈械 锌芯谢褜蟹芯胁邪褌械谢械屑',
+    '鏉冮檺绠$悊': '校锌褉邪胁谢械薪懈械 锌芯谢薪芯屑芯褔懈褟屑懈',
+    '瑙掕壊绠$悊': '校锌褉邪胁谢械薪懈械 褉芯谢褜褞',
+    '鍙鍖栫郴缁�': '袙懈蟹褍邪谢褜薪邪褟 褋懈褋褌械屑邪',
+    '鎶ュ伐绠$悊': '校锌褉邪胁谢械薪懈械 芯褌褔械褌薪芯褋褌褜褞',
+    '浠撳偍涓績': '小泻谢邪写褋泻芯泄 褑械薪褌褉',
+    '鍘熺墖浠撳偍': '小泻谢邪写 褋褘褉褜褟',
+     };  
+  menuData.forEach(menu => {  
+    menu.menuName = translation[menu.menuName] || menu.menuName;  
+    // if (menu.children) {  
+      menu.children && menu.children.forEach(submenu => {  
+        submenu.menuName = translation[submenu.menuName] || submenu.menuName;  
+      });  
+    // }  
+  });  
+} 
+function replaceChineseWithRussian(menuData) {  
       // 瀹氫箟涓嫳鏂囧鐓у叧绯诲璞�
        const translation  = {  
-          '涓婄墖鏈�': '小褌芯谢 蟹邪谐褉褍蟹泻懈',  
-          '鎺扮墖/璇嗗埆': '袪邪蟹谢芯屑/懈写械薪褌懈褎懈泻邪褑懈褟',  
-          '鍗у紡缂撳瓨': ' 袚芯褉懈蟹芯薪褌邪谢褜薪褘泄 斜褍褎械褉',  
-          '纾ㄨ竟鍓嶅崸寮忕紦瀛�': '袚芯褉懈蟹芯薪褌邪谢褜薪褘泄 斜褍褎械褉 锌械褉械写 褕谢懈褎芯胁泻芯泄',  
-          '涓嬬墖鍗у紡缂撳瓨': '袚芯褉懈蟹芯薪褌邪谢褜薪褘泄 斜褍褎械褉 褋褌械泻谢邪 褉邪蟹谐褉褍蟹泻懈',  
-          '纾ㄨ竟锛堝喎鍔犲伐锛�': '楔谢懈褎芯胁邪褌褜 泻褉邪褟 (褏芯谢芯写薪邪褟 芯斜褉邪斜芯褌泻邪)',  
-          '1绾跨(杈�(鍐峰姞宸�)': '楔谢懈褎芯胁邪褌褜 泻褉邪褟 1 谢懈薪懈懈 (褏芯谢芯写薪邪褟 芯斜褉邪斜芯褌泻邪)',  
-          '2绾跨(杈�(鍐峰姞宸�)': '楔谢懈褎芯胁邪褌褜 泻褉邪褟 2 谢懈薪懈懈 (褏芯谢芯写薪邪褟 芯斜褉邪斜芯褌泻邪)',  
-          '澶х悊鐗囩': '袘褍褎械褉薪邪褟 褋懈褋褌械屑邪',  
-          '閽㈠寲': '袟邪泻邪谢泻邪',  
-          '閽㈠寲鍓�': '袩械褉械写 蟹邪泻邪谢泻懈',  
-          '閽㈠寲鍚�': '袩芯褋谢械 蟹邪泻邪谢泻懈',  
-          '涓嬬墖鍙�': '小褌芯谢 褉邪蟹谐褉褍蟹泻懈',  
-          '绯荤粺绠$悊': '校锌褉邪胁谢械薪懈械 褋懈褋褌械屑芯泄',  
-          '鐢ㄦ埛绠$悊': '校锌褉邪胁谢械薪懈械 锌芯谢褜蟹芯胁邪褌械谢械屑',  
-          '鏉冮檺绠$悊': '校锌褉邪胁谢械薪懈械 锌芯谢薪芯屑芯褔懈褟屑懈',  
-          '瑙掕壊绠$悊': '校锌褉邪胁谢械薪懈械 褉芯谢褜褞',  
+    '涓婄墖鏈�': 'Loading Machine',
+    '涓婄墖': 'Start showing a movie',
+    '鎺扮墖/璇嗗埆': 'Breaking /Identification',
+    '鍗у紡缂撳瓨': 'Horizontal cache',
+    '纾ㄨ竟鍓嶅崸寮忕紦瀛�': 'Horizontal buffer before edge grinding',
+    '涓嬬墖鍗у紡缂撳瓨': 'Offline horizontal cache',
+    '纾ㄨ竟锛堝喎鍔犲伐锛�': 'Grinding edge (cold processing)',
+    '1绾跨(杈�(鍐峰姞宸�)': '1-line edge grinding (cold processing)',
+    '2绾跨(杈�(鍐峰姞宸�)': '2-line edge grinding (cold processing)',
+    '澶х悊鐗囩': 'Dali slice cage',
+    '閽㈠寲': 'Toughened',
+    '閽㈠寲鍓�': 'Before Tempering',
+    '閽㈠寲鍚�': 'After Tempering',
+    '涓嬬墖鍙�': 'Next Stage',
+    '绯荤粺绠$悊': 'System Management',
+    '鐢ㄦ埛绠$悊': 'User Management',
+    '鏉冮檺绠$悊': 'Rights Management',
+    '瑙掕壊绠$悊': 'Roles',
+    '鍙鍖栫郴缁�': 'visualization system',
+    '鎶ュ伐绠$悊': 'Job reporting management',
+    '浠撳偍涓績': 'Storage Center',
+    '鍘熺墖浠撳偍': 'Original film storage',
      };  
   menuData.forEach(menu => {  
     menu.menuName = translation[menu.menuName] || menu.menuName;  
@@ -96,32 +102,15 @@
 //鎻愬彇鑿滃崟妯″潡鍒楄〃
 let menuList = $ref([])
 
-// onMounted(async () => {  
-//   try {  
-//     const res = await request.get('/loadGlass/sys/menu/getMenuTree'); // 鍋囪 request.get 杩斿洖 Promise  
-//     if (res.code == 200) { 
-//       // 浣跨敤 value 灞炴�ф潵淇敼 ref 寮曠敤鐨勫��  
-//       menuList.value = deepClone(res.data);  
-//       const language = $i18n.locale;  
-//       if (language === 'en') {  
-//         replaceChineseWithEnglish(menuList.value); // 浼犲叆 ref 鐨� value  
-//       }  
-//       console.log(res.data.token); // 濡傛灉 res.data 涓湁 token 鐨勮瘽  
-//     } else {  
-//       ElMessage.warning(res.msg);  
-//       router.push('/login');  
-//     }  
-//   } catch (error) {  
-//     // 澶勭悊璇锋眰閿欒  
-//     console.error('鑾峰彇鑿滃崟鍒楄〃鏃跺嚭閿�:', error);  
-//   }  
-// });  
 request.get('/loadGlass/sys/menu/getMenuTree').then((res) => {
   if (res.code == 200) {
     menuList = res.data
     console.log(language.value)
+    // translateMenu(menuList.value, language.value); 
       if (language.value === 'en') {
-        
+        replaceChineseWithRussian(menuList);
+      }
+      if (language.value === 'py') {
         replaceChineseWithEnglish(menuList);
       }
   } else {
@@ -169,7 +158,7 @@
       <el-header>
         <div style="height: 100%;width: 100%;display: flex;background-color: #fff;">
           <img src="../assets/northGlass.ico"
-               alt=""
+               alt=""  @click="toggleCollapse"
                style="max-width: 100%;max-height: 100%">
           <h3 style="margin: 1rem  ;font-weight: bold;width: 33vw;"> {{ $t('main.titleFirst') }}{{ userName }}{{ $t('main.titleLast') }}</h3>
           <span style="height: 70%;width: 78vw;margin-top: 1rem;">
@@ -187,11 +176,11 @@
                 <SwitchButton size=""/>{{ $t('main.quit') }}
               </el-icon>
             </el-button>
-            <div class="header-left">
+            <!-- <div class="header-left">
               <el-button @click="toggleCollapse" style="height: 30px;">  
                <el-icon><Expand /></el-icon>
               </el-button>  
-          </div>
+          </div> -->
           </span>
         </div>
       </el-header>
diff --git a/UI-Project/src/router/index.js b/UI-Project/src/router/index.js
index f492054..b62dc2c 100644
--- a/UI-Project/src/router/index.js
+++ b/UI-Project/src/router/index.js
@@ -3,7 +3,6 @@
 // import User from '../views/sys/User.vue'
 // import Role from '../views/sys/Role.vue'
 // import Menu from '../views/sys/Menu.vue'
-
 const router = createRouter({
   history: createWebHashHistory(),
   routes: [
@@ -17,6 +16,11 @@
       path: '/login',
       name: 'login',
       component: () => import('../views/LoginView.vue')
+    },
+    {
+      path: '/new-page', // 鏂板鐨勬棤闇�鐧诲綍鐨勯〉闈�  
+      name: 'newPage',  
+      component: () => import('../views/NewPage.vue')
     },
     {
       path: '/main',
@@ -68,13 +72,18 @@
         /*----------- 涓婄墖鏈� ----------------*/
       {
         path: 'Returns',
-        name: 'Returns',
-        component: () => import('../views/Returns/returns.vue'),
+        name: 'return',
+        component: () => import('../views/Returns/return.vue'),
         children:[
           {
             path: '/Returns/returns',
             name: 'returns',
             component: () => import('../views/Returns/returns.vue')
+          },
+          {
+            path: '/Returns/upreturns',
+            name: 'upreturns',
+            component: () => import('../views/Returns/upreturns.vue')
           },
         ]
       },
@@ -302,7 +311,7 @@
         },
         {
           path: '',
-          redirect: '/returns/returns'
+          redirect: '/Returns/returns'
         }
       ]
     },
@@ -315,4 +324,13 @@
   ]
 })
 
+// 瀵艰埅瀹堝崼  
+router.beforeEach((to, from, next) => {  
+  const isAuthenticated = !!localStorage.getItem('authToken'); // 鍋囪杩欐槸浣犵殑鐧诲綍鐘舵�佹鏌ラ�昏緫  
+  if (to.matched.some(record => record.meta.requiresAuth) && !isAuthenticated) {  
+    next({ name: 'login' }); // 濡傛灉闇�瑕佺櫥褰曚絾鏈櫥褰曪紝鍒欓噸瀹氬悜鍒扮櫥褰曢〉闈�  
+  } else {  
+    next(); // 鍚﹀垯缁х画瀵艰埅  
+  }  
+}); 
 export default router
diff --git a/UI-Project/src/views/LoginView.vue b/UI-Project/src/views/LoginView.vue
index 6431f47..40a1353 100644
--- a/UI-Project/src/views/LoginView.vue
+++ b/UI-Project/src/views/LoginView.vue
@@ -130,7 +130,8 @@
             placeholder=" "
             style="float: right;width: 9rem">
           <el-option value="zh"  label="涓枃" />
-          <el-option value="en"  label="袪褍褋褋泻懈泄 褟蟹褘泻" />
+          <el-option value="py"  label="袪褍褋褋泻懈泄 褟蟹褘泻" />
+          <el-option value="en"  label="English" />
         </el-select>
         <el-form @submit.native.prevent
                  ref="ruleFormRef"
diff --git a/UI-Project/src/views/NewPage.vue b/UI-Project/src/views/NewPage.vue
new file mode 100644
index 0000000..6fd5636
--- /dev/null
+++ b/UI-Project/src/views/NewPage.vue
@@ -0,0 +1,151 @@
+<template>  
+    <div>  
+  <div style="display: flex;">
+    <div style="margin-left: 50px;margin-top: 15px;font-size:large">宸ョ▼鍙�:</div>
+<el-input v-model="current" style="margin-left: 20px;margin-top: 15px;width: 240px" placeholder="璇疯緭鍏ュ伐绋嬪彿" @input="updateUrl"/>
+      <el-button style="margin-top: 15px;margin-left: 15px;"  type="primary" @click="fetchData">鏌ヨ</el-button>  
+    </div>  
+    <el-card style="flex: 1;margin-left: 10px;margin-top: 20px;margin-right: 10px;width: 1850px;" height="900" v-loading="loading">
+    <div v-for="(row, rowIndex) in divsData" :key="rowIndex" class="row">  
+        <div v-for="(rect, colIndex) in row" :key="colIndex" class="div-container">  
+    <el-scrollbar height="430px" width="900px" style="background-color: #e9e9eb;">
+    <div  style="position: relative;width: 100%;height: 100%;">  
+      <div  
+        v-for="(rect, index) in getAdjustedRectsForRow(rowIndex)"
+      :key="index"  
+      class="rect"
+      :style="{ position: 'absolute', 
+       top: `${rect.y_axis}px`, 
+       left: `${rect.x_axis}px`,
+       width: `${rect.width}px`,  
+         height: `${rect.height}px`,  
+        backgroundColor:  '#911005'}">
+     <div  class="centered-text">
+    <div style="font-size: 15px;font-weight: bold;">{{ rect.process_id }}</div>  
+    <div style="font-size: 15px;font-weight: bold;">{{ rect.project_no }}</div>  
+    <div style="font-size: 30px;font-weight: bold;">{{ rect.widtha }}*{{ rect.heighta }}</div>
+     </div>
+      </div>
+    </div>
+    </el-scrollbar>
+        </div>
+    </div>
+    </el-card>
+    </div>
+</template>
+
+<script setup>
+import {onMounted, ref, watch} from 'vue';
+import {useRoute, useRouter} from 'vue-router';
+import request from "@/utils/request"
+
+const route = useRoute();
+const router = useRouter();
+const current = ref(route.query.current || '');
+const adjustedRects = ref([]);
+const loading = ref(false);
+const adjustedRectsPerRow = ref([]);
+const divsData = ref([]);
+const rawData = ref([]);
+onMounted(() => {
+  if (route.query.current) {
+    current.value = route.query.current;
+         console.log(current.value);
+         window.localStorage.setItem('current', current.value)
+       }  
+     });  
+     onMounted(async () => { 
+         try {  
+           let current = window.localStorage.getItem('current')
+             const response = await request.post(`/cacheGlass/taskCache/temperingTerritory?current=${current}`);
+           if (response.code === 200) {  
+             rawData.value = response.data;
+                   console.log(rawData.value);
+                   processData(rawData.value);
+           } else {  
+            //  ElMessage.warning(res.msg)
+           }  
+         } catch (error) {  
+           // console.error('Error fetching rects :', error);  
+         }  
+       }); 
+     watch(  
+       current,  
+       (newVal) => {  
+         router.replace({ query: { current: newVal } });  
+       },  
+       { immediate: true } // 浣跨敤 immediate: true 鏉ョ‘淇濆湪缁勪欢鎸傝浇鏃剁珛鍗虫墽琛屼竴娆� watch 鍥炶皟  
+     );
+     const fetchData = async () => {
+       try {
+         const response = await request.post(`/cacheGlass/taskCache/temperingTerritory?current=${current.value}`);
+         if (response.code === 200) {
+            rawData.value = response.data;
+            console.log(rawData.value);
+            processData(rawData.value);
+    }  
+  } catch (error) {  
+    console.error('Failed to fetch data:', error);  
+  } finally {  
+    loading.value = false;  
+  }  
+};
+     function processData(data) {  
+  const groupedData = [];  
+  for (let i = 0; i < data.length; i += 2) {  
+    groupedData.push(data.slice(i, i + 2));  
+  }  
+  divsData.value = groupedData;
+adjustedRectsPerRow.value = divsData.value.map(() => []);
+  divsData.value.forEach((row, rowIndex) => {  
+    const rawRowData = rawData.value[rowIndex];
+    if (rawRowData) {  
+adjustedRectsPerRow.value[rowIndex] = rawRowData.map(rect => {  
+        let adjustedWidth, adjustedHeight,newX;
+        if (rect.rotate_angle  === 0) {
+         newX = rect.olHeight -(rect.y_axis + rect.height); 
+         adjustedWidth = rect.height * (900/rect.olHeight);
+         adjustedHeight = rect.width * (430/rect.olWidth);
+        } else {  
+          newX = rect.olHeight -(rect.y_axis + rect.width); 
+         adjustedWidth = rect.width * (900/rect.olHeight);
+         adjustedHeight = rect.height * (430/rect.olWidth);
+        } 
+        let adjustedRect = {  
+          ...rect,
+          // x_axis: rect.y_axis * (959.35/rect.olHeight),
+          y_axis: rect.x_axis * (430/rect.olWidth),
+          x_axis: newX * (900/rect.olHeight),
+          // y_axis: rect.x_axis * (430/rect.olWidth),
+          width: adjustedWidth,  
+          height: adjustedHeight,  
+          widtha: rect.width,  
+          heighta: rect.height,  
+        }; 
+        return adjustedRect;  
+      });  
+    }  
+  });  
+}
+// 鏂规硶鐢ㄤ簬鑾峰彇褰撳墠琛岀殑adjustedRects  
+function getAdjustedRectsForRow(rowIndex) {  
+  return adjustedRectsPerRow.value[rowIndex] || [];  
+}  
+     </script>  
+       
+    
+  <style scoped>  
+.row {  
+  display: flex;  
+  justify-content: space-between;  
+  margin-bottom: 20px;
+}  
+  
+.div-container {  
+  width: 900px;
+  float: left;
+  background-color: #f4f4f5;
+  height: 430px;
+  box-sizing: border-box;
+}  
+  </style>
\ No newline at end of file
diff --git a/UI-Project/src/views/PurchaseReturn/purchaseReturn.vue b/UI-Project/src/views/PurchaseReturn/purchaseReturn.vue
index d875780..f6b504c 100644
--- a/UI-Project/src/views/PurchaseReturn/purchaseReturn.vue
+++ b/UI-Project/src/views/PurchaseReturn/purchaseReturn.vue
@@ -272,7 +272,7 @@
         widtha = rect.width;
         heighta = rect.height;
       }
-  if (rect.angle === 0) {  
+  if (rect.angle === 0) {
     adjustedWidth = widtha * scaleFactor;  
     adjustedHeight = heighta * scaleFactory;  
     // adjustedWidtha = widtha;  
diff --git a/UI-Project/src/views/Returns/return.vue b/UI-Project/src/views/Returns/return.vue
new file mode 100644
index 0000000..d0567d3
--- /dev/null
+++ b/UI-Project/src/views/Returns/return.vue
@@ -0,0 +1,49 @@
+<script setup>
+import {ArrowLeftBold, ArrowRight, Search} from "@element-plus/icons-vue"
+import {useRouter} from "vue-router";
+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/Returns/returns.vue b/UI-Project/src/views/Returns/returns.vue
index c5ffe12..91bf66f 100644
--- a/UI-Project/src/views/Returns/returns.vue
+++ b/UI-Project/src/views/Returns/returns.vue
@@ -228,10 +228,10 @@
 const requestData = {  
   state: 100  
 };  
-
-
-
-
+ 
+ 
+ 
+ 
 const selectgong = async (queryString: string) => {
   try  {
     const response = await request.post('/loadGlass/optimizeProject/listByState',{
@@ -559,7 +559,7 @@
       // window.location.reload() 
       blindb.value = false;
       tableData.splice([]);
-
+ 
       // 璇锋眰澶辫触锛屾樉绀洪敊璇秷鎭�
       ElMessage.error(response.message);
     }
@@ -613,7 +613,7 @@
 const handleBindb = (row) => {
   blindb.value = true; 
 };
-
+ 
 // 鍒犻櫎
 const handleBindRacka = (row) => {
   workstationId.value = row.workstationId;
diff --git a/UI-Project/src/views/Returns/upreturns.vue b/UI-Project/src/views/Returns/upreturns.vue
new file mode 100644
index 0000000..93d9f1d
--- /dev/null
+++ b/UI-Project/src/views/Returns/upreturns.vue
@@ -0,0 +1,1115 @@
+<script lang="ts" setup>
+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()
+const {t} = useI18n()
+const selectValuesa = reactive([]);
+
+
+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 flake = ref(false)
+const flakea = ref(false)
+const flakeb = ref(false)
+const flakec = 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 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 upstatus = ref(t('basicData.machineaa'));
+const cuttingMachine = ref(''); // 鍋囪杩欎釜鐢ㄤ簬瀛樺偍鍚庣杩斿洖鐨勭姸鎬佸�硷紙0鎴�1锛�  
+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 () => {
+  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 uniqueThicknesses = new Set(response.data.map(item => item.thickness));
+
+      selectOptions.value = Array.from(uniqueWidths).map(width => ({
+        value: width, // 鍋囪杩欐槸浣犳兂瑕佷綔涓簐alue鐨勫睘鎬�
+        label: width, // 鍋囪杩欐槸浣犳兂瑕佹樉绀虹殑label
+      }));
+      selectOptionsa.value = Array.from(uniqueHeights).map(height => ({
+        value: height,
+        label: height,
+      }));
+      selectOptionsb.value = Array.from(uniqueFilmsIds).map(filmsId => ({
+        value: filmsId,
+        label: filmsId,
+      }));
+      selectOptionsc.value = Array.from(uniqueThicknesses).map(thickness => ({
+        value: thickness,
+        label: thickness,
+      }));
+    } else {
+      ElMessage.error(response.message);
+    }
+  } catch (error) {
+    // 澶勭悊璇锋眰澶辫触鐨勬儏鍐�
+    // ElMessage.error('鑾峰彇琛ㄦ牸鏁版嵁澶辫触锛岃閲嶈瘯');
+  }
+};
+const handlezhiban = () => {
+  dialoglea.value = true; // 鎵撳紑缁戝畾鏋跺瓙瀵硅瘽妗�
+  fetchFlowCardId();
+};
+const selectproject = () => {
+  dialogFormVisible.value = true;
+  selectgong();
+};
+// 鍊肩彮淇℃伅
+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;
+      console.log(tableDatax.value);
+      console
+    } else {
+      ElMessage.error(response.message);
+    }
+  } catch (error) {
+    // 澶勭悊閿欒
+    console.error(error);
+  }
+}
+const handleConfirmb = async () => {
+  const response = await request.post("/loadGlass/work_assignment/updateWorkAssignment", tableDatax.value)
+  if (response.code === 200) {
+    ElMessage.success(response.message);
+    dialoglea.value = false;
+  } else {
+    ElMessage.error(response.message);
+  }
+};
+onMounted(() => {
+  list('');
+  fetchOptions('');
+  socket = initializeWebSocket(socketUrl, handleMessage);
+});
+onUnmounted(() => {
+  if (socket) {
+    closeWebSocket(socket);
+  }
+});
+const list = async () => {
+  try {
+    const response = await request.get('/loadGlass/LoadGlass/list');
+    if (response.code == 200) {
+      tableDataa.value = response.data
+      if (tableDataa.value.length === 4) {
+        if (tableDataa.value[0].patternHeight > 0 && tableDataa.value[0].patternWidth > 0 && tableDataa.value[0].number > 0) {
+          flake.value = true;
+        }
+        if (tableDataa.value[1].patternHeight > 0 && tableDataa.value[1].patternWidth > 0 && tableDataa.value[1].number > 0) {
+          flakea.value = true;
+        }
+        if (tableDataa.value[2].patternHeight > 0 && tableDataa.value[2].patternWidth > 0 && tableDataa.value[2].number > 0) {
+          flakeb.value = true;
+        }
+        if (tableDataa.value[3].patternHeight > 0 && tableDataa.value[3].patternWidth > 0 && tableDataa.value[3].number > 0) {
+          flakec.value = true;
+        }
+      }
+    } else {
+      ElMessage.warning(response.data);
+    }
+  } catch (error) {
+    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: [],
+})
+const titleSelectJsona = ref({
+  processTypea: [],
+})
+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]);
+  }
+  if (data.list != null) {
+    tableDataa.value = data.list[0]
+  }
+  if (data.engineering) {
+    if (Array.isArray(data.engineering) && data.engineering.length !== 0) {
+      canSelectProject.value = false;
+      canStartLoading.value = true;
+    } else {
+      canSelectProject.value = true;
+      canStartLoading.value = false;
+    }
+  }
+  if (data.InkageStatus) {
+    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;
+    }
+  }
+};
+const requestData = {
+  state: 100
+};
+
+
+const selectgong = async (queryString: string) => {
+  try {
+    const response = await request.post('/loadGlass/optimizeProject/listByState', {
+      ...requestData,
+      query: queryString
+    })
+    if (response.code == 200) {
+      titleSelectJson.value.processType = response.data;
+    } else {
+      ElMessage.error(response.message);
+    }
+  } 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);
+    }
+  } catch (error) {
+    console.error('Error fetching options:', error);
+  }
+};
+// 澶勭悊鐢ㄦ埛杈撳叆鍙樺寲鐨勬柟娉�  
+const handleInputChange = async (value: string) => {
+  if (value) {
+    await fetchOptions(value);
+  } else {
+    options.value = []; // 娓呯┖閫夐」鍒楄〃  
+  }
+};
+// 澶勭悊鐢ㄦ埛杈撳叆鍙樺寲鐨勬柟娉�
+const handleInputChangea = async (value: string) => {
+  if (value) {
+    await fetchOptionsa(value);
+  } else {
+    options.value = []; // 娓呯┖閫夐」鍒楄〃  
+  }
+};
+onBeforeUnmount(() => {
+  closeWebSocket();
+});
+// 娣诲姞
+const handleBindRack = (row) => {
+  workstationId.value = row.workstationId; // 鍋囪rackNumber鏄灦鍙峰瓧娈电殑灞炴�у悕
+  ida.value = row.id;
+  add.value = true; // 鎵撳紑缁戝畾鏋跺瓙瀵硅瘽妗�
+};
+// 娣诲姞
+const handleConfirm = async () => {
+  // console.log('id.value:', id.value);
+  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)
+      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') {
+          flakea.value = true
+        } else if (selectedValuea.value !== '0' && selectedValue.value !== '0' && number.value !== '0' && workstationId.value === '3') {
+          flakeb.value = true
+        } 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()
+      } else {
+        // 璇锋眰澶辫触锛屾樉绀洪敊璇秷鎭�
+        ElMessage.error(response.message);
+      }
+    } catch (error) {
+      // 澶勭悊璇锋眰閿欒  
+    }
+  } else if (ida.value === 1 || ida.value === 3) {
+    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
+      });
+      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') {
+          flake.value = true
+        } else if (selectedValuea.value !== '0' && selectedValue.value !== '0' && number.value !== '0' && workstationId.value === '2') {
+          flakea.value = true
+        } else if (selectedValuea.value !== '0' && selectedValue.value !== '0' && number.value !== '0' && workstationId.value === '3') {
+          flakeb.value = true
+        } else if (selectedValuea.value !== '0' && selectedValue.value !== '0' && number.value !== '0' && workstationId.value === '4') {
+          flakec.value = true
+        }
+        selectedValuea.value = '';
+        selectedValue.value = '';
+        selectedValueb.value = '';
+        selectedValuec.value = '';
+        number.value = '';
+        list()
+      } else {
+        // 璇锋眰澶辫触锛屾樉绀洪敊璇秷鎭�
+        ElMessage.error(response.message);
+      }
+    } catch (error) {
+      // 澶勭悊璇锋眰閿欒  
+    }
+  } else {
+    ElMessage({
+      type: 'info',
+      message: t('basicData.pause'),
+    })
+  }
+};
+// 鍒犻櫎
+const handleConfirma = async () => {
+  try {
+    const response = await request.post('/loadGlass/LoadGlass/updateGlassMessage', {
+      workstationId: workstationId.value,
+      patternHeight: 0,
+      patternWidth: 0,
+      filmsId: "",
+      patternThickness: 0,
+      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')
+      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 {
+      // 璇锋眰澶辫触锛屾樉绀洪敊璇秷鎭�
+      ElMessage.error(response.message);
+    }
+  } catch (error) {
+    // 澶勭悊閿欒
+    console.error(error);
+  }
+};
+// 閫夋嫨宸ョ▼纭
+const handleup = async () => {
+  try {
+    const response = await request.post('/loadGlass/up-patten-usage/selectUpPattenUsage', {
+      engineerId: selectedProjectNo.value,
+    })
+    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 = ''
+      markingMachineStatus.value = '#911005';
+      cuttingMachineStatus.value = '#911005';
+      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,
+        label: width,
+      }));
+      selectOptionsa.value = Array.from(uniqueHeights).map(height => ({
+        value: height,
+        label: height,
+      }));
+      selectOptionsb.value = Array.from(uniqueFilmsIds).map(filmsId => ({
+        value: filmsId,
+        label: filmsId,
+      }));
+      selectOptionsc.value = Array.from(uniqueThicknesses).map(thickness => ({
+        value: thickness,
+        label: thickness,
+      }));
+    } else {
+      // 璇锋眰澶辫触锛屾樉绀洪敊璇秷鎭�
+      ElMessage.error(response.message);
+      // ElMessage.error(response.msg);
+    }
+  } catch (error) {
+    // 澶勭悊閿欒
+    console.error(error);
+  }
+}
+// 寮�濮嬩笂鐗�
+const handle = async () => {
+  if (markingMachineStatus.value === 'green' && cuttingMachineStatus.value === 'green') {
+    try {
+      let engineeringId = window.localStorage.getItem('engineeringId')
+      const response = await request.post('/loadGlass/engineering/engineering/changeTask', {
+        engineerId: engineeringId,
+        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') {
+    // 鎻愮ず鐢ㄦ埛鎵撴爣鏈烘湭灏辩华
+    ElMessage.warning(t('basicData.pausea'));
+  }
+}
+// 鏆傚仠
+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);
+    }
+  }
+    else  {
+      ElMessage({
+        type: 'info',
+        message: t('basicData.infonull'),
+      })
+    }
+  } catch (error) {
+    // 澶勭悊閿欒
+    console.error(error);
+  }
+}
+// 鍋滄浠诲姟
+const handleb = 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);
+        // window.location.reload()
+        blindb.value = false;
+        tableData.splice([]);
+
+        // 璇锋眰澶辫触锛屾樉绀洪敊璇秷鎭�
+        ElMessage.error(response.message);
+      }
+    } else {
+      ElMessage({
+        type: 'info',
+        message: t('basicData.infonull'),
+      })
+    }
+  } catch (error) {
+    // 澶勭悊閿欒
+    console.error(error);
+  }
+}
+onMounted(fetchTableData);
+
+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 handleBind = (row) => {
+  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 markingMachineStatus = ref('#911005');
+const cuttingMachineStatus = ref('#911005');
+// 瀹氫箟涓�涓柟娉曟潵鏀瑰彉棰滆壊鐘舵��  
+const confirmMarkingMachine = () => {
+  markingMachineStatus.value = 'green';
+};
+const confirmCuttingMachine = () => {
+  cuttingMachineStatus.value = 'green';
+};
+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 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;
+      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('璇锋眰鏃跺彂鐢熼敊璇�');
+  }
+};
+</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>
+    <el-button :disabled="!canSelectProject" style="margin-top: 5px;margin-left: 15px;" type="primary"
+               @click="selectproject">{{ $t('Mounting.previewproject') }}
+    </el-button>
+    <el-button :disabled="!canSelectProject"
+               :style="{ backgroundColor: canStartLoading ? 'green' : 'initial',color: canStartLoading ? 'white' : 'black', }"
+               style="margin-top: 5px;margin-left: 20px;" @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[0]" clearable :placeholder="$t('film.taskstatus')"
+               style="margin-top: 5px;margin-left: 20px;">
+      <el-option :label="$t('film.built')" value="1"></el-option>
+      <el-option :label="$t('film.execution')" value="2"></el-option>
+      <el-option :label="$t('film.finish')" value="3"></el-option>
+    </el-select>
+    <el-select v-model="selectValuesa[1]" clearable :placeholder="$t('film.tasktype')"
+               style="margin-top: 5px;margin-left: 20px;">
+      <el-option :label="$t('film.stocke')" value="1"></el-option>
+      <el-option :label="$t('film.outbound')" value="2"></el-option>
+      <el-option :label="$t('film.dispatch')" value="3"></el-option>
+    </el-select>
+    <el-button type="primary" style="margin-left: 10px;" @click="selectReportData()">{{
+        $t('film.inquire')
+      }}
+    </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('basicData.layoutSequence')" width="100" align="center"/>
+          <el-table-column prop="engineeringId" :label="$t('basicData.projectnumber')" width="200" align="center"/>
+          <el-table-column prop="width" :label="$t('basicData.glasswidth')" align="center"/>
+          <el-table-column prop="height" :label="$t('basicData.glassheight')" align="center"/>
+          <el-table-column prop="filmsId" :label="$t('basicData.coatingtypes')" align="center"/>
+          <el-table-column :label="$t('basicData.quantity')" align="center">
+            <template #default="{ row }">
+              <!-- 杩欓噷鎬绘槸鏄剧ず 1 -->
+              <span>{{ 1 }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="thickness" :label="$t('basicData.thickness')" align="center"/>
+          <!-- <el-table-column
+                align="center"
+                label="鐘舵��"
+                min-width="80"
+                prop="state"
+              >
+              <template #default="scope">
+            <el-tag :type="getStatusType(scope.row.state)">
+              {{ getStatusText(scope.row.state) }}
+            </el-tag>
+          </template>  -->
+          <el-table-column
+              align="center"
+              :label="$t('basicData.startstatus')"
+              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('basicData.pass') : $t('basicData.waiting') }}
+              </el-tag>
+        </template> 
+          </el-table-column>
+    </el-table>
+      </div>
+    </el-card>
+  <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">
+          {{ $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-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>
+      </div>
+    </template>
+</el-dialog>
+    <el-dialog v-model="blinda" top="30vh" width="25%" :title="$t('basicData.whetherpause')">
+      <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="鏄惁鍋滄浠诲姟?" >
+      <template #footer>
+        <div id="dialog-footer">
+          <el-button type="primary" @click="handleb">
+            纭
+          </el-button>
+          <el-button @click="blindb = false">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog> -->
+    <div id="parent">
+      <img src="../../assets/shangpian.png" alt=""
+           style="max-width: 40%;max-height: 40%;margin-top: 20px;margin-left: 340px;">
+      <div id="overlay" v-show="flake"></div>
+      <div id="overlaya" v-show="flakea"></div>
+      <div id="overlayb" v-show="flakeb"></div>
+      <div id="overlayc" v-show="flakec"></div>
+    </div>
+    <div style="margin-top: -300px;margin-left: 680px;">
+      <el-table :data="tableDataa" border style="width: 85%"
+                :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-column fixed="right" :label="$t('basicData.operate')" align="center" width="150">
+          <template #default="scope">
+            <el-button size="mini" type="text" plain @click="handleBindRack(scope.row)">{{
+                $t('basicData.add')
+              }}
+            </el-button>
+            <el-button size="mini" type="text" plain @click="handleBindRacka(scope.row)">{{
+                $t('basicData.delete')
+              }}
+            </el-button>
+          </template>
+        </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">
+          <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="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>
+    <template #footer>
+      <div id="dialog-footer">
+        <el-button type="primary" @click="handleup">
+          {{ $t('basicData.confirm') }}
+        </el-button>
+        <el-button @click="dialogFormVisible = false">{{ $t('basicData.cancel') }}</el-button>
+      </div>
+    </template>
+  </el-dialog>
+</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;
+}
+
+#dotClass {
+  display: flex;
+  margin-left: 20px;
+  size: 50px;
+  margin-top: 20px;
+  margin-bottom: 10px;
+}
+
+#parent {
+  position: relative;
+  width: 1500px;
+  margin-left: -300px
+}
+
+#overlayb {
+  position: absolute;
+  z-index: 1;
+  width: 228px;
+  height: 16px;
+  background-color: #529b2e;
+  margin-top: -303px;
+  margin-left: 355px;
+}
+
+#overlayc {
+  position: absolute;
+  z-index: 1;
+  width: 228px;
+  height: 16px;
+  background-color: #529b2e;
+  margin-top: -303px;
+  margin-left: 703px;
+}
+
+#overlay {
+  position: absolute;
+  z-index: 1;
+  width: 228px;
+  height: 16px;
+  background-color: #529b2e;
+  margin-top: -45px;
+  margin-left: 355px;
+}
+
+#overlaya {
+  position: absolute;
+  z-index: 1;
+  width: 228px;
+  height: 16px;
+  background-color: #529b2e;
+  margin-top: -45px;
+  margin-left: 703px;
+}
+ 
+</style>
\ No newline at end of file
diff --git a/UI-Project/src/views/Slicecage/slicecage.vue b/UI-Project/src/views/Slicecage/slicecage.vue
index 686a171..e00d842 100644
--- a/UI-Project/src/views/Slicecage/slicecage.vue
+++ b/UI-Project/src/views/Slicecage/slicecage.vue
@@ -1,16 +1,15 @@
 <script lang="ts" setup>
-import { useI18n } from 'vue-i18n'
-  const { t } = useI18n()
-  let language = ref(localStorage.getItem('lang') || 'zh')
-import {Search} from "@element-plus/icons-vue";
+import {useI18n} from 'vue-i18n'
 import {useRouter} from "vue-router"
-const router = useRouter()
 import request from "@/utils/request"
-import { WebSocketHost ,host} from '@/utils/constants'
-import { ref, onMounted , onBeforeUnmount, reactive, computed,onUnmounted } from "vue";
-import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService';
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { tr } from "element-plus/es/locale";
+import {host, WebSocketHost} from '@/utils/constants'
+import {computed, onBeforeUnmount, onMounted, onUnmounted, reactive, ref} from "vue";
+import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
+import {ElMessage, ElMessageBox} from 'element-plus'
+
+const {t} = useI18n()
+let language = ref(localStorage.getItem('lang') || 'zh')
+const router = useRouter()
 const dialogFormVisible = ref(false)
 const dialoglea = ref(false)
 const dialogFormVisiblea = ref(false)
@@ -362,21 +361,22 @@
   }  
 }; 
  // 鎸囧畾閽㈠寲
- const brokee = async(row) => {  
+const brokee = async (row, temperingFeedSequence) => {
   try {
-    const confirmResult = await ElMessageBox.confirm(  
-      t('searchOrder.specifytemperinga'), 
-      t('searchOrder.prompt'),  
-      {  
-        confirmButtonText: t('searchOrder.yes'), 
-        cancelButtonText: t('searchOrder.cancel'),
-        type: 'warning',  
-      } 
+    const confirmResult = await ElMessageBox.confirm(
+        t('searchOrder.specifytemperinga'),
+        t('searchOrder.prompt'),
+        {
+          confirmButtonText: t('searchOrder.yes'),
+          cancelButtonText: t('searchOrder.cancel'),
+          type: 'warning',
+        }
     ); 
     if (confirmResult === 'confirm') {  
       const response = await request.post("/cacheVerticalGlass/bigStorageCageDetails/TemperingGlass",{
         engineerId: row.engineer_id,
         temperingLayoutId: row.tempering_layout_id,
+        temperingFeedSequence: temperingFeedSequence
     });
     if (response.code === 200) {
       ElMessage.success(response.message);
@@ -386,7 +386,8 @@
     }  
   } catch (error) {  
     console.error('鍙戠敓閿欒:', error);  
-  }  
+  }
+  handleganghua();
 }; 
  // 鎸囧畾宸ョ▼
  const brokek = async(row) => {  
@@ -1561,10 +1562,18 @@
           <el-table-column prop="count4" align="center" :label="$t('鐮存崯/鎷胯蛋鏁伴噺')" min-width="150" />
           <el-table-column fixed="right" :label="$t('searchOrder.operate')" align="center" width="250">
             <template #default="scope">
-              <el-button size="mini" type="text" plain @click="brokee(scope.row)">{{ $t('searchOrder.specifytempering') }}</el-button>
-              <el-button size="mini" type="text" plain @click="brokek(scope.row)">{{ $t('searchOrder.specifyengineerid') }}</el-button>
+              <el-button size="mini" type="text" plain @click="brokee(scope.row,1)">
+                {{ $t('searchOrder.specifytempering') }}
+              </el-button>
+              <el-button size="mini" type="text" plain @click="brokee(scope.row,0)">{{
+                  $t('searchOrder.specifyout')
+                }}
+              </el-button>
+              <el-button size="mini" type="text" plain @click="brokek(scope.row)">{{
+                  $t('searchOrder.specifyengineerid')
+                }}
+              </el-button>
             </template>
-            
         </el-table-column>
         </el-table>
 </el-dialog>
diff --git a/UI-Project/src/views/UnLoadGlass/PrintCustomLabelSemi1.vue b/UI-Project/src/views/UnLoadGlass/PrintCustomLabelSemi1.vue
index 2927b8f..35c3a2d 100644
--- a/UI-Project/src/views/UnLoadGlass/PrintCustomLabelSemi1.vue
+++ b/UI-Project/src/views/UnLoadGlass/PrintCustomLabelSemi1.vue
@@ -1,8 +1,7 @@
 <script setup>
 import request from "@/utils/request"
-import {ElDatePicker, ElMessage} from "element-plus"
-import {nextTick, onMounted, onUnmounted, reactive, ref, watch} from "vue"
-import {Search} from "@element-plus/icons-vue"
+import {ElMessage} from "element-plus"
+import {onMounted, ref} from "vue"
 // import {useRouter} from 'vue-router'
 // import {changeFilterEvent, filterChanged} from "@/hook"
 // import {useI18n} from 'vue-i18n'
@@ -36,14 +35,15 @@
 let props = defineProps({
   printFlowCardId: null,
   printLayer: null,
+  printGlassId: null,
 })
 
 onMounted(async () => {
-  console.log(props.printFlowCardId,props.printLayer)
-  const response = await request.post('/unLoadGlass/downGlassInfo/downGlassLabelPrint',{
-        flowCardId:props.printFlowCardId,
-        layer:props.printLayer
-    });
+  const response = await request.post('/unLoadGlass/downGlassInfo/downGlassLabelPrint', {
+    flowCardId: props.printFlowCardId,
+    layer: props.printLayer,
+    glassId: props.printGlassId
+  });
         if (response.code == 200) {
           console.log("lastList.value",response.data)
           lastList.value=response.data;
diff --git a/UI-Project/src/views/UnLoadGlass/loadmachinerack.vue b/UI-Project/src/views/UnLoadGlass/loadmachinerack.vue
index 5a918af..cb55ff6 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('')
@@ -44,6 +40,7 @@
 const dialogTableVisible1 = ref(false)
 const printFlowCardId = ref('')
 const printLayer = ref('')
+const printGlassId = ref('')
 const now = new Date();
 const timeRange = ref([])
 const browser = ref(false)
@@ -234,6 +231,9 @@
       scanGlass.value.width = height;
       scanGlass.value.height = width;
     }
+    if (autoPrint.value == true && browser.value == true) {
+      open1(scanGlass);
+    }
   }
 
   //鑷姩鎵撳嵃
@@ -338,6 +338,7 @@
 
   printFlowCardId.value = row.flowCardId;
   printLayer.value = row.layer
+  printGlassId.value = row.glassId
   dialogTableVisible1.value = true;
   setTimeout(() => {
     printFlowCard1();
@@ -536,6 +537,9 @@
               </div>
               <div style="font-size: 50px; text-align: center;position: absolute;top:0px;left:170px;">
                 <div>浜哄伐涓嬬墖褰撳墠鐜荤拑淇℃伅</div>
+                <div>
+                  <el-button type="primary" @click="open1(takeGlass)">鎵撳嵃鏍囩</el-button>
+                </div>
                 <div>{{ takeGlass.flowCardId }}</div>
                 <div>{{ takeGlass.layer }}</div>
                 <div>{{ takeGlass.glassId }}</div>
@@ -551,6 +555,9 @@
               </div>
               <div style="font-size: 50px; text-align: center;position: absolute;top:0px;left:200px;">
                 <div>鎵爜鏋綋鍓嶇幓鐠冧俊鎭�</div>
+                <div>
+                  <el-button type="primary" @click="open1(scanGlass)">鎵撳嵃鏍囩</el-button>
+                </div>
                 <div>{{ scanGlass.flowCardId }}</div>
                 <div>{{ scanGlass.layer }}</div>
                 <div>{{ scanGlass.glassId }}</div>
@@ -622,7 +629,8 @@
       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" style="" />
+    <print-label id="printFlowCard" :printFlowCardId="printFlowCardId" :printLayer="printLayer"
+                 :printGlassId="printGlassId" style=""/>
   </el-dialog>
 
 </template>
diff --git a/hangzhoumesParent/common/opcuaClient/pom.xml b/hangzhoumesParent/common/opcuaClient/pom.xml
deleted file mode 100644
index cf5d20f..0000000
--- a/hangzhoumesParent/common/opcuaClient/pom.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>common</artifactId>
-        <groupId>com.mes</groupId>
-        <version>1.0-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>opcuaClient</artifactId>
-
-    <properties>
-        <maven.compiler.source>8</maven.compiler.source>
-        <maven.compiler.target>8</maven.compiler.target>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-autoconfigure</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-configuration-processor</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.milo</groupId>
-            <artifactId>sdk-client</artifactId>
-            <version>0.6.8</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-pool2</artifactId>
-            <version>2.6.2</version>
-        </dependency>
-    </dependencies>
-
-</project>
\ No newline at end of file
diff --git a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/configuration/MiloProperties.java b/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/configuration/MiloProperties.java
deleted file mode 100644
index 1dac285..0000000
--- a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/configuration/MiloProperties.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package com.mes.milo.configuration;
-
-import lombok.Data;
-import org.eclipse.milo.opcua.stack.core.security.SecurityPolicy;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-/**
- * @author mes
- * @date 2020/4/25
- * @desc milo-spring-boot-starter
- * @since 0.0.1
- */
-@Data
-@ConfigurationProperties(prefix = MiloProperties.PREFIX)
-public class MiloProperties {
-    public static final String PREFIX = "mes.milo";
-
-    /**
-     * 鏄惁鍚敤缁勪欢
-     */
-    private Boolean enabled = true;
-
-    /**
-     * server 榛樿璇锋眰閰嶇疆锛屼笉鎸囧畾锛屽垯榛樿鍙� config涓涓�涓�
-     */
-    private String primary;
-
-    /**
-     * server 鍒楄〃
-     */
-    private Map<String, Config> config = new LinkedHashMap<>();
-
-    /**
-     * 杩炴帴姹犻厤缃�
-     */
-    private Pool pool = new Pool();
-
-    @Data
-    public static class Config {
-
-        /**
-         * OPC UA鍦板潃
-         */
-        private String endpoint;
-
-        /**
-         * 瀹夊叏绛栫暐
-         */
-        private SecurityPolicy securityPolicy = SecurityPolicy.None;
-
-        /**
-         * 鐢ㄦ埛鍚�
-         */
-        private String username;
-
-        /**
-         * 瀵嗙爜
-         */
-        private String password;
-    }
-
-    @Data
-    public static class Pool {
-        /**
-         * 鏈�澶х┖闂�
-         */
-        private int maxIdle = 5;
-        /**
-         * 鏈�澶ф�绘暟
-         */
-        private int maxTotal = 20;
-        /**
-         * 鏈�灏忕┖闂�
-         */
-        private int minIdle = 2;
-
-        /**
-         * 鍒濆鍖栬繛鎺ユ暟
-         */
-        private int initialSize = 3;
-    }
-}
diff --git a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/exception/EndPointNotFoundException.java b/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/exception/EndPointNotFoundException.java
deleted file mode 100644
index 0388c2f..0000000
--- a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/exception/EndPointNotFoundException.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.mes.milo.exception;
-
-/**
- * 绫� EndPointNotFoundException 鍔熻兘鎻忚堪锛�
- *
- * @author mes
- * @version 0.0.1
- * @date 2021/09/04 17:03
- */
-public class EndPointNotFoundException extends RuntimeException {
-    public EndPointNotFoundException() {
-        super();
-    }
-
-    public EndPointNotFoundException(String message) {
-        super(message);
-    }
-}
diff --git a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/exception/IdentityNotFoundException.java b/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/exception/IdentityNotFoundException.java
deleted file mode 100644
index afd69f2..0000000
--- a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/exception/IdentityNotFoundException.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.mes.milo.exception;
-
-/**
- * 绫� IdentityNotFoundException 鍔熻兘鎻忚堪锛�
- *
- * @author mes
- * @version 0.0.1
- * @date 2021/09/15 09:35
- */
-public class IdentityNotFoundException extends RuntimeException {
-    public IdentityNotFoundException(String message) {
-        super(message);
-    }
-}
diff --git a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/model/ReadWriteEntity.java b/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/model/ReadWriteEntity.java
deleted file mode 100644
index 5276365..0000000
--- a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/model/ReadWriteEntity.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.mes.milo.model;
-
-import lombok.*;
-import lombok.experimental.Accessors;
-import org.eclipse.milo.opcua.stack.core.types.builtin.DataValue;
-
-/**
- * @author mes
- * @version 0.0.1
- * @desc
- * @since 2020/4/13
- */
-@Data
-@Builder
-@AllArgsConstructor
-@NoArgsConstructor
-@Accessors(chain = true)
-@ToString
-public class ReadWriteEntity {
-
-    private String identifier;
-
-    private Object value;
-
-    private DataValue dataValue;
-}
diff --git a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/model/WriteEntity.java b/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/model/WriteEntity.java
deleted file mode 100644
index 748781c..0000000
--- a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/model/WriteEntity.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.mes.milo.model;
-
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
-import org.eclipse.milo.opcua.stack.core.types.builtin.Variant;
-
-/**
- * @author mes
- * @version 0.0.1
- * @since 2020/4/13
- */
-@Data
-@Builder
-@AllArgsConstructor
-@NoArgsConstructor
-@Accessors(chain = true)
-public class WriteEntity {
-    private String identifier;
-    private Variant variant;
-}
diff --git a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/pool/MiloConnectPool.java b/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/pool/MiloConnectPool.java
deleted file mode 100644
index aa13b70..0000000
--- a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/pool/MiloConnectPool.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.mes.milo.pool;
-
-import com.mes.milo.configuration.MiloProperties;
-import org.apache.commons.pool2.KeyedPooledObjectFactory;
-import org.apache.commons.pool2.impl.GenericKeyedObjectPool;
-import org.apache.commons.pool2.impl.GenericKeyedObjectPoolConfig;
-import org.eclipse.milo.opcua.sdk.client.OpcUaClient;
-
-/**
- * 绫� MiloConnectPool 鍔熻兘鎻忚堪锛�<br/>
- *
- * @author mes
- * @version 0.0.1
- * @date 2023/5/4 19:17
- */
-public class MiloConnectPool extends GenericKeyedObjectPool<MiloProperties.Config, OpcUaClient> {
-
-    public MiloConnectPool(KeyedPooledObjectFactory<MiloProperties.Config, OpcUaClient> factory) {
-        super(factory);
-    }
-
-    public MiloConnectPool(KeyedPooledObjectFactory<MiloProperties.Config, OpcUaClient> factory, GenericKeyedObjectPoolConfig<OpcUaClient> config) {
-        super(factory, config);
-    }
-}
diff --git a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/runner/BrowseNodeRunner.java b/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/runner/BrowseNodeRunner.java
deleted file mode 100644
index 6b3ba57..0000000
--- a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/runner/BrowseNodeRunner.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package com.mes.milo.runner;
-
-import com.mes.milo.utils.CustomUtil;
-import lombok.extern.slf4j.Slf4j;
-import org.eclipse.milo.opcua.sdk.client.OpcUaClient;
-import org.eclipse.milo.opcua.sdk.client.nodes.UaNode;
-import org.eclipse.milo.opcua.stack.core.UaException;
-import org.eclipse.milo.opcua.stack.core.types.builtin.NodeId;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-/**
- * @author mes
- * @version 0.0.1
- * @since 2020/4/14
- */
-@Slf4j
-public class BrowseNodeRunner {
-    /**
-     * 瑕佽鐨勮妭鐐�
-     */
-    private final String browseRoot;
-
-    public BrowseNodeRunner(String browseRoot) {
-        this.browseRoot = browseRoot;
-    }
-
-    public List<String> run(OpcUaClient opcUaClient) {
-        NodeId nodeId = CustomUtil.parseNodeId(browseRoot);
-        return browseNode(browseRoot, opcUaClient, nodeId);
-    }
-
-    private List<String> browseNode(String prefix, OpcUaClient client, NodeId browseRoot) {
-        List<String> nodesList = new ArrayList<>();
-        try {
-            List<? extends UaNode> nodes = client.getAddressSpace().browseNodes(browseRoot);
-
-            nodes = nodes.stream().filter(item -> !Objects.requireNonNull(item.getBrowseName().getName()).startsWith("_")).collect(Collectors.toList());
-
-            for (UaNode node : nodes) {
-                String sub = prefix + "." + node.getBrowseName().getName();
-
-                // recursively browse to children
-                List<String> browseNode = browseNode(sub, client, node.getNodeId());
-                if (browseNode.isEmpty()) {
-                    nodesList.add(sub);
-                } else {
-                    nodesList.addAll(browseNode(sub, client, node.getNodeId()));
-                }
-            }
-        } catch (UaException e) {
-            log.error("Browsing nodeId={} failed: {}", browseRoot, e.getMessage(), e);
-        }
-        return nodesList;
-    }
-}
diff --git a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/runner/BrowseRunner.java b/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/runner/BrowseRunner.java
deleted file mode 100644
index 2f93c84..0000000
--- a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/runner/BrowseRunner.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.mes.milo.runner;
-
-import lombok.extern.slf4j.Slf4j;
-import org.eclipse.milo.opcua.sdk.client.OpcUaClient;
-import org.eclipse.milo.opcua.sdk.client.nodes.UaNode;
-import org.eclipse.milo.opcua.stack.core.Identifiers;
-import org.eclipse.milo.opcua.stack.core.UaException;
-import org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.UShort;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-/**
- * @author mes
- * @version 0.0.1
- * @since 2020/4/14
- */
-@Slf4j
-public class BrowseRunner {
-
-    public List<String> run(OpcUaClient opcUaClient) {
-        List<String> nodesList = new ArrayList<>();
-        try {
-            List<? extends UaNode> nodes = opcUaClient.getAddressSpace().browseNodes(Identifiers.ObjectsFolder);
-
-            nodesList.addAll(nodes.stream().filter(item -> !Objects.requireNonNull(item.getBrowseName().getName()).startsWith("_")
-                    && Objects.equals(item.getBrowseName().getNamespaceIndex(), UShort.valueOf(2)))
-                    .map(item -> item.getBrowseName().getName()).collect(Collectors.toList()));
-        } catch (UaException e) {
-            log.error("閬嶅巻鏍硅妭鐐瑰紓甯革細{}", e.getMessage(), e);
-        }
-        return nodesList;
-    }
-}
diff --git a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/runner/ReadValuesRunner.java b/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/runner/ReadValuesRunner.java
deleted file mode 100644
index 74772d5..0000000
--- a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/runner/ReadValuesRunner.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package com.mes.milo.runner;
-
-import com.mes.milo.model.ReadWriteEntity;
-import com.mes.milo.utils.CustomUtil;
-import lombok.extern.slf4j.Slf4j;
-import org.eclipse.milo.opcua.sdk.client.OpcUaClient;
-import org.eclipse.milo.opcua.stack.core.types.builtin.DataValue;
-import org.eclipse.milo.opcua.stack.core.types.builtin.NodeId;
-import org.eclipse.milo.opcua.stack.core.types.builtin.StatusCode;
-import org.eclipse.milo.opcua.stack.core.types.enumerated.TimestampsToReturn;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author mes
- * @version 0.0.1
- * @desc
- * @since 2020/4/14
- */
-@Slf4j
-public class ReadValuesRunner {
-    /**
-     * 瑕佽鐨勭偣浣峫ist
-     */
-    private final List<String> identifiers;
-
-    public ReadValuesRunner(List<String> identifiers) {
-        this.identifiers = identifiers;
-    }
-
-    public List<ReadWriteEntity> run(OpcUaClient opcUaClient) {
-        List<ReadWriteEntity> entityList = new ArrayList<>();
-        try {
-            List<NodeId> nodeIds = new ArrayList<>();
-            identifiers.forEach(identifier -> nodeIds.add(CustomUtil.parseNodeId(identifier)));
-            // 璇诲彇鎸囧畾鐐逛綅鐨勫�硷紝10s瓒呮椂
-            List<DataValue> dataValues = opcUaClient.readValues(10000, TimestampsToReturn.Both, nodeIds).get();
-            if (dataValues.size() == identifiers.size()) {
-                for (int i = 0; i < identifiers.size(); i++) {
-                    String id = identifiers.get(i);
-                    Object value = dataValues.get(i).getValue().getValue();
-                    StatusCode status = dataValues.get(i).getStatusCode();
-                    assert status != null;
-                    if (status.isGood()) {
-                        log.info("璇诲彇鐐逛綅 '{}' 鐨勫�间负 {}", id, value);
-                    }
-                    entityList.add(ReadWriteEntity.builder()
-                            .identifier(id)
-                            .value(value)
-                            .dataValue(dataValues.get(i))
-                            .build());
-                }
-            }
-        } catch (Exception e) {
-            log.error("璇诲�兼椂鍑虹幇浜嗗紓甯革細{}", e.getMessage(), e);
-        }
-        return entityList;
-    }
-}
diff --git a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/runner/WriteValuesRunner.java b/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/runner/WriteValuesRunner.java
deleted file mode 100644
index 9ff7e71..0000000
--- a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/runner/WriteValuesRunner.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.mes.milo.runner;
-
-import com.mes.milo.model.WriteEntity;
-import com.mes.milo.utils.CustomUtil;
-import lombok.extern.slf4j.Slf4j;
-import org.eclipse.milo.opcua.sdk.client.OpcUaClient;
-import org.eclipse.milo.opcua.stack.core.types.builtin.DataValue;
-import org.eclipse.milo.opcua.stack.core.types.builtin.NodeId;
-import org.eclipse.milo.opcua.stack.core.types.builtin.StatusCode;
-
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * @author mes
- * @version 0.0.1
- * @since 2020/4/14
- */
-@Slf4j
-public class WriteValuesRunner {
-    private final List<WriteEntity> entities;
-
-    public WriteValuesRunner(List<WriteEntity> entities) {
-        this.entities = entities;
-    }
-
-    public void run(OpcUaClient opcUaClient) {
-        try {
-            if (!entities.isEmpty()) {
-                List<NodeId> nodeIds = new LinkedList<>();
-                List<DataValue> dataValues = new LinkedList<>();
-                for (WriteEntity entity : entities) {
-                    nodeIds.add(CustomUtil.parseNodeId(entity.getIdentifier()));
-                    dataValues.add(new DataValue(entity.getVariant(), null, null));
-                }
-
-                List<StatusCode> statusCodeList = opcUaClient.writeValues(nodeIds, dataValues).join();
-                for (int i = 0; i < statusCodeList.size(); i++) {
-                    if (statusCodeList.get(i).isGood()) {
-                        log.info("灏嗗�� '{}' 鍐欏叆鍒扮偣浣嶏細{} 鎴愬姛", dataValues.get(i).getValue(), nodeIds.get(i));
-                    } else {
-                        log.error("鐐逛綅锛歿} 鍐欏叆鏃跺嚭鐜颁簡寮傚父锛歿}", nodeIds.get(i), statusCodeList.get(i));
-                    }
-                }
-            }
-        } catch (Exception e) {
-            log.error("鎵归噺鍐欏�煎嚭鐜板紓甯稿嚭鐜颁簡寮傚父锛歿}", e.getMessage(), e);
-        }
-    }
-}
diff --git a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/runner/subscription/SubscriptionCallback.java b/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/runner/subscription/SubscriptionCallback.java
deleted file mode 100644
index a31cee0..0000000
--- a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/runner/subscription/SubscriptionCallback.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.mes.milo.runner.subscription;
-
-import org.eclipse.milo.opcua.sdk.client.subscriptions.ManagedDataItem;
-import org.eclipse.milo.opcua.stack.core.types.builtin.DataValue;
-
-/**
- * 绫� SubscriptionCallback 鍔熻兘鎻忚堪锛�<br/>
- *
- * @author mes
- * @version 0.0.1
- * @date 2023/5/8 22:14
- */
-public interface SubscriptionCallback {
-
-    void onSubscribe(ManagedDataItem dataItem, DataValue value) throws Exception;
-}
diff --git a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/runner/subscription/SubscriptionRunner.java b/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/runner/subscription/SubscriptionRunner.java
deleted file mode 100644
index 3cc0db3..0000000
--- a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/runner/subscription/SubscriptionRunner.java
+++ /dev/null
@@ -1,111 +0,0 @@
-package com.mes.milo.runner.subscription;
-
-import com.mes.milo.utils.CustomUtil;
-import lombok.extern.slf4j.Slf4j;
-import org.eclipse.milo.opcua.sdk.client.OpcUaClient;
-import org.eclipse.milo.opcua.sdk.client.api.subscriptions.UaSubscription;
-import org.eclipse.milo.opcua.sdk.client.api.subscriptions.UaSubscriptionManager;
-import org.eclipse.milo.opcua.sdk.client.subscriptions.ManagedDataItem;
-import org.eclipse.milo.opcua.sdk.client.subscriptions.ManagedSubscription;
-import org.eclipse.milo.opcua.stack.core.types.builtin.NodeId;
-import org.eclipse.milo.opcua.stack.core.types.builtin.StatusCode;
-import org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.UInteger;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-
-/**
- * 绫� SubscriptionRunner 鍔熻兘鎻忚堪锛�
- *
- * @author mes
- * @version 0.0.1
- * @date 2022/01/01 23:49
- */
-@Slf4j
-public class SubscriptionRunner {
-    /**
-     * 鐐逛綅list
-     */
-    private final List<String> identifiers;
-
-    private final double samplingInterval;
-
-    public SubscriptionRunner(List<String> identifiers) {
-        this.identifiers = identifiers;
-        this.samplingInterval = 1000.0D;
-    }
-
-    public SubscriptionRunner(List<String> identifiers, double samplingInterval) {
-        this.identifiers = identifiers;
-        this.samplingInterval = samplingInterval;
-    }
-
-    public void run(OpcUaClient opcUaClient, SubscriptionCallback callback) {
-
-        final CountDownLatch downLatch = new CountDownLatch(1);
-
-        //娣诲姞璁㈤槄鐩戝惉鍣紝鐢ㄤ簬澶勭悊鏂嚎閲嶈繛鍚庣殑璁㈤槄闂
-        opcUaClient.getSubscriptionManager().addSubscriptionListener(new CustomSubscriptionListener(opcUaClient, callback));
-
-        //澶勭悊璁㈤槄閫昏緫
-        handler(opcUaClient, callback);
-
-        try {
-            //鎸佺画鐩戝惉
-            downLatch.await();
-        } catch (Exception e) {
-            log.error("璁㈤槄鏃跺嚭鐜颁簡寮傚父锛歿}", e.getMessage(), e);
-        }
-    }
-
-    private void handler(OpcUaClient opcUaClient, SubscriptionCallback callback) {
-        try {
-            //鍒涘缓璁㈤槄
-            ManagedSubscription subscription = ManagedSubscription.create(opcUaClient, samplingInterval);
-            subscription.setDefaultSamplingInterval(samplingInterval);
-            subscription.setDefaultQueueSize(UInteger.valueOf(10));
-
-            List<NodeId> nodeIdList = new ArrayList<>();
-            for (String identifier : identifiers) {
-                nodeIdList.add(CustomUtil.parseNodeId(identifier));
-            }
-            List<ManagedDataItem> dataItemList = subscription.createDataItems(nodeIdList);
-            for (ManagedDataItem dataItem : dataItemList) {
-                dataItem.addDataValueListener((item) -> {
-                    try {
-                        callback.onSubscribe
-                                (dataItem, item);
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    }
-                });
-            }
-        } catch (Exception e) {
-            log.error("璁㈤槄鏃跺嚭鐜颁簡寮傚父锛歿}", e.getMessage(), e);
-        }
-    }
-
-    private class CustomSubscriptionListener implements UaSubscriptionManager.SubscriptionListener {
-        private final OpcUaClient client;
-        private final SubscriptionCallback callback;
-
-        public CustomSubscriptionListener(OpcUaClient client, SubscriptionCallback callback) {
-            this.client = client;
-            this.callback = callback;
-        }
-
-        /**
-         * 閲嶈繛鏃� 灏濊瘯鎭㈠涔嬪墠鐨勮闃呭け璐ユ椂 浼氳皟鐢ㄦ鏂规硶
-         *
-         * @param uaSubscription 璁㈤槄
-         * @param statusCode     鐘舵��
-         */
-        @Override
-        public void onSubscriptionTransferFailed(UaSubscription uaSubscription, StatusCode statusCode) {
-            log.debug("鎭㈠璁㈤槄澶辫触 闇�瑕侀噸鏂拌闃�");
-            //鍦ㄥ洖璋冩柟娉曚腑閲嶆柊璁㈤槄
-            handler(client, callback);
-        }
-    }
-}
diff --git a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/service/MiloService.java b/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/service/MiloService.java
deleted file mode 100644
index 45c5658..0000000
--- a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/service/MiloService.java
+++ /dev/null
@@ -1,553 +0,0 @@
-package com.mes.milo.service;
-
-import com.mes.milo.configuration.MiloProperties;
-import com.mes.milo.model.ReadWriteEntity;
-import com.mes.milo.model.WriteEntity;
-import com.mes.milo.pool.MiloConnectPool;
-import com.mes.milo.runner.BrowseNodeRunner;
-import com.mes.milo.runner.BrowseRunner;
-import com.mes.milo.runner.ReadValuesRunner;
-import com.mes.milo.runner.WriteValuesRunner;
-import com.mes.milo.runner.subscription.SubscriptionCallback;
-import com.mes.milo.runner.subscription.SubscriptionRunner;
-import com.mes.milo.utils.CustomUtil;
-import lombok.extern.slf4j.Slf4j;
-import org.eclipse.milo.opcua.sdk.client.OpcUaClient;
-import org.eclipse.milo.opcua.stack.core.types.builtin.Variant;
-import org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.Unsigned;
-import org.springframework.stereotype.Service;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * @author mes
- * @date 2020/4/25
- * @desc milo-spring-boot-starter
- * @since 0.0.1
- */
-@Service
-@Slf4j
-public class MiloService {
-    private final MiloConnectPool connectPool;
-    private final MiloProperties properties;
-
-    public MiloService(MiloConnectPool connectPool, MiloProperties properties) {
-        this.connectPool = connectPool;
-        this.properties = properties;
-    }
-
-    /**
-     * 閬嶅巻OPC UA鏈嶅姟鍣ㄦ牴鑺傜偣
-     *
-     * @return 鏍硅妭鐐瑰垪琛�
-     */
-    public List<String> browseRoot() throws Exception {
-        return browseRoot(null);
-    }
-
-    /**
-     * 閬嶅巻OPC UA鏈嶅姟鍣ㄦ牴鑺傜偣
-     *
-     * @param clientName 閰嶇疆key
-     * @return 鏍硅妭鐐瑰垪琛�
-     */
-    public List<String> browseRoot(String clientName) throws Exception {
-        MiloProperties.Config config = CustomUtil.getConfig(properties, clientName);
-        BrowseRunner runner = new BrowseRunner();
-        OpcUaClient client = connectPool.borrowObject(config);
-        if (client != null) {
-            try {
-                return runner.run(client);
-            } finally {
-                connectPool.returnObject(config, client);
-            }
-        }
-        return Collections.emptyList();
-    }
-
-    /**
-     * 閬嶅巻OPC UA鏈嶅姟鍣ㄦ寚瀹氳妭鐐�
-     *
-     * @param browseRoot 鑺傜偣鍚嶇О
-     * @return 鎸囧畾鑺傜偣 tag鍒楄〃
-     */
-    public List<String> browseNode(String browseRoot) throws Exception {
-        return browseNode(browseRoot, null);
-    }
-
-    /**
-     * 閬嶅巻OPC UA鏈嶅姟鍣ㄦ寚瀹氳妭鐐�
-     *
-     * @param browseRoot 鑺傜偣鍚嶇О
-     * @param clientName 閰嶇疆key
-     * @return 鎸囧畾鑺傜偣 tag鍒楄〃
-     */
-    public List<String> browseNode(String browseRoot, String clientName) throws Exception {
-        MiloProperties.Config config = CustomUtil.getConfig(properties, clientName);
-        BrowseNodeRunner runner = new BrowseNodeRunner(browseRoot);
-        OpcUaClient client = connectPool.borrowObject(config);
-        if (client != null) {
-            try {
-                return runner.run(client);
-            } finally {
-                connectPool.returnObject(config, client);
-            }
-        }
-        return Collections.emptyList();
-    }
-
-    /**
-     * 鎸囧畾绫诲瀷 鍐欏叆kep鐐逛綅鍊�
-     *
-     * @param entity 寰呭啓鍏ユ暟鎹�
-     */
-    public void writeSpecifyType(WriteEntity entity) throws Exception {
-        writeSpecifyType(Collections.singletonList(entity));
-    }
-
-    /**
-     * 鎸囧畾绫诲瀷 鍐欏叆kep鐐逛綅鍊�
-     *
-     * @param entity     寰呭啓鍏ユ暟鎹�
-     * @param clientName 閰嶇疆key
-     */
-    public void writeSpecifyType(WriteEntity entity, String clientName) throws Exception {
-        writeSpecifyType(Collections.singletonList(entity), clientName);
-    }
-
-    /**
-     * 鎸囧畾绫诲瀷 鍐欏叆kep鐐逛綅鍊硷紝鍙壒閲忓啓鍏ヤ笉鍚岀被鍨嬬殑鍊�
-     *
-     * @param entities 寰呭啓鍏ユ暟鎹�
-     */
-    public void writeSpecifyType(List<WriteEntity> entities) throws Exception {
-        writeSpecifyType(entities, null);
-    }
-
-    /**
-     * 鎸囧畾绫诲瀷 鍐欏叆kep鐐逛綅鍊硷紝鍙壒閲忓啓鍏ヤ笉鍚岀被鍨嬬殑鍊�
-     *
-     * @param entities   寰呭啓鍏ユ暟鎹�
-     * @param clientName 閰嶇疆key
-     */
-    public void writeSpecifyType(List<WriteEntity> entities, String clientName) throws Exception {
-        MiloProperties.Config config = CustomUtil.getConfig(properties, clientName);
-        WriteValuesRunner runner = new WriteValuesRunner(entities);
-        OpcUaClient client = connectPool.borrowObject(config);
-        if (client != null) {
-            try {
-                runner.run(client);
-            } finally {
-                connectPool.returnObject(config, client);
-            }
-        }
-    }
-
-    /**
-     * 鍐欏叆kep鐐逛綅鍊�
-     *
-     * @param entity 寰呭啓鍏ユ暟鎹�
-     */
-    public void writeToOpcUa(ReadWriteEntity entity) throws Exception {
-        writeToOpcUa(Collections.singletonList(entity));
-    }
-
-    /**
-     * 鍐欏叆kep鐐逛綅鍊�
-     *
-     * @param entity     寰呭啓鍏ユ暟鎹�
-     * @param clientName 閰嶇疆key
-     */
-    public void writeToOpcUa(ReadWriteEntity entity, String clientName) throws Exception {
-        writeToOpcUa(Collections.singletonList(entity), clientName);
-    }
-
-    /**
-     * 鍐欏叆kep鐐逛綅鍊�
-     *
-     * @param entities 寰呭啓鍏ユ暟鎹�
-     */
-    public void writeToOpcUa(List<ReadWriteEntity> entities) throws Exception {
-        writeToOpcUa(entities, null);
-    }
-
-    /**
-     * 鍐欏叆kep鐐逛綅鍊�
-     *
-     * @param entities   寰呭啓鍏ユ暟鎹�
-     * @param clientName 閰嶇疆key
-     */
-    public void writeToOpcUa(List<ReadWriteEntity> entities, String clientName) throws Exception {
-        MiloProperties.Config config = CustomUtil.getConfig(properties, clientName);
-        List<WriteEntity> writeEntityList = new ArrayList<>();
-        if (!entities.isEmpty()) {
-            for (ReadWriteEntity entity : entities) {
-                writeEntityList.add(WriteEntity.builder()
-                        .identifier(entity.getIdentifier())
-                        .variant(new Variant(entity.getValue()))
-                        .build());
-            }
-        }
-        WriteValuesRunner runner = new WriteValuesRunner(writeEntityList);
-        OpcUaClient client = connectPool.borrowObject(config);
-        if (client != null) {
-            try {
-                runner.run(client);
-            } finally {
-                connectPool.returnObject(config, client);
-            }
-        }
-    }
-
-    /**
-     * kepware 鏁版嵁绫诲瀷涓猴細Char<br/>
-     * 8浣嶅甫绗﹀彿鏁存暟
-     *
-     * @param entity 寰呭啓鍏ユ暟鎹�
-     */
-    public void writeToOpcChar(ReadWriteEntity entity) throws Exception {
-        writeToOpcChar(Collections.singletonList(entity));
-    }
-
-    /**
-     * kepware 鏁版嵁绫诲瀷涓猴細Char<br/>
-     * 8浣嶅甫绗﹀彿鏁存暟
-     *
-     * @param entity     寰呭啓鍏ユ暟鎹�
-     * @param clientName 閰嶇疆key
-     */
-    public void writeToOpcChar(ReadWriteEntity entity, String clientName) throws Exception {
-        writeToOpcChar(Collections.singletonList(entity), clientName);
-    }
-
-    /**
-     * kepware 鏁版嵁绫诲瀷涓猴細Char<br/>
-     * 8浣嶅甫绗﹀彿鏁存暟
-     *
-     * @param entities 寰呭啓鍏ユ暟鎹�
-     */
-    public void writeToOpcChar(List<ReadWriteEntity> entities) throws Exception {
-        writeToOpcChar(entities, null);
-    }
-
-    /**
-     * kepware 鏁版嵁绫诲瀷涓猴細Char<br/>
-     * 8浣嶅甫绗﹀彿鏁存暟
-     *
-     * @param entities   寰呭啓鍏ユ暟鎹�
-     * @param clientName 閰嶇疆key
-     */
-    public void writeToOpcChar(List<ReadWriteEntity> entities, String clientName) throws Exception {
-        MiloProperties.Config config = CustomUtil.getConfig(properties, clientName);
-        List<WriteEntity> writeEntityList = new ArrayList<>();
-        if (!entities.isEmpty()) {
-            for (ReadWriteEntity entity : entities) {
-                writeEntityList.add(WriteEntity.builder()
-                        .identifier(entity.getIdentifier())
-                        .variant(new Variant(((Integer) entity.getValue()).byteValue()))
-                        .build());
-            }
-        }
-        WriteValuesRunner runner = new WriteValuesRunner(writeEntityList);
-        OpcUaClient client = connectPool.borrowObject(config);
-        if (client != null) {
-            try {
-                runner.run(client);
-            } finally {
-                connectPool.returnObject(config, client);
-            }
-        }
-    }
-
-    /**
-     * kepware 鏁版嵁绫诲瀷涓猴細Byte<br/>
-     * 8浣嶆棤绗﹀彿鏁存暟
-     *
-     * @param entity 寰呭啓鍏ユ暟鎹�
-     */
-    public void writeToOpcByte(ReadWriteEntity entity) throws Exception {
-        writeToOpcByte(Collections.singletonList(entity));
-    }
-
-    /**
-     * kepware 鏁版嵁绫诲瀷涓猴細Byte<br/>
-     * 8浣嶆棤绗﹀彿鏁存暟
-     *
-     * @param entity     寰呭啓鍏ユ暟鎹�
-     * @param clientName 閰嶇疆key
-     */
-    public void writeToOpcByte(ReadWriteEntity entity, String clientName) throws Exception {
-        writeToOpcByte(Collections.singletonList(entity), clientName);
-    }
-
-    /**
-     * kepware 鏁版嵁绫诲瀷涓猴細Byte<br/>
-     * 8浣嶆棤绗﹀彿鏁存暟
-     *
-     * @param entities 寰呭啓鍏ユ暟鎹�
-     */
-    public void writeToOpcByte(List<ReadWriteEntity> entities) throws Exception {
-        writeToOpcByte(entities, null);
-    }
-
-    /**
-     * kepware 鏁版嵁绫诲瀷涓猴細Byte<br/>
-     * 8浣嶆棤绗﹀彿鏁存暟
-     *
-     * @param entities   寰呭啓鍏ユ暟鎹�
-     * @param clientName 閰嶇疆key
-     */
-    public void writeToOpcByte(List<ReadWriteEntity> entities, String clientName) throws Exception {
-        MiloProperties.Config config = CustomUtil.getConfig(properties, clientName);
-        List<WriteEntity> writeEntityList = new ArrayList<>();
-        if (!entities.isEmpty()) {
-            for (ReadWriteEntity entity : entities) {
-                writeEntityList.add(WriteEntity.builder()
-                        .identifier(entity.getIdentifier())
-                        .variant(new Variant(Unsigned.ubyte((Integer) entity.getValue())))
-                        .build());
-            }
-        }
-        WriteValuesRunner runner = new WriteValuesRunner(writeEntityList);
-        OpcUaClient client = connectPool.borrowObject(config);
-        if (client != null) {
-            try {
-                runner.run(client);
-            } finally {
-                connectPool.returnObject(config, client);
-            }
-        }
-    }
-
-    /**
-     * kepware 鏁版嵁绫诲瀷涓猴細Short<br/>
-     * 16浣嶅甫绗﹀彿鏁存暟
-     *
-     * @param entity 寰呭啓鍏ユ暟鎹�
-     */
-    public void writeToOpcShort(ReadWriteEntity entity) throws Exception {
-        writeToOpcShort(Collections.singletonList(entity));
-    }
-
-    /**
-     * kepware 鏁版嵁绫诲瀷涓猴細Short<br/>
-     * 16浣嶅甫绗﹀彿鏁存暟
-     *
-     * @param entity     寰呭啓鍏ユ暟鎹�
-     * @param clientName 閰嶇疆key
-     */
-    public void writeToOpcShort(ReadWriteEntity entity, String clientName) throws Exception {
-        writeToOpcShort(Collections.singletonList(entity), clientName);
-    }
-
-    /**
-     * kepware 鏁版嵁绫诲瀷涓猴細Short<br/>
-     * 16浣嶅甫绗﹀彿鏁存暟
-     *
-     * @param entities 寰呭啓鍏ユ暟鎹�
-     */
-    public void writeToOpcShort(List<ReadWriteEntity> entities) throws Exception {
-        writeToOpcShort(entities, null);
-    }
-
-    /**
-     * kepware 鏁版嵁绫诲瀷涓猴細Short<br/>
-     * 16浣嶅甫绗﹀彿鏁存暟
-     *
-     * @param entities   寰呭啓鍏ユ暟鎹�
-     * @param clientName 閰嶇疆key
-     */
-    public void writeToOpcShort(List<ReadWriteEntity> entities, String clientName) throws Exception {
-        MiloProperties.Config config = CustomUtil.getConfig(properties, clientName);
-        List<WriteEntity> writeEntityList = new ArrayList<>();
-        if (!entities.isEmpty()) {
-            for (ReadWriteEntity entity : entities) {
-                writeEntityList.add(WriteEntity.builder()
-                        .identifier(entity.getIdentifier())
-                        .variant(new Variant(((Integer) entity.getValue()).shortValue()))
-                        .build());
-            }
-        }
-        WriteValuesRunner runner = new WriteValuesRunner(writeEntityList);
-        OpcUaClient client = connectPool.borrowObject(config);
-        if (client != null) {
-            try {
-                runner.run(client);
-            } finally {
-                connectPool.returnObject(config, client);
-            }
-        }
-    }
-
-    /**
-     * kepware 鏁版嵁绫诲瀷涓猴細Word<br/>
-     * 16浣嶆棤绗﹀彿鏁存暟
-     *
-     * @param entity 寰呭啓鍏ユ暟鎹�
-     */
-    public void writeToOpcWord(ReadWriteEntity entity) throws Exception {
-        writeToOpcWord(Collections.singletonList(entity));
-    }
-
-    /**
-     * kepware 鏁版嵁绫诲瀷涓猴細Word<br/>
-     * 16浣嶆棤绗﹀彿鏁存暟
-     *
-     * @param entity     寰呭啓鍏ユ暟鎹�
-     * @param clientName 閰嶇疆key
-     */
-    public void writeToOpcWord(ReadWriteEntity entity, String clientName) throws Exception {
-        writeToOpcWord(Collections.singletonList(entity), clientName);
-    }
-
-    /**
-     * kepware 鏁版嵁绫诲瀷涓猴細Word<br/>
-     * 16浣嶆棤绗﹀彿鏁存暟
-     *
-     * @param entities 寰呭啓鍏ユ暟鎹�
-     */
-    public void writeToOpcWord(List<ReadWriteEntity> entities) throws Exception {
-        writeToOpcWord(entities, null);
-    }
-
-    /**
-     * kepware 鏁版嵁绫诲瀷涓猴細Word<br/>
-     * 16浣嶆棤绗﹀彿鏁存暟
-     *
-     * @param entities   寰呭啓鍏ユ暟鎹�
-     * @param clientName 閰嶇疆key
-     */
-    public void writeToOpcWord(List<ReadWriteEntity> entities, String clientName) throws Exception {
-        MiloProperties.Config config = CustomUtil.getConfig(properties, clientName);
-        List<WriteEntity> writeEntityList = new ArrayList<>();
-        if (!entities.isEmpty()) {
-            for (ReadWriteEntity entity : entities) {
-                writeEntityList.add(WriteEntity.builder()
-                        .identifier(entity.getIdentifier())
-                        .variant(new Variant(Unsigned.ushort((Integer) entity.getValue())))
-                        .build());
-            }
-        }
-        WriteValuesRunner runner = new WriteValuesRunner(writeEntityList);
-        OpcUaClient client = connectPool.borrowObject(config);
-        if (client != null) {
-            try {
-                runner.run(client);
-            } finally {
-                connectPool.returnObject(config, client);
-            }
-        }
-    }
-
-    /**
-     * 璇诲彇kep鐐逛綅鍊�
-     *
-     * @param id 鐐逛綅id
-     * @return
-     */
-    public ReadWriteEntity readFromOpcUa(String id) throws Exception {
-        return readFromOpcUa(id, null);
-    }
-
-    /**
-     * 璇诲彇kep鐐逛綅鍊�
-     *
-     * @param id         鐐逛綅id
-     * @param clientName 閰嶇疆key
-     * @return
-     */
-    public ReadWriteEntity readFromOpcUa(String id, String clientName) throws Exception {
-        List<ReadWriteEntity> entityList = readFromOpcUa(Collections.singletonList(id), clientName);
-        if (!entityList.isEmpty()) {
-            return entityList.get(0);
-        }
-        return null;
-    }
-
-    /**
-     * 璇诲彇kep鐐逛綅鍊�
-     *
-     * @param ids 鐐逛綅id鏁扮粍
-     * @return
-     */
-    public List<ReadWriteEntity> readFromOpcUa(List<String> ids) throws Exception {
-        return readFromOpcUa(ids, null);
-    }
-
-    /**
-     * 璇诲彇kep鐐逛綅鍊�
-     *
-     * @param ids        鐐逛綅id鏁扮粍
-     * @param clientName 閰嶇疆key
-     * @return
-     */
-    public List<ReadWriteEntity> readFromOpcUa(List<String> ids, String clientName) throws Exception {
-        MiloProperties.Config config = CustomUtil.getConfig(properties, clientName);
-        ReadValuesRunner runner = new ReadValuesRunner(ids);
-        OpcUaClient client = connectPool.borrowObject(config);
-        if (client != null) {
-            try {
-                return runner.run(client);
-            } finally {
-                connectPool.returnObject(config, client);
-            }
-        }
-        return new ArrayList<>();
-    }
-
-    /**
-     * 璁㈤槄kep鐐逛綅鍊�
-     *
-     * @param ids 鐐逛綅id鏁扮粍
-     * @return
-     */
-    public void subscriptionFromOpcUa(List<String> ids, SubscriptionCallback callback) throws Exception {
-        subscriptionFromOpcUa(ids, 1000.0, callback);
-    }
-
-    /**
-     * 璁㈤槄kep鐐逛綅鍊�
-     *
-     * @param ids        鐐逛綅id鏁扮粍
-     * @param clientName 閰嶇疆key
-     * @return
-     */
-    public void subscriptionFromOpcUa(List<String> ids, String clientName, SubscriptionCallback callback) throws Exception {
-        subscriptionFromOpcUa(ids, 1000.0, clientName, callback);
-    }
-
-    /**
-     * 璁㈤槄kep鐐逛綅鍊�
-     *
-     * @param ids              鐐逛綅id鏁扮粍
-     * @param samplingInterval 璁㈤槄鏃堕棿闂撮殧 榛樿1000 ms
-     * @return
-     */
-    public void subscriptionFromOpcUa(List<String> ids, double samplingInterval, SubscriptionCallback callback) throws Exception {
-        subscriptionFromOpcUa(ids, samplingInterval, null, callback);
-    }
-
-    /**
-     * 璁㈤槄kep鐐逛綅鍊�
-     *
-     * @param ids              鐐逛綅id鏁扮粍
-     * @param samplingInterval 璁㈤槄鏃堕棿闂撮殧 榛樿1000 ms
-     * @param clientName       閰嶇疆key
-     * @return
-     */
-    public void subscriptionFromOpcUa(List<String> ids, double samplingInterval, String clientName, SubscriptionCallback callback) throws Exception {
-        MiloProperties.Config config = CustomUtil.getConfig(properties, clientName);
-        SubscriptionRunner runner = new SubscriptionRunner(ids, samplingInterval);
-        OpcUaClient client = connectPool.borrowObject(config);
-        if (client != null) {
-            try {
-                runner.run(client, callback);
-            } finally {
-                connectPool.returnObject(config, client);
-            }
-        }
-    }
-
-}
diff --git a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/utils/CustomUtil.java b/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/utils/CustomUtil.java
deleted file mode 100644
index 37df820..0000000
--- a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/utils/CustomUtil.java
+++ /dev/null
@@ -1,114 +0,0 @@
-package com.mes.milo.utils;
-
-import com.google.common.collect.Sets;
-import com.mes.milo.configuration.MiloProperties;
-import com.mes.milo.exception.EndPointNotFoundException;
-import com.mes.milo.exception.IdentityNotFoundException;
-import lombok.extern.slf4j.Slf4j;
-import org.eclipse.milo.opcua.stack.core.types.builtin.NodeId;
-import org.springframework.util.StringUtils;
-
-import java.net.*;
-import java.util.*;
-
-/**
- * @author mes
- * @version 0.0.1
- * @desc
- * @since 2020/4/13
- */
-@Slf4j
-public class CustomUtil {
-
-    private static final String OPC_UA_NOT_CONFIG = "璇烽厤缃甇PC UA鍦板潃淇℃伅";
-
-    private CustomUtil() {
-    }
-
-    public static String getHostname() {
-        try {
-            return InetAddress.getLocalHost().getHostName();
-        } catch (UnknownHostException var1) {
-            return "localhost";
-        }
-    }
-
-    public static Set<String> getHostnames(String address) {
-        return getHostnames(address, true);
-    }
-
-    public static Set<String> getHostnames(String address, boolean includeLoopback) {
-        HashSet<String> hostnames = Sets.newHashSet();
-
-        try {
-            InetAddress inetAddress = InetAddress.getByName(address);
-            if (inetAddress.isAnyLocalAddress()) {
-                try {
-                    Enumeration<NetworkInterface> nis = NetworkInterface.getNetworkInterfaces();
-
-                    for (NetworkInterface ni : Collections.list(nis)) {
-                        Collections.list(ni.getInetAddresses()).forEach((ia) -> {
-                            if (ia instanceof Inet4Address) {
-                                boolean loopback = ia.isLoopbackAddress();
-                                if (!loopback || includeLoopback) {
-                                    hostnames.add(ia.getHostName());
-                                    hostnames.add(ia.getHostAddress());
-                                    hostnames.add(ia.getCanonicalHostName());
-                                }
-                            }
-
-                        });
-                    }
-                } catch (SocketException var7) {
-                    log.warn("Failed to NetworkInterfaces for bind address: {}", address, var7);
-                }
-            } else {
-                boolean loopback = inetAddress.isLoopbackAddress();
-                if (!loopback || includeLoopback) {
-                    hostnames.add(inetAddress.getHostName());
-                    hostnames.add(inetAddress.getHostAddress());
-                    hostnames.add(inetAddress.getCanonicalHostName());
-                }
-            }
-        } catch (UnknownHostException var8) {
-            log.warn("Failed to get InetAddress for bind address: {}", address, var8);
-        }
-
-        return hostnames;
-    }
-
-    public static NodeId parseNodeId(String identifier) {
-        NodeId nodeId = new NodeId(2, identifier);
-        if (identifier.startsWith("ns=") && identifier.contains(";")) {
-            nodeId = NodeId.parseOrNull(identifier);
-        }
-        if (nodeId == null) {
-            throw new IdentityNotFoundException("NodeId 瑙f瀽澶辫触锛岃妫�鏌�");
-        }
-        return nodeId;
-    }
-
-    public static void verifyProperties(MiloProperties properties) {
-        if (properties.getConfig().isEmpty()) {
-            throw new EndPointNotFoundException(OPC_UA_NOT_CONFIG);
-        }
-        if (!StringUtils.hasText(properties.getPrimary())) {
-            Set<String> keySet = properties.getConfig().keySet();
-            properties.setPrimary(keySet.stream().findFirst().orElseThrow(() -> new EndPointNotFoundException(OPC_UA_NOT_CONFIG)));
-        }
-        properties.getConfig().forEach((key, config) -> {
-            if (!StringUtils.hasText(config.getEndpoint())) {
-                throw new EndPointNotFoundException(OPC_UA_NOT_CONFIG + ": " + key);
-            }
-        });
-    }
-
-    public static MiloProperties.Config getConfig(MiloProperties properties) {
-        return getConfig(properties, null);
-    }
-
-    public static MiloProperties.Config getConfig(MiloProperties properties, String clientName) {
-        Map<String, MiloProperties.Config> config = properties.getConfig();
-        return StringUtils.hasText(clientName) ? config.get(clientName) : config.get(properties.getPrimary());
-    }
-}
diff --git a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/utils/KeyStoreLoader.java b/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/utils/KeyStoreLoader.java
deleted file mode 100644
index ad4c6bb..0000000
--- a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/utils/KeyStoreLoader.java
+++ /dev/null
@@ -1,123 +0,0 @@
-package com.mes.milo.utils;
-
-import lombok.extern.slf4j.Slf4j;
-import org.eclipse.milo.opcua.stack.client.security.DefaultClientCertificateValidator;
-import org.eclipse.milo.opcua.stack.core.security.DefaultTrustListManager;
-import org.eclipse.milo.opcua.stack.core.util.SelfSignedCertificateBuilder;
-import org.eclipse.milo.opcua.stack.core.util.SelfSignedCertificateGenerator;
-
-import java.io.File;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.security.*;
-import java.security.cert.X509Certificate;
-import java.util.Arrays;
-import java.util.regex.Pattern;
-
-@Slf4j
-public class KeyStoreLoader {
-
-    private static final Pattern IP_ADDR_PATTERN = Pattern.compile(
-            "^(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])$");
-
-    private static final String CLIENT_ALIAS = "client-ai";
-    private static final char[] PASSWORD = "password".toCharArray();
-
-    private X509Certificate clientCertificate;
-    private X509Certificate[] clientCertificateChain;
-    private KeyPair clientKeyPair;
-    private DefaultClientCertificateValidator certificateValidator;
-
-    public KeyStoreLoader load() throws Exception {
-        Path securityTempDir = Paths.get(System.getProperty("java.io.tmpdir"), "security");
-        Files.createDirectories(securityTempDir);
-        if (!Files.exists(securityTempDir)) {
-            throw new Exception("unable to create security dir: " + securityTempDir);
-        }
-
-        File pkiDir = securityTempDir.resolve("pki").toFile();
-
-        log.info("security temp dir: {}", securityTempDir.toAbsolutePath());
-
-        KeyStore keyStore = KeyStore.getInstance("PKCS12");
-
-        Path serverKeyStore = securityTempDir.resolve("milo-client.pfx");
-
-        DefaultTrustListManager trustListManager = new DefaultTrustListManager(pkiDir);
-
-        certificateValidator = new DefaultClientCertificateValidator(trustListManager);
-
-        log.info("Loading KeyStore at {}", serverKeyStore);
-
-        if (!Files.exists(serverKeyStore)) {
-            keyStore.load(null, PASSWORD);
-
-            KeyPair keyPair = SelfSignedCertificateGenerator.generateRsaKeyPair(2048);
-
-            SelfSignedCertificateBuilder builder = new SelfSignedCertificateBuilder(keyPair)
-                    .setCommonName("Milo Client")
-                    .setOrganization("kangaroohy")
-                    .setOrganizationalUnit("dev")
-                    .setLocalityName("Folsom")
-                    .setStateName("CA")
-                    .setCountryCode("US")
-                    .setApplicationUri("urn:kangaroohy:milo:client")
-                    .addDnsName("localhost")
-                    .addIpAddress("127.0.0.1");
-
-            // Get as many hostnames and IP addresses as we can listed in the certificate.
-            for (String hostname : CustomUtil.getHostnames("0.0.0.0")) {
-                if (IP_ADDR_PATTERN.matcher(hostname).matches()) {
-                    builder.addIpAddress(hostname);
-                } else {
-                    builder.addDnsName(hostname);
-                }
-            }
-
-            X509Certificate certificate = builder.build();
-
-            keyStore.setKeyEntry(CLIENT_ALIAS, keyPair.getPrivate(), PASSWORD, new X509Certificate[]{certificate});
-            try (OutputStream out = Files.newOutputStream(serverKeyStore)) {
-                keyStore.store(out, PASSWORD);
-            }
-        } else {
-            try (InputStream in = Files.newInputStream(serverKeyStore)) {
-                keyStore.load(in, PASSWORD);
-            }
-        }
-
-        Key clientPrivateKey = keyStore.getKey(CLIENT_ALIAS, PASSWORD);
-        if (clientPrivateKey instanceof PrivateKey) {
-            clientCertificate = (X509Certificate) keyStore.getCertificate(CLIENT_ALIAS);
-
-            clientCertificateChain = Arrays.stream(keyStore.getCertificateChain(CLIENT_ALIAS))
-                    .map(X509Certificate.class::cast)
-                    .toArray(X509Certificate[]::new);
-
-            PublicKey clientPublicKey = clientCertificate.getPublicKey();
-            clientKeyPair = new KeyPair(clientPublicKey, (PrivateKey) clientPrivateKey);
-        }
-
-        return this;
-    }
-
-    public X509Certificate getClientCertificate() {
-        return clientCertificate;
-    }
-
-    public X509Certificate[] getClientCertificateChain() {
-        return clientCertificateChain;
-    }
-
-    public DefaultClientCertificateValidator getCertificateValidator() {
-        return certificateValidator;
-    }
-
-    public KeyPair getClientKeyPair() {
-        return clientKeyPair;
-    }
-
-}
diff --git a/hangzhoumesParent/common/opcuaClient/src/main/resources/META-INF/spring.factories b/hangzhoumesParent/common/opcuaClient/src/main/resources/META-INF/spring.factories
deleted file mode 100644
index dfcfa97..0000000
--- a/hangzhoumesParent/common/opcuaClient/src/main/resources/META-INF/spring.factories
+++ /dev/null
@@ -1,3 +0,0 @@
-# Auto Configure
-org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
-  com.mes.milo.configuration.MiloAutoConfiguration
diff --git a/hangzhoumesParent/common/opcuaClient/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/hangzhoumesParent/common/opcuaClient/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
deleted file mode 100644
index eda2fe7..0000000
--- a/hangzhoumesParent/common/opcuaClient/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ /dev/null
@@ -1 +0,0 @@
-com.mes.milo.configuration.MiloAutoConfiguration
\ No newline at end of file
diff --git a/hangzhoumesParent/common/opcuaClient/src/main/resources/application.yml b/hangzhoumesParent/common/opcuaClient/src/main/resources/application.yml
deleted file mode 100644
index 1ea573c..0000000
--- a/hangzhoumesParent/common/opcuaClient/src/main/resources/application.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-mes:
-  milo:
-    primary: default
-    config:
-      default:
-        endpoint: opc.tcp://zidonghua:49320
-        security-policy: basic256sha256
-        username: zsh
-        password: 1qaz2wsx3edc4rfv
\ No newline at end of file
diff --git a/hangzhoumesParent/common/pom.xml b/hangzhoumesParent/common/pom.xml
index affa009..c8bb428 100644
--- a/hangzhoumesParent/common/pom.xml
+++ b/hangzhoumesParent/common/pom.xml
@@ -15,7 +15,6 @@
     <modules>
         <module>servicebase</module>
         <module>springsecurity</module>
-        <module>opcuaClient</module>
     </modules>
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
diff --git a/hangzhoumesParent/common/servicebase/pom.xml b/hangzhoumesParent/common/servicebase/pom.xml
index 0605bf7..4bb9465 100644
--- a/hangzhoumesParent/common/servicebase/pom.xml
+++ b/hangzhoumesParent/common/servicebase/pom.xml
@@ -38,6 +38,13 @@
             <artifactId>sdk-server</artifactId>
             <version>0.6.8</version>
         </dependency>
+        <dependency>
+            <groupId>com.kangaroohy</groupId>
+            <artifactId>milo-spring-boot-starter</artifactId>
+            <version>3.0.6.12</version>
+        </dependency>
+
+
     </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/configuration/MiloAutoConfiguration.java b/hangzhoumesParent/common/servicebase/src/main/java/com/kangaroohy/milo/configuration/MiloAutoConfiguration.java
similarity index 95%
rename from hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/configuration/MiloAutoConfiguration.java
rename to hangzhoumesParent/common/servicebase/src/main/java/com/kangaroohy/milo/configuration/MiloAutoConfiguration.java
index 5e56b39..739b239 100644
--- a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/configuration/MiloAutoConfiguration.java
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/kangaroohy/milo/configuration/MiloAutoConfiguration.java
@@ -1,8 +1,8 @@
-package com.mes.milo.configuration;
+package com.kangaroohy.milo.configuration;
 
-import com.mes.milo.pool.MiloConnectFactory;
-import com.mes.milo.pool.MiloConnectPool;
-import com.mes.milo.service.MiloService;
+import com.kangaroohy.milo.pool.MiloConnectFactory;
+import com.kangaroohy.milo.pool.MiloConnectPool;
+import com.kangaroohy.milo.service.MiloService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.pool2.impl.GenericKeyedObjectPoolConfig;
 import org.eclipse.milo.opcua.sdk.client.OpcUaClient;
diff --git a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/pool/MiloConnectFactory.java b/hangzhoumesParent/common/servicebase/src/main/java/com/kangaroohy/milo/pool/MiloConnectFactory.java
similarity index 95%
rename from hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/pool/MiloConnectFactory.java
rename to hangzhoumesParent/common/servicebase/src/main/java/com/kangaroohy/milo/pool/MiloConnectFactory.java
index f99202a..187eda4 100644
--- a/hangzhoumesParent/common/opcuaClient/src/main/java/com/mes/milo/pool/MiloConnectFactory.java
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/kangaroohy/milo/pool/MiloConnectFactory.java
@@ -1,9 +1,9 @@
-package com.mes.milo.pool;
+package com.kangaroohy.milo.pool;
 
-import com.mes.milo.configuration.MiloProperties;
-import com.mes.milo.exception.EndPointNotFoundException;
-import com.mes.milo.exception.IdentityNotFoundException;
-import com.mes.milo.utils.CustomUtil;
+import com.kangaroohy.milo.configuration.MiloProperties;
+import com.kangaroohy.milo.exception.EndPointNotFoundException;
+import com.kangaroohy.milo.exception.IdentityNotFoundException;
+import com.kangaroohy.milo.utils.CustomUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.pool2.KeyedPooledObjectFactory;
 import org.apache.commons.pool2.PooledObject;
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 6b9a1de..46c9d01 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
@@ -180,4 +180,23 @@
     public static final Integer UNLOAD_GLASS_OUT = 1;
     public static final Integer UNLOAD_GLASS_DOWN = 2;
 
+
+    /**
+     * 鍘熺墖浠撳偍浠诲姟绫诲瀷
+     * 杩涚墖浠诲姟1
+     * 鍑虹墖浠诲姟2
+     */
+    public static final Integer RAW_GLASS_TASK_TYPE_IN = 1;
+    public static final Integer RAW_GLASS_TASK_TYPE_OUT = 2;
+    public static final Integer RAW_GLASS_TASK_TYPE_DISPATCH = 3;
+
+    /**
+     * 鍘熺墖浠撳偍浠诲姟绫诲瀷
+     * 杩涚墖浠诲姟1
+     * 鍑虹墖浠诲姟2
+     */
+    public static final Integer ENGINEERING_NEW = 0;
+    public static final Integer ENGINEERING_RUNNING = 1;
+
+
 }
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
new file mode 100644
index 0000000..8678d22
--- /dev/null
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeHeatDetail.java
@@ -0,0 +1,116 @@
+package com.mes.pp.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class OptimizeHeatDetail implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 宸ョ▼鍙�
+     */
+    private String projectNo;
+
+    /**
+     * 娴佺▼鍗″彿
+     */
+    private String processId;
+
+    /**
+     * 琛ョ墖鐘舵��:琛ョ墖1锛�0闈炶ˉ鐗�;2024.0409鏂板
+     */
+    private Integer patchState;
+
+    /**
+     * 灞�
+     */
+    private Integer layer;
+
+    /**
+     * 璁㈠崟鍐呮帓搴�
+     */
+    private Integer orderSort;
+
+    /**
+     * 鐗堝浘缂栧彿
+     */
+    private Integer layoutId;
+    /**
+     * 鐗堝浘鍐呮帓搴�
+     */
+    private Integer sort;
+    /**
+     * 灏忕墖缂栧彿
+     */
+    private Integer glassId;
+
+    /**
+     * 灏忕墖瀹�
+     */
+    private double width;
+
+    /**
+     * 灏忕墖楂�
+     */
+    private double height;
+    /**
+     * 閰嶇墖瀹�
+     */
+    private double pairWidth;
+    /**
+     * 閰嶇墖楂�
+     */
+    private double pairHeight;
+    /**
+     * x鍧愭爣
+     */
+    private double xAxis;
+
+    /**
+     * y鍧愭爣
+     */
+    private double yAxis;
+
+    /**
+     * 鏃嬭浆瑙掑害锛堥�嗘椂閽堬級
+     */
+    private double rotateAngle;
+    /**
+     * 鍒涘缓浜�
+     */
+    private String creater;
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Data createTime;
+    /**
+     * 淇敼鏃堕棿
+     */
+    private Data updateTime;
+
+    @TableField("intRemark")
+    private Integer intRemark;
+
+    @TableField("strRemark")
+    private String strRemark;
+
+}
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeHeatLayout.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeHeatLayout.java
new file mode 100644
index 0000000..7aa5d3c
--- /dev/null
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeHeatLayout.java
@@ -0,0 +1,70 @@
+package com.mes.pp.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class OptimizeHeatLayout implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 宸ョ▼鍙�
+     */
+    private String projectNo;
+
+    /**
+     * 鐗堝浘Id
+     */
+    private Integer layoutId;
+
+    /**
+     * 鐜荤拑鏁伴噺
+     */
+    private Integer glassQty;
+
+    /**
+     * 鐗堝浘鐜荤拑闈㈢Н
+     */
+    private double glassArea;
+
+    /**
+     * 瑁呰浇鐜�
+     */
+    private double layoutRate;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    private Integer creater;
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+
+    @TableField("intRemark")
+    private Integer intRemark;
+
+    @TableField("strRemark")
+    private String strRemark;
+
+
+}
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/OptimizeHeatDetailMapper.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/OptimizeHeatDetailMapper.java
new file mode 100644
index 0000000..0e7c2ea
--- /dev/null
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/OptimizeHeatDetailMapper.java
@@ -0,0 +1,19 @@
+package com.mes.pp.mapper;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.mes.pp.entity.OptimizeDetail;
+import com.mes.pp.entity.OptimizeHeatDetail;
+
+/**
+ * <p>
+ * Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-16
+ */
+@DS("pp")
+public interface OptimizeHeatDetailMapper extends MPJBaseMapper<OptimizeHeatDetail> {
+
+}
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/OptimizeHeatLayoutMapper.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/OptimizeHeatLayoutMapper.java
new file mode 100644
index 0000000..4a607f4
--- /dev/null
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/OptimizeHeatLayoutMapper.java
@@ -0,0 +1,19 @@
+package com.mes.pp.mapper;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.mes.pp.entity.OptimizeDetail;
+import com.mes.pp.entity.OptimizeHeatLayout;
+
+/**
+ * <p>
+ * Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-16
+ */
+@DS("pp")
+public interface OptimizeHeatLayoutMapper extends MPJBaseMapper<OptimizeHeatLayout> {
+
+}
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
new file mode 100644
index 0000000..838f47b
--- /dev/null
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeHeatDetailService.java
@@ -0,0 +1,17 @@
+package com.mes.pp.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.mes.pp.entity.OptimizeDetail;
+import com.mes.pp.entity.OptimizeHeatDetail;
+
+/**
+ * <p>
+ * 鏈嶅姟绫�
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-16
+ */
+public interface OptimizeHeatDetailService extends MPJBaseService<OptimizeHeatDetail> {
+
+}
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
new file mode 100644
index 0000000..c28833e
--- /dev/null
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeHeatLayoutService.java
@@ -0,0 +1,17 @@
+package com.mes.pp.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.mes.pp.entity.OptimizeDetail;
+import com.mes.pp.entity.OptimizeHeatLayout;
+
+/**
+ * <p>
+ * 鏈嶅姟绫�
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-16
+ */
+public interface OptimizeHeatLayoutService extends MPJBaseService<OptimizeHeatLayout> {
+
+}
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
new file mode 100644
index 0000000..d25905b
--- /dev/null
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeHeatDetailServiceImpl.java
@@ -0,0 +1,25 @@
+package com.mes.pp.service.impl;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.mes.pp.entity.OptimizeDetail;
+import com.mes.pp.entity.OptimizeHeatDetail;
+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;
+
+/**
+ * <p>
+ * 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-16
+ */
+@Service
+@DS("pp")
+public class OptimizeHeatDetailServiceImpl extends MPJBaseServiceImpl<OptimizeHeatDetailMapper, OptimizeHeatDetail> implements OptimizeHeatDetailService {
+
+}
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
new file mode 100644
index 0000000..6764eae
--- /dev/null
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeHeatLayoutServiceImpl.java
@@ -0,0 +1,25 @@
+package com.mes.pp.service.impl;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.mes.pp.entity.OptimizeDetail;
+import com.mes.pp.entity.OptimizeHeatLayout;
+import com.mes.pp.mapper.OptimizeDetailMapper;
+import com.mes.pp.mapper.OptimizeHeatLayoutMapper;
+import com.mes.pp.service.OptimizeDetailService;
+import com.mes.pp.service.OptimizeHeatLayoutService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author zhoush
+ * @since 2024-04-16
+ */
+@Service
+@DS("pp")
+public class OptimizeHeatLayoutServiceImpl extends MPJBaseServiceImpl<OptimizeHeatLayoutMapper, OptimizeHeatLayout> implements OptimizeHeatLayoutService {
+
+}
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..9f32596 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
@@ -2,12 +2,12 @@
 
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.mes.temperingglass.entity.TemperingGlassInfo;
 import com.mes.temperingglass.mapper.TemperingGlassInfoMapper;
 import com.mes.temperingglass.service.TemperingGlassInfoService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.github.yulichang.base.MPJBaseServiceImpl;
 
 import java.util.List;
 
@@ -29,7 +29,7 @@
     public List<TemperingGlassInfo> selectWaitingGlass() {
         //鑾峰彇绛夊緟杩涚倝涓殑鐜荤拑淇℃伅
         QueryWrapper<TemperingGlassInfo> wrapper = new QueryWrapper<>();
-        wrapper.select("Top 1 *").in("state",1,0);
+        wrapper.select("Top 1 *").in("state", 1, 0, -1);
         TemperingGlassInfo glass=temperingMapper.selectOne(wrapper);
         if(glass!=null) {
             QueryWrapper<TemperingGlassInfo> glassinfo = new QueryWrapper<>();
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/uppattenusage/entity/vo/UpPattenUsageVO.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/uppattenusage/entity/vo/UpPattenUsageVO.java
new file mode 100644
index 0000000..eda97c0
--- /dev/null
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/uppattenusage/entity/vo/UpPattenUsageVO.java
@@ -0,0 +1,14 @@
+package com.mes.uppattenusage.entity.vo;
+
+import com.mes.uppattenusage.entity.UpPattenUsage;
+import lombok.Data;
+
+/**
+ * @Author : zhoush
+ * @Date: 2024/10/12 15:43
+ * @Description:
+ */
+@Data
+public class UpPattenUsageVO extends UpPattenUsage {
+    private String groupNumber;
+}
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 154e50d..42e4308 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
@@ -2,7 +2,10 @@
 
 import com.github.yulichang.base.MPJBaseMapper;
 import com.mes.uppattenusage.entity.UpPattenUsage;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.mes.uppattenusage.entity.vo.UpPattenUsageVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -14,4 +17,5 @@
  */
 public interface UpPattenUsageMapper extends MPJBaseMapper<UpPattenUsage> {
 
+    List<UpPattenUsageVO> queryRawGlassByEngineeringId(@Param("engineeringId") String engineerId);
 }
diff --git a/hangzhoumesParent/common/servicebase/src/main/resources/mapper/FlowCardMapper.xml b/hangzhoumesParent/common/servicebase/src/main/resources/mapper/FlowCardMapper.xml
index 40292ce..27d4d64 100644
--- a/hangzhoumesParent/common/servicebase/src/main/resources/mapper/FlowCardMapper.xml
+++ b/hangzhoumesParent/common/servicebase/src/main/resources/mapper/FlowCardMapper.xml
@@ -27,7 +27,7 @@
         on pd.prod_id = od.product_id and pd.glass_sort = ogd.technology_number
         where fc.process_id = #{processId}
         <if test="technologyNumber != 0">
-            and a.layer = #{technologyNumber}
+            and fc.technology_number = #{technologyNumber}
         </if>
         <if test="technologyNumber != 0">
             and position(fc.technology_number in #{technologyNumber})
diff --git a/hangzhoumesParent/common/servicebase/src/main/resources/mapper/UpPattenUsageMapper.xml b/hangzhoumesParent/common/servicebase/src/main/resources/mapper/UpPattenUsageMapper.xml
new file mode 100644
index 0000000..951829c
--- /dev/null
+++ b/hangzhoumesParent/common/servicebase/src/main/resources/mapper/UpPattenUsageMapper.xml
@@ -0,0 +1,32 @@
+<?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.uppattenusage.mapper.UpPattenUsageMapper">
+
+    <resultMap id="baseMap" type="com.mes.uppattenusage.entity.vo.UpPattenUsageVO">
+        <result column="id" property="id"/>
+        <result column="engineering_id" property="engineeringId"/>
+        <result column="films_id" property="filmsId"/>
+        <result column="width" property="width"/>
+        <result column="height" property="height"/>
+        <result column="thickness" property="thickness"/>
+        <result column="layout_sequence" property="layoutSequence"/>
+        <result column="state" property="state"/>
+        <result column="group_number" property="groupNumber"/>
+    </resultMap>
+    <select id="queryRawGlassByEngineeringId" resultType="com.mes.uppattenusage.entity.vo.UpPattenUsageVO">
+        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,
+               @prev_height := height
+        FROM up_patten_usage t
+        where t.engineering_id = #{engineeringId}
+          and t.state = 0
+        ORDER BY t.layout_sequence
+    </select>
+
+
+</mapper>
\ No newline at end of file
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 c1f69a7..3c25501 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
@@ -31,6 +31,12 @@
      * @return
      */
     List<List<Map<String, Object>>> selectCurrentCutTerritory(String current);
+    /**
+     * 鑾峰彇 宸ョ▼涓嬬殑閽㈠寲鐗堝浘
+     * @param current
+     * @return
+     */
+    List<List<Map<String, Object>>> selectTemperingTerritory(String current);
 
     /**
      * 鏌ヨ绗煎唴鐗堝浘宸�艰寖鍥村唴鐨�  姝ゅ昂瀵哥幓鐠�  濡傛棤鍒欐寜鐓� 閽㈠寲鐗堝浘搴忓彿 浠ュ強鐜荤拑搴忓彿
@@ -64,4 +70,12 @@
      * @return
      */
     String edgReportStatus(IdentWornRequest request);
+
+    /**
+     * 杩涚墖  鎵爜ID楠岃瘉閲嶅
+     *
+     * @param glassId
+     * @return
+     */
+    boolean inToVerify(String glassId);
 }
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 67232f0..83e7104 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
@@ -8,7 +8,6 @@
 import com.github.yulichang.query.MPJLambdaQueryWrapper;
 import com.github.yulichang.toolkit.JoinWrappers;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
-import com.mes.common.config.Const;
 import com.mes.damage.entity.Damage;
 import com.mes.damage.mapper.DamageMapper;
 import com.mes.damage.service.DamageService;
@@ -24,9 +23,9 @@
 import com.mes.engineering.mapper.EngineeringMapper;
 import com.mes.glassinfo.entity.GlassInfo;
 import com.mes.glassinfo.mapper.GlassInfoMapper;
-import com.mes.pp.entity.OptimizeDetail;
-import com.mes.pp.entity.OptimizeLayout;
+import com.mes.pp.entity.*;
 import com.mes.pp.mapper.OptimizeDetailMapper;
+import com.mes.pp.mapper.OptimizeHeatDetailMapper;
 import com.mes.taskcache.entity.TaskCache;
 import com.mes.taskcache.service.TaskCacheService;
 import com.mes.uppattenusage.entity.UpPattenUsage;
@@ -62,6 +61,9 @@
 
     @Autowired
     OptimizeDetailMapper optimizeDetailMapper;
+
+    @Autowired
+    OptimizeHeatDetailMapper optimizeHeatDetailMapper;
 
     @Autowired
     EdgStorageCageMapper edgStorageCageMapper;
@@ -299,6 +301,72 @@
     }
 
     /**
+     * 鑾峰彇 宸ョ▼涓嬬殑閽㈠寲鐗堝浘
+     *
+     * @param current
+     * @return
+     */
+    @Override
+    public List<List<Map<String, Object>>> selectTemperingTerritory(String current) {
+        //姝ゅ伐绋嬬殑鎵�鏈変紭鍖栨暟鎹�
+        List<Map<String, Object>> resultCutTerritory=optimizeHeatDetailMapper.selectJoinMaps(JoinWrappers.lambda(OptimizeHeatDetail.class)
+                .selectAll(OptimizeHeatDetail.class)
+                .selectAs(OptimizeProject::getLoadWidth, "olWidth")
+                .selectAs(OptimizeProject::getLoadLength, "olHeight")
+                .leftJoin(OptimizeHeatLayout.class, on -> on
+                        .eq(OptimizeHeatLayout::getProjectNo, OptimizeHeatDetail::getProjectNo)
+                        .eq(OptimizeHeatLayout::getLayoutId, OptimizeHeatDetail::getLayoutId))
+                .leftJoin(OptimizeProject.class, on -> on
+                        .eq(OptimizeProject::getProjectNo, OptimizeHeatLayout::getProjectNo))
+                .eq(OptimizeHeatDetail::getProjectNo, current)
+        );
+
+        Map<String, List<Map<String, Object>>> groupBy = resultCutTerritory.stream().collect(Collectors.groupingBy(item -> item.get("layout_id").toString()));
+//        List<List<Map<String, Object>>> Result=groupBy.values().stream().collect(Collectors.toList());
+        List<List<Map<String, Object>>> result = new ArrayList<>();
+        for (int i = 1; i <= groupBy.keySet().size(); i++) {
+            String key = i + "";
+            if (key != null) {
+                result.add(groupBy.get(key));
+            }
+        }
+        return result;
+    }
+
+    /**
+     * 鑾峰彇 宸ョ▼涓嬬殑閽㈠寲鐗堝浘
+     *
+     * @param current
+     * @return
+     */
+    @Override
+    public List<List<Map<String, Object>>> selectTemperingTerritory(String current) {
+        //姝ゅ伐绋嬬殑鎵�鏈変紭鍖栨暟鎹�
+        List<Map<String, Object>> resultCutTerritory = optimizeHeatDetailMapper.selectJoinMaps(JoinWrappers.lambda(OptimizeHeatDetail.class)
+                .selectAll(OptimizeHeatDetail.class)
+                .selectAs(OptimizeProject::getLoadWidth, "olWidth")
+                .selectAs(OptimizeProject::getLoadLength, "olHeight")
+                .leftJoin(OptimizeHeatLayout.class, on -> on
+                        .eq(OptimizeHeatLayout::getProjectNo, OptimizeHeatDetail::getProjectNo)
+                        .eq(OptimizeHeatLayout::getLayoutId, OptimizeHeatDetail::getLayoutId))
+                .leftJoin(OptimizeProject.class, on -> on
+                        .eq(OptimizeProject::getProjectNo, OptimizeHeatLayout::getProjectNo))
+                .eq(OptimizeHeatDetail::getProjectNo, current)
+        );
+
+        Map<String, List<Map<String, Object>>> groupBy = resultCutTerritory.stream().collect(Collectors.groupingBy(item -> item.get("layout_id").toString()));
+//        List<List<Map<String, Object>>> Result=groupBy.values().stream().collect(Collectors.toList());
+        List<List<Map<String, Object>>> result = new ArrayList<>();
+        for (int i = 1; i <= groupBy.keySet().size(); i++) {
+            String key = i + "";
+            if (key != null) {
+                result.add(groupBy.get(key));
+            }
+        }
+        return result;
+    }
+
+    /**
      * 鏌ヨ绗煎唴鐗堝浘宸�艰寖鍥村唴鐨�  姝ゅ昂瀵哥幓鐠�  濡傛棤鍒欐寜鐓� 閽㈠寲鐗堝浘搴忓彿 浠ュ強鐜荤拑搴忓彿
      *
      * @param glassId
@@ -431,4 +499,30 @@
                 .set(EdgGlassTaskInfo::getStatus, request.getState()).eq(EdgGlassTaskInfo::getGlassId, request.getGlassId()));
         return "success";
     }
+
+    /**
+     * 杩涚墖  鎵爜ID楠岃瘉閲嶅
+     *
+     * @param glassId
+     * @return
+     */
+    @Override
+    public boolean inToVerify(String glassId){
+        List<EdgStorageCageDetails> listEdgStorageCageDetails = baseMapper.selectList(new LambdaQueryWrapper<EdgStorageCageDetails>()
+                .eq(EdgStorageCageDetails::getGlassId, glassId)
+        );
+        if (listEdgStorageCageDetails.isEmpty()) {
+            //璇存槑姝ょ幓鐠冩病鏈夎繘杩囩悊鐗�
+            return true;
+        }else{
+            List<Damage> damage=damageMapper.selectList(new LambdaQueryWrapper<Damage>()
+                    .eq(Damage::getGlassId, glassId)
+                    .and(wrapper->wrapper.eq(Damage::getType, 8).or().eq(Damage::getType, 9))
+            );
+            if(!damage.isEmpty()){
+                return true;
+            }
+        }
+        return false;
+    }
 }
diff --git a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/CacheGlassTask.java b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/CacheGlassTask.java
index e5d34d7..37bfe0d 100644
--- a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/CacheGlassTask.java
+++ b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/CacheGlassTask.java
@@ -80,6 +80,12 @@
     @Value("${mes.max.secondLength}")
     private String secondLength;
 
+    @Value("${mes.cache.cacheWidth}")
+    private double cacheWidth;
+
+    @Value("${mes.cache.cacheHeight}")
+    private double cacheHeight;
+
     @Value("${mes.min.one.firstLength}")
     private String minOneFirstLength;
 
@@ -94,7 +100,7 @@
 
     public static String engineerId = "";
 
-    @Scheduled(fixedDelay = 1000)
+    //@Scheduled(fixedDelay = 1000)
     public void plcHomeEdgTask() {
         Date startDate = new Date();
         log.info("鏈浠诲姟寮�濮嬫墽琛屾椂闂达細{}", startDate);
@@ -124,8 +130,9 @@
             log.info("2銆佽幏鍙栧埌鐨勮姹傚瓧涓嶄负0锛屽皢纭瀛椾笉涓�0锛岀洿鎺ョ粨鏉�");
             return;
         }
-        if ("1".equals(taskRequestTypeValue)) {
-            log.info("2銆佽繘鐗囪姹傦紝涓旂‘璁ゅ瓧涓�0锛屾墽琛岃繘鐗囦换鍔�");
+        boolean result = edgStorageCageDetailsService.inToVerify(glassIdeValue);
+        if ("1".equals(taskRequestTypeValue) && result) {
+            log.info("2銆佽繘鐗囪姹傦紝涓旂‘璁ゅ瓧涓�0锛屾墽琛岃繘鐗囦换鍔�,鎵爜閲嶅ID楠岃瘉銆愭湁閲嶅=false,鏃犻噸澶�=true銆戯細{}", result);
             inTo(glassIdeValue, confirmationWrodAddress, currentSlot);
         } else if ("2".equals(taskRequestTypeValue)) {
             //09绌洪棽 锛�1      10绌洪棽 锛�2        閮界┖闂诧細3    鍏朵粬0
@@ -137,8 +144,8 @@
             //鍔犵瀛愰噷闈㈡槸鍚︽湁鐜荤拑锛屾湁鍏堝嚭锛屾棤鐜荤拑鍏堣繘
             boolean outFlase = outTo(Integer.parseInt(out08Glassstate),
                     Integer.parseInt(out10Glassstate), confirmationWrodAddress, glassIdeValue, Integer.parseInt(currentSlot));
-            log.info("鍑虹墖浠诲姟鏄惁瀹屾垚锛歿},涓旂幓鐠僫d:{}涓嶄负绌哄垯鎵ц杩涚墖浠诲姟", outFlase, glassIdeValue);
-            if (!outFlase && StringUtils.isNotBlank(glassIdeValue)) {
+            log.info("鍑虹墖浠诲姟鏄惁瀹屾垚锛歿},涓旂幓鐠僫d:{}涓嶄负绌哄垯鎵ц杩涚墖浠诲姟,鎵爜閲嶅ID楠岃瘉銆愭湁閲嶅=false,鏃犻噸澶�=true銆戯細{}", outFlase, glassIdeValue, result);
+            if (!outFlase && StringUtils.isNotBlank(glassIdeValue) && result) {
                 inTo(glassIdeValue, confirmationWrodAddress, currentSlot);
             }
         }
@@ -164,9 +171,9 @@
                 Damage damage = new Damage();
                 damage.setGlassId(e.getGlassId());
                 damage.setLine(e.getEndCell());
-                damage.setWorkingProcedure("鍐峰姞宸�");
+                damage.setWorkingProcedure("纾ㄨ竟");
                 damage.setRemark("纾ㄨ竟鍓嶅崸寮忕悊鐗�");
-                damage.setStatus(0);
+                damage.setStatus(1);
                 damage.setType(e.getTaskStatus());
                 return damage;
             }).collect(Collectors.toList());
@@ -186,14 +193,28 @@
      */
     public void inTo(String glassId, String confirmationWrodAddress, String currentSlot) {
         log.info("1銆佹寜鐓х幓鐠僫d:{}鑾峰彇鐜荤拑灏忕墖淇℃伅,褰撳墠鏍煎瓙涓�:{}", glassId, currentSlot);
+
+        GlassInfo feedGlassInfo = glassInfoService.getOne(
+                new LambdaQueryWrapper<GlassInfo>()
+                        .eq(GlassInfo::getGlassId, glassId)
+        );
+        if (Math.max(feedGlassInfo.getWidth(), feedGlassInfo.getHeight()) > cacheWidth || Math.min(feedGlassInfo.getWidth(), feedGlassInfo.getHeight()) > cacheHeight) {
+            log.info("1.1銆佺幓鐠冭秴杩囧崸寮忕悊鐗囨渶澶у昂瀵�:{}", feedGlassInfo);
+            return;
+        }
+
         //娣诲姞杩涚墖浠诲姟  鏌ユ壘绌烘牸
         EdgStorageCage nearestEmpty = edgStorageCageService.selectNearestEmpty(Integer.parseInt(currentSlot), Boolean.FALSE);
         Assert.isTrue(null != nearestEmpty, "鏍煎瓙宸叉弧");
         log.info("2銆佹煡璇㈠崸寮忕悊鐗囩閲岄潰鐨勭┖鏍�:{}", nearestEmpty);
 
-        //鏌ヨ鐜荤拑骞惰繘琛屼氦鎹�
-        GlassInfo glassInfo = queryAndChangeGlass(glassId);
+        //鏌ヨ鐜荤拑淇℃伅
+        GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, glassId));
         if (glassInfo == null) {
+            return;
+        }
+        if ((glassInfo.getWidth() < Double.parseDouble(minTwoFirstLength) && glassInfo.getHeight() < Double.parseDouble(minTwoSecondLength)) || (glassInfo.getWidth() < Double.parseDouble(minTwoSecondLength) && glassInfo.getHeight() < Double.parseDouble(minTwoFirstLength))) {
+            log.info("3銆佺幓鐠冧俊鎭笉绗﹀悎杩涘叆鐞嗙墖绗兼渶灏忓昂瀵革紝鐜荤拑淇℃伅涓簕}", glassInfo);
             return;
         }
         log.info("4銆佸皢鐜荤拑淇℃伅鎻掑叆鍗у紡鐞嗙墖绗�,褰撳墠鐜荤拑淇℃伅:{}", glassInfo);
@@ -219,15 +240,10 @@
      * @param glassId
      * @return
      */
-    public GlassInfo queryAndChangeGlass(String glassId) {
+    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, "鐜荤拑淇℃伅涓嶅瓨鍦�");
-        if ((glassInfo.getWidth() < Double.parseDouble(minTwoFirstLength) && glassInfo.getHeight() < Double.parseDouble(minTwoSecondLength)) || (glassInfo.getWidth() < Double.parseDouble(minTwoSecondLength) && glassInfo.getHeight() < Double.parseDouble(minTwoFirstLength))) {
-            log.info("3銆佺幓鐠冧俊鎭笉绗﹀悎杩涘叆鐞嗙墖绗兼渶灏忓昂瀵革紝鐜荤拑淇℃伅涓簕}", glassInfo);
-            return null;
-        }
-        //鎸夌収鐜荤拑灏哄
+        Assert.isFalse(null == glassInfo, "鐜荤拑淇℃伅涓嶅瓨鍦�");        //鎸夌収鐜荤拑灏哄
         LambdaQueryWrapper<GlassInfo> queryWrapper = new LambdaQueryWrapper<GlassInfo>()
                 .eq(GlassInfo::getWidth, glassInfo.getWidth())
                 .eq(GlassInfo::getHeight, glassInfo.getHeight())
@@ -249,9 +265,41 @@
             glassInfo.setGlassId(swapGlassId);
             glassInfoService.updateById(swapGlassInfo);
             glassInfoService.updateById(glassInfo);
-            return swapGlassInfo;
+            return swapGlassId;
         }
-        return glassInfo;
+        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) {
+            //闇�瑕佹浛鎹㈢殑鐜荤拑涓哄瓨杩涘崸鐞嗭紝浠呴渶鏇存柊褰撳墠闇�瑕佸嚭绗肩殑鐜荤拑淇℃伅鍗冲彲
+            edgStorageCageDetailsService.update(new LambdaUpdateWrapper<EdgStorageCageDetails>()
+                    .eq(EdgStorageCageDetails::getGlassId, glassId).set(EdgStorageCageDetails::getGlassId, swapGlassId));
+        } else {
+            //闇�瑕佹浛鎹㈢殑鐜荤拑閮藉湪鍗х悊鍐咃紝鎸夌収鐜荤拑id瀵硅皟鐜荤拑淇℃伅锛氬璋冪幓鐠僫d鍗冲彲
+            edgStorageCageDetailsService.update(new LambdaUpdateWrapper<EdgStorageCageDetails>()
+                    .eq(EdgStorageCageDetails::getId, glassInfo.getId()).set(EdgStorageCageDetails::getGlassId, swapGlassId));
+            edgStorageCageDetailsService.update(new LambdaUpdateWrapper<EdgStorageCageDetails>()
+                    .eq(EdgStorageCageDetails::getId, swapGlassDetailInfo.getId()).set(EdgStorageCageDetails::getGlassId, glassId));
+        }
     }
 
     /**
@@ -636,7 +684,6 @@
                 details.setSlot(nearestEmpty.getSlot());
                 details.setState(Const.GLASS_STATE_OUT);
                 edgStorageCageDetailsService.save(details);
-
                 boolean taskCacheStatus = saveTaskCache(glassInfo.getGlassId(), nearestEmpty.getSlot(), endcell, Const.GLASS_CACHE_TYPE_THROUGH);
                 log.info("6銆佹坊鍔犲嚭鐗囦换鍔℃槸鍚﹀畬鎴愶細{}", taskCacheStatus);
             } else {
@@ -653,7 +700,153 @@
             log.info("7銆佹坊鍔犲嚭鐗囩幓鐠冨昂瀵镐俊鎭埌纾ㄨ竟鍓嶇幓鐠冭〃鏄惁瀹屾垚锛歿}", glassSizeStatus);
             S7object.getinstance().plccontrol.writeWord(confirmationWrodAddress, 1);
             log.info("8銆佸彂閫佺‘璁ゅ瓧宸插畬鎴�");
-            Damage damage=new Damage();
+            Damage damage = new Damage();
+            damage.setGlassId(glassInfo.getGlassId());
+            damage.setWorkingProcedure("鍒囧壊");
+            damage.setLine(1001);
+            damage.setType(1);
+            damage.setRemark("杩囧崸寮忕悊鐗�");
+            damageService.insertDamage(damage);
+            return Boolean.TRUE;
+        }
+        return Boolean.FALSE;
+    }
+
+    /**
+     * 淇濆瓨鍑虹墖浠诲姟鐩稿叧淇℃伅
+     *
+     * @param glassInfo
+     * @param endcell
+     * @param confirmationWrodAddress
+     * @param glassId
+     * @return
+     */
+    private boolean saveOutGlassMessageBySlot(EdgStorageCageDetails glassInfo, int endcell, String confirmationWrodAddress, String glassId, Integer currentSlot) {
+        if (glassInfo != null) {
+            log.info("4銆佹坊鍔犲嚭鐗囦换鍔★紝鐜荤拑id锛歿}锛屼换鍔$被鍨嬶細{}锛岃捣濮嬩綅缃細{}锛岀粨鏉熶綅缃細{}", glassInfo.getGlassId(),
+                    2, glassInfo.getSlot(), endcell);
+            if (glassInfo.getGlassId().equals(glassId)) {
+                log.info("5銆佺洿閫氫换鍔�,灏嗙幓鐠冧俊鎭彃鍏ュ崸寮忕悊鐗囩,褰撳墠鐜荤拑淇℃伅:{}", glassInfo);
+                EdgStorageCageDetails details = new EdgStorageCageDetails();
+                //鐜荤拑淇℃伅鏇挎崲
+                String glassIdChange = queryAndChangeGlass(glassId);
+                if (StringUtils.isBlank(glassIdChange)) {
+                    BeanUtils.copyProperties(glassInfo, details);
+                } else {
+                    GlassInfo one = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, glassId));
+                    BeanUtils.copyProperties(glassInfo, details);
+                }
+                EdgStorageCage nearestEmpty = edgStorageCageService.selectNearestEmpty(currentSlot, Boolean.TRUE);
+                Assert.isTrue(null != nearestEmpty, "鏍煎瓙宸叉弧,鏃犳硶鎵ц鐩撮�氫换鍔�");
+                log.info("3銆佹煡璇㈠崸寮忕悊鐗囩閲岄潰鐨勭┖鏍�:{}", nearestEmpty);
+                details.setSlot(nearestEmpty.getSlot());
+                details.setState(Const.GLASS_STATE_OUT);
+                edgStorageCageDetailsService.save(details);
+                boolean taskCacheStatus = saveTaskCache(glassInfo.getGlassId(), nearestEmpty.getSlot(), endcell, Const.GLASS_CACHE_TYPE_THROUGH);
+                log.info("6銆佹坊鍔犲嚭鐗囦换鍔℃槸鍚﹀畬鎴愶細{}", taskCacheStatus);
+            } else {
+                log.info("5銆侀潪鐩撮�氫换鍔�,灏嗙幓鐠冧俊鎭彃鍏ュ崸寮忕悊鐗囩,褰撳墠鐜荤拑淇℃伅:{}", glassInfo);
+                if (endcell != currentSlot) {
+                    EdgStorageCageDetails currentGlass = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>()
+                            .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)
+                            .eq(EdgStorageCageDetails::getSlot, currentSlot).eq(EdgStorageCageDetails::getWidth, glassInfo.getWidth())
+                            .eq(EdgStorageCageDetails::getHeight, glassInfo.getHeight()).eq(EdgStorageCageDetails::getThickness, glassInfo.getThickness())
+                    );
+                    if (null != currentGlass) {
+                        glassInfo = currentGlass;
+                        endcell = currentSlot;
+                    }
+                }
+                //鐜荤拑淇℃伅鏇挎崲
+                String glassIdChange = queryAndChangeGlass(glassInfo.getGlassId());
+                //澶勭悊鍦ㄥ崸鐞嗗唴鐨勭幓鐠冧俊鎭細绗煎唴鐨勬暟鎹鐞�
+                queryEdgAndChangeGlass(glassInfo.getGlassId(), glassIdChange);
+                LambdaUpdateWrapper<EdgStorageCageDetails> wrapper = new LambdaUpdateWrapper<>();
+                wrapper.eq(EdgStorageCageDetails::getGlassId, glassInfo.getGlassId()).set(EdgStorageCageDetails::getState, Const.GLASS_STATE_OUT);
+                edgStorageCageDetailsService.update(wrapper);
+                log.info("5銆佹洿鏂板嚭鐗囩幓鐠冪殑鐘舵�佷负{}", Const.GLASS_STATE_OUT);
+
+                boolean taskCacheStatus = saveTaskCache(glassInfo.getGlassId(), glassInfo.getSlot(), endcell, Const.GLASS_CACHE_TYPE_OUT);
+                log.info("6銆佹坊鍔犲嚭鐗囦换鍔℃槸鍚﹀畬鎴愶細{}", taskCacheStatus);
+            }
+            boolean glassSizeStatus = saveGlassSize(glassInfo, endcell);
+            log.info("7銆佹坊鍔犲嚭鐗囩幓鐠冨昂瀵镐俊鎭埌纾ㄨ竟鍓嶇幓鐠冭〃鏄惁瀹屾垚锛歿}", glassSizeStatus);
+            S7object.getinstance().plccontrol.writeWord(confirmationWrodAddress, 1);
+            log.info("8銆佸彂閫佺‘璁ゅ瓧宸插畬鎴�");
+            Damage damage = new Damage();
+            damage.setGlassId(glassInfo.getGlassId());
+            damage.setWorkingProcedure("鍒囧壊");
+            damage.setLine(1001);
+            damage.setType(1);
+            damage.setRemark("杩囧崸寮忕悊鐗�");
+            damageService.insertDamage(damage);
+            return Boolean.TRUE;
+        }
+        return Boolean.FALSE;
+    }
+
+    /**
+     * 淇濆瓨鍑虹墖浠诲姟鐩稿叧淇℃伅
+     *
+     * @param glassInfo
+     * @param endcell
+     * @param confirmationWrodAddress
+     * @param glassId
+     * @return
+     */
+    private boolean saveOutGlassMessageBySlot(EdgStorageCageDetails glassInfo, int endcell, String confirmationWrodAddress, String glassId, Integer currentSlot) {
+        if (glassInfo != null) {
+            log.info("4銆佹坊鍔犲嚭鐗囦换鍔★紝鐜荤拑id锛歿}锛屼换鍔$被鍨嬶細{}锛岃捣濮嬩綅缃細{}锛岀粨鏉熶綅缃細{}", glassInfo.getGlassId(),
+                    2, glassInfo.getSlot(), endcell);
+            if (glassInfo.getGlassId().equals(glassId)) {
+                log.info("5銆佺洿閫氫换鍔�,灏嗙幓鐠冧俊鎭彃鍏ュ崸寮忕悊鐗囩,褰撳墠鐜荤拑淇℃伅:{}", glassInfo);
+                EdgStorageCageDetails details = new EdgStorageCageDetails();
+                //鐜荤拑淇℃伅鏇挎崲
+                String glassIdChange = queryAndChangeGlass(glassId);
+                if (StringUtils.isBlank(glassIdChange)) {
+                    BeanUtils.copyProperties(glassInfo, details);
+                } else {
+                    GlassInfo one = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, glassId));
+                    BeanUtils.copyProperties(glassInfo, details);
+                }
+                EdgStorageCage nearestEmpty = edgStorageCageService.selectNearestEmpty(currentSlot, Boolean.TRUE);
+                Assert.isTrue(null != nearestEmpty, "鏍煎瓙宸叉弧,鏃犳硶鎵ц鐩撮�氫换鍔�");
+                log.info("3銆佹煡璇㈠崸寮忕悊鐗囩閲岄潰鐨勭┖鏍�:{}", nearestEmpty);
+                details.setSlot(nearestEmpty.getSlot());
+                details.setState(Const.GLASS_STATE_OUT);
+                edgStorageCageDetailsService.save(details);
+                boolean taskCacheStatus = saveTaskCache(glassInfo.getGlassId(), nearestEmpty.getSlot(), endcell, Const.GLASS_CACHE_TYPE_THROUGH);
+                log.info("6銆佹坊鍔犲嚭鐗囦换鍔℃槸鍚﹀畬鎴愶細{}", taskCacheStatus);
+            } else {
+                log.info("5銆侀潪鐩撮�氫换鍔�,灏嗙幓鐠冧俊鎭彃鍏ュ崸寮忕悊鐗囩,褰撳墠鐜荤拑淇℃伅:{}", glassInfo);
+                if (endcell != currentSlot) {
+                    EdgStorageCageDetails currentGlass = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>()
+                            .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)
+                            .eq(EdgStorageCageDetails::getSlot, currentSlot).eq(EdgStorageCageDetails::getWidth, glassInfo.getWidth())
+                            .eq(EdgStorageCageDetails::getHeight, glassInfo.getHeight()).eq(EdgStorageCageDetails::getThickness, glassInfo.getThickness())
+                    );
+                    if (null != currentGlass) {
+                        glassInfo = currentGlass;
+                        endcell = currentSlot;
+                    }
+                }
+                //鐜荤拑淇℃伅鏇挎崲
+                String glassIdChange = queryAndChangeGlass(glassInfo.getGlassId());
+                //澶勭悊鍦ㄥ崸鐞嗗唴鐨勭幓鐠冧俊鎭細绗煎唴鐨勬暟鎹鐞�
+                queryEdgAndChangeGlass(glassInfo.getGlassId(), glassIdChange);
+                LambdaUpdateWrapper<EdgStorageCageDetails> wrapper = new LambdaUpdateWrapper<>();
+                wrapper.eq(EdgStorageCageDetails::getGlassId, glassInfo.getGlassId()).set(EdgStorageCageDetails::getState, Const.GLASS_STATE_OUT);
+                edgStorageCageDetailsService.update(wrapper);
+                log.info("5銆佹洿鏂板嚭鐗囩幓鐠冪殑鐘舵�佷负{}", Const.GLASS_STATE_OUT);
+
+                boolean taskCacheStatus = saveTaskCache(glassInfo.getGlassId(), glassInfo.getSlot(), endcell, Const.GLASS_CACHE_TYPE_OUT);
+                log.info("6銆佹坊鍔犲嚭鐗囦换鍔℃槸鍚﹀畬鎴愶細{}", taskCacheStatus);
+            }
+            boolean glassSizeStatus = saveGlassSize(glassInfo, endcell);
+            log.info("7銆佹坊鍔犲嚭鐗囩幓鐠冨昂瀵镐俊鎭埌纾ㄨ竟鍓嶇幓鐠冭〃鏄惁瀹屾垚锛歿}", glassSizeStatus);
+            S7object.getinstance().plccontrol.writeWord(confirmationWrodAddress, 1);
+            log.info("8銆佸彂閫佺‘璁ゅ瓧宸插畬鎴�");
+            Damage damage = new Damage();
             damage.setGlassId(glassInfo.getGlassId());
             damage.setWorkingProcedure("鍒囧壊");
             damage.setLine(1001);
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 47b2fd0..165ff7f 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,7 +1,5 @@
 package com.mes.job;
 
-import com.mes.milo.runner.subscription.SubscriptionCallback;
-import com.mes.milo.service.MiloService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -18,14 +16,14 @@
 @Slf4j
 public class OpcCacheGlassTask {
 
-    @Autowired
-    MiloService miloService;
-
-    @Autowired
-    SubscriptionCallback cacheGlassSubscriptionCallback;
-
-    @Scheduled(fixedDelay = Long.MAX_VALUE)
-    public void startOpcTask() throws Exception {
-        miloService.subscriptionFromOpcUa(Arrays.asList("my.device.x1", "my.device.x2"), cacheGlassSubscriptionCallback);
-    }
+//    @Autowired
+//    MiloService miloService;
+//
+//    @Autowired
+//    SubscriptionCallback cacheGlassSubscriptionCallback;
+//
+//    @Scheduled(fixedDelay = Long.MAX_VALUE)
+//    public void startOpcTask() throws Exception {
+//        miloService.subscriptionFromOpcUa(Arrays.asList("my.device.x1", "my.device.x2"), cacheGlassSubscriptionCallback);
+//    }
 }
diff --git a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opccallback/CacheGlassSubscriptionCallback.java b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opccallback/CacheGlassSubscriptionCallback.java
index eaf7695..c736d4b 100644
--- a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opccallback/CacheGlassSubscriptionCallback.java
+++ b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opccallback/CacheGlassSubscriptionCallback.java
@@ -1,8 +1,5 @@
 package com.mes.opccallback;
 
-import com.mes.milo.model.ReadWriteEntity;
-import com.mes.milo.runner.subscription.SubscriptionCallback;
-import com.mes.milo.service.MiloService;
 import lombok.extern.slf4j.Slf4j;
 import org.eclipse.milo.opcua.sdk.client.subscriptions.ManagedDataItem;
 import org.eclipse.milo.opcua.stack.core.types.builtin.DataValue;
@@ -16,20 +13,20 @@
  */
 @Service
 @Slf4j
-public class CacheGlassSubscriptionCallback implements SubscriptionCallback {
+public class CacheGlassSubscriptionCallback  {
 
-    @Autowired
-    MiloService miloService;
-
-    @Override
-    public void onSubscribe(ManagedDataItem dataItem, DataValue value) {
-        try {
-            log.info("{}___________{}" + dataItem, value);
-            ReadWriteEntity readWriteEntity = miloService.readFromOpcUa("my.device.x1");
-            log.info("{}___________{}" + readWriteEntity);
-        } catch (Exception e) {
-
-        }
-
-    }
+//    @Autowired
+//    MiloService miloService;
+//
+//    @Override
+//    public void onSubscribe(ManagedDataItem dataItem, DataValue value) {
+//        try {
+//            log.info("{}___________{}" + dataItem, value);
+//            ReadWriteEntity readWriteEntity = miloService.readFromOpcUa("my.device.x1");
+//            log.info("{}___________{}" + readWriteEntity);
+//        } catch (Exception e) {
+//
+//        }
+//
+//    }
 }
diff --git a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/taskcache/controller/TaskCacheController.java b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/taskcache/controller/TaskCacheController.java
index 850789e..a5a966a 100644
--- a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/taskcache/controller/TaskCacheController.java
+++ b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/taskcache/controller/TaskCacheController.java
@@ -32,6 +32,14 @@
     @Autowired
     private TaskCacheService taskCacheService;
 
+    @ApiOperation("鏌ヨ閽㈠寲鐗堝浘淇℃伅-鏍规嵁 宸ョ▼鍙�   鍙傛暟(宸ョ▼鍙�)")
+    @PostMapping("/temperingTerritory")
+    @ResponseBody
+    public Result temperingTerritory(String current) {
+        List<List<Map<String, Object>>> h = edgStorageCageDetailsService.selectTemperingTerritory(current);
+        return Result.build(200, "鎴愬姛", h);
+    }
+
     @ApiOperation("鏌ヨ鍒囧壊鐗堝浘淇℃伅-鏍规嵁 宸ョ▼鍙�   鍙傛暟(宸ョ▼鍙�)")
     @PostMapping("/cutTerritory")
     @ResponseBody
diff --git a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/application.yml b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/application.yml
index eaa6417..276d6b9 100644
--- a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/application.yml
+++ b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/application.yml
@@ -3,7 +3,7 @@
 
 spring:
   profiles:
-    active: dev
+    active: cz
   application:
     name: cacheGlass
   liquibase:
@@ -15,6 +15,9 @@
 mes:
   threshold: 3
   ratio: 10
+  cache: # 鍗у紡鐞嗙墖鏈�澶у昂瀵�
+    cacheWidth: 4000
+    cacheHeight:3000
   max: # 绗簩鏉$嚎鐨勬渶澶у昂瀵镐俊鎭�
     firstLength: 3500
     secondLength: 2500
diff --git a/hangzhoumesParent/moduleService/CacheGlassModule/src/test/java/com/mes/CacheGlassModuleApplicationTest.java b/hangzhoumesParent/moduleService/CacheGlassModule/src/test/java/com/mes/CacheGlassModuleApplicationTest.java
index ad5430b..93f0fda 100644
--- a/hangzhoumesParent/moduleService/CacheGlassModule/src/test/java/com/mes/CacheGlassModuleApplicationTest.java
+++ b/hangzhoumesParent/moduleService/CacheGlassModule/src/test/java/com/mes/CacheGlassModuleApplicationTest.java
@@ -143,6 +143,12 @@
     }
 
     @Test
+    public void testEngineerTerritory() {
+        List<List<Map<String, Object>>> map = edgStorageCageDetailsService.selectTemperingTerritory("P24052203");
+        log.info("閽㈠寲宸ョ▼鐗堝浘淇℃伅锛歿}", Arrays.asList(map));
+    }
+
+    @Test
     public void testidentWorn() {
         Map<String, Object> arguments=new HashMap<>();
         arguments.put("glassId","NG24051802A002-1-4-2-4");//鐜荤拑ID
@@ -152,6 +158,11 @@
 //        edgStorageCageDetailsService.identWorn(arguments);
         log.info("璇嗗埆鍙般�愮牬鎹�/鎷胯蛋銆戯細{}", 1);
     }
+    @Test
+    public void testInToVerify() {
+        boolean result=edgStorageCageDetailsService.inToVerify("P24060405|30|1");
+        log.info("鏄惁瀛樺湪閲嶅ID 銆嬪厑璁歌繘鐗囷細{}", result);
+    }
 
     @Test
     public void testPpOptimizeDetail() {
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/controller/BigStorageCageDetailsController.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/controller/BigStorageCageDetailsController.java
index 3b73c7e..ee8546b 100644
--- a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/controller/BigStorageCageDetailsController.java
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/controller/BigStorageCageDetailsController.java
@@ -3,7 +3,6 @@
 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.conditions.update.UpdateWrapper;
 import com.mes.bigstorage.entity.BigStorageCageDetails;
 import com.mes.bigstorage.service.BigStorageCageDetailsService;
 import com.mes.bigstorage.service.BigStorageCageService;
@@ -92,7 +91,8 @@
     @ApiOperation("鎸囧畾閽㈠寲")
     @PostMapping("/TemperingGlass")
     public Result temperingGlass(@RequestBody BigStorageCageDetails bigStorageCageDetails) {
-        boolean result = bigStorageCageDetailsService.temperingGlass(bigStorageCageDetails.getTemperingLayoutId().toString(), bigStorageCageDetails.getEngineerId());
+        boolean result = bigStorageCageDetailsService
+                .temperingGlass(bigStorageCageDetails.getTemperingLayoutId().toString(), bigStorageCageDetails.getEngineerId(), bigStorageCageDetails.getTemperingFeedSequence().toString());
         if (result == true) {
             return Result.build(200, "鎸囧畾閽㈠寲鎴愬姛", 1);
         } else {
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/BigStorageCageDetailsService.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/BigStorageCageDetailsService.java
index 8703694..8daa7b7 100644
--- a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/BigStorageCageDetailsService.java
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/BigStorageCageDetailsService.java
@@ -69,7 +69,7 @@
      */
     List<SlotSequenceDTO> queryGlassMaxAndMin(String engineerId, Integer temperingLayoutId);
 
-    boolean temperingGlass(String temperingLayoutId, String engineerId);
+    boolean temperingGlass(String temperingLayoutId, String engineerId, String temperingFeedSequence);
 
     List<Map<String, Object>> selectTemperingGlass();
 
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java
index 8a73f9e..1ddb267 100644
--- a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java
@@ -2,7 +2,6 @@
 
 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.toolkit.CollectionUtils;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.toolkit.JoinWrappers;
@@ -27,6 +26,7 @@
 import com.mes.glassinfo.entity.GlassInfo;
 import com.mes.glassinfo.mapper.GlassInfoMapper;
 import com.mes.glassinfo.service.GlassInfoService;
+import com.mes.job.PlcStorageCageTask;
 import com.mes.temperingglass.entity.TemperingGlassInfo;
 import com.mes.temperingglass.mapper.TemperingGlassInfoMapper;
 import com.mes.temperingglass.service.TemperingGlassInfoService;
@@ -70,6 +70,9 @@
 
     @Resource
     private TemperingGlassInfoService temperingGlassInfoService;
+
+    @Resource
+    private PlcStorageCageTask plcStorageCageTask;
 
     @Resource
     private DamageService damageService;
@@ -188,7 +191,7 @@
         LambdaQueryWrapper<BigStorageCageDetails> bigStorageCageDetailsWrapper = new LambdaQueryWrapper<>();
         bigStorageCageDetailsWrapper
                 .eq(BigStorageCageDetails::getGlassId, glassId)
-                .eq(BigStorageCageDetails::getState,Const.GLASS_STATE_IN);
+                .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN);
         BigStorageCageDetails bigStorageCageDetails = baseMapper.selectOne(bigStorageCageDetailsWrapper);
 
         if (temperingGlassInfo != null) {
@@ -221,7 +224,7 @@
     @Override
     public List<BigStorageCageDetails> selectBigStorageCageDetails(String glassId) {
         LambdaQueryWrapper<GlassInfo> glassInfoWrapper = new LambdaQueryWrapper<>();
-        List<BigStorageCageDetails> bigStorageCageDetailsList=new ArrayList<>();
+        List<BigStorageCageDetails> bigStorageCageDetailsList = new ArrayList<>();
         glassInfoWrapper.eq(GlassInfo::getGlassId, glassId);
         GlassInfo glassInfo = glassInfoMapper.selectOne(glassInfoWrapper);
         BigStorageCageDetails bigStorageCageDetails = new BigStorageCageDetails();
@@ -276,8 +279,8 @@
                 .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::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);
@@ -363,7 +366,7 @@
     }
 
     @Override
-    public boolean temperingGlass(String temperingLayoutId, String engineerId) {
+    public boolean temperingGlass(String temperingLayoutId, String engineerId, String temperingFeedSequence) {
         LambdaQueryWrapper<TemperingGlassInfo> temperingGlassInfoLambdaQueryWrapper = new LambdaQueryWrapper<>();
         temperingGlassInfoLambdaQueryWrapper
                 .eq(TemperingGlassInfo::getState, Const.TEMPERING_NEW);
@@ -380,7 +383,13 @@
                     .in(BigStorageCageDetails::getState, Const.GLASS_STATE_IN)
                     .orderBy(Boolean.TRUE, sequenceOrder, GlassInfo::getTemperingFeedSequence));
             if (CollectionUtils.isNotEmpty(temperingGlassInfos)) {
-                temperingGlassInfoService.saveBatch(temperingGlassInfos);
+                if ("0".equals(temperingFeedSequence)) {
+                    if (CollectionUtils.isNotEmpty(temperingGlassInfos)) {
+                        plcStorageCageTask.computeOutMoreGlassInfo(temperingGlassInfos, Boolean.FALSE, "");
+                    }
+                } else {
+                    temperingGlassInfoService.saveBatch(temperingGlassInfos);
+                }
                 return true;
             }
         }
@@ -406,7 +415,7 @@
     }
 
     @Override
-    public void appointEngineerId(String engineerId){
+    public void appointEngineerId(String engineerId) {
         redisUtil.setCacheObject("temperingengineerId", engineerId);
     }
 }
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcStorageCageTask.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcStorageCageTask.java
index d0f2fe9..9937f03 100644
--- a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcStorageCageTask.java
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcStorageCageTask.java
@@ -575,30 +575,53 @@
      * 纭瀛楁竻绌�
      */
 //    @Scheduled(fixedDelay = 300)
+//    public void confirmClear() {
+//        PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject;
+//        String d01ToMES = plcParameterObject.getPlcParameter("D01ToMES").getValue();
+//        String d04ToMES = plcParameterObject.getPlcParameter("D04ToMES").getValue();
+//        String mesD01Address = plcParameterObject.getPlcParameter("MESToD01").getAddress();
+//        String mesD04Address = plcParameterObject.getPlcParameter("MESToD04").getAddress();
+//        String d03ToMES = plcParameterObject.getPlcParameter("D03ToMES").getValue();
+//        String d05ToMES = plcParameterObject.getPlcParameter("D05ToMES").getValue();
+//        String mesD03Address = plcParameterObject.getPlcParameter("MESToD03").getAddress();
+//        String mesD05Address = plcParameterObject.getPlcParameter("MESToD05").getAddress();
+//        if(!REQUEST_WORD.equals(d01ToMES)){
+//            S7object.getinstance().plccontrol.writeWord(mesD01Address, 0);
+//        }
+//        if(!REQUEST_WORD.equals(d04ToMES)){
+//            S7object.getinstance().plccontrol.writeWord(mesD04Address, 0);
+//        }
+//        if (!REQUEST_WORD.equals(d03ToMES)) {
+//            S7object.getinstance().plccontrol.writeWord(mesD03Address, 0);
+//        }
+//        if (!REQUEST_WORD.equals(d05ToMES)) {
+//            S7object.getinstance().plccontrol.writeWord(mesD05Address, 0);
+//        }
+//    }
     /**
      * 杩涚墖鐘舵�佷慨鏀�
      */
 //    @Scheduled(fixedDelay = 300)
-    public void feedStatusUpdate() {
-        List<String> glassIds1=null;
-        List<String> glassIds2=null;
-        List<BigStorageCageFeedTask> bigStorageCageFeedTasks1=bigStorageCageFeedTaskService.list(
-                new LambdaQueryWrapper<BigStorageCageFeedTask>()
-                .eq(BigStorageCageFeedTask::getTaskState,1)
-                .eq(BigStorageCageFeedTask::getLine,Const.ARTIFICIAL_OUT_TARGET_POSITION)
-        );
-        List<BigStorageCageFeedTask> bigStorageCageFeedTasks2=bigStorageCageFeedTaskService.list(
-                new LambdaQueryWrapper<BigStorageCageFeedTask>()
-                        .eq(BigStorageCageFeedTask::getTaskState,1)
-                        .eq(BigStorageCageFeedTask::getLine,Const.TEMPERING_OUT_TARGET_POSITION)
-        );
-//        if(CollectionUtils.isNotEmpty(bigStorageCageFeedTasks1)){
-//
-//        }
-//        if(CollectionUtils.isNotEmpty(bigStorageCageFeedTasks1)){
-//
-//        }
-    }
+//    public void feedStatusUpdate() {
+//        List<String> glassIds1=null;
+//        List<String> glassIds2=null;
+//        List<BigStorageCageFeedTask> bigStorageCageFeedTasks1=bigStorageCageFeedTaskService.list(
+//                new LambdaQueryWrapper<BigStorageCageFeedTask>()
+//                .eq(BigStorageCageFeedTask::getTaskState,1)
+//                .eq(BigStorageCageFeedTask::getLine,Const.ARTIFICIAL_OUT_TARGET_POSITION)
+//        );
+//        List<BigStorageCageFeedTask> bigStorageCageFeedTasks2=bigStorageCageFeedTaskService.list(
+//                new LambdaQueryWrapper<BigStorageCageFeedTask>()
+//                        .eq(BigStorageCageFeedTask::getTaskState,1)
+//                        .eq(BigStorageCageFeedTask::getLine,Const.TEMPERING_OUT_TARGET_POSITION)
+//        );
+////        if(CollectionUtils.isNotEmpty(bigStorageCageFeedTasks1)){
+////
+////        }
+////        if(CollectionUtils.isNotEmpty(bigStorageCageFeedTasks1)){
+////
+////        }
+//    }
 
     /**
      * 鎸夌収鐜荤拑id鍒ゆ柇鐜荤拑鐘舵�佸強鍗ц浆绔嬫槸鍚﹀彲鐩存帴鍚姩
@@ -623,8 +646,8 @@
                 );
                 EdgGlassTaskInfo edgGlassTaskInfo = new EdgGlassTaskInfo();
                 BeanUtils.copyProperties(glassInfo, edgGlassTaskInfo);
-                edgGlassTaskInfo.setWidth((int)glassInfo.getWidth());
-                edgGlassTaskInfo.setHeight((int)glassInfo.getHeight());
+                edgGlassTaskInfo.setWidth((int) glassInfo.getWidth());
+                edgGlassTaskInfo.setHeight((int) glassInfo.getHeight());
                 edgGlassTaskInfoList.add(edgGlassTaskInfo);
                 log.info("鍦ㄧ幓鐠冧俊鎭〃涓幏鍙栫幓鐠冧俊鎭瘂}", edgGlassTaskInfoList);
             }
diff --git a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/test/java/com/mes/CacheVerticalGlassModuleApplicationTest.java b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/test/java/com/mes/CacheVerticalGlassModuleApplicationTest.java
index dd93257..5ada9b0 100644
--- a/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/test/java/com/mes/CacheVerticalGlassModuleApplicationTest.java
+++ b/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/test/java/com/mes/CacheVerticalGlassModuleApplicationTest.java
@@ -2,13 +2,11 @@
 
 import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.mes.bigstorage.entity.BigStorageCage;
 import com.mes.bigstorage.service.BigStorageCageDetailsService;
 import com.mes.bigstorage.service.BigStorageCageService;
-import com.mes.bigstoragetask.mapper.BigStorageCageFeedTaskMapper;
 import com.mes.common.config.Const;
 import com.mes.damage.entity.Damage;
 import com.mes.damage.service.DamageService;
@@ -17,7 +15,6 @@
 import com.mes.job.PlcStorageCageTask;
 import com.mes.pp.entity.ReportingWork;
 import com.mes.pp.entity.ReportingWorkDetail;
-import com.mes.temperingglass.entity.TemperingGlassInfo;
 import lombok.extern.slf4j.Slf4j;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -32,7 +29,9 @@
 import java.net.URL;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 /**
  * @Author : zhoush
@@ -173,7 +172,7 @@
         Damage damage=new Damage();
         damage.setGlassId("P24060403|3|6");
         damage.setLine(2001);
-        damage.setWorkingProcedure("鍐峰姞宸�");
+        damage.setWorkingProcedure("纾ㄨ竟");
         damage.setRemark("");
         damage.setStatus(2);
         damageService.insertDamage(damage);
diff --git a/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/job/RawGlassPushMessage.java b/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/job/RawGlassPushMessage.java
index a06a933..a3c0e25 100644
--- a/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/job/RawGlassPushMessage.java
+++ b/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/job/RawGlassPushMessage.java
@@ -2,10 +2,7 @@
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.json.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.Wrapper;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.mes.rawglassdetails.entity.RawGlassStorageDetails;
-import com.mes.rawglassdetails.service.RawGlassStorageDetailsService;
 import com.mes.rawglassstation.service.RawGlassStorageStationService;
 import com.mes.rawglasstask.entity.RawGlassStorageTask;
 import com.mes.rawglasstask.service.RawGlassStorageTaskService;
@@ -16,7 +13,6 @@
 
 import javax.annotation.Resource;
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * @author wangfei
@@ -25,56 +21,26 @@
 @Component
 public class RawGlassPushMessage {
 
-  @Resource private RawGlassStorageStationService rawGlassStorageStationService;
+    @Resource
+    private RawGlassStorageStationService rawGlassStorageStationService;
 
-  @Resource private RawGlassStorageTaskService rawGlassStorageTaskService;
+    @Resource
+    private RawGlassStorageTaskService rawGlassStorageTaskService;
 
-  @Resource private RawGlassStorageDetailsService rawGlassStorageDetailsService;
-
-  @Scheduled(fixedDelay = 2000)
-  public void sendRawGlassMessage() {
-    log.info("鍙戦�佷换鍔′俊鎭拰鏋跺瓙淇℃伅");
-    JSONObject jsonObject = new JSONObject();
-    List<RawGlassStorageDetails> rawStationDetailsList =
-        rawGlassStorageStationService.listRawGlassDetails();
-    List<RawGlassStorageTask> tasks = rawGlassStorageTaskService.listRawGlassTask();
-    jsonObject.append("rawStationDetailsList", rawStationDetailsList);
-    jsonObject.append("tasks", tasks);
-//    log.info("鑾峰彇鍒扮殑宸ヤ綅璇︽儏鍙婁换鍔′俊鎭负锛歿}", jsonObject);
-
-    List<WebSocketServer> sendwServer = WebSocketServer.sessionMap.get("rawGlass");
-    if (CollectionUtil.isNotEmpty(sendwServer)) {
-      sendwServer.stream().forEach(e->{
-        e.sendMessage(String.valueOf(jsonObject));
-      });
+    @Scheduled(fixedDelay = 2000)
+    public void sendRawGlassMessage() {
+        log.info("鍙戦�佷换鍔′俊鎭拰鏋跺瓙淇℃伅");
+        JSONObject jsonObject = new JSONObject();
+        List<RawGlassStorageDetails> rawStationDetailsList =
+                rawGlassStorageStationService.listRawGlassDetails();
+        List<RawGlassStorageTask> tasks = rawGlassStorageTaskService.listRawGlassTask();
+        jsonObject.append("rawStationDetailsList", rawStationDetailsList);
+        jsonObject.append("tasks", tasks);
+        List<WebSocketServer> sendwServer = WebSocketServer.sessionMap.get("rawGlass");
+        if (CollectionUtil.isNotEmpty(sendwServer)) {
+            sendwServer.stream().forEach(e -> {
+                e.sendMessage(String.valueOf(jsonObject));
+            });
+        }
     }
-  }
-
-  /** todo:鍏ュ簱浠诲姟锛氬悐瑁呬綅鏈夌幓鐠冿紝鍏堝幓宸ヤ綅琛ㄦ煡璇㈢┖鏍煎瓙锛岀敓鎴愬叆搴撲换鍔′粠鍚婅浣嶅埌鐩爣鏍煎瓙 */
-//  @Scheduled(fixedDelay = 1000)
-//  public void sendRawGlassMessage() {
-////    List<RawGlassStorageDetails> rawGlassStorageDetailsList = rawGlassStorageDetailsService.List(new RawGlassStorageDetails())
-//    Wrapper<RawGlassStorageDetails> queryWrapper = null;
-//    List<RawGlassStorageDetails> detailsList = rawGlassStorageDetailsService.list(null);
-//    queryWrapper.eq(RawGlassStorageDetails::getState, 100);
-//  if(detailsList.size() >0){
-//    //鏌ユ壘鏍煎瓙琛╠etails绌烘牸瀛�
-//    List<String> slotIds = detailsList.stream()
-//            .map(RawGlassStorageDetails::getSlotId)
-//            .collect(Collectors.toList());
-//    list(new LambdaQueryWrapper<RawGlassStorageTask>()
-//            .in(CollectionUtil.isNotEmpty(request.getState()), RawGlassStorageTask::getState, request.getState())
-//            .in(CollectionUtil.isNotEmpty(request.getSlotId()), RawGlassStorageTask::getSlotId, request.getSlotId())
-//            .orderByDesc(RawGlassStorageTask::getCreateTime));
-//  }if(slotIds.size()>0){
-//      //鐢熸垚鍏ュ簱浠诲姟
-//    }
-//
-//  }
-
-
-
-  /** todo:鍑哄簱浠诲姟锛�1銆佺偣鍑哄簱锛岀珛椹敓鎴愬嚭鐗囦换鍔� 2銆佺偣鍑哄簱淇敼宸ヤ綅璇︽儏鍐呯殑鐘舵�佷负寰呭嚭搴擄紝瀹氭椂浠诲姟鎵弿鐢熸垚鍑哄簱浠诲姟 */
-
-  /** todo:鍘熺墖璋冨害锛�1銆佹煡璇㈠伐绋嬪師鐗囪〃锛屾寜鐓ч『搴忓皢鍘熺墖鏀惧叆涓婄墖1鍙蜂綅锛屽悗缁師鐗囨斁涓婄墖2鍙蜂綅锛屽嚭鐜板昂瀵告浛鎹紝鍒ゆ柇鍘熶笂鐗囦綅鏄惁鏈夌幓鐠冿紝鏈� 鍏堝嚭鍚庤繘锛屾棤 鐩存帴杩涚墖 */
 }
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
new file mode 100644
index 0000000..54d2030
--- /dev/null
+++ b/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/job/RawGlassTask.java
@@ -0,0 +1,235 @@
+package com.mes.job;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.kangaroohy.milo.model.ReadWriteEntity;
+import com.kangaroohy.milo.service.MiloService;
+import com.mes.common.config.Const;
+import com.mes.engineering.entity.Engineering;
+import com.mes.engineering.mapper.EngineeringMapper;
+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.vo.UpPattenUsageVO;
+import com.mes.uppattenusage.mapper.UpPattenUsageMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @Author : zhoush
+ * @Date: 2024/10/11 16:13
+ * @Description:
+ */
+@Slf4j
+@Component
+public class RawGlassTask {
+
+    @Autowired
+    private RawGlassStorageStationService rawGlassStorageStationService;
+    @Autowired
+    private RawGlassStorageDetailsService rawGlassStorageDetailsService;
+
+    @Autowired
+    private RawGlassStorageTaskService rawGlassStorageTaskService;
+
+    @Resource
+    private EngineeringMapper engineeringMapper;
+    @Resource
+    private UpPattenUsageMapper upPattenUsageMapper;
+
+    @Autowired
+    private MiloService miloService;
+
+    private static final List<String> liftingStation = Arrays.asList("1", "2");
+    private static final List<String> loadGlassStation = Arrays.asList("3", "4", "5", "6");
+
+    /**
+     * 鍏ュ簱浠诲姟锛氬悐瑁呬綅鏈夌幓鐠冿紝鍏堝幓宸ヤ綅琛ㄦ煡璇㈢┖鏍煎瓙锛岀敓鎴愬叆搴撲换鍔′粠鍚婅浣嶅埌鐩爣鏍煎瓙
+     *
+     * @throws Exception
+     */
+    @Scheduled(fixedDelay = 1000)
+    public void warehouseTask() throws Exception {
+        ReadWriteEntity entity = miloService.readFromOpcUa("rawglass.device.request");
+        String value = entity.getValueString();
+        if (!"1".equals(value)) {
+            log.info("澶ц溅蹇欑");
+            return;
+        }
+        List<RawGlassStorageDetails> rawGlassList = rawGlassStorageDetailsService.list(new LambdaQueryWrapper<RawGlassStorageDetails>()
+                .eq(RawGlassStorageDetails::getState, Const.GLASS_STATE_IN)
+                .inSql(RawGlassStorageDetails::getSlotId, "select slot from raw_glass_storage_station where enable_state = 1 and slot in (1,2)"));
+        if (CollectionUtil.isEmpty(rawGlassList)) {
+            log.info("鍚婅浣嶈绂佺敤鎴栨病鏈夌幓鐠�");
+            return;
+        }
+        //鏌ヨ宸ヤ綅淇℃伅鏄惁鏈�
+        List<RawGlassStorageStation> stationList = rawGlassStorageStationService.list(new LambdaQueryWrapper<RawGlassStorageStation>().notInSql(RawGlassStorageStation::getSlot, "select slot_id from raw_glass_storage_details where state = '100'")
+                .eq(RawGlassStorageStation::getEnableState, Const.SLOT_ON));
+        if (CollectionUtil.isEmpty(stationList)) {
+            log.info("娌℃湁绌虹殑宸ヤ綅");
+            return;
+        }
+        //鐢熸垚杩涚浠诲姟
+        generateTask(rawGlassList.get(0).getSlotId(), stationList.get(0).getSlot(),
+                rawGlassList.get(0).getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_IN);
+        //鐢熸垚宸ヤ綅浠诲姟锛屽皢鍚婅浣嶇殑鐜荤拑鐘舵�佹敼浣嶈繘绗间腑
+    }
+
+
+    /**
+     * 鍑哄簱浠诲姟锛�1銆佺偣鍑哄簱锛岀珛椹敓鎴愬嚭鐗囦换鍔� 2銆佺偣鍑哄簱淇敼宸ヤ綅璇︽儏鍐呯殑鐘舵�佷负寰呭嚭搴擄紝瀹氭椂浠诲姟鎵弿鐢熸垚鍑哄簱浠诲姟
+     */
+    @Scheduled(fixedDelay = 1000)
+    public void outboundTask() throws Exception {
+        ReadWriteEntity entity = miloService.readFromOpcUa("rawglass.device.request");
+        String value = entity.getValueString();
+        if (!"2".equals(value)) {
+            log.info("澶ц溅蹇欑");
+            return;
+        }
+        List<RawGlassStorageDetails> rawGlassList = rawGlassStorageDetailsService.list(new LambdaQueryWrapper<RawGlassStorageDetails>()
+                .eq(RawGlassStorageDetails::getState, Const.GLASS_STATE_OUT_ING)
+                .inSql(RawGlassStorageDetails::getSlotId, "select slot from raw_glass_storage_station where enable_state = 1 and slot not in (1,2)"));
+        if (CollectionUtil.isEmpty(rawGlassList)) {
+            log.info("绯荤粺娌℃湁闇�瑕佸嚭搴撶殑鍘熺墖淇℃伅");
+            return;
+        }
+        List<Integer> emptyLeftingList = rawGlassStorageDetailsService.listBySlotState(liftingStation, Arrays.asList(Const.GLASS_STATE_IN));
+        if (CollectionUtil.isEmpty(emptyLeftingList)) {
+            log.info("鍚婅浣嶅綋鍓嶉兘鏈夊師鐗囷紝缁撴潫鍑虹墖浠诲姟");
+        }
+        //鐢熸垚鍑哄簱浠诲姟
+        generateTask(rawGlassList.get(0).getSlotId(), emptyLeftingList.get(0),
+                rawGlassList.get(0).getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_OUT);
+    }
+
+    /**
+     * 鍘熺墖璋冨害锛�1銆佹煡璇㈠伐绋嬪師鐗囪〃锛屾寜鐓ч『搴忓皢鍘熺墖鏀惧叆涓婄墖1鍙蜂綅锛屽悗缁師鐗囨斁涓婄墖2鍙蜂綅锛屽嚭鐜板昂瀵告浛鎹紝鍒ゆ柇鍘熶笂鐗囦綅鏄惁鏈夌幓鐠冿紝鏈� 鍏堝嚭鍚庤繘锛屾棤 鐩存帴杩涚墖
+     */
+    @Scheduled(fixedDelay = 1000)
+    public void rawGlassDispatchTask() throws Exception {
+        ReadWriteEntity entity = miloService.readFromOpcUa("rawglass.device.request");
+        String value = entity.getValueString();
+        if (!"2".equals(value)) {
+            log.info("澶ц溅蹇欑");
+            return;
+        }
+        //鏌ヨ褰撳墠绯荤粺姝e湪鎵ц鐨勮鍗�
+        Engineering engineering = engineeringMapper.selectOne(new LambdaQueryWrapper<Engineering>().eq(Engineering::getState, Const.ENGINEERING_RUNNING).last("order by id limit 1"));
+        if (null == engineering) {
+            log.info("娌℃湁姝e湪鎵ц鐨勫伐绋�");
+            return;
+        }
+        //褰撳墠灏哄闇�瑕佷笂鐗囩殑鏁伴噺
+        List<UpPattenUsageVO> pattenUsageList = upPattenUsageMapper.queryRawGlassByEngineeringId(engineering.getEngineerId());
+        if (CollectionUtils.isEmpty(pattenUsageList)) {
+            log.info("姝e湪鎵ц鐨勫伐绋嬪師鐗囨棤鍙笂鐗囩殑鍘熺墖淇℃伅");
+            return;
+        }
+        Map<String, List<UpPattenUsageVO>> upListMap = pattenUsageList.stream()
+                .collect(Collectors.groupingBy(UpPattenUsageVO::getGroupNumber));
+        //todo:鎸夌収宸ョ▼鍙锋寜鐓у伐绋嬩笅鏈畬鎴愮殑灏哄鐨勯『搴忥紝褰�1鍙蜂笂鐗囦綅鏋跺瓙涓婄殑褰撳墠灏哄鐜荤拑灏戜簬3鐗囦笖2鍙蜂笂鐗囦綅鏃犲師鐗囩幓鐠冿紝鍒欏皢鍘昏皟搴︾幓鐠冨幓2鍙蜂笂鐗囦綅锛�
+        //todo:褰撲竴鍙蜂笂鐗囦綅鏋跺瓙涓婄殑鐜荤拑浣嶇┖鎴栬�呭綋鍓嶅昂瀵哥敤瀹屾椂鏃讹紝灏�2鍙凤紙鏈夌幓鐠冿級涓婄墖浣嶈皟搴﹀埌1鍙蜂笂鐗囦綅
+        //1銆佹煡璇�4涓笂鐗囩殑鍘熺墖璇︽儏
+        List<RawGlassStorageDetails> rawGlassDetailsList = rawGlassStorageDetailsService.list(new LambdaQueryWrapper<RawGlassStorageDetails>()
+                .eq(RawGlassStorageDetails::getState, Const.GLASS_STATE_IN).in(RawGlassStorageDetails::getSlotId, loadGlassStation));
+        if (CollectionUtils.isEmpty(rawGlassDetailsList)) {
+            //琛ㄧず1涓婄墖浣嶆病鏈夊師鐗囷紝鐩存帴鎵惧師鐗囨斁鍏ュ搴旂殑涓婄墖浣�
+            List<UpPattenUsageVO> upPattenUsage01VOS = upListMap.get("1");
+            UpPattenUsageVO usageVO = upPattenUsage01VOS.get(0);
+            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())
+                    .gt(RawGlassStorageDetails::getRemainQuantity, upPattenUsage01VOS.size())
+                    .orderByAsc(RawGlassStorageDetails::getRemainQuantity)
+                    .last("limit 1")
+            );
+            generateTask(details.getSlotId(), 1, details.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
+            //缁撴潫璋冨害浠诲姟
+        }
+        Map<Integer, List<RawGlassStorageDetails>> listMap = rawGlassDetailsList.stream().collect(Collectors.groupingBy(RawGlassStorageDetails::getSlotId));
+        RawGlassStorageDetails rawGlass03Details = listMap.get(3).get(0);
+        RawGlassStorageDetails rawGlass04Details = listMap.get(4).get(0);
+//        RawGlassStorageDetails rawGlass05Details = listMap.get(5).get(0);
+//        RawGlassStorageDetails rawGlass06Details = listMap.get(6).get(0);
+        //todo:涓婄墖1鍙蜂綅2绉嶆竻绌烘柟寮忥細鏂瑰紡涓�锛氬師鐗囩敤瀹�  鏂瑰紡浜岋細褰撳墠灏哄鐢ㄥ畬
+        if (null == rawGlass03Details) {
+            if (null == rawGlass04Details) {
+                //琛ㄧず1涓婄墖浣嶆病鏈夊師鐗囷紝鐩存帴鎵惧師鐗囨斁鍏ュ搴旂殑涓婄墖浣�
+                List<UpPattenUsageVO> upPattenUsage01VOS = upListMap.get("1");
+                UpPattenUsageVO usageVO = upPattenUsage01VOS.get(0);
+                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())
+                        .gt(RawGlassStorageDetails::getRemainQuantity, upPattenUsage01VOS.size())
+                        .orderByAsc(RawGlassStorageDetails::getRemainQuantity)
+                        .last("limit 1")
+                );
+                generateTask(details.getSlotId(), 1, details.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
+                //缁撴潫璋冨害浠诲姟
+            } else {
+                //灏�2鍙蜂笂鐗囦綅鐨勫師鐗囨斁鍏�1鍙蜂笂鐗囦綅
+                generateTask(2, 1, rawGlass04Details.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
+                //缁撴潫璋冨害浠诲姟
+            }
+        } else {
+            if (null == rawGlass04Details) {
+                List<UpPattenUsageVO> upPattenUsage01VOS = upListMap.get("2");
+                if (CollectionUtils.isEmpty(upPattenUsage01VOS)) {
+                    return;
+                }
+                UpPattenUsageVO usageVO = upPattenUsage01VOS.get(0);
+                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())
+                        .gt(RawGlassStorageDetails::getRemainQuantity, upPattenUsage01VOS.size())
+                        .orderByAsc(RawGlassStorageDetails::getRemainQuantity)
+                        .last("limit 1")
+                );
+                generateTask(details.getSlotId(), 2, details.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH);
+            }
+        }
+
+
+    }
+
+
+    /**
+     * 鐢熸垚鍘熺墖浠撳偍浠诲姟
+     *
+     * @param startSlot
+     * @param endSlot
+     * @param patternQuantity
+     * @param taskType
+     * @return
+     */
+    private boolean generateTask(int startSlot, int endSlot, Integer patternQuantity, int taskType) {
+        RawGlassStorageTask task = RawGlassStorageTask.builder()
+                .originateSlot(startSlot)
+                .endSlot(endSlot)
+                .patternQuantity(patternQuantity)
+                .taskType(taskType)
+                .createTime(new Date()).build();
+        return rawGlassStorageTaskService.save(task);
+    }
+}
diff --git a/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/entity/RawGlassStorageDetails.java b/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/entity/RawGlassStorageDetails.java
index 1f99472..2a339bb 100644
--- a/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/entity/RawGlassStorageDetails.java
+++ b/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/entity/RawGlassStorageDetails.java
@@ -33,7 +33,7 @@
     /**
      * 鏍煎瓙id
      */
-    private String slotId;
+    private Integer slotId;
 
     /**
      * 鍘熺墖瀹�
@@ -63,7 +63,7 @@
     /**
      * 鍓╀綑鏁伴噺
      */
-    private String remainQuantity;
+    private Integer remainQuantity;
 
 
     /**
diff --git a/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/mapper/RawGlassStorageDetailsMapper.java b/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/mapper/RawGlassStorageDetailsMapper.java
index 868b2fd..46441d4 100644
--- a/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/mapper/RawGlassStorageDetailsMapper.java
+++ b/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/mapper/RawGlassStorageDetailsMapper.java
@@ -1,11 +1,14 @@
 package com.mes.rawglassdetails.mapper;
 
-import com.mes.rawglassdetails.entity.RawGlassStorageDetails;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.mes.rawglassdetails.entity.RawGlassStorageDetails;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
- *  Mapper 鎺ュ彛
+ * Mapper 鎺ュ彛
  * </p>
  *
  * @author wf
@@ -13,4 +16,12 @@
  */
 public interface RawGlassStorageDetailsMapper extends BaseMapper<RawGlassStorageDetails> {
 
+    /**
+     * 鎸夌収鍚婅浣嶅拰璇︽儏琛ㄧ姸鎬佹煡璇㈢┖闂茬殑鍚婅浣�
+     *
+     * @param liftingStation
+     * @param state
+     * @return
+     */
+    List<Integer> listBySlotState(@Param("leftingStation") List<String> liftingStation, @Param("state") List<Integer> state);
 }
diff --git a/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/mapper/xml/RawGlassStorageDetailsMapper.xml b/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/mapper/xml/RawGlassStorageDetailsMapper.xml
index 454dde2..f13945e 100644
--- a/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/mapper/xml/RawGlassStorageDetailsMapper.xml
+++ b/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/mapper/xml/RawGlassStorageDetailsMapper.xml
@@ -1,5 +1,19 @@
 <?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="glassdetails.mapper.RawGlassStorageDetailsMapper">
+<mapper namespace="com.mes.rawglassdetails.mapper.RawGlassStorageDetailsMapper">
 
+    <select id="listBySlotState" resultType="java.lang.Integer">
+        select t.slot
+        from raw_glass_storage_station t
+        inner JOIN raw_glass_storage_details t1
+        on t.slot = t1.slot_id and t.enable_state = 1
+        and t.slot in
+        <foreach collection="leftingStation" item="item" open='(' close=')' separator=','>
+            #{item}
+        </foreach>
+        and t1.state not in
+        <foreach collection="state" item="item" open='(' close=')' separator=','>
+            #{item}
+        </foreach>
+    </select>
 </mapper>
diff --git a/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/service/RawGlassStorageDetailsService.java b/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/service/RawGlassStorageDetailsService.java
index e05c291..cd7ad71 100644
--- a/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/service/RawGlassStorageDetailsService.java
+++ b/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/service/RawGlassStorageDetailsService.java
@@ -1,10 +1,8 @@
 package com.mes.rawglassdetails.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.mes.entity.request.GeneralRequest;
 import com.mes.rawglassdetails.entity.RawGlassStorageDetails;
 import com.mes.rawglassdetails.entity.request.RawGlassRequest;
-import com.mes.userinfo.entity.vo.SysUserVO;
 
 import java.util.List;
 
@@ -39,4 +37,6 @@
     String deleteWarehousing(Long slotId);
 
     String outWarehousing(Long slotId);
+
+    List<Integer> listBySlotState(List<String> liftingStation, List<Integer> state);
 }
\ No newline at end of file
diff --git a/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/service/impl/RawGlassStorageDetailsServiceImpl.java b/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/service/impl/RawGlassStorageDetailsServiceImpl.java
index 8be12b1..e608d50 100644
--- a/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/service/impl/RawGlassStorageDetailsServiceImpl.java
+++ b/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/service/impl/RawGlassStorageDetailsServiceImpl.java
@@ -8,8 +8,6 @@
 import com.mes.rawglassdetails.entity.request.RawGlassRequest;
 import com.mes.rawglassdetails.mapper.RawGlassStorageDetailsMapper;
 import com.mes.rawglassdetails.service.RawGlassStorageDetailsService;
-import com.mes.rawglassstation.entity.RawGlassStorageStation;
-import com.mes.userinfo.entity.vo.SysUserVO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
@@ -24,8 +22,8 @@
 @Service
 @Slf4j
 public class RawGlassStorageDetailsServiceImpl extends ServiceImpl<RawGlassStorageDetailsMapper, RawGlassStorageDetails> implements RawGlassStorageDetailsService {
-  @Override
-  public boolean deleteRawGlassStorageDetails(String device_id) {
+    @Override
+    public boolean deleteRawGlassStorageDetails(String device_id) {
         QueryWrapper<RawGlassStorageDetails> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("device_id", device_id);
         return remove(queryWrapper);//remove鎵嶆槸鍒犻櫎锛宒elete寰楃敤鍙﹀鐨勪緷璧栵紝榛樿鏂规硶鏄痳emove杩斿洖bool
@@ -60,17 +58,24 @@
                         .eq(RawGlassStorageDetails::getSlotId, request.getSlotId()));
         return "success";
     }
+
     @Override
     public String deleteWarehousing(Long slotId) {
         update(new LambdaUpdateWrapper<RawGlassStorageDetails>().eq(RawGlassStorageDetails::getSlotId, slotId)
-                .set(RawGlassStorageDetails::getState,Const.GLASS_STATE_OUT));
+                .set(RawGlassStorageDetails::getState, Const.GLASS_STATE_OUT));
         return "success";
     }
+
     @Override
     public String outWarehousing(Long slotId) {
         update(new LambdaUpdateWrapper<RawGlassStorageDetails>().eq(RawGlassStorageDetails::getSlotId, slotId)
-                .set(RawGlassStorageDetails::getState,Const.GLASS_STATE_OUT_ING));
+                .set(RawGlassStorageDetails::getState, Const.GLASS_STATE_OUT_ING));
         return "success";
     }
 
+    @Override
+    public List<Integer> listBySlotState(List<String> liftingStation, List<Integer> state) {
+        return baseMapper.listBySlotState(liftingStation, state);
+    }
+
 }
\ No newline at end of file
diff --git a/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglasstask/entity/RawGlassStorageTask.java b/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglasstask/entity/RawGlassStorageTask.java
index 8c6a3be..5346dee 100644
--- a/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglasstask/entity/RawGlassStorageTask.java
+++ b/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglasstask/entity/RawGlassStorageTask.java
@@ -2,20 +2,23 @@
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Builder;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import java.io.Serializable;
+import java.util.Date;
 
 /**
  * <p>
- * 
+ *
  * </p>
  *
  * @author wf
  * @since 2024-09-10
  */
 @Data
+@Builder
 @EqualsAndHashCode(callSuper = false)
 public class RawGlassStorageTask implements Serializable {
 
@@ -38,7 +41,7 @@
     /**
      * 鍘熺墖鏁伴噺
      */
-    private String patternQuantity;
+    private Integer patternQuantity;
 
     /**
      * 浠诲姟绫诲瀷
@@ -53,7 +56,7 @@
     /**
      * 鍒涘缓鏃堕棿
      */
-    private String createTime;
+    private Date createTime;
 
 
 }
diff --git a/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/TemperingTask.java b/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/TemperingTask.java
index 089ecd4..6330ac4 100644
--- a/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/TemperingTask.java
+++ b/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/TemperingTask.java
@@ -152,7 +152,7 @@
                 damage.setLine(Const.TEMPERING_OUT_TARGET_POSITION);
                 damage.setWorkingProcedure("閽㈠寲");
                 damage.setRemark("閽㈠寲");
-                damage.setStatus(0);
+                damage.setStatus(1);
                 damage.setType(e.getState());
                 return damage;
             }).collect(Collectors.toList());
diff --git a/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-dev.yml b/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-dev.yml
index 246a786..530267b 100644
--- a/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-dev.yml
+++ b/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-dev.yml
@@ -34,4 +34,6 @@
     database: 0
     host: 127.0.0.1
     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 af491d8..cd77223 100644
--- a/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application.yml
+++ b/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application.yml
@@ -2,16 +2,25 @@
   port: 8084
 spring:
   profiles:
-    active: cz
+    active: dev
   application:
     name: temperingGlass
   liquibase:
-    enabled: false
-    change-log: classpath:changelog/changelog.sql
+    enabled: true
 mybatis-plus:
   mapper-locations: classpath*:mapper/*.xml
   configuration:
     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
 mes:
   width: 2800
-  height: 5000
\ No newline at end of file
+  height: 5000
+kangaroohy:
+  milo:
+    enabled: false
+    primary: default
+    config:
+      default:
+        endpoint: opc.tcp://10.153.19.150:49320
+        security-policy: basic256sha256
+        username: admin
+        password: 1qaz2wsx3edc4rfv
\ No newline at end of file
diff --git a/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/changelog/changelog.sql b/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/changelog/changelog.sql
index 245a94c..5473f61 100644
--- a/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/changelog/changelog.sql
+++ b/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/changelog/changelog.sql
@@ -153,56 +153,61 @@
 -- rollback DELETE FROM sys_dict_data WHERE dict_type in ('鐧界幓', '鍗曢摱', '鍙岄摱');
 
 
--- changeset wangfei:20240918001
+-- changeset zsh:20240918001
 -- preconditions onFail:CONTINUE onError:CONTINUE
 -- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'raw_glass_storage_details' and table_schema = 'hangzhoumes';
 CREATE TABLE raw_glass_storage_details
 (
     id                bigint       NOT NULL AUTO_INCREMENT,
     device_id         int          NULL DEFAULT NULL COMMENT '璁惧id',
-    slot_id           varchar(255) NULL DEFAULT NULL COMMENT '鏍煎瓙id',
+    slot              int          NULL DEFAULT NULL COMMENT '鏍煎瓙id',
     pattern_width     double(8, 2) NULL DEFAULT NULL COMMENT '鍘熺墖瀹�',
     pattern_height    double(8, 2) NULL DEFAULT NULL COMMENT '鍘熺墖楂�',
     pattern_thickness double(8, 2) NULL DEFAULT NULL COMMENT '鍘熺墖鍘氬害',
-    films_id          varchar(255) NULL DEFAULT NULL COMMENT '鑶滅郴',
+    films_id          varchar(64)  NULL DEFAULT NULL COMMENT '鑶滅郴',
     create_time       datetime     NOT NULL COMMENT '鍒涘缓鏃堕棿',
-    remain_quantity   varchar(255) NULL DEFAULT NULL COMMENT '鍓╀綑鏁伴噺',
+    remain_quantity   int          NULL DEFAULT NULL COMMENT '鍓╀綑鏁伴噺',
+    state             int          NULL DEFAULT NULL COMMENT '鐘舵��',
     PRIMARY KEY (id) USING BTREE
 );
 -- rollback DROP TABLE raw_glass_storage_details;
 
--- changeset wangfei:20240918002
+-- changeset zsh:20240918002
 -- preconditions onFail:CONTINUE onError:CONTINUE
 -- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'raw_glass_storage_station' and table_schema = 'hangzhoumes';
 CREATE TABLE raw_glass_storage_station
 (
-    id           bigint NOT NULL AUTO_INCREMENT,
-    device_id    int NULL DEFAULT NULL COMMENT '璁惧id',
-    slot         int NULL DEFAULT NULL COMMENT '鏍呮牸鍙�',
+    id           bigint       NOT NULL AUTO_INCREMENT,
+    device_id    int          NULL DEFAULT NULL COMMENT '璁惧id',
+    slot         int          NULL DEFAULT NULL COMMENT '鏍呮牸鍙�',
     enable_state varchar(255) NULL DEFAULT NULL COMMENT '鍚敤鏍囪',
-    start_slot   int NULL DEFAULT NULL COMMENT '寮�濮嬪伐浣�',
-    end_slot     int NULL DEFAULT NULL COMMENT '鐩爣宸ヤ綅',
-    PRIMARY KEY (id) USING BTREE
+    PRIMARY KEY (id)
 );
 -- rollback DROP TABLE raw_glass_storage_station;
 
 
--- changeset wangfei:20240918003
+-- changeset zsh:20240918003
 -- preconditions onFail:CONTINUE onError:CONTINUE
 -- precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'raw_glass_storage_task' and table_schema = 'hangzhoumes';
 CREATE TABLE raw_glass_storage_task
 (
-    id               bigint NOT NULL AUTO_INCREMENT,
-    enable_id        int NULL DEFAULT NULL COMMENT '浠诲姟ID',
-    originate_slot   int NULL DEFAULT NULL COMMENT '璧峰鏍煎瓙',
-    end_slot         int NULL DEFAULT NULL COMMENT '鐩爣鏍煎瓙',
-    pattern_quantity varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '鍘熺墖鏁伴噺',
-    enable_type      int NULL DEFAULT NULL COMMENT '浠诲姟绫诲瀷',
-    enable_state     int NULL DEFAULT NULL COMMENT '浠诲姟鐘舵��',
+    id               bigint   NOT NULL AUTO_INCREMENT,
+    start_slot       int      NULL DEFAULT NULL COMMENT '璧峰鏍煎瓙',
+    end_slot         int      NULL DEFAULT NULL COMMENT '鐩爣鏍煎瓙',
+    pattern_quantity int      NULL DEFAULT NULL COMMENT '鍘熺墖鏁伴噺',
+    enable_type      int      NULL DEFAULT NULL COMMENT '浠诲姟绫诲瀷',
+    enable_state     int      NULL DEFAULT NULL COMMENT '浠诲姟鐘舵��',
     create_time      datetime NULL DEFAULT NULL COMMENT '鍒涘缓鏃堕棿',
     PRIMARY KEY (id) USING BTREE
 );
 -- rollback DROP TABLE raw_glass_storage_task;
 
 
+-- changeset zsh:20241015001
+-- preconditions onFail:CONTINUE onError:CONTINUE
+-- precondition-sql-check expectedResult:0 SELECT count(0) FROM information_schema.columns WHERE table_schema = 'hangzhoumes' AND table_name = 'engineering' AND column_name = 'station_cell';
+ALTER TABLE engineering
+    ADD COLUMN station_cell varchar(20);
+
+
 
diff --git a/hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/service/impl/DownGlassInfoServiceImpl.java b/hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/service/impl/DownGlassInfoServiceImpl.java
index 7fdfb28..c7d2ab8 100644
--- a/hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/service/impl/DownGlassInfoServiceImpl.java
+++ b/hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/service/impl/DownGlassInfoServiceImpl.java
@@ -1,6 +1,5 @@
 package com.mes.downglassinfo.service.impl;
 
-import cn.smallbun.screw.core.util.CollectionUtils;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -19,6 +18,7 @@
 import com.mes.downworkstation.entity.dto.DownGlassInfoDTO;
 import com.mes.downworkstation.service.DownWorkstationService;
 import com.mes.glassinfo.entity.GlassInfo;
+import com.mes.glassinfo.service.GlassInfoService;
 import com.mes.job.DownLoadCacheGlassTask;
 import com.mes.pp.service.FlowCardService;
 import lombok.extern.slf4j.Slf4j;
@@ -31,7 +31,6 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 @Slf4j
 @Service
@@ -52,6 +51,9 @@
 
     @Autowired
     FlowCardService flowCardService;
+
+    @Autowired
+    GlassInfoService glassInfoService;
 
     /**
      * 鏍规嵁娴佺▼鍗″彿鏌ヨ鏈�澶у簭鍙�
@@ -224,8 +226,15 @@
 
     @Override
     public List<Map<String, Object>> downGlassLabelPrint(DownGlassInfo downGlassInfo) {
-
-        List<Map<String, Object>> resultList = baseMapper.downGlassLabelPrint(downGlassInfo.getFlowCardId(), downGlassInfo.getLayer());
+        List<Map<String, Object>> resultList = null;
+        if (downGlassInfo.getGlassId() != null) {
+            resultList = glassInfoService.listMaps(
+                    new LambdaQueryWrapper<GlassInfo>()
+                            .eq(GlassInfo::getGlassId, downGlassInfo.getGlassId())
+            );
+        } else {
+            resultList = baseMapper.downGlassLabelPrint(downGlassInfo.getFlowCardId(), downGlassInfo.getLayer());
+        }
         log.info("MES钀芥灦鏁版嵁:{}", resultList);
         //鑾峰彇ERP鏍囩鎵�闇�鐨勪俊鎭�
         List<Map<String, Object>> labelInfo;
diff --git a/hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/job/DownLoadCacheGlassTask.java b/hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/job/DownLoadCacheGlassTask.java
index e96ddf0..a335c88 100644
--- a/hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/job/DownLoadCacheGlassTask.java
+++ b/hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/job/DownLoadCacheGlassTask.java
@@ -30,7 +30,6 @@
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
@@ -93,7 +92,6 @@
         String confirmationWrodValue = plcParameterObject.getPlcParameter("confirmationWord").getValue();
         String confirmationWrodAddress = plcParameterObject.getPlcParameter("confirmationWord").getAddress();
         String currentSlot = plcParameterObject.getPlcParameter("currentCell").getValue();
-
 
         log.info("1銆佽幏鍙栧埌鐨勮姹傚瓧涓猴細{}锛岃幏鍙栧埌鐨勬壂鎻廔D涓猴細{}锛岃幏鍙栧埌鐨勭‘璁ゅ瓧涓猴細{}锛岃幏鍙栧埌鐨勫嚭鐗囩姸鎬佸垎鍒负锛歡06:{}銆乬08:{}銆乬11:{}銆乬13:{},褰撳墠鏍煎瓙鍙蜂负锛歿}",
                 requestWord, glassIdeValue, confirmationWrodValue, out06Glassstate, out08Glassstate, out11Glassstate, out13Glassstate, currentSlot);
@@ -169,9 +167,9 @@
                 Damage damage = new Damage();
                 damage.setGlassId(e.getGlassId());
                 damage.setLine(Const.TEMPERING_OUT_TARGET_POSITION);
-                damage.setWorkingProcedure("涓嬬墖");
+                damage.setWorkingProcedure("閽㈠寲");
                 damage.setRemark("涓嬬墖");
-                damage.setStatus(0);
+                damage.setStatus(1);
                 damage.setType(e.getTaskStatus());
                 return damage;
             }).collect(Collectors.toList());
diff --git a/hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/application.yml b/hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/application.yml
deleted file mode 100644
index b4e6af6..0000000
--- a/hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/application.yml
+++ /dev/null
@@ -1,33 +0,0 @@
-server:
-  port: 8085
-
-spring:
-  profiles:
-    active: cz
-  application:
-    name: unLoadGlass
-  liquibase:
-    enabled: false
-  task:
-    scheduling:
-      pool:
-        size: 10
-      thread-name-prefix: task-unLoad
-
-
-mybatis-plus:
-  mapper-locations: classpath*:mapper/*.xml
-#  configuration:
-#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
-
-mes:
-  maxWidth: 2500    #涓嬬墖鐨勬渶澶у搴�
-  maxHeight: 2000   #涓嬬墖鐨勬渶澶ч珮搴�
-  minWidth: 400    #涓嬬墖鐨勬渶灏忓搴�
-  minHeight: 400   #涓嬬墖鐨勬渶灏忛珮搴�
-  throughWidth: 3000
-  throughHeight: 2500
-  threshold: 5      #涓嬬墖鐨勬渶澶ч槇鍊�
-  scan:
-    ip: 192.168.30.199
-    port: 5000
diff --git a/hangzhoumesParent/moduleService/pom.xml b/hangzhoumesParent/moduleService/pom.xml
index b043adf..55ea5f6 100644
--- a/hangzhoumesParent/moduleService/pom.xml
+++ b/hangzhoumesParent/moduleService/pom.xml
@@ -55,11 +55,6 @@
             <groupId>com.mes</groupId>
             <version>1.0-SNAPSHOT</version>
         </dependency>
-        <dependency>
-            <artifactId>opcuaClient</artifactId>
-            <groupId>com.mes</groupId>
-            <version>1.0-SNAPSHOT</version>
-        </dependency>
 
         <!--寮�鍙戣�呭伐鍏�-->
         <!--        <dependency>-->
diff --git a/hangzhoumesParent/readMe-OPC.md b/hangzhoumesParent/readMe-OPC.md
new file mode 100644
index 0000000..b9fc013
--- /dev/null
+++ b/hangzhoumesParent/readMe-OPC.md
@@ -0,0 +1,6 @@
+3.1.1.0.6.13 璇诲�兼敮鎸佽繑鍥炴洿澶氫俊鎭� #PR16 3.1.0.6.13 鍗囩骇鍒版渶鏂扮増鏈� 0.6.13 淇敼璁㈤槄鐩戝惉callback鍙傛暟浠ヨ幏鍙栨洿澶氫俊鎭紝鍏锋湁鐮村潖鎬э紒锛侊紒#PR15 3.0.6.12 鍗囩骇鍒版渶鏂扮増鏈� 0.6.12
+杩炴帴姹犻厤缃紭鍖� #gitee I86XSX 3.0.5 鏀寔閰嶇疆鏄惁鍚敤缁勪欢锛歬angaroohy.milo.enabled=true 3.0.4 鏀寔閰嶇疆澶氫釜 opc ua 鏈嶅姟鍣紝璋冪敤鏂规硶鏃跺彲鎵嬪姩鎸囧畾闇�瑕佽闂殑鏈嶅姟鍣� 鎵归噺璇诲�兼柟娉曚紭鍖�
+鍗囩骇milo渚濊禆鍒� 0.6.10 3.0.3 ID鏀寔瀛楃涓茶〃绀烘硶锛歯s=<鍛藉悕绌洪棿绱㈠紩>;<鏍囪瘑绗︾被鍨�>=<鏍囪瘑绗�>
+3.0.2 璁㈤槄鏃� 鏀寔鎸囧畾璁㈤槄鏃堕棿闂撮殭锛岄粯璁� 1000ms 3.0.1 endpoint 鏀寔澶栫綉绌块�忕被鐨勫湴鍧� 鏂板鐐逛綅璁㈤槄鏂规硶锛岃闃呮柇鎺夎嚜鍔ㄩ噸杩� 澶栫綉绌块�忕被鍦板潃濡傦細 鍐呯綉鍦板潃涓猴細opc.tcp://192.168.68.128:
+49320 澶栫綉鍦板潃涓猴細opc.tcp://opc.kangaroohy.com:59320 3.0.0 閫傞厤 spring boot 3.x锛屼篃鍙湪spring boot 2.x涓娇鐢� 鍩轰簬 eclipse milo 鏈�鏂扮増鏈� 0.6.9
+鏀寔杩炴帴姹犻厤缃�
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
deleted file mode 100644
index 295218b..0000000
--- a/pom.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <groupId>groupId</groupId>
-    <artifactId>HangZhouMes</artifactId>
-    <version>1.0-SNAPSHOT</version>
-
-    
-</project>
\ No newline at end of file

--
Gitblit v1.8.0