huang
2025-06-13 9c18324b8c3209946429ac60306ddc3c9cdaf1e9
代码迁移 从义务分支迁移本项目
828个文件已添加
233416 ■■■■■ 已修改文件
.idea/.gitignore 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/MarsCodeWorkspaceAppSettings.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/compiler.xml 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/encodings.xml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/jarRepositories.xml 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/misc.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/vcs.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
JsonFile/PlcCacheGlass.json 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
JsonFile/PlcCacheVerticalGlass.json 377 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
JsonFile/PlcLoadGlass.json 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
JsonFile/PlcTemperingGlass.json 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
JsonFile/PlcdownGlass.json 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
README.md 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/.gitignore 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/.vscode/extensions.json 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/README.md 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/auto-imports.d.ts 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/config.js 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/index.html 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/package-lock.json 5351 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/package.json 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/public/favicon.ico 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/public/vuefavicon.ico 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/App.vue 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/1.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/11.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/2.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/3.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/88.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/9.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/C1.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/aaa.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/background.jpg 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/base.css 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/bigcar01.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/cangchu1.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/cangchu2.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/cp.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/d1.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/d1a.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/d2.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/d3.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/dipan.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/dlpl.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/dlpl9.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/dlpla.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/dpxsa.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/emi.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/ganghuaqian.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/img.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/logo.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/lp.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/lp9.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/lpa.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/lpa9.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/lpl.jpg 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/lpla.jpg 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/main.css 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/northGlass.ico 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/s.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/screen.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/screen2.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/shangpian.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/shangpianji.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/sz.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/taimian.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/user.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/woshihuancun.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/xiaoche.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/xmjc.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/xmjclzh.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/ypcaac.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/ypcc.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/ypccche.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/zhongkong.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/hook/index.js 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/lang/companyInfo.js 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/lang/en.js 925 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/lang/index.js 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/lang/py.js 886 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/lang/zh.js 929 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/layout/MainErpView.vue 470 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/main.js 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/router/index.js 514 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/stores/counter.js 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/stores/sd/product/productGlassType.js 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/stores/tableData.js 225 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/stores/userInfo.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/utils/WebSocketService.js 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/utils/api.js 205 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/utils/constants.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/utils/deepClone.js 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/utils/evicePixelRatio.js 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/utils/request.js 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/utils/unloadrequest.js 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Caching/caching.vue 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Caching/cachingbefore.vue 548 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Caching/cachingbeforehistory.vue 412 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Caching/cachingun.vue 456 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Caching/cachingunhistory.vue 412 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/GlassStorage/GlassStorage.vue 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/GlassStorage/MaterialRackManagement.vue 687 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/GlassStorage/rawfilmstorage.vue 1120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/GlassStorage/rawfilmstorage2.vue 1424 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/GlassStorage/rawhistory.vue 400 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/HomeView.vue 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Identify/ident.vue 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Identify/identifwu.vue 238 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Identify/identifwutwo.vue 235 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Identify/identify.vue 281 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/LoginView.vue 224 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/NewPage.vue 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Permissions/permissionslist.vue 418 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/PurchaseReturn/purchase.vue 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/PurchaseReturn/purchaseReturn.vue 1167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/PurchaseReturn/purchaseStorage.vue 306 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/RegisterView.vue 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/ReportWork/reportWork.vue 353 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Returns/return.vue 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Returns/upreturnhistory.vue 310 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Returns/upreturnhistory2.vue 312 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Returns/upreturns.vue 635 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Returns/upreturns2.vue 638 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Returns/upreturns3.vue 839 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Slicecage/slicecage.vue 1760 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Slicecage/slicecagehistory.vue 535 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/StockBasicData/Select.vue 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/StockBasicData/stockBasicData.vue 260 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/StockBasicData/stockBasicDatatwo.vue 136 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/StockBasicData/stockBasicyiwu.vue 306 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/StockBasicData/stockhistory.vue 271 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/TL/Temperedlayout/Temperedlayout.vue 211 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/User/permissions.vue 468 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/User/rolelist.vue 362 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/User/user.vue 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/User/userlist.vue 339 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/User/userpageNo.vue 294 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Visualization/screen.vue 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Visualization/screenone.vue 366 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Visualization/screenthree.vue 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Visualization/screentwo.vue 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/hollow/hellowquiphistory.vue 728 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/hollow/hellowquipthreehistory.vue 506 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/hollow/hellowquiptwohistory.vue 508 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/hollow/hellowslicecagehistory.vue 542 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/hollow/hol.vue 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/hollow/hollowaluminum.vue 203 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/hollow/hollowaluminumthree.vue 203 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/hollow/hollowaluminumtwo.vue 203 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/hollow/hollowequipment.vue 1803 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/hollow/hollowequipmenthree.vue 1023 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/hollow/hollowequipmenttwo.vue 1026 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/hollow/hollowslicecage.vue 1145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/largescreen/largescreen.vue 661 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/largescreendisplay/screendisplay.vue 1290 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/largescreendisplay/statistics.vue 226 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/mm/purchaseOrder/Create.vue 724 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/mm/purchaseOrder/CreateHeader.vue 739 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/mm/purchaseOrder/Details.vue 453 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/mm/purchaseOrder/Payment.vue 354 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/mm/purchaseOrder/PurchaseOrder.vue 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/mm/purchaseOrder/Return.vue 593 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/mm/purchaseOrder/Select.vue 917 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/mm/purchaseOrder/Storage.vue 603 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/vite.config.js 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/vue.config.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/JsonFile/PlcCacheGlass.json 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/JsonFile/PlcCacheVerticalGlass.json 392 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/JsonFile/PlcLoadGlass.json 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/JsonFile/PlcTemperingGlass.json 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/JsonFile/PlcdownGlass.json 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/pom.xml 210 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/pom.xml 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/kangaroohy/milo/configuration/MiloAutoConfiguration.java 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/kangaroohy/milo/pool/MiloConnectFactory.java 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/base/entity/BigStorageCageBaseInfo.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/base/entity/HollowBigStorageCageBaseInfo.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/base/entity/PageRequest.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/base/entity/vo/BigStorageVO.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/bigstoragecagetask/entity/BigStorageCageTask.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/bigstoragecagetask/entity/BigStorageTaskVO.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/bigstoragecagetask/mapper/BigStorageCageTaskMapper.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/bigstoragecagetask/service/BigStorageCageTaskService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/bigstoragecagetask/service/impl/BigStorageCageTaskServiceImpl.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/Const.java 325 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/ConstSysConfig.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/MybatisPlusConfig.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/Swagger2Config.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/WebSocketConfig.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/exception/GlobalExceptionHandler.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/exception/ServiceException.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/handler/MyMetaObjectHandler.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/controller/DamageController.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/entity/Damage.java 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/entity/DamagePrint.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/entity/request/DamageRequest.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/mapper/DamageMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/service/DamageService.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/service/impl/DamageServiceImpl.java 418 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/device/PlcBitInfo.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/device/PlcBitObject.java 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/device/PlcParameterInfo.java 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/device/PlcParameterObject.java 274 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/engineering/entity/Engineering.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/engineering/entity/OptimizeEngineering.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/engineering/mapper/EngineeringMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/engineering/mapper/xml/EngineeringMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/engineering/service/EngineeringService.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/engineering/service/impl/EngineeringServiceImpl.java 181 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/entity/request/GeneralRequest.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/controller/GlassInfoController.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/entity/GlassInfo.java 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/entity/LoadGlassInfo.java 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/entity/OptimizeGlassinfo.java 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/entity/dto/HollowGlassInfoDTO.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/mapper/GlassInfoMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/service/GlassInfoService.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/service/impl/GlassInfoServiceImpl.java 175 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/largenscreen/controller/LargenScreenController.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/largenscreen/entity/DailyProductionVO.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/largenscreen/entity/DateRequest.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/largenscreen/entity/PieChartVO.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/largenscreen/mapper/LargenScreenMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/largenscreen/service/LargenScreenService.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/largenscreen/service/impl/LargenScreenServiceImpl.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/entity/LoadGlassDeviceTask.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/entity/LoadGlassDeviceTaskHistory.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/entity/request/LoadGlassDeviceTaskHistoryRequest.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/mapper/LoadGlassDeviceTaskHistoryDao.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/mapper/LoadGlassDeviceTaskMapper.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/LoadGlassDeviceTaskHistoryService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/LoadGlassDeviceTaskService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/impl/LoadGlassDeviceOneTaskServiceImpl.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/impl/LoadGlassDeviceTaskHistoryServiceImpl.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/order/controller/OrderController.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/order/entity/Order.java 232 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/order/entity/Orderdetail.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/order/entity/Orders.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/order/entity/dto/OrderDTO.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/order/entity/request/OrderRequest.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/order/mapper/OrderMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/order/mapper/OrderdetailMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/order/mapper/OrdersMapper.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/order/mapper/xml/OrderMapper.xml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/order/service/OrdersService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/order/service/impl/OrdersServiceImpl.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/controller/BasicDataProduceController.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/controller/DamageDetailsController.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/controller/FlowCardController.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/controller/OptimizeLayoutController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/controller/OptimizeProjectController.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/controller/ReportingWorkController.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/controller/ReportingWorkDetailController.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/BasicDataProduce.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/DamageDetails.java 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/FlowCard.java 163 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeDetail.java 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeHeatDetail.java 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeHeatLayout.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeLayout.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeProject.java 214 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/ReportingWork.java 179 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/ReportingWorkDetail.java 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/dto/FlowCardDTO.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/dto/FlowCardPercentDTO.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/dto/ReportWorkDTO.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/request/AwaitingRepair.java 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/request/FlowCardRequest.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/request/OptimizeRequest.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/request/OrderDetail.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/request/ReportWorkRequest.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/request/Reportingdamage.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/BasicDataProduceMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/FlowCardMapper.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/OptimizeDetailMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/OptimizeHeatDetailMapper.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/OptimizeHeatLayoutMapper.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/OptimizeLayoutMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/OptimizeProjectMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/ReportingWorkDetailMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/ReportingWorkMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/request/AwaitingRepairMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/request/ReportingDamageMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/BasicDataProduceService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/DamageDetailsService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/FlowCardService.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeDetailService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeHeatDetailService.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeHeatLayoutService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeLayoutService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeProjectService.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/ReportingWorkDetailService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/ReportingWorkService.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/BasicDataProduceServiceImpl.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/FlowCardServiceImpl.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeDetailServiceImpl.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeHeatDetailServiceImpl.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeHeatLayoutServiceImpl.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeLayoutServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeProjectServiceImpl.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/ReportingWorkServiceImpl.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/entity/RawGlassStorageDetails.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/entity/dto/RawGlassStorageDetailsDTO.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/entity/request/RawGlassRequest.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/mapper/RawGlassStorageDetailsMapper.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/service/RawGlassStorageDetailsService.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/service/impl/RawGlassStorageDetailsServiceImpl.java 244 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassstation/entity/RawGlassStorageStation.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassstation/mapper/RawGlassStorageStationMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassstation/service/RawGlassStorageStationService.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassstation/service/impl/RawGlassStorageStationServiceImpl.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglasstask/entity/RawGlassStorageTask.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglasstask/entity/request/RawGlassTaskRequest.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglasstask/mapper/RawGlassStorageTaskMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglasstask/mapper/xml/RawGlassStorageTaskMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglasstask/service/RawGlassStorageTaskService.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglasstask/service/impl/RawGlassRawGlassStorageTaskServiceImpl.java 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/sysconfig/controller/SysConfigController.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/sysconfig/entity/SysConfig.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/sysconfig/entity/request/SysConfigRequest.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/sysconfig/mapper/SysConfigMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/sysconfig/service/SysConfigService.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/sysconfig/service/impl/SysConfigServiceImpl.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/sysdict/entity/SysDictData.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/sysdict/entity/SysDictType.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/sysdict/mapper/SysDictDataMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/sysdict/mapper/SysDictTypeMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/sysdict/service/SysDictDataService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/sysdict/service/SysDictTypeService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/sysdict/service/impl/SysDictDataServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/sysdict/service/impl/SysDictTypeServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/entity/TemperingGlassInfo.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/mapper/TemperingGlassInfoMapper.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/TemperingGlassInfoService.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/impl/TemperingGlassInfoServiceImpl.java 210 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/CodeGet.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/DatabaseDesignDocUtil.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/DateUtil.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/InitUtil.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/PageUtil.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/S7control.java 465 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/WebSocketServer.java 175 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/uppattenusage/entity/UpPattenUsage.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/uppattenusage/entity/vo/UpPattenUsageVO.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/uppattenusage/mapper/UpPattenUsageMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/utils/MD5.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/utils/RedisUtil.java 235 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/utils/ResponseUtil.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/utils/Result.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/utils/ResultCodeEnum.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/work_assignment/controller/WorkAssignmentController.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/work_assignment/entity/WorkAssignment.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/work_assignment/mapper/WorkAssignmentMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/work_assignment/mapper/xml/WorkAssignmentMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/work_assignment/service/WorkAssignmentService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/work_assignment/service/impl/WorkAssignmentServiceImpl.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/resources/application.yml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/resources/banner.txt 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/resources/mapper/BigStorageCageTaskMapper.xml 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/resources/mapper/FlowCardMapper.xml 187 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/resources/mapper/GlassInfoMapper.xml 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/resources/mapper/LargenScreenMapper.xml 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/resources/mapper/LoadGlassDeviceTaskMapper.xml 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/resources/mapper/OptimizeProjectMapper.xml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/resources/mapper/OrderMapper.xml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/resources/mapper/RawGlassStorageDetailsMapper.xml 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/resources/mapper/RawGlassStorageStationMapper.xml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/resources/mapper/TemperingGlassInfoMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/resources/mapper/UpPattenUsageMapper.xml 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/target/classes/application.yml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/target/classes/banner.txt 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/target/classes/mapper/BigStorageCageTaskMapper.xml 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/target/classes/mapper/FlowCardMapper.xml 187 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/target/classes/mapper/GlassInfoMapper.xml 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/target/classes/mapper/LargenScreenMapper.xml 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/target/classes/mapper/LoadGlassDeviceTaskMapper.xml 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/target/classes/mapper/OptimizeProjectMapper.xml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/target/classes/mapper/OrderMapper.xml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/target/classes/mapper/RawGlassStorageDetailsMapper.xml 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/target/classes/mapper/RawGlassStorageStationMapper.xml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/target/classes/mapper/TemperingGlassInfoMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/target/classes/mapper/UpPattenUsageMapper.xml 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/pom.xml 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/config/RedisConfig.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/config/TokenWebSecurityConfig.java 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/filter/JwtAuthenticationTokenFilter.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAccessDeniedHandler.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAuthenticationEntryPoint.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtLogoutSuccessHandler.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginFailureHandler.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginSuccessHandler.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/FastJsonRedisSerializer.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/JwtUtil.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/UserInfoUtils.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/WebUtils.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/controller/SysMenuController.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/entity/SysMenu.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/mapper/SysMenuMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/service/SysMenuService.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/service/impl/SysMenuServiceImpl.java 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/controller/SysRoleController.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRole.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRoleMenu.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/vo/SysRoleVO.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMenuMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/xml/SysRoleMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/xml/SysRoleMenuMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleMenuService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleService.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleMenuServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleServiceImpl.java 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/controller/SysUserController.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/LoginUser.java 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/SysUser.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/SysUserRole.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/vo/SysUserVO.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/SysUserMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/SysUserRoleMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/xml/SysUserMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/xml/SysUserRoleMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/SysUserRoleService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/SysUserService.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/impl/SysUserRoleServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/impl/SysUserServiceImpl.java 269 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/resources/application-dev.yml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/resources/application-loc.yml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/resources/application-prod.yml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/resources/mapper/SysMenuMapper.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/target/classes/application-dev.yml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/target/classes/application-loc.yml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/target/classes/application-prod.yml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/target/classes/mapper/SysMenuMapper.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/gateway/pom.xml 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/gateway/src/main/java/com/mes/GateWayApplication.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/gateway/src/main/java/com/mes/config/MyCorsConfig.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/gateway/src/main/resources/application.yml 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/gateway/target/classes/application.yml 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/mesHub/pom.xml 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/mesHub/src/main/java/com/mes/MesHubApplication.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/mesHub/src/main/resources/application-dev.yml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/mesHub/src/main/resources/application.yml 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/pom.xml 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/AppRunnerConfig.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/CacheGlassModuleApplication.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/common/S7object.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/common/SmbTool.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/config/S7ConfigWL1.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgglasstask/controller/EdgGlassTaskInfoController.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgglasstask/entity/EdgGlassTaskInfo.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgglasstask/entity/request/EdgGlassInfoRequest.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgglasstask/mapper/EdgGlassTaskInfoMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgglasstask/service/EdgGlassTaskInfoService.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgglasstask/service/impl/EdgGlassTaskInfoServiceImpl.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/controller/EdgStorageCageController.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/controller/EdgStorageCageDetailsController.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/entity/EdgStorageCage.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/entity/EdgStorageCageDetails.java 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/entity/vo/CutDrawingVO.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/entity/vo/EdgSlotRemainVO.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/entity/vo/EdgStorageCageVO.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/mapper/EdgStorageCageDetailsMapper.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/mapper/EdgStorageCageMapper.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/EdgStorageCageDetailsService.java 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/EdgStorageCageService.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/impl/EdgStorageCageDetailsServiceImpl.java 383 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/impl/EdgStorageCageServiceImpl.java 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/CacheGlassTask.java 873 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/OpcCacheGlassNewTask.java 755 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/OpcCacheGlassTask.java 722 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/OpcEdgTask.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/PushMessageToIndex.java 220 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/entity/CacheGlassInfo.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/opccallback/CacheGlassStartCallback.java 451 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/controller/EdgStorageDeviceController.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/controller/EdgStorageDeviceTaskHistoryController.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/entity/EdgStorageDeviceTask.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/entity/EdgStorageDeviceTaskHistory.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/entity/request/TaskHistoryRequest.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/mapper/EdgStorageDeviceTaskHistoryMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/mapper/EdgStorageDeviceTaskMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/service/EdgStorageDeviceTaskHistoryService.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/service/EdgStorageDeviceTaskService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/service/impl/EdgStorageDeviceTaskHistoryServiceImpl.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/service/impl/EdgStorageDeviceTaskServiceImpl.java 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/s7/entity/S7DataWL1.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/s7/job/s7Job.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/taskcache/controller/TaskCacheController.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/taskcache/entity/TaskCache.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/taskcache/mapper/TaskCacheMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/taskcache/service/TaskCacheService.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/taskcache/service/impl/TaskCacheServiceImpl.java 186 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/JsonFile/PlcCacheGlass.json 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/application-cz.yml 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/application-dev.yml 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/application-prod.yml 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/application-yw.yml 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/application.yml 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/logback-spring.xml 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageCageDetailsMapper.xml 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageCageMapper.xml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageDeviceTaskHistoryMapper.xml 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageDeviceTaskMapper.xml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/TaskCacheMapper.xml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/test/java/com/mes/CacheGlassModuleApplicationTest.java 166 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/target/classes/JsonFile/PlcCacheGlass.json 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/target/classes/application-cz.yml 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/target/classes/application-dev.yml 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/target/classes/application-prod.yml 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/target/classes/application-yw.yml 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/target/classes/application.yml 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/target/classes/logback-spring.xml 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/target/classes/mapper/EdgStorageCageDetailsMapper.xml 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/target/classes/mapper/EdgStorageCageMapper.xml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/target/classes/mapper/EdgStorageDeviceTaskHistoryMapper.xml 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/target/classes/mapper/EdgStorageDeviceTaskMapper.xml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/target/classes/mapper/TaskCacheMapper.xml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/pom.xml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/AppRunnerConfig.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/CacheVerticalClassModuleApplication.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/controller/BigStorageCageController.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/controller/BigStorageCageDetailsController.java 201 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/controller/BigStorageGlassInfoController.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/controller/BigStorageGlassRelationInfoController.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/BigStorageCage.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/BigStorageCageDetails.java 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/BigStorageGlassInfo.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/BigStorageGlassRelationInfo.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/BigStorageAndDetailsDTO.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/BigStorageDTO.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/BigStorageRelationDTO.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/BigStorageSequenceDTO.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/BigStorageSummaryDTO.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/GlassInfoLackDTO.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/SlotSequenceDTO.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/TemperingGlassCountDTO.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/TemperingLayoutDTO.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/vo/BigStorageDetailsQueryVO.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/vo/BigStorageQueryVO.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/mapper/BigStorageCageDetailsMapper.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/mapper/BigStorageCageMapper.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/mapper/BigStorageGlassInfoMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/mapper/BigStorageGlassRelationInfoMapper.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/BigStorageCageDetailsService.java 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/BigStorageCageService.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/BigStorageGlassInfoService.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/BigStorageGlassRelationInfoService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java 554 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageServiceImpl.java 336 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageGlassInfoServiceImpl.java 218 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageGlassRelationInfoServiceImpl.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/controller/BigStorageCageHistoryTaskController.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/entity/BigStorageCageHistoryTask.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/entity/request/BigStorageCageHistoryRequest.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/mapper/BigStorageCageHistoryTaskMapper.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/BigStorageCageHistoryTaskService.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/impl/BigStorageCageHistoryTaskServiceImpl.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/controller/BigStorageCageFeedTaskController.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/controller/BigStorageCageOutTaskController.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/entity/BigStorageCageFeedTask.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/entity/BigStorageCageOutTask.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/entity/UpdateBigStorageCageDTO.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/mapper/BigStorageCageFeedTaskMapper.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/mapper/BigStorageCageOutTaskMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/service/BigStorageCageFeedTaskService.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/service/BigStorageCageOutTaskService.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/service/impl/BigStorageCageFeedTaskServiceImpl.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/service/impl/BigStorageCageOutTaskServiceImpl.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/common/S7object.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/config/S7Config.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/edgglasstask/controller/EdgGlassTaskInfoController.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/edgglasstask/entity/EdgGlassTaskInfo.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/edgglasstask/mapper/EdgGlassTaskInfoMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/edgglasstask/service/EdgGlassTaskInfoService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/edgglasstask/service/impl/EdgGlassTaskInfoServiceImpl.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/OPCPlcSlicecage.java 232 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/OpcPlcStorageCageNewTask.java 836 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/OpcPlcStorageCageTask.java 613 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcSlicecage.java 201 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcStorageCageTask.java 1162 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/opccallback/BigStorageStartCallback.java 823 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/s7/entity/S7Data.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/s7/job/s7Job.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/temperingglass/controller/TemperingGlassInfoController.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/temperingglass/service/TemperingGlassInfoService.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/temperingglass/service/impl/TemperingGlassInfoServiceImpl.java 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/tools/service/BigStorageBaseService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/tools/service/impl/BigStorageBaseServiceImpl.java 671 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/JsonFile/PlcCacheVerticalGlass.json 391 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/application-cz.yml 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/application-dev.yml 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/application-prod.yml 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/application-yw.yml 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/application.yml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/logback-spring.xml 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml 277 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageFeedTaskMapper.xml 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageHistoryTaskMapper.xml 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageMapper.xml 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageOutTaskMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageGlassRelationInfoMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/test/java/com/mes/CacheVerticalGlassModuleApplicationTest.java 322 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/GlassStorageModule/pom.xml 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/GlassStorageApplication.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/config/S7Config.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/job/RawGlassPushMessage.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/job/RawGlassTask.java 603 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/controller/RawGlassStorageDetailsController.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassstation/controller/RawGlassStorageStationController.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglasstask/controller/RawGlassStorageTaskController.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/s7/entity/S7Data.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/GlassStorageModule/src/main/resources/application-alg.yml 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/GlassStorageModule/src/main/resources/application-dev.yml 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/GlassStorageModule/src/main/resources/application-prod.yml 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/GlassStorageModule/src/main/resources/application-yw.yml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/GlassStorageModule/src/main/resources/application.yml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/GlassStorageModule/src/test/java/mes/GlassStorageModuleApplicationTest.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/GlassStorageModule/target/classes/application-alg.yml 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/GlassStorageModule/target/classes/application-dev.yml 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/GlassStorageModule/target/classes/application-prod.yml 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/GlassStorageModule/target/classes/application-yw.yml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/GlassStorageModule/target/classes/application.yml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/pom.xml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/AppRunnerConfig.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/LoadGlassModuleApplication.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/common/S7object.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/config/S7Config.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/engineering/controller/EngineeringController.java 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/engineering/mapper/EngineeringMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/engineering/mapper/xml/EngineeringMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/job/OpcLoadGlassTask.java 264 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/job/PlcLoadGlassTask.java 226 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/loadglassdevicetaskhistory/controller/LoadGlassDeviceTaskHistoryController.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/s7/entity/S7Data.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/controller/UpPattenUsageController.java 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/entity/OptimizeUpPattenUsage.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/service/UpPattenUsageService.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/service/impl/UpPattenUsageServiceImpl.java 232 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/workstation/controller/UpWorkstationController.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/workstation/entity/UpWorkSequence.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/workstation/entity/UpWorkstation.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/workstation/mapper/UpWorkstationMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/workstation/service/UpWorkstationService.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/workstation/service/impl/UpWorkstationServiceImpl.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/JsonFile/PlcLoadGlass.json 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-alg.yml 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-cz.yml 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-dev.yml 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-prod.yml 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-yw.yml 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application.yml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/logback-spring.xml 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/mapper/UpWorkstationMapper.xml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/test/java/com/mes/ApplicationTest.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/test/java/com/mes/LoadGlassModuleApplicationTest.java 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/target/classes/JsonFile/PlcLoadGlass.json 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/target/classes/application-alg.yml 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/target/classes/application-cz.yml 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/target/classes/application-dev.yml 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/target/classes/application-prod.yml 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/target/classes/application-yw.yml 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/target/classes/application.yml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/target/classes/logback-spring.xml 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/target/classes/mapper/UpWorkstationMapper.xml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/pom.xml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/TemperingGlassModuleApplication.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/common/S7object.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/OpcNGTemperingTask.java 178 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/PlcScreenTask.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/PlcTemperingGlassTask.java 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/TemperingTask.java 165 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingglass/controller/TemperingGlassInfoController.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingglass/eneity/request/DamageRequest.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingrecord/controller/TemperingRecordController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingrecord/entity/TemperingRecord.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingrecord/mapper/TemperingRecordMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingrecord/mapper/xml/TemperingRecordMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingrecord/service/TemperingRecordService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingrecord/service/impl/TemperingRecordServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-cz.yml 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-dev.yml 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-prod.yml 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-yw.yml 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application.yml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/changelog/changelogBase.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/changelog/mesChangelogInit.sql 1662 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/changelog/mesRedisChange.sql 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/json/PlcTemperingGlass.json 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/logback-spring.xml 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/test/java/com/mes/TemperingApplicationTest.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/pom.xml 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/AppRunnerConfig.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/UnLoadGlassApplication.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/common/S7object.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/controller/DownGlassInfoController.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/controller/DownGlassTaskController.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/entity/DownGlassInfo.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/entity/DownGlassTask.java 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/entity/request/DownGlassInfoRequest.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/mapper/DownGlassInfoMapper.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/mapper/DownGlassTaskMapper.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/service/DownGlassInfoService.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/service/DownGlassTaskService.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/service/impl/DownGlassInfoServiceImpl.java 315 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/service/impl/DownGlassTaskServiceImpl.java 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/controller/DownStorageCageController.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/controller/DownStorageCageDetailsController.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/entity/DownStorageCage.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/entity/DownStorageCageDetails.java 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/entity/request/CacheWornRequest.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/mapper/DownStorageCageDetailsMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/mapper/DownStorageCageMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/service/DownStorageCageDetailsService.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/service/DownStorageCageService.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/service/impl/DownStorageCageDetailsServiceImpl.java 372 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/service/impl/DownStorageCageServiceImpl.java 226 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/controller/DownWorkstationController.java 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/controller/DownWorkstationTaskController.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/entity/DownWorkstation.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/entity/DownWorkstationTask.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/entity/DownWorkstionAndDownGlassinfo.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/entity/dto/DownGlassInfoDTO.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/entity/request/DownWorkRequest.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/mapper/DownWorkstationMapper.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/mapper/DownWorkstationTaskMapper.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/service/DownWorkstationService.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/service/DownWorkstationTaskService.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/service/impl/DownWorkstationServiceImpl.java 244 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/service/impl/DownWorkstationTaskServiceImpl.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/job/DownLoadCacheGlassTask.java 738 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/job/Downpush.java 237 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/tools/Configuration.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/tools/ExcelToJsonConverter.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/JsonFile/PlcdownGlass.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/application-cz.yml 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/application-dev.yml 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/application-prod.yml 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/application-yw.yml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/application.yml 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/logback-spring.xml 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/mapper/DownGlassInfoMapper.xml 188 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/mapper/DownStorageCageDetailsMapper.xml 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/test/java/mes/UnloadGlassModuleApplicationTest.java 239 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/pom.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/HollowGlassApplication.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/controller/HollowBigStorageCageController.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/controller/HollowBigStorageCageDetailsController.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/controller/HollowFormulaDetailsController.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/controller/HollowGlassOutRelationInfoController.java 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/controller/HollowGlassRelationInfoController.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/HollowBigStorageCage.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/HollowBigStorageCageDetails.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/HollowFormulaDetails.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/HollowGlassOutRelationInfo.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/HollowGlassRelationInfo.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/dto/BigStorageSequenceDTO.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/dto/FlowCardGlassInfoDTO.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/dto/FlowCardVirtualSlotDTO.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/dto/HollowBigStorageAndDetailsDTO.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/dto/HollowBigStorageDTO.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/dto/HollowGlassDetailsDTO.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/dto/LackDetailsDTO.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/dto/LisecHollowDetails.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/dto/LisecHollowFrameDetails.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/dto/LisecHollowGlassAndFrameDetails.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/dto/LisecHollowGlassDetails.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/dto/OrderDTO.java 185 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/dto/UpdateHollowBigStorageCageDTO.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/request/HollowHistoryTaskRequest.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/request/HollowTaskRequest.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/vo/HollowAllFlowCardVO.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/vo/HollowBigStorageDetailsQueryVO.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/vo/HollowGlassFormulaVO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/mapper/HollowBigStorageCageDetailsMapper.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/mapper/HollowBigStorageCageMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/mapper/HollowFormulaDetailsMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/mapper/HollowGlassOutRelationInfoMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/mapper/HollowGlassRelationInfoMapper.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/service/HollowBigStorageCageDetailsService.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/service/HollowBigStorageCageService.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/service/HollowFormulaDetailsService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/service/HollowGlassOutRelationInfoService.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/service/HollowGlassRelationInfoService.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/service/impl/HollowBigStorageCageDetailsServiceImpl.java 172 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/service/impl/HollowBigStorageCageServiceImpl.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/service/impl/HollowFormulaDetailsServiceImpl.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/service/impl/HollowGlassOutRelationInfoServiceImpl.java 439 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/service/impl/HollowGlassRelationInfoServiceImpl.java 400 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollowqueue/controller/HollowGlassQueueInfoController.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollowqueue/entity/HollowGlassQueueInfo.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollowqueue/mapper/HollowGlassQueueInfoMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollowqueue/service/HollowGlassQueueInfoService.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollowqueue/service/impl/HollowGlassQueueInfoServiceImpl.java 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollowtask/controller/HollowBigStorageCageHistoryTaskController.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollowtask/entity/HollowBigStorageCageHistoryTask.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollowtask/entity/request/HollowBigStorageCageHistoryRequest.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollowtask/mapper/HollowBigStorageCageHistoryTaskMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollowtask/service/HollowBigStorageCageHistoryTaskService.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollowtask/service/impl/HollowBigStorageCageHistoryTaskServiceImpl.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/job/OpcHollowRemoveTask.java 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/job/OpcPlcStorageCageHollowTask.java 948 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/job/PushMessageToIndex.java 249 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/utils/Blank.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/application-cz.yml 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/application-dev.yml 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/application-prod.yml 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/application-yw.yml 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/application.yml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/logback-spring.xml 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/mapper/HollowBigStorageCageDetailsMapper.xml 260 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/mapper/HollowBigStorageCageHistoryTaskMapper.xml 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/mapper/HollowFormulaDetailsMapper.xml 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/mapper/HollowGlassOutRelationInfoMapper.xml 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/mapper/HollowGlassRelationInfoMapper.xml 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/templates/hollowGlass.ftl 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/pom.xml 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/pom.xml 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/readMe.md 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
logs/cacheGlass/web_debug.log 补丁 | 查看 | 原始文档 | blame | 历史
logs/cacheGlass/web_error.log 13760 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
logs/cacheGlass/web_info.log 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
logs/cacheGlass/web_warn.log 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
logs/loadGlass/web_debug.log 补丁 | 查看 | 原始文档 | blame | 历史
logs/loadGlass/web_error.log 113007 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
logs/loadGlass/web_info.log 2922 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
logs/loadGlass/web_warn.log 620 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
replay_pid4772.log 6194 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/.gitignore
New file
@@ -0,0 +1,8 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
.idea/MarsCodeWorkspaceAppSettings.xml
New file
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="com.codeverse.userSettings.MarscodeWorkspaceAppSettingsState">
    <option name="ckgOperationStatus" value="SUCCESS" />
    <option name="progress" value="0.99854225" />
  </component>
</project>
.idea/compiler.xml
New file
@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="CompilerConfiguration">
    <annotationProcessing>
      <profile name="Maven default annotation processors profile" enabled="true">
        <sourceOutputDir name="target/generated-sources/annotations" />
        <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
        <outputRelativeToContentRoot value="true" />
        <module name="hollowGlass" />
        <module name="cacheVerticalGlass" />
        <module name="servicebase" />
        <module name="HangZhouMes" />
        <module name="temperingGlass" />
        <module name="glassStorage" />
        <module name="springsecurity" />
        <module name="loadGlass" />
        <module name="gateway" />
        <module name="mesHub" />
        <module name="unLoadGlass" />
        <module name="cacheGlass" />
      </profile>
    </annotationProcessing>
  </component>
  <component name="JavacSettings">
    <option name="ADDITIONAL_OPTIONS_OVERRIDE">
      <module name="cacheGlass" options="-parameters" />
      <module name="cacheVerticalGlass" options="-parameters" />
      <module name="gateway" options="-parameters" />
      <module name="glassStorage" options="-parameters" />
      <module name="hollowGlass" options="-parameters" />
      <module name="loadGlass" options="-parameters" />
      <module name="mesHub" options="-parameters" />
      <module name="servicebase" options="-parameters" />
      <module name="springsecurity" options="-parameters" />
      <module name="temperingGlass" options="-parameters" />
      <module name="unLoadGlass" options="-parameters" />
    </option>
  </component>
</project>
.idea/encodings.xml
New file
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="Encoding">
    <file url="file://$PROJECT_DIR$/hangzhoumesParent/common/servicebase/src/main/java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/hangzhoumesParent/common/springsecurity/src/main/java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/hangzhoumesParent/common/src/main/java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/hangzhoumesParent/common/src/main/resources" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/hangzhoumesParent/gateway/src/main/java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/hangzhoumesParent/mesHub/src/main/java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/hangzhoumesParent/moduleService/GlassStorageModule/src/main/java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/hangzhoumesParent/moduleService/LoadGlassModule/src/main/java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/hangzhoumesParent/moduleService/hollowGlassModule/src/main/java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/hangzhoumesParent/moduleService/src/main/java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/hangzhoumesParent/moduleService/src/main/resources" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/hangzhoumesParent/src/main/java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/hangzhoumesParent/src/main/resources" charset="UTF-8" />
  </component>
</project>
.idea/jarRepositories.xml
New file
@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="RemoteRepositoriesConfiguration">
    <remote-repository>
      <option name="id" value="central" />
      <option name="name" value="Central Repository" />
      <option name="url" value="https://repo.maven.apache.org/maven2" />
    </remote-repository>
    <remote-repository>
      <option name="id" value="central" />
      <option name="name" value="Maven Central repository" />
      <option name="url" value="https://repo1.maven.org/maven2" />
    </remote-repository>
    <remote-repository>
      <option name="id" value="central" />
      <option name="name" value="Central Repository" />
      <option name="url" value="http://maven.aliyun.com/nexus/content/groups/public" />
    </remote-repository>
    <remote-repository>
      <option name="id" value="jboss.community" />
      <option name="name" value="JBoss Community repository" />
      <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
    </remote-repository>
    <remote-repository>
      <option name="id" value="nexus-aliyun" />
      <option name="name" value="Nexus aliyun" />
      <option name="url" value="https://maven.aliyun.com/repository/public" />
    </remote-repository>
    <remote-repository>
      <option name="id" value="spring" />
      <option name="name" value="spring" />
      <option name="url" value="https://maven.aliyun.com/repository/spring" />
    </remote-repository>
  </component>
</project>
.idea/misc.xml
New file
@@ -0,0 +1,13 @@
<project version="4">
  <component name="ExternalStorageConfigurationManager" enabled="true" />
  <component name="MavenProjectsManager">
    <option name="originalFiles">
      <list>
        <option value="$PROJECT_DIR$/pom.xml" />
        <option value="$PROJECT_DIR$/hangzhoumesParent/gateway/pom.xml" />
        <option value="$PROJECT_DIR$/hangzhoumesParent/pom.xml" />
      </list>
    </option>
  </component>
  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK" />
</project>
.idea/vcs.xml
New file
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="VcsDirectoryMappings">
    <mapping directory="" vcs="Git" />
  </component>
</project>
JsonFile/PlcCacheGlass.json
New file
@@ -0,0 +1,64 @@
{
   "plcAddressBegin":"DB11.0",
   "plcAddressLenght":"80",
   "dataType":"word",
   "parameteInfor":[
      {
         "codeId": "A06_request_word",
         "addressIndex":"0",
         "addressLenght":"2",
         "ratio":"1",
         "unit":"m/min"
      },
      {
          "codeId": "A05_scanning_ID",
          "addressIndex":"2",
          "addressLenght":"30",
          "ratio":"1",
          "unit":""
       },
       {
          "codeId": "Current_slot",
          "addressIndex":"36",
          "addressLenght":"2",
          "ratio":"1",
          "unit":""
       },
        {
          "codeId": "MES_confirmation_word",
          "addressIndex":"38",
          "addressLenght":"2",
          "ratio":"1",
          "unit":""
       },
       {
          "codeId": "A08_glass_status",
          "addressIndex":"68",
          "addressLenght":"2",
          "ratio":"1",
          "unit":""
       },
       {
          "codeId": "A10_glass_status",
          "addressIndex":"70",
          "addressLenght":"2",
          "ratio":"1",
          "unit":""
       },
       {
          "codeId": "A09_prohibit_film_production",
          "addressIndex":"72",
          "addressLenght":"2",
          "ratio":"1",
          "unit":""
       }
       ,
       {
          "codeId": "A10_prohibit_film_production",
          "addressIndex":"74",
          "addressLenght":"2",
          "ratio":"1",
          "unit":""
       }
   ]
}
JsonFile/PlcCacheVerticalGlass.json
New file
@@ -0,0 +1,377 @@
{
    "plcAddressBegin": "DB14.0",
    "plcAddressLenght": "938",
    "dataType": "word",
    "parameteInfor": [{
            "codeId": "D01ID",
            "addressIndex": "0",
            "addressLenght": "32",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "D02ID",
            "addressIndex": "32",
            "addressLenght": "32",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "D03ID1",
            "addressIndex": "64",
            "addressLenght": "32",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "D03ID2",
            "addressIndex": "96",
            "addressLenght": "32",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "D03ID3",
            "addressIndex": "128",
            "addressLenght": "32",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "D03ID4",
            "addressIndex": "160",
            "addressLenght": "32",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "D03ID5",
            "addressIndex": "192",
            "addressLenght": "32",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "D03ID6",
            "addressIndex": "224",
            "addressLenght": "32",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "D04ID",
            "addressIndex": "256",
            "addressLenght": "32",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "D05ID1",
            "addressIndex": "288",
            "addressLenght": "32",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "D05ID2",
            "addressIndex": "328",
            "addressLenght": "32",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "D05ID3",
            "addressIndex": "352",
            "addressLenght": "32",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "D05ID4",
            "addressIndex": "384",
            "addressLenght": "32",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "D05ID5",
            "addressIndex": "416",
            "addressLenght": "32",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "D05ID6",
            "addressIndex": "448",
            "addressLenght": "32",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "E01ID1",
            "addressIndex": "480",
            "addressLenght": "32",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "E01ID2",
            "addressIndex": "512",
            "addressLenght": "32",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "E01ID3",
            "addressIndex": "544",
            "addressLenght": "32",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "E01ID4",
            "addressIndex": "576",
            "addressLenght": "32",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "E01ID5",
            "addressIndex": "608",
            "addressLenght": "32",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "E01ID6",
            "addressIndex": "640",
            "addressLenght": "32",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "E02ID1",
            "addressIndex": "672",
            "addressLenght": "32",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "E02ID2",
            "addressIndex": "704",
            "addressLenght": "32",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "E02ID3",
            "addressIndex": "736",
            "addressLenght": "32",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "E02ID4",
            "addressIndex": "768",
            "addressLenght": "32",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "E02ID5",
            "addressIndex": "800",
            "addressLenght": "32",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "E02ID6",
            "addressIndex": "832",
            "addressLenght": "32",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "D03ToMES",
            "addressIndex": "874",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "D05ToMES",
            "addressIndex": "876",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "D01ToMES",
            "addressIndex": "878",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "D04ToMES",
            "addressIndex": "880",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "MESToD03",
            "addressIndex": "888",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "MESToD05",
            "addressIndex": "890",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "MESToPLC",
            "addressIndex": "892",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "StartAddToImport1",
            "addressIndex": "914",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "StartAddToImport2",
            "addressIndex": "916",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "StartAddToImport3",
            "addressIndex": "918",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "StartAddToImport4",
            "addressIndex": "920",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "StartAddToImport5",
            "addressIndex": "922",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "StartAddToImport6",
            "addressIndex": "924",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "TargetAddToImport1",
            "addressIndex": "926",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "TargetAddToImport2",
            "addressIndex": "928",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "TargetAddToImport3",
            "addressIndex": "930",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "TargetAddToImport4",
            "addressIndex": "932",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "TargetAddToImport5",
            "addressIndex": "934",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "TargetAddToImport6",
            "addressIndex": "936",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "deviceState",
            "addressIndex": "864",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "E01State",
            "addressIndex": "866",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "E02State",
            "addressIndex": "868",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "D03State",
            "addressIndex": "870",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "D05State",
            "addressIndex": "872",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "MESToD01",
            "addressIndex": "894",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "MESToD04",
            "addressIndex": "896",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        }
    ]
}
JsonFile/PlcLoadGlass.json
New file
@@ -0,0 +1,78 @@
{
  "plcAddressBegin":"DB1.2000",
  "plcAddressLenght":"100",
  "dataType":"word",
  "parameteInfor":[
    {
      "codeId": "loadRequest",
      "addressIndex":"0",
      "addressLenght":"2",
      "ratio":"1",
      "unit":"m/min"
    },
    {
      "codeId": "PlcStatus",
      "addressIndex":"10",
      "addressLenght":"2",
      "ratio":"1",
      "unit":""
    },
    {
      "codeId": "MesToPlc",
      "addressIndex":"20",
      "addressLenght":"2",
      "ratio":"1",
      "unit":""
    },
    {
      "codeId": "InkageStatus",
      "addressIndex":"22",
      "addressLenght":"2",
      "ratio":"1",
      "unit":""
    },
    {
      "codeId": "WorkId",
      "addressIndex":"24",
      "addressLenght":"2",
      "ratio":"1",
      "unit":""
    },
    {
      "codeId": "GlassWidth",
      "addressIndex":"26",
      "addressLenght":"2",
      "ratio":"1",
      "unit":""
    },
    {
      "codeId": "GlassHeight",
      "addressIndex":"28",
      "addressLenght":"2",
      "ratio":"1",
      "unit":""
    }
  ,
    {
      "codeId": "MesToPlcStatus",
      "addressIndex":"40",
      "addressLenght":"2",
      "ratio":"1",
      "unit":""
    },
    {
      "codeId": "MesToPlcStatusId",
      "addressIndex":"42",
      "addressLenght":"2",
      "ratio":"1",
      "unit":""
    },
    {
      "codeId": "MesTaskStatus",
      "addressIndex":"56",
      "addressLenght":"2",
      "ratio":"1",
      "unit":""
    }
  ]
}
JsonFile/PlcTemperingGlass.json
New file
@@ -0,0 +1,132 @@
{
    "plcAddressBegin": "DB88.0",
    "plcAddressLenght": "58",
    "dataType": "word",
    "parameteInfor": [
        {
            "codeId": "confirmationWord",
            "addressIndex": "0",
            "addressLenght": "2"
        },
        {
            "codeId": "temperingLayoutId",
            "addressIndex": "2",
            "addressLenght": "2"
        },
        {
            "codeId": "filmsid",
            "addressIndex": "4",
            "addressLenght": "2"
        },
        {
            "codeId": "temperingType",
            "addressIndex": "6",
            "addressLenght": "2"
        },
        {
            "codeId": "thickness",
            "addressIndex": "8",
            "addressLenght": "2"
        },
        {
            "codeId": "loadingRate",
            "addressIndex": "10",
            "addressLenght": "2"
        },
        {
            "codeId": "areaDifference",
            "addressIndex": "12",
            "addressLenght": "2"
        },
        {
            "codeId": "state",
            "addressIndex": "22",
            "addressLenght": "2"
        },
        {
            "codeId": "deviceState",
            "addressIndex": "24",
            "addressLenght": "2"
        },
        {
            "codeId": "resultState",
            "addressIndex": "26",
            "addressLenght": "2"
        },
        {
            "codeId": "loadSpeed",
            "addressIndex": "28",
            "addressLenght": "2"
        },
        {
            "codeId": "downSpeed",
            "addressIndex": "30",
            "addressLenght": "2"
        },
        {
            "codeId": "load1",
            "addressIndex": "32",
            "addressLenght": "2"
        },
        {
            "codeId": "heat1",
            "addressIndex": "34",
            "addressLenght": "2"
        },
        {
            "codeId": "heat2",
            "addressIndex": "36",
            "addressLenght": "2"
        },
        {
            "codeId": "cool1",
            "addressIndex": "38",
            "addressLenght": "2"
        },
        {
            "codeId": "cool2",
            "addressIndex": "40",
            "addressLenght": "2"
        },
        {
            "codeId": "downId",
            "addressIndex": "42",
            "addressLenght": "2"
        },
        {
            "codeId": "productionTime",
            "addressIndex": "44",
            "addressLenght": "2"
        },
        {
            "codeId": "heatEnergy",
            "addressIndex": "46",
            "addressLenght": "2"
        },
        {
            "codeId": "coolEnergy",
            "addressIndex": "48",
            "addressLenght": "2"
        },
        {
            "codeId": "temperatureUp1",
            "addressIndex": "50",
            "addressLenght": "2"
        },
        {
            "codeId": "temperatureDown1",
            "addressIndex": "52",
            "addressLenght": "2"
        },
        {
            "codeId": "temperatureUp2",
            "addressIndex": "54",
            "addressLenght": "2"
        },
        {
            "codeId": "temperatureDown2",
            "addressIndex": "56",
            "addressLenght": "2"
        }
    ]
}
JsonFile/PlcdownGlass.json
New file
@@ -0,0 +1,149 @@
{
    "plcAddressBegin": "DB11.0",
    "plcAddressLenght": "94",
    "dataType": "word",
    "parameteInfor": [
        {
            "codeId": "requestWord",
            "addressIndex": "0",
            "addressLenght": "2"
        },
        {
            "codeId": "requestID",
            "addressIndex": "2",
            "addressLenght": "30"
        },
        {
            "codeId": "currentCell",
            "addressIndex": "32",
            "addressLenght": "2"
        },
        {
            "codeId": "glassStatus08",
            "addressIndex": "36",
            "addressLenght": "2"
        },
        {
            "codeId": "glassStatus06",
            "addressIndex": "40",
            "addressLenght": "2"
        },
        {
            "codeId": "glassStatus11",
            "addressIndex": "42",
            "addressLenght": "2"
        },
        {
            "codeId": "glassStatus13",
            "addressIndex": "44",
            "addressLenght": "2"
        },
        {
            "codeId": "G04_error_status",
            "addressIndex": "48",
            "addressLenght": "2"
        },
        {
            "codeId": "G05_error_status",
            "addressIndex": "50",
            "addressLenght": "2"
        },
        {
            "codeId": "G06_error_status",
            "addressIndex": "52",
            "addressLenght": "2"
        },
        {
            "codeId": "robot_error_status",
            "addressIndex": "54",
            "addressLenght": "2"
        },
        {
            "codeId": "G08_error_status",
            "addressIndex": "56",
            "addressLenght": "2"
        },
        {
            "codeId": "G09_error_status",
            "addressIndex": "58",
            "addressLenght": "2"
        },
        {
            "codeId": "G10_error_status",
            "addressIndex": "60",
            "addressLenght": "2"
        },
        {
            "codeId": "G11_error_status",
            "addressIndex": "62",
            "addressLenght": "2"
        },
        {
            "codeId": "robot_error_status",
            "addressIndex": "64",
            "addressLenght": "2"
        },
        {
            "codeId": "G13_error_status",
            "addressIndex": "66",
            "addressLenght": "2"
        },
        {
            "codeId": "confirmationWord",
            "addressIndex": "72",
            "addressLenght": "2"
        },
        {
            "codeId": "G06_prohibit_film_production",
            "addressIndex": "74",
            "addressLenght": "2"
        },
        {
            "codeId": "G11_prohibit_film_production",
            "addressIndex": "76",
            "addressLenght": "2"
        },
        {
            "codeId": "G13_prohibit_film_production",
            "addressIndex": "78",
            "addressLenght": "2"
        },
        {
            "codeId": "Glass_width",
            "addressIndex": "80",
            "addressLenght": "2"
        },
        {
            "codeId": "Glass_height",
            "addressIndex": "82",
            "addressLenght": "2"
        },
        {
            "codeId": "Glass_thickness",
            "addressIndex": "84",
            "addressLenght": "2"
        },
        {
            "codeId": "Start_cell",
            "addressIndex": "86",
            "addressLenght": "2"
        },
        {
            "codeId": "End_cell",
            "addressIndex": "88",
            "addressLenght": "2"
        },
        {
            "codeId": "task_type",
            "addressIndex": "90",
            "addressLenght": "2"
        },
        {
            "codeId": "alarm_signal",
            "addressIndex": "92",
            "addressLenght": "2"
        }
    ]
}
README.md
New file
@@ -0,0 +1,40 @@
# NorthGlassERP
#### 介绍
{**以下是 Gitee 平台说明,您可以替换此简介**
Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台
无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)}
#### 软件架构
软件架构说明
#### 安装教程
1.  xxxx
2.  xxxx
3.  xxxx
#### 使用说明
1.  xxxx
2.  xxxx
3.  xxxx
#### 参与贡献
1.  Fork 本仓库
2.  新建 Feat_xxx 分支
3.  提交代码
4.  新建 Pull Request
#### 特技
1.  使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
2.  Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
3.  你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
4.  [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
5.  Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
6.  Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
UI-Project/.gitignore
New file
@@ -0,0 +1,28 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
.DS_Store
dist
dist-ssr
coverage
*.local
/cypress/videos/
/cypress/screenshots/
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
UI-Project/.vscode/extensions.json
New file
@@ -0,0 +1,3 @@
{
  "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"]
}
UI-Project/README.md
New file
@@ -0,0 +1,29 @@
# northglass-erp
This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin).
## Customize configuration
See [Vite Configuration Reference](https://vitejs.dev/config/).
## Project Setup
```sh
npm install
```
### Compile and Hot-Reload for Development
```sh
npm run dev
```
### Compile and Minify for Production
```sh
npm run build
```
UI-Project/auto-imports.d.ts
New file
@@ -0,0 +1,9 @@
/* eslint-disable */
/* prettier-ignore */
// @ts-nocheck
// noinspection JSUnusedGlobalSymbols
// Generated by unplugin-auto-import
export {}
declare global {
  const useI18n: typeof import('vue-i18n')['useI18n']
}
UI-Project/config.js
New file
@@ -0,0 +1,13 @@
export default {
    // serverUrl: "10.153.19.150:88/api",
//  serverUrl: "192.168.2.100:88/api",
    // serverUrl: "10.153.19.162:88",
    serverUrl: "127.0.0.1:88",
    // serverUrl: "10.153.19.47:88",
    // serverUrl2: "10.153.19.150:88"
    // serverUrl2: "192.168.2.100:88"
    // serverUrl2: "10.153.19.162:88"
    // serverUrl2: "127.0.0.1:88"
    // serverUrl2: "192.168.0.39:88"
    //serverUrl:"res.abeim.cn"
}
UI-Project/index.html
New file
@@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <!-- <link rel="icon" href="/favicon.ico"> -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>北玻</title>
  </head>
  <body>
    <div id="app" style="width: 100vw;height: 100vh;"></div>
    <script type="module" src="/src/main.js"></script>
  </body>
</html>
UI-Project/package-lock.json
New file
Diff too large
UI-Project/package.json
New file
@@ -0,0 +1,44 @@
{
  "name": "northglass-mes",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview"
  },
  "dependencies": {
    "@element-plus/icons-vue": "^2.3.1",
    "@vue-macros/reactivity-transform": "^0.3.23",
    "axios": "^1.6.8",
    "chart.js": "^4.4.3",
    "dayjs": "^1.11.13",
    "echarts": "^5.5.1",
    "element-plus": "^2.9.9",
    "moment": "^2.30.1",
    "northglass-mes": "file:",
    "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": "^11.0.0-rc.1",
    "vue-print-nb": "^1.7.5",
    "vue-router": "^4.0.13",
    "vue3-print-nb": "^0.1.4",
    "vxe-table": "^4.5.15",
    "xe-utils": "^3.5.14",
    "xlsx": "^0.18.5"
  },
  "devDependencies": {
    "@types/sortablejs": "^1.15.7",
    "@vitejs/plugin-vue": "^4.6.2",
    "babel-polyfill": "^6.26.0",
    "http-proxy-middleware": "^3.0.0",
    "unplugin-auto-import": "^0.17.6",
    "vite": "^4.4.9"
  }
}
UI-Project/public/favicon.ico
UI-Project/public/vuefavicon.ico
UI-Project/src/App.vue
New file
@@ -0,0 +1,21 @@
<template>
  <router-view></router-view>
</template>
<script setup>
import {onMounted} from 'vue'
import DevicePixelRatio from '@/utils/evicePixelRatio.js';
// 定义一个函数来调整 body 的缩放比例
// function bodyScale() {
//   const deviceheight = document.documentElement.clientHeight;
//   const scale = deviceheight / 740;
//   document.body.style.zoom = scale;
// }
// 在组件挂载时执行
// onMounted(() => {
//   new DevicePixelRatio().init();
//   bodyScale();
// });
</script>
<style scoped>
/* 你的样式内容 */
</style>
UI-Project/src/assets/1.png
UI-Project/src/assets/11.png
UI-Project/src/assets/2.png
UI-Project/src/assets/3.png
UI-Project/src/assets/88.png
UI-Project/src/assets/9.png
UI-Project/src/assets/C1.png
UI-Project/src/assets/aaa.png
UI-Project/src/assets/background.jpg
UI-Project/src/assets/base.css
New file
@@ -0,0 +1,119 @@
/* color palette from <https://github.com/vuejs/theme> */
:root {
  --vt-c-white: #ffffff;
  --vt-c-white-soft: #f8f8f8;
  --vt-c-white-mute: #f2f2f2;
  --vt-c-black: #181818;
  --vt-c-black-soft: #222222;
  --vt-c-black-mute: #282828;
  --vt-c-indigo: #2c3e50;
  --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
  --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
  --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65);
  --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
  --vt-c-text-light-1: var(--vt-c-indigo);
  --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
  --vt-c-text-dark-1: var(--vt-c-white);
  --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
}
/* semantic color variables for this project */
:root {
  --color-background: var(--vt-c-white);
  --color-background-soft: var(--vt-c-white-soft);
  --color-background-mute: var(--vt-c-white-mute);
  --color-border: var(--vt-c-divider-light-2);
  --color-border-hover: var(--vt-c-divider-light-1);
  --color-heading: var(--vt-c-text-light-1);
  --color-text: var(--vt-c-text-light-1);
  --section-gap: 160px;
}
@media (prefers-color-scheme: dark) {
  :root {
    --color-background: var(--vt-c-black);
    --color-background-soft: var(--vt-c-black-soft);
    --color-background-mute: var(--vt-c-black-mute);
    --color-border: var(--vt-c-divider-dark-2);
    --color-border-hover: var(--vt-c-divider-dark-1);
    --color-heading: var(--vt-c-text-dark-1);
    --color-text: var(--vt-c-text-dark-2);
  }
}
*,
*::before,
*::after {
  box-sizing: border-box;
  margin: 0;
  font-weight: normal;
}
body {
  min-height: 100vh;
  color: var(--color-text);
  background: var(--color-background);
  transition:
    color 0.5s,
    background-color 0.5s;
  line-height: 1.6;
  font-family:
    Inter,
    -apple-system,
    BlinkMacSystemFont,
    'Segoe UI',
    Roboto,
    Oxygen,
    Ubuntu,
    Cantarell,
    'Fira Sans',
    'Droid Sans',
    'Helvetica Neue',
    sans-serif;
  font-size: 15px;
  text-rendering: optimizeLegibility;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
/*滚动条整体部分*/
.mytable-scrollbar ::-webkit-scrollbar {
  width: 10px;
  height: 10px;
}
/*滚动条的轨道*/
.mytable-scrollbar ::-webkit-scrollbar-track {
  background-color: #FFFFFF;
}
/*滚动条里面的小方块,能向上向下移动*/
.mytable-scrollbar ::-webkit-scrollbar-thumb {
  background-color: transparent;
  border-radius: 5px;
  border: 0 solid #F1F1F1;
  /*box-shadow: inset 0 0 6px rgba(0,0,0,.3);*/
}
.mytable-scrollbar ::-webkit-scrollbar-thumb:hover {
  background-color: #ffffff;
  box-shadow: inset 0 0 6px rgba(0,0,0,.3);
}
.mytable-scrollbar ::-webkit-scrollbar-thumb:active {
  background-color: white;
}
/*边角,即两个滚动条的交汇处*/
.mytable-scrollbar ::-webkit-scrollbar-corner {
  background-color: #FFFFFF;
}
.vxe-grid{
  background-color: white;
}
UI-Project/src/assets/bigcar01.png
UI-Project/src/assets/cangchu1.png
UI-Project/src/assets/cangchu2.png
UI-Project/src/assets/cp.png
UI-Project/src/assets/d1.png
UI-Project/src/assets/d1a.png
UI-Project/src/assets/d2.png
UI-Project/src/assets/d3.png
UI-Project/src/assets/dipan.png
UI-Project/src/assets/dlpl.png
UI-Project/src/assets/dlpl9.png
UI-Project/src/assets/dlpla.png
UI-Project/src/assets/dpxsa.png
UI-Project/src/assets/emi.png
UI-Project/src/assets/ganghuaqian.png
UI-Project/src/assets/img.png
UI-Project/src/assets/logo.svg
New file
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 261.76 226.69"><path d="M161.096.001l-30.225 52.351L100.647.001H-.005l130.877 226.688L261.749.001z" fill="#41b883"/><path d="M161.096.001l-30.225 52.351L100.647.001H52.346l78.526 136.01L209.398.001z" fill="#34495e"/></svg>
UI-Project/src/assets/lp.png
UI-Project/src/assets/lp9.png
UI-Project/src/assets/lpa.png
UI-Project/src/assets/lpa9.png
UI-Project/src/assets/lpl.jpg
UI-Project/src/assets/lpla.jpg
UI-Project/src/assets/main.css
New file
@@ -0,0 +1,54 @@
@import './base.css';
#app {
  margin: 0 auto;
  padding: 0;
  /* background-color: #D5EAFF; */
  font-weight: normal;
  height: 100%;
  width: 100%;
  /* min-width: 1536px; */
  /* min-height: 730px; */
  /* background-image: url("../../src/assets/background.jpg"); */
}
a,
.green {
  text-decoration: none;
  color: hsla(160, 100%, 37%, 1);
  transition: 0.4s;
}
@media (hover: hover) {
  a:hover {
    background-color: hsla(160, 100%, 37%, 0.2);
  }
}
@media (min-width: 1024px) {
  body {
    display: flex;
    place-items: center;
  }
  #app {
    display: grid;
    grid-template-columns: 1fr 1fr;
  }
}
*{
  margin: 0;
  padding: 0;
}
.mainDiv{
  height: 100vh;
  width: 100vw;
}
html,body{
  height: 100%;
  width: 100%;
  margin: 0;
  padding: 0;
}
UI-Project/src/assets/northGlass.ico
UI-Project/src/assets/s.png
UI-Project/src/assets/screen.png
UI-Project/src/assets/screen2.png
UI-Project/src/assets/shangpian.png
UI-Project/src/assets/shangpianji.png
UI-Project/src/assets/sz.png
UI-Project/src/assets/taimian.png
UI-Project/src/assets/user.png
UI-Project/src/assets/woshihuancun.png
UI-Project/src/assets/xiaoche.png
UI-Project/src/assets/xmjc.png
UI-Project/src/assets/xmjclzh.png
UI-Project/src/assets/ypcaac.png
UI-Project/src/assets/ypcc.png
UI-Project/src/assets/ypccche.png
UI-Project/src/assets/zhongkong.png
UI-Project/src/hook/index.js
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/en.js
New file
@@ -0,0 +1,925 @@
export default {
    "northglassMESsystem": "NorthGlass MES System",
    login: {
        userErr: 'Please enter account number',
        pwErr: 'Please input a password',
        user: 'Account number',
        password: 'Password',
        login: 'Log on',
        loginSuccessful: 'Log on was successful!',
        register: 'Register',
        namea: 'Name cannot be empty',
        len: 'The length cannot exceed 16',
        passnull: 'Password cannot be empty',
        leng: 'The password length cannot be less than 6 or more than 16',
        spwn: 'Confirm password cannot be empty',
        depass: 'The two passwords are not the same',
    },
    register: {
        registerSuccessful: 'login was successful',
        newuserregister: 'New user register',
        name: 'Full name:',
        inputname: 'Please enter your name',
        password: 'Password:',
        pwErr: 'Please input a password',
        passwordation: 'Confirm password:',
        pwErration: 'Please confirm password',
        registration: 'Registration Confirm',
        false: 'Cancel',
    },
    main: {
        connectErr: 'The server connection is abnormal. Please try again later',
        titleFirst: "Welcome ",
        titleLast: ' to use NorthGlass MES system!',
        quit: "Exit",
    },
    basicData: {
        untask: 'No task',
        tonumber: 'Total number of films uploaded',
        finishnumber: 'Completed quantity',
        rackreset: 'Rack reset',
        prackreset: 'Is the rack reset?',
        printing: 'automatic printing',
        laserprinting: 'Laser printing machine ready status:',
        cuttingmachine: 'Cutting machine ready status:',
        machine: 'Online status of the loading table:',
        machineaa: 'Manual state of the loading table:',
        selectproject: "Select project",
        startloading: 'Start loading',
        stop: 'Pause',
        yes: 'Confirm',
        change: 'Switch',
        projectnumber: 'Project number',
        glasswidth: 'Glass width',
        glassheight: 'Glass height',
        coatingtypes: 'Coating types',
        coatingtypesa: 'Coating types:',
        quantity: 'Quantity',
        quantitya: 'Quantity:',
        thickness: 'Thickness',
        thicknessa: 'Thickness:',
        startstatus: 'Start status',
        pass: 'Pass',
        waiting: 'Waiting',
        up: 'Loading',
        finish: 'Completed',
        project: 'Project ',
        plselectproject: 'Please select project',
        confirm: 'Confirm',
        cancel: 'Cancel',
        startfilm: 'Whether start loading?',
        whetherpause: 'Whether pause?',
        station: 'Station',
        width: 'Width',
        widtha: 'Width:',
        height: 'Height',
        heighta: 'Height:',
        operate: 'Operate',
        add: 'Increase',
        delete: 'Delete',
        addglass: 'Add glass',
        selectwidth: 'Please select width',
        selectheight: 'Please select high',
        selectcoatingtypes: 'Please select the coating types',
        selectthickness: 'Please select thickness',
        selectquantity: 'Please enter the quantity',
        pause: 'The height of the second and fourth rows must be greater than 2700 in order to save!',
        pausea: 'Please confirm the ready status of marking machine and cutting machine!',
        infonull: 'Project number cannot be empty!',
        updatanull: 'This project has not been saved to the loading list!',
        glassnull: 'An error occurred while updating the glass status',
        deletemessage: 'Do you want to delete this message?',
        layoutSequence: 'Serial Number',
    },
    sorter: {
        onesort: 'Line breaking pieces',
        twosort: 'Second line breaking piece',
        inPlace: 'In place',
        ninPlace: 'Not in place',
        emptymissions: 'Empty task',
        advancetask: 'Film entry task',
        outputtasks: 'Production task',
        schedulingtasks: 'Scheduling tasks',
        advancerequests: 'Film entry request',
        releaserequest: 'Production request',
        straighttasks: 'Direct Task',
        endingtask: 'end',
        another: 'other',
        taskRunning: 'task request',
        updateTime: 'update time',
        id: 'Edge grinding pre conditioning cage table ID',
        remainWidth: 'remaining',
        place: 'Is it in place',
        layernow: 'Current floor number',
        gridnumber: 'Grid number',
        glassnumber: 'Glass number',
        width: 'Width',
        height: 'Height',
        startstatus: 'Start status',
        disable: 'Disabled',
        start: 'Enabled',
        deficiencieste: 'Report deficiencies',
        updown: 'Artificial filming',
        operate: 'Operate',
        prompt: 'Prompt',
        information: 'Is the missing information reported?',
        infor: 'Whether to manually download this information?',
        yes: 'Yes',
        cancel: 'Cancel',
    },
    order: {
        projectnumber: 'Please enter the project number',
        dilapidation: 'Breakage',
        takeaway: 'Manual removal',
        takeawaya: 'Should the information be manually taken away?',
        takeon: 'The arrangement is complete',
    },
    searchOrder: {
        furnaces:'Number of full furnaces',
        furnfullTemp: 'Total amount of glass',
        startCell: 'Target layer number',
        endCell: 'Reserved layer number',
        begin: 'start',
        finish: 'complete',
        uncar: 'Not getting on the car yet',
        inkage: 'Enter the film',
        successfullyprocessed: 'Task successfully processed',
        psuccessfullyprocessed: 'Whether the task has been successfully processed?',
        taskfailure: 'Task failure handling',
        ptaskfailure: 'Should task failure be handled?',
        totallogarithms: 'Total logarithm',
        numberpairs: 'pairing number',
        numberoccupied: 'Number of occupied cells',
        totalfurnaces: 'Total number of furnaces',
        cagesnumber: 'Quantity inside the cage',
        slotnumber: 'Number of occupied cells',
        progress: 'progress%',
        whethersame: 'Are they the same',
        same: 'the same',
        notsame: 'different',
        partask: 'Task reset',
        partasks: 'Do you want to reset the task?',
        empty: 'Default empty task',
        historicaltasks: 'historical tasks',
        cagedetails: 'Cage Details',
        inkageEntity: 'Online status of film entry:',
        requestEntity: 'Entry request status:',
        mesReplyEntity: 'start command:',
        outInkageEntity: 'Online status of film release:',
        outRequestEntity: 'Production request status:',
        breakagn: 'unbroken',
        lacknumber: 'Number of missing pieces',
        processcard: 'Specify process card',
        filminformation: 'Manually downloading information',
        currentglassinformation: 'Scan the current glass information of the barcode scanner',
        printlabels: 'print label',
        deleteTask: 'End of project',
        pdeleteTask: 'Whether to end the project?',
        searchlayout: 'Non-tempered process card inquiry',
        fullfurnaces: 'Number of full furnaces',
        specifiedproject: 'The currently specified project',
        undesignate: 'Cancel tempered steel',
        allnumber: 'Total quantity',
        numbercages: 'Number of cages',
        missingquantity: 'Missing quantity',
        breakquantity: 'Breakage/Take Away quantity',
        ceng: 'layer',
        cageinformation: 'Sorter information',
        productionqueue: 'Production queue',
        outputglassID: 'Output glass ID',
        startposition: 'Start position',
        targetlocation: 'Target Position',
        trips: 'Train number',
        number: 'Serial Number',
        taskstatus: 'Task state',
        filmenter: 'Waiting for input glass',
        infilm: 'In progress',
        endtask: 'End task',
        completetask: 'Complete the task',
        intoglassid: 'Input glass ID',
        line: 'Wire',
        Usage: 'Usage rate',
        free: 'Free(pieces)',
        addcage: 'Add information on sorter',
        glassIDa: 'Glass ID:',
        glassID: 'Glass ID',
        inglassID: 'Please enter the glass ID',
        pieceingrid: 'The order of small pieces within the grid',
        pieceingrida: 'The order of small pieces within the grid:',
        inpieceingrid: 'Please enter the order of small pieces within the grid',
        cardnumber: 'Process card number',
        cardnumbera: 'Process card number:',
        incardnumber: 'Please enter the process card number',
        typeglass: 'Glass type',
        typeglassa: 'Glass type:',
        intypeglass: 'Please enter the glass type',
        width: 'Width',
        widtha: 'Width:',
        inwidth: 'Please enter width',
        height: 'Height',
        heighta: 'Height:',
        inheight: 'Please enter height',
        coatingtypes: 'Coating types',
        thickness: 'Thickness',
        thicknessa: 'Thickness:',
        inthickness: 'Please enter the thickness',
        layoutID: 'Drawing ID of loading for tempering furnace',
        layoutIDa: 'Drawing ID of loading for tempering furnace:',
        inlayoutID: 'Please enter the drawing ID of loading for tempering furnace',
        picturesequence: 'Drawing sequence of loading for tempering furnace',
        picturesequencea: 'Drawing sequence of loading for tempering furnace:',
        inpicturesequence: 'Please enter the drawing sequence of loading for tempering furnace',
        startstatus: 'Start status',
        startstatusa: 'Start status:',
        instartstatus: 'Please enter the enabled status',
        glassgaps: 'Glass gap',
        glassgapsa: 'Glass gap:',
        inglassgaps: 'Please enter the glass gap',
        sure: 'Confirm',
        cancel: 'Cancel',
        operate: 'Operate',
        breakage: 'Breakage',
        delete: 'Delete',
        outfilm: 'Output glass',
        cagetableID: 'Sorter table ID',
        cagenumber: 'Sorter number',
        gridnumber: 'Grid number',
        gridnumbera: 'Grid number:',
        grid: 'Please enter a grid number',
        enable: 'Enabled',
        disable: 'Disabled',
        remainingwidth: 'Remaining width',
        add: 'Add',
        sheetID: 'Tempered small piece information table ID',
        processcards: 'Process card',
        processcardtype: 'Process card glass type',
        acceptshorizontal: 'Does tempering accept horizontal placement',
        xcoordinates: 'x coordinate',
        ycoordinates: 'Y coordinate',
        rotationangle: 'Rotation angle (counterclockwise)',
        state: 'Status',
        takeout: 'Take away',
        deletemessage: 'Do you want to delete this message?',
        prompt: 'Prompt',
        yes: 'Yes',
        accept: 'Accept',
        noaccept: 'Not accept',
        filmcomplete: 'Glass output completed',
        waiting: 'Waiting',
        broke: 'Is this information damaged?',
        brokeb: 'Do you need to delete the message?',
        outfil: 'Whether the film is released or not?',
        inputid: 'Please enter the glass ID',
        search: 'Search',
        tabid: 'Dali film cage details table ID',
        tid: 'Device ID',
        tida: 'Device ID:',
        fin: 'Whether or not the task was completed?',
        sureadd: 'Confirm the addition',
        sureadda: 'Whether to confirm the addition?',
        zailong: 'In a cage',
        rengongxp: 'Artificial filming',
        up: 'Previous',
        down: 'Next',
        now: 'The current page is displayed',
        tit: 'data',
        temperingqueries: 'Tempering queries',
        specifytempering: 'Specify a furnace',
        specifyout: 'Designate manual film production',
        specifyengineerid: 'Specify the project',
        projectnumber: 'Project number',
        layoutnumber: 'Drawing number of loading for tempering furnace',
        numberglasses: 'Number of glasses',
        specifytemperinga: 'Please confirm if the device has turned off MES online connection?',
        temperedswitch: 'Tempered switch',
        dutyinformation: 'Duty information',
        process: 'Process',
        team: 'Team',
        basic: 'equipment',
        makesure: 'Confirm the save',
        temperingtotal: 'Number of tempering furnaces:',
        glasstotal: 'Total number of glasses:',
        Labelprinting: 'label printing',
        Schedulingswitch: 'Dispatch switch',
    },
    workOrder: {
        upnumber: 'Upper position number',
        coatingtypesbe: 'Original film system',
        glassID: 'Glass ID',
        height: 'Height',
        width: 'Width',
        thickness: 'Thickness',
        coatingtypes: 'Coating types',
        productionsequence: 'Production sequence',
        cardnumber: 'Process card number',
        operate: 'Operate',
        messagedamaged: 'Is this information damaged?',
        prompt: 'Prompt',
        yes: 'Yes',
        cancel: 'Cancel',
        takemessage: 'Do you need to delete the message?',
        breakage: 'Breakage',
        takeout: 'Take away',
        glasstype: 'Glass type',
        line: 'Wire',
        status: 'Status',
        time: 'Time period',
        cway: 'Please select a route',
        cstate: 'Please select a status',
        edgingone: 'Edging a line',
        edgingtwo: 'Edging two lines',
        nedging: 'Unedging',
        edging: 'Edging',
        finedging: 'has been edging',
    },
    processCard: {
        intofurnace: 'Entering the furnace',
        beforefurnace: 'Before entering the furnace',
        outfurnace: 'Glass finished from tempering furnace',
        print: 'Take away the print',
        printing: 'print',
        projectnumber: 'Please enter the project number',
        inquire: 'Inquire',
        project: 'Project number',
        awayprocess: 'Take away the process',
        awayequipment: 'Take away the equipment',
        awayteam: 'Take away the crew',
        flowcard: 'Process card',
        layer: 'Layer number',
        temperinglayout: 'Heat number',
        temperingfeed: 'Preface',
        width: 'Width',
        height: 'Height',
        thickness: 'Thickness',
        glasstakeout: 'Glass take away list',
        layoutID: 'Drawing ID of loading for tempering furnace',
        glassID: 'Glass ID',
    },
    reportWork: {
        details: 'Drop off details',
        filming: 'Artificial filming',
        printing: 'Automatic printing',
        cenumber: 'Number of layers',
        artificialorder: 'The number of pieces under artificial order',
        processcard: 'Print the process card',
        printlabels: 'Print labels',
        information: 'Landing information',
        cstation: 'Please select a desk',
        all: 'all',
        timeperiod: 'Time period',
        stationnumber: 'Station number',
        order: 'order',
        filminformation: 'Manual film information',
        glassmation: 'Artificial film current glass information',
        barcodescanner: 'The current glass information of the barcode scanner',
        lowerbit: 'Unloading station',
        shelfnumber: 'Rack number',
        cardnumber: 'Process card number',
        totalquantity: 'Total quantity',
        beendropped: 'Quantity of unloaded glass',
        state: 'Status',
        devicenumber: 'Equipment No.',
        startstatus: 'Start status',
        enable: 'Start',
        unenable: 'Unstart',
        operate: 'Operate',
        bindingshelves: 'Assigned rack',
        clear: 'Clear',
        workstation: 'Station No.',
        shelfnumbera: 'Rack number:',
        cardnumbera: 'Process card number:',
        incardnumber: 'Please select the process card number',
        clearglass: 'Clear the glass on the shelf',
        sure: 'Operate',
        cancel: 'Cancel',
        glassinformation: 'Glass information',
        glassID: 'Glass ID',
        coatingtypes: 'Coating types',
        thickness: 'Thickness',
        width: 'Width',
        height: 'Height',
    },
    productStock: {
        configName: 'configure name',
        configNamea:'configure name:',
        configCode: 'Configuration Code',
        configValue: 'Configuration value',
        addusers: 'Add user',
        username: 'User name',
        usernamea: 'User name:',
        inusername: 'Enter one user name',
        role: 'Role',
        rolea: 'Role:',
        inrole: 'Please select a role',
        test: 'Test',
        admin: 'Administrator',
        operate: 'Operate',
        resetpassword: 'Reset password',
        exit: 'Edit',
        delete: 'Delete',
        prompt: 'Prompt',
        repassword: 'Do you want to reset the user password?',
        yes: 'Yes',
        cancel: 'Cancel',
        reusername: 'Modify Users',
        addusername: 'Add user',
        password: 'Password:',
        sure: 'Confirm',
        inpassword: 'Please input a password',
        deusername: 'Do you want to delete the user?',
    },
    customer: {
        addmenua: 'Add secondary menus',
        addmenu: 'Add a first-level menu',
        firstmenu: 'First level menu bar',
        firstmenuname: 'The name of the first-level menu:',
        link: 'Link',
        inlink: 'Please enter the link',
        linka: 'Link:',
        sort: 'Sort',
        insort: 'Please enter sorting',
        sorta: 'Sort:',
        operate: 'Operate',
        exit: 'Edit',
        delete: 'Delete',
        semenu: 'Secondary menu bar',
        semenuname: 'Secondary menu name:',
        menu: 'Menu bar:',
        inmenu: 'Please enter a menu name',
        sure: 'Confirm',
        cancel: 'Cancel',
        exmene: 'Modify the first-level menu',
        exmenea: 'Modify the secondary menu',
        yes: 'Yes',
        demenu: 'Do you want to delete this menu?',
        prompt: 'Prompt',
    },
    delivery: {
        addrole: 'Add Role',
        editrole: 'Modify role',
        role: 'Role',
        rolea: 'Role:',
        inrole: 'Please enter the role',
        operate: 'Operate',
        edit: 'Edit',
        delete: 'Delete',
        yes: 'Yes',
        sure: 'Confirm',
        cancel: 'Cancel',
        derole: 'Do you want to delete this role',
        prompt: 'Prompt',
        choice: 'Menu permissions:',
        inchoice: 'Please select Menu Permissions',
    },
    replenish: {
        patchManagement: 'Mesh management',
    },
    rework: {
        reworkManagement: 'Rework management',
        addRework: "Rework added ",
    },
    role: {
        id: 'ID',
        characterHomepage: 'Character Home',
    },
    user: {
        userId: 'User ID',
        userHomepage: 'User Home',
    },
    orderBasicData: {
        order: 'orders',
        orderType: 'The type of order',
    },
    machine: {
        basicId: 'Device number',
        basicName: 'The name of the device',
        basicCategory: 'The process in which it is located',
        tempering: 'Steel',
    },
    report: {
        productionReport: 'Production reports',
        workInProgressReport: 'WIP report',
    },
    productionBasicData: {
        basicDataQuery: 'Basic data query',
    },
    mainIngredient: {
        materialInformation: 'Material information',
    },
    mainIngredientStock: {
        materialName: 'The name of the item',
        createTime: 'Return date',
    },
    large: {
        slice:'slice',
        load: 'load',
        edg: 'edg',
        temp: 'temp',
        hollow: 'hollow',
        oneFinish: 'oneFinish',
        twoFinish: 'twoFinish',
        oneunFinish: 'oneunFinish',
        twounFinish: 'twounFinish',
        ondDamage: 'ondDamage',
        percent: 'Percent',
        time: 'The time of the break',
        tionnumber: 'Order number',
        jobnumber: 'Job number',
        productionnumber: 'The production order number',
        cardnumber: 'Process card number',
        projectname: 'The name of the project',
        batch: 'batch',
        detailID: 'Detail ID',
        building: 'Building No',
        serialnumber: 'Order serial number',
        productname: 'Product name',
        serial: 'Process validation number',
        slicemarker: 'Frame marker (position)',
        numberpatches: 'Number of patches',
        width: 'Width',
        height: 'Height',
        shape: 'Shape',
        responsibleprocess: 'Responsible process',
        process: 'This process',
        numberfractions: 'The number of unfilled fractions',
        breakreason: 'The reason for the break',
        breaktype: 'Sub-break type',
        responsiblepersonnel: 'Responsible Personnel',
        responsiblequipment: 'Responsible Equipment',
        responsibleteam: 'Responsible team',
        area: 'Sub-broken area',
        inspector: 'Quality inspector',
        operate: 'Operate',
        mes: 'Detail',
        projectnumber: 'The project order number',
        brokeno: 'The report is broken and not filled',
        close: 'Shut down',
        orderId: 'Order ID',
        order: 'Order details',
        customerName: 'The name of the customer',
        project: 'The name of the project',
        are: 'are',
        quantity: 'quantity',
        warehousing: 'State',
        deliveryDate: 'Delivery time',
        notstocked: 'Not yet in stock',
        inboundstatus: 'Partial inventory status',
        allstatus: 'All in stock status',
        completedquantity: 'Completed quantity',
        scrapquantity: 'Scrap Quantity',
        number: 'Quantity',
        method: 'Processing method',
        innumber: 'Quantity already entered',
        productstatus: 'Production status',
        right: 'normal',
        stop: 'termination',
        inquire: 'query',
        starttime: 'Start Time',
        endtime: 'End Time',
        loading: 'In the process of uploading:',
        brokenNum: 'brokenNum',
        inventory: 'inventory',
        inventoryarea: 'inventoryarea',
        shippedQuantity: 'shippedQuantity',
        reportWorkQuantity: 'reportWorkQuantity',
        reportWorkQuantityCount: 'reporting_work_num_count',
        processId: 'processId',
        historicaltasks1: 'historicaltasks1',
        historicaltasks2: 'historicaltasks2',
        historicaltasks3: 'historicaltasks3',
        historicaltasks4: 'historicaltasks4',
        historicaltasks5: 'historicaltasks5',
        historicaltasks6: 'historicaltasks6',
        historicaltasks7: 'historicaltasks7',
        order: 'order',
        date: 'date',
        countOutOne: 'countOutOne',
        totalAreaOutOne: 'totalAreaOutOne',
        countOutTwo: 'countOutTwo',
        totalAreaOutTwo: 'totalAreaOutTwo',
        countIn: 'countIn',
        totalAreaIn: 'totalAreaIn',
        countOut: 'countOut',
        totalAreaOut: 'totalAreaOut',
        hollowCountOutOne: 'hollowCountOutOne',
        hollowTotalAreaOutOne: 'hollowTotalAreaOutOne',
        countOut: 'countOut',
        hollowCountOutTwo: 'hollowCountOutTwo',
    },
    reportmanage: {
        productiontime: 'production time',
        starttime: 'Start Time',
        endtime: 'End Time',
        ctype: 'Please select type',
        cstate: 'Please select the status',
        cprocess: 'Please select the process',
        all: 'All',
        completed: 'Completed',
        broke: 'Damaged',
        takeout: 'Takeout',
        dreportwork: 'Unreported work',
        pendingwork: 'Pending job application',
        reportwork: 'Reported work',
        reportworked: 'Reported worked',
        incise: 'slicing',
        edging: 'edging',
        steel: 'toughened',
        inquire: 'query',
        signingwork: 'Reporting for work',
        reporteam: 'Report work team',
        reportingequipment: 'Reporting equipment',
        line: 'line',
        process: 'production processes',
        glassID: 'Glass ID',
        projectnumber: 'Project number',
        layoutID: 'Tempered layout ID',
        type: 'type',
        state: 'state',
        processcards: 'Flow Card',
        number: 'Serial Number',
        layer: 'storey',
        typebreakage: 'Damage type',
        ptypebreakage: ' Please select the type of damage',
        causebreakage: 'Reason for damage',
        pcausebreakage: 'Please select the reason for the damage',
        responsibleprocess: 'Responsibility Process',
        responsiblepersonnel: 'Responsible personnel',
        presponsiblepersonnel: 'Please enter the responsible personnel',
        responsibleteam: 'Responsible team',
        presponsibleteam: 'Please select the responsible team',
        responsibleequipment: 'Responsible equipment',
        presponsibleequipment: 'Please select the responsible device',
        remark: 'notes',
        premark: 'Please enter a note',
    },
    film: {
        resetnumber: 'Shelf number',
        fail: 'fail',
        mes: 'Original film storage details',
        warehousing: 'store',
        pwarehousing: 'Inventory request',
        wareout: 'Original film outbound',
        information: 'Whether to release this information from the warehouse?',
        pwareout: 'Outbound request',
        position: 'Lifting position:',
        cposition: 'Please select the lifting position',
        position1: 'Lifting position 1',
        position2: 'Lifting position 2',
        addglass: 'Original film information',
        operate: 'Operate',
        exit: 'Edit',
        delete: 'Delete',
        outbound: 'Outbound',
        deviceid: 'device ID',
        enablestatea: 'Enable tagging',
        disable: 'Disable',
        start: 'Enable',
        startslot: 'Start workstation',
        endslot: 'Target workstation',
        slotid: 'Grid ID',
        slot: 'Grid number',
        width: 'Width',
        widtha: 'Width:',
        inwidth: 'Please enter width',
        height: 'Height',
        inheight: 'Please enter height',
        heighta: 'Height:',
        thickness: 'Thickness',
        inthickness: 'Please enter thickness',
        thicknessa: 'Thickness:',
        films: 'Films',
        infilms: 'Please enter films',
        filmsa: 'Films:',
        createtime: 'Creation time',
        remainquantity: 'Remaining Quantity',
        thickremainquant: 'Remaining quantity of original film (sheets)',
        thickremainquantity: 'Remaining quantity of original film (sheets):',
        inquantity: 'Please enter the quantity',
        quantitya: 'Number:',
        enableid: 'Task ID',
        originateslot: 'Starting grid',
        endoriginateslot: 'Target grid',
        patternquantity: 'Number',
        enabletype: 'Task Type',
        enablestate: 'Workstation status',
        finish: 'Completed',
        unfinish: 'Incomplete',
        dedelete: 'Do you want to delete this content?',
        dedisable: 'Do you want to disable this content?',
        deoutbound: 'Whether to release the content of this item from the warehouse?',
        selectwarehousing: 'Please select the lifting position',
        inwarehousing: 'Lifting position:',
        warehousing1: 'Lifting position 1',
        warehousing2: 'Lifting position 2',
        starttime: 'Start Time',
        endtime: 'End Time',
        taskstatus: 'Status',
        built: 'newly built',
        execution: 'In progress',
        tasktype: 'Task Type',
        stocke: 'store',
        dispatch: 'dispatch',
        inquire: 'query',
        station: 'station',
    },
    Mounting: {
        previewproject: 'Select Preview Project',
        loadinglinea: 'Upper film line',
        loadingline: 'Upper film line:',
        inloadingline: 'Please select the upper film line',
        oneloadingline: 'Line 1 on film',
        twoloadingline: 'Line 2 on film',
        waiting: 'Waiting',
        pass: 'Pass',
        setparameters: 'Set parameters',
        project: 'Project number',
        projecta: 'Project number:',
        width: 'Width',
        height: 'Height',
        thickness: 'Thickness',
        projectnumber: 'Project original piece number',
        state: 'state',
        createtime: 'Creation time',
        all: 'Select All',
        removalmethod: 'Please choose the membrane removal method',
        removalmethodp: 'Membrane removal method',
        removalmethoda: 'Membrane removal method:',
        noremoval: 'The film is not removed',
        removal: 'Membrane removal',
        coarselyground: 'Rough grinding',
        finegrinding: 'Fine grinding',
    },
    hellow: {
        clickmakesure: 'Whether or not to confirm the click?',
        logarithm: 'logarithm:',
        totalPairQuantitya: 'Total number of task allocation pairs',
        pairQuantitya: 'Number of deployed pairs',
        waitingout: 'Waiting for the release of the film',
        finishout: 'Film release completed',
        hollowSequence: 'Hollow sequence',
        isPair: 'Whether to pair or not',
        no: 'deny',
        listFormula: 'Formula information',
        HollowGlass: 'Queue information',
        totalLayer: 'Total number of floors',
        totalPairQuantity: 'Total number of pairs',
        pairQuantity: 'Completed pairing quantity',
        isForceList: 'Is it mandatory',
        yesisForceList: 'force',
        noisForceList: 'optional',
        hollowCountOutOne: 'Quantity of insulated first-line glass',
        hollowCountOutTwo: 'Quantity of hollow second-line glass',
        hollowTotalAreaOutOne: 'Hollow first-line glass area',
        hollowTotalAreaOutTwo: 'Hollow second-line glass area',
        countIn: 'Quantity of large cage glass before tempering',
        countOut: 'Quantity of tempered glass',
        countOutOne: 'Quantity of glass cut along the cutting line',
        countOutTwo: 'Quantity of cutting second-line glass',
        totalAreaIn: 'Area of large cage glass before tempering',
        totalAreaOut: 'Tempered glass area',
        totalAreaOutOne: 'Cut the area of glass along the cutting line',
        totalAreaOutTwo: 'Cut the area of second-line glass',
        freeone: 'First line idle state:',
        freetwo: 'Second line idle state:',
        freethree: 'Third line idle state:',
        casFour: 'Gas 4',
        casFourb: 'Gas 4:',
        casFoura: 'Please select gas 4',
        casOne: 'Gas 1',
        casOneb: 'Gas 1:',
        casOnea: 'Please select gas 1',
        casThree: 'Gas 3',
        casThreeb: 'Gas 3:',
        casThreea: 'Please select gas 3',
        casTwo: 'Gas 2',
        casTwob: 'Gas 2:',
        casTwoa: 'Please select gas 2',
        Y: 'have',
        F: 'not have',
        frameFour: 'Spacer board 4',
        frameFourb: 'Spacer board 4:',
        frameFoura: 'Please enter the spacing board 4',
        frameOne: 'Spacer board 1',
        frameOneb: 'Spacer board 1:',
        frameOnea: 'Please enter the spacing board 1',
        frameThree: 'Spacer board 3',
        frameThreeb: 'Spacer board 3:',
        frameThreea: 'Please enter the spacing board 3',
        frameTwo: 'Spacer board 2',
        frameTwob: 'Spacer board 2:',
        frameTwoa: 'Please enter the spacing board 2',
        intervalFrameHeightOne: 'Interval frame height 1',
        intervalFrameHeightTwo: 'Interval frame height 2',
        intervalFrameHeightThree: 'Interval frame height 3',
        intervalFrameHeightFour: 'Interval frame height 4',
        intervalFrameHeightaOne: 'Please enter the interval box height 1',
        intervalFrameHeightaTwo: 'Please enter the interval box height 2',
        intervalFrameHeightaThree: 'Please enter the interval box height 3',
        intervalFrameHeightaFour: 'Please enter the interval box height 4',
        intervalFrameHeightbOne: 'Interval frame height 1:',
        intervalFrameHeightbTwo: 'Interval frame height 2:',
        intervalFrameHeightbThree: 'Interval frame height 3:',
        intervalFrameHeightbFour: 'Interval frame height 4:',
        intervalFrameTypeOne: 'Interval box type 1',
        intervalFrameTypeTwo: 'Interval box type 2',
        intervalFrameTypeThree: 'Interval box type 3',
        intervalFrameTypeFour: 'Interval box type 4',
        intervalFrameTypecOne: 'Please select interval box type 1',
        intervalFrameTypecTwo: 'Please select interval box type 2',
        intervalFrameTypecThree: 'Please select interval box type 3',
        intervalFrameTypecFour: 'Please select interval box type 4',
        intervalFrameTypedOne: 'Interval box type 1:',
        intervalFrameTypedTwo: 'Interval box type 2:',
        intervalFrameTypedThree: 'Interval box type 3:',
        intervalFrameTypedFour: 'Interval box type 4:',
        intervalFrameTypea: 'TPS adhesive',
        intervalFrameTypeb: 'Aluminum spacer strip',
        intervalFrameWidthOne: 'Interval frame width 1',
        intervalFrameWidthTwo: 'Interval frame width 2',
        intervalFrameWidthThree: 'Interval frame width 3',
        intervalFrameWidthFour: 'Interval frame width 4',
        intervalFrameWidthaOne: 'Please enter the width of the interval box as 1',
        intervalFrameWidthaTwo: 'Please enter the width of the interval box as 2',
        intervalFrameWidthaThree: 'Please enter the width of the interval box as 3',
        intervalFrameWidthaFour: 'Please enter the width of the interval box as 4',
        intervalFrameWidthbOne: 'Interval frame width 1:',
        intervalFrameWidthbTwo: 'Interval frame width 2:',
        intervalFrameWidthbThree: 'Interval frame width 3:',
        intervalFrameWidthbFour: 'Interval frame width 4:',
        sealInsert: 'Sealed embedding',
        sealInsertb: 'Sealed embedding:',
        sealInserta: 'Please enter sealed embedding',
        hollowformula: 'Hollow formula',
        hollowformuldet: 'Do you want to delete this hollow formula?',
        hollowtaskdet: 'Do you want to delete this task?',
        taskdet: 'Delete Task',
        edithollowformula: 'Modify the hollow formula',
        phollowformula: 'Please choose a hollow formula',
        hollowformulp: 'Hollow formula:',
        bottomRemove: 'Lower side film removal amount:',
        bottomRemovep: 'Lower side film removal amount',
        bottomRemovea: 'Please enter the amount of film removal on the lower side',
        topRemove: 'Upper side membrane removal amount:',
        topRemovep: 'Upper side membrane removal amount',
        topRemovea: 'Please enter the amount of film removal on the upper side',
        leftRemove: 'Left side membrane removal amount:',
        leftRemovep: 'Left side membrane removal amount',
        leftRemovea: 'Please enter the amount of membrane removal on the left side',
        rightRemove: 'Right side membrane removal amount:',
        rightRemovep: 'Right side membrane removal amount',
        rightRemovea: 'Please enter the amount of membrane removal on the right side',
        formulaNamep: 'Recipe Name',
        formulaName: 'Recipe Name:',
        formulaNamea: 'Please enter the formula name',
        stopproject: 'Pause Task',
        pstopproject: 'Do you want to pause the task?',
        reviewproject: 'Preview project',
        line: 'line',
        linea: 'line:',
        line1: 'Line 1',
        line2: 'Line 2',
        line3: 'Line 3',
        createtask: 'Create task',
        starttask: 'Start Task',
        pstarttask: 'Do you want to start the task?',
        stoptask: 'stop task',
        pstoptask: 'Do you want to stop the task?',
        currenttask: 'Current task:',
        claimednumber: 'Received pairing quantity:',
        linenumber: 'Number of lines entering the airspace:',
        order: 'Production order',
        flowCardId: 'Flow Card',
        thickness: 'thickness',
        coatingtypes: 'films',
        layer: 'Number of layers',
        height: 'long',
        width: 'width',
        state: 'state',
        cardnumber: 'Process card number',
        cardnumbera: 'Process card number:',
        layernumber: 'Layer number',
        totalnumber: 'Total number of films',
        pairsnumber: 'Matched quantity',
        missingnumber: 'Number of missing pieces',
        damagenumber: 'A quantity broken.',
        operate: 'operate',
        claimquest: 'Collecting tasks',
        pclaimquest: 'Do you want to receive the task?',
        missingfilms: 'Missing chip details',
        forcedfilming: 'Compulsory film release',
        pforcedfilming: 'Is it mandatory to release the film?',
        brokenpieces: 'Number of damaged pieces',
        realpieces: 'Actual number of films',
        route: 'route:',
        croute: 'Please choose a route',
        ptotalpairQuantity: 'Total number of pairs:',
        cpairQuantity: 'Please enter the total number of pairs',
        schedulingswitch: 'Dispatch switch',
    },
    screendisplay: {
        pchoice: 'Please select',
        pwidth: 'Please enter the width',
        pheight: 'Please enter the height',
        upnumber: 'Number of films uploaded',
    }
}
UI-Project/src/lang/index.js
New file
@@ -0,0 +1,20 @@
import { createI18n}  from 'vue-i18n'
import zh from "./zh"
import py from "./py"
import en from "./en"
let messages = {
    zh:zh,
    py:py,
    en: en
}
const i18n = createI18n({
    locale: localStorage.getItem('lang') || 'zh', // 设置当前语言类型
    legacy: false, // 如果要支持compositionAPI,此项必须设置为false;
    globalInjection: true, // 全局注册$t方法
    messages
})
export default i18n
UI-Project/src/lang/py.js
New file
@@ -0,0 +1,886 @@
export default {
    "northglassMESsystem": 'Система "NorthGlass MES"',
    login: {
        userErr: 'Введите номер счета.',
        pwErr: 'Введите пароль.',
        user: 'Аккаунт',
        password: 'Код',
        login: 'Залогин',
        loginSuccessful: 'Вход в систему выполнен успешно!',
        register: 'Зарегистрирова',
        namea: 'Имя не может быть пустым',
        len: 'Длина не должна превышать 16',
        passnull: 'Пароль не может быть пустым',
        leng: 'Длина пароля не должна быть меньше 6 или больше 16.',
        spwn: 'Пароль подтверждения не может быть пустым',
        depass: 'Два разных пароля.',
    },
    register: {
        registerSuccessful: 'Регистрация успешно',
        newuserregister: 'Новый реестр пользователей',
        name: 'Имя:',
        inputname: 'Введите имя',
        password: 'Код:',
        pwErr: 'Введите пароль.',
        passwordation: 'Подтвердите пароль:',
        pwErration: 'Пожалуйста, подтвертите пароль',
        registration: 'Подтверждение о регистрации',
        false: 'Отмена',
    },
    main: {
        connectErr: 'Необычное подключение к серверу, попробуйте позже',
        titleFirst: "Добро пожаловать ",
        titleLast: ' в систему NorthGlass MES!',
        quit: "Выход",
    },
    basicData: {
        untask:'无任务',
        tonumber:'上片总数量',
        finishnumber:'已完成数量',
        rackreset:'架子复位',
        prackreset:'是否架子复位?',
        laserprinting: 'Машина лазерной маркировки готова:',
        cuttingmachine: 'Машина для резки готова:',
        machine: 'Состояние станок загрузки в режиме онлайн:',
        machineaa: 'Ручное состояние станок загрузки:',
        selectproject: "Выберите проект",
        startloading: 'Начало загрузки',
        stop: 'Пауза',
        yes: 'подтверд',
        change: 'переключа',
        projectnumber: 'Номер проекта',
        glasswidth: 'Ширина стекла',
        glassheight: 'Высота стекла',
        coatingtypes: 'Типы покрытий',
        coatingtypesa: 'Типы покрытий:',
        quantity: 'Количество',
        quantitya: 'Количество:',
        thickness: 'Толщина',
        thicknessa: 'Толщина:',
        startstatus: 'Статус начала операции',
        pass: 'Через',
        waiting: 'Ждем.',
        up: 'Загрузка',
        finish: 'Завершено',
        project: 'инженерия',
        plselectproject: 'Пожалуйста, выберите проект.',
        confirm: 'подтверд',
        cancel: 'Отмена',
        startfilm: 'Начинать или нет?',
        whetherpause: 'Пауза или нет?',
        station: 'Рабочее место',
        width: 'Ширина',
        widtha: 'Ширина:',
        height: 'Высота',
        heighta: 'Высота:',
        operate: 'Операция',
        add: 'Добавля',
        delete: 'Удал',
        addglass: 'Добавить стекло',
        selectwidth: 'Выбирите ширину',
        selectheight: 'Выбирите высоту',
        selectcoatingtypes: 'Выберите типы покрытий',
        selectthickness: 'Выберите толщину',
        selectquantity: 'Введите кольчество.',
        pause: 'Вторая и четвертая строки должны быть выше 2700 для сохранения!',
        pausea: 'Пожалуйста, убедитесь, что маркировочная и режущая машины готовы!',
        infonull: 'Номер проекта не может быть пустым!',
        updatanull: 'Проект не сохранились на листе загрузки!',
        glassnull: 'Ошибка при обновлении стекла',
        deletemessage:'Удалить эту информацию или нет?',
        layoutSequence:'Серийн номер',
    },
    sorter: {
        onesort:'一线掰片',
        twosort:'二线掰片',
        inPlace:'到位',
        ninPlace:'未到位',
        emptymissions:'空任务',
        advancetask:'进片任务',
        outputtasks:'出片任务',
        schedulingtasks:'调度任务',
        advancerequests:'进片请求',
        releaserequest:'出片请求',
        straighttasks:'直通任务',
        endingtask:'结束',
        another:'其他',
        taskRunning:'任务请求',
        remainWidth:'剩余',
        id:'磨边前理片笼表ID',
        updateTime:'更新时间',
        place:'是否到位',
        layernow:'当前层号',
        gridnumber: 'Ячеек сеткла',
        glassnumber: 'Номер стакла',
        width: 'Ширина',
        height: 'Высота',
        startstatus: 'Статус начала операции',
        disable: 'Отключ',
        start: 'Начало',
        deficiencieste: 'Недостатки в отчетности',
        updown:'人工下片',
        operate: 'Операция',
        prompt: 'Подсказк',
        information: 'Следует ли сообщать недостающую информацию?',
        infor:'是否人工下片该条信息?',
        yes: 'Да',
        cancel: 'Отмена',
    },
    order: {
        projectnumber:'请输入工程号',
        takeon:'摆片完成',
        dilapidation: 'Повреждение',
        takeawaya:'是否人工拿走该条信息?',
        takeaway: 'Взять вручную',
    },
    searchOrder: {
        furnaces:'满炉炉数',
        furnfullTemp:'玻璃总量',
        startCell:'目标层号',
        endCell:'预留层号',
        begin:'开始',
        finish:'完成',
        uncar:'未上车',
        inkage:'进片',
        successfullyprocessed:'任务成功处理',
        psuccessfullyprocessed:'是否进行任务成功处理?',
        taskfailure:'任务失败处理',
        ptaskfailure:'是否进行任务失败处理?',
        totallogarithms:'总对数',
        numberpairs:'配对数',
        numberoccupied:'占用格子数',
        totalfurnaces:'总炉数',
        cagesnumber:'笼内数量',
        slotnumber:'占有格子数',
        progress:'进度%',
        whethersame:'是否相同',
        same:'相同',
        notsame:'不相同',
        partasks:'是否任务重置?',
        empty:'默认空任务',
        partask:'任务重置',
        historicaltasks:'历史任务',
        cagedetails:'笼内详情',
        inkageEntity:'进片联机状态:',
        requestEntity:'进片请求状态:',
        mesReplyEntity:'启动命令:',
        outInkageEntity:'出片联机状态:',
        outRequestEntity:'出片请求状态:',
        breakagn:'未破损',
        lacknumber:'缺片数量',
        processcard:'指定流程卡',
        filminformation:'人工下片信息',
        currentglassinformation:'扫码枪当前玻璃信息',
        printlabels:'打印标签',
        deleteTask:'结束工程',
        pdeleteTask:'是否结束工程?',
        searchlayout:'Запрос нетемперированной технологической карты',
        fullfurnaces:'Количество полных печей',
        specifiedproject:'Указанный в данный момент проект',
        undesignate:'取消钢化',
        allnumber:'Общее количество',
        numbercages:'Количество сепараторов',
        missingquantity:'Недостающее количество',
        breakquantity:'Количество Поломка/Вынос',
        ceng:'слой',
        cageinformation: 'Информация буфера',
        productionqueue: 'Производственная очередь',
        outputglassID: 'Выходное стекло ID',
        startposition: 'Занять позиции',
        targetlocation: 'Позиция цели',
        trips: '№ поезда',
        number: 'Серийн номер',
        taskstatus: 'Состояние задачи',
        filmenter: 'Ожидание стеклянной вход',
        infilm: 'В настоящее время',
        endtask: 'Задача на конец',
        completetask: 'Выполнение задания',
        intoglassid: 'Входной стеклянный ID',
        line: 'Линия',
        Usage: 'Скорость использования',
        free: 'Бесплатно (ячеек)',
        addcage: 'Добавить информацию о буфере',
        glassIDa: 'Стеклянный ID:',
        glassID: 'Стеклянный ID',
        inglassID: 'Введите стекло ID',
        pieceingrid: 'Порядок расположения маленьких стеклянных пластин в клетке',
        pieceingrida: 'Порядок расположения маленьких стеклянных пластин в клетке:',
        inpieceingrid: 'Введите порядок расположения стеклянных листов в ячееке',
        cardnumber: 'Номер карточки процесса',
        cardnumbera: 'Номер карточки процесса:',
        incardnumber: 'Введите номер процесса .',
        typeglass: 'Тип стекла',
        typeglassa: 'Тип стекла:',
        intypeglass: 'Введите тип стекла',
        coatingtypes: 'Типы покрытий',
        width: 'Ширина',
        widtha: 'Ширина:',
        inwidth: 'Введите ширину',
        height: 'Высота',
        heighta: 'Высота:',
        inheight: 'Введите высоту',
        thickness: 'Толщина',
        thicknessa: 'Толщина:',
        inthickness: 'Введите толщину.',
        layoutID: 'Чертеж ID загрузки печи для закалки',
        layoutIDa: 'Чертеж ID загрузки печи для закалки:',
        inlayoutID: 'Введите чертеж закалки ID',
        picturesequence: 'Чертеж серийн номер загрузки печи для закалки',
        picturesequencea: 'Чертеж серийн номер загрузки печи для закалки:',
        inpicturesequence: 'Введите порядок чертежи закалки стекла.',
        startstatus: 'Статус начала операции',
        startstatusa: 'Статус начала операции:',
        instartstatus: 'Введите состояние активации',
        glassgaps: 'Стеклянный зазор',
        glassgapsa: 'Стеклянный зазор:',
        inglassgaps: 'Введите стекло зазор',
        sure: 'подтверд',
        cancel: 'Отмена',
        operate: 'Операция',
        breakage: 'Повреждение',
        delete: 'Удал',
        outfilm: 'Выпуск стекла',
        cagetableID: 'ID буферной таблицы',
        cagenumber: 'Буфер номера',
        gridnumber: 'Ячеек сеткла',
        gridnumbera:'Ячеек сеткла:',
        grid:'请输入栅格号',
        enable: 'Начало',
        disable: 'Отключ',
        remainingwidth: 'Остаточная ширина',
        add: 'Добавля',
        sheetID: 'Закалка маленький стеклянный ID таблицы информации',
        processcards: 'Карточка процесса',
        processcardtype: 'Тип стекла карточки процесса',
        acceptshorizontal: 'Умеренное принятие горизонтали',
        xcoordinates: 'X-координаты',
        ycoordinates: 'Y-координаты',
        rotationangle: 'Угол вращения (против часовой стрелки)',
        state: 'Состояние',
        takeout: 'Взять',
        deletemessage: 'Удалить эту информацию или нет?',
        prompt: 'Подсказк',
        yes: 'Да',
        accept: 'Принять',
        noaccept: 'Не принимать',
        filmcomplete: 'Стекло готово',
        waiting: 'Ждем.',
        broke:'是否破损该条信息?',
        brokeb:'是否拿走该条信息?',
        outfil:'是否出片该条信息?',
        inputid:'Введите стекло ID',
        search:'搜索',
        tabid:'大理片笼详情表id',
        tid:'设备id',
        tida:'设备id:',
        fin:'是否完成任务?',
        sureadd:'确认添加',
        sureadda:'是否确认添加?',
        zailong:'在笼中',
        rengongxp:'人工下片',
        up:'上一页',
        down:'下一页',
        now:'当前页显示',
        tit:'条数据',
        temperingqueries:'钢化查询',
        specifytempering:'指定一炉',
        specifyout:'指定人工出片',
        specifyengineerid:'指定工程',
        projectnumber:'Номер проекта',
        layoutnumber:'Чертеж номер загрузки печи для закалки',
        numberglasses:'玻璃数量',
        specifytemperinga:'请确认设备是否已关闭MES联机?',
        temperedswitch:'钢化开关',
        dutyinformation:'值班信息',
        process:'工序',
        team:'班组',
        basic:'设备',
        makesure:'确认保存',
        temperingtotal:'钢化炉数:',
        glasstotal:'玻璃总数:',
        Labelprinting:'标签打印',
        Schedulingswitch:'调度开关',
    },
    workOrder: {
        upnumber:'上片位编号',
        coatingtypesbe:'原片膜系',
        glassID: 'Стеклянный ID',
        height: 'Высота',
        width: 'Ширина',
        thickness: 'Толщина',
        coatingtypes: 'Типы покрытий',
        productionsequence: 'Последовательность производства',
        cardnumber: 'Номер карточки процесса',
        operate: 'Операция',
        messagedamaged: 'Повреждено ли сообщение?',
        prompt: 'Подсказк',
        yes: 'Да',
        cancel: 'Отмена',
        takemessage: 'Следует ли удалять сообщение?',
        breakage: 'Повреждение',
        takeout: 'Взять',
        glasstype:'Тип стекла',
        line:'线路',
        status:'Состояние',
        time:'Период времени',
        cway:'Пожалуйста, выберите маршрут',
        cstate:'Пожалуйста, выберите статус',
        edgingone:'Окантовка линии',
        edgingtwo:'Окантовка двух линий',
        nedging:'Окантовка',
        edging:'Край',
        finedging:'был окантовочным',
    },
    processCard: {
        intofurnace: 'В печь',
        beforefurnace: 'До печки.',
        outfurnace: 'Окончено стекло из печи для закалки',
        print:'拿走打印',
        printing:'打印',
        projectnumber:'请输入工程号',
        inquire:'查询',
        project:'Номер проекта',
        awayprocess:'拿走工序',
        awayequipment:'拿走设备',
        awayteam:'拿走班组',
        flowcard:'Карточка процесса',
        layer:'层号',
        temperinglayout:'炉号',
        temperingfeed:'片序',
        width:'Ширина',
        height:'Высота',
        thickness:'Толщина',
        glasstakeout:'玻璃拿走清单',
        layoutID:'版图ID',
        glassID:'Стеклянный ID',
    },
    reportWork: {
        details:'Сведения о сдаче',
        filming:'Искусственная съемка',
        printing:'Автоматическая печать',
        cenumber:'Количество слоев',
        artificialorder:'Количество штук при искусственном заказе',
        processcard:'Печать технологической карты',
        printlabels:'Печать этикеток',
        information:'Информация о посадке',
        cstation:'Пожалуйста, выберите стол',
        all:'все',
        timeperiod:'Период времени',
        stationnumber:'Номер станции',
        order:'порядок',
        filminformation:'Информация о пленке вручную',
        glassmation:'Искусственная пленка актуальная информация о стекле',
        barcodescanner:'Актуальная информация о стекле сканера штрих-кода',
        lowerbit: 'Станция разгрузки',
        shelfnumber: 'Номер стойки регистрации',
        cardnumber: 'Номер карточки процесса',
        totalquantity: 'Общее количество',
        beendropped: 'Количество стекла разгрузки',
        state: 'Состояние',
        devicenumber: 'Номер оборудования.',
        startstatus: 'Статус начала операции',
        enable: 'Начало',
        unenable: 'Не начат',
        operate: 'Операция',
        bindingshelves: 'Назначенная стеллажка',
        clear: 'Чисто.',
        workstation: 'Станция номер',
        shelfnumbera:'Номер стойки регистрации:',
        cardnumbera: 'Номер карточки процесса:',
        incardnumber: 'Пожалуйста, выберите номер программы',
        clearglass: 'Очистить стекло с полки',
        sure: 'подтверд',
        cancel: 'Отмена',
        glassinformation: 'Информация стекла',
        glassID: 'Стеклянный ID',
        coatingtypes: 'Типы покрытий',
        thickness: 'Толщина',
        width: 'Ширина',
        height: 'Высота',
    },
    productStock: {
        configName:'配置名',
        configNamea:'配置名:',
        configCode:'配置代码',
        configValue:'配置值',
        addusers: 'Добавьте пользователей.',
        username: 'Имя пользователя.',
        usernamea: 'Имя пользователя.:',
        inusername: 'Введите имя пользователя',
        role: 'Роль',
        rolea: 'Роль:',
        inrole: 'Выберите роль',
        test: 'Тест',
        admin: 'Администратор.',
        operate: 'Операция',
        resetpassword: 'Сбросить пароль',
        exit: 'Редактор',
        delete: 'Удал',
        prompt: 'Подсказк',
        repassword: 'Перезагрузка пользовательского пароля или нет?',
        yes: 'Да',
        cancel: 'Отмена',
        reusername: 'Изменение пользователя',
        addusername: 'Добавьте пользователей.',
        password: 'Код:',
        sure: 'подтверд',
        inpassword: 'Введите пароль.',
        deusername: 'Удаление пользователя или нет?',
    },
    customer: {
        addmenua:'添加二级菜单',
        addmenu: 'Добавьте меню.',
        firstmenu: 'Таблица меню первой степени',
        firstmenuname:'一级菜单名称:',
        link: 'Ссылк',
        linka: 'Ссылк:',
        inlink: 'Введите ссылку',
        sort: 'Сортировк',
        sorta: 'Сортировк:',
        insort: 'Введите сортировку',
        operate: 'Операция',
        exit: 'Редактор',
        delete:'Удал',
        semenu:'Таблица меню второй степени',
        semenuname:'二级菜单名称:',
        inmenu: 'Введите меню',
        delete: 'Удал',
        menu: 'Меню.:',
        sure: 'подтверд',
        cancel: 'Отмена',
        exmene: 'Изменение меню.',
        yes: 'Да',
        demenu: 'Удалить меню или нет?',
        prompt: 'Подсказк',
    },
    delivery: {
        addrole: 'Добавьте роли.',
        editrole: 'Изменение роли.',
        role: 'Роль',
        rolea: 'Роль:',
        inrole: 'Введите роли.',
        operate: 'Операция',
        edit: 'Редактор',
        delete: 'Удал',
        sure: 'подтверд',
        cancel: 'Отмена',
        yes: 'Да',
        derole: 'Удалить персонаж или нет?',
        prompt: 'Подсказк',
        choice:'菜单权限:',
        inchoice:'请选择菜单权限',
    },
    replenish:{
        patchManagement:'补片管理',
    },
    rework:{
        reworkManagement:'返工管理',
        addRework:"返工新增 ",
    },
    role:{
        id:'ID',
        characterHomepage:'角色首页',
    },
    user:{
        userId:'用户ID',
        userHomepage:'用户首页',
    },
    orderBasicData:{
        order:'订单',
        orderType:'订单类型',
    },
    machine:{
        basicId:'设备编号',
        basicName:'设备名称',
        basicCategory:'所在工序',
        tempering:'Закалка',
    },
    report:{
        productionReport:'生产报表',
        workInProgressReport:'在制品报表',
    },
    productionBasicData:{
        basicDataQuery :'基础数据查询',
    },
    mainIngredient:{
        materialInformation :'物料资料',
    },
    mainIngredientStock:{
        materialName :'物料名称',
        createTime :'返库日期',
    },
    large:{
        slice:'片',
        time: '次破时间',
        tionnumber: '订单号',
        jobnumber: '报工编号',
        productionnumber: '生产订单号',
        cardnumber: 'Номер карточки процесса',
        projectname: '项目名称',
        batch: '批次',
        detailID: '明细ID',
        building: '楼号',
        serialnumber: '订单序号',
        productname: '产品名称',
        serial: '工艺确认序号',
        slicemarker: '片标记(位置)',
        numberpatches: '补片数量',
        width: 'Ширина',
        height: 'Высота',
        shape: '形状',
        responsibleprocess: '责任工序',
        process: '本工序',
        numberfractions: '次破未补数量',
        breakreason: '次破原因',
        breaktype: '次破类型',
        responsiblepersonnel: '责任人员',
        responsiblequipment: '责任设备',
        responsibleteam: '责任班组',
        area: '次破面积',
        inspector: '质检员',
        operate: 'Операция',
        mes: '详情',
        projectnumber: '工程单号',
        brokeno: '报次破未补',
        close: '关闭',
        orderId: '订单ID',
        order: '订单详情',
        customerName: '客户名称',
        project: '项目名称',
        are: '面积',
        quantity: 'Количество',
        warehousing: 'Состояние',
        deliveryDate: '送货时间',
        notstocked: '未入库',
        inboundstatus: '部分入库状态',
        allstatus: '全部入库状态',
        completedquantity: '完成数量',
        scrapquantity: '报废数量',
        number: 'Количество',
        method: '加工方式',
        innumber: '已入数量',
        productstatus: '生产状态',
        right: '正常',
        stop: '终止',
        inquire: '查询',
        starttime :'开始时间',
        endtime :'结束时间',
        loading :'正在上片:',
    },
    reportmanage:{
        productiontime :'生产时间',
        starttime :'开始时间',
        endtime :'结束时间',
        ctype :'请选择类型',
        cstate :'请选择状态',
        cprocess :'请选择工序',
        all :'全部',
        completed :'完工',
        broke :'Повреждение',
        takeout :'Взять',
        dreportwork :'未报工',
        pendingwork :'已现补',
        reportwork :'已报工',
        reportworked :'已同步',
        incise :'切割',
        edging :'磨边',
        steel :'Закалка',
        inquire :'查询',
        signingwork :'报工',
        reporteam :'报工班组',
        reportingequipment :'报工设备',
        line :'Линия',
        process :'工序',
        glassID :'Стеклянный ID',
        projectnumber :'Номер проекта',
        layoutID :'Чертеж ID загрузки печи для закалки',
        type :'类型',
        state :'Состояние',
        processcards :'Карточка процесса',
        number :'Серийн номер',
        layer :'层',
        typebreakage :'破损类型',
        ptypebreakage :' 请选择破损类型',
        causebreakage :'破损原因',
        pcausebreakage :'请选择破损原因',
        responsibleprocess :'责任工序',
        responsiblepersonnel :'责任人员',
        presponsiblepersonnel :'请输入责任人员',
        responsibleteam :'责任班组',
        presponsibleteam :'请选择责任班组',
        responsibleequipment :'责任设备',
        presponsibleequipment :'请选择责任设备',
        remark :'备注',
        premark :'请输入备注',
    },
    film:{
        resetnumber:'架子号',
        fail:'失败',
        mes:'原片仓储详情',
        warehousing:'原片入库',
        pwarehousing:'入库请求',
        wareout:'原片出库',
        information:'是否出库该条信息?',
        pwareout:'出库请求',
        position:'吊装位:',
        cposition:'请选择吊装位',
        position1:'吊装位1',
        position2:'吊装位2',
        addglass:'原片信息',
        operate: 'Операция',
        exit:'Редактор',
        delete:'Удал',
        outbound:'出库',
        deviceid:'设备ID',
        enablestatea:'启用标记',
        disable:'Отключ',
        start:'Начало',
        startslot:'开始工位',
        endslot:'目标工位',
        slotid:'格子ID',
        slot:'格子号',
        width:'Ширина стекла',
        widtha:'Ширина стекла:',
        inwidth:'请输入原片宽',
        height:'Высота стекла',
        inheight:'请输入原片高',
        heighta:'Высота стекла:',
        thickness:'原片厚度',
        inthickness:'请输入原片厚度',
        thicknessa:'原片厚度:',
        films:'Типы покрытий',
        infilms:'请输入膜系',
        filmsa:'Типы покрытий:',
        createtime:'创建时间',
        remainquantity:'剩余数量',
        thickremainquant:'原片剩余数量(张)',
        thickremainquantity:'原片剩余数量(张):',
        inquantity:'Введите кольчество.',
        quantitya:'Количество:',
        enableid:'任务ID',
        originateslot:'起始格子',
        endoriginateslot:'目标格子',
        patternquantity:'原片数量',
        enabletype:'任务类型',
        enablestate:'工位状态',
        finish:'Завершено',
        unfinish:'未完成',
        dedelete:'是否删除该条内容?',
        dedisable:'是否禁用该条内容?',
        deoutbound:'是否出库该条内容?',
        selectwarehousing:'请选择吊装位',
        inwarehousing:'吊装位:',
        warehousing1:'吊装位1',
        warehousing2:'吊装位2',
        starttime :'开始时间',
        endtime :'结束时间',
        taskstatus :'Состояние задачи',
        built :'新建',
        execution :'执行中',
        tasktype :'任务类型',
        stocke :'入库',
        dispatch :'调度',
        inquire :'查询',
        station :'Рабочее место',
    },
    Mounting:{
        previewproject: '选择预览工程',
        loadinglinea: '上片线',
        loadingline: '上片线:',
        inloadingline: '请选择上片线',
        oneloadingline: '一号上片线',
        twoloadingline: '二号上片线',
        waiting: 'Ждем.',
        pass: 'Через',
        setparameters: '设置参数',
        project: 'Номер проекта',
        projecta: 'Номер проекта:',
        width: 'Ширина стекла',
        height: 'Высота стекла',
        thickness: '原片厚',
        projectnumber: '工程原片序号',
        state: 'Состояние',
        createtime: '创建时间',
        all: '全选',
        removalmethod: '请选择除膜方式',
        removalmethodp: '除膜方式',
        removalmethoda: '除膜方式:',
        noremoval: '不除膜',
        removal: '除膜',
        coarselyground: '粗磨',
        finegrinding: '精磨',
    },
    hellow: {
        clickmakesure: '是否确认点击?',
        logarithm: '对数:',
        totalPairQuantitya: '任务总配对数',
        pairQuantitya: '已出配对数',
        waitingout: '等待出片',
        finishout: '出片完成',
        hollowSequence: '中空顺序',
        isPair: '是否配对',
        no: '否',
        listFormula: '配方信息',
        HollowGlass: '队列信息',
        totalLayer: '总层数',
        totalPairQuantity: '总配对数量',
        pairQuantity: '已完成配对数量',
        isForceList: '是否强制',
        yesisForceList: '强制',
        noisForceList: '非强制',
        hollowCountOutOne: '中空一线玻璃数量',
        hollowCountOutTwo: '中空二线玻璃数量',
        hollowTotalAreaOutOne: '中空一线玻璃面积',
        hollowTotalAreaOutTwo: '中空二线玻璃面积',
        countIn: '钢化前大理片笼玻璃数量',
        countOut: '钢化玻璃数量',
        countOutOne: '切割一线玻璃数量',
        countOutTwo: '切割二线玻璃数量',
        totalAreaIn: '钢化前大理片笼玻璃面积',
        totalAreaOut: '钢化玻璃面积',
        totalAreaOutOne: '切割一线玻璃面积',
        totalAreaOutTwo: '切割二线玻璃面积',
        freeone: '一线空闲状态:',
        freetwo: '二线空闲状态:',
        freethree: '三线空闲状态:',
        casFour: '气体4',
        casFourb: '气体4:',
        casFoura: '请选择气体4',
        casOne: '气体1',
        casOneb: '气体1:',
        casOnea: '请选择气体1',
        casThree: '气体3',
        casThreeb: '气体3:',
        casThreea: '请选择气体3',
        casTwo: '气体2',
        casTwob: '气体2:',
        casTwoa: '请选择气体2',
        Y: '有',
        F: '无',
        frameFour: '间隔板4',
        frameFourb: '间隔板4:',
        frameFoura: '请输入间隔板4',
        frameOne: '间隔板1',
        frameOneb: '间隔板1:',
        frameOnea: '请输入间隔板1',
        frameThree: '间隔板3',
        frameThreeb: '间隔板3:',
        frameThreea: '请输入间隔板3',
        frameTwo: '间隔板2',
        frameTwob: '间隔板2:',
        frameTwoa: '请输入间隔板2',
        intervalFrameHeightOne: '间隔框高度1',
        intervalFrameHeightTwo: '间隔框高度2',
        intervalFrameHeightThree: '间隔框高度3',
        intervalFrameHeightFour: '间隔框高度4',
        intervalFrameHeightaOne: '请输入间隔框高度1',
        intervalFrameHeightaTwo: '请输入间隔框高度2',
        intervalFrameHeightaThree: '请输入间隔框高度3',
        intervalFrameHeightaFour:  '请输入间隔框高度4',
        intervalFrameHeightbOne: '间隔框高度1:',
        intervalFrameHeightbTwo: '间隔框高度2:',
        intervalFrameHeightbThree: '间隔框高度3:',
        intervalFrameHeightbFour:  '间隔框高度4:',
        intervalFrameTypeOne: '间隔框类型1',
        intervalFrameTypeTwo: '间隔框类型2',
        intervalFrameTypeThree: '间隔框类型3',
        intervalFrameTypeFour: '间隔框类型4',
        intervalFrameTypecOne: '请选择间隔框类型1',
        intervalFrameTypecTwo: '请选择间隔框类型2',
        intervalFrameTypecThree: '请选择间隔框类型3',
        intervalFrameTypecFour: '请选择间隔框类型4',
        intervalFrameTypedOne: '间隔框类型1:',
        intervalFrameTypedTwo: '间隔框类型2:',
        intervalFrameTypedThree: '间隔框类型3:',
        intervalFrameTypedFour: '间隔框类型4:',
        intervalFrameTypea: 'tps胶',
        intervalFrameTypeb: '铝间隔条',
        intervalFrameWidthOne: '间隔框宽度1',
        intervalFrameWidthTwo: '间隔框宽度2',
        intervalFrameWidthThree: '间隔框宽度3',
        intervalFrameWidthFour:  '间隔框宽度4',
        intervalFrameWidthaOne: '请输入间隔框宽度1',
        intervalFrameWidthaTwo: '请输入间隔框宽度2',
        intervalFrameWidthaThree: '请输入间隔框宽度3',
        intervalFrameWidthaFour:  '请输入间隔框宽度4',
        intervalFrameWidthbOne: '间隔框宽度1:',
        intervalFrameWidthbTwo: '间隔框宽度2:',
        intervalFrameWidthbThree: '间隔框宽度3:',
        intervalFrameWidthbFour:  '间隔框宽度4:',
        sealInsert: '密封嵌入',
        sealInsertb: '密封嵌入:',
        sealInserta: '请输入密封嵌入',
        hollowformula: '中空配方',
        hollowformuldet: '是否删除该中空配方?',
        hollowtaskdet: '是否删除该任务?',
        taskdet: '删除任务',
        edithollowformula: '修改中空配方',
        phollowformula: '请选择中空配方',
        hollowformulp: '中空配方:',
        bottomRemove: '下侧除膜量:',
        bottomRemovep: '下侧除膜量',
        bottomRemovea: '请输入下侧除膜量',
        topRemove: '上侧除膜量:',
        topRemovep: '上侧除膜量',
        topRemovea: '请输入上侧除膜量',
        leftRemove: '左侧除膜量:',
        leftRemovep: '左侧除膜量',
        leftRemovea: '请输入左侧除膜量',
        rightRemove: '右侧除膜量:',
        rightRemovep: '右侧除膜量',
        rightRemovea: '请输入右侧除膜量',
        formulaNamep: '配方名',
        formulaName: '配方名:',
        formulaNamea: '请输入配方名',
        stopproject: '暂停任务',
        pstopproject: '是否暂停任务?',
        reviewproject: '预览工程',
        line: '线路',
        linea: '线路:',
        line1: '线路一',
        line2: '线路二',
        line3: '线路三',
        createtask: '创建任务',
        starttask: '开始任务',
        pstarttask: '是否开始任务?',
        stoptask: '停止任务',
        pstoptask: '是否停止任务?',
        currenttask: '当前任务:',
        claimednumber: '已领取配对数量:',
        linenumber: '进入中空线数量:',
        order: '出片顺序',
        flowCardId: '流程卡',
        thickness: '厚度',
        coatingtypes: '膜系',
        layer: '层数',
        height: '长',
        width: '宽',
        state: '状态',
        cardnumber: '流程卡号',
        cardnumbera: '流程卡号:',
        layernumber: '层号',
        totalnumber: '总片数',
        pairsnumber: '已配对数量',
        missingnumber: '缺片数量',
        damagenumber: '破损数量',
        operate: '操作',
        claimquest: '领取任务',
        pclaimquest: '是否领取任务?',
        missingfilms: '缺片详情',
        forcedfilming: '强制出片',
        pforcedfilming: '是否强制出片?',
        brokenpieces: '破损片数',
        realpieces: '实际片数',
        route: '路线:',
        croute: '请选择路线',
        ptotalpairQuantity: '总配对数量:',
        cpairQuantity: '请输入总配对数量',
        schedulingswitch: '调度开关',
    },
    screendisplay:{
        pchoice: '请选择',
        pwidth: '请输入宽度',
        pheight: '请输入高度',
        upnumber: '上片数量',
    }
}
UI-Project/src/lang/zh.js
New file
@@ -0,0 +1,929 @@
export  default {
    "northglassMESsystem": "北玻MES系统",
      login:{
          userErr:'请输入账号',
          pwErr:'请输入密码',
          user:'账号',
          password:'密码',
          login:'登录',
          loginSuccessful:'登录成功!',
          register:'注册',
          namea:'姓名不能为空',
          len:'长度不能超过16',
          passnull:'密码不能为空',
          leng:'密码长度不能低于6或超过16',
          spwn:'确认密码不能为空',
          depass:'两次密码不相同',
      },
      register:{
          registerSuccessful:'注册成功',
          newuserregister:'注册新用户',
          name:'姓名:',
          inputname:'请输入姓名',
          password:'密码:',
          pwErr:'请输入密码',
          passwordation:'确认密码:',
          pwErration:'请确认密码',
          registration:'确认注册',
          false:'取消',
      },
      main:{
          connectErr:'服务器连接异常,请稍后再试',
          titleFirst:"欢迎 ",
          titleLast:' 使用北玻MES系统!',
          quit:"退出",
      },
      basicData:{
          untask:'无任务',
          tonumber:'上片总数量',
          finishnumber:'已完成数量',
          rackreset:'架子复位',
          prackreset:'是否架子复位?',
          laserprinting:'打标机就绪状态:',
          cuttingmachine:'切割机就绪状态:',
          machine:'上片机联机状态:',
          machineaa:'上片机手动状态:',
          selectproject:"选择工程",
          startloading:'开始上片',
          stop:'暂停',
          yes:'确认',
          change:'切换',
          projectnumber:'工程号',
          glasswidth:'原片宽',
          glassheight:'原片高',
          coatingtypes:'膜系',
          coatingtypesa:'膜系:',
          quantity:'数量',
          quantitya:'数量:',
          thickness:'厚度',
          thicknessa:'厚度:',
          startstatus:'启用状态',
          pass:'通过',
          waiting:'等待中',
          up:'上片中',
          finish:'已完成',
          project:'工程',
          plselectproject:'请选择工程',
          confirm:'确认',
          cancel:'取消',
          startfilm:'是否开始上片?',
          whetherpause:'是否暂停?',
          station:'工位',
          width:'宽',
          widtha:'宽:',
          height:'高',
          heighta:'高:',
          operate:'操作',
          add:'添加',
          delete:'删除',
          addglass:'添加原片',
          selectwidth:'请选择宽',
          selectheight:'请选择高',
          selectcoatingtypes:'请选择膜系',
          selectthickness:'请选择厚度',
          selectquantity:'请输入数量',
          pause:'第二行和第四行的高必须大于2700才能保存!',
          pausea:'请确认打标机和切割机的就绪状态!',
          infonull:'工程号不能为空!',
          updatanull:'该工程未保存到上片表!',
          glassnull:'更新玻璃状态时发生错误',
          deletemessage:'是否删除该条信息?',
          layoutSequence:'序号',
      },
      sorter:{
          onesort:'一线掰片',
          twosort:'二线掰片',
          inPlace:'到位',
          ninPlace:'未到位',
          emptymissions:'空任务',
          advancetask:'进片任务',
          outputtasks:'出片任务',
          schedulingtasks:'调度任务',
          advancerequests:'进片请求',
          releaserequest:'出片请求',
          straighttasks:'直通任务',
          endingtask:'结束',
          another:'其他',
          id:'磨边前理片笼表ID',
          remainWidth:'剩余',
          taskRunning:'任务请求',
          updateTime:'更新时间',
          place:'是否到位',
          layernow:'当前层号',
          gridnumber:'栅格号',
          glassnumber:'玻璃编号',
          width:'宽',
          height:'高',
          startstatus:'启用状态',
          disable:'已禁用',
          start:'已启用',
          deficiencieste:'报缺',
          updown:'人工下片',
          operate:'操作',
          prompt:'提示',
          information:'是否报缺该条信息?',
          infor:'是否人工下片该条信息?',
          yes:'是',
          cancel:'取消',
      },
      order:{
          projectnumber:'请输入工程号',
          dilapidation:'破损',
          takeaway:'人工拿走',
          takeawaya:'是否人工拿走该条信息?',
          takeon:'摆片完成',
      },
      searchOrder:{
          furnaces:'满炉炉数',
          furnfullTemp:'玻璃总量',
          startCell:'目标层号',
          endCell:'预留层号',
          begin:'开始',
          finish:'完成',
          uncar:'未上车',
          inkage:'进片',
          successfullyprocessed:'任务成功处理',
          psuccessfullyprocessed:'是否进行任务成功处理?',
          taskfailure:'任务失败处理',
          ptaskfailure:'是否进行任务失败处理?',
          totallogarithms:'总对数',
          numberpairs:'配对数',
          numberoccupied:'占用格子数',
          totalfurnaces:'总炉数',
          cagesnumber:'笼内数量',
          slotnumber:'占有格子数',
          progress:'进度%',
          whethersame:'是否相同',
          same:'相同',
          notsame:'不相同',
          partask:'任务重置',
          partasks:'是否任务重置?',
          empty:'默认空任务',
          historicaltasks:'历史任务',
          cagedetails:'笼内详情',
          inkageEntity:'进片联机状态:',
          requestEntity:'进片请求状态:',
          mesReplyEntity:'启动命令:',
          outInkageEntity:'出片联机状态:',
          outRequestEntity:'出片请求状态:',
          breakagn:'未破损',
          lacknumber:'缺片数量',
          processcard:'指定流程卡',
          filminformation:'人工下片信息',
          currentglassinformation:'扫码枪当前玻璃信息',
          printlabels:'打印标签',
          deleteTask:'结束工程',
          pdeleteTask:'是否结束工程?',
          searchlayout:'非钢化流程卡查询',
          fullfurnaces:'满炉数量',
          specifiedproject:'当前指定工程',
          undesignate:'取消钢化',
          allnumber:'总数量',
          numbercages:'笼子内数量',
          missingquantity:'缺少数量',
          breakquantity:'破损/拿走数量',
          ceng:'层',
          cageinformation:'理片笼信息',
          productionqueue:'出片队列',
          outputglassID:'出片玻璃ID',
          startposition:'起始位置',
          targetlocation:'目标位置',
          trips:'车次',
          number:'序号',
          taskstatus:'任务状态',
          filmenter:'等待进片',
          infilm:'进行中',
          endtask:'结束任务',
          completetask:'完成任务',
          intoglassid:'进片玻璃ID',
          line:'线路',
          Usage:'使用率',
          free:'空闲(格子数)',
          addcage:'添加理片笼信息',
          glassIDa:'玻璃ID:',
          glassID:'玻璃ID',
          inglassID:'请输入玻璃ID',
          pieceingrid:'小片在格内的顺序',
          pieceingrida:'小片在格内的顺序:',
          inpieceingrid:'请输入小片在格内的顺序',
          cardnumber:'流程卡号',
          cardnumbera:'流程卡号:',
          incardnumber:'请输入流程卡号',
          typeglass:'玻璃类型',
          typeglassa:'玻璃类型:',
          intypeglass:'请输入玻璃类型',
          width:'宽',
          widtha:'宽:',
          inwidth:'请输入宽',
          height:'高',
          heighta:'高:',
          inheight:'请输入高',
          coatingtypes:'膜系',
          thickness:'厚度',
          thicknessa:'厚度:',
          inthickness:'请输入厚度',
          layoutID:'钢化版图ID',
          layoutIDa:'钢化版图ID:',
          inlayoutID:'请输入钢化版图ID',
          picturesequence:'钢化版图片序',
          picturesequencea:'钢化版图片序:',
          inpicturesequence:'请输入钢化版图片序',
          startstatus:'启用状态',
          startstatusa:'启用状态:',
          instartstatus:'请输入启用状态',
          glassgaps:'玻璃间隙',
          glassgapsa:'玻璃间隙:',
          inglassgaps:'请输入玻璃间隙',
          sure:'确认',
          cancel:'取消',
          operate:'操作',
          breakage:'破损',
          delete:'删除',
          outfilm:'出片',
          cagetableID:'大理片笼表ID',
          cagenumber:'理片笼号',
          gridnumber:'栅格号',
          gridnumbera:'栅格号:',
          grid:'请输入栅格号',
          enable:'已启用',
          disable:'已禁用',
          remainingwidth:'剩余宽度',
          add:'添加',
          sheetID:'钢化小片信息表ID',
          processcards:'流程卡',
          processcardtype:'流程卡玻璃类型',
          acceptshorizontal:'钢化是否接受横放',
          xcoordinates:'x坐标',
          ycoordinates:'y坐标',
          rotationangle:'旋转角度(逆时针)',
          state:'状态',
          takeout:'拿走',
          deletemessage:'是否删除该条信息?',
          prompt:'提示',
          yes:'是',
          accept:'接受',
          noaccept:'不接受',
          filmcomplete:'出片完成',
          waiting:'等待中',
          broke:'是否破损该条信息?',
          brokeb:'是否拿走该条信息?',
          outfil:'是否出片该条信息?',
          inputid:'请输入玻璃ID',
          search:'搜索',
          tabid:'大理片笼详情表id',
          tid:'设备id',
          tida:'设备id:',
          fin:'是否完成任务?',
          sureadd:'确认添加',
          sureadda:'是否确认添加?',
          zailong:'在笼中',
          rengongxp:'人工下片',
          up:'上一页',
          down:'下一页',
          now:'当前页显示',
          tit:'条数据',
          temperingqueries:'钢化查询',
          specifytempering:'指定一炉',
          specifyout:'指定人工出片',
          specifyengineerid:'指定工程',
          projectnumber:'工程号',
          layoutnumber:'钢化版图号',
          numberglasses:'玻璃数量',
          specifytemperinga:'请确认设备是否已关闭MES联机?',
          temperedswitch:'钢化开关',
          dutyinformation:'值班信息',
          process:'工序',
          team:'班组',
          basic:'设备',
          makesure:'确认保存',
          temperingtotal:'钢化炉数:',
          glasstotal:'玻璃总数:',
          Labelprinting:'标签打印',
          Schedulingswitch:'调度开关',
      },
      workOrder:{
          upnumber:'上片位编号',
          glassID:'玻璃ID',
          height:'高',
          width:'宽',
          thickness:'厚度',
          coatingtypes:'膜系',
          coatingtypesbe:'原片膜系',
          productionsequence:'出片顺序',
          cardnumber:'流程卡号',
          operate:'操作',
          messagedamaged:'是否破损该条信息?',
          prompt:'提示',
          yes:'是',
          cancel:'取消',
          takemessage:'是否拿走该条信息?',
          breakage:'破损',
          takeout:'拿走',
          glasstype:'玻璃膜系',
          line:'线路',
          status:'状态',
          time:'时间段',
          cway:'请选择线路',
          cstate:'请选择状态',
          edgingone:'磨边一线',
          edgingtwo:'磨边二线',
          nedging:'未磨边',
          edging:'磨边中',
          finedging:'已磨边',
      },
      processCard:{
          intofurnace:'进炉中',
          beforefurnace:'进炉前',
          outfurnace:'已出炉玻璃',
          print:'拿走打印',
          printing:'打印',
          projectnumber:'请输入工程号',
          inquire:'查询',
          project:'工程号',
          awayprocess:'拿走工序',
          awayequipment:'拿走设备',
          awayteam:'拿走班组',
          flowcard:'流程卡',
          layer:'层号',
          temperinglayout:'炉号',
          temperingfeed:'片序',
          width:'宽',
          height:'高',
          thickness:'厚',
          glasstakeout:'玻璃拿走清单',
          layoutID:'版图ID',
          glassID:'玻璃ID',
      },
      reportWork:{
          details:'落架详情',
          filming:'人工下片',
          printing:'自动打印',
          cenumber:'层数',
          artificialorder:'人工下片数',
          processcard:'打印流程卡',
          printlabels:'打印标签',
          information:'落架信息',
          cstation:'请选择工位',
          all:'全部',
          timeperiod:'时间段',
          stationnumber:'工位号',
          order:'顺序',
          filminformation:'人工下片信息',
          glassmation:'人工下片当前玻璃信息',
          barcodescanner:'扫码枪当前玻璃信息',
          lowerbit:'下片位',
          shelfnumber:'架号',
          cardnumber:'流程卡号',
          totalquantity:'总数量',
          beendropped:'已落架数量',
          state:'状态',
          devicenumber:'设备号',
          startstatus:'启用状态',
          enable:'已启用',
          unenable:'未启用',
          operate:'操作',
          bindingshelves:'绑定架子',
          clear:'清空',
          workstation:'号工位',
          shelfnumbera:'架号:',
          cardnumbera:'流程卡号:',
          incardnumber:'请选择流程卡号',
          clearglass:'清除架子玻璃',
          sure:'确认',
          cancel:'取消',
          glassinformation:'玻璃信息',
          glassID:'玻璃ID',
          coatingtypes:'膜系',
          thickness:'厚度',
          width:'宽度',
          height:'高度',
      },
      productStock:{
          addconfigName:'添加配置',
          editconfigName:'修改配置',
          configName:'配置名',
          configNamea:'配置名:',
          configCode:'配置代码',
          configValue:'配置值',
          configValuea:'配置值:',
          addusers:'添加用户',
          username:'用户名',
          usernamea:'用户名:',
          inusername:'请输入用户名',
          role:'角色',
          rolea:'角色:',
          inrole:'请选择角色',
          test:'测试',
          admin:'管理员',
          operate:'操作',
          resetpassword:'重置密码',
          exit:'编辑',
          delete:'删除',
          prompt:'提示',
          repassword:'是否重置用户密码?',
          yes:'是',
          cancel:'取消',
          reusername:'修改用户',
          addusername:'添加用户',
          password:'密码:',
          sure:'确认',
          inpassword:'请输入密码',
          deusername:'是否删除该用户?',
      },
      customer:{
          addmenua:'添加二级菜单',
          addmenu:'添加一级菜单',
          firstmenu:'一级菜单栏',
          firstmenuname:'一级菜单名称:',
          link:'链接',
          inlink:'请输入链接',
          linka:'链接:',
          sort:'排序',
          insort:'请输入排序',
          sorta:'排序:',
          operate:'操作',
          exit:'编辑',
          delete:'删除',
          semenu:'二级菜单栏',
          semenuname:'二级菜单名称:',
          menu:'菜单栏:',
          inmenu:'请输入菜单名称',
          sure:'确认',
          cancel:'取消',
          exmene:'修改一级菜单',
          exmenea:'修改二级菜单',
          yes:'是',
          demenu:'是否删除该菜单?',
          prompt:'提示',
      },
      delivery:{
          addrole:'添加角色',
          editrole:'修改角色',
          role :'角色',
          rolea :'角色:',
          inrole :'请输入角色',
          operate :'操作',
          edit :'编辑',
          delete :'删除',
          yes:'是',
          sure :'确认',
          cancel :'取消',
          derole :'是否删除该角色',
          prompt:'提示',
          choice:'菜单权限:',
          inchoice:'请选择菜单权限',
      },
      replenish:{
          patchManagement:'补片管理',
      },
      rework:{
          reworkManagement:'返工管理',
          addRework:"返工新增 ",
      },
      role:{
          id:'ID',
          characterHomepage:'角色首页',
      },
      user:{
          userId:'用户ID',
          userHomepage:'用户首页',
      },
      orderBasicData:{
          order:'订单',
          orderType:'订单类型',
      },
      machine:{
          basicId:'设备编号',
          basicName:'设备名称',
          basicCategory:'所在工序',
          tempering:'钢化',
      },
      report:{
          productionReport:'生产报表',
          workInProgressReport:'在制品报表',
      },
      productionBasicData:{
          basicDataQuery :'基础数据查询',
      },
      mainIngredient:{
          materialInformation :'物料资料',
      },
      mainIngredientStock:{
          materialName :'物料名称',
          createTime :'返库日期',
      },
      large:{
          slice:'片',
          load:'切割',
          edg:'磨边',
          temp:'钢化',
          hollow:'中空',
          oneFinish:'一线完成',
          twoFinish:'二线完成',
          oneunFinish:'一线未完成',
          twounFinish:'二线未完成',
          ondDamage:'一线破损',
          percent:'进度百分比',
          time: '次破时间',
          tionnumber: '订单号',
          jobnumber: '报工编号',
          productionnumber: '生产订单号',
          cardnumber: '流程卡号',
          projectname: '项目名称',
          batch: '批次',
          detailID: '明细ID',
          building: '楼号',
          serialnumber: '订单序号',
          productname: '产品名称',
          serial: '工艺确认序号',
          slicemarker: '层号',
          numberpatches: '补片数量',
          width: '宽',
          height: '高',
          shape: '形状',
          responsibleprocess: '责任工序',
          process: '本工序',
          numberfractions: '次破未补数量',
          breakreason: '次破原因',
          breaktype: '次破类型',
          responsiblepersonnel: '责任人员',
          responsiblequipment: '责任设备',
          responsibleteam: '责任班组',
          area: '次破面积',
          inspector: '质检员',
          operate: '操作',
          mes: '详情',
          projectnumber: '工程单号',
          brokeno: '报次破未补',
          close: '关闭',
          orderId: '订单ID',
          order: '订单详情',
          customerName: '客户名称',
          project: '项目名称',
          are: '面积',
          quantity: '数量',
          warehousing: '状态',
          deliveryDate: '送货时间',
          notstocked: '未入库',
          inboundstatus: '部分入库状态',
          allstatus: '全部入库状态',
          completedquantity: '完成数量',
          scrapquantity: '报废数量',
          number: '数量',
          method: '加工方式',
          innumber: '已入数量',
          productstatus: '生产状态',
          right: '正常',
          stop: '终止',
          inquire: '查询',
          starttime :'开始时间',
          endtime :'结束时间',
          loading :'正在上片:',
          brokenNum:'破损数量',
          inventory:'库存',
          inventoryarea:'库存面积',
          shippedQuantity:'已发货数量',
          reportWorkQuantity:'完工数量',
          reportWorkQuantityCount:'破损数量',
          processId:'流程卡号',
          historicaltasks1:'原片仓储',
          historicaltasks2:'上片一线',
          historicaltasks3:'上片二线',
          historicaltasks4:'卧式一线',
          historicaltasks5:'卧式二线',
          historicaltasks6:'钢化大理片',
          historicaltasks7:'中空一线',
          historicaltasks8:'中空二线',
          historicaltasks9:'中空大理片',
          historicaltasks10:'生产统计',
          date:'日期',
          countOutOne: '切割一线数量',
          totalAreaOutOne: '切割一线面积',
          countOutTwo: '切割二线数量',
          totalAreaOutTwo: '切割二线面积',
          countIn: '钢化前大理片数量',
          totalAreaIn: '钢化前大理片面积',
          countOut: '钢化数量',
          totalAreaOut: '钢化面积',
          hollowCountOutOne: '中空一线数量',
          hollowTotalAreaOutOne: '中空一线面积',
          hollowCountOutTwo: '中空二线数量',
          hollowTotalAreaOutTwo: '中空二线面积',
      },
      reportmanage:{
          productiontime :'生产时间',
          starttime :'开始时间',
          endtime :'结束时间',
          ctype :'请选择类型',
          cstate :'请选择状态',
          cprocess :'请选择工序',
          all :'全部',
          completed :'完工',
          broke :'破损',
          takeout :'拿走',
          dreportwork :'未报工',
          pendingwork :'已现补',
          reportwork :'已报工',
          reportworked :'已同步',
          incise :'切割',
          edging :'磨边',
          steel :'钢化',
          inquire :'查询',
          signingwork :'报工',
          reporteam :'报工班组',
          reportingequipment :'报工设备',
          line :'线路',
          process :'工序',
          glassID :'玻璃ID',
          projectnumber :'工程号',
          layoutID :'钢化版图ID',
          type :'类型',
          state :'状态',
          processcards :'流程卡',
          number :'序号',
          layer :'层',
          typebreakage :'破损类型',
          ptypebreakage :' 请选择破损类型',
          causebreakage :'破损原因',
          pcausebreakage :'请选择破损原因',
          responsibleprocess :'责任工序',
          responsiblepersonnel :'责任人员',
          presponsiblepersonnel :'请输入责任人员',
          responsibleteam :'责任班组',
          presponsibleteam :'请选择责任班组',
          responsibleequipment :'责任设备',
          presponsibleequipment :'请选择责任设备',
          remark :'备注',
          premark :'请输入备注',
      },
      film:{
          resetnumber:'架子号',
          fail:'失败',
          mes:'原片仓储详情',
          warehousing:'原片入库',
          pwarehousing:'入库请求',
          wareout:'原片出库',
          information:'是否出库该条信息?',
          pwareout:'出库请求',
          position:'吊装位:',
          cposition:'请选择吊装位',
          position1:'吊装位1',
          position2:'吊装位2',
          addglass:'原片信息',
          operate: '操作',
          exit:'编辑',
          delete:'删除',
          outbound:'出库',
          deviceid:'设备ID',
          enablestatea:'启用标记',
          disable:'禁用',
          start:'启用',
          startslot:'开始工位',
          endslot:'目标工位',
          slotid:'格子ID',
          slot:'格子号',
          width:'原片宽',
          widtha:'原片宽:',
          inwidth:'请输入原片宽',
          height:'原片高',
          inheight:'请输入原片高',
          heighta:'原片高:',
          thickness:'原片厚度',
          inthickness:'请输入原片厚度',
          thicknessa:'原片厚度:',
          films:'膜系',
          infilms:'请输入膜系',
          filmsa:'膜系:',
          createtime:'创建时间',
          remainquantity:'剩余数量',
          thickremainquantity:'原片剩余数量(张):',
          thickremainquant:'原片剩余数量(张)',
          inquantity:'请输入数量',
          quantitya:'数量:',
          enableid:'任务ID',
          originateslot:'起始格子',
          endoriginateslot:'目标格子',
          patternquantity:'原片数量',
          enabletype:'任务类型',
          enablestate:'工位状态',
          finish:'已完成',
          unfinish:'未完成',
          dedelete:'是否删除该条内容?',
          dedisable:'是否禁用该条内容?',
          deoutbound:'是否出库该条内容?',
          selectwarehousing:'请选择吊装位',
          inwarehousing:'吊装位:',
          warehousing1:'吊装位1',
          warehousing2:'吊装位2',
          starttime :'开始时间',
          endtime :'结束时间',
          taskstatus :'任务状态',
          built :'新建',
          execution :'执行中',
          tasktype :'任务类型',
          stocke :'入库',
          dispatch :'调度',
          inquire :'查询',
          station :'工位',
      },
      Mounting:{
          previewproject: '选择预览工程',
          loadinglinea: '上片线',
          loadingline: '上片线:',
          inloadingline: '请选择上片线',
          oneloadingline: '一号上片线',
          twoloadingline: '二号上片线',
          waiting: '等待中',
          pass: '通过',
          setparameters: '设置参数',
          project: '工程号',
          projecta: '工程号:',
          width: '原片宽',
          height: '原片高',
          thickness: '原片厚',
          projectnumber: '工程原片序号',
          state: '状态',
          createtime: '创建时间',
          all: '全选',
          removalmethod: '请选择除膜方式',
          removalmethodp: '除膜方式',
          removalmethoda: '除膜方式:',
          noremoval: '不除膜',
          removal: '除膜',
          coarselyground: '粗磨',
          finegrinding: '精磨',
      },
    hellow: {
        clickmakesure: '是否确认点击?',
        logarithm: '对数:',
        totalPairQuantitya: '任务总配对数',
        pairQuantitya: '已出配对数',
        waitingout: '等待出片',
        finishout: '出片完成',
        hollowSequence: '中空顺序',
        isPair: '是否配对',
        no: '否',
        listFormula: '配方信息',
        HollowGlass: '队列信息',
        totalLayer: '总层数',
        totalPairQuantity: '总配对数量',
        pairQuantity: '已完成配对数量',
        isForceList: '是否强制',
        yesisForceList: '强制',
        noisForceList: '非强制',
        hollowCountOutOne: '中空一线玻璃数量',
        hollowCountOutTwo: '中空二线玻璃数量',
        hollowTotalAreaOutOne: '中空一线玻璃面积',
        hollowTotalAreaOutTwo: '中空二线玻璃面积',
        countIn: '钢化前大理片笼玻璃数量',
        countOut: '钢化玻璃数量',
        countOutOne: '切割一线玻璃数量',
        countOutTwo: '切割二线玻璃数量',
        totalAreaIn: '钢化前大理片笼玻璃面积',
        totalAreaOut: '钢化玻璃面积',
        totalAreaOutOne: '切割一线玻璃面积',
        totalAreaOutTwo: '切割二线玻璃面积',
        freeone: '一线空闲状态:',
        freetwo: '二线空闲状态:',
        freethree: '三线空闲状态:',
        casFour: '气体4',
        casFourb: '气体4:',
        casFoura: '请选择气体4',
        casOne: '气体1',
        casOneb: '气体1:',
        casOnea: '请选择气体1',
        casThree: '气体3',
        casThreeb: '气体3:',
        casThreea: '请选择气体3',
        casTwo: '气体2',
        casTwob: '气体2:',
        casTwoa: '请选择气体2',
        Y: '有',
        F: '无',
        frameFour: '间隔板4',
        frameFourb: '间隔板4:',
        frameFoura: '请输入间隔板4',
        frameOne: '间隔板1',
        frameOneb: '间隔板1:',
        frameOnea: '请输入间隔板1',
        frameThree: '间隔板3',
        frameThreeb: '间隔板3:',
        frameThreea: '请输入间隔板3',
        frameTwo: '间隔板2',
        frameTwob: '间隔板2:',
        frameTwoa: '请输入间隔板2',
        intervalFrameHeightOne: '间隔框高度1',
        intervalFrameHeightTwo: '间隔框高度2',
        intervalFrameHeightThree: '间隔框高度3',
        intervalFrameHeightFour: '间隔框高度4',
        intervalFrameHeightaOne: '请输入间隔框高度1',
        intervalFrameHeightaTwo: '请输入间隔框高度2',
        intervalFrameHeightaThree: '请输入间隔框高度3',
        intervalFrameHeightaFour:  '请输入间隔框高度4',
        intervalFrameHeightbOne: '间隔框高度1:',
        intervalFrameHeightbTwo: '间隔框高度2:',
        intervalFrameHeightbThree: '间隔框高度3:',
        intervalFrameHeightbFour:  '间隔框高度4:',
        intervalFrameTypeOne: '间隔框类型1',
        intervalFrameTypeTwo: '间隔框类型2',
        intervalFrameTypeThree: '间隔框类型3',
        intervalFrameTypeFour: '间隔框类型4',
        intervalFrameTypecOne: '请选择间隔框类型1',
        intervalFrameTypecTwo: '请选择间隔框类型2',
        intervalFrameTypecThree: '请选择间隔框类型3',
        intervalFrameTypecFour: '请选择间隔框类型4',
        intervalFrameTypedOne: '间隔框类型1:',
        intervalFrameTypedTwo: '间隔框类型2:',
        intervalFrameTypedThree: '间隔框类型3:',
        intervalFrameTypedFour: '间隔框类型4:',
        intervalFrameTypea: 'tps胶',
        intervalFrameTypeb: '铝间隔条',
        intervalFrameWidthOne: '间隔框宽度1',
        intervalFrameWidthTwo: '间隔框宽度2',
        intervalFrameWidthThree: '间隔框宽度3',
        intervalFrameWidthFour:  '间隔框宽度4',
        intervalFrameWidthaOne: '请输入间隔框宽度1',
        intervalFrameWidthaTwo: '请输入间隔框宽度2',
        intervalFrameWidthaThree: '请输入间隔框宽度3',
        intervalFrameWidthaFour:  '请输入间隔框宽度4',
        intervalFrameWidthbOne: '间隔框宽度1:',
        intervalFrameWidthbTwo: '间隔框宽度2:',
        intervalFrameWidthbThree: '间隔框宽度3:',
        intervalFrameWidthbFour:  '间隔框宽度4:',
        sealInsert: '密封嵌入',
        sealInsertb: '密封嵌入:',
        sealInserta: '请输入密封嵌入',
        hollowformula: '中空配方',
        hollowformuldet: '是否删除该中空配方?',
        hollowtaskdet: '是否删除该任务?',
        taskdet: '删除任务',
        edithollowformula: '修改中空配方',
        phollowformula: '请选择中空配方',
        hollowformulp: '中空配方:',
        bottomRemove: '下侧除膜量:',
        bottomRemovep: '下侧除膜量',
        bottomRemovea: '请输入下侧除膜量',
        topRemove: '上侧除膜量:',
        topRemovep: '上侧除膜量',
        topRemovea: '请输入上侧除膜量',
        leftRemove: '左侧除膜量:',
        leftRemovep: '左侧除膜量',
        leftRemovea: '请输入左侧除膜量',
        rightRemove: '右侧除膜量:',
        rightRemovep: '右侧除膜量',
        rightRemovea: '请输入右侧除膜量',
        formulaNamep: '配方名',
        formulaName: '配方名:',
        formulaNamea: '请输入配方名',
        stopproject: '暂停任务',
        pstopproject: '是否暂停任务?',
        reviewproject: '预览工程',
        line: '线路',
        linea: '线路:',
        line1: '线路一',
        line2: '线路二',
        line3: '线路三',
        createtask: '创建任务',
        starttask: '开始任务',
        pstarttask: '是否开始任务?',
        stoptask: '停止任务',
        pstoptask: '是否停止任务?',
        currenttask: '当前任务:',
        claimednumber: '已领取配对数量:',
        linenumber: '进入中空线数量:',
        order: '出片顺序',
        flowCardId: '流程卡',
        thickness: '厚度',
        coatingtypes: '膜系',
        layer: '层数',
        height: '长',
        width: '宽',
        state: '状态',
        cardnumber: '流程卡号',
        cardnumbera: '流程卡号:',
        layernumber: '层号',
        totalnumber: '总片数',
        pairsnumber: '已配对数量',
        missingnumber: '缺片数量',
        damagenumber: '破损数量',
        operate: '操作',
        claimquest: '领取任务',
        pclaimquest: '是否领取任务?',
        missingfilms: '缺片详情',
        forcedfilming: '强制出片',
        pforcedfilming: '是否强制出片?',
        brokenpieces: '破损片数',
        realpieces: '实际片数',
        route: '路线:',
        croute: '请选择路线',
        ptotalpairQuantity: '总配对数量:',
        cpairQuantity: '请输入总配对数量',
        schedulingswitch: '调度开关',
    },
    screendisplay:{
        pchoice: '请选择',
        pwidth: '请输入宽度',
        pheight: '请输入高度',
        upnumber: '上片数量',
    }
}
UI-Project/src/layout/MainErpView.vue
New file
@@ -0,0 +1,470 @@
<script setup>
import useUserInfoStore from '@/stores/userInfo'
import userInfo from '@/stores/userInfo'
import request from '@/utils/request'
import {ElMessage} from 'element-plus'
import {ref, watch, onMounted, onUnmounted } from 'vue'
import deepClone from '@/utils/deepClone'
import { useRouter } from 'vue-router';
import { useI18n } from 'vue-i18n'
import { provide } from 'vue';
// import {host, WebSocketHost} from '@/utils/constants'
// import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
const globalDate = ref('');
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
let userInfoStr = window.localStorage.getItem('userInfo')
// const userInfoStr = localStorage.getItem('userInfo');
// let userInfo = userInfoStr.user.token;
let token = userInfo; // 提取 token
// 退出登录方法
function quit() {
  // localStorage.removeItem('token');
  store.$patch({
              user: null,
              })
  router.push('/login')
}
// let socket = null;
// const socketUrl = `ws://${WebSocketHost}:${host}/api/loadGlass/api/talk/mainMes`;
// const handleMessage = (data) => {
//   if(data.globalDate!=null){
//     window.localStorage.setItem('getglobalDate', data.globalDate[0])
//   }else{
//     globalDate.value = ''
//       }
//     }
  function replaceChineseWithEnglish(menuData) {
      // 定义中俄文对照关系对象
       const translation  = {
    '上片机': 'Стол загрузки',
    '上片': 'Верхняя часть',
    '掰片/识别': 'Разлом/идентификация',
    '卧式缓存': ' Горизонтальный буфер',
    '磨边前卧式缓存': 'Горизонтальный буфер перед шлифовкой',
    '下片卧式缓存': 'Горизонтальный буфер стекла разгрузки',
    '磨边(冷加工)': 'Шлифовать края (холодная обработка)',
    '1线磨边(冷加工)': 'Шлифовать края 1 линии (холодная обработка)',
    '2线磨边(冷加工)': 'Шлифовать края 2 линии (холодная обработка)',
    '大理片笼': 'Буферная система',
    '钢化': 'Закалка',
    '钢化前': 'Перед закалки',
    '钢化后': 'После закалки',
    '下片台': 'Стол разгрузки',
    '系统管理': 'Управление системой',
    '用户管理': 'Управление пользователем',
    '权限管理': 'Управление полномочиями',
    '角色管理': 'Управление ролью',
    '可视化系统': 'Визуальная система',
    '报工管理': 'Управление отчетностью',
    '仓储中心': 'Складской центр',
    '原片仓储': 'Склад сырья',
     };
  menuData.forEach(menu => {
    menu.menuName = translation[menu.menuName] || menu.menuName;
    // if (menu.children) {
      menu.children && menu.children.forEach(submenu => {
        submenu.menuName = translation[submenu.menuName] || submenu.menuName;
      });
    // }
  });
}
function replaceChineseWithRussian(menuData) {
      // 定义中英文对照关系对象
   const translation  = {
    '上片机': 'Loading Machine',
    '上片一线': 'First line on film',
    '上片二线': 'Second line on film',
    '掰片/识别': 'Breaking /Identification',
    '掰片一线': 'Broken piece line',
    '掰片二线': 'Broken pieces with two lines',
    '卧式缓存': 'Horizontal cache',
    '卧式缓存一号线': 'Horizontal Cache 1',
    '卧式缓存二号线': 'Horizontal Cache 2',
    '磨边前卧式缓存': 'Horizontal buffer before edge grinding',
    '下片卧式缓存': 'Offline horizontal cache',
    '磨边(冷加工)': 'Grinding edge (cold processing)',
    '磨边(冷加工)': 'Grinding edge (cold processing)',
    '1线磨边(冷加工)': '1-line edge grinding (cold processing)',
    '2线磨边(冷加工)': '2-line edge grinding (cold processing)',
    '大理片笼': 'Dali slice cage',
    '钢化': 'Toughened',
    '钢化查询': 'Tempered steel inquiry',
    '钢化前': 'Before Tempering',
    '钢化后': 'After Tempering',
    '下片台': 'Next Stage',
    '系统管理': 'System Management',
    '用户管理': 'User Management',
    '权限管理': 'Rights Management',
    '角色管理': 'Roles',
    '系统配置': 'system configuration',
    '可视化系统': 'visualization system',
    '报工管理': 'Job reporting management',
    '仓储中心': 'Storage Center',
    '原片仓储': 'Original film storage',
    '中空': 'Hollow',
    '中空一线': 'Hollow Line',
    '中空二线': 'Hollow Second Line',
    '中空三线': 'Hollow three line',
    '中空理片笼': 'Hollow Film processing cage',
    '折铝框一线': '1 Fold aluminum frame',
    '折铝框二线': '2 Fold aluminum frame',
    '折铝框三线': '3 Fold aluminum frame',
    '大屏显示': 'Large Screen Display',
     };
  menuData.forEach(menu => {
    menu.menuName = translation[menu.menuName] || menu.menuName;
    // if (menu.children) {
      menu.children && menu.children.forEach(submenu => {
        submenu.menuName = translation[submenu.menuName] || submenu.menuName;
      });
    // }
  });
}
//提取菜单模块列表
let menuList = $ref([])
request.get('/loadGlass/sys/menu/getMenuTree').then((res) => {
  if (res.code == 200) {
    menuList = res.data
    // translateMenu(menuList.value, language.value);
      if (language.value === 'en') {
        replaceChineseWithRussian(menuList);
      }
      if (language.value === 'py') {
        replaceChineseWithEnglish(menuList);
      }
  } else {
    ElMessage.warning(res.msg)
    router.push('/login')
  }
})
request.post('/loadGlass/sys/menu/getNowDate').then((res) => {
  if (res.code == 200) {
      window.localStorage.setItem('getglobalDate', res.data)
  } else {
    ElMessage.warning(res.msg)
  }
})
const menu = ref(null)
let indexKey = ref(null)
function handleOpen(key) {
  indexKey.value = key
}
watch(
    indexKey,
    (newVal, oldVal) => {
      if (oldVal !== newVal && oldVal !== null) {
        menu.value.close(oldVal)
      }
    },
    {deep: true}
)
router.beforeEach((to, from) => {
  //return false
})
let openFlag = $ref(null)
//原始菜单打开
const openMenu = (menuID) => {
  if (menuID === openFlag) {
    openFlag = null
  } else {
    openFlag = menuID
  }
}
function toggleCollapse() {
  isCollapse.value = !isCollapse.value;
}
onMounted(() => {
  // fetchlack()
  // socket = initializeWebSocket(socketUrl, handleMessage);
});
// const fetchlack = async () => {
//   try  {
//     console.log(33333);
//     const response = await request.post('/loadGlass/sys/menu/getNowDate')
//     console.log(response.code);
//     if (response.code == 200) {
//       console.log(11111);
//       console.log(response.data);
//       console.log(2222);
//       // window.localStorage.setItem('getglobalDate', response.data)
//     } else {
//       ElMessage.error(response.message);
//     }
// }
// catch (error) {
//     // 处理错误
//   }
// }
  let getglobalDate = window.localStorage.getItem('getglobalDate')
  provide('globalDate', getglobalDate);
  // onUnmounted(() => {
    // if (socket) {
    // closeWebSocket(socket);
    // }
    // });
</script>
<template>
  <div id="all">
    <el-container>
      <el-header>
        <div style="height: 100%;width: 100%;display: flex;background-color: #fff;">
          <img src="../assets/northGlass.ico"
               alt=""  @click="toggleCollapse"
               style="max-width: 100%;max-height: 100%">
          <h3 style="margin: 1rem;font-weight: bold;width: 33vw;"> {{ $t('main.titleFirst') }}{{ userName }}{{ $t('main.titleLast') }}</h3>
          <span style="height: 70%;width: 78vw;margin-top: 1rem;">
            <!-- <el-button class="sys-quit"
                       @click="quit"
                       round>
              <el-icon size="large">
                <SwitchButton size=""/>{{ $t('main.quit') }}
              </el-icon>
            </el-button> -->
            <el-button class="sys-quit"
                       @click="quit"
                       round>
              <el-icon size="large">
                <SwitchButton size=""/>{{ $t('main.quit') }}
              </el-icon>
            </el-button>
            <!-- <div class="header-left">
              <el-button @click="toggleCollapse" style="height: 30px;">
               <el-icon><Expand /></el-icon>
              </el-button>
          </div> -->
          </span>
        </div>
      </el-header>
      <div id="line"></div>
      <el-container>
      <el-aside :width="isCollapse ? '0px' : '200px'" style="background-color: #fff;">
        <el-row :span="20">
            <el-menu :default-active="activePath" class="el-menu-vertical-demo" >
              <div class="menu">
            <div v-for="items in menuList">
              <div class='menu_title' v-show="!isCollapse"
                   @click="openMenu(items.id)">
                <span>☰</span>
                {{ items.menuName }}
              </div>
              <ul class='enter-x-left'
                  v-show="openFlag==items.id">
                <li v-for="menuItem in items.children"
                    style="margin-bottom:2px">
                  <router-link :to="{path:menuItem.url}">
                    {{ menuItem.menuName }}
                  </router-link>
                  </li>
                  </ul>
                  </div>
                  </div>
            </el-menu>
          </el-row>
</el-aside>
<el-main>
          <div id="main">
            <router-view></router-view>
          </div>
        </el-main>
      </el-container>
    </el-container>
  </div>
</template>
<style scoped>
.el-menu-vertical-demo:not(.el-menu--collapse) {
  width: 200px;
  min-height: 400px;
  text-align: left;
}
#all {
  background-color: #eee;
  height: 100%;
}
.el-container {
  height: 100vh;
  width: 99vw;
}
* {
  padding: 0;
  margin: 0;
}
:deep(.sys-quit) {
  float: right;
  margin-right: 1rem;
  width: 5rem;
}
/* 横线 */
#line {
  float: right;
  width: 100%;
  height: 1px;
  /* margin-top: 0.5em; */
  margin-bottom: 0.5em;
  background: #d4c4c4;
  position: relative;
  text-align: center;
}
:deep(span) {
  margin-right: 0;
}
.el-collapse {
  font-size: 16px;
  font-weight: bold;
}
#main {
  width: 99%;
  float: right;
  height: 99%;
  background-color: #fff;
}
/*------------*/
/* .menu div div{
  width: 138px;
  height: 35px;
  line-height: 35px;
  background: #C6E2FF;
  color: #000000;
  font-size: 16px;
  padding-left: 15px;
  transition: all 0.3s ease;
  cursor: pointer;
  position: relative;
  font-weight: bold;
  overflow: hidden;
  border-bottom: 12px ;
  margin-bottom:4px;
  text-align: left;
  cursor: pointer; */
/* border-radius:8px; */
/*   outline: none; */
/* background-color:#5CADFE; */
/* box-shadow: 0 8px 16px 0 rgba(0,0,0,0), 0 6px 5px 0 rgba(0,0,0,0.19); */
/* } */
.menu {
  width: 138px;
  height: 33px;
  line-height: 25px;
  color: #000000;
  font-size: 16px;
  padding-left: 15px;
  padding-right: 2px;
}
ul {
  height: auto;
  margin: 1px auto;
  text-align: center;
}
ul li {
  height: 28px;
  width: 180px;
  line-height: 30px;
  /* background: rgb(128, 128, 128); */
  color: #000000;
  padding-left: 36px;
  cursor: pointer;
  overflow: hidden;
  text-align: left;
  /* border-radius:8px; */
  /*   outline: none; */
  /* background: #5CADFE; */
  /* box-shadow: 0 8px 16px 0 rgba(0,0,0,0), 0 6px 5px 0 rgba(0,0,0,0.19); */
}
ul li:hover {
  /* background:#5CADFE ; */
  color: #ffffff;
}
ul li a {
  text-decoration: none;
  color: #000000;
  font-size: 14px;
}
ul li a:hover {
  color: #1087ff;
}
.item_divider {
  width: 118px;
  height: 0px;
  /* background-color: white;
  opacity: 0.8; */
  margin-bottom: 2px;
}
.item a {
  width: 138px;
  height: 35px;
  display: block;
  /* text-align: justify; */
  text-decoration: none;
  color: white;
  font-size: 14px;
  text-decoration: none;
}
.menu_title {
  width: 180px;
  /* white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;   */
  height: 45px;
  line-height: 55px;
  /* background: #fafafa; */
  color: rgb(43, 42, 42);
  font-size: 17px;
  padding-left: 15px;
  transition: all 0.3s ease;
  cursor: pointer;
  position: relative;
  font-weight: bold;
  overflow: hidden;
}
.menu_title:hover {
  /* background: #dedede; */
  color: #3b9af9;
}
.indicator {
  display: block;
  width: 40px;
  height: 35px;
  font-weight: bold;
  position: absolute;
  right: 0px;
  top: 0px;
  transition: all 0.3s ease;
  text-align: center;
}
/* 动画效果 */
.enter-x-left {
  z-index: 9;
  opacity: 0;
  animation: enter-x-left 0.4s ease-in-out 0.3s;
  animation-fill-mode: forwards;
  transform: translateX(-50px);
  transition: all 0.3s ease;
}
.enter-x-left:nth-child(1) {
  animation-delay: 0.1s;
}
.enter-x-left:nth-child(2) {
  animation-delay: 0.2s;
}
.enter-x-left:nth-child(3) {
  animation-delay: 0.3s;
}
.enter-x-left:nth-child(4) {
  animation-delay: 0.4s;
}
@keyframes enter-x-left {
  to {
    opacity: 1;
    transform: translateX(0);
  }
}
.header-left{
  margin-left: -350px;
}
</style>
UI-Project/src/main.js
New file
@@ -0,0 +1,34 @@
import './assets/main.css'
import {createApp} from 'vue'
import {createPinia} from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
import App from './App.vue'
import router from './router'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
import VXETable from 'vxe-table'
import 'vxe-table/lib/style.css'
import i18n from '@/lang'
// import Echarts from "vue-echarts"
// echarts.registerMap('china', china)
// Vue.prototype.$echarts = echarts
// app.component("v-chart", Echarts)
// app.config.globalProperties.$echarts = echarts
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
import 'babel-polyfill'
const app = createApp(App)
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
  app.component(key, component)
}
const pinia = createPinia()
pinia.use(piniaPluginPersistedstate )
app.use(VXETable)
app.use(pinia)
app.use(router)
// app.use(ElementPlus)
app.use(ElementPlus,{
    locale: zhCn,
})
app.use(i18n)
app.mount('#app')
UI-Project/src/router/index.js
New file
@@ -0,0 +1,514 @@
import {createRouter, createWebHashHistory} from 'vue-router'
// import i18n from '@/utils/lang'
// import User from '../views/sys/User.vue'
// import Role from '../views/sys/Role.vue'
// import Menu from '../views/sys/Menu.vue'
const router = createRouter({
  history: createWebHashHistory(),
  routes: [
    {
      path: '/',
      name: 'home',
      //component: HomeView
      component: () => import('../views/LoginView.vue')
    },
    {
      path: '/login',
      name: 'login',
      component: () => import('../views/LoginView.vue')
    },
    {
      path: '/new-page', // 新增的无需登录的页面
      name: 'newPage',
      component: () => import('../views/NewPage.vue')
    },
    {
      path: '/main',
      name: 'main',
      component: () => import('../layout/MainErpView.vue'),
      children:[
        {
          path: 'Temperedlayout',
          name: 'Temperedlayout',
          component: () => import('../views/TL/Temperedlayout/Temperedlayout.vue'),
          children:[
            {
             path: 'selectLayout',
              name: 'selectLayout',
              component: () => import('../views/TL/Temperedlayout/Temperedlayout.vue'),
            }
         ]
        },
        /*----------- 上片机 ----------------*/
      {
        path: 'Returns',
        name: 'return',
        component: () => import('../views/Returns/return.vue'),
        children:[
          {
            path: '/Returns/upreturns',
            name: 'upreturns',
            component: () => import('../views/Returns/upreturns.vue')
          },
          {
            path: '/Returns/upreturns2',
            name: 'upreturns2',
            component: () => import('../views/Returns/upreturns2.vue')
          },
          {
            path: '/Returns/upreturns3',
            name: 'upreturns3',
            component: () => import('../views/Returns/upreturns3.vue')
          },
        ]
      },
      /*----------- 掰片/识别 ----------------*/
    {
      path: 'Identify',
      name: 'ident',
      component: () => import('../views/Identify/ident.vue'),
      children: [
        {
          path: '/Identify/identify',
          name: 'identify',
          component: () => import('../views/Identify/identify.vue')
        },
        {
          path: '/Identify/identifwu',
          name: 'identifwu',
          component: () => import('../views/Identify/identifwu.vue')
        },
        {
          path: '/Identify/identifwutwo',
          name: 'identifwutwo',
          component: () => import('../views/Identify/identifwutwo.vue')
        },
      ]
    },
    /*----------- 卧式缓存 ----------------*/
  {
    path: 'Caching',
    name: 'Caching',
    component: () => import('../views/Caching/caching.vue'),
    children:[
      {
        path: '/Caching/cachingbefore',
        name: 'cachingbefore',
        component: () => import('../views/Caching/cachingbefore.vue')
      },
      {
        path: '/Caching/cachingun',
        name: 'cachingun',
        component: () => import('../views/Caching/cachingun.vue')
      },
    ]
  },
  /*----------- 磨边(冷加工) ----------------*/
{
  path: 'StockBasicData',
  name: 'Select',
  component: () => import('../views/StockBasicData/Select.vue'),
  children:[
    {
      path: '/StockBasicData/stockBasicData',
      name: 'stockBasicData',
      component: () => import('../views/StockBasicData/stockBasicData.vue')
    },
    {
      path: '/StockBasicData/stockBasicDatatwo',
      name: 'stockBasicDatatwo',
      component: () => import('../views/StockBasicData/stockBasicDatatwo.vue')
    },
    {
      path: '/StockBasicData/stockBasicyiwu',
      name: 'stockBasicyiwu',
      component: () => import('../views/StockBasicData/stockBasicyiwu.vue')
    },
  ]
},
/*----------- 大理片笼 ----------------*/
{
path: 'Slicecage',
name: 'Slicecage',
component: () => import('../views/Slicecage/slicecage.vue'),
children:[
  {
    path: '/Slicecage/slicecage',
    name: 'slicecage',
    component: () => import('../views/Slicecage/slicecage.vue')
  },
]
// {
//   path: '/slicecagehistory',
//   name: 'slicecagehistory',
//   component: () => import('../views/slicecagehistory.vue')
// },
},
/*----------- 钢化 ----------------*/
{
path: 'PurchaseReturn',
name: 'purchase',
component: () => import('../views/PurchaseReturn/purchase.vue'),
children:[
  {
    path: '/PurchaseReturn/purchaseReturn',
    name: 'purchaseReturn',
    component: () => import('../views/PurchaseReturn/purchaseReturn.vue')
  },
  {
    path: '/PurchaseReturn/purchaseStorage',
    name: 'purchaseStorage',
    component: () => import('../views/PurchaseReturn/purchaseStorage.vue')
  },
]
},
         /*----------- 仓储中心 ----------------*/
         {
          path: 'GlassStorage',
          name: 'GlassStorage',
          component: () => import('../views/GlassStorage/GlassStorage.vue'),
          children:[
            {
              path: '/GlassStorage/MaterialRackManagement',
              name: 'MaterialRackManagement',
              component: () => import('../views/GlassStorage/MaterialRackManagement.vue')
            },
            {
              path: '/GlassStorage/rawfilmstorage',
              name: 'rawfilmstorage',
              component: () => import('../views/GlassStorage/rawfilmstorage.vue')
            },
            {
              path: '/GlassStorage/rawfilmstorage2',
              name: 'rawfilmstorage2',
              component: () => import('../views/GlassStorage/rawfilmstorage2.vue')
            }
          ]
        },
         /*----------- 可视化系统 ----------------*/
         {
          path: 'Visualization',
          name: 'screen',
          component: () => import('../views/Visualization/screen.vue'),
          children:[
            {
              path: '/Visualization/screenone',
              name: 'screenone',
              component: () => import('../views/Visualization/screenone.vue')
            },
            {
              path: '/Visualization/screentwo',
              name: 'screentwo',
              component: () => import('../views/Visualization/screentwo.vue')
            },
            {
              path: '/Visualization/screenthree',
              name: 'screenthree',
              component: () => import('../views/Visualization/screenthree.vue')
            }
          ]
         },
/*----------- 系统管理 ----------------*/
{
  path: 'User',
  name: 'user',
  component: () => import('../views/User/user.vue'),
  children:[
    {
      path: '/User/userlist',
      name: 'userlist',
      component: () => import('../views/User/userlist.vue')
    },
    {
      path: '/User/rolelist',
      name: 'rolelist',
      component: () => import('../views/User/rolelist.vue')
    },
    {
      path: '/User/permissions',
      name: 'permissions',
      component: () => import('../views/User/permissions.vue')
    },
    {
      path: '/User/userpageNo',
      name: 'userpageNo',
      component: () => import('../views/User/userpageNo.vue')
    }
  ]
 },
  /*----------- 显示 ----------------*/
  {
    path: 'largescreen',
    name: 'largescreen',
    component: () => import('../views/largescreen/largescreen.vue'),
    children:[
      {
        path: '/largescreen/largescreen',
        name: 'largescreen',
        component: () => import('../views/largescreen/largescreen.vue')
      },
    ]
  },
  /*----------- 报工管理 ----------------*/
  {
    path: 'reportWork',
    name: 'reportWork',
    component: () => import('../views/ReportWork/reportWork.vue'),
    children: [
      {
        path: '/ReportWork/reportWork',
        name: 'reportWork',
        component: () => import('../views/ReportWork/reportWork.vue')
      },
    ]
  },
  /*----------- 大屏显示 ----------------*/
  {
    path: 'largescreendisplay',
    name: 'screendisplay',
    component: () => import('../views/largescreendisplay/screendisplay.vue'),
    children: [
      {
        path: '/largescreendisplay/screendisplay',
        name: 'screendisplay',
        component: () => import('../views/largescreendisplay/screendisplay.vue')
      },
    ]
  },
        /*----------- 中空 ----------------*/
        {
          path: 'hollow',
          name: 'hol',
          component: () => import('../views/hollow/hol.vue'),
          children: [
            {
              path: '/hollow/hollowequipment',
              name: 'hollowequipment',
              component: () => import('../views/hollow/hollowequipment.vue')
            },
            {
              path: '/hollow/hollowequipmenttwo',
              name: 'hollowequipmenttwo',
              component: () => import('../views/hollow/hollowequipmenttwo.vue')
            },
            {
              path: '/hollow/hollowequipmenthree',
              name: 'hollowequipmenthree',
              component: () => import('../views/hollow/hollowequipmenthree.vue')
            },
            {
              path: '/hollow/hollowslicecage',
              name: 'hollowslicecage',
              component: () => import('../views/hollow/hollowslicecage.vue')
            },
            {
              path: '/hollow/hollowaluminum',
              name: 'hollowaluminum',
              component: () => import('../views/hollow/hollowaluminum.vue')
            },
            {
              path: '/hollow/hollowaluminumtwo',
              name: 'hollowaluminumtwo',
              component: () => import('../views/hollow/hollowaluminumtwo.vue')
            },
            {
              path: '/hollow/hollowaluminumthree',
              name: 'hollowaluminumthree',
              component: () => import('../views/hollow/hollowaluminumthree.vue')
            },
          ]
        },
        /*----------- 管理系统 ----------------*/
        {
          path: 'sys',
          name: 'screen',
          component: () => import('../views/Visualization/screen.vue'),
          children: [
            // {
            //   path: '/sys/users',
            //   name: 'SysUser',
            //   component: User
            // },
            // {
            //   path: '/sys/roles',
            //   name: 'SysRole',
            //   component: Role
            // },
            // {
            //   path: '/sys/menus',
            //   name: 'SysMenu',
            //   component: Menu
            // },
          ]
        },
        // {
        //   path: '',
        //   redirect: '/hollow/hollowslicecage'
        // }
      ]
    },
    {
      path: '/register',
      name: 'register',
      component: () => import('../views/RegisterView.vue')
    },
    {
       path: '/slicecagehistory',
        name: 'slicecagehistory',
        component: () => import('../views/Slicecage/slicecagehistory.vue'),
        children: [
          {
           path: '/Slicecage/slicecagehistory',
           name: 'slicecagehistory',
           component: () => import('../views/Slicecage/slicecagehistory.vue')
          },
        ]
       },
       {
          path: '/hellowslicecagehistory',
           name: 'hellowslicecagehistory',
           component: () => import('../views/hollow/hellowslicecagehistory.vue'),
           children: [
             {
              path: '/hollow/hellowslicecagehistory',
              name: 'hellowslicecagehistory',
              component: () => import('../views/hollow/hellowslicecagehistory.vue')
             },
           ]
          },
          {
             path: '/hellowquiphistory',
              name: 'hellowquiphistory',
              component: () => import('../views/hollow/hellowquiphistory.vue'),
              children: [
                {
                 path: '/hollow/hellowquiphistory',
                 name: 'hellowquiphistory',
                 component: () => import('../views/hollow/hellowquiphistory.vue')
                },
              ]
             },
             {
                path: '/hellowquiptwohistory',
                 name: 'hellowquiptwohistory',
                 component: () => import('../views/hollow/hellowquiptwohistory.vue'),
                 children: [
                   {
                    path: '/hollow/hellowquiptwohistory',
                    name: 'hellowquiptwohistory',
                    component: () => import('../views/hollow/hellowquiptwohistory.vue')
                   },
                 ]
                },
                {
                   path: '/hellowquipthreehistory',
                    name: 'hellowquipthreehistory',
                    component: () => import('../views/hollow/hellowquipthreehistory.vue'),
                    children: [
                      {
                       path: '/hollow/hellowquipthreehistory',
                       name: 'hellowquipthreehistory',
                       component: () => import('../views/hollow/hellowquipthreehistory.vue')
                      },
                    ]
                   },
          {
             path: '/cachingbeforehistory',
              name: 'cachingbeforehistory',
              component: () => import('../views/Caching/cachingbeforehistory.vue'),
              children: [
                {
                 path: '/Caching/cachingbeforehistory',
                 name: 'cachingbeforehistory',
                 component: () => import('../views/Caching/cachingbeforehistory.vue')
                },
              ]
             },
             {
              path: '/cachingunhistory',
               name: 'cachingunhistory',
               component: () => import('../views/Caching/cachingunhistory.vue'),
               children: [
                 {
                  path: '/Caching/cachingunhistory',
                  name: 'cachingunhistory',
                  component: () => import('../views/Caching/cachingunhistory.vue')
                 },
               ]
              },
              {
               path: '/rawhistory',
                name: 'rawhistory',
                component: () => import('../views/GlassStorage/rawhistory.vue'),
                children: [
                  {
                   path: '/GlassStorage/rawhistory',
                   name: 'rawhistory',
                   component: () => import('../views/GlassStorage/rawhistory.vue')
                  },
                ]
               },
               {
                path: '/stockhistory',
                 name: 'stockhistory',
                 component: () => import('../views/StockBasicData/stockhistory.vue'),
                 children: [
                   {
                    path: '/StockBasicData/stockhistory',
                    name: 'stockhistory',
                    component: () => import('../views/StockBasicData/stockhistory.vue')
                   },
                 ]
                },
                {
                 path: '/upreturnhistory',
                  name: 'upreturnhistory',
                  component: () => import('../views/Returns/upreturnhistory.vue'),
                  children: [
                    {
                     path: '/Returns/upreturnhistory',
                     name: 'upreturnhistory',
                     component: () => import('../views/Returns/upreturnhistory.vue')
                    },
                  ]
                 },
                 {
                  path: '/upreturnhistory2',
                   name: 'upreturnhistory2',
                   component: () => import('../views/Returns/upreturnhistory2.vue'),
                   children: [
                     {
                      path: '/Returns/upreturnhistory2',
                      name: 'upreturnhistory2',
                      component: () => import('../views/Returns/upreturnhistory2.vue')
                     },
                   ]
                  },
                  {
                   path: '/statistics',
                    name: 'statistics',
                    component: () => import('../views/largescreendisplay/statistics.vue'),
                    children: [
                      {
                       path: '/largescreendisplay/statistics',
                       name: 'statistics',
                       component: () => import('../views/largescreendisplay/statistics.vue')
                      },
                    ]
                   },
  ]
})
// 导航守卫
router.beforeEach((to, from, next) => {
  const isAuthenticated = !!localStorage.getItem('authToken'); // 假设这是你的登录状态检查逻辑
  if (to.matched.some(record => record.meta.requiresAuth) && !isAuthenticated) {
    next({ name: 'login' }); // 如果需要登录但未登录,则重定向到登录页面
  } else {
    next(); // 否则继续导航
  }
});
export default router
UI-Project/src/stores/counter.js
New file
@@ -0,0 +1,12 @@
import { ref, computed } from 'vue'
import { defineStore } from 'pinia'
export const useCounterStore = defineStore('counter', () => {
  const count = ref(0)
  const doubleCount = computed(() => count.value * 2)
  function increment() {
    count.value++
  }
  return { count, doubleCount, increment }
})
UI-Project/src/stores/sd/product/productGlassType.js
New file
@@ -0,0 +1,11 @@
import {defineStore} from 'pinia'
import {ref} from "vue";
export  default defineStore("productGlassType",{
    state: () =>{
        let GlassType=$ref(['',''])
        return {
            GlassType
        }
    }
})
UI-Project/src/stores/tableData.js
New file
@@ -0,0 +1,225 @@
// tableData.js
import { ref } from 'vue';
export const tableData = ref([
  {
    location: '1',
    type: 'Type A',
    length: '100',
    height: '50',
    thickness: '10',
    quantity: '5',
    entry_time: '2024-06-19 10:00:00',
    batchnumber: '444',
    shelf_status: 1
  },
  {
    location: '2',
    type: 'Type B',
    length: '120',
    height: '60',
    thickness: '12',
    quantity: '10',
    entry_time: '2024-06-19 10:00:00',
    batchnumber: '444',
    shelf_status: 0
  },
  {
    location: '3',
    type: 'Type B',
    length: '120',
    height: '60',
    thickness: '12',
    quantity: '10',
    entry_time: '2024-06-19 10:00:00',
    batchnumber: '444',
    shelf_status: 1
  },
  {
    location: '4',
    type: 'Type B',
    length: '120',
    height: '60',
    thickness: '12',
    quantity: '10',
    entry_time: '2024-06-19 10:00:00',
    batchnumber: '444',
    shelf_status: 1
  },
  {
    location: '5',
    type: 'Type B',
    length: '120',
    height: '60',
    thickness: '12',
    quantity: '10',
    entry_time: '2024-06-19 10:00:00',
    batchnumber: '444',
    shelf_status: 1
  },
  {
    location: '1',
    type: 'Type A',
    length: '100',
    height: '50',
    thickness: '10',
    quantity: '5',
    entry_time: '2024-06-19 10:00:00',
    batchnumber: '444',
    shelf_status: 1
  },
  {
    location: '2',
    type: 'Type B',
    length: '120',
    height: '60',
    thickness: '12',
    quantity: '10',
    entry_time: '2024-06-19 10:00:00',
    batchnumber: '444',
    shelf_status: 0
  },
  {
    location: '3',
    type: 'Type B',
    length: '120',
    height: '60',
    thickness: '12',
    quantity: '10',
    entry_time: '2024-06-19 10:00:00',
    batchnumber: '444',
    shelf_status: 1
  },
  {
    location: '4',
    type: 'Type B',
    length: '120',
    height: '60',
    thickness: '12',
    quantity: '10',
    entry_time: '2024-06-19 10:00:00',
    batchnumber: '444',
    shelf_status: 1
  },
  {
    location: '5',
    type: 'Type B',
    length: '120',
    height: '60',
    thickness: '12',
    quantity: '10',
    entry_time: '2024-06-19 10:00:00',
    batchnumber: '444',
    shelf_status: 1
  },{
    location: '1',
    type: 'Type A',
    length: '100',
    height: '50',
    thickness: '10',
    quantity: '5',
    entry_time: '2024-06-19 10:00:00',
    batchnumber: '444',
    shelf_status: 1
  },
  {
    location: '2',
    type: 'Type B',
    length: '120',
    height: '60',
    thickness: '12',
    quantity: '10',
    entry_time: '2024-06-19 10:00:00',
    batchnumber: '444',
    shelf_status: 0
  },
  {
    location: '3',
    type: 'Type B',
    length: '120',
    height: '60',
    thickness: '12',
    quantity: '10',
    entry_time: '2024-06-19 10:00:00',
    batchnumber: '444',
    shelf_status: 1
  },
  {
    location: '4',
    type: 'Type B',
    length: '120',
    height: '60',
    thickness: '12',
    quantity: '10',
    entry_time: '2024-06-19 10:00:00',
    batchnumber: '444',
    shelf_status: 1
  },
  {
    location: '5',
    type: 'Type B',
    length: '120',
    height: '60',
    thickness: '12',
    quantity: '10',
    entry_time: '2024-06-19 10:00:00',
    batchnumber: '444',
    shelf_status: 1
  },{
    location: '1',
    type: 'Type A',
    length: '100',
    height: '50',
    thickness: '10',
    quantity: '5',
    entry_time: '2024-06-19 10:00:00',
    batchnumber: '444',
    shelf_status: 1
  },
  {
    location: '2',
    type: 'Type B',
    length: '120',
    height: '60',
    thickness: '12',
    quantity: '10',
    entry_time: '2024-06-19 10:00:00',
    batchnumber: '444',
    shelf_status: 0
  },
  {
    location: '3',
    type: 'Type B',
    length: '120',
    height: '60',
    thickness: '12',
    quantity: '10',
    entry_time: '2024-06-19 10:00:00',
    batchnumber: '444',
    shelf_status: 1
  },
  {
    location: '4',
    type: 'Type B',
    length: '120',
    height: '60',
    thickness: '12',
    quantity: '10',
    entry_time: '2024-06-19 10:00:00',
    batchnumber: '444',
    shelf_status: 1
  },
  {
    location: '5',
    type: 'Type B',
    length: '120',
    height: '60',
    thickness: '12',
    quantity: '10',
    entry_time: '2024-06-19 10:00:00',
    batchnumber: '444',
    shelf_status: 1
  }
  // Add more data as needed
]);
UI-Project/src/stores/userInfo.js
New file
@@ -0,0 +1,19 @@
import {defineStore} from 'pinia'
import {ref} from "vue";
// import {createWebSocket, global_callback1} from "@/utils/webSocket";
export  default defineStore("userInfo",{
    state: () =>{
        let user=ref(null)
        return {
            user
        }
    },
    actions:{
        // createWebSocket(){
        //     createWebSocket(global_callback1)
        // }
    },
    persist: true//数据持久化,防止刷新数据消失
})
UI-Project/src/utils/WebSocketService.js
New file
@@ -0,0 +1,34 @@
// WebSocketService.js
let socket = null;
export const initializeWebSocket = (socketUrl, messageHandler) => {
  let messages='' ;
    if (typeof WebSocket === "undefined") {
      return null;
    }
    const socket = new WebSocket(socketUrl);
    socket.onopen = function () {
    };
    socket.onmessage = (msg) => {
      if (!msg.data) {
        return;
      }
      const isLastChunk = msg.data.endsWith('<END>');
      //是否为最后一块消息
      messages += msg.data;
      if(isLastChunk||msg.data.length<50000) {
        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/api.js
New file
@@ -0,0 +1,205 @@
// src/services/api.js
import request from '../utils/request';
import { ElMessage } from 'element-plus';
 // Replace with your actual backend base URL
// Function to find list of raw usages
const BASE_URL = 'glassStorage/api/rawUsage';
const taskBASE_URL = 'glassStorage/api/storageTask';
export const findTasks = () => {
  const url = `glassStorage/api/storageTask/findTasks`;
  const options = {
    method: 'get',
    url,
    json: true,
  };
  return new Promise((resolve, reject) => {
    request(options, (error, response, body) => {
      if (error) {
        reject(new Error(error.message));
      } else {
        resolve(body);
      }
    });
  });
};
export const findList = (params) => {
  const url = `${BASE_URL}/findList`;
  const options = {
    method: 'post',
    url,
    json: true,
    body: params
  };
  return new Promise((resolve, reject) => {
    request(options, (error, response, body) => {
      if (error) {
        reject(new Error(error.message));
      } else {
        resolve(body);
      }
    });
  });
};
// Function to find raw usage by ID
export const findById = (id) => {
  const url = `${BASE_URL}/${id}`;
  const options = {
    method: 'get',
    url,
    json: true
  };
  return new Promise((resolve, reject) => {
    request(options, (error, response, body) => {
      if (error) {
        reject(new Error(error.message));
      } else {
        resolve(body);
      }
    });
  });
};
// Function to insert a new raw usage
export const insertRawUsage = (rawUsage) => {
  const url = `${BASE_URL}`;
  const options = {
    method: 'post',
    url,
    json: true,
    body: rawUsage
  };
  return new Promise((resolve, reject) => {
    request(options, (error, response, body) => {
      if (error) {
        reject(new Error(error.message));
      } else {
        resolve(body);
      }
    });
  });
};
export const updateRawUsage = async (rawUsage) => {
  try {
    const response = await request.post(`${BASE_URL}/updaterawUsage`, rawUsage);
    ElMessage.success('修改成功');
    return response.data;
  } catch (error) {
    ElMessage.error('修改失败');
    throw error;
  }
};
export const deleteRawUsage = async (id) => {
  try {
    const response = await request.post(`${BASE_URL}/id`, id);
    ElMessage.success('删除原始使用数据成功');
    return response.data;
  } catch (error) {
    ElMessage.error('删除原始使用数据失败');
    throw error;
  }
};
export const inStorage = async (RawUsageAndShelfRack) => {
  try {
    const response = await request.post(`${BASE_URL}/inStorage`, RawUsageAndShelfRack);
    ElMessage.success('入库操作成功');
    return response.data;
  } catch (error) {
    ElMessage.error('入库操作失败');
    throw error;
  }
};
export const outStorage = async (RawUsageAndShelfRack) => {
  try {
    const response = await request.post(`${BASE_URL}/outStorage`, RawUsageAndShelfRack);
    ElMessage.success('出库操作成功');
    return response.data;
  } catch (error) {
    ElMessage.error('出库操作失败');
    throw error;
  }
};
export const taskUpdate = async (task) => {
  try {
    const response = await request.post(`${taskBASE_URL}/taskUpdate`, task);
    return response.data;
  } catch (error) {
    throw error;
  }
};
const API_URL = 'glassStorage/api/shelfRack';  // Adjust this based on your actual API URL
export const shelfRackfindList = (params) => {
  return request.post(`${API_URL}/findList`, params)
    .then(response => response.data)
    .catch(error => {
      throw error;  // Handle errors appropriately in your frontend
    });
};
export const shelfRackfindById = (id) => {
  return request.get(`${API_URL}/${id}`)
    .then(response => response.data)
    .catch(error => {
      throw error;
    });
};
export const insertShelfRack = (shelfRack) => {
  return request.post(`${API_URL}`, shelfRack)
    .then(response => response.data)
    .catch(error => {
      throw error;
    });
};
export const updateShelfRack = (shelfRack) => {
  return request.put(`${API_URL}`, shelfRack)
    .then(response => response.data)
    .catch(error => {
      throw error;
    });
};
export const shelfRackdeleteById = (id) => {
  return request.delete(`${API_URL}/${id}`)
    .then(response => response.data)
    .catch(error => {
      throw error;
    });
};
export const findShelfRack = () => {
  return request.get(`${API_URL}/findshelfrack`)
    .then(response => response.data)
    .catch(error => {
      throw error;
    });
};
UI-Project/src/utils/constants.js
New file
@@ -0,0 +1,7 @@
//  export const WebSocketHost = "192.168.2.100";
// export const WebSocketHost = "192.168.0.39";
// export const WebSocketHost = "10.153.19.150";
// export const WebSocketHost = "10.153.19.47";
// export const WebSocketHost = "10.153.19.162";
export const WebSocketHost = "127.0.0.1";
export const host = "88";
UI-Project/src/utils/deepClone.js
New file
@@ -0,0 +1,16 @@
//深度拷贝,使数据进行绑定显示
export default  function deepClone(obj){
    // 对常见的“非”值,直接返回原来值
    if([null, undefined, NaN, false].includes(obj)) return obj;
    if(typeof obj !== "object" && typeof obj !== 'function') {
        //原始类型直接返回
        return obj;
    }
    var o = Array.isArray(obj) ? [] : {};
    for(let i in obj) {
        if(obj.hasOwnProperty(i)){
            o[i] = typeof obj[i] === "object" ? deepClone(obj[i]) : obj[i];
        }
    }
    return o;
}
UI-Project/src/utils/evicePixelRatio.js
New file
@@ -0,0 +1,53 @@
class DevicePixelRatio {
    constructor() {
      this.bodyElement = document.getElementsByTagName('body')[0]; // 缓存 body 元素
    }
    // 判断是否为 Windows 系统
    isWindowsSystem() {
      const agent = navigator.userAgent.toLowerCase();
      return agent.indexOf("windows") >= 0;
    }
    // 通用事件绑定工具
    addHandler(element, type, handler) {
      if (element.addEventListener) {
        element.addEventListener(type, handler, false);
      } else if (element.attachEvent) {
        element.attachEvent("on" + type, handler);
      } else {
        element["on" + type] = handler;
      }
    }
    // 校正浏览器缩放比例
    correctZoom() {
      if (this.bodyElement) {
        // 使用 1 / window.devicePixelRatio 来调整 zoom
        this.bodyElement.style.zoom = 1 / window.devicePixelRatio;
      }
    }
    // 监听页面缩放(使用防抖优化)
    watchResize() {
      let timer = null;
      this.addHandler(window, 'resize', () => {
        if (timer) clearTimeout(timer);
        timer = setTimeout(() => {
          this.correctZoom();
        }, 200); // 延迟 200ms 执行,避免频繁触发
      });
    }
    // 初始化页面比例校正
    init() {
      if (this.isWindowsSystem()) {
        // 初始化校正
        this.correctZoom();
        // 开启监听
        this.watchResize();
      }
    }
  }
  export default DevicePixelRatio;
UI-Project/src/utils/request.js
New file
@@ -0,0 +1,42 @@
import axios from 'axios'
import useUserInfoStore from '@/stores/userInfo'
import {host, WebSocketHost} from '@/utils/constants'
const userStore=useUserInfoStore()
const request = axios.create({
   baseURL: `http://${WebSocketHost}:${host}/api`, // 注意!! 这里是全局统一加上了 后端接口前缀 前缀,后端必须进行跨域配置!
   timeout: 30000
})
//
// request 拦截器
// 可以自请求发送前对请求做一些处理
// 比如统一加token,对请求参数统一加密
request.interceptors.request.use(config => {
   config.headers['Content-Type'] = 'application/json;charset=utf-8';
   if(userStore.user){
      config.headers['token'] = userStore.user.token;
   }
   // 设置请求头
   return config
}, error => {
    return Promise.reject(error)
});
// response 拦截器
// 可以在接口响应后统一处理结果
request.interceptors.response.use(
   response => {
      let res = response.data;
      // 如果是返回的文件
      if (response.config.responseType === 'blob') {
          return res
      }
      // 兼容服务端返回的字符串数据
      if (typeof res === 'string') {
          res = res ? JSON.parse(res) : res
      }
      return res;
   },
   error => {
       return Promise.reject(error)
   }
)
export default request
UI-Project/src/utils/unloadrequest.js
New file
@@ -0,0 +1,48 @@
import axios from 'axios'
import config from '../../config';
import useUserInfoStore from '@/stores/userInfo'
const userStore=useUserInfoStore()
const unloadrequest = axios.create({
    baseURL: `http://${config.serverUrl2}`,  // 注意!! 这里是全局统一加上了 后端接口前缀 前缀,后端必须进行跨域配置!
    timeout: 5000
})
//
// request 拦截器
// 可以自请求发送前对请求做一些处理
// 比如统一加token,对请求参数统一加密
unloadrequest.interceptors.request.use(config => {
    config.headers['Content-Type'] = 'application/json;charset=utf-8';
    if(userStore.user){
        config.headers['token'] = userStore.user.token;
    }
      // 设置请求头
    return config
}, error => {
    return Promise.reject(error)
});
// response 拦截器
// 可以在接口响应后统一处理结果
unloadrequest.interceptors.response.use(
    response => {
        let res = response.data;
        // 如果是返回的文件
        if (response.config.responseType === 'blob') {
            return res
        }
        // 兼容服务端返回的字符串数据
        if (typeof res === 'string') {
            res = res ? JSON.parse(res) : res
        }
        return res;
    },
    error => {
        return Promise.reject(error)
    }
)
export default unloadrequest
UI-Project/src/views/Caching/caching.vue
New file
@@ -0,0 +1,44 @@
<script setup>
import {ArrowLeftBold, ArrowRight, Search} from "@element-plus/icons-vue"
import {useRouter} from "vue-router";
let indexFlag=$ref(1)
function changeRouter(index){
  indexFlag=index
}
</script>
<template>
  <!-- <div id="main-div"> -->
    <div id="main-body">
      <router-view  />
    </div>
  <!-- </div> -->
</template>
<style scoped>
#main-div{
  width: 100%;
  height: 100%;
}
#div-title{
  height: 2%;
  width: 100%;
}
#searchButton{
  margin-top: -5px;
  margin-left: 1rem;
}
/* #searchButton1{
//margin-left: 10rem;
} */
/*main-body样式*/
#main-body{
  width: 100%;
  height: 95%;
  /* margin-top: 1%; */
}
#select{
  margin-left:0.5rem;
}
:deep(.indexTag .el-breadcrumb__inner){
  color: #5CADFE !important;
}
</style>
UI-Project/src/views/Caching/cachingbefore.vue
New file
@@ -0,0 +1,548 @@
<script setup>
import {onBeforeUnmount, onMounted, onUnmounted, ref, reactive} from "vue";
import {useRouter} from "vue-router"
import {host, WebSocketHost} from '@/utils/constants'
import dayjs from 'dayjs';
import request from "@/utils/request"
import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
import {ElMessage, ElMessageBox} from 'element-plus'
import {useI18n} from 'vue-i18n'
import { inject } from 'vue';
const globalDate = inject('globalDate');
const {t} = useI18n()
let language = ref(localStorage.getItem('lang') || 'zh')
const tableDataa = ref([])
const tableDatab = ref([])
const tableDatad = ref([])
const adjustedRects = ref([]);
const selectValuesa = reactive([]);
const timeRange = ref([])
const taskState = ref('')
const taskStat = ref('')
const taskType = ref('')
const glassId = ref('')
const blindb = ref(false)
let socket = null;
const socketUrl = `ws://${WebSocketHost}:${host}/api/cacheGlass/api/talk/cacheGlassOne`;
const handleMessage = (data) => {
  const cageInfo = data.taskMessage[0];
  if (cageInfo && cageInfo.createTime) {
    cageInfo.formattedCreateTime = formatTimestamp(cageInfo.createTime);
  }
  if (cageInfo && cageInfo.updateTime) {
    cageInfo.formattedupdateTime = formatTimestamp(cageInfo.updateTime);
  }
  tableDataa.value = data.EdgStorageCageinfos[0]
  tableDatab.value = data.taskMessage
  adjustedRects.value = data.EdgStorageCageinfos[0].map((rect, index) => ({
      ...rect,
      id: rect.id * 9,
      showRect: !!data.EdgStorageCageinfos[0][index]?.details[0]
    }));
  };
// 格式化后端时间并计算一周前的时间
const defaultTime = ref<[Date, Date]>([new Date(), new Date()]);
function parseAndSetTime() {
  const backendTime = new Date(globalDate);
  const oneWeekAgo = new Date(backendTime.getTime() - 7 * 24 * 60 * 60 * 1000); // 减去7天
  oneWeekAgo.setHours(0, 0, 0, 0);
  timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)];
  window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
}
  onMounted(() => {
  socket = initializeWebSocket(socketUrl, handleMessage);
  parseAndSetTime();
});
// 历史任务
const iframeUrl = ref('');
const handlehistorical = (row) => {
  blindb.value = true;
  iframeUrl.value = `${window.location.origin}/#/Caching/cachingbeforehistory`;
};
// 历史任务
// const historical = async () => {
//   try {
//   let startTime = window.localStorage.getItem('startTime')
//   var url="/cacheGlass/edgStorageDeviceTaskHistory?deviceId="+1 + "&startTime=" + startTime + "&endTime=" + globalDate + "&glassId=" + '' + "&taskState=" + '' + "&taskType=" + '';
//       const response = await request.get(url)
//       if (response.code == 200) {
//         ElMessage.success(response.message);
//         tableDatad.value = response.data;
//       } else {
//         ElMessage.error(response.message);
//     }
// }
// catch (error) {
//     console.error(error);
//   }
// }
const sethistorical = async () => {
  try {
    const params = {
      deviceId: 1,
      startTime: (timeRange.value && timeRange.value[0]) || '',
      endTime: (timeRange.value && timeRange.value[1]) || '',
      glassId: glassId.value || '',
      taskState: taskStat.value,
      taskType: taskType.value || ''
    };
    // 构建查询字符串
    const queryString = new URLSearchParams(params).toString();
    const url = `/cacheGlass/edgStorageDeviceTaskHistory?${queryString}`;
      const response = await request.get(url)
      if (response.code == 200) {
        ElMessage.success(response.message);
        tableDatad.value = response.data;
      } else {
        ElMessage.error(response.message);
    }
}
catch (error) {
  }
}
// 破损
 const handletake = async(row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('workOrder.messagedamaged'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const response = await request.post("/cacheGlass/edgStorageCageDetails/edgDetailsOperate", {
        glassId: row.glassId,
        state: 8,
        line: 1,
        workingProcedure: '理片笼',
    })
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
      ElMessage.error(response.msg);
      }
    }
  } catch (error) {
  }
};
// 拿走
 const handleBindRack = async(row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('workOrder.takemessage'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const response = await request.post("/cacheGlass/edgStorageCageDetails/edgDetailsOperate", {
        glassId: row.glassId,
        state: 9,
        line: 1,
        workingProcedure: '理片笼',
    })
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
      ElMessage.error(response.msg);
      }
    }
  } catch (error) {
  }
};
// 任务重置
const handleptask = async() => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.partasks'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
 if (confirmResult === 'confirm') {
  var url="/cacheGlass/edgStorageDeviceTask/resetTask?deviceId="+ 1;
      const response = await request.post(url)
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
      ElMessage.error(response.msg);
      }
    }
  } catch (error) {
  }
};
// 任务成功处理
const successfull = async() => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.psuccessfullyprocessed'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
 if (confirmResult === 'confirm') {
  var url="/cacheGlass/edgStorageDeviceTask/taskSuccess?deviceId="+ 1;
      const response = await request.post(url)
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
      ElMessage.error(response.msg);
      }
    }
  } catch (error) {
  }
};
 // 删除
 const handledelete = async(row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.deletemessage'),
      t('searchOrder.prompt'),
      {
        confirmButtonText: t('searchOrder.yes'),
        cancelButtonText: t('searchOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const response = await request.post("/cacheGlass/edgStorageCageDetails/removeEdgDetails?glassId="+encodeURIComponent(row.glassId))
    if (response.code === 200) {
     ElMessage.success(response.message);
      } else {
      ElMessage.error(response.message);
      }
    }
  } catch (error) {
  }
};
const rowClassName = ({ row }) => {
  // 根据 enableState 设置行的 CSS 类
  return row.slot % 2 === 0 ? 'success-row' : '';
};
// 样式部分
const styles = `
  .success-row {
    --el-table-tr-bg-color: var(--el-color-info-light-9);
  }
`;
// 动态添加样式到组件
const styleElement = document.createElement('style');
styleElement.textContent = styles;
document.head.appendChild(styleElement);
const optionsa = [
  {
    value: 0,
    label: t('hellow.starttask'),
  },
  {
    value: 1,
    label: t('searchOrder.endtask'),
  }
]
const optionsb = [
  {
    value: 1,
    label: t('sorter.advancetask'),
  },
  {
    value: 2,
    label: t('sorter.outputtasks'),
  },
  {
    value: 3,
    label: t('sorter.straighttasks'),
  }
]
function getStatusTypea(taskType) {
  switch (taskType) {
    case 1:
      return 'info';
    case 2:
      return 'success';
    case 3:
      return 'danger';
  }
}
function getStatusTexta(taskType) {
  switch (taskType) {
    case 1:
      return t('sorter.advancetask');
    case 2:
      return t('sorter.outputtasks');
    case 3:
      return t('sorter.straighttasks');
  }
}
function getStatusTypeb(taskState) {
  switch (taskState) {
    case 0:
      return 'info';
    case 1:
      return 'success';
  }
}
function getStatusTextb(taskState) {
  switch (taskState) {
    case 0:
      return t('hellow.starttask');
    case 1:
      return t('searchOrder.endtask');
  }
}
// 格式化时间戳为年月日时间字符串的函数
function formatTimestamp(timestamp) {
  const date = new Date(timestamp);
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始,需要加1,并补零
  const day = String(date.getDate()).padStart(2, '0'); // 补零
  const hours = String(date.getHours()).padStart(2, '0'); // 补零(如果需要显示时间)
  const minutes = String(date.getMinutes()).padStart(2, '0'); // 补零(如果需要显示时间)
  const seconds = String(date.getSeconds()).padStart(2, '0'); // 补零(如果需要显示时间)
  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
  onUnmounted(() => {
    if (socket) {
    closeWebSocket(socket);
    }
    });
onBeforeUnmount(() => {
  closeWebSocket();
});
</script>
<template>
  <div style="height: 500px;">
    <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;">
    <el-button style="margin-bottom: 15px;margin-left: 20px;" @click="handlehistorical" type="primary">{{ $t('searchOrder.historicaltasks') }}</el-button>
    <el-button style="margin-bottom: 15px;margin-left: 20px;" @click="handleptask()" type="warning">{{ $t('searchOrder.partask') }}</el-button>
    <el-button style="margin-bottom: 15px;margin-left: 20px;" @click="successfull()" type="success">{{ $t('searchOrder.successfullyprocessed') }}</el-button>
    <div style="position: relative; width: 100%; height: 100%;"> <!-- 添加相对定位 -->
  <div style="position: absolute; margin-top: 28px; left: 430px; display: flex; z-index: 10;"> <!-- 添加绝对定位 -->
    <div>{{ $t('searchOrder.projectnumber') }}</div>
    <div style="margin-left: 155px;">{{ $t('hellow.flowCardId') }}</div>
    <div style="margin-left: 152px;">{{ $t('searchOrder.glassID') }}</div>
    <div style="margin-left: 165px;">{{ $t('searchOrder.width') }}</div>
    <div style="margin-left: 185px;">{{ $t('searchOrder.height') }}</div>
    <div style="margin-left: 172px;">{{ $t('searchOrder.thickness') }}</div>
    <div style="margin-left: 145px;">{{ $t('hellow.operate') }}</div>
  </div>
    <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
      <el-table
      ref="table"
      style="margin-top: 20px; height: 360px;"
      :data="tableDataa"
      :header-cell-style="{ background: '#F2F3F5', color: '#1D2129' }"
      row-key="id"
  >
    <el-table-column prop="slot" align="center" :label="$t('sorter.gridnumber')" min-width="10" />
          <el-table-column
            align="center"
            :label="$t('sorter.startstatus')"
            min-width="10"
            prop="enableState"
          >
          <template #default="scope">
            <el-tag
              :type="scope.row.enableState === 1 ? 'success' : 'warning'"
            >
              {{ scope.row.enableState === 1 ? $t('sorter.start') : $t('sorter.disable') }}
            </el-tag>
          </template>
      </el-table-column>
        <el-table-column>
    <template #default="props">
      <el-table
      :header-cell-style="{ background: '#F2F3F5', color: '#1D2129' }"
      :data="props.row.details" style="width: 100%;height: 70px;">
        <el-table-column prop="engineerId" align="center" min-width="80" />
          <el-table-column prop="flowCardId" align="center" min-width="80" />
          <el-table-column prop="glassId" align="center" min-width="80" />
          <el-table-column prop="width" align="center"  min-width="80" />
          <el-table-column prop="height" align="center" min-width="80" />
          <el-table-column prop="thickness" align="center" min-width="80" />
    <el-table-column fixed="right" align="center" width="150">
        <template #default="scope">
          <el-button type="text" plain @click="handletake(scope.row)">{{ $t('searchOrder.breakage') }}</el-button>
          <el-button type="text" plain @click="handleBindRack(scope.row)">{{ $t('searchOrder.takeout')}} </el-button>
          <el-button type="text" plain @click="handledelete(scope.row)">{{ $t('searchOrder.delete')}} </el-button>
        </template>
      </el-table-column>
      </el-table>
      </template>
    </el-table-column>
  </el-table>
 </div>
</div>
      <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;margin-top: 15px;">
        <el-table height="90" ref="table"
        @selection-change="handleSelectionChange"
        :data="tableDatab" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
        <el-table-column prop="glassIdIn" align="center" :label="$t('searchOrder.intoglassid')" min-width="80" />
      <el-table-column prop="glassIdOut" align="center" :label="$t('searchOrder.outputglassID')" min-width="80" />
          <el-table-column prop="currentCell" align="center" :label="$t('sorter.layernow')" min-width="80" />
          <el-table-column prop="startCell" align="center" :label="$t('processCard.layer')" min-width="120" />
          <el-table-column
            align="center"
            :label="$t('film.taskstatus')"
            min-width="80"
            prop="taskState"
          >
          <template #default="scope">
        <el-tag :type="getStatusTypeb(scope.row.taskState)">
          {{ getStatusTextb(scope.row.taskState) }}
        </el-tag>
      </template>
          </el-table-column>
          <el-table-column
            align="center"
            :label="$t('film.enabletype')"
            min-width="80"
            prop="taskType"
          >
          <template #default="scope">
        <el-tag :type="getStatusTypea(scope.row.taskType)">
          {{ getStatusTexta(scope.row.taskType) }}
        </el-tag>
      </template>
          </el-table-column>
          <el-table-column prop="formattedCreateTime" align="center" :label="$t('film.createtime')" min-width="120" />
          <el-table-column prop="formattedupdateTime" align="center" :label="$t('sorter.updateTime')" min-width="120" />
        </el-table>
      </div>
    </el-card>
  <div class="awatch">
    <img src="../../assets/woshihuancun.png" alt="" style="width: 50%;height: 70%;margin-left: 30%;margin-top: 20px;position: relative;">
    <div style="position: relative; width: 500px;height: 95px;margin-top: -142px;margin-left: 600px;">
      <div
      v-for="(rect, index) in adjustedRects"
      v-show="rect.showRect"
      :key="rect"
      :style="{ position: 'absolute',
      top: `${rect.id}px`, left: `10px`, width: `422px`, height: `3px`,
      backgroundColor: '#409EFF'
       }"
    >
  </div>
  </div>
</div>
</div>
<!-- 历史任务 -->
<el-dialog v-model="blindb" top="5vh" width="95%" @close="iframeUrl=''">
     <iframe
     :src="iframeUrl"
     marginwidth="2000px"
     marginheight="2000px"
     width="100%"
     height="750px"
     frameborder="0"
     ></iframe>
  </el-dialog>
<!-- <el-dialog v-model="blindb" top="10vh" width="90%">
  <div style="display: flex;">
    <el-input v-model="glassId" style="margin-left: 10px;margin-bottom: 10px;width: 270px;" :placeholder="$t('searchOrder.inglassID')" />
            <el-select
            :placeholder="$t('searchOrder.taskstatus')"
             clearable
             style="width: 270px;margin-left: 10px;"
             v-model="taskStat">
               <el-option
                v-for="item in optionsa"
                :key="item.value"
                :label="item.label"
                :value="item.value"
              />
          </el-select>
          <el-select
            :placeholder="$t('film.enabletype')"
             clearable
             style="width: 270px;margin-left: 10px;"
             v-model="taskType">
               <el-option
                v-for="item in optionsb"
                :key="item.value"
                :label="item.label"
                :value="item.value"
              />
          </el-select>
          <span class="demonstration" style="margin-left: 20px;margin-top: 3px;">{{ $t('workOrder.time') }}</span>
            <el-date-picker v-model="timeRange" type="datetimerange" range-separator="至" :start-placeholder="$t('reportmanage.starttime')"
             style="margin-left: 15px;" value-format = "YYYY-MM-DD hh:mm:ss"
              :end-placeholder="$t('reportmanage.endtime')">
            </el-date-picker>
          <el-button type="primary" style="margin-left: 10px;margin-bottom: 10px;" @click="sethistorical()">{{
        $t('reportmanage.inquire')
      }}</el-button>
      </div>
    <el-table ref="table" style="margin-top: 20px;height: 650px;" :data="tableDatad" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
      <el-table-column prop="glassIdIn" align="center" :label="$t('searchOrder.intoglassid')" min-width="80" />
      <el-table-column prop="glassIdOut" align="center" :label="$t('searchOrder.outputglassID')" min-width="80" />
          <el-table-column prop="currentCell" align="center" :label="$t('sorter.layernow')" min-width="80" />
          <el-table-column prop="startCell" align="center" :label="$t('processCard.layer')" min-width="120" />
          <el-table-column
            align="center"
            :label="$t('film.taskstatus')"
            min-width="80"
            prop="taskState"
          >
          <template #default="scope">
        <el-tag :type="getStatusTypeb(scope.row.taskState)">
          {{ getStatusTextb(scope.row.taskState) }}
        </el-tag>
      </template>
          </el-table-column>
          <el-table-column
            align="center"
            :label="$t('film.enabletype')"
            min-width="80"
            prop="taskType"
          >
          <template #default="scope">
        <el-tag :type="getStatusTypea(scope.row.taskType)">
          {{ getStatusTexta(scope.row.taskType) }}
        </el-tag>
      </template>
          </el-table-column>
          <el-table-column prop="createTime" align="center" :label="$t('film.createtime')" min-width="120" />
          <el-table-column prop="updateTime" align="center" :label="$t('sorter.updateTime')" min-width="120" />
        </el-table>
        <template #footer>
      <div id="dialog-footer">
        <el-button @click="blindb = false">{{ $t('large.close') }}</el-button>
      </div>
    </template>
  </el-dialog> -->
</template>
<style scoped>
#dt { display:block; float:left;line-height: 20px;margin-left: 100px;}
#dta { display:block; float:left;line-height: 20px;margin-left: 80%;}
#dialog-footer{
  text-align: center;
  margin-top: -15px;
}
#message{
  text-align: center;
  align-items: center;
  color: black;
   width: 200px;
   height: 100px;
   background-color: #337ecc;
   margin-left: 28%;
}
.awatch{
  height: 460px;
  width: 1500px;
  max-width: 100%;
}
</style>
UI-Project/src/views/Caching/cachingbeforehistory.vue
New file
@@ -0,0 +1,412 @@
<template>
    <div>
  <div style="display: flex;width: 1770px;">
    <el-input v-model="glassId" clearable style="margin-left: 10px;margin-bottom: 10px;width: 200px;" :placeholder="$t('searchOrder.inglassID')" />
    <el-select
            :placeholder="$t('searchOrder.taskstatus')"
             clearable
             style="width: 270px;margin-left: 10px;"
             v-model="taskState">
               <el-option
                v-for="item in optionsa"
                :key="item.value"
                :label="item.label"
                :value="item.value"
              />
          </el-select>
          <el-select
            :placeholder="$t('film.enabletype')"
             clearable
             style="width: 270px;margin-left: 10px;"
             v-model="taskType">
               <el-option
                v-for="item in optionsb"
                :key="item.value"
                :label="item.label"
                :value="item.value"
              />
          </el-select>
          <el-date-picker
            style="margin-left: 15px;"
             v-model="timeRange"
             type="datetimerange"
             :shortcuts="shortcuts"
             range-separator="至"
             :start-placeholder="$t('reportmanage.starttime')"
             :end-placeholder="$t('reportmanage.endtime')"
           />
          <el-button type="primary" style="margin-left: 10px;margin-bottom: 10px;" @click="handleClick()">{{$t('reportmanage.inquire')}}</el-button>
     </div>
     <div style="margin-bottom: 10px;margin-top: 20px;margin-left: 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('hellow.countOutOne')"  style="width: 14vw">
                {{ countOutOne }}
              </el-form-item>
              </div>
          </el-col>
          <el-col :span="5">
            <div id="dta" style="font-size: 15px;">
          <el-form-item :label="$t('hellow.totalAreaOutOne')" style="width: 14vw">
                {{ totalAreaOutOne }}
              </el-form-item>
              </div>
          </el-col>
        </el-row>
      </el-form>
    </div>
        <el-table ref="table" style="margin-top: 20px;height: 580px;width: 1770px;" :data="tableDatax" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
      <el-table-column prop="glassIdIn" align="center" :label="$t('searchOrder.intoglassid')" min-width="80" />
      <el-table-column prop="glassIdOut" align="center" :label="$t('searchOrder.outputglassID')" min-width="80" />
      <el-table-column prop="currentCell" align="center" :label="$t('sorter.layernow')" min-width="80" />
      <el-table-column prop="startCell" align="center" :label="$t('searchOrder.startCell')" min-width="80" />
      <!-- <el-table-column prop="endCell" align="center" :label="$t('searchOrder.endCell')" min-width="80" /> -->
          <el-table-column
            align="center"
            :label="$t('film.taskstatus')"
            min-width="80"
            prop="taskState"
          >
          <template #default="scope">
        <el-tag :type="getStatusTypeb(scope.row.taskState)">
          {{ getStatusTextb(scope.row.taskState) }}
        </el-tag>
      </template>
          </el-table-column>
          <el-table-column
            align="center"
            :label="$t('film.enabletype')"
            min-width="80"
            prop="taskType"
          >
          <template #default="scope">
        <el-tag :type="getStatusTypea(scope.row.taskType)">
          {{ getStatusTexta(scope.row.taskType) }}
        </el-tag>
      </template>
          </el-table-column>
          <el-table-column prop="createTime" align="center" :label="$t('film.createtime')" min-width="100" />
          <el-table-column prop="updateTime" align="center" :label="$t('sorter.updateTime')" min-width="100" />
        </el-table>
  <div style="margin-top: 20px;margin-left: 40%;">
        <el-pagination
          v-model:current-page="currentPage2"
          :page-size="pageSize"
          :size="large"
          :disabled="disabled"
          layout="prev, pager, next, jumper"
          :total="totalRecords"
          @current-change="handlePageChange2"
          style="margin-top: 10px;"
      />
    </div>
  </div>
  </template>
<script lang="ts" setup>
import {useI18n} from 'vue-i18n'
import {useRouter} from "vue-router"
import request from "@/utils/request"
import {host, WebSocketHost} from '@/utils/constants'
import {onBeforeUnmount, onMounted, onUnmounted, reactive, ref} from "vue";
import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
import {ElMessage, ElMessageBox} from 'element-plus'
const {t} = useI18n()
let language = ref(localStorage.getItem('lang') || 'zh')
import { inject } from 'vue';
const globalDate = inject('globalDate');
const router = useRouter()
const timeRange = ref([])
const selectValuesa = reactive([]);
const tableDatax = ref([])
const currentPage2 = ref(1)
const totalRecords = ref(0)
const totalAreaOutOne = ref(0)
const countOutOne = ref(0)
const glassId = ref('');
const startSlot = ref('');
const targetSlot = ref('');
const taskState = ref('');
const taskType = ref('');
let getglobalDate = window.localStorage.getItem('getglobalDate')
const historical = async () => {
  try {
  let startTime = window.localStorage.getItem('startTime')
      const response = await request.post("/cacheGlass/edgStorageDeviceTaskHistory", {
        deviceId: 1,
        pageNo: 1,
        pageSize: 20,
        glassId: glassId.value,
        taskState: '',
        taskType: '',
        startTime: startTime,
        endTime: getglobalDate
    })
      if (response.code == 200) {
        ElMessage.success(response.message);
        tableDatax.value = response.data.records;
        totalRecords.value = response.data.total/2 || 0
      } else {
        ElMessage.error(response.message);
    }
}
catch (error) {
  }
}
const Daily = async () => {
  try {
  let startTime = window.localStorage.getItem('startTime')
      const response = await request.post("/cacheGlass/edgStorageDeviceTaskHistory/queryEdgDailyProduction", {
        deviceId: 1,
        pageNo: 1,
        pageSize: 20,
        glassId: glassId.value,
        taskState: '',
        taskType: '',
        startTime: startTime,
        endTime: getglobalDate
    })
      if (response.code == 200) {
        countOutOne.value = response.data.countOutOne
        totalAreaOutOne.value = response.data.totalAreaOutOne
      } else {
        ElMessage.error(response.message);
    }
}
catch (error) {
  }
}
const handlePageChange2 = (newPage) => {
  currentPage2.value = newPage;
  window.localStorage.setItem('pagenumber', currentPage2.value)
  historicala(currentPage2.value);
  Dailya(currentPage2.value);
};
const historicala = async (page) => {
  try {
  let page = window.localStorage.getItem('pagenumber')
  let startTime = window.localStorage.getItem('startTime')
      const response = await request.post("/cacheGlass/edgStorageDeviceTaskHistory", {
        deviceId: 1,
        pageNo: page,
        pageSize: 20,
        glassId: glassId.value,
        taskState: taskState.value,
        taskType: taskType.value,
        beginDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[0])) || '',
        endDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[1])) || '',
    })
      if (response.code == 200) {
        ElMessage.success(response.message);
        tableDatax.value = response.data.records;
        totalRecords.value = response.data.total/2 || 0
      } else {
        ElMessage.error(response.message);
    }
}
catch (error) {
  }
}
const Dailya = async (page) => {
  try {
  let page = window.localStorage.getItem('pagenumber')
  let startTime = window.localStorage.getItem('startTime')
      const response = await request.post("/cacheGlass/edgStorageDeviceTaskHistory/queryEdgDailyProduction", {
        deviceId: 1,
        pageNo: page,
        pageSize: 20,
        glassId: glassId.value,
        taskState: taskState.value,
        taskType: taskType.value,
        beginDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[0])) || '',
        endDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[1])) || '',
    })
      if (response.code == 200) {
        countOutOne.value = response.data.countOutOne
        totalAreaOutOne.value = response.data.totalAreaOutOne
      } else {
        ElMessage.error(response.message);
    }
}
catch (error) {
  }
}
const handleClick = async () => {
  await sethistorical();
  await Dailyhistorical();
};
// 历史查询点击
const sethistorical = async () => {
  try {
  let startTime = window.localStorage.getItem('startTime')
  let page = window.localStorage.getItem('pagenumber')
  const response = await request.post("/cacheGlass/edgStorageDeviceTaskHistory", {
        deviceId: 1,
        pageNo: 1,
        pageSize: 20,
        glassId: glassId.value,
        taskState: taskState.value,
        taskType: taskType.value,
        beginDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[0])) || '',
        endDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[1])) || '',
    })
      if (response.code == 200) {
        currentPage2.value = 1;
        ElMessage.success(response.message);
        tableDatax.value = response.data.records;
        totalRecords.value = response.data.total/2 || 0
      } else {
        ElMessage.error(response.message);
    }
}
catch (error) {
  }
}
const Dailyhistorical = async () => {
  try {
  let startTime = window.localStorage.getItem('startTime')
  let page = window.localStorage.getItem('pagenumber')
  const response = await request.post("/cacheGlass/edgStorageDeviceTaskHistory/queryEdgDailyProduction", {
        deviceId: 1,
        pageNo: 1,
        pageSize: 20,
        glassId: glassId.value,
        taskState: taskState.value,
        taskType: taskType.value,
        beginDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[0])) || '',
        endDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[1])) || '',
    })
      if (response.code == 200) {
        countOutOne.value = response.data.countOutOne
        totalAreaOutOne.value = response.data.totalAreaOutOne
      } else {
        ElMessage.error(response.message);
    }
}
catch (error) {
  }
}
// 格式化时间戳为年月日时间字符串的函数
function formatTimestamp(timestamp) {
  const date = new Date(timestamp);
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始,需要加1,并补零
  const day = String(date.getDate()).padStart(2, '0'); // 补零
  const hours = String(date.getHours()).padStart(2, '0'); // 补零(如果需要显示时间)
  const minutes = String(date.getMinutes()).padStart(2, '0'); // 补零(如果需要显示时间)
  const seconds = String(date.getSeconds()).padStart(2, '0'); // 补零(如果需要显示时间)
  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
const shortcuts = [
  {
    text: '最近一周',
    value: () => {
      const backendTime = new Date(getglobalDate)
      const oneWeekAgo = new Date(getglobalDate)
      oneWeekAgo.setHours(0, 0, 0, 0);
      oneWeekAgo.setDate(oneWeekAgo.getDate() - 7)
      timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)]
      window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
    },
  },
  {
    text: '最近一个月',
    value: () => {
      const backendTime = new Date(getglobalDate)
      const oneWeekAgo = new Date(getglobalDate)
      oneWeekAgo.setHours(0, 0, 0, 0);
      oneWeekAgo.setMonth(oneWeekAgo.getMonth() - 1)
      timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)]
      window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
    },
  },
  {
    text: '最近三个月',
    value: () => {
      const backendTime = new Date(getglobalDate)
      const oneWeekAgo = new Date(getglobalDate)
      oneWeekAgo.setHours(0, 0, 0, 0);
      oneWeekAgo.setMonth(oneWeekAgo.getMonth() - 3)
      timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)]
      window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
},
  },
]
// 格式化后端时间并计算一周前的时间
const defaultTime = ref<[Date, Date]>([new Date(), new Date()]);
function parseAndSetTime() {
  const backendTime = new Date(getglobalDate);
  const oneWeekAgo = new Date(backendTime.getTime() - 7 * 24 * 60 * 60 * 1000); // 减去7天
  oneWeekAgo.setHours(0, 0, 0, 0);
  timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)];
  window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
}
function getStatusTypeb(taskState: number) {
  switch (taskState) {
    case 0:
      return 'primary';
    case 1:
      return 'success';
  }
}
function getStatusTextb(taskState: number) {
  switch (taskState) {
    case 0:
      return t('searchOrder.empty');
    case 1:
      return t('searchOrder.endtask');
  }
}
function getStatusTypea(taskType: number) {
  switch (taskType) {
    case 1:
      return 'primary';
    case 2:
      return 'success';
    case 3:
      return 'warning';
  }
}
function getStatusTexta(taskType: number) {
  switch (taskType) {
    case 1:
      return t('sorter.advancetask');
    case 2:
    return t('sorter.outputtasks');
    case 3:
    return t('sorter.straighttasks');
  }
}
const optionsa = [
  {
    value: 0,
    label: t('searchOrder.empty'),
  },
  {
    value: 1,
    label: t('searchOrder.endtask'),
  }
]
const optionsb = [
  {
    value: 1,
    label: t('sorter.advancetask'),
  },
  {
    value: 2,
    label: t('sorter.outputtasks'),
  },
  {
    value: 3,
    label: t('sorter.straighttasks'),
  }
]
onMounted(() => {
  parseAndSetTime();
  historical();
  Daily()
});
  </script>
  <style scoped>
  </style>
UI-Project/src/views/Caching/cachingun.vue
New file
@@ -0,0 +1,456 @@
<script setup>
import {onBeforeUnmount, onMounted, onUnmounted, ref, reactive} from "vue";
import {useRouter} from "vue-router"
import {host, WebSocketHost} from '@/utils/constants'
import dayjs from 'dayjs';
import request from "@/utils/request"
import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
import {ElMessage, ElMessageBox} from 'element-plus'
import {useI18n} from 'vue-i18n'
import { inject } from 'vue';
const globalDate = inject('globalDate');
const {t} = useI18n()
let language = ref(localStorage.getItem('lang') || 'zh')
const tableDataa = ref([])
const tableDatab = ref([])
const tableDatad = ref([])
const adjustedRects = ref([]);
const selectValuesa = reactive([]);
const timeRange = ref([])
const taskState = ref('')
const taskType = ref('')
const glassId = ref('')
const blindb = ref(false)
let socket = null;
const socketUrl = `ws://${WebSocketHost}:${host}/api/cacheGlass/api/talk/cacheGlassTwo`;
const handleMessage = (data) => {
  const cageInfo = data.taskMessage[0];
  if (cageInfo && cageInfo.createTime) {
    cageInfo.formattedCreateTime = formatTimestamp(cageInfo.createTime);
  }
  if (cageInfo && cageInfo.updateTime) {
    cageInfo.formattedupdateTime = formatTimestamp(cageInfo.updateTime);
  }
  tableDataa.value = data.EdgStorageCageinfos[0]
  tableDatab.value = data.taskMessage
  adjustedRects.value = data.EdgStorageCageinfos[0].map((rect, index) => ({
      ...rect,
      id: rect.id * 9,
      showRect: !!data.EdgStorageCageinfos[0][index]?.details[0]
    }));
  };
// 格式化后端时间并计算一周前的时间
const defaultTime = ref<[Date, Date]>([new Date(), new Date()]);
function parseAndSetTime() {
  const backendTime = new Date(globalDate);
  const oneWeekAgo = new Date(backendTime.getTime() - 7 * 24 * 60 * 60 * 1000); // 减去7天
  oneWeekAgo.setHours(0, 0, 0, 0);
  timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)];
  window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
}
  onMounted(() => {
  socket = initializeWebSocket(socketUrl, handleMessage);
  parseAndSetTime();
});
// 历史任务
const iframeUrl = ref('');
const handlehistorical = (row) => {
  blindb.value = true;
  iframeUrl.value = `${window.location.origin}/#/Caching/cachingunhistory`;
};
const sethistorical = async () => {
  try {
    const params = {
      deviceId: 2,
      startTime: (timeRange.value && timeRange.value[0]) || '',
      endTime: (timeRange.value && timeRange.value[1]) || '',
      glassId: glassId.value || '',
      taskState: taskState.value,
      taskType: taskType.value || ''
    };
    // 构建查询字符串
    const queryString = new URLSearchParams(params).toString();
    const url = `/cacheGlass/edgStorageDeviceTaskHistory?${queryString}`;
      const response = await request.get(url)
      if (response.code == 200) {
        ElMessage.success(response.message);
        tableDatad.value = response.data;
      } else {
        ElMessage.error(response.message);
    }
}
catch (error) {
  }
}
// 破损
 const handletake = async(row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('workOrder.messagedamaged'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const response = await request.post("/cacheGlass/edgStorageCageDetails/edgDetailsOperate", {
        glassId: row.glassId,
        state: 8,
        line: 2,
        workingProcedure: '理片笼',
    })
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
      ElMessage.error(response.msg);
      }
    }
  } catch (error) {
  }
};
// 拿走
 const handleBindRack = async(row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('workOrder.takemessage'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const response = await request.post("/cacheGlass/edgStorageCageDetails/edgDetailsOperate", {
        glassId: row.glassId,
        state: 9,
        line: 2,
        workingProcedure: '理片笼',
    })
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
      ElMessage.error(response.msg);
      }
    }
  } catch (error) {
  }
};
// 任务重置
const handleptask = async() => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.partasks'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
 if (confirmResult === 'confirm') {
  var url="/cacheGlass/edgStorageDeviceTask/resetTask?deviceId="+ 2;
      const response = await request.post(url)
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
      ElMessage.error(response.msg);
      }
    }
  } catch (error) {
  }
};
// 任务成功处理
const successfull = async() => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.psuccessfullyprocessed'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
 if (confirmResult === 'confirm') {
  var url="/cacheGlass/edgStorageDeviceTask/taskSuccess?deviceId="+ 2;
      const response = await request.post(url)
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
      ElMessage.error(response.msg);
      }
    }
  } catch (error) {
  }
};
 // 删除
 const handledelete = async(row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.deletemessage'),
      t('searchOrder.prompt'),
      {
        confirmButtonText: t('searchOrder.yes'),
        cancelButtonText: t('searchOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const response = await request.post("/cacheGlass/edgStorageCageDetails/removeEdgDetails?glassId="+encodeURIComponent(row.glassId))
    if (response.code === 200) {
     ElMessage.success(response.message);
      } else {
      ElMessage.error(response.message);
      }
    }
  } catch (error) {
  }
};
const rowClassName = ({ row }) => {
  // 根据 enableState 设置行的 CSS 类
  return row.slot % 2 === 0 ? 'success-row' : '';
};
// 样式部分
const styles = `
  .success-row {
    --el-table-tr-bg-color: var(--el-color-info-light-9);
  }
`;
// 动态添加样式到组件
const styleElement = document.createElement('style');
styleElement.textContent = styles;
document.head.appendChild(styleElement);
const optionsa = [
  {
    value: 0,
    label: t('hellow.starttask'),
  },
  {
    value: 1,
    label: t('searchOrder.endtask'),
  }
]
const optionsb = [
  {
    value: 1,
    label: t('sorter.advancetask'),
  },
  {
    value: 2,
    label: t('sorter.outputtasks'),
  },
  {
    value: 3,
    label: t('sorter.straighttasks'),
  }
]
function getStatusTypea(taskType) {
  switch (taskType) {
    case 1:
      return 'info';
    case 2:
      return 'success';
    case 3:
      return 'danger';
  }
}
function getStatusTexta(taskType) {
  switch (taskType) {
    case 1:
      return t('sorter.advancetask');
    case 2:
      return t('sorter.outputtasks');
    case 3:
      return t('sorter.straighttasks');
  }
}
function getStatusTypeb(taskState) {
  switch (taskState) {
    case 0:
      return 'info';
    case 1:
      return 'success';
  }
}
function getStatusTextb(taskState) {
  switch (taskState) {
    case 0:
      return t('hellow.starttask');
    case 1:
      return t('searchOrder.endtask');
  }
}
// 格式化时间戳为年月日时间字符串的函数
function formatTimestamp(timestamp) {
  const date = new Date(timestamp);
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始,需要加1,并补零
  const day = String(date.getDate()).padStart(2, '0'); // 补零
  const hours = String(date.getHours()).padStart(2, '0'); // 补零(如果需要显示时间)
  const minutes = String(date.getMinutes()).padStart(2, '0'); // 补零(如果需要显示时间)
  const seconds = String(date.getSeconds()).padStart(2, '0'); // 补零(如果需要显示时间)
  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
  onUnmounted(() => {
    if (socket) {
    closeWebSocket(socket);
    }
    });
onBeforeUnmount(() => {
  closeWebSocket();
});
</script>
<template>
  <div style="height: 500px;">
    <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;">
    <el-button style="margin-bottom: 15px;margin-left: 20px;" @click="handlehistorical" type="primary">{{ $t('searchOrder.historicaltasks') }}</el-button>
    <el-button style="margin-bottom: 15px;margin-left: 20px;" @click="handleptask()" type="warning">{{ $t('searchOrder.partask') }}</el-button>
    <el-button style="margin-bottom: 15px;margin-left: 20px;" @click="successfull()" type="success">{{ $t('searchOrder.successfullyprocessed') }}</el-button>
    <div style="position: relative; width: 100%; height: 100%;"> <!-- 添加相对定位 -->
  <div style="position: absolute; margin-top: 28px; left: 430px; display: flex; z-index: 10;"> <!-- 添加绝对定位 -->
    <div>{{ $t('searchOrder.projectnumber') }}</div>
    <div style="margin-left: 155px;">{{ $t('hellow.flowCardId') }}</div>
    <div style="margin-left: 152px;">{{ $t('searchOrder.glassID') }}</div>
    <div style="margin-left: 165px;">{{ $t('searchOrder.width') }}</div>
    <div style="margin-left: 185px;">{{ $t('searchOrder.height') }}</div>
    <div style="margin-left: 172px;">{{ $t('searchOrder.thickness') }}</div>
    <div style="margin-left: 145px;">{{ $t('hellow.operate') }}</div>
  </div>
    <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
      <el-table
      ref="table"
      style="margin-top: 20px; height: 360px;"
      :data="tableDataa"
      :header-cell-style="{ background: '#F2F3F5', color: '#1D2129' }"
      row-key="id"
  >
    <el-table-column prop="slot" align="center" :label="$t('sorter.gridnumber')" min-width="10" />
          <el-table-column
            align="center"
            :label="$t('sorter.startstatus')"
            min-width="10"
            prop="enableState"
          >
          <template #default="scope">
            <el-tag
              :type="scope.row.enableState === 1 ? 'success' : 'warning'"
            >
              {{ scope.row.enableState === 1 ? $t('sorter.start') : $t('sorter.disable') }}
            </el-tag>
          </template>
      </el-table-column>
        <el-table-column>
    <template #default="props">
      <el-table
      :header-cell-style="{ background: '#F2F3F5', color: '#1D2129' }"
      :data="props.row.details" style="width: 100%;height: 70px;">
        <el-table-column prop="engineerId" align="center" min-width="80" />
          <el-table-column prop="flowCardId" align="center" min-width="80" />
          <el-table-column prop="glassId" align="center" min-width="80" />
          <el-table-column prop="width" align="center" min-width="80" />
          <el-table-column prop="height" align="center" min-width="80" />
          <el-table-column prop="thickness" align="center" min-width="80" />
    <el-table-column fixed="right" align="center" width="150">
        <template #default="scope">
          <el-button type="text" plain @click="handletake(scope.row)">{{ $t('searchOrder.breakage') }}</el-button>
          <el-button type="text" plain @click="handleBindRack(scope.row)">{{ $t('searchOrder.takeout')}} </el-button>
          <el-button type="text" plain @click="handledelete(scope.row)">{{ $t('searchOrder.delete')}} </el-button>
        </template>
      </el-table-column>
      </el-table>
      </template>
    </el-table-column>
  </el-table>
 </div>
 </div>
      <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;margin-top: 15px;">
        <el-table height="90" ref="table"
        @selection-change="handleSelectionChange"
        :data="tableDatab" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
        <el-table-column prop="glassIdIn" align="center" :label="$t('searchOrder.intoglassid')" min-width="80" />
      <el-table-column prop="glassIdOut" align="center" :label="$t('searchOrder.outputglassID')" min-width="80" />
          <el-table-column prop="currentCell" align="center" :label="$t('sorter.layernow')" min-width="80" />
          <el-table-column prop="startCell" align="center" :label="$t('processCard.layer')" min-width="120" />
          <el-table-column
            align="center"
            :label="$t('film.taskstatus')"
            min-width="80"
            prop="taskState"
          >
          <template #default="scope">
        <el-tag :type="getStatusTypeb(scope.row.taskState)">
          {{ getStatusTextb(scope.row.taskState) }}
        </el-tag>
      </template>
          </el-table-column>
          <el-table-column
            align="center"
            :label="$t('film.enabletype')"
            min-width="80"
            prop="taskType"
          >
          <template #default="scope">
        <el-tag :type="getStatusTypea(scope.row.taskType)">
          {{ getStatusTexta(scope.row.taskType) }}
        </el-tag>
      </template>
          </el-table-column>
          <el-table-column prop="formattedCreateTime" align="center" :label="$t('film.createtime')" min-width="120" />
          <el-table-column prop="formattedupdateTime" align="center" :label="$t('sorter.updateTime')" min-width="120" />
        </el-table>
      </div>
    </el-card>
  <div class="awatch">
    <img src="../../assets/woshihuancun.png" alt="" style="width: 50%;height: 70%;margin-left: 30%;margin-top: 20px;position: relative;">
    <div style="position: relative; width: 500px;height: 95px;margin-top: -222px;margin-left: 600px;">
    <div
      v-for="(rect, index) in adjustedRects"
      v-show="rect.showRect"
      :key="rect"
      :style="{ position: 'absolute',
       top: `${rect.id}px`, left: `10px`, width: `422px`, height: `3px`,
      backgroundColor: '#409EFF'
       }"
    >
  </div>
  </div>
</div>
</div>
<!-- 历史任务 -->
<el-dialog v-model="blindb" top="5vh" width="95%" @close="iframeUrl=''">
     <iframe
     :src="iframeUrl"
     marginwidth="2000px"
     marginheight="2000px"
     width="100%"
     height="750px"
     frameborder="0"
     ></iframe>
  </el-dialog>
</template>
<style scoped>
#dt { display:block; float:left;line-height: 20px;margin-left: 100px;}
#dta { display:block; float:left;line-height: 20px;margin-left: 80%;}
#dialog-footer{
  text-align: center;
  margin-top: -15px;
}
#message{
  text-align: center;
  align-items: center;
  color: black;
   width: 200px;
   height: 100px;
   background-color: #337ecc;
   margin-left: 28%;
}
.awatch{
  height: 460px;
  width: 1500px;
  max-width: 100%;
}
</style>
UI-Project/src/views/Caching/cachingunhistory.vue
New file
@@ -0,0 +1,412 @@
<template>
    <div>
  <div style="display: flex;width: 1770px;">
    <el-input v-model="glassId" clearable style="margin-left: 10px;margin-bottom: 10px;width: 200px;" :placeholder="$t('searchOrder.inglassID')" />
    <el-select
            :placeholder="$t('searchOrder.taskstatus')"
             clearable
             style="width: 270px;margin-left: 10px;"
             v-model="taskState">
               <el-option
                v-for="item in optionsa"
                :key="item.value"
                :label="item.label"
                :value="item.value"
              />
          </el-select>
          <el-select
            :placeholder="$t('film.enabletype')"
             clearable
             style="width: 270px;margin-left: 10px;"
             v-model="taskType">
               <el-option
                v-for="item in optionsb"
                :key="item.value"
                :label="item.label"
                :value="item.value"
              />
          </el-select>
          <el-date-picker
            style="margin-left: 15px;"
             v-model="timeRange"
             type="datetimerange"
             :shortcuts="shortcuts"
             range-separator="至"
             :start-placeholder="$t('reportmanage.starttime')"
             :end-placeholder="$t('reportmanage.endtime')"
           />
          <el-button type="primary" style="margin-left: 10px;margin-bottom: 10px;" @click="handleClick()">{{$t('reportmanage.inquire')}}</el-button>
     </div>
     <div style="margin-bottom: 10px;margin-top: 20px;margin-left: 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('hellow.countOutTwo')"  style="width: 14vw">
                {{ countOutOne }}
              </el-form-item>
              </div>
          </el-col>
          <el-col :span="5">
            <div id="dta" style="font-size: 15px;">
          <el-form-item :label="$t('hellow.totalAreaOutTwo')" style="width: 14vw">
                {{ totalAreaOutOne }}
              </el-form-item>
              </div>
          </el-col>
        </el-row>
      </el-form>
    </div>
        <el-table ref="table" style="margin-top: 20px;height: 580px;width: 1770px;" :data="tableDatax" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
      <el-table-column prop="glassIdIn" align="center" :label="$t('searchOrder.intoglassid')" min-width="80" />
      <el-table-column prop="glassIdOut" align="center" :label="$t('searchOrder.outputglassID')" min-width="80" />
      <el-table-column prop="currentCell" align="center" :label="$t('sorter.layernow')" min-width="80" />
      <el-table-column prop="startCell" align="center" :label="$t('searchOrder.startCell')" min-width="80" />
      <!-- <el-table-column prop="endCell" align="center" :label="$t('searchOrder.endCell')" min-width="80" /> -->
          <el-table-column
            align="center"
            :label="$t('film.taskstatus')"
            min-width="80"
            prop="taskState"
          >
          <template #default="scope">
        <el-tag :type="getStatusTypeb(scope.row.taskState)">
          {{ getStatusTextb(scope.row.taskState) }}
        </el-tag>
      </template>
          </el-table-column>
          <el-table-column
            align="center"
            :label="$t('film.enabletype')"
            min-width="80"
            prop="taskType"
          >
          <template #default="scope">
        <el-tag :type="getStatusTypea(scope.row.taskType)">
          {{ getStatusTexta(scope.row.taskType) }}
        </el-tag>
      </template>
          </el-table-column>
          <el-table-column prop="createTime" align="center" :label="$t('film.createtime')" min-width="100" />
          <el-table-column prop="updateTime" align="center" :label="$t('sorter.updateTime')" min-width="100" />
        </el-table>
  <div style="margin-top: 20px;margin-left: 40%;">
        <el-pagination
          v-model:current-page="currentPage2"
          :page-size="pageSize"
          :size="large"
          :disabled="disabled"
          layout="prev, pager, next, jumper"
          :total="totalRecords"
          @current-change="handlePageChange2"
          style="margin-top: 10px;"
      />
    </div>
  </div>
  </template>
<script lang="ts" setup>
import {useI18n} from 'vue-i18n'
import {useRouter} from "vue-router"
import request from "@/utils/request"
import {host, WebSocketHost} from '@/utils/constants'
import {onBeforeUnmount, onMounted, onUnmounted, reactive, ref} from "vue";
import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
import {ElMessage, ElMessageBox} from 'element-plus'
const {t} = useI18n()
let language = ref(localStorage.getItem('lang') || 'zh')
import { inject } from 'vue';
const globalDate = inject('globalDate');
const router = useRouter()
const timeRange = ref([])
const selectValuesa = reactive([]);
const tableDatax = ref([])
const currentPage2 = ref(1)
const totalRecords = ref(0)
const countOutOne = ref(0)
const totalAreaOutOne = ref(0)
const glassId = ref('');
const startSlot = ref('');
const targetSlot = ref('');
const taskState = ref('');
const taskType = ref('');
let getglobalDate = window.localStorage.getItem('getglobalDate')
const historical = async () => {
  try {
  let startTime = window.localStorage.getItem('startTime')
      const response = await request.post("/cacheGlass/edgStorageDeviceTaskHistory", {
        deviceId: 2,
        pageNo: 1,
        pageSize: 20,
        glassId: glassId.value,
        taskState: '',
        taskType: '',
        startTime: startTime,
        endTime: getglobalDate
    })
      if (response.code == 200) {
        ElMessage.success(response.message);
        tableDatax.value = response.data.records;
        totalRecords.value = response.data.total/2 || 0
      } else {
        ElMessage.error(response.message);
    }
}
catch (error) {
  }
}
const Daily = async () => {
  try {
  let startTime = window.localStorage.getItem('startTime')
      const response = await request.post("/cacheGlass/edgStorageDeviceTaskHistory/queryEdgDailyProduction", {
        deviceId: 2,
        pageNo: 1,
        pageSize: 20,
        glassId: glassId.value,
        taskState: '',
        taskType: '',
        startTime: startTime,
        endTime: getglobalDate
    })
      if (response.code == 200) {
        countOutOne.value = response.data.countOutOne
        totalAreaOutOne.value = response.data.totalAreaOutOne
      } else {
        ElMessage.error(response.message);
    }
}
catch (error) {
  }
}
const handlePageChange2 = (newPage) => {
  currentPage2.value = newPage;
  window.localStorage.setItem('pagenumber', currentPage2.value)
  historicala(currentPage2.value);
  Dailya(currentPage2.value);
};
const historicala = async (page) => {
  try {
  let page = window.localStorage.getItem('pagenumber')
  let startTime = window.localStorage.getItem('startTime')
      const response = await request.post("/cacheGlass/edgStorageDeviceTaskHistory", {
        deviceId: 2,
        pageNo: page,
        pageSize: 20,
        glassId: glassId.value,
        taskState: taskState.value,
        taskType: taskType.value,
        beginDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[0])) || '',
        endDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[1])) || '',
    })
      if (response.code == 200) {
        ElMessage.success(response.message);
        tableDatax.value = response.data.records;
        totalRecords.value = response.data.total/2 || 0
      } else {
        ElMessage.error(response.message);
    }
}
catch (error) {
  }
}
const Dailya = async (page) => {
  try {
  let page = window.localStorage.getItem('pagenumber')
  let startTime = window.localStorage.getItem('startTime')
      const response = await request.post("/cacheGlass/edgStorageDeviceTaskHistory/queryEdgDailyProduction", {
        deviceId: 2,
        pageNo: page,
        pageSize: 20,
        glassId: glassId.value,
        taskState: taskState.value,
        taskType: taskType.value,
        beginDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[0])) || '',
        endDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[1])) || '',
    })
      if (response.code == 200) {
        countOutOne.value = response.data.countOutOne
        totalAreaOutOne.value = response.data.totalAreaOutOne
      } else {
        ElMessage.error(response.message);
    }
}
catch (error) {
  }
}
const handleClick = async () => {
  await sethistorical();
  await Dailyhistorical();
};
// 历史查询点击
const sethistorical = async () => {
  try {
  let startTime = window.localStorage.getItem('startTime')
  let page = window.localStorage.getItem('pagenumber')
  const response = await request.post("/cacheGlass/edgStorageDeviceTaskHistory", {
        deviceId: 2,
        pageNo: 1,
        pageSize: 20,
        glassId: glassId.value,
        taskState: taskState.value,
        taskType: taskType.value,
        beginDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[0])) || '',
        endDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[1])) || '',
    })
      if (response.code == 200) {
        currentPage2.value = 1;
        ElMessage.success(response.message);
        tableDatax.value = response.data.records;
        totalRecords.value = response.data.total/2 || 0
      } else {
        ElMessage.error(response.message);
    }
}
catch (error) {
  }
}
const Dailyhistorical = async () => {
  try {
  let startTime = window.localStorage.getItem('startTime')
  let page = window.localStorage.getItem('pagenumber')
    const response = await request.post("/cacheGlass/edgStorageDeviceTaskHistory/queryEdgDailyProduction", {
        deviceId: 2,
        pageNo: 1,
        pageSize: 20,
        glassId: glassId.value,
        taskState: taskState.value,
        taskType: taskType.value,
        beginDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[0])) || '',
        endDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[1])) || '',
    })
      if (response.code == 200) {
        countOutOne.value = response.data.countOutOne
        totalAreaOutOne.value = response.data.totalAreaOutOne
      } else {
        ElMessage.error(response.message);
    }
}
catch (error) {
  }
}
// 格式化时间戳为年月日时间字符串的函数
function formatTimestamp(timestamp) {
  const date = new Date(timestamp);
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始,需要加1,并补零
  const day = String(date.getDate()).padStart(2, '0'); // 补零
  const hours = String(date.getHours()).padStart(2, '0'); // 补零(如果需要显示时间)
  const minutes = String(date.getMinutes()).padStart(2, '0'); // 补零(如果需要显示时间)
  const seconds = String(date.getSeconds()).padStart(2, '0'); // 补零(如果需要显示时间)
  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
const shortcuts = [
  {
    text: '最近一周',
    value: () => {
      const backendTime = new Date(getglobalDate)
      const oneWeekAgo = new Date(getglobalDate)
      oneWeekAgo.setHours(0, 0, 0, 0);
      oneWeekAgo.setDate(oneWeekAgo.getDate() - 7)
      timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)]
      window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
    },
  },
  {
    text: '最近一个月',
    value: () => {
      const backendTime = new Date(getglobalDate)
      const oneWeekAgo = new Date(getglobalDate)
      oneWeekAgo.setHours(0, 0, 0, 0);
      oneWeekAgo.setMonth(oneWeekAgo.getMonth() - 1)
      timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)]
      window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
    },
  },
  {
    text: '最近三个月',
    value: () => {
      const backendTime = new Date(getglobalDate)
      const oneWeekAgo = new Date(getglobalDate)
      oneWeekAgo.setHours(0, 0, 0, 0);
      oneWeekAgo.setMonth(oneWeekAgo.getMonth() - 3)
      timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)]
      window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
},
  },
]
// 格式化后端时间并计算一周前的时间
const defaultTime = ref<[Date, Date]>([new Date(), new Date()]);
function parseAndSetTime() {
  const backendTime = new Date(getglobalDate);
  const oneWeekAgo = new Date(backendTime.getTime() - 7 * 24 * 60 * 60 * 1000); // 减去7天
  oneWeekAgo.setHours(0, 0, 0, 0);
  timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)];
  window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
}
function getStatusTypeb(taskState: number) {
  switch (taskState) {
    case 0:
      return 'primary';
    case 1:
      return 'success';
  }
}
function getStatusTextb(taskState: number) {
  switch (taskState) {
    case 0:
      return t('searchOrder.empty');
    case 1:
      return t('searchOrder.endtask');
  }
}
function getStatusTypea(taskType: number) {
  switch (taskType) {
    case 1:
      return 'primary';
    case 2:
      return 'success';
    case 3:
      return 'warning';
  }
}
function getStatusTexta(taskType: number) {
  switch (taskType) {
    case 1:
      return t('sorter.advancetask');
    case 2:
    return t('sorter.outputtasks');
    case 3:
    return t('sorter.straighttasks');
  }
}
const optionsa = [
  {
    value: 0,
    label: t('searchOrder.empty'),
  },
  {
    value: 1,
    label: t('searchOrder.endtask'),
  }
]
const optionsb = [
  {
    value: 1,
    label: t('sorter.advancetask'),
  },
  {
    value: 2,
    label: t('sorter.outputtasks'),
  },
  {
    value: 3,
    label: t('sorter.straighttasks'),
  }
]
onMounted(() => {
  parseAndSetTime();
  historical();
  Daily()
});
  </script>
  <style scoped>
  </style>
UI-Project/src/views/GlassStorage/GlassStorage.vue
New file
@@ -0,0 +1,38 @@
<script setup>
import {ArrowLeftBold, ArrowRight, Search} from "@element-plus/icons-vue"
import {useRouter} from "vue-router";
let indexFlag=$ref(1)
function changeRouter(index){
  indexFlag=index
}
</script>
<template>
    <div id="main-body">
      <router-view  />
    </div>
</template>
<style scoped>
#main-div{
  width: 100%;
  height: 100%;
}
#div-title{
  height: 2%;
  width: 100%;
}
#searchButton{
  margin-top: -5px;
  margin-left: 1rem;
}
#main-body{
  width: 100%;
  height: 95%;
  /* margin-top: 1%; */
}
#select{
  margin-left:0.5rem;
}
:deep(.indexTag .el-breadcrumb__inner){
  color: #5CADFE !important;
}
</style>
UI-Project/src/views/GlassStorage/MaterialRackManagement.vue
New file
@@ -0,0 +1,687 @@
<template>
  <div class="app-container">
    <el-card style="flex: 1; margin-left: 10px" :loading="loading">
      <div
        slot="header"
        class="clearfix"
        style="display: flex; align-items: center;margin-top: -20px;"
      >
        <!-- 左侧按钮组 -->
        <div>
          <el-button type="success" @click="storage()"
            >原片仓储详情</el-button
          >
          <el-button type="success" @click="handleInbound()"
            >入库</el-button
          >
          <el-button type="success" >吊装位入库</el-button>
        </div>
        <!-- 右侧选择框 -->
        <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>
          </el-select>
        </el-form-item>
      </div>
      <el-dialog v-model="Hidden" top="10vh" width="80%">
        <el-table
          :data="tableData"
          v-model="dialogVisible3"
          style="width: 98%; height: 200px"
          @selection-change="handleSelectionChange"
          :header-cell-style="{ background: '#F2F3F5', color: '#1D2129' }"
          ref="table"
          empty-text="No Data"
        >
          <el-table-column prop="number" label="库位号"></el-table-column>
          <el-table-column prop="rawType" label="类型"></el-table-column>
          <el-table-column prop="rawWidth" label="长度(mm)"></el-table-column>
          <el-table-column prop="rawHeight" label="高度(mm)"></el-table-column>
          <el-table-column
            prop="rawThickness"
            label="厚度(mm)"
          ></el-table-column>
          <el-table-column prop="pieces" label="数量"></el-table-column>
          <el-table-column prop="createTime" label="入库时间"></el-table-column>
          <el-table-column prop="batchId" label="批次号"></el-table-column>
          <el-table-column
            align="center"
            label="料架状态"
            min-width="80"
            prop="enableState"
          >
            <template #default="scope">
              <el-tag
                :type="getTagType(scope.row.enableState)"
                @click="toggleStatus(scope.row)"
              >
                {{ scope.row.enableState === 1 ? "启用" : "未启用" }}
              </el-tag>
            </template>
          </el-table-column>
          <!-- 操作列 -->
          <el-table-column label="操作" width="250">
            <template #default="{ row }">
              <el-button
                type="primary"
                @click="edithandleRowClick(row)"
                >修改</el-button
              >
              <el-button type="danger" @click="handleDelete(row)"
                >删除</el-button
              >
              <el-button type="warning" @click="handleCheckout(row)"
                >出库</el-button
              >
              <!-- <el-button type="success" @click="addglass()">添加原片</el-button> -->
            </template>
          </el-table-column>
        </el-table>
        <el-pagination
          v-if="totalItems > 0"
          background
          layout="prev, pager, next"
          :total="totalItems"
          :page-size="pageSize"
          @current-change="handleCurrentChange"
        ></el-pagination>
      </el-dialog>
      <el-table
        :data="tasktableData"
        style="width: 98%; height: 150px"
        @selection-change="handleSelectionChange"
        :header-cell-style="{ background: '#F2F3F5', color: '#1D2129' }"
        ref="table"
        empty-text="No Data"
      >
        <template #header>
          <div style="display: flex; align-items: center">
            <span style="font-size: 16px; font-weight: bold; margin-right: 20px"
              >任务列表</span
            >
          </div>
        </template>
        <el-table-column prop="id" label="Glassid"></el-table-column>
        <el-table-column
          prop="taskType"
          label="任务描述"
          width="250"
          :formatter="formatTaskType"
        ></el-table-column>
        <el-table-column
          prop="rawThickness"
          label="玻璃厚度"
        ></el-table-column>
        <el-table-column prop="color" label="玻璃膜系"></el-table-column>
        <el-table-column prop="startTime" label="创建时间"></el-table-column>
        <el-table-column
          align="center"
          label="任务状态"
          min-width="80"
          prop="taskState"
        >
          <template #default="scope">
            <el-tag :type="getTagType2(scope.row.taskState)">
              {{ scope.row.taskState == "completed" ? "完成" : "进行中" }}
            </el-tag>
          </template>
        </el-table-column>
        <!-- 操作列 -->
        <el-table-column label="操作" width="350">
          <template #default="{ row }">
            <el-button type="primary" @click="handleRestart(row)"
              >重新开始</el-button
            >
            <el-button type="danger" @click="handleDeletetask(row)"
              >删除任务</el-button
            >
            <el-button type="success" @click="handleComplete(row)"
              >任务完成</el-button
            >
          </template>
        </el-table-column>
      </el-table>
    </el-card>
    <div class="img-ypcc">
      <div
        class="img-car1"
        :style="'z-index:999;left:397px;top:205px;position:absolute;'"
      >
        <div
          v-show="cellshow1"
          style="
            margin-top: 10px;
            width: 200px;
            height: 5px;
            background-color: #409eff;
          "
        ></div>
      </div>
    </div>
    <!-- 入库对话框 -->
    <el-dialog
      title="入库"
      v-model="dialogVisible"
      width="30%"
      :before-close="handleCloseDialog"
    >
      <el-form :model="formData" ref="form" label-width="80px">
        <el-form-item label="进库料架">
          <el-select v-model="formData.number" placeholder="请选择进库料架">
            <el-option label="1" value="1"></el-option>
            <el-option label="2" value="2"></el-option>
            <!-- 根据实际情况添加更多选项 -->
          </el-select>
        </el-form-item>
        <el-form-item label="颜色膜系">
          <el-select v-model="formData.color" placeholder="请选择颜色膜系">
            <el-option label="Red" value="Red"></el-option>
            <el-option label="Blue" value="Blue"></el-option>
            <!-- 根据实际情况添加更多选项 -->
          </el-select>
        </el-form-item>
        <el-form-item label="宽度">
          <el-input
            v-model.number="formData.rawWidth"
            placeholder="请输入宽度"
          ></el-input>
        </el-form-item>
        <el-form-item label="高度">
          <el-input
            v-model.number="formData.rawHeight"
            placeholder="请输入高度"
          ></el-input>
        </el-form-item>
        <el-form-item label="厚度">
          <el-input
            v-model.number="formData.rawThickness"
            placeholder="请输入厚度"
          ></el-input>
        </el-form-item>
        <el-form-item label="数量">
          <el-input
            v-model.number="formData.pieces"
            placeholder="请输入数量"
          ></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="dialogVisible = false">取 消</el-button>
        <el-button type="primary" @click="handleConfirmInbound"
          >确 定</el-button
        >
      </div>
    </el-dialog>
    <el-dialog title="添加原片" v-model="dialogVisible3" width="50%">
      <el-form :model="formData3" ref="form" label-width="80px">
        <el-form-item label="颜色膜系">
          <el-input
            v-model="formData.selectedColor"
            readonly
            style="width: 250px; height: 35px; font-size: 20px"
          ></el-input>
          <el-dropdown @command="handleCommand">
            <span class="el-dropdown-link">
              选择<i class="el-icon-arrow-down el-icon--right"></i>
            </span>
            <el-dropdown-menu slot="dropdown">
              <el-dropdown-item
                v-for="color in colors"
                :key="color['0_glass_id']"
                :command="color['0_glass_id']"
              >
                {{ color["0_glass_id"] }}
              </el-dropdown-item>
            </el-dropdown-menu>
          </el-dropdown>
        </el-form-item>
        <el-form-item label="长度">
          <el-input
            v-model="formData.width"
            required
            style="width: 250px; font-size: 20px"
            @focus="clearInput('wid')"
          ></el-input>
        </el-form-item>
        <el-form-item label="高度">
          <el-input
            v-model="formData.height"
            required
            style="width: 250px; font-size: 20px"
            @focus="clearInput('heig')"
          ></el-input>
        </el-form-item>
        <el-form-item label="厚度">
          <el-input
            v-model="formData.thickness"
            required
            style="width: 250px; font-size: 20px"
            @focus="clearInput('thinkness')"
          ></el-input>
        </el-form-item>
        <el-form-item label="数量">
          <el-input-number
            v-model="formData.quantity"
            required
            :min="0"
            :max="9000"
            style="width: 250px; font-size: 20px"
            @focus="clearInput('num')"
          ></el-input-number>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="dialogVisible3 = false">关闭</el-button>
        <el-button type="primary" @click="submitForm">提交</el-button>
      </span>
    </el-dialog>
    <el-dialog
      title="编辑"
      v-model="editdialogVisible"
      width="30%"
      @close="edithandleDialogClose"
    >
      <el-form :model="editForm" ref="editFormRef" label-width="80px">
        <el-form-item label="数量">
          <el-input v-model="editForm.pieces"></el-input>
        </el-form-item>
        <el-form-item label="批次号">
          <el-input v-model="editForm.batchId"></el-input>
        </el-form-item>
        <el-form-item label="长度">
          <el-input v-model="editForm.rawWidth"></el-input>
        </el-form-item>
        <el-form-item label="高度">
          <el-input v-model="editForm.rawHeight"></el-input>
        </el-form-item>
        <el-form-item label="厚度">
          <el-input v-model="editForm.rawThickness"></el-input>
        </el-form-item>
      </el-form>
      <div class="dialog-footer">
        <el-button @click="editdialogVisible = false">取消</el-button>
        <el-button type="primary" @click="editsaveEdit">保存</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script setup>
import { ref, onMounted, onBeforeUnmount,onUnmounted } from "vue"; // 导入 Vue 3 的模块
//import * as echarts from 'echarts';
import { ElMessage, ElMessageBox } from "element-plus";
// import {tableData} from '@/stores/tableData.js';
import { WebSocketHost, host } from "@/utils/constants";
import { initializeWebSocket, closeWebSocket } from "@/utils/WebSocketService";
import {
  updateRawUsage,
  deleteRawUsage,
  inStorage,
  outStorage,
  taskUpdate,
} from "@/utils/api";
const loading = ref(false);
const Hidden = ref(false);
const tableData = ref([]);
const totalItems = ref(0);
totalItems.value = 10;
const pageSize = 10;
let currentPage = ref(1);
const handleCurrentChange = (val) => {
  currentPage.value = val;
};
const formatTaskType = (row, column) => {
  if (row.taskType === "从仓位到吊装位") {
    return `从仓位${row.shelfRack}到吊装位${row.loadRack}`;
  } else if (row.taskType === "从仓位到上片位") {
    return `从仓位${row.shelfRack}到上片位${row.loadRack}`;
  } else if (row.taskType === "从上片位到仓位") {
    return `从上片位${row.loadRack}到仓位${row.shelfRack}`;
  } else if (row.taskType === "从吊装位到仓位") {
    return `从吊装位${row.loadRack}到仓位${row.shelfRack}`;
  }
};
const getTagType2 = (status) => {
  switch (status) {
    case "completed":
      return "success";
    case "in-progress":
      return "info";
    case "warning":
      return "warning";
    case "danger":
      return "danger";
    default:
      return "";
  }
};
const getTagType = (status) => {
  return status === 1 ? "success" : "danger";
  // 根据状态值决定标签类型,这里假设状态为1时为成功(绿色),否则为失败(红色)
};
const toggleStatus = (row) => {
  // 切换料架状态的逻辑
  row.enableState = 1 - row.enableState; // Toggle between 0 and 1
  // 此处可以添加保存状态的逻辑,比如调用 API 更新数据
};
let socket = null;
const socketUrl = `ws://${WebSocketHost}:${host}/api/glassStorage/api/talk/storageTask`;
// 定义消息处理函数,更新 receivedData 变量
const handleMessage = (data) => {
  // 更新 tableData 的数据
  tableData.value = data.rack[0]; // 假设 tableData 是响应式对象或变量
  tableData.value.forEach((item) => {
    // 获取 createTime 的时间戳
    const createTimeTimestamp = item.createTime;
    // 创建日期对象
    const date = new Date(createTimeTimestamp);
    // 格式化日期时间为本地格式
    const formattedDateTime = date.toLocaleString();
    // 替换原来的 createTime 字段为格式化后的日期时间字符串
    item.createTime = formattedDateTime;
  });
  tasktableData.value = data.tasks[0]; // 假设 tasktableData 是响应式对象或变量
  tasktableData.value.forEach((item) => {
    // 获取 createTime 的时间戳
    const createTimeTimestamp = item.startTime;
    // 创建日期对象
    const date = new Date(createTimeTimestamp);
    // 格式化日期时间为本地格式
    const formattedDateTime = date.toLocaleString();
    // 替换原来的 createTime 字段为格式化后的日期时间字符串
    item.startTime = formattedDateTime;
  });
};
onMounted(() => {
  socket = initializeWebSocket(socketUrl, handleMessage);
});
  onUnmounted(() => {
    if (socket) {
    closeWebSocket(socket);
    }
    });
onBeforeUnmount(() => {
  closeWebSocket();
});
const tasktableData = ref([]);
const dialogVisible = ref(false);
const formData = ref({
  number: "",
  color: "",
  rawWidth: "",
  rawHeight: "",
  rawThickness: "",
  pieces: "",
  loadRack: 1,
});
const formData2 = ref({
  dzw: "",
});
const handleDelete = (row) => {
  // 使用 Element UI 的 MessageBox.confirm 方法进行二次确认
  ElMessageBox.confirm("确定要执行删除操作吗?", "确认删除", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning",
  })
    .then(() => {
      // 点击确认按钮的回调,执行出库操作
      const intNumber = {
        id: parseInt(row.number),
      };
      deleteRawUsage(intNumber);
      console.log("执行删除操作");
    })
    .catch(() => {
      // 点击取消按钮的回调,不执行任何操作
      console.log("取消删除操作");
    });
};
const handleCheckout = (row) => {
  // 使用 Element UI 的 MessageBox.confirm 方法进行二次确认
  ElMessageBox.confirm("确定要执行出库操作吗?", "确认出库", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning",
  })
    .then(() => {
      // 点击确认按钮的回调,执行出库操作
      const raw={
        number:parseInt(row.number),
        loadRack:2
      }
      outStorage(raw)
      console.log("执行出库操作", row);
    })
    .catch(() => {
      // 点击取消按钮的回调,不执行任何操作
      console.log("取消出库操作");
    });
};
const handleInbound = () => {
  // 打开入库对话框
  dialogVisible.value = true;
};
const storage = () => {
  // 打开入库对话框
  Hidden.value = true;
};
const handleCloseDialog = () => {
  // 关闭对话框时重置表单数据
  formData.value = {
    number: "",
    color: "",
    rawWidth: "",
    rawHeight: "",
    rawThickness: "",
    pieces: "",
  };
  dialogVisible.value = false;
};
const handleConfirmInbound = () => {
  inStorage(formData.value);
  // 处理确认入库逻辑,可以在这里提交表单或者执行其他操作
  // 关闭对话框
  dialogVisible.value = false;
};
const dialogVisible3 = ref(false);
const colors = ref([
  { "0_glass_id": "Red" },
  { "0_glass_id": "Green" },
  { "0_glass_id": "Blue" },
  // Add more colors as needed
]);
const formData3 = ref({
  selectedColor: "",
  wid: "",
  heig: "",
  thinkness: "",
  num: "",
});
const addglass = () => {
  // 打开入库对话框
  dialogVisible3.value = true;
};
const handleCommand = (command) => {
  formData.value.selectedColor = command;
};
const clearInput = (field) => {
  formData.value[field] = "";
};
const submitForm = () => {
  dialogVisible3.value = false;
  // Add your submit logic here
};
const editdialogVisible = ref(false);
const editForm = ref({
  id: "",
  pieces: "",
  batchId: "",
  rawWidth: "",
  rawHeight: "",
  rawThickness: "",
});
const editFormRef = ref(null);
let currentRow = ref(null);
// 处理行点击事件
const edithandleRowClick = (row) => {
  currentRow.value = row;
  editForm.value.pieces = row.pieces.toString();
  editForm.value.batchId = row.batchId;
  editForm.value.rawWidth = row.rawWidth;
  editForm.value.rawHeight = row.rawHeight;
  editForm.value.rawThickness = row.rawThickness;
  editForm.value.id = row.number;
  editdialogVisible.value = true;
};
// 添加保存编辑内容
const editsaveEdit = () => {
  if (!currentRow.value) return;
  // 更新当前行数据
  currentRow.value.pieces = editForm.value.pieces;
  currentRow.value.batchId = editForm.value.batchId;
  currentRow.value.rawWidth = editForm.value.rawWidth;
  currentRow.value.rawHeight = editForm.value.rawHeight;
  currentRow.value.rawThickness = editForm.value.rawThickness;
  // 调用更新函数,并处理其返回的 Promise
  updateRawUsage(editForm.value);
  // 关闭对话框
  editdialogVisible.value = false;
};
// 对话框关闭时重置编辑表单和当前行数据
const edithandleDialogClose = () => {
  editForm.value.pieces = "";
  editForm.value.batchId = "";
  editForm.value.rawWidth = "";
  editForm.value.rawHeight = "";
  editForm.value.rawThickness = "";
  currentRow.value = null;
};
const handleRestart = (row) => {
  // 使用 Element UI 的 MessageBox.confirm 方法进行二次确认
  ElMessageBox.confirm("确定要执行重新开始操作吗?", "确认重新开始", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning",
  })
    .then(() => {
      const taskdata={
        id:row.id,
        Type:"重新开始"
      }
      taskUpdate(taskdata);
      console.log("执行重新开始操作", row);
    })
    .catch(() => {
      // 点击取消按钮的回调,不执行任何操作
      console.log("取消重新开始操作");
    });
};
const handleDeletetask = (row) => {
  // 使用 Element UI 的 MessageBox.confirm 方法进行二次确认
  ElMessageBox.confirm("确定要执行删除任务操作吗?", "确认删除任务", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning",
  })
    .then(() => {
      // 点击确认按钮的回调
      const taskdata={
        id:row.id,
        Type:"删除"
      }
      taskUpdate(taskdata);
      console.log("执行删除任务操作", row);
    })
    .catch(() => {
      // 点击取消按钮的回调,不执行任何操作
      console.log("取消删除任务操作");
    });
};
const handleComplete = (row) => {
  // 使用 Element UI 的 MessageBox.confirm 方法进行二次确认
  ElMessageBox.confirm("确定要执行任务完成操作吗?", "确认任务完成", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning",
  })
    .then(() => {
      const taskdata={
        id:row.id,
        Type:"完成"
      }
      taskUpdate(taskdata);
      // 点击确认按钮的回调
      console.log("执行任务完成操作", row);
    })
    .catch(() => {
      // 点击取消按钮的回调,不执行任何操作
      console.log("取消任务完成操作");
    });
};
</script>
<style scoped>
#dt {
  display: block;
  float: left;
  line-height: 20px;
  margin-left: 100px;
}
#dta {
  display: block;
  float: left;
  line-height: 20px;
  margin-left: 80%;
}
#dialog-footer {
  text-align: center;
  margin-top: -15px;
}
.img-ypcc {
  margin-left: 80px;
  background-image: url("../../assets/ypcc.png");
  background-repeat: no-repeat;
  background-attachment: local;
  min-height: 600px;
  width: 1400px;
  max-width: 100%;
  background-size: 1400px 600px;
  overflow: hidden;
  position: relative;
  margin-top: 0px;
}
.img-car1 {
  background-image: url("../../assets/ypccche.png");
  position: absolute;
  background-repeat: no-repeat;
  background-attachment: local;
  min-height: 400px;
  width: 200px;
  max-width: 100%;
  background-size: 200px 170px;
  overflow: hidden;
  position: relative;
}
.custom-dialog {
  max-height: 90vh; /* 最大高度为视口高度的90% */
  overflow-y: auto; /* 对话框内部出现垂直滚动条 */
}
</style>
UI-Project/src/views/GlassStorage/rawfilmstorage.vue
New file
@@ -0,0 +1,1120 @@
<script lang="ts" setup>
import { onBeforeUnmount, onMounted, reactive, ref } from "vue";
import { useRouter } from "vue-router"
import { ElMessage, ElMessageBox } from 'element-plus'
import { useI18n } from 'vue-i18n'
import { host, WebSocketHost } from '@/utils/constants'
import dayjs from 'dayjs';
import request from "@/utils/request"
import { closeWebSocket, initializeWebSocket } from '@/utils/WebSocketService';
import { inject } from 'vue';
const router = useRouter()
const tableDataa = ref([])
const tableDatab = ref([])
const tableDatad = ref([])
const { t } = useI18n()
const add = ref(false)
const dialogFormVisiblea = ref(false)
const dialogFormVisibleb = ref(false)
const dialogFormVisiblec = ref(false)
const dialogFormVisiblee = ref(false)
const blindb = ref(false)
const Edit = ref(false)
const card1 = ref(false)
const card2 = ref(false)
const card3 = ref(false)
const card4 = ref(false)
const card5 = ref(false)
const card6 = ref(false)
const card7 = ref(false)
const card8 = ref(false)
const card9 = ref(false)
const card10 = ref(false)
const card11 = ref(false)
const card12 = ref(false)
const card13 = ref(false)
const card14 = ref(false)
const card15 = ref(false)
const card16 = ref(false)
const card17 = ref(false)
const card18 = ref(false)
const card19 = ref(false)
const card20 = ref(false)
const card21 = ref(false)
const card22 = ref(false)
const card23 = ref(false)
const card24 = ref(false)
const card25 = ref(false)
const card98 = ref(false)
const card99 = ref(false)
const card101 = ref(false)
const card102 = ref(false)
const card103 = ref(false)
const card104 = ref(false)
const timeRange = ref([])
const timeRangea = ref([])
const selectValuesa = reactive([]);
const selectValuesb = reactive([]);
const patternWidth = ref('');
const patternHeight = ref('');
const patternThickness = ref('');
const filmsId = ref('');
const remainQuantity = ref('');
const slot = ref('');
const leftingStation = ref('');
const loadingline = ref('');
let webSocket: WebSocket | null = null;
const globalDate = inject('globalDate');
const value = ref('')
const options = [
  {
    value: 98,
    label: t('film.warehousing1'),
  },
  {
    value: 99,
    label: t('film.warehousing2'),
  }
]
const report = ref({
  taskType: '',
  taskState: '',
});
let startTime = window.localStorage.getItem('startTime')
request.post("/glassStorage/rawGlassStorageTask/setRawGlassTaskRequest", {
  beginDate: startTime,
  endDate: globalDate,
}).then((response) => {
  if (response.code == 200) {
  } else {
    ElMessage.warning(response.msg)
  }
});
// 格式化后端时间并计算一周前的时间
const defaultTime = ref<[Date, Date]>([new Date(), new Date()]);
function parseAndSetTime() {
  const backendTime = new Date(globalDate);
  const oneWeekAgo = new Date(backendTime.getTime() - 7 * 24 * 60 * 60 * 1000); // 减去7天
  oneWeekAgo.setHours(0, 0, 0, 0);
  timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)];
  timeRangea.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)];
  window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
}
onMounted(() => {
  socket = initializeWebSocket(socketUrl, handleMessage);
  parseAndSetTime();
});
let socket = null;
const socketUrl = `ws://${WebSocketHost}:${host}/api/glassStorage/api/talk/rawGlass`;
const handleMessage = (data) => {
  const formattedTasks = data.tasks[0].map(task => {
    if (task && task.createTime) {
      return { ...task, createTime: formatTimestamp(task.createTime) };
    }
    return task;
  });
  tableDataa.value = formattedTasks;
  if (data.rawStationDetailsList != null) {
    tableDatab.value = data.rawStationDetailsList[0]
    if (data.rawStationDetailsList[0][0].patternThickness != null) {
      card1.value = true
    }
    if (data.rawStationDetailsList[0][1].patternThickness != null) {
      card2.value = true
    }
    if (data.rawStationDetailsList[0][2].patternThickness != null) {
      card3.value = true
    }
    if (data.rawStationDetailsList[0][3].patternThickness != null) {
      card4.value = true
    }
    if (data.rawStationDetailsList[0][4].patternThickness != null) {
      card5.value = true
    }
    if (data.rawStationDetailsList[0][5].patternThickness != null) {
      card6.value = true
    }
    if (data.rawStationDetailsList[0][6].patternThickness != null) {
      card7.value = true
    }
    if (data.rawStationDetailsList[0][7].patternThickness != null) {
      card8.value = true
    }
    if (data.rawStationDetailsList[0][8].patternThickness != null) {
      card9.value = true
    }
    if (data.rawStationDetailsList[0][9].patternThickness != null) {
      card10.value = true
    }
    if (data.rawStationDetailsList[0][10].patternThickness != null) {
      card11.value = true
    }
    if (data.rawStationDetailsList[0][11].patternThickness != null) {
      card12.value = true
    }
    if (data.rawStationDetailsList[0][12].patternThickness != null) {
      card13.value = true
    }
    if (data.rawStationDetailsList[0][13].patternThickness != null) {
      card14.value = true
    }
    if (data.rawStationDetailsList[0][14].patternThickness != null) {
      card15.value = true
    }
    if (data.rawStationDetailsList[0][15].patternThickness != null) {
      card16.value = true
    }
    if (data.rawStationDetailsList[0][16].patternThickness != null) {
      card17.value = true
    }
    if (data.rawStationDetailsList[0][17].patternThickness != null) {
      card18.value = true
    }
    if (data.rawStationDetailsList[0][18].patternThickness != null) {
      card19.value = true
    }
    if (data.rawStationDetailsList[0][19].patternThickness != null) {
      card20.value = true
    }
    if (data.rawStationDetailsList[0][20].patternThickness != null) {
      card21.value = true
    }
    if (data.rawStationDetailsList[0][21].patternThickness != null) {
      card22.value = true
    }
    if (data.rawStationDetailsList[0][22].patternThickness != null) {
      card23.value = true
    }
    if (data.rawStationDetailsList[0][23].patternThickness != null) {
      card24.value = true
    }
    if (data.rawStationDetailsList[0][24].patternThickness != null) {
      card25.value = true
    }
    if (data.rawStationDetailsList[0][25].patternThickness != null) {
      card98.value = true
    }
    if (data.rawStationDetailsList[0][26].patternThickness != null) {
      card99.value = true
    }
    if (data.rawStationDetailsList[0][27].patternThickness != null) {
      card101.value = true
    }
    if (data.rawStationDetailsList[0][28].patternThickness != null) {
      card102.value = true
    }
    if (data.rawStationDetailsList[0][29].patternThickness != null) {
      card103.value = true
    }
    if (data.rawStationDetailsList[0][30].patternThickness != null) {
      card104.value = true
    }
  }
};
const handleEdit = (row) => {
  window.localStorage.setItem('deviceId', row.deviceId)
  window.localStorage.setItem('slot', row.slot)
  Edit.value = true;
};
const handleBinda = (row) => {
  dialogFormVisibleb.value = true;
};
const handleBindc = (row) => {
  dialogFormVisiblec.value = true;
};
const handleBinde = (row) => {
  dialogFormVisiblee.value = true;
};
// 删除
const deleteWarehousing = async (row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('film.dedelete'),
      t('productStock.prompt'),
      {
        confirmButtonText: t('productStock.yes'),
        cancelButtonText: t('productStock.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      var url = "/glassStorage/rawGlassStorageDetails/deleteWarehousing?slot=" + row.slot;
      const response = await request.post(url)
      // const response = await request.post("/glassStorage/rawGlassStorageDetails/deleteWarehousing",[row.slotId])
      if (response.code === 200) {
        ElMessage.success(response.message);
      } else {
        ElMessage.error(response.msg);
      }
    }
  } catch (error) {
  }
};
// 原片入库
const handleup = async () => {
  try {
    const response = await request.post('/glassStorage/rawGlassStorageDetails/patternWarehousing', {
      patternWidth: patternWidth.value,
      patternHeight: patternHeight.value,
      patternThickness: patternThickness.value,
      filmsId: filmsId.value,
      remainQuantity: remainQuantity.value,
      slot: slot.value,
    });
    if (response.code === 200) {
      ElMessage.success(response.message);
      dialogFormVisibleb.value = false;
      patternWidth.value = '';
      patternHeight.value = '';
      patternThickness.value = '';
      filmsId.value = '';
      remainQuantity.value = '';
      slot.value = '';
    } else {
      ElMessage.error(response.message);
    }
  } catch (error) {
  }
};
// 入库请求
const handleupc = async () => {
  try {
    var url = "/glassStorage/rawGlassStorageDetails/warehousingRequest?leftingStation=" + leftingStation.value;
    const response = await request.post(url)
    if (response.code == 200) {
      ElMessage.success(response.message);
      dialogFormVisiblec.value = false;
      leftingStation.value = '';
    } else {
      // 请求失败,显示错误消息
      ElMessage.error(response.msg);
    }
  }
  catch (error) {
  }
}
// 出库请求
const handleupe = async () => {
  try {
    var url = "/glassStorage/rawGlassStorageDetails/outWarehousingRequest?leftingStation=" + leftingStation.value;
    const response = await request.post(url)
    if (response.code == 200) {
      ElMessage.success(response.message);
      dialogFormVisiblee.value = false;
      leftingStation.value = '';
    } else {
      // 请求失败,显示错误消息
      ElMessage.error(response.msg);
    }
  }
  catch (error) {
  }
}
// 出库
const openc = async (row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('film.deoutbound'),
      t('productStock.prompt'),
      {
        confirmButtonText: t('productStock.yes'),
        cancelButtonText: t('productStock.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      var url = "/glassStorage/rawGlassStorageDetails/outWarehousing?slotId=" + row.slot;
      const response = await request.post(url)
      // const response = await request.post("/glassStorage/rawGlassStorageDetails/outWarehousing",[row.slotId])
      if (response.code === 200) {
        ElMessage.success(response.message);
      } else {
        ElMessage.error(response.msg);
      }
    }
  } catch (error) {
  }
};
// 查询数据
const selectReportData = 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]];
    }
  }
  const response = await request.post("/glassStorage/rawGlassStorageTask/setRawGlassTaskRequest", {
    beginDate: (timeRange.value && timeRange.value[0]) || '',
    endDate: (timeRange.value && timeRange.value[1]) || '',
    taskState: celllist,
    taskType: stateList
  })
  if (response.code === 200) {
    // tableDataa.value = response.data;
    ElMessage.success(response.message);
  }
  else {
    ElMessage.error(response.message);
  }
};
// 是否禁用
const toggleEnableState = async (row: any) => {
  if (!row.deviceId) {
    ElMessage.error(t('basicData.updatanull'));
    return;
  }
  const newState = row.state === 1 ? 0 : 1;
  try {
    var url = "/glassStorage/rawGlassStorageStation/updateSlotState?slot=" + row.slot + "&state=" + newState;
    const response = await request.post(url)
    if (response.code === 200) {
      ElMessage.success(response.message);
      row.state = newState;
    } else {
      ElMessage.error(response.message);
    }
    row.state = newState;
  } catch (error) {
    ElMessage.error(t('basicData.glassnull'));
  }
};
// 修改数量
const Editclick = async () => {
  let slot = window.localStorage.getItem('slot')
  let deviceId = window.localStorage.getItem('deviceId')
  try {
    const response = await request.post('/glassStorage/rawGlassStorageDetails/updateQuantity', {
      deviceId: deviceId,
      slot: slot,
      remainQuantity: remainQuantity.value,
      filmsId: filmsId.value,
      patternThickness: patternThickness.value,
      patternHeight: patternHeight.value,
      patternWidth: patternWidth.value,
    }
    );
    if (response.code === 200) {
      ElMessage.success(response.message);
      Edit.value = false;
      tableDatab.value = response.data;
      patternWidth.value = '';
      patternHeight.value = '';
      patternThickness.value = '';
      filmsId.value = '';
      remainQuantity.value = '';
    } else {
      ElMessage.error(response.message);
    }
  } catch (error) {
  }
};
// 格式化时间戳为年月日时间字符串的函数
function formatTimestamp(timestamp: number | Date): string {
  const date = new Date(timestamp);
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const day = String(date.getDate()).padStart(2, '0');
  const hours = String(date.getHours()).padStart(2, '0');
  const minutes = String(date.getMinutes()).padStart(2, '0');
  const seconds = String(date.getSeconds()).padStart(2, '0');
  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
// 历史任务
const iframeUrl = ref('');
const handlehistorical = (row) => {
  // historical()
  // window.localStorage.setItem('pagenumber', 1)
  blindb.value = true;
  iframeUrl.value = `${window.location.origin}/#/GlassStorage/rawhistory`;
};
// const historical = async () => {
//   try {
//   let startTime = window.localStorage.getItem('startTime')
//       const response = await request.post("/glassStorage/rawGlassStorageTask/queryRawGlassHistoryTask", {
//         pageNo: 1,
//         pageSize: 20,
//         taskState: [],
//         taskType: [],
//         beginDate: startTime,
//         endDate: globalDate
//     })
//       if (response.code == 200) {
//   window.localStorage.setItem('pagenumber', 1)
// } else {
//     }
// }
// catch (error) {
//   }
// }
// 任务成功处理
const successfull = async (row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.psuccessfullyprocessed'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      var url = "/glassStorage/rawGlassStorageTask/taskSuccess?taskId=" + row.id;
      const response = await request.post(url)
      if (response.code === 200) {
        ElMessage.success(response.message);
      } else {
        ElMessage.error(response.msg);
      }
    }
  } catch (error) {
  }
};
// 任务失败处理
const handleptask = async (row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.ptaskfailure'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      var url = "/glassStorage/rawGlassStorageTask/taskError?taskId=" + row.id;
      const response = await request.post(url)
      if (response.code === 200) {
        ElMessage.success(response.message);
      } else {
        ElMessage.error(response.msg);
      }
    }
  } catch (error) {
  }
};
function getStatusType1(taskType) {
  switch (taskType) {
    case 1:
      return 'info';
    case 2:
      return 'warning';
    case 3:
      return 'success';
    case 4:
      return 'danger';
    case 5:
      return 'primary';
  }
}
function getStatusText1(taskType) {
  switch (taskType) {
    case 1:
      return t('sorter.advancetask');//进片任务
    case 2:
      return t('sorter.outputtasks');//出片任务
    case 3:
      return t('sorter.schedulingtasks');//调度任务
    case 4:
      return t('sorter.advancerequests');//进片请求
    case 5:
      return t('sorter.releaserequest');//出片请求
  }
}
function getStatusType2(taskState) {
  switch (taskState) {
    case 0:
      return 'info';
    case 2:
      return 'warning';
    case 1:
      return 'success';
  }
}
function getStatusText2(taskState) {
  switch (taskState) {
    case 0:
      return t('film.built');//新建
    case 2:
      return t('film.fail');//失败
    case 1:
      return t('film.finish');//完成
  }
}
onBeforeUnmount(() => {
  closeWebSocket();
});
</script>
<template>
  <div style="height: 500px;">
    <div style="display: flex; flex-direction: row; align-items: center; margin-top: 20px;">
      <el-button style="margin-left: 20px;" id="searchButton" type="success" @click="dialogFormVisiblea = true">
        {{ $t('film.mes') }}
      </el-button>
      <el-button style="margin-left: 20px;" id="searchButton" type="success" @click="handleBinda">
        {{ $t('film.warehousing') }}
      </el-button>
      <el-button style="margin-left: 20px;" id="searchButton" type="success" @click="handleBindc">
        {{ $t('film.pwarehousing') }}
      </el-button>
      <el-button style="margin-left: 20px;" id="searchButton" type="success" @click="handleBinde">{{
        $t('film.pwareout')
      }}
      </el-button>
      <el-button style="margin-left: 20px;" id="searchButton" type="success" @click="handlehistorical">{{
        $t('searchOrder.historicaltasks')
      }}
      </el-button>
      <el-date-picker style="margin-left: 10px;" v-model="timeRange" type="datetimerange" format="YYYY/MM/DD HH:mm:ss"
        value-format="YYYY-MM-DD HH:mm:ss" :start-placeholder="$t('film.starttime')"
        :end-placeholder="$t('film.endtime')" :default-time="defaultTime" />
      <el-select v-model="selectValuesa[0]" clearable :placeholder="$t('film.taskstatus')" style="margin-left: 10px;">
        <el-option :label="$t('film.built')" value="0"></el-option>
        <el-option :label="$t('film.finish')" value="1"></el-option>
        <el-option :label="$t('film.fail')" value="2"></el-option>
      </el-select>
      <el-select v-model="selectValuesa[1]" clearable :placeholder="$t('film.tasktype')" style="margin-left: 10px;">
        <el-option :label="$t('sorter.advancetask')" value="1"></el-option>
        <el-option :label="$t('sorter.outputtasks')" value="2"></el-option>
        <el-option :label="$t('sorter.schedulingtasks')" value="3"></el-option>
        <el-option :label="$t('sorter.advancerequests')" value="4"></el-option>
        <el-option :label="$t('sorter.releaserequest')" value="5"></el-option>
      </el-select>
      <el-button type="primary" style="margin-left: 10px;" @click="selectReportData()">{{ $t('film.inquire')
        }}</el-button>
    </div>
    <el-card style="flex: 1;margin-left: 10px;margin-top: 20px;">
      <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
        <el-table height="300" ref="table" :data="tableDataa"
          :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
          <el-table-column prop="id" align="center" :label="$t('film.enableid')" />
          <el-table-column prop="startSlot" align="center" :label="$t('film.originateslot')" />
          <el-table-column prop="endSlot" align="center" :label="$t('film.endoriginateslot')" />
          <el-table-column prop="patternQuantity" align="center" :label="$t('film.patternquantity')" />
          <el-table-column width="100" align="center" :label="$t('film.enabletype')" prop="taskType">
            <template #default="scope">
              <el-tag :type="getStatusType1(scope.row.taskType)">
                {{ getStatusText1(scope.row.taskType) }}
              </el-tag>
            </template>
          </el-table-column>
          <el-table-column align="center" :label="$t('film.taskstatus')" prop="taskState">
            <template #default="scope">
              <el-tag :type="getStatusType2(scope.row.taskState)">
                {{ getStatusText2(scope.row.taskState) }}
              </el-tag>
            </template>
          </el-table-column>
          <el-table-column prop="createTime" align="center" :label="$t('film.createtime')" />
          <el-table-column fixed="right" :label="$t('film.operate')" align="center">
            <template #default="scope">
              <el-button :disabled="(scope.row.taskState !== 0)" type="text" plain @click="successfull(scope.row)">{{
                $t('searchOrder.successfullyprocessed') }}</el-button>
              <el-button :disabled="(scope.row.taskState !== 0)" type="text" plain @click="handleptask(scope.row)">{{
                $t('searchOrder.taskfailure') }}</el-button>
            </template>
          </el-table-column>
        </el-table>
      </div>
    </el-card>
    <div class="img-dlpl">
      <div class="img-car1" style="z-index:999;top:250px;left:20px;position:absolute;"></div>
      <!-- <div class="img-car1" :style="'z-index:999;top:250px;left:' + 20 + 'px;position:absolute;'"></div> -->
      <div class="card1" v-show="card1" style="z-index:999;top:430px;left:53px;position:absolute;"></div>
      <div class="card2" v-show="card2" style="z-index:999;top:430px;left:80px;position:absolute;"></div>
      <div class="card3" v-show="card3" style="z-index:999;top:430px;left:108px;position:absolute;"></div>
      <div class="card98" v-show="card98" style="z-index:999;top:430px;left:143px;position:absolute;"></div>
      <div class="card4" v-show="card4" style="z-index:999;top:430px;left:202px;position:absolute;"></div>
      <div class="card5" v-show="card5" style="z-index:999;top:430px;left:227px;position:absolute;"></div>
      <div class="card6" v-show="card6" style="z-index:999;top:430px;left:253px;position:absolute;"></div>
      <div class="card7" v-show="card7" style="z-index:999;top:430px;left:280px;position:absolute;"></div>
      <div class="card8" v-show="card8" style="z-index:999;top:430px;left:308px;position:absolute;"></div>
      <div class="card9" v-show="card9" style="z-index:999;top:430px;left:337px;position:absolute;"></div>
      <div class="card10" v-show="card10" style="z-index:999;top:430px;left:364px;position:absolute;"></div>
      <div class="card11" v-show="card11" style="z-index:999;top:430px;left:391px;position:absolute;"></div>
      <div class="card99" v-show="card99" style="z-index:999;top:430px;left:426px;position:absolute;"></div>
      <div class="card12" v-show="card12" style="z-index:999;top:430px;left:489px;position:absolute;"></div>
      <div class="card13" v-show="card13" style="z-index:999;top:430px;left:514px;position:absolute;"></div>
      <div class="card14" v-show="card14" style="z-index:999;top:430px;left:540px;position:absolute;"></div>
      <div class="card15" v-show="card15" style="z-index:999;top:430px;left:566px;position:absolute;"></div>
      <div class="card16" v-show="card16" style="z-index:999;top:430px;left:595px;position:absolute;"></div>
      <div class="card17" v-show="card17" style="z-index:999;top:430px;left:624px;position:absolute;"></div>
      <div class="card18" v-show="card18" style="z-index:999;top:430px;left:654px;position:absolute;"></div>
      <div class="card19" v-show="card19" style="z-index:999;top:430px;left:682px;position:absolute;"></div>
      <div class="card20" v-show="card20" style="z-index:999;top:430px;left:707px;position:absolute;"></div>
      <div class="card25" v-show="card25" style="z-index:999;top:109px;left:664px;position:absolute;"></div>
      <div class="card24" v-show="card24" style="z-index:999;top:109px;left:639px;position:absolute;"></div>
      <div class="card23" v-show="card23" style="z-index:999;top:109px;left:616px;position:absolute;"></div>
      <div class="card22" v-show="card22" style="z-index:999;top:109px;left:592px;position:absolute;"></div>
      <div class="card21" v-show="card21" style="z-index:999;top:109px;left:564px;position:absolute;"></div>
      <div class="card101" v-show="card101" style="z-index:999;top:109px;left:364px;position:absolute;"></div>
      <div class="card102" v-show="card102" style="z-index:999;top:109px;left:334px;position:absolute;"></div>
      <div class="card103" v-show="card103" style="z-index:999;top:109px;left:96px;position:absolute;"></div>
      <div class="card104" v-show="card104" style="z-index:999;top:109px;left:70px;position:absolute;"></div>
    </div>
    <el-dialog v-model="dialogFormVisiblea" top="5vh" width="85%">
      <el-table ref="table" style="margin-top: 20px;height: 700px;" :data="tableDatab"
        :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
        <el-table-column prop="deviceId" fixed align="center" :label="$t('film.station')" min-width="80" />
        <el-table-column prop="slot" fixed align="center" :label="$t('film.slot')" min-width="80" />
        <el-table-column prop="patternWidth" align="center" :label="$t('film.width')" min-width="80" />
        <el-table-column prop="patternHeight" align="center" :label="$t('film.height')" min-width="80" />
        <el-table-column prop="patternThickness" align="center" :label="$t('film.thickness')" min-width="80" />
        <el-table-column prop="filmsId" align="center" :label="$t('film.films')" min-width="80" />
        <el-table-column prop="remainQuantity" align="center" :label="$t('film.remainquantity')" min-width="120" />
        <el-table-column align="center" :label="$t('film.enablestate')" min-width="80" prop="state">
          <template #default="scope">
            <el-tag :type="scope.row.state == 1 ? 'success' : 'danger'" @click="toggleEnableState(scope.row)">
              {{ scope.row.state == 1 ? $t('film.start') : $t('film.disable') }}
            </el-tag>
          </template>
        </el-table-column>
        <el-table-column fixed="right" :label="$t('film.operate')" align="center" width="270">
          <template #default="scope">
            <el-button type="text" plain @click="handleEdit(scope.row)">{{ $t('film.exit') }}</el-button>
            <el-button :disabled="!scope.row.remainQuantity" type="text" plain @click="deleteWarehousing(scope.row)">{{
              $t('film.delete') }}</el-button>
            <el-button :disabled="!scope.row.remainQuantity || scope.row.remainQuantity === 0" type="text" plain
              @click="openc(scope.row)">{{ $t('film.outbound') }}</el-button>
          </template>
        </el-table-column>
      </el-table>
    </el-dialog>
    <!-- 历史任务 -->
    <el-dialog v-model="blindb" top="5vh" width="95%" @close="iframeUrl = ''">
      <iframe :src="iframeUrl" marginwidth="2000px" marginheight="2000px" width="100%" height="750px"
        frameborder="0"></iframe>
    </el-dialog>
    <el-dialog v-model="dialogFormVisibleb" top="23vh" width="55%" :title="$t('film.addglass')">
      <div style="margin-left: -50px;margin-top: 10px;margin-bottom: 10px;">
        <el-form label-width="150px">
          <el-form label-width="100px" label-position="right">
            <el-row style="margin-top: -15px;margin-bottom: -2px;">
              <el-col :span="6">
                <div id="dt" style="font-size: 15px;">
                  <div>
                    <el-form-item :label="$t('film.widtha')" :required="true" style="width: 17vw;">
                      <el-input :placeholder="$t('film.inwidth')" v-model="patternWidth" autocomplete="off" />
                    </el-form-item>
                  </div>
                </div>
              </el-col>
              <el-col :span="9">
                <div id="dta" style="font-size: 15px;">
                  <div>
                    <el-form-item :label="$t('film.heighta')" :required="true" style="width: 17vw;">
                      <el-input :placeholder="$t('film.inheight')" v-model="patternHeight" autocomplete="off" />
                    </el-form-item>
                  </div>
                </div>
              </el-col>
            </el-row>
            <el-row style="margin-top: 10px;">
              <el-col :span="6">
                <div id="dt" style="font-size: 15px;">
                  <div>
                    <el-form-item :label="$t('film.thicknessa')" :required="true" style="width: 17vw;">
                      <el-input :placeholder="$t('film.inthickness')" v-model="patternThickness" autocomplete="off" />
                    </el-form-item>
                  </div>
                </div>
              </el-col>
              <el-col :span="9">
                <div id="dta" style="font-size: 15px;">
                  <div>
                    <el-form-item :label="$t('film.filmsa')" :required="true" style="width: 17vw;">
                      <el-input :placeholder="$t('film.infilms')" v-model="filmsId" autocomplete="off" />
                    </el-form-item>
                  </div>
                </div>
              </el-col>
            </el-row>
            <el-row style="margin-top: 10px;">
              <el-col :span="6">
                <div id="dt" style="font-size: 15px;">
                  <div>
                    <el-form-item :label="$t('film.quantitya')" :required="true" style="width: 17vw;">
                      <el-input :placeholder="$t('film.inquantity')" v-model="remainQuantity" autocomplete="off" />
                    </el-form-item>
                  </div>
                </div>
              </el-col>
              <el-col :span="9">
                <div id="dta" style="font-size: 15px;">
                  <div>
                    <el-form-item :label="$t('film.inwarehousing')" :required="true" style="width: 17vw">
                      <el-select :placeholder="$t('film.selectwarehousing')" style="width: 270px" v-model="slot">
                        <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
                      </el-select>
                    </el-form-item>
                  </div>
                </div>
              </el-col>
            </el-row>
          </el-form>
        </el-form>
      </div>
      <template #footer>
        <div id="dialog-footer">
          <el-button type="primary" @click="handleup">
            {{ $t('basicData.confirm') }}
          </el-button>
          <el-button @click="dialogFormVisibleb = false">{{ $t('basicData.cancel') }}</el-button>
        </div>
      </template>
    </el-dialog>
    <el-dialog v-model="dialogFormVisiblec" top="24vh" width="30%" :title="$t('film.pwarehousing')">
      <div style="margin-left: 50px;margin-bottom: 10px;">
        <el-form-item :label="$t('film.position')" :required="true">
          <el-select v-model="leftingStation" clearable :placeholder="$t('film.cposition')" style="margin-left: 20px;">
            <el-option :label="$t('film.position1')" value="98"></el-option>
            <el-option :label="$t('film.position2')" value="99"></el-option>
          </el-select>
        </el-form-item>
      </div>
      <template #footer>
        <div id="dialog-footer">
          <el-button type="primary" @click="handleupc">
            {{ $t('basicData.confirm') }}
          </el-button>
          <el-button @click="dialogFormVisiblec = false">{{ $t('basicData.cancel') }}</el-button>
        </div>
      </template>
    </el-dialog>
    <el-dialog v-model="dialogFormVisiblee" top="24vh" width="30%" :title="$t('film.pwareout')">
      <div style="margin-left: 50px;margin-bottom: 10px;">
        <el-form-item :label="$t('film.position')" :required="true">
          <el-select v-model="leftingStation" clearable :placeholder="$t('film.cposition')" style="margin-left: 20px;">
            <el-option :label="$t('film.position1')" value="98"></el-option>
            <el-option :label="$t('film.position2')" value="99"></el-option>
          </el-select>
        </el-form-item>
      </div>
      <template #footer>
        <div id="dialog-footer">
          <el-button type="primary" @click="handleupe">
            {{ $t('basicData.confirm') }}
          </el-button>
          <el-button @click="dialogFormVisiblee = false">{{ $t('basicData.cancel') }}</el-button>
        </div>
      </template>
    </el-dialog>
    <el-dialog v-model="Edit" top="23vh" width="55%" :title="$t('film.addglass')">
      <div style="margin-left: -50px;margin-top: 10px;margin-bottom: 10px;">
        <el-form label-width="150px">
          <el-form label-width="100px" label-position="right">
            <el-row style="margin-top: -15px;margin-bottom: -2px;">
              <el-col :span="6">
                <div id="dt" style="font-size: 15px;">
                  <div>
                    <el-form-item :label="$t('film.widtha')" :required="true" style="width: 17vw;">
                      <el-input :placeholder="$t('film.inwidth')" v-model="patternWidth" autocomplete="off" />
                    </el-form-item>
                  </div>
                </div>
              </el-col>
              <el-col :span="9">
                <div id="dta" style="font-size: 15px;">
                  <div>
                    <el-form-item :label="$t('film.heighta')" :required="true" style="width: 17vw;">
                      <el-input :placeholder="$t('film.inheight')" v-model="patternHeight" autocomplete="off" />
                    </el-form-item>
                  </div>
                </div>
              </el-col>
            </el-row>
            <el-row style="margin-top: 10px;">
              <el-col :span="6">
                <div id="dt" style="font-size: 15px;">
                  <div>
                    <el-form-item :label="$t('film.thicknessa')" :required="true" style="width: 17vw;">
                      <el-input :placeholder="$t('film.inthickness')" v-model="patternThickness" autocomplete="off" />
                    </el-form-item>
                  </div>
                </div>
              </el-col>
              <el-col :span="9">
                <div id="dta" style="font-size: 15px;">
                  <div>
                    <el-form-item :label="$t('film.filmsa')" :required="true" style="width: 17vw;">
                      <el-input :placeholder="$t('film.infilms')" v-model="filmsId" autocomplete="off" />
                    </el-form-item>
                  </div>
                </div>
              </el-col>
            </el-row>
            <el-row style="margin-top: 10px;">
              <el-col :span="6">
                <div id="dt" style="font-size: 15px;">
                  <div>
                    <el-form label-width="210px">
                      <el-form-item :label="$t('film.thickremainquantity')" :required="true"
                        style="width: 44.5vw;margin-left: -40px;">
                        <el-input v-model="remainQuantity" autocomplete="off" :placeholder="$t('film.inquantity')" />
                      </el-form-item>
                    </el-form>
                  </div>
                </div>
              </el-col>
            </el-row>
          </el-form>
        </el-form>
      </div>
      <template #footer>
        <div id="dialog-footer">
          <el-button type="primary" @click="Editclick">
            {{ $t('basicData.confirm') }}
          </el-button>
          <el-button @click="Edit = false">{{ $t('basicData.cancel') }}</el-button>
        </div>
      </template>
    </el-dialog>
  </div>
</template>
<style scoped>
#dt {
  display: block;
  float: left;
  line-height: 20px;
  margin-left: 100px;
}
#dta {
  display: block;
  float: left;
  line-height: 20px;
  margin-left: 80%;
}
.awatch {
  height: 400px;
  width: 1500px;
  max-width: 100%;
}
#dialog-footer {
  text-align: center;
  margin-top: -15px;
}
.img-dlpl {
  margin-left: 330px;
  margin-top: 10px;
  background-image: url('../../assets/ypcc.png');
  background-repeat: no-repeat;
  background-attachment: local;
  min-height: 700px;
  width: 800px;
  max-width: 100%;
  background-size: 800px 700px;
  overflow: hidden;
  position: relative
}
.img-car1 {
  display: flex;
  background-image: url('../../assets/C1.png');
  position: absolute;
  background-repeat: no-repeat;
  background-attachment: local;
  min-height: 150px;
  width: 70px;
  max-width: 100%;
  background-size: 70px 150px;
  overflow: hidden;
  position: relative
}
.card1 {
  width: 14px;
  height: 110px;
  background-color: #911005
}
.card2 {
  width: 14px;
  height: 110px;
  background-color: #911005
}
.card3 {
  width: 14px;
  height: 110px;
  background-color: #911005
}
.card4 {
  width: 14px;
  height: 110px;
  background-color: #911005
}
.card5 {
  width: 14px;
  height: 110px;
  background-color: #911005
}
.card6 {
  width: 14px;
  height: 110px;
  background-color: #911005
}
.card7 {
  width: 14px;
  height: 110px;
  background-color: #911005
}
.card8 {
  width: 14px;
  height: 110px;
  background-color: #911005
}
.card9 {
  width: 14px;
  height: 110px;
  background-color: #911005
}
.card10 {
  width: 14px;
  height: 110px;
  background-color: #911005
}
.card11 {
  width: 14px;
  height: 110px;
  background-color: #911005
}
.card12 {
  width: 14px;
  height: 110px;
  background-color: #911005
}
.card13 {
  width: 14px;
  height: 110px;
  background-color: #911005
}
.card14 {
  width: 14px;
  height: 110px;
  background-color: #911005
}
.card15 {
  width: 14px;
  height: 110px;
  background-color: #911005
}
.card16 {
  width: 14px;
  height: 110px;
  background-color: #911005
}
.card17 {
  width: 14px;
  height: 110px;
  background-color: #911005
}
.card18 {
  width: 14px;
  height: 110px;
  background-color: #911005
}
.card19 {
  width: 14px;
  height: 110px;
  background-color: #911005
}
.card20 {
  width: 14px;
  height: 110px;
  background-color: #911005
}
.card21 {
  width: 14px;
  height: 110px;
  background-color: #911005
}
.card22 {
  width: 14px;
  height: 110px;
  background-color: #911005
}
.card23 {
  width: 14px;
  height: 110px;
  background-color: #911005
}
.card24 {
  width: 14px;
  height: 110px;
  background-color: #911005
}
.card25 {
  width: 14px;
  height: 110px;
  background-color: #911005
}
.card101 {
  width: 10px;
  height: 110px;
  background-color: #911005
}
.card102 {
  width: 10px;
  height: 110px;
  background-color: #911005
}
.card103 {
  width: 10px;
  height: 110px;
  background-color: #911005
}
.card104 {
  width: 10px;
  height: 110px;
  background-color: #911005
}
.card98 {
  width: 25px;
  height: 110px;
  background-color: #911005
}
.card99 {
  width: 25px;
  height: 110px;
  background-color: #911005
}
</style>
UI-Project/src/views/GlassStorage/rawfilmstorage2.vue
New file
@@ -0,0 +1,1424 @@
<script lang="ts" setup>
import { onBeforeUnmount, onMounted, reactive, ref } from "vue";
import { useRouter } from "vue-router"
import { ElMessage, ElMessageBox } from 'element-plus'
import { useI18n } from 'vue-i18n'
import { host, WebSocketHost } from '@/utils/constants'
import dayjs from 'dayjs';
import request from "@/utils/request"
import { closeWebSocket, initializeWebSocket } from '@/utils/WebSocketService';
import { inject } from 'vue';
const router = useRouter()
const tableDataa = ref([])
const tableDatab = ref([])
const tableDatad = ref([])
const { t } = useI18n()
const add = ref(false)
const dialogFormVisiblea = ref(false)
const dialogFormVisibleb = ref(false)
const dialogFormVisiblec = ref(false)
const dialogFormVisiblee = ref(false)
const blindb = ref(false)
const Edit = ref(false)
const card1 = ref(false)
const card2 = ref(false)
const card3 = ref(false)
const card4 = ref(false)
const card5 = ref(false)
const card6 = ref(false)
const card7 = ref(false)
const card8 = ref(false)
const card9 = ref(false)
const card10 = ref(false)
const card11 = ref(false)
const card12 = ref(false)
const card13 = ref(false)
const card14 = ref(false)
const card15 = ref(false)
const card16 = ref(false)
const card17 = ref(false)
const card18 = ref(false)
const card19 = ref(false)
const card20 = ref(false)
const card21 = ref(false)
const card22 = ref(false)
const card23 = ref(false)
const card24 = ref(false)
const card25 = ref(false)
const card26 = ref(false)
const card27 = ref(false)
const card28 = ref(false)
const card31 = ref(false)
const card32 = ref(false)
const card33 = ref(false)
const card34 = ref(false)
const card35 = ref(false)
const card36 = ref(false)
const card37 = ref(false)
const card40 = ref(false)
const card41 = ref(false)
const card42 = ref(false)
const card43 = ref(false)
const card44 = ref(false)
const card45 = ref(false)
const card46 = ref(false)
const card47 = ref(false)
const card48 = ref(false)
const card49 = ref(false)
const card38 = ref(false)
const card101 = ref(false)
const timeRange = ref([])
const timeRangea = ref([])
const selectValuesa = reactive([]);
const selectValuesb = reactive([]);
const patternWidth = ref('');
const patternHeight = ref('');
const patternThickness = ref('');
const filmsId = ref('');
const remainQuantity = ref('');
const slot = ref('');
const leftingStation = ref('');
const loadingline = ref('');
let webSocket: WebSocket | null = null;
const globalDate = inject('globalDate');
const value = ref('')
const options = [
  {
    value: 101,
    label: t('film.warehousing1'),
  },
]
const report = ref({
  taskType: '',
  taskState: '',
});
let startTime = window.localStorage.getItem('startTime')
request.post("/glassStorage/rawGlassStorageTask/setRawGlassTaskRequest", {
  beginDate: startTime,
  endDate: globalDate,
}).then((response) => {
  if (response.code == 200) {
  } else {
    ElMessage.warning(response.msg)
  }
});
// 格式化后端时间并计算一周前的时间
const defaultTime = ref<[Date, Date]>([new Date(), new Date()]);
function parseAndSetTime() {
  const backendTime = new Date(globalDate);
  const oneWeekAgo = new Date(backendTime.getTime() - 7 * 24 * 60 * 60 * 1000); // 减去7天
  oneWeekAgo.setHours(0, 0, 0, 0);
  timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)];
  timeRangea.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)];
  window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
}
onMounted(() => {
  socket = initializeWebSocket(socketUrl, handleMessage);
  parseAndSetTime();
});
let socket = null;
const socketUrl = `ws://${WebSocketHost}:${host}/api/glassStorage/api/talk/rawGlass`;
const handleMessage = (data) => {
  const formattedTasks = data.tasks[0].map(task => {
    if (task && task.createTime) {
      return { ...task, createTime: formatTimestamp(task.createTime) };
    }
    return task;
  });
  tableDataa.value = formattedTasks;
  if (data.rawStationDetailsList != null) {
    tableDatab.value = data.rawStationDetailsList[0]
    if (data.rawStationDetailsList[0][0].patternThickness != null) {
      card1.value = true
    }
    if (data.rawStationDetailsList[0][1].patternThickness != null) {
      card2.value = true
    }
    if (data.rawStationDetailsList[0][2].patternThickness != null) {
      card3.value = true
    }
    if (data.rawStationDetailsList[0][3].patternThickness != null) {
      card4.value = true
    }
    if (data.rawStationDetailsList[0][4].patternThickness != null) {
      card5.value = true
    }
    if (data.rawStationDetailsList[0][5].patternThickness != null) {
      card6.value = true
    }
    if (data.rawStationDetailsList[0][6].patternThickness != null) {
      card7.value = true
    }
    if (data.rawStationDetailsList[0][7].patternThickness != null) {
      card8.value = true
    }
    if (data.rawStationDetailsList[0][8].patternThickness != null) {
      card9.value = true
    }
    if (data.rawStationDetailsList[0][9].patternThickness != null) {
      card10.value = true
    }
    if (data.rawStationDetailsList[0][10].patternThickness != null) {
      card11.value = true
    }
    if (data.rawStationDetailsList[0][11].patternThickness != null) {
      card12.value = true
    }
    if (data.rawStationDetailsList[0][12].patternThickness != null) {
      card13.value = true
    }
    if (data.rawStationDetailsList[0][13].patternThickness != null) {
      card14.value = true
    }
    if (data.rawStationDetailsList[0][14].patternThickness != null) {
      card15.value = true
    }
    if (data.rawStationDetailsList[0][15].patternThickness != null) {
      card16.value = true
    }
    if (data.rawStationDetailsList[0][16].patternThickness != null) {
      card17.value = true
    }
    if (data.rawStationDetailsList[0][17].patternThickness != null) {
      card18.value = true
    }
    if (data.rawStationDetailsList[0][18].patternThickness != null) {
      card19.value = true
    }
    if (data.rawStationDetailsList[0][19].patternThickness != null) {
      card20.value = true
    }
    if (data.rawStationDetailsList[0][20].patternThickness != null) {
      card21.value = true
    }
    if (data.rawStationDetailsList[0][21].patternThickness != null) {
      card22.value = true
    }
    if (data.rawStationDetailsList[0][22].patternThickness != null) {
      card23.value = true
    }
    if (data.rawStationDetailsList[0][23].patternThickness != null) {
      card24.value = true
    }
    if (data.rawStationDetailsList[0][24].patternThickness != null) {
      card25.value = true
    }
    if (data.rawStationDetailsList[0][25].patternThickness != null) {
      card26.value = true
    }
    if (data.rawStationDetailsList[0][26].patternThickness != null) {
      card27.value = true
    }
    if (data.rawStationDetailsList[0][27].patternThickness != null) {
      card28.value = true
    }
    if (data.rawStationDetailsList[0][28].patternThickness != null) {
      card31.value = true
    }
    if (data.rawStationDetailsList[0][29].patternThickness != null) {
      card32.value = true
    }
    if (data.rawStationDetailsList[0][30].patternThickness != null) {
      card33.value = true
    }
    if (data.rawStationDetailsList[0][31].patternThickness != null) {
      card34.value = true
    }
    if (data.rawStationDetailsList[0][32].patternThickness != null) {
      card35.value = true
    }
    if (data.rawStationDetailsList[0][33].patternThickness != null) {
      card36.value = true
    }
    if (data.rawStationDetailsList[0][34].patternThickness != null) {
      card37.value = true
    }
    if (data.rawStationDetailsList[0][35].patternThickness != null) {
      card40.value = true
    }
    if (data.rawStationDetailsList[0][36].patternThickness != null) {
      card41.value = true
    }
    if (data.rawStationDetailsList[0][37].patternThickness != null) {
      card42.value = true
    }
    if (data.rawStationDetailsList[0][38].patternThickness != null) {
      card43.value = true
    }
    if (data.rawStationDetailsList[0][39].patternThickness != null) {
      card44.value = true
    }
    if (data.rawStationDetailsList[0][40].patternThickness != null) {
      card45.value = true
    }
    if (data.rawStationDetailsList[0][41].patternThickness != null) {
      card46.value = true
    }
    if (data.rawStationDetailsList[0][42].patternThickness != null) {
      card47.value = true
    }
    if (data.rawStationDetailsList[0][43].patternThickness != null) {
      card48.value = true
    }
    if (data.rawStationDetailsList[0][44].patternThickness != null) {
      card49.value = true
    }
    if (data.rawStationDetailsList[0][45].patternThickness != null) {
      card38.value = true
    }
    if (data.rawStationDetailsList[0][46].patternThickness != null) {
      card101.value = true
    }
  }
};
const handleEdit = (row) => {
  window.localStorage.setItem('deviceId', row.deviceId)
  window.localStorage.setItem('slot', row.slot)
  Edit.value = true;
};
const handleBinda = (row) => {
  dialogFormVisibleb.value = true;
};
const handleBindc = (row) => {
  dialogFormVisiblec.value = true;
};
const handleBinde = (row) => {
  dialogFormVisiblee.value = true;
};
// 删除
const deleteWarehousing = async (row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('film.dedelete'),
      t('productStock.prompt'),
      {
        confirmButtonText: t('productStock.yes'),
        cancelButtonText: t('productStock.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      var url = "/glassStorage/rawGlassStorageDetails/deleteWarehousing?slot=" + row.slot;
      const response = await request.post(url)
      // const response = await request.post("/glassStorage/rawGlassStorageDetails/deleteWarehousing",[row.slotId])
      if (response.code === 200) {
        ElMessage.success(response.message);
      } else {
        ElMessage.error(response.msg);
      }
    }
  } catch (error) {
  }
};
// 原片入库
const handleup = async () => {
  try {
    const response = await request.post('/glassStorage/rawGlassStorageDetails/patternWarehousing', {
      patternWidth: patternWidth.value,
      patternHeight: patternHeight.value,
      patternThickness: patternThickness.value,
      filmsId: filmsId.value,
      remainQuantity: remainQuantity.value,
      slot: slot.value,
    });
    if (response.code === 200) {
      ElMessage.success(response.message);
      dialogFormVisibleb.value = false;
      patternWidth.value = '';
      patternHeight.value = '';
      patternThickness.value = '';
      filmsId.value = '';
      remainQuantity.value = '';
      slot.value = '';
    } else {
      ElMessage.error(response.message);
    }
  } catch (error) {
  }
};
// 入库请求
const handleupc = async () => {
  try {
    var url = "/glassStorage/rawGlassStorageDetails/warehousingRequest?leftingStation=" + leftingStation.value;
    const response = await request.post(url)
    if (response.code == 200) {
      ElMessage.success(response.message);
      dialogFormVisiblec.value = false;
      leftingStation.value = '';
    } else {
      // 请求失败,显示错误消息
      ElMessage.error(response.msg);
    }
  }
  catch (error) {
  }
}
// 出库请求
const handleupe = async () => {
  try {
    var url = "/glassStorage/rawGlassStorageDetails/outWarehousingRequest?leftingStation=" + leftingStation.value;
    const response = await request.post(url)
    if (response.code == 200) {
      ElMessage.success(response.message);
      dialogFormVisiblee.value = false;
      leftingStation.value = '';
    } else {
      // 请求失败,显示错误消息
      ElMessage.error(response.msg);
    }
  }
  catch (error) {
  }
}
// 出库
const openc = async (row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('film.deoutbound'),
      t('productStock.prompt'),
      {
        confirmButtonText: t('productStock.yes'),
        cancelButtonText: t('productStock.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      var url = "/glassStorage/rawGlassStorageDetails/outWarehousing?slotId=" + row.slot;
      const response = await request.post(url)
      // const response = await request.post("/glassStorage/rawGlassStorageDetails/outWarehousing",[row.slotId])
      if (response.code === 200) {
        ElMessage.success(response.message);
      } else {
        ElMessage.error(response.msg);
      }
    }
  } catch (error) {
  }
};
// 查询数据
const selectReportData = 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]];
    }
  }
  const response = await request.post("/glassStorage/rawGlassStorageTask/setRawGlassTaskRequest", {
    beginDate: (timeRange.value && timeRange.value[0]) || '',
    endDate: (timeRange.value && timeRange.value[1]) || '',
    taskState: celllist,
    taskType: stateList
  })
  if (response.code === 200) {
    // tableDataa.value = response.data;
    ElMessage.success(response.message);
  }
  else {
    ElMessage.error(response.message);
  }
};
// 是否禁用
const toggleEnableState = async (row: any) => {
  if (!row.deviceId) {
    ElMessage.error(t('basicData.updatanull'));
    return;
  }
  const newState = row.state === 1 ? 0 : 1;
  try {
    var url = "/glassStorage/rawGlassStorageStation/updateSlotState?slot=" + row.slot + "&state=" + newState;
    const response = await request.post(url)
    if (response.code === 200) {
      ElMessage.success(response.message);
      row.state = newState;
    } else {
      ElMessage.error(response.message);
    }
    row.state = newState;
  } catch (error) {
    ElMessage.error(t('basicData.glassnull'));
  }
};
// 修改数量
const Editclick = async () => {
  let slot = window.localStorage.getItem('slot')
  let deviceId = window.localStorage.getItem('deviceId')
  try {
    const response = await request.post('/glassStorage/rawGlassStorageDetails/updateQuantity', {
      deviceId: deviceId,
      slot: slot,
      remainQuantity: remainQuantity.value,
      filmsId: filmsId.value,
      patternThickness: patternThickness.value,
      patternHeight: patternHeight.value,
      patternWidth: patternWidth.value,
    }
    );
    if (response.code === 200) {
      ElMessage.success(response.message);
      Edit.value = false;
      tableDatab.value = response.data;
      patternWidth.value = '';
      patternHeight.value = '';
      patternThickness.value = '';
      filmsId.value = '';
      remainQuantity.value = '';
    } else {
      ElMessage.error(response.message);
    }
  } catch (error) {
  }
};
// 格式化时间戳为年月日时间字符串的函数
function formatTimestamp(timestamp: number | Date): string {
  const date = new Date(timestamp);
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const day = String(date.getDate()).padStart(2, '0');
  const hours = String(date.getHours()).padStart(2, '0');
  const minutes = String(date.getMinutes()).padStart(2, '0');
  const seconds = String(date.getSeconds()).padStart(2, '0');
  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
// 历史任务
const iframeUrl = ref('');
const handlehistorical = (row) => {
  // historical()
  // window.localStorage.setItem('pagenumber', 1)
  blindb.value = true;
  iframeUrl.value = `${window.location.origin}/#/GlassStorage/rawhistory`;
};
// const historical = async () => {
//   try {
//   let startTime = window.localStorage.getItem('startTime')
//       const response = await request.post("/glassStorage/rawGlassStorageTask/queryRawGlassHistoryTask", {
//         pageNo: 1,
//         pageSize: 20,
//         taskState: [],
//         taskType: [],
//         beginDate: startTime,
//         endDate: globalDate
//     })
//       if (response.code == 200) {
//   window.localStorage.setItem('pagenumber', 1)
// } else {
//     }
// }
// catch (error) {
//   }
// }
// 任务成功处理
const successfull = async (row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.psuccessfullyprocessed'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      var url = "/glassStorage/rawGlassStorageTask/taskSuccess?taskId=" + row.id;
      const response = await request.post(url)
      if (response.code === 200) {
        ElMessage.success(response.message);
      } else {
        ElMessage.error(response.msg);
      }
    }
  } catch (error) {
  }
};
// 任务失败处理
const handleptask = async (row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.ptaskfailure'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      var url = "/glassStorage/rawGlassStorageTask/taskError?taskId=" + row.id;
      const response = await request.post(url)
      if (response.code === 200) {
        ElMessage.success(response.message);
      } else {
        ElMessage.error(response.msg);
      }
    }
  } catch (error) {
  }
};
function getStatusType1(taskType) {
  switch (taskType) {
    case 1:
      return 'info';
    case 2:
      return 'warning';
    case 3:
      return 'success';
    case 4:
      return 'danger';
    case 5:
      return 'primary';
  }
}
function getStatusText1(taskType) {
  switch (taskType) {
    case 1:
      return t('sorter.advancetask');//进片任务
    case 2:
      return t('sorter.outputtasks');//出片任务
    case 3:
      return t('sorter.schedulingtasks');//调度任务
    case 4:
      return t('sorter.advancerequests');//进片请求
    case 5:
      return t('sorter.releaserequest');//出片请求
  }
}
function getStatusType2(taskState) {
  switch (taskState) {
    case 0:
      return 'info';
    case 2:
      return 'warning';
    case 1:
      return 'success';
  }
}
function getStatusText2(taskState) {
  switch (taskState) {
    case 0:
      return t('film.built');//新建
    case 2:
      return t('film.fail');//失败
    case 1:
      return t('film.finish');//完成
  }
}
onBeforeUnmount(() => {
  closeWebSocket();
});
</script>
<template>
  <div style="height: 500px;">
    <div style="display: flex; flex-direction: row; align-items: center; margin-top: 20px;">
      <el-button style="margin-left: 20px;" id="searchButton" type="success" @click="dialogFormVisiblea = true">
        {{ $t('film.mes') }}
      </el-button>
      <el-button style="margin-left: 20px;" id="searchButton" type="success" @click="handleBinda">
        {{ $t('film.warehousing') }}
      </el-button>
      <el-button style="margin-left: 20px;" id="searchButton" type="success" @click="handleBindc">
        {{ $t('film.pwarehousing') }}
      </el-button>
      <el-button style="margin-left: 20px;" id="searchButton" type="success" @click="handleBinde">{{
        $t('film.pwareout')
      }}
      </el-button>
      <el-button style="margin-left: 20px;" id="searchButton" type="success" @click="handlehistorical">{{
        $t('searchOrder.historicaltasks')
      }}
      </el-button>
      <el-date-picker style="margin-left: 10px;" v-model="timeRange" type="datetimerange" format="YYYY/MM/DD HH:mm:ss"
        value-format="YYYY-MM-DD HH:mm:ss" :start-placeholder="$t('film.starttime')"
        :end-placeholder="$t('film.endtime')" :default-time="defaultTime" />
      <el-select v-model="selectValuesa[0]" clearable :placeholder="$t('film.taskstatus')" style="margin-left: 10px;">
        <el-option :label="$t('film.built')" value="0"></el-option>
        <el-option :label="$t('film.finish')" value="1"></el-option>
        <el-option :label="$t('film.fail')" value="2"></el-option>
      </el-select>
      <el-select v-model="selectValuesa[1]" clearable :placeholder="$t('film.tasktype')" style="margin-left: 10px;">
        <el-option :label="$t('sorter.advancetask')" value="1"></el-option>
        <el-option :label="$t('sorter.outputtasks')" value="2"></el-option>
        <el-option :label="$t('sorter.schedulingtasks')" value="3"></el-option>
        <el-option :label="$t('sorter.advancerequests')" value="4"></el-option>
        <el-option :label="$t('sorter.releaserequest')" value="5"></el-option>
      </el-select>
      <el-button type="primary" style="margin-left: 10px;" @click="selectReportData()">{{ $t('film.inquire')
      }}</el-button>
    </div>
    <el-card style="flex: 1;margin-left: 10px;margin-top: 20px;">
      <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
        <el-table height="300" ref="table" :data="tableDataa"
          :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
          <el-table-column prop="id" align="center" :label="$t('film.enableid')" />
          <el-table-column prop="startSlot" align="center" :label="$t('film.originateslot')" />
          <el-table-column prop="endSlot" align="center" :label="$t('film.endoriginateslot')" />
          <el-table-column prop="patternQuantity" align="center" :label="$t('film.patternquantity')" />
          <el-table-column width="100" align="center" :label="$t('film.enabletype')" prop="taskType">
            <template #default="scope">
              <el-tag :type="getStatusType1(scope.row.taskType)">
                {{ getStatusText1(scope.row.taskType) }}
              </el-tag>
            </template>
          </el-table-column>
          <el-table-column align="center" :label="$t('film.taskstatus')" prop="taskState">
            <template #default="scope">
              <el-tag :type="getStatusType2(scope.row.taskState)">
                {{ getStatusText2(scope.row.taskState) }}
              </el-tag>
            </template>
          </el-table-column>
          <el-table-column prop="createTime" align="center" :label="$t('film.createtime')" />
          <el-table-column fixed="right" :label="$t('film.operate')" align="center">
            <template #default="scope">
              <el-button :disabled="(scope.row.taskState !== 0)" type="text" plain @click="successfull(scope.row)">{{
                $t('searchOrder.successfullyprocessed') }}</el-button>
              <el-button :disabled="(scope.row.taskState !== 0)" type="text" plain @click="handleptask(scope.row)">{{
                $t('searchOrder.taskfailure') }}</el-button>
            </template>
          </el-table-column>
        </el-table>
      </div>
    </el-card>
    <div class="img-dlpl">
      <div class="img-car1" style="z-index:999;top:250px;left:20px;position:absolute;"></div>
      <div class="glasscard1">
        <!-- <div class="img-car1" :style="'z-index:999;top:250px;left:' + 20 + 'px;position:absolute;'"></div> -->
        <div class="card1" v-show="card1" style="z-index:999;"></div>
        <div class="card2" v-show="card2" style="z-index:999;"></div>
        <div class="card3" v-show="card3" style="z-index:999;"></div>
        <div class="card4" v-show="card4" style="z-index:999;"></div>
        <div class="card5" v-show="card5" style="z-index:999;"></div>
        <div class="card6" v-show="card6" style="z-index:999;"></div>
        <div class="card7" v-show="card7" style="z-index:999;"></div>
        <div class="card8" v-show="card8" style="z-index:999;"></div>
        <div class="card9" v-show="card9" style="z-index:999;"></div>
        <div class="card10" v-show="card10" style="z-index:999;"></div>
        <div class="card11" v-show="card11" style="z-index:999;"></div>
        <div class="card12" v-show="card12" style="z-index:999;"></div>
        <div class="card13" v-show="card13" style="z-index:999;"></div>
        <div class="card14" v-show="card14" style="z-index:999;"></div>
        <div class="card15" v-show="card15" style="z-index:999;"></div>
        <div class="card16" v-show="card16" style="z-index:999;"></div>
        <div class="card17" v-show="card17" style="z-index:999;"></div>
        <div class="card18" v-show="card18" style="z-index:999;"></div>
        <div class="card19" v-show="card19" style="z-index:999;"></div>
        <div class="card20" v-show="card20" style="z-index:999;"></div>
        <div class="card21" v-show="card21" style="z-index:999;"></div>
        <div class="card22" v-show="card22" style="z-index:999;"></div>
        <div class="card23" v-show="card23" style="z-index:999;"></div>
        <div class="card24" v-show="card24" style="z-index:999;"></div>
        <div class="card25" v-show="card25" style="z-index:999;"></div>
        <div class="card26" v-show="card26" style="z-index:999;"></div>
        <div class="card27" v-show="card27" style="z-index:999;"></div>
        <div class="card28" v-show="card28" style="z-index:999;position:absolute;"></div>
      </div>
      <div class="glasscard2">
        <div class="card31" v-show="card31" style="z-index:999;"></div>
        <div class="card32" v-show="card32" style="z-index:999;"></div>
        <div class="card33" v-show="card33" style="z-index:999;"></div>
        <div class="card34" v-show="card34" style="z-index:999;"></div>
        <div class="card35" v-show="card35" style="z-index:999;"></div>
        <div class="card36" v-show="card36" style="z-index:999;"></div>
        <div class="card37" v-show="card37" style="z-index:999;"></div>
        <div class="card38" v-show="card38" style="z-index:999;"></div>
      </div>
      <div class="glasscard3">
        <div class="card40" v-show="card40" style="z-index:999;"></div>
        <div class="card41" v-show="card41" style="z-index:999;"></div>
        <div class="card42" v-show="card42" style="z-index:999;"></div>
        <div class="card43" v-show="card43" style="z-index:999;"></div>
        <div class="card44" v-show="card44" style="z-index:999;"></div>
        <div class="card45" v-show="card45" style="z-index:999;"></div>
        <div class="card46" v-show="card46" style="z-index:999;"></div>
        <div class="card47" v-show="card47" style="z-index:999;"></div>
        <div class="card48" v-show="card48" style="z-index:999;"></div>
        <div class="card49" v-show="card49" style="z-index:999;"></div>
      </div>
      <div class="card101" v-show="card101" style="z-index:999;"></div>
    </div>
    <el-dialog v-model="dialogFormVisiblea" top="5vh" width="85%">
      <el-table ref="table" style="margin-top: 20px;height: 700px;" :data="tableDatab"
        :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
        <el-table-column prop="deviceId" fixed align="center" :label="$t('film.station')" min-width="80" />
        <el-table-column prop="slot" fixed align="center" :label="$t('film.slot')" min-width="80" />
        <el-table-column prop="patternWidth" align="center" :label="$t('film.width')" min-width="80" />
        <el-table-column prop="patternHeight" align="center" :label="$t('film.height')" min-width="80" />
        <el-table-column prop="patternThickness" align="center" :label="$t('film.thickness')" min-width="80" />
        <el-table-column prop="filmsId" align="center" :label="$t('film.films')" min-width="80" />
        <el-table-column prop="remainQuantity" align="center" :label="$t('film.remainquantity')" min-width="120" />
        <el-table-column align="center" :label="$t('film.enablestate')" min-width="80" prop="state">
          <template #default="scope">
            <el-tag :type="scope.row.state == 1 ? 'success' : 'danger'" @click="toggleEnableState(scope.row)">
              {{ scope.row.state == 1 ? $t('film.start') : $t('film.disable') }}
            </el-tag>
          </template>
        </el-table-column>
        <el-table-column fixed="right" :label="$t('film.operate')" align="center" width="270">
          <template #default="scope">
            <el-button type="text" plain @click="handleEdit(scope.row)">{{ $t('film.exit') }}</el-button>
            <el-button :disabled="!scope.row.remainQuantity" type="text" plain @click="deleteWarehousing(scope.row)">{{
              $t('film.delete') }}</el-button>
            <el-button :disabled="!scope.row.remainQuantity || scope.row.remainQuantity === 0" type="text" plain
              @click="openc(scope.row)">{{ $t('film.outbound') }}</el-button>
          </template>
        </el-table-column>
      </el-table>
    </el-dialog>
    <!-- 历史任务 -->
    <el-dialog v-model="blindb" top="5vh" width="95%" @close="iframeUrl = ''">
      <iframe :src="iframeUrl" marginwidth="2000px" marginheight="2000px" width="100%" height="750px"
        frameborder="0"></iframe>
    </el-dialog>
    <el-dialog v-model="dialogFormVisibleb" top="23vh" width="55%" :title="$t('film.addglass')">
      <div style="margin-left: -50px;margin-top: 10px;margin-bottom: 10px;">
        <el-form label-width="150px">
          <el-form label-width="100px" label-position="right">
            <el-row style="margin-top: -15px;margin-bottom: -2px;">
              <el-col :span="6">
                <div id="dt" style="font-size: 15px;">
                  <div>
                    <el-form-item :label="$t('film.widtha')" :required="true" style="width: 17vw;">
                      <el-input :placeholder="$t('film.inwidth')" v-model="patternWidth" autocomplete="off" />
                    </el-form-item>
                  </div>
                </div>
              </el-col>
              <el-col :span="9">
                <div id="dta" style="font-size: 15px;">
                  <div>
                    <el-form-item :label="$t('film.heighta')" :required="true" style="width: 17vw;">
                      <el-input :placeholder="$t('film.inheight')" v-model="patternHeight" autocomplete="off" />
                    </el-form-item>
                  </div>
                </div>
              </el-col>
            </el-row>
            <el-row style="margin-top: 10px;">
              <el-col :span="6">
                <div id="dt" style="font-size: 15px;">
                  <div>
                    <el-form-item :label="$t('film.thicknessa')" :required="true" style="width: 17vw;">
                      <el-input :placeholder="$t('film.inthickness')" v-model="patternThickness" autocomplete="off" />
                    </el-form-item>
                  </div>
                </div>
              </el-col>
              <el-col :span="9">
                <div id="dta" style="font-size: 15px;">
                  <div>
                    <el-form-item :label="$t('film.filmsa')" :required="true" style="width: 17vw;">
                      <el-input :placeholder="$t('film.infilms')" v-model="filmsId" autocomplete="off" />
                    </el-form-item>
                  </div>
                </div>
              </el-col>
            </el-row>
            <el-row style="margin-top: 10px;">
              <el-col :span="6">
                <div id="dt" style="font-size: 15px;">
                  <div>
                    <el-form-item :label="$t('film.quantitya')" :required="true" style="width: 17vw;">
                      <el-input :placeholder="$t('film.inquantity')" v-model="remainQuantity" autocomplete="off" />
                    </el-form-item>
                  </div>
                </div>
              </el-col>
              <el-col :span="9">
                <div id="dta" style="font-size: 15px;">
                  <div>
                    <el-form-item :label="$t('film.inwarehousing')" :required="true" style="width: 17vw">
                      <el-select :placeholder="$t('film.selectwarehousing')" style="width: 270px" v-model="slot">
                        <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
                      </el-select>
                    </el-form-item>
                  </div>
                </div>
              </el-col>
            </el-row>
          </el-form>
        </el-form>
      </div>
      <template #footer>
        <div id="dialog-footer">
          <el-button type="primary" @click="handleup">
            {{ $t('basicData.confirm') }}
          </el-button>
          <el-button @click="dialogFormVisibleb = false">{{ $t('basicData.cancel') }}</el-button>
        </div>
      </template>
    </el-dialog>
    <el-dialog v-model="dialogFormVisiblec" top="24vh" width="30%" :title="$t('film.pwarehousing')">
      <div style="margin-left: 50px;margin-bottom: 10px;">
        <el-form-item :label="$t('film.position')" :required="true">
          <el-select v-model="leftingStation" clearable :placeholder="$t('film.cposition')" style="margin-left: 20px;">
            <el-option :label="$t('film.position1')" value="101"></el-option>
          </el-select>
        </el-form-item>
      </div>
      <template #footer>
        <div id="dialog-footer">
          <el-button type="primary" @click="handleupc">
            {{ $t('basicData.confirm') }}
          </el-button>
          <el-button @click="dialogFormVisiblec = false">{{ $t('basicData.cancel') }}</el-button>
        </div>
      </template>
    </el-dialog>
    <el-dialog v-model="dialogFormVisiblee" top="24vh" width="30%" :title="$t('film.pwareout')">
      <div style="margin-left: 50px;margin-bottom: 10px;">
        <el-form-item :label="$t('film.position')" :required="true">
          <el-select v-model="leftingStation" clearable :placeholder="$t('film.cposition')" style="margin-left: 20px;">
            <el-option :label="$t('film.position1')" value="101"></el-option>
          </el-select>
        </el-form-item>
      </div>
      <template #footer>
        <div id="dialog-footer">
          <el-button type="primary" @click="handleupe">
            {{ $t('basicData.confirm') }}
          </el-button>
          <el-button @click="dialogFormVisiblee = false">{{ $t('basicData.cancel') }}</el-button>
        </div>
      </template>
    </el-dialog>
    <el-dialog v-model="Edit" top="23vh" width="55%" :title="$t('film.addglass')">
      <div style="margin-left: -50px;margin-top: 10px;margin-bottom: 10px;">
        <el-form label-width="150px">
          <el-form label-width="100px" label-position="right">
            <el-row style="margin-top: -15px;margin-bottom: -2px;">
              <el-col :span="6">
                <div id="dt" style="font-size: 15px;">
                  <div>
                    <el-form-item :label="$t('film.widtha')" :required="true" style="width: 17vw;">
                      <el-input :placeholder="$t('film.inwidth')" v-model="patternWidth" autocomplete="off" />
                    </el-form-item>
                  </div>
                </div>
              </el-col>
              <el-col :span="9">
                <div id="dta" style="font-size: 15px;">
                  <div>
                    <el-form-item :label="$t('film.heighta')" :required="true" style="width: 17vw;">
                      <el-input :placeholder="$t('film.inheight')" v-model="patternHeight" autocomplete="off" />
                    </el-form-item>
                  </div>
                </div>
              </el-col>
            </el-row>
            <el-row style="margin-top: 10px;">
              <el-col :span="6">
                <div id="dt" style="font-size: 15px;">
                  <div>
                    <el-form-item :label="$t('film.thicknessa')" :required="true" style="width: 17vw;">
                      <el-input :placeholder="$t('film.inthickness')" v-model="patternThickness" autocomplete="off" />
                    </el-form-item>
                  </div>
                </div>
              </el-col>
              <el-col :span="9">
                <div id="dta" style="font-size: 15px;">
                  <div>
                    <el-form-item :label="$t('film.filmsa')" :required="true" style="width: 17vw;">
                      <el-input :placeholder="$t('film.infilms')" v-model="filmsId" autocomplete="off" />
                    </el-form-item>
                  </div>
                </div>
              </el-col>
            </el-row>
            <el-row style="margin-top: 10px;">
              <el-col :span="6">
                <div id="dt" style="font-size: 15px;">
                  <div>
                    <el-form label-width="210px">
                      <el-form-item :label="$t('film.thickremainquantity')" :required="true"
                        style="width: 44.5vw;margin-left: -40px;">
                        <el-input v-model="remainQuantity" autocomplete="off" :placeholder="$t('film.inquantity')" />
                      </el-form-item>
                    </el-form>
                  </div>
                </div>
              </el-col>
            </el-row>
          </el-form>
        </el-form>
      </div>
      <template #footer>
        <div id="dialog-footer">
          <el-button type="primary" @click="Editclick">
            {{ $t('basicData.confirm') }}
          </el-button>
          <el-button @click="Edit = false">{{ $t('basicData.cancel') }}</el-button>
        </div>
      </template>
    </el-dialog>
  </div>
</template>
<style scoped>
#dt {
  display: block;
  float: left;
  line-height: 20px;
  margin-left: 100px;
}
#dta {
  display: block;
  float: left;
  line-height: 20px;
  margin-left: 80%;
}
.awatch {
  height: 400px;
  width: 1500px;
  max-width: 100%;
}
#dialog-footer {
  text-align: center;
  margin-top: -15px;
}
.img-dlpl {
  margin-left: 38px;
  margin-top: 15px;
  background-image: url('../../assets/cangchu2.png');
  background-repeat: no-repeat;
  background-attachment: local;
  min-height: 800px;
  width: 1070px;
  max-width: 100%;
  background-size: 1500px 810px;
  overflow: hidden;
  position: relative;
}
.img-car1 {
  display: flex;
  background-image: url('../../assets/cangchu1.png');
  position: absolute;
  background-repeat: no-repeat;
  background-attachment: local;
  min-height: 242px;
  width: 240px;
  max-width: 100%;
  background-size: 270px 327px;
  overflow: hidden;
  position: relative;
  margin-left: 866px;
  margin-top: 107px
}
.glasscard1 {
  height: 118px;
  position: relative;
  margin-top: 625px;
  margin-left: 493px;
}
.card1 {
  width: 8px;
  height: 95px;
  background-color: #911005;
  position: absolute;
  left: 0;
}
.card2 {
  width: 8px;
  height: 95px;
  background-color: #911005;
  position: absolute;
  left: 19px;
}
.card3 {
  width: 8px;
  height: 95px;
  background-color: #911005;
  position: absolute;
  left: 38px;
}
.card4 {
  width: 8px;
  height: 95px;
  background-color: #911005;
  position: absolute;
  left: 57px;
}
.card5 {
  width: 8px;
  height: 95px;
  background-color: #911005;
  position: absolute;
  left: 76px;
}
.card6 {
  width: 8px;
  height: 95px;
  background-color: #911005;
  position: absolute;
  left: 95px;
}
.card7 {
  width: 8px;
  height: 95px;
  background-color: #911005;
  position: absolute;
  left: 114px;
}
.card8 {
  width: 8px;
  height: 95px;
  background-color: #911005;
  position: absolute;
  left: 133px;
}
.card9 {
  width: 8px;
  height: 95px;
  background-color: #911005;
  position: absolute;
  left: 152px;
}
.card10 {
  width: 8px;
  height: 95px;
  background-color: #911005;
  position: absolute;
  left: 171px;
}
.card11 {
  width: 8px;
  height: 95px;
  background-color: #911005;
  position: absolute;
  left: 190px;
}
.card12 {
  width: 8px;
  height: 95px;
  background-color: #911005;
  position: absolute;
  left: 209px;
}
.card13 {
  width: 8px;
  height: 95px;
  background-color: #911005;
  position: absolute;
  left: 228px;
}
.card14 {
  width: 8px;
  height: 95px;
  background-color: #911005;
  position: absolute;
  left: 247px;
}
.card15 {
  width: 8px;
  height: 95px;
  background-color: #911005;
  position: absolute;
  left: 266px;
}
.card16 {
  width: 8px;
  height: 95px;
  background-color: #911005;
  position: absolute;
  left: 285px;
}
.card17 {
  width: 8px;
  height: 95px;
  background-color: #911005;
  position: absolute;
  left: 304px;
}
.card18 {
  width: 8px;
  height: 95px;
  background-color: #911005;
  position: absolute;
  left: 323px;
}
.card19 {
  width: 8px;
  height: 95px;
  background-color: #911005;
  position: absolute;
  left: 342px;
}
.card20 {
  width: 8px;
  height: 95px;
  background-color: #911005;
  position: absolute;
  left: 361px;
}
.card21 {
  width: 8px;
  height: 95px;
  background-color: #911005;
  position: absolute;
  left: 380px;
}
.card22 {
  width: 8px;
  height: 95px;
  background-color: #911005;
  position: absolute;
  left: 399px;
}
.card23 {
  width: 8px;
  height: 95px;
  background-color: #911005;
  position: absolute;
  left: 418px;
}
.card24 {
  width: 8px;
  height: 95px;
  background-color: #911005;
  position: absolute;
  left: 437px;
}
.card25 {
  width: 8px;
  height: 95px;
  background-color: #911005;
  position: absolute;
  left: 456px;
}
.card26 {
  width: 8px;
  height: 95px;
  background-color: #911005;
  position: absolute;
  left: 475px;
}
.card27 {
  width: 8px;
  height: 95px;
  background-color: #911005;
  position: absolute;
  left: 494px;
}
.card28 {
  width: 8px;
  height: 95px;
  background-color: #911005;
  position: absolute;
  left: 513px;
}
.glasscard2 {
  position: relative;
  margin-top: -420px;
  margin-left: 495px;
}
.card31 {
  width: 8px;
  height: 90px;
  background-color: #911005;
  position: absolute;
  left: 0;
}
.card32 {
  width: 8px;
  height: 90px;
  background-color: #911005;
  position: absolute;
  left: 19px;
}
.card33 {
  width: 8px;
  height: 90px;
  background-color: #911005;
  position: absolute;
  left: 38px;
}
.card34 {
  width: 8px;
  height: 90px;
  background-color: #911005;
  position: absolute;
  left: 57px;
}
.card35 {
  width: 8px;
  height: 90px;
  background-color: #911005;
  position: absolute;
  left: 76px;
}
.card36 {
  width: 8px;
  height: 90px;
  background-color: #911005;
  position: absolute;
  left: 95px;
}
.card37 {
  width: 8px;
  height: 90px;
  background-color: #911005;
  position: absolute;
  left: 114px;
}
.card38 {
  width: 8px;
  height: 90px;
  background-color: #911005;
  position: absolute;
  left: 136px;
}
.glasscard3 {
  position: relative;
  margin-left: 806px;
  margin-top: -90px;
}
.card40 {
  width: 8px;
  height: 90px;
  background-color: #911005;
  position: absolute;
  left: 0;
}
.card41 {
  width: 8px;
  height: 90px;
  background-color: #911005;
  position: absolute;
  left: 19px;
}
.card42 {
  width: 8px;
  height: 90px;
  background-color: #911005;
  position: absolute;
  left: 38px;
}
.card43 {
  width: 8px;
  height: 90px;
  background-color: #911005;
  position: absolute;
  left: 57px;
}
.card44 {
  width: 8px;
  height: 90px;
  background-color: #911005;
  position: absolute;
  left: 76px;
}
.card45 {
  width: 8px;
  height: 90px;
  background-color: #911005;
  position: absolute;
  left: 95px;
}
.card46 {
  width: 8px;
  height: 90px;
  background-color: #911005;
  position: absolute;
  left: 114px;
}
.card47 {
  width: 8px;
  height: 90px;
  background-color: #911005;
  position: absolute;
  left: 133px;
}
.card48 {
  width: 8px;
  height: 90px;
  background-color: #911005;
  position: absolute;
  left: 152px;
}
.card49 {
  width: 8px;
  height: 90px;
  background-color: #911005;
  position: absolute;
  left: 171px;
}
.card101 {
  width: 8px;
  height: 90px;
  background-color: #911005;
  position: absolute;
  left: 1023px;
}
</style>
UI-Project/src/views/GlassStorage/rawhistory.vue
New file
@@ -0,0 +1,400 @@
<template>
    <div>
  <div style="display: flex;width: 1770px;">
          <el-select v-model="selectValuesa[0]" filterable :placeholder="$t('searchOrder.taskstatus')" clearable
          style="width: 200px;margin-left: 10px;">
          <el-option :label="$t('film.built')" value="0"></el-option>
          <el-option :label="$t('film.finish')" value="1"></el-option>
          <el-option :label="$t('film.fail')" value="2"></el-option>
        </el-select>
        <el-select v-model="selectValuesa[1]" filterable :placeholder="$t('film.enabletype')" clearable
          style="width: 200px;margin-left: 10px;">
          <el-option :label="$t('sorter.advancetask')" value="1"></el-option>
          <el-option :label="$t('sorter.outputtasks')" value="2"></el-option>
          <el-option :label="$t('sorter.schedulingtasks')" value="3"></el-option>
          <el-option :label="$t('sorter.advancerequests')" value="4"></el-option>
          <el-option :label="$t('sorter.releaserequest')" value="5"></el-option>
        </el-select>
        <el-date-picker
            style="margin-left: 15px;"
             v-model="timeRange"
             type="datetimerange"
             :shortcuts="shortcuts"
             range-separator="至"
             :start-placeholder="$t('reportmanage.starttime')"
             :end-placeholder="$t('reportmanage.endtime')"
           />
          <el-button type="primary" style="margin-left: 10px;margin-bottom: 10px;" @click="sethistorical()">{{$t('reportmanage.inquire')}}</el-button>
     </div>
        <el-table ref="table" style="margin-top: 20px;height: 580px;width: 1770px;" :data="tableDatax" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
      <el-table-column prop="startSlot" align="center" :label="$t('film.originateslot')" min-width="50" />
          <el-table-column prop="endSlot" align="center" :label="$t('film.endoriginateslot')" min-width="50" />
          <el-table-column prop="shelf" align="center" :label="$t('film.resetnumber')" min-width="50" />
          <el-table-column prop="patternQuantity" align="center" :label="$t('film.thickremainquant')" min-width="50" />
          <el-table-column
            align="center"
            :label="$t('film.taskstatus')"
            min-width="50"
            prop="taskState"
          >
          <template #default="scope">
        <el-tag :type="getStatusType2(scope.row.taskState)">
          {{ getStatusText2(scope.row.taskState) }}
        </el-tag>
      </template>
          </el-table-column>
          <el-table-column
            align="center"
            :label="$t('film.enabletype')"
            min-width="50"
            prop="taskType"
          >
          <template #default="scope">
        <el-tag :type="getStatusType1(scope.row.taskType)">
          {{ getStatusText1(scope.row.taskType) }}
        </el-tag>
      </template>
          </el-table-column>
          <el-table-column prop="formattedCreateTime" align="center" :label="$t('reportmanage.starttime')" min-width="50" />
          <el-table-column prop="formattedUpdateTime" align="center" :label="$t('reportmanage.endtime')" min-width="50" />
          <el-table-column fixed="right" :label="$t('film.operate')" align="center">
            <template #default="scope">
          <el-button :disabled="(scope.row.taskState !== 0)" type="text" plain @click="successfull(scope.row)">{{ $t('searchOrder.successfullyprocessed') }}</el-button>
          <el-button :disabled="(scope.row.taskState !== 0)" type="text" plain @click="handleptask(scope.row)">{{ $t('searchOrder.taskfailure') }}</el-button>
            </template>
        </el-table-column>
        </el-table>
  <div style="margin-top: 20px;margin-left: 40%;">
        <el-pagination
          v-model:current-page="currentPage2"
          :page-size="pageSize"
          :size="large"
          :disabled="disabled"
          layout="prev, pager, next, jumper"
          :total="totalRecords"
          @current-change="handlePageChange2"
          style="margin-top: 10px;"
      />
    </div>
  </div>
  </template>
<script lang="ts" setup>
import {useI18n} from 'vue-i18n'
import {useRouter} from "vue-router"
import request from "@/utils/request"
import {host, WebSocketHost} from '@/utils/constants'
import {onBeforeUnmount, onMounted, onUnmounted, reactive, ref} from "vue";
import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
import {ElMessage, ElMessageBox} from 'element-plus'
const {t} = useI18n()
let language = ref(localStorage.getItem('lang') || 'zh')
import { inject } from 'vue';
const globalDate = inject('globalDate');
const router = useRouter()
const timeRange = ref([])
const selectValuesa = reactive([]);
const tableDatax = ref([])
const currentPage2 = ref(1)
const totalRecords = ref(0)
const glassId = ref('');
const startSlot = ref('');
const targetSlot = ref('');
let getglobalDate = window.localStorage.getItem('getglobalDate')
const historical = async () => {
  try {
  let startTime = window.localStorage.getItem('startTime')
      const response = await request.post("/glassStorage/rawGlassStorageTask/queryRawGlassHistoryTask", {
        pageNo: 1,
        pageSize: 20,
        taskState: [],
        taskType: [],
        beginDate: startTime,
        endDate: getglobalDate
    })
      if (response.code == 200) {
        ElMessage.success(response.message);
        const formattedData = response.data.records.map(record => ({
        ...record,
        formattedCreateTime: formatTimestamp(record.createTime),
        formattedUpdateTime: formatTimestamp(record.updateTime),
      }));
        // tableDatax.value = response.data.records;
        tableDatax.value = formattedData;
        totalRecords.value = response.data.total/2 || 0
      } else {
        ElMessage.error(response.message);
    }
}
catch (error) {
  }
}
const successfull = async(row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.psuccessfullyprocessed'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
  var url="/glassStorage/rawGlassStorageTask/taskSuccess?taskId="+ row.id;
      const response = await request.post(url)
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
      ElMessage.error(response.msg);
      }
    }
  } catch (error) {
  }
};
// 任务失败处理
const handleptask = async(row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.ptaskfailure'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
  var url="/glassStorage/rawGlassStorageTask/taskError?taskId="+ row.id;
      const response = await request.post(url)
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
      ElMessage.error(response.msg);
      }
    }
  } catch (error) {
  }
};
const handlePageChange2 = (newPage) => {
  currentPage2.value = newPage;
  window.localStorage.setItem('pagenumber', currentPage2.value)
  historicala(currentPage2.value);
};
const historicala = async (page) => {
  try {
  let startTime = window.localStorage.getItem('startTime')
  let celllist=[]
  let stateList=[]
  let pstartSlot= ''
  let ptargetSlot=''
  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]];
    }
  }
  if(startSlot.value != ""){
    pstartSlot = startSlot.value
  }else{
    pstartSlot = '0'
  }
  if(targetSlot.value != ""){
    ptargetSlot = targetSlot.value
  }else{
    ptargetSlot = '0'
  }
  let page = window.localStorage.getItem('pagenumber')
      const response = await request.post("/glassStorage/rawGlassStorageTask/queryRawGlassHistoryTask", {
        pageNo: page,
        pageSize: 20,
        taskState: celllist,
        taskType: stateList,
        beginDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[0])) || '',
        endDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[1])) || '',
    })
      if (response.code == 200) {
        ElMessage.success(response.message);
        const formattedData = response.data.records.map(record => ({
        ...record,
        formattedCreateTime: formatTimestamp(record.createTime),
        formattedUpdateTime: formatTimestamp(record.updateTime),
      }));
        // tableDatax.value = response.data.records;
        tableDatax.value = formattedData;
        totalRecords.value = response.data.total/2 || 0
      } else {
        ElMessage.error(response.message);
    }
}
catch (error) {
  }
}
// 历史查询点击
const sethistorical = async () => {
  try {
  let startTime = window.localStorage.getItem('startTime')
  let celllist=[]
  let stateList=[]
  let pstartSlot= ''
  let ptargetSlot=''
  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]];
    }
  }
  if(startSlot.value != ""){
    pstartSlot = startSlot.value
  }else{
    pstartSlot = '0'
  }
  if(targetSlot.value != ""){
    ptargetSlot = targetSlot.value
  }else{
    ptargetSlot = '0'
  }
  let page = window.localStorage.getItem('pagenumber')
  const response = await request.post("/glassStorage/rawGlassStorageTask/queryRawGlassHistoryTask", {
        pageNo: 1,
        pageSize: 20,
        taskState: celllist,
        taskType: stateList,
        beginDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[0])) || '',
        endDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[1])) || '',
    })
      if (response.code == 200) {
        ElMessage.success(response.message);
        currentPage2.value = 1;
        const formattedData = response.data.records.map(record => ({
        ...record,
        formattedCreateTime: formatTimestamp(record.createTime),
        formattedUpdateTime: formatTimestamp(record.updateTime),
      }));
        // tableDatax.value = response.data.records;
        tableDatax.value = formattedData;
        totalRecords.value = response.data.total/2 || 0
      } else {
        ElMessage.error(response.message);
    }
}
catch (error) {
  }
}
// 格式化时间戳为年月日时间字符串的函数
function formatTimestamp(timestamp) {
  const date = new Date(timestamp);
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始,需要加1,并补零
  const day = String(date.getDate()).padStart(2, '0'); // 补零
  const hours = String(date.getHours()).padStart(2, '0'); // 补零(如果需要显示时间)
  const minutes = String(date.getMinutes()).padStart(2, '0'); // 补零(如果需要显示时间)
  const seconds = String(date.getSeconds()).padStart(2, '0'); // 补零(如果需要显示时间)
  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
const shortcuts = [
  {
    text: '最近一周',
    value: () => {
      const backendTime = new Date(getglobalDate)
      const oneWeekAgo = new Date(getglobalDate)
      oneWeekAgo.setHours(0, 0, 0, 0);
      oneWeekAgo.setDate(oneWeekAgo.getDate() - 7)
      timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)]
      window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
    },
  },
  {
    text: '最近一个月',
    value: () => {
      const backendTime = new Date(getglobalDate)
      const oneWeekAgo = new Date(getglobalDate)
      oneWeekAgo.setHours(0, 0, 0, 0);
      oneWeekAgo.setMonth(oneWeekAgo.getMonth() - 1)
      timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)]
      window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
    },
  },
  {
    text: '最近三个月',
    value: () => {
      const backendTime = new Date(getglobalDate)
      const oneWeekAgo = new Date(getglobalDate)
      oneWeekAgo.setHours(0, 0, 0, 0);
      oneWeekAgo.setMonth(oneWeekAgo.getMonth() - 3)
      timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)]
      window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
},
  },
]
// 格式化后端时间并计算一周前的时间
const defaultTime = ref<[Date, Date]>([new Date(), new Date()]);
function parseAndSetTime() {
  const backendTime = new Date(getglobalDate);
  const oneWeekAgo = new Date(backendTime.getTime() - 7 * 24 * 60 * 60 * 1000); // 减去7天
  oneWeekAgo.setHours(0, 0, 0, 0);
  timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)];
  window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
}
function getStatusType1(taskType) {
switch (taskType) {
  case 1:
    return 'info';
  case 2:
    return 'warning';
  case 3:
    return 'success';
  case 4:
    return 'danger';
  case 5:
    return 'primary';
}
}
function getStatusText1(taskType) {
switch (taskType) {
  case 1:
    return t('sorter.advancetask');//进片任务
  case 2:
    return t('sorter.outputtasks');//出片任务
  case 3:
  return t('sorter.schedulingtasks');//调度任务
  case 4:
  return t('sorter.advancerequests');//进片请求
  case 5:
  return t('sorter.releaserequest');//出片请求
}
}
function getStatusType2(taskState) {
switch (taskState) {
  case 0:
    return 'info';
  case 2:
    return 'warning';
  case 1:
    return 'success';
}
}
function getStatusText2(taskState) {
switch (taskState) {
  case 0:
    return t('film.built');//新建
  case 2:
    return t('film.fail');//失败
  case 1:
    return t('film.finish');//完成
}
}
onMounted(() => {
  parseAndSetTime();
  historical();
});
  </script>
  <style scoped>
  </style>
UI-Project/src/views/HomeView.vue
New file
@@ -0,0 +1,25 @@
<script setup>
import { useRouter, useRoute } from 'vue-router'
// function global_callback(msg) {
//   console.log("websocket的回调函数收到服务器信息:" + JSON.stringify(msg));
//   // console.log("收到服务器信息:" + msg);
// }
// function close(){
//  closeSock();
// }
// function sendMessage(){
//   sendSock("123")
// }
// function createSocket(){
//   createWebSocket(global_callback);
// }
// </script>
<template>
 <div class="mainDiv">
   <button @click="createSocket">创建</button>
   <button @click="sendMessage">发送</button>
   <button @click="close">关闭</button>
 </div>
</template>
UI-Project/src/views/Identify/ident.vue
New file
@@ -0,0 +1,36 @@
<script setup>
let indexFlag = $ref(1)
function changeRouter(index) {
  indexFlag = index
}
</script>
<template>
  <div id="main-body">
    <router-view/>
  </div>
</template>
<style scoped>
#main-div {
  width: 100%;
  height: 100%;
}
#div-title {
  height: 2%;
  width: 100%;
}
#searchButton {
  margin-top: -5px;
  margin-left: 1rem;
}
#main-body {
  width: 100%;
  height: 95%;
  /* margin-top: 1%; */
}
#select {
  margin-left: 0.5rem;
}
:deep(.indexTag .el-breadcrumb__inner) {
  color: #5CADFE !important;
}
</style>
UI-Project/src/views/Identify/identifwu.vue
New file
@@ -0,0 +1,238 @@
<template>
  <div style="height: 500px;">
    <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 800px;">
    <div style="text-align: center;"> {{ $t('processCard.temperinglayout') }}:{{ ava }}-{{ avanum }} </div>
      <el-scrollbar height="750px" width="1400px" style="background-color: #e9e9eb;">
        <div style="position: relative;">
          <div
              v-for="(rect, index) in adjustedRects"
              :key="rect.glassId"
              class="rect"
              @click="showDialog(rect.glassId)"
              :style="{ position: 'absolute',
              top: `${rect.yAxisa}px`, left: `${rect.xAxisa}px`, width: `${rect.width}px`, height: `${rect.height}px`,
              backgroundColor: rect.isActive ? '#ADFF2F' : getRectColor(rect.state)
               }">
            <div class="centered-text">
              <div style="font-size: 20px;font-weight: bold;">{{ rect.glassId }}</div>
              <div style="font-size: 20px;font-weight: bold;">{{ rect.flowCardId }}</div>
              <div style="font-size: 30px;font-weight: bold;">{{ rect.widtha }}*{{ rect.heighta }}</div>
            </div>
          </div>
        </div>
      </el-scrollbar>
      <el-dialog v-model="blind" top="30vh" width="15%" style="text-align: center;" @close="handleDialogClose">
        <el-button :disabled="currentGlassRect?.state === 8 || currentGlassRect?.state === 9" type="warning"
                   plain :icon="Delete" @click="handleDamage(currentGlassId)" style="width: 140px;margin-left: 10px;">
          {{ $t('order.dilapidation') }}
        </el-button>
        <el-button :disabled="currentGlassRect?.state === 9 || currentGlassRect?.state === 8" type="danger"
                   plain @click="handleManualTake(currentGlassId)" style="width: 140px;margin-top: 10px;">
          <el-icon class="el-icon--right">
            <Upload/>
          </el-icon>
          {{ $t('order.takeaway') }}
        </el-button>
      </el-dialog>
    </el-card>
  </div>
</template>
<script setup lang="ts">
import {avatarEmits, ElMessage} from 'element-plus'
import {onBeforeUnmount, computed, onMounted, onUnmounted, ref} from 'vue';
import request from "@/utils/request"
import {host, WebSocketHost} from '@/utils/constants'
import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
import {useI18n} from 'vue-i18n'
const {t} = useI18n()
let language = ref(localStorage.getItem('lang') || 'zh')
const blind = ref(false)
const currentGlassId = ref(null);
const adjustedRects = ref([]);
const ava = ref('');
const avanum = ref('');
const realwidth = ref('');
const realheight = ref('');
let socket = null;
const currentGlassRect = computed(() => {
  return adjustedRects.value.find(rect => rect.glassId === currentGlassId.value);
});
function showDialog(glassId: number) {
  currentGlassId.value = glassId;
  blind.value = true;
  adjustedRects.value = adjustedRects.value.map(rect =>
      rect.glassId === glassId ? {...rect, isActive: true} : rect
  );
}
const handleDialogClose = () => {
  adjustedRects.value = adjustedRects.value.map(rect => ({
    ...rect,
    isActive: false
  }));
}
// 破损
const handleDamage = async () => {
  try {
    const response = await request.post('/cacheGlass/taskCache/identControls', {
      glassId: currentGlassId.value,
      state: 8,
      line: 1,
      remark: '掰片',
      workingProcedure: '切割',
    })
    if (response.code == 200) {
      ElMessage.success(response.message);
      blind.value = false;
      updateRectStatus(currentGlassId.value, 8);
    } else {
      ElMessage.error(response.msg);
    }
  } catch (error) {
    console.error(error);
  }
}
// 人工拿走
const handleManualTake = async () => {
  try {
    const response = await request.post('/cacheGlass/taskCache/identControls', {
      glassId: currentGlassId.value,
      state: 9,
      line: 1,
      workingProcedure: '切割',
      remark: '掰片',
    })
    if (response.code == 200) {
      ElMessage.success(response.message);
      blind.value = false;
      updateRectStatus(currentGlassId.value, 9);
    } else {
      ElMessage.error(response.msg);
    }
  } catch (error) {
    console.error(error);
  }
}
function getRectColor(state: number): string {
  switch (state) {
    case 0:
      return '#7AC5CD';
    case 1:
      return '#95d475';
    case -1:
      return '#99BBFF';
    case 2:
      return 'lightblue';
    case 3:
      return '#eebe77';
    case 4:
      return '#CD6090';
    case 8:
      return '#911005';
    case 9:
      return '#4682B4';
    default:
      return '#CDAF95';
  }
}
// 更新矩形状态
function updateRectStatus(glassId: string, status: number) {
  adjustedRects.value.forEach(rect => {
    if (rect.glassId === glassId) {
      rect.state = status; // 更新矩形的状态
    }
  });
}
const socketUrl = `ws://${WebSocketHost}:${host}/api/cacheGlass/api/talk/currentCutDrawingOne`;
const handleMessage = (data: any) => {
  if (data.engineer != null) {
  ava.value = data.engineer[0]
  }else{
    ava.value = ''
  }
  if (data.engineer != null) {
    avanum.value = data.sequence[0]
  }else{
    avanum.value = ''
  }
      console.log(data.upPattenUsage);
      console.log(data.currentCutTerritory);
      if (data.upPattenUsage && data.upPattenUsage.length > 0) {
        realwidth.value = data.upPattenUsage[0].width;
        realheight.value = data.upPattenUsage[0].height;
        const realx = realwidth.value;
        const realy = realheight.value;
      window.localStorage.setItem('widthreturna', realy)
        const scaleFactora = 1621.78 / realx;
        const scaleFactorya = 750 / realy;
      window.localStorage.setItem('scaleFactorb', scaleFactora)
      window.localStorage.setItem('scaleFactoryb', scaleFactorya)
      }
      if (data.currentCutTerritory && data.currentCutTerritory.length > 0) {
        let scaleFactor = window.localStorage.getItem('scaleFactorb')
        let scaleFactory = window.localStorage.getItem('scaleFactoryb')
        let widthreturn = window.localStorage.getItem('widthreturna')
        const newRects = data.currentCutTerritory[0].map(rect => {
          const existingRect = adjustedRects.value.find(r => r.glassId === rect.glassId);
          if (existingRect) {
            return {
              ...existingRect,
              xAxisa: rect.xAxis * scaleFactor,
              yAxisa: (widthreturn - (rect.yAxis + rect.edgHeight)) * scaleFactory,
              width: rect.edgWidth * scaleFactor,
              height: rect.edgHeight * scaleFactory,
              widtha: rect.edgWidth,
              heighta: rect.edgHeight,
              state: rect.state,
              // 保持 isActive 状态不变
            };
          } else {
            // 如果不存在,则添加新矩形,默认 isActive 为 false
            return {
              ...rect,
              xAxisa: rect.xAxis * scaleFactor,
              yAxisa: (widthreturn - (rect.yAxis + rect.edgHeight)) * scaleFactory,
              width: rect.edgWidth * scaleFactor,
              height: rect.edgHeight * scaleFactory,
              widtha: rect.edgWidth,
              heighta: rect.edgHeight,
              state: rect.state,
              isActive: false,
              glassId: rect.glassId,
            };
          }
        });
        adjustedRects.value = newRects;
      } else if (data.currentCutTerritory == '') {
        adjustedRects.value = [];
      }
}
onMounted(() => {
  socket = initializeWebSocket(socketUrl, handleMessage);
});
onBeforeUnmount(() => {
  closeWebSocket();
});
</script>
<style scoped>
.rect {
  border: 1px solid black; /* 设置矩形的边框 */
  /* background-color: lightblue; 设置矩形的背景色   */
}
.centered-text {
  /* 设置文字居中样式 */
  /* display: flex; */
  justify-content: center;
  align-items: center;
  height: 100%; /* 确保div占据整个矩形的高度 */
  /* font-size: large; */
}
#line {
  position: absolute;
  top: 70%; /* 直线位于矩形中间 */
  left: 210px; /* 直线在箭头右侧一些距离 */
  transform: translateY(-50%); /* 垂直居中 */
  height: 2px; /* 直线的高度 */
  width: 240px; /* 直线的长度,根据需要调整 */
  background-color: #911005; /* 直线的颜色 */
}
</style>
UI-Project/src/views/Identify/identifwutwo.vue
New file
@@ -0,0 +1,235 @@
<template>
  <div style="height: 500px;">
    <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 800px;">
    <div style="text-align: center;"> {{ $t('processCard.temperinglayout') }}:{{ ava }}-{{ avanum }} </div>
    <el-scrollbar height="750px" width="1400px" style="background-color: #e9e9eb;">
        <div style="position: relative;">
          <div
              v-for="(rect, index) in adjustedRects"
              :key="rect.glassId"
              class="rect"
              @click="showDialog(rect.glassId)"
              :style="{ position: 'absolute',
              top: `${rect.yAxisa}px`, left: `${rect.xAxisa}px`, width: `${rect.width}px`, height: `${rect.height}px`,
              backgroundColor: rect.isActive ? '#ADFF2F' : getRectColor(rect.state)
               }">
            <div class="centered-text">
              <div style="font-size: 20px;font-weight: bold;">{{ rect.glassId }}</div>
              <div style="font-size: 20px;font-weight: bold;">{{ rect.flowCardId }}</div>
              <div style="font-size: 30px;font-weight: bold;">{{ rect.widtha }}*{{ rect.heighta }}</div>
            </div>
          </div>
        </div>
      </el-scrollbar>
      <el-dialog v-model="blind" top="30vh" width="15%" style="text-align: center;" @close="handleDialogClose">
        <el-button :disabled="currentGlassRect?.state === 8 || currentGlassRect?.state === 9" type="warning"
                   plain :icon="Delete" @click="handleDamage(currentGlassId)" style="width: 140px;margin-left: 10px;">
          {{ $t('order.dilapidation') }}
        </el-button>
        <el-button :disabled="currentGlassRect?.state === 9 || currentGlassRect?.state === 8" type="danger"
                   plain @click="handleManualTake(currentGlassId)" style="width: 140px;margin-top: 10px;">
          <el-icon class="el-icon--right">
            <Upload/>
          </el-icon>
          {{ $t('order.takeaway') }}
        </el-button>
      </el-dialog>
    </el-card>
  </div>
</template>
<script setup lang="ts">
import {ElMessage} from 'element-plus'
import {onBeforeUnmount, computed, onMounted, onUnmounted, ref} from 'vue';
import request from "@/utils/request"
import {host, WebSocketHost} from '@/utils/constants'
import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
import {useI18n} from 'vue-i18n'
const {t} = useI18n()
let language = ref(localStorage.getItem('lang') || 'zh')
const blind = ref(false)
const currentGlassId = ref(null);
const adjustedRects = ref([]);
const ava = ref('');
const avanum = ref('');
const realwidth = ref('');
const realheight = ref('');
let socket = null;
const socketUrl = `ws://${WebSocketHost}:${host}/api/cacheGlass/api/talk/currentCutDrawingTwo`;
const handleMessage = (data: any) => {
  if (data.engineer != null) {
  ava.value = data.engineer[0]
  }else{
    ava.value = ''
  }
  if (data.engineer != null) {
    avanum.value = data.sequence[0]
  }else{
    avanum.value = ''
  }
      if (data.upPattenUsage && data.upPattenUsage.length > 0) {
        realwidth.value = data.upPattenUsage[0].width;
        realheight.value = data.upPattenUsage[0].height;
        const realx = realwidth.value;
        const realy = realheight.value;
        const scaleFactora = 1621.78 / realx;
        const scaleFactorya = 750 / realy;
      window.localStorage.setItem('widthreturna', realy)
      window.localStorage.setItem('scaleFactorb', scaleFactora)
      window.localStorage.setItem('scaleFactoryb', scaleFactorya)
      }
      if (data.currentCutTerritory && data.currentCutTerritory.length > 0) {
        let scaleFactor = window.localStorage.getItem('scaleFactorb')
        let scaleFactory = window.localStorage.getItem('scaleFactoryb')
        let widthreturn = window.localStorage.getItem('widthreturna')
        const newRects = data.currentCutTerritory[0].map(rect => {
          const existingRect = adjustedRects.value.find(r => r.glassId === rect.glassId);
          if (existingRect) {
            return {
              ...existingRect,
               xAxisa: rect.xAxis * scaleFactor,
               yAxisa: (widthreturn - (rect.yAxis + rect.edgHeight )) * scaleFactory,
              width: rect.edgWidth * scaleFactor,
              height: rect.edgHeight * scaleFactory,
              widtha: rect.edgWidth,
              heighta: rect.edgHeight,
              state: rect.state,
            };
          } else {
            // 如果不存在,则添加新矩形,默认 isActive 为 false
            return {
              ...rect,
              xAxisa: rect.xAxis * scaleFactor,
              yAxisa: (widthreturn - (rect.yAxis + rect.edgHeight)) * scaleFactory,
              width: rect.edgWidth * scaleFactor,
              height: rect.edgHeight * scaleFactory,
              widtha: rect.edgWidth,
              heighta: rect.edgHeight,
              state: rect.state,
              isActive: false,
              glassId: rect.glassId,
            };
          }
        });
        adjustedRects.value = newRects;
      } else if (data.currentCutTerritory == '') {
        adjustedRects.value = [];
      }
}
const currentGlassRect = computed(() => {
  return adjustedRects.value.find(rect => rect.glassId === currentGlassId.value);
});
function showDialog(glassId: number) {
  currentGlassId.value = glassId;
  blind.value = true;
  adjustedRects.value = adjustedRects.value.map(rect =>
      rect.glassId === glassId ? {...rect, isActive: true} : rect
  );
}
const handleDialogClose = () => {
  adjustedRects.value = adjustedRects.value.map(rect => ({
    ...rect,
    isActive: false
  }));
}
// 破损
const handleDamage = async () => {
  try {
    const response = await request.post('/cacheGlass/taskCache/identControls', {
      glassId: currentGlassId.value,
      state: 8,
      line: 2,
      remark: '掰片',
      workingProcedure: '切割',
    })
    if (response.code == 200) {
      ElMessage.success(response.message);
      blind.value = false;
      updateRectStatus(currentGlassId.value, 8);
    } else {
      ElMessage.error(response.msg);
    }
  } catch (error) {
    console.error(error);
  }
}
// 人工拿走
const handleManualTake = async () => {
  try {
    const response = await request.post('/cacheGlass/taskCache/identControls', {
      glassId: currentGlassId.value,
      state: 9,
      line: 2,
      workingProcedure: '切割',
      remark: '掰片',
    })
    if (response.code == 200) {
      ElMessage.success(response.message);
      blind.value = false;
      updateRectStatus(currentGlassId.value, 9);
    } else {
      ElMessage.error(response.msg);
    }
  } catch (error) {
    console.error(error);
  }
}
function getRectColor(state: number): string {
  switch (state) {
    case 0:
      return '#7AC5CD';
    case 1:
      return '#95d475';
    case -1:
      return '#99BBFF';
    case 2:
      return 'lightblue';
    case 3:
      return '#eebe77';
    case 4:
      return '#CD6090';
    case 8:
      return '#911005';
    case 9:
      return '#4682B4';
    default:
      return '#CDAF95';
  }
}
// 更新矩形状态
function updateRectStatus(glassId: string, status: number) {
  adjustedRects.value.forEach(rect => {
    if (rect.glassId === glassId) {
      rect.state = status; // 更新矩形的状态
    }
  });
}
onMounted(() => {
  socket = initializeWebSocket(socketUrl, handleMessage);
});
onBeforeUnmount(() => {
  closeWebSocket();
});
</script>
<style scoped>
.rect {
  border: 1px solid black; /* 设置矩形的边框 */
  /* background-color: lightblue; 设置矩形的背景色   */
}
.centered-text {
  /* 设置文字居中样式 */
  /* display: flex; */
  justify-content: center;
  align-items: center;
  height: 100%; /* 确保div占据整个矩形的高度 */
  /* font-size: large; */
}
#line {
  position: absolute;
  top: 70%; /* 直线位于矩形中间 */
  left: 210px; /* 直线在箭头右侧一些距离 */
  transform: translateY(-50%); /* 垂直居中 */
  height: 2px; /* 直线的高度 */
  width: 240px; /* 直线的长度,根据需要调整 */
  background-color: #911005; /* 直线的颜色 */
}
</style>
UI-Project/src/views/Identify/identify.vue
New file
@@ -0,0 +1,281 @@
<template>
  <div style="height: 500px;">
    <div style="display: flex;">
      <el-input v-model="engineerId" style="margin-left: 15px;margin-top: 10px;width: 240px" :placeholder="$t('order.projectnumber')"/>
          <el-button type="primary" style="margin-left: 10px;margin-top: 10px;" @click="sethistorical()">{{$t('reportmanage.inquire')}}</el-button>
       <el-pagination
          v-model:current-page="currentPage"
          :page-size="pageSize"
          :size="size"
          :disabled="disabled"
          layout="prev, pager, next, jumper"
          :total="totalPages"
          @current-change="handleCurrentChange"
          style="margin-top: 10px;"
      />
      </div>
    <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 800px;">
      <el-scrollbar height="750px" width="1400px" style="background-color: #e9e9eb;">
  <div style="position: relative;">
    <div
      v-for="(rect, index) in adjustedRects"
      :key="rect.glassId"
      class="rect"
      @click="showDialog(rect.glassId)"
      :style="{ position: 'absolute',
      top: `${rect.yaxisa}px`, left: `${rect.xaxisa}px`, width: `${rect.width}px`, height: `${rect.height}px`,
      backgroundColor: rect.isActive ? '#ADFF2F' : getRectColor(rect.state)
       }"
    >
     <div  class="centered-text">
    <div style="font-size: 20px;font-weight: bold;">{{ rect.glassId }}</div>
    <div style="font-size: 20px;font-weight: bold;">{{ rect.flowCardId }}</div>
    <div style="font-size: 30px;font-weight: bold;">{{ rect.widtha }}*{{ rect.heighta }}</div>
  </div>
  </div>
   </div>
      </el-scrollbar>
      <el-dialog v-model="blind" top="30vh" width="15%" style="text-align: center;" @close="handleDialogClose">
        <el-select
            :placeholder="$t('workOrder.cway')"
             clearable
             style="width: 140px;margin-left: 10px;margin-bottom: 10px;"
             v-model="patternSequence">
               <el-option
                v-for="item in optionsb"
                :key="item.value"
                :label="item.label"
                :value="item.value"
              />
          </el-select>
        <el-button :disabled="!patternSequence || currentGlassRect?.state === 8 || currentGlassRect?.state === 9" type="warning"
                   plain :icon="Delete" @click="handleDamage(currentGlassId)" style="width: 140px;margin-left: 10px;">
          {{ $t('order.dilapidation') }}
        </el-button>
        <el-button :disabled="!patternSequence || currentGlassRect?.state === 9 || currentGlassRect?.state === 8" type="danger"
                   plain @click="handleManualTake(currentGlassId)" style="width: 140px;margin-top: 10px;">
          <el-icon class="el-icon--right">
            <Upload/>
          </el-icon>
          {{ $t('order.takeaway') }}
        </el-button>
      </el-dialog>
    </el-card>
  </div>
</template>
<script setup lang="ts">
import {ElMessage} from 'element-plus'
import {computed, onMounted, onUnmounted, ref} from 'vue';
import request from "@/utils/request"
import {host, WebSocketHost} from '@/utils/constants'
import {useI18n} from 'vue-i18n'
const {t} = useI18n()
let language = ref(localStorage.getItem('lang') || 'zh')
const blind = ref(false)
const engineerId = ref();
const patternSequence = ref();
const currentGlassId = ref(null);
const currentstate = ref(null);
const adjustedRects = ref([]);
const raw = ref([]);
let webSocket: WebSocket | null = null;
const totalPages = ref(0);
const pageSize = ref(1);
const currentPage = ref('');
const realwidth = ref('');
const realheight = ref('');
const disabled = false;
const size = 'small';
const rawData = ref([]);
// 显示对话框并设置当前 glassId
const currentGlassRect = computed(() => {
  return adjustedRects.value.find(rect => rect.glassId === currentGlassId.value);
});
function showDialog(glassId: number) {
  currentGlassId.value = glassId;
  blind.value = true;
  adjustedRects.value = adjustedRects.value.map(rect =>
  rect.glassId === glassId ? { ...rect, isActive: true } : rect
  );
}
const handleDialogClose = () => {
  adjustedRects.value = adjustedRects.value.map(rect => ({
    ...rect,
    isActive: false
  }));
}
// 破损
const handleDamage = async () => {
  try  {
  const response = await request.post('/cacheGlass/taskCache/identControls', {
      glassId: currentGlassId.value,
      state: 8,
      line: patternSequence.value,
      remark: '掰片',
      workingProcedure: '切割',
    })
    if (response.code == 200) {
      ElMessage.success(response.message);
      blind.value = false;
      patternSequence.value = ''
      updateRectStatus(currentGlassId.value, 8);
    } else {
      ElMessage.error(response.msg);
    }
}
catch (error) {
    // 处理错误
    console.error(error);
  }
}
 // 人工拿走
const handleManualTake = async () => {
  try  {
  const response = await request.post('/cacheGlass/taskCache/identControls', {
      glassId: currentGlassId.value,
      state: 9,
      line: patternSequence.value,
      workingProcedure: '切割',
      remark: '掰片',
    })
    if (response.code == 200) {
      ElMessage.success(response.message);
      blind.value = false;
      patternSequence.value = ''
      updateRectStatus(currentGlassId.value, 9);
  } else {
      ElMessage.error(response.msg);
    }
}
catch (error) {
    console.error(error);
  }
}
const sethistorical = async () => {
    var url="/cacheGlass/taskCache/queryCutDrawingByEngineerId?engineerId="+engineerId.value+ "&patternSequence=" + 1;
    const response = await request.post(url)
    if (response.code === 200) {
      const rawRects = response.data.currentCutDrawing;
      rawData.value = response.data;
      totalPages.value = response.data.totalPatternSequence;
      realwidth.value = response.data.upPattenUsage.width;
      realheight.value = response.data.upPattenUsage.height;
      const realx = realwidth.value;
      const realy = realheight.value;
      const scaleFactor =  1621.78/realx;
      const scaleFactory =  750/realy;
      adjustedRects.value = rawRects.map(rect => ({
        ...rect,
        xaxisa: rect.xaxis * scaleFactor,
        yaxisa: (realy - (rect.yaxis + rect.edgHeight )) * scaleFactory,
        width: rect.edgWidth * scaleFactor,
        widtha: rect.edgWidth,
        heighta: rect.edgHeight ,
        height: rect.edgHeight * scaleFactory,
        state: rect.state
      }));
       currentPage.value = 1;
    }
};
const handleCurrentChange = async(val: number) => {
  currentPage.value = val;
  var url="/cacheGlass/taskCache/queryCutDrawingByEngineerId?engineerId="+engineerId.value+ "&patternSequence=" + currentPage.value;
    const response = await request.post(url)
    if (response.code === 200) {
      const rawRects = response.data.currentCutDrawing;
      rawData.value = response.data;
      realwidth.value = response.data.upPattenUsage.width;
      realheight.value = response.data.upPattenUsage.height;
      const realx = realwidth.value;
      const realy = realheight.value;
      const scaleFactor =  1621.78/realx;
      const scaleFactory =  750/realy;
      adjustedRects.value = rawRects.map(rect => ({
        ...rect,
        xaxisa: rect.xaxis * scaleFactor,
        yaxisa: (realy - (rect.yaxis + rect.edgHeight )) * scaleFactory,
        width: rect.edgWidth * scaleFactor,
        widtha: rect.edgWidth,
        heighta: rect.edgHeight,
        height: rect.edgHeight * scaleFactory,
        state: rect.state
      }));
    }
};
function getRectColor(state: number): string {
  switch (state) {
    case 0:
      return '#7AC5CD';
    case 1:
      return '#95d475';
    case -1:
      return '#99BBFF';
    case 2:
      return 'lightblue';
    case 3:
      return '#eebe77';
    case 4:
      return '#CD6090';
    case 8:
      return '#911005';
    case 9:
      return '#4682B4';
    default:
      return '#CDAF95';
  }
}
const optionsb = [
  {
    value: 1,
    label: t('sorter.onesort'),
  },
  {
    value: 2,
    label: t('sorter.twosort'),
  },
]
// 更新矩形状态
function updateRectStatus(glassId: string, status: number) {
  adjustedRects.value.forEach(rect => {
    if (rect.glassId === glassId) {
      rect.state = status; // 更新矩形的状态
    }
  });
}
</script>
<style scoped>
.rect {
  border: 1px solid black; /* 设置矩形的边框 */
}
.centered-text {
  justify-content: center;
  align-items: center;
  height: 100%;
  /* font-size: large; */
}
#rect {
  position: relative; /* 确保箭头可以相对于矩形定位 */
}
#arrow {
  position: absolute;
  top: 70%; /* 箭头位于矩形中间 */
  left: 200px; /* 箭头在矩形左侧一些距离 */
  transform: translateY(-50%); /* 垂直居中 */
  width: 0;
  height: 0;
  border-top: 10px solid transparent; /* 上边框 */
  border-bottom: 10px solid transparent; /* 下边框 */
  border-right: 20px solid #911005; /* 右边框,形成箭头 */
}
#line {
  position: absolute;
  top: 70%; /* 直线位于矩形中间 */
  left: 210px; /* 直线在箭头右侧一些距离 */
  transform: translateY(-50%); /* 垂直居中 */
  height: 2px; /* 直线的高度 */
  width: 240px; /* 直线的长度,根据需要调整 */
  background-color: #911005; /* 直线的颜色 */
}
</style>
UI-Project/src/views/LoginView.vue
New file
@@ -0,0 +1,224 @@
<script lang="ts" setup>
import {onMounted, onUnmounted, reactive, ref} from 'vue'
import {useRoute, useRouter} from 'vue-router'
import type {FormInstance, FormRules} from 'element-plus'
import {ElMessage} from 'element-plus'
import request from '@/utils/request'
import userInfo from '@/stores/userInfo'
import { useI18n } from 'vue-i18n'
const store = userInfo()
let ruleFormRef = ref<FormInstance>()
const router = useRouter()
const route = useRoute()
const { t } = useI18n()
let language = ref(localStorage.getItem('lang') || 'zh')
const changeLanguage = () =>{
  localStorage.setItem('lang',language.value)
  location.reload()
}
const userForm = reactive({
  userName: '',
  password: '',
})
if (typeof route.query.id != 'undefined') {
  userForm.userId = <string>route.query.id
}
const validateUser = (rule: any, value: any, callback: any) => {
  if (value === '') {
    callback(new Error(t('login.userErr')))
  } else {
    callback()
  }
}
const validatePass = (rule: any, value: any, callback: any) => {
  if (value === '') {
    callback(new Error(t('login.pwErr')))
  } else {
    callback()
  }
}
const rules = reactive<FormRules<typeof userForm>>({
  userId: [{validator: validateUser, trigger: 'blur'}],
  pass: [{validator: validatePass, trigger: 'blur'}],
})
//登陆方法
const submitForm = (formEl: FormInstance | undefined) => {
  store.$patch({
              user: null,
              })
  if (!formEl) return
  formEl.validate((valid) => {
    if (valid) {
      loginLoadings.value = true
      request
          // .post('/loadGlass/userinfo/login', userForm)
          .post('/loadGlass/sys/user/login', userForm)
          .then((res) => {
            if (res['code'] == 200) {
              store.$patch({user: res.data})
              router.push('/main')
              ElMessage.success(t('login.loginSuccessful'))
            } else {
              // ElMessage.error(res['msg'])
              store.$patch({
              user: null,
              })
              loginLoadings.value = false
              return false
            }
          })
          .catch((error) => {
            ElMessage.error(t('main.connectErr'))
            store.$patch({
              user: null,
              })
            loginLoadings.value = false
            return false
          })
    }
  })
}
function register() {
  router.push({
    path: '/register',
  })
}
let loginLoadings = ref(false)
let registerLoadings = ref(false)
const keyDown = (e) => {
  // 回车则执行登录方法 enter键的ASCII是13
  if (e.keyCode == 13 || e.keyCode == 100) {
    submitForm(ruleFormRef.value)
  }
}
onMounted(() => {
  window.addEventListener('keydown', keyDown)
})
onUnmounted(() => {
  window.removeEventListener('keydown', keyDown)
})
</script>
<template>
  <div class="mainDiv">
    <div id="main-login">
      <!-- <img
        style="width: 100%; height: 99vh"
        src="../../src/assets/background.jpg"
      /> -->
      <div>
        <div style="position: absolute; left: 8vw; top: 6vw; ">
          <img src="../../src/assets/3.png">
        </div>
        <div style="position: absolute; left: 15vw; top: 22vw; font-size: 55px;color: rgba(29, 33, 41, 1);">
          {{ $t('northglassMESsystem') }}
        </div>
      </div>
      <div id="div-login">
        <!--语言切换按钮-->
        <el-select
            @change="changeLanguage"
            v-model="language"
            placeholder=" "
            style="float: right;width: 9rem">
          <el-option value="zh"  label="中文" />
          <el-option value="py"  label="Русский язык" />
          <el-option value="en"  label="English" />
        </el-select>
        <el-form @submit.native.prevent
                 ref="ruleFormRef"
                 :model="userForm"
                 status-icon
                 :rules="rules">
          <div id="center">
            <div style="color: rgba(78, 89, 105, 1);margin-bottom: 10px;">{{ $t('login.user') }}</div>
            <el-form-item prop="userId">
              <el-input style="width: 340px;"
                        v-model="userForm.userName"
                        type="text"
                        autocomplete="off"
                        :prefix-icon="Avatar"
                        :placeholder="$t('login.userErr')"/>
            </el-form-item>
            <div style="color: rgba(78, 89, 105, 1);margin-bottom: 10px;">{{ $t('login.password') }}</div>
            <el-form-item prop="pass">
              <el-input style="width: 340px;"
                        v-model="userForm.password"
                        type="password"
                        autocomplete="off"
                        :prefix-icon="Lock"
                        show-password
                        :placeholder="$t('login.pwErr')"
                       />
            </el-form-item>
            <el-form-item id="submitForm">
              <el-button :loading="loginLoadings"
                         type="primary"
                         native-type="submit"
                         style="width: 80px;"
                         @click="submitForm(ruleFormRef)"
                         @keyup.enter.native="keyDown(e)"
                         plain>{{ $t('login.login') }}
              </el-button>
              <!-- <el-button :loading="registerLoadings"
                         type="primary"
                         @click="register"
                         plain>{{ $t('login.register') }}
              </el-button> -->
            </el-form-item>
          </div>
        </el-form>
      </div>
    </div>
  </div>
</template>
<style scoped>
.mainDiv {
  overflow: hidden;
  min-width: 718px;
  background-image: url('../../src/assets/background.jpg');
}
#main-login {
  margin: 150px auto 0 auto;
  height: 70vh;
  width: 80vw;
}
#img-div {
  width: 55%;
  height: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
  float: left;
}
#img-pic {
  max-height: 90%;
  max-width: 100%;
}
#div-login {
  margin-top: 5%;
  /* margin-top: 20%; */
  /* margin-left: 650px; */
  background-color: #fff;
  float: right;
  width: 40%;
  height: 60%;
  min-width: 318px;
  border-radius: 4px;
  box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0), 0 6px 5px 0 rgba(0, 0, 0, 0.19);
}
#center {
  margin-top: -30px;
}
.el-form {
  width: 60%;
  margin: 20% auto auto;
}
#submitForm {
  display: flex;
  justify-content: space-evenly;
  margin-top: 2rem;
}
:deep(.el-form-item__content) {
  flex: unset;
}
</style>
UI-Project/src/views/NewPage.vue
New file
@@ -0,0 +1,148 @@
<template>
  <div>
<div style="display: flex;">
  <div style="margin-left: 50px;margin-top: 15px;font-size:large">工程号:</div>
<el-input v-model="current" style="margin-left: 20px;margin-top: 15px;width: 240px" placeholder="请输入工程号" @input="updateUrl"/>
    <el-button style="margin-top: 15px;margin-left: 15px;"  type="primary" @click="fetchData">查询</el-button>
  </div>
  <el-card style="flex: 1;margin-left: 400px;margin-top: 50px;margin-right: 10px;width: 1100px;" height="900" >
  <div v-for="(row, rowIndex) in divsData" :key="rowIndex" class="row">
      <div v-for="(rect, colIndex) in row" :key="colIndex" class="div-container">
    <div style="text-align: center;">炉号:{{ getAdjustedRectsForRow(rowIndex)[0].layout_id }}  ----   装载率:{{ getAdjustedRectsForRow(rowIndex)[0].olLayoutRate }}</div>
  <el-scrollbar height="550px" width="1000px" style="background-color: #e9e9eb;">
  <div  style="position: relative;width: 100%;height: 100%;">
    <div
      v-for="(rect, index) in getAdjustedRectsForRow(rowIndex)"
    :key="index"
    class="rect"
    :style="{ position: 'absolute',
     top: `${rect.y_axis}px`,
     left: `${rect.x_axis}px`,
     width: `${rect.width}px`,
       height: `${rect.height}px`,
      backgroundColor:  'lightblue'}">
   <div  class="centered-text">
  <div style="font-size: 15px;font-weight: bold;">{{ rect.sort }}</div>
  <div style="font-size: 15px;font-weight: bold;">{{ rect.process_id }}</div>
  <div style="font-size: 15px;font-weight: bold;">{{ rect.project_no }}</div>
  <div style="font-size: 30px;font-weight: bold;">{{ rect.widtha }}*{{ rect.heighta }}</div>
</div>
</div>
 </div>
 </el-scrollbar>
 </div>
 </div>
 </el-card>
</div>
</template>
   <script setup>
   import { ref, onMounted, watch, watchEffect } from 'vue';
   import { useRoute, useRouter } from 'vue-router';
   import request from "@/utils/request"
   const route = useRoute();
   const router = useRouter();
   const current = ref(route.query.current || '');
   const adjustedRects = ref([]);
   const loading = ref(false);
   const adjustedRectsPerRow = ref([]);
   const divsData = ref([]);
   const rawData = ref([]);
   onMounted(() => {
     if (route.query.current) {
       current.value = route.query.current;
       window.localStorage.setItem('current', current.value)
     }
   });
   onMounted(async () => {
       try {
         let current = window.localStorage.getItem('current')
           const response = await request.post(`/cacheGlass/taskCache/temperingTerritory?current=${current}`);
         if (response.code === 200) {
           rawData.value = response.data;
                 processData(rawData.value);
         } else {
         }
       } catch (error) {
       }
     });
   watch(
     current,
     (newVal) => {
       router.replace({ query: { current: newVal } });
     },
     { immediate: true } // 使用 immediate: true 来确保在组件挂载时立即执行一次 watch 回调
   );
   const fetchData = async () => {
     try {
       const response = await request.post(`/cacheGlass/taskCache/temperingTerritory?current=${current.value}`);
       if (response.code === 200) {
          rawData.value = response.data;
          processData(rawData.value);
  }
} catch (error) {
} finally {
  loading.value = false;
}
};
   function processData(data) {
const groupedData = [];
for (let i = 0; i < data.length; i += 1) {
  groupedData.push(data.slice(i, i + 1));
}
divsData.value = groupedData;
const rowIndex = divsData.value;
  adjustedRectsPerRow.value = divsData.value.map(() => []);
divsData.value.forEach((row, rowIndex) => {
  const rawRowData = rawData.value[rowIndex].listGlass;
  if (rawRowData) {
adjustedRectsPerRow.value[rowIndex] = rawRowData.map(rect => {
      let adjustedWidth, adjustedHeight,newX,widtha,heighta;
      if (rect.width < rect.height) {
        widtha = rect.height;
        heighta = rect.width;
      }else {
        widtha = rect.width;
        heighta = rect.height;
      }
      if (rect.rotate_angle  === 90) {
       newX = rect.olHeight -(rect.y_axis + heighta);
       adjustedWidth = heighta * (1000/rect.olHeight);
       adjustedHeight = widtha * (550/rect.olWidth);
      } else {
        newX = rect.olHeight -(rect.y_axis + widtha);
       adjustedWidth = widtha * (1000/rect.olHeight);
       adjustedHeight = heighta * (550/rect.olWidth);
  }
      let adjustedRect = {
        ...rect,
        y_axis: rect.x_axis * (550/rect.olWidth),
        x_axis: newX * (1000/rect.olHeight),
        width: adjustedWidth,
        height: adjustedHeight,
        widtha: rect.width,
        heighta: rect.height,
      };
      return adjustedRect;
    });
  }
});
}
// 方法用于获取当前行的adjustedRects
function getAdjustedRectsForRow(rowIndex) {
return adjustedRectsPerRow.value[rowIndex] || [];
}
</script>
<style scoped>
.row {
display: flex;
justify-content: space-between;
margin-bottom: 20px;
}
.div-container {
width: 1000px;
float: left;
background-color: #f4f4f5;
height: 550px;
box-sizing: border-box;
}
</style>
UI-Project/src/views/Permissions/permissionslist.vue
New file
@@ -0,0 +1,418 @@
<script lang="ts" setup>
import {Search} from "@element-plus/icons-vue";
import {reactive} from "vue";
import {useRouter} from "vue-router"
const router = useRouter()
const value1 = ref(true)
const add = ref(false)
const adda = ref(false)
import { ref } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
const changer = ref(false)
const tableData = [
  {
    id: '1',
    long: '1005',
    wide: '183.6',
    thick: '1991',
    time: '2024/4/1',
    typea: '1',
  },
  {
    id: '2',
    long: '105',
    wide: '183',
    thick: '191',
    time: '2024/4/1',
    typea: '1',
    type: '待识别'
  },
  {
    id: '2',
    time: '2024/4/1',
    long: '105',
    wide: '183',
    thick: '191',
    typea: '1',
    type: '待识别'
  },
]
const data= reactive({
   tableList:[]//table数据
})
const beforeChange = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      ElMessage.success("修改成功!");
      return resolve(true);
    }, 1000);
  });
};
const open = () => {
  ElMessageBox.confirm(
    '是否删除该条信息?',
    '提示',
    {
      confirmButtonText: '是',
      cancelButtonText: '取消',
      type: 'warning',
    }
  )
    .then(() => {
      ElMessage({
        type: 'success',
        message: '删除成功!',
      })
    })
    .catch(() => {
      ElMessage({
        type: 'info',
        message: '删除失败',
      })
    })
}
const getTableRow = (row,type) =>{
  switch (type) {
    case 'edit' :{
      //alert('我接收到子组件传送的编辑信息')
      router.push({path: '/main/returns/createReturns', query: { ReturnID: 'TH24010101' }})
      break
    }
    case 'delete':{
      alert('我接收到子组件传送的删除信息')
      break
    }
  }
}
const dialogForm = () => {
  ElMessageBox.confirm(
    '是否重置密码?',
    '提示',
    {
      confirmButtonText: '是',
      cancelButtonText: '取消',
      type: 'warning',
    }
  )
  .then(() => {
    // this.boxa = true
    // this.box = false
    })
}
const empty = [
   { id: '',
    long: '',
    wide: '',
    thick: '',
    type: '',
    typea: '',}
]
const options = [
  {
    value: 'Option1',
    label: 'admin',
  },
  {
    value: 'Option2',
    label: 'ueser2',
  },
  {
    value: 'Option3',
    label: 'ueser3',
  },
]
const optionsa = [
  {
    valuea: 'Option1',
    labela: '正常',
  },
  {
    valuea: 'Option2',
    labela: '禁用',
  },
]
// const delete = () => {
//   ElMessageBox.confirm(
//     '是否删除该条信息?',
//     '提示',
//     {
//       confirmButtonText: '是',
//       cancelButtonText: '取消',
//       type: 'warning',
//     }
//   )
//   .then(() => {
//     })
// }
const gridOptions = reactive({
  border:  "full",//表格加边框
  keepSource: true,//保持源数据
  align: 'center',//文字居中
  stripe:true,//斑马纹
  rowConfig: {isCurrent: true, isHover: true,height: 50},//鼠标移动或选择高亮
  id: 'OrderList',
  showFooter: true,//显示脚
  printConfig: {},
  importConfig: {},
  exportConfig: {},
  scrollY:{ enabled: true },//开启虚拟滚动
  showOverflow:true,
  columnConfig: {
    resizable: true,
    useKey: true
  },
  filterConfig: {   //筛选配置项
    remote: true
  },
  customConfig: {
    storage: true
  },
  editConfig: {
    trigger: 'click',
    mode: 'row',
    showStatus: true
  },
  data:  [
    {
      'id': '1',
      'long': '5',
      'wide': '1005',
      'thick': '183.6',
    }
  ],
})
</script>
<template>
  <div>
        <el-button type="primary" style="margin-top: 10px;margin-left: 10px;"  id="searchButton" @click="add = true">添加权限</el-button>
        <el-input
          clearable
          placeholder="请输入关键字"
          style="margin-right: 20px; width: 200px;margin-left: 10px;margin-top: 10px;"
        />
        <el-button type="primary" @click="searchSubmit" style="margin-top: 10px;">查询</el-button >
        <el-button type="primary" @click="empty" style="margin-top: 10px;">清空</el-button>
    <el-card style="flex: 1;margin-left: 10px;margin-top: 15px;" >
      <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;max-height: 200px;">
        <el-table height="100%" ref="table"
        @selection-change="handleSelectionChange"
        :data="tableData" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
          <el-table-column prop="id" align="center" label="角色" min-width="80" />
          <el-table-column prop="long" align="center" label="权限描述" min-width="120" />
          <el-table-column prop="wide" align="center" label="权限值" min-width="120" />
          <el-table-column prop="time" align="center" label="创建时间" min-width="120" />
        <el-table-column align="center"  prop="changer" label="是否激活"  min-width="140">
           <template #default="scope">
           <el-switch  v-model="scope.row.changer"  :before-change="beforeChange" />
         </template>
         </el-table-column>
          <el-table-column fixed="right" label="操作" align="center" width="200">
            <template #default>
              <el-button type="text" plain  @click="adda = true">编辑</el-button>
              <el-button type="text" plain  @click="delete">删除</el-button>
            </template>
        </el-table-column>
        </el-table>
      </div>
    </el-card>
  </div>
  <el-dialog v-model="add" top="23vh" width="37%" title="添加权限" >
    <div style="margin-left: -50px;margin-top: 10px;margin-bottom: 10px;">
            <el-form  label-width="150px">
      <el-form label-width="100px" label-position="right">
        <el-row style="margin-top: 10px;">
          <el-col :span="6">
              <div id="dt" style="font-size: 15px;">
        <div>
              <el-form-item label="角色:" :required="true" style="width: 25vw;">
                <el-select
               v-model="value"
               clearable
               placeholder="请选择角色"
               style="width: 330px"
             >
               <el-option
            v-for="item in options"
            :key="item.value"
            :label="item.label"
            :value="item.value"
          />
        </el-select>
              </el-form-item></div></div>
          </el-col>
        </el-row>
        <el-row style="margin-top: 10px;">
          <el-col :span="6">
              <div id="dt" style="font-size: 15px;">
        <div>
              <el-form-item label="权限:" :required="true" style="width: 25vw;">
                <el-select
               v-model="value"
               clearable
               placeholder="请选择权限"
               style="width: 330px"
             >
               <el-option
            v-for="item in options"
            :key="item.value"
            :label="item.label"
            :value="item.value"
          />
        </el-select>
              </el-form-item></div></div>
          </el-col>
        </el-row>
        <el-row style="margin-top: 10px;">
          <el-col :span="6">
              <div id="dt" style="font-size: 15px;">
        <div>
              <el-form-item label="是否激活" :required="true" style="width: 25vw;">
                <el-select
               v-model="value"
               clearable
               placeholder="请选择是否激活"
               style="width: 330px"
             >
               <el-option
            v-for="item in optionsa"
            :key="item.valuea"
            :label="item.labela"
            :value="item.valuea"
          />
        </el-select>
              </el-form-item></div></div>
          </el-col>
        </el-row>
        </el-form>
            </el-form>
          </div>
    <template #footer>
      <div id="dialog-footer">
        <el-button type="primary" @click="getTableRow('edit')">
          确认
        </el-button>
        <el-button @click="add = false">取消</el-button>
      </div>
    </template>
  </el-dialog>
  <el-dialog v-model="adda" top="23vh" width="37%" title="修改权限" >
    <div style="margin-left: -50px;margin-top: 10px;margin-bottom: 10px;">
            <el-form  label-width="150px">
      <el-form label-width="100px" label-position="right">
        <el-row style="margin-top: 10px;">
          <el-col :span="6">
              <div id="dt" style="font-size: 15px;">
        <div>
              <el-form-item label="角色:" :required="true" style="width: 25vw;">
                <el-select
               v-model="value"
               clearable
               placeholder="请选择角色"
               style="width: 330px"
             >
               <el-option
            v-for="item in options"
            :key="item.value"
            :label="item.label"
            :value="item.value"
          />
        </el-select>
              </el-form-item></div></div>
          </el-col>
        </el-row>
        <el-row style="margin-top: 10px;">
          <el-col :span="6">
              <div id="dt" style="font-size: 15px;">
        <div>
              <el-form-item label="权限:" :required="true" style="width: 25vw;">
                <el-select
               v-model="value"
               clearable
               placeholder="请选择权限"
               style="width: 330px"
             >
               <el-option
            v-for="item in options"
            :key="item.value"
            :label="item.label"
            :value="item.value"
          />
        </el-select>
              </el-form-item></div></div>
          </el-col>
        </el-row>
        <el-row style="margin-top: 10px;">
          <el-col :span="6">
              <div id="dt" style="font-size: 15px;">
        <div>
              <el-form-item label="是否激活" :required="true" style="width: 25vw;">
                <el-select
               v-model="value"
               clearable
               placeholder="请选择是否激活"
               style="width: 330px"
             >
               <el-option
            v-for="item in optionsa"
            :key="item.valuea"
            :label="item.labela"
            :value="item.valuea"
          />
        </el-select>
              </el-form-item></div></div>
          </el-col>
        </el-row>
        </el-form>
            </el-form>
          </div>
    <template #footer>
      <div id="dialog-footer">
        <el-button type="primary" @click="getTableRow('edit')">
          确认
        </el-button>
        <el-button @click="adda = false">取消</el-button>
      </div>
    </template>
  </el-dialog>
</template>
<style scoped>
#dt { display:block; float:left;line-height: 20px;margin-left: 100px;}
#dta { display:block; float:left;line-height: 20px;margin-left: 80%;}
#dialog-footer{
  text-align: center;
  margin-top: -15px;
}
#message{
  text-align: center;
  align-items: center;
  color: black;
   width: 200px;
   height: 100px;
   background-color: #337ecc;
   margin-left: 28%;
}
#awatch{
  height: 450px;
}
#main-body{
  margin-top: -20px;
  margin-left: 300px;
}
#main-bodya{
  margin-top: -10px;
  margin-left: 100px;
}
</style>
UI-Project/src/views/PurchaseReturn/purchase.vue
New file
@@ -0,0 +1,38 @@
<script setup>
import {ArrowLeftBold, ArrowRight, Search} from "@element-plus/icons-vue"
import {useRouter} from "vue-router";
let indexFlag=$ref(1)
function changeRouter(index){
  indexFlag=index
}
</script>
<template>
    <div id="main-body">
      <router-view  />
    </div>
</template>
<style scoped>
#main-div{
  width: 100%;
  height: 100%;
}
#div-title{
  height: 2%;
  width: 100%;
}
#searchButton{
  margin-top: -5px;
  margin-left: 1rem;
}
#main-body{
  width: 100%;
  height: 95%;
  /* margin-top: 1%; */
}
#select{
  margin-left:0.5rem;
}
:deep(.indexTag .el-breadcrumb__inner){
  color: #5CADFE !important;
}
</style>
UI-Project/src/views/PurchaseReturn/purchaseReturn.vue
New file
@@ -0,0 +1,1167 @@
<script setup lang="ts">
import {nextTick, onBeforeUnmount, onMounted, ref} from "vue";
import request from "@/utils/request"
import {host, WebSocketHost} from '@/utils/constants'
import {ElMessage} from 'element-plus'
import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
import {useI18n} from 'vue-i18n'
import {useRouter} from 'vue-router'
const {t} = useI18n()
let language = ref(localStorage.getItem('lang') || 'zh')
const dialogFormVisible = ref(false)
const dialogFormVisiblea = ref(true)
const dialogFormVisibleb = ref(false)
const blind1 = ref(false)
const blind2 = ref(false)
const blinda = ref(false)
const blindb = ref(false)
const dialogVisible = ref(false)
const width = ref();
const height = ref();
const currentRect = ref(null);
const canSelectProject1 = ref(true);
const canSelectProject2 = ref(true);
const canSelectProjecta = ref(true);
const cantakea = ref(true);
const cantakeb = ref(true);
const canona = ref(true);
const canonb = ref(true);
const canSelectProjectb = ref(true);
const adjustedRects1 = ref([]);
const adjustedRects2 = ref([]);
const adjustedRectsa = ref([]);
const adjustedRectsb = ref([]);
const currentPage = ref<number>(1);
const tableData = ref([])
const engineerId = ref('')
const router = useRouter()
const currentGlassId = ref(null);
const currenttemperingFeedSequence = ref(null);
onMounted(async () => {
  try {
    const response = await request.post('/loadGlass/damage/selectDamagePrint', {
    type: 9,
    workingProcedure: '钢化',
    })
    if (response.code === 200) {
          tableData.value = response.data
    } else {
      ElMessage.warning(response.message)
    }
  } catch (error) {
  }
});
// 方法定义
function handlePageChange(page: number) {
  currentPage.value = page;
}
const socketUrl = `ws://${WebSocketHost}:${host}/api/temperingGlass/api/talk/temperingGlass`;
const handleMessage = (data) => {
  // 进炉中右
  if (data.intoGlass2 && data.intoGlass2.length > 0) {
    const newGlassIds = new Set(data.intoGlass2[0].map(rect => rect.glassId));
    const existingRects = adjustedRects2.value.filter(rect => newGlassIds.has(rect.glassId));
    const newRects = data.intoGlass2[0].map(rect => {
      const scaleFactor =  1621.78/6000;
      const scaleFactorY =  700/2800;
      let adjustedWidth, adjustedHeight, adjustedWidtha, adjustedHeighta,widtha,heighta;;
  let newX = rect.yCoordinate;
      if (rect.width < rect.height) {
        widtha = rect.height;
        heighta = rect.width;
      }else {
        widtha = rect.width;
        heighta = rect.height;
      }
  if (rect.angle === 0) {
    adjustedWidth = widtha * scaleFactor;
    adjustedHeight = heighta * scaleFactorY;
    // adjustedWidtha = widtha;
    // adjustedHeighta = heighta;
    newX = 6000 - (rect.yCoordinate + widtha);
    } else {
    adjustedWidth = heighta * scaleFactor;
    adjustedHeight = widtha * scaleFactorY;
    // adjustedWidtha = widtha;
    // adjustedHeighta = heighta;
    newX = 6000 - (rect.yCoordinate + heighta);
  }
  return {
    ...rect,
    x: newX * scaleFactor,
    y: rect.xCoordinate * scaleFactorY,
    width: adjustedWidth,
    height: adjustedHeight,
    widtha: rect.width,
    heighta: rect.height,
  }
    });
    // 合并新旧矩形,并保留 isActive 状态
    adjustedRects2.value = existingRects.map(oldRect => {
      const newRect = newRects.find(r => r.glassId === oldRect.glassId);
      if (newRect) {
        return { ...oldRect, ...newRect, isActive: oldRect.isActive };
      }
      return oldRect; // 如果旧矩形在新数据中不存在,但保留在newGlassIds中,则保留原样
    }).concat(newRects.filter(r => !existingRects.some(o => o.glassId === r.glassId)));
  }
  // if (data.intoGlass2 && data.intoGlass2.length > 0) {
  //   // 提取新的矩形ID
  //   const newGlassIds = new Set(data.intoGlass2[0].map(rect => rect.glassId));
  //   // 过滤出已存在的矩形
  //   const existingRects = adjustedRects2.value.filter(rect => newGlassIds.has(rect.glassId));
  //   // 计算新的矩形
  //   const newRects = data.intoGlass2[0].map(rect => {
  //     const scaleFactor =  794.67/5087;
  //     const scaleFactorY =  430/2800;
  //       let adjustedWidth, adjustedHeight, adjustedWidtha, adjustedHeighta,widtha,heighta;
  //       let newX = rect.yCoordinate;
  //     if (rect.width < rect.height) {
  //       widtha = rect.height;
  //       heighta = rect.width;
  //     }else {
  //       widtha = rect.width;
  //       heighta = rect.height;
  //     }
  //     if (rect.angle === 0) {
  //   adjustedWidth = widtha * scaleFactor;
  //   adjustedHeight = heighta * scaleFactorY;
  //   // adjustedWidtha = widtha;
  //   // adjustedHeighta = heighta;
  //   newX = 5087 - (rect.yCoordinate + widtha);
  //   } else {
  //   adjustedWidth = heighta * scaleFactor;
  //   adjustedHeight = widtha * scaleFactorY;
  //   // adjustedWidtha = widtha;
  //   // adjustedHeighta = heighta;
  //   newX = 5087 - (rect.yCoordinate + heighta);
  // }
  //       return {
  //       ...rect,
  //       xcoordinate: newX * scaleFactor,
  //       ycoordinate: rect.xCoordinate * scaleFactorY,
  //       width: adjustedWidth,
  //       height: adjustedHeight,
  //       widtha: rect.width,
  //       heighta: rect.height,
  //     }
  //   });
  //   // 合并新旧矩形,并保留 isActive 状态
  //   adjustedRects2.value = existingRects.map(oldRect => {
  //     const newRect = newRects.find(r => r.glassId === oldRect.glassId);
  //     if (newRect) {
  //       return { ...oldRect, ...newRect, isActive: oldRect.isActive };
  //     }
  //     return oldRect; // 如果旧矩形在新数据中不存在,但保留在newGlassIds中,则保留原样
  //   }).concat(newRects.filter(r => !existingRects.some(o => o.glassId === r.glassId)));
  // }
  else if (data.intoGlass2 == null) {
    adjustedRects2.value = []
  }
  // 进炉中左
  if (data.intoGlass && data.intoGlass.length > 0) {
    const newGlassIds = new Set(data.intoGlass[0].map(rect => rect.glassId));
    const existingRects = adjustedRects1.value.filter(rect => newGlassIds.has(rect.glassId));
    const newRects = data.intoGlass[0].map(rect => {
      const scaleFactor =  1621.78/6000;
      const scaleFactorY =  700/2800;
      let adjustedWidth, adjustedHeight, adjustedWidtha, adjustedHeighta,widtha,heighta;;
  let newX = rect.yCoordinate;
      if (rect.width < rect.height) {
        widtha = rect.height;
        heighta = rect.width;
      }else {
        widtha = rect.width;
        heighta = rect.height;
      }
  if (rect.angle === 0) {
    adjustedWidth = widtha * scaleFactor;
    adjustedHeight = heighta * scaleFactorY;
    // adjustedWidtha = widtha;
    // adjustedHeighta = heighta;
    newX = 6000 - (rect.yCoordinate + widtha);
    } else {
    adjustedWidth = heighta * scaleFactor;
    adjustedHeight = widtha * scaleFactorY;
    // adjustedWidtha = widtha;
    // adjustedHeighta = heighta;
    newX = 6000 - (rect.yCoordinate + heighta);
  }
  return {
    ...rect,
    x: newX * scaleFactor,
    y: rect.xCoordinate * scaleFactorY,
    width: adjustedWidth,
    height: adjustedHeight,
    widtha: rect.width,
    heighta: rect.height,
  }
    });
    // 合并新旧矩形,并保留 isActive 状态
    adjustedRects1.value = existingRects.map(oldRect => {
      const newRect = newRects.find(r => r.glassId === oldRect.glassId);
      if (newRect) {
        return { ...oldRect, ...newRect, isActive: oldRect.isActive };
      }
      return oldRect; // 如果旧矩形在新数据中不存在,但保留在newGlassIds中,则保留原样
    }).concat(newRects.filter(r => !existingRects.some(o => o.glassId === r.glassId)));
  }
  // if (data.intoGlass && data.intoGlass.length > 0) {
  //   console.log(data.intoGlass);
  //   const newGlassIds = new Set(data.intoGlass[0].map(rect => rect.glassId));
  //   const existingRects = adjustedRects1.value.filter(rect => newGlassIds.has(rect.glassId));
  //   const newRects = data.intoGlass[0].map(rect => {
  //     const scaleFactor =  810.89/5087;
  //     const scaleFactorY =  430/2800;
  //     let adjustedWidth, adjustedHeight, adjustedWidtha, adjustedHeighta,widtha,heighta;
  //     let newX = rect.yCoordinate;
  //     if (rect.width < rect.height) {
  //       widtha = rect.height;
  //       heighta = rect.width;
  //     }else {
  //       widtha = rect.width;
  //       heighta = rect.height;
  //     }
  //     if (rect.angle === 0) {
  //   adjustedWidth = widtha * scaleFactor;
  //   adjustedHeight = heighta * scaleFactorY;
  //   // adjustedWidtha = widtha;
  //   // adjustedHeighta = heighta;
  //   newX = 5087 - (rect.yCoordinate + widtha);
  //   } else {
  //   adjustedWidth = heighta * scaleFactor;
  //   adjustedHeight = widtha * scaleFactorY;
  //   // adjustedWidtha = widtha;
  //   // adjustedHeighta = heighta;
  //   newX = 5087 - (rect.yCoordinate + heighta);
  // }
  //       return {
  //       ...rect,
  //       xcoordinate: newX * scaleFactor,
  //       ycoordinate: rect.xCoordinate * scaleFactorY,
  //       width: adjustedWidth,
  //       height: adjustedHeight,
  //       widtha: rect.width,
  //       heighta: rect.height,
  //     }
  //   });
  //   // 合并新旧矩形,并保留 isActive 状态
  //   adjustedRects1.value = existingRects.map(oldRect => {
  //     const newRect = newRects.find(r => r.glassId === oldRect.glassId);
  //     if (newRect) {
  //       return { ...oldRect, ...newRect, isActive: oldRect.isActive };
  //     }
  //     return oldRect; // 如果旧矩形在新数据中不存在,但保留在newGlassIds中,则保留原样
  //   }).concat(newRects.filter(r => !existingRects.some(o => o.glassId === r.glassId)));
  // }
  else {
    adjustedRects1.value = []
  }
  // 进炉前
  if (data.waitingGlass && data.waitingGlass.length > 0) {
    const newGlassIds = new Set(data.waitingGlass[0].map(rect => rect.glassId));
    const existingRects = adjustedRectsa.value.filter(rect => newGlassIds.has(rect.glassId));
    const newRects = data.waitingGlass[0].map(rect => {
      const scaleFactor =  1621.78/6000;
      const scaleFactorY =  700/2800;
      let adjustedWidth, adjustedHeight, adjustedWidtha, adjustedHeighta,widtha,heighta;;
  let newX = rect.yCoordinate;
      if (rect.width < rect.height) {
        widtha = rect.height;
        heighta = rect.width;
      }else {
        widtha = rect.width;
        heighta = rect.height;
      }
  if (rect.angle === 0) {
    adjustedWidth = widtha * scaleFactor;
    adjustedHeight = heighta * scaleFactorY;
    // adjustedWidtha = widtha;
    // adjustedHeighta = heighta;
    newX = 6000 - (rect.yCoordinate + widtha);
    } else {
    adjustedWidth = heighta * scaleFactor;
    adjustedHeight = widtha * scaleFactorY;
    // adjustedWidtha = widtha;
    // adjustedHeighta = heighta;
    newX = 6000 - (rect.yCoordinate + heighta);
  }
  return {
    ...rect,
    x: newX * scaleFactor,
    y: rect.xCoordinate * scaleFactorY,
    width: adjustedWidth,
    height: adjustedHeight,
    widtha: rect.width,
    heighta: rect.height,
  }
    });
    // 合并新旧矩形,并保留 isActive 状态
    adjustedRectsa.value = existingRects.map(oldRect => {
      const newRect = newRects.find(r => r.glassId === oldRect.glassId);
      if (newRect) {
        return { ...oldRect, ...newRect, isActive: oldRect.isActive };
      }
      return oldRect; // 如果旧矩形在新数据中不存在,但保留在newGlassIds中,则保留原样
    }).concat(newRects.filter(r => !existingRects.some(o => o.glassId === r.glassId)));
  }
  else if (data.waitingGlass == null) {
    adjustedRectsa.value = []
  }
  // 已出炉
  if (data.outGlass && data.outGlass.length > 0) {
    const newGlassIds = new Set(data.outGlass[0].map(rect => rect.glassId));
    const existingRects = adjustedRectsb.value.filter(rect => newGlassIds.has(rect.glassId));
    const newRects = data.outGlass[0].map(rect => {
      const scaleFactor =  1621.78/6000;
      const scaleFactorY =  700/2800;
      let adjustedWidth, adjustedHeight, adjustedWidtha, adjustedHeighta,widtha,heighta;;
  let newX = rect.yCoordinate;
      if (rect.width < rect.height) {
        widtha = rect.height;
        heighta = rect.width;
      }else {
        widtha = rect.width;
        heighta = rect.height;
      }
  if (rect.angle === 0) {
    adjustedWidth = widtha * scaleFactor;
    adjustedHeight = heighta * scaleFactorY;
    // adjustedWidtha = widtha;
    // adjustedHeighta = heighta;
    newX = 6000 - (rect.yCoordinate + widtha);
    } else {
    adjustedWidth = heighta * scaleFactor;
    adjustedHeight = widtha * scaleFactorY;
    // adjustedWidtha = widtha;
    // adjustedHeighta = heighta;
    newX = 6000 - (rect.yCoordinate + heighta);
  }
  return {
    ...rect,
    x: newX * scaleFactor,
    y: rect.xCoordinate * scaleFactorY,
    width: adjustedWidth,
    height: adjustedHeight,
    widtha: rect.width,
    heighta: rect.height,
  }
    });
    // 合并新旧矩形,并保留 isActive 状态
    adjustedRectsb.value = existingRects.map(oldRect => {
      const newRect = newRects.find(r => r.glassId === oldRect.glassId);
      if (newRect) {
        return { ...oldRect, ...newRect, isActive: oldRect.isActive };
      }
      return oldRect;
    }).concat(newRects.filter(r => !existingRects.some(o => o.glassId === r.glassId)));
  }
  // if (data.outGlass && data.outGlass.length > 0) {
  //   // 提取新的矩形ID
  //   const newGlassIds = new Set(data.outGlass[0].map(rect => rect.glassId));
  //   // 过滤出已存在的矩形
  //   const existingRects = adjustedRectsb.value.filter(rect => newGlassIds.has(rect.glassId));
  //   // 计算新的矩形
  //   const newRects = data.outGlass[0].map(rect => {
  //     const scaleFactor =  1390/6000;
  //     const scaleFactory =  750/2800;
  //     let adjustedWidth, adjustedHeight, adjustedWidtha, adjustedHeighta,widtha,heighta,newY;
  // let newX = rect.yCoordinate;
  //     if (rect.width < rect.height) {
  //       widtha = rect.height;
  //       heighta = rect.width;
  //     }else {
  //       widtha = rect.width;
  //       heighta = rect.height;
  //     }
  // if (rect.angle === 0) {
  //   adjustedWidth = widtha * scaleFactor;
  //   adjustedHeight = heighta * scaleFactory;
  //   // adjustedWidtha = widtha;
  //   // adjustedHeighta = heighta;
  //   // newX = 5190 - (rect.yCoordinate + widtha);
  //   newY = 2800 - (rect.xCoordinate + heighta);
  // } else {
  //   adjustedWidth = heighta * scaleFactor;
  //   adjustedHeight = widtha * scaleFactory;
  //   // adjustedWidtha = heighta;
  //   // adjustedHeighta = widtha;
  //   // newX = 5190 - (rect.yCoordinate + heighta);
  //   newY = 2800 - (rect.xCoordinate + widtha);
  // }
  // return {
  //       ...rect, // 复制原始对象的其他属性
  //       x: newX * scaleFactor,
  //       y: newY * scaleFactory,
  //       width: adjustedWidth,
  //       height: adjustedHeight,
  //       widtha: rect.width,
  //       heighta: rect.height,
  // }
  //   });
  //   // 合并新旧矩形,并保留 isActive 状态
  //   adjustedRectsb.value = existingRects.map(oldRect => {
  //     const newRect = newRects.find(r => r.glassId === oldRect.glassId);
  //     if (newRect) {
  //       return { ...oldRect, ...newRect, isActive: oldRect.isActive };
  //     }
  //     return oldRect; // 如果旧矩形在新数据中不存在,但保留在newGlassIds中,则保留原样
  //   }).concat(newRects.filter(r => !existingRects.some(o => o.glassId === r.glassId)));
  // }
  else if (data.outGlass == null) {
    adjustedRectsb.value = []
  }
};
onMounted(() => {
  initializeWebSocket(socketUrl, handleMessage);
});
function updateRectColorsa() {
  adjustedRectsa.value.forEach(rect => {
    if (rect.glassId === glassId) {
      rect.state = 8;
    }
  });
}
function updateoutColorsa() {
  adjustedRectsa.value.forEach(rect => {
    if (rect.glassId === glassId) {
      rect.state = 9;
    }
  });
}
function updateoutColorsc() {
  adjustedRects1.value.forEach(rect => {
    if (rect.glassId === glassId) {
      rect.state = 9;
    }
  });
}
function updateoutColorsd() {
  adjustedRects2.value.forEach(rect => {
    if (rect.glassId === glassId) {
      rect.state = 9;
    }
  });
}
function updateonColorsa() {
  adjustedRectsa.value.forEach(rect => {
    if (rect.glassId === glassId) {
      rect.state = 1;
    }
  });
}
function updateRectColorsb() {
  adjustedRectsb.value.forEach(rect => {
    if (rect.glassId === glassId) {
      rect.state = 8;
    }
  });
}
function updateoutColorsb() {
  adjustedRectsb.value.forEach(rect => {
    if (rect.glassId === glassId) {
      rect.state = 9;
    }
  });
}
function updateonColorsb() {
  adjustedRectsb.value.forEach(rect => {
    if (rect.glassId === glassId) {
      rect.state = 3;
    }
  });
}
function updateRectColors1() {
  adjustedRects1.value.forEach(rect => {
    if (rect.glassId === glassId) {
      rect.state = 8;
    }
  });
}
function updateRectColors2() {
  adjustedRects2.value.forEach(rect => {
    if (rect.glassId === glassId) {
      rect.state = 8;
    }
  });
}
function getRectColor1(state) {
  switch (state) {
    case 2:
      return 'lightblue';
    case 8:
      return '#911005';
    case 9:
      return '#4682B4';
    default:
      return '#CDAF95';
  }
}
function getRectColor2(state) {
  switch (state) {
    case 2:
      return 'lightblue';
    case 8:
      return '#911005';
    case 9:
      return '#4682B4';
    default:
      return '#CDAF95';
  }
}
function getRectColora(state) {
  switch (state) {
    case 0:
      return '#7AC5CD';
    case 1:
      return '#95d475';
    case -1:
      return '#99BBFF';
    case 8:
      return '#911005';
    case 9:
      return '#4682B4';
    default:
      return '#CDAF95';
  }
}
function getRectColorb(state) {
  switch (state) {
    case 3:
      return '#eebe77';
    case 4:
      return '#CD6090';
    case 8:
      return '#911005';
    case 9:
      return '#4682B4';
    default:
      return '#CDAF95';
  }
}
function showDialog1(rect) {
  const index = adjustedRects1.value.findIndex(r => r.glassId === rect.glassId);
  if (index !== -1) {
    adjustedRects1.value[index].isActive = true;
  }
  currentGlassId.value = rect.glassId;
  currenttemperingFeedSequence.value = rect.temperingFeedSequence;
  blind1.value = true;
  currentRect.value = rect;
  if (currentRect.value.state == 8) {
    canSelectProject1.value = false;
  } else if (currentRect.value.state !== 8) {
    canSelectProject1.value = true;
  }
  if (currentRect.value.state == 9) {
    cantakea.value = false;
  } else if (currentRect.value.state !== 9) {
    cantakea.value = true;
  }
}
function showDialog2(rect) {
  const index = adjustedRects2.value.findIndex(r => r.glassId === rect.glassId);
  if (index !== -1) {
    adjustedRects2.value[index].isActive = true;
  }
  currentGlassId.value = rect.glassId;
  currenttemperingFeedSequence.value = rect.temperingFeedSequence;
  blind2.value = true;
  currentRect.value = rect;
  if (currentRect.value.state == 8) {
    canSelectProject2.value = false;
  } else if (currentRect.value.state !== 8) {
    canSelectProject2.value = true;
  }
  if (currentRect.value.state == 9) {
    cantakea.value = false;
  } else if (currentRect.value.state !== 9) {
    cantakea.value = true;
  }
}
function showDialoga(rect) {
  const index = adjustedRectsa.value.findIndex(r => r.glassId === rect.glassId);
  if (index !== -1) {
    adjustedRectsa.value[index].isActive = true;
  }
  currentGlassId.value = rect.glassId;
  currenttemperingFeedSequence.value = rect.temperingFeedSequence;
  blinda.value = true;
  currentRect.value = rect;
  if (currentRect.value.state == 8) {
    canSelectProjecta.value = false;
  } else if (currentRect.value.state !== 8) {
    canSelectProjecta.value = true;
  }
  if (currentRect.value.state == 9) {
    cantakea.value = false;
  } else if (currentRect.value.state !== 9) {
    cantakea.value = true;
  }
  if (currentRect.value.state == 1) {
    canona.value = false;
  } else if (currentRect.value.state == 0) {
    canona.value = true;
  }
}
function showDialogb(rect) {
  const index = adjustedRectsb.value.findIndex(r => r.glassId === rect.glassId);
  if (index !== -1) {
    adjustedRectsb.value[index].isActive = true;
  }
  currentGlassId.value = rect.glassId;
  currenttemperingFeedSequence.value = rect.temperingFeedSequence;
  blindb.value = true;
  currentRect.value = rect;
  if (currentRect.value.state == 8) {
    canSelectProjectb.value = false;
  } else if (currentRect.value.state !== 8) {
    canSelectProjectb.value = true;
  }
  if (currentRect.value.state == 9) {
    cantakeb.value = false;
  } else if (currentRect.value.state !== 9) {
    cantakeb.value = true;
  }
  if (currentRect.value.state == 3) {
    canonb.value = false;
  } else if (currentRect.value.state !== 3) {
    canonb.value = true;
  }
}
  const handleDialogClose1 = () => {
  adjustedRects1.value.forEach(rect => {
    rect.isActive = false;
  });
  blind1.value = false;
};
  const handleDialogClose2 = () => {
  adjustedRects2.value.forEach(rect => {
    rect.isActive = false;
  });
  blind2.value = false;
};
  const handleDialogClosea = () => {
  adjustedRectsa.value.forEach(rect => {
    rect.isActive = false;
  });
  blinda.value = false;
};
  const handleDialogCloseb = () => {
  adjustedRectsb.value.forEach(rect => {
    rect.isActive = false;
  });
  blindb.value = false;
};
// 破损
const handleDamage1 = async () => {
  try  {
  const response = await request.post('/temperingGlass/temperingGlassInfo/updateTemperingState', {
    glassId: currentGlassId.value,
    // temperingFeedSequence: currenttemperingFeedSequence.value,
    line: 4001,
    state: 8,
    workingProcedure: '钢化',
    })
    if (response.code == 200) {
      ElMessage.success('成功!');
      blind1.value = false;
      updateRectColors1();
    } else {
      ElMessage.error(response.message);
    }
}
catch (error) {
    console.error(error);
  }
}
const handleDamage2 = async () => {
  try  {
  const response = await request.post('/temperingGlass/temperingGlassInfo/updateTemperingState', {
    glassId: currentGlassId.value,
    line: 4001,
    state: 8,
    workingProcedure: '钢化',
    })
    if (response.code == 200) {
      ElMessage.success('成功!');
      blind2.value = false;
      updateRectColors2();
    } else {
      ElMessage.error(response.message);
    }
}
catch (error) {
    console.error(error);
  }
}
// 进炉前破损
const handleDamagea = async () => {
  try  {
  const response = await request.post('/temperingGlass/temperingGlassInfo/updateTemperingState', {
    glassId: currentGlassId.value,
    line: 4001,
    state: 8,
    workingProcedure: '钢化',
    })
    if (response.code == 200) {
      ElMessage.success('成功!');
      blinda.value = false;
      updateRectColorsa();
    } else {
      ElMessage.error(response.message);
    }
}
catch (error) {
    console.error(error);
  }
}
// 进炉前人工拿走
const takeouta = async () => {
  try  {
  const response = await request.post('/temperingGlass/temperingGlassInfo/updateTemperingState', {
    glassId: currentGlassId.value,
    line: 4001,
    state: 9,
    workingProcedure: '钢化',
    })
    if (response.code == 200) {
      ElMessage.success('成功!');
      blinda.value = false;
      updateoutColorsa();
    } else {
      ElMessage.error(response.message);
    }
}
catch (error) {
    console.error(error);
  }
}
// 进炉前放回
const takeona = async () => {
  try  {
  const response = await request.post('/temperingGlass/temperingGlassInfo/updateTemperingState', {
    glassId: currentGlassId.value,
    line: 4001,
    state: 1,
    workingProcedure: '钢化',
    })
    if (response.code == 200) {
      ElMessage.success('成功!');
      blinda.value = false;
      updateonColorsa();
    } else {
      ElMessage.error(response.message);
    }
}
catch (error) {
    console.error(error);
  }
}
// 进炉中人工拿走
const takeoutc = async () => {
  try  {
  const response = await request.post('/temperingGlass/temperingGlassInfo/updateTemperingState', {
    glassId: currentGlassId.value,
    line: 4001,
    state: 9,
    workingProcedure: '钢化',
    })
    if (response.code == 200) {
      ElMessage.success('成功!');
      blind1.value = false;
      updateoutColorsc();
    } else {
      ElMessage.error(response.message);
    }
}
catch (error) {
    console.error(error);
  }
}
// 进炉中人工拿走
const takeoutd = async () => {
  try  {
  const response = await request.post('/temperingGlass/temperingGlassInfo/updateTemperingState', {
    glassId: currentGlassId.value,
    line: 4001,
    state: 9,
    workingProcedure: '钢化',
    })
    if (response.code == 200) {
      ElMessage.success('成功!');
      blind2.value = false;
      updateoutColorsd();
    } else {
      ElMessage.error(response.message);
    }
}
catch (error) {
    console.error(error);
  }
}
// 已出炉破损
const handleDamageb = async () => {
  try  {
  const response = await request.post('/temperingGlass/temperingGlassInfo/updateTemperingState', {
    glassId: currentGlassId.value,
    line: 4001,
    state: 8,
    workingProcedure: '钢化',
    })
    if (response.code == 200) {
      ElMessage.success('成功!');
      blindb.value = false;
      updateRectColorsb();
    } else {
      ElMessage.error(response.message);
    }
}
catch (error) {
  }
}
// 已出炉人工拿走
const takeoutb = async () => {
  try  {
  const response = await request.post('/temperingGlass/temperingGlassInfo/updateTemperingState', {
    glassId: currentGlassId.value,
    line: 4001,
    state: 9,
    workingProcedure: '钢化',
    })
    if (response.code == 200) {
      ElMessage.success('成功!');
      blindb.value = false;
      updateoutColorsb();
    } else {
      ElMessage.error(response.message);
    }
}
catch (error) {
  }
}
// 已出炉放回
const takeonb = async () => {
  try  {
  const response = await request.post('/temperingGlass/temperingGlassInfo/updateTemperingState', {
    glassId: currentGlassId.value,
    line: 4001,
    state: 3,
    workingProcedure: '钢化',
    })
    if (response.code == 200) {
      ElMessage.success('成功!');
      blindb.value = false;
      updateonColorsb();
    } else {
      ElMessage.error(response.message);
    }
}
catch (error) {
}
}
onBeforeUnmount(() => {
  closeWebSocket();
});
</script>
<template>
  <div style="height: 500px;">
    <div style="margin-top: 10px;">
      <el-button style="margin-left: 15px;" id="searchButton" type="primary"
                 @click="dialogFormVisiblea = true;dialogFormVisible = false;dialogFormVisibleb = false;">
        {{ $t('processCard.beforefurnace') }}
      </el-button>
      <el-button style="margin-left: 15px;" id="searchButton" type="primary"
                 @click="dialogFormVisible = true;dialogFormVisiblea = false;dialogFormVisibleb = false;">
        {{ $t('processCard.intofurnace') }}
      </el-button>
      <el-button id="searchButton" type="success"
                 @click="dialogFormVisibleb = true;dialogFormVisible = false;dialogFormVisiblea = false;">
        {{ $t('processCard.outfurnace') }}
      </el-button>
      <div v-if="dialogFormVisible">
        <!-- 进炉中右 -->
        <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 800px;">
          <!-- <div style="width:900px;background-color: #f4f4f5;height: 420px;"> -->
            <!-- <div v-if="adjustedRects1.length > 0"> -->
              <div v-if="currentPage === 1 && adjustedRects1.length > 0">
              <!-- <div style="text-align: center;">炉号:{{ engineerIdDisplay }}-{{ adjustedRects[0].temperingLayoutId }}</div>   -->
              <div style="text-align: center;"> {{ $t('processCard.temperinglayout') }}:{{
                  adjustedRects1[0].engineerId
                }}-{{ adjustedRects1[0].temperingLayoutId }}
              </div>
    <el-scrollbar height="750px" style="background-color: #e9e9eb;">
    <div  style="position: relative;max-width: 1400px;">
      <div
      v-for="(rect, index) in adjustedRects1"
      :key="index"
      @click="showDialog1(rect)"
      class="rect"
      :style="{ position: 'absolute',
       top: `${rect.y}px`,
       left: `${rect.x}px`,
        width: `${rect.width}px`,
        height: `${rect.height}px`,
        backgroundColor: rect.isActive ? '#ADFF2F' : getRectColor1(rect.state) }">
     <div  class="centered-text">
    <div style="font-size: 15px;font-weight: bold;">{{ rect.glassId }}</div>
    <div style="font-size: 15px;font-weight: bold;">{{ rect.flowCardId }}</div>
    <div style="font-size: 30px;font-weight: bold;">{{ rect.widtha }}*{{ rect.heighta }}</div>
  </div>
  </div>
   </div>
   </el-scrollbar>
   </div>
  <!-- </div> -->
  <!-- 进炉中左 -->
<!-- <div style="width: 750px;float: left;background-color: #f4f4f5;height: 350px;"> -->
    <!-- <div v-if="adjustedRects2.length > 0"> -->
      <div v-else-if="currentPage === 2 && adjustedRects2.length > 0">
    <div style="text-align: center;"> {{ $t('processCard.temperinglayout') }}:{{ adjustedRects2[0].engineerId }}-{{ adjustedRects2[0].temperingLayoutId }} </div>
    <el-scrollbar height="750px" style="background-color: #e9e9eb;">
    <div  style="position: relative;max-width: 1400px;">
      <div
      v-for="(rect, index) in adjustedRects2"
      :key="index"
      @click="showDialog2(rect)"
      class="rect"
      :style="{ position: 'absolute',
       top: `${rect.y}px`,
       left: `${rect.x}px`,
       width: `${rect.width}px`,
       height: `${rect.height}px`,
        backgroundColor: rect.isActive ? '#ADFF2F' : getRectColor2(rect.state) }">
     <div  class="centered-text">
    <div style="font-size: 15px;font-weight: bold;">{{ rect.glassId }}</div>
    <div style="font-size: 15px;font-weight: bold;">{{ rect.flowCardId }}</div>
    <div style="font-size: 30px;font-weight: bold;">{{ rect.widtha }}*{{ rect.heighta }}</div>
  </div>
  </div>
   </div>
   </el-scrollbar>
   </div>
<!-- </div> -->
   </el-card>
   <div style="display: flex;margin-left: 40%;margin-bottom: 10px;">
    <el-pagination
        size="small"
        background
        layout="prev, pager, next"
        :total="20"
        @current-change="handlePageChange"
      />
  </div>
    </div>
<div v-if="dialogFormVisiblea">
  <!-- 进炉前 -->
  <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 800px;">
    <div v-if="adjustedRectsa.length > 0">
    <div style="text-align: center;"> {{ $t('processCard.temperinglayout') }}:{{ adjustedRectsa[0].engineerId }}-{{ adjustedRectsa[0].temperingLayoutId }} </div>
    <!-- <div style="text-align: center;">炉号:{{ engineerIdDisplaya }}-{{ adjustedRects[0].temperingLayoutId }}</div>   -->
      <el-scrollbar height="750px" style="background-color: #e9e9eb;">
    <div  style="position: relative;max-width: 1400px;">
      <div
      v-for="(rect, index) in adjustedRectsa"
      :key="index"
      @click="showDialoga(rect)"
      class="rect"
      :style="{ position: 'absolute',  top: `${rect.y}px`, left: `${rect.x}px`,
       width: `${rect.width}px`, height: `${rect.height}px`,
      backgroundColor: rect.isActive ? '#ADFF2F' : getRectColora(rect.state) }">
    <div  class="centered-text">
    <div style="font-size: 15px;font-weight: bold;">{{ rect.glassId }}</div>
    <div style="font-size: 15px;font-weight: bold;">{{ rect.flowCardId }}</div>
    <div style="font-size: 30px;font-weight: bold;">{{ rect.widtha }}*{{ rect.heighta }}</div>
  </div>
  </div>
   </div>
   </el-scrollbar>
   </div>
   </el-card>
</div>
<div v-if="dialogFormVisibleb">
  <!-- 已出炉 -->
  <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 800px;">
      <div v-if="adjustedRectsb.length > 0">
    <div style="text-align: center;"> {{ $t('processCard.temperinglayout') }}:{{ adjustedRectsb[0].engineerId }}-{{ adjustedRectsb[0].temperingLayoutId }} </div>
    <!-- <div style="text-align: center;">炉号:{{ engineerIdDisplayb }}-{{ adjustedRects[0].temperingLayoutId }}</div>   -->
      <el-scrollbar height="750px" style="background-color: #e9e9eb;">
    <div  style="position: relative;max-width: 1400px;">
      <div
      v-for="(rect, index) in adjustedRectsb"
      :key="index"
      @click="showDialogb(rect)"
      class="rect"
      :style="{ position: 'absolute',  top: `${rect.y}px`, left: `${rect.x}px`,
       width: `${rect.width}px`, height: `${rect.height}px`,
      backgroundColor: rect.isActive ? '#ADFF2F' : getRectColorb(rect.state) }">
       <!-- backgroundColor: rect.state === 4 ? '#911005' : '#f8e3c5' }"> -->
     <div  class="centered-text">
    <div style="font-size: 15px;font-weight: bold;">{{ rect.glassId }}</div>
    <div style="font-size: 15px;font-weight: bold;">{{ rect.flowCardId }}</div>
    <div style="font-size: 30px;font-weight: bold;">{{ rect.widtha }}*{{ rect.heighta }}</div>
  </div>
  </div>
   </div>
   </el-scrollbar>
   </div>
   </el-card>
</div>
<!-- 进炉中 -->
<el-dialog v-model="blind1" top="30vh" width="15%" style="text-align: center;" @close="handleDialogClose1">
        <el-button :disabled="!canSelectProject1" type="warning" plain @click="handleDamage1"  style="width: 150px;margin-left: 10px;">
          {{ $t('order.dilapidation') }}
        </el-button>
        <el-button :disabled="!cantakea" type="danger" plain @click="takeoutc"  style="width: 150px;margin-left: 10px;margin-top: 10px;">
          <el-icon class="el-icon--right"><Upload /></el-icon>
          {{ $t('order.takeaway') }}
        </el-button>
  </el-dialog>
<el-dialog v-model="blind2" top="30vh" width="15%" style="text-align: center;" @close="handleDialogClose2">
        <el-button :disabled="!canSelectProject2" type="warning" plain @click="handleDamage2"  style="width: 150px;margin-left: 10px;">
          {{ $t('order.dilapidation') }}
        </el-button>
        <el-button :disabled="!cantakea" type="danger" plain @click="takeoutd"  style="width: 150px;margin-left: 10px;margin-top: 10px;">
          <el-icon class="el-icon--right"><Upload /></el-icon>
          {{ $t('order.takeaway') }}
        </el-button>
  </el-dialog>
  <!-- 进炉前 -->
<el-dialog v-model="blinda" top="30vh" width="15%" style="text-align: center;" @close="handleDialogClosea">
  <el-button type="warning" plain @click="handleDamagea" :disabled="!canSelectProjecta" style="width: 150px;margin-left: 10px;">
          {{ $t('order.dilapidation') }}
        </el-button>
        <el-button :disabled="!cantakea" type="danger" plain @click="takeouta"  style="width: 150px;margin-left: 10px;margin-top: 10px;">
          <el-icon class="el-icon--right"><Upload /></el-icon>
          {{ $t('order.takeaway') }}
        </el-button>
        <el-button type="success" plain @click="takeona" :disabled="!canona" style="width: 150px;margin-left: 10px;margin-top: 10px;">
          {{ $t('order.takeon') }}
        </el-button>
  </el-dialog>
  <!-- 已出炉 -->
<el-dialog v-model="blindb" top="30vh" width="15%" style="text-align: center;" @close="handleDialogCloseb">
        <el-button :disabled="!canSelectProjectb" type="warning" plain  @click="handleDamageb"  style="width: 150px;margin-left: 10px;">
          {{ $t('order.dilapidation') }}
        </el-button>
        <el-button :disabled="!cantakeb" type="danger" plain @click="takeoutb"  style="width: 150px;margin-left: 10px;margin-top: 10px;">
          <el-icon class="el-icon--right"><Upload /></el-icon>
          {{ $t('order.takeaway') }}
        </el-button>
        <!-- <el-button type="success" plain  @click="takeonb" :disabled="!canonb" style="width: 150px;margin-left: 10px;margin-top: 10px;">
          {{ $t('order.takeon') }}
        </el-button> -->
  </el-dialog>
  <el-dialog
      v-model="dialogVisible"
      width="100%"
      top="0vh"
      :show-close="false"
      >
      <div class="custom-title" style="text-align: center; margin-bottom: 20px;">
      {{ $t('processCard.glasstakeout') }}
    </div>
      <el-table
        :data="tableData"
        style="width: 100%;height: 760px"
      >
        <el-table-column prop="flowCardId" :label="$t('processCard.flowcard')" width="140" align="center"/>
        <el-table-column prop="layer" :label="$t('processCard.layer')" align="center" width="52"/>
        <el-table-column prop="engineerId" :label="$t('processCard.project')" align="center" width="110"/>
        <el-table-column prop="temperingLayoutId" :label="$t('processCard.temperinglayout')" align="center" width="52"/>
        <el-table-column prop="temperingFeedSequence" :label="$t('processCard.temperingfeed')" align="center" width="52"/>
        <el-table-column prop="width" :label="$t('processCard.width')" align="center" width="80"/>
        <el-table-column prop="height" :label="$t('processCard.height')" align="center" width="80"/>
        <el-table-column prop="thickness" :label="$t('processCard.thickness')" align="center" width="52"/>
      </el-table>
  </el-dialog>
    </div>
  </div>
</template>
<style scoped>
#boxa{
  border: 1px solid rgb(119, 116, 116);
  background-color:  #529b2e;
  text-align: center;
  display: inline-block;
    /* align-items:center; */
    /* justify-content:center; */
  margin-left: 20px;
}
#boxb{
  border: 1px solid rgb(119, 116, 116);
  background-color:  #a0cfff;
  /* display:flex; */
  text-align: center;
  display: inline-block;
  align-items:center;
  justify-content:center;
  margin-left: 20px;
}
#box{
  border: 1px solid black;
  background-color:  #337ecc;
  display:flex;
  align-items:center;
  justify-content:center;
}
#home-card {
  width: 100%;
  overflow: hidden;
  padding: 10px 0px;
  display: flex;
  flex-wrap: wrap;
  #home-item {
    border-style: solid;
    border-width: 1px;
    border-color: #E4E4E4;
    width: calc(34% - 20px);
    padding: 20px 0px 20px 20px;
    margin-right: 10px;
    margin-bottom: 10px;
    display: flex;
    justify-content: center;
    /* align-items: center; */
    background: #fff;
    #home-img {
      display: inline-block;
      width: 160px;
      height: 60px;
      margin: 0;
      padding: 0;
    }
      #home-right {
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: flex-start;
        margin-left: 10px;
        #home-num {
          font-size: 40px;
          margin: 5px 0;
        }
      }
    }
  }
  .rect {
  border: 1px solid black; /* 设置矩形的边框 */
  /* background-color: lightblue; 设置矩形的背景色   */
}
#rect {
  position: relative; /* 确保箭头可以相对于矩形定位 */
}
.centered-text {
  /* 设置文字居中样式 */
  /* display: flex; */
  justify-content: center;
  align-items: center;
  height: 100%; /* 确保div占据整个矩形的高度 */
  /* font-size: small; */
}
.custom-title {
  font-size: 20px;
  font-weight: bold;
}
</style>
UI-Project/src/views/PurchaseReturn/purchaseStorage.vue
New file
@@ -0,0 +1,306 @@
<template>
  <div style="height: 500px;">
    <div style="display: flex;">
      <el-input v-model="engineerId" style="margin-left: 15px;margin-top: 10px;width: 240px" :placeholder="$t('order.projectnumber')"/>
          <el-button type="primary" style="margin-left: 10px;margin-top: 10px;" @click="sethistorical()">{{$t('reportmanage.inquire')}}</el-button>
       <el-pagination
          v-model:current-page="currentPage"
          :page-size="pageSize"
          :size="size"
          :disabled="disabled"
          layout="prev, pager, next, jumper"
          :total="totalPages"
          @current-change="handleCurrentChange"
          style="margin-top: 10px;"
      />
      </div>
    <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 800px;">
      <el-scrollbar height="750px" width="1400px" style="background-color: #e9e9eb;">
  <div style="position: relative;">
    <div
      v-for="(rect, index) in adjustedRects"
      :key="rect.glassId"
      class="rect"
      @click="showDialog(rect.glassId)"
      :style="{ position: 'absolute',
      top: `${rect.y}px`, left: `${rect.x}px`, width: `${rect.width}px`, height: `${rect.height}px`,
      backgroundColor: rect.isActive ? '#ADFF2F' : getRectColor(rect.state)
       }"
    >
     <div  class="centered-text">
    <div style="font-size: 20px;font-weight: bold;">{{ rect.glassId }}</div>
    <div style="font-size: 20px;font-weight: bold;">{{ rect.flowCardId }}</div>
    <div style="font-size: 30px;font-weight: bold;">{{ rect.widtha }}*{{ rect.heighta }}</div>
  </div>
  </div>
   </div>
      </el-scrollbar>
      <el-dialog v-model="blind" top="30vh" width="15%" style="text-align: center;" @close="handleDialogClose">
        <el-button :disabled="currentGlassRect?.state === 8 || currentGlassRect?.state === 9" type="warning"
                   plain @click="handleDamage(currentGlassId)" style="width: 140px;margin-left: 10px;">
          {{ $t('order.dilapidation') }}
        </el-button>
        <el-button :disabled="currentGlassRect?.state === 9 || currentGlassRect?.state === 8" type="danger"
                   plain @click="handleManualTake(currentGlassId)" style="width: 140px;margin-top: 10px;">
          <el-icon class="el-icon--right">
            <Upload/>
          </el-icon>
          {{ $t('order.takeaway') }}
        </el-button>
      </el-dialog>
    </el-card>
  </div>
</template>
<script setup lang="ts">
import {ElMessage} from 'element-plus'
import {computed, onMounted, onUnmounted, ref} from 'vue';
import request from "@/utils/request"
import {host, WebSocketHost} from '@/utils/constants'
import {useI18n} from 'vue-i18n'
const {t} = useI18n()
let language = ref(localStorage.getItem('lang') || 'zh')
const blind = ref(false)
const engineerId = ref();
const currentGlassId = ref(null);
const temperingLayoutId = ref(null);
const adjustedRects = ref([]);
const raw = ref([]);
let webSocket: WebSocket | null = null;
const totalPages = ref(0);
const pageSize = ref(1);
const currentPage = ref('');
const disabled = false;
const size = 'small';
const rawData = ref([]);
// 显示对话框并设置当前 glassId
const currentGlassRect = computed(() => {
  return adjustedRects.value.find(rect => rect.glassId === currentGlassId.value);
});
  function showDialog(glassId: number) {
  currentGlassId.value = glassId;
  blind.value = true;
  adjustedRects.value = adjustedRects.value.map(rect =>
  rect.glassId === glassId ? { ...rect, isActive: true } : rect
  );
}
const handleDialogClose = () => {
  adjustedRects.value = adjustedRects.value.map(rect => ({
    ...rect,
    isActive: false
  }));
}
// 破损
const handleDamage = async () => {
  try  {
  const response = await request.post('/temperingGlass/temperingGlassInfo/updateTemperingState', {
      glassId: currentGlassId.value,
      line: 4001,
      state: 8,
      workingProcedure: '钢化',
      temperingLayoutId: currentPage.value,
      engineerId: engineerId.value,
    })
    if (response.code == 200) {
      ElMessage.success(response.message);
      blind.value = false;
      updateRectstate(currentGlassId.value, 8);
    } else {
      ElMessage.error(response.msg);
    }
}
catch (error) {
    // 处理错误
    console.error(error);
  }
}
 // 人工拿走
const handleManualTake = async () => {
  try  {
  const response = await request.post('/temperingGlass/temperingGlassInfo/updateTemperingState', {
      glassId: currentGlassId.value,
      line: 4001,
      state: 9,
      workingProcedure: '钢化',
      temperingLayoutId: currentPage.value,
      engineerId: engineerId.value,
    })
    if (response.code == 200) {
      ElMessage.success(response.message);
      blind.value = false;
      updateRectstate(currentGlassId.value, 9);
  } else {
      ElMessage.error(response.msg);
    }
}
catch (error) {
    console.error(error);
  }
}
const sethistorical = async () => {
  search()
  fetchTableData()
}
const fetchTableData = async () => {
  try {
    const response = await request.post("/temperingGlass/temperingGlassInfo/selectTempering", {
      engineerId: engineerId.value,
    })
    if (response.code === 200) {
    totalPages.value = response.data.id;
}
  } catch (error) {
  }
};
const search = async () => {
    const response = await request.post('/temperingGlass/temperingGlassInfo/selectTemperingGlass', {
      engineerId: engineerId.value,
      temperingLayoutId: 1
    })
    if (response.code === 200) {
      const scaleFactor =  1621.78/6000;
      const scaleFactory =  750/2800;
    const adjustedRectsData = response.data.map(rect => {
      const scaleFactor =  1621.78/6000;
      const scaleFactorY =  750/2800;
      let adjustedWidth, adjustedHeight,widtha,heighta;;
  let newX = rect.ycoordinate;
      if (rect.width < rect.height) {
        widtha = rect.height;
        heighta = rect.width;
      }else {
        widtha = rect.width;
        heighta = rect.height;
      }
  if (rect.angle === 0) {
    adjustedWidth = widtha * scaleFactor;
    adjustedHeight = heighta * scaleFactorY;
    newX = 6000 - (rect.ycoordinate + widtha);
    } else {
    adjustedWidth = heighta * scaleFactor;
    adjustedHeight = widtha * scaleFactorY;
    newX = 6000 - (rect.ycoordinate + heighta);
  }
  return {
    ...rect,
    x: newX * scaleFactor,
    y: rect.xcoordinate* scaleFactorY,
    width: adjustedWidth,
    height: adjustedHeight,
    widtha: rect.width,
    heighta: rect.height,
  }
    });
    adjustedRects.value = adjustedRectsData;
       currentPage.value = 1;
    }
};
const handleCurrentChange = async(val: number) => {
  currentPage.value = val;
    const response = await request.post('/temperingGlass/temperingGlassInfo/selectTemperingGlass', {
      engineerId: engineerId.value,
      temperingLayoutId: currentPage.value
    })
    if (response.code === 200) {
      const scaleFactor =  1621.78/6000;
      const scaleFactory =  750/2800;
    const adjustedRectsData = response.data.map(rect => {
      const scaleFactor =  1621.78/6000;
      const scaleFactorY =  750/2800;
      let adjustedWidth, adjustedHeight,widtha,heighta;;
  let newX = rect.ycoordinate;
      if (rect.width < rect.height) {
        widtha = rect.height;
        heighta = rect.width;
      }else {
        widtha = rect.width;
        heighta = rect.height;
      }
  if (rect.angle === 0) {
    adjustedWidth = widtha * scaleFactor;
    adjustedHeight = heighta * scaleFactorY;
    newX = 6000 - (rect.ycoordinate + widtha);
    } else {
    adjustedWidth = heighta * scaleFactor;
    adjustedHeight = widtha * scaleFactorY;
    newX = 6000 - (rect.ycoordinate + heighta);
  }
  return {
    ...rect,
    x: newX * scaleFactor,
    y: rect.xcoordinate* scaleFactorY,
    width: adjustedWidth,
    height: adjustedHeight,
    widtha: rect.width,
    heighta: rect.height,
  }
    });
    adjustedRects.value = adjustedRectsData;
    }
};
function getRectColor(state: number): string {
  switch (state) {
    // case -1:
    //   return '#CDAF95';
    // case 0:
    //   return '#7AC5CD';
    // case 1:
    //   return '#95d475';
    // case 2:
    //   return 'lightblue';
    // case 3:
    //   return '#eebe77';
    case 4:
      return '#CD6090';
    case 8:
      return '#911005';
    case 9:
      return '#4682B4';
    default:
      return '#CDAF95';
  }
}
// 更新矩形状态
function updateRectstate(glassId: string, state: number) {
  adjustedRects.value.forEach(rect => {
    if (rect.glassId === glassId) {
      rect.state = state; // 更新矩形的状态
    }
  });
}
</script>
<style scoped>
.rect {
  border: 1px solid black; /* 设置矩形的边框 */
}
.centered-text {
  justify-content: center;
  align-items: center;
  height: 100%;
  /* font-size: large; */
}
#rect {
  position: relative; /* 确保箭头可以相对于矩形定位 */
}
#arrow {
  position: absolute;
  top: 70%; /* 箭头位于矩形中间 */
  left: 200px; /* 箭头在矩形左侧一些距离 */
  transform: translateY(-50%); /* 垂直居中 */
  width: 0;
  height: 0;
  border-top: 10px solid transparent; /* 上边框 */
  border-bottom: 10px solid transparent; /* 下边框 */
  border-right: 20px solid #911005; /* 右边框,形成箭头 */
}
#line {
  position: absolute;
  top: 70%; /* 直线位于矩形中间 */
  left: 210px; /* 直线在箭头右侧一些距离 */
  transform: translateY(-50%); /* 垂直居中 */
  height: 2px; /* 直线的高度 */
  width: 240px; /* 直线的长度,根据需要调整 */
  background-color: #911005; /* 直线的颜色 */
}
</style>
UI-Project/src/views/RegisterView.vue
New file
@@ -0,0 +1,219 @@
<script setup lang="ts">
  import {useRouter,useRoute} from 'vue-router'
  import { reactive, ref } from 'vue'
  import type { FormProps,FormInstance, FormRules } from 'element-plus'
  import {ElMessage,ElMessageBox} from "element-plus";
  import request from "@/utils/request";
  import { Lock,Avatar } from '@element-plus/icons-vue'
  // import {Avatar, UserFilled} from "@element-plus/icons-vue";
  import { useI18n } from 'vue-i18n'
  const { t } = useI18n()
  let language = ref(localStorage.getItem('lang') || 'zh')
  const router = useRouter()
  const route = useRoute()
  let loginLoadings= ref(false)
  const labelPosition = ref<FormProps['labelPosition']>('right')
  //注册用户参数
  const register = reactive({
    userName: '',
    // loginName: '',
    passWord: '',
    confirmPassword:''
  })
  /*方法*/
  const checkName = (rule: any, value: any, callback: any) => {
    if (value.trim() === '') {
      callback(new Error(t('login.namea')))
    }else if(value.length>16){
      callback(new Error(t('login.len')))
    }else{
      callback()
    }
  }
  const checkPassword = (rule: any, value: any, callback: any) => {
    if (value.trim() === '') {
      callback(new Error(t('login.passnull')))
    }else if(value.length>16 || value.length<6){
      callback(new Error(t('login.leng')))
    }else{
      callback()
    }
  }
  const checkConfirmPassword = (rule: any, value: any, callback: any) => {
    if (value.trim() === '') {
      callback(new Error(t('login.spwn')))
    }else if(value !== register.passWord){
      callback(new Error(t('login.depass')))
    }else if(value.length>16 || value.length<6){
      callback(new Error(t('login.leng')))
    }else{
      callback()
    }
  }
  const ruleFormRef  = ref<FormInstance>()
  const rules = reactive<FormRules<typeof register>>({
    userName: [{ validator: checkName, trigger: 'blur' }],
    passWord:[{ validator: checkPassword, trigger: 'blur' }],
    confirmPassword:[{ validator: checkConfirmPassword, trigger: 'blur' }],
    // loginName: [{ validator: validateString, trigger: 'blur' }]
  })
  const submitForm = (formEl: FormInstance | undefined) => {
    if (!formEl) return
    formEl.validate((valid) => {
      if (valid) {
        loginLoadings.value=true
        request.post('/user/register',
            register).then((res) => {
          if(res['code']==200){
            ElMessageBox.alert(
                `<strong>用户:<i style="color: #1890FF;">'${res.data.userName}</i>'
                 <br>账号ID:<i style="color: #1890FF;">${res.data.loginName}</i> </strong>`,
                '注册提示:',
                {
                  dangerouslyUseHTMLString: true,
                  confirmButtonText: '登陆',
                  center: true,
                }
            ).then(()=>{
              router.push({
                path:'/login',
                query: {
                  id: res.data.loginName
                }
              })
            })
            ElMessage.success(t('register.registerSuccessful'))
            loginLoadings.value=false
          } else {
            ElMessage.error(res['msg'])
            return false
          }
        }).catch(error => {
          ElMessage.error(t('main.connectErr'))
          loginLoadings.value=false
          return false
        })
      }
    })
  }
  const toLogin = () => {
              router.push({
                path:'/login',
              })
  }
</script>
<template>
  <div class="mainDiv" >
    <div id="main-login">
     <div>
      <div style="position: absolute; left: 8vw; top: 6vw; ">
        <img src="../../src/assets/3.png">
      </div>
       <div style="position: absolute; left: 15vw; top: 22vw; font-size: 55px;color: rgba(29, 33, 41, 1);">
        {{ $t('northglassMESsystem') }}
      </div>
    </div>
    <div id="div-login">
        <el-form
            @submit.native.prevent
            ref="ruleFormRef"
            :model="register"
            status-icon
            :rules="rules"
            label-width="75px"
        >
          <div id="title">{{ $t('register.newuserregister') }}</div>
        <div id="center">
            <!-- <div style="color: rgba(78, 89, 105, 1);margin-bottom: 10px;">姓名</div> -->
          <el-form-item prop="userName" :label="$t('register.name')">
            <el-input
            style="width: 200px;"
                v-model="register.userName"
                type="text"
                autocomplete="off"
                :prefix-icon="Avatar"
                :placeholder="$t('register.inputname')"
            />
          </el-form-item>
            <!-- <div style="color: rgba(78, 89, 105, 1);margin-bottom: 10px;">密码</div> -->
          <el-form-item prop="passWord" :label="$t('register.password')">
            <el-input
            style="width: 200px;"
                v-model="register.passWord"
                type="password"
                autocomplete="off"
                :prefix-icon="Lock"
                :placeholder="$t('register.pwErr')"
                show-password
            />
          </el-form-item>
            <!-- <div style="color: rgba(78, 89, 105, 1);margin-bottom: 10px;">确认密码</div> -->
          <el-form-item prop="confirmPassword" :label="$t('register.passwordation')">
            <el-input
            style="width: 200px;"
                v-model="register.confirmPassword"
                type="password"
                :prefix-icon="Lock"
                autocomplete="off"
                show-password
                :placeholder="$t('register.pwErration')"
            />
          </el-form-item>
          <el-form-item id="submitForm">
            <el-button
            :loading="loginLoadings"
                type="primary"
                @click="submitForm(ruleFormRef)"
                plain
            >{{ $t('register.registration') }}
            </el-button>
            <el-button
                type="primary"
                @click="toLogin"
                plain
            >{{ $t('register.false') }}
            </el-button>
          </el-form-item>
        </div>
        </el-form>
      </div>
</div>
</div>
</template>
<style scoped>
#div-login{
  margin-top: 5%;
  /* margin-top: 20%; */
  /* margin-left: 650px; */
  background-color: #fff;
  border-radius: 4px;
  float: right;
  width: 40%;
  height: 60%;
  min-width: 318px;
  box-shadow: 0 8px 16px 0 rgba(0,0,0,0), 0 6px 5px 0 rgba(0,0,0,0.19);
}
#center{
  margin-top: 45px;
  margin-left: 100px;
}
.mainDiv{
  overflow: hidden;
  min-width: 718px;
  background-image: url("../../src/assets/background.jpg");
}
#main-login{
  margin: 150px auto 0 auto;
  height: 70vh;
  width: 80vw;
}
#submitForm{
  margin-top: 30px;
  margin-left: -10px;
}
#title{
  font-size: 25px;
  text-align: center;
  margin-top: 10px;
}
</style>
UI-Project/src/views/ReportWork/reportWork.vue
New file
@@ -0,0 +1,353 @@
<template>
  <div style="height: 600px;">
    <div style="display: flex; flex-direction: row; align-items: center; margin-top: 20px;">
      <span style="margin-left: 10px;" class="demonstration">{{ $t('reportmanage.productiontime') }}</span>
        <el-date-picker v-model="timeRange" type="datetimerange" range-separator="至" :start-placeholder="$t('reportmanage.starttime')"
             style="margin-left: 15px;" value-format = "YYYY-MM-DD hh:mm:ss"
              :end-placeholder="$t('reportmanage.endtime')">
            </el-date-picker>
      <el-select v-model="report.type" :placeholder="$t('reportmanage.ctype')" style="margin-left: 10px;">
        <el-option :label="$t('reportmanage.broke')" value="8"></el-option>
        <el-option :label="$t('reportmanage.takeout')" value="9"></el-option>
      </el-select>
      <el-select v-model="report.status" :placeholder="$t('reportmanage.cstate')" style="margin-left: 10px;">
        <!-- <el-option :label="$t('reportmanage.all')" value="0"></el-option> -->
        <el-option :label="$t('reportmanage.dreportwork')" value="1"></el-option>
        <el-option :label="$t('reportmanage.pendingwork')" value="7"></el-option>
        <el-option :label="$t('reportmanage.reportwork')" value="3"></el-option>
        <el-option :label="$t('reportmanage.reportworked')" value="8"></el-option>
      </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="切割"></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;" :disabled="(!selectedStatus)" @click="handleConfirm">{{
        $t('reportmanage.signingwork')
        }}</el-button>
    </div>
    <el-card style="flex: 1;margin-left: 10px;margin-top: 20px;" >
      <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
        <el-table height="740" ref="table" :data="reportData"
          :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
          <el-table-column prop="teamsGroupsName" align="center" :label="$t('reportmanage.reporteam')"
            min-width="135" />
          <el-table-column prop="deviceName" align="center" :label="$t('reportmanage.reportingequipment')"
            min-width="156" />
          <el-table-column prop="line" align="center" :label="$t('reportmanage.line')" min-width="120" />
          <el-table-column prop="workingProcedure" align="center" :label="$t('reportmanage.process')" min-width="120" />
          <el-table-column prop="glassId" align="center" :label="$t('reportmanage.glassID')" min-width="130" />
          <el-table-column prop="engineerId" align="center" :label="$t('reportmanage.projectnumber')" min-width="120" />
          <el-table-column prop="temperingLayoutId" align="center" :label="$t('reportmanage.layoutID')"
            min-width="120" />
          <el-table-column prop="formattedCreateTime" align="center" :label="$t('reportmanage.productiontime')"
            min-width="230" />
          <el-table-column
            align="center"
            :label="$t('reportmanage.type')"
            min-width="120"
            prop="type"
          >
          <template #default="scope">
        <el-tag :type="gettypeType(scope.row.type)">
          {{ gettypeText(scope.row.type) }}
        </el-tag>
      </template>
          </el-table-column>
          <el-table-column
            align="center"
            :label="$t('reportmanage.state')"
            min-width="120"
            prop="status"
          >
          <template #default="scope">
        <el-tag :type="getStatusType(scope.row.status)">
          {{ getStatusText(scope.row.status) }}
        </el-tag>
      </template>
          </el-table-column>
          <el-table-column prop="processId" align="center" :label="$t('reportmanage.processcards')" min-width="140" />
          <el-table-column prop="orderNumber" align="center" :label="$t('reportmanage.number')" min-width="120" />
          <el-table-column prop="technologyNumber" align="center" :label="$t('reportmanage.layer')" min-width="120" />
          <el-table-column prop="breakageType" align="center" :label="$t('reportmanage.typebreakage')" min-width="180">
            <template #default="{ row }">
              <el-select v-model="row.breakageType" filterable :placeholder="$t('reportmanage.pcausebreakage')" :disabled="selectedType"
                clearable @input="handleInputChangea($event, row.id)">
                <el-option v-for="item in selectOptionsa" :key="item.basicName" :label="item.basicName"
                  :value="item.basicName" />
              </el-select>
            </template>
          </el-table-column>
          <el-table-column prop="breakageReason" align="center" :label="$t('reportmanage.causebreakage')"
            min-width="180">
            <template #default="{ row }">
              <el-select v-model="row.breakageReason" filterable :placeholder="$t('reportmanage.ptypebreakage')" :disabled="selectedType"
                clearable @input="handleInputChangea($event, row.id)">
                <el-option v-for="item in selectOptionsb" :key="item.basicName" :label="item.basicName"
                  :value="item.basicName" />
              </el-select>
            </template>
          </el-table-column>
          <el-table-column align="center" :label="$t('reportmanage.responsibleprocess')" min-width="120">
            <template #default="{ row }">
              <el-select v-model="row.responsibleProcess" filterable :placeholder="$t('reportmanage.ptypebreakage')" :disabled="selectedType"
                clearable @input="handleInputChangea($event, row.id)">
               <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>
            </template>
          </el-table-column>
          <el-table-column prop="responsiblePersonnel" align="center" :label="$t('reportmanage.responsiblepersonnel')"
            min-width="180">
            <template #default="{ row }">
              <el-input :placeholder="$t('reportmanage.presponsiblepersonnel')" v-model="row.responsiblePersonnel" :disabled="selectedType"
                autocomplete="off" />
            </template>
          </el-table-column>
          <el-table-column prop="responsibleTeam" align="center" :label="$t('reportmanage.responsibleteam')"
            min-width="180">
            <template #default="{ row }">
              <el-select v-model="row.responsibleTeam" filterable :placeholder="$t('reportmanage.presponsibleteam')" :disabled="selectedType"
                clearable @input="handleInputChangea($event, row.id)">
                <el-option v-for="item in selectOptionsc" :key="item.basicName" :label="item.basicName"
                  :value="item.basicName" />
              </el-select>
            </template>
          </el-table-column>
          <el-table-column prop="responsibleEquipment" align="center" :label="$t('reportmanage.responsibleequipment')" :disabled="selectedType"
            min-width="180">
            <template #default="{ row }">
              <el-select v-model="row.responsibleEquipment" filterable
                :placeholder="$t('reportmanage.presponsibleequipment')" clearable  :disabled="selectedType"
                @input="handleInputChangea($event, row.id)">
                <el-option v-for="item in selectOptionsd" :key="item.basicName" :label="item.basicName"
                  :value="item.basicName" />
              </el-select>
            </template>
          </el-table-column>
          <el-table-column prop="remark" align="center" :label="$t('reportmanage.remark')" min-width="180">
            <template #default="{ row }">
              <el-input :placeholder="$t('reportmanage.premark')" v-model="row.remark" autocomplete="off" :disabled="selectedType" />
            </template>
          </el-table-column>
        </el-table>
      </div>
    </el-card>
  </div>
</template>
<script lang="ts" setup>
import { Delete, Upload } from '@element-plus/icons-vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { ref, onMounted, onBeforeUnmount, reactive, computed, shallowRef, onUnmounted, watchEffect } from "vue";
import request from "@/utils/request"
import { WebSocketHost, host } from '@/utils/constants'
import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService';
import { useI18n } from 'vue-i18n'
import { inject } from 'vue';
const globalDate = inject('globalDate');
const timeRange = ref([])
const { t } = useI18n()
const report = ref({
  type: '8',
  status: '1',
  workingProcedure: '0',
});
const reportData = ref([])
function formatTimestamp(timestamp) {
  const date = new Date(timestamp);
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始,需要加1,并补零
  const day = String(date.getDate()).padStart(2, '0'); // 补零
  const hours = String(date.getHours()).padStart(2, '0'); // 补零(如果需要显示时间)
  const minutes = String(date.getMinutes()).padStart(2, '0'); // 补零(如果需要显示时间)
  const seconds = String(date.getSeconds()).padStart(2, '0'); // 补零(如果需要显示时间)
  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
// 格式化后端时间并计算一周前的时间
const defaultTime = ref<[Date, Date]>([new Date(), new Date()]);
function parseAndSetTime() {
  const backendTime = new Date(globalDate);
  const oneWeekAgo = new Date(backendTime.getTime() - 7 * 24 * 60 * 60 * 1000); // 减去7天
  oneWeekAgo.setHours(0, 0, 0, 0);
  timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)];
  window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
}
// const timeRange = ref([formatTimestamp(startDate), formatTimestamp(globalDate)]);
const selectOptionsa = ref([]);
const selectOptionsb = ref([]);
const selectOptionsc = ref([]);
const selectOptionsd = ref([]);
const selectValuesa = reactive({});
const selectValuesb = reactive({});
const selectValuesc = reactive({});
const selectValuesd = reactive({});
const selectValuese = reactive({});
const inputValuesa = reactive({});
const inputValuesb = reactive({});
const selectedType = ref(true);
const selectedStatus = ref(false);
// 查询数据
const selectReportData = async () => {
  const response = await request.post("/cacheVerticalGlass/damage/selectDamage", {
    startTime: (timeRange.value && timeRange.value[0]) || '',
    endTime: (timeRange.value && timeRange.value[1]) || '',
    type: report.value.type,
    status: report.value.status,
    workingProcedure: report.value.workingProcedure
  })
  if (report.value.type == 8) {
    selectedType.value = false;
  }else{
    selectedType.value = true;
  }
  if ((report.value.status == 1||report.value.status == 7)&&(report.value.type == 8||report.value.type == 1)) {
    selectedStatus.value = true;
  }else{
    selectedStatus.value = false;
  }
  if (response.code === 200) {
    const formattedData = response.data.map(record => ({
        ...record,
        formattedCreateTime: formatTimestamp(record.damageTime),
      }));
    reportData.value = formattedData;
    ElMessage.success(response.message);
  } else {
    ElMessage.error(response.message);
  }
  // const responses = await request.post("/cacheVerticalGlass/damage/insertDamage", {
  //   glassId:"P24081502|1|1",
  //   line:"1001",
  //   workingProcedure:"切割",
  //   remark:"",
  //   status:"0"
  // })
};
// 报工
const handleConfirm = async () => {
  const hasEmptyOrNullBreakType = reportData.value.some(
    item => item.breakageType === null || item.breakageType === ''
      || item.breakageReason === null || item.breakageReason === ''
      || item.responsibleProcess === null || item.responsibleProcess === ''
      || item.responsibleTeam === null || item.responsibleTeam === ''
      || item.responsibleEquipment === null || item.responsibleEquipment === ''
  );
  if (hasEmptyOrNullBreakType&&selectedType.value==false) {
    // 如果找到了未选择项,显示错误信息
    ElMessage.error('请填写所有玻璃的破损信息');
  } else {
    const response = await request.post("/cacheVerticalGlass/damage/submitDamage", reportData.value)
    if (response.code === 200) {
      ElMessage.success(response.message);
    } else {
      ElMessage.error(response.message);
    }
  }
  selectReportData();
};
const fetchTableData = async () => {
  try {
    const response = await request.post('/cacheVerticalGlass/basic_data_produce/selectBasicDataProduceGroup');
    if (response.code == 200) {
      selectOptionsa.value = response.data.breakagetype.filter(item => item !== null)
        .map(item => ({ basicName: item.basicName }));
      selectOptionsb.value = response.data.breakagereason.filter(item => item !== null)
        .map(item => ({ basicName: item.basicName }));
      selectOptionsc.value = response.data.teamsgroups.filter(item => item !== null)
        .map(item => ({ basicName: item.basicName }));
      selectOptionsd.value = response.data.device.filter(item => item !== null)
        .map(item => ({ basicName: item.basicName }));
    } else {
      ElMessage.warning(response.data);
    }
  } catch (error) {
    console.error('Error fetching options:', error);
  }
};
const handleInputChangea = (value, rowId) => {
  // 更新对应行的 select 值
  selectValuesa[rowId] = value;
  selectValuesb[rowId] = value;
  selectValuesc[rowId] = value;
  selectValuesd[rowId] = value;
  selectValuese[rowId] = value;
  inputValuesa[rowId] = value;
  inputValuesb[rowId] = value;
};
fetchTableData();
function gettypeType(type: number) {
  switch (type) {
    case 9:
      return 'success';
    case 8:
      return 'danger';
  }
}
function gettypeText(type: number) {
  switch (type) {
    case 9:
      return t('reportmanage.takeout');
    case 8:
      return t('reportmanage.broke');
  }
}
function getStatusType(status: number) {
  switch (status) {
    case 1:
      return 'warning';
    case 3:
      return 'info';
    case 7:
      return 'success';
    case 8:
      return 'primary';
  }
}
function getStatusText(status: number) {
  switch (status) {
    case 1:
      return t('reportmanage.dreportwork');
    case 3:
      return t('reportmanage.reportwork');
    case 7:
      return t('reportmanage.pendingwork');
    case 8:
      return t('reportmanage.reportworked');
  }
}
let socket = null;
// const socketUrl = `ws://${WebSocketHost}:${host}/api/temperingGlass/api/talk/screen`;
// const handleMessage = (data) => {
// adjustedRects.value = data.device[0].map(rect => ({
//       ...rect,
//       completed: rect.completedQuantity,
//       breakage: rect.breakageQuantity,
//       thisProcess: rect.thisProcess,
//     }));
// };
// let socket;
onUnmounted(() => {
  socket.close();
});
onMounted(() => {
  fetchTableData();
  parseAndSetTime();
  // socket = initializeWebSocket(socketUrl, handleMessage);
});
onUnmounted(() => {
  if (socket) {
    closeWebSocket(socket);
  }
});
onBeforeUnmount(() => {
  closeWebSocket();
});
</script>
<style scoped></style>
UI-Project/src/views/Returns/return.vue
New file
@@ -0,0 +1,38 @@
<script setup>
import {ArrowLeftBold, ArrowRight, Search} from "@element-plus/icons-vue"
import {useRouter} from "vue-router";
let indexFlag=$ref(1)
function changeRouter(index){
  indexFlag=index
}
</script>
<template>
    <div id="main-body">
      <router-view  />
    </div>
</template>
<style scoped>
#main-div{
  width: 100%;
  height: 100%;
}
#div-title{
  height: 2%;
  width: 100%;
}
#searchButton{
  margin-top: -5px;
  margin-left: 1rem;
}
#main-body{
  width: 100%;
  height: 95%;
  /* margin-top: 1%; */
}
#select{
  margin-left:0.5rem;
}
:deep(.indexTag .el-breadcrumb__inner){
  color: #5CADFE !important;
}
</style>
UI-Project/src/views/Returns/upreturnhistory.vue
New file
@@ -0,0 +1,310 @@
<template>
    <div>
  <div style="display: flex;width: 1770px;">
    <el-input v-model="rawGlassWidth" clearable style="margin-left: 10px;margin-bottom: 10px;width: 200px;" :placeholder="$t('Mounting.width')" />
    <el-input v-model="rawGlassHeight" clearable style="margin-left: 10px;margin-bottom: 10px;width: 200px;" :placeholder="$t('Mounting.height')" />
    <el-input v-model="rawGlassThickness" clearable style="margin-left: 10px;margin-bottom: 10px;width: 200px;" :placeholder="$t('Mounting.thickness')" />
    <el-input v-model="rawGlassfilmsId" clearable style="margin-left: 10px;margin-bottom: 10px;width: 200px;" :placeholder="$t('workOrder.coatingtypesbe')" />
    <el-input v-model="slot" clearable style="margin-left: 10px;margin-bottom: 10px;width: 200px;" :placeholder="$t('workOrder.upnumber')" />
    <el-select v-model="selectValuesa[0]" filterable :placeholder="$t('searchOrder.taskstatus')" clearable
        style="width: 200px;margin-left: 10px;">
        <el-option :label="$t('searchOrder.empty')" value="0"></el-option>
        <el-option :label="$t('film.execution')" value="1"></el-option>
        <el-option :label="$t('searchOrder.endtask')" value="2"></el-option>
      </el-select>
            <el-date-picker
            style="margin-left: 15px;"
             v-model="timeRange"
             type="datetimerange"
             :shortcuts="shortcuts"
             range-separator="至"
             :start-placeholder="$t('reportmanage.starttime')"
             :end-placeholder="$t('reportmanage.endtime')"
           />
          <el-button type="primary" style="margin-left: 10px;margin-bottom: 10px;" @click="sethistorical()">{{$t('reportmanage.inquire')}}</el-button>
     </div>
        <el-table ref="table" style="margin-top: 20px;height: 580px;width: 1770px;" :data="tableDatax" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
      <el-table-column prop="rawGlassWidth" align="center" :label="$t('Mounting.width')" min-width="70" />
      <el-table-column prop="rawGlassHeight" align="center" :label="$t('Mounting.height')" min-width="70" />
      <el-table-column prop="rawGlassThickness" align="center" :label="$t('Mounting.thickness')" min-width="80" />
    <el-table-column prop="rawGlassFilmsId" align="center" :label="$t('basicData.coatingtypes')" min-width="80" />
    <el-table-column prop="slot" align="center" :label="$t('workOrder.upnumber')" min-width="80" />
      <el-table-column prop="totalCount" align="center" :label="$t('basicData.tonumber')" min-width="80" />
      <el-table-column prop="finishCount" align="center" :label="$t('basicData.finishnumber')" min-width="80" />
      <el-table-column prop="damageCount" align="center" :label="$t('hellow.damagenumber')" min-width="80" />
          <el-table-column
            align="center"
            :label="$t('film.taskstatus')"
            min-width="80"
            prop="taskState"
          >
          <template #default="scope">
        <el-tag :type="getStatusTypeb(scope.row.taskState)">
          {{ getStatusTextb(scope.row.taskState) }}
        </el-tag>
      </template>
          </el-table-column>
          <el-table-column prop="formattedCreateTime" align="center" :label="$t('reportmanage.starttime')" min-width="100" />
          <el-table-column prop="formattedUpdateTime" align="center" :label="$t('reportmanage.endtime')" min-width="100" />
        </el-table>
  <div style="margin-top: 20px;margin-left: 40%;">
        <el-pagination
          v-model:current-page="currentPage2"
          :page-size="pageSize"
          :size="large"
          :disabled="disabled"
          layout="prev, pager, next, jumper"
          :total="totalRecords"
          @current-change="handlePageChange2"
          style="margin-top: 10px;"
      />
    </div>
  </div>
  </template>
<script lang="ts" setup>
import {useI18n} from 'vue-i18n'
import {useRouter} from "vue-router"
import request from "@/utils/request"
import {host, WebSocketHost} from '@/utils/constants'
import {onBeforeUnmount, onMounted, onUnmounted, reactive, ref} from "vue";
import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
import {ElMessage, ElMessageBox} from 'element-plus'
const {t} = useI18n()
let language = ref(localStorage.getItem('lang') || 'zh')
import { inject } from 'vue';
const globalDate = inject('globalDate');
const router = useRouter()
const timeRange = ref([])
const selectValuesa = reactive([]);
const tableDatax = ref([])
const currentPage2 = ref(1)
const totalRecords = ref(0)
const rawGlassHeight = ref('');
const rawGlassThickness = ref('');
const rawGlassWidth = ref('');
const rawGlassfilmsId = ref('');
const slot = ref('');
let getglobalDate = window.localStorage.getItem('getglobalDate')
const historical = async () => {
  try {
  let startTime = window.localStorage.getItem('startTime')
      const response = await request.post("/loadGlass/loadglassdevicetaskhistory/queryLoadGlassHistoryTask", {
        pageNo: 1,
        pageSize: 20,
        rawGlassHeight: '',
        rawGlassThickness: '',
        rawGlassWidth: '',
        rawGlassfilmsId: '',
        slot: 0,
        station: 1,
        taskStateList: [],
        beginDate: startTime,
        endDate: getglobalDate
    })
      if (response.code == 200) {
        ElMessage.success(response.message);
        const formattedData = response.data.records.map(record => ({
        ...record,
        formattedCreateTime: formatTimestamp(record.createTime),
        formattedUpdateTime: formatTimestamp(record.updateTime),
      }));
        // tableDatax.value = response.data.records;
        tableDatax.value = formattedData;
        totalRecords.value = response.data.total/2 || 0
      } else {
        ElMessage.error(response.message);
    }
}
catch (error) {
    console.error(error);
  }
}
const handlePageChange2 = (newPage) => {
  currentPage2.value = newPage;
  window.localStorage.setItem('pagenumber', currentPage2.value)
  historicala(currentPage2.value);
};
const historicala = async (page) => {
  try {
let pslot= ''
let celllist=[]
if(selectValuesa[0]!=null&&selectValuesa[0]!='undefined'){
  if(selectValuesa[0]!=""){
    celllist=[selectValuesa[0]];
  }
}
if(slot.value != ""){
  pslot = slot.value
}else{
  pslot = '0'
}
  let page = window.localStorage.getItem('pagenumber')
  let startTime = window.localStorage.getItem('startTime')
      const response = await request.post("/loadGlass/loadglassdevicetaskhistory/queryLoadGlassHistoryTask", {
        pageNo: page,
        pageSize: 20,
        rawGlassHeight: rawGlassHeight.value,
        rawGlassThickness: rawGlassThickness.value,
        rawGlassWidth: rawGlassWidth.value,
        rawGlassfilmsId: rawGlassfilmsId.value,
        slot: pslot,
        station: 1,
        taskStateList: celllist,
        beginDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[0])) || '',
        endDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[1])) || '',
    })
      if (response.code == 200) {
        ElMessage.success(response.message);
        const formattedData = response.data.records.map(record => ({
        ...record,
        formattedCreateTime: formatTimestamp(record.createTime),
        formattedUpdateTime: formatTimestamp(record.updateTime),
      }));
        // tableDatax.value = response.data.records;
        tableDatax.value = formattedData;
        totalRecords.value = response.data.total/2 || 0
      } else {
        ElMessage.error(response.message);
    }
}
catch (error) {
    console.error(error);
  }
}
// 历史查询点击
const sethistorical = async () => {
  try {
let pslot= ''
let celllist=[]
if(selectValuesa[0]!=null&&selectValuesa[0]!='undefined'){
  if(selectValuesa[0]!=""){
    celllist=[selectValuesa[0]];
  }
}
if(slot.value != ""){
  pslot = slot.value
}else{
  pslot = '0'
}
  let startTime = window.localStorage.getItem('startTime')
  let page = window.localStorage.getItem('pagenumber')
  const response = await request.post("/loadGlass/loadglassdevicetaskhistory/queryLoadGlassHistoryTask", {
        pageNo: 1,
        pageSize: 20,
        rawGlassHeight: rawGlassHeight.value,
        rawGlassThickness: rawGlassThickness.value,
        rawGlassWidth: rawGlassWidth.value,
        rawGlassfilmsId: rawGlassfilmsId.value,
        slot: pslot,
        station: 1,
        taskStateList: celllist,
        beginDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[0])) || '',
        endDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[1])) || '',
      })
      if (response.code == 200) {
        currentPage2.value = 1
        ElMessage.success(response.message);
        const formattedData = response.data.records.map(record => ({
        ...record,
        formattedCreateTime: formatTimestamp(record.createTime),
        formattedUpdateTime: formatTimestamp(record.updateTime),
      }));
        // tableDatax.value = response.data.records;
        tableDatax.value = formattedData;
        totalRecords.value = response.data.total/2 || 0
      } else {
        ElMessage.error(response.message);
    }
}
catch (error) {
    console.error(error);
  }
}
// 格式化时间戳为年月日时间字符串的函数
function formatTimestamp(timestamp) {
  const date = new Date(timestamp);
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始,需要加1,并补零
  const day = String(date.getDate()).padStart(2, '0'); // 补零
  const hours = String(date.getHours()).padStart(2, '0'); // 补零(如果需要显示时间)
  const minutes = String(date.getMinutes()).padStart(2, '0'); // 补零(如果需要显示时间)
  const seconds = String(date.getSeconds()).padStart(2, '0'); // 补零(如果需要显示时间)
  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
const shortcuts = [
  {
    text: '最近一周',
    value: () => {
      const backendTime = new Date(getglobalDate)
      const oneWeekAgo = new Date(getglobalDate)
      oneWeekAgo.setHours(0, 0, 0, 0);
      oneWeekAgo.setDate(oneWeekAgo.getDate() - 7)
      timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)]
      window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
    },
  },
  {
    text: '最近一个月',
    value: () => {
      const backendTime = new Date(getglobalDate)
      const oneWeekAgo = new Date(getglobalDate)
      oneWeekAgo.setHours(0, 0, 0, 0);
      oneWeekAgo.setMonth(oneWeekAgo.getMonth() - 1)
      timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)]
      window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
    },
  },
  {
    text: '最近三个月',
    value: () => {
      const backendTime = new Date(getglobalDate)
      const oneWeekAgo = new Date(getglobalDate)
      oneWeekAgo.setHours(0, 0, 0, 0);
      oneWeekAgo.setMonth(oneWeekAgo.getMonth() - 3)
      timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)]
      window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
},
  },
]
function parseAndSetTime() {
  const backendTime = new Date(getglobalDate);
  const oneWeekAgo = new Date(backendTime.getTime() - 7 * 24 * 60 * 60 * 1000); // 减去7天
  oneWeekAgo.setHours(0, 0, 0, 0);
  timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)];
  window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
}
function getStatusTypeb(taskState: number) {
  switch (taskState) {
    case 0:
      return 'primary';
    case 1:
      return 'success';
    case 2:
      return 'info';
  }
}
function getStatusTextb(taskState: number) {
  switch (taskState) {
    case 0:
      return t('searchOrder.empty');
    case 1:
      return t('film.execution');
    case 2:
      return t('searchOrder.endtask');
  }
}
function getStatusTypea(taskRunning: number) {
  switch (taskRunning) {
    case 0:
      return 'primary';
    case 1:
      return 'success';
  }
}
onMounted(() => {
  parseAndSetTime();
  historical();
});
  </script>
  <style scoped>
  </style>
UI-Project/src/views/Returns/upreturnhistory2.vue
New file
@@ -0,0 +1,312 @@
<template>
  <div>
<div style="display: flex;width: 1770px;">
  <el-input v-model="rawGlassWidth" clearable style="margin-left: 10px;margin-bottom: 10px;width: 200px;" :placeholder="$t('Mounting.width')" />
  <el-input v-model="rawGlassHeight" clearable style="margin-left: 10px;margin-bottom: 10px;width: 200px;" :placeholder="$t('Mounting.height')" />
  <el-input v-model="rawGlassThickness" clearable style="margin-left: 10px;margin-bottom: 10px;width: 200px;" :placeholder="$t('Mounting.thickness')" />
  <el-input v-model="rawGlassfilmsId" clearable style="margin-left: 10px;margin-bottom: 10px;width: 200px;" :placeholder="$t('workOrder.coatingtypesbe')" />
  <el-input v-model="slot" clearable style="margin-left: 10px;margin-bottom: 10px;width: 200px;" :placeholder="$t('workOrder.upnumber')" />
  <el-select v-model="selectValuesa[0]" filterable :placeholder="$t('searchOrder.taskstatus')" clearable
      style="width: 200px;margin-left: 10px;">
      <el-option :label="$t('searchOrder.empty')" value="0"></el-option>
      <el-option :label="$t('film.execution')" value="1"></el-option>
      <el-option :label="$t('searchOrder.endtask')" value="2"></el-option>
    </el-select>
    <el-date-picker
            style="margin-left: 15px;"
             v-model="timeRange"
             type="datetimerange"
             :shortcuts="shortcuts"
             range-separator="至"
             :start-placeholder="$t('reportmanage.starttime')"
             :end-placeholder="$t('reportmanage.endtime')"
           />
        <el-button type="primary" style="margin-left: 10px;margin-bottom: 10px;" @click="sethistorical()">{{$t('reportmanage.inquire')}}</el-button>
   </div>
      <el-table ref="table" style="margin-top: 20px;height: 580px;width: 1770px;" :data="tableDatax" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
    <el-table-column prop="rawGlassWidth" align="center" :label="$t('Mounting.width')" min-width="70" />
    <el-table-column prop="rawGlassHeight" align="center" :label="$t('Mounting.height')" min-width="70" />
    <el-table-column prop="rawGlassThickness" align="center" :label="$t('Mounting.thickness')" min-width="80" />
    <el-table-column prop="rawGlassFilmsId" align="center" :label="$t('basicData.coatingtypes')" min-width="80" />
    <el-table-column prop="slot" align="center" :label="$t('workOrder.upnumber')" min-width="80" />
    <el-table-column prop="totalCount" align="center" :label="$t('basicData.tonumber')" min-width="80" />
    <el-table-column prop="finishCount" align="center" :label="$t('basicData.finishnumber')" min-width="80" />
    <el-table-column prop="damageCount" align="center" :label="$t('hellow.damagenumber')" min-width="80" />
        <el-table-column
          align="center"
          :label="$t('film.taskstatus')"
          min-width="80"
          prop="taskState"
        >
        <template #default="scope">
      <el-tag :type="getStatusTypeb(scope.row.taskState)">
        {{ getStatusTextb(scope.row.taskState) }}
      </el-tag>
    </template>
        </el-table-column>
        <el-table-column prop="formattedCreateTime" align="center" :label="$t('reportmanage.starttime')" min-width="100" />
        <el-table-column prop="formattedUpdateTime" align="center" :label="$t('reportmanage.endtime')" min-width="100" />
      </el-table>
<div style="margin-top: 20px;margin-left: 40%;">
      <el-pagination
        v-model:current-page="currentPage2"
        :page-size="pageSize"
        :size="large"
        :disabled="disabled"
        layout="prev, pager, next, jumper"
        :total="totalRecords"
        @current-change="handlePageChange2"
        style="margin-top: 10px;"
    />
  </div>
</div>
</template>
<script lang="ts" setup>
import {useI18n} from 'vue-i18n'
import {useRouter} from "vue-router"
import request from "@/utils/request"
import {host, WebSocketHost} from '@/utils/constants'
import {onBeforeUnmount, onMounted, onUnmounted, reactive, ref} from "vue";
import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
import {ElMessage, ElMessageBox} from 'element-plus'
const {t} = useI18n()
let language = ref(localStorage.getItem('lang') || 'zh')
import { inject } from 'vue';
const globalDate = inject('globalDate');
const router = useRouter()
const timeRange = ref([])
const selectValuesa = reactive([]);
const tableDatax = ref([])
const currentPage2 = ref(1)
const totalRecords = ref(0)
const rawGlassHeight = ref('');
const rawGlassThickness = ref('');
const rawGlassWidth = ref('');
const rawGlassfilmsId = ref('');
const slot = ref('');
let getglobalDate = window.localStorage.getItem('getglobalDate')
const historical = async () => {
try {
let startTime = window.localStorage.getItem('startTime')
    const response = await request.post("/loadGlass/loadglassdevicetaskhistory/queryLoadGlassHistoryTask", {
      pageNo: 1,
      pageSize: 20,
      rawGlassHeight: '',
      rawGlassThickness: '',
      rawGlassWidth: '',
      rawGlassfilmsId: '',
      slot: 0,
      station: 2,
      taskStateList: [],
      beginDate: startTime,
      endDate: getglobalDate
  })
    if (response.code == 200) {
        currentPage2.value = 1
        ElMessage.success(response.message);
      const formattedData = response.data.records.map(record => ({
      ...record,
      formattedCreateTime: formatTimestamp(record.createTime),
      formattedUpdateTime: formatTimestamp(record.updateTime),
    }));
      // tableDatax.value = response.data.records;
      tableDatax.value = formattedData;
      totalRecords.value = response.data.total/2 || 0
    } else {
      ElMessage.error(response.message);
  }
}
catch (error) {
  console.error(error);
}
}
const handlePageChange2 = (newPage) => {
currentPage2.value = newPage;
window.localStorage.setItem('pagenumber', currentPage2.value)
historicala(currentPage2.value);
};
const historicala = async (page) => {
try {
let pslot= ''
let celllist=[]
if(selectValuesa[0]!=null&&selectValuesa[0]!='undefined'){
if(selectValuesa[0]!=""){
  celllist=[selectValuesa[0]];
}
}
if(slot.value != ""){
pslot = slot.value
}else{
pslot = '0'
}
let page = window.localStorage.getItem('pagenumber')
let startTime = window.localStorage.getItem('startTime')
    const response = await request.post("/loadGlass/loadglassdevicetaskhistory/queryLoadGlassHistoryTask", {
      pageNo: page,
      pageSize: 20,
      rawGlassHeight: rawGlassHeight.value,
      rawGlassThickness: rawGlassThickness.value,
      rawGlassWidth: rawGlassWidth.value,
      rawGlassfilmsId: rawGlassfilmsId.value,
      slot: pslot,
      station: 2,
      taskStateList: celllist,
        beginDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[0])) || '',
        endDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[1])) || '',
  })
    if (response.code == 200) {
      ElMessage.success(response.message);
      const formattedData = response.data.records.map(record => ({
      ...record,
      formattedCreateTime: formatTimestamp(record.createTime),
      formattedUpdateTime: formatTimestamp(record.updateTime),
    }));
      // tableDatax.value = response.data.records;
      tableDatax.value = formattedData;
      totalRecords.value = response.data.total/2 || 0
    } else {
      ElMessage.error(response.message);
  }
}
catch (error) {
  console.error(error);
}
}
// 历史查询点击
const sethistorical = async () => {
try {
let pslot= ''
let celllist=[]
if(selectValuesa[0]!=null&&selectValuesa[0]!='undefined'){
if(selectValuesa[0]!=""){
  celllist=[selectValuesa[0]];
}
}
if(slot.value != ""){
pslot = slot.value
}else{
pslot = '0'
}
let startTime = window.localStorage.getItem('startTime')
let page = window.localStorage.getItem('pagenumber')
const response = await request.post("/loadGlass/loadglassdevicetaskhistory/queryLoadGlassHistoryTask", {
      pageNo: 1,
      pageSize: 20,
      rawGlassHeight: rawGlassHeight.value,
      rawGlassThickness: rawGlassThickness.value,
      rawGlassWidth: rawGlassWidth.value,
      rawGlassfilmsId: rawGlassfilmsId.value,
      slot: pslot,
      station: 2,
      taskStateList: celllist,
        beginDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[0])) || '',
        endDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[1])) || '',
  })
    if (response.code == 200) {
      ElMessage.success(response.message);
      const formattedData = response.data.records.map(record => ({
      ...record,
      formattedCreateTime: formatTimestamp(record.createTime),
      formattedUpdateTime: formatTimestamp(record.updateTime),
    }));
      // tableDatax.value = response.data.records;
      tableDatax.value = formattedData;
      totalRecords.value = response.data.total/2 || 0
    } else {
      ElMessage.error(response.message);
  }
}
catch (error) {
  console.error(error);
}
}
// 格式化时间戳为年月日时间字符串的函数
function formatTimestamp(timestamp) {
const date = new Date(timestamp);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始,需要加1,并补零
const day = String(date.getDate()).padStart(2, '0'); // 补零
const hours = String(date.getHours()).padStart(2, '0'); // 补零(如果需要显示时间)
const minutes = String(date.getMinutes()).padStart(2, '0'); // 补零(如果需要显示时间)
const seconds = String(date.getSeconds()).padStart(2, '0'); // 补零(如果需要显示时间)
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
const shortcuts = [
  {
    text: '最近一周',
    value: () => {
      const backendTime = new Date(getglobalDate)
      const oneWeekAgo = new Date(getglobalDate)
      oneWeekAgo.setHours(0, 0, 0, 0);
      oneWeekAgo.setDate(oneWeekAgo.getDate() - 7)
      timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)]
      window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
    },
  },
  {
    text: '最近一个月',
    value: () => {
      const backendTime = new Date(getglobalDate)
      const oneWeekAgo = new Date(getglobalDate)
      oneWeekAgo.setHours(0, 0, 0, 0);
      oneWeekAgo.setMonth(oneWeekAgo.getMonth() - 1)
      timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)]
      window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
    },
  },
  {
    text: '最近三个月',
    value: () => {
      const backendTime = new Date(getglobalDate)
      const oneWeekAgo = new Date(getglobalDate)
      oneWeekAgo.setHours(0, 0, 0, 0);
      oneWeekAgo.setMonth(oneWeekAgo.getMonth() - 3)
      timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)]
      window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
},
  },
]
// 格式化后端时间并计算一周前的时间
const defaultTime = ref<[Date, Date]>([new Date(), new Date()]);
function parseAndSetTime() {
const backendTime = new Date(getglobalDate);
const oneWeekAgo = new Date(backendTime.getTime() - 7 * 24 * 60 * 60 * 1000); // 减去7天
oneWeekAgo.setHours(0, 0, 0, 0);
timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)];
window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
}
function getStatusTypeb(taskState: number) {
switch (taskState) {
  case 0:
    return 'primary';
  case 1:
    return 'success';
  case 2:
    return 'info';
}
}
function getStatusTextb(taskState: number) {
switch (taskState) {
  case 0:
    return t('searchOrder.empty');
  case 1:
    return t('film.execution');
  case 2:
    return t('searchOrder.endtask');
}
}
function getStatusTypea(taskRunning: number) {
switch (taskRunning) {
  case 0:
    return 'primary';
  case 1:
    return 'success';
}
}
onMounted(() => {
parseAndSetTime();
historical();
});
</script>
<style scoped>
</style>
UI-Project/src/views/Returns/upreturns.vue
New file
@@ -0,0 +1,635 @@
<script lang="ts" setup>
import { onBeforeUnmount, onMounted, onUnmounted, reactive, ref, computed } from "vue";
import { useRouter } from "vue-router"
import { ElMessage, ElMessageBox } from 'element-plus'
import { useI18n } from 'vue-i18n'
import { host, WebSocketHost } from '@/utils/constants'
import request from "@/utils/request"
import { closeWebSocket, initializeWebSocket } from '@/utils/WebSocketService';
const router = useRouter()
const { t } = useI18n()
const selectValuesa = reactive([]);
const selectedProjectNo = ref('');
const stationCell = ref('1');
const filmRemove = ref('');
const dialogFormVisible = ref(false)
const blind = ref(false)
const blinda = ref(false)
const blindb = ref(false)
const blindbd = ref(false)
const ReportData = ref(true);
const canSelectProjecta = ref(true);
const canSelectProjectb = ref(true);
const canSelectProjectc = ref(false);
const tableDatax = ref([])
const tableDatad = ref([])
const upstatus = ref(t('basicData.machineaa'));
const cuttingMachineStatusColor = ref('#911005');
const tableDataa = ref<any[]>([]);
const tableDatab = ref<any[]>([]);
const stationInfos = reactive({});
const buttonEnabledStatus = ref({});
const globalDate = inject('globalDate');
import { inject } from 'vue';
import { tr } from "element-plus/es/locale";
const tableData = ref([])
const titleSelectJson = ref({
  engineerId: [],
})
request.post("/loadGlass/up-patten-usage/setUpPattenRequest", {
  state: null,
  stationCell: 5
}).then((response) => {
  if (response.code == 200) {
  } else {
    // ElMessage.warning(response.msg)
  }
});
const selectproject = () => {
  dialogFormVisible.value = true;
  selectgong();
};
const markingMachineStatus = ref('#911005');
const cuttingMachineStatus = ref('#911005');
const confirmMarkingMachine = () => {
  markingMachineStatus.value = 'green';
};
const confirmCuttingMachine = () => {
  cuttingMachineStatus.value = 'green';
};
onMounted(() => {
  socket = initializeWebSocket(socketUrl, handleMessage);
});
onUnmounted(() => {
  if (socket) {
    closeWebSocket(socket);
  }
});
let socket = null;
const socketUrl = `ws://${WebSocketHost}:${host}/api/loadGlass/api/talk/loadGlassOne`;
const handleMessage = (data: any) => {
  if (data.inkageState != null) {
    cuttingMachineStatusColor.value = data.inkageState[0] === 1 ? 'green' : '#911005';
  }
  if (data.stationList.length != 0) {
    const processedData = [...data.stationList[0]];
    if (processedData.length > 0) {
      processedData[0] = { ...processedData[0], workstationId: 1 };
    }
    if (processedData.length > 1) {
      processedData[1] = { ...processedData[1], workstationId: 2 };
    }
    tableDataa.value = processedData;
  } else {
    tableDataa.value = []
  }
  if (data.upPattenUsages.length != 0) {
    tableData.value = data.upPattenUsages[0]
    window.localStorage.setItem('engineeringIda', tableData.value[0].engineeringId)
    canSelectProjecta.value = false;
    canSelectProjectb.value = false;
    canSelectProjectc.value = true;
  }
  else {
    canSelectProjecta.value = true;
    canSelectProjectb.value = true;
    canSelectProjectc.value = false;
    tableData.value = [];
    window.localStorage.setItem('engineeringIda', '')
  }
};
onBeforeUnmount(() => {
  closeWebSocket();
});
const requestData = {
  state: 100
};
const selectgong = async (queryString: string) => {
  try {
    const response = await request.post('/loadGlass/optimizeProject/listByState', {
      ...requestData,
      query: queryString
    });
    if (response.code == 200) {
      titleSelectJson.value.engineerId = response.data;
    } else {
      // ElMessage.error(response.message);
    }
  } catch (error) {
    console.error(error);
  }
};
//选择工程预览确认
const handlesure = async () => {
  try {
    const response = await request.post('/loadGlass/up-patten-usage/selectUpPattenUsage', {
      stationCell: 5,
      engineerId: selectedProjectNo.value,
      filmRemove: parseInt(filmRemove.value, 10),
    })
    window.localStorage.setItem('engineeringIda', selectedProjectNo.value)
    window.localStorage.setItem('filmRemove', filmRemove.value)
    if (response.code == 200) {
      ElMessage.success(response.message);
      closeWebSocket(socket);
      tableData.value = response.data;
      dialogFormVisible.value = false;
      selectedProjectNo.value = '';
      filmRemove.value = '';
      markingMachineStatus.value = '#911005';
      cuttingMachineStatus.value = '#911005';
      ReportData.value = false;
    } else {
      ElMessage.error(response.message);
    }
  } catch (error) {
    console.error(error);
  }
}
// 开始上片
const handleon = async () => {
  let filmRemove = window.localStorage.getItem('filmRemove')
  let engineeringId = window.localStorage.getItem('engineeringIda')
  if (markingMachineStatus.value === 'green' && cuttingMachineStatus.value === 'green') {
    try {
      const response = await request.post('/loadGlass/engineering/engineering/changeTask', {
        stationCell: 5,
        filmRemove: filmRemove,
        engineerId: engineeringId,
        state: 1,
      })
      if (response.code == 200) {
        ElMessage.success(response.message);
        canSelectProjecta.value = false;
        canSelectProjectb.value = false;
        canSelectProjectc.value = true;
        socket = initializeWebSocket(socketUrl, handleMessage);
        blind.value = false;
        ReportData.value = true;
      } else {
        ElMessage.error(response.message);
      }
    } catch (error) {
      console.error(error);
    }
  } else if (markingMachineStatus.value === '#911005' || cuttingMachineStatus.value === '#911005') {
    ElMessage.warning(t('basicData.pausea'));
  }
}
// 暂停
const handleup = async () => {
  try {
    let filmRemove = window.localStorage.getItem('filmRemove')
    let engineeringId = window.localStorage.getItem('engineeringIda')
    if (engineeringId !== '') {
      const response = await request.post('/loadGlass/engineering/engineering/pause', {
        stationCell: 5,
        filmRemove: filmRemove,
        engineerId: engineeringId,
        state: 0,
      })
      if (response.code == 200) {
        ElMessage.success(response.message);
        blinda.value = false;
      } else {
        ElMessage.error(response.message);
      }
    } else {
      ElMessage({
        type: 'info',
        message: t('basicData.infonull'),
      })
    }
  } catch (error) {
    console.error(error);
  }
}
// 查询数据
const selectReportData = async () => {
  let stateList = []
  if (selectValuesa[0] != null && selectValuesa[0] != 'undefined') {
    if (selectValuesa[0] != "") {
      stateList = [selectValuesa[0]];
    }
  }
  const response = await request.post("/loadGlass/up-patten-usage/setUpPattenRequest", {
    state: selectValuesa[0],
    stationCell: 5
  })
  if (response.code === 200) {
    tableData.value = response.data;
    ElMessage.success(response.message);
  } else {
    ElMessage.error(response.message);
  }
};
// 开始上片
const handleBind = (row) => {
  blind.value = true;
};
// 暂停
const handleBinda = (row) => {
  blinda.value = true;
};
const toggleEnableState = async (row: any) => {
  if (!row.id) {
    ElMessage.error(t('basicData.updatanull'));
    return;
  }
  const newState = row.state === 100 ? 0 : 100;
  try {
    const response = await request.post('/loadGlass/up-patten-usage/updateGlassState', { id: row.id, state: newState });
    if (response.code === 200) {
      ElMessage.success(response.message);
      row.state = newState;
    } else {
      ElMessage.error(response.message);
    }
  } catch (error) {
    ElMessage.error(t('basicData.glassnull'));
  }
};
// 破损
const opena = async (row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.broke'),
      t('productStock.prompt'),
      {
        confirmButtonText: t('productStock.yes'),
        cancelButtonText: t('productStock.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const response = await request.post('/loadGlass/engineering/engineering/identControls', {
        glassId: row.glassId,
        line: 5,
        status: 1,
        state: 8,
        workingProcedure: '上片',
      })
      if (response.code === 200) {
        ElMessage.success(response.message);
      } else {
        ElMessage.error(response.msg);
      }
    }
  } catch (error) {
    console.error('发生错误:', error);
  }
};
// 人工拿走
const openb = async (row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('order.takeawaya'),
      t('productStock.prompt'),
      {
        confirmButtonText: t('productStock.yes'),
        cancelButtonText: t('productStock.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const response = await request.post('/loadGlass/engineering/engineering/identControls', {
        glassId: row.glassId,
        line: 5,
        status: 1,
        state: 9,
        workingProcedure: '上片',
      })
      if (response.code === 200) {
        ElMessage.success(response.message);
      } else {
        ElMessage.error(response.msg);
      }
    }
  } catch (error) {
    console.error('发生错误:', error);
  }
};
// 架子复位
const handleptask = async (workstationId: number) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('basicData.prackreset'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const slot = workstationId === 1 ? 101 : (workstationId === 2 ? 102 : null);
      if (slot !== null) {
        const response = await request.post('/glassStorage/rawGlassStorageDetails/shelfReset', {
          slot: slot,
        })
        // const url = `/loadGlass/rawGlassStorageDetails/shelfReset?slot=${slot}`;
        // const response = await request.post(url);
        if (response.code === 200) {
          ElMessage.success(response.message);
        } else {
          ElMessage.error(response.message);
        }
      } else {
      }
    }
  } catch (error) {
  }
};
// 结束工程
const deleteTask = async () => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.pdeleteTask'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      let engineeringId = window.localStorage.getItem('engineeringIda')
      if (engineeringId !== '') {
        const response = await request.post('/loadGlass/engineering/engineering/deleteTask', {
          engineerId: engineeringId,
        })
        if (response.code == 200) {
          ElMessage.success(response.message);
          canSelectProjecta.value = true;
          canSelectProjectb.value = true;
          canSelectProjectc.value = false;
          blindb.value = true;
          tableDatad.value = response.data;
        } else {
          ElMessage.error(response.message);
        }
      } else {
      }
    }
  } catch (error) {
  }
};
// 历史任务
const iframeUrl = ref('');
const handlehistorical = (row) => {
  blindbd.value = true;
  iframeUrl.value = `${window.location.origin}/#/Returns/upreturnhistory`;
};
function getStatusType2(filmRemove) {
  switch (filmRemove) {
    case 0:
      return 'success';
    case 1:
      return 'info';
    case 2:
      return 'warning';
  }
}
function getStatusText2(filmRemove) {
  switch (filmRemove) {
    case 0:
      return t('Mounting.noremoval');//完成
    case 1:
      return t('Mounting.coarselyground');//新建
    case 2:
      return t('Mounting.finegrinding');//执行中
  }
}
</script>
<template>
  <div style="height: 500px;">
    <div>
      <div id="dotClass">
        <div>{{ $t('basicData.laserprinting') }}</div>
        <i
          :style="{ marginTop: '2px', backgroundColor: markingMachineStatus, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
        <el-button @click="confirmMarkingMachine" style="margin-left: 30px;margin-top: -3px;">{{
          $t('basicData.yes')
        }}
        </el-button>
        <div style="margin-left: 70px;">{{ $t('basicData.cuttingmachine') }}</div>
        <i
          :style="{ marginTop: '2px', backgroundColor: cuttingMachineStatus, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
        <el-button @click="confirmCuttingMachine" style="margin-left: 30px;margin-top: -3px;">{{
          $t('basicData.yes')
        }}
        </el-button>
        <div style="margin-left: 70px;">{{ upstatus }}</div>
        <i
          :style="{ marginTop: '2px', backgroundColor: cuttingMachineStatusColor, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
      </div>
      <el-button :disabled="!canSelectProjecta" style="margin-top: 5px;margin-left: 15px;" type="primary"
        @click="selectproject">{{ $t('Mounting.previewproject') }}</el-button>
      <el-button :disabled="!canSelectProjectb" style="margin-top: 5px;margin-left: 20px;" type="success"
        @click="handleBind">{{ $t('basicData.startloading') }}</el-button>
      <el-button :disabled="!canSelectProjectc" style="margin-top: 5px;margin-left: 20px;" id="searchButton"
        type="warning" @click="handleBinda">{{ $t('basicData.stop') }}</el-button>
      <el-button :disabled="!canSelectProjectc" style="margin-top: 5px;margin-left: 20px;" id="searchButton"
        type="danger" @click="deleteTask">{{ $t('searchOrder.deleteTask') }}</el-button>
      <el-button style="margin-top: 5px;margin-left: 20px;" id="searchButton" type="info" @click="handlehistorical">{{
        $t('searchOrder.historicaltasks') }}</el-button>
      <el-select disabled v-model="selectValuesa[1]" clearable :placeholder="$t('Mounting.oneloadingline')"
        style="margin-top: 5px;margin-left: 20px;">
        <el-option :label="$t('Mounting.all')" value="0"></el-option>
        <el-option :label="$t('Mounting.oneloadingline')" value="1"></el-option>
        <el-option :label="$t('Mounting.twoloadingline')" value="2"></el-option>
      </el-select>
      <el-select v-model="selectValuesa[0]" clearable :placeholder="$t('film.taskstatus')"
        style="margin-top: 5px;margin-left: 20px;">
        <el-option :label="$t('Mounting.all')" value="null"></el-option>
        <el-option :label="$t('Mounting.waiting')" value="0"></el-option>
        <el-option :label="$t('Mounting.pass')" value="100"></el-option>
      </el-select>
      <el-button :disabled="!ReportData" type="primary" style="margin-left: 10px;" @click="selectReportData()">{{
        $t('Mounting.setparameters') }}</el-button>
      <el-card style="flex: 1;margin-left: 10px;margin-top: 15px;">
        <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
          <el-table height="400" ref="table" :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }"
            :data="tableData">
            <el-table-column prop="engineeringId" :label="$t('Mounting.project')" width="120" align="center" />
            <el-table-column prop="width" :label="$t('Mounting.width')" width="200" align="center" />
            <el-table-column prop="height" :label="$t('Mounting.height')" align="center" />
            <el-table-column prop="thickness" :label="$t('Mounting.thickness')" align="center" />
            <el-table-column prop="filmsId" :label="$t('Mounting.loadinglinea')" align="center" />
            <el-table-column prop="layoutSequence" :label="$t('Mounting.projectnumber')" align="center" />
            <el-table-column align="center" :label="$t('Mounting.state')" min-width="80" prop="state">
              <template #default="scope">
                <el-tag :type="scope.row.state === 100 ? 'success' : 'warning'" @click="toggleEnableState(scope.row)">
                  {{ scope.row.state === 100 ? $t('Mounting.pass') : $t('Mounting.waiting') }}
                </el-tag>
              </template>
            </el-table-column>
          </el-table>
        </div>
      </el-card>
      <div style="display: flex;">
        <div style="width: 49%;float: left;margin-left: 300px;">
          <div style="display: flex;">
            <img src="../../assets/shangpianji.png" alt=""
              style="max-width: 20%;max-height: 25%;margin-left: 10%;margin-top: 5%;">
            <el-table :data="tableDataa" border style="margin-top: 10%;margin-left: 8%;" width="500"
              :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
              <el-table-column prop="workstationId" align="center" :label="$t('basicData.station')" min-width="65" />
              <el-table-column prop="patternWidth" align="center" :label="$t('basicData.width')" min-width="75" />
              <el-table-column prop="patternHeight" align="center" :label="$t('basicData.height')" min-width="75" />
              <el-table-column prop="filmsId" align="center" :label="$t('basicData.coatingtypes')" min-width="80" />
              <el-table-column prop="remainQuantity" align="center" :label="$t('basicData.quantity')" min-width="80" />
              <el-table-column prop="patternThickness" align="center" :label="$t('basicData.thickness')"
                min-width="60" />
              <el-table-column fixed="right" :label="$t('film.operate')" align="center" width="100">
                <template #default="scope">
                  <el-button :disabled="(!scope.row.patternThickness)" type="text" plain
                    @click="handleptask(scope.row.workstationId)">{{ $t('basicData.rackreset') }}</el-button>
                </template>
              </el-table-column>
            </el-table>
          </div>
        </div>
      </div>
      <el-dialog v-model="blind" top="30vh" width="25%" :title="$t('basicData.startfilm')">
        <template #footer>
          <div id="dialog-footer">
            <el-button type="primary" @click="handleon">
              {{ $t('basicData.confirm') }}
            </el-button>
            <el-button @click="blind = false">{{ $t('basicData.cancel') }}</el-button>
          </div>
        </template>
      </el-dialog>
      <!-- 结束工程 -->
      <el-dialog v-model="blindb" top="10vh" width="80%">
        <el-table ref="table" style="margin-top: 20px;height: 450px;" :data="tableDatad"
          :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
          <el-table-column prop="engineerId" fixed align="center" :label="$t('basicData.projectnumber')" />
          <el-table-column prop="glassId" fixed align="center" :label="$t('searchOrder.glassID')" />
          <el-table-column prop="temperingLayoutId" fixed align="center" :label="$t('searchOrder.layoutID')" />
          <el-table-column prop="temperingFeedSequence" align="center" :label="$t('searchOrder.picturesequence')" />
          <el-table-column prop="width" align="center" :label="$t('basicData.width')" />
          <el-table-column prop="height" align="center" :label="$t('basicData.height')" />
          <el-table-column prop="thickness" align="center" :label="$t('basicData.thickness')" />
          <el-table-column prop="filmsid" align="center" :label="$t('basicData.coatingtypes')" />
          <el-table-column prop="flowCardId" align="center" :label="$t('searchOrder.processcards')" />
          <el-table-column fixed="right" :label="$t('productStock.operate')" align="center" width="200">
            <template #default="scope">
              <el-button type="text" plain @click="opena(scope.row)">{{ $t('order.dilapidation') }}</el-button>
              <el-button type="text" plain @click="openb(scope.row)">{{ $t('order.takeaway') }}</el-button>
            </template>
          </el-table-column>
        </el-table>
        <template #footer>
          <div id="dialog-footer">
            <el-button @click="blindb = false">{{ $t('large.close') }}</el-button>
          </div>
        </template>
      </el-dialog>
      <el-dialog v-model="blinda" top="24vh" width="30%" :title="$t('basicData.whetherpause')">
        <div style="margin-left: 50px;margin-bottom: 10px;">
          <el-form-item :label="$t('Mounting.loadingline')" :required="true">
            <el-select disabled v-model="stationCell" clearable :placeholder="$t('Mounting.inloadingline')"
              style="margin-left: 20px;">
              <el-option :label="$t('Mounting.all')" value="0"></el-option>
              <el-option :label="$t('Mounting.oneloadingline')" value="1"></el-option>
              <el-option :label="$t('Mounting.twoloadingline')" value="2"></el-option>
            </el-select>
          </el-form-item>
        </div>
        <template #footer>
          <div id="dialog-footer">
            <el-button type="primary" @click="handleup">
              {{ $t('basicData.confirm') }}
            </el-button>
            <el-button @click="blinda = false">{{ $t('basicData.cancel') }}</el-button>
          </div>
        </template>
      </el-dialog>
    </div>
    <el-dialog v-model="dialogFormVisible" top="24vh" width="70%">
      <div class="flex-container" style="margin-left: 50px;margin-bottom: 10px;">
        <el-form-item :label="$t('Mounting.loadingline')" :required="true">
          <el-select disabled v-model="stationCell" clearable :placeholder="$t('Mounting.inloadingline')">
            <el-option :label="$t('Mounting.oneloadingline')" value="1"></el-option>
            <el-option :label="$t('Mounting.twoloadingline')" value="2"></el-option>
          </el-select>
        </el-form-item>
        <el-form-item :label="$t('Mounting.projecta')" :required="true">
          <el-select v-model="selectedProjectNo" filterable clearable :placeholder="$t('basicData.plselectproject')"
            style="width: 220px" @input="handleInputChange">
            <el-option v-for="item in titleSelectJson['engineerId']" :key="item.id" :label="item.projectNo"
              :value="item.projectNo" />
          </el-select>
        </el-form-item>
        <el-form-item :label="$t('Mounting.removalmethoda')" :required="true">
          <el-select v-model="filmRemove" clearable :placeholder="$t('Mounting.removalmethod')">
            <el-option :label="$t('Mounting.noremoval')" value="0"></el-option>
            <el-option :label="$t('Mounting.coarselyground')" value="1"></el-option>
            <el-option :label="$t('Mounting.finegrinding')" value="2"></el-option>
          </el-select>
        </el-form-item>
      </div>
      <template #footer>
        <div id="dialog-footer">
          <el-button type="primary" @click="handlesure">
            {{ $t('basicData.confirm') }}
          </el-button>
          <el-button @click="dialogFormVisible = false">{{ $t('basicData.cancel') }}</el-button>
        </div>
      </template>
    </el-dialog>
    <!-- 历史任务 -->
    <el-dialog v-model="blindbd" top="5vh" width="95%" @close="iframeUrl=''">
      <iframe :src="iframeUrl" marginwidth="2000px" marginheight="2000px" width="100%" height="750px"
        frameborder="0"></iframe>
    </el-dialog>
  </div>
</template>
<style scoped>
.flex-container {
  display: flex;
  align-items: center;
}
.flex-container .el-form-item {
  flex: 1;
  margin-right: 0;
  /* 移除默认的右侧边距 */
}
.flex-container .el-form-item:last-child {
  margin-left: 20px;
  /* 为第二个表单项添加左侧边距 */
}
#dt {
  display: block;
  float: left;
  line-height: 20px;
  margin-left: 100px;
}
#dta {
  display: block;
  float: left;
  line-height: 20px;
  margin-left: 80%;
}
#dialog-footer {
  text-align: center;
  margin-top: -15px;
}
#dotClass {
  display: flex;
  margin-left: 20px;
  size: 50px;
  margin-top: 20px;
  margin-bottom: 10px;
}
</style>
UI-Project/src/views/Returns/upreturns2.vue
New file
@@ -0,0 +1,638 @@
<script lang="ts" setup>
import {onBeforeUnmount, onMounted, onUnmounted, reactive, ref, computed} from "vue";
import {useRouter} from "vue-router"
import { ElMessage, ElMessageBox } from 'element-plus'
import {useI18n} from 'vue-i18n'
import {host, WebSocketHost} from '@/utils/constants'
import request from "@/utils/request"
import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
const router = useRouter()
const {t} = useI18n()
const selectValuesa = reactive([]);
const selectedProjectNo = ref('');
const stationCell = ref('2');
const filmRemove = ref('');
const dialogFormVisible = ref(false)
const blind = ref(false)
const blinda = ref(false)
const ReportData = ref(true);
const blindb = ref(false)
const blindbd = ref(false)
const canSelectProjecta = ref(true);
const canSelectProjectb = ref(true);
const canSelectProjectc = ref(false);
const tableDatad = ref([])
const upstatus = ref(t('basicData.machineaa'));
const cuttingMachineStatusColor = ref('#911005');
const tableDataa = ref<any[]>([]);
const tableDatab = ref<any[]>([]);
const tableData = ref([])
const titleSelectJson = ref({
  engineerId: [],
})
request.post("/loadGlass/up-patten-usage/setUpPattenRequest",{
  state: null,
  stationCell: 6
}).then((response) => {
          if (response.code == 200) {
          } else {
          // ElMessage.warning(response.msg)
          }
          });
const selectproject = () => {
  dialogFormVisible.value = true;
  selectgong();
};
const markingMachineStatus = ref('#911005');
const cuttingMachineStatus = ref('#911005');
const confirmMarkingMachine = () => {
  markingMachineStatus.value = 'green';
};
const confirmCuttingMachine = () => {
  cuttingMachineStatus.value = 'green';
};
onMounted(() => {
  socket = initializeWebSocket(socketUrl, handleMessage);
});
onUnmounted(() => {
  if (socket) {
    closeWebSocket(socket);
  }
});
const fetchTableData = async () => {
  try {
    const response = await request.get("/loadGlass/up-patten-usage/prioritylist");
    if (response.code === 200) {
      tableData.splice(0, tableData.length, ...response.data);
      // ElMessage.error(response.message);
      window.localStorage.setItem('engineeringIda', tableData[0].engineeringId)
    }
  } catch (error) {
  }
};
let socket = null;
const socketUrl = `ws://${WebSocketHost}:${host}/api/loadGlass/api/talk/loadGlassTwo`;
const handleMessage = (data: any) => {
  if (data.stationList.length != 0) {
    const processedData = [...data.stationList[0]];
 if (processedData.length > 0) {
   processedData[0] = { ...processedData[0], workstationId: 1 };
 }
 if (processedData.length > 1) {
   processedData[1] = { ...processedData[1], workstationId: 2 };
 }
  tableDataa.value = processedData;
  }else {
    tableDataa.value = []
  }
  if (data.inkageState != null) {
    cuttingMachineStatusColor.value = data.inkageState[0] === 1 ? 'green' : '#911005';
  }
  if (data.upPattenUsages.length != 0) {
  tableData.value = data.upPattenUsages[0]
  window.localStorage.setItem('engineeringIda', tableData.value[0].engineeringId)
  canSelectProjecta.value = false;
  canSelectProjectb.value = false;
  canSelectProjectc.value = true;
}
else {
  tableData.value = [];
  canSelectProjecta.value = true;
  canSelectProjectb.value = true;
  canSelectProjectc.value = false;
}
};
onBeforeUnmount(() => {
  closeWebSocket();
});
// 结束工程
const handledelete = (row) => {
  blindb.value = true;
};
const requestData = {
  state: 100
};
const selectgong = async (queryString: string) => {
  try {
    const response = await request.post('/loadGlass/optimizeProject/listByState', {
      ...requestData,
      query: queryString
    });
    if (response.code == 200) {
      titleSelectJson.value.engineerId = response.data;
    } else {
      ElMessage.error(response.message);
    }
  } catch (error) {
    console.error(error);
  }
};
// 架子复位
const handleptask = async (workstationId: number) => {
      try {
    const confirmResult = await ElMessageBox.confirm(
      t('basicData.prackreset'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const slot = workstationId === 3 ? 103 : (workstationId === 4 ? 104 : null);
      if (slot !== null) {
        const response = await request.post('/glassStorage/rawGlassStorageDetails/shelfReset', {
          slot: slot,
    })
        if (response.code === 200) {
          ElMessage.success(response.message);
        } else {
          ElMessage.error(response.message);
        }
      } else {
      }
    }
  } catch (error) {
  }
};
//选择工程预览确认
const handlesure = async () => {
  try {
    const response = await request.post('/loadGlass/up-patten-usage/selectUpPattenUsage', {
      stationCell: 6,
      engineerId: selectedProjectNo.value,
      filmRemove: parseInt(filmRemove.value, 10),
    })
    window.localStorage.setItem('engineeringIda', selectedProjectNo.value)
    window.localStorage.setItem('filmRemove', filmRemove.value)
    if (response.code == 200) {
      ElMessage.success(response.message);
      closeWebSocket(socket);
      tableData.value = response.data;
      dialogFormVisible.value = false;
      selectedProjectNo.value = '';
      filmRemove.value = '';
      markingMachineStatus.value = '#911005';
      cuttingMachineStatus.value = '#911005';
      ReportData.value = false;
    } else {
      ElMessage.error(response.message);
    }
  } catch (error) {
    console.error(error);
  }
}
// 结束工程
const deleteTask = async () => {
      try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.pdeleteTask'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
    let engineeringId = window.localStorage.getItem('engineeringIda')
    if (engineeringId !== '') {
      const response = await request.post('/loadGlass/engineering/engineering/deleteTask', {
        engineerId: engineeringId,
      })
      if (response.code == 200) {
        ElMessage.success(response.message);
        canSelectProjecta.value = true;
        canSelectProjectb.value = true;
        canSelectProjectc.value = false;
        blindb.value = true;
        tableDatad.value = response.data;
      } else {
          ElMessage.error(response.message);
        }
      } else {
      }
    }
  } catch (error) {
  }
};
// 开始上片
const handleon = async () => {
  let filmRemove = window.localStorage.getItem('filmRemove')
  let engineeringIda = window.localStorage.getItem('engineeringIda')
  if (markingMachineStatus.value === 'green' && cuttingMachineStatus.value === 'green') {
    try {
      const response = await request.post('/loadGlass/engineering/engineering/changeTask', {
        stationCell: 6,
        filmRemove: filmRemove,
        engineerId: engineeringIda,
        state: 1,
      })
      if (response.code == 200) {
        ElMessage.success(response.message);
        canSelectProjecta.value = false;
        canSelectProjectb.value = false;
        canSelectProjectc.value = true;
        socket = initializeWebSocket(socketUrl, handleMessage);
        blind.value = false;
        ReportData.value = true;
      } else {
        ElMessage.error(response.message);
      }
    } catch (error) {
      console.error(error);
    }
  } else if (markingMachineStatus.value === '#911005' || cuttingMachineStatus.value === '#911005') {
    ElMessage.warning(t('basicData.pausea'));
  }
}
// 暂停
const handleup = async () => {
  try {
    let filmRemove = window.localStorage.getItem('filmRemove')
    let engineeringId = window.localStorage.getItem('engineeringIda')
    if (engineeringId !== '') {
      const response = await request.post('/loadGlass/engineering/engineering/pause', {
        stationCell: 6,
        filmRemove: filmRemove,
        engineerId: engineeringId,
        state: 0,
      })
      if (response.code == 200) {
        ElMessage.success(response.message);
        blinda.value = false;
      } else {
        ElMessage.error(response.message);
      }
    } else {
      ElMessage({
        type: 'info',
        message: t('basicData.infonull'),
      })
    }
  } catch (error) {
    console.error(error);
  }
}
// 查询数据
const selectReportData = async () => {
  let stateList = []
  if (selectValuesa[0] != null && selectValuesa[0] != 'undefined') {
    if (selectValuesa[0] != "") {
      stateList = [selectValuesa[0]];
    }
  }
  const response = await request.post("/loadGlass/up-patten-usage/setUpPattenRequest", {
    state: selectValuesa[0],
    stationCell: 6
  })
  if (response.code === 200) {
    tableData.value = response.data;
    ElMessage.success(response.message);
  } else {
    ElMessage.error(response.message);
  }
};
onMounted(fetchTableData);
// 开始上片
const handleBind = (row) => {
  blind.value = true;
};
// 暂停
const handleBinda = (row) => {
  blinda.value = true;
};
const toggleEnableState = async (row: any) => {
  if (!row.id) {
    ElMessage.error(t('basicData.updatanull'));
    return;
  }
  const newState = row.state === 100 ? 0 : 100;
  try {
    const response = await request.post('/loadGlass/up-patten-usage/updateGlassState', {id: row.id, state: newState});
    if (response.code === 200) {
      ElMessage.success(response.message);
      row.state = newState;
    } else {
      ElMessage.error(response.message);
    }
  } catch (error) {
    ElMessage.error(t('basicData.glassnull'));
  }
};
// 破损
const opena = async(row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.broke'),
      t('productStock.prompt'),
      {
        confirmButtonText: t('productStock.yes'),
        cancelButtonText: t('productStock.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
     const response = await request.post('/loadGlass/engineering/engineering/identControls', {
       glassId: row.glassId,
       line: 6,
       status: 1,
       state: 8,
       workingProcedure: '上片',
    })
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
      ElMessage.error(response.msg);
      }
    }
  } catch (error) {
    console.error('发生错误:', error);
  }
};
// 人工拿走
const openb = async(row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('order.takeawaya'),
      t('productStock.prompt'),
      {
        confirmButtonText: t('productStock.yes'),
        cancelButtonText: t('productStock.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const response = await request.post('/loadGlass/engineering/engineering/identControls', {
       glassId: row.glassId,
       line: 6,
       status: 1,
       state: 9,
       workingProcedure: '上片',
    })
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
      ElMessage.error(response.msg);
      }
    }
  } catch (error) {
    console.error('发生错误:', error);
  }
};
// 历史任务
const iframeUrl = ref('');
const handlehistorical = (row) => {
  blindbd.value = true;
  iframeUrl.value = `${window.location.origin}/#/Returns/upreturnhistory`;
};
function getStatusType2(filmRemove) {
  switch (filmRemove) {
    case 0:
      return 'success';
    case 1:
      return 'info';
    case 2:
      return 'warning';
  }
}
function getStatusText2(filmRemove) {
  switch (filmRemove) {
    case 0:
      return t('Mounting.noremoval');//完成
    case 1:
      return t('Mounting.coarselyground');//新建
    case 2:
      return t('Mounting.finegrinding');//执行中
  }
}
</script>
<template>
  <div style="height: 500px;">
    <div>
      <div id="dotClass">
        <div>{{ $t('basicData.laserprinting') }}</div>
        <i :style="{ marginTop: '2px', backgroundColor: markingMachineStatus, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
        <el-button @click="confirmMarkingMachine" style="margin-left: 30px;margin-top: -3px;">{{
            $t('basicData.yes')
          }}
        </el-button>
        <div style="margin-left: 70px;">{{ $t('basicData.cuttingmachine') }}</div>
        <i :style="{ marginTop: '2px', backgroundColor: cuttingMachineStatus, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
        <el-button @click="confirmCuttingMachine" style="margin-left: 30px;margin-top: -3px;">{{
            $t('basicData.yes')
          }}
        </el-button>
        <div style="margin-left: 70px;">{{ upstatus }}</div>
        <i :style="{ marginTop: '2px', backgroundColor: cuttingMachineStatusColor, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
  </div>
    <el-button :disabled="!canSelectProjecta" style="margin-top: 5px;margin-left: 15px;"  type="primary" @click="selectproject">{{ $t('Mounting.previewproject') }}</el-button>
    <el-button :disabled="!canSelectProjectb" style="margin-top: 5px;margin-left: 20px;" type="success" @click="handleBind">{{ $t('basicData.startloading') }}</el-button>
    <el-button :disabled="!canSelectProjectc" style="margin-top: 5px;margin-left: 20px;"  id="searchButton" type="warning" @click="handleBinda">{{ $t('basicData.stop') }}</el-button>
    <el-button :disabled="!canSelectProjectc" style="margin-top: 5px;margin-left: 20px;" id="searchButton" type="danger" @click="deleteTask">{{ $t('searchOrder.deleteTask') }}</el-button>
    <el-button style="margin-top: 5px;margin-left: 20px;" id="searchButton" type="info" @click="handlehistorical">{{ $t('searchOrder.historicaltasks') }}</el-button>
    <el-select disabled v-model="selectValuesa[1]" clearable :placeholder="$t('Mounting.twoloadingline')"
               style="margin-top: 5px;margin-left: 20px;">
      <el-option :label="$t('Mounting.all')" value="0"></el-option>
      <el-option :label="$t('Mounting.oneloadingline')" value="1"></el-option>
      <el-option :label="$t('Mounting.twoloadingline')" value="2"></el-option>
    </el-select>
    <el-select v-model="selectValuesa[0]" clearable :placeholder="$t('film.taskstatus')" style="margin-top: 5px;margin-left: 20px;" >
      <el-option :label="$t('Mounting.all')" value="null"></el-option>
      <el-option :label="$t('Mounting.waiting')" value="0"></el-option>
      <el-option :label="$t('Mounting.pass')" value="100"></el-option>
    </el-select>
    <el-button :disabled="!ReportData" type="primary" style="margin-left: 10px;" @click="selectReportData()">{{ $t('Mounting.setparameters') }}</el-button>
    <el-card style="flex: 1;margin-left: 10px;margin-top: 15px;">
      <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
        <el-table
            height="400"
            ref="table"
            :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"
            :data="tableData"
        >
          <el-table-column prop="engineeringId" :label="$t('Mounting.project')" width="120" align="center"/>
          <el-table-column prop="width" :label="$t('Mounting.width')" width="200" align="center"/>
          <el-table-column prop="height" :label="$t('Mounting.height')" align="center"/>
          <el-table-column prop="thickness" :label="$t('Mounting.thickness')" align="center"/>
          <el-table-column prop="filmsId" :label="$t('Mounting.loadinglinea')" align="center"/>
          <el-table-column prop="layoutSequence" :label="$t('Mounting.projectnumber')" align="center"/>
          <el-table-column
              align="center"
              :label="$t('Mounting.state')"
            min-width="80"
            prop="state"
          >
          <template #default="scope">
            <el-tag
                :type="scope.row.state === 100 ? 'success' : 'warning'"
                @click="toggleEnableState(scope.row)"
            >
              {{ scope.row.state === 100 ? $t('Mounting.pass') : $t('Mounting.waiting') }}
            </el-tag>
          </template>
      </el-table-column>
        </el-table>
      </div>
    </el-card>
    <div style="display: flex;">
      <div style="width: 49%;float: left;margin-left: 300px;">
        <div style="display: flex;">
          <img src="../../assets/shangpianji.png" alt=""
               style="max-width: 20%;max-height: 25%;margin-left: 10%;margin-top: 5%;">
            <el-table :data="tableDataa" border style="margin-top: 10%;margin-left: 8%;" width="500"
                    :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}" >
            <el-table-column prop="workstationId" align="center" :label="$t('basicData.station')" min-width="65"/>
            <el-table-column prop="patternWidth" align="center" :label="$t('basicData.width')" min-width="75"/>
            <el-table-column prop="patternHeight" align="center" :label="$t('basicData.height')" min-width="75"/>
            <el-table-column prop="filmsId" align="center" :label="$t('basicData.coatingtypes')" min-width="80"/>
            <el-table-column prop="remainQuantity" align="center" :label="$t('basicData.quantity')" min-width="80"/>
            <el-table-column prop="patternThickness" align="center" :label="$t('basicData.thickness')" min-width="60"/>
            <el-table-column fixed="right" :label="$t('film.operate')" align="center" width="100">
            <template #default="scope">
          <el-button :disabled="(!scope.row.patternThickness)" type="text" plain @click="handleptask(scope.row.workstationId)">{{ $t('basicData.rackreset') }}</el-button>
            </template>
        </el-table-column>
          </el-table>
    </div>
  </div>
</div>
   <!-- 历史任务 -->
   <el-dialog v-model="blindbd" top="5vh" width="95%" @close="iframeUrl=''">
     <iframe
     :src="iframeUrl"
     marginwidth="2000px"
     marginheight="2000px"
     width="100%"
     height="750px"
     frameborder="0"
     ></iframe>
  </el-dialog>
  <el-dialog v-model="blind" top="30vh" width="25%" :title="$t('basicData.startfilm')">
    <template #footer>
      <div id="dialog-footer">
        <el-button type="primary" @click="handleon">
          {{ $t('basicData.confirm') }}
        </el-button>
        <el-button @click="blind = false">{{ $t('basicData.cancel') }}</el-button>
      </div>
    </template>
  </el-dialog>
<!-- 结束工程 -->
  <el-dialog v-model="blindb" top="10vh" width="80%">
    <el-table ref="table" style="margin-top: 20px;height: 450px;" :data="tableDatad" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
        <el-table-column prop="engineerId" fixed align="center" :label="$t('basicData.projectnumber')"/>
        <el-table-column prop="glassId" fixed align="center" :label="$t('searchOrder.glassID')"/>
        <el-table-column prop="temperingLayoutId" fixed align="center" :label="$t('searchOrder.layoutID')"/>
        <el-table-column prop="temperingFeedSequence" align="center" :label="$t('searchOrder.picturesequence')"/>
        <el-table-column prop="width" align="center" :label="$t('basicData.width')"/>
        <el-table-column prop="height" align="center" :label="$t('basicData.height')"/>
        <el-table-column prop="thickness" align="center" :label="$t('basicData.thickness')"/>
        <el-table-column prop="filmsid" align="center" :label="$t('basicData.coatingtypes')"/>
        <el-table-column prop="flowCardId" align="center" :label="$t('searchOrder.processcards')"/>
        <el-table-column fixed="right" :label="$t('productStock.operate')" align="center" width="200">
            <template #default="scope">
              <el-button type="text" plain @click="opena(scope.row)">{{ $t('order.dilapidation') }}</el-button>
              <el-button type="text" plain @click="openb(scope.row)">{{ $t('order.takeaway') }}</el-button>
            </template>
        </el-table-column>
        </el-table>
        <template #footer>
      <div id="dialog-footer">
        <el-button type="danger" @click="deleteTask()">{{ $t('searchOrder.deleteTask') }}</el-button>
        <el-button @click="blindb = false">{{ $t('large.close') }}</el-button>
      </div>
    </template>
  </el-dialog>
  <el-dialog v-model="blinda" top="24vh" width="30%" :title="$t('basicData.whetherpause')">
    <div style="margin-left: 50px;margin-bottom: 10px;">
    <el-form-item :label="$t('Mounting.loadingline')" :required="true">
      <el-select disabled v-model="stationCell" clearable :placeholder="$t('Mounting.inloadingline')" style="margin-left: 20px;">
        <el-option :label="$t('Mounting.all')" value="0"></el-option>
        <el-option :label="$t('Mounting.oneloadingline')" value="1"></el-option>
        <el-option :label="$t('Mounting.twoloadingline')" value="2"></el-option>
      </el-select>
    </el-form-item>
    </div>
    <template #footer>
      <div id="dialog-footer">
        <el-button type="primary" @click="handleup">
          {{ $t('basicData.confirm') }}
        </el-button>
        <el-button @click="blinda = false">{{ $t('basicData.cancel') }}</el-button>
      </div>
    </template>
  </el-dialog>
        </div>
  <el-dialog v-model="dialogFormVisible" top="24vh" width="70%">
    <div class="flex-container" style="margin-left: 50px;margin-bottom: 10px;">
      <el-form-item :label="$t('Mounting.loadingline')" :required="true">
        <el-select disabled v-model="stationCell" clearable :placeholder="$t('Mounting.inloadingline')">
          <el-option :label="$t('Mounting.oneloadingline')" value="1"></el-option>
          <el-option :label="$t('Mounting.twoloadingline')" value="2"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item :label="$t('Mounting.projecta')" :required="true">
        <el-select
            v-model="selectedProjectNo"
            filterable
            clearable
            :placeholder="$t('basicData.plselectproject')"
            style="width: 220px"
            @input="handleInputChange"
        >
          <el-option
              v-for="item in titleSelectJson['engineerId']"
              :key="item.id"
              :label="item.projectNo"
              :value="item.projectNo"
          />
        </el-select>
      </el-form-item>
      <el-form-item :label="$t('Mounting.removalmethoda')" :required="true">
        <el-select v-model="filmRemove" clearable :placeholder="$t('Mounting.removalmethod')">
          <el-option :label="$t('Mounting.noremoval')" value="0"></el-option>
          <el-option :label="$t('Mounting.coarselyground')" value="1"></el-option>
          <el-option :label="$t('Mounting.finegrinding')" value="2"></el-option>
        </el-select>
      </el-form-item>
    </div>
    <template #footer>
      <div id="dialog-footer">
        <el-button type="primary" @click="handlesure">
          {{ $t('basicData.confirm') }}
        </el-button>
        <el-button @click="dialogFormVisible = false">{{ $t('basicData.cancel') }}</el-button>
      </div>
    </template>
  </el-dialog>
  </div>
</template>
<style scoped>
 .flex-container {
  display: flex;
  align-items: center;
}
.flex-container .el-form-item {
  flex: 1;
  margin-right: 0; /* 移除默认的右侧边距 */
}
.flex-container .el-form-item:last-child {
  margin-left: 20px; /* 为第二个表单项添加左侧边距 */
}
#dt { display:block; float:left;line-height: 20px;margin-left: 100px;}
#dta { display:block; float:left;line-height: 20px;margin-left: 80%;}
#dialog-footer{
  text-align: center;
  margin-top: -15px;
}
#dotClass {
  display: flex;
  margin-left: 20px;
  size: 50px;
  margin-top: 20px;
  margin-bottom: 10px;
}
</style>
UI-Project/src/views/Returns/upreturns3.vue
New file
@@ -0,0 +1,839 @@
<script lang="ts" setup>
import { onBeforeUnmount, onMounted, onUnmounted, reactive, ref, computed } from "vue";
import { useRouter } from "vue-router"
import { ElMessage, ElMessageBox } from 'element-plus'
import { useI18n } from 'vue-i18n'
import { host, WebSocketHost } from '@/utils/constants'
import request from "@/utils/request"
import { closeWebSocket, initializeWebSocket } from '@/utils/WebSocketService';
const router = useRouter()
const { t } = useI18n()
const selectValuesa = reactive([]);
const selectedProjectNo = ref('');
const stationCell = ref('1');
const filmRemove = ref('');
const dialogFormVisible = ref(false)
const blind = ref(false)
const blinda = ref(false)
const ReportData = ref(true);
const blindb = ref(false)
const blindbd = ref(false)
const canSelectProjecta = ref(true);
const canSelectProjectb = ref(true);
const canSelectProjectc = ref(false);
const tableDatad = ref([])
const upstatus = ref(t('basicData.machineaa'));
const cuttingMachineStatusColor = ref('#911005');
const tableDataa = ref<any[]>([]);
const tableDatab = ref<any[]>([]);
const tableData = ref([])
const dialogFormVisiblea = ref(false)
const titleSelectJson = ref({
  engineerId: [],
})
request.post("/loadGlass/up-patten-usage/setUpPattenRequest", {
  state: null,
  stationCell: 5
}).then((response) => {
  if (response.code == 200) {
  } else {
    // ElMessage.warning(response.msg)
  }
});
const selectproject = () => {
  dialogFormVisible.value = true;
  selectgong();
};
const markingMachineStatus = ref('#911005');
const cuttingMachineStatus = ref('#911005');
const confirmMarkingMachine = () => {
  markingMachineStatus.value = 'green';
};
const confirmCuttingMachine = () => {
  cuttingMachineStatus.value = 'green';
};
//获取原片仓储信息
let socketB = null;
const socketUrlB = `ws://${WebSocketHost}:${host}/api/glassStorage/api/talk/rawGlass`;
// 添加新的消息处理函数
const handleMessageB = (data) => {
  if (data.rawStationDetailsList != null) {
    tableDatab.value = data.rawStationDetailsList[0];
  }
};
onMounted(() => {
  socket = initializeWebSocket(socketUrl, handleMessage);
  socketB = initializeWebSocket(socketUrlB, handleMessageB);
});
onUnmounted(() => {
  if (socket) {
    closeWebSocket(socket);
  }
  if (socketB) {
    closeWebSocket(socketB);
  }
});
const fetchTableData = async () => {
  try {
    const response = await request.get("/loadGlass/up-patten-usage/prioritylist");
    if (response.code === 200) {
      tableData.splice(0, tableData.length, ...response.data);
      // ElMessage.error(response.message);
      window.localStorage.setItem('engineeringIda', tableData[0].engineeringId)
    }
  } catch (error) {
  }
};
let socket = null;
const socketUrl = `ws://${WebSocketHost}:${host}/api/loadGlass/api/talk/loadGlassOne`;
const handleMessage = (data: any) => {
  if (data.inkageState != null) {
    cuttingMachineStatusColor.value = data.inkageState[0] === 1 ? 'green' : '#911005';
  }
  if (data.stationList.length != 0) {
    const processedData = [...data.stationList[0]];
    if (processedData.length > 0) {
      processedData[0] = { ...processedData[0], workstationId: 1 };
    }
    if (processedData.length > 1) {
      processedData[1] = { ...processedData[1], workstationId: 2 };
    }
    tableDataa.value = processedData;
  } else {
    tableDataa.value = []
  }
  if (data.upPattenUsages.length != 0) {
    tableData.value = data.upPattenUsages[0]
    window.localStorage.setItem('engineeringIda', tableData.value[0].engineeringId)
    canSelectProjecta.value = false;
    canSelectProjectb.value = false;
    canSelectProjectc.value = true;
  }
  else {
    canSelectProjecta.value = true;
    canSelectProjectb.value = true;
    canSelectProjectc.value = false;
    tableData.value = [];
    window.localStorage.setItem('engineeringIda', '')
  }
};
onBeforeUnmount(() => {
  closeWebSocket();
});
// // 结束工程
// const handledelete = (row) => {
//   blindb.value = true;
// };
// const requestData = {
//   state: 100
// };
// const selectgong = async (queryString: string) => {
//   try {
//     const response = await request.post('/up-patten-usage/deleteTask', {
//       ...requestData,
//       query: queryString
//     });
//     if (response.code == 200) {
//       titleSelectJson.value.engineerId = response.data;
//     } else {
//       ElMessage.error(response.message);
//     }
//   } catch (error) {
//     console.error(error);
//   }
// };
// 架子复位
const handleptask = async (workstationId: number) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('basicData.prackreset'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const slot = workstationId === 3 ? 103 : (workstationId === 4 ? 104 : null);
      if (slot !== null) {
        const response = await request.post('/glassStorage/rawGlassStorageDetails/shelfReset', {
          slot: slot,
        })
        if (response.code === 200) {
          ElMessage.success(response.message);
        } else {
          ElMessage.error(response.message);
        }
      } else {
      }
    }
  } catch (error) {
  }
};
//选择工程预览确认
// const handlesure = async () => {
//   try {
//     const response = await request.post('/loadGlass/up-patten-usage/selectUpPattenUsage', {
//       stationCell: 5,
//       engineerId: selectedProjectNo.value,
//       filmRemove: parseInt(filmRemove.value, 10),
//     })
//     window.localStorage.setItem('engineeringIda', selectedProjectNo.value)
//     window.localStorage.setItem('filmRemove', filmRemove.value)
//     if (response.code == 200) {
//       ElMessage.success(response.message);
//       closeWebSocket(socket);
//       tableData.value = response.data;
//       dialogFormVisible.value = false;
//       selectedProjectNo.value = '';
//       filmRemove.value = '';
//       markingMachineStatus.value = '#911005';
//       cuttingMachineStatus.value = '#911005';
//       ReportData.value = false;
//     } else {
//       ElMessage.error(response.message);
//     }
//   } catch (error) {
//     console.error(error);
//   }
// }
// 结束工程
const deleteTask = async () => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.pdeleteTask'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      let engineeringId = window.localStorage.getItem('engineeringIda')
      if (engineeringId !== '') {
        const response = await request.post('/loadGlass/engineering/engineering/deleteTask', {
          engineerId: engineeringId,
        })
        if (response.code == 200) {
          ElMessage.success(response.message);
          canSelectProjecta.value = true;
          canSelectProjectb.value = true;
          canSelectProjectc.value = false;
          blindb.value = true;
          tableDatad.value = response.data;
        } else {
          ElMessage.error(response.message);
        }
      } else {
      }
    }
  } catch (error) {
  }
};
// 开始上片按钮
const handleBind = (row) => {
  const quantity = inputQuantities.value[row.slot];
  if (!quantity) {
    ElMessage.warning('请输入数量');
    return;
  }
  handleon(parseInt(row.slot), quantity);
};
const inputQuantities = ref<{ [key: string]: string }>({});  // 用于存储输入数量
const currentRow = ref(null);
// 开始上片
const handleon = async (slot: number, quantity: string) => {
  try {
    // 转换为整数
    const quantityNum = Number(quantity);
    const slotNum = Number(slot);
    // 验证是否为有效整数
    if (!Number.isInteger(quantityNum) || !Number.isInteger(slotNum)) {
      ElMessage.warning('数量和架位号必须是整数');
      return;
    }
    const response = await request.post('/loadGlass/up-patten-usage/insertTask?quantity=' + quantityNum + '&slot=' + slotNum);
    if (response.code == 200) {
      ElMessage.success(response.message);
      blind.value = false;
      dialogFormVisiblea.value = false;
      inputQuantities.value[slot] = '';
    } else {
      ElMessage.error(response.message);
    }
  } catch (error) {
    console.error(error);
    ElMessage.error('操作失败');
  }
};
// 暂停
const handleup = async () => {
  try {
    let filmRemove = window.localStorage.getItem('filmRemove')
    let engineeringId = window.localStorage.getItem('engineeringIda')
    if (engineeringId !== '') {
      const response = await request.post('/loadGlass/engineering/engineering/pause', {
        stationCell: 5,
        filmRemove: filmRemove,
        engineerId: engineeringId,
        state: 0,
      })
      if (response.code == 200) {
        ElMessage.success(response.message);
        blinda.value = false;
      } else {
        ElMessage.error(response.message);
      }
    } else {
      ElMessage({
        type: 'info',
        message: t('basicData.infonull'),
      })
    }
  } catch (error) {
    console.error(error);
  }
}
// 查询数据
const selectReportData = async () => {
  let stateList = []
  if (selectValuesa[0] != null && selectValuesa[0] != 'undefined') {
    if (selectValuesa[0] != "") {
      stateList = [selectValuesa[0]];
    }
  }
  const response = await request.post("/loadGlass/up-patten-usage/setUpPattenRequest", {
    state: selectValuesa[0],
    stationCell: 5
  })
  if (response.code === 200) {
    tableData.value = response.data;
    ElMessage.success(response.message);
  } else {
    ElMessage.error(response.message);
  }
};
onMounted(fetchTableData);
// 暂停
const handleBinda = (row) => {
  blinda.value = true;
};
const toggleEnableState = async (row: any) => {
  if (!row.id) {
    ElMessage.error(t('basicData.updatanull'));
    return;
  }
  const newState = row.state === 100 ? 0 : 100;
  try {
    const response = await request.post('/loadGlass/up-patten-usage/updateGlassState', { id: row.id, state: newState });
    if (response.code === 200) {
      ElMessage.success(response.message);
      row.state = newState;
    } else {
      ElMessage.error(response.message);
    }
  } catch (error) {
    ElMessage.error(t('basicData.glassnull'));
  }
};
// 破损
const opena = async (row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.broke'),
      t('productStock.prompt'),
      {
        confirmButtonText: t('productStock.yes'),
        cancelButtonText: t('productStock.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const response = await request.post('/loadGlass/engineering/engineering/identControls', {
        glassId: row.glassId,
        line: 6,
        status: 1,
        state: 8,
        workingProcedure: '上片',
      })
      if (response.code === 200) {
        ElMessage.success(response.message);
      } else {
        ElMessage.error(response.msg);
      }
    }
  } catch (error) {
    console.error('发生错误:', error);
  }
};
// 人工拿走
const openb = async (row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('order.takeawaya'),
      t('productStock.prompt'),
      {
        confirmButtonText: t('productStock.yes'),
        cancelButtonText: t('productStock.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const response = await request.post('/loadGlass/engineering/engineering/identControls', {
        glassId: row.glassId,
        line: 6,
        status: 1,
        state: 9,
        workingProcedure: '上片',
      })
      if (response.code === 200) {
        ElMessage.success(response.message);
      } else {
        ElMessage.error(response.msg);
      }
    }
  } catch (error) {
    console.error('发生错误:', error);
  }
};
// 历史任务
const iframeUrl = ref('');
const handlehistorical = (row) => {
  blindbd.value = true;
  iframeUrl.value = `${window.location.origin}/#/Returns/upreturnhistory`;
};
function getStatusType2(filmRemove) {
  switch (filmRemove) {
    case 0:
      return 'success';
    case 1:
      return 'info';
    case 2:
      return 'warning';
  }
}
function getStatusText2(filmRemove) {
  switch (filmRemove) {
    case 0:
      return t('Mounting.noremoval');//完成
    case 1:
      return t('Mounting.coarselyground');//新建
    case 2:
      return t('Mounting.finegrinding');//执行中
  }
}
// 输入框限制
const handleInput = (row) => {
  const inputValue = parseInt(row.filmRemove);
  const maxValue = row.remainQuantity;
  if (inputValue > maxValue) {
    row.filmRemove = maxValue;
  }
};
// 架子数据对比 (任意一行比匹配都显示红色)
// const tableRowClassName = ({
//   row,
//   rowIndex: number
// }) => {
//   // 获取第一条数据
//   const firstData = tableData.value[0];
//   // 如果第一条数据存在且状态不是100
//   if (firstData && firstData.state !== 100) {
//     // 获取当前行与第一条数据
//     const previousRow = tableDataa.value.slice(0, rowIndex).reverse().find(item =>
//       item && item.patternWidth && item.patternHeight && item.patternThickness && item.filmsId
//     );
//     // 如果当前行有数据,进行比对
//     if (row && row.patternWidth) {
//       const isMatch =
//         row.patternWidth === firstData.width &&
//         row.patternHeight === firstData.height &&
//         row.patternThickness === firstData.thickness &&
//         row.filmsId === firstData.filmsId;
//       return !isMatch ? 'danger-row' : '';
//     }
//   }
//   return '';
// }
// 架子数据对比 (料架1第一行有数据,进行比对,料架2第一行没有数据,进行比对)
const tableRowClassName = ({
  row,
  rowIndex
}: {
  row: any;
  rowIndex: number;
}) => {
  // 获取第一条数据
  const firstData = tableData.value[0];
  // 如果第一条数据存在且状态不是100
  if (firstData && firstData.state !== 100) {
    // 料架1
    if (rowIndex === 0) {
      // 料架1第一行有数据,进行比对
      if (row && row.patternWidth) {
        const isMatch =
          row.patternWidth === firstData.width &&
          row.patternHeight === firstData.height &&
          row.patternThickness === firstData.thickness &&
          row.filmsId === firstData.filmsId;
        return !isMatch ? 'danger-row' : '';
      }
    }
    // 料架2
    else if (rowIndex === 1) {
      const firstRow = tableDataa.value[0];
      if (!firstRow || !firstRow.patternWidth) {
        if (row && row.patternWidth) {
          const isMatch =
            row.patternWidth === firstData.width &&
            row.patternHeight === firstData.height &&
            row.patternThickness === firstData.thickness &&
            row.filmsId === firstData.filmsId;
          return !isMatch ? 'danger-row' : '';
        }
      }
    }
  }
  return '';
}
// 删除任务
const deleteWarehousing = async (row: any) => {
  try {
    // 确认提示
    await ElMessageBox.confirm(
      t('basicData.deletemessage'),
      t('sorter.prompt'),
      {
        confirmButtonText: t('basicData.confirm'),
        cancelButtonText: t('basicData.cancel'),
        type: 'warning',
      }
    );
    // 转换为整数
    const id = Number(row.id);
    const response = await request.post('/loadGlass/up-patten-usage/deleteTask?id=' + id);
    if (response.code === 200) {
      ElMessage.success(response.message);
    } else {
      ElMessage.error(response.message);
    }
  } catch (error) {
    console.error(error);
    // 如果是用户取消操作,不显示错误提示
    if (error !== 'cancel') {
      ElMessage.error('删除失败');
    }
  }
};
</script>
<template>
  <div style="height: 500px;">
    <div>
      <div id="dotClass">
        <!-- <div>{{ $t('basicData.laserprinting') }}</div>
        <i
          :style="{ marginTop: '2px', backgroundColor: markingMachineStatus, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
        <el-button @click="confirmMarkingMachine" style="margin-left: 30px;margin-top: -3px;">{{
          $t('basicData.yes')
        }}
        </el-button>
        <div style="margin-left: 70px;">{{ $t('basicData.cuttingmachine') }}</div>
        <i
          :style="{ marginTop: '2px', backgroundColor: cuttingMachineStatus, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
        <el-button @click="confirmCuttingMachine" style="margin-left: 30px;margin-top: -3px;">{{
          $t('basicData.yes')
        }}
        </el-button>
        <div style="margin-left: 70px;">{{ upstatus }}</div>
        <i
          :style="{ marginTop: '2px', backgroundColor: cuttingMachineStatusColor, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
      -->
      </div>
      <!-- <el-button :disabled="!canSelectProjecta" style="margin-top: 5px;margin-left: 15px;" type="primary"
        @click="selectproject">{{ $t('Mounting.previewproject') }}</el-button> -->
      <!--开始上片-->
      <el-button style="margin-top: 5px;margin-left: 20px;" type="primary" @click="dialogFormVisiblea = true">{{
        $t('basicData.startloading') }}</el-button>
      <el-dialog v-model="dialogFormVisiblea" top="5vh" width="85%">
        <el-table ref="table" style="margin-top: 20px;height: 700px;" :data="tableDatab"
          :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
          <el-table-column prop="deviceId" fixed align="center" :label="$t('film.station')" min-width="80" />
          <el-table-column prop="slot" fixed align="center" :label="$t('film.slot')" min-width="80" />
          <el-table-column prop="patternWidth" align="center" :label="$t('film.width')" min-width="80" />
          <el-table-column prop="patternHeight" align="center" :label="$t('film.height')" min-width="80" />
          <el-table-column prop="patternThickness" align="center" :label="$t('film.thickness')" min-width="80" />
          <el-table-column prop="filmsId" align="center" :label="$t('film.films')" min-width="80" />
          <el-table-column prop="remainQuantity" align="center" :label="$t('film.remainquantity')" min-width="120" />
          <el-table-column align="center" :label="$t('film.enablestate')" min-width="80" prop="state">
            <template #default="scope">
              <el-tag :type="scope.row.state == 1 ? 'success' : 'danger'" @click="toggleEnableState(scope.row)">
                {{ scope.row.state == 1 ? $t('film.start') : $t('film.disable') }}
              </el-tag>
            </template>
          </el-table-column>
          <el-table-column fixed="right" :label="$t('film.operate')" align="center" width="270">
            <template #default="scope">
              <el-input v-model="inputQuantities[scope.row.slot]" type="number" min="0" @input="handleInput(scope.row)"
                :placeholder="$t('basicData.selectquantity')" :disabled="scope.row.slot > 100" style="width: 120px; margin-right: 10px;">
              </el-input>
              <el-button type="text" :disabled="scope.row.slot > 100" @click="handleBind(scope.row)">
                {{ $t('basicData.startloading') }} </el-button>
            </template>
          </el-table-column>
        </el-table>
      </el-dialog>
      <!--暂停-->
      <el-button :disabled="!canSelectProjectc" 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="handlehistorical">{{
        $t('searchOrder.historicaltasks') }}</el-button>
      <!-- <el-select disabled v-model="selectValuesa[1]" clearable :placeholder="$t('Mounting.twoloadingline')"
        style="margin-top: 5px;margin-left: 20px;">
        <el-option :label="$t('Mounting.all')" value="0"></el-option>
        <el-option :label="$t('Mounting.oneloadingline')" value="1"></el-option>
        <el-option :label="$t('Mounting.twoloadingline')" value="2"></el-option>
      </el-select>
      <el-select v-model="selectValuesa[0]" clearable :placeholder="$t('film.taskstatus')"
        style="margin-top: 5px;margin-left: 20px;">
        <el-option :label="$t('Mounting.all')" value="null"></el-option>
        <el-option :label="$t('Mounting.waiting')" value="0"></el-option>
        <el-option :label="$t('Mounting.pass')" value="100"></el-option>
      </el-select>
      <el-button :disabled="!ReportData" type="primary" style="margin-left: 10px;" @click="selectReportData()">{{
        $t('Mounting.setparameters') }}</el-button>-->
      <el-card style="flex: 1;margin-left: 10px;margin-top: 15px;">
        <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
          <el-table height="400" ref="table" :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }"
            :data="tableData">
            <el-table-column prop="engineeringId" :label="$t('Mounting.project')" width="120" align="center" />
            <el-table-column prop="width" :label="$t('film.width')" width="200" align="center" />
            <el-table-column prop="height" :label="$t('film.height')" align="center" />
            <el-table-column prop="thickness" :label="$t('film.thickness')" align="center" />
            <el-table-column prop="filmsId" :label="$t('film.films')" align="center" />
            <el-table-column prop="layoutSequence" :label="$t('Mounting.projectnumber')" align="center" />
            <el-table-column align="center" :label="$t('Mounting.state')" min-width="80" prop="state">
              <template #default="scope">
                <el-tag :type="scope.row.state === 100 ? 'success' : 'warning'" @click="toggleEnableState(scope.row)">
                  {{ scope.row.state === 100 ? $t('Mounting.pass') : $t('Mounting.waiting') }}
                </el-tag>
              </template>
            </el-table-column>
            <el-table-column align="center" :label="$t('film.operate')" min-width="80" prop="state">
              <template #default="scope">
                <el-button type="text" plain @click="deleteWarehousing(scope.row)">{{
                  $t('film.delete') }}</el-button>
              </template>
            </el-table-column>
          </el-table>
        </div>
      </el-card>
      <!--架子-->
      <div style="display: flex;">
        <div style="width: 49%;float: left;margin-left: 300px;">
          <div style="display: flex;">
            <img src="../../assets/shangpianji.png" alt=""
              style="max-width: 20%;max-height: 25%;margin-left: 10%;margin-top: 5%;">
            <el-table :data="tableDataa" border style="margin-top: 10%;margin-left: 8%;" width="500"
              :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }" :row-class-name="tableRowClassName">
              <el-table-column prop="workstationId" align="center" :label="$t('basicData.station')" min-width="65" />
              <el-table-column prop="patternWidth" align="center" :label="$t('basicData.width')" min-width="75" />
              <el-table-column prop="patternHeight" align="center" :label="$t('basicData.height')" min-width="75" />
              <el-table-column prop="filmsId" align="center" :label="$t('basicData.coatingtypes')" min-width="80" />
              <el-table-column prop="remainQuantity" align="center" :label="$t('basicData.quantity')" min-width="80" />
              <el-table-column prop="patternThickness" align="center" :label="$t('basicData.thickness')"
                min-width="60" />
              <el-table-column fixed="right" :label="$t('film.operate')" align="center" width="100">
                <template #default="scope">
                  <el-button :disabled="(!scope.row.patternThickness)" type="text" plain
                    @click="handleptask(scope.row.workstationId)">{{ $t('basicData.rackreset') }}</el-button>
                </template>
              </el-table-column>
            </el-table>
          </div>
        </div>
      </div>
      <!-- 历史任务 -->
      <el-dialog v-model="blindbd" top="5vh" width="95%" @close="iframeUrl = ''">
        <iframe :src="iframeUrl" marginwidth="2000px" marginheight="2000px" width="100%" height="750px"
          frameborder="0"></iframe>
      </el-dialog>
      <el-dialog v-model="blind" top="30vh" width="25%" :title="$t('basicData.startfilm')">
        <template #footer>
          <div id="dialog-footer">
            <el-button type="primary" @click="handleon">
              {{ $t('basicData.confirm') }}
            </el-button>
            <el-button @click="blind = false">{{ $t('basicData.cancel') }}</el-button>
          </div>
        </template>
      </el-dialog>
      <!-- 结束工程 -->
      <!-- <el-dialog v-model="blindb" top="10vh" width="80%">
        <el-table ref="table" style="margin-top: 20px;height: 450px;" :data="tableDatad"
          :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
          <el-table-column prop="engineerId" fixed align="center" :label="$t('basicData.projectnumber')" />
          <el-table-column prop="glassId" fixed align="center" :label="$t('searchOrder.glassID')" />
          <el-table-column prop="temperingLayoutId" fixed align="center" :label="$t('searchOrder.layoutID')" />
          <el-table-column prop="temperingFeedSequence" align="center" :label="$t('searchOrder.picturesequence')" />
          <el-table-column prop="width" align="center" :label="$t('basicData.width')" />
          <el-table-column prop="height" align="center" :label="$t('basicData.height')" />
          <el-table-column prop="thickness" align="center" :label="$t('basicData.thickness')" />
          <el-table-column prop="filmsid" align="center" :label="$t('basicData.coatingtypes')" />
          <el-table-column prop="flowCardId" align="center" :label="$t('searchOrder.processcards')" />
          <el-table-column fixed="right" :label="$t('productStock.operate')" align="center" width="200">
            <template #default="scope">
              <el-button type="text" plain @click="opena(scope.row)">{{ $t('order.dilapidation') }}</el-button>
              <el-button type="text" plain @click="openb(scope.row)">{{ $t('order.takeaway') }}</el-button>
            </template>
          </el-table-column>
        </el-table>
        <template #footer>
          <div id="dialog-footer">
            <el-button type="danger" @click="deleteTask()">{{ $t('searchOrder.deleteTask') }}</el-button>
            <el-button @click="blindb = false">{{ $t('large.close') }}</el-button>
          </div>
        </template>
      </el-dialog> -->
      <el-dialog v-model="blinda" top="24vh" width="30%" :title="$t('basicData.whetherpause')">
        <div style="margin-left: 50px;margin-bottom: 10px;">
          <el-form-item :label="$t('Mounting.loadingline')" :required="true">
            <el-select disabled v-model="stationCell" clearable :placeholder="$t('Mounting.inloadingline')"
              style="margin-left: 20px;">
              <el-option :label="$t('Mounting.all')" value="0"></el-option>
              <el-option :label="$t('Mounting.oneloadingline')" value="1"></el-option>
              <el-option :label="$t('Mounting.twoloadingline')" value="2"></el-option>
            </el-select>
          </el-form-item>
        </div>
        <template #footer>
          <div id="dialog-footer">
            <el-button type="primary" @click="handleup">
              {{ $t('basicData.confirm') }}
            </el-button>
            <el-button @click="blinda = false">{{ $t('basicData.cancel') }}</el-button>
          </div>
        </template>
      </el-dialog>
    </div>
    <el-dialog v-model="dialogFormVisible" top="24vh" width="70%">
      <div class="flex-container" style="margin-left: 50px;margin-bottom: 10px;">
        <el-form-item :label="$t('Mounting.loadingline')" :required="true">
          <el-select disabled v-model="stationCell" clearable :placeholder="$t('Mounting.inloadingline')">
            <el-option :label="$t('Mounting.oneloadingline')" value="1"></el-option>
            <el-option :label="$t('Mounting.twoloadingline')" value="2"></el-option>
          </el-select>
        </el-form-item>
        <el-form-item :label="$t('Mounting.projecta')" :required="true">
          <el-select v-model="selectedProjectNo" filterable clearable :placeholder="$t('basicData.plselectproject')"
            style="width: 220px" @input="handleInputChange">
            <el-option v-for="item in titleSelectJson['engineerId']" :key="item.id" :label="item.projectNo"
              :value="item.projectNo" />
          </el-select>
        </el-form-item>
        <el-form-item :label="$t('Mounting.removalmethoda')" :required="true">
          <el-select v-model="filmRemove" clearable :placeholder="$t('Mounting.removalmethod')">
            <el-option :label="$t('Mounting.noremoval')" value="0"></el-option>
            <el-option :label="$t('Mounting.coarselyground')" value="1"></el-option>
            <el-option :label="$t('Mounting.finegrinding')" value="2"></el-option>
          </el-select>
        </el-form-item>
      </div>
      <template #footer>
        <div id="dialog-footer">
          <el-button type="primary" @click="handlesure">
            {{ $t('basicData.confirm') }}
          </el-button>
          <el-button @click="dialogFormVisible = false">{{ $t('basicData.cancel') }}</el-button>
        </div>
      </template>
    </el-dialog>
  </div>
</template>
<style scoped>
:deep(.el-table .danger-row) {
  background-color: var(--el-color-danger-light-9);
}
.flex-container {
  display: flex;
  align-items: center;
}
.flex-container .el-form-item {
  flex: 1;
  margin-right: 0;
  /* 移除默认的右侧边距 */
}
.flex-container .el-form-item:last-child {
  margin-left: 20px;
  /* 为第二个表单项添加左侧边距 */
}
#dt {
  display: block;
  float: left;
  line-height: 20px;
  margin-left: 100px;
}
#dta {
  display: block;
  float: left;
  line-height: 20px;
  margin-left: 80%;
}
#dialog-footer {
  text-align: center;
  margin-top: -15px;
}
#dotClass {
  display: flex;
  margin-left: 20px;
  size: 50px;
  margin-top: 20px;
  margin-bottom: 10px;
}
</style>
UI-Project/src/views/Slicecage/slicecage.vue
New file
@@ -0,0 +1,1760 @@
<script lang="ts" setup>
import {useI18n} from 'vue-i18n'
import {useRouter} from "vue-router"
import request from "@/utils/request"
import {host, WebSocketHost} from '@/utils/constants'
import {onBeforeUnmount, onMounted, onUnmounted, reactive, ref} from "vue";
import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
import {ElMessage, ElMessageBox} from 'element-plus'
const scanGlass = ref([])
const {t} = useI18n()
let language = ref(localStorage.getItem('lang') || 'zh')
import { inject } from 'vue';
const router = useRouter()
const timeRange = ref([])
const dialogFormVisiblea = ref(false)
const dialogFormVisiblec = ref(false)
const dialogFormVisibled = ref(false)
const dialogFormVisiblee = ref(false)
const dialogFormVisiblef = ref(false)
const dialogFormVisibles = ref(false)
const blindb = ref(false)
const inkageEntity = ref('#911005');
const requestEntity = ref('#911005');
const mesReplyEntity = ref('#911005');
const outInkageEntity = ref('#911005');
const outRequestEntity = ref('#911005');
const tableDataa = ref([])
const tableDatagh = ref([])
const tableDatab = ref([])
const tableDatac = ref([])
const tableDatad = ref([])
const tableDataf = ref([])
const tableDatae = ref([])
const tableDatas = ref([])
const tableDatass = ref([])
const tableDatax = ref([]);
const tableDatalack = ref([])
const tableDataspecify = ref([])
const tableDatacagedetails = ref([])
const selectValuesa = reactive([]);
const carPosition = ref([])
const ganghua = ref('')
const diaodu = ref('')
const flowCardId = ref('')
const filmsId = ref('')
const adjust = ref([]);
const adjusta = ref([]);
const adjustedRects = ref([]);
const adjustedRectsa = ref([]);
const adjustedRectsb = ref([]);
const adjustedRectsc = ref([]);
const subRectsCounts = ref([]);
const subRectsCountsa = ref([]);
const subRectsCountsb = ref([]);
const subRectsCountsc = ref([]);
const currentRow = reactive({}); // 当前行的数据
const currentPage2 = ref(1)
const globalDate = inject('globalDate');
const inputValuesa = reactive({});
const add = ref(false)
const gap = ref('');
const glassId = ref('');
const startSlot = ref('');
const targetSlot = ref('');
const taskStateList = ref('');
const taskTypeList = ref('');
const beginDate = ref('');
const endDate = ref('');
const thickness = ref('');
const width = ref('');
const cell1=ref(true);
const cell2=ref(true);
const cell3=ref(true);
const cell4=ref(true);
const canEdit = ref(true);
const selectedRow = ref(null);
const temperingtotal = ref(0);
const glasstotal = ref(0);
const fulltotals = ref(0);
const temperingengineerId=ref('');
const printFlowCardId = ref('')
const printLayer = ref('')
const printGlassId = ref('')
const open1 = async (row) => {
printFlowCardId.value = row.flowCardId;
printLayer.value = row.layer
printGlassId.value = row.glassId
}
//     setInterval(() => {
//     localStorage.clear(); // 清除所有localStorage数据
// }, 60000);
//  function cleanUp() {
// }
// // 假设我们每2分钟执行一次清理
// setInterval(cleanUp, 1 * 60 * 1000);
const getTableRow = (row,type) =>{
  switch (type) {
    case 'edit' :{
      router.push({path: '/main/returns/createReturns', query: { ReturnID: 'TH24010101' }})
      break
    }
    case 'delete':{
      alert('我接收到子组件传送的删除信息')
      break
    }
  }
}
const handlePageChange2 = (newPage) => {
  currentPage2.value = newPage;
  window.localStorage.setItem('pagenumber', currentPage2.value)
  fetchxiang(currentPage2.value);
};
const handleBindRack = (row) => {
  selectedRow.value = row; // 更新选中的行数据
  currentRow.deviceId  = row.deviceId; // 直接设置响应式属性
  currentRow.slot = row.slot;
  window.localStorage.setItem('deviceId', row.deviceId)
  window.localStorage.setItem('slot', row.slot)
  add.value = true;
};
// 搜索
const searchout = async () => {
  try {
    const response = await request.post('/cacheVerticalGlass/bigStorageCageDetails/selectBigStorageCageDetails',{
      glassId:glassId.value
    });
    if (response.code == 200) {
      tableDataf.value = response.data;
      ElMessage.success(response.message);
    } else {
      ElMessage.error(response.message);
    }
  } catch (error) {
  }
};
// 是否禁用
const toggleEnableState = async (row) => {
  const newState = row.enableState === 1 ? 0 : 1;
  var url="/cacheVerticalGlass/bigStorageCage/updateStorageCageDisabled?slot="+row.slot + "&enableState=" + newState;
      const response = await request.get(url)
  if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
      ElMessage.error(response.message);
      }
  row.enableState = newState;
};
// 是否破损
const broken = async (row) => {
  try  {
  const newState = row.isDamage === 1 ? 0 : 1;
  const response = await request.post('/cacheVerticalGlass/bigStorageCageDetails/bigStorageGlassDamageByGlassId', { glassId: row.glassId });
    if (response.code == 200) {
      ElMessage.success(response.message);
    } else {
      ElMessage.error(response.message);
    }
  row.isDamage = newState;
}
catch (error) {
  }
}
 // 删除
 const opena = async(row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.deletemessage'),
      t('searchOrder.prompt'),
      {
        confirmButtonText: t('searchOrder.yes'),
        cancelButtonText: t('searchOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const response = await request.post("/cacheVerticalGlass/bigStorageCageDetails/deleteBigStorageCageDetails",row)
    if (response.code === 200) {
     tableDataa.value = response.data;
     ElMessage.success(response.message);
      } else {
      ElMessage.error(response.message);
      }
    }
  } catch (error) {
  }
};
 // 破损
 const broke = async(row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.broke'),
      t('searchOrder.prompt'),
      {
        confirmButtonText: t('searchOrder.yes'),
        cancelButtonText: t('searchOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const response = await request.post("/cacheVerticalGlass/bigStorageCageDetails/damageBigStorageCageDetails?status="+8, row)
    if (response.code === 200) {
     tableDataa.value = response.data;
     ElMessage.success(response.message);
      } else {
      ElMessage.error(response.message);
      }
    }
  } catch (error) {
  }
};
// 历史任务
const iframeUrl = ref('');
const handlehistorical = (row) => {
  blindb.value = true;
  iframeUrl.value = `${window.location.origin}/#/Slicecage/slicecagehistory`;
};
 // 拿走
 const brokec = async(row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.brokeb'),
      t('searchOrder.prompt'),
      {
        confirmButtonText: t('searchOrder.yes'),
        cancelButtonText: t('searchOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const response = await request.post("/cacheVerticalGlass/bigStorageCageDetails/damageBigStorageCageDetails?status="+9, row)
    if (response.code === 200) {
     tableDataa.value = response.data;
     ElMessage.success(response.message);
      } else {
      ElMessage.error(response.message);
      }
    }
  } catch (error) {
  }
};
 // 出片
 const outfil = async(row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.outfil'),
      t('searchOrder.prompt'),
      {
        confirmButtonText: t('searchOrder.yes'),
        cancelButtonText: t('searchOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const response = await request.post("/cacheVerticalGlass/bigStorageCageDetails/outBigStorageCageDetails", row)
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
      ElMessage.error(response.message);
      }
    }
  } catch (error) {
  }
};
 // 出片队列破损
 const brokea = async(row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.broke'),
      t('searchOrder.prompt'),
      {
        confirmButtonText: t('searchOrder.yes'),
        cancelButtonText: t('searchOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const response = await request.post("/cacheVerticalGlass/temperingGlassInfo/damageTemperingGlassInfo?status="+8, row)
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
      ElMessage.error(response.message);
      }
    }
  } catch (error) {
  }
};
 // 指定钢化
 const brokee = async(row,temperingFeedSequence) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.specifytemperinga'),
      t('searchOrder.prompt'),
      {
        confirmButtonText: t('searchOrder.yes'),
        cancelButtonText: t('searchOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const response = await request.post("/cacheVerticalGlass/bigStorageCageDetails/TemperingGlass",{
        engineerId: row.engineerId,
        temperingLayoutId: row.temperingLayoutId,
        temperingFeedSequence:temperingFeedSequence
    });
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
      ElMessage.error(response.message);
      }
    }
  } catch (error) {
  }
  handleganghua();
};
 // 指定工程
 const brokek = async(row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.specifytemperinga'),
      t('searchOrder.prompt'),
      {
        confirmButtonText: t('searchOrder.yes'),
        cancelButtonText: t('searchOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const response = await request.post("/cacheVerticalGlass/bigStorageCageDetails/appointTemperingEngineerId?engineerId=" + row.engineerId);
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
      ElMessage.error(response.message);
      }
    }
  } catch (error) {
  }
};
// 取消指定
const broked = async() => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.specifytemperinga'),
      t('searchOrder.prompt'),
      {
        confirmButtonText: t('searchOrder.yes'),
        cancelButtonText: t('searchOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const response = await request.post("/cacheVerticalGlass/bigStorageCageDetails/cancelTemperingTask");
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
      ElMessage.error(response.message);
      }
    }
  } catch (error) {
  }
};
 // 指定流程卡
 const brokes = async(row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.specifytemperinga'),
      t('searchOrder.prompt'),
      {
        confirmButtonText: t('searchOrder.yes'),
        cancelButtonText: t('searchOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const response = await request.post("/cacheVerticalGlass/bigStorageCageDetails/appointFlowCard",{
        flowCardId: row.flow_card_id,
        layer: row.layer,
    });
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
      ElMessage.error(response.message);
      }
    }
  } catch (error) {
  }
};
// 出片队列拿走
const brokeb = async(row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.brokeb'),
      t('searchOrder.prompt'),
      {
        confirmButtonText: t('searchOrder.yes'),
        cancelButtonText: t('searchOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const response = await request.post("/cacheVerticalGlass/temperingGlassInfo/damageTemperingGlassInfo?status="+9, row)
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
      ElMessage.error(response.message);
      }
    }
  } catch (error) {
  }
};
// 出片队列删除
const deletea = async(row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.deletemessage'),
      t('searchOrder.prompt'),
      {
        confirmButtonText: t('searchOrder.yes'),
        cancelButtonText: t('searchOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const dataToSend = {
        ...row,
        status: 1
      };
      const response = await request.post("/cacheVerticalGlass/temperingGlassInfo/deleteTemperingGlassInfo", dataToSend)
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
      ElMessage.error(response.message);
      }
    }
  } catch (error) {
  }
};
// 完成任务
const finish = async(row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.fin'),
      t('searchOrder.prompt'),
      {
        confirmButtonText: t('searchOrder.yes'),
        cancelButtonText: t('searchOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const response = await request.post("/cacheVerticalGlass/bigStorageCageDetails/finishBigStorageCageDetails", row)
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
      ElMessage.error(response.message);
      }
    }
  } catch (error) {
  }
};
// 确认添加
const finisha = async(row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.sureadda'),
      t('searchOrder.prompt'),
      {
        confirmButtonText: t('searchOrder.yes'),
        cancelButtonText: t('searchOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
    let deviceId = window.localStorage.getItem('deviceId')
    let slot = window.localStorage.getItem('slot')
      const dataToSend = {
        ...row,
        deviceId: deviceId,
        slot: slot
      };
  const response = await request.post("/cacheVerticalGlass/bigStorageCageDetails/insertBigStorageCageDetails", dataToSend)
    if (response.code === 200) {
      tableDataa.value = response.data;
      add.value = false;
      ElMessage.success(response.message);
      glassId.value = '';
      tableDataf.value = '';
      } else {
      ElMessage.error(response.message);
      }
    }
  } catch (error) {
  }
};
const handleganghua = () => {
  dialogFormVisiblec.value = true;
  fetchFlow();
};
const handlexiang = () => {
  dialogFormVisiblea.value = true;
  fetchxiang();
  currentPage2.value = 1;
  window.localStorage.setItem('pagenumber', currentPage2.value)
  filmsId.value = ''
  flowCardId.value = ''
};
// 缺片数量
const handlelack = (row) => {
  const { engineerId, temperingLayoutId } = row;
  fetchlack(engineerId, temperingLayoutId);
  dialogFormVisibled.value = true;
};
// 笼内详情
const handlecagedetails = (row) => {
  const { engineerId, temperingLayoutId } = row;
  fetchcagedetails(engineerId, temperingLayoutId);
  dialogFormVisiblef.value = true;
};
// 钢化查询
onMounted(async () => {
  try {
    var url="/cacheVerticalGlass/bigStorageCageDetails/selectTemperingGlass?isTempering="+1;
    const response = await request.post(url)
    if (response.code === 200) {
      ElMessage.success(response.message);
      tableDatagh.value = response.data
    } else {
      ElMessage.warning(response.msg)
    }
  } catch (error) {
  }
});
// 理片笼信息
const fetchxiang = async () => {
  try {
    const response = await request.post('/cacheVerticalGlass/bigStorageCage/querybigStorageCageDetail',{
        // deviceId: page,
        filmsId: filmsId.value,
        flowCardId: flowCardId.value,
    })
    if (response.code === 200) {
      ElMessage.success(response.message);
      tableDataa.value = response.data
    } else {
      ElMessage.warning(response.msg)
    }
  } catch (error) {
  }
}
const fetchxianga = async () => {
  let page = window.localStorage.getItem('pagenumber')
  try {
    const response = await request.post('/cacheVerticalGlass/bigStorageCage/querybigStorageCageDetail',{
        deviceId: page,
        filmsId: filmsId.value,
        flowCardId: flowCardId.value,
    })
    if (response.code === 200) {
      ElMessage.success(response.message);
      tableDataa.value = response.data
      // filmsId.value = ''
      // flowCardId.value = ''
    } else {
      ElMessage.warning(response.msg)
    }
  } catch (error) {
  }
}
// 非钢化流程卡
const fetchFlows = async () => {
  try {
    var url="/cacheVerticalGlass/bigStorageCageDetails/selectTemperingGlass?isTempering="+0;
    const response = await request.post(url)
    if (response.code === 200) {
      ElMessage.success(response.message);
      tableDatas.value = response.data
    } else {
      ElMessage.warning(response.msg)
    }
  } catch (error) {
  }
}
// 缺片数量
const fetchlack = async (engineerId, temperingLayoutId) => {
  try  {
    const response = await request.post('/cacheVerticalGlass/bigStorageCageDetails/queryLackGlassInfo',{
        engineerId: engineerId,
        temperingLayoutId: temperingLayoutId,
    })
    if (response.code == 200) {
      ElMessage.success(response.message);
      tableDatalack.value = response.data
    } else {
      ElMessage.error(response.message);
    }
}
catch (error) {
    // 处理错误
  }
}
// 笼内详情
const fetchcagedetails = async (engineerId, temperingLayoutId) => {
  try  {
    const response = await request.post('/cacheVerticalGlass/bigStorageCageDetails/queryRealGlassInfo',{
        engineerId: engineerId,
        temperingLayoutId: temperingLayoutId,
    })
    if (response.code == 200) {
      ElMessage.success(response.message);
      tableDatacagedetails.value = response.data
    } else {
      ElMessage.error(response.message);
    }
}
catch (error) {
  }
}
const fetchFlow = async () => {
  try  {
    var url="/cacheVerticalGlass/bigStorageCageDetails/selectTemperingGlass?isTempering="+1;
    const response = await request.post(url)
    if (response.code == 200) {
      ElMessage.success(response.message);
      tableDatagh.value = response.data
      temperingtotal.value = response.data.length
      let totalCount = 0;
      let fullCount = 0;
      response.data.forEach(item => {
        totalCount += item.realCount || 0;
        if(item.lackCount==0){
          fullCount+=1;
        }
      });
      glasstotal.value = totalCount;
      fulltotals.value = fullCount;
    } else {
      ElMessage.error(response.message);
    }
}
catch (error) {
  }
}
function handleRowClick(row) {
  selectedRow.value = row; // 更新选中的行数据
}
// 钢化开关
  const handleChange = async () => {
  try  {
    const body = {
      flag: ganghua.value,
    };
    var url="/cacheVerticalGlass/bigStorageCageDetails/temperingSwitch?flag="+ganghua.value;
  const response = await request.post(url)
    if (response.code == 200) {
      ElMessage.success(response.message);
      ganghua.value = response.data
    }else {
      ElMessage.error(response.message);
      }
}
catch (error) {
  }
}
// 调度开关
const handlediaodu = async () => {
  try  {
    const body = {
      flag: diaodu.value,
    };
    var url="/cacheVerticalGlass/bigStorageCageDetails/dispatchSwitch?flag="+diaodu.value;
  const response = await request.post(url)
    if (response.code == 200) {
      ElMessage.success(response.message);
      diaodu.value = response.data
    }else {
      ElMessage.error(response.message);
      }
}
catch (error) {
  }
}
// 任务重置
const handleptask = async() => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.partasks'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
 if (confirmResult === 'confirm') {
  const response = await request.post('/cacheVerticalGlass/bigStorageCage/resetCage')
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
      ElMessage.error(response.msg);
      }
    }
  } catch (error) {
  }
};
let socket = null;
const socketUrl = `ws://${WebSocketHost}:${host}/api/cacheVerticalGlass/api/talk/slicecage`;
const handleMessage = (data) => {
  if(data.bigStorageSummary!=null){
    tableDatass.value = data.bigStorageSummary[0]
  }else{
    tableDatass.value = ''
      }
  if (data.inkageEntity != null) {
    inkageEntity.value = data.inkageEntity[0] == true ? 'green' : '#911005';
  }
  if (data.requestEntity != null) {
    requestEntity.value = data.requestEntity == 1 ? 'green' : '#911005';
  }
  if (data.mesReplyEntity != null) {
    mesReplyEntity.value = data.mesReplyEntity == 1 ? 'green' : '#911005';
  }
  if (data.outInkageEntity != null) {
    outInkageEntity.value = data.outInkageEntity[0] == true ? 'green' : '#911005';
  }
  if (data.outRequestEntity != null) {
    outRequestEntity.value = data.outRequestEntity == 1 ? 'green' : '#911005';
  }
    if (data.scanGlass != null) {
    scanGlass.value = data.scanGlass[0];
    let width = scanGlass.value.width;
    let height = scanGlass.value.height;
    if (width < height) {
      scanGlass.value.width = height;
      scanGlass.value.height = width;
    }
    if (autoPrint.value == true && browser.value == true) {
      open1(scanGlass);
    }
  }
  //当前指定工程
  if(data.bigStorageCageDetailsOutTask!=null){
    temperingengineerId.value=data.temperingengineerId[0];
  }
  if(data.bigStorageCageDetailsOutTask!=null){
    tableDatac.value = data.bigStorageCageDetailsOutTask[0]
    adjusta.value = data.bigStorageCageDetailsOutTask[0].filter(rect => rect.slot !== null && rect.slot !== undefined);
  } else {
    tableDatac.value = '',
    adjusta.value = ''
  }
  if(data.bigStorageCageDetailsFeedTask!=null){
    tableDatax.value = data.bigStorageCageDetailsFeedTask[0]
  } else {
    tableDatax.value = ''
  }
  if(data.bigStorageCageDetailsFeedTask!=null){
    tableDatad.value = data.bigStorageCageDetailsFeedTask[0]
    adjust.value = data.bigStorageCageDetailsFeedTask[0].filter(rect => rect.slot !== null && rect.slot !== undefined);
  }else{
    tableDatad.value = ''
      }
if(data.temperingGlassInfoList!=null){
  tableDatab.value = data.temperingGlassInfoList[0]
}else{
    tableDatab.value = ''
      }
if(data.bigStorageCageUsage!=null){
  tableDatae.value = data.bigStorageCageUsage[0]
}else{
    tableDatae.value = ''
      }
if(data.carPostion!=null){
  carPosition.value = data.carPostion[0]
}else{
  carPosition.value = ''
  }
if(data.temperingSwitch!=null){
  ganghua.value = data.temperingSwitch[0]
}else{
  ganghua.value = ''
  }
if(data.dispatchSwitch!=null){
  diaodu.value = data.dispatchSwitch[0]
}else{
  diaodu.value = ''
  }
  if(data.bigStorageCageInfos!=null){
  adjustedRects.value = data.bigStorageCageInfos[0][1].map((rect, index) => ({
    id: index + 1,
    height: 20/55,
    top: 53/55,
  }));
subRectsCounts.value = data.bigStorageCageInfos[0][1].map(rect => rect.count);
adjustedRectsa.value = data.bigStorageCageInfos[0][2].map((rect, index) => ({
    id: index + 1,
    height: 20/55,
    top: 53/55,
  }));
subRectsCountsa.value = data.bigStorageCageInfos[0][2].map(rect => rect.count);
adjustedRectsb.value = data.bigStorageCageInfos[0][3].map((rect, index) => ({
    id: index + 1,
    height: 20/55,
    top: 53/55,
  }));
subRectsCountsb.value = data.bigStorageCageInfos[0][3].map(rect => rect.count);
adjustedRectsc.value = data.bigStorageCageInfos[0][4].map((rect, index) => ({
    id: index + 1,
    height: 20/55,
    top: 53/55,
  }));
subRectsCountsc.value = data.bigStorageCageInfos[0][4].map(rect => rect.count);
  }else{
    adjustedRects.value = '',
    adjustedRectsa.value = '',
    adjustedRectsb.value = '',
    adjustedRectsc.value = ''
  }
};
// 计算每个大矩形的样式
const rectStyle = (rect, index) => ({
  position: 'absolute',
  width: '170px',
  right: '0px',
  top: `${index*rect.top}px`,
  height: `${rect.height}px`,
});
// 计算每个小矩形的样式和数量
const getSubRects = (rectIndex) => {
  const count = subRectsCounts.value[rectIndex];
  const subRects = [];
  for (let i = 0; i < count; i++) {
    subRects.push({});
  }
  return subRects;
};
// 计算每个小矩形的样式
const subRectStyle = (rectIndex, subIndex) => {
  const width = '18px';
  const marginRight = '8px';
  const totalWidth = 6 * (parseInt(width) + parseInt(marginRight));
  const right = `${(subIndex * (parseInt(width) + parseInt(marginRight))) / totalWidth * 100}%`;
  return {
    position: 'absolute',
    width,
    height: '100%',
    marginRight,
    top: '0px',
    backgroundColor: '#911005',
    right,
  };
};
// 计算每个大矩形的样式
const rectStylea = (rect, index) => ({
  position: 'absolute',
  width: '170px',
  right: '0px',
  top: `${index*rect.top}px`,
  height: `${rect.height}px`,
});
// 计算每个小矩形的样式和数量
const getSubRectsa = (rectIndex) => {
  const count = subRectsCountsa.value[rectIndex];
  const subRects = [];
  for (let i = 0; i < count; i++) {
    subRects.push({});
  }
  return subRects;
};
// 计算每个小矩形的样式
const subRectStylea = (rectIndex, subIndex) => {
  const width = '18px';
  const marginRight = '8px';
  const totalWidth = 6 * (parseInt(width) + parseInt(marginRight));
  const right = `${(subIndex * (parseInt(width) + parseInt(marginRight))) / totalWidth * 100}%`;
  return {
    position: 'absolute',
    width,
    height: '100%',
    marginRight,
    top: '0px',
    backgroundColor: '#911005',
    right,
  };
};
// 计算每个大矩形的样式
const rectStyleb = (rect, index) => ({
  position: 'absolute',
  width: '170px',
  right: '0px',
  top: `${index*rect.top}px`,
  height: `${rect.height}px`,
});
// 计算每个小矩形的样式和数量
const getSubRectsb = (rectIndex) => {
  const count = subRectsCountsb.value[rectIndex];
  const subRects = [];
  for (let i = 0; i < count; i++) {
    subRects.push({});
  }
  return subRects;
};
// 计算每个小矩形的样式
const subRectStyleb = (rectIndex, subIndex) => {
  const width = '18px';
  const marginRight = '8px';
  const totalWidth = 6 * (parseInt(width) + parseInt(marginRight));
  const right = `${(subIndex * (parseInt(width) + parseInt(marginRight))) / totalWidth * 100}%`;
  return {
    position: 'absolute',
    width,
    height: '100%',
    marginRight,
    top: '0px',
    backgroundColor: '#911005',
    right,
  };
};
// 计算每个大矩形的样式
const rectStylec = (rect, index) => ({
  position: 'absolute',
  width: '170px',
  right: '0px',
  top: `${index*rect.top}px`,
  height: `${rect.height}px`,
});
// 计算每个小矩形的样式和数量
const getSubRectsc = (rectIndex) => {
  const count = subRectsCountsc.value[rectIndex];
  const subRects = [];
  for (let i = 0; i < count; i++) {
    subRects.push({});
  }
  return subRects;
};
// 计算每个小矩形的样式
const subRectStylec = (rectIndex, subIndex) => {
  const width = '18px';
  const marginRight = '8px';
  const totalWidth = 6 * (parseInt(width) + parseInt(marginRight));
  const right = `${(subIndex * (parseInt(width) + parseInt(marginRight))) / totalWidth * 100}%`;
  return {
    position: 'absolute',
    width,
    height: '100%',
    marginRight,
    top: '0px',
    backgroundColor: '#911005',
    right,
  };
};
// 格式化后端时间并计算一周前的时间
const defaultTime = ref<[Date, Date]>([new Date(), new Date()]);
function parseAndSetTime() {
  const backendTime = new Date(globalDate);
  const oneWeekAgo = new Date(backendTime.getTime() - 7 * 24 * 60 * 60 * 1000); // 减去7天
  oneWeekAgo.setHours(0, 0, 0, 0);
  timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)];
  window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
}
  onMounted(() => {
  socket = initializeWebSocket(socketUrl, handleMessage);
  parseAndSetTime();
});
  onUnmounted(() => {
    if (socket) {
    closeWebSocket(socket);
    }
    });
function getStatusType(enableState: number) {
  switch (enableState) {
    case 100:
      return 'success';
    case 102:
      return 'warning';
  }
}
function getStatusText(enableState: number) {
  switch (enableState) {
    case 100:
      return t('searchOrder.zailong');
    case 102:
      return t('searchOrder.rengongxp');
  }
}
function getStatusTypea(ishorizontal: number) {
  switch (ishorizontal) {
    case 0:
      return 'warning';
    case 1:
      return 'success';
  }
}
function getStatusTexta(ishorizontal: number) {
  switch (ishorizontal) {
    case 0:
      return t('searchOrder.noaccept');
    case 1:
    return t('searchOrder.accept');
  }
}
function getStatusTypeb(state: number) {
  switch (state) {
    case 0:
      return 'success';
    case 1:
      return 'primary';
  }
}
function getStatusTextb(state: number) {
  switch (state) {
    case 0:
      return t('searchOrder.filmcomplete');
    case 1:
      return t('searchOrder.waiting');
    case 2:
    return t('searchOrder.waiting');
  }
}
function getcasOnea(isSame) {
  switch (isSame) {
    case 1:
      return 'danger';
    case 0:
      return 'info';
  }
}
function getStatuscasOnea(isSame) {
  switch (isSame) {
    case 1:
      return t('searchOrder.same');
    case 0:
      return t('searchOrder.notsame');
  }
}
function tableRowClassName({ row }) {
  if (row.isSame === 1) {
    return 'row-red-background';
  }
  return '';
}
// 格式化时间戳为年月日时间字符串的函数
function formatTimestamp(timestamp) {
  const date = new Date(timestamp);
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始,需要加1,并补零
  const day = String(date.getDate()).padStart(2, '0'); // 补零
  const hours = String(date.getHours()).padStart(2, '0'); // 补零(如果需要显示时间)
  const minutes = String(date.getMinutes()).padStart(2, '0'); // 补零(如果需要显示时间)
  const seconds = String(date.getSeconds()).padStart(2, '0'); // 补零(如果需要显示时间)
  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
onBeforeUnmount(() => {
  closeWebSocket();
});
</script>
<template>
  <div style="height: 600px;">
    <el-button style="margin-top: 7px;margin-left: 10px;" id="searchButton" type="primary" @click="handlexiang">{{ $t('searchOrder.cageinformation') }}</el-button>
    <el-button style="margin-top: 7px;margin-left: 10px;" id="searchButton" type="success" @click="handlehistorical">{{ $t('searchOrder.historicaltasks') }}</el-button>
    <el-button style="margin-top: 7px;margin-left: 10px;" id="searchButton" type="warning" @click="handleganghua">{{ $t('searchOrder.temperingqueries') }}</el-button>
    <el-button style="margin-top: 7px;margin-left: 10px;" id="searchButton" type="info" @click="dialogFormVisibles=true;fetchFlows()">{{ $t('searchOrder.searchlayout') }}</el-button>
    <el-button style="margin-top: 7px;margin-left: 10px;" id="searchButton" type="danger" @click="handleptask()">{{ $t('searchOrder.partask') }}</el-button>
    <el-switch style="margin-top: 7px;margin-left: 10px;" v-model="ganghua" class="mb-2" :inactive-text="$t('searchOrder.temperedswitch')" @change="handleChange" />
    <el-switch style="margin-top: 7px;margin-left: 10px;" v-model="diaodu" class="mb-2" :inactive-text="$t('searchOrder.Schedulingswitch')" @change="handlediaodu" />
    <div id="dotClass">
        <div>{{ $t('searchOrder.inkageEntity') }}</div>
        <i :style="{ marginTop: '2px', backgroundColor: inkageEntity, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
        <div style="margin-left: 70px;">{{ $t('searchOrder.requestEntity') }}</div>
        <i :style="{ marginTop: '2px', backgroundColor: requestEntity, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
        <div style="margin-left: 70px;">{{ $t('searchOrder.mesReplyEntity') }}</div>
        <i :style="{ marginTop: '2px', backgroundColor: mesReplyEntity, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
        <div style="margin-left: 70px;">{{ $t('searchOrder.outInkageEntity') }}</div>
        <i :style="{ marginTop: '2px', backgroundColor: outInkageEntity, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
        <div style="margin-left: 70px;">{{ $t('searchOrder.outRequestEntity') }}</div>
        <i :style="{ marginTop: '2px', backgroundColor: outRequestEntity, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
  </div>
    <div class="table-container">
    <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;">
      <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;max-height: 300px;">
       <el-table height="300px" ref="table"
        :row-class-name="tableRowClassName"
        :data="tableDatax" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
          <el-table-column prop="glassId" align="center" :label="$t('searchOrder.intoglassid')" min-width="140" />
          <el-table-column prop="startSlot" align="center" :label="$t('searchOrder.startposition')" min-width="120" />
          <el-table-column prop="targetSlot" align="center" :label="$t('searchOrder.targetlocation')" min-width="120" />
          <el-table-column prop="taskState" align="center" :label="$t('searchOrder.taskstatus')" min-width="120">
          <template #default="scope">
            <el-tag type="success" >{{ scope.row.taskState==0? $t('searchOrder.filmenter') : $t('searchOrder.infilm') }}</el-tag>
          </template>
          </el-table-column>
          <el-table-column prop="isSame" align="center" :label="$t('searchOrder.whethersame')" min-width="120">
          <template #default="scope">
        <el-tag :type="getcasOnea(scope.row.isSame)">
          {{ getStatuscasOnea(scope.row.isSame) }}
        </el-tag>
      </template>
          </el-table-column>
        </el-table>
       </div>
    </el-card>
    <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;">
      <el-table height="300px" ref="table"
       :data="tableDatac" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
         <el-table-column prop="glassId" align="center" :label="$t('searchOrder.outputglassID')" min-width="140" />
         <el-table-column prop="startSlot" align="center" :label="$t('searchOrder.startposition')" min-width="120" />
         <el-table-column prop="targetSlot" align="center" :label="$t('searchOrder.targetlocation')" min-width="120" />
         <el-table-column prop="taskState" align="center" :label="$t('searchOrder.taskstatus')" min-width="157">
           <template #default="scope">
             <el-tag type="success" >{{ scope.row.taskState==0? $t('searchOrder.filmenter') : $t('searchOrder.infilm') }}</el-tag>
           </template>
         </el-table-column>
       </el-table>
            </el-card>
  </div>
    <div style="padding: 10px;display: flex;height:130px;">
            <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>
               </el-col>
               <hr style="width:80%;margin: 0 auto;" />
               <el-col style="text-align:left;display:flex;justify-content: space-between;align-items: center;">
                 <span>{{ $t('searchOrder.free') }}</span><span>{{ item.count }}</span>
               </el-col>
             </div>
    </div>
<!-- // 父级框 -->
<div class="img-dlpl" >
    <div class="img-car1" :style="'z-index:999;left:290px;top:' + 350*carPosition[0] + 'px;position:absolute;'">
      <div
      v-for="(rect, index) in adjusta"
      :key="rect.id"
      :style="{
       width: '30px',
       height: '5px',
       backgroundColor: '#409EFF',
       marginLeft: 5+ `px`,
       top: '10px',
       }"
    >
    </div>
    </div>
    <div class="img-car4" :style="'z-index:999;left:735px;top:' + 350*carPosition[1] + 'px;position:absolute;'">
      <div
      v-for="(rect, index) in adjust"
      :key="rect.id"
      :style="{
       width: '30px',
       height: '5px',
       backgroundColor: '#409EFF',
       marginLeft: 5+ `px`,
       top: '10px',
       }"
    >
    </div>
    </div>
    <div style="position: relative;">
    <div v-show="cell1" style="width: 170px;height: 53px;position: relative;top:63px;left: 525px;">
      <div v-for="(rect, rectIndex) in adjustedRects" :key="rect.id" :style="rectStyle(rect, rectIndex)">
    <div
      v-for="(subRect, subIndex) in getSubRects(rectIndex)"
      :key="subIndex"
      :style="subRectStyle(rectIndex, subIndex)"
    ></div>
    </div>
    </div>
 <div v-show="cell2" style="width: 170px;height: 53px;position: relative;top:67px;left: 525px;">
    <div v-for="(rect, rectIndex) in adjustedRectsa" :key="rect.id" :style="rectStylea(rect, rectIndex)">
    <div
      v-for="(subRect, subIndex) in getSubRectsa(rectIndex)"
      :key="subIndex"
      :style="subRectStylea(rectIndex, subIndex)"
    ></div>
    </div>
    </div>
  <div v-show="cell3" style="width: 170px;height: 53px;position: relative;top:72px;left: 525px;">
    <div v-for="(rect, rectIndex) in adjustedRectsb" :key="rect.id" :style="rectStyleb(rect, rectIndex)">
    <div
      v-for="(subRect, subIndex) in getSubRectsb(rectIndex)"
      :key="subIndex"
      :style="subRectStyleb(rectIndex, subIndex)"
    ></div>
    </div>
    </div>
  <div v-show="cell4" style="width: 170px;height: 53px;position: relative;top:77px;left: 525px;">
    <div v-for="(rect, rectIndex) in adjustedRectsc" :key="rect.id" :style="rectStylec(rect, rectIndex)">
    <div
      v-for="(subRect, subIndex) in getSubRectsc(rectIndex)"
      :key="subIndex"
      :style="subRectStylec(rectIndex, subIndex)"
    ></div>
    </div>
    </div>
</div>
</div>
<el-card style="flex: 1;margin-left: 1220px;margin-top: -510px;">
      <div style="width: 100%; height: calc(100% - 35px); overflow-y: auto;max-height: 420px;">
       <el-table height="420px" ref="table" border
       :data="tableDatass" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
         <el-table-column fixed prop="engineerId" align="center" :label="$t('Mounting.project')" min-width="100" />
         <el-table-column prop="countTemp" align="center" :label="$t('searchOrder.totalfurnaces')" min-width="68" />
         <el-table-column prop="fullTemp" align="center" :label="$t('searchOrder.furnaces')" min-width="82" />
         <el-table-column prop="countGlass" align="center" :label="$t('searchOrder.cagesnumber')" min-width="82" />
         <el-table-column prop="area" align="center" :label="$t('large.are')" min-width="70" />
         <el-table-column prop="countSlot" align="center" :label="$t('searchOrder.slotnumber')" min-width="96" />
         <el-table-column prop="percent" align="center" :label="$t('searchOrder.progress')" min-width="80" />
       </el-table>
       </div>
    </el-card>
  </div>
  <el-dialog v-model="add" top="10vh" width="70%" :title="$t('searchOrder.addcage')" >
    <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.tida')"  style="width: 14vw">
                {{ currentRow.deviceId }}
              </el-form-item>
              </div>
          </el-col>
          <el-col :span="5">
            <div id="dta" style="font-size: 15px;">
          <el-form-item :label="$t('searchOrder.gridnumbera')" style="width: 14vw">
                {{ currentRow.slot }}
              </el-form-item>
              </div>
          </el-col>
        </el-row>
      </el-form>
    </div>
      <div style="margin-top: -20px;margin-bottom: 40px;margin-left: 30px">
          <el-input v-model="glassId"   :placeholder="$t('searchOrder.inputid')" clearable style="width: 200px;">
          </el-input>
          <el-button type="primary" plain style="margin-left: 10px;" @click="searchout">{{ $t('searchOrder.search') }}</el-button>
    </div>
    <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;max-height: 200px;">
        <el-table height="100%" ref="table"
        :data="tableDataf" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
          <el-table-column prop="glassId" align="center" :label="$t('searchOrder.glassID')" min-width="120" />
          <el-table-column prop="sequence" align="center" :label="$t('searchOrder.pieceingrid')" min-width="180" />
          <el-table-column prop="flowCardId" align="center" :label="$t('searchOrder.cardnumber')" min-width="150" />
          <el-table-column prop="glassType" align="center" :label="$t('searchOrder.typeglass')" min-width="150"/>
          <el-table-column prop="width" align="center" :label="$t('searchOrder.width')" min-width="150"/>
          <el-table-column prop="height" align="center" :label="$t('searchOrder.height')" min-width="150"/>
          <el-table-column prop="thickness" align="center" :label="$t('searchOrder.thickness')" min-width="150"/>
          <el-table-column prop="temperingLayoutId" align="center" :label="$t('searchOrder.layoutID')" min-width="150"/>
          <el-table-column prop="temperingFeedSequence" align="center" :label="$t('searchOrder.picturesequence')" min-width="150"/>
          <el-table-column
          align="center"
            :label="$t('searchOrder.startstatus')"
            min-width="80"
            prop="state"
          >
          <template #default="scope">
          <el-tag
            :type="scope.row.state === 1 ? 'success' : 'danger'"
          >
          {{ scope.row.state === 1 ? $t('searchOrder.enable') : $t('searchOrder.disable') }}
          </el-tag>
        </template>
          </el-table-column>
          <el-table-column prop="gap" align="center" :label="$t('searchOrder.glassgaps')" min-width="150"/>
          <el-table-column fixed="right" :label="$t('searchOrder.operate')" align="center" width="150">
            <template #default="scope">
              <el-button type="text" plain @click="finisha(scope.row)">{{ $t('searchOrder.sureadd') }}</el-button>
            </template>
        </el-table-column>
        </el-table>
      </div>
  </el-dialog>
<el-dialog v-model="dialogFormVisiblea" top="2vh" width="95%" :title="$t('searchOrder.cageinformation')">
  <div style="display: flex;">
    <el-input v-model="flowCardId" clearable style="margin-left: 10px;margin-bottom: 10px;width: 240px;" :placeholder="$t('searchOrder.incardnumber')" />
    <el-input v-model="filmsId" clearable style="margin-left: 10px;margin-bottom: 10px;width: 240px;" :placeholder="$t('film.infilms')"/>
    <el-button type="primary" style="margin-left: 10px;margin-bottom: 10px;" @click="fetchxianga">
      {{$t('reportmanage.inquire')}}</el-button>
  </div>
    <el-table
          :data="tableDataa"
          @row-click="handleRowClick"
          height="700"
          @expand-change="handleExpandChange"
          row-key="id"
          default-expand-all
          :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"
        >
          <el-table-column type="expand">
            <template #default="props">
              <div v-if="props.row.bigStorageCageDetails && props.row.bigStorageCageDetails.length">
                <el-table
                  :data="props.row.bigStorageCageDetails"
                  border
                  style="width: 98%;margin-left: 20px;"
                  row-key="id"
                  :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"
                >
          <!-- <el-table-column prop="menuName" label="二级菜单栏" align="center" min-width="140" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"/>   -->
          <el-table-column prop="glassId" :label="$t('searchOrder.glassID')" align="center" min-width="120"/>
          <el-table-column prop="flowCardId" align="center" :label="$t('searchOrder.cardnumber')" min-width="130" />
          <el-table-column prop="filmsId" align="center" :label="$t('searchOrder.coatingtypes')" min-width="80" />
          <!-- <el-table-column prop="glassType" align="center" :label="$t('searchOrder.typeglass')" min-width="80" /> -->
          <el-table-column prop="width" align="center" :label="$t('searchOrder.width')" min-width="80" />
          <el-table-column prop="height" align="center" :label="$t('searchOrder.height')" min-width="80" />
          <el-table-column prop="thickness" align="center" :label="$t('searchOrder.thickness')" min-width="80" />
          <el-table-column prop="temperingLayoutId" align="center" :label="$t('searchOrder.layoutID')" min-width="100" />
          <el-table-column prop="temperingFeedSequence" align="center" :label="$t('searchOrder.picturesequence')" min-width="120" />
          <el-table-column
            align="center"
            :label="$t('searchOrder.startstatus')"
            min-width="80"
            prop="state"
          >
          <template #default="scope">
        <el-tag :type="getStatusType(scope.row.state)">
          {{ getStatusText(scope.row.state) }}
        </el-tag>
      </template>
          </el-table-column>
          <el-table-column prop="gap" align="center" :label="$t('searchOrder.glassgaps')" min-width="80" />
           <el-table-column fixed="right" :label="$t('searchOrder.operate')" align="center"  min-width="220">
            <template #default="scope">
              <el-button type="text" plain @click="broke(scope.row)">{{ $t('searchOrder.breakage') }}</el-button>
              <el-button type="text" plain @click="brokec(scope.row)">{{ $t('searchOrder.takeout') }}</el-button>
              <el-button type="text" plain @click="opena(scope.row)">{{ $t('searchOrder.delete') }}</el-button>
              <el-button type="text"
              :disabled="!((props.row.bigStorageCageDetails[0].state !== 102 && scope.$index == 0 ) || (props.row.bigStorageCageDetails[(scope.$index - 1)<0?0:scope.$index-1].state==102)&&(scope.row.state!=102))"
               plain @click="outfil(scope.row)">
               {{ $t('searchOrder.outfilm') }}
              </el-button>
            </template>
        </el-table-column>
                </el-table>
              </div>
            </template>
          </el-table-column>
          <el-table-column prop="id" :label="$t('searchOrder.cagetableID')" align="center" min-width="90"/>
          <el-table-column prop="deviceId" align="center" :label="$t('searchOrder.cagenumber')" min-width="100" />
          <el-table-column prop="slot" align="center" :label="$t('searchOrder.gridnumber')" min-width="150" />
          <el-table-column
          align="center"
            :label="$t('searchOrder.startstatus')"
            min-width="80"
            prop="enableState"
          >
          <template #default="scope">
          <el-tag
            :type="scope.row.enableState === 1 ? 'success' : 'danger'"
            @click="toggleEnableState(scope.row)"
          >
            {{ scope.row.enableState === 1 ? $t('searchOrder.enable') : $t('searchOrder.disable')}}
          </el-tag>
        </template>
          </el-table-column>
          <el-table-column prop="remainWidth" align="center" :label="$t('searchOrder.remainingwidth')" min-width="120" />
       <el-table-column fixed="right" :label="$t('searchOrder.operate')" align="center">
            <template #default="scope">
              <el-button type="text" plain  @click="handleBindRack(scope.row)">{{ $t('searchOrder.add') }}</el-button>
            </template>
        </el-table-column>
        </el-table>
        <div>
    <!-- <div style="margin-top: 20px;margin-left: 40%;">
      <el-pagination
          background
          size="large"
          layout="prev, pager, next"
          :total="40"
          :current-page.sync="currentPage2"
          @current-change="handlePageChange2"
        />
    </div> -->
  </div>
  </el-dialog>
<!-- 历史任务 -->
<el-dialog v-model="blindb" top="5vh" width="95%" @close="iframeUrl=''">
     <iframe
     :src="iframeUrl"
     marginwidth="2000px"
     marginheight="2000px"
     width="100%"
     height="750px"
     frameborder="0"
     ></iframe>
  </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="2">
              <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-col :span="4">
              <div id="dt" style="font-size: 15px;">
              <el-form-item :label="$t('searchOrder.fullfurnaces')" style="width: 14vw">
                {{ fulltotals }}
              </el-form-item>
              </div>
          </el-col>
          <el-col :span="4">
              <div id="dt" style="font-size: 15px;">
              <el-form-item :label="$t('searchOrder.specifiedproject')" style="width: 14vw">
                {{ temperingengineerId }}
              </el-form-item>
              </div>
          </el-col>
          <el-col :span="4">
              <div id="dt" style="font-size: 15px;">
                <el-button type="text" plain @click="broked()">{{ $t('searchOrder.undesignate') }}</el-button>
              </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="engineerId" fixed align="center" :label="$t('searchOrder.projectnumber')" min-width="150"/>
          <el-table-column prop="thickness" align="center" :label="$t('basicData.thickness')" min-width="150" />
          <el-table-column prop="filmsId" align="center" :label="$t('basicData.coatingtypes')" min-width="150" />
          <el-table-column prop="temperingLayoutId" align="center" :label="$t('searchOrder.layoutnumber')" min-width="120" />
          <el-table-column prop="totalCount" align="center" :label="$t('searchOrder.allnumber')" min-width="150" />
          <el-table-column prop="realCount" align="center" :label="$t('searchOrder.numbercages')" min-width="150" />
          <el-table-column prop="lackCount" align="center" :label="$t('searchOrder.missingquantity')" min-width="150" />
          <el-table-column prop="damageCount" align="center" :label="$t('searchOrder.breakquantity')" min-width="150" />
          <el-table-column fixed="right" :label="$t('searchOrder.operate')" align="center" width="500">
            <template #default="scope">
              <el-button type="text" plain @click="brokee(scope.row,1)">{{ $t('searchOrder.specifytempering') }}</el-button>
              <el-button type="text" plain @click="brokee(scope.row,0)">{{ $t('searchOrder.specifyout') }}</el-button>
              <el-button type="text" plain @click="brokek(scope.row)">{{ $t('searchOrder.specifyengineerid') }}</el-button>
              <el-button type="text" plain @click="handlelack(scope.row)">{{ $t('searchOrder.lacknumber') }}</el-button>
              <el-button type="text" plain @click="handlecagedetails(scope.row)">{{ $t('searchOrder.cagedetails') }}</el-button>
            </template>
        </el-table-column>
        </el-table>
</el-dialog>
<el-dialog v-model="dialogFormVisibled" top="5vh" width="85%" :title="$t('hellow.missingnumber')">
    <el-table  ref="table" style="margin-top: 20px;height: 600px;"
        :data="tableDatalack" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
          <el-table-column prop="engineerId" fixed align="center" :label="$t('searchOrder.projectnumber')" min-width="150"/>
          <el-table-column prop="flowCardId" fixed align="center" :label="$t('searchOrder.cardnumber')" min-width="150" />
          <el-table-column prop="glassId" fixed align="center" :label="$t('searchOrder.glassID')" min-width="150" />
          <el-table-column prop="temperingLayoutId" fixed align="center" :label="$t('searchOrder.layoutID')" min-width="100" />
          <el-table-column prop="temperingFeedSequence" fixed align="center" :label="$t('searchOrder.picturesequence')" min-width="120" />
          <el-table-column prop="width" align="center" :label="$t('searchOrder.width')"  min-width="80" />
          <el-table-column prop="height" align="center" :label="$t('searchOrder.height')" min-width="80" />
          <el-table-column prop="thickness" align="center" :label="$t('searchOrder.thickness')" min-width="80" />
          <el-table-column prop="filmsid" align="center" :label="$t('searchOrder.coatingtypes')" min-width="80" />
          <el-table-column
            align="center"
            :label="$t('searchOrder.state')"
            min-width="80"
            prop="isDamage"
          >
            <template #default="scope">
              <div
                @click="scope.row.isDamage === 1 ? null : broken(scope.row)"
                style="position: relative; display: inline-block;"
              >
                <el-tag
                  :type="scope.row.isDamage === 1 ? 'danger' : 'success'"
                  style="pointer-events: {{ scope.row.isDamage === 1 ? 'none' : 'auto' }};"
                >
                  {{ scope.row.isDamage === 1 ? $t('searchOrder.breakage') : $t('searchOrder.breakagn') }}
                </el-tag>
                <div
                  v-if="scope.row.isDamage === 1"
                  style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: transparent; z-index: 1;"
                ></div>
              </div>
            </template>
          </el-table-column>
          <el-table-column prop="layer" align="center" :label="$t('processCard.layer')" min-width="80" />
          <el-table-column prop="xcoordinate" align="center" :label="$t('searchOrder.xcoordinates')" min-width="80" />
          <el-table-column prop="ycoordinate" align="center" :label="$t('searchOrder.ycoordinates')" min-width="80" />
        </el-table>
</el-dialog>
<el-dialog v-model="dialogFormVisiblee" top="5vh" width="85%" :title="$t('searchOrder.specifyengineerid')">
    <el-table  ref="table" style="margin-top: 20px;height: 600px;"
        :data="tableDataspecify" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
          <el-table-column prop="engineerId" fixed align="center" :label="$t('searchOrder.projectnumber')" min-width="150"/>
          <el-table-column prop="flowCardId" fixed align="center" :label="$t('searchOrder.cardnumber')" min-width="150" />
          <el-table-column prop="glassId" fixed align="center" :label="$t('searchOrder.glassID')" min-width="150" />
          <el-table-column prop="temperingLayoutId" fixed align="center" :label="$t('searchOrder.layoutID')" min-width="100" />
          <el-table-column prop="temperingFeedSequence" fixed align="center" :label="$t('searchOrder.picturesequence')" min-width="120" />
          <el-table-column prop="width" align="center" :label="$t('searchOrder.width')"  min-width="80" />
          <el-table-column prop="height" align="center" :label="$t('searchOrder.height')" min-width="80" />
          <el-table-column prop="thickness" align="center" :label="$t('searchOrder.thickness')" min-width="80" />
          <el-table-column prop="filmsid" align="center" :label="$t('searchOrder.coatingtypes')" min-width="80" />
          <el-table-column
            align="center"
            :label="$t('searchOrder.state')"
            min-width="80"
            prop="isDamage"
          >
            <template #default="scope">
              <div
                @click="scope.row.isDamage === 1 ? null : broken(scope.row)"
                style="position: relative; display: inline-block;"
              >
                <el-tag
                  :type="scope.row.isDamage === 1 ? 'danger' : 'success'"
                  style="pointer-events: {{ scope.row.isDamage === 1 ? 'none' : 'auto' }};"
                >
                  {{ scope.row.isDamage === 1 ? $t('searchOrder.breakage') : $t('searchOrder.breakagn') }}
                </el-tag>
                <div
                  v-if="scope.row.isDamage === 1"
                  style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: transparent; z-index: 1;"
                ></div>
              </div>
            </template>
          </el-table-column>
          <el-table-column prop="layer" align="center" :label="$t('processCard.layer')" min-width="80" />
          <el-table-column prop="xcoordinate" align="center" :label="$t('searchOrder.xcoordinates')" min-width="80" />
          <el-table-column prop="ycoordinate" align="center" :label="$t('searchOrder.ycoordinates')" min-width="80" />
        </el-table>
</el-dialog>
<el-dialog v-model="dialogFormVisiblef" top="5vh" width="85%" :title="$t('searchOrder.cagedetails')">
    <el-table  ref="table" style="margin-top: 20px;height: 600px;"
        :data="tableDatacagedetails" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
          <el-table-column prop="engineerId" fixed align="center" :label="$t('searchOrder.projectnumber')" min-width="150"/>
          <el-table-column prop="flowCardId" fixed align="center" :label="$t('searchOrder.cardnumber')" min-width="150" />
          <el-table-column prop="glassId" fixed align="center" :label="$t('searchOrder.glassID')" min-width="150" />
          <el-table-column prop="slot" fixed align="center" :label="$t('film.slot')" min-width="150" />
          <el-table-column prop="temperingLayoutId" fixed align="center" :label="$t('searchOrder.layoutID')" min-width="100" />
          <el-table-column prop="temperingFeedSequence" fixed align="center" :label="$t('searchOrder.picturesequence')" min-width="120" />
          <el-table-column prop="width" align="center" :label="$t('searchOrder.width')"  min-width="80" />
          <el-table-column prop="height" align="center" :label="$t('searchOrder.height')" min-width="80" />
          <el-table-column prop="thickness" align="center" :label="$t('searchOrder.thickness')" min-width="80" />
          <el-table-column prop="filmsId" align="center" :label="$t('searchOrder.coatingtypes')" min-width="80" />
          <el-table-column
            align="center"
            :label="$t('searchOrder.state')"
            min-width="80"
            prop="isDamage"
          >
            <template #default="scope">
              <div
                @click="scope.row.isDamage === 1 ? null : broken(scope.row)"
                style="position: relative; display: inline-block;"
              >
                <el-tag
                  :type="scope.row.isDamage === 1 ? 'danger' : 'success'"
                  style="pointer-events: {{ scope.row.isDamage === 1 ? 'none' : 'auto' }};"
                >
                  {{ scope.row.isDamage === 1 ? $t('searchOrder.breakage') : $t('searchOrder.breakagn') }}
                </el-tag>
                <div
                  v-if="scope.row.isDamage === 1"
                  style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: transparent; z-index: 1;"
                ></div>
              </div>
            </template>
          </el-table-column>
          <el-table-column prop="layer" align="center" :label="$t('processCard.layer')" min-width="80" />
          <el-table-column prop="xcoordinate" align="center" :label="$t('searchOrder.xcoordinates')" min-width="80" />
          <el-table-column prop="ycoordinate" align="center" :label="$t('searchOrder.ycoordinates')" min-width="80" />
        </el-table>
</el-dialog>
<!-- 非钢化 -->
<el-dialog v-model="dialogFormVisibles" top="5vh" width="85%" :title="$t('searchOrder.searchlayout')">
  <el-table  ref="table" style="margin-top: 20px;height: 500px;"
        :data="tableDatas" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
          <el-table-column prop="engineerId" fixed align="center" :label="$t('searchOrder.projectnumber')" min-width="150"/>
          <el-table-column prop="thickness" align="center" :label="$t('basicData.thickness')" min-width="150" />
          <el-table-column prop="filmsId" align="center" :label="$t('basicData.coatingtypes')" min-width="150" />
          <el-table-column prop="temperingLayoutId" fixed align="center" :label="$t('searchOrder.layoutnumber')" min-width="120" />
          <el-table-column prop="totalCount" align="center" :label="$t('searchOrder.allnumber')" min-width="150" />
          <el-table-column prop="realCount" align="center" :label="$t('searchOrder.numbercages')" min-width="150" />
          <el-table-column prop="lackCount" align="center" :label="$t('searchOrder.missingquantity')" min-width="150" />
          <el-table-column prop="damageCount" align="center" :label="$t('searchOrder.breakquantity')" min-width="150" />
          <el-table-column fixed="right" :label="$t('searchOrder.operate')" align="center" width="500">
            <template #default="scope">
              <el-button type="text" plain @click="brokee(scope.row,1)">{{ $t('searchOrder.specifytempering') }}</el-button>
              <el-button type="text" plain @click="brokee(scope.row,0)">{{ $t('searchOrder.specifyout') }}</el-button>
              <el-button type="text" plain @click="brokek(scope.row)">{{ $t('searchOrder.specifyengineerid') }}</el-button>
              <el-button type="text" plain @click="handlelack(scope.row)">{{ $t('hellow.missingnumber') }}</el-button>
              <el-button type="text" plain @click="handlecagedetails(scope.row)">{{ $t('searchOrder.cagedetails') }}</el-button>
            </template>
        </el-table-column>
        </el-table>
    <!-- <el-table  ref="table" style="margin-top: 20px;height: 500px;"
        :data="tableDatas" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
          <el-table-column prop="flow_card_id" fixed align="center" :label="$t('searchOrder.processcards')"/>
          <el-table-column prop="layer" align="center" :label="$t('searchOrder.ceng')" />
          <el-table-column prop="count" align="center" :label="$t('searchOrder.numberglasses')" />
          <el-table-column fixed="right" :label="$t('searchOrder.operate')" align="center" >
            <template #default="scope">
              <el-button type="text" plain @click="brokes(scope.row)">{{ $t('searchOrder.processcard') }}</el-button>
            </template>
        </el-table-column>
        </el-table> -->
</el-dialog>
</template>
<style>
#dt { display:block; float:left;line-height: 20px;margin-left: 150px;}
#dta { display:block; float:left;line-height: 20px;margin-left: 80%;}
#dialog-footer{
  text-align: center;
  margin-top: -15px;
}
#message{
  text-align: center;
  align-items: center;
  color: black;
   width: 200px;
   height: 100px;
   background-color: #337ecc;
   margin-left: 28%;
}
#awatch{
  height: 450px;
}
#occupy {
    height: 100%;
    width: 15%;
    background-color: white;
    margin: 0px 8px 0px 8px;
    border: 1px #EBEEF5 solid;
    text-align: center;
    padding: 5px;
}
#biao {
    font-size: 12px;
}
#zhi {
    font-size: 18px;
    font-weight: bold;
}
#demo-pagination-block + #demo-pagination-block {
  margin-top: 10px;
}
#demo-pagination-block #demonstration {
  margin-bottom: 16px;
}
::-webkit-scrollbar {
     width: 0 !important;
   }
   ::-webkit-scrollbar {
     width: 0 !important;height: 0;
   }
   .img-list{
  position:relative;
}
.data-img{
  @apply float-none ;
  width:100%;
  height:16rem;
  background: rgba(0, 0, 0, 0);
  opacity: 1;
  border-radius: 0.5rem 0.5rem 0px 0px;
}
.check-img{
  position: absolute;
  width: 3.3125rem;
  height: 2.9375rem;
  top:20rem;
  right: 57rem;
  z-index: 10;
}
.check-imga{
  position: absolute;
  width: 3.3125rem;
  height: 2.9375rem;
  top:15rem;
  right: 28.5rem;
  z-index: 10;
}
.vertical {
    width: 45px;
    height: 25px;
    background-color: #409EFF;
    top: 485px; /* 初始位置 */
    left: 899px; /* 水平居中 */
    transform: translateX(-50%);
    animation: move-vertical 6s infinite; /* 从上到下动画,持续6秒,无限循环 */
}
@keyframes move-vertical {
    0% {
        top: 485px; /* 起始位置 */
    }
    100% {
        top: calc(100% - 210px); /* 从上到下结束位置 */
    }
}
.img-dlpl{
  margin-left: 20px;
  margin-top: 0px;
  background-image:url('../../assets/ganghuaqian.png');
  background-repeat: no-repeat;
  background-attachment: local;
  min-height: 400px;
  width: 1200px;
  max-width: 100%;
  background-size: 1200px 400px;
  overflow: hidden;
  position:relative
}
.img-car1{
  display: flex;
  background-image:url('../../assets/xiaoche.png');
  position: absolute;
  background-repeat: no-repeat;
  background-attachment: local;
  min-height: 200px;
  width: 200px;
  max-width: 100%;
  background-size: 200px 70px;
  overflow: hidden;
  position:relative
}
.img-car4{
  display: flex;
  background-image:url('../../assets/xiaoche.png');
  position: absolute;
  background-repeat: no-repeat;
  background-attachment: local;
  min-height: 200px;
  width: 200px;
  max-width: 100%;
  background-size: 200px 70px;
  overflow: hidden;
  position:relative
}
.table-container {
  display: flex;
  flex-wrap: nowrap; /* 防止换行 */
  justify-content: space-between; /* 根据需要调整子元素之间的间距 */
}
.table-container > el-card {
  flex: 1; /* 使两个卡片平分可用空间 */
  margin-bottom: 10px; /* 可选,根据需要添加底部间距 */
}
#dotClass {
  display: flex;
  margin-left: 20px;
  size: 50px;
  margin-top: 20px;
  margin-bottom: 10px;
}
.row-red-background {
  background-color: #CDAF95 !important;
}
</style>
UI-Project/src/views/Slicecage/slicecagehistory.vue
New file
@@ -0,0 +1,535 @@
<template>
    <div>
  <div style="display: flex;width: 1770px;">
    <el-input v-model="glassId" clearable style="margin-left: 10px;margin-bottom: 10px;width: 200px;" :placeholder="$t('searchOrder.inglassID')" />
    <el-input v-model="startSlot" clearable style="margin-left: 10px;margin-bottom: 10px;width: 200px;" @input="handleInputa" :placeholder="$t('film.originateslot')" />
    <el-input v-model="targetSlot" clearable style="margin-left: 10px;margin-bottom: 10px;width: 200px;" @input="handleInputb" :placeholder="$t('film.endoriginateslot')" />
          <el-select v-model="selectValuesa[0]" filterable :placeholder="$t('searchOrder.taskstatus')" clearable
          style="width: 200px;margin-left: 10px;">
          <el-option :label="$t('searchOrder.begin')" value="0"></el-option>
          <el-option :label="$t('searchOrder.finish')" value="2"></el-option>
          <el-option :label="$t('order.dilapidation')" value="3"></el-option>
          <el-option :label="$t('searchOrder.uncar')" value="4"></el-option>
        </el-select>
        <el-select v-model="selectValuesa[1]" filterable :placeholder="$t('film.enabletype')" clearable
          style="width: 200px;margin-left: 10px;">
          <el-option :label="$t('searchOrder.inkage')" value="1"></el-option>
          <el-option :label="$t('searchOrder.outfilm')" value="2"></el-option>
          <el-option :label="$t('film.dispatch')" value="3"></el-option>
        </el-select>
        <el-date-picker
            style="margin-left: 15px;"
             v-model="timeRange"
             type="datetimerange"
             :shortcuts="shortcuts"
             range-separator="至"
             :start-placeholder="$t('reportmanage.starttime')"
             :end-placeholder="$t('reportmanage.endtime')"
           />
          <el-button type="primary" style="margin-left: 10px;margin-bottom: 10px;" @click="handleClick()">{{$t('reportmanage.inquire')}}</el-button>
     </div>
     <div style="margin-bottom: 10px;margin-top: 20px;margin-left: 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('hellow.countIn')"  style="width: 14vw">
                {{ countIn }}
              </el-form-item>
              </div>
          </el-col>
          <el-col :span="5">
              <div id="dt" style="font-size: 15px;">
              <el-form-item :label="$t('hellow.totalAreaIn')" style="width: 14vw">
                {{ totalAreaIn }}
              </el-form-item>
              </div>
          </el-col>
          <el-col :span="5">
            <div id="dta" style="font-size: 15px;">
          <el-form-item :label="$t('hellow.countOut')" style="width: 14vw">
                {{ countOut }}
              </el-form-item>
              </div>
          </el-col>
          <el-col :span="5">
              <div id="dt" style="font-size: 15px;">
              <el-form-item :label="$t('hellow.totalAreaOut')" style="width: 14vw">
                {{ totalAreaOut }}
              </el-form-item>
              </div>
          </el-col>
        </el-row>
      </el-form>
    </div>
        <el-table ref="table" style="margin-top: 20px;height: 580px;width: 1770px;" :data="tableDatax" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
      <el-table-column prop="glassId" align="center" :label="$t('searchOrder.glassID')" min-width="80" />
      <el-table-column prop="startSlot" align="center" :label="$t('film.originateslot')" min-width="80" />
          <el-table-column prop="targetSlot" align="center" :label="$t('film.endoriginateslot')" min-width="80" />
          <el-table-column
            align="center"
            :label="$t('film.taskstatus')"
            min-width="80"
            prop="taskState"
          >
          <template #default="scope">
        <el-tag :type="getStatusTypeb(scope.row.taskState)">
          {{ getStatusTextb(scope.row.taskState) }}
        </el-tag>
      </template>
          </el-table-column>
          <el-table-column
            align="center"
            :label="$t('film.enabletype')"
            min-width="80"
            prop="taskType"
          >
          <template #default="scope">
        <el-tag :type="getStatusTypea(scope.row.taskType)">
          {{ getStatusTexta(scope.row.taskType) }}
        </el-tag>
      </template>
          </el-table-column>
          <el-table-column prop="formattedCreateTime" align="center" :label="$t('reportmanage.starttime')" min-width="100" />
          <el-table-column prop="formattedUpdateTime" align="center" :label="$t('reportmanage.endtime')" min-width="100" />
        </el-table>
  <div style="margin-top: 20px;margin-left: 40%;">
        <el-pagination
          v-model:current-page="currentPage2"
          :page-size="pageSize"
          :size="large"
          :disabled="disabled"
          layout="prev, pager, next, jumper"
          :total="totalRecords"
          @current-change="handlePageChange2"
          style="margin-top: 10px;"
      />
    </div>
  </div>
  </template>
<script lang="ts" setup>
import {useI18n} from 'vue-i18n'
import {useRouter} from "vue-router"
import request from "@/utils/request"
import {host, WebSocketHost} from '@/utils/constants'
import {onBeforeUnmount, onMounted, onUnmounted, reactive, ref} from "vue";
import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
import {ElMessage, ElMessageBox} from 'element-plus'
const {t} = useI18n()
let language = ref(localStorage.getItem('lang') || 'zh')
import { inject } from 'vue';
const globalDate = inject('globalDate');
const router = useRouter()
const timeRange = ref([])
const selectValuesa = reactive([]);
const tableDatax = ref([])
const currentPage2 = ref(1)
const totalRecords = ref(0)
const countIn = ref(0)
const countOut = ref(0)
const totalAreaIn = ref(0)
const totalAreaOut = ref(0)
const glassId = ref('');
const startSlot = ref('');
const targetSlot = ref('');
let getglobalDate = window.localStorage.getItem('getglobalDate')
const historical = async () => {
  try {
  let startTime = window.localStorage.getItem('startTime')
      const response = await request.post("/cacheVerticalGlass/bigStorageCageHistoryTask/queryBigStorageCageHistoryTask", {
        pageNo: 1,
        pageSize: 20,
        glassId: glassId.value,
        startSlot: 0,
        targetSlot: 0,
        taskStateList: [],
        taskTypeList: [],
        beginDate: startTime,
        endDate: getglobalDate
    })
      if (response.code == 200) {
        ElMessage.success(response.message);
        const formattedData = response.data.records.map(record => ({
        ...record,
        formattedCreateTime: formatTimestamp(record.createTime),
        formattedUpdateTime: formatTimestamp(record.updateTime),
      }));
        tableDatax.value = formattedData;
        totalRecords.value = response.data.total/2 || 0
      } else {
        ElMessage.error(response.message);
    }
}
catch (error) {
  }
}
const Daily = async () => {
  try {
  let startTime = window.localStorage.getItem('startTime')
      const response = await request.post("/cacheVerticalGlass/bigStorageCageHistoryTask/queryBigDailyProduction", {
        pageNo: 1,
        pageSize: 20,
        glassId: glassId.value,
        startSlot: 0,
        targetSlot: 0,
        taskStateList: [],
        taskTypeList: [],
        beginDate: startTime,
        endDate: getglobalDate
    })
      if (response.code == 200) {
        countIn.value = response.data.countIn
        countOut.value = response.data.countOut
        totalAreaIn.value = response.data.totalAreaIn
        totalAreaOut.value = response.data.totalAreaOut
      } else {
        ElMessage.error(response.message);
    }
}
catch (error) {
  }
}
const handlePageChange2 = (newPage) => {
  currentPage2.value = newPage;
  window.localStorage.setItem('pagenumber', currentPage2.value)
  historicala(currentPage2.value);
  Dailya(currentPage2.value);
};
const historicala = async (page) => {
  try {
  let celllist=[]
  let stateList=[]
  let pstartSlot= ''
  let ptargetSlot=''
  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]];
    }
  }
  if(startSlot.value != ""){
    pstartSlot = startSlot.value
  }else{
    pstartSlot = '0'
  }
  if(targetSlot.value != ""){
    ptargetSlot = targetSlot.value
  }else{
    ptargetSlot = '0'
  }
  let page = window.localStorage.getItem('pagenumber')
  let startTime = window.localStorage.getItem('startTime')
      const response = await request.post("/cacheVerticalGlass/bigStorageCageHistoryTask/queryBigStorageCageHistoryTask", {
        pageNo: page,
        pageSize: 20,
        glassId: glassId.value,
        startSlot: pstartSlot,
        targetSlot: ptargetSlot,
        taskStateList: celllist,
        taskTypeList: stateList,
        beginDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[0])) || '',
        endDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[1])) || '',
    })
      if (response.code == 200) {
        ElMessage.success(response.message);
        const formattedData = response.data.records.map(record => ({
        ...record,
        formattedCreateTime: formatTimestamp(record.createTime),
        formattedUpdateTime: formatTimestamp(record.updateTime),
      }));
        tableDatax.value = formattedData;
        totalRecords.value = response.data.total/2 || 0
      } else {
        ElMessage.error(response.message);
    }
}
catch (error) {
  }
}
const Dailya = async (page) => {
  try {
  let celllist=[]
  let stateList=[]
  let pstartSlot= ''
  let ptargetSlot=''
  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]];
    }
  }
  if(startSlot.value != ""){
    pstartSlot = startSlot.value
  }else{
    pstartSlot = '0'
  }
  if(targetSlot.value != ""){
    ptargetSlot = targetSlot.value
  }else{
    ptargetSlot = '0'
  }
  let page = window.localStorage.getItem('pagenumber')
  let startTime = window.localStorage.getItem('startTime')
      const response = await request.post("/cacheVerticalGlass/bigStorageCageHistoryTask/queryBigDailyProduction", {
        pageNo: page,
        pageSize: 20,
        glassId: glassId.value,
        startSlot: pstartSlot,
        targetSlot: ptargetSlot,
        taskStateList: celllist,
        taskTypeList: stateList,
        beginDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[0])) || '',
        endDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[1])) || '',
    })
      if (response.code == 200) {
        countIn.value = response.data.countIn
        countOut.value = response.data.countOut
        totalAreaIn.value = response.data.totalAreaIn
        totalAreaOut.value = response.data.totalAreaOut
      } else {
        ElMessage.error(response.message);
    }
}
catch (error) {
  }
}
const handleClick = async () => {
  await sethistorical();
  await Dailyhistorical();
};
// 历史查询点击
const sethistorical = async () => {
  try {
  let celllist=[]
  let stateList=[]
  let pstartSlot= ''
  let ptargetSlot=''
  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]];
    }
  }
  if(startSlot.value != ""){
    pstartSlot = startSlot.value
  }else{
    pstartSlot = '0'
  }
  if(targetSlot.value != ""){
    ptargetSlot = targetSlot.value
  }else{
    ptargetSlot = '0'
  }
  const response = await request.post("/cacheVerticalGlass/bigStorageCageHistoryTask/queryBigStorageCageHistoryTask", {
        pageNo: 1,
        pageSize: 20,
        glassId: glassId.value,
        startSlot: pstartSlot,
        targetSlot: ptargetSlot,
        taskStateList: celllist,
        taskTypeList: stateList,
        beginDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[0])) || '',
        endDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[1])) || '',
    })
      if (response.code == 200) {
        ElMessage.success(response.message);
        currentPage2.value = 1
        totalRecords.value = response.data.total/2 || 0
        const formattedData = response.data.records.map(record => ({
        ...record,
        formattedCreateTime: formatTimestamp(record.createTime),
        formattedUpdateTime: formatTimestamp(record.updateTime),
      }));
        // tableDatax.value = response.data.records;
        tableDatax.value = formattedData;
      } else {
        ElMessage.error(response.message);
    }
}
catch (error) {
  }
}
const Dailyhistorical = async () => {
  try {
  let celllist=[]
  let stateList=[]
  let pstartSlot= ''
  let ptargetSlot=''
  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]];
    }
  }
  if(startSlot.value != ""){
    pstartSlot = startSlot.value
  }else{
    pstartSlot = '0'
  }
  if(targetSlot.value != ""){
    ptargetSlot = targetSlot.value
  }else{
    ptargetSlot = '0'
  }
  const response = await request.post("/cacheVerticalGlass/bigStorageCageHistoryTask/queryBigDailyProduction", {
        pageNo: 1,
        pageSize: 20,
        glassId: glassId.value,
        startSlot: pstartSlot,
        targetSlot: ptargetSlot,
        taskStateList: celllist,
        taskTypeList: stateList,
        beginDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[0])) || '',
        endDate: (formatTimestamp(timeRange.value) && formatTimestamp(timeRange.value[1])) || '',
    })
      if (response.code == 200) {
        countIn.value = response.data.countIn
        countOut.value = response.data.countOut
        totalAreaIn.value = response.data.totalAreaIn
        totalAreaOut.value = response.data.totalAreaOut
      } else {
        ElMessage.error(response.message);
    }
}
catch (error) {
  }
}
const handleInputa = (value: string) => {
  const isNumeric = /^\d*$/.test(value);
  if (isNumeric) {
    startSlot.value = value;
  } else {
    startSlot.value = '';
  }
};
const handleInputb = (value: string) => {
  const isNumeric = /^\d*$/.test(value);
  if (isNumeric) {
    targetSlot.value = value;
  } else {
    targetSlot.value = '';
  }
};
// 格式化时间戳为年月日时间字符串的函数
function formatTimestamp(timestamp) {
  const date = new Date(timestamp);
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始,需要加1,并补零
  const day = String(date.getDate()).padStart(2, '0'); // 补零
  const hours = String(date.getHours()).padStart(2, '0'); // 补零(如果需要显示时间)
  const minutes = String(date.getMinutes()).padStart(2, '0'); // 补零(如果需要显示时间)
  const seconds = String(date.getSeconds()).padStart(2, '0'); // 补零(如果需要显示时间)
  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
const shortcuts = [
  {
    text: '最近一周',
    value: () => {
      const backendTime = new Date(getglobalDate)
      const oneWeekAgo = new Date(getglobalDate)
      oneWeekAgo.setHours(0, 0, 0, 0);
      oneWeekAgo.setDate(oneWeekAgo.getDate() - 7)
      timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)]
      window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
    },
  },
  {
    text: '最近一个月',
    value: () => {
      const backendTime = new Date(getglobalDate)
      const oneWeekAgo = new Date(getglobalDate)
      oneWeekAgo.setHours(0, 0, 0, 0);
      oneWeekAgo.setMonth(oneWeekAgo.getMonth() - 1)
      timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)]
      window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
    },
  },
  {
    text: '最近三个月',
    value: () => {
      const backendTime = new Date(getglobalDate)
      const oneWeekAgo = new Date(getglobalDate)
      oneWeekAgo.setHours(0, 0, 0, 0);
      oneWeekAgo.setMonth(oneWeekAgo.getMonth() - 3)
      timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)]
      window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
},
  },
]
// 格式化后端时间并计算一周前的时间
const defaultTime = ref<[Date, Date]>([new Date(), new Date()]);
function parseAndSetTime() {
  const backendTime = new Date(getglobalDate);
  const oneWeekAgo = new Date(backendTime.getTime() - 7 * 24 * 60 * 60 * 1000); // 减去7天
  oneWeekAgo.setHours(0, 0, 0, 0);
  timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)];
  window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
}
function getStatusTypeb(state: number) {
  switch (state) {
    case 0:
      return 'primary';
    case 2:
      return 'success';
    case 3:
      return 'danger';
    case 4:
      return 'warning';
  }
}
function getStatusTextb(state: number) {
  switch (state) {
    case 0:
      return t('searchOrder.begin');
    case 2:
      return t('searchOrder.finish');
    case 3:
    return t('order.dilapidation');
    case 4:
    return t('searchOrder.uncar');
  }
}
function getStatusTypea(ishorizontal: number) {
  switch (ishorizontal) {
    case 1:
      return 'primary';
    case 2:
      return 'success';
    case 3:
      return 'warning';
  }
}
function getStatusTexta(ishorizontal: number) {
  switch (ishorizontal) {
    case 1:
      return t('searchOrder.inkage');
    case 2:
    return t('searchOrder.outfilm');
    case 3:
    return t('film.dispatch');
  }
}
onMounted(() => {
  parseAndSetTime();
  historical();
  Daily()
});
  </script>
  <style scoped>
  </style>
Diff truncated after the above file
UI-Project/src/views/StockBasicData/Select.vue UI-Project/src/views/StockBasicData/stockBasicData.vue UI-Project/src/views/StockBasicData/stockBasicDatatwo.vue UI-Project/src/views/StockBasicData/stockBasicyiwu.vue UI-Project/src/views/StockBasicData/stockhistory.vue UI-Project/src/views/TL/Temperedlayout/Temperedlayout.vue UI-Project/src/views/User/permissions.vue UI-Project/src/views/User/rolelist.vue UI-Project/src/views/User/user.vue UI-Project/src/views/User/userlist.vue UI-Project/src/views/User/userpageNo.vue UI-Project/src/views/Visualization/screen.vue UI-Project/src/views/Visualization/screenone.vue UI-Project/src/views/Visualization/screenthree.vue UI-Project/src/views/Visualization/screentwo.vue UI-Project/src/views/hollow/hellowquiphistory.vue UI-Project/src/views/hollow/hellowquipthreehistory.vue UI-Project/src/views/hollow/hellowquiptwohistory.vue UI-Project/src/views/hollow/hellowslicecagehistory.vue UI-Project/src/views/hollow/hol.vue UI-Project/src/views/hollow/hollowaluminum.vue UI-Project/src/views/hollow/hollowaluminumthree.vue UI-Project/src/views/hollow/hollowaluminumtwo.vue UI-Project/src/views/hollow/hollowequipment.vue UI-Project/src/views/hollow/hollowequipmenthree.vue UI-Project/src/views/hollow/hollowequipmenttwo.vue UI-Project/src/views/hollow/hollowslicecage.vue UI-Project/src/views/largescreen/largescreen.vue UI-Project/src/views/largescreendisplay/screendisplay.vue UI-Project/src/views/largescreendisplay/statistics.vue UI-Project/src/views/mm/purchaseOrder/Create.vue UI-Project/src/views/mm/purchaseOrder/CreateHeader.vue UI-Project/src/views/mm/purchaseOrder/Details.vue UI-Project/src/views/mm/purchaseOrder/Payment.vue UI-Project/src/views/mm/purchaseOrder/PurchaseOrder.vue UI-Project/src/views/mm/purchaseOrder/Return.vue UI-Project/src/views/mm/purchaseOrder/Select.vue UI-Project/src/views/mm/purchaseOrder/Storage.vue UI-Project/vite.config.js UI-Project/vue.config.js hangzhoumesParent/JsonFile/PlcCacheGlass.json hangzhoumesParent/JsonFile/PlcCacheVerticalGlass.json hangzhoumesParent/JsonFile/PlcLoadGlass.json hangzhoumesParent/JsonFile/PlcTemperingGlass.json hangzhoumesParent/JsonFile/PlcdownGlass.json hangzhoumesParent/common/pom.xml hangzhoumesParent/common/servicebase/pom.xml hangzhoumesParent/common/servicebase/src/main/java/com/kangaroohy/milo/configuration/MiloAutoConfiguration.java hangzhoumesParent/common/servicebase/src/main/java/com/kangaroohy/milo/pool/MiloConnectFactory.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/base/entity/BigStorageCageBaseInfo.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/base/entity/HollowBigStorageCageBaseInfo.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/base/entity/PageRequest.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/base/entity/vo/BigStorageVO.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/bigstoragecagetask/entity/BigStorageCageTask.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/bigstoragecagetask/entity/BigStorageTaskVO.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/bigstoragecagetask/mapper/BigStorageCageTaskMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/bigstoragecagetask/service/BigStorageCageTaskService.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/bigstoragecagetask/service/impl/BigStorageCageTaskServiceImpl.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/Const.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/ConstSysConfig.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/MybatisPlusConfig.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/Swagger2Config.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/WebSocketConfig.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/exception/GlobalExceptionHandler.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/exception/ServiceException.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/handler/MyMetaObjectHandler.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/controller/DamageController.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/entity/Damage.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/entity/DamagePrint.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/entity/request/DamageRequest.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/mapper/DamageMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/service/DamageService.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/service/impl/DamageServiceImpl.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/device/PlcBitInfo.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/device/PlcBitObject.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/device/PlcParameterInfo.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/device/PlcParameterObject.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/engineering/entity/Engineering.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/engineering/entity/OptimizeEngineering.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/engineering/mapper/EngineeringMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/engineering/mapper/xml/EngineeringMapper.xml hangzhoumesParent/common/servicebase/src/main/java/com/mes/engineering/service/EngineeringService.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/engineering/service/impl/EngineeringServiceImpl.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/entity/request/GeneralRequest.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/controller/GlassInfoController.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/entity/GlassInfo.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/entity/LoadGlassInfo.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/entity/OptimizeGlassinfo.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/entity/dto/HollowGlassInfoDTO.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/mapper/GlassInfoMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/service/GlassInfoService.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/service/impl/GlassInfoServiceImpl.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/largenscreen/controller/LargenScreenController.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/largenscreen/entity/DailyProductionVO.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/largenscreen/entity/DateRequest.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/largenscreen/entity/PieChartVO.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/largenscreen/mapper/LargenScreenMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/largenscreen/service/LargenScreenService.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/largenscreen/service/impl/LargenScreenServiceImpl.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/entity/LoadGlassDeviceTask.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/entity/LoadGlassDeviceTaskHistory.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/entity/request/LoadGlassDeviceTaskHistoryRequest.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/mapper/LoadGlassDeviceTaskHistoryDao.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/mapper/LoadGlassDeviceTaskMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/LoadGlassDeviceTaskHistoryService.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/LoadGlassDeviceTaskService.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/impl/LoadGlassDeviceOneTaskServiceImpl.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/opctask/service/impl/LoadGlassDeviceTaskHistoryServiceImpl.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/order/controller/OrderController.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/order/entity/Order.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/order/entity/Orderdetail.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/order/entity/Orders.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/order/entity/dto/OrderDTO.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/order/entity/request/OrderRequest.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/order/mapper/OrderMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/order/mapper/OrderdetailMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/order/mapper/OrdersMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/order/mapper/xml/OrderMapper.xml hangzhoumesParent/common/servicebase/src/main/java/com/mes/order/service/OrdersService.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/order/service/impl/OrdersServiceImpl.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/controller/BasicDataProduceController.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/controller/DamageDetailsController.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/controller/FlowCardController.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/controller/OptimizeLayoutController.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/controller/OptimizeProjectController.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/controller/ReportingWorkController.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/controller/ReportingWorkDetailController.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/BasicDataProduce.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/DamageDetails.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/FlowCard.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeDetail.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeHeatDetail.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeHeatLayout.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeLayout.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeProject.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/ReportingWork.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/ReportingWorkDetail.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/dto/FlowCardDTO.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/dto/FlowCardPercentDTO.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/dto/ReportWorkDTO.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/request/AwaitingRepair.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/request/FlowCardRequest.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/request/OptimizeRequest.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/request/OrderDetail.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/request/ReportWorkRequest.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/request/Reportingdamage.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/BasicDataProduceMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/FlowCardMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/OptimizeDetailMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/OptimizeHeatDetailMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/OptimizeHeatLayoutMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/OptimizeLayoutMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/OptimizeProjectMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/ReportingWorkDetailMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/ReportingWorkMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/request/AwaitingRepairMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/request/ReportingDamageMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/BasicDataProduceService.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/DamageDetailsService.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/FlowCardService.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeDetailService.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeHeatDetailService.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeHeatLayoutService.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeLayoutService.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeProjectService.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/ReportingWorkDetailService.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/ReportingWorkService.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/BasicDataProduceServiceImpl.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/FlowCardServiceImpl.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeDetailServiceImpl.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeHeatDetailServiceImpl.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeHeatLayoutServiceImpl.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeLayoutServiceImpl.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeProjectServiceImpl.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/ReportingWorkServiceImpl.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/entity/RawGlassStorageDetails.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/entity/dto/RawGlassStorageDetailsDTO.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/entity/request/RawGlassRequest.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/mapper/RawGlassStorageDetailsMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/service/RawGlassStorageDetailsService.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/service/impl/RawGlassStorageDetailsServiceImpl.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassstation/entity/RawGlassStorageStation.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassstation/mapper/RawGlassStorageStationMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassstation/service/RawGlassStorageStationService.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassstation/service/impl/RawGlassStorageStationServiceImpl.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglasstask/entity/RawGlassStorageTask.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglasstask/entity/request/RawGlassTaskRequest.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglasstask/mapper/RawGlassStorageTaskMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglasstask/mapper/xml/RawGlassStorageTaskMapper.xml hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglasstask/service/RawGlassStorageTaskService.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglasstask/service/impl/RawGlassRawGlassStorageTaskServiceImpl.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/sysconfig/controller/SysConfigController.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/sysconfig/entity/SysConfig.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/sysconfig/entity/request/SysConfigRequest.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/sysconfig/mapper/SysConfigMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/sysconfig/service/SysConfigService.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/sysconfig/service/impl/SysConfigServiceImpl.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/sysdict/entity/SysDictData.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/sysdict/entity/SysDictType.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/sysdict/mapper/SysDictDataMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/sysdict/mapper/SysDictTypeMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/sysdict/service/SysDictDataService.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/sysdict/service/SysDictTypeService.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/sysdict/service/impl/SysDictDataServiceImpl.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/sysdict/service/impl/SysDictTypeServiceImpl.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/entity/TemperingGlassInfo.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/mapper/TemperingGlassInfoMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/TemperingGlassInfoService.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/impl/TemperingGlassInfoServiceImpl.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/CodeGet.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/DatabaseDesignDocUtil.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/DateUtil.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/InitUtil.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/PageUtil.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/S7control.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/WebSocketServer.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/uppattenusage/entity/UpPattenUsage.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/uppattenusage/entity/vo/UpPattenUsageVO.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/uppattenusage/mapper/UpPattenUsageMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/utils/MD5.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/utils/RedisUtil.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/utils/ResponseUtil.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/utils/Result.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/utils/ResultCodeEnum.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/work_assignment/controller/WorkAssignmentController.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/work_assignment/entity/WorkAssignment.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/work_assignment/mapper/WorkAssignmentMapper.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/work_assignment/mapper/xml/WorkAssignmentMapper.xml hangzhoumesParent/common/servicebase/src/main/java/com/mes/work_assignment/service/WorkAssignmentService.java hangzhoumesParent/common/servicebase/src/main/java/com/mes/work_assignment/service/impl/WorkAssignmentServiceImpl.java hangzhoumesParent/common/servicebase/src/main/resources/application.yml hangzhoumesParent/common/servicebase/src/main/resources/banner.txt hangzhoumesParent/common/servicebase/src/main/resources/mapper/BigStorageCageTaskMapper.xml hangzhoumesParent/common/servicebase/src/main/resources/mapper/FlowCardMapper.xml hangzhoumesParent/common/servicebase/src/main/resources/mapper/GlassInfoMapper.xml hangzhoumesParent/common/servicebase/src/main/resources/mapper/LargenScreenMapper.xml hangzhoumesParent/common/servicebase/src/main/resources/mapper/LoadGlassDeviceTaskMapper.xml hangzhoumesParent/common/servicebase/src/main/resources/mapper/OptimizeProjectMapper.xml hangzhoumesParent/common/servicebase/src/main/resources/mapper/OrderMapper.xml hangzhoumesParent/common/servicebase/src/main/resources/mapper/RawGlassStorageDetailsMapper.xml hangzhoumesParent/common/servicebase/src/main/resources/mapper/RawGlassStorageStationMapper.xml hangzhoumesParent/common/servicebase/src/main/resources/mapper/TemperingGlassInfoMapper.xml hangzhoumesParent/common/servicebase/src/main/resources/mapper/UpPattenUsageMapper.xml hangzhoumesParent/common/servicebase/target/classes/application.yml hangzhoumesParent/common/servicebase/target/classes/banner.txt hangzhoumesParent/common/servicebase/target/classes/mapper/BigStorageCageTaskMapper.xml hangzhoumesParent/common/servicebase/target/classes/mapper/FlowCardMapper.xml hangzhoumesParent/common/servicebase/target/classes/mapper/GlassInfoMapper.xml hangzhoumesParent/common/servicebase/target/classes/mapper/LargenScreenMapper.xml hangzhoumesParent/common/servicebase/target/classes/mapper/LoadGlassDeviceTaskMapper.xml hangzhoumesParent/common/servicebase/target/classes/mapper/OptimizeProjectMapper.xml hangzhoumesParent/common/servicebase/target/classes/mapper/OrderMapper.xml hangzhoumesParent/common/servicebase/target/classes/mapper/RawGlassStorageDetailsMapper.xml hangzhoumesParent/common/servicebase/target/classes/mapper/RawGlassStorageStationMapper.xml hangzhoumesParent/common/servicebase/target/classes/mapper/TemperingGlassInfoMapper.xml hangzhoumesParent/common/servicebase/target/classes/mapper/UpPattenUsageMapper.xml hangzhoumesParent/common/springsecurity/pom.xml hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/config/RedisConfig.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/config/TokenWebSecurityConfig.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/filter/JwtAuthenticationTokenFilter.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAccessDeniedHandler.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAuthenticationEntryPoint.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtLogoutSuccessHandler.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginFailureHandler.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginSuccessHandler.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/FastJsonRedisSerializer.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/JwtUtil.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/UserInfoUtils.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/WebUtils.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/controller/SysMenuController.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/entity/SysMenu.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/mapper/SysMenuMapper.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/service/SysMenuService.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/service/impl/SysMenuServiceImpl.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/controller/SysRoleController.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRole.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRoleMenu.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/vo/SysRoleVO.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMapper.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMenuMapper.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/xml/SysRoleMapper.xml hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/xml/SysRoleMenuMapper.xml hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleMenuService.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleService.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleMenuServiceImpl.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleServiceImpl.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/controller/SysUserController.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/LoginUser.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/SysUser.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/SysUserRole.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/vo/SysUserVO.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/SysUserMapper.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/SysUserRoleMapper.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/xml/SysUserMapper.xml hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/xml/SysUserRoleMapper.xml hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/SysUserRoleService.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/SysUserService.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/impl/SysUserRoleServiceImpl.java hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/impl/SysUserServiceImpl.java hangzhoumesParent/common/springsecurity/src/main/resources/application-dev.yml hangzhoumesParent/common/springsecurity/src/main/resources/application-loc.yml hangzhoumesParent/common/springsecurity/src/main/resources/application-prod.yml hangzhoumesParent/common/springsecurity/src/main/resources/mapper/SysMenuMapper.xml hangzhoumesParent/common/springsecurity/target/classes/application-dev.yml hangzhoumesParent/common/springsecurity/target/classes/application-loc.yml hangzhoumesParent/common/springsecurity/target/classes/application-prod.yml hangzhoumesParent/common/springsecurity/target/classes/mapper/SysMenuMapper.xml hangzhoumesParent/gateway/pom.xml hangzhoumesParent/gateway/src/main/java/com/mes/GateWayApplication.java hangzhoumesParent/gateway/src/main/java/com/mes/config/MyCorsConfig.java hangzhoumesParent/gateway/src/main/resources/application.yml hangzhoumesParent/gateway/target/classes/application.yml hangzhoumesParent/mesHub/pom.xml hangzhoumesParent/mesHub/src/main/java/com/mes/MesHubApplication.java hangzhoumesParent/mesHub/src/main/resources/application-dev.yml hangzhoumesParent/mesHub/src/main/resources/application.yml hangzhoumesParent/moduleService/CacheGlassModule/pom.xml hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/AppRunnerConfig.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/CacheGlassModuleApplication.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/common/S7object.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/common/SmbTool.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/config/S7ConfigWL1.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgglasstask/controller/EdgGlassTaskInfoController.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgglasstask/entity/EdgGlassTaskInfo.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgglasstask/entity/request/EdgGlassInfoRequest.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgglasstask/mapper/EdgGlassTaskInfoMapper.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgglasstask/service/EdgGlassTaskInfoService.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgglasstask/service/impl/EdgGlassTaskInfoServiceImpl.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/controller/EdgStorageCageController.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/controller/EdgStorageCageDetailsController.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/entity/EdgStorageCage.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/entity/EdgStorageCageDetails.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/entity/vo/CutDrawingVO.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/entity/vo/EdgSlotRemainVO.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/entity/vo/EdgStorageCageVO.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/mapper/EdgStorageCageDetailsMapper.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/mapper/EdgStorageCageMapper.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/EdgStorageCageDetailsService.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/EdgStorageCageService.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/impl/EdgStorageCageDetailsServiceImpl.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/impl/EdgStorageCageServiceImpl.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/CacheGlassTask.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/OpcCacheGlassNewTask.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/OpcCacheGlassTask.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/OpcEdgTask.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/PushMessageToIndex.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/entity/CacheGlassInfo.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/opccallback/CacheGlassStartCallback.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/controller/EdgStorageDeviceController.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/controller/EdgStorageDeviceTaskHistoryController.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/entity/EdgStorageDeviceTask.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/entity/EdgStorageDeviceTaskHistory.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/entity/request/TaskHistoryRequest.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/mapper/EdgStorageDeviceTaskHistoryMapper.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/mapper/EdgStorageDeviceTaskMapper.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/service/EdgStorageDeviceTaskHistoryService.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/service/EdgStorageDeviceTaskService.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/service/impl/EdgStorageDeviceTaskHistoryServiceImpl.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/opctask/service/impl/EdgStorageDeviceTaskServiceImpl.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/s7/entity/S7DataWL1.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/s7/job/s7Job.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/taskcache/controller/TaskCacheController.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/taskcache/entity/TaskCache.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/taskcache/mapper/TaskCacheMapper.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/taskcache/service/TaskCacheService.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/taskcache/service/impl/TaskCacheServiceImpl.java hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/JsonFile/PlcCacheGlass.json hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/application-cz.yml hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/application-dev.yml hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/application-prod.yml hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/application-yw.yml hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/application.yml hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/logback-spring.xml hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageCageDetailsMapper.xml hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageCageMapper.xml hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageDeviceTaskHistoryMapper.xml hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageDeviceTaskMapper.xml hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/TaskCacheMapper.xml hangzhoumesParent/moduleService/CacheGlassModule/src/test/java/com/mes/CacheGlassModuleApplicationTest.java hangzhoumesParent/moduleService/CacheGlassModule/target/classes/JsonFile/PlcCacheGlass.json hangzhoumesParent/moduleService/CacheGlassModule/target/classes/application-cz.yml hangzhoumesParent/moduleService/CacheGlassModule/target/classes/application-dev.yml hangzhoumesParent/moduleService/CacheGlassModule/target/classes/application-prod.yml hangzhoumesParent/moduleService/CacheGlassModule/target/classes/application-yw.yml hangzhoumesParent/moduleService/CacheGlassModule/target/classes/application.yml hangzhoumesParent/moduleService/CacheGlassModule/target/classes/logback-spring.xml hangzhoumesParent/moduleService/CacheGlassModule/target/classes/mapper/EdgStorageCageDetailsMapper.xml hangzhoumesParent/moduleService/CacheGlassModule/target/classes/mapper/EdgStorageCageMapper.xml hangzhoumesParent/moduleService/CacheGlassModule/target/classes/mapper/EdgStorageDeviceTaskHistoryMapper.xml hangzhoumesParent/moduleService/CacheGlassModule/target/classes/mapper/EdgStorageDeviceTaskMapper.xml hangzhoumesParent/moduleService/CacheGlassModule/target/classes/mapper/TaskCacheMapper.xml hangzhoumesParent/moduleService/CacheVerticalGlassModule/pom.xml hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/AppRunnerConfig.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/CacheVerticalClassModuleApplication.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/controller/BigStorageCageController.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/controller/BigStorageCageDetailsController.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/controller/BigStorageGlassInfoController.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/controller/BigStorageGlassRelationInfoController.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/BigStorageCage.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/BigStorageCageDetails.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/BigStorageGlassInfo.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/BigStorageGlassRelationInfo.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/BigStorageAndDetailsDTO.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/BigStorageDTO.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/BigStorageRelationDTO.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/BigStorageSequenceDTO.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/BigStorageSummaryDTO.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/GlassInfoLackDTO.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/SlotSequenceDTO.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/TemperingGlassCountDTO.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/TemperingLayoutDTO.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/vo/BigStorageDetailsQueryVO.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/vo/BigStorageQueryVO.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/mapper/BigStorageCageDetailsMapper.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/mapper/BigStorageCageMapper.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/mapper/BigStorageGlassInfoMapper.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/mapper/BigStorageGlassRelationInfoMapper.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/BigStorageCageDetailsService.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/BigStorageCageService.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/BigStorageGlassInfoService.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/BigStorageGlassRelationInfoService.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageServiceImpl.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageGlassInfoServiceImpl.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageGlassRelationInfoServiceImpl.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/controller/BigStorageCageHistoryTaskController.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/entity/BigStorageCageHistoryTask.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/entity/request/BigStorageCageHistoryRequest.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/mapper/BigStorageCageHistoryTaskMapper.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/BigStorageCageHistoryTaskService.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragecagetask/service/impl/BigStorageCageHistoryTaskServiceImpl.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/controller/BigStorageCageFeedTaskController.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/controller/BigStorageCageOutTaskController.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/entity/BigStorageCageFeedTask.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/entity/BigStorageCageOutTask.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/entity/UpdateBigStorageCageDTO.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/mapper/BigStorageCageFeedTaskMapper.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/mapper/BigStorageCageOutTaskMapper.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/service/BigStorageCageFeedTaskService.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/service/BigStorageCageOutTaskService.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/service/impl/BigStorageCageFeedTaskServiceImpl.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/service/impl/BigStorageCageOutTaskServiceImpl.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/common/S7object.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/config/S7Config.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/edgglasstask/controller/EdgGlassTaskInfoController.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/edgglasstask/entity/EdgGlassTaskInfo.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/edgglasstask/mapper/EdgGlassTaskInfoMapper.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/edgglasstask/service/EdgGlassTaskInfoService.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/edgglasstask/service/impl/EdgGlassTaskInfoServiceImpl.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/OPCPlcSlicecage.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/OpcPlcStorageCageNewTask.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/OpcPlcStorageCageTask.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcSlicecage.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcStorageCageTask.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/opccallback/BigStorageStartCallback.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/s7/entity/S7Data.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/s7/job/s7Job.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/temperingglass/controller/TemperingGlassInfoController.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/temperingglass/service/TemperingGlassInfoService.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/temperingglass/service/impl/TemperingGlassInfoServiceImpl.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/tools/service/BigStorageBaseService.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/tools/service/impl/BigStorageBaseServiceImpl.java hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/JsonFile/PlcCacheVerticalGlass.json hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/application-cz.yml hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/application-dev.yml hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/application-prod.yml hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/application-yw.yml hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/application.yml hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/logback-spring.xml hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageFeedTaskMapper.xml hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageHistoryTaskMapper.xml hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageMapper.xml hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageOutTaskMapper.xml hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageGlassRelationInfoMapper.xml hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/test/java/com/mes/CacheVerticalGlassModuleApplicationTest.java hangzhoumesParent/moduleService/GlassStorageModule/pom.xml hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/GlassStorageApplication.java hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/config/S7Config.java hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/job/RawGlassPushMessage.java hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/job/RawGlassTask.java hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/controller/RawGlassStorageDetailsController.java hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassstation/controller/RawGlassStorageStationController.java hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglasstask/controller/RawGlassStorageTaskController.java hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/s7/entity/S7Data.java hangzhoumesParent/moduleService/GlassStorageModule/src/main/resources/application-alg.yml hangzhoumesParent/moduleService/GlassStorageModule/src/main/resources/application-dev.yml hangzhoumesParent/moduleService/GlassStorageModule/src/main/resources/application-prod.yml hangzhoumesParent/moduleService/GlassStorageModule/src/main/resources/application-yw.yml hangzhoumesParent/moduleService/GlassStorageModule/src/main/resources/application.yml hangzhoumesParent/moduleService/GlassStorageModule/src/test/java/mes/GlassStorageModuleApplicationTest.java hangzhoumesParent/moduleService/GlassStorageModule/target/classes/application-alg.yml hangzhoumesParent/moduleService/GlassStorageModule/target/classes/application-dev.yml hangzhoumesParent/moduleService/GlassStorageModule/target/classes/application-prod.yml hangzhoumesParent/moduleService/GlassStorageModule/target/classes/application-yw.yml hangzhoumesParent/moduleService/GlassStorageModule/target/classes/application.yml hangzhoumesParent/moduleService/LoadGlassModule/pom.xml hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/AppRunnerConfig.java hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/LoadGlassModuleApplication.java hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/common/S7object.java hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/config/S7Config.java hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/engineering/controller/EngineeringController.java hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/engineering/mapper/EngineeringMapper.java hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/engineering/mapper/xml/EngineeringMapper.xml hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/job/OpcLoadGlassTask.java hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/job/PlcLoadGlassTask.java hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/loadglassdevicetaskhistory/controller/LoadGlassDeviceTaskHistoryController.java hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/s7/entity/S7Data.java hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/controller/UpPattenUsageController.java hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/entity/OptimizeUpPattenUsage.java hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/service/UpPattenUsageService.java hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/service/impl/UpPattenUsageServiceImpl.java hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/workstation/controller/UpWorkstationController.java hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/workstation/entity/UpWorkSequence.java hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/workstation/entity/UpWorkstation.java hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/workstation/mapper/UpWorkstationMapper.java hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/workstation/service/UpWorkstationService.java hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/workstation/service/impl/UpWorkstationServiceImpl.java hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/JsonFile/PlcLoadGlass.json hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-alg.yml hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-cz.yml hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-dev.yml hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-prod.yml hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application-yw.yml hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application.yml hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/logback-spring.xml hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/mapper/UpWorkstationMapper.xml hangzhoumesParent/moduleService/LoadGlassModule/src/test/java/com/mes/ApplicationTest.java hangzhoumesParent/moduleService/LoadGlassModule/src/test/java/com/mes/LoadGlassModuleApplicationTest.java hangzhoumesParent/moduleService/LoadGlassModule/target/classes/JsonFile/PlcLoadGlass.json hangzhoumesParent/moduleService/LoadGlassModule/target/classes/application-alg.yml hangzhoumesParent/moduleService/LoadGlassModule/target/classes/application-cz.yml hangzhoumesParent/moduleService/LoadGlassModule/target/classes/application-dev.yml hangzhoumesParent/moduleService/LoadGlassModule/target/classes/application-prod.yml hangzhoumesParent/moduleService/LoadGlassModule/target/classes/application-yw.yml hangzhoumesParent/moduleService/LoadGlassModule/target/classes/application.yml hangzhoumesParent/moduleService/LoadGlassModule/target/classes/logback-spring.xml hangzhoumesParent/moduleService/LoadGlassModule/target/classes/mapper/UpWorkstationMapper.xml hangzhoumesParent/moduleService/TemperingGlassModule/pom.xml hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/TemperingGlassModuleApplication.java hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/common/S7object.java hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/OpcNGTemperingTask.java hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/PlcScreenTask.java hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/PlcTemperingGlassTask.java hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/TemperingTask.java hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingglass/controller/TemperingGlassInfoController.java hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingglass/eneity/request/DamageRequest.java hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingrecord/controller/TemperingRecordController.java hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingrecord/entity/TemperingRecord.java hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingrecord/mapper/TemperingRecordMapper.java hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingrecord/mapper/xml/TemperingRecordMapper.xml hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingrecord/service/TemperingRecordService.java hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingrecord/service/impl/TemperingRecordServiceImpl.java hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-cz.yml hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-dev.yml hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-prod.yml hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-yw.yml hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application.yml hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/changelog/changelogBase.xml hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/changelog/mesChangelogInit.sql hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/changelog/mesRedisChange.sql hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/json/PlcTemperingGlass.json hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/logback-spring.xml hangzhoumesParent/moduleService/TemperingGlassModule/src/test/java/com/mes/TemperingApplicationTest.java hangzhoumesParent/moduleService/UnLoadGlassModule/pom.xml hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/AppRunnerConfig.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/UnLoadGlassApplication.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/common/S7object.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/controller/DownGlassInfoController.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/controller/DownGlassTaskController.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/entity/DownGlassInfo.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/entity/DownGlassTask.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/entity/request/DownGlassInfoRequest.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/mapper/DownGlassInfoMapper.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/mapper/DownGlassTaskMapper.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/service/DownGlassInfoService.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/service/DownGlassTaskService.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/service/impl/DownGlassInfoServiceImpl.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/service/impl/DownGlassTaskServiceImpl.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/controller/DownStorageCageController.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/controller/DownStorageCageDetailsController.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/entity/DownStorageCage.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/entity/DownStorageCageDetails.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/entity/request/CacheWornRequest.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/mapper/DownStorageCageDetailsMapper.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/mapper/DownStorageCageMapper.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/service/DownStorageCageDetailsService.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/service/DownStorageCageService.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/service/impl/DownStorageCageDetailsServiceImpl.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/service/impl/DownStorageCageServiceImpl.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/controller/DownWorkstationController.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/controller/DownWorkstationTaskController.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/entity/DownWorkstation.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/entity/DownWorkstationTask.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/entity/DownWorkstionAndDownGlassinfo.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/entity/dto/DownGlassInfoDTO.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/entity/request/DownWorkRequest.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/mapper/DownWorkstationMapper.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/mapper/DownWorkstationTaskMapper.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/service/DownWorkstationService.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/service/DownWorkstationTaskService.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/service/impl/DownWorkstationServiceImpl.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/service/impl/DownWorkstationTaskServiceImpl.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/job/DownLoadCacheGlassTask.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/job/Downpush.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/tools/Configuration.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/tools/ExcelToJsonConverter.java hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/JsonFile/PlcdownGlass.xlsx hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/application-cz.yml hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/application-dev.yml hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/application-prod.yml hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/application-yw.yml hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/application.yml hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/logback-spring.xml hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/mapper/DownGlassInfoMapper.xml hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/mapper/DownStorageCageDetailsMapper.xml hangzhoumesParent/moduleService/UnLoadGlassModule/src/test/java/mes/UnloadGlassModuleApplicationTest.java hangzhoumesParent/moduleService/hollowGlassModule/pom.xml hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/HollowGlassApplication.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/controller/HollowBigStorageCageController.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/controller/HollowBigStorageCageDetailsController.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/controller/HollowFormulaDetailsController.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/controller/HollowGlassOutRelationInfoController.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/controller/HollowGlassRelationInfoController.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/HollowBigStorageCage.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/HollowBigStorageCageDetails.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/HollowFormulaDetails.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/HollowGlassOutRelationInfo.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/HollowGlassRelationInfo.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/dto/BigStorageSequenceDTO.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/dto/FlowCardGlassInfoDTO.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/dto/FlowCardVirtualSlotDTO.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/dto/HollowBigStorageAndDetailsDTO.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/dto/HollowBigStorageDTO.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/dto/HollowGlassDetailsDTO.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/dto/LackDetailsDTO.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/dto/LisecHollowDetails.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/dto/LisecHollowFrameDetails.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/dto/LisecHollowGlassAndFrameDetails.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/dto/LisecHollowGlassDetails.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/dto/OrderDTO.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/dto/UpdateHollowBigStorageCageDTO.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/request/HollowHistoryTaskRequest.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/request/HollowTaskRequest.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/vo/HollowAllFlowCardVO.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/vo/HollowBigStorageDetailsQueryVO.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/vo/HollowGlassFormulaVO.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/mapper/HollowBigStorageCageDetailsMapper.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/mapper/HollowBigStorageCageMapper.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/mapper/HollowFormulaDetailsMapper.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/mapper/HollowGlassOutRelationInfoMapper.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/mapper/HollowGlassRelationInfoMapper.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/service/HollowBigStorageCageDetailsService.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/service/HollowBigStorageCageService.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/service/HollowFormulaDetailsService.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/service/HollowGlassOutRelationInfoService.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/service/HollowGlassRelationInfoService.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/service/impl/HollowBigStorageCageDetailsServiceImpl.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/service/impl/HollowBigStorageCageServiceImpl.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/service/impl/HollowFormulaDetailsServiceImpl.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/service/impl/HollowGlassOutRelationInfoServiceImpl.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/service/impl/HollowGlassRelationInfoServiceImpl.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollowqueue/controller/HollowGlassQueueInfoController.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollowqueue/entity/HollowGlassQueueInfo.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollowqueue/mapper/HollowGlassQueueInfoMapper.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollowqueue/service/HollowGlassQueueInfoService.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollowqueue/service/impl/HollowGlassQueueInfoServiceImpl.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollowtask/controller/HollowBigStorageCageHistoryTaskController.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollowtask/entity/HollowBigStorageCageHistoryTask.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollowtask/entity/request/HollowBigStorageCageHistoryRequest.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollowtask/mapper/HollowBigStorageCageHistoryTaskMapper.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollowtask/service/HollowBigStorageCageHistoryTaskService.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollowtask/service/impl/HollowBigStorageCageHistoryTaskServiceImpl.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/job/OpcHollowRemoveTask.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/job/OpcPlcStorageCageHollowTask.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/job/PushMessageToIndex.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/utils/Blank.java hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/application-cz.yml hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/application-dev.yml hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/application-prod.yml hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/application-yw.yml hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/application.yml hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/logback-spring.xml hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/mapper/HollowBigStorageCageDetailsMapper.xml hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/mapper/HollowBigStorageCageHistoryTaskMapper.xml hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/mapper/HollowFormulaDetailsMapper.xml hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/mapper/HollowGlassOutRelationInfoMapper.xml hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/mapper/HollowGlassRelationInfoMapper.xml hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/templates/hollowGlass.ftl hangzhoumesParent/moduleService/pom.xml hangzhoumesParent/pom.xml hangzhoumesParent/readMe.md logs/cacheGlass/web_debug.log logs/cacheGlass/web_error.log logs/cacheGlass/web_info.log logs/cacheGlass/web_warn.log logs/loadGlass/web_debug.log logs/loadGlass/web_error.log logs/loadGlass/web_info.log logs/loadGlass/web_warn.log pom.xml replay_pid4772.log