严智鑫
2024-08-19 de46cb80b7c4d1fb74a4b72d8fc4406e7e3144e7
Merge branch 'master' of http://10.153.19.25:10101/r/HangZhouMes

# Conflicts:
# hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/service/DamageService.java
# hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/controller/EdgStorageCageController.java
# hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/EdgStorageCageDetailsService.java
# hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/impl/EdgStorageCageDetailsServiceImpl.java
# hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/CacheGlassTask.java
# hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/taskcache/controller/TaskCacheController.java
# hangzhoumesParent/moduleService/CacheGlassModule/src/test/java/com/mes/CacheGlassModuleApplicationTest.java
56个文件已修改
3个文件已添加
4个文件已删除
3459 ■■■■ 已修改文件
JsonFile/PlcdownGlass.json 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/config.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/package-lock.json 670 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/package.json 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/dpxsa.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/lang/companyInfo.js 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/lang/zh.js 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/layout/MainErpView.vue 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/main.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/utils/WebSocketService.js 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/utils/constants.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Caching/cachingbefore.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Caching/cachingun.vue 61 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/GlassStorage/MaterialRackManagement.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Identify/identify.vue 211 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/LoginView.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/PurchaseReturn/purchaseReturn.vue 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/PurchaseReturn/purchaseStorage.vue 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/ReportWork/reportWork.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Returns/returns.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Slicecage/slicecage.vue 81 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/StockBasicData/stockBasicData.vue 109 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/StockBasicData/stockBasicDatatwo.vue 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/UnLoadGlass/Landingindication.vue 49 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/UnLoadGlass/Landingindicationtwo.vue 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/UnLoadGlass/PrintFlow.vue 444 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/UnLoadGlass/loadmachinerack.vue 284 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/largescreen/largescreen.vue 505 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/JsonFile/PlcdownGlass.json 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/DamageDetailsService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/ReportingWorkDetailService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/CodeGet.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/resources/mapper/TemperingGlassInfoMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/CacheGlassTask.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/TaskCacheMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/mapper/BigStorageCageMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/BigStorageCageService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java 57 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/entity/BigStorageCageFeedTask.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/entity/BigStorageCageOutTask.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/edgglasstask/entity/EdgGlassTaskInfo.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/application.yml 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageFeedTaskMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageMapper.xml 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageOutTaskMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingglass/controller/TemperingGlassInfoController.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-dev.yml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/controller/DownGlassInfoController.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/entity/DownGlassInfo.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/entity/DownGlassTask.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/mapper/DownGlassInfoMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/service/DownGlassInfoService.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/controller/DownStorageCageDetailsController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/service/DownStorageCageDetailsService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/service/DownStorageCageService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/controller/DownWorkstationController.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/service/DownWorkstationService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/JsonFile/PlcdownGlass.json 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/application-cz.yml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/mapper/DownGlassInfoMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/mapper/DownStorageCageDetailsMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/test/java/mes/UnloadGlassModuleApplicationTest.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
JsonFile/PlcdownGlass.json
@@ -1,6 +1,6 @@
{
    "plcAddressBegin": "DB11.0",
    "plcAddressLenght": "92",
    "plcAddressLenght": "94",
    "dataType": "word",
    "parameteInfor": [
@@ -138,6 +138,11 @@
            "codeId": "task_type",
            "addressIndex": "90",
            "addressLenght": "2"
        },
        {
            "codeId": "alarm_signal",
            "addressIndex": "92",
            "addressLenght": "2"
        }
    ]
UI-Project/config.js
@@ -1,7 +1,10 @@
export default {
 serverUrl: "10.153.19.150:88/api",
//  serverUrl: "192.168.1.199:88/api",
//  serverUrl: "127.0.0.1:88/api",
  serverUrl2: "10.153.19.150:88"
  // serverUrl2: "192.168.1.199:88"
    // serverUrl2: "127.0.0.1:88"
  //serverUrl:"res.abeim.cn"
}
UI-Project/package-lock.json
@@ -8,7 +8,7 @@
      "name": "northglass-mes",
      "version": "0.0.0",
      "dependencies": {
        "@element-plus/icons-vue": "^2.1.0",
        "@element-plus/icons-vue": "^2.3.1",
        "@vue-macros/reactivity-transform": "^0.3.23",
        "axios": "^1.6.8",
        "chart.js": "^4.4.3",
@@ -17,13 +17,16 @@
        "moment": "^2.30.1",
        "pinia": "^2.1.6",
        "pinia-plugin-persistedstate": "^3.2.0",
        "qrcode": "^1.5.4",
        "sortablejs": "^1.15.1",
        "sweetalert2": "^11.10.7",
        "vue": "^3.3.4",
        "vue-draggable-plus": "^0.5.0",
        "vue-echarts": "^6.7.3",
        "vue-i18n": "^9.10.1",
        "vue-print-nb": "^1.7.5",
        "vue-router": "^4.2.4",
        "vue3-print-nb": "^0.1.4",
        "vxe-table": "^4.5.15",
        "xe-utils": "^3.5.14",
        "xlsx": "^0.18.5"
@@ -46,25 +49,28 @@
      }
    },
    "node_modules/@babel/helper-string-parser": {
      "version": "7.22.5",
      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
      "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==",
      "version": "7.24.8",
      "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz",
      "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==",
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/helper-validator-identifier": {
      "version": "7.22.20",
      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
      "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
      "version": "7.24.7",
      "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
      "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/parser": {
      "version": "7.23.0",
      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz",
      "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==",
      "version": "7.25.3",
      "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.25.3.tgz",
      "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==",
      "dependencies": {
        "@babel/types": "^7.25.2"
      },
      "bin": {
        "parser": "bin/babel-parser.js"
      },
@@ -73,12 +79,12 @@
      }
    },
    "node_modules/@babel/types": {
      "version": "7.23.0",
      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz",
      "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==",
      "version": "7.25.2",
      "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.25.2.tgz",
      "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==",
      "dependencies": {
        "@babel/helper-string-parser": "^7.22.5",
        "@babel/helper-validator-identifier": "^7.22.20",
        "@babel/helper-string-parser": "^7.24.8",
        "@babel/helper-validator-identifier": "^7.24.7",
        "to-fast-properties": "^2.0.0"
      },
      "engines": {
@@ -94,9 +100,9 @@
      }
    },
    "node_modules/@element-plus/icons-vue": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.1.0.tgz",
      "integrity": "sha512-PSBn3elNoanENc1vnCfh+3WA9fimRC7n+fWkf3rE5jvv+aBohNHABC/KAR5KWPecxWxDTVT1ERpRbOMRcOV/vA==",
      "version": "2.3.1",
      "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz",
      "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==",
      "peerDependencies": {
        "vue": "^3.2.0"
      }
@@ -558,6 +564,28 @@
        "node": ">=0.8"
      }
    },
    "node_modules/ansi-regex": {
      "version": "5.0.1",
      "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/ansi-styles": {
      "version": "4.3.0",
      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
      "dependencies": {
        "color-convert": "^2.0.1"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
      }
    },
    "node_modules/anymatch": {
      "version": "3.1.3",
      "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz",
@@ -640,6 +668,14 @@
        "node": ">=8"
      }
    },
    "node_modules/camelcase": {
      "version": "5.3.1",
      "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz",
      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/cfb": {
      "version": "1.2.2",
      "resolved": "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz",
@@ -686,6 +722,16 @@
        "fsevents": "~2.3.2"
      }
    },
    "node_modules/cliui": {
      "version": "6.0.0",
      "resolved": "https://registry.npmmirror.com/cliui/-/cliui-6.0.0.tgz",
      "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
      "dependencies": {
        "string-width": "^4.2.0",
        "strip-ansi": "^6.0.0",
        "wrap-ansi": "^6.2.0"
      }
    },
    "node_modules/codepage": {
      "version": "1.15.0",
      "resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz",
@@ -693,6 +739,22 @@
      "engines": {
        "node": ">=0.8"
      }
    },
    "node_modules/color-convert": {
      "version": "2.0.1",
      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
      "dependencies": {
        "color-name": "~1.1.4"
      },
      "engines": {
        "node": ">=7.0.0"
      }
    },
    "node_modules/color-name": {
      "version": "1.1.4",
      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
    },
    "node_modules/combined-stream": {
      "version": "1.0.8",
@@ -749,6 +811,14 @@
        }
      }
    },
    "node_modules/decamelize": {
      "version": "1.2.0",
      "resolved": "https://registry.npmmirror.com/decamelize/-/decamelize-1.2.0.tgz",
      "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/delayed-stream": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -756,6 +826,11 @@
      "engines": {
        "node": ">=0.4.0"
      }
    },
    "node_modules/dijkstrajs": {
      "version": "1.0.3",
      "resolved": "https://registry.npmmirror.com/dijkstrajs/-/dijkstrajs-1.0.3.tgz",
      "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA=="
    },
    "node_modules/dom-zindex": {
      "version": "1.0.1",
@@ -795,6 +870,11 @@
      "peerDependencies": {
        "vue": "^3.2.0"
      }
    },
    "node_modules/emoji-regex": {
      "version": "8.0.0",
      "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
    },
    "node_modules/esbuild": {
      "version": "0.18.20",
@@ -897,6 +977,18 @@
        "node": ">=8"
      }
    },
    "node_modules/find-up": {
      "version": "4.1.0",
      "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz",
      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
      "dependencies": {
        "locate-path": "^5.0.0",
        "path-exists": "^4.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/follow-redirects": {
      "version": "1.15.6",
      "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.6.tgz",
@@ -929,6 +1021,14 @@
      "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==",
      "engines": {
        "node": ">=0.8"
      }
    },
    "node_modules/get-caller-file": {
      "version": "2.0.5",
      "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz",
      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
      "engines": {
        "node": "6.* || 8.* || >= 10.*"
      }
    },
    "node_modules/glob-parent": {
@@ -992,6 +1092,14 @@
        "node": ">=0.10.0"
      }
    },
    "node_modules/is-fullwidth-code-point": {
      "version": "3.0.0",
      "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/is-glob": {
      "version": "4.0.3",
      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
@@ -1035,6 +1143,17 @@
      },
      "funding": {
        "url": "https://github.com/sponsors/antfu"
      }
    },
    "node_modules/locate-path": {
      "version": "5.0.0",
      "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz",
      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
      "dependencies": {
        "p-locate": "^4.1.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/lodash": {
@@ -1193,6 +1312,47 @@
      "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
      "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw=="
    },
    "node_modules/p-limit": {
      "version": "2.3.0",
      "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz",
      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
      "dependencies": {
        "p-try": "^2.0.0"
      },
      "engines": {
        "node": ">=6"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/p-locate": {
      "version": "4.1.0",
      "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz",
      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
      "dependencies": {
        "p-limit": "^2.2.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/p-try": {
      "version": "2.2.0",
      "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz",
      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/path-exists": {
      "version": "4.0.0",
      "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz",
      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/pathe": {
      "version": "1.1.2",
      "resolved": "https://registry.npmmirror.com/pathe/-/pathe-1.1.2.tgz",
@@ -1283,6 +1443,14 @@
        "pathe": "^1.1.2"
      }
    },
    "node_modules/pngjs": {
      "version": "5.0.0",
      "resolved": "https://registry.npmmirror.com/pngjs/-/pngjs-5.0.0.tgz",
      "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==",
      "engines": {
        "node": ">=10.13.0"
      }
    },
    "node_modules/postcss": {
      "version": "8.4.31",
      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
@@ -1310,10 +1478,41 @@
        "node": "^10 || ^12 || >=14"
      }
    },
    "node_modules/prettier": {
      "version": "2.8.8",
      "resolved": "https://registry.npmmirror.com/prettier/-/prettier-2.8.8.tgz",
      "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
      "optional": true,
      "bin": {
        "prettier": "bin-prettier.js"
      },
      "engines": {
        "node": ">=10.13.0"
      },
      "funding": {
        "url": "https://github.com/prettier/prettier?sponsor=1"
      }
    },
    "node_modules/proxy-from-env": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
    },
    "node_modules/qrcode": {
      "version": "1.5.4",
      "resolved": "https://registry.npmmirror.com/qrcode/-/qrcode-1.5.4.tgz",
      "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==",
      "dependencies": {
        "dijkstrajs": "^1.0.1",
        "pngjs": "^5.0.0",
        "yargs": "^15.3.1"
      },
      "bin": {
        "qrcode": "bin/qrcode"
      },
      "engines": {
        "node": ">=10.13.0"
      }
    },
    "node_modules/queue-microtask": {
      "version": "1.2.3",
@@ -1345,6 +1544,19 @@
      "engines": {
        "node": ">=8.10.0"
      }
    },
    "node_modules/require-directory": {
      "version": "2.1.1",
      "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz",
      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/require-main-filename": {
      "version": "2.0.0",
      "resolved": "https://registry.npmmirror.com/require-main-filename/-/require-main-filename-2.0.0.tgz",
      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
    },
    "node_modules/requires-port": {
      "version": "1.0.0",
@@ -1412,10 +1624,23 @@
      "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==",
      "dev": true
    },
    "node_modules/set-blocking": {
      "version": "2.0.0",
      "resolved": "https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz",
      "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
    },
    "node_modules/sortablejs": {
      "version": "1.15.1",
      "resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.15.1.tgz",
      "integrity": "sha512-P5Cjvb0UG1ZVNiDPj/n4V+DinttXG6K8n7vM/HQf0C25K3YKQTQY6fsr/sEGsJGpQ9exmPxluHxKBc0mLKU1lQ=="
    },
    "node_modules/source-map": {
      "version": "0.6.1",
      "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/source-map-js": {
      "version": "1.0.2",
@@ -1434,6 +1659,30 @@
      },
      "engines": {
        "node": ">=0.8"
      }
    },
    "node_modules/string-width": {
      "version": "4.2.3",
      "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
      "dependencies": {
        "emoji-regex": "^8.0.0",
        "is-fullwidth-code-point": "^3.0.0",
        "strip-ansi": "^6.0.1"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/strip-ansi": {
      "version": "6.0.1",
      "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
      "dependencies": {
        "ansi-regex": "^5.0.1"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/strip-literal": {
@@ -1750,6 +1999,37 @@
        "vue": "^3.0.0"
      }
    },
    "node_modules/vue-print-nb": {
      "version": "1.7.5",
      "resolved": "https://registry.npmmirror.com/vue-print-nb/-/vue-print-nb-1.7.5.tgz",
      "integrity": "sha512-iNbNyUVRWz0Ha1UTiCKxMPtHLUDGgNI8e8xmD3xqm9RlXIUeX9bT7DgNAfY8vPzqyFRHqGjxLI1rycKH366ziQ==",
      "dependencies": {
        "vue": "^2.6.11"
      }
    },
    "node_modules/vue-print-nb/node_modules/@vue/compiler-sfc": {
      "version": "2.7.16",
      "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz",
      "integrity": "sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==",
      "dependencies": {
        "@babel/parser": "^7.23.5",
        "postcss": "^8.4.14",
        "source-map": "^0.6.1"
      },
      "optionalDependencies": {
        "prettier": "^1.18.2 || ^2.0.0"
      }
    },
    "node_modules/vue-print-nb/node_modules/vue": {
      "version": "2.7.16",
      "resolved": "https://registry.npmmirror.com/vue/-/vue-2.7.16.tgz",
      "integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==",
      "deprecated": "Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details.",
      "dependencies": {
        "@vue/compiler-sfc": "2.7.16",
        "csstype": "^3.1.0"
      }
    },
    "node_modules/vue-router": {
      "version": "4.2.5",
      "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.5.tgz",
@@ -1762,6 +2042,14 @@
      },
      "peerDependencies": {
        "vue": "^3.2.0"
      }
    },
    "node_modules/vue3-print-nb": {
      "version": "0.1.4",
      "resolved": "https://registry.npmmirror.com/vue3-print-nb/-/vue3-print-nb-0.1.4.tgz",
      "integrity": "sha512-LExI7viEzplR6ZKQ2b+V4U0cwGYbVD4fut/XHvk3UPGlT5CcvIGs6VlwGp107aKgk6P8Pgx4rco3Rehv2lti3A==",
      "dependencies": {
        "vue": "^3.0.5"
      }
    },
    "node_modules/vxe-table": {
@@ -1790,6 +2078,11 @@
      "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
      "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="
    },
    "node_modules/which-module": {
      "version": "2.0.1",
      "resolved": "https://registry.npmmirror.com/which-module/-/which-module-2.0.1.tgz",
      "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ=="
    },
    "node_modules/wmf": {
      "version": "1.0.2",
      "resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz",
@@ -1804,6 +2097,19 @@
      "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==",
      "engines": {
        "node": ">=0.8"
      }
    },
    "node_modules/wrap-ansi": {
      "version": "6.2.0",
      "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
      "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
      "dependencies": {
        "ansi-styles": "^4.0.0",
        "string-width": "^4.1.0",
        "strip-ansi": "^6.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/xe-utils": {
@@ -1831,6 +2137,44 @@
        "node": ">=0.8"
      }
    },
    "node_modules/y18n": {
      "version": "4.0.3",
      "resolved": "https://registry.npmmirror.com/y18n/-/y18n-4.0.3.tgz",
      "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
    },
    "node_modules/yargs": {
      "version": "15.4.1",
      "resolved": "https://registry.npmmirror.com/yargs/-/yargs-15.4.1.tgz",
      "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
      "dependencies": {
        "cliui": "^6.0.0",
        "decamelize": "^1.2.0",
        "find-up": "^4.1.0",
        "get-caller-file": "^2.0.1",
        "require-directory": "^2.1.1",
        "require-main-filename": "^2.0.0",
        "set-blocking": "^2.0.0",
        "string-width": "^4.2.0",
        "which-module": "^2.0.0",
        "y18n": "^4.0.0",
        "yargs-parser": "^18.1.2"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/yargs-parser": {
      "version": "18.1.3",
      "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-18.1.3.tgz",
      "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
      "dependencies": {
        "camelcase": "^5.0.0",
        "decamelize": "^1.2.0"
      },
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/zrender": {
      "version": "5.6.0",
      "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.6.0.tgz",
@@ -1848,27 +2192,30 @@
      "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",
      "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw=="
      "version": "7.24.8",
      "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz",
      "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ=="
    },
    "@babel/helper-validator-identifier": {
      "version": "7.22.20",
      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
      "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A=="
      "version": "7.24.7",
      "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
      "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w=="
    },
    "@babel/parser": {
      "version": "7.23.0",
      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz",
      "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw=="
      "version": "7.25.3",
      "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.25.3.tgz",
      "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==",
      "requires": {
        "@babel/types": "^7.25.2"
      }
    },
    "@babel/types": {
      "version": "7.23.0",
      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz",
      "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==",
      "version": "7.25.2",
      "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.25.2.tgz",
      "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==",
      "requires": {
        "@babel/helper-string-parser": "^7.22.5",
        "@babel/helper-validator-identifier": "^7.22.20",
        "@babel/helper-string-parser": "^7.24.8",
        "@babel/helper-validator-identifier": "^7.24.7",
        "to-fast-properties": "^2.0.0"
      }
    },
@@ -1878,9 +2225,9 @@
      "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA=="
    },
    "@element-plus/icons-vue": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.1.0.tgz",
      "integrity": "sha512-PSBn3elNoanENc1vnCfh+3WA9fimRC7n+fWkf3rE5jvv+aBohNHABC/KAR5KWPecxWxDTVT1ERpRbOMRcOV/vA==",
      "version": "2.3.1",
      "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz",
      "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==",
      "requires": {}
    },
    "@esbuild/win32-ia32": {
@@ -2219,6 +2566,19 @@
      "resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz",
      "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A=="
    },
    "ansi-regex": {
      "version": "5.0.1",
      "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
    },
    "ansi-styles": {
      "version": "4.3.0",
      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
      "requires": {
        "color-convert": "^2.0.1"
      }
    },
    "anymatch": {
      "version": "3.1.3",
      "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz",
@@ -2286,6 +2646,11 @@
        "fill-range": "^7.0.1"
      }
    },
    "camelcase": {
      "version": "5.3.1",
      "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz",
      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
    },
    "cfb": {
      "version": "1.2.2",
      "resolved": "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz",
@@ -2318,10 +2683,33 @@
        "readdirp": "~3.6.0"
      }
    },
    "cliui": {
      "version": "6.0.0",
      "resolved": "https://registry.npmmirror.com/cliui/-/cliui-6.0.0.tgz",
      "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
      "requires": {
        "string-width": "^4.2.0",
        "strip-ansi": "^6.0.0",
        "wrap-ansi": "^6.2.0"
      }
    },
    "codepage": {
      "version": "1.15.0",
      "resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz",
      "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA=="
    },
    "color-convert": {
      "version": "2.0.1",
      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
      "requires": {
        "color-name": "~1.1.4"
      }
    },
    "color-name": {
      "version": "1.1.4",
      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
    },
    "combined-stream": {
      "version": "1.0.8",
@@ -2361,10 +2749,20 @@
        "ms": "2.1.2"
      }
    },
    "decamelize": {
      "version": "1.2.0",
      "resolved": "https://registry.npmmirror.com/decamelize/-/decamelize-1.2.0.tgz",
      "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="
    },
    "delayed-stream": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
    },
    "dijkstrajs": {
      "version": "1.0.3",
      "resolved": "https://registry.npmmirror.com/dijkstrajs/-/dijkstrajs-1.0.3.tgz",
      "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA=="
    },
    "dom-zindex": {
      "version": "1.0.1",
@@ -2401,6 +2799,11 @@
        "memoize-one": "^6.0.0",
        "normalize-wheel-es": "^1.2.0"
      }
    },
    "emoji-regex": {
      "version": "8.0.0",
      "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
    },
    "esbuild": {
      "version": "0.18.20",
@@ -2484,6 +2887,15 @@
        "to-regex-range": "^5.0.1"
      }
    },
    "find-up": {
      "version": "4.1.0",
      "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz",
      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
      "requires": {
        "locate-path": "^5.0.0",
        "path-exists": "^4.0.0"
      }
    },
    "follow-redirects": {
      "version": "1.15.6",
      "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.6.tgz",
@@ -2503,6 +2915,11 @@
      "version": "1.1.2",
      "resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz",
      "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA=="
    },
    "get-caller-file": {
      "version": "2.0.5",
      "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz",
      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
    },
    "glob-parent": {
      "version": "5.1.2",
@@ -2550,6 +2967,11 @@
      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="
    },
    "is-fullwidth-code-point": {
      "version": "3.0.0",
      "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
    },
    "is-glob": {
      "version": "4.0.3",
      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
@@ -2579,6 +3001,14 @@
      "version": "0.4.3",
      "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz",
      "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g=="
    },
    "locate-path": {
      "version": "5.0.0",
      "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz",
      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
      "requires": {
        "p-locate": "^4.1.0"
      }
    },
    "lodash": {
      "version": "4.17.21",
@@ -2693,6 +3123,32 @@
      "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
      "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw=="
    },
    "p-limit": {
      "version": "2.3.0",
      "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz",
      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
      "requires": {
        "p-try": "^2.0.0"
      }
    },
    "p-locate": {
      "version": "4.1.0",
      "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz",
      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
      "requires": {
        "p-limit": "^2.2.0"
      }
    },
    "p-try": {
      "version": "2.2.0",
      "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz",
      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
    },
    "path-exists": {
      "version": "4.0.0",
      "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz",
      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
    },
    "pathe": {
      "version": "1.1.2",
      "resolved": "https://registry.npmmirror.com/pathe/-/pathe-1.1.2.tgz",
@@ -2742,6 +3198,11 @@
        "pathe": "^1.1.2"
      }
    },
    "pngjs": {
      "version": "5.0.0",
      "resolved": "https://registry.npmmirror.com/pngjs/-/pngjs-5.0.0.tgz",
      "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw=="
    },
    "postcss": {
      "version": "8.4.31",
      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
@@ -2752,10 +3213,26 @@
        "source-map-js": "^1.0.2"
      }
    },
    "prettier": {
      "version": "2.8.8",
      "resolved": "https://registry.npmmirror.com/prettier/-/prettier-2.8.8.tgz",
      "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
      "optional": true
    },
    "proxy-from-env": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
    },
    "qrcode": {
      "version": "1.5.4",
      "resolved": "https://registry.npmmirror.com/qrcode/-/qrcode-1.5.4.tgz",
      "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==",
      "requires": {
        "dijkstrajs": "^1.0.1",
        "pngjs": "^5.0.0",
        "yargs": "^15.3.1"
      }
    },
    "queue-microtask": {
      "version": "1.2.3",
@@ -2770,6 +3247,16 @@
      "requires": {
        "picomatch": "^2.2.1"
      }
    },
    "require-directory": {
      "version": "2.1.1",
      "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz",
      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="
    },
    "require-main-filename": {
      "version": "2.0.0",
      "resolved": "https://registry.npmmirror.com/require-main-filename/-/require-main-filename-2.0.0.tgz",
      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
    },
    "requires-port": {
      "version": "1.0.0",
@@ -2812,10 +3299,20 @@
      "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==",
      "dev": true
    },
    "set-blocking": {
      "version": "2.0.0",
      "resolved": "https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz",
      "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
    },
    "sortablejs": {
      "version": "1.15.1",
      "resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.15.1.tgz",
      "integrity": "sha512-P5Cjvb0UG1ZVNiDPj/n4V+DinttXG6K8n7vM/HQf0C25K3YKQTQY6fsr/sEGsJGpQ9exmPxluHxKBc0mLKU1lQ=="
    },
    "source-map": {
      "version": "0.6.1",
      "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
    },
    "source-map-js": {
      "version": "1.0.2",
@@ -2828,6 +3325,24 @@
      "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
      "requires": {
        "frac": "~1.1.2"
      }
    },
    "string-width": {
      "version": "4.2.3",
      "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
      "requires": {
        "emoji-regex": "^8.0.0",
        "is-fullwidth-code-point": "^3.0.0",
        "strip-ansi": "^6.0.1"
      }
    },
    "strip-ansi": {
      "version": "6.0.1",
      "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
      "requires": {
        "ansi-regex": "^5.0.1"
      }
    },
    "strip-literal": {
@@ -3014,12 +3529,50 @@
        "@vue/devtools-api": "^6.5.0"
      }
    },
    "vue-print-nb": {
      "version": "1.7.5",
      "resolved": "https://registry.npmmirror.com/vue-print-nb/-/vue-print-nb-1.7.5.tgz",
      "integrity": "sha512-iNbNyUVRWz0Ha1UTiCKxMPtHLUDGgNI8e8xmD3xqm9RlXIUeX9bT7DgNAfY8vPzqyFRHqGjxLI1rycKH366ziQ==",
      "requires": {
        "vue": "^2.6.11"
      },
      "dependencies": {
        "@vue/compiler-sfc": {
          "version": "2.7.16",
          "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz",
          "integrity": "sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==",
          "requires": {
            "@babel/parser": "^7.23.5",
            "postcss": "^8.4.14",
            "prettier": "^1.18.2 || ^2.0.0",
            "source-map": "^0.6.1"
          }
        },
        "vue": {
          "version": "2.7.16",
          "resolved": "https://registry.npmmirror.com/vue/-/vue-2.7.16.tgz",
          "integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==",
          "requires": {
            "@vue/compiler-sfc": "2.7.16",
            "csstype": "^3.1.0"
          }
        }
      }
    },
    "vue-router": {
      "version": "4.2.5",
      "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.5.tgz",
      "integrity": "sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==",
      "requires": {
        "@vue/devtools-api": "^6.5.0"
      }
    },
    "vue3-print-nb": {
      "version": "0.1.4",
      "resolved": "https://registry.npmmirror.com/vue3-print-nb/-/vue3-print-nb-0.1.4.tgz",
      "integrity": "sha512-LExI7viEzplR6ZKQ2b+V4U0cwGYbVD4fut/XHvk3UPGlT5CcvIGs6VlwGp107aKgk6P8Pgx4rco3Rehv2lti3A==",
      "requires": {
        "vue": "^3.0.5"
      }
    },
    "vxe-table": {
@@ -3041,6 +3594,11 @@
      "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
      "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="
    },
    "which-module": {
      "version": "2.0.1",
      "resolved": "https://registry.npmmirror.com/which-module/-/which-module-2.0.1.tgz",
      "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ=="
    },
    "wmf": {
      "version": "1.0.2",
      "resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz",
@@ -3050,6 +3608,16 @@
      "version": "0.3.0",
      "resolved": "https://registry.npmmirror.com/word/-/word-0.3.0.tgz",
      "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA=="
    },
    "wrap-ansi": {
      "version": "6.2.0",
      "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
      "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
      "requires": {
        "ansi-styles": "^4.0.0",
        "string-width": "^4.1.0",
        "strip-ansi": "^6.0.0"
      }
    },
    "xe-utils": {
      "version": "3.5.14",
@@ -3070,6 +3638,38 @@
        "word": "~0.3.0"
      }
    },
    "y18n": {
      "version": "4.0.3",
      "resolved": "https://registry.npmmirror.com/y18n/-/y18n-4.0.3.tgz",
      "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
    },
    "yargs": {
      "version": "15.4.1",
      "resolved": "https://registry.npmmirror.com/yargs/-/yargs-15.4.1.tgz",
      "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
      "requires": {
        "cliui": "^6.0.0",
        "decamelize": "^1.2.0",
        "find-up": "^4.1.0",
        "get-caller-file": "^2.0.1",
        "require-directory": "^2.1.1",
        "require-main-filename": "^2.0.0",
        "set-blocking": "^2.0.0",
        "string-width": "^4.2.0",
        "which-module": "^2.0.0",
        "y18n": "^4.0.0",
        "yargs-parser": "^18.1.2"
      }
    },
    "yargs-parser": {
      "version": "18.1.3",
      "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-18.1.3.tgz",
      "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
      "requires": {
        "camelcase": "^5.0.0",
        "decamelize": "^1.2.0"
      }
    },
    "zrender": {
      "version": "5.6.0",
      "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.6.0.tgz",
UI-Project/package.json
@@ -8,7 +8,7 @@
    "preview": "vite preview"
  },
  "dependencies": {
    "@element-plus/icons-vue": "^2.1.0",
    "@element-plus/icons-vue": "^2.3.1",
    "@vue-macros/reactivity-transform": "^0.3.23",
    "axios": "^1.6.8",
    "chart.js": "^4.4.3",
@@ -17,13 +17,16 @@
    "moment": "^2.30.1",
    "pinia": "^2.1.6",
    "pinia-plugin-persistedstate": "^3.2.0",
    "qrcode": "^1.5.4",
    "sortablejs": "^1.15.1",
    "sweetalert2": "^11.10.7",
    "vue": "^3.3.4",
    "vue-draggable-plus": "^0.5.0",
    "vue-echarts": "^6.7.3",
    "vue-i18n": "^9.10.1",
    "vue-print-nb": "^1.7.5",
    "vue-router": "^4.2.4",
    "vue3-print-nb": "^0.1.4",
    "vxe-table": "^4.5.15",
    "xe-utils": "^3.5.14",
    "xlsx": "^0.18.5"
UI-Project/src/assets/dpxsa.png
UI-Project/src/lang/companyInfo.js
New file
@@ -0,0 +1,85 @@
import {defineStore} from "pinia";
export default defineStore('companyInfo', {
    state: () => ({
        companyName: '常州市吉利玻璃有限公司',
        address:'常州市天宁区郑陆镇大明南路8号',
        telephone:'022-59280088',
        fax:'022-59280066',
        widHeiLength:{//订单宽高长度
            regexp:/^(\d{1,4})$/,//正则四位整数
            //regexp:/^(0|[1-9][0-9]{0,3}([.][0-9]{1,2})?)$/,//正则0.00-9999.99
            msg:'basicData.msg.range9999Dec'
        },
        orderIdType:'month',//后端生成订单号类型,day:每天生成,month:每月生成
        deliveryIdType:'month',//后端生成发货单号类型,day:每天生成,month:每月生成
        columnName:'异形参数',
        selectOrderReviewShow:false, //订单首页加工单审核按钮是否显示
        productName:"product_abbreviation", //产品创建查重字段
        decValue:2,//订单保存面积位数
        label:2,//标签类型
        calculateType:2,//订单计算方式
        //天津
        printLabel: {
            custom: (item1) => {
                return `<div class="row3" style="text-align: center;font-weight: bolder;">
                  <label style="font-weight: bolder;font-size: 22px;margin-top: 28px;">W:${item1.width}</label>
                  &nbsp;&nbsp;&nbsp;
                  <label style="font-weight: bolder;font-size: 22px;margin-top: 28px;">H:${item1.height}</label>
                </div>`
            },
            customSemi: (item1) => {
                return `<div class="row3" style="text-align: center;font-weight: bolder;">
                  <label style="font-weight: bolder;font-size: 10px;margin-top: 28px;">W:${item1.width}</label>
                  &nbsp;&nbsp;&nbsp;
                  <label style="font-weight: bolder;font-size: 10px;margin-top: 28px;">H:${item1.height}</label>
                </div>`
            },
            labelType: '成品标签2',
            labelValue:2,
            labelType3: '成品标签3',
            labelValue3:3,
            printFlowCard: {
                patch:'正品',
                lackOf:'次品',
                processingNote: (itemtextarea) => {
                    return  `${itemtextarea.processing_note}`
                },
            },
            hideButton:'false',
            getSelectFlowCard:2,//打印流程卡查询状态
            className:{
                custom:{
                    printFlowCardName: () => {
                        return `printFlowCard_finished`
                    },
                    entiretyName: () => {
                        return `entirety_finished`
                    },
                    contentRowName: () => {
                        return `contentRow`
                    }
                },
                semi:{
                    printFlowCardName: () => {
                        return `printFlowCard_semi`
                    },
                    entiretyName: () => {
                        return `entirety_semi`
                    },
                    contentRowName: () => {
                        return `contentRow`
                    }
                }
            }
        }
    }),
    actions: {
        //
    }
})
UI-Project/src/lang/zh.js
@@ -218,8 +218,10 @@
        process:'工序',
        team:'班组',
        basic:'设备',
        add:'确认保存',
        makesure:'确认保存',
        cancel:'取消',
        temperingtotal:'钢化炉数:',
        glasstotal:'玻璃总数:',
    },
    workOrder:{
        glassID:'玻璃ID',
@@ -237,6 +239,9 @@
        takemessage:'是否拿走该条信息?',
        breakage:'破损',
        takeout:'拿走',
        glasstype:'玻璃类型',
        line:'线路',
        status:'状态',
    },
    processCard:{
        intofurnace:'进炉中',
@@ -427,6 +432,13 @@
        allstatus: '全部入库状态',
        completedquantity: '完成数量',
        scrapquantity: '报废数量',
        number: '数量',
        method: '加工方式',
        innumber: '已入数量',
        productstatus: '生产状态',
        projectnumber: '工程号',
        right: '正常',
        stop: '终止',
    },
    reportmanage:{
        productiontime :'生产时间',
UI-Project/src/layout/MainErpView.vue
@@ -10,11 +10,11 @@
  const { t } = useI18n()
  let language = ref(localStorage.getItem('lang') || 'zh')
const store = userInfo()
const isCollapse = ref(false);
// const { $i18n } = useI18n(); // 获取 i18n 实例  
const router = useRouter()
const userStore = useUserInfoStore()
const user = userStore.user.userName
// const user = userStore.user.userName
let userInfoStr = window.localStorage.getItem('userInfo')
console.log(userInfoStr);
@@ -158,6 +158,9 @@
    openFlag = menuID
  }
}
function toggleCollapse() {
  isCollapse.value = !isCollapse.value;
}
</script>
 
<template>
@@ -169,10 +172,6 @@
               alt=""
               style="max-width: 100%;max-height: 100%">
          <h3 style="margin: 1rem  ;font-weight: bold;width: 33vw;"> {{ $t('main.titleFirst') }}{{ userName }}{{ $t('main.titleLast') }}</h3>
          <!-- <div class="header-left">
            <el-button :icon="isCollapse ? 'el-icon-s-unfold' : 'el-icon-s-fold'" @click="toggleCollapse"
              style="height:30px;"></el-button>
          </div> -->
          <span style="height: 70%;width: 78vw;margin-top: 1rem;">
            <!-- <el-button class="sys-quit"
                       @click="quit"
@@ -188,33 +187,23 @@
                <SwitchButton size=""/>{{ $t('main.quit') }}
              </el-icon>
            </el-button>
            <div class="header-left">
              <el-button  @click="toggleCollapse"
              style="height:30px;">☰</el-button>
            <!-- <el-button :icon="isCollapse ? 'el-icon-s-unfold' : 'el-icon-s-fold'" @click="toggleCollapse"
              style="height:30px;"></el-button> -->
          </div>
          </span>
        </div>
      </el-header>
      <div id="line"></div>
      <el-container>
        <!-- <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>☰</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>
        </el-aside> -->
      <el-aside :width="isCollapse ? '30px' : '200px'" style="background-color: #fff;">
        <el-row :span="20">
            <el-menu :default-active="activePath" class="el-menu-vertical-demo" background-color="#fff">
            <el-menu :default-active="activePath" class="el-menu-vertical-demo" >
              <div class="menu">
            <div v-for="items in menuList">
              <div class='menu_title'
              <div class='menu_title' v-show="!isCollapse"
                   @click="openMenu(items.id)">
                <span>☰</span>
                {{ items.menuName }}
@@ -232,12 +221,12 @@
                  </div>
            </el-menu>
          </el-row>
</el-aside>
        <el-main>
          <div id="main">
            <router-view></router-view>
          </div>
        </el-main>
      </el-container>
    </el-container>
  </div>
@@ -463,4 +452,7 @@
    transform: translateX(0);
  }
}
.header-left{
  margin-left: -350px;
}
</style>
UI-Project/src/main.js
@@ -15,7 +15,6 @@
import * as echarts from "echarts"
// echarts.registerMap('china', china)
// Vue.prototype.$echarts = echarts
// app.component("v-chart", Echarts)
// app.config.globalProperties.$echarts = echarts
const app = createApp(App)
@@ -29,5 +28,4 @@
    locale: zhCn,
})
app.use(i18n)
app.mount('#app')
UI-Project/src/utils/WebSocketService.js
@@ -1,4 +1,5 @@
// WebSocketService.js
let socket = null;
export const initializeWebSocket = (socketUrl, messageHandler) => {
  let messages='' ;
@@ -6,10 +7,13 @@
      console.log("Your browser does not support WebSocket");
      return null;
    }
    const socket = new WebSocket(socketUrl);
    socket.onopen = function () {
      console.log("WebSocket is now open");
    };
    socket.onmessage = (msg) => {
      if (!msg.data) {
        return;
@@ -21,14 +25,23 @@
        messages= messages.replace('<END>', '');
        const obj = JSON.parse(messages);
        messages='';
      // 调用消息处理函数,将数据传递给 Vue 组件
      if (messageHandler) {
        messageHandler(obj);
      }
      }
    };
    return socket;
  };
  export const closeWebSocket = (socket) => {
    if (socket && socket.readyState === WebSocket.OPEN) {
        socket.close();
UI-Project/src/utils/constants.js
@@ -1,3 +1,4 @@
// export const WebSocketHost = "192.168.1.199";
export const WebSocketHost = "10.153.19.150";
// export const WebSocketHost = "127.0.0.1";
export const host = "88";
UI-Project/src/views/Caching/cachingbefore.vue
@@ -110,7 +110,7 @@
  <div style="height: 500px;">
    <el-card style="flex: 1;margin-left: 10px;margin-top: 20px;" v-loading="loading">
      <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
        <el-table height="240" ref="table"
        <el-table height="340" ref="table"
        @selection-change="handleSelectionChange"
        :data="tableData" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
          <el-table-column prop="slot" align="center" :label="$t('sorter.gridnumber')" min-width="80" />
UI-Project/src/views/Caching/cachingun.vue
@@ -2,24 +2,15 @@
  <div style="height: 500px;">
    <el-card style="flex: 1;margin-left: 10px;margin-top: 20px;" v-loading="loading">
      <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
        <el-table height="240" ref="table"
        @selection-change="handleSelectionChange"
        :data="tableData" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
        <el-table height="340" ref="table" @selection-change="handleSelectionChange" :data="tableData"
          :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
          <el-table-column prop="slot" align="center" :label="$t('sorter.gridnumber')" min-width="80" />
          <el-table-column prop="glass_id" align="center" :label="$t('sorter.glassnumber')" min-width="80" />
          <el-table-column prop="width" align="center" :label="$t('sorter.width')" min-width="120" />
          <el-table-column prop="height" align="center" :label="$t('sorter.height')" min-width="120" />
          <el-table-column
            align="center"
            :label="$t('sorter.startstatus')"
            min-width="80"
            prop="enable_state"
          >
          <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)"
          >
              <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> 
@@ -29,7 +20,8 @@
          </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>
              <el-button size="mini" type="text" plain @click="open(scope.row)">{{ $t('sorter.deficiencieste')
                }}</el-button>
              <el-button size="mini" type="text" plain  @click="opena(scope.row)">{{ $t('sorter.updown') }}</el-button>
            </template>
        </el-table-column>
@@ -37,16 +29,14 @@
      </div>
    </el-card>
  <div class="awatch">
    <img src="../../assets/woshihuancun.png" alt="" style="width: 70%;height: 90%;margin-left: 200px;margin-top: 20px;position: relative;">
      <img src="../../assets/woshihuancun.png" alt=""
        style="width: 70%;height: 90%;margin-left: 200px;margin-top: 20px;position: relative;">
    <div style="position: relative; width: 500px;height: 95px;margin-top: -165px;margin-left: 450px;">
    <div
      v-for="(rect, index) in adjustedRects"
      :key="rect"
      :style="{ position: 'absolute',
        <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>
@@ -69,7 +59,7 @@
import { useI18n } from 'vue-i18n'
  const { t } = useI18n()
// import i18n from '@/i18n';
const tableData = ref([])
const tableData = reactive([]);
const slot = ref('')
const adjustedRects = ref([]);
  
@@ -106,10 +96,13 @@
    );  
    if (confirmResult === 'confirm') {  
      // 用户点击了“是”,现在调用删除接口  
      var url="/unLoadGlass/downStorage/deleteDownStorageCage?downStorageCageId="+row.id;
      var url = "/unLoadGlass/downStorage/deleteDownStorageCage";
      console.log(url);
      const response = await request.post(url, {
        esdId: row.esdId
        glassId: row.glass_id,
        state: 9,
        line: 1001,
        workingProcedure: '磨边前理片笼',
    })
    if (response.code === 200) {
      ElMessage.success(response.message);
@@ -210,8 +203,7 @@
// 定义消息处理函数,更新 receivedData 变量
const handleMessage = (data) => {
  // 更新 tableData 的数据
  tableData.value = data.params2[0]
  // tableData.splice(0, tableData.length, ...data.params2[0]);
  tableData.splice(0, tableData.length, ...data.params2[0]);
  // tableData.value = data.params[0]
  // adjustedRects.value = data.EdgStorageCageinfos[0]
  adjustedRects.value = data.params2[0].map(rect => ({  
@@ -235,13 +227,25 @@
});
</script>
<style scoped>
#dt {
  display: block;
  float: left;
  line-height: 20px;
  margin-left: 100px;
}
 
#dt { display:block; float:left;line-height: 20px;margin-left: 100px;}
#dta { display:block; float:left;line-height: 20px;margin-left: 80%;}
#dta {
  display: block;
  float: left;
  line-height: 20px;
  margin-left: 80%;
}
#dialog-footer{
  text-align: center;
  margin-top: -15px;
}
#message{
  text-align: center;
  align-items: center;
@@ -251,6 +255,7 @@
   background-color: #337ecc;
   margin-left: 28%;
}
.awatch{
  height: 460px;
  width: 1500px;
UI-Project/src/views/GlassStorage/MaterialRackManagement.vue
@@ -4,7 +4,7 @@
      <div
        slot="header"
        class="clearfix"
        style="display: flex; align-items: center"
        style="display: flex; align-items: center;margin-top: -20px;"
      >
        <!-- 左侧按钮组 -->
        <div>
@@ -16,9 +16,8 @@
          >
          <el-button type="success" size="mini">吊装位入库</el-button>
        </div>
        <!-- 右侧选择框 -->
        <el-form-item style="margin-top: 15px; width: 150px">
        <el-form-item style="margin-top: 15px; width: 150px;margin-left: 10px;">
          <el-select v-model="formData2.dzw" placeholder="请选择吊装位">
            <el-option label="吊装位1" value="吊装位1"></el-option>
            <el-option label="吊装位2" value="吊装位2"></el-option>
UI-Project/src/views/Identify/identify.vue
@@ -2,23 +2,18 @@
  <div style="display: flex;">
<el-input v-model="inputValue" style="margin-left: 15px;margin-top: 10px;width: 240px" placeholder="请输入工程号" @blur="handleBlur"/>
<el-pagination
      v-model:current-page="currentPage3"
      v-model:page-size="pageSize3"
      v-model:current-page="currentPage"
      :page-size="pageSize"
      :size="size"
      :disabled="disabled"
      :background="background"
      layout="prev, pager, next, jumper"
      :total="1000"
      @size-change="handleSizeChange"
      :total="totalPages"
      @current-change="handleCurrentChange"
    />
    </div>
    <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;" v-loading="loading">
      <el-scrollbar height="550px" >
  <div id="app" style="margin-top: 20px;">
    <!-- <div
      :style="{ width: `${olWidth}px`, height: `${olHeight}px`,position: 'relative',}"
    >  -->
    <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 600px;" v-loading="loading">
      <el-scrollbar height="550px" width="1200px" style="background-color: #e9e9eb;">
  <div style="position: relative;">
    <div  
      v-for="(rect, index) in adjustedRects"  
      :key="rect.glass_id"  
@@ -32,13 +27,13 @@
     <!-- 箭头 -->  
     <!-- <div id="arrow"></div>  
     <div id="line"></div>   -->
     <!-- <div  class="centered-text" >NG24030401B01</div> -->
     <div  class="centered-text">
    <div>{{ rect.process_id }}</div>
    <div style="margin-top: 50px;margin-left: -85px;">{{ rect.widtha }}*{{ rect.heighta }}</div>
    <div>{{ rect.glass_id }}</div>
    <div>{{ rect.widtha }}*{{ rect.heighta }}</div>
  </div>
  </div> 
  <!-- 点击弹出 -->
   </div>
  </el-scrollbar>
  <el-dialog v-model="blind" top="30vh" width="15%" style="text-align: center;">
        <el-button type="warning" plain :icon="Delete" @click="handleDamage(currentGlassId)"  style="width: 140px;margin-left: 10px;">
          {{ $t('order.dilapidation') }}
@@ -47,15 +42,12 @@
          <el-icon class="el-icon--right"><Upload /></el-icon>
          {{ $t('order.Takeaway') }}</el-button>
  </el-dialog> 
   </div>
  <!-- </div>   -->
  </el-scrollbar>
  </el-card>
</template>  
<script setup lang="ts">  
import { Delete, Upload } from '@element-plus/icons-vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { ref, onMounted, onBeforeUnmount,onUnmounted,watchEffect } from 'vue';
import { ref, onMounted, onBeforeUnmount,onUnmounted, computed  } from 'vue';
import request from "@/utils/request"
import { WebSocketHost ,host} from '@/utils/constants'
import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService';
@@ -65,11 +57,18 @@
const blind = ref(false)
const olWidth = ref(); 
const olHeight = ref();
const process_id = ref(); // 用于存储process_id的响应式引用
const glass_id = ref();
const inputValue = ref('');
const currentGlassId = ref(null); // 存储当前点击矩形的 glass_id  
const adjustedRects = ref([]);
const raw = ref([]);
let webSocket: WebSocket | null = null;
const totalPages = ref(0);
const pageSize = ref(1);
const currentPage = ref(1);
const disabled = false;
const size = 'small';
const rawData = ref([]);
// const handleBind = (row) => {
//   blind.value = true; // 打开绑定架子对话框
// };
@@ -78,42 +77,6 @@
  currentGlassId.value = glassId;  
  blind.value = true;  
}  
// onMounted(async () => {
//   try {
//     const response = await request.post('/cacheGlass/taskCache/currentCutTerritory'); // 替换为你的API端点
//     if (response.code === 200) {
//       // const process_id = response.data[0].process_id
//       const rawRects = response.data; // 设置矩形数据
//       console.log(response.data);
//       const { olWidth: newolWidth, olHeight: newolHeight, process_id: newprocess_id ,glass_id:newglass_id } = response.data; // 获取尺寸
//       olWidth.value = newolWidth; // 设置容器宽度
//       olHeight.value = newolHeight; // 设置容器高度
//       process_id.value = newprocess_id;
//       glass_id.value = newglass_id;
//       adjustedRects.value = rawRects.map(rect => ({
//         ...rect, // 复制原始对象的其他属性
//         x_axis: (rect.x_axis*100) * 0.003, // 将x值除以3
//         y_axis: (rect.y_axis*100) * 0.003,
//         width: (rect.width*100) * 0.002 ,
//         widtha: rect.width ,
//         heighta: rect.height ,
//         height:( rect.height*100) * 0.002 ,
//         glass_state: rect.glass_state
//       }));
//       console.log(adjustedRects.value);
//       //   console.log( (rect.width*100) / 300 );
//     } else {
//       // console.error('Failed to fetch rectangles from API.');
//       console.error('Failed to fetch rects from API.');
//     }
//   } catch (error) {
//     // console.error('Error fetching rectangles :', error);
//     console.error('Error fetching rects :', error);
//   }
// });
// 破损
const handleDamage = async () => {
  try  {
@@ -121,16 +84,16 @@
    //   console.log(url);
    //   const response = await request.post(url)
  const response = await request.post('/cacheGlass/taskCache/identControls', {
    identId: currentGlassId.value,
    controlsId: 201,
    glassId: currentGlassId.value,
    state: 8,
    line: 1001,
    machine: '识别',
    workingProcedure: '识别',
    })
    if (response.code == 200) {
      ElMessage.success(response.message);
      // window.location.reload() 
      blind.value = false;
      updateRectStatus(currentGlassId.value, 201);
      updateRectStatus(currentGlassId.value, 8);
    } else {
      // 请求失败,显示错误消息
      ElMessage.error(response.msg);
@@ -148,17 +111,17 @@
    //   console.log(url);
    //   const response = await request.post(url)
  const response = await request.post('/cacheGlass/taskCache/identControls', {
    identId: currentGlassId.value,
    controlsId: 200,
    glassId: currentGlassId.value,
    state: 9,
    line: 1001,
    machine: '识别',
    workingProcedure: '识别',
    })
    if (response.code == 200) {
      // 绑定成功,处理逻辑
      ElMessage.success(response.message);
      // window.location.reload() 
      blind.value = false;
      updateRectStatus(currentGlassId.value, 200);
      updateRectStatus(currentGlassId.value, 9);
    } else {
      // 请求失败,显示错误消息
      ElMessage.error(response.msg);
@@ -170,41 +133,53 @@
  }
}
const handleBlur = async () => {  
  if (inputValue.value !== '') {
    try {
  if (inputValue.value) {
      var url="/cacheGlass/taskCache/cutTerritory?current="+inputValue.value;
      const response = await request.post(url)
      if (response.data && response.data.currentCutTerritory) {
        // 假设返回的数据需要调整坐标和尺寸
        adjustedRects.value = response.data.currentCutTerritory.map(rect => ({
    if (response.code === 200) {
      console.log(response.data);
      const rawRects = response.data[0];
      rawData.value = response.data;
      totalPages.value = rawData.value.length;
      const scaleFactor =  1621.78/6000;
      adjustedRects.value = rawRects.map(rect => ({
          ...rect,  
          x_axis: 1360 - (rect.x_axis + rect.width) * 0.37,
          y_axis: (rect.y_axis * 100) * 0.003,
          width: (rect.width * 100) * 0.002,
          height: (rect.height * 100) * 0.002,
        x_axis: (6000 -(rect.x_axis + rect.width)) * scaleFactor,
        y_axis: rect.y_axis * 0.17,
        width: rect.width * scaleFactor ,
          widtha: rect.width ,
          heighta: rect.height ,
        height: rect.height * 0.165 ,
          glass_state: rect.glass_state  
        }));
      // 如果WebSocket已连接,则关闭
      if (webSocket) {
        webSocket.close();
        webSocket = null;
      }  
    } catch (error) {
      console.error('请求数据失败:', error);
       currentPage.value = 1;
    }  
  } else{
    connectWebSocket();
  }  
};  
// const handleBlur = async () => {
//   if (inputValue.value !=''){
//     try {
//       var url="/cacheGlass/taskCache/cutTerritory?current="+inputValue.value;
//       const response = await request.post(url)
//       console.log(response.data.length);
//     if (response.code == 200) {
//       adjustedRects.value = response.data
//       ElMessage.success(response.message);
//     } else {
//       ElMessage.error(response.msg);
//     }
// }
const handleCurrentChange = (val: number) => {
  currentPage.value = val;
  const page = currentPage.value - 1
      const scaleFactor =  1621.78/6000;
      adjustedRects.value = rawData.value[page]?.map(rect => ({
      // adjustedRects.value = rawRects.map(rect => ({
        ...rect,
        x_axis: (6000 -(rect.x_axis + rect.width)) * scaleFactor,
        y_axis: rect.y_axis * 0.17,
        width: rect.width * scaleFactor ,
        widtha: rect.width ,
        heighta: rect.height ,
        height: rect.height * 0.165 ,
        glass_state: rect.glass_state
      }));
};
function getRectColor(state: number): string {  
  switch (state) {  
    case 0:  
@@ -215,12 +190,12 @@
      return '#b3e19d';  
    case 120:  
      return '#f89898';  
    case 200:
      return 'lightblue';
    case 201:
    case 8:
      return '#911005';
    case 9:
      return '#f3d19e';  
    default:
      return '#911005'; // 默认颜色
    // default:
    //   return '#911005'; // 默认颜色
  }  
// 更新矩形状态  
@@ -231,38 +206,45 @@
    }  
  });  
}
let socket = null;
const connectWebSocket = () => {
  if (!webSocket) {
const socketUrl = `ws://${WebSocketHost}:${host}/api/cacheGlass/api/talk/cacheGlass`;
const handleMessage = (data) => {
  // adjustedRects.value = data.currentCutTerritory[0]
    webSocket = new WebSocket(socketUrl);
    webSocket.onmessage = (event) => {
      const data = JSON.parse(event.data);
      const scaleFactor =  1621.78/6000;
  adjustedRects.value = data.currentCutTerritory[0].map(rect => ({  
        ...rect,
        x_axis: 1360 -(rect.x_axis + rect.width) * 0.37,
        // x_axis: (rect.x_axis*100) * 0.003,
        y_axis: (rect.y_axis*100) * 0.003,
        width: (rect.width*100) * 0.002 ,
        x_axis: (6000 -(rect.x_axis + rect.width)) * scaleFactor,
        y_axis: rect.y_axis * 0.17,
        width: rect.width * scaleFactor ,
        widtha: rect.width ,
        heighta: rect.height ,
        height:( rect.height*100) * 0.002 ,
        height: rect.height * 0.165 ,
        glass_state: rect.glass_state
      }));  
};
    webSocket.onerror = (error) => {
      console.error('WebSocket Error:', error);
    };
    webSocket.onclose = () => {
      console.log('WebSocket Connection Closed');
      // 可以选择重新连接
    };
  }
};
onMounted(() => {
  socket = initializeWebSocket(socketUrl, handleMessage);
  // 初始时,如果输入框为空,则连接WebSocket
  if (!inputValue.value) {
    connectWebSocket();
  }
});
  onUnmounted(() => {
    if (socket) {
    closeWebSocket(socket);
  if (webSocket) {
    webSocket.close();
    }
    });
  watchEffect(() => {
  if (inputValue.value === '') {
    handleMessage();
  }
});
onBeforeUnmount(() => {
  console.log("关闭了")
  closeWebSocket();
});
</script>  
  
@@ -273,10 +255,11 @@
.centered-text {
  /* 设置文字居中样式 */  
  display: flex;
  /* display: flex; */
  justify-content: center;  
  align-items: center;  
  height: 100%; /* 确保div占据整个矩形的高度 */  
  font-size: small;
#rect {  
  position: relative; /* 确保箭头可以相对于矩形定位 */  
UI-Project/src/views/LoginView.vue
@@ -61,12 +61,10 @@
          .then((res) => {
            if (res['code'] == 200) {
              store.$patch({user: res.data})
              console.log(res.data)
              router.push('/main')
              ElMessage.success(t('login.loginSuccessful'))
            } else {
              ElMessage.error(res['msg'])
              // ElMessage.error(res['msg'])
              store.$patch({
              user: null,
              })
UI-Project/src/views/PurchaseReturn/purchaseReturn.vue
@@ -3,7 +3,7 @@
import {reactive} from "vue";
import {useRouter} from "vue-router"
import request from "@/utils/request"
import { ref, onMounted, onBeforeUnmount,onUnmounted } from 'vue';
import { ref, onMounted, onBeforeUnmount } from 'vue';
import { WebSocketHost ,host} from '@/utils/constants'
import { ElMessage, ElMessageBox } from 'element-plus'
import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService';
@@ -22,13 +22,12 @@
const adjustedRectsb = ref([]);
const currentGlassId = ref(null);
const currenttemperingFeedSequence = ref(null);
let socket = null;
const socketUrl = `ws://${WebSocketHost}:${host}/api/temperingGlass/api/talk/temperingGlass`;
const handleMessage = (data) => {
// 进炉中
  if(data.intoGlass!=null){
    adjustedRects1.value =  data.intoGlass[0].map(rect => {  
      console.log( adjustedRects1.value);
      const scaleFactor =  794.67/5087;
        let adjustedWidth, adjustedHeight, adjustedWidtha, adjustedHeighta,widtha,heighta;;
        let newX = rect.yCoordinate; 
      if (rect.width < rect.height) {
@@ -39,39 +38,26 @@
        heighta = rect.height;
      }
      if (rect.angle === 0) {  
    adjustedWidth = widtha * 0.12;
    adjustedWidth = widtha * scaleFactor;
    adjustedHeight = heighta * 0.1;
    adjustedWidtha = widtha;
    adjustedHeighta = heighta;
    newX = 5087 - (rect.yCoordinate + widtha);
    } else {
    adjustedWidth = heighta * 0.12;
    adjustedHeight = widtha * 0.1;
    adjustedWidtha = heighta;
    adjustedHeighta = widtha;
    newX = 5087 - (rect.yCoordinate + heighta);
  }
  // if (rect.angle === 0) {
  //         adjustedWidth = heighta * 0.12;
  //         adjustedHeight = widtha * 0.1;
  //         adjustedWidtha = heighta;
  //         adjustedHeighta = widtha;
  //         newX = 5087 - (rect.xCoordinate + heighta);
  //       } else {
  //         adjustedWidth = widtha * 0.12;
  //         adjustedHeight = heighta * 0.1;
  //         adjustedWidtha = widtha;  
  //         adjustedHeighta = heighta;  
  //         newX = 5087 - (rect.xCoordinate + widtha);
  //       }
    newX = 5087 - (rect.yCoordinate + widtha);
    } else {
    adjustedWidth = heighta * scaleFactor;
    adjustedHeight = widtha * 0.1;
    // adjustedWidtha = widtha;
    // adjustedHeighta = heighta;
    newX = 5087 - (rect.yCoordinate + heighta);
  }
        return {  
        ...rect, 
        xcoordinate: newX * 0.12,
        xcoordinate: newX * scaleFactor,
        ycoordinate: rect.xCoordinate * 0.1,
        width: adjustedWidth,  
        height: adjustedHeight,  
        widtha: adjustedWidtha,
        heighta: adjustedHeighta,
        widtha: rect.width,
        heighta: rect.height,
      };  
      });
      }else{
@@ -79,7 +65,7 @@
      }
  if(data.intoGlass2!=null){
    adjustedRects2.value =  data.intoGlass2[0].map(rect => {  
      console.log( adjustedRects2.value);
      const scaleFactor =  794.67/5087;
      let adjustedWidth, adjustedHeight, adjustedWidtha, adjustedHeighta,widtha,heighta;;
      let newX = rect.yCoordinate; 
      if (rect.width < rect.height) {
@@ -90,39 +76,26 @@
        heighta = rect.height;
      }
      if (rect.angle === 0) {  
    adjustedWidth = widtha * 0.12;
    adjustedWidth = widtha * scaleFactor;
    adjustedHeight = heighta * 0.1;
    adjustedWidtha = widtha;
    adjustedHeighta = heighta;
    newX = 5087 - (rect.yCoordinate + widtha);
    } else {
    adjustedWidth = heighta * 0.12;
    adjustedHeight = widtha * 0.1;
    adjustedWidtha = heighta;
    adjustedHeighta = widtha;
    newX = 5087 - (rect.yCoordinate + heighta);
  }
  //     if (rect.angle === 0) {
  //         adjustedWidth = heighta * 0.12;
  //         adjustedHeight = widtha * 0.1;
  //         adjustedWidtha = heighta;
  //         adjustedHeighta = widtha;
  //         newX = 5087 - (rect.xCoordinate + heighta);
  // } else {
  //         adjustedWidth = widtha * 0.12;
  //         adjustedHeight = heighta * 0.1;
  //         adjustedWidtha = widtha;  
  //         adjustedHeighta = heighta;  
  //         newX = 5087 - (rect.xCoordinate + widtha);
  // }
    newX = 5087 - (rect.yCoordinate + widtha);
    } else {
    adjustedWidth = heighta * scaleFactor;
    adjustedHeight = widtha * 0.1;
    // adjustedWidtha = widtha;
    // adjustedHeighta = heighta;
    newX = 5087 - (rect.yCoordinate + heighta);
  }
        return {  
        ...rect, 
        xcoordinate: newX * 0.12,
        xcoordinate: newX * scaleFactor,
        ycoordinate: rect.xCoordinate * 0.1,
        width: adjustedWidth,  
        height: adjustedHeight,  
        widtha: adjustedWidtha,
        heighta: adjustedHeighta,
        widtha: rect.width,
        heighta: rect.height,
      };  
      });
      }else{
@@ -131,6 +104,7 @@
  // 进炉前
  if(data.waitingGlass!=null){
    adjustedRectsa.value = data.waitingGlass[0].map(rect => {  
      const scaleFactor =  1621.78/5190;
  let adjustedWidth, adjustedHeight, adjustedWidtha, adjustedHeighta,widtha,heighta;; 
  let newX = rect.yCoordinate; 
      if (rect.width < rect.height) {
@@ -141,26 +115,26 @@
        heighta = rect.height;
      }
  if (rect.angle === 0) {  
    adjustedWidth = widtha * 0.24;
    adjustedWidth = widtha * scaleFactor;
    adjustedHeight = heighta * 0.16;
    adjustedWidtha = widtha;
    adjustedHeighta = heighta;
    // adjustedWidtha = widtha;
    // adjustedHeighta = heighta;
    newX = 5190 - (rect.yCoordinate + widtha); 
    } else {  
    adjustedWidth = heighta * 0.24;
    adjustedWidth = heighta * scaleFactor;
    adjustedHeight = widtha * 0.16;  
    adjustedWidtha = heighta;
    adjustedHeighta = widtha;
    // adjustedWidtha = widtha;
    // adjustedHeighta = heighta;
    newX = 5190 - (rect.yCoordinate + heighta);  
  }  
  return {  
    ...rect, 
    x: newX * 0.24,
    x: newX * scaleFactor,
    y: rect.xCoordinate * 0.16,  
    width: adjustedWidth,  
    height: adjustedHeight,  
    widtha: adjustedWidtha,
    heighta: adjustedHeighta,
    widtha: rect.width,
    heighta: rect.height,
  };  
});
  }else{
@@ -169,6 +143,7 @@
    // 已出炉
  if(data.outGlass!=null){
    adjustedRectsb.value = data.outGlass[0].map(rect => {  
      const scaleFactor =  1621.78/5190;
  let adjustedWidth, adjustedHeight, adjustedWidtha, adjustedHeighta,widtha,heighta;;
  let newX = rect.yCoordinate; 
      if (rect.width < rect.height) {
@@ -179,26 +154,26 @@
        heighta = rect.height;
      }
  if (rect.angle === 0) {  
    adjustedWidth = widtha * 0.24;
    adjustedWidth = widtha * scaleFactor;
    adjustedHeight = heighta * 0.16;  
    adjustedWidtha = widtha;
    adjustedHeighta = heighta;
    // adjustedWidtha = widtha;
    // adjustedHeighta = heighta;
    // newX = 5190 - (rect.yCoordinate + widtha); 
  } else {  
    adjustedWidth = heighta * 0.24;
    adjustedWidth = heighta * scaleFactor;
    adjustedHeight = widtha * 0.16;  
    adjustedWidtha = heighta;
    adjustedHeighta = widtha;
    // adjustedWidtha = heighta;
    // adjustedHeighta = widtha;
    // newX = 5190 - (rect.yCoordinate + heighta);  
  }  
  return {  
        ...rect, // 复制原始对象的其他属性  
        x: newX * 0.24,
        x: newX * scaleFactor,
        y: rect.xCoordinate * 0.16,
        width: adjustedWidth,  
        height: adjustedHeight,  
        widtha: adjustedWidtha,
        heighta: adjustedHeighta,
        widtha: rect.width,
        heighta: rect.height,
  };  
});
  }else{
@@ -206,12 +181,7 @@
      }
};
onMounted(() => {
  socket = initializeWebSocket(socketUrl, handleMessage);
});
  onUnmounted(() => {
    if (socket) {
    closeWebSocket(socket);
    }
  initializeWebSocket(socketUrl, handleMessage);
    });
function updateRectColors() {  
  adjustedRectsa.value.forEach(rect => {  
UI-Project/src/views/PurchaseReturn/purchaseStorage.vue
@@ -36,6 +36,7 @@
  // 更新 tableData 的数据
  if(data.overGlass!=null){
    adjustedRects.value =  data.overGlass[0].map(rect => {  
      const scaleFactor =  1621.78/5190;
  let adjustedWidth, adjustedHeight, adjustedWidtha, adjustedHeighta,widtha,heighta;
      let newX = rect.yCoordinate; 
      if (rect.width < rect.height) {
@@ -46,34 +47,34 @@
        heighta = rect.height;
      }
    if (rect.angle === 0) {  
    adjustedWidth = widtha * 0.24;
    adjustedWidth = widtha * scaleFactor;
    adjustedHeight = heighta * 0.16;  
    adjustedWidtha = widtha;
    adjustedHeighta = heighta;
    // adjustedWidtha = widtha;
    // adjustedHeighta = heighta;
    // newX = 5190 - (rect.yCoordinate + rect.width); 
  } else {  
    adjustedWidth = heighta * 0.24;
    adjustedWidth = heighta * scaleFactor;
    adjustedHeight = widtha * 0.16;  
    adjustedWidtha = heighta;
    adjustedHeighta = widtha;
    // adjustedWidtha = heighta;
    // adjustedHeighta = widtha;
    // newX = 5190 - (rect.yCoordinate + rect.height);  
  }  
  return {  
    ...rect, 
    xcoordinate: newX * 0.24,
    xcoordinate: newX * scaleFactor,
    ycoordinate: rect.xCoordinate * 0.16,
    width: adjustedWidth,  
    height: adjustedHeight,  
    widtha: adjustedWidtha,
    heighta: adjustedHeighta,
    widtha: rect.width,
    heighta: rect.height,
  };  
});
  }
};
function updateRectColors() {  
  adjustedRectsa.value.forEach(rect => {
  adjustedRects.value.forEach(rect => {
    if (rect.glassId === glassId) {  
      rect.state = 5;
      rect.state = 8;
    }
  });  
}  
@@ -83,7 +84,7 @@
      return '#eebe77';  
    case 4:  
      return '#CD6090';
    case 5:
    case 8:
      return '#911005';  
  }  
}
@@ -99,7 +100,7 @@
    glassId: currentGlassId.value,
    // temperingFeedSequence: currenttemperingFeedSequence.value,
    line: 4001,
    status: 2,
    status: 8,
    workingProcedure: '钢化',
    })
    if (response.code == 200) {
UI-Project/src/views/ReportWork/reportWork.vue
@@ -18,9 +18,9 @@
    </el-select>
    <el-select v-model="report.workingProcedure" :placeholder="$t('reportmanage.cprocess')" style="margin-left: 10px;" >
      <el-option :label="$t('reportmanage.all')" value="0"></el-option>
      <el-option :label="$t('reportmanage.incise')" value="1"></el-option>
      <el-option :label="$t('reportmanage.edging')" value="2"></el-option>
      <el-option :label="$t('reportmanage.steel')" value="3"></el-option>
      <el-option :label="$t('reportmanage.incise')" value="切割"></el-option>
      <el-option :label="$t('reportmanage.edging')" value="磨边"></el-option>
      <el-option :label="$t('reportmanage.steel')" value="钢化"></el-option>
    </el-select>
    <el-button type="primary" style="margin-left: 10px;" @click="selectReportData()">{{ $t('reportmanage.inquire') }}</el-button>
    <el-button type="success" style="margin-left: 10px;" @click="handleConfirm">{{ $t('reportmanage.signingwork') }}</el-button>
UI-Project/src/views/Returns/returns.vue
@@ -710,7 +710,7 @@
   
  </div>
    <el-button :disabled="!canSelectProject" style="margin-top: 5px;margin-left: 15px;"  type="primary" @click="dialogFormVisible = true">{{ $t('basicData.selectproject') }}</el-button>
    <el-button :style="{ backgroundColor: canStartLoading ? 'green' : 'initial',color: canStartLoading ? 'white' : 'black', }" style="margin-top: 5px;margin-left: 20px;"  @click="handleBind">{{ $t('basicData.startloading') }}</el-button>
    <el-button :disabled="!canSelectProject" :style="{ backgroundColor: canStartLoading ? 'green' : 'initial',color: canStartLoading ? 'white' : 'black', }" style="margin-top: 5px;margin-left: 20px;"  @click="handleBind">{{ $t('basicData.startloading') }}</el-button>
    <el-button style="margin-top: 5px;margin-left: 20px;"  id="searchButton" type="warning" @click="handleBinda">{{ $t('basicData.stop') }}</el-button>
    <el-button style="margin-top: 5px;margin-left: 20px;" id="searchButton" type="info" @click="handlezhiban">{{ $t('searchOrder.dutyinformation') }}</el-button>
    <!-- <el-button style="margin-top: 5px;margin-left: 20px;"  id="searchButton" type="danger" @click="handleBindb">停止任务</el-button> -->
@@ -718,7 +718,7 @@
    <el-card style="flex: 1;margin-left: 10px;margin-top: 15px;" v-loading="loading">
      <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
    <el-table
    height="150"
    height="350"
     ref="table" 
     :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"
      :data="tableData"
UI-Project/src/views/Slicecage/slicecage.vue
@@ -40,7 +40,6 @@
const adjustedRectsh = ref([]);
const currentRow = reactive({}); // 当前行的数据 
const inputValuesa = reactive({});
const add = ref(false)
const flowCardId = ref('');
const gap = ref('');
@@ -76,7 +75,8 @@
const cell8=ref(true);
const cell9=ref(true);
const selectedRow = ref(null); // 存储选中的行数据  
const temperingtotal = ref(0);
const glasstotal = ref(0);
    // 当前页码和每页显示的条数
    const currentPage = ref(1);
    const itemsPerPage = computed(() => {
@@ -271,7 +271,7 @@
      } 
    ); 
    if (confirmResult === 'confirm') {  
      const response = await request.post("/cacheVerticalGlass/bigStorageCageDetails/damageBigStorageCageDetails?status="+0, row)
      const response = await request.post("/cacheVerticalGlass/bigStorageCageDetails/damageBigStorageCageDetails?status="+8, row)
    if (response.code === 200) {
     tableData.value = response.data;
     ElMessage.success(response.message);
@@ -296,7 +296,7 @@
      } 
    ); 
    if (confirmResult === 'confirm') {  
      const response = await request.post("/cacheVerticalGlass/bigStorageCageDetails/damageBigStorageCageDetails?status="+1, row)
      const response = await request.post("/cacheVerticalGlass/bigStorageCageDetails/damageBigStorageCageDetails?status="+9, row)
    if (response.code === 200) {
     tableData.value = response.data;
     ElMessage.success(response.message);
@@ -346,7 +346,7 @@
      } 
    ); 
    if (confirmResult === 'confirm') {  
      const response = await request.post("/cacheVerticalGlass/temperingGlassInfo/damageTemperingGlassInfo?status="+0, row)
      const response = await request.post("/cacheVerticalGlass/temperingGlassInfo/damageTemperingGlassInfo?status="+8, row)
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {  
@@ -397,7 +397,7 @@
      } 
    ); 
    if (confirmResult === 'confirm') {  
      const response = await request.post("/cacheVerticalGlass/temperingGlassInfo/damageTemperingGlassInfo?status="+1, row)
      const response = await request.post("/cacheVerticalGlass/temperingGlassInfo/damageTemperingGlassInfo?status="+9, row)
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {  
@@ -525,6 +525,12 @@
    if (response.code == 200) {
      ElMessage.success(response.message);
      tableDatagh.value = response.data
      temperingtotal.value = response.data.length
      let totalCount = 0;
      response.data.forEach(item => {
        totalCount += item.count || 0;
      });
      glasstotal.value = totalCount;
    } else {
      ElMessage.error(response.message);
    }
@@ -594,7 +600,10 @@
  // 更新 tableData 的数据
  if(data.bigStorageCageDetailsOutTask!=null){
    tableDatac.value = data.bigStorageCageDetailsOutTask[0]
    console.log(data.bigStorageCageDetailsOutTask[0])
    adjusta.value = data.bigStorageCageDetailsOutTask[0].filter(rect => rect.slot !== null && rect.slot !== undefined);
    // console.log(data.bigStorageCageDetailsOutTask[0]);
  } else {
    tableDatac.value = '',
    adjusta.value = ''
@@ -620,6 +629,7 @@
   }
if(data.temperingGlassInfoList!=null){
  tableDatab.value = data.temperingGlassInfoList[0]
  console.log(tableDatab.value)
}else{
    tableDatab.value = ''
      }
@@ -770,7 +780,7 @@
      <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;max-height: 100px;">
        <el-table height="100px" ref="table" 
        :data="tableDatac" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
          <el-table-column prop="bigStorageCageOutTask.glassId" align="center" :label="$t('searchOrder.outputglassID')" min-width="120" />
          <el-table-column prop="bigStorageCageOutTask.glassId" align="center" :label="$t('searchOrder.outputglassID')" min-width="140" />
          <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" />
@@ -780,10 +790,10 @@
            <el-tag type="success" >{{ scope.row.bigStorageCageOutTask.taskState==0? $t('searchOrder.filmenter') : $t('searchOrder.infilm') }}</el-tag>
          </template>
          </el-table-column>
          <el-table-column prop="id" align="center" :label="$t('searchOrder.tabid')" min-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="120"/>
          <el-table-column prop="glassId" align="center" :label="$t('searchOrder.glassID')" min-width="140"/>
          <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="140"/>
          <el-table-column prop="glassType" align="center" :label="$t('searchOrder.typeglass')" min-width="100"/>
@@ -793,11 +803,11 @@
          <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">
          <!-- <el-table-column fixed="right" :label="$t('searchOrder.endtask')" align="center" width="150">
            <template #default="scope">
              <el-button size="mini" type="text" plain @click="finish(scope.row)">{{ $t('searchOrder.completetask') }}</el-button>
            </template>
        </el-table-column>
        </el-table-column> -->
        </el-table>
      </div>
    </el-card>
@@ -806,7 +816,7 @@
        <el-table height="100px" ref="table" 
        @selection-change="handleSelectionChange"
        :data="tableDatad" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
          <el-table-column prop="bigStorageCageFeedTask.glassId" align="center" :label="$t('searchOrder.intoglassid')" min-width="120" />
          <el-table-column prop="bigStorageCageFeedTask.glassId" align="center" :label="$t('searchOrder.intoglassid')" min-width="140" />
          <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="$t('searchOrder.taskstatus')" min-width="120">
@@ -815,10 +825,10 @@
          </template>
          </el-table-column>
          <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="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="120"/>
          <el-table-column prop="glassId" align="center" :label="$t('searchOrder.glassID')" min-width="140"/>
          <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="140"/>
          <el-table-column prop="glassType" align="center" :label="$t('searchOrder.typeglass')" min-width="100"/>
@@ -828,11 +838,11 @@
          <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">
          <!-- <el-table-column fixed="right" :label="$t('searchOrder.endtask')" align="center" width="150">
            <template #default="scope">
              <el-button size="mini" type="text" plain @click="finish(scope.row)">{{ $t('searchOrder.completetask') }}</el-button>
            </template>
        </el-table-column>
        </el-table-column> -->
        </el-table>
      </div>
    </el-card>
@@ -840,7 +850,7 @@
            <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>{{ $t('searchOrder.Usage') }}</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;">  
@@ -1247,7 +1257,7 @@
                >  
          <!-- <el-table-column prop="menuName" label="二级菜单栏" align="center" min-width="140" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"/>   -->
          <el-table-column prop="glassId" :label="$t('searchOrder.glassID')" align="center" min-width="130"/>  
          <el-table-column prop="sequence" align="center" :label="$t('searchOrder.pieceingrid')" min-width="130" />
          <!-- <el-table-column prop="sequence" align="center" :label="$t('searchOrder.pieceingrid')" min-width="130" /> -->
          <el-table-column prop="flowCardId" align="center" :label="$t('searchOrder.cardnumber')" min-width="130" />
          <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" />
@@ -1343,9 +1353,12 @@
  </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="$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="id" fixed align="center" :label="$t('searchOrder.sheetID')" min-width="150"/>
            -->
          <el-table-column prop="glassId" fixed align="center" :label="$t('searchOrder.glassID')" 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" />
@@ -1379,16 +1392,36 @@
        </el-tag>  
      </template> 
          </el-table-column>
          <el-table-column fixed="right" :label="$t('searchOrder.operate')" 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="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-column> -->
        </el-table>
</el-dialog>
<el-dialog v-model="dialogFormVisiblec" top="5vh" width="85%" :title="$t('searchOrder.temperingqueries')">
  <div style="margin-bottom: 20px">
      <el-form>
        <el-row style="margin-top: -15px;margin-bottom: -2px;">
          <el-col :span="4">
              <div id="dt" style="font-size: 15px;">
              <el-form-item :label="$t('searchOrder.temperingtotal')"  style="width: 14vw">
                {{ temperingtotal }}
              </el-form-item>
              </div>
          </el-col>
          <el-col :span="5">
            <div id="dta" style="font-size: 15px;">
          <el-form-item :label="$t('searchOrder.glasstotal')" style="width: 14vw">
                {{ glasstotal }}
              </el-form-item>
              </div>
          </el-col>
        </el-row>
      </el-form>
    </div>
    <el-table  ref="table" style="margin-top: 20px;height: 500px;"
        :data="tableDatagh" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
          <el-table-column prop="engineer_id" fixed align="center" :label="$t('searchOrder.projectnumber')" min-width="150"/>
@@ -1420,7 +1453,7 @@
        <template #footer>
      <div id="dialog-footer">
        <el-button type="primary" @click="handleConfirm">
          {{ $t('searchOrder.add') }}
          {{ $t('searchOrder.makesure') }}
        </el-button>
        <el-button @click="dialoglea = false">{{ $t('searchOrder.cancel') }}</el-button>
      </div>
UI-Project/src/views/StockBasicData/stockBasicData.vue
@@ -20,20 +20,52 @@
const requestData = {  
  line: 2001  
};  
request.post("/cacheGlass/taskCache/selectEdgTask",{
  ...requestData,
const timeRange = ref([])
const selectValuesa = reactive([]);
// request.post("/cacheGlass/taskCache/selectEdgTask",{
//   ...requestData,
}).then((res) => {
          if (res.code == 200) {
// }).then((res) => {
//           if (res.code == 200) {
            
          console.log(res.data);
          tableData.value = res.data
          console.log(res.data[0].slot);
//           console.log(res.data);
//           tableData.value = res.data
//           console.log(res.data[0].slot);
//           } else {
//           ElMessage.warning(res.msg)
//           }
//           });
// 磨边任务查询
const setEdgGlassInfoRequest = async () => {
  let celllist=[]
  let stateList=[]
  if(selectValuesa[0]!=null&&selectValuesa[0]!='undefined'){
    if(selectValuesa[0]!=""){
      celllist=[selectValuesa[0]];
    }
  }
  if(selectValuesa[1]!=null&&selectValuesa[1]!='undefined'){
    if(selectValuesa[1]!=""){
      stateList=[selectValuesa[1]];
    }
  }
console.log(timeRange.value[0],timeRange.value[1]);
  const response = await request.post("/cacheGlass/edgGlassTaskInfo/setEdgGlassInfoRequest", {
    cellList: celllist,
    stateList: stateList,
    beginDate: timeRange.value[0],
    endDate: timeRange.value[1],
  })
  if (response.code === 200) {
    ElMessage.success(response.message);
          } else {
          ElMessage.warning(res.msg)
    ElMessage.error(response.message);
  }
        
          }
          });
// 破损
 const open = async(row) => { 
  try {
@@ -49,10 +81,10 @@
    if (confirmResult === 'confirm') {  
      // 用户点击了“是”,现在调用删除接口  
      const response = await request.post("/cacheGlass/edgStorageCage/edgReportStatus", {
        glassId: row.GlassId,
        controlsId: 300,
        line: 2001,
        machine: '冷加工',
        glassId: row.glassId,
        state: 8,
        line: row.line,
        workingProcedure: '冷加工',
    })
    if (response.code === 200) {
      ElMessage.success(response.message);
@@ -82,10 +114,10 @@
    if (confirmResult === 'confirm') {  
      // 用户点击了“是”,现在调用删除接口  
      const response = await request.post("/cacheGlass/edgStorageCage/edgReportStatus", {
        glassId: row.GlassId,
        controlsId: 301,
        line: 2001,
        machine: '冷加工',
        glassId: row.glassId,
        state: 9,
        line: row.line,
        workingProcedure: '冷加工',
    })
    if (response.code === 200) {
      ElMessage.success(response.message);
@@ -105,7 +137,7 @@
// 定义消息处理函数,更新 receivedData 变量
const handleMessage = (data) => {
  // 更新 tableData 的数据
  tableData.value = data.EdgTasks1[0]
  tableData.value = data.edgTasks[0]
};
onMounted(() => {
  socket = initializeWebSocket(socketUrl, handleMessage);
@@ -123,17 +155,42 @@
<template>
  <div>
    <el-card style="flex: 1;margin-left: 10px;margin-top: 20px;" v-loading="loading">
      <el-select v-model="selectValuesa[0]" filterable :placeholder="$t('请选择线路')" clearable style="margin-left: 20px;margin-bottom: 10px;">
            <el-option label="磨边一线" value="2001"></el-option>
            <el-option label="磨边二线" value="2002"></el-option>
          </el-select>
          <el-select v-model="selectValuesa[1]" filterable :placeholder="$t('请选择状态')" clearable style="margin-left: 20px;margin-bottom: 10px;" >
            <el-option label="未磨边" value="0"></el-option>
            <el-option label="磨边中" value="1"></el-option>
            <el-option label="已磨边" value="2"></el-option>
          </el-select>
          <span class="demonstration" style="margin-left: 20px;margin-bottom: 10px;">时间段</span>
            <el-date-picker v-model="timeRange" type="datetimerange" range-separator="至" start-placeholder="开始日期"  style="margin-left: 20px;margin-bottom: 10px;" value-format = "YYYY-MM-DD hh:mm:ss"
              end-placeholder="结束日期">
            </el-date-picker>
          <el-button type="primary" style="margin-left: 10px;margin-bottom: 10px;" @click="setEdgGlassInfoRequest()">{{
        $t('reportmanage.inquire')
      }}</el-button>
      <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
        <el-table height="240" ref="table"
        <el-table height="750" ref="table"
        @selection-change="handleSelectionChange"
        :data="tableData" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
          <el-table-column prop="GlassId" align="center" :label="$t('workOrder.glassID')" min-width="180" />
          <el-table-column prop="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 prop="glassId" align="center" :label="$t('workOrder.glassID')" min-width="180" />
          <el-table-column prop="width" align="center" :label="$t('workOrder.width')" min-width="120" />
          <el-table-column prop="height" align="center" :label="$t('workOrder.height')" min-width="80" />
          <el-table-column prop="thickness" align="center" :label="$t('workOrder.thickness')" min-width="120" />
          <el-table-column prop="glassType" align="center" :label="$t('workOrder.glasstype')" min-width="120" />
          <el-table-column prop="line" align="center" :label="$t('workOrder.line')" min-width="120" />
          <el-table-column prop="status" :label="$t('workOrder.status')" align="center" width="200">
            <template #default="scope">
              {{ scope.row.status==0?"未磨边":scope.row.status==1?"磨边中":"已磨边" }}
            </template>
        </el-table-column>
          <el-table-column fixed="right" :label="$t('workOrder.operate')" align="center" width="200">
            <template #default="scope">
              <el-button size="mini" type="text" plain @click="open(scope.row)">{{ $t('workOrder.breakage') }}</el-button>
UI-Project/src/views/StockBasicData/stockBasicDatatwo.vue
@@ -20,20 +20,20 @@
const requestData = {  
  line: 2002
};  
request.post("/cacheGlass/taskCache/selectEdgTask",{
  ...requestData,
// request.post("/cacheGlass/taskCache/selectEdgTask",{
//   ...requestData,
}).then((res) => {
          if (res.code == 200) {
// }).then((res) => {
//           if (res.code == 200) {
            
          console.log(res.data);
          tableData.value = res.data
          console.log(res.data[0].slot);
          } else {
          ElMessage.warning(res.msg)
//           console.log(res.data);
//           tableData.value = res.data
//           console.log(res.data[0].slot);
//           } else {
//           ElMessage.warning(res.msg)
        
          }
          });
//           }
//           });
// 破损
 const open = async(row) => {  
  try {
@@ -49,8 +49,8 @@
    if (confirmResult === 'confirm') {  
      // 用户点击了“是”,现在调用删除接口  
      const response = await request.post("/cacheGlass/edgStorageCage/edgReportStatus", {
        glassId: row.GlassId,
        controlsId: 300,
        glassId: row.glass_id,
        controlsId: 8,
        line: 2002,
        machine: '冷加工',
    })
@@ -82,8 +82,8 @@
    if (confirmResult === 'confirm') {  
      // 用户点击了“是”,现在调用删除接口  
      const response = await request.post("/cacheGlass/edgStorageCage/edgReportStatus", {
        glassId: row.GlassId,
        controlsId: 301,
        glassId: row.glass_id,
        controlsId: 9,
        line: 2002,
        machine: '冷加工',
    })
@@ -128,13 +128,11 @@
        <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="$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 prop="glass_id" align="center" :label="$t('workOrder.glassID')" min-width="180" />
          <el-table-column prop="width" align="center" :label="$t('workOrder.width')" min-width="120" />
          <el-table-column prop="height" align="center" :label="$t('workOrder.height')" min-width="80" />
          <el-table-column prop="thickness" align="center" :label="$t('workOrder.thickness')" min-width="120" />
          <el-table-column prop="glass_type" align="center" :label="$t('workOrder.glasstype')" min-width="120" />
          <el-table-column fixed="right" :label="$t('workOrder.operate')" align="center" width="200">
            <template #default="scope">
              <el-button size="mini" type="text" plain @click="open(scope.row)">{{ $t('workOrder.breakage') }}</el-button>
UI-Project/src/views/UnLoadGlass/Landingindication.vue
@@ -30,10 +30,8 @@
    </div>
  </div>
</template>
<script  setup>
import { ref, watchEffect ,onMounted,onUnmounted} from 'vue';
import { useI18n } from 'vue-i18n'
  const { t } = useI18n()
  let language = ref(localStorage.getItem('lang') || 'zh')
@@ -44,48 +42,43 @@
const racks = ref([
  { x: 50, y: 100, height: 100, width: 60, fillColor: '#6a6da9', item: { height: 90, width: 10, fillColor: 'yellow', content: 'NG123456',downGlassInfoList:"" } },
 
  { x: 140, y: 280, height: 60, width: 110, fillColor: '#6a6da9', item: { height: 20, width: 100, fillColor: 'yellow', content: 'NG1234561454' ,downGlassInfoList:""} },
  { x: 280, y: 100, height: 100, width: 60, fillColor: '#6a6da9', item: { height: 90, width: 10, fillColor: 'yellow', content: 'NG12345678',downGlassInfoList:"" } },
 
  { x: 140, y: 280, height: 60, width: 110, fillColor: '#6a6da9', item: { height: 20, width: 100, fillColor: 'yellow', content: 'NG1234561454' ,downGlassInfoList:""} }
  
]);
watchEffect(() => {
  // 触发数据变化时重新渲染
});
const calculateItemXPosition = (rack, item, index) => {
  if (index === 0 ) {
    return rack.x;
  } else if (index === 1 ) {
    return rack.x + rack.width - item.width;
  } else {
    return rack.x + (rack.width - item.width) / 2;
  } else {
    return rack.x + rack.width - item.width;
  }
};
const calculateItemYPosition = (rack, item, index) => {
  if (index === 0 ) {
    return rack.y + (rack.height - item.height) / 2;
  } else if (index === 1) {
    return rack.y + (rack.height - item.height) / 2;
  } else {
    return rack.y + rack.height - item.height;
  } else {
    return rack.y + (rack.height - item.height) / 2;
  }
};
const fetchFlowCardId = async () => {
  try {
    const response = await request.get('unLoadGlass/downWorkStation/getwo');
    if (response.code === 200) {
      console.log(response); 
      // 遍历响应数据并替换racks数组中的item属性
      response.data.forEach((itemData, index) => {
  if (index < racks.value.length) {
    const rack = racks.value[index];
      rack.fillColor = itemData.item.fullCardColor === 'red' ? '#911005' : '#6a6da9';
    const newItem = {
      content: itemData.item.content,
      fillColor: itemData.item.fillColor,
@@ -93,22 +86,14 @@
      height: itemData.item.height === 0 ? "" : 90,
      downGlassInfoList:itemData.item.downGlassInfoList
    };
    if (index === 2 && itemData.item.width > 0) {
    if (index === 1 && itemData.item.width > 0) {
      newItem.width = 100;
      newItem.height = 20;
    }
    rack.item = newItem;
    console.log(racks.value); // 打印更新后的 racks 值
  }
});
    } else {
      ElMessage.error(response.msg);
    }
@@ -121,12 +106,11 @@
//const socketUrl = `ws://${WebSocketHost}:88/api/unLoadGlass/api/talk/unloadglass2`;
// 定义消息处理函数,更新 receivedData 变量
const handleMessage = (data) => {
  // 更新 tableData 的数据
  data.glassinfo[0].forEach((itemData, index) => {
  if (index < racks.value.length) {
    const rack = racks.value[index];
      rack.fillColor = itemData.item.fullCardColor === 'red' ? '#911005' : '#6a6da9';
    const newItem = {
      content: itemData.item.content,
      fillColor: itemData.item.fillColor,
@@ -134,15 +118,11 @@
      height: itemData.item.height === 0 ? "" : 90,
      downGlassInfoList:itemData.item.downGlassInfoList
    };
    if (index === 2 && itemData.item.width > 0) {
    if (index === 1 && itemData.item.width > 0) {
      newItem.width = 100;
      newItem.height = 20;
    }
    rack.item = newItem;
   // console.log("显示图1",racks.value); // 打印更新后的 racks 值
  }
});
@@ -169,9 +149,7 @@
      <td>${info.height}</td>
    </tr>`;
  });
  tableContent += '</table>';
  Swal.fire({
    // title: '玻璃信息',
    title: t('reportWork.glassinformation'),
@@ -181,8 +159,6 @@
    }
  });
};
    const showRectInfo = (rack) => {
      const content = rack.item.content;
      console.log(rack.item.downGlassInfoList[0].flowCardId)
@@ -191,14 +167,9 @@
    const downGlassInfoList = rack.item.downGlassInfoList;
      console.log(downGlassInfoList)
      showCustomAlert(downGlassInfoList);
   }
    };
</script>
<style scoped>
.glass-rack {
  /* margin-left: 10px; */
UI-Project/src/views/UnLoadGlass/Landingindicationtwo.vue
@@ -30,10 +30,8 @@
    </div>
  </div>
</template>
<script setup>
import { ref, watchEffect ,onMounted,onUnmounted} from 'vue';
import { useI18n } from 'vue-i18n'
  const { t } = useI18n()
  let language = ref(localStorage.getItem('lang') || 'zh')
@@ -44,9 +42,9 @@
const racks = ref([
  { x: 50, y: 100, height: 100, width: 60, fillColor: '#6a6da9', item: { height: 90, width: 10, fillColor: 'yellow', content: 'NG123456' } },
 
  { x: 280, y: 100, height: 100, width: 60, fillColor: '#6a6da9', item: { height: 90, width: 10, fillColor: 'yellow', content: 'NG12345678' } },
  { x: 140, y: 280, height: 60, width: 110, fillColor: '#6a6da9', item: { height: 20, width: 100, fillColor: 'yellow', content: 'NG1234561454' } },
 
  { x: 140, y: 280, height: 60, width: 110, fillColor: '#6a6da9', item: { height: 20, width: 100, fillColor: 'yellow', content: 'NG1234561454' } }
  { x: 280, y: 100, height: 100, width: 60, fillColor: '#6a6da9', item: { height: 90, width: 10, fillColor: 'yellow', content: 'NG12345678' } },
  
]);
@@ -58,9 +56,9 @@
  if (index === 0) {
    return rack.x;
  } else if (index === 1) {
    return rack.x + rack.width - item.width;
  } else {
    return rack.x + (rack.width - item.width) / 2;
  } else {
    return rack.x + rack.width - item.width;
  }
};
@@ -68,9 +66,9 @@
  if (index === 0) {
    return rack.y + (rack.height - item.height) / 2;
  } else if (index === 1) {
    return rack.y + (rack.height - item.height) / 2;
  } else {
    return rack.y + rack.height - item.height;
  } else {
    return rack.y + (rack.height - item.height) / 2;
  }
};
@@ -85,14 +83,16 @@
      response.data.forEach((itemData, index) => {
  if (index < racks.value.length) {
    const rack = racks.value[index];
      rack.fillColor = itemData.item.fullCardColor === 'red' ? '#911005' : '#6a6da9';
    const newItem = {
      content: itemData.item.content,
      fillColor: itemData.item.fillColor,
      width: itemData.item.width === 0 ? "" : 10,
      height: itemData.item.height === 0 ? "" : 90
    };
    console.log(itemData.item.fullCardColor);
    if (index === 2 && itemData.item.width > 0) {
    if (index === 1 && itemData.item.width > 0) {
      newItem.width = 100;
      newItem.height = 20;
    }
@@ -125,6 +125,7 @@
  data.glassinfo2[0].forEach((itemData, index) => {
  if (index < racks.value.length) {
    const rack = racks.value[index];
      rack.fillColor = itemData.item.fullCardColor === 'red' ? '#911005' : '#6a6da9';
    const newItem = {
      content: itemData.item.content,
      fillColor: itemData.item.fillColor,
@@ -133,7 +134,7 @@
      downGlassInfoList:itemData.item.downGlassInfoList
    };
    if (index === 2 && itemData.item.width > 0) {
    if (index === 1 && itemData.item.width > 0) {
      newItem.width = 100;
      newItem.height = 20;
    }
@@ -178,7 +179,6 @@
    }
  });
};
    const showRectInfo = (rack) => {
      const content = rack.item.content;
UI-Project/src/views/UnLoadGlass/PrintFlow.vue
New file
@@ -0,0 +1,444 @@
<script setup>
import { useI18n } from 'vue-i18n'
  const { t } = useI18n()
  let language = ref(localStorage.getItem('lang') || 'zh')
import {Search} from "@element-plus/icons-vue";
import {useRouter} from "vue-router"
const router = useRouter()
import request from "@/utils/request"
import { WebSocketHost ,host} from '@/utils/constants'
import { ref, onMounted , onBeforeUnmount, reactive, computed,onUnmounted } from "vue";
import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService';
import { ElMessage, ElMessageBox } from 'element-plus'
import companyInfo from "@/lang/companyInfo";
import QRCode from "qrcode";
const company = companyInfo()
const printMerge = null
let props = defineProps({
  printFlowCardId: null,
  printLayer: null,
})
let produceList = ref([])
const handleGetQRCode = async () => {
  for (let i = 0; i < produceList.value.length; i++) {
    const technologyNumber = produceList.value[i].detail[0].technologyNumber.toString(); // 转换为字符串以便处理每个字符
    produceList.value[i].detail[0]["qrcodeList"] = []; // 初始化一个空数组用来存储 QR Code
    for (let j = 0; j < technologyNumber.length; j++) {
      const processId = produceList.value[i].detail[0].process_id;
      const url = `${processId}/${technologyNumber[j]}`;
      // 生成 QR Code 并存储到数组中
      const qrcodeData = await QRCode.toDataURL(url);
      produceList.value[i].detail[0]["qrcodeList"].push({
        qrcode: qrcodeData,
        technologyNumber: technologyNumber[j]
      });
    }
  }
};
//根据输入的数量重新汇总
const handleSummary = () => {
  for (let i = 0; i < produceList.value.length; i++) {
    //数量
    let totalQuantity = 0;
    //面积
    let totalArea = 0;
    //重量
    let totalWeight = 0;
    // 对每个集合中的 detailList 进行计算
    produceList.value[i].detailList.forEach(collection => {
      totalQuantity += collection.quantity * 1;
      //每个序号面积
      collection.total_area = parseFloat((collection.width * collection.height * collection.quantity / 1000000).toFixed(2))
      totalArea += collection.total_area * 1;
      totalWeight += collection.width * collection.height * collection.quantity / 1000000 * collection.separation * 2.5 * 1;
      //每个序号周长
      collection.perimeter = parseFloat(((collection.width * 2 + collection.height * 2) * collection.quantity / 1000).toFixed(3))
    });
    // 输出每个集合中的总数量
    produceList.value[i].detail[0].quantity = totalQuantity
    produceList.value[i].detail[0].gross_area = totalArea
    produceList.value[i].detail[0].weight = totalWeight
  }
}
// const printFlowCard = () => {
//   // 需要打印的局部区域赋予"print-wrap"的id
//   let el = document.getElementById("printFlowCard");
//   let doc = document;
//   let body = doc.body || doc.getElementsByTagName("body")[0];
//   let printId = "print-" + Date.now();
//   // 创建无副作用的打印容器(因不确定页面的打印元素有无其它样式)
//   let content = doc.createElement("div");
//   content.id = printId;
//   // 样式控制与打印无关的元素隐藏
//   let style = doc.createElement("style");
//   style.innerHTML =
//       "body>#" +
//       printId +
//       "{display:none}@media print{" +
//       "@page {" +
//       "    size: auto; " +
//       "    margin: 5mm 5mm 5mm 5mm; " +
//       "  }body>:not(#" +
//       printId +
//       "){display:none !important}body>#" +
//       printId +
//       "{display:block;padding-top:1px}}";
//   //
//   content.innerHTML = el.outerHTML;
//   // // console.log("el.outerHTML", el.outerHTML);
//   body.appendChild(style);
//   // 与style元素设置的样式相配合
//   // 把打印内容的元素添加到body(作为body的子元素,可用body的子选择器 '>' 控制打印样式)
//   body.appendChild(content);
//   setTimeout(() => {
//     window.print();
//     body.removeChild(content);
//     body.removeChild(style);
//   }, 20);
// }
onMounted(async () => {
  console.log(props.printFlowCardId,props.printLayer)
  try {
    const response = await request.post('/unLoadGlass/downGlassInfo/downGlassPrint',{
        flowCardId:props.printFlowCardId,
        layer:props.printLayer
    });
    if (response.code == 200) {
      // 绑定成功,处理逻辑
      produceList.value = response.data;
      ElMessage.success(response.message);
      for (let j = 0; j < produceList.value.length; j++) {
            let sumWeight = 0
            produceList.value[j].detailList.forEach((item, index) => {
              // 解析 separation 字段的 JSON 字符串
              let separationObj = JSON.parse(item.separation);
              // 获取 thickness 的原始值
              let thicknessValue = separationObj.thickness;
              // 去除 'mm' 单位
              let thicknessWithoutUnit = thicknessValue.replace('mm', '');
              item.separation = thicknessWithoutUnit
              sumWeight += item.width * item.height * item.quantity / 1000000 * item.separation * 2.5 * 1;
            });
            produceList.value[j].detail[0].weight = sumWeight
          }
          handleGetQRCode()
          handleSummary()
          // printFlowCard();
    } else {
      // 请求失败,显示错误消息
      ElMessage.error(response.message);
    }
  } catch (error) {
    // 处理错误
    console.error(error);
  }
});
</script>
<template>
    <div id="printFlowCard">
    <table v-for="(item,id) in produceList" id="contentTable" :key="id">
      <thead>
      <tr v-for="(itemFlow,index) in item.detail" :key="index">
        <td  v-if="like='1'"  colspan="26">
          <div style="float: left;"><input style="border: none;font-size: 28px;width: 70px;margin: 5px  "/></div>
          <div id="bj" style="float: right;font-size: 28px">{{ id + 1 }}</div>
          <div>{{ company.companyName }}</div>
          <div>生产流程卡</div>
          <div v-if="itemFlow.technologyNumber!=''" style="text-align: right;font-weight: bolder">流程卡号: {{
              itemFlow.process_id
            }}/{{ itemFlow.technologyNumber }}
          </div>
          <div v-else style="text-align: right;font-weight: bolder">流程卡号: {{
              itemFlow.process_id
            }}/{{ itemFlow.technologyNumber }}
          </div>
        </td>
        <td v-else colspan="24">
          <div style="float: left;"><input style="border: none;font-size: 28px;width: 70px  "/></div>
          <div id="bj" style="float: right;font-size: 28px">{{ id + 1 }}</div>
          <div>{{ company.companyName }}</div>
          <div>生产流程卡</div>
          <div v-if="itemFlow.technologyNumber!=''" style="text-align: right;font-weight: bolder">流程卡号: {{
              itemFlow.process_id
            }}/{{ itemFlow.technologyNumber }} 共 {{ flowCardCount }} 架
          </div>
          <div v-else style="text-align: right;font-weight: bolder">流程卡号: {{
              itemFlow.process_id
            }}/{{ itemFlow.technologyNumber }} 共 {{ flowCardCount }} 架
          </div>
        </td>
      </tr>
      <tr v-for="(items,index) in item.detail" :key="index">
        <td class="tdNowrap">客户名称:</td>
        <td colspan="2">{{ items.customer_name }}</td>
        <td class="tdNowrap">项目名称:</td>
        <td colspan="2">{{ items.project }}</td>
        <td class="tdNowrap">工艺流程:</td>
        <td colspan="19" v-if="like='1'" style="width: 500px">{{ items.process }}</td>
        <td colspan="17" v-else style="width: 500px">{{ items.process }}</td>
      </tr>
      <tr v-for="(itemTr,index) in item.detail" :key="index">
        <td class="tdNowrap">磨边类型:</td>
        <td colspan="2">{{ itemTr.edging_type }}</td>
        <td class="tdNowrap">单片名称:</td>
        <td colspan="2">{{ itemTr.glass_child }}</td>
        <td class="tdNowrap">产品名称:</td>
        <td v-if="like=='1'" colspan="19">{{ itemTr.product_name }}</td>
        <td v-else colspan="17">{{ itemTr.product_name }}</td>
      </tr>
      <tr>
        <td rowspan='2'>序号</td>
        <td rowspan='2'>编号</td>
        <td v-if="like!=null" rowspan="2">小片顺序</td>
        <td v-else style="display: none;" rowspan="2">小片顺序</td>
        <td rowspan='2'>宽*高</td>
        <td rowspan='2'>数量</td>
        <td rowspan='2'>面积</td>
        <td rowspan='2'>周长</td>
        <td rowspan='2'>半径</td>
        <td rowspan='2'>备注</td>
        <td v-for="(itemPr,index) in item.processList" :key="index" colspan="2">{{ itemPr.process }}</td>
      </tr>
      <tr>
        <td>{{ company.printLabel.printFlowCard.patch }}</td>
        <td>{{ company.printLabel.printFlowCard.lackOf }}</td>
        <td>{{ company.printLabel.printFlowCard.patch }}</td>
        <td>{{ company.printLabel.printFlowCard.lackOf }}</td>
        <td>{{ company.printLabel.printFlowCard.patch }}</td>
        <td>{{ company.printLabel.printFlowCard.lackOf }}</td>
        <td>{{ company.printLabel.printFlowCard.patch }}</td>
        <td>{{ company.printLabel.printFlowCard.lackOf }}</td>
        <td>{{ company.printLabel.printFlowCard.patch }}</td>
        <td>{{ company.printLabel.printFlowCard.lackOf }}</td>
        <td>{{ company.printLabel.printFlowCard.patch }}</td>
        <td>{{ company.printLabel.printFlowCard.lackOf }}</td>
        <td>{{ company.printLabel.printFlowCard.patch }}</td>
        <td>{{ company.printLabel.printFlowCard.lackOf }}</td>
        <td>{{ company.printLabel.printFlowCard.patch }}</td>
        <td>{{ company.printLabel.printFlowCard.lackOf }}</td>
      </tr>
      </thead>
      <tbody>
      <tr v-for="(itemDatile,index) in item.detailList" :key="index">
        <td>{{ itemDatile.order_number }}</td>
        <td>{{ itemDatile.s01Value }}</td>
        <td v-if="like=='1'">{{ itemDatile.technology_number }}</td>
        <td v-else style="display: none"></td>
        <td>{{ itemDatile.child_width }}</td>
        <td class="item" style="width: 5%;height: 100%;">
          <!-- <el-input v-model="itemDatile.quantity" style="border: none" @keyup="handleSummary()"></el-input> -->
          {{ itemDatile.quantity }}
        </td>
        <!-- <td class="item" style="width: 5%;height: 100%;">
          {{ itemDatile.quantity1 }}
        </td> -->
        <td>{{ itemDatile.total_area }}</td>
        <td>{{ itemDatile.perimeter }}</td>
        <td>{{ itemDatile.bend_radius }}</td>
        <td>{{ itemDatile.remarks }}</td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
      </tr>
      </tbody>
      <tfoot>
      <tr style="height: 14px">
        <td v-for="(itemsum,index) in item.detail" :key="index" colspan="26">
          数量:
          <label>{{ itemsum.quantity }}</label>
          面积:
          <label>{{ parseFloat(itemsum.gross_area.toFixed(2)) }}</label>
          重量:
          <label>{{ parseFloat(itemsum.weight.toFixed(2)) }}</label>
        </td>
      </tr>
      <tr v-for="(itemtextarea,index) in item.detail" :key="index">
        <td v-if="like='1'" colspan="4" rowspan="6" style="width: 480px;height: 100px ">
          <div style="width: 100%;height: 100%;"><textarea style="height: 99%;width: 99%;border: none;;font-size: 11px">{{itemtextarea.otherRemarks}}</textarea>
          </div>
        </td>
        <td v-else colspan="6" rowspan="2" style="width: 480px;height: 100px ">
          <!--          <div style="width: 100%;height: 100%"><textarea style="height: 99%;width: 99%;font-size: 11px">{{ itemtextarea.processing_note }}</textarea>-->
          <!--          </div>-->
           <div style="width: 100%;height: 100%;"><textarea style="height: 99%;width: 99%;border: none;;font-size: 11px">{{itemtextarea.otherRemarks}}</textarea>
           </div>
        </td>
        <td colspan="2">完工签名</td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
      </tr>
      <tr>
        <td colspan="2">生产日期</td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
      </tr>
      <tr>
        <td colspan="2">质检签名</td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
      </tr>
      <tr v-for="(qrCodeItem,index) in item.detail" :key="index">
        <td colspan="23">
          <span style="display: flex;">
            <span v-for="(qrCodeItems,index) in qrCodeItem.qrcodeList" :key="index" style="display: flex;width: 35%">
            <div class='qrCode' style="width: 80px;height: 80px;">
            <img :src=qrCodeItems.qrcode>
          </div>
          <span style="float: left;font-weight: bolder">{{
              qrCodeItem.process_id + "/" + qrCodeItems.technologyNumber
            }}</span>
          </span>
          </span>
        </td>
      </tr>
      </tfoot>
    </table>
  </div>
</template>
<style scoped>
* {
  margin: 0;
  padding: 0;
  text-align: center;
}
#printFlowCard {
  text-align: center;
font-weight: bolder;
 height: 600px;
}
#contentTable {
  border-collapse: collapse;
  border: 1px solid black;
  width: 100%;
}
#contentTable thead {
  font-size: 13px;
  font-weight: bolder;
}
#contentTable thead div {
  font-size: 15px;
  font-weight: bolder;
}
#contentTable tr td {
  border: 1px solid black;
  height: 18px;
  font-weight: bolder;
}
#contentTable tbody {
  white-space: nowrap;
}
.tdNowrap {
  white-space: nowrap;
}
#contentTable tfoot {
  font-size: 12px;
  font-weight: bolder;
}
input{
  font-weight: bolder;
}
@page {
  size: auto;  /* auto is the initial value */
  margin: 10mm 2mm 10mm 1mm;  /* this affects the margin in the printer settings */
}
@media print {
  table {
    page-break-before: always;
    page-break-inside: auto;
  }
 #contentTable thead {
   display: table-header-group;
  }
  tfoot {
    display: table-footer-group;
    page-break-inside: avoid;
  }
}
.qrCode img {
  width: 100%;
  height: 100%;
}
</style>
UI-Project/src/views/UnLoadGlass/loadmachinerack.vue
@@ -1,37 +1,79 @@
<script setup>
import {Search} from "@element-plus/icons-vue";
import {reactive, onMounted, onBeforeUnmount,onUnmounted} from "vue";
import {onBeforeUnmount, onMounted, onUnmounted, reactive, ref} from "vue";
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 {ElMessage} from 'element-plus'
import request from "@/utils/request";
import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
import {host, WebSocketHost} from '@/utils/constants'
import PrintFlow from "@/views/UnLoadGlass/PrintFlow.vue";
import Landingindication from "./Landingindication.vue";
import Landingindicationtwo from "./Landingindicationtwo.vue";
import request from "@/utils/request";
import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService';
import { WebSocketHost ,host} from '@/utils/constants'
const router = useRouter()
const {t} = useI18n()
let language = ref(localStorage.getItem('lang') || 'zh')
const printLoading = ref(true)
const fullFlowCard = ref('')
const autoPrint = ref(false)
const dialogFormVisiblea = ref(false)
const dialogFormVisiblea2 = ref(false)
const dialogFormVisibleaDownGlass = ref(false)
// 数据
const loading = ref(false);
// 弹框显示控制
const dialogFormVisible = ref(false);
// 表单数据
const workstationId = ref('');
const workFlowCard = ref('');
const selectedProjectNoa = ref(null); // 当前选中的角色 
const flowCardId = ref('');
const flowCardOptions = ref('[]');
const tableData = reactive([]);
const downGlass = ref([]);
const selectValuesa = reactive({});
const selectOptionsa = ref([]);
const dialogTableVisible = ref(false)
const printFlowCardId = ref('')
const printLayer = ref('')
const now = new Date();
const timeRange = ref([])
const handleChange = async () => {
  console.log("触发开关")
  try {
    const body = {
      flag: autoPrint.value, // 使用 ganghua.value 获取当前开关的状态
    };
    var url = "/unLoadGlass/downWorkStation/autoPrint?flag=" + autoPrint.value;
    const response = await request.post(url)
    if (response.code == 200) {
      // 绑定成功,处理逻辑
      ElMessage.success(response.message);
      autoPrint.value = response.data
    } else {
      ElMessage.error(response.message);
    }
  } catch (error) {
    // 处理错误
    console.error(error);
  }
}
const handleInputChangea = (value, rowId) => {
  // 更新对应行的 select 值
  selectValuesa[rowId] = value;
};
// 方法
const handleSelectionChange = () => {
  // 处理表格行选择事件
};
const handleBindRack = (row) => {
  workstationId.value = row.workstationId; // 假设rackNumber是架号字段的属性名
  console.log(row.flowCardId);
  flowCardId.value = row.flowCardId;
  // 发起接口请求获取流程卡号
    fetchFlowCardId(); 
@@ -91,6 +133,7 @@
const handleBindRack2 = (row) => {
  workstationId.value = row.workstationId; // 假设rackNumber是架号字段的属性名
  dialogFormVisiblea2.value = true; // 打开绑定架子对话框
  workFlowCard.value=row.flowCardId;
};
//清除内容
const handleclear = async () => {
@@ -99,13 +142,15 @@
            workstationId: workstationId.value,
        });
        console.log(response);
        if (response.code === 200) {
            // 清除成功的逻辑
            console.log('清除成功');
            ElMessage.success(response.message);
            dialogFormVisiblea2.value = false;
      if(fullFlowCard.value==workFlowCard.value){
        fullFlowCard.value="";
      }
        } else if (response.code === 500) {
            // 清除失败的逻辑
            console.log('清除失败');
@@ -143,8 +188,37 @@
const socketUrl = `ws://${WebSocketHost}:${host}/api/unLoadGlass/api/talk/unloadglass`;
// 定义消息处理函数,更新 receivedData 变量
const handleMessage = (data) => {
  // 更新 tableData 的数据
  if (data.downGlassInfos != null) {
    downGlass.value = data.downGlassInfos[0][1];
  }
  if (data.engineerIdList != null) {
    selectOptionsa.value = data.engineerIdList[0]
  }
  if (data.autoPrint != null) {
    autoPrint.value = data.autoPrint[0];
  }
  if (fullFlowCard.value == ""&&autoPrint.value==true) {
    for (let i = 0; i < tableData.length; i++) {
      if (tableData[i].totalQuantity != 0) {
        if (tableData[i].totalQuantity == tableData[i].racksNumber + tableData[i].otherNumber && fullFlowCard.value != tableData[i].flowCardId) {
          // printFlowCardId.value = tableData[i].flowCardId;
          fullFlowCard.value = tableData[i].flowCardId;
          open(tableData[i]);
          break;
        }
      } else {
        console.log("没有flowCardId")
      }
    }
  }
  if(data.params!=null){
  tableData.splice(0, tableData.length, ...data.params[0]);
  }
//  console.log("更新后数据", data.params[0]);
};
// 初始化 WebSocket,并传递消息处理函数
@@ -195,10 +269,76 @@
  }
};
 
// 查询数据
const selectDownGlassData = async () => {
  const response = await request.post("/unLoadGlass/downGlassInfo/setDownGlassInfoRequest", {
    workStationId: selectValuesa[0],
    engineerId: selectValuesa[1],
    beginDate: timeRange.value[0],
    endDate: timeRange.value[1],
  })
  if (response.code === 200) {
    ElMessage.success(response.message);
  } else {
    ElMessage.error(response.message);
  }
}
const open = async (row) => {
  printFlowCardId.value = row.flowCardId;
  printLayer.value = row.layer
  dialogTableVisible.value = true;
  setTimeout(() => {
    printFlowCard(); // 替换成你要执行的函数名
    dialogTableVisible.value = false;
  }, 1000);
  ;
}
const printFlowCard = () => {
  // 需要打印的局部区域赋予"print-wrap"的id
  let el = document.getElementById("child");
  let doc = document;
  let body = doc.body || doc.getElementsByTagName("body")[0];
  let printId = "print-" + Date.now();
  // 创建无副作用的打印容器(因不确定页面的打印元素有无其它样式)
  let content = doc.createElement("div");
  content.id = printId;
  // 样式控制与打印无关的元素隐藏
  let style = doc.createElement("style");
  style.innerHTML =
      "body>#" +
      printId +
      "{display:none}@media print{" +
      "@page {" +
      "    size: auto; " +
      "    margin: 10mm 2mm 10mm 1mm; " +
      "  }body>:not(#" +
      printId +
      "){display:none !important}body>#" +
      printId +
      "{display:block;padding-top:1px}}";
  //
  content.innerHTML = el.outerHTML;
  // // console.log("el.outerHTML", el.outerHTML);
  body.appendChild(style);
  // 与style元素设置的样式相配合
  // 把打印内容的元素添加到body(作为body的子元素,可用body的子选择器 '>' 控制打印样式)
  body.appendChild(content);
  setTimeout(() => {
    window.print();
    body.removeChild(content);
    body.removeChild(style);
  }, 20);
}
// beforeUnmount(() => {
@@ -208,29 +348,29 @@
</script>
<template>
  <div>
    <el-button style="margin-top: 10px;margin-left: 10px;margin-bottom: 10px;" id="searchButton" type="primary"
               @click="dialogFormVisibleaDownGlass = true">落架详情
    </el-button>
    <el-switch style="margin-top: 10px;margin-left: 15px;margin-bottom: 10px;" v-model="autoPrint" class="mb-2" :inactive-text="$t('自动打印')"
               @change="handleChange"/>
    <el-card style="flex: 1;" v-loading="loading">
      <el-card style="flex: 1;margin-left: 4px;margin-top: 1px;" v-loading="loading">
      <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
        <el-table height="200px" ref="table"
        @selection-change="handleSelectionChange"
        :data="tableData" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
          <el-table height="200px" ref="table" @selection-change="handleSelectionChange" :data="tableData"
                    :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
          <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="workstationId" align="center" :label="$t('reportWork.shelfnumber')"
                             min-width="120"/>
          <el-table-column prop="flowCardId" align="center" :label="$t('reportWork.cardnumber')" min-width="150" />
          <el-table-column prop="totalQuantity" align="center" :label="$t('reportWork.totalquantity')" 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="layer" align="center" label="层数" min-width="120" />
          <el-table-column prop="otherNumber" align="center" label="人工下片数" 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="$t('reportWork.startstatus')"
            min-width="80"
            prop="enableState"
          >
            <el-table-column align="center" :label="$t('reportWork.startstatus')" min-width="80" prop="enableState">
          <template #default="scope">
            <el-tag :type="getTagType(scope.row.enableState)" @click="toggleStatus(scope.row)">
          {{ scope.row.enableState === 1 ? $t('reportWork.enable') : $t('reportWork.unenable') }}
        </el-tag>
@@ -238,12 +378,64 @@
          </el-table-column>
          <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)">{{ $t('reportWork.bindingshelves') }}</el-button>
            <el-button size="mini" type="text" plain  @click="handleBindRack2(scope.row)">{{ $t('reportWork.clear') }}</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>
                <el-button @click="open(scope.row)" :disabled="scope.row.flowCardId == null">打印</el-button>
          </template>
        </el-table-column>
        </el-table>
      </div>
        <el-dialog v-model="dialogFormVisibleaDownGlass" top="2vh" width="97%"
                   :title="$t('searchOrder.cageinformation')">
          <el-select v-model="selectValuesa[0]" filterable :placeholder="$t('请选择工位')" clearable>
            <el-option label="全部" value="0"></el-option>
            <el-option label="1" value="1"></el-option>
            <el-option label="2" value="2"></el-option>
            <el-option label="3" value="3"></el-option>
            <el-option label="4" value="4"></el-option>
            <el-option label="5" value="5"></el-option>
            <el-option label="6" value="6"></el-option>
            <el-option label="7" value="7"></el-option>
            <el-option label="8" value="8"></el-option>
            <el-option label="9" value="9"></el-option>
            <el-option label="10" value="10"></el-option>
          </el-select>
          <el-select v-model="selectValuesa[1]" filterable :placeholder="$t('basicData.plselectproject')" clearable
                     @input="handleInputChangea($event, row.id)">
            <el-option v-for="item in selectOptionsa" :key="item" :label="item" :value="item"/>
          </el-select>
          <span class="demonstration">时间段</span>
          <el-date-picker v-model="timeRange" type="datetimerange" range-separator="至" start-placeholder="开始日期" value-format = "YYYY-MM-DD hh:mm:ss"
                          end-placeholder="结束日期">
          </el-date-picker>
          <el-button type="primary" style="margin-left: 10px;" @click="selectDownGlassData()">{{
              $t('reportmanage.inquire')
            }}
          </el-button>
          <el-table height="200px" ref="table" @selection-change="handleSelectionChange" :data="downGlass"
                    :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
            <el-table-column prop="workStationId" align="center" :label="$t('工位号')" min-width="80"/>
            <el-table-column prop="engineerId" align="center" :label="$t('工程号')" min-width="80"/>
            <el-table-column prop="flowCardId" align="center" :label="$t('流程卡号')" min-width="80"/>
            <el-table-column prop="layer" align="center" :label="$t('层')" min-width="120"/>
            <el-table-column prop="sequence" align="center" :label="$t('顺序')" min-width="150"/>
            <el-table-column prop="width" align="center" :label="$t('宽')" min-width="120"/>
            <el-table-column prop="height" align="center" :label="$t('高')" min-width="120"/>
            <el-table-column prop="Filmsid" align="center" :label="$t('膜系')" min-width="120"/>
            <el-table-column prop="thickness" align="center" label="厚度" min-width="120"/>
            <el-table-column prop="glassId" align="center" :label="$t('玻璃id')" min-width="120"/>
          </el-table>
        </el-dialog>
    </el-card>
    <!-- workstationId: '1',
    workstationId: '1005',
@@ -260,6 +452,7 @@
    </div>
    </div>
    </el-card>
  </div>
    <el-dialog v-model="dialogFormVisiblea" top="21vh" width="40%" :title="$t('reportWork.bindingshelves')">
@@ -271,7 +464,8 @@
          </el-form-item>
          <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-option v-for="item in flowCardOptions" :key="item.flowcard_id" :label="item.flowcard_id"
                         :value="item.flowcard_id"/>
          </el-select>
        </el-form-item>
      </el-form>
@@ -279,6 +473,7 @@
    </div>
    <template #footer>
      <div id="dialog-footer">
        <el-button type="primary" @click="handleConfirm">
          {{ $t('reportWork.sure') }}
        </el-button>
@@ -296,14 +491,36 @@
      </div>
    </template>
  </el-dialog>
  <el-dialog id="sizePrintCalrd" v-model="dialogTableVisible" destroy-on-close style="width: 75%;height:75% ">
    <!-- <template #header="{ close, titleId, titleClass }">
        <el-button  @click="printFlowCard" >打印</el-button>
      </template> -->
    <print-flow id="child" :printFlowCardId="printFlowCardId" :printLayer="printLayer"
                style="width: 100%;height: 100%"/>
  </el-dialog>
</template>
<style scoped>
#dt { display:block; float:left;line-height: 20px;margin-left: 100px;}
#dta { display:block; float:left;line-height: 20px;margin-left: 80%;}
#dt {
  display: block;
  float: left;
  line-height: 20px;
  margin-left: 100px;
}
#dta {
  display: block;
  float: left;
  line-height: 20px;
  margin-left: 80%;
}
#dialog-footer{
  text-align: center;
  margin-top: -15px;
}
#message{
  text-align: center;
  align-items: center;
@@ -313,15 +530,24 @@
   background-color: #337ecc;
   margin-left: 28%;
}
.awatch{
  max-width: 100%;
}
#main-body{
  margin-top: -40px;
  margin-left: 150px;
}
#main-bodya{
  margin-top: -40px;
  margin-left: 100px;
}
:deep(#sizePrintCalrd .el-dialog__body) {
  height: 85%;
  width: 100%;
  overflow-y: auto;
}
</style>
UI-Project/src/views/largescreen/largescreen.vue
@@ -1,5 +1,5 @@
<template>  
  <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;" v-loading="loading">
  <el-card style="flex: 1;margin-left: 1px;margin-top: 10px;margin-right: 1px;" v-loading="loading">
    <el-scrollbar height="600px">
<div id="top" style="height: 150px;display: flex;">  
  <div class="echarts-container">
@@ -9,7 +9,7 @@
</div>
</div> 
<div style="display: flex;">
<div id="centerleft" style="margin-top: 10px;height: 240px;width: 340px;background-color: #911005;">
<!-- <div id="centerleft" style="margin-top: 10px;height: 240px;width: 340px;background-color: #911005;">
  <el-table height="240" ref="table" width="340px"
      @selection-change="handleSelectionChange"
      :data="tableData" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
@@ -24,18 +24,51 @@
          </template>
      </el-table-column>
      </el-table>
</div>  -->
<div class="parter" style="margin-top: 10px;margin-left: 150px; height: 240px;width: 1000px;">
    <img src="../../assets/dpxsa.png" style="margin-left: -10px; width: 100%;height: 100%;" alt="Your Image">
  <div  class="moving-rect lipiana" v-show="woshia"></div>
  <div  class="moving-rect lipianb" v-show="woshia"></div>
  <div  class="moving-rect lipianc" v-show="woshic"></div>
  <div  class="moving-rect lipiand" v-show="woshic"></div>
  <div  class="moving-rect overlaya" v-show="flake"></div>
  <div  class="moving-rect overlayb" v-show="flakeb"></div>
  <div  class="moving-rect overlayc" v-show="flakec"></div>
  <div  class="moving-rect overlayd" v-show="flaked"></div>
  <div  class="moving-rect longa" v-show="dalipiana"></div>
  <div  class="moving-rect longb" v-show="dalipianb"></div>
  <div  class="moving-rect shangpianji" v-show="shangpian"></div>
  <div  class="moving-rect xiapianji" v-show="xiapian"></div>
  <div  class="moving-rect xiapianji1" v-show="xiapian1"></div>
  <div  class="moving-rect xiapianji2" v-show="xiapian2"></div>
  <div  class="moving-rect xiapianji3" v-show="xiapian3"></div>
  <div  class="moving-rect xiapianji4" v-show="xiapian4"></div>
  <div  class="moving-rect xiapianji5" v-show="xiapian5"></div>
  <div  class="moving-rect xiapianji6" v-show="xiapian6"></div>
</div> 
<div id="center" style="margin-top: 10px;margin-left: 10px; height: 240px;width: 750px;">
  <img src="../../assets/d1a.png" alt="" style="margin-left: -10px; width: 100%;height: 100%;position: relative;">
</div>
<div id="centerright" style="margin-top: 10px;margin-left: 10px; height: 240px;width: 240px;background-color: #911005;">
<!-- <div class="parter" style="margin-top: 10px;margin-left: 150px; height: 240px;width: 1000px;">
    <img src="../../assets/dpxsa.png" style="margin-left: -10px; width: 100%;height: 100%;" alt="Your Image">
    <div class="moving-rect vertical"></div>
    <div class="moving-rect all"></div>
    <div class="moving-rect horizontal"></div>
    <div class="moving-rect xiao"></div>
    <div class="moving-rect zhan"></div>
    <div class="moving-rect tu"></div>
    <div class="moving-rect zi"></div>
    <div class="moving-rect xia"></div>
    <div class="moving-rect zan"></div>
    <div class="moving-rect fa"></div>
    <div class="moving-rect hua"></div>
    <div class="moving-rect shui"></div>
</div> -->
<!-- <div id="centerright" style="margin-top: 10px;margin-left: 10px; height: 240px;width: 240px;background-color: #911005;">
  <el-table height="240" ref="table" width="340px"
      @selection-change="handleSelectionChange"
      :data="tableDatab" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
        <el-table-column prop="projectNo" align="center" :label="$t('large.projectnumber')" min-width="50" />
        <el-table-column prop="projectName" align="center" :label="$t('large.projectname')" min-width="50" />
      </el-table>
</div>
</div>  -->
</div>
<div id="bottom" style="margin-top: 10px;height: 190px;background-color: #911005;">
<el-table height="190" ref="table"
@@ -58,41 +91,50 @@
      </el-tag>  
    </template> 
        </el-table-column>
        <el-table-column prop="deliveryDate" align="center" :label="$t('large.deliveryDate')" min-width="50" />
        <el-table-column prop="deliveryDate" align="center" :label="$t('large.deliveryDate')" min-width="100" />
        <el-table-column fixed="right" :label="$t('large.operate')" align="center" width="100">
          <template #default="scope">
            <el-button size="mini" type="text" plain @click="handleBinda(scope.row)">{{ $t('large.mes') }}</el-button>
          </template>
      </el-table-column>
      </el-table>
</div>
</el-scrollbar>
</el-card>
<el-dialog v-model="blinda" top="5vh" width="80%" :title="$t('large.brokeno')">
<el-dialog v-model="blinda" top="5vh" width="85%">
  <el-table height="400" ref="table" 
      @selection-change="handleSelectionChange"
      :data="tableData" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
        <el-table-column prop="reportingWorkTime" fixed align="center" :label="$t('large.time')" min-width="110" />
        <el-table-column prop="orderId" fixed align="center" :label="$t('large.number')" min-width="110" />
        <el-table-column prop="reportingWorkId" align="center" :label="$t('large.jobnumber')" min-width="120" />
        <el-table-column prop="productionId" align="center" :label="$t('large.productionnumber')" min-width="130" />
        <el-table-column prop="processId" align="center" :label="$t('large.cardnumber')" min-width="140" />
        <el-table-column prop="project" align="center" :label="$t('large.projectname')" min-width="110" />
        <el-table-column prop="batch" align="center" :label="$t('large.batch')" min-width="110" />
        <el-table-column prop="reviewer" align="center" :label="$t('large.detailID')" min-width="110" />
        <el-table-column prop="orderSort" align="center" :label="$t('large.serialnumber')" min-width="110" />
        <el-table-column prop="productName" align="center" :label="$t('large.productname')" :show-overflow-tooltip="true" min-width="220" />
        <el-table-column prop="technologyNumber" align="center" :label="$t('large.serial')" min-width="110" />
        <el-table-column prop="glassAddress" align="center" :label="$t('large.slicemarker')" min-width="130" />
        <el-table-column prop="patchNum" align="center" :label="$t('large.numberpatches')" min-width="110" />
        <el-table-column prop="width" align="center" :label="$t('large.width')" min-width="110" />
        <el-table-column prop="height" align="center" :label="$t('large.height')" min-width="110" />
        <el-table-column prop="shape" align="center" :label="$t('large.shape')" min-width="110" />
        <el-table-column prop="responsibleProcess" align="center" :label="$t('large.responsibleprocess')" min-width="110" />
        <el-table-column prop="patchProcesses" align="center" :label="$t('large.process')" min-width="110" />
        <el-table-column prop="breakageQuantity" align="center" :label="$t('large.numberfractions')" min-width="110" />
        <el-table-column prop="patchReason" align="center" :label="$t('large.breakreason')" min-width="110" />
        <el-table-column prop="patchType" align="center" :label="$t('large.breaktype')" min-width="110" />
        <el-table-column prop="responsiblePersonnel" align="center" :label="$t('large.responsiblepersonnel')" min-width="110" />
        <el-table-column prop="responsibleEquipment" align="center" :label="$t('large.responsiblequipment')" min-width="110" />
        <el-table-column prop="responsibleTeam" align="center" :label="$t('large.responsibleteam')" min-width="110" />
        <el-table-column prop="patchArea" align="center" :label="$t('large.area')" min-width="110" />
        <el-table-column prop="qualityInspector" align="center" :label="$t('large.inspector')" min-width="110" />
        <el-table-column prop="orderId" fixed align="center" :label="$t('large.orderId')" min-width="110" />
        <el-table-column prop="project"  align="center" :label="$t('large.project')" min-width="110" />
        <el-table-column prop="processId"  align="center" :label="$t('large.cardnumber')" min-width="110" />
        <el-table-column prop="orderNumber"  align="center" :label="$t('large.serialnumber')" min-width="110" />
        <el-table-column prop="productName"  align="center" :label="$t('large.productname')" min-width="110" />
        <el-table-column prop="width"  align="center" :label="$t('large.width')" min-width="100" />
        <el-table-column prop="height"  align="center" :label="$t('large.height')" min-width="100" />
        <el-table-column prop="area"  align="center" :label="$t('large.are')" min-width="100" />
        <el-table-column prop="quantity"  align="center" :label="$t('large.number')" min-width="110" />
        <el-table-column prop="numberPatches"  align="center" :label="$t('large.numberpatches')" min-width="110" />
        <el-table-column prop="receivedQuantity"  align="center" :label="$t('large.innumber')" min-width="110" />
        <el-table-column prop="terminationStatus"  align="center" :label="$t('large.productstatus')" min-width="110" />
        <el-table-column
          align="center"
            :label="$t('large.productstatus')"
            min-width="80"
            prop="terminationStatus"
          >
          <template #default="scope">
          <el-tag
            :type="scope.row.terminationStatus === 0 ? 'success' : 'danger'"
          >
            {{ scope.row.terminationStatus === 0 ? $t('large.right') : $t('large.stop') }}
          </el-tag>
        </template>
          </el-table-column>
        <el-table-column prop="packType"  align="center" :label="$t('large.quantity')" min-width="110" />
        <el-table-column prop="projectNo"  align="center" :label="$t('large.projectnumber')" min-width="110" />
        <!-- <el-table-column prop="processingNote" fixed align="center" :label="$t('large.method')" min-width="110" /> -->
        <!-- <el-table-column prop="deliveryDate" fixed align="center" :label="$t('large.deliveryDate')" min-width="130" /> -->
      </el-table>
  <template #footer>
    <div id="dialog-footer" style="text-align: center;">
@@ -116,17 +158,51 @@
const tableDatac = ref([])
const adjustedRects = ref([]);  
const chartRefs = ref([]);  
const flake = ref(false)
const flakeb = ref(false)
const flakec = ref(false)
const flaked = ref(false)
const woshia = ref(false)
const woshic = ref(false)
const dalipiana = ref(false)
const dalipianb = ref(false)
const shangpian = ref(false)
const xiapian = ref(false)
const xiapian1 = ref(false)
const xiapian2 = ref(false)
const xiapian3 = ref(false)
const xiapian4 = ref(false)
const xiapian5 = ref(false)
const xiapian6 = ref(false)
const thisProcess = ref(); // 用于存储process_id的响应式引用 
// 定义一个响应式引用来存储图表实例    
const chartDom = ref(null);  
let chartInstance = null;  
const blinda = ref(false)
const handleBinda = (row) => {
const handleBinda = async (row) => {
blinda.value = true;
  await fetchFlowCardId(row.orderId);
};
const processesData = ref([
]);
const processesData = ref([]);
const fetchFlowCardId = async (orderId) => {
  try  {
    const response = await request.post('/loadGlass/order/order/selectOrderdetail',{
      orderId: orderId
    })
    if (response.code == 200) {
      ElMessage.success(response.message);
      tableData.value = response.data;
      console.log(tableData.value);
    } else {
      ElMessage.error(response.message);
    }
}
catch (error) {
    // 处理错误
    console.error(error);
  }
}
function getStatusType(warehousing) {  
switch (warehousing) {  
  case 0:  
@@ -148,29 +224,16 @@
}  
}  
let socket = null;
let socket2 = null;
let socket3 = null;
let socket4 = null;
let socket5 = null;
let socket6 = null;
const socketUrl = `ws://${WebSocketHost}:${host}/api/temperingGlass/api/talk/screen`;
const handleMessage = (data) => {
tableData.value = data.awaitingRepairs[0]
// tableData.value = data.awaitingRepairs[0]
tableDatab.value = data.DoingTask[0]
tableDatac.value = data.orders[0]
// adjustedRects.value = data.device[0].map(rect => ({
//       ...rect,
//       completed: rect.completedQuantity,
//       breakage: rect.breakageQuantity,
//       thisProcess: rect.thisProcess,
//     }));
};
// let socket;
// 设置图表 DOM 引用
function setChartDom(index, el) {
if (!chartRefs.value[index]) {
  chartRefs.value[index] = { dom: el, chart: null };
} else {
  chartRefs.value[index].dom = el;
}
}
onMounted(() => {
socket = new WebSocket(socketUrl);
socket.onmessage = (event) => {  
  const data = JSON.parse(event.data);  
  processesData.value = data.device[0].map(rect => ({  
@@ -180,12 +243,61 @@
    thisProcess: rect.thisProcess,  
  }));  
  renderPieCharts();
  console.log(processesData.value);
  // updateCharts();
}
};
function setChartDom(index, el) {
if (!chartRefs.value[index]) {
  chartRefs.value[index] = { dom: el, chart: null };
} else {
  chartRefs.value[index].dom = el;
}
}
const socketUrl2 = `ws://${WebSocketHost}:${host}/api/temperingGlass/api/talk/temperingIsRun`;
const handleMessage2 = (data) => {
  const tasks = data.temperingTaskType[0];
    flake.value = tasks.some(task => task.state == 1);
    flakeb.value = tasks.some(task => task.state == 2);
    flakec.value = tasks.some(task => task.state == 3);
    flaked.value = tasks.some(task => task.state == 4);
};
// 卧式理片
const socketUrl3 = `ws://${WebSocketHost}:${host}/api/cacheGlass/api/talk/cacheGlassIsRun`;
const handleMessage3 = (data) => {
  const tasks = data.taskCaches[0];
  woshia.value = tasks.some(task => task.line == 2001);
  woshic.value = tasks.some(task => task.line == 2002);
  console.log(tasks);
  
// };
});
};
// 大理片笼
const socketUrl4 = `ws://${WebSocketHost}:${host}/api/cacheVerticalGlass/api/talk/isRun`;
const handleMessage4 = (data) => {
  const tasks = data.bigStorageCageDetailsOutTask[0];
  const taskss = data.bigStorageCageDetailsFeedTask[0];
    dalipiana.value = tasks.some(task => task.slot !== null && task.slot !== undefined);
dalipianb.value = taskss.some(task => task.slot !== null && task.slot !== undefined);
};
// 上片
const socketUrl5 = `ws://${WebSocketHost}:${host}/api/loadGlass/api/talk/loadGlassIsRun`;
const handleMessage5 = (data) => {
  if(data.engineering.length !==0 ){
    shangpian.value = true;
}
};
// 下片
const socketUrl6 = `ws://${WebSocketHost}:${host}/api/unLoadGlass/api/talk/unLoadGlassIsRun`;
const handleMessage6 = (data) => {
  const tasks = data.downWorkstation[0];
  if (tasks && tasks.length >= 6) {
    xiapian.value = tasks.some(task => task.racksNumber!== 0);
    xiapian1.value = tasks[0].racksNumber !== 0;
    xiapian2.value = tasks[1].racksNumber !== 0;
    xiapian3.value = tasks[2].racksNumber !== 0;
    xiapian4.value = tasks[3].racksNumber !== 0;
    xiapian5.value = tasks[4].racksNumber !== 0;
    xiapian6.value = tasks[5].racksNumber !== 0;
  }
};
const renderPieCharts = () => {
processesData.value.forEach((data, index) => {
  const chart = echarts.init(document.getElementById('pieChart_' + index));
@@ -228,43 +340,290 @@
  chart.setOption(options);
});
};
onUnmounted(() => {
socket.close();
});
onMounted(() => {
  socket = initializeWebSocket(socketUrl, handleMessage);
  socket2 = initializeWebSocket(socketUrl2, handleMessage2);
  socket3 = initializeWebSocket(socketUrl3, handleMessage3);
  socket4 = initializeWebSocket(socketUrl4, handleMessage4);
  socket5 = initializeWebSocket(socketUrl5, handleMessage5);
  socket6 = initializeWebSocket(socketUrl6, handleMessage6);
});
  onUnmounted(() => {
    if (socket) {
    closeWebSocket(socket);
    }
    if (socket2) {
    closeWebSocket2(socket2);
    }
    if (socket3) {
    closeWebSocket3(socket3);
    }
    if (socket4) {
    closeWebSocket4(socket4);
    }
    if (socket5) {
    closeWebSocket5(socket5);
    }
    if (socket6) {
    closeWebSocket6(socket6);
    }
    });
onBeforeUnmount(() => {
console.log("关闭了")
closeWebSocket();
closeWebSocket2();
closeWebSocket3();
closeWebSocket4();
closeWebSocket5();
closeWebSocket6();
});
</script>  
<style scoped>  
.echarts-container {
display: flex;
flex-wrap: wrap;
gap: 20px;
}
.echarts-item {
width: 150px;
width: 120px;
height: 150px;
margin: 20px;
}
.pie-chart {
width: 100%;
height: 100%;
}
.parter {
    position: relative;
    display: inline-block; /* 使容器大小适应图片大小 */
  width: 1500px;
  margin-left: -300px
}
img {
    display: block; /* 让图片以块级元素显示 */
    max-width: 100%; /* 确保图片不超出容器 */
}
.moving-rect {
    width: 100px;
    height: 50px;
    position: absolute;
}
.longa{
  z-index: 1;
  width: 33px;
  height: 5px;
  background-color: #529b2e;
  margin-top: -15px;
  margin-left: 130px;
}
.longb{
  z-index: 1;
  width: 33px;
  height: 5px;
  background-color: #529b2e;
  margin-top: -15px;
  margin-left: 235px;
}
.xiapianji1{
  z-index: 1;
  width: 12px;
  height: 7px;
  background-color: #529b2e;
  margin-top: -206px;
  margin-left: 173px;
}
.xiapianji2{
  z-index: 1;
  width: 12px;
  height: 7px;
  background-color: #529b2e;
  margin-top: -206px;
  margin-left: 217px;
}
.xiapianji3{
  z-index: 1;
  width: 12px;
  height: 7px;
  background-color: #529b2e;
  margin-top: -195px;
  margin-left: 196px;
}
.xiapianji4{
  z-index: 1;
  width: 12px;
  height: 7px;
  background-color: #529b2e;
  margin-top: -206px;
  margin-left: 270px;
}
.xiapianji5{
  z-index: 1;
  width: 12px;
  height: 7px;
  background-color: #529b2e;
  margin-top: -206px;
  margin-left: 314px;
}
.xiapianji6{
  z-index: 1;
  width: 12px;
  height: 7px;
  background-color: #529b2e;
  margin-top: -195px;
  margin-left: 293px;
}
.xiapianji {
    width: 20px;
    height: 10px;
    background-color: #529b2e;
    top: 9px;
    left: 200px;
    transform: translateX(-50%);
    animation: move-xiapianji 6s infinite;
}
@keyframes move-xiapianji {
    0% {
      left: 200px;
    }
    100% {
      left: calc(100% - 700px);
    }
}
.lipiana {
    width: 15px;
    height: 9px;
    background-color: #529b2e;
    top: 190px;
    right: 530px;
    transform: translateX(-50%);
    animation: move-lipiana 6s infinite;
}
@keyframes move-lipiana {
    0% {
      right: 530px;
    }
    100% {
      right: calc(100% - 350px);
    }
}
.lipianb {
    width: 18px;
    height: 10px;
    background-color: #529b2e;
    top: 160px;
    left: 502px;
    transform: translateX(-50%);
    animation: move-lipianb 6s infinite;
}
@keyframes move-lipianb {
    0% {
        top: 160px;
    }
    100% {
        top: calc(100% - 55px);
    }
}
.lipianc {
    width: 15px;
    height: 9px;
    background-color: #529b2e;
    top: 215px;
    right: 490px;
    transform: translateX(-50%);
    animation: move-lipianc 6s infinite;
}
@keyframes move-lipianc {
    0% {
      right: 490px;
    }
    100% {
      right: calc(100% - 350px);
    }
}
.lipiand {
    width: 25px;
    height: 10px;
    background-color: #529b2e;
    top: 160px;
    left: 555px;
    transform: translateX(-50%);
    animation: move-lipiand 6s infinite;
}
@keyframes move-lipiand {
    0% {
        top: 160px;
    }
    100% {
        top: calc(100% - 40px);
    }
}
.overlaya {
    width: 15px;
    height: 9px;
    background-color: #529b2e;
    top: 213px;
    right: 800px;
    transform: translateX(-50%);
    animation: move-overlaya 6s infinite;
}
@keyframes move-overlaya {
    0% {
      right: 880px;
    }
    100% {
      right: calc(100% - 15px);
    }
}
.overlayb {
    width: 20px;
    height: 10px;
    background-color: #529b2e;
    top: 110px;
    left: 13px;
    transform: translateX(-50%);
    animation: move-overlayb 6s infinite;
}
@keyframes move-overlayb {
    0% {
        top: 160px;
    }
    100% {
        top: calc(100% - 190px);
    }
}
.overlayc {
    width: 20px;
    height: 10px;
    background-color: #529b2e;
    top: 7px;
    left: 13px;
    transform: translateX(-50%);
    animation: move-overlayc 6s infinite;
}
@keyframes move-overlayc {
    0% {
      left: 20px;
    }
    100% {
      left: calc(100% - 900px);
    }
}
.shangpianji {
    width: 20px;
    height: 10px;
    background-color: #529b2e;
    top: 157px;
    right: 90px;
    transform: translateX(-50%);
    animation: move-shangpianji 6s infinite;
}
@keyframes move-shangpianji {
    0% {
      right: 90px;
    }
    100% {
      right: calc(100% - 770px);
    }
}
</style>
hangzhoumesParent/JsonFile/PlcdownGlass.json
File was deleted
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/DamageDetailsService.java
File was deleted
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/ReportingWorkDetailService.java
File was deleted
hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/CodeGet.java
@@ -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://localhost:3306/pp?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("work_assignment"); //模块名
        pc.setModuleName("flow_card"); //模块名
        pc.setController("controller");
        pc.setService("service");
        pc.setMapper("mapper");
@@ -50,7 +50,7 @@
        // 5、策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setInclude("work_assignment");
        strategy.setInclude("flow_card");
        strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略
hangzhoumesParent/common/servicebase/src/main/resources/mapper/TemperingGlassInfoMapper.xml
@@ -4,12 +4,12 @@
    <insert id="saveBatch">
        INSERT INTO tempering_glass_info (glass_id, flow_card_id, glass_type, width, height, thickness, filmsid,
        ishorizontal, tempering_layout_id,
        tempering_feed_sequence, x_coordinate, y_coordinate, angle, state, slot, engineer_id) VALUES
        tempering_feed_sequence, x_coordinate, y_coordinate, angle, state, slot, engineer_id, deleted) VALUES
        <foreach collection="list" item="item" separator=",">
            (#{item.glassId}, #{item.flowCardId}, #{item.glassType}, #{item.width}, #{item.height}, #{item.thickness},
            #{item.filmsid},#{item.ishorizontal},
            #{item.temperingLayoutId}, #{item.temperingFeedSequence}, #{item.xCoordinate}, #{item.yCoordinate},
            #{item.angle}, #{item.state}, #{item.slot}, #{item.engineerId})
            #{item.angle}, #{item.state}, #{item.slot}, #{item.engineerId}, 0)
        </foreach>
    </insert>
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/CacheGlassTask.java
@@ -88,7 +88,7 @@
    public static String engineerId = "";
    @Scheduled(fixedDelay = 1000)
//    @Scheduled(fixedDelay = 1000)
    public void plcHomeEdgTask() {
        Date startDate = new Date();
        log.info("本次任务开始执行时间:{}", startDate);
hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/TaskCacheMapper.xml
@@ -13,6 +13,7 @@
        FROM task_cache
        <where>
            end_cell = #{line}
            and deleted = 0
            AND task_type in
            <foreach collection="taskTypes" item="item" open='(' close=')' separator=','>
                #{item}
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/mapper/BigStorageCageMapper.java
@@ -17,6 +17,6 @@
public interface BigStorageCageMapper extends MPJBaseMapper<BigStorageCage> {
    List<Integer> queryFreeDeviceByUsed(@Param(value = "thickness") double thickness);
    List<Integer> queryFreeDeviceByNotUsed(@Param(value = "thickness") double thickness);
//
//    List<Integer> queryFreeDeviceByNotUsed(@Param(value = "thickness") double thickness);
}
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/BigStorageCageService.java
@@ -34,5 +34,5 @@
    List<Integer> queryFreeDeviceByUsed(double thickness);
    List<Integer> queryFreeDeviceByNotUsed(double thickness);
//    List<Integer> queryFreeDeviceByNotUsed(double thickness);
}
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java
@@ -186,28 +186,32 @@
        TemperingGlassInfo temperingGlassInfo = temperingGlassInfoMapper.selectOne(temperingGlassInfoWrapper);
        LambdaQueryWrapper<BigStorageCageDetails> bigStorageCageDetailsWrapper = new LambdaQueryWrapper<>();
        bigStorageCageDetailsWrapper.eq(BigStorageCageDetails::getGlassId, glassId);
        bigStorageCageDetailsWrapper
                .eq(BigStorageCageDetails::getGlassId, glassId)
                .eq(BigStorageCageDetails::getState,Const.GLASS_STATE_IN);
        BigStorageCageDetails bigStorageCageDetails = baseMapper.selectOne(bigStorageCageDetailsWrapper);
        if (temperingGlassInfo != null) {
            if (status == 0) {
                temperingGlassInfo.setState(Const.TEMPERING_DAMAGE);
                temperingGlassInfo.setState(Const.GLASS_STATE_DAMAGE);
            } else {
                temperingGlassInfo.setState(Const.TEMPERING_TAKE);
                temperingGlassInfo.setState(Const.GLASS_STATE_TAKE);
            }
            temperingGlassInfoMapper.updateById(temperingGlassInfo);
        }
        Damage damage = new Damage();
        if (status == 0) {
            bigStorageCageDetails.setState(Const.GLASS_STATE_DAMAGE);
            damage.setType(Const.GLASS_STATE_DAMAGE);
        } else {
            bigStorageCageDetails.setState(Const.GLASS_STATE_TAKE);
            damage.setType(Const.GLASS_STATE_TAKE);
        }
        baseMapper.updateById(bigStorageCageDetails);
        bigStorageCageService.updateRemainWidth(bigStorageCageDetails.getSlot());
        //todo:插入破损数据
        Damage damage = new Damage();
        damage.setGlassId(bigStorageCageDetails.getGlassId());
        damage.setWorkingProcedure("冷加工");
        damage.setLine(3001);
        damage.setRemark("大理片笼破损");
        damage.setStatus(2);
        damageService.insertDamage(damage);
@@ -217,6 +221,7 @@
    @Override
    public List<BigStorageCageDetails> selectBigStorageCageDetails(String glassId) {
        LambdaQueryWrapper<GlassInfo> glassInfoWrapper = new LambdaQueryWrapper<>();
        List<BigStorageCageDetails> bigStorageCageDetailsList=new ArrayList<>();
        glassInfoWrapper.eq(GlassInfo::getGlassId, glassId);
        GlassInfo glassInfo = glassInfoMapper.selectOne(glassInfoWrapper);
        BigStorageCageDetails bigStorageCageDetails = new BigStorageCageDetails();
@@ -224,13 +229,10 @@
            BeanUtils.copyProperties(glassInfo, bigStorageCageDetails);
            bigStorageCageDetails.setState(1);
            bigStorageCageDetails.setGap(glassGap);
            List<BigStorageCageDetails> bigStorageCageDetailsList = new ArrayList<>();
            bigStorageCageDetailsList = new ArrayList<>();
            bigStorageCageDetailsList.add(bigStorageCageDetails);
            return bigStorageCageDetailsList;
        } else {
            return null;
        }
        return bigStorageCageDetailsList;
    }
    //理片笼详情添加
@@ -274,6 +276,9 @@
                .gt(BigStorageCage::getRemainWidth, Math.max(glassInfo.getWidth(), glassInfo.getHeight()))
                .last("limit 1");
        if (glassInfo.getTemperingLayoutId() == 0) {
            //todo:同流程进同一格
//            wrapper.eq(BigStorageCageDetails::getFlowCardId,glassInfo.getFlowCardId())
//                    .eq(BigStorageCageDetails::get)
            wrapper.eq(BigStorageCageDetails::getWidth, glassInfo.getWidth()).eq(BigStorageCageDetails::getHeight, glassInfo.getHeight());
        } else {
            wrapper.eq(BigStorageCageDetails::getTemperingFeedSequence, glassInfo.getTemperingFeedSequence() + 1);
@@ -322,22 +327,22 @@
        }
        //获取玻璃的厚度:重新选笼子需要按照笼子可放玻璃厚度进行选择
        List<Integer> deviceNotUsedList = bigStorageCageService.queryFreeDeviceByNotUsed(glassInfo.getThickness());
        for (Integer item : deviceNotUsedList) {
            bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>()
                    .eq(BigStorageCage::getRemainWidth, slotWidth)
                    .eq(BigStorageCage::getEnableState, Const.SLOT_ON)
                    .eq(BigStorageCage::getDeviceId, item)
                    .last("limit 1"));
            if (null != bigStorageCage) {
                log.info("按照存笼玻璃格子数剩余最多得方式获取信息版图id:{},格子:{},玻璃id:{}", glassInfo.getTemperingLayoutId(), bigStorageCage.getSlot(), glassInfo.getGlassId());
                bigStorageDTO = new BigStorageDTO();
                bigStorageDTO.setWidth(bigStorageCage.getRemainWidth());
                bigStorageDTO.setSlot(bigStorageCage.getSlot());
                bigStorageDTO.setDeviceId(bigStorageCage.getDeviceId());
                return bigStorageDTO;
            }
        }
//        List<Integer> deviceNotUsedList = bigStorageCageService.queryFreeDeviceByNotUsed(glassInfo.getThickness());
//        for (Integer item : deviceNotUsedList) {
//            bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>()
//                    .eq(BigStorageCage::getRemainWidth, slotWidth)
//                    .eq(BigStorageCage::getEnableState, Const.SLOT_ON)
//                    .eq(BigStorageCage::getDeviceId, item)
//                    .last("limit 1"));
//            if (null != bigStorageCage) {
//                log.info("按照存笼玻璃格子数剩余最多得方式获取信息版图id:{},格子:{},玻璃id:{}", glassInfo.getTemperingLayoutId(), bigStorageCage.getSlot(), glassInfo.getGlassId());
//                bigStorageDTO = new BigStorageDTO();
//                bigStorageDTO.setWidth(bigStorageCage.getRemainWidth());
//                bigStorageDTO.setSlot(bigStorageCage.getSlot());
//                bigStorageDTO.setDeviceId(bigStorageCage.getDeviceId());
//                return bigStorageDTO;
//            }
//        }
        Assert.isTrue(null != bigStorageCage, "没有空余的笼子存放玻璃");
        return bigStorageDTO;
    }
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/entity/BigStorageCageFeedTask.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -77,5 +78,8 @@
    @ApiModelProperty(value = "创建时间", position = 8)
    private Date createTime;
    @TableLogic
    private int deleted;
}
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/entity/BigStorageCageOutTask.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -91,4 +92,7 @@
    @ApiModelProperty(value = "任务状态", position = 8)
    private Integer taskState;
    @TableLogic
    private int deleted;
}
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/edgglasstask/entity/EdgGlassTaskInfo.java
@@ -1,5 +1,6 @@
package com.mes.edgglasstask.entity;
import com.baomidou.mybatisplus.annotation.TableLogic;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -74,4 +75,7 @@
    @ApiModelProperty(value = "时间", position = 9)
    private Date time;
    @TableLogic
    private int deleted;
}
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/application.yml
@@ -3,20 +3,20 @@
spring:
  profiles:
    active: prod
    active: cz
  application:
    name: cacheVerticalGlass
mybatis-plus:
  mapper-locations: classpath*:mapper/*.xml
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#  configuration:
#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mes:
  sequence:
    order: false
  minCount: 5
  minCount: 20
  carWidth: 5000   #大车宽度
  slotWidth: 5000   #大车宽度
  inCarMaxSize: 2     #进片大车最大存放玻璃数量
  inCarMaxSize: 3     #进片大车最大存放玻璃数量
  outCarMaxSize: 3     #出片大车最大存放玻璃数量
  glassGap: 1000      #玻璃间距
  glassGap: 350  #玻璃间距
  xMaxSize: 2850
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml
@@ -41,7 +41,8 @@
                             GROUP BY ENGINEER_ID, TEMPERING_LAYOUT_ID) T3 ON T2.ENGINEER_ID = T3.ENGINEER_ID
            AND T2.TEMPERING_LAYOUT_ID = T3.TEMPERING_LAYOUT_ID
            AND T2.COUNT = T3.COUNT
        ORDER BY T2.ENGINEER_ID, T2.TEMPERING_LAYOUT_ID
                 INNER JOIN ENGINEERING T4 ON T2.ENGINEER_ID=T4.ENGINEER_ID
        ORDER BY T4.ID, T2.TEMPERING_LAYOUT_ID
    </select>
    <select id="queryTemperingOccupySlot" resultMap="temperingLayoutDTO">
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageFeedTaskMapper.xml
@@ -15,6 +15,7 @@
                        SUM(case task_state when 2 then 1 else 0 end) as real_count
                 from big_storage_cage_feed_task
                 where task_state in (1, 2)
                   and deleted = 0
                   and (target_slot = 0 or target_slot is null)
                 group by line
             ) t
@@ -36,6 +37,7 @@
                 WHERE LINE = #{line}
                   AND (target_slot = 0 or target_slot is null)
                   AND TASK_STATE IN (1, 2)
                   and deleted = 0
             ) T
    </select>
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageMapper.xml
@@ -6,24 +6,25 @@
    <select id="queryFreeDeviceByUsed" resultType="java.lang.Integer">
        SELECT T.DEVICE_ID
        FROM BIG_STORAGE_CAGE T
                 LEFT JOIN (SELECT * FROM BIG_STORAGE_CAGE_DETAILS WHERE STATE NOT IN (101, 200, 201)) T1
                 LEFT JOIN (SELECT * FROM BIG_STORAGE_CAGE_DETAILS WHERE STATE NOT IN (101, 8, 9)) T1
                           ON T.SLOT = T1.SLOT
        WHERE T.MAX_THICKNESS >= #{thickness}
          AND T.ENABLE_STATE = 1
        GROUP BY T.DEVICE_ID
        ORDER BY COUNT(DISTINCT T1.TEMPERING_LAYOUT_ID),
        ORDER BY COUNT(DISTINCT T1.ENGINEER_ID), COUNT(DISTINCT T1.TEMPERING_LAYOUT_ID),
                 COUNT(DISTINCT T1.SLOT)
    </select>
    <select id="queryFreeDeviceByNotUsed" resultType="java.lang.Integer">
        SELECT T.DEVICE_ID
        FROM BIG_STORAGE_CAGE T
                 LEFT JOIN (SELECT * FROM BIG_STORAGE_CAGE_DETAILS WHERE STATE NOT IN (101, 200, 201)) T1
                           ON T.SLOT = T1.SLOT
        WHERE T.MAX_THICKNESS >= #{thickness}
          AND T.ENABLE_STATE = 1
        GROUP BY T.DEVICE_ID
        ORDER BY COUNT(DISTINCT T1.TEMPERING_LAYOUT_ID),
                 COUNT(DISTINCT T.SLOT) - COUNT(DISTINCT T1.SLOT) DESC
    </select>
    <!--    <select id="queryFreeDeviceByNotUsed" resultType="java.lang.Integer">-->
    <!--        SELECT T.DEVICE_ID-->
    <!--        FROM BIG_STORAGE_CAGE T-->
    <!--                 LEFT JOIN (SELECT * FROM BIG_STORAGE_CAGE_DETAILS WHERE STATE NOT IN (101, 8, 9)) T1-->
    <!--                           ON T.SLOT = T1.SLOT-->
    <!--        WHERE T.MAX_THICKNESS >= #{thickness}-->
    <!--          AND T.ENABLE_STATE = 1-->
    <!--        GROUP BY T.DEVICE_ID-->
    <!--        ORDER BY COUNT(DISTINCT T1.ENGINEER_ID)-->
    <!--                 COUNT(DISTINCT T1.TEMPERING_LAYOUT_ID),-->
    <!--                 COUNT(DISTINCT T.SLOT) - COUNT(DISTINCT T1.SLOT) DESC-->
    <!--    </select>-->
</mapper>
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageOutTaskMapper.xml
@@ -3,12 +3,14 @@
<mapper namespace="com.mes.bigstoragetask.mapper.BigStorageCageOutTaskMapper">
    <insert id="saveBatch">
        INSERT INTO big_storage_cage_out_task ( glass_id, start_slot, end_slot, train_number, serial_number, task_state
        )
        INSERT INTO big_storage_cage_out_task ( glass_id, start_slot, end_slot, train_number, serial_number, width,
        height, task_state,
        deleted )
        values
        <foreach collection="list" item="item" separator=",">
            (#{item.glassId}, #{item.startSlot}, #{item.endSlot}, #{item.trainNumber}, #{item.serialNumber},
            #{item.taskState})
            #{item.width}, #{item.height},
            #{item.taskState},0)
        </foreach>
    </insert>
</mapper>
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingglass/controller/TemperingGlassInfoController.java
@@ -53,10 +53,7 @@
    public Result <Integer> updateTemperingState(@RequestBody  Damage damage) {
        damageService.insertDamage(damage);
        TemperingGlassInfo temperingGlassInfo=new TemperingGlassInfo();
        if(damage.getStatus()==2){
            temperingGlassInfo.setState(5);
        }
        temperingGlassInfo.setState(damage.getStatus());
        temperingGlassInfo.setGlassId(damage.getGlassId());
        int result=temperingGlassInfoService.updateTemperingState(temperingGlassInfo);
        return Result.build(200, "破损成功", result);
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-dev.yml
@@ -4,18 +4,8 @@
      primary: hangzhoumes #设置默认的数据源或者数据源组,默认值即为master
      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://127.0.0.1:3306/hangzhoumes?serverTimezone=GMT%2b8
          username: root
          password: beibo.123/
          driver-class-name: com.mysql.cj.jdbc.Driver
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/controller/DownGlassInfoController.java
@@ -1,5 +1,13 @@
package com.mes.downglassinfo.controller;
import com.mes.downglassinfo.entity.DownGlassInfo;
import com.mes.downglassinfo.entity.request.DownGlassInfoRequest;
import com.mes.downglassinfo.service.DownGlassInfoService;
import com.mes.utils.Result;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
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;
@@ -7,5 +15,26 @@
@RequestMapping("/downGlassInfo")
public class DownGlassInfoController {
    @Autowired
    DownGlassInfoService downGlassInfoService;
    /**
     * 设置查询参数
     *
     * @param request
     * @return
     */
    @PostMapping("/setDownGlassInfoRequest")
    @ApiOperation(value = "设置落架玻璃查询参数", notes = "设置落架玻璃查询参数")
    public Result<String> setDownGlassInfoRequest(@RequestBody DownGlassInfoRequest request) {
        Result.success(downGlassInfoService.setDownGlassInfoRequest(request));
        return Result.build(200, "查询成功", "1");
    }
    @PostMapping("/downGlassPrint")
    public Result downGlassPrint(@RequestBody DownGlassInfo downGlassInfo) {
        return Result.build(200, "查询成功", downGlassInfoService.downGlassPrint(downGlassInfo));
    }
}
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/entity/DownGlassInfo.java
@@ -7,6 +7,7 @@
import org.springframework.stereotype.Component;
import java.io.Serializable;
import java.util.Date;
/**
 * <p>
@@ -79,5 +80,14 @@
     */
    private String glassId;
    /**
     * 创建时间
     */
    private Date gmtCreate;
    /**
     * 玻璃类型
     */
    private Integer glassType;
}
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/entity/DownGlassTask.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -87,4 +88,7 @@
     * 创建时间
     */
    private Date CreateTime;
    @TableLogic
    private int deleted;
}
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/mapper/DownGlassInfoMapper.java
@@ -33,5 +33,13 @@
     * @param isDownload 是否获取未落架玻璃信息  True 已落架  false 未落架
     * @return
     */
    List<DownGlassInfoDTO> queryWorkStationIsIn(@Param(value = "isDownload") Boolean isDownload);
    List<DownGlassInfoDTO> queryWorkStationIsIn(@Param(value = "workList") List<Integer> workList, @Param(value = "isDownload") Boolean isDownload);
    /**
     * 获取
     *
     * @param workList
     * @return
     */
    List<DownGlassInfoDTO> queryWorkStationFlowCard(@Param(value = "workList") List<Integer> workList);
}
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/service/DownGlassInfoService.java
@@ -2,9 +2,12 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.mes.downglassinfo.entity.DownGlassInfo;
import com.mes.downglassinfo.entity.request.DownGlassInfoRequest;
import com.mes.downworkstation.entity.DownWorkstation;
import com.mes.downworkstation.entity.dto.DownGlassInfoDTO;
import java.util.List;
import java.util.Map;
public interface DownGlassInfoService extends IService<DownGlassInfo> {
@@ -31,7 +34,15 @@
     * @param isDownload true/false
     * @return
     */
    List<DownGlassInfoDTO> queryWorkStationIsIn(Boolean isDownload);
    List<DownGlassInfoDTO> queryWorkStationIsIn(List<Integer> workList, Boolean isDownload);
    /**
     * 获取指定架子已绑定流程卡的架子未落玻璃的数据信息
     *
     * @param workList 指定的架子号
     * @return
     */
    List<DownGlassInfoDTO> queryWorkStationFlowCard(List<Integer> workList);
    /**
     * 生成出片任务
@@ -40,4 +51,18 @@
     * @return
     */
    boolean generateOutGlassTask(String glassId);
    /**
     * 设置架子定时任务查询条件
     *
     * @param request
     * @return
     */
    String setDownGlassInfoRequest(DownGlassInfoRequest request);
    List<Map<String, List<Map<String, Object>>>> downGlassPrint(DownGlassInfo downGlassInfo);
    List<DownWorkstation> queryWorkStationIsFull();
}
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/controller/DownStorageCageDetailsController.java
@@ -2,6 +2,7 @@
import com.mes.downstorage.entity.DownStorageCage;
import com.mes.downstorage.entity.DownStorageCageDetails;
import com.mes.downstorage.entity.request.CacheWornRequest;
import com.mes.downstorage.service.DownStorageCageDetailsService;
import com.mes.downstorage.service.DownStorageCageService;
import com.mes.utils.Result;
@@ -61,8 +62,9 @@
    @ApiOperation("删除缓存理片笼信息   功能:对笼内栅格玻璃进行【清除】")
    @PostMapping("/deleteDownStorageCage")
    @ResponseBody
    public Result deleteDownStorageCage(@RequestBody DownStorageCageDetails downStorageCageDetails,int downStorageCageId) {
        boolean isSucess=downStorageCageService.updateDownStorageCageDetails(downStorageCageId,downStorageCageDetails);
    public Result deleteDownStorageCage(@RequestBody CacheWornRequest cacheWornRequest) {
        downStorageCageService.deleteDownStorageCage(cacheWornRequest);
//        boolean isSucess=downStorageCageService.updateDownStorageCageDetails(downStorageCageId,downStorageCageDetails);
        return Result.build(200,"删除成功",1);
    }
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/service/DownStorageCageDetailsService.java
@@ -71,6 +71,13 @@
     */
    boolean DirectConnection(GlassInfo glassInfo);
    /**
     * 获取当前非本架子可落架的玻璃信息
     *
     * @param glassId
     * @param workList G06/G11:传入G06实际获取的为可落架G11的玻璃 反之同理
     * @return
     */
    String getGlassInfoMaxCount(String glassId, List<Integer> workList);
    /**
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/service/DownStorageCageService.java
@@ -4,6 +4,7 @@
import com.mes.downglassinfo.entity.DownGlassTask;
import com.mes.downstorage.entity.DownStorageCage;
import com.mes.downstorage.entity.DownStorageCageDetails;
import com.mes.downstorage.entity.request.CacheWornRequest;
import com.mes.glassinfo.entity.GlassInfo;
import java.util.List;
@@ -53,6 +54,8 @@
    List<Map<String, Object>> selectDownStorageCages();
    List<DownStorageCageDetails> selectCacheMax();
    void deleteDownStorageCage(CacheWornRequest cacheWornRequest);
}
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/controller/DownWorkstationController.java
@@ -1,6 +1,7 @@
package com.mes.downworkstation.controller;
import com.mes.common.utils.RedisUtil;
import com.mes.downworkstation.entity.DownWorkstation;
import com.mes.downworkstation.entity.request.DownWorkRequest;
import com.mes.downworkstation.service.DownWorkstationService;
@@ -11,6 +12,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
@@ -32,6 +34,8 @@
    private DownWorkstationService downWorkstationService;
    @Autowired
    private GlassInfoService glassInfoService;
    @Resource
    private RedisUtil redisUtil;
    @ApiOperation("获取工位信息")
    @GetMapping("/getone")
@@ -81,7 +85,6 @@
            return Result.build(200, "清除工位信息成功", 1);
        // 构建响应数据
    }
@@ -120,6 +123,20 @@
        return Result.build(200, "更换成功", isSucess);
    }
    @ApiOperation("关闭工位已满警报")
    @PostMapping("/closeAlarmSignal")
    @ResponseBody
    public Result<String> closeAlarmSignal() {
        return Result.build(200, "更换成功", downWorkstationService.closeAlarmSignal());
    }
    @ApiOperation("是否自动打印")
    @PostMapping("/autoPrint")
    public Result autoPrint(Boolean flag) {
        downWorkstationService.autoPrint(flag);
        return Result.build(200, "修改成功", redisUtil.getCacheObject("autoPrint"));
    }
}
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/service/DownWorkstationService.java
@@ -77,4 +77,8 @@
     * @returnq 启用禁用
     */
    boolean updateDownWorkstationstate(DownWorkstation downWorkstation);
    String closeAlarmSignal();
    void autoPrint(Boolean flag);
}
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/JsonFile/PlcdownGlass.json
File was deleted
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/application-cz.yml
@@ -14,6 +14,11 @@
          username: sa
          password: beibo.123/
          driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
        pp:
          url: jdbc:mysql://192.168.1.199:3306/pp?serverTimezone=GMT%2b8
          username: root
          password: beibo.123/
          driver-class-name: com.mysql.cj.jdbc.Driver
  cloud:
    nacos:
      discovery:
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/mapper/DownGlassInfoMapper.xml
@@ -58,16 +58,36 @@
        AND T.LAYER = T1.LAYER
        LEFT JOIN DOWN_GLASS_INFO T2 ON T1.GLASS_ID = T2.GLASS_ID
        <where>
            t.workstation_id in
            <foreach collection="workList" item="item" open='(' close=')' separator=','>
                #{item}
            </foreach>
            <if test="!isDownload">
                AND T2.GLASS_ID IS NULL
            </if>
            <if test="isDownload">
                AND T2.GLASS_ID IS not NULL
            </if>
        </where>
        ORDER BY
        T.RACKS_NUMBER DESC,
        T1.TEMPERING_LAYOUT_ID,
        T1.TEMPERING_FEED_SEQUENCE DESC
    </select>
    <select id="queryWorkStationFlowCard" resultMap="downGlassInfo">
        SELECT
        T.FLOW_CARD_ID,
        T.LAYER,
        T.RACKS_NUMBER
        FROM
        DOWN_WORKSTATION T
        where
        (t.flow_card_id is not null and t.flow_card_id != '')
        and t.workstation_id in
        <foreach collection="workList" item="item" open='(' close=')' separator=','>
            #{item}
        </foreach>
        ORDER BY T.RACKS_NUMBER DESC
    </select>
</mapper>
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/mapper/DownStorageCageDetailsMapper.xml
@@ -28,12 +28,11 @@
        FROM DOWN_STORAGE_CAGE_DETAILS
        WHERE STATE = 100
        and (FLOW_CARD_ID, LAYER) not in (
        select FLOW_CARD_ID, LAYER from down_workstation where flow_card_id is not null and workstation_id not in
        select FLOW_CARD_ID, LAYER from down_workstation where flow_card_id is not null and workstation_id in
        <foreach collection="workList" item="item" open='(' close=')' separator=','>
            #{item}
        </foreach>
        )
        GROUP BY FLOW_CARD_ID, LAYER
        ORDER BY COUNT(FLOW_CARD_ID) DESC
        LIMIT 1 )
hangzhoumesParent/moduleService/UnLoadGlassModule/src/test/java/mes/UnloadGlassModuleApplicationTest.java
@@ -1,6 +1,7 @@
package mes;
import com.mes.UnLoadGlassApplication;
import com.mes.downglassinfo.entity.DownGlassInfo;
import com.mes.downglassinfo.service.DownGlassInfoService;
import com.mes.downglassinfo.service.DownGlassTaskService;
import com.mes.downglassinfo.service.impl.DownGlassInfoServiceImpl;
@@ -224,7 +225,13 @@
    }*/
    @Test
    public void downGlassPrint() {
        DownGlassInfo downGlassInfo=new DownGlassInfo();
        downGlassInfo.setFlowCardId("NG24070506A001");
        downGlassInfo.setLayer(1);
        downGlassInfoService.downGlassPrint(downGlassInfo);
    }