From eda704f48beacb5c68372482f73b50af3c4623fb Mon Sep 17 00:00:00 2001
From: wuyouming666 <2265557248@qq.com>
Date: 星期三, 26 六月 2024 14:23:50 +0800
Subject: [PATCH] Merge branch 'master' of http://10.153.19.25:10101/r/HangZhouMes

---
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/service/impl/GlassInfoServiceImpl.java |   13 
 UI-Project/src/layout/MainErpView.vue                                                                       |  182 +
 UI-Project/src/views/User/rolelist.vue                                                                      |   88 
 UI-Project/src/views/Returns/returns.vue                                                                    |  138 
 UI-Project/src/views/Identify/identify.vue                                                                  |   21 
 UI-Project/src/views/Caching/cachingbefore.vue                                                              |   37 
 hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application.yml                     |    2 
 UI-Project/src/views/LoginView.vue                                                                          |   41 
 UI-Project/src/views/UnLoadGlass/loadmachinerack.vue                                                        |   52 
 UI-Project/src/views/Caching/cachingun.vue                                                                  |  172 +
 UI-Project/auto-imports.d.ts                                                                                |    9 
 hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-cz.yml                  |   15 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/entity/GlassInfo.java                  |    2 
 UI-Project/src/views/UnLoadGlass/Landingindicationtwo.vue                                                   |    8 
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/entity/OptimizeGlassinfo.java          |   19 
 UI-Project/src/views/User/permissions.vue                                                                   |  121 -
 UI-Project/package.json                                                                                     |    8 
 UI-Project/src/views/User/userlist.vue                                                                      |   79 
 UI-Project/src/views/RegisterView.vue                                                                       |   66 
 UI-Project/src/views/StockBasicData/stockBasicData.vue                                                      |   53 
 UI-Project/src/views/UnLoadGlass/Landingindication.vue                                                      |   10 
 UI-Project/src/views/StockBasicData/stockBasicDatatwo.vue                                                   |   51 
 UI-Project/src/lang/en.js                                                                                   |  302 ++++
 UI-Project/src/lang/zh.js                                                                                   |  354 ++++
 hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/CodeGet.java                               |    8 
 hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-dev.yml                 |   14 
 hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-prod.yml                     |    5 
 /dev/null                                                                                                   |   18 
 UI-Project/src/views/Slicecage/slicecage.vue                                                                |  821 +++++++---
 hangzhoumesParent/moduleService/TemperingGlassModule/src/test/java/com/mes/TemperingApplicationTest.java    |  120 
 hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-cz.yml                       |    5 
 UI-Project/src/views/PurchaseReturn/purchaseStorage.vue                                                     |    2 
 UI-Project/src/main.js                                                                                      |   10 
 hangzhoumesParent/common/springsecurity/pom.xml                                                             |    1 
 UI-Project/src/router/index.js                                                                              |    2 
 UI-Project/package-lock.json                                                                                | 1346 +++++++++---------
 hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-dev.yml                      |   15 
 UI-Project/src/lang/index.js                                                                                |   18 
 UI-Project/src/views/PurchaseReturn/purchaseReturn.vue                                                      |   21 
 UI-Project/vite.config.js                                                                                   |   16 
 40 files changed, 2,685 insertions(+), 1,580 deletions(-)

diff --git a/UI-Project/auto-imports.d.ts b/UI-Project/auto-imports.d.ts
new file mode 100644
index 0000000..66c4de4
--- /dev/null
+++ b/UI-Project/auto-imports.d.ts
@@ -0,0 +1,9 @@
+/* eslint-disable */
+/* prettier-ignore */
+// @ts-nocheck
+// noinspection JSUnusedGlobalSymbols
+// Generated by unplugin-auto-import
+export {}
+declare global {
+  const useI18n: typeof import('vue-i18n')['useI18n']
+}
diff --git a/UI-Project/package-lock.json b/UI-Project/package-lock.json
index d94acf9..df7b41a 100644
--- a/UI-Project/package-lock.json
+++ b/UI-Project/package-lock.json
@@ -20,8 +20,8 @@
         "sortablejs": "^1.15.1",
         "sweetalert2": "^11.10.7",
         "vue": "^3.3.4",
-        "vue-echarts": "^6.7.3",
-        "vue-i18n": "^9.13.1",
+        "vue-draggable-plus": "^0.5.0",
+        "vue-i18n": "^9.10.1",
         "vue-router": "^4.2.4",
         "vxe-table": "^4.5.15",
         "xe-utils": "^3.5.14",
@@ -29,10 +29,19 @@
       },
       "devDependencies": {
         "@types/sortablejs": "^1.15.7",
-        "@vitejs/plugin-vue": "^4.3.4",
+        "@vitejs/plugin-vue": "^4.6.2",
         "http-proxy-middleware": "^3.0.0",
-        "sass": "^1.77.6",
+        "unplugin-auto-import": "^0.17.6",
         "vite": "^4.4.9"
+      }
+    },
+    "node_modules/@antfu/utils": {
+      "version": "0.7.8",
+      "resolved": "https://registry.npmmirror.com/@antfu/utils/-/utils-0.7.8.tgz",
+      "integrity": "sha512-rWQkqXRESdjXtc+7NRfK9lASQjpXJu1ayp7qi1d23zZorY+wBHVLHHoVcMsEnkqEBWTFqbztO7/QdJFzyEcLTg==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
       }
     },
     "node_modules/@babel/helper-string-parser": {
@@ -91,348 +100,12 @@
         "vue": "^3.2.0"
       }
     },
-    "node_modules/@esbuild/android-arm": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz",
-      "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/android-arm64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz",
-      "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/android-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz",
-      "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/darwin-arm64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz",
-      "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/darwin-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz",
-      "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/freebsd-arm64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz",
-      "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/freebsd-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz",
-      "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/linux-arm": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz",
-      "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/linux-arm64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz",
-      "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/linux-ia32": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz",
-      "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==",
-      "cpu": [
-        "ia32"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/linux-loong64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz",
-      "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==",
-      "cpu": [
-        "loong64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/linux-mips64el": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz",
-      "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==",
-      "cpu": [
-        "mips64el"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/linux-ppc64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz",
-      "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==",
-      "cpu": [
-        "ppc64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/linux-riscv64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz",
-      "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==",
-      "cpu": [
-        "riscv64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/linux-s390x": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz",
-      "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==",
-      "cpu": [
-        "s390x"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/linux-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz",
-      "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/netbsd-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz",
-      "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "netbsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/openbsd-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz",
-      "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "openbsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/sunos-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz",
-      "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "sunos"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/win32-arm64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz",
-      "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
     "node_modules/@esbuild/win32-ia32": {
       "version": "0.18.20",
       "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz",
       "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==",
       "cpu": [
         "ia32"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/win32-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz",
-      "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==",
-      "cpu": [
-        "x64"
       ],
       "dev": true,
       "optional": true,
@@ -507,6 +180,41 @@
       "resolved": "https://registry.npmmirror.com/@kurkle/color/-/color-0.3.2.tgz",
       "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw=="
     },
+    "node_modules/@nodelib/fs.scandir": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+      "dev": true,
+      "dependencies": {
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.stat": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+      "dev": true,
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.walk": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+      "dev": true,
+      "dependencies": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
     "node_modules/@popperjs/core": {
       "name": "@sxzz/popperjs-es",
       "version": "2.11.7",
@@ -518,9 +226,9 @@
       }
     },
     "node_modules/@rollup/pluginutils": {
-      "version": "5.0.5",
-      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.5.tgz",
-      "integrity": "sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==",
+      "version": "5.1.0",
+      "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz",
+      "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==",
       "dependencies": {
         "@types/estree": "^1.0.0",
         "estree-walker": "^2.0.2",
@@ -575,10 +283,9 @@
       }
     },
     "node_modules/@types/sortablejs": {
-      "version": "1.15.7",
-      "resolved": "https://registry.npmmirror.com/@types/sortablejs/-/sortablejs-1.15.7.tgz",
-      "integrity": "sha512-PvgWCx1Lbgm88FdQ6S7OGvLIjWS66mudKPlfdrWil0TjsO5zmoZmzoKiiwRShs1dwPgrlkr0N4ewuy0/+QUXYQ==",
-      "dev": true
+      "version": "1.15.8",
+      "resolved": "https://registry.npmmirror.com/@types/sortablejs/-/sortablejs-1.15.8.tgz",
+      "integrity": "sha512-b79830lW+RZfwaztgs1aVPgbasJ8e7AXtZYHTELNXZPsERt4ymJdjV4OccDbHQAvHrCcFpbF78jkm0R6h/pZVg=="
     },
     "node_modules/@types/web-bluetooth": {
       "version": "0.0.16",
@@ -586,15 +293,15 @@
       "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ=="
     },
     "node_modules/@vitejs/plugin-vue": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.4.0.tgz",
-      "integrity": "sha512-xdguqb+VUwiRpSg+nsc2HtbAUSGak25DXYvpQQi4RVU1Xq1uworyoH/md9Rfd8zMmPR/pSghr309QNcftUVseg==",
+      "version": "4.6.2",
+      "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.6.2.tgz",
+      "integrity": "sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==",
       "dev": true,
       "engines": {
         "node": "^14.18.0 || >=16.0.0"
       },
       "peerDependencies": {
-        "vite": "^4.0.0",
+        "vite": "^4.0.0 || ^5.0.0",
         "vue": "^3.2.25"
       }
     },
@@ -832,9 +539,9 @@
       }
     },
     "node_modules/acorn": {
-      "version": "8.10.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
-      "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
+      "version": "8.12.0",
+      "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.12.0.tgz",
+      "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==",
       "bin": {
         "acorn": "bin/acorn"
       },
@@ -852,7 +559,7 @@
     },
     "node_modules/anymatch": {
       "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+      "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz",
       "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
       "dependencies": {
         "normalize-path": "^3.0.0",
@@ -895,12 +602,30 @@
         "proxy-from-env": "^1.1.0"
       }
     },
+    "node_modules/balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+      "dev": true
+    },
     "node_modules/binary-extensions": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
-      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz",
+      "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
       "engines": {
         "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "dev": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0"
       }
     },
     "node_modules/braces": {
@@ -938,15 +663,9 @@
       }
     },
     "node_modules/chokidar": {
-      "version": "3.5.3",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
-      "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
-      "funding": [
-        {
-          "type": "individual",
-          "url": "https://paulmillr.com/funding/"
-        }
-      ],
+      "version": "3.6.0",
+      "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz",
+      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
       "dependencies": {
         "anymatch": "~3.1.2",
         "braces": "~3.0.2",
@@ -958,6 +677,9 @@
       },
       "engines": {
         "node": ">= 8.10.0"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
       },
       "optionalDependencies": {
         "fsevents": "~2.3.2"
@@ -981,6 +703,12 @@
       "engines": {
         "node": ">= 0.8"
       }
+    },
+    "node_modules/confbox": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.7.tgz",
+      "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==",
+      "dev": true
     },
     "node_modules/crc-32": {
       "version": "1.2.2",
@@ -1109,6 +837,18 @@
       "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
       "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
     },
+    "node_modules/escape-string-regexp": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+      "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/estree-walker": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
@@ -1119,6 +859,31 @@
       "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz",
       "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
       "dev": true
+    },
+    "node_modules/fast-glob": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz",
+      "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+      "dev": true,
+      "dependencies": {
+        "@nodelib/fs.stat": "^2.0.2",
+        "@nodelib/fs.walk": "^1.2.3",
+        "glob-parent": "^5.1.2",
+        "merge2": "^1.3.0",
+        "micromatch": "^4.0.4"
+      },
+      "engines": {
+        "node": ">=8.6.0"
+      }
+    },
+    "node_modules/fastq": {
+      "version": "1.17.1",
+      "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.17.1.tgz",
+      "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+      "dev": true,
+      "dependencies": {
+        "reusify": "^1.0.4"
+      }
     },
     "node_modules/fill-range": {
       "version": "7.0.1",
@@ -1165,19 +930,6 @@
         "node": ">=0.8"
       }
     },
-    "node_modules/fsevents": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
-      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
-      "hasInstallScript": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
-      }
-    },
     "node_modules/glob-parent": {
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
@@ -1220,15 +972,9 @@
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/immutable": {
-      "version": "4.3.6",
-      "resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.3.6.tgz",
-      "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==",
-      "dev": true
-    },
     "node_modules/is-binary-path": {
       "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
       "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
       "dependencies": {
         "binary-extensions": "^2.0.0"
@@ -1273,6 +1019,12 @@
         "node": ">=10"
       }
     },
+    "node_modules/js-tokens": {
+      "version": "9.0.0",
+      "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-9.0.0.tgz",
+      "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==",
+      "dev": true
+    },
     "node_modules/local-pkg": {
       "version": "0.4.3",
       "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz",
@@ -1305,14 +1057,11 @@
       }
     },
     "node_modules/magic-string": {
-      "version": "0.30.5",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz",
-      "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==",
+      "version": "0.30.10",
+      "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.10.tgz",
+      "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==",
       "dependencies": {
         "@jridgewell/sourcemap-codec": "^1.4.15"
-      },
-      "engines": {
-        "node": ">=12"
       }
     },
     "node_modules/magic-string-ast": {
@@ -1330,6 +1079,15 @@
       "version": "6.0.0",
       "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz",
       "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="
+    },
+    "node_modules/merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 8"
+      }
     },
     "node_modules/micromatch": {
       "version": "4.0.5",
@@ -1361,6 +1119,33 @@
       },
       "engines": {
         "node": ">= 0.6"
+      }
+    },
+    "node_modules/minimatch": {
+      "version": "9.0.4",
+      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.4.tgz",
+      "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/mlly": {
+      "version": "1.7.1",
+      "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.7.1.tgz",
+      "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==",
+      "dev": true,
+      "dependencies": {
+        "acorn": "^8.11.3",
+        "pathe": "^1.1.2",
+        "pkg-types": "^1.1.1",
+        "ufo": "^1.5.3"
       }
     },
     "node_modules/moment": {
@@ -1396,7 +1181,7 @@
     },
     "node_modules/normalize-path": {
       "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+      "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz",
       "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
       "engines": {
         "node": ">=0.10.0"
@@ -1408,9 +1193,9 @@
       "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw=="
     },
     "node_modules/pathe": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz",
-      "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q=="
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/pathe/-/pathe-1.1.2.tgz",
+      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="
     },
     "node_modules/picocolors": {
       "version": "1.0.0",
@@ -1486,6 +1271,17 @@
         }
       }
     },
+    "node_modules/pkg-types": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.1.1.tgz",
+      "integrity": "sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==",
+      "dev": true,
+      "dependencies": {
+        "confbox": "^0.1.7",
+        "mlly": "^1.7.0",
+        "pathe": "^1.1.2"
+      }
+    },
     "node_modules/postcss": {
       "version": "8.4.31",
       "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
@@ -1518,9 +1314,29 @@
       "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
       "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
     },
+    "node_modules/queue-microtask": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
+      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
     "node_modules/readdirp": {
       "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+      "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz",
       "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
       "dependencies": {
         "picomatch": "^2.2.1"
@@ -1535,10 +1351,15 @@
       "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
       "dev": true
     },
-    "node_modules/resize-detector": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmmirror.com/resize-detector/-/resize-detector-0.3.0.tgz",
-      "integrity": "sha512-R/tCuvuOHQ8o2boRP6vgx8hXCCy87H1eY9V5imBYeVNyNVpuL9ciReSccLj2gDcax9+2weXy3bc8Vv+NRXeEvQ=="
+    "node_modules/reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz",
+      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+      "dev": true,
+      "engines": {
+        "iojs": ">=1.0.0",
+        "node": ">=0.10.0"
+      }
     },
     "node_modules/rollup": {
       "version": "3.29.4",
@@ -1556,22 +1377,34 @@
         "fsevents": "~2.3.2"
       }
     },
-    "node_modules/sass": {
-      "version": "1.77.6",
-      "resolved": "https://registry.npmmirror.com/sass/-/sass-1.77.6.tgz",
-      "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==",
+    "node_modules/run-parallel": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz",
+      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
       "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
       "dependencies": {
-        "chokidar": ">=3.0.0 <4.0.0",
-        "immutable": "^4.0.0",
-        "source-map-js": ">=0.6.2 <2.0.0"
-      },
-      "bin": {
-        "sass": "sass.js"
-      },
-      "engines": {
-        "node": ">=14.0.0"
+        "queue-microtask": "^1.2.2"
       }
+    },
+    "node_modules/scule": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz",
+      "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==",
+      "dev": true
     },
     "node_modules/sortablejs": {
       "version": "1.15.1",
@@ -1595,6 +1428,18 @@
       },
       "engines": {
         "node": ">=0.8"
+      }
+    },
+    "node_modules/strip-literal": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-2.1.0.tgz",
+      "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==",
+      "dev": true,
+      "dependencies": {
+        "js-tokens": "^9.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
       }
     },
     "node_modules/sweetalert2": {
@@ -1626,21 +1471,126 @@
       "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
       "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
     },
+    "node_modules/ufo": {
+      "version": "1.5.3",
+      "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.5.3.tgz",
+      "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==",
+      "dev": true
+    },
     "node_modules/undici-types": {
       "version": "5.26.5",
       "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz",
       "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
       "dev": true
     },
-    "node_modules/unplugin": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.5.0.tgz",
-      "integrity": "sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==",
+    "node_modules/unimport": {
+      "version": "3.7.2",
+      "resolved": "https://registry.npmmirror.com/unimport/-/unimport-3.7.2.tgz",
+      "integrity": "sha512-91mxcZTadgXyj3lFWmrGT8GyoRHWuE5fqPOjg5RVtF6vj+OfM5G6WCzXjuYtSgELE5ggB34RY4oiCSEP8I3AHw==",
+      "dev": true,
       "dependencies": {
-        "acorn": "^8.10.0",
-        "chokidar": "^3.5.3",
+        "@rollup/pluginutils": "^5.1.0",
+        "acorn": "^8.11.3",
+        "escape-string-regexp": "^5.0.0",
+        "estree-walker": "^3.0.3",
+        "fast-glob": "^3.3.2",
+        "local-pkg": "^0.5.0",
+        "magic-string": "^0.30.10",
+        "mlly": "^1.7.0",
+        "pathe": "^1.1.2",
+        "pkg-types": "^1.1.1",
+        "scule": "^1.3.0",
+        "strip-literal": "^2.1.0",
+        "unplugin": "^1.10.1"
+      }
+    },
+    "node_modules/unimport/node_modules/estree-walker": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz",
+      "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+      "dev": true,
+      "dependencies": {
+        "@types/estree": "^1.0.0"
+      }
+    },
+    "node_modules/unimport/node_modules/local-pkg": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.5.0.tgz",
+      "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==",
+      "dev": true,
+      "dependencies": {
+        "mlly": "^1.4.2",
+        "pkg-types": "^1.0.3"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/unplugin": {
+      "version": "1.10.1",
+      "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-1.10.1.tgz",
+      "integrity": "sha512-d6Mhq8RJeGA8UfKCu54Um4lFA0eSaRa3XxdAJg8tIdxbu1ubW0hBCZUL7yI2uGyYCRndvbK8FLHzqy2XKfeMsg==",
+      "dependencies": {
+        "acorn": "^8.11.3",
+        "chokidar": "^3.6.0",
         "webpack-sources": "^3.2.3",
-        "webpack-virtual-modules": "^0.5.0"
+        "webpack-virtual-modules": "^0.6.1"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/unplugin-auto-import": {
+      "version": "0.17.6",
+      "resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-0.17.6.tgz",
+      "integrity": "sha512-dmX0Pex5DzMzVuALkexboOZvh51fL/BD6aoPO7qHoTYGlQp0GRKsREv2KMF1lzYI9SXKQiRxAjwzbQnrFFNydQ==",
+      "dev": true,
+      "dependencies": {
+        "@antfu/utils": "^0.7.8",
+        "@rollup/pluginutils": "^5.1.0",
+        "fast-glob": "^3.3.2",
+        "local-pkg": "^0.5.0",
+        "magic-string": "^0.30.10",
+        "minimatch": "^9.0.4",
+        "unimport": "^3.7.1",
+        "unplugin": "^1.10.1"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "@nuxt/kit": "^3.2.2",
+        "@vueuse/core": "*"
+      },
+      "peerDependenciesMeta": {
+        "@nuxt/kit": {
+          "optional": true
+        },
+        "@vueuse/core": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/unplugin-auto-import/node_modules/local-pkg": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.5.0.tgz",
+      "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==",
+      "dev": true,
+      "dependencies": {
+        "mlly": "^1.4.2",
+        "pkg-types": "^1.0.3"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
       }
     },
     "node_modules/vite": {
@@ -1710,48 +1660,15 @@
         "@vue/shared": "3.3.4"
       }
     },
-    "node_modules/vue-echarts": {
-      "version": "6.7.3",
-      "resolved": "https://registry.npmmirror.com/vue-echarts/-/vue-echarts-6.7.3.tgz",
-      "integrity": "sha512-vXLKpALFjbPphW9IfQPOVfb1KjGZ/f8qa/FZHi9lZIWzAnQC1DgnmEK3pJgEkyo6EP7UnX6Bv/V3Ke7p+qCNXA==",
-      "hasInstallScript": true,
+    "node_modules/vue-draggable-plus": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmmirror.com/vue-draggable-plus/-/vue-draggable-plus-0.5.0.tgz",
+      "integrity": "sha512-A5TT5+M5JceROSjPO9aDZTsrSN1TetEs419czPlboomarSiGIBIxTp2WD7XH53EHMrbO7Qo+leRiHWV/rMlyjA==",
       "dependencies": {
-        "resize-detector": "^0.3.0",
-        "vue-demi": "^0.13.11"
+        "@types/sortablejs": "^1.15.8"
       },
       "peerDependencies": {
-        "@vue/composition-api": "^1.0.5",
-        "@vue/runtime-core": "^3.0.0",
-        "echarts": "^5.4.1",
-        "vue": "^2.6.12 || ^3.1.1"
-      },
-      "peerDependenciesMeta": {
-        "@vue/composition-api": {
-          "optional": true
-        },
-        "@vue/runtime-core": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/vue-echarts/node_modules/vue-demi": {
-      "version": "0.13.11",
-      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.11.tgz",
-      "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==",
-      "hasInstallScript": true,
-      "bin": {
-        "vue-demi-fix": "bin/vue-demi-fix.js",
-        "vue-demi-switch": "bin/vue-demi-switch.js"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "@vue/composition-api": "^1.0.0-rc.1",
-        "vue": "^3.0.0-0 || ^2.6.0"
+        "@types/sortablejs": "^1.15.0"
       },
       "peerDependenciesMeta": {
         "@vue/composition-api": {
@@ -1770,6 +1687,9 @@
       },
       "engines": {
         "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
       },
       "peerDependencies": {
         "vue": "^3.0.0"
@@ -1811,9 +1731,9 @@
       }
     },
     "node_modules/webpack-virtual-modules": {
-      "version": "0.5.0",
-      "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz",
-      "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw=="
+      "version": "0.6.2",
+      "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
+      "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="
     },
     "node_modules/wmf": {
       "version": "1.0.2",
@@ -1866,6 +1786,12 @@
     }
   },
   "dependencies": {
+    "@antfu/utils": {
+      "version": "0.7.8",
+      "resolved": "https://registry.npmmirror.com/@antfu/utils/-/utils-0.7.8.tgz",
+      "integrity": "sha512-rWQkqXRESdjXtc+7NRfK9lASQjpXJu1ayp7qi1d23zZorY+wBHVLHHoVcMsEnkqEBWTFqbztO7/QdJFzyEcLTg==",
+      "dev": true
+    },
     "@babel/helper-string-parser": {
       "version": "7.22.5",
       "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
@@ -1902,157 +1828,10 @@
       "integrity": "sha512-PSBn3elNoanENc1vnCfh+3WA9fimRC7n+fWkf3rE5jvv+aBohNHABC/KAR5KWPecxWxDTVT1ERpRbOMRcOV/vA==",
       "requires": {}
     },
-    "@esbuild/android-arm": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz",
-      "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/android-arm64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz",
-      "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/android-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz",
-      "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/darwin-arm64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz",
-      "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/darwin-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz",
-      "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/freebsd-arm64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz",
-      "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/freebsd-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz",
-      "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/linux-arm": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz",
-      "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/linux-arm64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz",
-      "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/linux-ia32": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz",
-      "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/linux-loong64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz",
-      "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/linux-mips64el": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz",
-      "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/linux-ppc64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz",
-      "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/linux-riscv64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz",
-      "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/linux-s390x": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz",
-      "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/linux-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz",
-      "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/netbsd-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz",
-      "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/openbsd-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz",
-      "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/sunos-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz",
-      "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/win32-arm64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz",
-      "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==",
-      "dev": true,
-      "optional": true
-    },
     "@esbuild/win32-ia32": {
       "version": "0.18.20",
       "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz",
       "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==",
-      "dev": true,
-      "optional": true
-    },
-    "@esbuild/win32-x64": {
-      "version": "0.18.20",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz",
-      "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==",
       "dev": true,
       "optional": true
     },
@@ -2111,15 +1890,41 @@
       "resolved": "https://registry.npmmirror.com/@kurkle/color/-/color-0.3.2.tgz",
       "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw=="
     },
+    "@nodelib/fs.scandir": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
+      }
+    },
+    "@nodelib/fs.stat": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+      "dev": true
+    },
+    "@nodelib/fs.walk": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      }
+    },
     "@popperjs/core": {
       "version": "npm:@sxzz/popperjs-es@2.11.7",
       "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
       "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ=="
     },
     "@rollup/pluginutils": {
-      "version": "5.0.5",
-      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.5.tgz",
-      "integrity": "sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==",
+      "version": "5.1.0",
+      "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz",
+      "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==",
       "requires": {
         "@types/estree": "^1.0.0",
         "estree-walker": "^2.0.2",
@@ -2163,10 +1968,9 @@
       }
     },
     "@types/sortablejs": {
-      "version": "1.15.7",
-      "resolved": "https://registry.npmmirror.com/@types/sortablejs/-/sortablejs-1.15.7.tgz",
-      "integrity": "sha512-PvgWCx1Lbgm88FdQ6S7OGvLIjWS66mudKPlfdrWil0TjsO5zmoZmzoKiiwRShs1dwPgrlkr0N4ewuy0/+QUXYQ==",
-      "dev": true
+      "version": "1.15.8",
+      "resolved": "https://registry.npmmirror.com/@types/sortablejs/-/sortablejs-1.15.8.tgz",
+      "integrity": "sha512-b79830lW+RZfwaztgs1aVPgbasJ8e7AXtZYHTELNXZPsERt4ymJdjV4OccDbHQAvHrCcFpbF78jkm0R6h/pZVg=="
     },
     "@types/web-bluetooth": {
       "version": "0.0.16",
@@ -2174,9 +1978,9 @@
       "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ=="
     },
     "@vitejs/plugin-vue": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.4.0.tgz",
-      "integrity": "sha512-xdguqb+VUwiRpSg+nsc2HtbAUSGak25DXYvpQQi4RVU1Xq1uworyoH/md9Rfd8zMmPR/pSghr309QNcftUVseg==",
+      "version": "4.6.2",
+      "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.6.2.tgz",
+      "integrity": "sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==",
       "dev": true,
       "requires": {}
     },
@@ -2351,9 +2155,9 @@
       }
     },
     "acorn": {
-      "version": "8.10.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
-      "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw=="
+      "version": "8.12.0",
+      "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.12.0.tgz",
+      "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw=="
     },
     "adler-32": {
       "version": "1.3.1",
@@ -2362,7 +2166,7 @@
     },
     "anymatch": {
       "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+      "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz",
       "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
       "requires": {
         "normalize-path": "^3.0.0",
@@ -2399,10 +2203,25 @@
         "proxy-from-env": "^1.1.0"
       }
     },
+    "balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+      "dev": true
+    },
     "binary-extensions": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
-      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz",
+      "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="
+    },
+    "brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "dev": true,
+      "requires": {
+        "balanced-match": "^1.0.0"
+      }
     },
     "braces": {
       "version": "3.0.2",
@@ -2430,9 +2249,9 @@
       }
     },
     "chokidar": {
-      "version": "3.5.3",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
-      "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+      "version": "3.6.0",
+      "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz",
+      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
       "requires": {
         "anymatch": "~3.1.2",
         "braces": "~3.0.2",
@@ -2456,6 +2275,12 @@
       "requires": {
         "delayed-stream": "~1.0.0"
       }
+    },
+    "confbox": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.7.tgz",
+      "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==",
+      "dev": true
     },
     "crc-32": {
       "version": "1.2.2",
@@ -2557,6 +2382,12 @@
       "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
       "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
     },
+    "escape-string-regexp": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+      "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+      "dev": true
+    },
     "estree-walker": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
@@ -2567,6 +2398,28 @@
       "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz",
       "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
       "dev": true
+    },
+    "fast-glob": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz",
+      "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.stat": "^2.0.2",
+        "@nodelib/fs.walk": "^1.2.3",
+        "glob-parent": "^5.1.2",
+        "merge2": "^1.3.0",
+        "micromatch": "^4.0.4"
+      }
+    },
+    "fastq": {
+      "version": "1.17.1",
+      "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.17.1.tgz",
+      "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+      "dev": true,
+      "requires": {
+        "reusify": "^1.0.4"
+      }
     },
     "fill-range": {
       "version": "7.0.1",
@@ -2595,12 +2448,6 @@
       "version": "1.1.2",
       "resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz",
       "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA=="
-    },
-    "fsevents": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
-      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
-      "optional": true
     },
     "glob-parent": {
       "version": "5.1.2",
@@ -2635,15 +2482,9 @@
         "micromatch": "^4.0.5"
       }
     },
-    "immutable": {
-      "version": "4.3.6",
-      "resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.3.6.tgz",
-      "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==",
-      "dev": true
-    },
     "is-binary-path": {
       "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
       "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
       "requires": {
         "binary-extensions": "^2.0.0"
@@ -2673,6 +2514,12 @@
       "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
       "dev": true
     },
+    "js-tokens": {
+      "version": "9.0.0",
+      "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-9.0.0.tgz",
+      "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==",
+      "dev": true
+    },
     "local-pkg": {
       "version": "0.4.3",
       "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz",
@@ -2695,9 +2542,9 @@
       "requires": {}
     },
     "magic-string": {
-      "version": "0.30.5",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz",
-      "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==",
+      "version": "0.30.10",
+      "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.10.tgz",
+      "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==",
       "requires": {
         "@jridgewell/sourcemap-codec": "^1.4.15"
       }
@@ -2714,6 +2561,12 @@
       "version": "6.0.0",
       "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz",
       "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="
+    },
+    "merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+      "dev": true
     },
     "micromatch": {
       "version": "4.0.5",
@@ -2738,6 +2591,27 @@
         "mime-db": "1.52.0"
       }
     },
+    "minimatch": {
+      "version": "9.0.4",
+      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.4.tgz",
+      "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
+      "dev": true,
+      "requires": {
+        "brace-expansion": "^2.0.1"
+      }
+    },
+    "mlly": {
+      "version": "1.7.1",
+      "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.7.1.tgz",
+      "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==",
+      "dev": true,
+      "requires": {
+        "acorn": "^8.11.3",
+        "pathe": "^1.1.2",
+        "pkg-types": "^1.1.1",
+        "ufo": "^1.5.3"
+      }
+    },
     "moment": {
       "version": "2.30.1",
       "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
@@ -2756,7 +2630,7 @@
     },
     "normalize-path": {
       "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+      "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz",
       "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
     },
     "normalize-wheel-es": {
@@ -2765,9 +2639,9 @@
       "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw=="
     },
     "pathe": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz",
-      "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q=="
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/pathe/-/pathe-1.1.2.tgz",
+      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="
     },
     "picocolors": {
       "version": "1.0.0",
@@ -2802,6 +2676,17 @@
       "integrity": "sha512-tZbNGf2vjAQcIm7alK40sE51Qu/m9oWr+rEgNm/2AWr1huFxj72CjvpQcIQzMknDBJEkQznCLAGtJTIcLKrKdw==",
       "requires": {}
     },
+    "pkg-types": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.1.1.tgz",
+      "integrity": "sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==",
+      "dev": true,
+      "requires": {
+        "confbox": "^0.1.7",
+        "mlly": "^1.7.0",
+        "pathe": "^1.1.2"
+      }
+    },
     "postcss": {
       "version": "8.4.31",
       "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
@@ -2817,9 +2702,15 @@
       "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
       "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
     },
+    "queue-microtask": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
+      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+      "dev": true
+    },
     "readdirp": {
       "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+      "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz",
       "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
       "requires": {
         "picomatch": "^2.2.1"
@@ -2831,10 +2722,11 @@
       "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
       "dev": true
     },
-    "resize-detector": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmmirror.com/resize-detector/-/resize-detector-0.3.0.tgz",
-      "integrity": "sha512-R/tCuvuOHQ8o2boRP6vgx8hXCCy87H1eY9V5imBYeVNyNVpuL9ciReSccLj2gDcax9+2weXy3bc8Vv+NRXeEvQ=="
+    "reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz",
+      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+      "dev": true
     },
     "rollup": {
       "version": "3.29.4",
@@ -2845,16 +2737,20 @@
         "fsevents": "~2.3.2"
       }
     },
-    "sass": {
-      "version": "1.77.6",
-      "resolved": "https://registry.npmmirror.com/sass/-/sass-1.77.6.tgz",
-      "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==",
+    "run-parallel": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz",
+      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
       "dev": true,
       "requires": {
-        "chokidar": ">=3.0.0 <4.0.0",
-        "immutable": "^4.0.0",
-        "source-map-js": ">=0.6.2 <2.0.0"
+        "queue-microtask": "^1.2.2"
       }
+    },
+    "scule": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz",
+      "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==",
+      "dev": true
     },
     "sortablejs": {
       "version": "1.15.1",
@@ -2872,6 +2768,15 @@
       "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
       "requires": {
         "frac": "~1.1.2"
+      }
+    },
+    "strip-literal": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-2.1.0.tgz",
+      "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==",
+      "dev": true,
+      "requires": {
+        "js-tokens": "^9.0.0"
       }
     },
     "sweetalert2": {
@@ -2897,21 +2802,97 @@
       "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
       "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
     },
+    "ufo": {
+      "version": "1.5.3",
+      "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.5.3.tgz",
+      "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==",
+      "dev": true
+    },
     "undici-types": {
       "version": "5.26.5",
       "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz",
       "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
       "dev": true
     },
-    "unplugin": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.5.0.tgz",
-      "integrity": "sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==",
+    "unimport": {
+      "version": "3.7.2",
+      "resolved": "https://registry.npmmirror.com/unimport/-/unimport-3.7.2.tgz",
+      "integrity": "sha512-91mxcZTadgXyj3lFWmrGT8GyoRHWuE5fqPOjg5RVtF6vj+OfM5G6WCzXjuYtSgELE5ggB34RY4oiCSEP8I3AHw==",
+      "dev": true,
       "requires": {
-        "acorn": "^8.10.0",
-        "chokidar": "^3.5.3",
+        "@rollup/pluginutils": "^5.1.0",
+        "acorn": "^8.11.3",
+        "escape-string-regexp": "^5.0.0",
+        "estree-walker": "^3.0.3",
+        "fast-glob": "^3.3.2",
+        "local-pkg": "^0.5.0",
+        "magic-string": "^0.30.10",
+        "mlly": "^1.7.0",
+        "pathe": "^1.1.2",
+        "pkg-types": "^1.1.1",
+        "scule": "^1.3.0",
+        "strip-literal": "^2.1.0",
+        "unplugin": "^1.10.1"
+      },
+      "dependencies": {
+        "estree-walker": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz",
+          "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+          "dev": true,
+          "requires": {
+            "@types/estree": "^1.0.0"
+          }
+        },
+        "local-pkg": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.5.0.tgz",
+          "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==",
+          "dev": true,
+          "requires": {
+            "mlly": "^1.4.2",
+            "pkg-types": "^1.0.3"
+          }
+        }
+      }
+    },
+    "unplugin": {
+      "version": "1.10.1",
+      "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-1.10.1.tgz",
+      "integrity": "sha512-d6Mhq8RJeGA8UfKCu54Um4lFA0eSaRa3XxdAJg8tIdxbu1ubW0hBCZUL7yI2uGyYCRndvbK8FLHzqy2XKfeMsg==",
+      "requires": {
+        "acorn": "^8.11.3",
+        "chokidar": "^3.6.0",
         "webpack-sources": "^3.2.3",
-        "webpack-virtual-modules": "^0.5.0"
+        "webpack-virtual-modules": "^0.6.1"
+      }
+    },
+    "unplugin-auto-import": {
+      "version": "0.17.6",
+      "resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-0.17.6.tgz",
+      "integrity": "sha512-dmX0Pex5DzMzVuALkexboOZvh51fL/BD6aoPO7qHoTYGlQp0GRKsREv2KMF1lzYI9SXKQiRxAjwzbQnrFFNydQ==",
+      "dev": true,
+      "requires": {
+        "@antfu/utils": "^0.7.8",
+        "@rollup/pluginutils": "^5.1.0",
+        "fast-glob": "^3.3.2",
+        "local-pkg": "^0.5.0",
+        "magic-string": "^0.30.10",
+        "minimatch": "^9.0.4",
+        "unimport": "^3.7.1",
+        "unplugin": "^1.10.1"
+      },
+      "dependencies": {
+        "local-pkg": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.5.0.tgz",
+          "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==",
+          "dev": true,
+          "requires": {
+            "mlly": "^1.4.2",
+            "pkg-types": "^1.0.3"
+          }
+        }
       }
     },
     "vite": {
@@ -2938,21 +2919,12 @@
         "@vue/shared": "3.3.4"
       }
     },
-    "vue-echarts": {
-      "version": "6.7.3",
-      "resolved": "https://registry.npmmirror.com/vue-echarts/-/vue-echarts-6.7.3.tgz",
-      "integrity": "sha512-vXLKpALFjbPphW9IfQPOVfb1KjGZ/f8qa/FZHi9lZIWzAnQC1DgnmEK3pJgEkyo6EP7UnX6Bv/V3Ke7p+qCNXA==",
+    "vue-draggable-plus": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmmirror.com/vue-draggable-plus/-/vue-draggable-plus-0.5.0.tgz",
+      "integrity": "sha512-A5TT5+M5JceROSjPO9aDZTsrSN1TetEs419czPlboomarSiGIBIxTp2WD7XH53EHMrbO7Qo+leRiHWV/rMlyjA==",
       "requires": {
-        "resize-detector": "^0.3.0",
-        "vue-demi": "^0.13.11"
-      },
-      "dependencies": {
-        "vue-demi": {
-          "version": "0.13.11",
-          "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.11.tgz",
-          "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==",
-          "requires": {}
-        }
+        "@types/sortablejs": "^1.15.8"
       }
     },
     "vue-i18n": {
@@ -2988,9 +2960,9 @@
       "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w=="
     },
     "webpack-virtual-modules": {
-      "version": "0.5.0",
-      "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz",
-      "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw=="
+      "version": "0.6.2",
+      "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
+      "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="
     },
     "wmf": {
       "version": "1.0.2",
diff --git a/UI-Project/package.json b/UI-Project/package.json
index 15242fb..7a586a0 100644
--- a/UI-Project/package.json
+++ b/UI-Project/package.json
@@ -20,8 +20,8 @@
     "sortablejs": "^1.15.1",
     "sweetalert2": "^11.10.7",
     "vue": "^3.3.4",
-    "vue-echarts": "^6.7.3",
-    "vue-i18n": "^9.13.1",
+    "vue-draggable-plus": "^0.5.0",
+    "vue-i18n": "^9.10.1",
     "vue-router": "^4.2.4",
     "vxe-table": "^4.5.15",
     "xe-utils": "^3.5.14",
@@ -29,9 +29,9 @@
   },
   "devDependencies": {
     "@types/sortablejs": "^1.15.7",
-    "@vitejs/plugin-vue": "^4.3.4",
+    "@vitejs/plugin-vue": "^4.6.2",
     "http-proxy-middleware": "^3.0.0",
-    "sass": "^1.77.6",
+    "unplugin-auto-import": "^0.17.6",
     "vite": "^4.4.9"
   }
 }
diff --git a/UI-Project/src/lang/LanguageMixin.js b/UI-Project/src/lang/LanguageMixin.js
deleted file mode 100644
index 5a90328..0000000
--- a/UI-Project/src/lang/LanguageMixin.js
+++ /dev/null
@@ -1,14 +0,0 @@
-export default {
-  created() {
-    const localStorageLang = localStorage.getItem('preferredLanguage');
-    if (localStorageLang) {
-      this.$i18n.locale = localStorageLang;
-    }
-  },
-  methods: {
-    switchLanguage(lang) {
-      this.$i18n.locale = lang;
-      localStorage.setItem('preferredLanguage', lang);
-    }
-  }
-}
\ No newline at end of file
diff --git a/UI-Project/src/lang/en.js b/UI-Project/src/lang/en.js
new file mode 100644
index 0000000..d80a9be
--- /dev/null
+++ b/UI-Project/src/lang/en.js
@@ -0,0 +1,302 @@
+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:'袨褌屑械薪邪',
+        glassID:'小褌械泻谢褟薪薪褘泄 ID',
+        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:'小褌邪薪褑懈褟 薪芯屑械褉',
+        shelfnumber:'袧芯屑械褉 褋褌芯泄泻懈 褉械谐懈褋褌褉邪褑懈懈锛�',
+        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/i18n.js b/UI-Project/src/lang/i18n.js
deleted file mode 100644
index 080bd7c..0000000
--- a/UI-Project/src/lang/i18n.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// i18n.js
- 
-import { createI18n } from 'vue-i18n'
-import zhCn from './lang/locales/zh-CN.json'
-import enUs from './lang/locales/en-US.json'
- 
-const i18n = createI18n({
-  locale: 'zh-CN', // 璁剧疆榛樿璇█
-  messages: {
-    'zh-CN': zhCn,
-    'en-US': enUs
-  }
-})
- 
-export default i18n
\ No newline at end of file
diff --git a/UI-Project/src/lang/index.js b/UI-Project/src/lang/index.js
new file mode 100644
index 0000000..2a371f6
--- /dev/null
+++ b/UI-Project/src/lang/index.js
@@ -0,0 +1,18 @@
+
+import { createI18n}  from 'vue-i18n'
+import zh from "./zh"
+import en from "./en"
+
+let messages = {
+    zh:zh,
+    en: en
+}
+
+const i18n = createI18n({
+    locale: localStorage.getItem('lang') || 'zh', // 璁剧疆褰撳墠璇█绫诲瀷
+    legacy: false, // 濡傛灉瑕佹敮鎸乧ompositionAPI锛屾椤瑰繀椤昏缃负false;
+    globalInjection: true, // 鍏ㄥ眬娉ㄥ唽$t鏂规硶
+    messages
+})
+
+export default i18n
\ No newline at end of file
diff --git a/UI-Project/src/lang/locales/en-US.json b/UI-Project/src/lang/locales/en-US.json
deleted file mode 100644
index dfae361..0000000
--- a/UI-Project/src/lang/locales/en-US.json
+++ /dev/null
@@ -1,575 +0,0 @@
-{
-  "Clear":"Clear",
-  "ip":"192.168.10.21",
-  "systemTitle": "Login System",
-  "usernamePlaceholder": "Please enter username",
-  "passwordPlaceholder": "Please enter password",
-  "loginButton": "Login",
-  "registerButton": "Register",
-  "resetButton": "Reset",
-  "usernameRequired": "Please enter username",
-  "usernameLength": "Username must be between 5 and 15 characters",
-  "passwordRequired": "Please enter password",
-  "passwordLength": "Password must be between 5 and 15 characters",
-  "loginSuccess": "Login successful",
-  "langBtnCN": "Chinese",
-  "langBtnEN": "English",
-  "langHome": "Home",
-  "langUserManagement": "User Management",
-  "langUserList": "User List",
-  "langUsernamePlaceholder": "Please enter username",
-  "langEmailPlaceholder": "Please enter email",
-  "langSearch": "Search",
-  "langAddUser": "Add User",
-  "langUsername": "Username",
-  "langEmail": "Email",
-  "langCreateTime": "Create Time",
-  "langDisabled": "Disabled",
-  "langAction": "Action",
-  "langEdit": "Edit",
-  "langDelete": "Delete",
-  "langAddUserTitle": "Add User",
-  "langPassword": "Password",
-  "langState": "State",
-  "langSelect": "Please select",
-  "langCancel": "Cancel",
-  "langConfirm": "Confirm",
-  "langEditUserTitle": "Edit User",
-  "northglassMESsystem": "NorthGlassMesSystem",
-  "exit": "exit",
-  "changePassword": "changePassword",
-  "resetPassword": "resetPassword",
-  "Old password":"Old password",
-  "New password":"New password",
-  "Confirm password":"Confirm password",
-  "home": "Home",
-  "role": "role",
-  "langRoleManagement": "Role Management",
-  "langRoleList": "Role List",
-  "langEnterRoleName": "Please enter role name",
-  "langAddRole": "Add Role",
-  "langName": "Name",
-  "langIsValid": "Is Valid",
-  "langOperation": "Operation",
-  "langPleaseSelect": "Please select",
-  "langValid": "Valid",
-  "langInvalid": "Invalid",
-  "langAddRoleSuccess": "Add role successfully",
-  "langEnterName": "Please enter name",
-  "langLengthBetween": "Length should be between",
-  "langAnd": "and",
-  "langCharacters": "characters",
-  "langEnterState": "Please enter state",
-  "langUpdateState": "Update state successfully",
-  "langEditRole": "Edit Role",
-  "langEditRoleSuccess": "Edit role successfully",
-  "langDeleteRoleConfirm": "Are you sure you want to delete this role?",
-  "langPrompt": "Prompt",
-  "langDeleteRoleSuccess": "Delete role successfully",
-  "langCancelDelete": "Cancelled deleting",
-  "langRoleName": "langRoleName",
-  "updateSuccessMessage": "updateSuccessMessage",
-  "paginationTotal": "Total {total}",
-  "paginationSizes": "Items per page",
-  "paginationPrev": "Previous",
-  "paginationPager": "{currentPage}/{pageCount}",
-  "paginationNext": "Next",
-  "paginationJumper": "Jump to",
-  "breadcrumb": {
-    "home": "Home",
-    "permissionManagement": "Permission Management",
-    "permissionList": "Permission List"
-  },
-  "search": {
-    "placeholder": "Enter keywords"
-  },
-  "button": {
-    "addPermission": "Add Permission",
-    "cancel": "Cancel",
-    "confirm": "Confirm"
-  },
-  "table": {
-    "role": "Role",
-    "permissionDescription": "Permission Description",
-    "permissionValue": "Permission Value",
-    "createTime": "Create Time",
-    "isActive": "Is Active",
-    "operation": "Operation"
-  },
-  "tooltip": {
-    "edit": "Edit",
-    "delete": "Delete"
-  },
-  "dialog": {
-    "addPermission": "Add Permission",
-    "editPermission": "Edit Permission"
-  },
-  "form": {
-    "role": "Role",
-    "select": "Please Select",
-    "permission": "Permission",
-    "isActive": "Is Active"
-  },
-  "鎿嶄綔": "Operation",
-  "鏈夋晥": "Valid",
-  "鏃犳晥": "Invalid",
-  "璇疯緭鍏ュ悕绉�": "Please enter a name",
-  "璇疯緭鍏ヨ鑹�": "Please enter a role",
-  "璇疯緭鍏ユ潈闄愭弿杩�":"Please enter a permission description",
-  "闀垮害鍦� 2 鍒� 15 涓瓧绗�": "Length between 2 and 15 characters",
-  "璇疯緭鍏ョ姸鎬�": "Please enter the status",
-  "娣诲姞瑙掕壊": "Add Role",
-  "淇敼瑙掕壊": "Edit Role",
-  "鍒犻櫎瑙掕壊": "Delete Role",
-  "姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ヨ鑹�, 鏄惁缁х画?": "This operation will permanently delete the role. Continue?",
-  "鎻愮ず": "Reminder",
-  "纭畾": "Confirm",
-  "鍙栨秷": "Cancel",
-  "娣诲姞瑙掕壊鎴愬姛": "Successfully added role",
-  "鏇存柊鐘舵�佹垚鍔�": "Successfully updated status",
-  "淇敼瑙掕壊鎴愬姛": "Successfully modified role",
-  "鍒犻櫎瑙掕壊鎴愬姛": "Successfully deleted role",
-  "translation": {
-    "D01 VFD error": "D01 VFD error",
-    "D02 VFD error": "D02 VFD error",
-    "D03 VFD error": "D03 VFD erro",
-    "D04 VFD error": "D04 VFD error",
-    "D05 VFD error": "D05 VFD error",
-    "D06 VFD error": "D06 VFD error",
-    "B01 VFD error": "B01 VFD error",
-    "B02 VFD error": "B02 VFD error",
-    "A01 VFD error": "A01 VFD error",
-    "A02 VFD error": "A02 VFD error",
-    "A01 servo turn error": "A01 servo turn error",
-    "A02 servo turn error": "A02 servo turn error",
-    "A01 servo travel error": "A01 servo travel error",
-    "A02 servo travel error": "A02 servo travel error",
-    "B01 servo travel error": "B01 servo travel error",
-    "B02 servo travel error": "B02 servo travel error",
-    "D01 DEC error": "D01 DEC error",
-    "D01 pos error": "D01 pos error",
-    "D02 DEC error": "D02 DEC error",
-    "D02 pos error": "D02 pos error",
-    "D03 DEC error": "D03 DEC error",
-    "D03 pos error": "D03 pos error",
-    "D04 DEC error": "D04 DEC error",
-    "D04 pos error": "D04 pos error",
-    "D05 DEC error": "D05 DEC error",
-    "D05 pos error": "D05 pos error",
-    "D06 DEC error": "D06 DEC error",
-    "D06 pos error": "D06 pos error",
-    "A01 DEC error": "A01 DEC error",
-    "A01 pos error": "A01 pos error",
-    "A02 DEC error": "A02 DEC error",
-    "A02 pos error": "A02 pos error",
-    "B01 IN DEC error": "B01 IN DEC error",
-    "B01 IN pos error": "B01 IN pos error",
-    "B01 OUT DEC error": "B01 OUT DEC error",
-    "B01 OUT pos error": "B01 OUT pos error",
-    "B02 IN DEC error": "B02 IN DEC error",
-    "B02 IN pos error": "B02 IN pos error",
-    "B02 OUT DEC error": "B02 OUT DEC error",
-    "B02 OUT pos error": "B02 OUT pos error"
-  },
-  "Electrical": "Electrical",
-  "Parameter": "Parameter",
-  "Action": "Action",
-  "Sign": "Sign",
-  "State": "State",
-  "Alarm": "Alarm",
-  "Distribute": "Distribute",
-  "Search": "Search",
-  "dvstate": {
-    "鑷姩": "automatic",
-    "鎵嬪姩": "manual"
-  },
-  "langUsernameLabel": "Username",
-  "langPasswordLabel": "Password",
-  "langPasswordPlaceholder": "Please enter your password",
-  "langConfirmPasswordLabel": "Confirm Password",
-  "langConfirmPasswordPlaceholder": "Please confirm your password",
-  "langEmailLabel": "Email",
-  "langQQLabel": "QQ",
-  "langQQPlaceholder": "Please enter your QQ number",
-  "langPhoneNumberLabel": "Phone Number",
-  "langPhoneNumberPlaceholder": "Please enter your phone number",
-  "langUsernameRequiredMessage": "Please enter your username",
-  "langUsernameLengthMessage": "Username length should be between 5 and 15 characters",
-  "langPasswordRequiredMessage": "Please enter your password",
-  "langPasswordLengthMessage": "Password length should be between 5 and 15 characters",
-  "langEmailRequiredMessage": "Please enter your email",
-  "langEmailFormatMessage": "Invalid email format",
-  "langRegisterButton": "Register",
-  "langResetButton": "Reset",
-  "langCancelButton": "Cancel",
-  "langRegisterSuccessMessage": "Registration successful",
-  "today": "today",
-  "yesterday": "yesterday",
-  "week": "week",
-  "shijian": "date",
-  "Pick a day": "Pick a day",
-  "alarmid": "id",
-  "alacontent": "content",
-  "time-on": "time-on",
-  "End-Time": "End-Time",
-  "langRegisterSuccessMessage": "Registration successful",
-
-  "娣诲姞鐢ㄦ埛鎴愬姛":"Successfully add user ",
-  "confirmResetPassword": "Are you sure you want to reset the password to the default value?",
-  "confirm": "Confirm",
-  "cancel": "Cancel",
-  "passwordResetSuccess": "Password has been reset to the default value",
-  "confirmDeleteCategory": "This operation will permanently delete the category. Do you want to continue?",
-  "prompt": "Prompt",
-  "userDeleteSuccess": "User deleted successfully",
-  "deleteCanceled": "Deletion canceled",
-  "addUserSuccess": "User added successfully",
-  "editUserSuccess": "User edited successfully",
-  "addSuccessMessage": "Added successfully",
-"deleteConfirmMessage": "Are you sure you want to delete this permission?",
-
-"confirmButtonText": "Confirm",
-"cancelButtonText": "Cancel",
-"deleteSuccessMessage": "Deleted successfully",
-"deleteCancelledMessage": "Deletion cancelled",
-
-
-  "Enter the glass barcode":"Enter the glass barcode",
-  "Manually Infeed Glass":"Manually Infeed Glass",
-  "Enter the order number":"Enter the order number",
-  "Exit the glass by order number":"Exit the glass by order number",
-  "Please confirm the glass information":"Please confirm the glass information",
-  "Please confirm the Ordering Information":"Please confirm the Ordering Information",
-  "Alarm Information":"Alarm Information",
-  "Cage Details":"Cage Details",
-  "order":"order",
-  "Length":"Length",
-  "Width":"Width",
-  "Operate":"Operate",
-  "Terminate Task":"Terminate Task",
-  "cancel":"cancel",
-  "confirm":"confirm",
-  "Number":"Number",
-  "Outfeed glass barcode":"Outfeed glass barcode",
-  "Infeed glass barcode":"Infeed glass barcode",
-  "Cage No":"Cage No",
-  "Slot No":"Slot No",
-  "Dim":"Dim",
-  "id":"id",
-  "content":"content",
-  "timeon":"timeon",
-  "endTime":"endTime",
-
-  "The Side":"The Side",
-  "Barcode":"Barcode",
-  "Order No":"Order No",
-  "List No":"List No",
-  "Box No":"Box No",
-  "Delete":"Delete",
-  "Out":"Out",
-
-  "Operation successful":"Operation successful",
-  "Operation canceled":"Operation canceled",
-  "There is no glass for this order":"There is no glass for this order",
-  "There are currently tasks":"There are currently tasks",
-  "There is no such glass":"There is no such glass",
-  "There is no such grid":"There is no such grid",
-  "No delete allowed":"No delete allowed",
-  "No out allowed":"No out allowed",
-  "Are you sure to perform this operation ?":"Are you sure to perform this operation ?",
-  "Yes":"Yes",
-  
-
-  "No":"No",
-  "Please enter the password":"Please enter the password",
-  "Password error":"Password error",
-  "DataBase Connection failed":"DataBase Connection failed",
-  "Distribute parameters":"Distribute parameters",
-  "The glass size is not within the range":"The glass size is not within the range",
-  "Add":"Add",
-  "Enable":"Enable",
-  "Disable":"Disable",
-  "Usage":"Usage",
-  "Space (Pieces)":"Space (Pieces)",
-  "This glass is already in the cage":"This glass is already in the cage",
-  "Enter the Order No":"Enter the Order No",
-  "OrderInfo":"OrderInfo",
-  "Query":"Query",
-  "permission update":"permission update",
-  "query was successful":"query was successful",
-  "Scan Code Point":"Scan Code Point",
-  "Upper film position":"Upper film position",
-  "Glass Information":"Glass Information",
-  "current Information":"current information",
-  "Modify Information":"Modify information",
-  "Clear Current":"Clear Current",
-  "Confirm":"Confirm",
-  "The glass ID already exists in the loading queue":"The glass ID already exists in the loading queue",
-  "This glass ID already exists in the sorting cage":"This glass ID already exists in the sorting cage",
-  "Outing Queue":"Outing Queue",
-  "Enter the Frame No":"Enter the Frame No",
-  "Frame No":"Frame No",
-  "Glass information corresponding to aluminum frame":"Glass information corresponding to aluminum frame",
-  "In the cage":"In the cage",
-  "Flipped":"Flipped",
-  "In the queue":"In the queue",
-  "Normal":"Normal",
-  "Entering":"Entering",
-  "Outing":"Outing",
-  "Suspend":"Suspend",
-  "Stop":"Stop",
-  "Start":"Start",
-  "Sequence":"Sequence",
-  "Position":"Position",
-  "Top":"Top",
-  "Up":"Up",
-  "Down":"Down",
-  "Unable to find the placement method of the aluminum frame":"Unable to find the placement method of the aluminum frame",
-  "Unable to find whether the aluminum frame is flipped or not":"Unable to find whether the aluminum frame is flipped or not",
-  "You do not have this permission":"You do not have this permission",
-  "This glass is already in the Queue":"This glass is already in the Queue",
-  "Complete":"Complete",
-  "Allow":"Allow",
-  "Not Allow":"Not Allow",
-  "Completed":"Completed",
-  "Waiting":"Waiting",
-  "Deleted":"Deleted",
-  "Glass State":"Glass State",
-  "Absent":"Absent",
-  "Approximately resettable time":"Approximately resettable time",
-  "EXTERIQR OUT AND BYPASS TO THE LEFT":"EXTERIQR OUT AND BYPASS TO THE LEFT",
-  "EXTERIQR OUT AND BYPASS TO THE RIGHT":"EXTERIQR OUT AND BYPASS TO THE RIGHT",
-  "Complete Task":"Complete Task",
-  "Outed":"Outed",
-  "Queue State":"Queue State",
-  "Sorting State":"Sorting State",
-  "Confirm State":"Confirm State",
-  "Next":"Next",
-  "Current Frame":"Current Frame",
-  "Outside":"Outside",
-  "Inside":"Inside",
-  "Cancel":"Cancel",
-  "Are you sure to clear this barcode ?":"Are you sure to clear this barcode ?",
-  "Terminate Feeding":"Terminate Feeding",
-  "Terminate Outing":"Terminate Outing",
-  "SoftEmergencyStop":"SoftEmergencyStop",
-  "Unable to clear glass ID in automatic mode":"Unable to clear glass ID in automatic mode",
-  "Are you sure you want an emergency stop ?":"Are you sure you want an emergency stop ?",
-  "Current State":"Current State",
-  "Automatic":"Automatic",
-  "Hand Movement":"Hand Movement",
-  "Please enter the correct glassID":"Please enter the correct glassID",
-  "Switch":"Switch",
-  "This frame has glass that is currently outing":"This frame has glass that is currently outing",
-    "ServoManualone": {
-      "A01 鎵�鍦ㄦ牸瀛�": "A01 Current Grid",
-      "鏁伴噺": "Quantity",
-      "杩涚墖ID": "IncomingId",
-      "闀垮害": "Length",
-      "楂樺害": "Height",
-      "鍙栫墖鏍煎瓙": "Pickupgrid address",
-      "瀛樼墖鏍煎瓙": "Storagegrid address",
-      "A01缈昏浆瀹炴椂浣嶇疆": "A01FlipPosition",
-      "A02缈昏浆瀹炴椂浣嶇疆": "A02FlipPosition",
-      "鏁呴殰": "Fault",
-      "澶嶄綅": "Reset",
-      "鏈洖闆�": "NotZero",
-      "鍥為浂": "Home",
-      "鐩爣鏍煎瓙": "Target Grid",
-      "A02 鎵�鍦ㄦ牸瀛�": "A02 Current Grid",
-      "鍙栫墖ID": "PickupId",
-      "A01鍗婅嚜鍔�": "A01 Semi-Auto",
-      "A01鍗婅嚜鍔ㄥ惎鍔�": "A01 Semi-Auto Start",
-      "A02鍗婅嚜鍔�": "A02 Semi-Auto",
-      "A02鍗婅嚜鍔ㄥ惎鍔�": "A02 Semi-Auto Start",
-      "B01 鎵�鍦ㄦ牸瀛�": "B01 Current Grid",
-      "B02 鎵�鍦ㄦ牸瀛�": "B02 Current Grid"
-    
-    },
-    "langParameter1": {
-
-    
-      },
-    
-        "langParameter2": {
-          "D01鎵嬪姩鐘舵��": "D01 Manual Status",
-          "娓呴櫎ID": "Clear ID",
-          "ID": "ID",
-          "A02ID": "A02ID",
-          "B01ID": "B01ID",
-          "B02ID": "B02ID",
-          "D02鎵嬪姩鐘舵��": "D02 Manual Status",
-          "D03鎵嬪姩鐘舵��": "D03 Manual Status",
-          "D04鎵嬪姩鐘舵��": "D04 Manual Status",
-          "D05鎵嬪姩鐘舵��": "D05 Manual Status",
-          "D06鎵嬪姩鐘舵��": "D06 Manual Status",
-          "A01鎵嬪姩鐘舵��": "A01 Manual Status",
-          "ID1": "ID1",
-          "ID2": "ID2",
-          "A02鎵嬪姩鐘舵��": "A02 Manual Status",
-          "B01鎵嬪姩鐘舵��": "B01 Manual Status",
-          "B02鎵嬪姩鐘舵��": "B02 Manual Status",
-          "鎵弿鏋壂鐮佺殑ID": "Scanned ID",
-          "A01褰撳墠鏍煎瓙": "A01 Current Grid",
-          "A02鎵�鍦ㄦ牸瀛�": "A02 Current Grid",
-          "B01鎵�鍦ㄦ牸瀛�": "B01 Current Grid",
-          "B02鎵�鍦ㄦ牸瀛�": "B02 Current Grid",
-          "鎬ュ仠鍚庝腑姝�/缁х画閫夋嫨": "Abort/ResumeTasks",
-          "A01缁堟/缁х画": "A01Abort/ResumeTasks",
-          "A02缁堟/缁х画": "A02Abort/ResumeTasks",
-          "瀛樼墖绛夊緟寤舵椂": "Storage wait delay",
-          "杞�ュ仠": "emgHMI"
-          
-          },
-          "langPositioning1": {
-            "鏍煎瓙闂磋窛": "GridSpacing",
-            "瀛樼墖鎺ョ墖鍦板潃": "StorageReceivingAddress",
-            "鍑虹墖鎺ョ墖鍦板潃": "OutgoingReceivingAddress",
-            "瀛樼墖鏍间綅缃瀹�": "StorageGridPositionSetting",
-            "1#鏍煎湴鍧�": "grid address1# ",
-            "22#鏍煎湴鍧�": "grid address22#",
-            "43#鏍煎湴鍧�": "grid address43#",
-            "64#鏍煎湴鍧�": "grid address64#",
-            "85#鏍煎湴鍧�": "grid address85#",
-            "106#鏍煎湴鍧�": "grid address106#",
-            "127#鏍煎湴鍧�": "grid address127#",
-            "148#鏍煎湴鍧�": "grid address148#",
-            "169#鏍煎湴鍧�": "grid address169#",
-            "190#鏍煎湴鍧�": "grid address190#",
-            "鍑虹墖鏍间綅缃瀹�": "OutgoingGridPositionSetting",
-            "A01鎵�鍦ㄦ牸瀛�": "A01 grid address",
-            "鏁伴噺": "Quantity",
-            "杩涚墖ID": "IncomingId",
-            "闀垮害": "Length",
-            "楂樺害": "Height",
-            "鍙栫墖鏍煎瓙": "Pickupgrid address",
-            "缈昏浆瀹炴椂浣嶇疆": "FlipPosition",
-            "鏁呴殰": "Fault",
-            "澶嶄綅": "Reset",
-            "鏈洖闆�": "NotZero",
-            "鍥為浂": "Zero",
-            "鐩爣鏍煎瓙": "Target Grid",
-            "鏍煎瓙闂磋窛": "GridSpacing",
-            "瀛樼墖鎺ョ墖鍦板潃": "StorageReceivingAddress",
-            "鍑虹墖鎺ョ墖鍦板潃": "OutgoingReceivingAddress",
-            "瀛樼墖鏍间綅缃瀹�": "StorageGridPositionSetting",
-            "1#鏍煎湴鍧�": "grid address1# ",
-            "22#鏍煎湴鍧�": "grid address22#",
-            "43#鏍煎湴鍧�": "grid address43#",
-            "64#鏍煎湴鍧�": "grid address64#",
-            "85#鏍煎湴鍧�": "grid address85#",
-            "106#鏍煎湴鍧�": "grid address106#",
-            "127#鏍煎湴鍧�": "grid address127#",
-            "148#鏍煎湴鍧�": "grid address148#",
-            "169#鏍煎湴鍧�": "grid address169#",
-            "190#鏍煎湴鍧�": "grid address190#",
-            "鍑虹墖鏍间綅缃瀹�": "OutgoingGridPositionSetting",
-            "B01鏍间綅缃瀹�":"B01PositionSetting",
-            "B02浣嶇疆璁惧畾":"B02PositionSetting"
-            },
-            "langPositioning2": {
-             
-              },  "ManualonePositionlang": {
-                "A01鎵嬪姩鏍煎瓙": "A01 Target grid(Manual)",
-                "A01瀹氫綅閫熷害": "A01 TRAVEL POS Velocity manual",
-                "A01褰撳墠鏍煎瓙": "A01 Current Grid",
-                "A01鍚姩": "A01 Start",
-                "鏁呴殰": "Fault",
-                "澶嶄綅": "Reset",
-                "A02鎵嬪姩鏍煎瓙": "A02 Target grid(Manual)",
-                "A02瀹氫綅閫熷害": "A02 TRAVEL POS Velocity manual",
-                "A02褰撳墠鏍煎瓙": "A02 Current Grid",
-                "A02鍚姩": "A02 Start",
-                "澶嶄綅": "Reset",
-                "B01鎵嬪姩鏍煎瓙": "B01 Target grid(Manual)",
-                "B01瀹氫綅閫熷害": "B01 TRAVEL POS Velocity manual",
-                "B01褰撳墠鏍煎瓙": "B01 Current Grid",
-                "B01鍚姩": "B01 Start",
-                "澶嶄綅": "Reset",
-                "鍥為浂": "Home",
-                "鏈洖闆�": "NotZero",
-                "B02鎵嬪姩鏍煎瓙": "B02 Target grid(Manual)",
-                "B02瀹氫綅閫熷害": "B02 TRAVEL POS Velocity manual",
-                "B02褰撳墠鏍煎瓙": "B02 Current Grid",
-                "B02鍚姩": "B02 Start",
-                "澶嶄綅": "Reset",
-                "A01瀹炴椂浣嶇疆": "A01 tavel Actual Position",
-                "A02瀹炴椂浣嶇疆": "A02 tavel Actual Position",
-                "B01瀹炴椂浣嶇疆": "B02 tavel Actual Position",
-                "B02瀹炴椂浣嶇疆": "B02 tavel Actual Position"
-              },
-              "Manualoneposition2lang": {
-                "A01鎵嬪姩浣嶇疆": "A01 turn Target Angle(Manual)",
-                "A01瀹氫綅閫熷害": "A01 TURN POS Velocity manual",
-                "A01缈昏浆瀹炴椂浣嶇疆": "A01 turn Actual angle",
-                "A01缈昏浆鍚姩": "A01 SERVE TURN",
-                "鏁呴殰": "Fault",
-                "澶嶄綅": "Reset",
-                "鏈洖闆�": "NotZero",
-                "鍥為浂": "Home",
-                "A02鎵嬪姩浣嶇疆": "A02 turn Target Angle(Manual)",
-                "A02瀹氫綅閫熷害": "A02 TURN POS Velocity manual",
-                "A02缈昏浆瀹炴椂浣嶇疆": "A02 turn Actual angle",
-                "A02缈昏浆鍚姩": "A02 SERVE TURN",
-                "A02澶嶄綅": "Reset"
-            
-               
-              },
-              "AutomaticParameterSettinglang": {
-                "A01琛岃蛋楂橀�熻搴�": "A01 turn Angle1",
-                "A01琛岃蛋浣庨�熻搴�": "A01 turn Angle2",
-                "A01杈撻�佹帴鐗囪搴�": "A01 turn Angle3",
-                "A01绗煎瓙瑙掑害": "A01 turn Angle4",
-                "A02琛岃蛋楂橀�熻搴�": "A02 turn Angle1",
-                "A02琛岃蛋浣庨�熻搴�": "A02 turn Angle2",
-                "A02杈撻�佹帴鐗囪搴�": "A02 turn Angle3",
-                "A02绗煎瓙瑙掑害": "A02 turn Angle4",
-                "澶ц溅鑷姩閫熷害": "A01 A02 TRAVEL POS Velocity AUTO",
-                "灏忚溅鑷姩閫熷害": "B01 B02 TRAVEL POS Velocity AUTO",
-                "鑷姩缈昏浆閫熷害": "A01 A02 TURN POS Velocity AUTO",
-                "A01~A02杈撻��": "A01~A02 Conveying",
-                "B01~B02杈撻��": "B01~B02 Conveying",
-                "D01~D06杈撻��": "D01~D06 Conveying",
-                "缈昏浆鐐瑰姩閫熷害": "Flip Jog Speed",
-                "灏忚溅鐐瑰姩閫熷害": "Cart Jog Speed",
-                "鏈�楂橀�熷害": "Max Speed",
-                "楂橀�熺嚎閫熷害": "High-Speed Line Speed",
-                "浣庨�熺嚎閫熷害": "Low-Speed Line Speed",
-                "鎵嬪姩閫熷害": "Manual Speed"
-              },
-              "ManualJoglang": {
-                "D01杈撻��": "D01 VFD conveyor",
-                "D02杈撻��": "D02 VFD conveyor",
-                "D03杈撻��": "D03 VFD conveyor",
-                "D04杈撻��": "D04 VFD conveyor",
-                "D05杈撻��": "D05 VFD conveyor",
-                "D06杈撻��": "D06 VFD conveyor",
-                "A01杈撻�佹鍚�": "A01 VFD conveyor",
-                "A02杈撻�佹鍚�": "A02 VFD conveyor",
-                "B01杈撻��": "B01 VFD conveyor",
-                "B02杈撻��": "B02 VFD conveyor",
-                "A01缈昏浆": "A01 SERVE TURN",
-                "A02缈昏浆": "A02 SERVE TURN",
-                "A01琛岃蛋鐐瑰姩": "A01 SERVE TRAVEL",
-                "A02琛岃蛋鐐瑰姩": "A02 SERVE TRAVEL",
-                "B01琛岃蛋鐐瑰姩": "B01 SERVE TRAVEL",
-                "B02琛岃蛋鐐瑰姩": "B02 SERVE TRAVEL",
-                "B02缈昏浆姘旂几": "B02 Solenoid TURN",
-                "B02鍗囬檷姘旂几": "B02 Solenoid UP DOWN",
-                "B02鍚规皵": "B02 Solenoid Gassing",
-                "B01缈昏浆姘旂几": "B01 Solenoid TURN",
-                "B01鍗囬檷姘旂几": "B01 Solenoid UP DOWN",
-                "B01鍚规皵": "B01 Solenoid Gassing",
-                "A01杈撻�佸弽鍚�": "A01 VFD conveyor reverse",
-                "A02杈撻�佸弽鍚�": "A02 VFD conveyor reverse",
-                "A01娉ㄧ數娉�": "A01 oil pump",
-                "A02娉ㄧ數娉�": "A02 oil pump",
-                "A01琛岃蛋浼烘湇鍥為浂":"A01 SERVE TRAVEL Home",
-                "A02琛岃蛋浼烘湇鍥為浂":"A02 SERVE TRAVEL Home"
-              },
-              "A01琛岃蛋浼烘湇鍥為浂":"A01 SERVE TRAVEL Home",
-                "A02琛岃蛋浼烘湇鍥為浂":"A02 SERVE TRAVEL Home",
-                "Set":"Set"
-
-  
-}
\ No newline at end of file
diff --git a/UI-Project/src/lang/locales/zh-CN.json b/UI-Project/src/lang/locales/zh-CN.json
deleted file mode 100644
index b06a25b..0000000
--- a/UI-Project/src/lang/locales/zh-CN.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
-  "northglassMESsystem": "鍖楃幓MES绯荤粺",
-  "username": "璐﹀彿",
-  "password": "瀵嗙爜",
-  "usernamePlaceholder": "璇疯緭鍏ヨ处鍙�",
-  "passwordPlaceholder": "璇疯緭鍏ュ瘑鐮�",
-  "loginButton": "鐧诲綍",
-  "registerButton": "娉ㄥ唽",
-  "registerButton": "娉ㄥ唽鏂扮敤鎴�",
-  "username": "濮撳悕",
-  "usernameRequired": "璇疯緭鍏ュ鍚�",
-  "passwordRequired": "璇疯緭鍏ュ瘑鐮�",
-  "passwordRequired": "纭瀵嗙爜",
-  "passwordRequired": "璇风‘璁ゅ瘑鐮�",
-  "passwordRequired": "纭娉ㄥ唽",
-  "langCancel": "鍙栨秷",
-  "loginSuccess": "鐧诲綍鎴愬姛",
-  "langBtnCN": "涓枃",
-  "langBtnEN": "English",
-  "langHome": "娆㈣繋",
-  "langUserManagement": "浣跨敤鍖楃幓MES绯荤粺",
-  "langUserList": "閫�鍑�",
-  "langUsernamePlaceholder": "鎵撴爣鏈哄氨缁姸鎬�",
-  "langEmailPlaceholder": "鍒囧壊鏈哄氨缁姸鎬�",
-  "langSearch": "鎵嬪姩纭",
-  "langAddUser": "閫夋嫨宸ョ▼",
-  "langUsername": "寮�濮嬩笂鐗�",
-  "langEmail": "鏆傚仠",
-  "langCreateTime": "鍋滄浠诲姟",
-  "langDisabled": "宸ョ▼鍙�",
-  "langAction": "鍘熺墖瀹�",
-  "langEdit": "鍘熺墖闀�",
-  "langDelete": "鑶滅郴",
-  "langAddUserTitle": "鏁伴噺",
-  "langPassword": "鍘氬害",
-  "langState": "鐘舵��",
-  "langSelect": "瀹�",
-  "langEditUserTitle": "闀�",
-  "exit": "鎿嶄綔",
-  "changePassword": "宸ョ▼",
-  "Old password":"璇烽�夋嫨宸ョ▼",
-  "New password":"娣诲姞鍘熺墖",
-  "langConfirm": "纭",
-  "langUsernameLabel": "娣诲姞",
-  "langPasswordLabel": "鍒犻櫎",
-  "langPasswordLabel": "鏄惁鍒犻櫎璇ユ潯淇℃伅锛�",
-  "langPasswordLabel": "鏄惁寮�濮嬩笂鐗囷紵",
-  "langPasswordLabel": "鏄惁鏆傚仠锛�",
-  "langPasswordLabel": "鏄惁鍋滄浠诲姟锛�",
-  "langPasswordLabel": "鏍呮牸鍙�",
-  "langPasswordLabel": "鐜荤拑缂栧彿",
-  "langPasswordLabel": "楂�",
-  "langPasswordLabel": "鍚敤鐘舵��",
-  "langPasswordLabel": "鍚敤",
-  "langPasswordLabel": "鏈惎鐢�",
-  "langPasswordLabel": "鎶ョ己",
-  "langPasswordLabel": "杩涚倝涓�",
-  "langPasswordLabel": "杩涚倝鍓�",
-  "langPasswordLabel": "宸插嚭鐐夌幓鐠�",
-  "langPasswordLabel": "鐗堝浘缂栧彿",
-  "langPasswordLabel": "涓嬬墖浣�",
-  "langPasswordLabel": "鏋跺彿",
-  "langPasswordLabel": "娴佺▼鍗″彿",
-  "langPasswordLabel": "鎬绘暟閲�",
-  "langPasswordLabel": "宸茶惤鏋舵暟閲�",
-  "langPasswordLabel": "鐘舵��",
-  "langPasswordLabel": "璁惧鍙�",
-  "langPasswordLabel": "鍚敤鐘舵��",
-  "langPasswordLabel": "缁戝畾鏋跺瓙",
-  "langPasswordLabel": "娓呯┖",
-
-}
\ No newline at end of file
diff --git a/UI-Project/src/lang/zh.js b/UI-Project/src/lang/zh.js
new file mode 100644
index 0000000..3aa72a1
--- /dev/null
+++ b/UI-Project/src/lang/zh.js
@@ -0,0 +1,354 @@
+export  default {
+  "northglassMESsystem": "鍖楃幓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:' 浣跨敤鍖楃幓MES绯荤粺锛�',
+        quit:"閫�鍑�",
+    },
+    basicData:{
+        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:'鏇存柊鐜荤拑鐘舵�佹椂鍙戠敓閿欒',
+        deletemessage:'鏄惁鍒犻櫎璇ユ潯淇℃伅?',
+    },
+    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:'璇疯緭鍏ョ幓鐠僆D',
+        pieceingrid:'灏忕墖鍦ㄦ牸鍐呯殑椤哄簭',
+        pieceingrida:'灏忕墖鍦ㄦ牸鍐呯殑椤哄簭锛�',
+        inpieceingrid:'璇疯緭鍏ュ皬鐗囧湪鏍煎唴鐨勯『搴�',
+        cardnumber:'娴佺▼鍗″彿',
+        cardnumbera:'娴佺▼鍗″彿锛�',
+        incardnumber:'璇疯緭鍏ユ祦绋嬪崱鍙�',
+        typeglass:'鐜荤拑绫诲瀷',
+        typeglassa:'鐜荤拑绫诲瀷锛�',
+        intypeglass:'璇疯緭鍏ョ幓鐠冪被鍨�',
+        width:'瀹�',
+        widtha:'瀹斤細',
+        inwidth:'璇疯緭鍏ュ',
+        height:'楂�',
+        heighta:'楂橈細',
+        inheight:'璇疯緭鍏ラ珮',
+        coatingtypes:'鑶滅郴',
+        thickness:'鍘氬害',
+        thicknessa:'鍘氬害锛�',
+        inthickness:'璇疯緭鍏ュ帤搴�',
+        layoutID:'閽㈠寲鐗堝浘ID',
+        layoutIDa:'閽㈠寲鐗堝浘ID锛�',
+        inlayoutID:'璇疯緭鍏ラ挗鍖栫増鍥綢D',
+        picturesequence:'閽㈠寲鐗堝浘鐗囧簭',
+        picturesequencea:'閽㈠寲鐗堝浘鐗囧簭锛�',
+        inpicturesequence:'璇疯緭鍏ラ挗鍖栫増鍥剧墖搴�',
+        startstatus:'鍚敤鐘舵��',
+        startstatusa:'鍚敤鐘舵�侊細',
+        instartstatus:'璇疯緭鍏ュ惎鐢ㄧ姸鎬�',
+        glassgaps:'鐜荤拑闂撮殭',
+        glassgapsa:'鐜荤拑闂撮殭锛�',
+        inglassgaps:'璇疯緭鍏ョ幓鐠冮棿闅�',
+        sure:'纭',
+        cancel:'鍙栨秷',
+        glassID:'鐜荤拑ID',
+        operate:'鎿嶄綔',
+        breakage:'鐮存崯',
+        delete:'鍒犻櫎',
+        outfilm:'鍑虹墖',
+        cagetableID:'澶х悊鐗囩琛↖D',
+        cagenumber:'鐞嗙墖绗煎彿',
+        gridnumber:'鏍呮牸鍙�',
+        gridnumbera:'鏍呮牸鍙凤細',
+        grid:'璇疯緭鍏ユ爡鏍煎彿',
+        enable:'鍚敤',
+        disable:'绂佺敤',
+        remainingwidth:'鍓╀綑瀹藉害',
+        add:'娣诲姞',
+        sheetID:'閽㈠寲灏忕墖淇℃伅琛↖D',
+        processcards:'娴佺▼鍗�',
+        processcardtype:'娴佺▼鍗$幓鐠冪被鍨�',
+        acceptshorizontal:'閽㈠寲鏄惁鎺ュ彈妯斁',
+        xcoordinates:'x鍧愭爣',
+        ycoordinates:'y鍧愭爣',
+        rotationangle:'鏃嬭浆瑙掑害锛堥�嗘椂閽堬級',
+        state:'鐘舵��',
+        takeout:'鎷胯蛋',
+        deletemessage:'鏄惁鍒犻櫎璇ユ潯淇℃伅?',
+        prompt:'鎻愮ず',
+        yes:'鏄�',
+        accept:'鎺ュ彈',
+        noaccept:'涓嶆帴鍙�',
+        filmcomplete:'鍑虹墖瀹屾垚',
+        waiting:'绛夊緟涓�',
+        broke:'鏄惁鐮存崯璇ユ潯淇℃伅锛�',
+        brokeb:'鏄惁鎷胯蛋璇ユ潯淇℃伅锛�',
+        outfil:'鏄惁鍑虹墖璇ユ潯淇℃伅锛�',
+        inputid:'璇疯緭鍏ョ幓鐠僆D',
+        search:'鎼滅储',
+        tabid:'澶х悊鐗囩璇︽儏琛╥d',
+        tid:'璁惧id',
+        fin:'鏄惁瀹屾垚浠诲姟锛�',
+    },
+    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:'鍙峰伐浣�',
+        shelfnumbera:'鏋跺彿锛�',
+        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:'閾炬帴',
+        inlink:'璇疯緭鍏ラ摼鎺�',
+        linka:'閾炬帴锛�',
+        sort:'鎺掑簭',
+        insort:'璇疯緭鍏ユ帓搴�',
+        sorta:'鎺掑簭锛�',
+        operate:'鎿嶄綔',
+        exit:'缂栬緫',
+        delete:'鍒犻櫎',
+        semenu:'浜岀骇鑿滃崟鏍�',
+        menu:'鑿滃崟鏍忥細',
+        inmenu:'璇疯緭鍏ヨ彍鍗曟爮',
+        sure:'纭',
+        cancel:'鍙栨秷',
+        exmene:'淇敼鑿滃崟',
+        yes:'鏄�',
+        demenu:'鏄惁鍒犻櫎璇ヨ彍鍗曪紵', 
+        prompt:'鎻愮ず',
+    },
+    delivery:{
+        addrole:'娣诲姞瑙掕壊',
+        editrole:'淇敼瑙掕壊',
+        role :'瑙掕壊',
+        rolea :'瑙掕壊锛�',
+        inrole :'璇疯緭鍏ヨ鑹�',
+        operate :'鎿嶄綔',
+        edit :'缂栬緫',
+        delete :'鍒犻櫎',
+        yes:'鏄�',
+        sure :'纭',
+        cancel :'鍙栨秷',
+        derole :'鏄惁鍒犻櫎璇ヨ鑹�',
+        prompt:'鎻愮ず',
+    },
+    replenish:{
+        patchManagement:'琛ョ墖绠$悊',
+
+    },
+    rework:{
+        reworkManagement:'杩斿伐绠$悊',
+        addRework:"杩斿伐鏂板 ",
+    },
+
+
+    role:{
+        id:'ID',
+        characterHomepage:'瑙掕壊棣栭〉',
+    },
+    user:{
+        userId:'鐢ㄦ埛ID',
+        userHomepage:'鐢ㄦ埛棣栭〉',
+    },
+    orderBasicData:{
+        order:'璁㈠崟',
+        orderType:'璁㈠崟绫诲瀷',
+    },
+    machine:{
+        basicId:'璁惧缂栧彿',
+        basicName:'璁惧鍚嶇О',
+        basicCategory:'鎵�鍦ㄥ伐搴�',
+        tempering:'閽㈠寲',
+    },
+    report:{
+        productionReport:'鐢熶骇鎶ヨ〃',
+        workInProgressReport:'鍦ㄥ埗鍝佹姤琛�',
+    },
+    productionBasicData:{
+        basicDataQuery :'鍩虹鏁版嵁鏌ヨ',
+    },
+    mainIngredient:{
+        materialInformation :'鐗╂枡璧勬枡',
+    },
+    mainIngredientStock:{
+        materialName :'鐗╂枡鍚嶇О',
+        createTime :'杩斿簱鏃ユ湡',
+    },
+}
\ No newline at end of file
diff --git a/UI-Project/src/layout/MainErpView.vue b/UI-Project/src/layout/MainErpView.vue
index 3bd4a05..85cd1aa 100644
--- a/UI-Project/src/layout/MainErpView.vue
+++ b/UI-Project/src/layout/MainErpView.vue
@@ -1,14 +1,17 @@
 <script setup>
-import {useRouter} from 'vue-router'
 import useUserInfoStore from '@/stores/userInfo'
 import userInfo from '@/stores/userInfo'
 import request from '@/utils/request'
 import {ElMessage} from 'element-plus'
-import {ref, watch} from 'vue'
+import {ref, watch, onMounted } from 'vue'
 import deepClone from '@/utils/deepClone'
-
+import { useRouter } from 'vue-router';  
+import { useI18n } from 'vue-i18n'
+  const { t } = useI18n()
+  let language = ref(localStorage.getItem('lang') || 'zh')
 const store = userInfo()
 
+// const { $i18n } = useI18n(); // 鑾峰彇 i18n 瀹炰緥  
 const router = useRouter()
 const userStore = useUserInfoStore()
 const user = userStore.user.userName
@@ -19,27 +22,32 @@
 // let userInfo = userInfoStr.user.token;  
 let token = userInfo; // 鎻愬彇 token  
 // 閫�鍑虹櫥褰曟柟娉�  
-const quit = async () => {
-  try  {
-    const response = await request.get('/loadGlass/sys/user/logout', {
-        token: token,
-        user: null,
-    })
-    if (response.code === 200) {  
-        // 鐧诲嚭鎴愬姛锛屾竻闄ゆ湰鍦板瓨鍌ㄧ殑 userInfo  
-        localStorage.removeItem('userInfo');  
-        // 鍙互鍦ㄨ繖閲岄噸缃簲鐢ㄧ姸鎬侊紝濡傚鑸埌鐧诲綍椤电瓑  
-        console.log('鐧诲嚭鎴愬姛');  
-      } else {  
-        // 澶勭悊閿欒鎯呭喌  
-        console.error('鐧诲嚭澶辫触', response);  
-      } 
+function quit() {  
+  // removeToken()  
+  router.push('/login')  
 }
-catch (error) {
-    // 澶勭悊閿欒
-    console.error(error);
-  }
-}
+// const quit = async () => {
+//   try  {
+    
+//     const response = await request.get('/loadGlass/sys/user/logout', {
+//         token: token,
+//         user: null,
+//     })
+//     if (response.code === 200) {  
+//         // 鐧诲嚭鎴愬姛锛屾竻闄ゆ湰鍦板瓨鍌ㄧ殑 userInfo  
+//         localStorage.removeItem('userInfo');  
+//         // 鍙互鍦ㄨ繖閲岄噸缃簲鐢ㄧ姸鎬侊紝濡傚鑸埌鐧诲綍椤电瓑  
+//         console.log('鐧诲嚭鎴愬姛');  
+//       } else {  
+//         // 澶勭悊閿欒鎯呭喌  
+//         console.error('鐧诲嚭澶辫触', response);  
+//       } 
+// }
+// catch (error) {
+//     // 澶勭悊閿欒
+//     console.error(error);
+//   }
+// }
 // store.createWebSocket();
 // function quit() {
 //   userStore.$patch({
@@ -57,26 +65,79 @@
 //    });
 // }
 
+
+  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;  
+      });  
+    // }  
+  });  
+} 
 //鎻愬彇鑿滃崟妯″潡鍒楄〃
 let menuList = $ref([])
-// request.get('/loadGlass/menu/sysMenu/list').then((res) => {
+
+// 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 = deepClone(res.data)
-    console.log(response.data.token);
+    menuList = res.data
+    console.log(language.value)
+      if (language.value === 'en') {
+        
+        replaceChineseWithEnglish(menuList);
+      }
   } else {
     ElMessage.warning(res.msg)
     router.push('/login')
   }
 })
-
 const menu = ref(null)
 let indexKey = ref(null)
 
 function handleOpen(key) {
   indexKey.value = key
 }
-
 watch(
     indexKey,
     (newVal, oldVal) => {
@@ -110,13 +171,20 @@
           <img src="../assets/northGlass.ico"
                alt=""
                style="max-width: 100%;max-height: 100%">
-          <h3 style="margin: 1rem  ;font-weight: bold;width: 20vw;"> 娆㈣繋{{ user }}浣跨敤鍖楃幓MES绯荤粺锛�</h3>
+          <h3 style="margin: 1rem  ;font-weight: bold;width: 33vw;"> {{ $t('main.titleFirst') }}{{ user }}{{ $t('main.titleLast') }}</h3>
           <span style="height: 70%;width: 78vw;margin-top: 1rem;">
+            <!-- <el-button class="sys-quit"
+                       @click="quit"
+                       round>
+              <el-icon size="large">
+                <SwitchButton size=""/>{{ $t('main.quit') }}
+              </el-icon>
+            </el-button> -->
             <el-button class="sys-quit"
                        @click="quit"
                        round>
               <el-icon size="large">
-                <SwitchButton size=""/>閫�鍑�
+                <SwitchButton size=""/>{{ $t('main.quit') }}
               </el-icon>
             </el-button>
           </span>
@@ -124,33 +192,45 @@
       </el-header>
       <div id="line"></div>
       <el-container>
-        <el-aside width="160px"
+        <!-- <el-aside width="160px"
                   style="height: 99%; background-color: #fff;">
           <div class="menu">
             <div v-for="items in menuList">
               <div class='menu_title'
                    @click="openMenu(items.id)">
-                <!-- <span class='indicator' >鈱�</span> -->
-                <!-- <span class='indicator' >鈮�</span> -->
-                <!-- <img src="../assets/9.png" alt="" style="max-width: 50%;max-height: 50%;"> -->
                 <span>鈽�</span>
                 {{ items.menuName }}
               </div>
               <ul class='enter-x-left'
                   v-show="openFlag==items.id">
-
                 <li v-for="menuItem in items.children"
                     style="margin-bottom:2px">
                   <router-link :to="{path:menuItem.url}">
                     {{ menuItem.menuName }}
                   </router-link>
-
-                </li>
-              </ul>
-            </div>
-          </div>
-        </el-aside>
-
+        </el-aside> -->
+        <el-row :span="20">
+            <el-menu :default-active="activePath" class="el-menu-vertical-demo" background-color="#fff">
+              <div class="menu">
+            <div v-for="items in menuList">
+              <div class='menu_title'
+                   @click="openMenu(items.id)">
+                <span>鈽�</span>
+                {{ items.menuName }}
+              </div>
+              <ul class='enter-x-left'
+                  v-show="openFlag==items.id">
+                <li v-for="menuItem in items.children"
+                    style="margin-bottom:2px">
+                  <router-link :to="{path:menuItem.url}">
+                    {{ menuItem.menuName }}
+                  </router-link>
+                  </li>
+                  </ul>
+                  </div>
+                  </div>
+            </el-menu>
+          </el-row>
         <el-main>
           <div id="main">
             <router-view></router-view>
@@ -163,6 +243,17 @@
 </template>
  
 <style scoped>
+
+.el-menu-vertical-demo:not(.el-menu--collapse) {
+  width: 200px;
+  min-height: 400px;
+  text-align: left;
+
+}
+
+
+
+
 #all {
   background-color: #eee;
   height: 100%;
@@ -256,6 +347,7 @@
 
 ul li {
   height: 28px;
+  width: 200px;
   line-height: 30px;
   /* background: rgb(128, 128, 128); */
   color: #000000;
@@ -304,7 +396,11 @@
 }
 
 .menu_title {
-  width: 140px;
+  width: 180px;
+  /* white-space: nowrap;  
+  overflow: hidden;  
+  text-overflow: ellipsis;   */
+
   height: 45px;
   line-height: 55px;
   /* background: #fafafa; */
diff --git a/UI-Project/src/main.js b/UI-Project/src/main.js
index fe656ab..b8b328b 100644
--- a/UI-Project/src/main.js
+++ b/UI-Project/src/main.js
@@ -6,22 +6,22 @@
 import App from './App.vue'
 import router from './router'
 import ElementPlus from 'element-plus'
-import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
 import 'element-plus/dist/index.css'
+import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
 import VXETable from 'vxe-table'
 import 'vxe-table/lib/style.css'
-//  import i18n from './lang/i18n' 
- 
- 
+import i18n from '@/lang'
+
 const app = createApp(App)
 const pinia = createPinia()
 pinia.use(piniaPluginPersistedstate )
-// app.use(i18n)
 app.use(VXETable)
 app.use(pinia)
 app.use(router)
+app.use(ElementPlus)
 app.use(ElementPlus,{
     locale: zhCn,
 })
+app.use(i18n)
  
 app.mount('#app')
\ No newline at end of file
diff --git a/UI-Project/src/router/index.js b/UI-Project/src/router/index.js
index 764db3a..2beb066 100644
--- a/UI-Project/src/router/index.js
+++ b/UI-Project/src/router/index.js
@@ -1,5 +1,5 @@
 import {createRouter, createWebHashHistory} from 'vue-router'
-
+// import i18n from '@/utils/lang'
 // import User from '../views/sys/User.vue'
 // import Role from '../views/sys/Role.vue'
 // import Menu from '../views/sys/Menu.vue'
diff --git a/UI-Project/src/views/Caching/cachingbefore.vue b/UI-Project/src/views/Caching/cachingbefore.vue
index 3672600..9f4ed48 100644
--- a/UI-Project/src/views/Caching/cachingbefore.vue
+++ b/UI-Project/src/views/Caching/cachingbefore.vue
@@ -13,6 +13,9 @@
 import { ElMessage, ElMessageBox } from 'element-plus'
 //  import LanguageMixin from './lang/LanguageMixin'
 
+import { useI18n } from 'vue-i18n'
+  const { t } = useI18n()
+  let language = ref(localStorage.getItem('lang') || 'zh')
 const tableData = ref([])
 const slot = ref('')
 const adjustedRects = ref([]);
@@ -47,19 +50,18 @@
       }  
   row.enable_state = newState;  
 }; 
-const open = async(row) => {  
-  try {  
+const open = async(row) => {
+  try {
     const confirmResult = await ElMessageBox.confirm(  
-      '鏄惁鎶ョ己璇ユ潯淇℃伅?',  
-      '鎻愮ず',  
+      t('sorter.information'), 
+      t('sorter.prompt'),  
       {  
-        confirmButtonText: '鏄�',  
-        cancelButtonText: '鍙栨秷',  
+        confirmButtonText: t('sorter.yes'), 
+        cancelButtonText: t('sorter.cancel'),
         type: 'warning',  
-      }  
+      } 
     );  
     if (confirmResult === 'confirm') {  
-      // 鐢ㄦ埛鐐瑰嚮浜嗏�滄槸鈥濓紝鐜板湪璋冪敤鍒犻櫎鎺ュ彛  
       var url="/cacheGlass/edgStorageCage/edgStorageCageGlass?edgStorageCageId="+row.id;
       console.log(url);
       const response = await request.post(url, {
@@ -68,13 +70,10 @@
     if (response.code === 200) {
       ElMessage.success(response.message);
       } else {  
-        // 鍒犻櫎澶辫触锛屾偍鍙互澶勭悊閿欒鎴栨樉绀洪敊璇俊鎭粰鐢ㄦ埛  
       ElMessage.error(response.msg);
-        // alert('鍒犻櫎澶辫触锛�' + deleteResponse.message); 
       }  
     }  
   } catch (error) {  
-    // 澶勭悊鍙兘鍑虹幇鐨勯敊璇紝姣斿 ElMessageBox 鎶涘嚭鐨勫紓甯哥瓑  
     console.error('鍙戠敓閿欒:', error);  
   }  
 };   
@@ -111,13 +110,13 @@
         <el-table height="240" ref="table" 
         @selection-change="handleSelectionChange"
         :data="tableData" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
-          <el-table-column prop="slot" align="center" label="鏍呮牸鍙�" min-width="80" />
-          <el-table-column prop="glass_id" align="center" label="鐜荤拑缂栧彿" min-width="80" />
-          <el-table-column prop="width" align="center" label="瀹�" min-width="120" />
-          <el-table-column prop="height" align="center" label="楂�" min-width="120" />
+          <el-table-column prop="slot" align="center" :label="$t('sorter.gridnumber')" min-width="80" />
+          <el-table-column prop="glass_id" align="center" :label="$t('sorter.glassnumber')" min-width="80" />
+          <el-table-column prop="width" align="center" :label="$t('sorter.width')" min-width="120" />
+          <el-table-column prop="height" align="center" :label="$t('sorter.height')" min-width="120" />
           <el-table-column
             align="center"
-            label="鍚敤鐘舵��"
+            :label="$t('sorter.startstatus')"
             min-width="80"
             prop="enable_state"
           >
@@ -126,17 +125,17 @@
             :type="scope.row.enable_state === 1 ? 'success' : 'danger'"  
             @click="toggleEnableState(scope.row)"  
           >  
-            {{ scope.row.enable_state === 1 ? '鍚敤' : '绂佺敤' }}  
+            {{ scope.row.enable_state === 1 ?  $t('sorter.start') : $t('sorter.disable') }}
           </el-tag>  
         </template> 
           <!-- <template #default="scope">
             <el-tag type="success" >{{ scope.row.enable_state==1?"鍚敤":"鏈惎鐢�"  }}</el-tag>
           </template> -->
           </el-table-column>
-          <el-table-column fixed="right" label="鎿嶄綔" align="center" width="200">
+          <el-table-column fixed="right" :label="$t('sorter.operate')" align="center" width="200">
             <template #default="scope">
               <!-- <el-button size="mini" type="text" plain @click="handleBindRacka(scope.row)">鎶ョ己</el-button> -->
-              <el-button size="mini" type="text" plain  @click="open(scope.row)">鎶ョ己</el-button>
+              <el-button size="mini" type="text" plain  @click="open(scope.row)">{{ $t('sorter.deficiencieste') }}</el-button>
             </template>
         </el-table-column>
         </el-table>
diff --git a/UI-Project/src/views/Caching/cachingun.vue b/UI-Project/src/views/Caching/cachingun.vue
index d454956..94c8b0b 100644
--- a/UI-Project/src/views/Caching/cachingun.vue
+++ b/UI-Project/src/views/Caching/cachingun.vue
@@ -1,5 +1,58 @@
+<template>
+  <div>
+    <el-card style="flex: 1;margin-left: 10px;margin-top: 20px;" v-loading="loading">
+      <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
+        <el-table height="240" ref="table" 
+        @selection-change="handleSelectionChange"
+        :data="tableData" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
+          <el-table-column prop="slot" align="center" :label="$t('sorter.gridnumber')" min-width="80" />
+          <el-table-column prop="glass_id" align="center" :label="$t('sorter.glassnumber')" min-width="80" />
+          <el-table-column prop="width" align="center" :label="$t('sorter.width')" min-width="120" />
+          <el-table-column prop="height" align="center" :label="$t('sorter.height')" min-width="120" />
+          <el-table-column
+          align="center"
+            :label="$t('sorter.startstatus')"
+            min-width="80"
+            prop="enable_state"
+          >
+          <template #default="scope">  
+          <el-tag  
+            :type="scope.row.enable_state === 1 ? 'success' : 'danger'"  
+            @click="toggleEnableState(scope.row)"  
+          >  
+            {{ scope.row.enable_state === 1 ?  $t('sorter.start') : $t('sorter.disable') }}
+          </el-tag>  
+        </template> 
+          <!-- <template #default="scope">
+            <el-tag type="success" >{{ scope.row.enable_state==1?"鍚敤":"鏈惎鐢�"  }}</el-tag>
+          </template> -->
+          </el-table-column>
+          <el-table-column fixed="right" :label="$t('sorter.operate')" align="center" width="200">
+            <template #default="scope">
+              <el-button size="mini" type="text" plain  @click="open(scope.row)">{{ $t('sorter.deficiencieste') }}</el-button>
+            </template>
+        </el-table-column>
+        </el-table>
+      </div>
+    </el-card>
+  </div>
+  <div id="awatch">
+    <img src="../../assets/woshihuancun.png" alt="" style="width: 60%;height: 90%;margin-left: 260px;margin-top: 20px;position: relative;"> 
+    <div style="position: absolute; width: 500px;height: 95px;margin-top: -165px;margin-left: 450px;">
+    <div  
+      v-for="(rect, index) in adjustedRects"  
+      :key="rect"  
+      :style="{ position: 'absolute', 
+       top: `${rect.id}px`, left: `10px`, width: `${rect.width}px`, height: `5px`,
+      backgroundColor: '#409EFF'
+       }"  
+    >
+    </div>
+  </div>
+</div>
+</template>
 <script setup>
-import {Search} from "@element-plus/icons-vue";
+import {Search,Lock,Avatar} from "@element-plus/icons-vue";
 import {reactive} from "vue";
 import {useRouter} from "vue-router"
 const router = useRouter()
@@ -12,6 +65,9 @@
 import { ElMessage, ElMessageBox } from 'element-plus'
 //  import LanguageMixin from './lang/LanguageMixin'
  
+import { useI18n } from 'vue-i18n'
+  const { t } = useI18n()
+// import i18n from '@/i18n';
 const tableData = ref([])
 const slot = ref('')
 const adjustedRects = ref([]);
@@ -36,17 +92,16 @@
     // console.error('Error fetching rects :', error);  
   }  
 }); 
- 
-const open = async(row) => {  
-  try {  
+const open = async(row) => {
+  try {
     const confirmResult = await ElMessageBox.confirm(  
-      '鏄惁鎶ョ己璇ユ潯淇℃伅?',  
-      '鎻愮ず',  
+      t('sorter.information'), 
+      t('sorter.prompt'),  
       {  
-        confirmButtonText: '鏄�',  
-        cancelButtonText: '鍙栨秷',  
+        confirmButtonText: t('sorter.yes'), 
+        cancelButtonText: t('sorter.cancel'),
         type: 'warning',  
-      }  
+      } 
     );  
     if (confirmResult === 'confirm') {  
       // 鐢ㄦ埛鐐瑰嚮浜嗏�滄槸鈥濓紝鐜板湪璋冪敤鍒犻櫎鎺ュ彛  
@@ -63,11 +118,50 @@
         // alert('鍒犻櫎澶辫触锛�' + deleteResponse.message); 
       }  
     }  
-  } catch (error) {  
+  } 
+  
+  
+  catch (error) {  
     // 澶勭悊鍙兘鍑虹幇鐨勯敊璇紝姣斿 ElMessageBox 鎶涘嚭鐨勫紓甯哥瓑  
     console.error('鍙戠敓閿欒:', error);  
   }  
-};   
+};  
+// const open = async(row) => {
+// const { t } = useI18n();
+//   try {
+//     const confirmMessage = t('sorter.prompt'); // 浣跨敤 $t 缈昏瘧鏂囨湰
+//     const confirmResult = await ElMessageBox.confirm(  
+//       confirmMessage,  
+//       t('sorter.information'), 
+//       {  
+//         confirmButtonText: t('sorter.yes'), 
+//         cancelButtonText: t('sorter.cancel'),
+//         type: 'warning',  
+//       } 
+//     );  
+//     if (confirmResult === 'confirm') {  
+//       // 鐢ㄦ埛鐐瑰嚮浜嗏�滄槸鈥濓紝鐜板湪璋冪敤鍒犻櫎鎺ュ彛  
+//       var url="/cacheGlass/edgStorageCage/edgStorageCageGlass?edgStorageCageId="+row.id;
+//       console.log(url);
+//       const response = await request.post(url, {
+//         esdId: row.esdId
+//     })
+//     if (response.code === 200) {
+//       ElMessage.success(response.message);
+//       } else {  
+//         // 鍒犻櫎澶辫触锛屾偍鍙互澶勭悊閿欒鎴栨樉绀洪敊璇俊鎭粰鐢ㄦ埛  
+//       ElMessage.error(response.msg);
+//         // alert('鍒犻櫎澶辫触锛�' + deleteResponse.message); 
+//       }  
+//     }  
+//   } 
+  
+  
+//   catch (error) {  
+//     // 澶勭悊鍙兘鍑虹幇鐨勯敊璇紝姣斿 ElMessageBox 鎶涘嚭鐨勫紓甯哥瓑  
+//     console.error('鍙戠敓閿欒:', error);  
+//   }  
+// };   
 const toggleEnableState = async (row) => {  
   const newState = row.enable_state === 1 ? 0 : 1;  
   // 鍙戦�佽姹傚埌鍚庣鏇存柊鐘舵�侊紙杩欓噷鐪佺暐浜嗗疄闄呯殑璇锋眰閫昏緫锛�  
@@ -105,62 +199,6 @@
   closeWebSocket();
 });
 </script>
- 
-<template>
-  <div>
-    <el-card style="flex: 1;margin-left: 10px;margin-top: 20px;" v-loading="loading">
-      <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
-        <el-table height="240" ref="table" 
-        @selection-change="handleSelectionChange"
-        :data="tableData" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
-          <el-table-column prop="slot" align="center" label="鏍呮牸鍙�" min-width="80" />
-          <el-table-column prop="glass_id" align="center" label="鐜荤拑缂栧彿" min-width="80" />
-          <el-table-column prop="width" align="center" label="瀹�" min-width="120" />
-          <el-table-column prop="height" align="center" label="楂�" min-width="120" />
-          <el-table-column
-          align="center"
-            label="鍚敤鐘舵��"
-            min-width="80"
-            prop="enable_state"
-          >
-          <template #default="scope">  
-          <el-tag  
-            :type="scope.row.enable_state === 1 ? 'success' : 'danger'"  
-            @click="toggleEnableState(scope.row)"  
-          >  
-            {{ scope.row.enable_state === 1 ? '鍚敤' : '绂佺敤' }}  
-          </el-tag>  
-        </template> 
-          <!-- <template #default="scope">
-            <el-tag type="success" >{{ scope.row.enable_state==1?"鍚敤":"鏈惎鐢�"  }}</el-tag>
-          </template> -->
-          </el-table-column>
-          <el-table-column fixed="right" label="鎿嶄綔" align="center" width="200">
-            <template #default="scope">
-              <!-- <el-button size="mini" type="text" plain @click="handleBindRacka(scope.row)">鎶ョ己</el-button> -->
-              <el-button size="mini" type="text" plain  @click="open(scope.row)">鎶ョ己</el-button>
-            </template>
-        </el-table-column>
-        </el-table>
-      </div>
-    </el-card>
-  </div>
-  <div id="awatch">
-    <img src="../../assets/woshihuancun.png" alt="" style="width: 60%;height: 90%;margin-left: 260px;margin-top: 20px;position: relative;"> 
-    <div style="position: absolute; width: 500px;height: 95px;margin-top: -165px;margin-left: 450px;">
-    <div  
-      v-for="(rect, index) in adjustedRects"  
-      :key="rect"  
-      :style="{ position: 'absolute', 
-       top: `${rect.id}px`, left: `10px`, width: `${rect.width}px`, height: `5px`,
-      backgroundColor: '#409EFF'
-       }"  
-    >
-    </div>
-  </div>
-</div>
-</template>
- 
 <style scoped>
  
 #dt { display:block; float:left;line-height: 20px;margin-left: 100px;}
diff --git a/UI-Project/src/views/Identify/identify.vue b/UI-Project/src/views/Identify/identify.vue
index 9316fc9..a972dbe 100644
--- a/UI-Project/src/views/Identify/identify.vue
+++ b/UI-Project/src/views/Identify/identify.vue
@@ -1,6 +1,6 @@
 <template>  
     <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;" v-loading="loading">
-      <el-scrollbar height="700px">
+      <el-scrollbar height="600px">
   <div id="app" style="margin-top: 20px;">  
     <div  
       :style="{ width: `${olWidth}px`, height: `${olHeight}px`,position: 'relative' }"  
@@ -26,12 +26,12 @@
   </div> 
   <!-- 鐐瑰嚮寮瑰嚭 -->
   <el-dialog v-model="blind" top="30vh" width="15%" style="text-align: center;">
-        <el-button type="warning" plain :icon="Delete" @click="handleDamage(currentGlassId)"  style="width: 120px;margin-left: 10px;">
-          鐮存崯
+        <el-button type="warning" plain :icon="Delete" @click="handleDamage(currentGlassId)"  style="width: 140px;margin-left: 10px;">
+          {{ $t('order.dilapidation') }}
         </el-button>
-        <el-button  type="danger" plain @click="handleManualTake(currentGlassId)" style="width: 120px;margin-top: 10px;">
+        <el-button  type="danger" plain @click="handleManualTake(currentGlassId)" style="width: 140px;margin-top: 10px;">
           <el-icon class="el-icon--right"><Upload /></el-icon>
-          浜哄伐鎷胯蛋</el-button>
+          {{ $t('order.Takeaway') }}</el-button>
   </el-dialog> 
    </div>
   </div>  
@@ -45,6 +45,9 @@
 import request from "@/utils/request"
 import { WebSocketHost ,host} from '@/utils/constants'
 import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService';
+  import { useI18n } from 'vue-i18n'
+  const { t } = useI18n()
+  let language = ref(localStorage.getItem('lang') || 'zh')
 const blind = ref(false)
 const olWidth = ref(); 
 const olHeight = ref();
@@ -76,8 +79,8 @@
 
       adjustedRects.value = rawRects.map(rect => ({  
         ...rect, // 澶嶅埗鍘熷瀵硅薄鐨勫叾浠栧睘鎬�  
-        x_axis: (rect.x_axis*100) * 0.004, // 灏唜鍊奸櫎浠�3  
-        y_axis: (rect.y_axis*100) * 0.004,
+        x_axis: (rect.x_axis*100) * 0.003, // 灏唜鍊奸櫎浠�3  
+        y_axis: (rect.y_axis*100) * 0.003,
         width: (rect.width*100) * 0.002 ,
         widtha: rect.width ,
         heighta: rect.height ,
@@ -183,8 +186,8 @@
   // adjustedRects.value = data.currentCutTerritory[0]
   adjustedRects.value = data.currentCutTerritory[0].map(rect => ({  
         ...rect, // 澶嶅埗鍘熷瀵硅薄鐨勫叾浠栧睘鎬�  
-        x_axis: (rect.x_axis*100) * 0.004, // 灏唜鍊奸櫎浠�3  
-        y_axis: (rect.y_axis*100) * 0.004,
+        x_axis: (rect.x_axis*100) * 0.003, // 灏唜鍊奸櫎浠�3  
+        y_axis: (rect.y_axis*100) * 0.003,
         width: (rect.width*100) * 0.002 ,
         widtha: rect.width ,
         heighta: rect.height ,
diff --git a/UI-Project/src/views/LoginView.vue b/UI-Project/src/views/LoginView.vue
index 40d2d9b..d84f329 100644
--- a/UI-Project/src/views/LoginView.vue
+++ b/UI-Project/src/views/LoginView.vue
@@ -5,12 +5,17 @@
 import {ElMessage} from 'element-plus'
 import request from '@/utils/request'
 import userInfo from '@/stores/userInfo'
- 
+import { useI18n } from 'vue-i18n'
 const store = userInfo()
 let ruleFormRef = ref<FormInstance>()
 const router = useRouter()
 const route = useRoute()
- 
+const { t } = useI18n()
+let language = ref(localStorage.getItem('lang') || 'zh')
+const changeLanguage = () =>{
+  localStorage.setItem('lang',language.value)
+  location.reload()
+}
 const userForm = reactive({
   userName: '',
   password: '',
@@ -22,7 +27,7 @@
  
 const validateUser = (rule: any, value: any, callback: any) => {
   if (value === '') {
-    callback(new Error('璇疯緭鍏ヤ綘鐨勮处鍙�'))
+    callback(new Error(t('login.userErr')))
   } else {
     callback()
   }
@@ -30,7 +35,7 @@
  
 const validatePass = (rule: any, value: any, callback: any) => {
   if (value === '') {
-    callback(new Error('璇疯緭鍏ヤ綘鐨勫瘑鐮�'))
+    callback(new Error(t('login.pwErr')))
   } else {
     callback()
   }
@@ -56,7 +61,7 @@
               console.log(res.data)
  
               router.push('/main')
-              ElMessage.success(`鐧诲綍鎴愬姛`)
+              ElMessage.success(t('login.loginSuccessful'))
             } else {
               ElMessage.error(res['msg'])
               store.$patch({
@@ -67,7 +72,7 @@
             }
           })
           .catch((error) => {
-            ElMessage.error('鏈嶅姟鍣ㄨ繛鎺ュけ璐�')
+            ElMessage.error(t('main.connectErr'))
             store.$patch({
               user: null,
               })
@@ -113,26 +118,35 @@
           <img src="../../src/assets/3.png">
         </div>
         <div style="position: absolute; left: 15vw; top: 22vw; font-size: 55px;color: rgba(29, 33, 41, 1);">
-          鍖楃幓MES绯荤粺
+          {{ $t('northglassMESsystem') }}
         </div>
       </div>
       <div id="div-login">
+        <!--璇█鍒囨崲鎸夐挳-->
+        <el-select
+            @change="changeLanguage"
+            v-model="language"
+            placeholder=" "
+            style="float: right;width: 9rem">
+          <el-option value="zh"  label="涓枃" />
+          <el-option value="en"  label="袪褍褋褋泻懈泄 褟蟹褘泻" />
+        </el-select>
         <el-form @submit.native.prevent
                  ref="ruleFormRef"
                  :model="userForm"
                  status-icon
                  :rules="rules">
           <div id="center">
-            <div style="color: rgba(78, 89, 105, 1);margin-bottom: 10px;">璐﹀彿</div>
+            <div style="color: rgba(78, 89, 105, 1);margin-bottom: 10px;">{{ $t('login.user') }}</div>
             <el-form-item prop="userId">
               <el-input style="width: 340px;"
                         v-model="userForm.userName"
                         type="text"
                         autocomplete="off"
                         :prefix-icon="Avatar"
-                        placeholder="璇疯緭鍏ヨ处鍙�"/>
+                        :placeholder="$t('login.userErr')"/>
             </el-form-item>
-            <div style="color: rgba(78, 89, 105, 1);margin-bottom: 10px;">瀵嗙爜</div>
+            <div style="color: rgba(78, 89, 105, 1);margin-bottom: 10px;">{{ $t('login.password') }}</div>
             <el-form-item prop="pass">
               <el-input style="width: 340px;"
                         v-model="userForm.password"
@@ -140,7 +154,8 @@
                         autocomplete="off"
                         :prefix-icon="Lock"
                         show-password
-                        placeholder="璇疯緭鍏ュ瘑鐮�"/>
+                        :placeholder="$t('login.pwErr')"
+                       />
             </el-form-item>
             <el-form-item id="submitForm">
               <el-button :loading="loginLoadings"
@@ -148,12 +163,12 @@
                          native-type="submit"
                          @click="submitForm(ruleFormRef)"
                          @keyup.enter.native="keyDown(e)"
-                         plain>鐧诲綍
+                         plain>{{ $t('login.login') }}
               </el-button>
               <el-button :loading="registerLoadings"
                          type="primary"
                          @click="register"
-                         plain>娉ㄥ唽
+                         plain>{{ $t('login.register') }}
               </el-button>
  
             </el-form-item>
diff --git a/UI-Project/src/views/PurchaseReturn/purchaseReturn.vue b/UI-Project/src/views/PurchaseReturn/purchaseReturn.vue
index 6c8b687..77bd047 100644
--- a/UI-Project/src/views/PurchaseReturn/purchaseReturn.vue
+++ b/UI-Project/src/views/PurchaseReturn/purchaseReturn.vue
@@ -6,6 +6,9 @@
 import { ref, onMounted, onBeforeUnmount } from 'vue';  
 import { WebSocketHost ,host} from '@/utils/constants'
 import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService';
+  import { useI18n } from 'vue-i18n'
+  const { t } = useI18n()
+  let language = ref(localStorage.getItem('lang') || 'zh')
 const dialogFormVisible = ref(true)
 const dialogFormVisiblea = ref(false)
 const dialogFormVisibleb = ref(false)
@@ -70,12 +73,12 @@
 </script>
 <template>
   <div style="margin-top: 10px;">
-     <el-button style="margin-left: 15px;"   id="searchButton" type="primary" @click="dialogFormVisible = true;dialogFormVisiblea = false;dialogFormVisibleb = false;">杩涚倝涓�</el-button>
-     <el-button style="margin-left: 15px;"   id="searchButton" type="primary" @click="dialogFormVisiblea = true;dialogFormVisible = false;dialogFormVisibleb = false;" >杩涚倝鍓�</el-button>
-    <el-button  id="searchButton" type="success" @click="dialogFormVisibleb = true;dialogFormVisible = false;dialogFormVisiblea = false">宸插嚭鐐夌幓鐠�</el-button>
+     <el-button style="margin-left: 15px;"   id="searchButton" type="primary" @click="dialogFormVisible = true;dialogFormVisiblea = false;dialogFormVisibleb = false;">{{ $t('processCard.intofurnace') }}</el-button>
+     <el-button style="margin-left: 15px;"   id="searchButton" type="primary" @click="dialogFormVisiblea = true;dialogFormVisible = false;dialogFormVisibleb = false;" >{{ $t('processCard.beforefurnace') }}</el-button>
+    <el-button  id="searchButton" type="success" @click="dialogFormVisibleb = true;dialogFormVisible = false;dialogFormVisiblea = false">{{ $t('processCard.outfurnace') }}</el-button>
 <div v-if="dialogFormVisible" >
-    <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 700px;" v-loading="loading">
-<div style="width: 49%;float: left;background-color: #f4f4f5;height: 650px;">
+    <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 600px;" v-loading="loading">
+<div style="width: 49%;float: left;background-color: #f4f4f5;height: 550px;">
   <el-scrollbar height="630px">
     <div  style="position: relative;width: 1400px;">  
       <div  
@@ -92,8 +95,8 @@
    </div>
    </el-scrollbar>
   </div>
-<div style="width: 49%;float: right;background-color: #f4f4f5;height: 650px;">
-  <el-scrollbar height="630px">
+<div style="width: 49%;float: right;background-color: #f4f4f5;height: 550px;">
+  <el-scrollbar height="550px">
     <div  style="position: relative;width: 1400px;">  
       <div  
       v-for="(rect, index) in adjustedRects2"
@@ -114,7 +117,7 @@
 <div v-if="dialogFormVisiblea">
   <!-- 杩涚倝鍓� -->
   <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;" v-loading="loading">
-      <el-scrollbar height="630px">
+      <el-scrollbar height="550px">
     <div  style="position: relative;width: 1400px;">  
       <div  
       v-for="(rect, index) in adjustedRectsa"  
@@ -135,7 +138,7 @@
 <div v-if="dialogFormVisibleb">
   <!-- 宸插嚭鐐� -->
   <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;" v-loading="loading">
-      <el-scrollbar height="630px">
+      <el-scrollbar height="550px">
     <div  style="position: relative;width: 1400px;">  
       <div  
       v-for="(rect, index) in adjustedRectsb"  
diff --git a/UI-Project/src/views/PurchaseReturn/purchaseStorage.vue b/UI-Project/src/views/PurchaseReturn/purchaseStorage.vue
index 2a98019..10bf427 100644
--- a/UI-Project/src/views/PurchaseReturn/purchaseStorage.vue
+++ b/UI-Project/src/views/PurchaseReturn/purchaseStorage.vue
@@ -56,7 +56,7 @@
   <div style="margin-top: 10px;">
 <div>
     <el-card style="margin-left: 10px;margin-top: 10px;margin-right: 10px;" v-loading="loading">
-    <el-scrollbar height="630px">
+    <el-scrollbar height="600px">
     <div  style="position: relative;width: 1400px;">  
       <div  
       v-for="(rect, index) in adjustedRects"
diff --git a/UI-Project/src/views/RegisterView.vue b/UI-Project/src/views/RegisterView.vue
index 44b8078..9879f09 100644
--- a/UI-Project/src/views/RegisterView.vue
+++ b/UI-Project/src/views/RegisterView.vue
@@ -7,6 +7,10 @@
 import { Lock,Avatar } from '@element-plus/icons-vue'
   // import {Avatar, UserFilled} from "@element-plus/icons-vue";
 
+  import { useI18n } from 'vue-i18n'
+  const { t } = useI18n()
+  let language = ref(localStorage.getItem('lang') || 'zh')
+
   const router = useRouter()
   const route = useRoute()
   let loginLoadings= ref(false)
@@ -23,9 +27,9 @@
   /*鏂规硶*/
   const checkName = (rule: any, value: any, callback: any) => {
     if (value.trim() === '') {
-      callback(new Error('濮撳悕涓嶈兘涓虹┖'))
+      callback(new Error(t('login.namea')))
     }else if(value.length>16){
-      callback(new Error('闀垮害涓嶈兘瓒呰繃16'))
+      callback(new Error(t('login.len')))
     }else{
       callback()
     }
@@ -33,9 +37,9 @@
 
   const checkPassword = (rule: any, value: any, callback: any) => {
     if (value.trim() === '') {
-      callback(new Error('瀵嗙爜涓嶈兘涓虹┖'))
+      callback(new Error(t('login.passnull')))
     }else if(value.length>16 || value.length<6){
-      callback(new Error('瀵嗙爜闀垮害涓嶈兘浣庝簬6鎴栬秴杩�16'))
+      callback(new Error(t('login.leng')))
     }else{
       callback()
     }
@@ -43,11 +47,11 @@
 
   const checkConfirmPassword = (rule: any, value: any, callback: any) => {
     if (value.trim() === '') {
-      callback(new Error('纭瀵嗙爜涓嶈兘涓虹┖'))
+      callback(new Error(t('login.spwn')))
     }else if(value !== register.passWord){
-      callback(new Error('涓ゆ瀵嗙爜涓嶇浉鍚�'))
+      callback(new Error(t('login.depass')))
     }else if(value.length>16 || value.length<6){
-      callback(new Error('瀵嗙爜闀垮害涓嶈兘浣庝簬6鎴栬秴杩�16'))
+      callback(new Error(t('login.leng')))
     }else{
       callback()
     }
@@ -88,14 +92,14 @@
               })
             })
 
-            ElMessage.success(`娉ㄥ唽鎴愬姛`)
+            ElMessage.success(t('register.registerSuccessful'))
             loginLoadings.value=false
           } else {
             ElMessage.error(res['msg'])
             return false
           }
         }).catch(error => {
-          ElMessage.error("鏈嶅姟鍣ㄨ繛鎺ュけ璐�")
+          ElMessage.error(t('main.connectErr'))
           loginLoadings.value=false
           return false
         })
@@ -107,11 +111,6 @@
                 path:'/login',
               })
   }
-
-
-
-
-  // console.log(route.params)
 </script>
 
 <template>
@@ -123,7 +122,7 @@
         <img src="../../src/assets/3.png">
       </div> 
        <div style="position: absolute; left: 15vw; top: 22vw; font-size: 55px;color: rgba(29, 33, 41, 1);">
-        鍖楃幓MES绯荤粺
+        {{ $t('northglassMESsystem') }}
       </div>
     </div>
     <div id="div-login">
@@ -135,33 +134,33 @@
             :rules="rules"
             label-width="75px"
         >
-          <div id="title">娉ㄥ唽鏂扮敤鎴�</div>
+          <div id="title">{{ $t('register.newuserregister') }}</div>
         <div id="center">
             <!-- <div style="color: rgba(78, 89, 105, 1);margin-bottom: 10px;">濮撳悕</div> -->
-          <el-form-item prop="userName" label="濮撳悕:">
+          <el-form-item prop="userName" :label="$t('register.name')">
             <el-input
             style="width: 200px;"
                 v-model="register.userName"
                 type="text"
                 autocomplete="off"
                 :prefix-icon="Avatar"
-                placeholder="璇疯緭鍏ュ鍚�"
+                :placeholder="$t('register.inputname')"
             />
           </el-form-item>
             <!-- <div style="color: rgba(78, 89, 105, 1);margin-bottom: 10px;">瀵嗙爜</div> -->
-          <el-form-item prop="passWord" label="瀵嗙爜:">
+          <el-form-item prop="passWord" :label="$t('register.password')">
             <el-input
             style="width: 200px;"
                 v-model="register.passWord"
                 type="password"
                 autocomplete="off"
                 :prefix-icon="Lock"
-                placeholder="璇疯緭鍏ュ瘑鐮�"
+                :placeholder="$t('register.pwErr')"
                 show-password
             />
           </el-form-item>
             <!-- <div style="color: rgba(78, 89, 105, 1);margin-bottom: 10px;">纭瀵嗙爜</div> -->
-          <el-form-item prop="confirmPassword" label="纭瀵嗙爜:">
+          <el-form-item prop="confirmPassword" :label="$t('register.passwordation')">
             <el-input
             style="width: 200px;"
                 v-model="register.confirmPassword" 
@@ -169,7 +168,7 @@
                 :prefix-icon="Lock"
                 autocomplete="off"
                 show-password
-                placeholder="璇风‘璁ゅ瘑鐮�"
+                :placeholder="$t('register.pwErration')"
             />
           </el-form-item>
           <el-form-item id="submitForm">
@@ -178,13 +177,13 @@
                 type="primary"
                 @click="submitForm(ruleFormRef)"
                 plain
-            >纭娉ㄥ唽
+            >{{ $t('register.registration') }}
             </el-button>
             <el-button
                 type="primary"
                 @click="toLogin"
                 plain
-            >鍙栨秷
+            >{{ $t('register.false') }}
             </el-button>
 
           </el-form-item>
@@ -196,25 +195,6 @@
 </template>
 
 <style scoped>
-/* #main-div{
-  position: absolute;
-  left:75%;
-  top:45%;
-  transform: translate(-50%, -50%);
-} */
-/* #register{
-  background-color: #fff;
-  width: 32vw;
-  height: 35vh;
-  box-shadow: 0 8px 16px 0 rgba(0,0,0,0), 0 6px 5px 0 rgba(0,0,0,0.19);
-  display:flex;
-  align-items:center;
-  justify-content:center;
-  min-height: 280px;
-} */
-/* .el-form{
-  max-width: 300px;
-} */
 #div-login{
   margin-top: 5%;
   /* margin-top: 20%; */
diff --git a/UI-Project/src/views/Returns/returns.vue b/UI-Project/src/views/Returns/returns.vue
index f1b1f89..cff32bf 100644
--- a/UI-Project/src/views/Returns/returns.vue
+++ b/UI-Project/src/views/Returns/returns.vue
@@ -5,6 +5,8 @@
 const router = useRouter()
 import type { TableColumnCtx } from 'element-plus'
 import { ElMessage, ElMessageBox } from 'element-plus'
+import { useI18n } from 'vue-i18n'
+const { t } = useI18n()
 const dialogFormVisible = ref(false)
 const blind = ref(false)
 const blinda = ref(false)
@@ -25,7 +27,8 @@
 const selectedValuea = ref('');  
 const selectedValueb = ref('');
 const selectedValuec = ref(''); 
-const upstatus = ref('涓婄墖鏈烘墜鍔ㄧ姸鎬侊細'); // 鍋囪杩欎釜鐢ㄤ簬鏄剧ず鑷姩/鎵嬪姩鐘舵��  
+// const upstatus = ref('涓婄墖鏈烘墜鍔ㄧ姸鎬侊細'); // 鍋囪杩欎釜鐢ㄤ簬鏄剧ず鑷姩/鎵嬪姩鐘舵��  
+const upstatus = ref(t('basicData.machineaa'));
 const cuttingMachine = ref(''); // 鍋囪杩欎釜鐢ㄤ簬瀛樺偍鍚庣杩斿洖鐨勭姸鎬佸�硷紙0鎴�1锛�  
 const cuttingMachineStatusColor = ref('#911005'); // 鐢ㄤ簬鍔ㄦ�佽缃甶鏍囩鐨勮儗鏅壊 
 const inKageWord = ref(0); // 鐢ㄤ簬瀛樺偍瑕佷紶閫掔粰鎺ュ彛鐨刬nKageWord鍊� 
@@ -260,7 +263,7 @@
   else  {
       ElMessage({
         type: 'info',
-        message: '绗簩琛屽拰绗洓琛岀殑楂樺繀椤诲ぇ浜�2700鎵嶈兘淇濆瓨锛�',
+        message: t('basicData.pause'),
       })
     }
    
@@ -375,7 +378,7 @@
   }
     } else if (markingMachineStatus.value === '#911005' || cuttingMachineStatus.value === '#911005') {  
       // 鎻愮ず鐢ㄦ埛鎵撴爣鏈烘湭灏辩华  
-      ElMessage.warning('璇风‘璁ゆ墦鏍囨満鍜屽垏鍓叉満鐨勫氨缁姸鎬侊紒');  
+      ElMessage.warning(t('basicData.pausea'));  
     } 
 }
 // 鏆傚仠
@@ -400,7 +403,7 @@
     else  {
       ElMessage({
         type: 'info',
-        message: '宸ョ▼鍙蜂笉鑳戒负绌猴紒',
+        message: t('basicData.infonull'),
       })
     }
 }
@@ -433,7 +436,7 @@
     else  {
       ElMessage({
         type: 'info',
-        message: '宸ョ▼鍙蜂笉鑳戒负绌猴紒',
+        message: t('basicData.infonull'),
       })
     }
 }
@@ -446,13 +449,13 @@
 function getStatusText(state: number) {
   switch (state) {
     case 0:  
-      return '绛夊緟涓�';  
+      return t('basicData.waiting');
     case 1:  
-      return '涓婄墖涓�';  
+      return t('basicData.up');
     case 2:  
-      return '涓婄墖涓�';  
+    return t('basicData.up');
     case 100:  
-      return '宸插畬鎴�';  
+    return t('basicData.finish');
   }  
 }  
 function getStatusType(state: number) {  
@@ -498,7 +501,7 @@
 const toggleEnableState = async (row: any) => {  
   // 妫�鏌� id 鏄惁涓虹┖  
   if (!row.id) {  
-    ElMessage.error('璇ュ伐绋嬫湭淇濆瓨鍒颁笂鐗囪〃锛�');  
+    ElMessage.error(t('basicData.updatanull'));  
     return; // 濡傛灉 id 涓虹┖锛屽垯涓嶆墽琛屽悗缁搷浣�  
   }  
   
@@ -514,8 +517,7 @@
     }  
   } catch (error) {  
     // 澶勭悊璇锋眰閿欒  
-    console.error('鏇存柊鐜荤拑鐘舵�佽姹傚け璐�:', error);  
-    ElMessage.error('鏇存柊鐜荤拑鐘舵�佹椂鍙戠敓閿欒');  
+    ElMessage.error(t('basicData.glassnull'));   
   }  
 };  
 
@@ -547,7 +549,7 @@
     if (data && Array.isArray(data.InkageStatus) && data.InkageStatus.length > 0) {  
       const status = data.InkageStatus[0]; 
       cuttingMachine.value = status; 
-      upstatus.value = status === '1' ? '涓婄墖鏈鸿仈鏈虹姸鎬侊細' : '涓婄墖鏈烘墜鍔ㄧ姸鎬侊細';
+            upstatus.value = status === '1' ? t('basicData.machine') : t('basicData.machineaa');
       cuttingMachineStatusColor.value = status === '1' ? 'green' : '#911005';  
       inKageWord.value = status === '1' ? 0 : 1;  
     } else {  
@@ -565,7 +567,7 @@
   );  
     if (response.code == 200) {  
       const status = response.data.status; 
-      upstatus.value = status === '1' ? '涓婄墖鏈鸿仈鏈虹姸鎬侊細' : '涓婄墖鏈烘墜鍔ㄧ姸鎬侊細';  
+      upstatus.value = status === '1' ? t('basicData.machine') : t('basicData.machineaa');
       cuttingMachineStatusColor.value = status === '1' ? 'green' : '#911005';  
       // 鏄剧ず鎴愬姛娑堟伅  
       ElMessage.success(response.message);  
@@ -583,20 +585,20 @@
 <template>
   <div>
     <div id="dotClass">
-      <div>鎵撴爣鏈哄氨缁姸鎬侊細</div>  
+      <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;">纭</el-button>
-    <div style="margin-left: 70px;">鍒囧壊鏈哄氨缁姸鎬侊細</div>
+    <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;" >纭</el-button>
+    <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;" >鍒囨崲</el-button>
+    <el-button @click="confirmCutting" style="margin-left: 30px;margin-top: -3px;" >{{ $t('basicData.change') }}</el-button>
    
   </div>
-    <el-button style="margin-top: 5px;margin-left: 15px;"   id="searchButton" type="primary" @click="dialogFormVisible = true">閫夋嫨宸ョ▼</el-button>
-    <el-button style="margin-top: 5px;margin-left: 20px;" id="searchButton" type="primary" @click="handleBind">寮�濮嬩笂鐗�</el-button>
-    <el-button style="margin-top: 5px;margin-left: 20px;"  id="searchButton" type="warning" @click="handleBinda">鏆傚仠</el-button>
+    <el-button style="margin-top: 5px;margin-left: 15px;"   id="searchButton" type="primary" @click="dialogFormVisible = true">{{ $t('basicData.selectproject') }}</el-button>
+    <el-button style="margin-top: 5px;margin-left: 20px;" id="searchButton" type="primary" @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="danger" @click="handleBindb">鍋滄浠诲姟</el-button> -->
     
     <el-card style="flex: 1;margin-left: 10px;margin-top: 15px;" v-loading="loading">
@@ -607,12 +609,12 @@
      :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"
       :data="tableData"
     >
-    <el-table-column prop="engineeringId" label="宸ョ▼鍙�" width="200" align="center"/>
-      <el-table-column prop="width" label="鍘熺墖瀹�" align="center"/>
-      <el-table-column prop="height" label="鍘熺墖楂�" align="center"/>
-      <el-table-column prop="filmsId" label="鑶滅郴" align="center"/>
-      <el-table-column prop="layoutSequence" label="鏁伴噺" align="center"/>
-      <el-table-column prop="thickness" label="鍘氬害" 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 prop="layoutSequence" :label="$t('basicData.quantity')" align="center"/>
+      <el-table-column prop="thickness" :label="$t('basicData.thickness')" align="center"/>
       <!-- <el-table-column
             align="center"
             label="鐘舵��"
@@ -626,7 +628,7 @@
       </template>  -->
       <el-table-column
           align="center"
-            label="鍚敤鐘舵��"
+            :label="$t('basicData.startstatus')"
             min-width="80"
             prop="state"
           >
@@ -635,34 +637,34 @@
             :type="scope.row.state === 100 ? 'success' : 'warning'"  
             @click="toggleEnableState(scope.row)"  
           >  
-            {{ scope.row.state === 100 ? '閫氳繃' : '绛夊緟涓�' }}  
+            {{ 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="鏄惁寮�濮嬩笂鐗�?" >
+  <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">鍙栨秷</el-button>
+        <el-button @click="blind = false">{{ $t('basicData.cancel') }}</el-button>
       </div>
     </template>
   </el-dialog>
-  <el-dialog v-model="blinda" top="30vh" width="25%" title="鏄惁鏆傚仠?" >
+  <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">鍙栨秷</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="鏄惁鍋滄浠诲姟?" >
+  <!-- <el-dialog v-model="blindb" top="30vh" width="25%" title="鏄惁鍋滄浠诲姟?" >
     <template #footer>
       <div id="dialog-footer">
         <el-button type="primary" @click="handleb">
@@ -671,31 +673,31 @@
         <el-button @click="blindb = false">鍙栨秷</el-button>
       </div>
     </template>
-  </el-dialog>
+  </el-dialog> -->
       <div id="parent">
         <img src="../../assets/shangpianji.png" alt="" style="max-width: 20%;max-height: 20%;margin-top: 20px;margin-left: 500px;">
         <div id="overlay" v-show="flake"></div>
         <div id="overlaya" v-show="flakea"></div>
       </div>
       <div style="margin-top: -350px;margin-left: 650px;">
-        <el-table :data="tableDataa" border style="width: 70%"
+        <el-table :data="tableDataa" border style="width: 85%"
      :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"
         >
-          <el-table-column prop="workstationId" align="center" label="宸ヤ綅" min-width="50" />
-          <el-table-column prop="patternWidth" align="center" label="瀹�" min-width="80" />
-          <el-table-column prop="patternHeight" align="center" label="楂�" min-width="80" />
-          <el-table-column prop="filmsId" align="center" label="鑶滅郴" min-width="80" />
-          <el-table-column prop="number" align="center" label="鏁伴噺" min-width="80" />
-          <el-table-column fixed="right" label="鎿嶄綔" align="center" width="150">
+          <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)">娣诲姞</el-button>
-              <el-button size="mini" type="text" plain @click="handleBindRacka(scope.row)">鍒犻櫎</el-button>
+              <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="娣诲姞鍘熺墖" >
+  <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">
@@ -703,12 +705,12 @@
           <el-col :span="6">
               <div id="dt" style="font-size: 15px;">
         <div>
-              <el-form-item label="瀹斤細" :required="true" style="width: 14vw">
+              <el-form-item :label="$t('basicData.widtha')" :required="true" style="width: 14vw">
                <el-select  
                       v-model="selectedValue"  
                       filterable  
                       clearable  
-                      placeholder="璇烽�夋嫨瀹�"  
+                      :placeholder="$t('basicData.selectwidth')"
                       style="width: 220px"  
                       @input="handleInputChangea"  
                     >  
@@ -725,12 +727,12 @@
           <el-col :span="9">
             <div id="dta" style="font-size: 15px;">
         <div>
-          <el-form-item label="楂橈細" :required="true" style="width: 14vw">
+          <el-form-item :label="$t('basicData.heighta')" :required="true" style="width: 14vw">
             <el-select  
                       v-model="selectedValuea"  
                       filterable  
                       clearable  
-                      placeholder="璇烽�夋嫨楂�"  
+                      :placeholder="$t('basicData.selectheight')" 
                       style="width: 220px"  
                       @input="handleInputChangea"  
                     >  
@@ -749,12 +751,12 @@
           <el-col :span="6">
               <div id="dt" style="font-size: 15px;">
         <div>
-              <el-form-item label="鑶滅郴锛�" :required="true" style="width: 14vw;">
+              <el-form-item :label="$t('basicData.coatingtypesa')"  :required="true" style="width: 14vw;">
                 <el-select  
                       v-model="selectedValueb"  
                       filterable  
                       clearable  
-                      placeholder="璇烽�夋嫨鑶滅郴"  
+                      :placeholder="$t('basicData.selectcoatingtypes')"
                       style="width: 220px"  
                       @input="handleInputChangea"  
                     >  
@@ -770,12 +772,12 @@
           <el-col :span="9">
             <div id="dta" style="font-size: 15px;">
         <div>
-              <el-form-item label="鍘氬害锛�" :required="true" style="width: 14vw">
+              <el-form-item :label="$t('basicData.thicknessa')" :required="true" style="width: 14vw">
                 <el-select  
                       v-model="selectedValuec"  
                       filterable  
                       clearable  
-                      placeholder="璇烽�夋嫨鍘氬害"  
+                      :placeholder="$t('basicData.selectthickness')"
                       style="width: 220px"  
                       @input="handleInputChangea"  
                     >  
@@ -794,8 +796,8 @@
           <el-col :span="6">
               <div id="dt" style="font-size: 15px;">
         <div>
-              <el-form-item label="鏁伴噺锛�" :required="true" style="width: 14vw;">
-                <el-input placeholder="璇疯緭鍏ユ暟閲�" v-model="number" autocomplete="off" />
+              <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>
@@ -805,31 +807,31 @@
     <template #footer>
       <div id="dialog-footer">
         <el-button type="primary" @click="handleConfirm">
-          纭
+          {{ $t('basicData.confirm') }}
         </el-button>
-        <el-button @click="add = false">鍙栨秷</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="鏄惁鍒犻櫎璇ユ潯淇℃伅?" >
+  <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">鍙栨秷</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="宸ョ▼" >
+  <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="宸ョ▼鍙凤細" :required="true">
+      <el-form-item :label="$t('basicData.projectnumber')" :required="true">
         <el-select  
            v-model="selectedProjectNo"  
            filterable  
            clearable  
-           placeholder="璇烽�夋嫨宸ョ▼"  
+           :placeholder="$t('basicData.plselectproject')"
            style="width: 220px"  
            @input="handleInputChange"  
          >  
@@ -845,9 +847,9 @@
     <template #footer>
       <div id="dialog-footer">
         <el-button type="primary" @click="handleup">
-          纭
+          {{ $t('basicData.confirm') }}
         </el-button>
-        <el-button @click="dialogFormVisible = false">鍙栨秷</el-button>
+        <el-button @click="dialogFormVisible = false">{{ $t('basicData.cancel') }}</el-button>
       </div>
     </template>
   </el-dialog>
diff --git a/UI-Project/src/views/Slicecage/slicecage.vue b/UI-Project/src/views/Slicecage/slicecage.vue
index 15839b1..2a42c23 100644
--- a/UI-Project/src/views/Slicecage/slicecage.vue
+++ b/UI-Project/src/views/Slicecage/slicecage.vue
@@ -1,4 +1,11 @@
 <script lang="ts" setup>
+// import zhCn from 'element-plus/lib/locale/lang/zh-cn'
+// import en from 'element-plus/dist/locale/en.mjs'
+// const { locale } = useI18n()
+
+import { useI18n } from 'vue-i18n'
+  const { t } = useI18n()
+  let language = ref(localStorage.getItem('lang') || 'zh')
 import {Search} from "@element-plus/icons-vue";
 import {reactive} from "vue";
 import {useRouter} from "vue-router"
@@ -18,6 +25,7 @@
 const tableDatad = ref([])
 const tableDatae = ref([])
 const adjustedRects = ref([]);
+const adjustedRectsa = ref([]);
 // const height = ref([]);
 const add = ref(false)
 const flowCardId = ref('');
@@ -58,111 +66,112 @@
 const cell6=ref(true);
 const cell7=ref(true);
 const cell8=ref(true);
+const selectedRow = ref(null); // 瀛樺偍閫変腑鐨勮鏁版嵁  
  
 const currentPage4 = ref(4)
 const pageSize4 = ref(100)
  
-  var timer=setInterval(() => {
-    // console.log(million.value,million1.value);
-    million.value+=1;
-    if(million.value-million1.value!==12){
+  // var timer=setInterval(() => {
+  //   // console.log(million.value,million1.value);
+  //   million.value+=1;
+  //   if(million.value-million1.value!==12){
       
-      if(million.value-million1.value>=2){
-        if(carposition1.value==220){
-          timers1.value=false;
-        }else if(carposition1.value==60){
-          timers1.value=true;
-        }
-        if(timers1.value==true){
-          carposition1.value=carposition1.value+16;
-        }else{
-          carposition1.value=carposition1.value-16;
-        }
+  //     if(million.value-million1.value>=2){
+  //       if(carposition1.value==220){
+  //         timers1.value=false;
+  //       }else if(carposition1.value==60){
+  //         timers1.value=true;
+  //       }
+  //       if(timers1.value==true){
+  //         carposition1.value=carposition1.value+16;
+  //       }else{
+  //         carposition1.value=carposition1.value-16;
+  //       }
  
         
-        if(carposition2.value==220){
-          timers2.value=false;
-        }else if(carposition2.value==60){
-          timers2.value=true;
-        }
-        if(timers2.value==true){
-          carposition2.value+=16;
-        }else{
-          carposition2.value-=16;
-        }
-      }else{
+  //       if(carposition2.value==220){
+  //         timers2.value=false;
+  //       }else if(carposition2.value==60){
+  //         timers2.value=true;
+  //       }
+  //       if(timers2.value==true){
+  //         carposition2.value+=16;
+  //       }else{
+  //         carposition2.value-=16;
+  //       }
+  //     }else{
  
-      }
-    }else{
-      million1.value=million.value;
+  //     }
+  //   }else{
+  //     million1.value=million.value;
     
-      if(cellshow1.value==true){
-        cellshow1.value=false;
-      }else{
-        cellshow1.value=true;
-      }
-      if(cellshow2.value==true){
-        cellshow2.value=false;
-      }else{
-        cellshow2.value=true;
-      }
-    }
+  //     if(cellshow1.value==true){
+  //       cellshow1.value=false;
+  //     }else{
+  //       cellshow1.value=true;
+  //     }
+  //     if(cellshow2.value==true){
+  //       cellshow2.value=false;
+  //     }else{
+  //       cellshow2.value=true;
+  //     }
+  //   }
     
-  }, 1000);
+  // }, 1000);
  
-  var timer=setInterval(() => {
-    // console.log(million3.value,million4.value);
-    million3.value+=1;
-    if(million3.value-million4.value!==12){
+  // var timer=setInterval(() => {
+  //   // console.log(million3.value,million4.value);
+  //   million3.value+=1;
+  //   if(million3.value-million4.value!==12){
       
-      if(million3.value-million4.value>=2){
-        if(carposition3.value==260){
-          timers3.value=false;
-        }else if(carposition3.value==60){
-          timers3.value=true;
-        }
-        if(timers3.value==true){
-          carposition3.value=carposition3.value+20;
-        }else{
-          carposition3.value=carposition3.value-20;
-        }
+  //     if(million3.value-million4.value>=2){
+  //       if(carposition3.value==260){
+  //         timers3.value=false;
+  //       }else if(carposition3.value==60){
+  //         timers3.value=true;
+  //       }
+  //       if(timers3.value==true){
+  //         carposition3.value=carposition3.value+20;
+  //       }else{
+  //         carposition3.value=carposition3.value-20;
+  //       }
  
         
-        if(carposition4.value==260){
-          timers4.value=false;
-        }else if(carposition4.value==60){
-          timers4.value=true;
-        }
-        if(timers4.value==true){
-          carposition4.value+=20;
-        }else{
-          carposition4.value-=20;
-        }
-      }else{
+  //       if(carposition4.value==260){
+  //         timers4.value=false;
+  //       }else if(carposition4.value==60){
+  //         timers4.value=true;
+  //       }
+  //       if(timers4.value==true){
+  //         carposition4.value+=20;
+  //       }else{
+  //         carposition4.value-=20;
+  //       }
+  //     }else{
  
-      }
-    }else{
-      million4.value=million3.value;
-      if(cellshow5.value==true){
-        cellshow5.value=false;
+  //     }
+  //   }else{
+  //     million4.value=million3.value;
+  //     if(cellshow5.value==true){
+  //       cellshow5.value=false;
         
-      }else{
-        cellshow5.value=true;
+  //     }else{
+  //       cellshow5.value=true;
         
-      }
-      if(cellshow3.value==true){
-        cellshow3.value=false;
-      }else{
-        cellshow3.value=true;
-      }
-      if(cellshow4.value==true){
-        cellshow4.value=false;
-      }else{
-        cellshow4.value=true;
-      }
-    }
+  //     }
+  //     if(cellshow3.value==true){
+  //       cellshow3.value=false;
+  //     }else{
+  //       cellshow3.value=true;
+  //     }
+  //     if(cellshow4.value==true){
+  //       cellshow4.value=false;
+  //     }else{
+  //       cellshow4.value=true;
+  //     }
+  //   }
     
-  }, 1000);
+  // }, 1000);
 
 const getTableRow = (row,type) =>{
   switch (type) {
@@ -178,24 +187,35 @@
   }
 }
 const handleBindRack = (row) => {
+  selectedRow.value = row; // 鏇存柊閫変腑鐨勮鏁版嵁  
   add.value = true; // 鎵撳紑缁戝畾鏋跺瓙瀵硅瘽妗�
 };
-// 娣诲姞
-const handleConfirm = async () => {
+async function handleConfirm() {
+  if (!selectedRow.value) {  
+    // 澶勭悊娌℃湁閫変腑琛岀殑鎯呭喌...  
+    return;  
+  }  
+  
+  // 鏋勯�犱綘鐨凱OST璇锋眰鏁版嵁锛屽寘鍚�変腑鐨勮鏁版嵁鍜岃〃鍗曟暟鎹�  
+  const postData = {  
+    ...selectedRow.value, // 閫変腑琛岀殑鏁版嵁  
+  };  
+  
   try {
     const response = await request.post('/cacheVerticalGlass/bigStorageCageDetails/insertBigStorageCageDetails', {
-      flowCardId: flowCardId.value,
-      gap: gap.value,
-      glassId: glassId.value,
-      glassType: glassType.value,
-      height: height.value,
-      sequence: sequence.value,
-      state: state.value,
-      temperingFeedSequence: temperingFeedSequence.value,
-      temperingLayoutId: temperingLayoutId.value,
-      thickness: thickness.value,
-      width: width.value,
-    }); 
+      'flowCardId': flowCardId.value,
+      'gap': gap.value,
+      'glassId': glassId.value,
+      'glassType': glassType.value,
+      'height': height.value,
+      'sequence': sequence.value,
+      'state': state.value,
+      'temperingFeedSequence': temperingFeedSequence.value,
+      'temperingLayoutId': temperingLayoutId.value,
+      'thickness': thickness.value,
+      'width': width.value,
+       body: JSON.stringify(postData),  
+    });
     if (response.code == 200) {
       // 缁戝畾鎴愬姛锛屽鐞嗛�昏緫
       ElMessage.success(response.message);
@@ -203,13 +223,43 @@
      tableData.value = response.data;
     } else {
       // 璇锋眰澶辫触锛屾樉绀洪敊璇秷鎭�
-      ElMessage.error(response.msg);
+      ElMessage.error(response.message);
     }
-  } catch (error) {
-    // 澶勭悊閿欒
-    console.error(error);
-  }
-};
+  } catch (error) {  
+    // 澶勭悊閿欒...  
+    console.error(error);  
+  }  
+}  
+// 娣诲姞
+// const handleConfirm = async () => {
+//   try {
+//     const response = await request.post('/cacheVerticalGlass/bigStorageCageDetails/insertBigStorageCageDetails', {
+//       'bigStorageCageOutTask.flowCardId': flowCardId.value,
+//       'bigStorageCageOutTask.gap': gap.value,
+//       'bigStorageCageOutTask.glassId': glassId.value,
+//       'bigStorageCageOutTask.glassType': glassType.value,
+//       'bigStorageCageOutTask.height': height.value,
+//       'bigStorageCageOutTask.sequence': sequence.value,
+//       'bigStorageCageOutTask.state': state.value,
+//       'bigStorageCageOutTask.temperingFeedSequence': temperingFeedSequence.value,
+//       'bigStorageCageOutTask.temperingLayoutId': temperingLayoutId.value,
+//       'bigStorageCageOutTask.thickness': thickness.value,
+//       'bigStorageCageOutTask.width': width.value,
+//     }); 
+//     if (response.code == 200) {
+//       // 缁戝畾鎴愬姛锛屽鐞嗛�昏緫
+//       ElMessage.success(response.message);
+//       add.value = false;
+//      tableData.value = response.data;
+//     } else {
+//       // 璇锋眰澶辫触锛屾樉绀洪敊璇秷鎭�
+//       ElMessage.error(response.msg);
+//     }
+//   } catch (error) {
+//     // 澶勭悊閿欒
+//     console.error(error);
+//   }
+// };
 // 鏄惁绂佺敤
 const toggleEnableState = async (row) => {
   const newState = row.enableState === 1 ? 0 : 1;  
@@ -233,26 +283,24 @@
 // ]);  
  // 鍒犻櫎 
  const opena = async(row) => {  
-  try {  
+  try {
     const confirmResult = await ElMessageBox.confirm(  
-      '鏄惁鍒犻櫎璇ユ潯淇℃伅?',  
-      '鎻愮ず',  
+      t('searchOrder.deletemessage'), 
+      t('searchOrder.prompt'),  
       {  
-        confirmButtonText: '鏄�',  
-        cancelButtonText: '鍙栨秷',  
+        confirmButtonText: t('searchOrder.yes'), 
+        cancelButtonText: t('searchOrder.cancel'),
         type: 'warning',  
-      }  
-    );  
+      } 
+    ); 
     if (confirmResult === 'confirm') {  
       // 鐢ㄦ埛鐐瑰嚮浜嗏�滄槸鈥濓紝鐜板湪璋冪敤鍒犻櫎鎺ュ彛  
-      const response = await request.post("/cacheVerticalGlass/bigStorageCageDetails/deleteBigStorageCageDetails", {
-        menuId: row.id,
-    })
+      const response = await request.post("/cacheVerticalGlass/bigStorageCageDetails/deleteBigStorageCageDetails",row)
     if (response.code === 200) {
       ElMessage.success(response.message);
       } else {  
         // 鍒犻櫎澶辫触锛屾偍鍙互澶勭悊閿欒鎴栨樉绀洪敊璇俊鎭粰鐢ㄦ埛  
-      ElMessage.error(response.msg);
+      ElMessage.error(response.message);
         // alert('鍒犻櫎澶辫触锛�' + deleteResponse.message); 
       }  
     }  
@@ -261,6 +309,229 @@
     console.error('鍙戠敓閿欒:', error);  
   }  
 }; 
+ // 鐮存崯
+ const broke = async(row) => {  
+  try {
+    const confirmResult = await ElMessageBox.confirm(  
+      t('searchOrder.broke'), 
+      t('searchOrder.prompt'),  
+      {  
+        confirmButtonText: t('searchOrder.yes'), 
+        cancelButtonText: t('searchOrder.cancel'),
+        type: 'warning',  
+      } 
+    ); 
+    if (confirmResult === 'confirm') {  
+      // const dataToSend = {  
+      //   ...row,
+      //   status: 0 
+      // };  
+      // 鐢ㄦ埛鐐瑰嚮浜嗏�滄槸鈥濓紝鐜板湪璋冪敤鍒犻櫎鎺ュ彛  
+      const response = await request.post("/cacheVerticalGlass/bigStorageCageDetails/damageBigStorageCageDetails?status="+0, row)
+    if (response.code === 200) {
+      ElMessage.success(response.message);
+      } else {  
+        // 鍒犻櫎澶辫触锛屾偍鍙互澶勭悊閿欒鎴栨樉绀洪敊璇俊鎭粰鐢ㄦ埛  
+      ElMessage.error(response.message);
+        // alert('鍒犻櫎澶辫触锛�' + deleteResponse.message); 
+      }  
+    }  
+  } catch (error) {  
+    // 澶勭悊鍙兘鍑虹幇鐨勯敊璇紝姣斿 ElMessageBox 鎶涘嚭鐨勫紓甯哥瓑  
+    console.error('鍙戠敓閿欒:', error);  
+  }  
+}; 
+ // 鎷胯蛋
+ const brokec = async(row) => {  
+  try {
+    const confirmResult = await ElMessageBox.confirm(  
+      t('searchOrder.brokeb'), 
+      t('searchOrder.prompt'),  
+      {  
+        confirmButtonText: t('searchOrder.yes'), 
+        cancelButtonText: t('searchOrder.cancel'),
+        type: 'warning',  
+      } 
+    ); 
+    if (confirmResult === 'confirm') {  
+      // const dataToSend = {  
+      //   ...row,
+      //   status: 1
+      // };  
+      // 鐢ㄦ埛鐐瑰嚮浜嗏�滄槸鈥濓紝鐜板湪璋冪敤鍒犻櫎鎺ュ彛  
+      const response = await request.post("/cacheVerticalGlass/bigStorageCageDetails/damageBigStorageCageDetails?status="+1, row)
+    if (response.code === 200) {
+      ElMessage.success(response.message);
+      } else {  
+        // 鍒犻櫎澶辫触锛屾偍鍙互澶勭悊閿欒鎴栨樉绀洪敊璇俊鎭粰鐢ㄦ埛  
+      ElMessage.error(response.message);
+        // alert('鍒犻櫎澶辫触锛�' + deleteResponse.message); 
+      }  
+    }  
+  } catch (error) {  
+    // 澶勭悊鍙兘鍑虹幇鐨勯敊璇紝姣斿 ElMessageBox 鎶涘嚭鐨勫紓甯哥瓑  
+    console.error('鍙戠敓閿欒:', error);  
+  }  
+}; 
+ // 鍑虹墖
+ const outfil = async(row) => {  
+  try {
+    const confirmResult = await ElMessageBox.confirm(  
+      t('searchOrder.outfil'), 
+      t('searchOrder.prompt'),  
+      {  
+        confirmButtonText: t('searchOrder.yes'), 
+        cancelButtonText: t('searchOrder.cancel'),
+        type: 'warning',  
+      } 
+    ); 
+    if (confirmResult === 'confirm') {  
+      // 鐢ㄦ埛鐐瑰嚮浜嗏�滄槸鈥濓紝鐜板湪璋冪敤鍒犻櫎鎺ュ彛  
+      const response = await request.post("/cacheVerticalGlass/bigStorageCageDetails/outBigStorageCageDetails", row)
+    if (response.code === 200) {
+      ElMessage.success(response.message);
+      } else {  
+        // 鍒犻櫎澶辫触锛屾偍鍙互澶勭悊閿欒鎴栨樉绀洪敊璇俊鎭粰鐢ㄦ埛  
+      ElMessage.error(response.message);
+        // alert('鍒犻櫎澶辫触锛�' + deleteResponse.message); 
+      }  
+    }  
+  } catch (error) {  
+    // 澶勭悊鍙兘鍑虹幇鐨勯敊璇紝姣斿 ElMessageBox 鎶涘嚭鐨勫紓甯哥瓑  
+    console.error('鍙戠敓閿欒:', error);  
+  }  
+}; 
+ // 鍑虹墖闃熷垪鐮存崯
+ const brokea = async(row) => {  
+  try {
+    const confirmResult = await ElMessageBox.confirm(  
+      t('searchOrder.broke'), 
+      t('searchOrder.prompt'),  
+      {  
+        confirmButtonText: t('searchOrder.yes'), 
+        cancelButtonText: t('searchOrder.cancel'),
+        type: 'warning',  
+      } 
+    ); 
+    if (confirmResult === 'confirm') {  
+      // 鐢ㄦ埛鐐瑰嚮浜嗏�滄槸鈥濓紝鐜板湪璋冪敤鍒犻櫎鎺ュ彛  
+      // const dataToSend = {  
+      //   ...row,
+      //   status: 0
+      // };  
+      const response = await request.post("/cacheVerticalGlass/temperingGlassInfo/damageTemperingGlassInfo?status="+0, row)
+    if (response.code === 200) {
+      ElMessage.success(response.message);
+      } else {  
+        // 鍒犻櫎澶辫触锛屾偍鍙互澶勭悊閿欒鎴栨樉绀洪敊璇俊鎭粰鐢ㄦ埛  
+      ElMessage.error(response.message);
+        // alert('鍒犻櫎澶辫触锛�' + deleteResponse.message); 
+      }  
+    }  
+  } catch (error) {  
+    // 澶勭悊鍙兘鍑虹幇鐨勯敊璇紝姣斿 ElMessageBox 鎶涘嚭鐨勫紓甯哥瓑  
+    console.error('鍙戠敓閿欒:', error);  
+  }  
+}; 
+// 鍑虹墖闃熷垪鎷胯蛋
+const brokeb = async(row) => {  
+  try {
+    const confirmResult = await ElMessageBox.confirm(  
+      t('searchOrder.brokeb'), 
+      t('searchOrder.prompt'),  
+      {  
+        confirmButtonText: t('searchOrder.yes'), 
+        cancelButtonText: t('searchOrder.cancel'),
+        type: 'warning',  
+      } 
+    ); 
+    if (confirmResult === 'confirm') {  
+      // 鐢ㄦ埛鐐瑰嚮浜嗏�滄槸鈥濓紝鐜板湪璋冪敤鍒犻櫎鎺ュ彛  
+      // const dataToSend = {  
+      //   ...row,
+      //   status: 1
+      // };  
+      const response = await request.post("/cacheVerticalGlass/temperingGlassInfo/damageTemperingGlassInfo?status="+1, row)
+    if (response.code === 200) {
+      ElMessage.success(response.message);
+      } else {  
+        // 鍒犻櫎澶辫触锛屾偍鍙互澶勭悊閿欒鎴栨樉绀洪敊璇俊鎭粰鐢ㄦ埛  
+      ElMessage.error(response.message);
+        // alert('鍒犻櫎澶辫触锛�' + deleteResponse.message); 
+      }  
+    }  
+  } catch (error) {  
+    // 澶勭悊鍙兘鍑虹幇鐨勯敊璇紝姣斿 ElMessageBox 鎶涘嚭鐨勫紓甯哥瓑  
+    console.error('鍙戠敓閿欒:', error);  
+  }  
+}; 
+// 鍑虹墖闃熷垪鍒犻櫎
+const deletea = async(row) => {  
+  try {
+    const confirmResult = await ElMessageBox.confirm(  
+      t('searchOrder.deletemessage'), 
+      t('searchOrder.prompt'),  
+      {  
+        confirmButtonText: t('searchOrder.yes'), 
+        cancelButtonText: t('searchOrder.cancel'),
+        type: 'warning',  
+      } 
+    ); 
+    if (confirmResult === 'confirm') {  
+      // 鐢ㄦ埛鐐瑰嚮浜嗏�滄槸鈥濓紝鐜板湪璋冪敤鍒犻櫎鎺ュ彛  
+      const dataToSend = {  
+        ...row,
+        status: 1
+      };  
+      const response = await request.post("/cacheVerticalGlass/temperingGlassInfo/deleteTemperingGlassInfo", dataToSend)
+    if (response.code === 200) {
+      ElMessage.success(response.message);
+      } else {  
+        // 鍒犻櫎澶辫触锛屾偍鍙互澶勭悊閿欒鎴栨樉绀洪敊璇俊鎭粰鐢ㄦ埛  
+      ElMessage.error(response.message);
+        // alert('鍒犻櫎澶辫触锛�' + deleteResponse.message); 
+      }  
+    }  
+  } catch (error) {  
+    // 澶勭悊鍙兘鍑虹幇鐨勯敊璇紝姣斿 ElMessageBox 鎶涘嚭鐨勫紓甯哥瓑  
+    console.error('鍙戠敓閿欒:', error);  
+  }  
+}; 
+// 瀹屾垚浠诲姟
+const finish = async(row) => {  
+  try {
+    const confirmResult = await ElMessageBox.confirm(  
+      t('searchOrder.fin'), 
+      t('searchOrder.prompt'),  
+      {  
+        confirmButtonText: t('searchOrder.yes'), 
+        cancelButtonText: t('searchOrder.cancel'),
+        type: 'warning',  
+      } 
+    ); 
+    if (confirmResult === 'confirm') {  
+      // 鐢ㄦ埛鐐瑰嚮浜嗏�滄槸鈥濓紝鐜板湪璋冪敤鍒犻櫎鎺ュ彛  
+      // const dataToSend = {  
+      //   ...row,
+      //   status: 1
+      // };  
+      const response = await request.post("/cacheVerticalGlass/bigStorageCageDetails/finishBigStorageCageDetails", row)
+    if (response.code === 200) {
+      ElMessage.success(response.message);
+      } else {  
+        // 鍒犻櫎澶辫触锛屾偍鍙互澶勭悊閿欒鎴栨樉绀洪敊璇俊鎭粰鐢ㄦ埛  
+      ElMessage.error(response.message);
+        // alert('鍒犻櫎澶辫触锛�' + deleteResponse.message); 
+      }  
+    }  
+  } catch (error) {  
+    // 澶勭悊鍙兘鍑虹幇鐨勯敊璇紝姣斿 ElMessageBox 鎶涘嚭鐨勫紓甯哥瓑  
+    console.error('鍙戠敓閿欒:', error);  
+  }  
+}; 
+function handleRowClick(row) {  
+  selectedRow.value = row; // 鏇存柊閫変腑鐨勮鏁版嵁  
+}  
 
 const socketUrl = `ws://${WebSocketHost}:${host}/api/cacheVerticalGlass/api/talk/slicecage`;
 // 瀹氫箟娑堟伅澶勭悊鍑芥暟锛屾洿鏂� receivedData 鍙橀噺
@@ -271,15 +542,20 @@
   tableData.value = data.bigStorageCageInfo[0]
   tableDatab.value = data.temperingGlassInfoList[0]
   tableDatae.value = data.bigStorageCageUsage[0]
-  adjustedRects.value = data.bigStorageCageInfo1[0]
-  // adjustedRects.value = data.bigStorageCageInfo1[0].map(rect => ({  
-  //           ...rect, // 澶嶅埗鍘熷瀵硅薄鐨勫叾浠栧睘鎬�  
-  //           height: rect.length *0.5,
-            
-  //         })); 
-  window.localStorage.setItem('length', data.bigStorageCageInfo1[0].length)
-  let length = window.localStorage.getItem('length')
-  console.log(length);
+  // adjustedRects.value = data.bigStorageCageInfo1[0]
+  adjustedRects.value = data.bigStorageCageInfo1[0].map(rect => ({  
+            ...rect, 
+            // width: rect.remainWidth *0.04,
+            top: rect.id *2,
+          })); 
+console.log(data.bigStorageCageInfo1[0]);
+adjustedRectsa.value = data.bigStorageCageInfo2[0].map(rect => ({  
+            ...rect, 
+            // width: rect.remainWidth *0.04,
+            top: rect.id *2,
+          })); 
+  // window.localStorage.setItem('length', data.bigStorageCageInfo1[0].length)
+  // let length = window.localStorage.getItem('length')
   
 };
 // function getRectHeight(length: number) {  
@@ -302,9 +578,9 @@
 function getStatusText(enableState: number) {
   switch (enableState) {
     case 0:  
-      return '绂佺敤';  
+      return t('searchOrder.disable');
     case 1:  
-      return '鍚敤'; 
+      return t('searchOrder.enable'); 
   }  
 }
 function getStatusTypea(ishorizontal: number) {  
@@ -318,9 +594,9 @@
 function getStatusTexta(ishorizontal: number) {
   switch (ishorizontal) {
     case 0:  
-      return '涓嶆帴鍙�';  
+      return t('searchOrder.noaccept');
     case 1:  
-      return '鎺ュ彈'; 
+    return t('searchOrder.accept');
   }  
 }
 function getStatusTypeb(state: number) {  
@@ -334,11 +610,11 @@
 function getStatusTextb(state: number) {
   switch (state) {
     case 0:  
-      return '鍑虹墖瀹屾垚';  
+      return t('searchOrder.filmcomplete');
     case 1:  
-      return '绛夊緟涓�'; 
+      return t('searchOrder.waiting');
     case 2:  
-      return '绛夊緟涓�'; 
+    return t('searchOrder.waiting');
   }  
 }
 onBeforeUnmount(() => {
@@ -348,26 +624,39 @@
 </script>
  
 <template>
-  <div style="height: 700px;">
-    <el-button style="margin-top: 5px;margin-left: 10px;"   id="searchButton" type="primary" @click="dialogFormVisiblea = true">鐞嗙墖绗间俊鎭�</el-button>
-    <el-button style="margin-top: 5px;margin-left: 10px;"   id="searchButton" type="success" @click="dialogFormVisibleb = true">鍑虹墖闃熷垪</el-button>
+  <div style="height: 600px;">
+    <el-button style="margin-top: 5px;margin-left: 10px;"   id="searchButton" type="primary" @click="dialogFormVisiblea = true">{{ $t('searchOrder.cageinformation') }}</el-button>
+    <el-button style="margin-top: 5px;margin-left: 10px;"   id="searchButton" type="success" @click="dialogFormVisibleb = true">{{ $t('searchOrder.productionqueue') }}</el-button>
     <el-card style="flex: 1;margin-left: 10px;margin-top: 5px;" v-loading="loading">
       <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;max-height: 100px;">
         <el-table height="100%" ref="table" 
         :data="tableDatac" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
-          <el-table-column prop="bigStorageCageOutTask.glassId" align="center" label="鍑虹墖鐜荤拑ID" min-width="80" />
-          <el-table-column prop="bigStorageCageOutTask.startSlot" align="center" label="璧峰浣嶇疆" min-width="120" />
-          <el-table-column prop="bigStorageCageOutTask.endSlot" align="center" label="鐩爣浣嶇疆" min-width="120" />
-          <el-table-column prop="bigStorageCageOutTask.trainNumber" align="center" label="杞︽" min-width="120" />
-          <el-table-column prop="bigStorageCageOutTask.serialNumber" align="center" label="搴忓彿" min-width="120" />
-          <el-table-column prop="bigStorageCageOutTask.taskState" align="center" label="浠诲姟鐘舵��" min-width="157">
-          <template #default="scope">
-            <el-tag type="success" >{{ scope.row.bigStorageCageOutTask.taskState==0?"绛夊緟杩涚墖":"杩涜涓�"  }}</el-tag>
+          <el-table-column prop="bigStorageCageOutTask.glassId" align="center" :label="$t('searchOrder.outputglassID')" min-width="100" />
+          <el-table-column prop="bigStorageCageOutTask.startSlot" align="center" :label="$t('searchOrder.startposition')" min-width="120" />
+          <el-table-column prop="bigStorageCageOutTask.endSlot" align="center" :label="$t('searchOrder.targetlocation')" min-width="120" />
+          <el-table-column prop="bigStorageCageOutTask.trainNumber" align="center" :label="$t('searchOrder.trips')" min-width="120" />
+          <el-table-column prop="bigStorageCageOutTask.serialNumber" align="center" :label="$t('searchOrder.number')" min-width="120" />
+          <el-table-column prop="bigStorageCageOutTask.taskState" align="center" :label="$t('searchOrder.taskstatus')" min-width="157">
+          <template #default="scope">  
+            <el-tag type="success" >{{ scope.row.bigStorageCageOutTask.taskState==0? $t('searchOrder.filmenter') : $t('searchOrder.infilm') }}</el-tag>
           </template>
           </el-table-column>
-          <el-table-column fixed="right" label="缁撴潫浠诲姟" align="center" width="150">
+          <el-table-column prop="id" align="center" :label="$t('searchOrder.tabid')" min-width="150"/>
+          <el-table-column prop="deviceId" align="center" :label="$t('searchOrder.tid')" min-width="100"/>
+          <el-table-column prop="slot" align="center" :label="$t('searchOrder.gridnumber')" min-width="100"/>
+          <el-table-column prop="glassId" align="center" :label="$t('searchOrder.glassID')" min-width="100"/>
+          <el-table-column prop="sequence" align="center" :label="$t('searchOrder.pieceingrid')" min-width="150"/>
+          <el-table-column prop="flowCardId" align="center" :label="$t('searchOrder.cardnumber')" min-width="100"/>
+          <el-table-column prop="glassType" align="center" :label="$t('searchOrder.typeglass')" min-width="100"/>
+          <el-table-column prop="width" align="center" :label="$t('searchOrder.width')" min-width="100"/>
+          <el-table-column prop="height" align="center" :label="$t('searchOrder.height')" min-width="100"/>
+          <el-table-column prop="thickness" align="center" :label="$t('searchOrder.thickness')" min-width="100"/>
+          <el-table-column prop="temperingLayoutId" align="center" :label="$t('searchOrder.layoutID')" min-width="100"/>
+          <el-table-column prop="temperingFeedSequence" align="center" :label="$t('searchOrder.picturesequence')" min-width="120"/>
+          <el-table-column prop="gap" align="center" :label="$t('searchOrder.glassgaps')" min-width="100"/>
+          <el-table-column fixed="right" :label="$t('searchOrder.endtask')" align="center" width="150">
             <template #default="scope">
-              <el-button size="mini" type="text" plain @click="handleBindRack(scope.row)">瀹屾垚浠诲姟</el-button>
+              <el-button size="mini" type="text" plain @click="finish(scope.row)">{{ $t('searchOrder.completetask') }}</el-button>
             </template>
         </el-table-column>
         </el-table>
@@ -378,18 +667,31 @@
         <el-table height="100%" ref="table" 
         @selection-change="handleSelectionChange"
         :data="tableDatad" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
-          <el-table-column prop="bigStorageCageFeedTask.glassId" align="center" label="杩涚墖鐜荤拑ID" min-width="80" />
-          <el-table-column prop="bigStorageCageFeedTask.targetSlot" align="center" label="鐩爣浣嶇疆" min-width="120" />
+          <el-table-column prop="bigStorageCageFeedTask.glassId" align="center" :label="$t('searchOrder.intoglassid')" min-width="100" />
+          <el-table-column prop="bigStorageCageFeedTask.targetSlot" align="center" :label="$t('searchOrder.targetlocation')" min-width="120" />
           <!-- <el-table-column prop="task_type" align="center" label="浠诲姟绫诲瀷" min-width="120" />娌℃湁杩斿洖瀛楁 -->
-          <el-table-column prop="bigStorageCageFeedTask.taskState" align="center" label="浠诲姟鐘舵��" min-width="120">
+          <el-table-column prop="bigStorageCageFeedTask.taskState" align="center" :label="$t('searchOrder.taskstatus')" min-width="120">
           <template #default="scope">
-            <el-tag type="success" >{{ scope.row.bigStorageCageFeedTask.taskState==0?"绛夊緟杩涚墖":"杩涜涓�"  }}</el-tag>
+            <el-tag type="success" >{{ scope.row.bigStorageCageFeedTask.taskState==0? $t('searchOrder.filmenter') : $t('searchOrder.infilm') }}</el-tag>
           </template>
           </el-table-column>
-          <el-table-column prop="bigStorageCageFeedTask.line" align="center" label="绾胯矾" min-width="120" />
-          <el-table-column fixed="right" label="缁撴潫浠诲姟" align="center" width="150">
+          <el-table-column prop="bigStorageCageFeedTask.line" align="center" :label="$t('searchOrder.line')" min-width="120" />
+          <el-table-column prop="id" align="center" :label="$t('searchOrder.tabid')" min-width="150"/>
+          <el-table-column prop="deviceId" align="center" :label="$t('searchOrder.tid')" min-width="100"/>
+          <el-table-column prop="slot" align="center" :label="$t('searchOrder.gridnumber')" min-width="100"/>
+          <el-table-column prop="glassId" align="center" :label="$t('searchOrder.glassID')" min-width="100"/>
+          <el-table-column prop="sequence" align="center" :label="$t('searchOrder.pieceingrid')" min-width="150"/>
+          <el-table-column prop="flowCardId" align="center" :label="$t('searchOrder.cardnumber')" min-width="100"/>
+          <el-table-column prop="glassType" align="center" :label="$t('searchOrder.typeglass')" min-width="100"/>
+          <el-table-column prop="width" align="center" :label="$t('searchOrder.width')" min-width="100"/>
+          <el-table-column prop="height" align="center" :label="$t('searchOrder.height')" min-width="100"/>
+          <el-table-column prop="thickness" align="center" :label="$t('searchOrder.thickness')" min-width="100"/>
+          <el-table-column prop="temperingLayoutId" align="center" :label="$t('searchOrder.layoutID')" min-width="100"/>
+          <el-table-column prop="temperingFeedSequence" align="center" :label="$t('searchOrder.picturesequence')" min-width="120"/>
+          <el-table-column prop="gap" align="center" :label="$t('searchOrder.glassgaps')" min-width="100"/>
+          <el-table-column fixed="right" :label="$t('searchOrder.endtask')" align="center" width="150">
             <template #default="scope">
-              <el-button size="mini" type="text" plain @click="handleBindRack(scope.row)">瀹屾垚浠诲姟</el-button>
+              <el-button size="mini" type="text" plain @click="finish(scope.row)">{{ $t('searchOrder.completetask') }}</el-button>
             </template>
         </el-table-column>
         </el-table>
@@ -399,11 +701,11 @@
             <div v-for="(item, index) in tableDatae" :key="index" id="occupy">  
                <el-col style="text-align:left;font-weight: bold;">#{{ item.device_id }}</el-col>  
                <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;">  
-                 <span>浣跨敤鐜�</span><span>{{ item.percentage }}</span>  
+                 <span>{{ $t('searchOrder.Usage') }}</span><span>{{ item.percentage }}</span>  
                </el-col>  
                <hr style="width:80%;margin: 0 auto;" />  
                <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;">  
-                 <span>绌洪棽锛堟牸瀛愭暟锛�</span><span>{{ item.count }}</span>  
+                 <span>{{ $t('searchOrder.free') }}</span><span>{{ item.count }}</span>  
                </el-col>  
              </div>  
     </div>
@@ -425,33 +727,39 @@
     <div class="img-car4" :style="'z-index:999;left:704px;top:' + carposition4 + 'px;position:absolute;'">
       <div v-show="cellshow4" style="margin-top:10px;width:200px;height:5px;background-color:#409EFF;"></div>
     </div>
-    <div v-show="cell1" style="width: 227px;height: 29px;position: absolute;top:55px;left: 465px;">
+    <div v-show="cell1" style="width: 227px;position: relative;height: 29px;top:55px;left: 465px;background-color: #911005;">
       <div  
-      v-for="(item, index) in adjustedRects"  
-      :key="index"  
+      v-for="(rect, index) in adjustedRects"  
+      :key="rect"  
       :style="{
-       top: `1px`, width: `227px`,
-      backgroundColor: '#409EFF',
-      height: `height`+ `px`
+       position: 'absolute',
+       width: '227px',
+       height: '0.8px',
+       backgroundColor: '#409EFF',
+       left: '0px',
+       top: `${rect.top}px`,
        }"  
     >
+   
     </div>
-      <!-- <div   
-        v-for="(item, index) in adjustedRects" 
-        height: `${rect.height}px`,  
-        :key="index"   
-        :style="{  
-        width: '227px',  
-        height: '1px',
-        backgroundColor: '#409EFF',  
-        top: '1px'
-      }"  
-      >  
-      </div> -->
     </div>
-   <!-- <div v-show="cell2" style="width: 227px;height: 29px;position: absolute;top:86px;left: 465px;background-color: #409EFF;">
+ <div v-show="cell2" style="width: 227px;height: 29px;position: relative;top:86px;left: 465px;background-color: #911005;">
+  <div  
+      v-for="(rect, index) in adjustedRectsa"  
+      :key="rect"  
+      :style="{
+       position: 'absolute',
+       width: '227px',
+       height: '0.8px',
+       backgroundColor: '#409EFF',
+       left: '0px',
+       top: `${rect.top}px`,
+       }"  
+    >
+   
     </div>
-     <div v-show="cell3" style="width: 227px;height: 29px;position: absolute;top:117px;left: 465px;background-color: #409EFF;">
+    </div>
+      <!--  <div v-show="cell3" style="width: 227px;height: 29px;position: absolute;top:117px;left: 465px;background-color: #409EFF;">
     </div>
   <div v-show="cell4" style="width: 227px;height: 29px;position: absolute;top:148px;left: 465px;background-color: #409EFF;">
     </div>
@@ -465,24 +773,33 @@
     </div> -->
 </div>
   </div>
-  <el-dialog v-model="add" top="20vh" width="60%" title="娣诲姞鐞嗙墖绗间俊鎭�" >
+  <el-dialog v-model="add" top="10vh" width="65%" :title="$t('searchOrder.addcage')" >
+      <div style="margin-top: -20px;margin-bottom: 40px;margin-left: 30px">
+          <el-input :placeholder="$t('searchOrder.inputid')" clearable style="width: 200px;">
+          </el-input>
+          <el-button type="primary" plain style="margin-left: 10px;">{{ $t('searchOrder.search') }}</el-button>
+        
+        <!-- <span style="margin-right: 10px">绂佺敤璇�</span>
+        <el-input clearable placeholder="璇疯緭鍏ョ鐢ㄨ瘝" size="mini" 
+          style="margin-right: 50px; width: 200px;" /> -->
+        </div>
     <div style="margin-left: -50px;margin-top: 10px;margin-bottom: 10px;">
-            <el-form  size="mini" label-width="150px">
-      <el-form label-width="150px" label-position="right">
+            <el-form  size="mini" label-width="180px">
+      <el-form label-width="180px" 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="鐜荤拑ID锛�" :required="true" style="width: 20vw;">
-                <el-input placeholder="璇疯緭鍏ョ幓鐠僆D" v-model="glassId" autocomplete="off" />
+          <el-form-item :label="$t('searchOrder.glassIDa')" :required="true" style="width: 24vw;">
+                <el-input :placeholder="$t('searchOrder.inglassID')" v-model="glassId" autocomplete="off" />
               </el-form-item>
               </div></div>
           </el-col>
           <el-col :span="9">
             <div id="dta" style="font-size: 15px;">
         <div>
-          <el-form-item label="灏忕墖鍦ㄦ牸鍐呯殑椤哄簭锛�" :required="true" style="width: 20vw;">
-                <el-input placeholder="璇疯緭鍏ュ皬鐗囧湪鏍煎唴鐨勯『搴�" v-model="sequence" autocomplete="off" />
+          <el-form-item :label="$t('searchOrder.pieceingrida')" :required="true" style="width: 24vw;">
+                <el-input :placeholder="$t('searchOrder.inpieceingrid')" v-model="sequence" autocomplete="off" />
               </el-form-item></div>
               </div>
           </el-col>
@@ -491,15 +808,15 @@
           <el-col :span="6">
               <div id="dt" style="font-size: 15px;">
         <div>
-          <el-form-item label="娴佺▼鍗″彿锛�" :required="true" style="width: 20vw;">
-                <el-input placeholder="璇疯緭鍏ユ祦绋嬪崱鍙�" v-model="flowCardId" autocomplete="off" />
+          <el-form-item :label="$t('searchOrder.cardnumbera')" :required="true" style="width: 24vw;">
+                <el-input :placeholder="$t('searchOrder.incardnumber')" v-model="flowCardId" autocomplete="off" />
               </el-form-item></div></div>
           </el-col>
           <el-col :span="9">
             <div id="dta" style="font-size: 15px;">
         <div>
-          <el-form-item label="鐜荤拑绫诲瀷锛�" :required="true" style="width: 20vw;">
-                <el-input placeholder="璇疯緭鍏ョ幓鐠冪被鍨�" v-model="glassType" autocomplete="off" />
+          <el-form-item :label="$t('searchOrder.typeglassa')" :required="true" style="width: 24vw;">
+                <el-input :placeholder="$t('searchOrder.intypeglass')" v-model="glassType" autocomplete="off" />
               </el-form-item></div></div>
           </el-col>
         </el-row>
@@ -507,15 +824,15 @@
           <el-col :span="6">
               <div id="dt" style="font-size: 15px;">
         <div>
-          <el-form-item label="瀹斤細" :required="true" style="width: 20vw;">
-                <el-input placeholder="璇疯緭鍏ュ" v-model="width" autocomplete="off" />
+          <el-form-item :label="$t('searchOrder.widtha')" :required="true" style="width: 24vw;">
+                <el-input :placeholder="$t('searchOrder.inwidth')" v-model="width" autocomplete="off" />
               </el-form-item></div></div>
           </el-col>
           <el-col :span="9">
             <div id="dta" style="font-size: 15px;">
         <div>
-          <el-form-item label="楂橈細" :required="true" style="width: 20vw;">
-                <el-input placeholder="璇疯緭鍏ラ珮" v-model="height" autocomplete="off" />
+          <el-form-item :label="$t('searchOrder.heighta')" :required="true" style="width: 24vw;">
+                <el-input :placeholder="$t('searchOrder.inheight')" v-model="height" autocomplete="off" />
               </el-form-item></div></div>
           </el-col>
         </el-row>
@@ -523,15 +840,15 @@
           <el-col :span="6">
               <div id="dt" style="font-size: 15px;">
         <div>
-          <el-form-item label="鍘氬害锛�" :required="true" style="width: 20vw;">
-                <el-input placeholder="璇疯緭鍏ュ帤搴�" v-model="thickness" autocomplete="off" />
+          <el-form-item :label="$t('searchOrder.thicknessa')" :required="true" style="width: 24vw;">
+                <el-input :placeholder="$t('searchOrder.inthickness')" v-model="thickness" autocomplete="off" />
               </el-form-item></div></div>
           </el-col>
           <el-col :span="9">
             <div id="dta" style="font-size: 15px;">
         <div>
-          <el-form-item label="閽㈠寲鐗堝浘ID锛�" :required="true" style="width: 20vw;">
-                <el-input placeholder="璇疯緭鍏ラ挗鍖栫増鍥綢D" v-model="temperingLayoutId" autocomplete="off" />
+          <el-form-item :label="$t('searchOrder.layoutIDa')" :required="true" style="width: 24vw;">
+                <el-input :placeholder="$t('searchOrder.inlayoutID')" v-model="temperingLayoutId" autocomplete="off" />
               </el-form-item></div></div>
           </el-col>
         </el-row>
@@ -539,15 +856,15 @@
           <el-col :span="6">
               <div id="dt" style="font-size: 15px;">
         <div>
-          <el-form-item label="閽㈠寲鐗堝浘鐗囧簭锛�" :required="true" style="width: 20vw;">
-                <el-input placeholder="璇疯緭鍏ラ挗鍖栫増鍥剧墖搴�" v-model="temperingFeedSequence" autocomplete="off" />
+          <el-form-item :label="$t('searchOrder.picturesequencea')" :required="true" style="width: 24vw;">
+                <el-input :placeholder="$t('searchOrder.inpicturesequence')" v-model="temperingFeedSequence" autocomplete="off" />
               </el-form-item></div></div>
           </el-col>
           <el-col :span="9">
             <div id="dta" style="font-size: 15px;">
         <div>
-          <el-form-item label="鍚敤鐘舵�侊細" :required="true" style="width: 20vw;">
-                <el-input placeholder="璇疯緭鍏ュ惎鐢ㄧ姸鎬�" v-model="state" autocomplete="off" />
+          <el-form-item :label="$t('searchOrder.startstatusa')" :required="true" style="width: 24vw;">
+                <el-input :placeholder="$t('searchOrder.instartstatus')" v-model="state" autocomplete="off" />
               </el-form-item></div></div>
           </el-col>
         </el-row>
@@ -555,8 +872,15 @@
           <el-col :span="6">
               <div id="dt" style="font-size: 15px;">
         <div>
-          <el-form-item label="鐜荤拑闂撮殭锛�" :required="true" style="width: 20vw;">
-                <el-input placeholder="璇疯緭鍏ョ幓鐠冮棿闅�" v-model="gap" autocomplete="off" />
+          <el-form-item :label="$t('searchOrder.glassgapsa')" :required="true" style="width: 24vw;">
+                <el-input :placeholder="$t('searchOrder.inglassgaps')" v-model="gap" autocomplete="off" />
+              </el-form-item></div></div>
+          </el-col>
+          <el-col :span="9">
+            <div id="dta" style="font-size: 15px;">
+        <div>
+          <el-form-item :label="$t('searchOrder.gridnumbera')" :required="true" style="width: 24vw;">
+                <el-input :placeholder="$t('searchOrder.grid')" v-model="state" autocomplete="off" />
               </el-form-item></div></div>
           </el-col>
         </el-row>
@@ -566,16 +890,17 @@
     <template #footer>
       <div id="dialog-footer">
         <el-button type="primary" @click="handleConfirm">
-          纭
+          {{ $t('searchOrder.sure') }}
         </el-button>
-        <el-button @click="add = false">鍙栨秷</el-button>
+        <el-button @click="add = false">{{ $t('searchOrder.cancel') }}</el-button>
       </div>
     </template>
   </el-dialog>
-<el-dialog v-model="dialogFormVisiblea" top="5vh" width="90%" title="鐞嗙墖绗间俊鎭�" >
+<el-dialog v-model="dialogFormVisiblea" top="5vh" width="97%" :title="$t('searchOrder.cageinformation')">
     <el-table  
           :data="tableData" 
-          height="600"
+          @row-click="handleRowClick" 
+          height="500"
           @expand-change="handleExpandChange"  
           row-key="id" 
           default-expand-all
@@ -592,18 +917,18 @@
                   :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}" 
                 >  
           <!-- <el-table-column prop="menuName" label="浜岀骇鑿滃崟鏍�" align="center" min-width="140" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"/>   -->
-          <el-table-column prop="glassId" label="鐜荤拑ID" align="center" min-width="100"/>  
-          <el-table-column prop="sequence" align="center" label="灏忕墖鍦ㄦ牸鍐呯殑椤哄簭" min-width="120" />
-          <el-table-column prop="flowCardId" align="center" label="娴佺▼鍗″彿" min-width="120" />
-          <el-table-column prop="glassType" align="center" label="鐜荤拑绫诲瀷" min-width="100" />
-          <el-table-column prop="width" align="center" label="瀹�" min-width="80" />
-          <el-table-column prop="height" align="center" label="楂�" min-width="80" />
-          <el-table-column prop="thickness" align="center" label="鍘氬害" min-width="80" />
-          <el-table-column prop="temperingLayoutId" align="center" label="閽㈠寲鐗堝浘ID" min-width="100" />
-          <el-table-column prop="temperingFeedSequence" align="center" label="閽㈠寲鐗堝浘鐗囧簭" min-width="120" />
+          <el-table-column prop="glassId" :label="$t('searchOrder.glassID')" align="center" min-width="80"/>  
+          <el-table-column prop="sequence" align="center" :label="$t('searchOrder.pieceingrid')" min-width="100" />
+          <el-table-column prop="flowCardId" align="center" :label="$t('searchOrder.cardnumber')" min-width="120" />
+          <el-table-column prop="glassType" align="center" :label="$t('searchOrder.typeglass')" min-width="80" />
+          <el-table-column prop="width" align="center" :label="$t('searchOrder.width')" min-width="80" />
+          <el-table-column prop="height" align="center" :label="$t('searchOrder.height')" min-width="80" />
+          <el-table-column prop="thickness" align="center" :label="$t('searchOrder.thickness')" min-width="80" />
+          <el-table-column prop="temperingLayoutId" align="center" :label="$t('searchOrder.layoutID')" min-width="100" />
+          <el-table-column prop="temperingFeedSequence" align="center" :label="$t('searchOrder.picturesequence')" min-width="120" />
           <el-table-column
             align="center"
-            label="鍚敤鐘舵��"
+            :label="$t('searchOrder.startstatus')"
             min-width="80"
             prop="state"
           >
@@ -613,24 +938,25 @@
         </el-tag>  
       </template> 
           </el-table-column>
-          <el-table-column prop="gap" align="center" label="鐜荤拑闂撮殭" min-width="80" />
-           <el-table-column fixed="right" label="鎿嶄綔" align="center"  min-width="180">
+          <el-table-column prop="gap" align="center" :label="$t('searchOrder.glassgaps')" min-width="80" />
+           <el-table-column fixed="right" :label="$t('searchOrder.operate')" align="center"  min-width="220">
             <template #default="scope">
-              <el-button size="mini" type="text" plain @click="handleEdit(scope.row)">鐮存崯</el-button>
-              <el-button size="mini" type="text" plain @click="opena(scope.row)">鍒犻櫎</el-button>
-              <el-button size="mini" type="text" plain @click="opena(scope.row)">鍑虹墖</el-button>
+              <el-button size="mini" type="text" plain @click="broke(scope.row)">{{ $t('searchOrder.breakage') }}</el-button>
+              <el-button size="mini" type="text" plain @click="brokec(scope.row)">{{ $t('searchOrder.takeout') }}</el-button>
+              <el-button size="mini" type="text" plain @click="opena(scope.row)">{{ $t('searchOrder.delete') }}</el-button>
+              <el-button size="mini" type="text" plain @click="outfil(scope.row)">{{ $t('searchOrder.outfilm') }}</el-button>
             </template>
         </el-table-column>
                 </el-table>  
               </div>  
             </template>  
           </el-table-column>  
-          <el-table-column prop="id" label="澶х悊鐗囩琛↖D" align="center" min-width="100"/>  
-          <el-table-column prop="deviceId" align="center" label="鐞嗙墖绗煎彿" min-width="150" />
-          <el-table-column prop="slot" align="center" label="鏍呮牸鍙�" min-width="150" />
+          <el-table-column prop="id" :label="$t('searchOrder.cagetableID')" align="center" min-width="100"/>  
+          <el-table-column prop="deviceId" align="center" :label="$t('searchOrder.cagenumber')" min-width="150" />
+          <el-table-column prop="slot" align="center" :label="$t('searchOrder.gridnumber')" min-width="150" />
           <el-table-column
           align="center"
-            label="鍚敤鐘舵��"
+            :label="$t('searchOrder.startstatus')"
             min-width="80"
             prop="enableState"
           >
@@ -639,15 +965,15 @@
             :type="scope.row.enableState === 1 ? 'success' : 'danger'"  
             @click="toggleEnableState(scope.row)"  
           >  
-            {{ scope.row.enableState === 1 ? '鍚敤' : '绂佺敤' }}  
+            {{ scope.row.enableState === 1 ? $t('searchOrder.enable') : $t('searchOrder.disable')}}  
           </el-tag>  
         </template> 
           </el-table-column>
-          <el-table-column prop="remainWidth" align="center" label="鍓╀綑瀹藉害" min-width="120" />
+          <el-table-column prop="remainWidth" align="center" :label="$t('searchOrder.remainingwidth')" min-width="120" />
           
-       <el-table-column fixed="right" label="鎿嶄綔" align="center">
+       <el-table-column fixed="right" :label="$t('searchOrder.operate')" align="center">
             <template #default="scope">
-              <el-button size="mini" type="text" plain  @click="handleBindRack(scope.row)">娣诲姞</el-button>
+              <el-button size="mini" type="text" plain  @click="handleBindRack(scope.row)">{{ $t('searchOrder.add') }}</el-button>
             </template>
         </el-table-column>
         </el-table>
@@ -667,7 +993,7 @@
     />
   </div>
 </el-dialog>
-<el-dialog v-model="dialogFormVisibleb" top="10vh" width="85%" title="鍑虹墖闃熷垪" >
+<el-dialog v-model="dialogFormVisibleb" top="5vh" width="85%" :title="$t('searchOrder.productionqueue')">
   <!-- <div style="display: flex;">
   <p style="margin-top: 3px;">闃熷垪鐘舵�侊細</p>
   <p style="margin-top: 3px;">寮�濮�</p>
@@ -676,16 +1002,16 @@
   </div> -->
     <el-table  ref="table" style="margin-top: 20px;height: 500px;"
         :data="tableDatab" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
-          <el-table-column prop="id" fixed align="center" label="閽㈠寲灏忕墖淇℃伅琛╥d" min-width="150"/>
-          <el-table-column prop="flowcardId" fixed align="center" label="娴佺▼鍗�" min-width="120" />
-          <el-table-column prop="glassType" align="center" label="娴佺▼鍗$幓鐠冪被鍨�" min-width="150" />
-          <el-table-column prop="width" align="center" label="瀹�" min-width="80" />
-          <el-table-column prop="height" align="center" label="楂�" min-width="80" />
-          <el-table-column prop="thickness" align="center" label="鍘氬害" min-width="80" />
-          <el-table-column prop="filmsid" align="center" label="鑶滅郴" min-width="80" />
+          <el-table-column prop="id" fixed align="center" :label="$t('searchOrder.sheetID')" min-width="150"/>
+          <el-table-column prop="flowcardId" fixed align="center" :label="$t('searchOrder.processcards')" min-width="120" />
+          <el-table-column prop="glassType" align="center" :label="$t('searchOrder.processcardtype')" min-width="150" />
+          <el-table-column prop="width" align="center" :label="$t('searchOrder.width')"  min-width="80" />
+          <el-table-column prop="height" align="center" :label="$t('searchOrder.height')" min-width="80" />
+          <el-table-column prop="thickness" align="center" :label="$t('searchOrder.thickness')" min-width="80" />
+          <el-table-column prop="filmsid" align="center" :label="$t('searchOrder.coatingtypes')" min-width="80" />
           <el-table-column
             align="center"
-            label="閽㈠寲鏄惁鎺ュ彈妯斁"
+            :label="$t('searchOrder.acceptshorizontal')"
             min-width="150"
             prop="ishorizontal"
           >
@@ -695,14 +1021,14 @@
         </el-tag>  
       </template> 
           </el-table-column>
-          <el-table-column prop="temperingLayoutId" align="center" label="閽㈠寲鐗堝浘id" min-width="120" />
-          <el-table-column prop="temperingFeedSequence" align="center" label="閽㈠寲鐗堝浘鐗囧簭" min-width="120" />
-          <el-table-column prop="xCoordinate" align="center" label="x鍧愭爣" min-width="80" />
-          <el-table-column prop="yCoordinate" align="center" label="y鍧愭爣" min-width="80" />
-          <el-table-column prop="angle" align="center" label="鏃嬭浆瑙掑害锛堥�嗘椂閽堬級" min-width="150" />
+          <el-table-column prop="temperingLayoutId" align="center" :label="$t('searchOrder.layoutID')" min-width="120" />
+          <el-table-column prop="temperingFeedSequence" align="center" :label="$t('searchOrder.picturesequence')" min-width="120" />
+          <el-table-column prop="xCoordinate" align="center" :label="$t('searchOrder.xcoordinates')" min-width="80" />
+          <el-table-column prop="yCoordinate" align="center" :label="$t('searchOrder.ycoordinates')" min-width="80" />
+          <el-table-column prop="angle" align="center" :label="$t('searchOrder.rotationangle')" min-width="150" />
           <el-table-column
             align="center"
-            label="鐘舵��"
+            :label="$t('searchOrder.state')"
             min-width="80"
             prop="state"
           >
@@ -712,10 +1038,11 @@
         </el-tag>  
       </template> 
           </el-table-column>
-          <el-table-column fixed="right" label="鎿嶄綔" align="center" width="150">
+          <el-table-column fixed="right" :label="$t('searchOrder.operate')" align="center" width="150">
             <template #default="scope">
-              <el-button size="mini" type="text" plain @click="handleBindRack(scope.row)">鐮存崯</el-button>
-              <el-button size="mini" type="text" plain @click="handleBindRacka(scope.row)">鍒犻櫎</el-button>
+              <el-button size="mini" type="text" plain @click="brokea(scope.row)">{{ $t('searchOrder.breakage') }}</el-button>
+              <el-button size="mini" type="text" plain @click="brokeb(scope.row)">{{ $t('searchOrder.takeout') }}</el-button>
+              <el-button size="mini" type="text" plain @click="deletea(scope.row)">{{ $t('searchOrder.delete') }}</el-button>
             </template>
         </el-table-column>
         </el-table>
@@ -822,7 +1149,7 @@
 }
  
 .img-dlpl{
-  margin-left: 200px;
+  margin-left: 80px;
   background-image:url('../../assets/dlpl.png');
   background-repeat: no-repeat;
     background-attachment: local;
diff --git a/UI-Project/src/views/StockBasicData/stockBasicData.vue b/UI-Project/src/views/StockBasicData/stockBasicData.vue
index 01b0ddb..d20f65a 100644
--- a/UI-Project/src/views/StockBasicData/stockBasicData.vue
+++ b/UI-Project/src/views/StockBasicData/stockBasicData.vue
@@ -11,6 +11,9 @@
 // import { ref } from 'vue'
 import { ElMessage, ElMessageBox } from 'element-plus'
 //  import LanguageMixin from './lang/LanguageMixin'
+  import { useI18n } from 'vue-i18n'
+  const { t } = useI18n()
+  let language = ref(localStorage.getItem('lang') || 'zh')
 
 const tableData = ref([])
 const slot = ref('')
@@ -32,17 +35,17 @@
           }
           });
 // 鐮存崯
- const open = async(row) => {  
-  try {  
+ const open = async(row) => { 
+  try {
     const confirmResult = await ElMessageBox.confirm(  
-      '鏄惁鐮存崯璇ユ潯淇℃伅?',  
-      '鎻愮ず',  
+      t('workOrder.messagedamaged'), 
+      t('workOrder.prompt'),  
       {  
-        confirmButtonText: '鏄�',  
-        cancelButtonText: '鍙栨秷',  
+        confirmButtonText: t('workOrder.yes'), 
+        cancelButtonText: t('workOrder.cancel'),
         type: 'warning',  
-      }  
-    );  
+      } 
+    );
     if (confirmResult === 'confirm') {  
       // 鐢ㄦ埛鐐瑰嚮浜嗏�滄槸鈥濓紝鐜板湪璋冪敤鍒犻櫎鎺ュ彛  
       const response = await request.post("/cacheGlass/edgStorageCage/edgReportStatus", {
@@ -64,16 +67,16 @@
 };  
 // 鎷胯蛋 
  const opena = async(row) => {  
-  try {  
+  try {
     const confirmResult = await ElMessageBox.confirm(  
-      '鏄惁鎷胯蛋璇ユ潯淇℃伅?',  
-      '鎻愮ず',  
+      t('workOrder.takemessage'), 
+      t('workOrder.prompt'),  
       {  
-        confirmButtonText: '鏄�',  
-        cancelButtonText: '鍙栨秷',  
+        confirmButtonText: t('workOrder.yes'), 
+        cancelButtonText: t('workOrder.cancel'),
         type: 'warning',  
-      }  
-    );  
+      } 
+    );
     if (confirmResult === 'confirm') {  
       // 鐢ㄦ埛鐐瑰嚮浜嗏�滄槸鈥濓紝鐜板湪璋冪敤鍒犻櫎鎺ュ彛  
       const response = await request.post("/cacheGlass/edgStorageCage/edgReportStatus", {
@@ -120,17 +123,17 @@
         <el-table height="240" ref="table" 
         @selection-change="handleSelectionChange"
         :data="tableData" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
-          <el-table-column prop="GlassId" align="center" label="鐜荤拑id" min-width="180" />
-          <el-table-column prop="Height" align="center" label="楂�" min-width="80" />
-          <el-table-column prop="Width" align="center" label="瀹�" min-width="120" />
-          <el-table-column prop="Thickness" align="center" label="鍘氬害" min-width="120" />
-          <el-table-column prop="FilmsId" align="center" label="鑶滅郴" min-width="120" />
-          <el-table-column prop="SerialNumber" align="center" label="鍑虹墖椤哄簭" min-width="120" />
-          <el-table-column prop="FlowCardId" align="center" label="娴佺▼鍗″彿" min-width="120" />
-          <el-table-column fixed="right" label="鎿嶄綔" align="center" width="200">
+          <el-table-column prop="GlassId" align="center" :label="$t('workOrder.glassID')" min-width="180" />
+          <el-table-column prop="Height" align="center" :label="$t('workOrder.height')" min-width="80" />
+          <el-table-column prop="Width" align="center" :label="$t('workOrder.width')" min-width="120" />
+          <el-table-column prop="Thickness" align="center" :label="$t('workOrder.thickness')" min-width="120" />
+          <el-table-column prop="FilmsId" align="center" :label="$t('workOrder.coatingtypes')" min-width="120" />
+          <el-table-column prop="SerialNumber" align="center" :label="$t('workOrder.productionsequence')" min-width="120" />
+          <el-table-column prop="FlowCardId" align="center" :label="$t('workOrder.cardnumber')" min-width="120" />
+          <el-table-column fixed="right" :label="$t('workOrder.operate')" align="center" width="200">
             <template #default="scope">
-              <el-button size="mini" type="text" plain @click="open(scope.row)">鐮存崯</el-button>
-              <el-button size="mini" type="text" plain @click="opena(scope.row)">鎷胯蛋</el-button>
+              <el-button size="mini" type="text" plain @click="open(scope.row)">{{ $t('workOrder.breakage') }}</el-button>
+              <el-button size="mini" type="text" plain @click="opena(scope.row)">{{ $t('workOrder.takeout') }}</el-button>
             </template>
         </el-table-column>
         </el-table>
diff --git a/UI-Project/src/views/StockBasicData/stockBasicDatatwo.vue b/UI-Project/src/views/StockBasicData/stockBasicDatatwo.vue
index 6d4df18..583b2ba 100644
--- a/UI-Project/src/views/StockBasicData/stockBasicDatatwo.vue
+++ b/UI-Project/src/views/StockBasicData/stockBasicDatatwo.vue
@@ -11,6 +11,9 @@
 // import { ref } from 'vue'
 import { ElMessage, ElMessageBox } from 'element-plus'
 //  import LanguageMixin from './lang/LanguageMixin'
+  import { useI18n } from 'vue-i18n'
+  const { t } = useI18n()
+  let language = ref(localStorage.getItem('lang') || 'zh')
 
 const tableData = ref([])
 const slot = ref('')
@@ -33,16 +36,16 @@
           });
 // 鐮存崯
  const open = async(row) => {  
-  try {  
+  try {
     const confirmResult = await ElMessageBox.confirm(  
-      '鏄惁鐮存崯璇ユ潯淇℃伅?',  
-      '鎻愮ず',  
+      t('workOrder.messagedamaged'), 
+      t('workOrder.prompt'),  
       {  
-        confirmButtonText: '鏄�',  
-        cancelButtonText: '鍙栨秷',  
+        confirmButtonText: t('workOrder.yes'), 
+        cancelButtonText: t('workOrder.cancel'),
         type: 'warning',  
-      }  
-    );  
+      } 
+    );
     if (confirmResult === 'confirm') {  
       // 鐢ㄦ埛鐐瑰嚮浜嗏�滄槸鈥濓紝鐜板湪璋冪敤鍒犻櫎鎺ュ彛  
       const response = await request.post("/cacheGlass/edgStorageCage/edgReportStatus", {
@@ -64,16 +67,16 @@
 };  
 // 鎷胯蛋 
  const opena = async(row) => {  
-  try {  
+  try {
     const confirmResult = await ElMessageBox.confirm(  
-      '鏄惁鎷胯蛋璇ユ潯淇℃伅?',  
-      '鎻愮ず',  
+      t('workOrder.takemessage'), 
+      t('workOrder.prompt'),  
       {  
-        confirmButtonText: '鏄�',  
-        cancelButtonText: '鍙栨秷',  
+        confirmButtonText: t('workOrder.yes'), 
+        cancelButtonText: t('workOrder.cancel'),
         type: 'warning',  
-      }  
-    );  
+      } 
+    );
     if (confirmResult === 'confirm') {  
       // 鐢ㄦ埛鐐瑰嚮浜嗏�滄槸鈥濓紝鐜板湪璋冪敤鍒犻櫎鎺ュ彛  
       const response = await request.post("/cacheGlass/edgStorageCage/edgReportStatus", {
@@ -121,17 +124,17 @@
         <el-table height="240" ref="table" 
         @selection-change="handleSelectionChange"
         :data="tableData" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
-          <el-table-column prop="GlassId" align="center" label="鐜荤拑id" min-width="180" />
-          <el-table-column prop="Height" align="center" label="楂�" min-width="80" />
-          <el-table-column prop="Width" align="center" label="瀹�" min-width="120" />
-          <el-table-column prop="Thickness" align="center" label="鍘氬害" min-width="120" />
-          <el-table-column prop="FilmsId" align="center" label="鑶滅郴" min-width="120" />
-          <el-table-column prop="SerialNumber" align="center" label="鍑虹墖椤哄簭" min-width="120" />
-          <el-table-column prop="FlowCardId" align="center" label="娴佺▼鍗″彿" min-width="120" />
-          <el-table-column fixed="right" label="鎿嶄綔" align="center" width="200">
+          <el-table-column prop="GlassId" align="center" :label="$t('workOrder.glassID')" min-width="180" />
+          <el-table-column prop="Height" align="center" :label="$t('workOrder.height')" min-width="80" />
+          <el-table-column prop="Width" align="center" :label="$t('workOrder.width')" min-width="120" />
+          <el-table-column prop="Thickness" align="center" :label="$t('workOrder.thickness')" min-width="120" />
+          <el-table-column prop="FilmsId" align="center" :label="$t('workOrder.coatingtypes')" min-width="120" />
+          <el-table-column prop="SerialNumber" align="center" :label="$t('workOrder.productionsequence')" min-width="120" />
+          <el-table-column prop="FlowCardId" align="center" :label="$t('workOrder.cardnumber')" min-width="120" />
+          <el-table-column fixed="right" :label="$t('workOrder.operate')" align="center" width="200">
             <template #default="scope">
-              <el-button size="mini" type="text" plain @click="open(scope.row)">鐮存崯</el-button>
-              <el-button size="mini" type="text" plain @click="opena(scope.row)">鎷胯蛋</el-button>
+              <el-button size="mini" type="text" plain @click="open(scope.row)">{{ $t('workOrder.breakage') }}</el-button>
+              <el-button size="mini" type="text" plain @click="opena(scope.row)">{{ $t('workOrder.takeout') }}</el-button>
             </template>
         </el-table-column>
         </el-table>
diff --git a/UI-Project/src/views/UnLoadGlass/Landingindication.vue b/UI-Project/src/views/UnLoadGlass/Landingindication.vue
index ffec81d..41a6a45 100644
--- a/UI-Project/src/views/UnLoadGlass/Landingindication.vue
+++ b/UI-Project/src/views/UnLoadGlass/Landingindication.vue
@@ -22,7 +22,7 @@
               :height="rack.item.height" 
               :fill="rack.item.fillColor"
             />
-            <text :x="rack.x + rack.width / 2" :y="rack.y - 10" text-anchor="middle">{{ index + 1 }}鍙峰伐浣�</text>
+            <text :x="rack.x + rack.width / 2" :y="rack.y - 10" text-anchor="middle">{{ index + 1 }}{{ $t('reportWork.workstation') }}</text>
             <text :x="rack.x + rack.width / 2" :y="rack.y + rack.height + 20" text-anchor="middle">{{ rack.item.content }}</text>
           </g>
         </g>
@@ -34,6 +34,9 @@
 <script  setup>
 import { ref, watchEffect ,onMounted} from 'vue';
 
+import { useI18n } from 'vue-i18n'
+  const { t } = useI18n()
+  let language = ref(localStorage.getItem('lang') || 'zh')
 import Swal from 'sweetalert2'
 import request from "@/utils/request";
 import { initializeWebSocket } from '@/utils/WebSocketService';
@@ -167,7 +170,8 @@
   tableContent += '</table>';
 
   Swal.fire({
-    title: '鐜荤拑淇℃伅',
+    // title: '鐜荤拑淇℃伅',
+    title: "$t('reportWork.glassinformation')",
     html: tableContent,
     customClass: {
       popup: 'format-pre'
@@ -196,7 +200,7 @@
 .glass-rack {
   margin-left: 20px;
   width: 500px;
-  margin-top: 10px;
+  margin-top: 5px;
 }
 .rack-rect:hover {
   cursor: pointer;
diff --git a/UI-Project/src/views/UnLoadGlass/Landingindicationtwo.vue b/UI-Project/src/views/UnLoadGlass/Landingindicationtwo.vue
index 4fc077c..c7fa71e 100644
--- a/UI-Project/src/views/UnLoadGlass/Landingindicationtwo.vue
+++ b/UI-Project/src/views/UnLoadGlass/Landingindicationtwo.vue
@@ -22,7 +22,7 @@
               :height="rack.item.height" 
               :fill="rack.item.fillColor"
             />
-            <text :x="rack.x + rack.width / 2" :y="rack.y - 10" text-anchor="middle">{{ index + 4 }}鍙峰伐浣�</text>
+            <text :x="rack.x + rack.width / 2" :y="rack.y - 10" text-anchor="middle">{{ index + 4 }}{{ $t('reportWork.workstation') }}</text>
             <text :x="rack.x + rack.width / 2" :y="rack.y + rack.height + 20" text-anchor="middle">{{ rack.item.content }}</text>
           </g>
         </g>
@@ -34,6 +34,9 @@
 <script setup>
 import { ref, watchEffect ,onMounted} from 'vue';
 
+import { useI18n } from 'vue-i18n'
+  const { t } = useI18n()
+  let language = ref(localStorage.getItem('lang') || 'zh')
 import Swal from 'sweetalert2'
 import request from "@/utils/request";
 import { initializeWebSocket } from '@/utils/WebSocketService';
@@ -164,7 +167,8 @@
   tableContent += '</table>';
 
   Swal.fire({
-    title: '鐜荤拑淇℃伅',
+    title: "$t('reportWork.glassinformation')",
+    // title: '鐜荤拑淇℃伅',
     html: tableContent,
     customClass: {
       popup: 'format-pre'
diff --git a/UI-Project/src/views/UnLoadGlass/loadmachinerack.vue b/UI-Project/src/views/UnLoadGlass/loadmachinerack.vue
index e1ea82d..b41ed1c 100644
--- a/UI-Project/src/views/UnLoadGlass/loadmachinerack.vue
+++ b/UI-Project/src/views/UnLoadGlass/loadmachinerack.vue
@@ -5,6 +5,9 @@
 import {useRouter} from "vue-router"
 const router = useRouter()
 
+import { useI18n } from 'vue-i18n'
+  const { t } = useI18n()
+  let language = ref(localStorage.getItem('lang') || 'zh')
 import { ref } from 'vue'
 import { ElMessage, ElMessageBox } from 'element-plus'
 import Landingindication from "./Landingindication.vue";
@@ -187,30 +190,27 @@
         <el-table height="100%" ref="table" 
         @selection-change="handleSelectionChange"
         :data="tableData" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
-          <el-table-column prop="workstationId" align="center" label="涓嬬墖浣�" min-width="80" />
-          <el-table-column prop="workstationId" align="center" label="鏋跺彿" min-width="120" />
-          <el-table-column prop="flowCardId" align="center" label="娴佺▼鍗″彿" min-width="120" />
-          <el-table-column prop="totalquantity" align="center" label="鎬绘暟閲�" min-width="120" />
-          <el-table-column prop="racksnumber" align="center" label="宸茶惤鏋舵暟閲�" min-width="120" />
-          <el-table-column prop="work_state" align="center" label="鐘舵��" min-width="120" />
-          <el-table-column prop="deviceId" align="center" label="璁惧鍙�" min-width="120" />
-         
-
-
+          <el-table-column prop="workstationId" align="center" :label="$t('reportWork.lowerbit')" min-width="80" />
+          <el-table-column prop="workstationId" align="center" :label="$t('reportWork.shelfnumber')" min-width="120" />
+          <el-table-column prop="flowCardId" align="center" :label="$t('reportWork.cardnumber')" min-width="120" />
+          <el-table-column prop="totalquantity" align="center" :label="$t('reportWork.totalquantity')" min-width="120" />
+          <el-table-column prop="racksnumber" align="center" :label="$t('reportWork.beendropped')" min-width="120" />
+          <el-table-column prop="work_state" align="center" :label="$t('reportWork.state')" min-width="120" />
+          <el-table-column prop="deviceId" align="center" :label="$t('reportWork.devicenumber')" min-width="120" />
           <el-table-column
             align="center"
-            label="鍚敤鐘舵��"
+            :label="$t('reportWork.startstatus')"
             min-width="80"
             prop="enableState"
           >
           <template #default="scope">
-            <el-tag type="success" >{{ scope.row.enableState==1?"鍚敤":"鏈惎鐢�"  }}</el-tag>
+            <el-tag type="success" >{{ scope.row.enableState==1? $t('reportWork.enable') : $t('reportWork.unenable')}}</el-tag>
           </template>
           </el-table-column>
-          <el-table-column fixed="right" label="鎿嶄綔" align="center" width="200">
+          <el-table-column fixed="right" :label="$t('reportWork.operate')" align="center" width="200">
             <template #default="scope">
-            <el-button size="mini" type="text" plain v-show="scope.row.enableState !== '宸插惎鐢�' " @click="handleBindRack(scope.row)">缁戝畾鏋跺瓙</el-button>
-            <el-button size="mini" type="text" plain  @click="handleBindRack2(scope.row)">娓呯┖</el-button>
+            <el-button size="mini" type="text" plain v-show="scope.row.enableState !== '宸插惎鐢�' " @click="handleBindRack(scope.row)">{{ $t('reportWork.bindingshelves') }}</el-button>
+            <el-button size="mini" type="text" plain  @click="handleBindRack2(scope.row)">{{ $t('reportWork.clear') }}</el-button>
           </template>
         </el-table-column>
         </el-table>
@@ -218,15 +218,15 @@
     </el-card>
 
 
-    <el-dialog v-model="dialogFormVisiblea" top="21vh" width="30%" title="缁戝畾鏋跺瓙" >
+    <el-dialog v-model="dialogFormVisiblea" top="21vh" width="40%" :title="$t('reportWork.bindingshelves')">
     <div style="margin-left: 50px;margin-top: 10px;margin-bottom: 10px;">
-      <el-form  size="mini" label-width="150px">
-        <el-form  label-width="100px" label-position="right">
-          <el-form-item label="鏋跺彿锛�" :required="true" style="width: 18vw">
+      <el-form  size="mini" label-width="100px">
+        <el-form  label-width="210px" label-position="right">
+          <el-form-item :label="$t('reportWork.shelfnumbera')" :required="true" style="width: 25vw">
             <el-input v-model="workstationId" autocomplete="off"/>
           </el-form-item>
-          <el-form-item label="娴佺▼鍗″彿锛�" :required="false" style="width: 18vw;">
-          <el-select v-model="flowCardId" placeholder="璇烽�夋嫨娴佺▼鍗″彿">
+          <el-form-item :label="$t('reportWork.cardnumbera')" :required="true" style="width: 25vw;">
+          <el-select v-model="flowCardId" :placeholder="$t('reportWork.incardnumber')">
             <el-option v-for="item in flowCardOptions" :key="item.flowcard_id" :label="item.flowcard_id" :value="item.flowcard_id" />
           </el-select>
         </el-form-item>
@@ -236,9 +236,9 @@
     <template #footer>
       <div id="dialog-footer">
         <el-button type="primary" @click="handleConfirm">
-          纭
+          {{ $t('reportWork.sure') }}
         </el-button>
-        <el-button @click="dialogFormVisiblea = false">鍙栨秷</el-button>
+        <el-button @click="dialogFormVisiblea = false">{{ $t('reportWork.cancel') }}</el-button>
       </div>
     </template>
   </el-dialog>
@@ -246,14 +246,14 @@
 
 
 
-  <el-dialog v-model="dialogFormVisiblea2" top="21vh" width="30%" title="娓呴櫎鏋跺瓙鐜荤拑" >
+  <el-dialog v-model="dialogFormVisiblea2" top="21vh" width="30%" :title="$t('reportWork.clearglass')">
 
     <template #footer>
       <div id="dialog-footer">
         <el-button type="primary" @click="handleclear">
-          纭
+          {{ $t('reportWork.sure') }}
         </el-button>
-        <el-button @click="dialogFormVisiblea2 = false">鍙栨秷</el-button>
+        <el-button @click="dialogFormVisiblea2 = false">{{ $t('reportWork.cancel') }}</el-button>
       </div>
     </template>
   </el-dialog>
diff --git a/UI-Project/src/views/User/permissions.vue b/UI-Project/src/views/User/permissions.vue
index 80cff3d..cdaab17 100644
--- a/UI-Project/src/views/User/permissions.vue
+++ b/UI-Project/src/views/User/permissions.vue
@@ -6,6 +6,9 @@
 const add = ref(false)
 const adda = ref(false)
 
+import { useI18n } from 'vue-i18n'
+  const { t } = useI18n()
+  let language = ref(localStorage.getItem('lang') || 'zh')
 const editingUser = ref({}); // 鐢ㄤ簬瀛樺偍褰撳墠缂栬緫鐨勭敤鎴锋暟鎹� 
 import request from "@/utils/request"
 import { ref, onMounted } from "vue";
@@ -114,16 +117,16 @@
 };
 // 鍒犻櫎 
  const opena = async(row) => {  
-  try {  
+  try {
     const confirmResult = await ElMessageBox.confirm(  
-      '鏄惁鍒犻櫎璇ヨ彍鍗�?',  
-      '鎻愮ず',  
+      t('customer.demenu'), 
+      t('customer.prompt'),  
       {  
-        confirmButtonText: '鏄�',  
-        cancelButtonText: '鍙栨秷',  
+        confirmButtonText: t('customer.yes'), 
+        cancelButtonText: t('customer.cancel'),
         type: 'warning',  
-      }  
-    );  
+      } 
+    );
     if (confirmResult === 'confirm') {  
       // 鐢ㄦ埛鐐瑰嚮浜嗏�滄槸鈥濓紝鐜板湪璋冪敤鍒犻櫎鎺ュ彛  
       const response = await request.post("/loadGlass/sys/menu/deleteMenu", {
@@ -143,54 +146,16 @@
   }  
 };   
 
-// const gridOptions = reactive({
-//   border:  "full",//琛ㄦ牸鍔犺竟妗�
-//   keepSource: true,//淇濇寔婧愭暟鎹�
-//   align: 'center',//鏂囧瓧灞呬腑
-//   stripe:true,//鏂戦┈绾�
-//   rowConfig: {isCurrent: true, isHover: true,height: 50},//榧犳爣绉诲姩鎴栭�夋嫨楂樹寒
-//   id: 'OrderList',
-//   showFooter: true,//鏄剧ず鑴�
-//   printConfig: {},
-//   importConfig: {},
-//   exportConfig: {},
-//   scrollY:{ enabled: true },//寮�鍚櫄鎷熸粴鍔�
-//   showOverflow:true,
-//   columnConfig: {
-//     resizable: true,
-//     useKey: true
-//   },
-//   filterConfig: {   //绛涢�夐厤缃」
-//     remote: true
-//   },
-//   customConfig: {
-//     storage: true
-//   },
-//   editConfig: {
-//     trigger: 'click',
-//     mode: 'row',
-//     showStatus: true
-//   },
-//   data:  [
-//     {
-//       'id': '1',
-//       'long': '5',
-//       'wide': '1005',
-//       'thick': '183.6',
-//     }
-//   ]
- 
-// })
 </script>
 
 <template>
-  <div style="height: 700px;">
-     <el-button type="primary" style="margin-top: 10px;margin-left: 10px;"  size="mini" id="searchButton" @click="add = true">娣诲姞鑿滃崟</el-button>
+  <div style="height: 600px;">
+     <el-button type="primary" style="margin-top: 10px;margin-left: 10px;"  size="mini" id="searchButton" @click="add = true">{{ $t('customer.addmenu') }}</el-button>
     <el-card style="flex: 1;margin-left: 10px;margin-top: 20px;" v-loading="loading">
       <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;max-height: 650px;">
               <el-table  
           :data="tableData" 
-          height="650"
+          height="550"
           @expand-change="handleExpandChange"  
           row-key="id" 
           :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}" 
@@ -205,33 +170,33 @@
                   row-key="id"  
                   :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}" 
                 >  
-                  <el-table-column prop="menuName" label="浜岀骇鑿滃崟鏍�" align="center" min-width="140" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"/>  
-                  <el-table-column prop="url" label="閾炬帴" align="center" min-width="160"/>  
-          <el-table-column prop="id" align="center" label="鎺掑簭" min-width="140"/>
-                  <el-table-column fixed="right" label="鎿嶄綔" align="center">
+                  <el-table-column prop="menuName" :label="$t('customer.semenu')" align="center" min-width="140" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"/>  
+                  <el-table-column prop="url" :label="$t('customer.link')" align="center" min-width="160"/>  
+          <el-table-column prop="id" align="center" :label="$t('customer.sort')" min-width="140"/>
+                  <el-table-column fixed="right" :label="$t('customer.operate')" align="center">
             <template #default="scope">
-              <el-button size="mini" type="text" plain @click="handleEdit(scope.row)">缂栬緫</el-button>
-              <el-button size="mini" type="text" plain @click="opena(scope.row)">鍒犻櫎</el-button>
+              <el-button size="mini" type="text" plain @click="handleEdit(scope.row)">{{ $t('customer.exit') }}</el-button>
+              <el-button size="mini" type="text" plain @click="opena(scope.row)">{{ $t('customer.delete') }}</el-button>
             </template>
         </el-table-column>
                 </el-table>  
               </div>  
             </template>  
           </el-table-column>  
-          <el-table-column prop="menuName" label="涓�绾ц彍鍗曟爮" align="center" min-width="120"  />  
-                  <el-table-column prop="url" label="閾炬帴" align="center" min-width="200"/>  
-          <el-table-column prop="id" align="center" label="鎺掑簭" min-width="180" />
-          <el-table-column fixed="right" label="鎿嶄綔" align="center" width="200">
+          <el-table-column prop="menuName" :label="$t('customer.firstmenu')" align="center" min-width="120"  />  
+                  <el-table-column prop="url" :label="$t('customer.link')" align="center" min-width="200"/>  
+          <el-table-column prop="id" align="center" :label="$t('customer.sort')" min-width="180" />
+          <el-table-column fixed="right" :label="$t('customer.operate')" align="center" width="200">
             <template #default="scope">
-              <el-button size="mini" type="text" plain @click="handleEdit(scope.row)">缂栬緫</el-button>
-              <el-button size="mini" type="text" plain @click="opena(scope.row)">鍒犻櫎</el-button>
+              <el-button size="mini" type="text" plain @click="handleEdit(scope.row)">{{ $t('customer.exit') }}</el-button>
+              <el-button size="mini" type="text" plain @click="opena(scope.row)">{{ $t('customer.delete') }}</el-button>
             </template>
         </el-table-column>
         </el-table>
       </div>
     </el-card>
   </div>
-  <el-dialog v-model="add" top="23vh" width="37%" title="娣诲姞鑿滃崟" >
+  <el-dialog v-model="add" top="23vh" width="37%" :title="$t('customer.addmenu')">
     <div style="margin-left: -50px;margin-top: 10px;margin-bottom: 10px;">
             <el-form  size="mini" label-width="150px">
       <el-form label-width="100px" label-position="right">
@@ -239,8 +204,8 @@
           <el-col :span="6">
               <div id="dt" style="font-size: 15px;">
         <div> 
-          <el-form-item label="鑿滃崟鏍忥細" :required="true" style="width: 25vw">
-                <el-input v-model="menuName" autocomplete="off" />
+          <el-form-item :label="$t('customer.menu')" :required="true" style="width: 25vw">
+                <el-input v-model="menuName" autocomplete="off" :placeholder="$t('customer.inmenu')"/>
               </el-form-item></div></div>
           </el-col>
         </el-row>
@@ -248,8 +213,8 @@
           <el-col :span="6">
               <div id="dt" style="font-size: 15px;">
         <div>
-          <el-form-item label="閾炬帴锛�" :required="true" style="width: 25vw">
-                <el-input v-model="url" autocomplete="off" />
+          <el-form-item :label="$t('customer.linka')" :required="true" style="width: 25vw">
+                <el-input v-model="url" autocomplete="off" :placeholder="$t('customer.inlink')"/>
               </el-form-item></div></div>
           </el-col>
         </el-row>
@@ -257,8 +222,8 @@
           <el-col :span="6">
               <div id="dt" style="font-size: 15px;">
         <div>
-          <el-form-item label="鎺掑簭锛�" :required="true" style="width: 25vw">
-                <el-input v-model="parentId" autocomplete="off" />
+          <el-form-item :label="$t('customer.sorta')" :required="true" style="width: 25vw">
+                <el-input v-model="parentId" autocomplete="off" :placeholder="$t('customer.insort')"/>
               </el-form-item></div></div>
           </el-col>
         </el-row>
@@ -268,13 +233,13 @@
     <template #footer>
       <div id="dialog-footer">
         <el-button type="primary" @click="getTableRow">
-          纭
+          {{ $t('customer.sure') }}
         </el-button>
-        <el-button @click="add = false">鍙栨秷</el-button>
+        <el-button @click="add = false">{{ $t('customer.cancel') }}</el-button>
       </div>
     </template>
   </el-dialog> 
-  <el-dialog v-model="adda" top="23vh" width="37%" title="淇敼鑿滃崟" >
+  <el-dialog v-model="adda" top="23vh" width="37%" :title="$t('customer.exmene')">
     <div style="margin-left: -50px;margin-top: 10px;margin-bottom: 10px;">
      <el-form  :model="editingUser" ref="formRef" size="mini" label-width="150px">
       <el-form label-width="100px" label-position="right">
@@ -282,8 +247,8 @@
           <el-col :span="6">
               <div id="dt" style="font-size: 15px;">
         <div> 
-          <el-form-item label="鑿滃崟鏍忥細" :required="true" style="width: 25vw">
-                <el-input v-model="editingUser.menuName" autocomplete="off" />
+          <el-form-item :label="$t('customer.menu')" :required="true" style="width: 25vw">
+                <el-input v-model="editingUser.menuName" autocomplete="off" :placeholder="$t('customer.inmenu')"/>
               </el-form-item></div></div>
           </el-col>
         </el-row>
@@ -291,8 +256,8 @@
           <el-col :span="6">
               <div id="dt" style="font-size: 15px;">
         <div>
-          <el-form-item label="閾炬帴锛�" :required="true" style="width: 25vw">
-                <el-input v-model="editingUser.url" autocomplete="off" />
+          <el-form-item :label="$t('customer.linka')" :required="true" style="width: 25vw">
+                <el-input v-model="editingUser.url" autocomplete="off" :placeholder="$t('customer.inlink')"/>
               </el-form-item></div></div>
           </el-col>
         </el-row>
@@ -300,8 +265,8 @@
           <el-col :span="6">
               <div id="dt" style="font-size: 15px;">
         <div>
-          <el-form-item label="鎺掑簭锛�" :required="true" style="width: 25vw">
-                <el-input v-model="editingUser.parentId" autocomplete="off" />
+          <el-form-item :label="$t('customer.sorta')" :required="true" style="width: 25vw">
+                <el-input v-model="editingUser.parentId" autocomplete="off" :placeholder="$t('customer.insort')"/>
               </el-form-item></div></div>
           </el-col>
         </el-row>
@@ -311,9 +276,9 @@
     <template #footer>
       <div id="dialog-footer">
         <el-button type="primary" @click="getTableRowa">
-          纭
+          {{ $t('customer.sure') }}
         </el-button>
-        <el-button @click="adda = false">鍙栨秷</el-button>
+        <el-button @click="adda = false">{{ $t('customer.cancel') }}</el-button>
       </div>
     </template>
   </el-dialog> 
diff --git a/UI-Project/src/views/User/rolelist.vue b/UI-Project/src/views/User/rolelist.vue
index abbe82c..8a92066 100644
--- a/UI-Project/src/views/User/rolelist.vue
+++ b/UI-Project/src/views/User/rolelist.vue
@@ -2,6 +2,9 @@
 import {Search} from "@element-plus/icons-vue";
 import {reactive} from "vue";
 import {useRouter} from "vue-router"
+  import { useI18n } from 'vue-i18n'
+  const { t } = useI18n()
+  let language = ref(localStorage.getItem('lang') || 'zh')
 const router = useRouter()
 const add = ref(false)
 const adda = ref(false)
@@ -103,16 +106,16 @@
 };
 // 鍒犻櫎 
  const opena = async(row) => {  
-  try {  
+  try {
     const confirmResult = await ElMessageBox.confirm(  
-      '鏄惁鍒犻櫎璇ヨ鑹�?',  
-      '鎻愮ず',  
+      t('delivery.derole'), 
+      t('delivery.prompt'),  
       {  
-        confirmButtonText: '鏄�',  
-        cancelButtonText: '鍙栨秷',  
+        confirmButtonText: t('delivery.yes'), 
+        cancelButtonText: t('delivery.cancel'),
         type: 'warning',  
-      }  
-    );  
+      } 
+    ); 
     if (confirmResult === 'confirm') {  
       // 鐢ㄦ埛鐐瑰嚮浜嗏�滄槸鈥濓紝鐜板湪璋冪敤鍒犻櫎鎺ュ彛  
       const response = await request.post("/loadGlass/sys/role/delete", {
@@ -130,68 +133,29 @@
     // 澶勭悊鍙兘鍑虹幇鐨勯敊璇紝姣斿 ElMessageBox 鎶涘嚭鐨勫紓甯哥瓑  
     console.error('鍙戠敓閿欒:', error);  
   }  
-};   
-
-const gridOptions = reactive({
-  border:  "full",//琛ㄦ牸鍔犺竟妗�
-  keepSource: true,//淇濇寔婧愭暟鎹�
-  align: 'center',//鏂囧瓧灞呬腑
-  stripe:true,//鏂戦┈绾�
-  rowConfig: {isCurrent: true, isHover: true,height: 50},//榧犳爣绉诲姩鎴栭�夋嫨楂樹寒
-  id: 'OrderList',
-  showFooter: true,//鏄剧ず鑴�
-  printConfig: {},
-  importConfig: {},
-  exportConfig: {},
-  scrollY:{ enabled: true },//寮�鍚櫄鎷熸粴鍔�
-  showOverflow:true,
-  columnConfig: {
-    resizable: true,
-    useKey: true
-  },
-  filterConfig: {   //绛涢�夐厤缃」
-    remote: true
-  },
-  customConfig: {
-    storage: true
-  },
-  editConfig: {
-    trigger: 'click',
-    mode: 'row',
-    showStatus: true
-  },
-  data:  [
-    {
-      'id': '1',
-      'long': '5',
-      'wide': '1005',
-      'thick': '183.6',
-    }
-  ]
- 
-})
+};  
 </script>
 
 <template>
   <div>
-     <el-button type="primary" style="margin-top: 10px;margin-left: 10px;"  size="mini" id="searchButton" @click="add = true">娣诲姞瑙掕壊</el-button>
+     <el-button type="primary" style="margin-top: 10px;margin-left: 10px;"  size="mini" id="searchButton" @click="add = true">{{ $t('delivery.addrole') }}</el-button>
     <el-card style="flex: 1;margin-left: 10px;margin-top: 20px;" v-loading="loading">
       <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
         <el-table height="240" ref="table" 
         @selection-change="handleSelectionChange"
         :data="tableData" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
-          <el-table-column prop="name" align="center" label="瑙掕壊" min-width="180" />
-          <el-table-column fixed="right" label="鎿嶄綔" align="center" width="200">
+          <el-table-column prop="name" align="center" :label="$t('delivery.role')" min-width="180" />
+          <el-table-column fixed="right" :label="$t('delivery.operate')" align="center" width="200">
             <template #default="scope">
-              <el-button size="mini" type="text" plain  @click="handleEdit(scope.row)">缂栬緫</el-button>
-              <el-button size="mini" type="text" plain @click="opena(scope.row)">鍒犻櫎</el-button>
+              <el-button size="mini" type="text" plain  @click="handleEdit(scope.row)">{{ $t('delivery.edit') }}</el-button>
+              <el-button size="mini" type="text" plain @click="opena(scope.row)">{{ $t('delivery.delete') }}</el-button>
             </template>
         </el-table-column>
         </el-table>
       </div>
     </el-card>
   </div>
-  <el-dialog v-model="add" top="23vh" width="37%" title="娣诲姞瑙掕壊" >
+  <el-dialog v-model="add" top="23vh" width="37%" :title="$t('delivery.addrole')" >
     <div style="margin-left: -50px;margin-top: 10px;margin-bottom: 10px;">
             <el-form  size="mini" label-width="150px">
       <el-form label-width="100px" label-position="right">
@@ -199,8 +163,8 @@
           <el-col :span="6">
               <div id="dt" style="font-size: 15px;">
         <div>
-          <el-form-item label="瑙掕壊锛�" :required="true" style="width: 25vw">
-                <el-input placeholder="璇疯緭鍏ヨ鑹�" v-model="name" autocomplete="off" />
+          <el-form-item :label="$t('delivery.rolea')" :required="true" style="width: 25vw">
+                <el-input :placeholder="$t('delivery.inrole')" v-model="name" autocomplete="off" />
               </el-form-item></div></div>
           </el-col>
         </el-row>
@@ -210,13 +174,13 @@
     <template #footer>
       <div id="dialog-footer">
         <el-button type="primary" @click="getTableRow">
-          纭
+          {{ $t('delivery.sure') }}
         </el-button>
-        <el-button @click="add = false">鍙栨秷</el-button>
+        <el-button @click="add = false"> {{ $t('delivery.cancel') }}</el-button>
       </div>
     </template>
   </el-dialog> 
-  <el-dialog v-model="adda" top="23vh" width="37%" title="淇敼瑙掕壊" >
+  <el-dialog v-model="adda" top="23vh" width="37%" :title="$t('delivery.editrole')">
     <div style="margin-left: -50px;margin-top: 10px;margin-bottom: 10px;">
             <el-form :model="editingUser" ref="formRef" size="mini" label-width="150px">
               <el-form label-width="100px" label-position="right">
@@ -224,8 +188,8 @@
           <el-col :span="6">
               <div id="dt" style="font-size: 15px;">
         <div>
-          <el-form-item label="瑙掕壊锛�" :required="true" style="width: 25vw">
-                <el-input placeholder="璇疯緭鍏ヨ鑹�" v-model="editingUser.name" autocomplete="off" />
+          <el-form-item :label="$t('delivery.rolea')" :required="true" style="width: 25vw">
+                <el-input :placeholder="$t('delivery.inrole')" v-model="editingUser.name" autocomplete="off" />
               </el-form-item></div></div>
           </el-col>
         </el-row>
@@ -235,9 +199,9 @@
     <template #footer>
       <div id="dialog-footer">
         <el-button type="primary" @click="getTableRowa">
-          纭
+          {{ $t('delivery.sure') }}
         </el-button>
-        <el-button @click="adda = false">鍙栨秷</el-button>
+        <el-button @click="adda = false">{{ $t('delivery.cancel') }}</el-button>
       </div>
     </template>
   </el-dialog> 
diff --git a/UI-Project/src/views/User/userlist.vue b/UI-Project/src/views/User/userlist.vue
index ecd91ed..da399b6 100644
--- a/UI-Project/src/views/User/userlist.vue
+++ b/UI-Project/src/views/User/userlist.vue
@@ -10,6 +10,9 @@
 import { ref, onMounted } from "vue";
 // import { ref } from 'vue'
 import { ElMessage, ElMessageBox } from 'element-plus'
+  import { useI18n } from 'vue-i18n'
+  const { t } = useI18n()
+  let language = ref(localStorage.getItem('lang') || 'zh')
 //  import LanguageMixin from './lang/LanguageMixin'
 const selectedProjectNoa = ref(''); // 褰撳墠閫変腑鐨勮鑹� 
 // const options = ref<any[]>([]); // 涓嬫媺閫夐」鍒楄〃  
@@ -31,16 +34,16 @@
           });
 // 閲嶇疆瀵嗙爜
  const open = async(row) => {  
-  try {  
+  try {
     const confirmResult = await ElMessageBox.confirm(  
-      '鏄惁閲嶇疆鐢ㄦ埛瀵嗙爜?',  
-      '鎻愮ず',  
+      t('productStock.repassword'), 
+      t('productStock.prompt'),  
       {  
-        confirmButtonText: '鏄�',  
-        cancelButtonText: '鍙栨秷',  
+        confirmButtonText: t('productStock.yes'), 
+        cancelButtonText: t('productStock.cancel'),
         type: 'warning',  
-      }  
-    );  
+      } 
+    );
     if (confirmResult === 'confirm') {  
       // 鐢ㄦ埛鐐瑰嚮浜嗏�滄槸鈥濓紝鐜板湪璋冪敤鍒犻櫎鎺ュ彛  
       var url="/loadGlass/sys/user/resetPassword?userId="+row.id;
@@ -148,16 +151,16 @@
 };
 // 鍒犻櫎 
  const opena = async(row) => {  
-  try {  
+  try {
     const confirmResult = await ElMessageBox.confirm(  
-      '鏄惁鍒犻櫎璇ョ敤鎴�?',  
-      '鎻愮ず',  
+      t('productStock.deusername'), 
+      t('productStock.prompt'),  
       {  
-        confirmButtonText: '鏄�',  
-        cancelButtonText: '鍙栨秷',  
+        confirmButtonText: t('productStock.yes'), 
+        cancelButtonText: t('productStock.cancel'),
         type: 'warning',  
-      }  
-    );  
+      } 
+    );
     if (confirmResult === 'confirm') {  
       // 鐢ㄦ埛鐐瑰嚮浜嗏�滄槸鈥濓紝鐜板湪璋冪敤鍒犻櫎鎺ュ彛  
       const response = await request.post("/loadGlass/sys/user/deleteUser", {
@@ -219,32 +222,32 @@
 
 <template>
   <div>
-     <el-button type="primary" style="margin-top: 10px;margin-left: 10px;"  size="mini" id="searchButton" @click="add = true">娣诲姞鐢ㄦ埛</el-button>
+     <el-button type="primary" style="margin-top: 10px;margin-left: 10px;"  size="mini" id="searchButton" @click="add = true">{{ $t('productStock.addusers') }}</el-button>
     <el-card style="flex: 1;margin-left: 10px;margin-top: 20px;" v-loading="loading">
       <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
         <el-table height="240" ref="table" 
         @selection-change="handleSelectionChange"
         :data="tableData" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
-          <el-table-column prop="userName" align="center" label="鐢ㄦ埛鍚�" min-width="180" />
-          <el-table-column align="center" label="瑙掕壊" min-width="80">
+          <el-table-column prop="userName" align="center" :label="$t('productStock.username')" min-width="180" />
+          <el-table-column align="center" :label="$t('productStock.role')" min-width="80">
             <template #default="scope">  
              <el-tag v-for="role in scope.row.roleList">  
             {{role.name}}  
            </el-tag>   
          </template> 
             </el-table-column>
-          <el-table-column fixed="right" label="鎿嶄綔" align="center" width="200">
+          <el-table-column fixed="right" :label="$t('productStock.operate')" align="center" width="270">
             <template #default="scope">
-              <el-button size="mini" type="text" plain @click="open(scope.row)">閲嶇疆瀵嗙爜</el-button>
-              <el-button size="mini" type="text" plain @click="handleEdit(scope.row)">缂栬緫</el-button>
-              <el-button size="mini" type="text" plain @click="opena(scope.row)">鍒犻櫎</el-button>
+              <el-button size="mini" type="text" plain @click="open(scope.row)">{{ $t('productStock.resetpassword') }}</el-button>
+              <el-button size="mini" type="text" plain @click="handleEdit(scope.row)">{{ $t('productStock.exit') }}</el-button>
+              <el-button size="mini" type="text" plain @click="opena(scope.row)">{{ $t('productStock.delete') }}</el-button>
             </template>
         </el-table-column>
         </el-table>
       </div>
     </el-card>
   </div>
-  <el-dialog v-model="add" top="23vh" width="37%" title="娣诲姞鐢ㄦ埛" >
+  <el-dialog v-model="add" top="23vh" width="37%" :title="$t('productStock.addusers')">
     <div style="margin-left: -50px;margin-top: 10px;margin-bottom: 10px;">
             <el-form  size="mini" label-width="150px">
       <el-form label-width="100px" label-position="right">
@@ -252,8 +255,8 @@
           <el-col :span="6">
               <div id="dt" style="font-size: 15px;">
         <div>
-          <el-form-item label="鐢ㄦ埛鍚嶏細" :required="true" style="width: 25vw">
-                <el-input v-model="userName" autocomplete="off" />
+          <el-form-item :label="$t('productStock.usernamea')" :required="true" style="width: 25vw">
+                <el-input v-model="userName" autocomplete="off" :placeholder="$t('productStock.inusername')" />
               </el-form-item></div></div>
           </el-col>
         </el-row>
@@ -261,12 +264,12 @@
           <el-col :span="6">
               <div id="dt" style="font-size: 15px;">
         <div>
-              <el-form-item label="瑙掕壊锛�" :required="true" style="width: 25vw;">
+              <el-form-item :label="$t('productStock.rolea')" :required="true" style="width: 25vw;">
                 <el-select
                v-model="selectedProjectNoa"
                filterable
                clearable
-               placeholder="璇烽�夋嫨瑙掕壊"
+               :placeholder="$t('productStock.inrole')"
                style="width: 330px"
              >
                <el-option
@@ -283,9 +286,10 @@
           <el-col :span="6">
               <div id="dt" style="font-size: 15px;">
         <div>
-              <el-form-item label="瀵嗙爜锛�" :required="true" style="width: 25vw;">
+              <el-form-item :label="$t('productStock.password')" :required="true" style="width: 25vw;">
                 <el-input style="width: 340px;"
                         v-model="password"
+                        :placeholder="$t('productStock.inpassword')"
                         autocomplete="off"
                         :prefix-icon="Lock"
                         show-password/>
@@ -298,13 +302,13 @@
     <template #footer>
       <div id="dialog-footer">
         <el-button type="primary" @click="getTableRow">
-          纭
+          {{ $t('productStock.sure') }}
         </el-button>
-        <el-button @click="add = false">鍙栨秷</el-button>
+        <el-button @click="add = false">{{ $t('productStock.cancel') }}</el-button>
       </div>
     </template>
   </el-dialog> 
-  <el-dialog v-model="adda" top="23vh" width="37%" title="淇敼鐢ㄦ埛" >
+  <el-dialog v-model="adda" top="23vh" width="37%" :title="$t('productStock.reusername')" >
     <div style="margin-left: -50px;margin-top: 10px;margin-bottom: 10px;">
             <el-form :model="editingUser" ref="formRef" size="mini" label-width="150px">
       <el-form label-width="100px" label-position="right">
@@ -312,8 +316,8 @@
           <el-col :span="6">
               <div id="dt" style="font-size: 15px;">
         <div>
-          <el-form-item label="鐢ㄦ埛鍚嶏細" :required="true" style="width: 25vw">
-                <el-input v-model="editingUser.userName" autocomplete="off" />
+          <el-form-item :label="$t('productStock.usernamea')" :required="true" style="width: 25vw">
+                <el-input :placeholder="$t('productStock.inusername')" v-model="editingUser.userName" autocomplete="off" />
               </el-form-item></div></div>
           </el-col>
         </el-row>
@@ -328,12 +332,12 @@
            </el-tag>   
          </template> 
             </el-table-column> -->
-              <el-form-item label="瑙掕壊锛�" :required="true" style="width: 25vw;">
+              <el-form-item :label="$t('productStock.rolea')" :required="true" style="width: 25vw;">
                 <el-select
                v-model="selectedProjectNoa"
                filterable
                clearable
-               placeholder="璇烽�夋嫨瑙掕壊"
+               :placeholder="$t('productStock.inrole')"
                style="width: 330px"
              >
                <el-option
@@ -350,9 +354,10 @@
           <el-col :span="6">
               <div id="dt" style="font-size: 15px;">
         <div>
-              <el-form-item label="瀵嗙爜锛�" :required="true" style="width: 25vw;">
+              <el-form-item :label="$t('productStock.password')" :required="true" style="width: 25vw;">
                 <el-input style="width: 340px;"
                         v-model="editingUser.password"
+                        :placeholder="$t('productStock.inpassword')"
                         autocomplete="off"
                         :prefix-icon="Lock"
                         show-password/>
@@ -365,9 +370,9 @@
     <template #footer>
       <div id="dialog-footer">
         <el-button type="primary" @click="getTableRowa">
-          纭
+          {{ $t('productStock.sure') }}
         </el-button>
-        <el-button @click="adda = false">鍙栨秷</el-button>
+        <el-button @click="adda = false">{{ $t('productStock.cancel') }}</el-button>
       </div>
     </template>
   </el-dialog> 
diff --git a/UI-Project/vite.config.js b/UI-Project/vite.config.js
index b93f5ee..8fdf859 100644
--- a/UI-Project/vite.config.js
+++ b/UI-Project/vite.config.js
@@ -1,17 +1,27 @@
 import {fileURLToPath, URL} from 'node:url'
-
 import {defineConfig} from 'vite'
 import vue from '@vitejs/plugin-vue'
 import ReactivityTransform from '@vue-macros/reactivity-transform/vite'
+import AutoImport from 'unplugin-auto-import/vite'
 
 // https://vitejs.dev/config/
 export default defineConfig({
   plugins: [
     vue(),
-    ReactivityTransform()
+    ReactivityTransform(),
+    AutoImport({
+      imports: [
+        'vue-i18n',
+      ],
+      dts: './auto-imports.d.ts',
+      eslintrc: {
+        enabled: false, // 閰嶇疆鏇存柊鏃朵复鏃惰涓簍rue,
+      },
+    }),
   ],
   resolve: {
     alias: {
+      'vue-i18n': 'vue-i18n/dist/vue-i18n.cjs.js',
       '@': fileURLToPath(new URL('./src', import.meta.url))
     }
   }, 
@@ -48,4 +58,4 @@
       })
     );
   },
-});
\ No newline at end of file
+});
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/entity/GlassInfo.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/entity/GlassInfo.java
index f69a142..5fe46f1 100644
--- a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/entity/GlassInfo.java
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/entity/GlassInfo.java
@@ -125,7 +125,7 @@
     /**
      * 鏃嬭浆瑙掑害锛堥�嗘椂閽堬級
      */
-    private Integer angle;
+    private Double angle;
 
     /**
      * 宸ョ▼鍙�
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/entity/OptimizeGlassinfo.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/entity/OptimizeGlassinfo.java
index 19cb029..c83bc33 100644
--- a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/entity/OptimizeGlassinfo.java
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/entity/OptimizeGlassinfo.java
@@ -33,6 +33,17 @@
     private Double height;
 
     /**
+     * 瀹�
+     */
+    private Double oHeight;
+
+    /**
+     * 楂�
+     */
+    private Double oWidth;
+
+
+    /**
      * 鍘氬害
      */
     private Double glassThickness;
@@ -88,5 +99,13 @@
      * 灏忕墖缂栧彿
      */
     private  String glassId;
+    /**
+     * 璁㈠崟搴忓彿
+     */
+    private  String orderSort;
+    /**
+     * 鏃嬭浆瑙掑害
+     */
+    private  Double rotateAngle;
 
 }
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/service/impl/GlassInfoServiceImpl.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/service/impl/GlassInfoServiceImpl.java
index 25fd269..6e35509 100644
--- a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/service/impl/GlassInfoServiceImpl.java
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/service/impl/GlassInfoServiceImpl.java
@@ -40,12 +40,13 @@
         List<OptimizeGlassinfo> optimizeGlassinfos = null;
         if (engineeringId != null) {
             optimizeGlassinfos = optimizeProjectMapper.selectJoinList(OptimizeGlassinfo.class, new MPJQueryWrapper<OptimizeProject>()
-                    .select("b.process_id,t.type,b.width,b.height,t.glass_thickness,t.glass_type,b.p_width,b.p_height,b.layer, b.total_layer, b.stock_id,b.heat_layout_id,b.heat_layout_sort,b.x_axis,b.y_axis,b.project_no,b.glass_id")
+                    .select("b.process_id,t.glass_type,b.o_width,b.o_height,t.glass_thickness,b.order_sort,b.p_width,b.p_height,b.layer, b.total_layer, b.stock_id,b.heat_layout_id,b.heat_layout_sort,c.x_axis,c.y_axis,b.project_no,b.glass_id,c.rotate_angle")
                     .leftJoin("optimize_detail b on t.project_no=b.project_no")
+                                    .leftJoin("optimize_heat_detail c on c.project_no=t.project_no and b.heat_layout_id=c.layout_id and b.heat_layout_sort=c.sort")
                     //.eq("t.state",100)
                     .eq("t.project_no", engineeringId));
         }
-
+        //order_sort,o_width,o_height
         // 鍒涘缓涓�涓� List 鐢ㄤ簬淇濆瓨鏄犲皠鍚庣殑瀹炰綋瀵硅薄
         List<GlassInfo> resultList = new ArrayList<>();
 
@@ -57,9 +58,9 @@
                 glassInfo.setEngineerId(map.getProjectNo());
                 glassInfo.setFlowCardId(map.getProcessId());
                 glassInfo.setFilmsid(map.getGlassType());
-                glassInfo.setGlassType(map.getType());
-                glassInfo.setWidth(map.getWidth());
-                glassInfo.setHeight(map.getHeight());
+                glassInfo.setGlassType(map.getOrderSort());//璁㈠崟搴忓彿
+                glassInfo.setWidth(map.getOWidth());//璁㈠崟瀹�
+                glassInfo.setHeight(map.getOHeight());//璁㈠崟楂�
                 glassInfo.setEdgWidth(map.getPWidth());
                 glassInfo.setLayer(map.getLayer());
                 glassInfo.setTotalLayer(map.getTotalLayer());
@@ -70,7 +71,7 @@
                 glassInfo.setTemperingFeedSequence(map.getHeatLayoutSort());//閽㈠寲鐗堝浘椤哄簭
                 glassInfo.setXCoordinate(map.getXAxis());
                 glassInfo.setYCoordinate(map.getYAxis());
-
+                glassInfo.setAngle(map.getRotateAngle());
                 glassInfo.setGlassId(map.getGlassId());
                 // 灏嗘槧灏勫悗鐨勫璞℃坊鍔犲埌缁撴灉鍒楄〃涓�
                 resultList.add(glassInfo);
diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/CodeGet.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/CodeGet.java
index 66b5c07..eba025b 100644
--- a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/CodeGet.java
+++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/CodeGet.java
@@ -22,7 +22,7 @@
         // 2銆佸叏灞�閰嶇疆
         // 鍏ㄥ眬閰嶇疆
         GlobalConfig gc = new GlobalConfig();
-        gc.setOutputDir("D:\\Documents\\hangzhoumesParent4\\");
+        gc.setOutputDir("D:\\Documents\\hangzhoumesParent6\\");
 
         gc.setServiceName("%sService");	//鍘绘帀Service鎺ュ彛鐨勯瀛楁瘝I
         gc.setAuthor("wu");
@@ -31,7 +31,7 @@
 
         // 3銆佹暟鎹簮閰嶇疆
         DataSourceConfig dsc = new DataSourceConfig();
-        dsc.setUrl("jdbc:mysql://10.153.19.150:3306/hangzhoumes?serverTimezone=GMT%2b8");
+        dsc.setUrl("jdbc:mysql://10.153.19.150:3306/sd?serverTimezone=GMT%2b8");
         dsc.setDriverName("com.mysql.cj.jdbc.Driver");
         dsc.setUsername("root");
         dsc.setPassword("beibo.123/");
@@ -41,7 +41,7 @@
         // 4銆佸寘閰嶇疆
         PackageConfig pc = new PackageConfig();
         pc.setParent("com.mes");
-        pc.setModuleName("glassinfo"); //妯″潡鍚�
+        pc.setModuleName("orderdetail"); //妯″潡鍚�
         pc.setController("controller");
         pc.setService("service");
         pc.setMapper("mapper");
@@ -50,7 +50,7 @@
         // 5銆佺瓥鐣ラ厤缃�
         StrategyConfig strategy = new StrategyConfig();
 
-        strategy.setInclude("glass_info");
+        strategy.setInclude("order_detail");
 
         strategy.setNaming(NamingStrategy.underline_to_camel);//鏁版嵁搴撹〃鏄犲皠鍒板疄浣撶殑鍛藉悕绛栫暐
 
diff --git a/hangzhoumesParent/common/springsecurity/pom.xml b/hangzhoumesParent/common/springsecurity/pom.xml
index 70e572c..9278822 100644
--- a/hangzhoumesParent/common/springsecurity/pom.xml
+++ b/hangzhoumesParent/common/springsecurity/pom.xml
@@ -23,6 +23,7 @@
             <artifactId>servicebase</artifactId>
             <version>1.0-SNAPSHOT</version>
         </dependency>
+
         <!-- Spring Security渚濊禆 -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/config/RedisConfig.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/config/RedisConfig.java
deleted file mode 100644
index e469272..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/config/RedisConfig.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.mes.common.config;
-
-import com.mes.common.utils.FastJsonRedisSerializer;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.data.redis.connection.RedisConnectionFactory;
-import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.data.redis.serializer.StringRedisSerializer;
-
-/**
- * @Author : zhoush
- * @Date: 2024/4/9 19:13
- * @Description:
- */
-@Configuration
-public class RedisConfig {
-
-    @Bean
-    @SuppressWarnings(value = {"unchecked", "rawtypes"})
-    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
-        RedisTemplate<Object, Object> template = new RedisTemplate<>();
-        template.setConnectionFactory(connectionFactory);
-
-        FastJsonRedisSerializer serializer = new FastJsonRedisSerializer(Object.class);
-
-        // 浣跨敤StringRedisSerializer鏉ュ簭鍒楀寲鍜屽弽搴忓垪鍖杛edis鐨刱ey鍊�
-        template.setKeySerializer(new StringRedisSerializer());
-        template.setValueSerializer(serializer);
-
-        // Hash鐨刱ey涔熼噰鐢⊿tringRedisSerializer鐨勫簭鍒楀寲鏂瑰紡
-        template.setHashKeySerializer(new StringRedisSerializer());
-        template.setHashValueSerializer(serializer);
-
-        template.afterPropertiesSet();
-        return template;
-    }
-}
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/config/TokenWebSecurityConfig.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/config/TokenWebSecurityConfig.java
deleted file mode 100644
index a130533..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/config/TokenWebSecurityConfig.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package com.mes.common.config;
-
-
-import com.mes.common.filter.JwtAuthenticationTokenFilter;
-import com.mes.common.handler.*;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
-import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
-import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
-import org.springframework.security.config.http.SessionCreationPolicy;
-import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
-import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
-
-@Configuration
-@EnableWebSecurity
-@EnableGlobalMethodSecurity(prePostEnabled = true)
-public class TokenWebSecurityConfig extends WebSecurityConfigurerAdapter {
-    @Autowired
-    private JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter;
-    @Autowired
-    LoginFailureHandler loginFailureHandler;
-
-    @Autowired
-    LoginSuccessHandler loginSuccessHandler;
-
-    @Autowired
-    JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint;
-
-    @Autowired
-    JwtAccessDeniedHandler jwtAccessDeniedHandler;
-
-    @Autowired
-    JwtLogoutSuccessHandler jwtLogoutSuccessHandler;
-
-    @Bean
-    public PasswordEncoder passwordEncoder() {
-        return new BCryptPasswordEncoder();
-    }
-
-    /**
-     * 閰嶇疆杩囨护瑙勫垯
-     */
-    @Override
-    protected void configure(HttpSecurity http) throws Exception {
-
-        http.cors().and().csrf().disable()
-
-                // 鐧诲綍閰嶇疆
-                .formLogin()
-                .successHandler(loginSuccessHandler)
-                .failureHandler(loginFailureHandler)
-
-                .and()
-                .logout()
-                .logoutSuccessHandler(jwtLogoutSuccessHandler)
-
-                // 绂佺敤session
-                .and()
-                .sessionManagement()
-                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
-
-                // 閰嶇疆鎷︽埅瑙勫垯
-                .and()
-                .authorizeRequests()
-                .antMatchers("/sys/user/login").anonymous()
-                .antMatchers("/swagger-ui.html").permitAll()
-                .antMatchers("/webjars/**").permitAll()
-                .antMatchers("/v2/**").permitAll()
-                .antMatchers("/swagger-resources/**").permitAll()
-                .antMatchers("/**").permitAll()
-                .anyRequest().authenticated()
-
-                // 寮傚父澶勭悊鍣�
-                .and()
-                .exceptionHandling()
-                .authenticationEntryPoint(jwtAuthenticationEntryPoint)
-                .accessDeniedHandler(jwtAccessDeniedHandler)
-
-                // 閰嶇疆鑷畾涔夌殑杩囨护鍣�
-                .and()
-                .addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
-    }
-
-    @Bean
-    @Override
-    public AuthenticationManager authenticationManagerBean() throws Exception {
-        return super.authenticationManagerBean();
-    }
-}
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/filter/JwtAuthenticationTokenFilter.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/filter/JwtAuthenticationTokenFilter.java
deleted file mode 100644
index 1505d1b..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/filter/JwtAuthenticationTokenFilter.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package com.mes.common.filter;
-
-import com.mes.common.utils.JwtUtil;
-import com.mes.common.utils.RedisUtil;
-import com.mes.common.utils.UserInfoUtils;
-import com.mes.userinfo.entity.LoginUser;
-import com.mes.userinfo.service.SysUserService;
-import io.jsonwebtoken.Claims;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.stereotype.Component;
-import org.springframework.util.StringUtils;
-import org.springframework.web.filter.OncePerRequestFilter;
-
-import javax.annotation.Resource;
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.util.List;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-/**
- * @Author : zhoush
- * @Date: 2024/4/10 9:42
- * @Description:
- */
-@Component
-public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
-    // 姝ゅ瑙i噴涓轰粈涔堜笉鍘诲疄鐜癋ilter鎺ュ彛锛屽洜涓哄湪鏌愪簺鎯呭喌涓嬩細杩囨护涓ゆ锛屾墽琛屼袱娆ilter閲岄潰鐨勬柟娉曪紝鎵�浠ユ垜浠�夋嫨缁ф壙SpringSecurity涓殑OncePerRequestFilter
-    @Autowired
-    private RedisUtil redisUtil;
-
-    @Resource
-    private SysUserService sysUserService;
-
-    @Override
-    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
-        //鑾峰彇token
-        String token = request.getHeader("token");
-        if (!StringUtils.hasText(token)) {
-            //鏀捐
-            filterChain.doFilter(request, response);
-            return; // 姝ゅ鍔犱笂return濂藉鏄悗闈㈢粨鏋滆繑鍥炵殑鏃跺�欏氨涓嶄細鍐嶈蛋涓�閬嶆杩囨护鍣ㄧ殑鏂规硶浜�
-        }
-        //瑙f瀽token
-        String userid;
-        try {
-            Claims claims = JwtUtil.getClaimByToken(token);
-            userid = claims.getSubject();
-        } catch (Exception e) {
-            e.printStackTrace();
-            throw new RuntimeException("token闈炴硶");
-        }
-        //浠巖edis涓幏鍙栫敤鎴蜂俊鎭�
-        String redisKey = "login:" + userid;
-        LoginUser loginUser = redisUtil.getCacheObject(redisKey);
-        if (Objects.isNull(loginUser)) {
-            response.setHeader("token", "");
-            throw new RuntimeException("鐢ㄦ埛鏈櫥褰�");
-        }
-        //灏嗙敤鎴蜂俊鎭斁鍏ュ綋鍓嶇嚎绋�
-        UserInfoUtils.set(loginUser.getUser());
-        //瀛樺叆SecurityContextHolder锛屼互渚涘悗闈㈢殑杩囨护鍣ㄤ娇鐢�
-        List<String> permissionKeyList = sysUserService.getUserAuthorityInfo(Long.parseLong(userid));
-        List<GrantedAuthority> authorities = permissionKeyList.stream().
-                map(SimpleGrantedAuthority::new)
-                .collect(Collectors.toList());
-        UsernamePasswordAuthenticationToken authenticationToken =
-                new UsernamePasswordAuthenticationToken(loginUser, null, authorities);
-        SecurityContextHolder.getContext().setAuthentication(authenticationToken);
-        //鏀捐
-        filterChain.doFilter(request, response);
-    }
-}
\ No newline at end of file
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAccessDeniedHandler.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAccessDeniedHandler.java
deleted file mode 100644
index aad53aa..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAccessDeniedHandler.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.mes.common.handler;
-
-import cn.hutool.json.JSONUtil;
-import com.mes.utils.Result;
-import org.springframework.http.HttpStatus;
-import org.springframework.security.access.AccessDeniedException;
-import org.springframework.security.web.access.AccessDeniedHandler;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-@Component
-public class JwtAccessDeniedHandler implements AccessDeniedHandler {
-
-	@Override
-	public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
-
-		response.setContentType("application/json;charset=UTF-8");
-		response.setStatus(HttpServletResponse.SC_FORBIDDEN);
-
-		ServletOutputStream outputStream = response.getOutputStream();
-
-		Result result = Result.error(HttpStatus.FORBIDDEN.value(), "鏉冮檺涓嶈冻");
-
-		outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8"));
-
-		outputStream.flush();
-		outputStream.close();
-
-	}
-}
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAuthenticationEntryPoint.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAuthenticationEntryPoint.java
deleted file mode 100644
index a95ca0c..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAuthenticationEntryPoint.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.mes.common.handler;
-
-import cn.hutool.json.JSONUtil;
-import com.mes.utils.Result;
-import org.springframework.http.HttpStatus;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.web.AuthenticationEntryPoint;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-@Component
-public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint {
-
-	@Override
-	public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
-
-		response.setContentType("application/json;charset=UTF-8");
-		response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
-		ServletOutputStream outputStream = response.getOutputStream();
-
-		Result result = Result.error(HttpStatus.UNAUTHORIZED.value(), "璁よ瘉澶辫触璇烽噸鏂扮櫥褰�");
-
-		outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8"));
-
-		outputStream.flush();
-		outputStream.close();
-	}
-}
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtLogoutSuccessHandler.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtLogoutSuccessHandler.java
deleted file mode 100644
index 3757d4d..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtLogoutSuccessHandler.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.mes.common.handler;
-
-import cn.hutool.json.JSONUtil;
-import com.mes.utils.Result;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
-import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-@Component
-public class JwtLogoutSuccessHandler implements LogoutSuccessHandler {
-
-	private static final String header = "Authorization";
-
-	@Override
-	public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
-
-		if (authentication != null) {
-			new SecurityContextLogoutHandler().logout(request, response, authentication);
-		}
-
-		response.setContentType("application/json;charset=UTF-8");
-		ServletOutputStream outputStream = response.getOutputStream();
-
-		response.setHeader(header, "");
-
-		Result result = Result.success("");
-
-		outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8"));
-
-		outputStream.flush();
-		outputStream.close();
-	}
-}
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginFailureHandler.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginFailureHandler.java
deleted file mode 100644
index 72abdbe..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginFailureHandler.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.mes.common.handler;
-
-import cn.hutool.json.JSONUtil;
-import com.mes.utils.Result;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.web.authentication.AuthenticationFailureHandler;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-@Component
-public class LoginFailureHandler implements AuthenticationFailureHandler {
-
-	@Override
-	public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
-
-		response.setContentType("application/json;charset=UTF-8");
-		ServletOutputStream outputStream = response.getOutputStream();
-
-		Result result = Result.error("鐢ㄦ埛鍚嶆垨瀵嗙爜閿欒");
-
-		outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8"));
-
-		outputStream.flush();
-		outputStream.close();
-	}
-}
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginSuccessHandler.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginSuccessHandler.java
deleted file mode 100644
index c5458bb..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginSuccessHandler.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.mes.common.handler;
-
-import cn.hutool.json.JSONUtil;
-import com.mes.common.utils.JwtUtil;
-import com.mes.utils.Result;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-@Component
-public class LoginSuccessHandler implements AuthenticationSuccessHandler {
-
-	private static final String header = "Authorization";
-
-	@Override
-	public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
-		response.setContentType("application/json;charset=UTF-8");
-		ServletOutputStream outputStream = response.getOutputStream();
-
-		// 鐢熸垚jwt锛屽苟鏀剧疆鍒拌姹傚ご涓�
-		String jwt = JwtUtil.generateToken(authentication.getName());
-		response.setHeader(header, jwt);
-
-		Result result = Result.success("");
-
-		outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8"));
-
-		outputStream.flush();
-		outputStream.close();
-	}
-
-}
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/FastJsonRedisSerializer.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/FastJsonRedisSerializer.java
deleted file mode 100644
index f8ab417..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/FastJsonRedisSerializer.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.mes.common.utils;
-
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.parser.ParserConfig;
-import com.alibaba.fastjson.serializer.SerializerFeature;
-import com.fasterxml.jackson.databind.JavaType;
-import com.fasterxml.jackson.databind.type.TypeFactory;
-import org.springframework.data.redis.serializer.RedisSerializer;
-import org.springframework.data.redis.serializer.SerializationException;
-
-import java.nio.charset.Charset;
-
-/**
- * @Author : zhoush
- * @Date: 2024/4/11 15:28
- * @Description:
- */
-public class FastJsonRedisSerializer<T> implements RedisSerializer<T> {
-
-    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
-
-    private Class<T> clazz;
-
-    static {
-        ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
-    }
-
-    public FastJsonRedisSerializer(Class<T> clazz) {
-        super();
-        this.clazz = clazz;
-    }
-
-    @Override
-    public byte[] serialize(T t) throws SerializationException {
-        if (t == null) {
-            return new byte[0];
-        }
-        return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);
-    }
-
-    @Override
-    public T deserialize(byte[] bytes) throws SerializationException {
-        if (bytes == null || bytes.length <= 0) {
-            return null;
-        }
-        String str = new String(bytes, DEFAULT_CHARSET);
-
-        return JSON.parseObject(str, clazz);
-    }
-
-
-    protected JavaType getJavaType(Class<?> clazz) {
-        return TypeFactory.defaultInstance().constructType(clazz);
-    }
-}
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/JwtUtil.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/JwtUtil.java
deleted file mode 100644
index f7af90a..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/JwtUtil.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.mes.common.utils;
-
-
-import io.jsonwebtoken.Claims;
-import io.jsonwebtoken.Jwts;
-import io.jsonwebtoken.SignatureAlgorithm;
-import lombok.Data;
-
-import java.util.Date;
-
-/**
- * @Author : zhoush
- * @Date: 2024/4/9 19:15
- * @Description:
- */
-@Data
-public class JwtUtil {
-
-    private static final long expire = 60 * 60 * 1000L;
-    private static final String secret = "beibo";
-    private static final String header = "Authorization";
-
-    // 鐢熸垚jwt
-    public static String generateToken(String username) {
-
-        Date nowDate = new Date();
-        Date expireDate = new Date(nowDate.getTime() + 1000 * expire);
-
-        return Jwts.builder()
-                .setHeaderParam("typ", "JWT")
-                .setSubject(username)
-                .setIssuedAt(nowDate)
-                .setExpiration(expireDate)// 7澶╅亷鏈�
-                .signWith(SignatureAlgorithm.HS512, secret)
-                .compact();
-    }
-
-    // 瑙f瀽jwt
-    public static Claims getClaimByToken(String jwt) {
-        try {
-            return Jwts.parser()
-                    .setSigningKey(secret)
-                    .parseClaimsJws(jwt)
-                    .getBody();
-        } catch (Exception e) {
-            return null;
-        }
-    }
-
-    // jwt鏄惁杩囨湡
-    public boolean isTokenExpired(Claims claims) {
-        return claims.getExpiration().before(new Date());
-    }
-
-}
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/RedisUtil.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/RedisUtil.java
deleted file mode 100644
index d11f2bc..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/RedisUtil.java
+++ /dev/null
@@ -1,235 +0,0 @@
-package com.mes.common.utils;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.redis.core.BoundSetOperations;
-import org.springframework.data.redis.core.HashOperations;
-import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.data.redis.core.ValueOperations;
-import org.springframework.stereotype.Component;
-
-import java.util.*;
-import java.util.concurrent.TimeUnit;
-
-/**
- * spring redis 宸ュ叿绫�
- **/
-@Component
-public class RedisUtil {
-    @Autowired
-    public RedisTemplate redisTemplate;
-
-    /**
-     * 缂撳瓨鍩烘湰鐨勫璞★紝Integer銆丼tring銆佸疄浣撶被绛�
-     *
-     * @param key   缂撳瓨鐨勯敭鍊�
-     * @param value 缂撳瓨鐨勫��
-     */
-    public <T> void setCacheObject(final String key, final T value) {
-        redisTemplate.opsForValue().set(key, value);
-    }
-
-    /**
-     * 缂撳瓨鍩烘湰鐨勫璞★紝Integer銆丼tring銆佸疄浣撶被绛�
-     *
-     * @param key      缂撳瓨鐨勯敭鍊�
-     * @param value    缂撳瓨鐨勫��
-     * @param timeout  鏃堕棿
-     * @param timeUnit 鏃堕棿棰楃矑搴�
-     */
-    public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) {
-        redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
-    }
-
-    /**
-     * 璁剧疆鏈夋晥鏃堕棿
-     *
-     * @param key     Redis閿�
-     * @param timeout 瓒呮椂鏃堕棿
-     * @return true=璁剧疆鎴愬姛锛沠alse=璁剧疆澶辫触
-     */
-    public boolean expire(final String key, final long timeout) {
-        return expire(key, timeout, TimeUnit.SECONDS);
-    }
-
-    /**
-     * 璁剧疆鏈夋晥鏃堕棿
-     *
-     * @param key     Redis閿�
-     * @param timeout 瓒呮椂鏃堕棿
-     * @param unit    鏃堕棿鍗曚綅
-     * @return true=璁剧疆鎴愬姛锛沠alse=璁剧疆澶辫触
-     */
-    public boolean expire(final String key, final long timeout, final TimeUnit unit) {
-        return redisTemplate.expire(key, timeout, unit);
-    }
-
-    /**
-     * 鑾峰緱缂撳瓨鐨勫熀鏈璞°��
-     *
-     * @param key 缂撳瓨閿��
-     * @return 缂撳瓨閿�煎搴旂殑鏁版嵁
-     */
-    public <T> T getCacheObject(final String key) {
-        ValueOperations<String, T> operation = redisTemplate.opsForValue();
-        return operation.get(key);
-    }
-
-    /**
-     * 鍒犻櫎鍗曚釜瀵硅薄
-     *
-     * @param key
-     */
-    public boolean deleteObject(final String key) {
-        return redisTemplate.delete(key);
-    }
-
-    /**
-     * 鍒犻櫎闆嗗悎瀵硅薄
-     *
-     * @param collection 澶氫釜瀵硅薄
-     * @return
-     */
-    public long deleteObject(final Collection collection) {
-        return redisTemplate.delete(collection);
-    }
-
-    /**
-     * 缂撳瓨List鏁版嵁
-     *
-     * @param key      缂撳瓨鐨勯敭鍊�
-     * @param dataList 寰呯紦瀛樼殑List鏁版嵁
-     * @return 缂撳瓨鐨勫璞�
-     */
-    public <T> long setCacheList(final String key, final List<T> dataList) {
-        Long count = redisTemplate.opsForList().rightPushAll(key, dataList);
-        return count == null ? 0 : count;
-    }
-
-    /**
-     * 鑾峰緱缂撳瓨鐨刲ist瀵硅薄
-     *
-     * @param key 缂撳瓨鐨勯敭鍊�
-     * @return 缂撳瓨閿�煎搴旂殑鏁版嵁
-     */
-    public <T> List<T> getCacheList(final String key) {
-        return redisTemplate.opsForList().range(key, 0, -1);
-    }
-
-    /**
-     * 缂撳瓨Set
-     *
-     * @param key     缂撳瓨閿��
-     * @param dataSet 缂撳瓨鐨勬暟鎹�
-     * @return 缂撳瓨鏁版嵁鐨勫璞�
-     */
-    public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet) {
-        BoundSetOperations<String, T> setOperation = redisTemplate.boundSetOps(key);
-        Iterator<T> it = dataSet.iterator();
-        while (it.hasNext()) {
-            setOperation.add(it.next());
-        }
-        return setOperation;
-    }
-
-    /**
-     * 鑾峰緱缂撳瓨鐨剆et
-     *
-     * @param key
-     * @return
-     */
-    public <T> Set<T> getCacheSet(final String key) {
-        return redisTemplate.opsForSet().members(key);
-    }
-
-    /**
-     * 缂撳瓨Map
-     *
-     * @param key
-     * @param dataMap
-     */
-    public <T> void setCacheMap(final String key, final Map<String, T> dataMap) {
-        if (dataMap != null) {
-            redisTemplate.opsForHash().putAll(key, dataMap);
-        }
-    }
-
-    /**
-     * 鑾峰緱缂撳瓨鐨凪ap
-     *
-     * @param key
-     * @return
-     */
-    public <T> Map<String, T> getCacheMap(final String key) {
-        return redisTemplate.opsForHash().entries(key);
-    }
-
-    /**
-     * 寰�Hash涓瓨鍏ユ暟鎹�
-     *
-     * @param key   Redis閿�
-     * @param hKey  Hash閿�
-     * @param value 鍊�
-     */
-    public <T> void setCacheMapValue(final String key, final String hKey, final T value) {
-        redisTemplate.opsForHash().put(key, hKey, value);
-    }
-
-    /**
-     * 鑾峰彇Hash涓殑鏁版嵁
-     *
-     * @param key  Redis閿�
-     * @param hKey Hash閿�
-     * @return Hash涓殑瀵硅薄
-     */
-    public <T> T getCacheMapValue(final String key, final String hKey) {
-        HashOperations<String, String, T> opsForHash = redisTemplate.opsForHash();
-        return opsForHash.get(key, hKey);
-    }
-
-    /**
-     * 鍒犻櫎Hash涓殑鏁版嵁
-     *
-     * @param key
-     * @param hkey
-     */
-    public void delCacheMapValue(final String key, final String hkey) {
-        HashOperations hashOperations = redisTemplate.opsForHash();
-        hashOperations.delete(key, hkey);
-    }
-
-    /**
-     * 鑾峰彇澶氫釜Hash涓殑鏁版嵁
-     *
-     * @param key   Redis閿�
-     * @param hKeys Hash閿泦鍚�
-     * @return Hash瀵硅薄闆嗗悎
-     */
-    public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys) {
-        return redisTemplate.opsForHash().multiGet(key, hKeys);
-    }
-
-    /**
-     * 鑾峰緱缂撳瓨鐨勫熀鏈璞″垪琛�
-     *
-     * @param pattern 瀛楃涓插墠缂�
-     * @return 瀵硅薄鍒楄〃
-     */
-    public Collection<String> keys(final String pattern) {
-        return redisTemplate.keys(pattern);
-    }
-
-    /**
-     * 鍒ゆ柇key鏄惁瀛樺湪
-     *
-     * @param key 閿�
-     * @return true 瀛樺湪 false涓嶅瓨鍦�
-     */
-    public boolean hasKey(String key) {
-        try {
-            return redisTemplate.hasKey(key);
-        } catch (Exception e) {
-            e.printStackTrace();
-            return false;
-        }
-    }
-}
\ No newline at end of file
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/UserInfoUtils.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/UserInfoUtils.java
deleted file mode 100644
index 292797c..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/UserInfoUtils.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.mes.common.utils;
-
-import com.mes.userinfo.entity.SysUser;
-
-/**
- * @Author : zhoush
- * @Date: 2024/4/25 15:41
- * @Description:
- */
-public class UserInfoUtils {
-    private static InheritableThreadLocal<SysUser> tokenPool = new InheritableThreadLocal<SysUser>();
-
-    public static SysUser get() {
-        return tokenPool.get();
-    }
-
-    public static void set(SysUser user) {
-        tokenPool.set(user);
-    }
-
-    public static void remove() {
-        if (get() != null) {
-            tokenPool.remove();
-        }
-    }
-}
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/WebUtils.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/WebUtils.java
deleted file mode 100644
index 618144d..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/WebUtils.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.mes.common.utils;
-
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-/**
- * @Author : zhoush
- * @Date: 2024/4/9 19:16
- * @Description:
- */
-public class WebUtils {
-    /**
-     * 灏嗗瓧绗︿覆娓叉煋鍒板鎴风
-     *
-     * @param response 娓叉煋瀵硅薄
-     * @param string   寰呮覆鏌撶殑瀛楃涓�
-     * @return null
-     */
-    public static String renderString(HttpServletResponse response, String string) {
-        try {
-            response.setStatus(200);
-            response.setContentType("application/json");
-            response.setCharacterEncoding("utf-8");
-            response.getWriter().print(string);
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
-}
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/controller/SysMenuController.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/controller/SysMenuController.java
deleted file mode 100644
index 4ca0cb9..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/controller/SysMenuController.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package com.mes.menu.controller;
-
-import com.mes.entity.request.GeneralRequest;
-import com.mes.menu.entity.SysMenu;
-import com.mes.menu.service.SysMenuService;
-import com.mes.utils.Result;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author zhoush
- * @since 2024-04-11
- */
-@Api(description = "鑿滃崟绠$悊")
-@RestController
-@RequestMapping("/sys/menu")
-public class SysMenuController {
-
-    @Autowired
-    private SysMenuService sysMenuService;
-
-    @ApiOperation("鏂板鑿滃崟")
-    @PostMapping("/save")
-//    @PreAuthorize("hasAuthority('sys:menu:save')")
-    public Result save(@Validated @RequestBody SysMenu sysMenu) {
-        return Result.success(sysMenuService.save(sysMenu));
-    }
-
-    @ApiOperation("淇敼鑿滃崟淇℃伅")
-    @PostMapping("/updateMenu")
-//    @PreAuthorize("hasAuthority('sys:menu:update')")
-    public Result updateMenu(@Validated @RequestBody SysMenu sysMenu) {
-        sysMenuService.updateMenu(sysMenu);
-        return Result.success(sysMenu);
-    }
-
-    @ApiOperation("鑾峰彇鐢ㄦ埛鏈夋潈闄愮殑鎵�鏈夎彍鍗�")
-    @GetMapping("/getMenuTree")
-    public Result<List<SysMenu>> getMenuTree(GeneralRequest request) {
-        return Result.success(sysMenuService.getMenuTree(request));
-    }
-
-    @ApiOperation("鑾峰彇鐢ㄦ埛鐨勬潈闄�")
-    @GetMapping("/getAuthorityInfo")
-    public Result<List<String>> getAuthorityInfo() {
-        return Result.success(sysMenuService.getAuthorityInfo());
-    }
-
-
-    @ApiOperation("鐢ㄦ埛褰撳墠鐢ㄦ埛鐨勮彍鍗曞拰鏉冮檺淇℃伅")
-    @GetMapping("/nav")
-    public Result<Map<Object, Object>> nav() {
-        return Result.success(sysMenuService.nav());
-    }
-
-    @ApiOperation("鍒犻櫎鑿滃崟")
-    @PostMapping("/deleteMenu")
-//    @PreAuthorize("hasAuthority('sys:menu:delete')")
-    public Result<String> deleteMenu(Long menuId) {
-        return Result.success(sysMenuService.deleteMenu(menuId));
-    }
-
-    @ApiOperation("鎵归噺鍒犻櫎鑿滃崟")
-    @PostMapping("/batchDeleteMenu")
-//    @PreAuthorize("hasAuthority('sys:menu:delete')")
-    public Result<String> batchDeleteMenu(@RequestBody List<Long> menuIds) {
-        return Result.success(sysMenuService.batchDeleteMenu(menuIds));
-    }
-
-}
-
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/entity/SysMenu.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/entity/SysMenu.java
deleted file mode 100644
index 37476c6..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/entity/SysMenu.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package com.mes.menu.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 lombok.experimental.Accessors;
-
-import java.io.Serializable;
-import java.util.Date;
-import java.util.List;
-
-/**
- * <p>
- *
- * </p>
- *
- * @author zhoush
- * @since 2024-04-13
- */
-@Data
-@EqualsAndHashCode(callSuper = false)
-@Accessors(chain = true)
-public class SysMenu implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 鑷id
-     */
-    @TableId(value = "id", type = IdType.AUTO)
-    private Long id;
-
-    /**
-     * 鐖秈d
-     */
-    private Long parentId;
-
-    /**
-     * 妯″潡鍚嶇О
-     */
-    private String menuName;
-
-    /**
-     * 鍥炬爣
-     */
-    private String icon;
-
-    /**
-     * 鍦板潃
-     */
-    private String url;
-
-    /**
-     * 璇█绫诲瀷
-     */
-    private String languageType;
-
-    /**
-     * 鐘舵��
-     */
-    private Integer status;
-
-    /**
-     * 鎺掑簭
-     */
-    private String listSort;
-
-    /**
-     * 鍒涘缓鏃堕棿
-     */
-    private Date createTime;
-
-    /**
-     * 鏉冮檺
-     */
-    private String perms;
-
-    /**
-     * 瀛愯彍鍗�
-     */
-    @TableField(exist = false)
-    private List<SysMenu> children;
-
-
-}
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/mapper/SysMenuMapper.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/mapper/SysMenuMapper.java
deleted file mode 100644
index b1ef2d6..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/mapper/SysMenuMapper.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.mes.menu.mapper;
-
-import com.github.yulichang.base.MPJBaseMapper;
-import com.mes.menu.entity.SysMenu;
-import org.apache.ibatis.annotations.Mapper;
-
-import java.util.List;
-
-/**
- * <p>
- * 鑿滃崟琛� Mapper 鎺ュ彛
- * </p>
- *
- * @author zhoush
- * @since 2024-04-11
- */
-@Mapper
-public interface SysMenuMapper extends MPJBaseMapper<SysMenu> {
-
-    List<String> selectPermsByUserId(long parseLong);
-}
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/service/SysMenuService.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/service/SysMenuService.java
deleted file mode 100644
index 014d1cd..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/service/SysMenuService.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package com.mes.menu.service;
-
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.mes.entity.request.GeneralRequest;
-import com.mes.menu.entity.SysMenu;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * <p>
- * 鑿滃崟琛� 鏈嶅姟绫�
- * </p>
- *
- * @author zhoush
- * @since 2024-04-11
- */
-public interface SysMenuService extends IService<SysMenu> {
-
-    /**
-     * 鏇存柊鑿滃崟淇℃伅
-     *
-     * @param menu
-     * @return
-     */
-    SysMenu updateMenu(SysMenu menu);
-
-    /**
-     * 鑾峰彇鐢ㄦ埛鏈夋潈闄愮殑鑿滃崟鏍�
-     *
-     * @return
-     */
-    List<SysMenu> getMenuTree(GeneralRequest request);
-
-    /**
-     * 鑾峰彇鐢ㄦ埛鐨勬潈闄�
-     *
-     * @return
-     */
-    List<String> getAuthorityInfo();
-
-
-    /**
-     * 鑾峰彇鐢ㄦ埛鑿滃崟鍙婃潈闄愪俊鎭�
-     *
-     * @return
-     */
-    Map<Object, Object> nav();
-
-    /**
-     * 鍒犻櫎鑿滃崟淇℃伅
-     *
-     * @param menuId
-     * @return
-     */
-    String deleteMenu(Long menuId);
-
-    /**
-     * 鎵归噺鍒犻櫎鑿滃崟淇℃伅
-     *
-     * @param menuIds
-     * @return
-     */
-    String batchDeleteMenu(List<Long> menuIds);
-
-}
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/service/impl/SysMenuServiceImpl.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/service/impl/SysMenuServiceImpl.java
deleted file mode 100644
index 597f93c..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/service/impl/SysMenuServiceImpl.java
+++ /dev/null
@@ -1,148 +0,0 @@
-package com.mes.menu.service.impl;
-
-import cn.hutool.core.map.MapUtil;
-import cn.hutool.json.JSONUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.github.yulichang.wrapper.MPJLambdaWrapper;
-import com.mes.common.utils.UserInfoUtils;
-import com.mes.entity.request.GeneralRequest;
-import com.mes.menu.entity.SysMenu;
-import com.mes.menu.mapper.SysMenuMapper;
-import com.mes.menu.service.SysMenuService;
-import com.mes.role.entity.SysRoleMenu;
-import com.mes.role.service.SysRoleMenuService;
-import com.mes.userinfo.entity.SysUser;
-import com.mes.userinfo.entity.SysUserRole;
-import com.mes.userinfo.mapper.SysUserRoleMapper;
-import com.mes.userinfo.service.SysUserService;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-/**
- * <p>
- * 鑿滃崟琛� 鏈嶅姟瀹炵幇绫�
- * </p>
- *
- * @author zhoush
- * @since 2024-04-11
- */
-@Service
-@Slf4j
-public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements SysMenuService {
-
-    @Autowired
-    SysUserService sysUserService;
-
-    @Autowired
-    SysUserRoleMapper sysUserRoleMapper;
-
-    @Autowired
-    SysRoleMenuService sysRoleMenuService;
-
-    @Override
-    public SysMenu updateMenu(SysMenu menu) {
-        baseMapper.updateById(menu);
-        // 娓呴櫎鎵�鏈変笌璇ヨ彍鍗曠浉鍏崇殑鏉冮檺缂撳瓨
-        sysUserService.clearUserAuthorityInfoByMenuId(menu.getId());
-        return menu;
-    }
-
-    @Override
-    public List<SysMenu> getMenuTree(GeneralRequest request) {
-        //todo:闇�瑕佸厛鑾峰彇鐢ㄦ埛鐨勮鑹诧紝瑙掕壊涓嬬殑鑿滃崟鏉冮檺锛屾嬁鍒拌彍鍗昳d鑾峰彇鎵�鏈夎彍鍗�
-        SysUser user = UserInfoUtils.get();
-        MPJLambdaWrapper<SysUserRole> wrapper = new MPJLambdaWrapper<>();
-
-        wrapper.selectAll(SysMenu.class).distinct()
-                .innerJoin(SysUser.class, SysUser::getId, SysUserRole::getUserId)
-                .innerJoin(SysRoleMenu.class, SysRoleMenu::getRoleId, SysUserRole::getRoleId)
-                .innerJoin(SysMenu.class, SysMenu::getId, SysRoleMenu::getMenuId)
-                .eq(SysUser::getId, user.getId())
-                .like(StringUtils.isNotBlank(request.getKey()), SysMenu::getMenuName, request.getKey());
-
-        //
-        List<SysMenu> menuList = sysUserRoleMapper.selectJoinList(SysMenu.class, wrapper);
-        log.info("userinfos:{}",menuList);
-        return create(menuList);
-    }
-
-    @Override
-    public List<String> getAuthorityInfo() {
-        SysUser user = UserInfoUtils.get();
-        log.info("鑾峰彇鐢ㄦ埛淇℃伅锛岀敤鎴峰悕涓簕}", user);
-        // 鑾峰彇鏉冮檺淇℃伅
-        // ROLE_admin,ROLE_normal,sys:user:list,....
-        return sysUserService.getUserAuthorityInfo(user.getId());
-    }
-
-    @Override
-    public Map<Object, Object> nav() {
-        List<SysMenu> menuTree = getMenuTree(new GeneralRequest());
-        List<String> authorityInfo = getAuthorityInfo();
-        return MapUtil.builder().put("authoritys", authorityInfo)
-                .put("tree", menuTree).map();
-    }
-
-    @Override
-    public String deleteMenu(Long menuId) {
-        int count = this.count(new LambdaQueryWrapper<SysMenu>().eq(SysMenu::getParentId, menuId));
-        if (count > 0) {
-            return "鏃犳硶鍒犻櫎,璇峰厛鍒犻櫎瀛愯彍鍗�";
-        }
-
-        // 娓呴櫎鎵�鏈変笌璇ヨ彍鍗曠浉鍏崇殑鏉冮檺缂撳瓨
-        sysUserService.clearUserAuthorityInfoByMenuId(menuId);
-
-        this.removeById(menuId);
-
-        // 鍚屾鍒犻櫎涓棿鍏宠仈琛�
-        sysRoleMenuService.remove(new LambdaQueryWrapper<SysRoleMenu>().eq(SysRoleMenu::getMenuId, menuId));
-        return "鍒犻櫎鎴愬姛";
-    }
-
-    @Override
-    public String batchDeleteMenu(List<Long> menuIds) {
-        menuIds.stream().forEach(e -> deleteMenu(e));
-        return "鎵归噺鍒犻櫎鎴愬姛";
-    }
-
-
-    /**
-     * 灏嗘暟鎹簱涓煡璇㈠嚭鏉ョ殑list闆嗗悎浼犲叆姝ゆ柟娉曞嵆鍙幏寰楁帓鎴愭爲褰㈢粨鏋勭殑list闆嗗悎
-     *
-     * @param lists
-     * @return
-     */
-    public List<SysMenu> create(List<SysMenu> lists) {
-        List<SysMenu> deptTreeList = lists.stream()
-                .filter(item -> item.getParentId() == 0)
-                .map(item -> {
-                    item.setChildren(getChildren(item, lists));
-                    return item;
-                }).collect(Collectors.toList());
-        return deptTreeList;
-    }
-
-    /**
-     * 姝ゆ柟娉曞皢琚�掑綊璋冪敤
-     *
-     * @param menu
-     * @param menus
-     * @return
-     */
-    private List<SysMenu> getChildren(SysMenu menu, List<SysMenu> menus) {
-        List<SysMenu> res = menus.stream()
-                .filter(item -> item.getParentId().equals(menu.getId()))
-                .collect(Collectors.toList());
-        log.info("鑿滃崟鏍�:{}", JSONUtil.toJsonStr(res));
-        return res;
-    }
-
-}
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/controller/SysRoleController.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/controller/SysRoleController.java
deleted file mode 100644
index cb6da80..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/controller/SysRoleController.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package com.mes.role.controller;
-
-
-import com.mes.entity.request.GeneralRequest;
-import com.mes.role.entity.SysRole;
-import com.mes.role.entity.vo.SysRoleVO;
-import com.mes.role.service.SysRoleService;
-import com.mes.utils.Result;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.List;
-
-/**
- * @author zhoush
- * @since 2024-04-11
- */
-@Api(description = "瑙掕壊绠$悊")
-@RestController
-@RequestMapping("/sys/role")
-public class SysRoleController {
-
-    @Autowired
-    private SysRoleService sysRoleService;
-
-    @ApiOperation("鏂板瑙掕壊鍙婅鑹蹭笅鐨勬潈闄愪俊鎭�")
-    @PostMapping("/saveRole")
-//    @PreAuthorize("hasAuthority('sys:role:save')")
-    public Result<SysRole> saveRole(@Validated @RequestBody SysRoleVO sysRoleVO) {
-        return Result.success(sysRoleService.saveRole(sysRoleVO));
-    }
-
-    @ApiOperation("缂栬緫瑙掕壊鍙婅鑹蹭笅鐨勬潈闄愪俊鎭�")
-    @PostMapping("/updateRole")
-//    @PreAuthorize("hasAuthority('sys:role:save')")
-    public Result<String> updateRole(@Validated @RequestBody SysRoleVO sysRoleVO) {
-        return Result.success(sysRoleService.updateRole(sysRoleVO));
-    }
-
-    @ApiOperation("鏌ヨ瑙掕壊鍙婅鑹蹭笅鐨勬潈闄愪俊鎭�")
-    @PostMapping("/queryRole")
-//    @PreAuthorize("hasAuthority('sys:role:save')")
-    public Result<List<SysRoleVO>> queryRole(@Validated @RequestBody GeneralRequest request) {
-        return Result.success(sysRoleService.queryRole(request));
-    }
-
-
-    @ApiOperation("鍒犻櫎瑙掕壊鍙婅鑹蹭笅鐨勬潈闄愪俊鎭�")
-    @PostMapping("/delete")
-//    @PreAuthorize("hasAuthority('sys:role:delete')")
-    @Transactional
-    public Result<String> deleteRole(@RequestBody List<Long> ids) {
-        return Result.success(sysRoleService.deleteRole(ids));
-    }
-
-}
\ No newline at end of file
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRole.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRole.java
deleted file mode 100644
index 14fd4a3..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRole.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.mes.role.entity;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-import java.io.Serializable;
-
-/**
- * <p>
- * 瑙掕壊琛�
- * </p>
- *
- * @author zhoush
- * @since 2024-04-11
- */
-@Data
-@EqualsAndHashCode(callSuper = false)
-public class SysRole implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    @TableId(value = "id", type = IdType.AUTO)
-    private Long id;
-
-    private String name;
-
-    /**
-     * 瑙掕壊鏉冮檺瀛楃涓�
-     */
-    private String roleKey;
-
-    /**
-     * 瑙掕壊鐘舵�侊紙0姝e父 1鍋滅敤锛�
-     */
-    private String status;
-
-    /**
-     * 鍒犻櫎鏍囧織
-     */
-    private Integer delFlag;
-
-    /**
-     * 澶囨敞
-     */
-    private String remark;
-
-
-}
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRoleMenu.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRoleMenu.java
deleted file mode 100644
index aae2aed..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRoleMenu.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.mes.role.entity;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-import java.io.Serializable;
-
-/**
- * <p>
- *
- * </p>
- *
- * @author zhoush
- * @since 2024-04-11
- */
-@Data
-@EqualsAndHashCode(callSuper = false)
-public class SysRoleMenu implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 瑙掕壊ID
-     */
-    @TableId(type = IdType.NONE)
-    private Long roleId;
-
-    /**
-     * 鑿滃崟id
-     */
-    private Long menuId;
-
-
-}
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/vo/SysRoleVO.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/vo/SysRoleVO.java
deleted file mode 100644
index 45efd61..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/vo/SysRoleVO.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.mes.role.entity.vo;
-
-import com.mes.menu.entity.SysMenu;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * @Author : zhoush
- * @Date: 2024/4/26 13:57
- * @Description:
- */
-@Api(description = "瑙掕壊淇℃伅")
-@Data
-public class SysRoleVO implements Serializable {
-
-    @ApiModelProperty(hidden = true)
-    private static final long serialVersionUID = 1L;
-
-    @ApiModelProperty(value = "瑙掕壊ID", position = 2)
-    private Long id;
-
-    @ApiModelProperty(value = "瑙掕壊鍚嶇О", position = 3)
-    private String name;
-
-    @ApiModelProperty(value = "瑙掕壊鏉冮檺瀛楃涓�", position = 4)
-    private String roleKey;
-
-    @ApiModelProperty(value = "瑙掕壊鐘舵�侊紙0姝e父 1鍋滅敤锛�", position = 5)
-    private String status;
-
-    @ApiModelProperty(value = "鍒犻櫎鏍囧織", position = 6)
-    private Integer delFlag;
-
-    @ApiModelProperty(value = "澶囨敞", position = 7)
-    private String remark;
-
-    @ApiModelProperty(value = "瑙掕壊鑿滃崟淇℃伅", position = 8)
-    private List<SysMenu> menuList;
-
-}
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMapper.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMapper.java
deleted file mode 100644
index d9251c1..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMapper.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.mes.role.mapper;
-
-import com.github.yulichang.base.MPJBaseMapper;
-import com.mes.role.entity.SysRole;
-import org.apache.ibatis.annotations.Mapper;
-
-/**
- * <p>
- * 瑙掕壊琛� Mapper 鎺ュ彛
- * </p>
- *
- * @author zhoush
- * @since 2024-04-11
- */
-@Mapper
-public interface SysRoleMapper extends MPJBaseMapper<SysRole> {
-
-}
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMenuMapper.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMenuMapper.java
deleted file mode 100644
index 451d7fe..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMenuMapper.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.mes.role.mapper;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.mes.role.entity.SysRoleMenu;
-import org.apache.ibatis.annotations.Mapper;
-
-/**
- * <p>
- * Mapper 鎺ュ彛
- * </p>
- *
- * @author zhoush
- * @since 2024-04-11
- */
-@Mapper
-public interface SysRoleMenuMapper extends BaseMapper<SysRoleMenu> {
-
-}
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/xml/SysRoleMapper.xml b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/xml/SysRoleMapper.xml
deleted file mode 100644
index 9a0cd27..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/xml/SysRoleMapper.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?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.role.mapper.SysRoleMapper">
-
-</mapper>
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/xml/SysRoleMenuMapper.xml b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/xml/SysRoleMenuMapper.xml
deleted file mode 100644
index af0749b..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/xml/SysRoleMenuMapper.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?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.role.mapper.SysRoleMenuMapper">
-
-</mapper>
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleMenuService.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleMenuService.java
deleted file mode 100644
index e4d23dc..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleMenuService.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.mes.role.service;
-
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.mes.role.entity.SysRoleMenu;
-
-/**
- * <p>
- * 鏈嶅姟绫�
- * </p>
- *
- * @author zhoush
- * @since 2024-04-11
- */
-public interface SysRoleMenuService extends IService<SysRoleMenu> {
-
-}
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleService.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleService.java
deleted file mode 100644
index 9592106..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleService.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package com.mes.role.service;
-
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.mes.entity.request.GeneralRequest;
-import com.mes.role.entity.SysRole;
-import com.mes.role.entity.vo.SysRoleVO;
-
-import java.util.List;
-
-/**
- * <p>
- * 瑙掕壊琛� 鏈嶅姟绫�
- * </p>
- *
- * @author zhoush
- * @since 2024-04-11
- */
-public interface SysRoleService extends IService<SysRole> {
-
-    /**
-     * 鍒涘缓瑙掕壊淇℃伅
-     *
-     * @param sysRoleVO
-     * @return
-     */
-    SysRole saveRole(SysRoleVO sysRoleVO);
-
-    /**
-     * 淇敼瑙掕壊淇℃伅鍙婃潈闄�
-     *
-     * @param sysRoleVO
-     * @return
-     */
-    String updateRole(SysRoleVO sysRoleVO);
-
-    /**
-     * 鎸夌収瑙掕壊鍚嶆煡璇㈣鑹蹭俊鎭�
-     *
-     * @param request
-     * @return
-     */
-    List<SysRoleVO> queryRole(GeneralRequest request);
-
-    /**
-     * 鏌ヨ瑙掕壊鍙婅鑹蹭笅鐨勬潈闄愪俊鎭�
-     *
-     * @param ids
-     * @return
-     */
-    String deleteRole(List<Long> ids);
-}
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleMenuServiceImpl.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleMenuServiceImpl.java
deleted file mode 100644
index 4c8a475..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleMenuServiceImpl.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.mes.role.service.impl;
-
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.mes.role.entity.SysRoleMenu;
-import com.mes.role.mapper.SysRoleMenuMapper;
-import com.mes.role.service.SysRoleMenuService;
-import org.springframework.stereotype.Service;
-
-/**
- * <p>
- * 鏈嶅姟瀹炵幇绫�
- * </p>
- *
- * @author zhoush
- * @since 2024-04-11
- */
-@Service
-public class SysRoleMenuServiceImpl extends ServiceImpl<SysRoleMenuMapper, SysRoleMenu> implements SysRoleMenuService {
-
-}
diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleServiceImpl.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleServiceImpl.java
deleted file mode 100644
index 2d08603..0000000
--- a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleServiceImpl.java
+++ /dev/null
@@ -1,123 +0,0 @@
-package com.mes.role.service.impl;
-
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.github.yulichang.wrapper.MPJLambdaWrapper;
-import com.mes.entity.request.GeneralRequest;
-import com.mes.menu.entity.SysMenu;
-import com.mes.role.entity.SysRole;
-import com.mes.role.entity.SysRoleMenu;
-import com.mes.role.entity.vo.SysRoleVO;
-import com.mes.role.mapper.SysRoleMapper;
-import com.mes.role.service.SysRoleMenuService;
-import com.mes.role.service.SysRoleService;
-import com.mes.userinfo.entity.SysUserRole;
-import com.mes.userinfo.service.SysUserRoleService;
-import com.mes.userinfo.service.SysUserService;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.StringUtils;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * <p>
- * 瑙掕壊琛� 鏈嶅姟瀹炵幇绫�
- * </p>
- *
- * @author zhoush
- * @since 2024-04-11
- */
-@Service
-@Slf4j
-public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements SysRoleService {
-
-    @Autowired
-    SysRoleMenuService sysRoleMenuService;
-
-    @Autowired
-    SysUserService sysUserService;
-
-    @Autowired
-    SysUserRoleService sysUserRoleService;
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public SysRole saveRole(SysRoleVO sysRoleVO) {
-        log.info("淇濆瓨瑙掕壊淇℃伅锛岀敓鎴愬搴旂殑瑙掕壊id");
-        SysRole sysRole = new SysRole();
-        BeanUtils.copyProperties(sysRoleVO, sysRole);
-        this.save(sysRole);
-        //淇濆瓨瑙掕壊鏉冮檺淇℃伅
-        saveRoleMenu(sysRole.getId(), sysRoleVO.getMenuList());
-        return sysRole;
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public String updateRole(SysRoleVO sysRoleVO) {
-        log.info("淇濆瓨瑙掕壊淇℃伅锛岀敓鎴愬搴旂殑瑙掕壊id");
-        SysRole sysRole = new SysRole();
-        BeanUtils.copyProperties(sysRoleVO, sysRole);
-        this.updateById(sysRole);
-        //淇濆瓨瑙掕壊鏉冮檺淇℃伅
-        return saveRoleMenu(sysRole.getId(), sysRoleVO.getMenuList());
-    }
-
-    @Override
-    public List<SysRoleVO> queryRole(GeneralRequest request) {
-        MPJLambdaWrapper<SysRole> wrapper = new MPJLambdaWrapper<>();
-        wrapper.selectAll(SysRole.class)
-                .selectCollection(SysMenu.class, SysRoleVO::getMenuList)
-                .leftJoin(SysRoleMenu.class, SysRoleMenu::getRoleId, SysRole::getId)
-                .leftJoin(SysMenu.class, SysMenu::getId, SysRoleMenu::getMenuId)
-                .like(StringUtils.hasText(request.getKey()), SysRole::getName, request.getKey());
-        return baseMapper.selectJoinList(SysRoleVO.class, wrapper);
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public String deleteRole(List<Long> ids) {
-        log.info("鍒犻櫎瑙掕壊淇℃伅");
-        this.removeByIds(ids);
-
-        log.info("鍒犻櫎涓棿琛ㄤ俊鎭�");
-        sysUserRoleService.remove(new LambdaQueryWrapper<SysUserRole>().in(SysUserRole::getRoleId, ids));
-        sysRoleMenuService.remove(new LambdaQueryWrapper<SysRoleMenu>().in(SysRoleMenu::getRoleId, ids));
-
-        log.info("娓呯┖缂撳瓨涓殑鏉冮檺淇℃伅");
-        ids.stream().forEach(id -> sysUserService.clearUserAuthorityInfoByRoleId(id));
-        return "success";
-    }
-
-    /**
-     * 淇濆瓨瑙掕壊鏉冮檺淇℃伅
-     *
-     * @param roleId
-     * @param menuList
-     * @return
-     */
-    private String saveRoleMenu(Long roleId, List<SysMenu> menuList) {
-        log.info("閰嶇疆瑙掕壊鑿滃崟鍏冲績");
-        List<SysRoleMenu> roleMenuList = menuList.stream().map(menu -> {
-            SysRoleMenu roleMenu = new SysRoleMenu();
-            roleMenu.setRoleId(roleId);
-            roleMenu.setMenuId(menu.getId());
-            return roleMenu;
-        }).collect(Collectors.toList());
-        log.info("娓呯┖瑙掕壊鏉冮檺琛ㄤ腑璇ヨ鑹蹭俊鎭�");
-
-
-        // 鍏堝垹闄ゅ師鏉ョ殑璁板綍锛屽啀淇濆瓨鏂扮殑
-        sysRoleMenuService.remove(new LambdaQueryWrapper<SysRoleMenu>().eq(SysRoleMenu::getRoleId, roleId));
-        sysRoleMenuService.saveBatch(roleMenuList);
-
-        // 鍒犻櫎缂撳瓨
-        sysUserService.clearUserAuthorityInfoByRoleId(roleId);
-        return "success";
-    }
-}
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/workstation/mapper/LoadGlassMapper.java b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/workstation/mapper/LoadGlassMapper.java
deleted file mode 100644
index 93ba7fb..0000000
--- a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/workstation/mapper/LoadGlassMapper.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.mes.workstation.mapper;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.mes.workstation.entity.UpWorkstation;
-import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Select;
-
-import java.util.Map;
-
-@Mapper
-public interface LoadGlassMapper extends BaseMapper<UpWorkstation> {
-    //鍒ゆ柇浼樺厛宸ヤ綅鍚哥墖
-    @Select("select b.layout_sequence,a.number from up_workstation a left join up_patten_usage b " +
-            "on a.pattern_width=b.width and a.pattern_height=b.height " +
-            "and a.pattern_thickness=b.thickness where a.workstation_id=#{id}")
-    Map<String, Object> selectPriority(int id);
-
-}
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-cz.yml b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-cz.yml
index 9918e23..1d19003 100644
--- a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-cz.yml
+++ b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-cz.yml
@@ -14,6 +14,11 @@
           username: root
           password: beibo.123/
           driver-class-name: com.mysql.cj.jdbc.Driver
+        sd:
+            url: jdbc:mysql://192.168.1.199:3306/sd?serverTimezone=GMT%2b8
+            username: root
+            password: beibo.123/
+            driver-class-name: com.mysql.cj.jdbc.Driver
   cloud:
     nacos:
       discovery:
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-dev.yml b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-dev.yml
index 66f9c31..a8a4157 100644
--- a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-dev.yml
+++ b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-dev.yml
@@ -14,16 +14,11 @@
           username: root
           password: beibo.123/
           driver-class-name: com.mysql.cj.jdbc.Driver
-#        hangzhoumes:
-#          url: jdbc:mysql://10.153.19.150:3306/hangzhoumes?serverTimezone=GMT%2b8
-#          username: root
-#          password: beibo.123/
-#          driver-class-name: com.mysql.cj.jdbc.Driver
-#        pp:
-#          url: jdbc:mysql://10.153.19.150:3306/pp?serverTimezone=GMT%2b8
-#          username: root
-#          password: beibo.123/
-#          driver-class-name: com.mysql.cj.jdbc.Driver
+        sd:
+          url: jdbc:mysql://192.168.1.199:3306/sd?serverTimezone=GMT%2b8
+          username: root
+          password: beibo.123/
+          driver-class-name: com.mysql.cj.jdbc.Driver
   cloud:
     nacos:
       discovery:
diff --git a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-prod.yml b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-prod.yml
index c372c41..2c49cb7 100644
--- a/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-prod.yml
+++ b/hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-prod.yml
@@ -14,6 +14,11 @@
           username: root
           password: beibo.123/
           driver-class-name: com.mysql.cj.jdbc.Driver
+        sd:
+            url: jdbc:mysql://192.168.1.199:3306/sd?serverTimezone=GMT%2b8
+            username: root
+            password: beibo.123/
+            driver-class-name: com.mysql.cj.jdbc.Driver
   cloud:
     nacos:
       discovery:
diff --git a/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-cz.yml b/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-cz.yml
index 0b433b2..a3a77e9 100644
--- a/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-cz.yml
+++ b/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-cz.yml
@@ -4,14 +4,25 @@
       primary: hangzhoumes #璁剧疆榛樿鐨勬暟鎹簮鎴栬�呮暟鎹簮缁�,榛樿鍊煎嵆涓簃aster
       strict: false #璁剧疆涓ユ牸妯″紡,榛樿false涓嶅惎鍔�. 鍚姩鍚庡湪鏈尮閰嶅埌鎸囧畾鏁版嵁婧愭椂鍊欏洖鎶涘嚭寮傚父,涓嶅惎鍔ㄤ細浣跨敤榛樿鏁版嵁婧�.
       datasource:
+#        hangzhoumes:
+#          url: jdbc:mysql://192.168.1.199:3306/hangzhoumes?serverTimezone=GMT%2b8
+#          username: root
+#          password: beibo.123/
+#          driver-class-name: com.mysql.cj.jdbc.Driver
+#
+#        salve_hangzhoumes:
+#          url: jdbc:sqlserver://192.168.10.2:1433;databasename=hangzhoumes
+#          username: sa
+#          password: beibo.123/
+#          driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
         hangzhoumes:
-          url: jdbc:mysql://192.168.1.199:3306/hangzhoumes?serverTimezone=GMT%2b8
+          url: jdbc:mysql://10.153.19.150:3306/hangzhoumes?serverTimezone=GMT%2b8
           username: root
           password: beibo.123/
           driver-class-name: com.mysql.cj.jdbc.Driver
 
         salve_hangzhoumes:
-          url: jdbc:sqlserver://192.168.10.2:1433;databasename=hangzhoumes
+          url: jdbc:sqlserver://10.153.19.150:1433;databasename=hangzhoumes
           username: sa
           password: beibo.123/
           driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
diff --git a/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-dev.yml b/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-dev.yml
index a5bc31d..b3eae47 100644
--- a/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-dev.yml
+++ b/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-dev.yml
@@ -4,13 +4,23 @@
       primary: hangzhoumes #璁剧疆榛樿鐨勬暟鎹簮鎴栬�呮暟鎹簮缁�,榛樿鍊煎嵆涓簃aster
       strict: false #璁剧疆涓ユ牸妯″紡,榛樿false涓嶅惎鍔�. 鍚姩鍚庡湪鏈尮閰嶅埌鎸囧畾鏁版嵁婧愭椂鍊欏洖鎶涘嚭寮傚父,涓嶅惎鍔ㄤ細浣跨敤榛樿鏁版嵁婧�.
       datasource:
+#        hangzhoumes:
+#          url: jdbc:mysql://127.0.0.1:3306/hangzhoumes?serverTimezone=GMT%2b8
+#          username: root
+#          password: beibo.123/
+#          driver-class-name: com.mysql.cj.jdbc.Driver
+#        salve_hangzhoumes:
+#          url: jdbc:sqlserver://127.0.0.1:1433;databasename=hangzhoumes
+#          username: sa
+#          password: beibo.123/
+#          driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
         hangzhoumes:
-          url: jdbc:mysql://127.0.0.1:3306/hangzhoumes?serverTimezone=GMT%2b8
+          url: jdbc:mysql:10.153.19.150:3306/hangzhoumes?serverTimezone=GMT%2b8
           username: root
           password: beibo.123/
           driver-class-name: com.mysql.cj.jdbc.Driver
         salve_hangzhoumes:
-          url: jdbc:sqlserver://127.0.0.1:1433;databasename=hangzhoumes
+          url: jdbc:sqlserver://10.153.19.150:1433;databasename=hangzhoumes
           username: sa
           password: beibo.123/
           driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
diff --git a/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application.yml b/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application.yml
index 0a70a4a..12e113b 100644
--- a/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application.yml
+++ b/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application.yml
@@ -2,7 +2,7 @@
   port: 8084
 spring:
   profiles:
-    active: cz
+    active: dev
   application:
     name: temperingGlass
 mybatis-plus:
diff --git a/hangzhoumesParent/moduleService/TemperingGlassModule/src/test/java/com/mes/TemperingApplicationTest.java b/hangzhoumesParent/moduleService/TemperingGlassModule/src/test/java/com/mes/TemperingApplicationTest.java
index e5e4608..d6edffc 100644
--- a/hangzhoumesParent/moduleService/TemperingGlassModule/src/test/java/com/mes/TemperingApplicationTest.java
+++ b/hangzhoumesParent/moduleService/TemperingGlassModule/src/test/java/com/mes/TemperingApplicationTest.java
@@ -1,60 +1,60 @@
-//package com.mes;
-//
-//import com.mes.temperingglass.entity.TemperingGlassInfo;
-//import com.mes.temperingglass.service.TemperingAgoService;
-//import lombok.extern.slf4j.Slf4j;
-//import org.junit.Test;
-//import org.junit.runner.RunWith;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.boot.test.context.SpringBootTest;
-//import org.springframework.test.context.junit4.SpringRunner;
-//
-//import java.util.Arrays;
-//import java.util.List;
-//
-///**
-// * @Author : zhoush
-// * @Date: 2024/3/27 16:37
-// * @Description:
-// */
-//@Slf4j
-//@RunWith(SpringRunner.class)
-//@SpringBootTest(classes = TemperingGlassModuleApplication.class)
-//public class TemperingApplicationTest {
-//
-//    @Autowired
-//    private TemperingAgoService temperingAgoService;
-//
-//
-//    @Test
-//    public void testFindPa() {
-//        List<TemperingGlassInfo> glass = temperingAgoService.selectIntoGlass(12);
-//        log.info("杩涚倝涓殑鐜荤拑锛歿}", Arrays.asList(glass));
-//    }
-//    @Test
-//    public void testFindPa2() {
-//        List<TemperingGlassInfo> glass = temperingAgoService.selectOutGlass();
-//        log.info("宸插嚭涓殑鐜荤拑锛歿}", Arrays.asList(glass));
-//    }
-//
-//    @Test
-//    public void testFindPa3() {
-//        List<TemperingGlassInfo> glass = temperingAgoService.selectWaitingGlass();
-//        log.info("绛夊緟涓殑鐜荤拑锛歿}", Arrays.asList(glass));
-//    }
-//    @Test
-//    public void testFindPa4() {
-//        List<TemperingGlassInfo> glass = temperingAgoService.selectOverGlass();
-//        log.info("绛夊緟涓殑鐜荤拑锛歿}", Arrays.asList(glass));
-//    }
-//    @Test
-//    public void testFindPa5() {
-//        List<TemperingGlassInfo> layoutId = temperingAgoService.selectLayoutId();
-//        //杩涚倝涓殑鐜荤拑
-//        log.info("鐗堝浘id锛歿}", Arrays.asList(layoutId.get(0).getTemperingLayoutId()));
-//        List<TemperingGlassInfo> intoGlass = temperingAgoService.selectIntoGlass(layoutId.get(0).getTemperingLayoutId());
-//        log.info("鐜荤拑鐗堝浘id锛歿}", Arrays.asList(intoGlass));
-//        List<TemperingGlassInfo> intoGlass2 = temperingAgoService.selectIntoGlass(layoutId.get(1).getTemperingLayoutId());
-//        log.info("鐜荤拑鐗堝浘id锛歿}", Arrays.asList(intoGlass2));
-//    }
-//}
+package com.mes;
+
+import com.mes.temperingglass.entity.TemperingGlassInfo;
+import com.mes.temperingglass.service.TemperingAgoService;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @Author : zhoush
+ * @Date: 2024/3/27 16:37
+ * @Description:
+ */
+@Slf4j
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = TemperingGlassModuleApplication.class)
+public class TemperingApplicationTest {
+
+    @Autowired
+    private TemperingAgoService temperingAgoService;
+
+
+    @Test
+    public void testFindPa() {
+        List<TemperingGlassInfo> glass = temperingAgoService.selectIntoGlass(12);
+        log.info("杩涚倝涓殑鐜荤拑锛歿}", Arrays.asList(glass));
+    }
+    @Test
+    public void testFindPa2() {
+        List<TemperingGlassInfo> glass = temperingAgoService.selectOutGlass();
+        log.info("宸插嚭涓殑鐜荤拑锛歿}", Arrays.asList(glass));
+    }
+
+    @Test
+    public void testFindPa3() {
+        List<TemperingGlassInfo> glass = temperingAgoService.selectWaitingGlass();
+        log.info("绛夊緟涓殑鐜荤拑锛歿}", Arrays.asList(glass));
+    }
+    @Test
+    public void testFindPa4() {
+        List<TemperingGlassInfo> glass = temperingAgoService.selectOverGlass();
+        log.info("绛夊緟涓殑鐜荤拑锛歿}", Arrays.asList(glass));
+    }
+    @Test
+    public void testFindPa5() {
+        List<TemperingGlassInfo> layoutId = temperingAgoService.selectLayoutId();
+        //杩涚倝涓殑鐜荤拑
+        log.info("鐗堝浘id锛歿}", Arrays.asList(layoutId.get(0).getTemperingLayoutId()));
+        List<TemperingGlassInfo> intoGlass = temperingAgoService.selectIntoGlass(layoutId.get(0).getTemperingLayoutId());
+        log.info("鐜荤拑鐗堝浘id锛歿}", Arrays.asList(intoGlass));
+        List<TemperingGlassInfo> intoGlass2 = temperingAgoService.selectIntoGlass(layoutId.get(1).getTemperingLayoutId());
+        log.info("鐜荤拑鐗堝浘id锛歿}", Arrays.asList(intoGlass2));
+    }
+}

--
Gitblit v1.8.0