wu
2024-06-24 09a010c5dc11c68a866a6075a74bd1bbefb4a9a8
Merge branch 'master' of http://10.153.19.25:10101/r/HangZhouMes
41个文件已修改
4个文件已添加
6个文件已删除
1966 ■■■■ 已修改文件
UI-Project/package-lock.json 193 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/package.json 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/router/index.js 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/GlassStorage/MaterialRackManagement.vue 412 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/JsonFile/PlcCacheVerticalGlass.json 66 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/base/entity/BigStorageCageBaseInfo.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/Const.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/mapper/GlassInfoMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/service/impl/GlassInfoServiceImpl.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/entity/TemperingGlassInfo.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/mapper/TemperingGlassInfoMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/resources/mapper/TemperingGlassInfoMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/application-prod.yml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/controller/BigStorageCageDetailsController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/BigStorageCageDetails.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/BigStorageDTO.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/BigStorageCageDetailsService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java 97 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageServiceImpl.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/entity/BigStorageCageOutTask.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/mapper/BigStorageCageFeedTaskMapper.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/mapper/BigStorageCageOutTaskMapper.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/service/BigStorageCageFeedTaskService.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/service/BigStorageCageOutTaskService.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/service/impl/BigStorageCageFeedTaskServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/service/impl/BigStorageCageOutTaskServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/glassinfo/controller/GlassInfoController.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/glassinfo/mapper/GlassInfoMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/glassinfo/service/GlassInfoService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/glassinfo/service/impl/GlassInfoServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcSlicecage.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcStorageCageTask.java 274 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/temperingglass/controller/TemperingGlassInfoController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/temperingglass/entity/TemperingGlassInfo.java 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/temperingglass/mapper/TemperingGlassInfoMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/temperingglass/service/TemperingGlassInfoService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/temperingglass/service/impl/TemperingGlassInfoServiceImpl.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/JsonFile/PlcCacheVerticalGlass.json 66 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/application.yml 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageFeedTaskMapper.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageOutTaskMapper.xml 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/test/java/com/mes/CacheVerticalGlassModuleApplicationTest.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/service/impl/UpPattenUsageServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/mapper/DownGlassInfoMapper.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/service/impl/DownGlassTaskServiceImpl.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/service/DownStorageCageDetailsService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/service/impl/DownStorageCageDetailsServiceImpl.java 124 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/job/DownCacheGlassTask.java 63 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/application-prod.yml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/test/java/mes/UnloadGlassModuleApplicationTest.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/package-lock.json
@@ -11,6 +11,8 @@
        "@element-plus/icons-vue": "^2.1.0",
        "@vue-macros/reactivity-transform": "^0.3.23",
        "axios": "^1.6.8",
        "chart.js": "^4.4.3",
        "echarts": "^5.5.0",
        "element-plus": "^2.4.0",
        "moment": "^2.30.1",
        "pinia": "^2.1.6",
@@ -18,6 +20,7 @@
        "sortablejs": "^1.15.1",
        "sweetalert2": "^11.10.7",
        "vue": "^3.3.4",
        "vue-echarts": "^6.7.3",
        "vue-i18n": "^9.13.1",
        "vue-router": "^4.2.4",
        "vxe-table": "^4.5.15",
@@ -28,6 +31,7 @@
        "@types/sortablejs": "^1.15.7",
        "@vitejs/plugin-vue": "^4.3.4",
        "http-proxy-middleware": "^3.0.0",
        "sass": "^1.77.6",
        "vite": "^4.4.9"
      }
    },
@@ -498,6 +502,11 @@
      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
      "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
    },
    "node_modules/@kurkle/color": {
      "version": "0.3.2",
      "resolved": "https://registry.npmmirror.com/@kurkle/color/-/color-0.3.2.tgz",
      "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw=="
    },
    "node_modules/@popperjs/core": {
      "name": "@sxzz/popperjs-es",
      "version": "2.11.7",
@@ -917,6 +926,17 @@
        "node": ">=0.8"
      }
    },
    "node_modules/chart.js": {
      "version": "4.4.3",
      "resolved": "https://registry.npmmirror.com/chart.js/-/chart.js-4.4.3.tgz",
      "integrity": "sha512-qK1gkGSRYcJzqrrzdR6a+I0vQ4/R+SoODXyAjscQ/4mzuNzySaMCd+hyVxitSY1+L2fjPD1Gbn+ibNqRmwQeLw==",
      "dependencies": {
        "@kurkle/color": "^0.3.0"
      },
      "engines": {
        "pnpm": ">=8"
      }
    },
    "node_modules/chokidar": {
      "version": "3.5.3",
      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
@@ -1012,6 +1032,15 @@
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/dom-zindex/-/dom-zindex-1.0.1.tgz",
      "integrity": "sha512-M/MERVDZ8hguvjl6MAlLWSLYLS7PzEyXaTb5gEeJ+SF+e9iUC0sdvlzqe91MMDHBoy+nqw7wKcUOrDSyvMCrRg=="
    },
    "node_modules/echarts": {
      "version": "5.5.0",
      "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.5.0.tgz",
      "integrity": "sha512-rNYnNCzqDAPCr4m/fqyUFv7fD9qIsd50S6GDFgO1DxZhncCsNsG7IfUlAlvZe5oSEQxtsjnHiUuppzccry93Xw==",
      "dependencies": {
        "tslib": "2.3.0",
        "zrender": "5.5.0"
      }
    },
    "node_modules/element-plus": {
      "version": "2.4.0",
@@ -1190,6 +1219,12 @@
      "engines": {
        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
      }
    },
    "node_modules/immutable": {
      "version": "4.3.6",
      "resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.3.6.tgz",
      "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==",
      "dev": true
    },
    "node_modules/is-binary-path": {
      "version": "2.1.0",
@@ -1500,6 +1535,11 @@
      "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
      "dev": true
    },
    "node_modules/resize-detector": {
      "version": "0.3.0",
      "resolved": "https://registry.npmmirror.com/resize-detector/-/resize-detector-0.3.0.tgz",
      "integrity": "sha512-R/tCuvuOHQ8o2boRP6vgx8hXCCy87H1eY9V5imBYeVNyNVpuL9ciReSccLj2gDcax9+2weXy3bc8Vv+NRXeEvQ=="
    },
    "node_modules/rollup": {
      "version": "3.29.4",
      "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz",
@@ -1514,6 +1554,23 @@
      },
      "optionalDependencies": {
        "fsevents": "~2.3.2"
      }
    },
    "node_modules/sass": {
      "version": "1.77.6",
      "resolved": "https://registry.npmmirror.com/sass/-/sass-1.77.6.tgz",
      "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==",
      "dev": true,
      "dependencies": {
        "chokidar": ">=3.0.0 <4.0.0",
        "immutable": "^4.0.0",
        "source-map-js": ">=0.6.2 <2.0.0"
      },
      "bin": {
        "sass": "sass.js"
      },
      "engines": {
        "node": ">=14.0.0"
      }
    },
    "node_modules/sortablejs": {
@@ -1563,6 +1620,11 @@
      "engines": {
        "node": ">=8.0"
      }
    },
    "node_modules/tslib": {
      "version": "2.3.0",
      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
      "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
    },
    "node_modules/undici-types": {
      "version": "5.26.5",
@@ -1646,6 +1708,55 @@
        "@vue/runtime-dom": "3.3.4",
        "@vue/server-renderer": "3.3.4",
        "@vue/shared": "3.3.4"
      }
    },
    "node_modules/vue-echarts": {
      "version": "6.7.3",
      "resolved": "https://registry.npmmirror.com/vue-echarts/-/vue-echarts-6.7.3.tgz",
      "integrity": "sha512-vXLKpALFjbPphW9IfQPOVfb1KjGZ/f8qa/FZHi9lZIWzAnQC1DgnmEK3pJgEkyo6EP7UnX6Bv/V3Ke7p+qCNXA==",
      "hasInstallScript": true,
      "dependencies": {
        "resize-detector": "^0.3.0",
        "vue-demi": "^0.13.11"
      },
      "peerDependencies": {
        "@vue/composition-api": "^1.0.5",
        "@vue/runtime-core": "^3.0.0",
        "echarts": "^5.4.1",
        "vue": "^2.6.12 || ^3.1.1"
      },
      "peerDependenciesMeta": {
        "@vue/composition-api": {
          "optional": true
        },
        "@vue/runtime-core": {
          "optional": true
        }
      }
    },
    "node_modules/vue-echarts/node_modules/vue-demi": {
      "version": "0.13.11",
      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.11.tgz",
      "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==",
      "hasInstallScript": true,
      "bin": {
        "vue-demi-fix": "bin/vue-demi-fix.js",
        "vue-demi-switch": "bin/vue-demi-switch.js"
      },
      "engines": {
        "node": ">=12"
      },
      "funding": {
        "url": "https://github.com/sponsors/antfu"
      },
      "peerDependencies": {
        "@vue/composition-api": "^1.0.0-rc.1",
        "vue": "^3.0.0-0 || ^2.6.0"
      },
      "peerDependenciesMeta": {
        "@vue/composition-api": {
          "optional": true
        }
      }
    },
    "node_modules/vue-i18n": {
@@ -1743,6 +1854,14 @@
      },
      "engines": {
        "node": ">=0.8"
      }
    },
    "node_modules/zrender": {
      "version": "5.5.0",
      "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.5.0.tgz",
      "integrity": "sha512-O3MilSi/9mwoovx77m6ROZM7sXShR/O/JIanvzTwjN3FORfLSr81PsUGd7jlaYOeds9d8tw82oP44+3YucVo+w==",
      "dependencies": {
        "tslib": "2.3.0"
      }
    }
  },
@@ -1986,6 +2105,11 @@
      "version": "1.4.15",
      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
      "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
    },
    "@kurkle/color": {
      "version": "0.3.2",
      "resolved": "https://registry.npmmirror.com/@kurkle/color/-/color-0.3.2.tgz",
      "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw=="
    },
    "@popperjs/core": {
      "version": "npm:@sxzz/popperjs-es@2.11.7",
@@ -2297,6 +2421,14 @@
        "crc-32": "~1.2.0"
      }
    },
    "chart.js": {
      "version": "4.4.3",
      "resolved": "https://registry.npmmirror.com/chart.js/-/chart.js-4.4.3.tgz",
      "integrity": "sha512-qK1gkGSRYcJzqrrzdR6a+I0vQ4/R+SoODXyAjscQ/4mzuNzySaMCd+hyVxitSY1+L2fjPD1Gbn+ibNqRmwQeLw==",
      "requires": {
        "@kurkle/color": "^0.3.0"
      }
    },
    "chokidar": {
      "version": "3.5.3",
      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
@@ -2358,6 +2490,15 @@
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/dom-zindex/-/dom-zindex-1.0.1.tgz",
      "integrity": "sha512-M/MERVDZ8hguvjl6MAlLWSLYLS7PzEyXaTb5gEeJ+SF+e9iUC0sdvlzqe91MMDHBoy+nqw7wKcUOrDSyvMCrRg=="
    },
    "echarts": {
      "version": "5.5.0",
      "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.5.0.tgz",
      "integrity": "sha512-rNYnNCzqDAPCr4m/fqyUFv7fD9qIsd50S6GDFgO1DxZhncCsNsG7IfUlAlvZe5oSEQxtsjnHiUuppzccry93Xw==",
      "requires": {
        "tslib": "2.3.0",
        "zrender": "5.5.0"
      }
    },
    "element-plus": {
      "version": "2.4.0",
@@ -2493,6 +2634,12 @@
        "is-plain-obj": "^3.0.0",
        "micromatch": "^4.0.5"
      }
    },
    "immutable": {
      "version": "4.3.6",
      "resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.3.6.tgz",
      "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==",
      "dev": true
    },
    "is-binary-path": {
      "version": "2.1.0",
@@ -2684,6 +2831,11 @@
      "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
      "dev": true
    },
    "resize-detector": {
      "version": "0.3.0",
      "resolved": "https://registry.npmmirror.com/resize-detector/-/resize-detector-0.3.0.tgz",
      "integrity": "sha512-R/tCuvuOHQ8o2boRP6vgx8hXCCy87H1eY9V5imBYeVNyNVpuL9ciReSccLj2gDcax9+2weXy3bc8Vv+NRXeEvQ=="
    },
    "rollup": {
      "version": "3.29.4",
      "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz",
@@ -2691,6 +2843,17 @@
      "devOptional": true,
      "requires": {
        "fsevents": "~2.3.2"
      }
    },
    "sass": {
      "version": "1.77.6",
      "resolved": "https://registry.npmmirror.com/sass/-/sass-1.77.6.tgz",
      "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==",
      "dev": true,
      "requires": {
        "chokidar": ">=3.0.0 <4.0.0",
        "immutable": "^4.0.0",
        "source-map-js": ">=0.6.2 <2.0.0"
      }
    },
    "sortablejs": {
@@ -2728,6 +2891,11 @@
      "requires": {
        "is-number": "^7.0.0"
      }
    },
    "tslib": {
      "version": "2.3.0",
      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
      "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
    },
    "undici-types": {
      "version": "5.26.5",
@@ -2768,6 +2936,23 @@
        "@vue/runtime-dom": "3.3.4",
        "@vue/server-renderer": "3.3.4",
        "@vue/shared": "3.3.4"
      }
    },
    "vue-echarts": {
      "version": "6.7.3",
      "resolved": "https://registry.npmmirror.com/vue-echarts/-/vue-echarts-6.7.3.tgz",
      "integrity": "sha512-vXLKpALFjbPphW9IfQPOVfb1KjGZ/f8qa/FZHi9lZIWzAnQC1DgnmEK3pJgEkyo6EP7UnX6Bv/V3Ke7p+qCNXA==",
      "requires": {
        "resize-detector": "^0.3.0",
        "vue-demi": "^0.13.11"
      },
      "dependencies": {
        "vue-demi": {
          "version": "0.13.11",
          "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.11.tgz",
          "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==",
          "requires": {}
        }
      }
    },
    "vue-i18n": {
@@ -2835,6 +3020,14 @@
        "wmf": "~1.0.1",
        "word": "~0.3.0"
      }
    },
    "zrender": {
      "version": "5.5.0",
      "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.5.0.tgz",
      "integrity": "sha512-O3MilSi/9mwoovx77m6ROZM7sXShR/O/JIanvzTwjN3FORfLSr81PsUGd7jlaYOeds9d8tw82oP44+3YucVo+w==",
      "requires": {
        "tslib": "2.3.0"
      }
    }
  }
}
UI-Project/package.json
@@ -11,6 +11,8 @@
    "@element-plus/icons-vue": "^2.1.0",
    "@vue-macros/reactivity-transform": "^0.3.23",
    "axios": "^1.6.8",
    "chart.js": "^4.4.3",
    "echarts": "^5.5.0",
    "element-plus": "^2.4.0",
    "moment": "^2.30.1",
    "pinia": "^2.1.6",
@@ -18,6 +20,7 @@
    "sortablejs": "^1.15.1",
    "sweetalert2": "^11.10.7",
    "vue": "^3.3.4",
    "vue-echarts": "^6.7.3",
    "vue-i18n": "^9.13.1",
    "vue-router": "^4.2.4",
    "vxe-table": "^4.5.15",
@@ -28,6 +31,7 @@
    "@types/sortablejs": "^1.15.7",
    "@vitejs/plugin-vue": "^4.3.4",
    "http-proxy-middleware": "^3.0.0",
    "sass": "^1.77.6",
    "vite": "^4.4.9"
  }
}
UI-Project/src/router/index.js
@@ -187,6 +187,19 @@
          ]
        },
        {
          path: 'GlassStorage',
          name: 'GlassStorage',
          component: () => import('../views/GlassStorage/MaterialRackManagement.vue'),
          children:[
            {
              path: '/GlassStorage/MaterialRackManagement',
              name: 'MaterialRackManagement',
              component: () => import('../views/GlassStorage/MaterialRackManagement.vue')
            }
          ]
         },
         /*----------- 可视化系统 ----------------*/
         {
          path: 'Visualization',
UI-Project/src/views/GlassStorage/MaterialRackManagement.vue
New file
@@ -0,0 +1,412 @@
<template>
  <div >
    <el-card style="flex: 1; margin-left: 10px; " :loading="loading">
      <div slot="header" class="clearfix" style="display: flex; align-items: center;">
<!-- 左侧按钮组 -->
<div >
  <el-button type="success" size="mini" @click="handleInbound()">入库</el-button>
  <el-button type="success" size="mini" @click="handleInbound()">吊装位入库</el-button>
  <el-button type="success" size="mini" @click="handleInbound()">添加原片</el-button>
</div>
<!-- 右侧选择框 -->
<el-form-item style="margin-top: 15px; width: 150px;">
  <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-table
        :data="tableData"
        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="location" label="库位号"></el-table-column>
        <el-table-column prop="type" label="类型"></el-table-column>
        <el-table-column prop="length" label="长度(mm)"></el-table-column>
        <el-table-column prop="height" label="高度(mm)"></el-table-column>
        <el-table-column prop="thickness" label="厚度(mm)"></el-table-column>
        <el-table-column prop="quantity" label="数量"></el-table-column>
        <el-table-column prop="entry_time" label="入库时间"></el-table-column>
        <el-table-column prop="batchnumber" label="批次号"></el-table-column>
        <el-table-column
  align="center"
  label="料架状态"
  min-width="80"
  prop="shelf_status"
>
  <template #default="scope">
    <el-tag :type="getTagType(scope.row.shelf_status)">
      {{ scope.row.shelf_status === 1 ? '启用' : '未启用' }}
    </el-tag>
  </template>
</el-table-column>
        <!-- 操作列 -->
        <el-table-column label="操作" width="300">
          <template #default="{ row }">
            <el-button type="primary" size="mini" @click="handleEdit(row)">修改</el-button>
            <el-button type="danger" size="mini" @click="handleDelete(row)">删除</el-button>
            <el-button type="warning" size="mini" @click="handleCheckout(row)">出库</el-button>
          </template>
        </el-table-column>
      </el-table>
      <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="Glassid" label="Glassid"></el-table-column>
    <el-table-column prop="taskDescription" label="任务描述" width="250"></el-table-column>
    <el-table-column prop="glassThickness" label="玻璃厚度"></el-table-column>
    <el-table-column prop="glassFilm" label="玻璃膜系"></el-table-column>
    <el-table-column prop="creationTime" label="创建时间"></el-table-column>
    <el-table-column
      align="center"
      label="任务状态"
      min-width="80"
      prop="taskStatus"
    >
      <template #default="scope">
        <el-tag :type="getTagType2(scope.row.taskStatus)">
          {{ scope.row.taskStatus == 'completed' ? '完成' : '进行中' }}
        </el-tag>
      </template>
    </el-table-column>
    <!-- 操作列 -->
    <el-table-column label="操作" width="350">
      <template #default="{ row }">
        <el-button type="primary" size="mini" @click="handleRestart(row)">重新开始</el-button>
        <el-button type="danger" size="mini" @click="handleDelete(row)">删除任务</el-button>
        <el-button type="success" size="mini" @click="handleComplete(row)">任务完成</el-button>
      </template>
    </el-table-column>
  </el-table>
    </el-card>
    <div ref="chart" id="chart" style="width: 100%; height: 250px;"></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.shelf" placeholder="请选择进库料架">
            <el-option label="A1" value="A1"></el-option>
            <el-option label="B2" value="B2"></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.width" placeholder="请输入宽度"></el-input>
        </el-form-item>
        <el-form-item label="高度">
          <el-input v-model.number="formData.height" placeholder="请输入高度"></el-input>
        </el-form-item>
        <el-form-item label="厚度">
          <el-input v-model.number="formData.thickness" placeholder="请输入厚度"></el-input>
        </el-form-item>
        <el-form-item label="数量">
          <el-input v-model.number="formData.quantity" 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>
    <div ref="chart" id="chart" style="width: 100%; height: 400px;"></div>
  </div>
</template>
<script setup>
import { ref, onMounted, onBeforeUnmount } from 'vue'; // 导入 Vue 3 的模块
import * as echarts from 'echarts';
    const loading = ref(false);
    const tableData = ref([
    {
        location: '1',
        type: 'Type A',
        length: '100',
        height: '50',
        thickness: '10',
        quantity: '5',
        entry_time: '2024-06-19',
        batchnumber:"444",
        shelf_status: 1
      },
      {
        location: '2',
        type: 'Type B',
        length: '120',
        height: '60',
        thickness: '12',
        quantity: '10',
        entry_time: '2024-06-18',
        batchnumber:"444",
        shelf_status: 0
      },
      {
        location: '3',
        type: 'Type B',
        length: '120',
        height: '60',
        thickness: '12',
        quantity: '10',
        entry_time: '2024-06-18',
        batchnumber:"444",
        shelf_status: 1
      },
      {
        location: '4',
        type: 'Type B',
        length: '120',
        height: '60',
        thickness: '12',
        quantity: '10',
        entry_time: '2024-06-18',
        batchnumber:"444",
        shelf_status: 1
      },
      {
        location: '5',
        type: 'Type B',
        length: '120',
        height: '60',
        thickness: '12',
        quantity: '10',
        entry_time: '2024-06-18',
        batchnumber:"444",
        shelf_status: 1
      }
      // Add more data as needed
    ]);
   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 tasktableData=ref([
    {
          Glassid: 'G001',
          taskDescription: '从吊装位【99】到仓位【56】',
          taskStatus: 'in-progress',
          glassThickness: '5mm',
          glassFilm: '膜系A',
          creationTime: '2024-06-19 10:00:00'
        },
        {
          Glassid: 'G002',
          taskDescription: '从吊装位【99】到仓位【56】',
          taskStatus: 'completed',
          glassThickness: '10mm',
          glassFilm: '膜系B',
          creationTime: '2024-06-19 11:00:00'
        }
        ]);
    const dialogVisible = ref(false);
    const formData = ref({
      shelf: '',
      color: '',
      width: '',
      height: '',
      thickness: '',
      quantity: ''
    });
    const formData2 = ref({
      dzw: '',
    });
    const handleEdit = (row) => {
      // 处理修改数量逻辑
      console.log('Edit Quantity:', row);
    };
    const handleDelete = (row) => {
      // 处理删除逻辑
      console.log('Delete:', row);
    };
    const handleCheckout = (row) => {
      // 处理出库逻辑
      console.log('Checkout:', row);
    };
    const handleInbound = () => {
      // 打开入库对话框
      dialogVisible.value = true;
    };
    const handleCloseDialog = () => {
      // 关闭对话框时重置表单数据
      formData.value = {
        shelf: '',
        color: '',
        width: '',
        height: '',
        thickness: '',
        quantity: ''
      };
      dialogVisible.value = false;
    };
    const handleConfirmInbound = () => {
      // 处理确认入库逻辑,可以在这里提交表单或者执行其他操作
      console.log('Confirm Inbound:', formData.value);
      // 关闭对话框
      dialogVisible.value = false;
    };
    let chartInstance = null;
onMounted(() => {
  // Initialize the chart
  chartInstance = echarts.init(document.getElementById('chart'));
  // Simulated data for demonstration
  const chartData = {
    labels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'],
    datasets: [
      { name: '使用情况统计', data: [{ remaining: 4, total: 5 }, { remaining: 9, total: 10 }, { remaining: 0, total: 30 }, { remaining: 0, total: 10 },{ remaining: 4, total: 5 }] }
    ]
  };
  const options = {
    tooltip: {
      trigger: 'axis',
      axisPointer: {
        type: 'shadow'
      }
    },
    legend: {
      data: ['使用情况统计']
    },
    xAxis: {
      type: 'category',
      data: chartData.labels
    },
    yAxis: {
      type: 'value'
    },
    series: chartData.datasets.map(item => ({
      name: item.name,
      type: 'bar',
      stack: '总量',
      label: {
        show: true,
        position: 'inside',
        formatter: '{c}%'
      },
      data: item.data.map(dataItem => ({
        value: (dataItem.remaining / dataItem.total * 100).toFixed(2), // 计算剩余量占比,保留两位小数
        remaining: dataItem.remaining,
        total: dataItem.total,
        itemStyle: {
          color: getColorByRemaining(dataItem.remaining, dataItem.total)
        }
      }))
    }))
  };
  function getColorByRemaining(remaining, total) {
    // 根据剩余量与总量的比例,设置不同的颜色逻辑
    const percentage = remaining / total;
    if (percentage >= 0.8) {
      return '#FF6666'; // Red
    } else if (percentage >= 0.5) {
      return '#FFCC66'; // Yellow
    } else {
      return '#66CC66'; // Green
    }
  }
  // Set options and render chart
  if (chartInstance) {
    chartInstance.setOption(options);
  }
});
onBeforeUnmount(() => {
  if (chartInstance) {
    chartInstance.dispose();
    chartInstance = null;
  }
});
const handleSelectionChange = (selection) => {
  console.log('Selection changed:', selection);
};
</script>
<style>
</style>
hangzhoumesParent/JsonFile/PlcCacheVerticalGlass.json
@@ -1,6 +1,6 @@
{
  "plcAddressBegin":"DB.0",
  "plcAddressLenght":"72",
  "plcAddressBegin":"DB14.0",
  "plcAddressLenght":"84",
  "dataType":"word",
  "parameteInfor":[
    {
@@ -19,7 +19,7 @@
    },
    {
      "codeId": "D04Request",
      "addressIndex":"8",
      "addressIndex":"34",
      "addressLenght":"2",
      "ratio":"1",
      "unit":""
@@ -27,28 +27,62 @@
    {
      "codeId": "D04ID1",
      "addressIndex":"10",
      "addressLenght":"6",
      "addressLenght":"36",
      "ratio":"1",
      "unit":""
    },
    {
      "codeId": "D02Go",
      "addressIndex":"20",
      "codeId": "E01Status",
      "addressIndex":"2",
      "addressLenght":"68",
      "ratio":"1",
      "unit":""
    },
    {
      "codeId": "E02Status",
      "addressIndex":"2",
      "addressLenght":"70",
      "ratio":"1",
      "unit":""
    },
    {
      "codeId": "MaxTaskNo",
      "addressIndex":"2",
      "addressLenght":"72",
      "ratio":"1",
      "unit":""
    },
    {
      "codeId": "D02MaxWidth",
      "addressIndex":"2",
      "addressLenght":"74",
      "ratio":"1",
      "unit":""
    },
    {
      "codeId": "D05MaxWidth",
      "addressIndex":"2",
      "addressLenght":"76",
      "ratio":"1",
      "unit":""
    },
    {
      "codeId": "GlassGap",
      "addressIndex":"2",
      "addressLenght":"78",
      "ratio":"1",
      "unit":""
    },
    {
      "codeId": "D02SitState",
      "addressIndex":"80",
      "addressLenght":"2",
      "ratio":"1",
      "unit":""
    },
    {
      "codeId": "D05Go",
      "addressIndex":"22",
      "addressLenght":"2",
      "ratio":"1",
      "unit":""
    }
  ,
    {
      "codeId": "DeviceStatus",
      "addressIndex":"70",
      "codeId": "D05SitState",
      "addressIndex":"82",
      "addressLenght":"2",
      "ratio":"1",
      "unit":""
hangzhoumesParent/common/servicebase/src/main/java/com/mes/base/entity/BigStorageCageBaseInfo.java
New file
@@ -0,0 +1,32 @@
package com.mes.base.entity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @Author : zhoush
 * @Date: 2024/6/21 9:40
 * @Description:
 */
@Data
public class BigStorageCageBaseInfo {
    /**
     * 玻璃id
     */
    @ApiModelProperty(value = "玻璃id")
    private String glassId;
    /**
     * 宽
     */
    @ApiModelProperty(value = "宽")
    private Double width;
    /**
     * 格子号
     */
    @ApiModelProperty(value = "玻璃id")
    private Integer slot;
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/Const.java
@@ -18,8 +18,8 @@
     * 磨边清洗前
     */
    /**
     * A09出片目标位置2001
     * A10出片目标位置2002
     * A09出片目标位置  d02卧转立 钢化出片    2001
     * A10出片目标位置  d05卧转立 人工出片    2002
     */
    public static final Integer A09_OUT_TARGET_POSITION = 2001;
    public static final Integer A10_OUT_TARGET_POSITION = 2002;
@@ -73,8 +73,22 @@
     * 0 大理片笼无请求
     * 1 大理片笼进片请求
     */
    public static final Integer BIG_STORAGE_REQUEST = 0;
    public static final Integer BIG_STORAGE_REQUEST_IN = 1;
    public static final String BIG_STORAGE_REQUEST = "0";
    public static final String BIG_STORAGE_REQUEST_IN = "1";
    /**
     * 大理片笼详情状态
     * 0 大理片笼进片中
     * 1 大理片笼在笼内
     * 2 大理片笼出片中
     * 3 大理片笼出片完成
     * 4 大理片笼手动出片
     */
    public static final Integer BIG_STORAGE_IN = 0;
    public static final Integer BIG_STORAGE_INSIDE = 1;
    public static final Integer BIG_STORAGE_OUT = 2;
    public static final Integer BIG_STORAGE_OUTSIDE = 3;
    public static final Integer BIG_STORAGE_MANUAL = 4;
    /**
     * 卧转立进片请求
@@ -87,6 +101,7 @@
    public static final Integer BIG_STORAGE_IN_UP = 2;
    public static final Integer BIG_STORAGE_IN_CAR = 3;
    public static final Integer BIG_STORAGE_IN_SLOT = 4;
    public static final List<Integer> BIG_STORAGE_IN_UP_ALL = Arrays.asList(1, 2);
    /**
     * 卧转立出片请求
     * 1 任务生成
@@ -104,12 +119,6 @@
     */
    public static final Integer BIG_STORAGE_IN_WAIT = 1;
    public static final Integer BIG_STORAGE_IN_RUN = 2;
    /**
     * 大理片笼宽度 及 玻璃间距
     */
    public static final Integer BIG_STORAGE_WIDTH = 5000;
    public static final Integer BIG_STORAGE_GAP = 20;
    /**
     * 钢化小片表
hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/mapper/GlassInfoMapper.java
@@ -2,7 +2,6 @@
import com.github.yulichang.base.MPJBaseMapper;
import com.mes.glassinfo.entity.GlassInfo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
 * <p>
@@ -12,6 +11,6 @@
 * @author wu
 * @since 2024-04-29
 */
public interface GlassInfoMapper extends BaseMapper<GlassInfo>, MPJBaseMapper<GlassInfo> {
public interface GlassInfoMapper extends MPJBaseMapper<GlassInfo> {
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/service/impl/GlassInfoServiceImpl.java
@@ -4,21 +4,21 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.yulichang.base.MPJBaseServiceImpl;
import com.github.yulichang.query.MPJQueryWrapper;
import com.github.yulichang.toolkit.JoinWrappers;
import com.mes.glassinfo.entity.GlassInfo;
import com.mes.glassinfo.entity.OptimizeGlassinfo;
import com.mes.glassinfo.mapper.GlassInfoMapper;
import com.mes.glassinfo.service.GlassInfoService;
import com.mes.pp.entity.OptimizeProject;
import com.mes.pp.mapper.OptimizeProjectMapper;
import com.mes.uppattenusage.entity.UpPattenUsage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * <p>
@@ -33,6 +33,7 @@
public class GlassInfoServiceImpl extends MPJBaseServiceImpl<GlassInfoMapper, GlassInfo> implements GlassInfoService {
    @Autowired
    OptimizeProjectMapper optimizeProjectMapper;
    @Override
    @DS("pp")
    public List<GlassInfo> selectGlassInfo(String engineeringId) {
@@ -87,10 +88,6 @@
    }
    @Override
    public int getGlassInfoCountByFlowCardId(String flowCardId) {
        return baseMapper.selectCount(new QueryWrapper<GlassInfo>().lambda()
@@ -98,24 +95,37 @@
    }
    @Override
    public List<Map<String, Object>> getFlowCardId() {
        return baseMapper.selectJoinMaps(JoinWrappers.lambda(GlassInfo.class)
                .select(GlassInfo::getFlowCardId)
                .leftJoin(UpPattenUsage.class, on -> on
                        .eq(OptimizeProject::getProjectNo, GlassInfo::getEngineerId)
                        .ne(OptimizeProject::getState, 300)
                )
                .groupBy(GlassInfo::getFlowCardId)
        // 第二个查询:查询 OptimizeProject 表,根据 GlassInfo 的 engineerId 和 state 进行筛选
        List<OptimizeProject> optimizeProjects = optimizeProjectMapper.selectList(
                new QueryWrapper<OptimizeProject>()
                        .ne("state", 300)
        );
        // 提取 engineerId 列表
        List<String> engineerIds = optimizeProjects.stream()
                .map(OptimizeProject::getProjectNo)
                .collect(Collectors.toList());
        // 第一个查询:查询 GlassInfo 表并按 flow_card_id 分组,同时筛选出在 engineerIds 列表中的记录
        List<GlassInfo> glassInfos = baseMapper.selectList(
                new QueryWrapper<GlassInfo>()
                        .in("engineer_id", engineerIds)
                        .groupBy("flow_card_id")
        );
        // 转换为 List<Map<String, Object>>
        List<Map<String, Object>> result = glassInfos.stream()
                .map(glassInfo -> {
                    Map<String, Object> map = new HashMap<>();
                    map.put("flow_card_id", glassInfo.getFlowCardId());
                    // 如果还有其他字段需要添加到 map 中,在这里继续添加
                    return map;
                })
                .collect(Collectors.toList());
        log.info("result: {}", result);
        return result;
    }
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/entity/TemperingGlassInfo.java
@@ -2,6 +2,9 @@
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.mes.base.entity.BigStorageCageBaseInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -13,88 +16,92 @@
 * </p>
 *
 * @author zhoush
 * @since 2024-04-07
 * @since 2024-03-27
 */
@ApiModel(description = "<p> 钢化小片信息表 </p>")
@Data
@EqualsAndHashCode(callSuper = false)
public class TemperingGlassInfo implements Serializable {
public class TemperingGlassInfo extends BigStorageCageBaseInfo implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * 钢化小片信息表id
     */
    @ApiModelProperty(value = "钢化小片信息表id", position = 2)
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * 流程卡
     */
    private String flowcardId;
    @ApiModelProperty(value = "流程卡", position = 4)
    private String flowCardId;
    /**
     * 流程卡玻璃类型
     */
    @ApiModelProperty(value = "流程卡玻璃类型", position = 5)
    private Integer glassType;
    /**
     * 宽
     */
    private Double width;
    /**
     * 高
     */
    @ApiModelProperty(value = "高", position = 7)
    private Double height;
    /**
     * 厚度
     */
    @ApiModelProperty(value = "厚度", position = 8)
    private Double thickness;
    /**
     * 膜系
     */
    private Integer filmsid;
    @ApiModelProperty(value = "膜系", position = 9)
    private String filmsid;
    /**
     * 钢化是否接受横放
     */
    @ApiModelProperty(value = "钢化是否接受横放", position = 10)
    private Integer ishorizontal;
    /**
     * 钢化版图id
     */
    @ApiModelProperty(value = "钢化版图id", position = 11)
    private Integer temperingLayoutId;
    /**
     * 钢化版图片序
     */
    @ApiModelProperty(value = "钢化版图片序", position = 12)
    private Integer temperingFeedSequence;
    /**
     * x坐标
     */
    @ApiModelProperty(value = "x坐标", position = 13)
    private Integer xCoordinate;
    /**
     * y坐标
     */
    @ApiModelProperty(value = "y坐标", position = 14)
    private Integer yCoordinate;
    /**
     * 旋转角度(逆时针)
     */
    @ApiModelProperty(value = "旋转角度(逆时针)", position = 15)
    private Integer angle;
    /**
     * 状态
     */
    @ApiModelProperty(value = "状态", position = 16)
    private Integer state;
    /**
     * 格子号
     */
    private Integer slot;
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/mapper/TemperingGlassInfoMapper.java
@@ -3,6 +3,9 @@
import com.baomidou.dynamic.datasource.annotation.DS;
import com.github.yulichang.base.MPJBaseMapper;
import com.mes.temperingglass.entity.TemperingGlassInfo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * <p>
@@ -15,4 +18,6 @@
@DS("salve_hangzhoumes")
public interface TemperingGlassInfoMapper extends MPJBaseMapper<TemperingGlassInfo> {
    boolean saveBatch(@Param(value = "list") List<TemperingGlassInfo> list);
}
hangzhoumesParent/common/servicebase/src/main/resources/mapper/TemperingGlassInfoMapper.xml
New file
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mes.temperingglass.mapper.TemperingGlassInfoMapper">
    <insert id="saveBatch">
        INSERT INTO tempering_glass_info (glass_id, flow_card_id, glass_type, width, height, thickness, filmsid,
        ishorizontal, tempering_layout_id,
        tempering_feed_sequence, x_coordinate, y_coordinate, angle, state, slot ) VALUES
        <foreach collection="list" item="item" separator=",">
            (#{item.glassId}, #{item.flowCardId}, #{item.glassType}, #{item.width}, #{item.height}, #{item.thickness},
            #{item.filmsid},#{item.ishorizontal},
            #{item.temperingLayoutId}, #{item.temperingFeedSequence}, #{item.xCoordinate}, #{item.yCoordinate},
            #{item.angle}, #{item.state}, #{item.slot})
        </foreach>
    </insert>
</mapper>
hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/application-prod.yml
@@ -14,6 +14,11 @@
          username: root
          password: beibo.123/
          driver-class-name: com.mysql.cj.jdbc.Driver
        salve_hangzhoumes:
          url: jdbc:sqlserver://10.153.19.150:1433;databasename=hangzhoumes
          username: sa
          password: beibo.123/
          driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
  cloud:
    nacos:
      discovery:
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/controller/BigStorageCageDetailsController.java
@@ -49,10 +49,10 @@
        return Result.build(200,"删除成功",1);
    }
    @ApiOperation("理片笼任务破损")
    @ApiOperation("理片笼任务破损0/拿走1")
    @PostMapping("/damageBigStorageCageDetails")
    public Result damageBigStorageCageDetails(BigStorageCageDetails bigStorageCageDetails) {
        bigStorageCageDetailsService.damageBigStorageCageDetails(bigStorageCageDetails.getGlassId());
    public Result damageBigStorageCageDetails(BigStorageCageDetails bigStorageCageDetails,int status) {
        bigStorageCageDetailsService.damageBigStorageCageDetails(bigStorageCageDetails.getGlassId(),status);
        return Result.build(200,"破损成功",1);
    }
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/BigStorageCageDetails.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.mes.base.entity.BigStorageCageBaseInfo;
import com.mes.bigstoragetask.entity.BigStorageCageFeedTask;
import com.mes.bigstoragetask.entity.BigStorageCageOutTask;
import io.swagger.annotations.Api;
@@ -23,7 +24,7 @@
@Api(description = "大理片笼详情")
@Data
@EqualsAndHashCode(callSuper = false)
public class BigStorageCageDetails implements Serializable {
public class BigStorageCageDetails extends BigStorageCageBaseInfo implements Serializable {
    private static final long serialVersionUID = 1L;
@@ -40,17 +41,6 @@
    @ApiModelProperty(value = "设备id", position = 3)
    private Integer deviceId;
    /**
     * 栅格号
     */
    @ApiModelProperty(value = "栅格号", position = 4)
    private Integer slot;
    /**
     * 玻璃id
     */
    @ApiModelProperty(value = "玻璃id", position = 5)
    private String glassId;
    /**
     * 小片在格内的顺序
@@ -69,12 +59,6 @@
     */
    @ApiModelProperty(value = "玻璃类型", position = 8)
    private Integer glassType;
    /**
     * 宽
     */
    @ApiModelProperty(value = "宽", position = 9)
    private Double width;
    /**
     * 高
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/BigStorageDTO.java
@@ -9,6 +9,17 @@
 */
@Data
public class BigStorageDTO {
    /**
     * 格子号
     */
    private Integer slot;
    /**
     * 剩余宽度
     */
    private Integer width;
    /**
     * 玻璃数量
     */
    private Integer glassCount;
}
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/BigStorageCageDetailsService.java
@@ -25,7 +25,7 @@
    void deleteBigStorageCageDetails(BigStorageCageDetails bigStorageCageDetails);
    void damageBigStorageCageDetails(String glassId);
    void damageBigStorageCageDetails(String glassId,int status);
    BigStorageCageDetails selectBigStorageCageDetails(String glassId);
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java
@@ -55,19 +55,33 @@
    @Value("${mes.minCount}")
    private int minCount;
    @Value("${mes.carWidth}")
    private Integer carWidth;
    @Value("${mes.slotWidth}")
    private Integer slotWidth;
    @Value("${mes.carMaxSize}")
    private Integer carMaxSize;
    @Value("${mes.galssGap}")
    private Integer galssGap;
    /**
     * 查询进/出片任务
     */
    @Override
    public List<BigStorageCageDetails> selectTask(int taskType) {
        if (taskType == 1) {
            //进片任务数据
            LambdaQueryWrapper<BigStorageCageDetails> feedWrapper = new LambdaQueryWrapper<>();
            feedWrapper.eq(BigStorageCageDetails::getState, 1)
                    .or()
                    .eq(BigStorageCageDetails::getState, 2);
            feedWrapper.eq(BigStorageCageDetails::getState, Const.BIG_STORAGE_IN);
            List<BigStorageCageDetails> bigStorageCageDetailsList = baseMapper.selectList(feedWrapper);
            List<BigStorageCageFeedTask> bigStorageCageFeedTaskList = bigStorageCageFeedTaskMapper.selectList(null);
            LambdaQueryWrapper<BigStorageCageFeedTask> feedTaskWrapper = new LambdaQueryWrapper<>();
            feedTaskWrapper.lt(BigStorageCageFeedTask::getTaskState,Const.BIG_STORAGE_IN_SLOT);
            List<BigStorageCageFeedTask> bigStorageCageFeedTaskList = bigStorageCageFeedTaskMapper.selectList(feedTaskWrapper);
            Map<String, BigStorageCageFeedTask> listMap = bigStorageCageFeedTaskList.stream()
                    .collect(Collectors.toMap(BigStorageCageFeedTask::getGlassId, task -> task));
@@ -80,11 +94,12 @@
        } else {
            //出片任务数据
            LambdaQueryWrapper<BigStorageCageDetails> outWrapper = new LambdaQueryWrapper<>();
            outWrapper.eq(BigStorageCageDetails::getState, 3)
                    .or()
                    .eq(BigStorageCageDetails::getState, 4);
            outWrapper.eq(BigStorageCageDetails::getState, Const.BIG_STORAGE_OUT);
            List<BigStorageCageDetails> bigStorageCageDetailsList = baseMapper.selectList(outWrapper);
            List<BigStorageCageOutTask> bigStorageCageOutTaskList = bigStorageCageOutTaskMapper.selectList(null);
            LambdaQueryWrapper<BigStorageCageOutTask> outTaskWrapper = new LambdaQueryWrapper<>();
            outTaskWrapper.lt(BigStorageCageOutTask::getTaskState,Const.BIG_STORAGE_OUT_SUCCESS);
            List<BigStorageCageOutTask> bigStorageCageOutTaskList = bigStorageCageOutTaskMapper.selectList(outTaskWrapper);
            Map<String, BigStorageCageOutTask> listMap = bigStorageCageOutTaskList.stream()
                    .collect(Collectors.toMap(BigStorageCageOutTask::getGlassId, task -> task));
@@ -94,7 +109,6 @@
            }
            return bigStorageCageDetailsList;
        }
    }
    /**
@@ -122,7 +136,7 @@
        for (BigStorageCageDetails bigStorageCageDetails : bigStorageCageDetailsList
        ) {
            if (bigStorageCageDetails.getBigStorageCageFeedTask().getTaskState() == 0) {
                carWidth -= Integer.parseInt(bigStorageCageDetails.getWidth().toString()) + bigStorageCageDetails.getGap();
                carWidth -= Integer.parseInt(bigStorageCageDetails.getWidth().toString()) + galssGap;
            }
        }
        return carWidth;
@@ -139,7 +153,8 @@
    //理片笼详情破损
    @Override
    public void damageBigStorageCageDetails(String glassId) {
    public void damageBigStorageCageDetails(String glassId,int status) {
        LambdaQueryWrapper<TemperingGlassInfo> temperingGlassInfoWrapper = new LambdaQueryWrapper<>();
        temperingGlassInfoWrapper.eq(TemperingGlassInfo::getGlassId, glassId);
        TemperingGlassInfo temperingGlassInfo = temperingGlassInfoMapper.selectOne(temperingGlassInfoWrapper);
@@ -148,10 +163,12 @@
        bigStorageCageDetailsWrapper.eq(BigStorageCageDetails::getGlassId, glassId);
        BigStorageCageDetails bigStorageCageDetails = baseMapper.selectOne(bigStorageCageDetailsWrapper);
        if (temperingGlassInfo.getState() == -2) {
            temperingGlassInfoMapper.deleteById(temperingGlassInfo);
        if(temperingGlassInfo!=null){
            if(status==0){
                temperingGlassInfo.setState(Const.TEMPERING_DAMAGE);
        } else {
            temperingGlassInfo.setState(5);
                temperingGlassInfo.setState(Const.TEMPERING_TAKE);
            }
            temperingGlassInfoMapper.updateById(temperingGlassInfo);
        }
        baseMapper.deleteById(bigStorageCageDetails.getId());
@@ -169,7 +186,7 @@
        BigStorageCageDetails bigStorageCageDetails = new BigStorageCageDetails();
        BeanUtils.copyProperties(glassInfo, bigStorageCageDetails);
        bigStorageCageDetails.setState(0);
        bigStorageCageDetails.setGap(20);
        bigStorageCageDetails.setGap(galssGap);
        return bigStorageCageDetails;
    }
@@ -183,60 +200,46 @@
    //理片笼详情完成
    @Override
    public void finishBigStorageCageDetails(BigStorageCageDetails bigStorageCageDetails) {
        if (bigStorageCageDetails.getState() == 1 || bigStorageCageDetails.getState() == 2) {
            bigStorageCageDetails.setState(0);
        if (bigStorageCageDetails.getBigStorageCageFeedTask()!=null) {
            bigStorageCageDetails.setState(Const.BIG_STORAGE_INSIDE);
            baseMapper.updateById(bigStorageCageDetails);
            bigStorageCageFeedTaskMapper.deleteById(bigStorageCageDetails.getBigStorageCageFeedTask().getId());
        } else {
            baseMapper.deleteById(bigStorageCageDetails.getId());
            bigStorageCageOutTaskMapper.deleteById(bigStorageCageDetails.getBigStorageCageOutTask().getId());
            bigStorageCageDetails.setState(Const.BIG_STORAGE_OUTSIDE);
            baseMapper.updateById(bigStorageCageDetails);
            bigStorageCageService.updateRemainWidth(bigStorageCageDetails.getSlot());
        }
    }
    //手动出片
    @Override
    public void outBigStorageCageDetails(BigStorageCageDetails bigStorageCageDetails) {
        LambdaQueryWrapper<TemperingGlassInfo> temperingGlassInfoWrapper = new LambdaQueryWrapper<>();
        temperingGlassInfoWrapper
                .eq(TemperingGlassInfo::getGlassId, bigStorageCageDetails.getGlassId());
        TemperingGlassInfo temperingGlassInfo = temperingGlassInfoMapper.selectOne(temperingGlassInfoWrapper);
        if (temperingGlassInfo.getGlassId() == null) {
            LambdaQueryWrapper<GlassInfo> glassInfoWrapper = new LambdaQueryWrapper<>();
            glassInfoWrapper
                    .eq(GlassInfo::getGlassId, bigStorageCageDetails.getGlassId());
            GlassInfo glassInfo = glassInfoMapper.selectOne(glassInfoWrapper);
            TemperingGlassInfo temperingGlassInfo1 = new TemperingGlassInfo();
            BeanUtils.copyProperties(glassInfo, temperingGlassInfo1);
            if (temperingGlassInfo.getTemperingLayoutId() != null) {
                temperingGlassInfo1.setState(-1);
            } else {
                temperingGlassInfo1.setState(-2);
            }
            temperingGlassInfoMapper.insert(temperingGlassInfo1);
        }
        bigStorageCageDetails.setState(4);
        baseMapper.updateById(bigStorageCageDetails);
    }
    @Override
    public BigStorageDTO queryTargetSlotByTempering(GlassInfo glassInfo) {
        BigStorageDTO bigStorageDTO = null;
        MPJLambdaWrapper<BigStorageCage> wrapper = new MPJLambdaWrapper<>(BigStorageCage.class)
                .selectAsClass(BigStorageCage.class, BigStorageDTO.class)
                .selectAll(BigStorageCage.class)
                .leftJoin(BigStorageCageDetails.class, BigStorageCageDetails::getSlot, BigStorageCage::getSlot)
                .eq(BigStorageCageDetails::getTemperingLayoutId, glassInfo.getTemperingLayoutId())
                .gt(BigStorageCage::getRemainWidth, glassInfo.getWidth())
                .last("limit 1");
        if (glassInfo.getTemperingLayoutId() == 0) {
            wrapper.eq(BigStorageCageDetails::getWidth, glassInfo.getWidth()).eq(BigStorageCageDetails::getHeight, glassInfo.getHeight());
        } else {
            wrapper.eq(BigStorageCageDetails::getTemperingFeedSequence, glassInfo.getTemperingFeedSequence() + 1);
        }
        bigStorageDTO = bigStorageCageService.selectJoinOne(BigStorageDTO.class, wrapper);
        if (null != bigStorageDTO) {
        BigStorageCage bigStorageCage = bigStorageCageService.selectJoinOne(BigStorageCage.class, wrapper);
        if (null != bigStorageCage) {
            bigStorageDTO = new BigStorageDTO();
            bigStorageDTO.setWidth(bigStorageCage.getRemainWidth());
            bigStorageDTO.setSlot(bigStorageCage.getSlot());
            return bigStorageDTO;
        }
        BigStorageCage bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>()
                .eq(BigStorageCage::getRemainWidth, Const.BIG_STORAGE_WIDTH)
        bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>()
                .eq(BigStorageCage::getRemainWidth, slotWidth)
                .inSql(BigStorageCage::getDeviceId,
                        "select distinct device_id from big_storage_cage_details where tempering_layout_id = " + glassInfo.getTemperingLayoutId())
                .last("limit 1"));
@@ -247,15 +250,13 @@
            return bigStorageDTO;
        }
        bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>()
                .eq(BigStorageCage::getRemainWidth, Const.BIG_STORAGE_WIDTH)
                .eq(BigStorageCage::getRemainWidth, slotWidth)
                .last("limit 1"));
        Assert.isTrue(null != bigStorageCage, "没有空余的笼子存放玻璃");
        bigStorageDTO = new BigStorageDTO();
        bigStorageDTO.setWidth(bigStorageCage.getRemainWidth());
        bigStorageDTO.setSlot(bigStorageCage.getSlot());
        return bigStorageDTO;
    }
    @Override
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageServiceImpl.java
@@ -12,6 +12,7 @@
import com.mes.bigstorage.mapper.BigStorageCageDetailsMapper;
import com.mes.bigstorage.mapper.BigStorageCageMapper;
import com.mes.bigstorage.service.BigStorageCageService;
import com.mes.common.config.Const;
import com.mes.glassinfo.entity.GlassInfo;
import com.mes.glassinfo.service.GlassInfoService;
import com.mes.temperingglass.entity.TemperingGlassInfo;
@@ -217,17 +218,24 @@
    @Override
    public void updateRemainWidth(int slot) {
        log.info("获取该格子内玻璃信息,计算格子剩余宽度");
        Integer width = 5000;
        List<BigStorageCageDetails> bigStorageCageDetailsList = Collections.singletonList(bigStorageCageDetailsMapper.selectById(slot));
        double width = 5000;
        LambdaQueryWrapper<BigStorageCageDetails> bigStorageCageDetailsWrapper=new LambdaQueryWrapper();
        bigStorageCageDetailsWrapper
                .eq(BigStorageCageDetails::getSlot,slot)
                .ne(BigStorageCageDetails::getState,Const.BIG_STORAGE_OUTSIDE);
        List<BigStorageCageDetails> bigStorageCageDetailsList = bigStorageCageDetailsMapper.selectList(bigStorageCageDetailsWrapper);
        for (BigStorageCageDetails bigStorageCageDetails : bigStorageCageDetailsList
        ) {
            width -= Integer.parseInt(bigStorageCageDetails.getWidth().toString()) + bigStorageCageDetails.getGap();
            double widths=bigStorageCageDetails.getWidth();
            double gap=bigStorageCageDetails.getGap();
            width -= widths+gap;
        }
        //修改格子剩余宽度
        BigStorageCage bigStorageCage = new BigStorageCage();
        bigStorageCage.setRemainWidth(width);
        bigStorageCage.setRemainWidth((int)width);
        UpdateWrapper<BigStorageCage> bigStorageCageWrapper = new UpdateWrapper<>();
        bigStorageCageWrapper.eq("remain_width", width);
        bigStorageCageWrapper.eq("slot", slot);
        bigStorageCageMapper.update(bigStorageCage, bigStorageCageWrapper);
    }
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/entity/BigStorageCageOutTask.java
@@ -27,7 +27,7 @@
    public BigStorageCageOutTask() {
    }
    public BigStorageCageOutTask(String glassId, Integer startSlot, Integer endSlot, Integer trainNumber, Integer serialNumber, Integer taskState) {
    public BigStorageCageOutTask(String glassId, Integer startSlot, Integer endSlot, Integer width, Integer trainNumber, Integer serialNumber, Integer taskState) {
        this.glassId = glassId;
        this.startSlot = startSlot;
        this.endSlot = endSlot;
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/mapper/BigStorageCageFeedTaskMapper.java
@@ -2,7 +2,10 @@
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mes.bigstorage.entity.BigStorageDTO;
import com.github.yulichang.base.MPJBaseMapper;
import com.mes.bigstoragetask.entity.BigStorageCageFeedTask;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@@ -15,7 +18,9 @@
 * @since 2024-04-16
 */
@DS("salve_hangzhoumes")
public interface BigStorageCageFeedTaskMapper extends BaseMapper<BigStorageCageFeedTask> {
public interface BigStorageCageFeedTaskMapper extends MPJBaseMapper<BigStorageCageFeedTask> {
    List<String> querySitToUpGlass();
    List<Integer> querySitToUpGlass();
    BigStorageDTO querySitToUpRemainWidth(@Param(value = "line") Integer line);
}
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/mapper/BigStorageCageOutTaskMapper.java
@@ -1,8 +1,11 @@
package com.mes.bigstoragetask.mapper;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.mes.bigstoragetask.entity.BigStorageCageOutTask;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mes.bigstoragetask.entity.BigStorageCageOutTask;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * <p>
@@ -15,4 +18,5 @@
@DS("salve_hangzhoumes")
public interface BigStorageCageOutTaskMapper extends BaseMapper<BigStorageCageOutTask> {
    boolean saveBatch(@Param(value = "list") List<BigStorageCageOutTask> list);
}
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/service/BigStorageCageFeedTaskService.java
@@ -1,7 +1,9 @@
package com.mes.bigstoragetask.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.github.yulichang.base.MPJBaseService;
import com.mes.bigstorage.entity.BigStorageCageDetails;
import com.mes.bigstorage.entity.BigStorageDTO;
import com.mes.bigstoragetask.entity.BigStorageCageFeedTask;
import java.util.List;
@@ -14,7 +16,7 @@
 * @author zhoush
 * @since 2024-04-16
 */
public interface BigStorageCageFeedTaskService extends IService<BigStorageCageFeedTask> {
public interface BigStorageCageFeedTaskService extends MPJBaseService<BigStorageCageFeedTask> {
    void addFeedTask(BigStorageCageDetails slotInfo, Integer plcFeedReqLine, int taskType);
@@ -23,5 +25,10 @@
    /**
     * 查询卧转立玻璃是否进片完成
     */
    List<String> querySitToUpGlass();
    BigStorageDTO querySitToUpRemainWidth(Integer line);
    /**
     * 查询卧转立玻璃是否进片完成
     */
    List<Integer> querySitToUpGlass();
}
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/service/BigStorageCageOutTaskService.java
@@ -1,7 +1,7 @@
package com.mes.bigstoragetask.service;
import com.mes.bigstoragetask.entity.BigStorageCageOutTask;
import com.baomidou.mybatisplus.extension.service.IService;
import com.mes.bigstoragetask.entity.BigStorageCageOutTask;
import java.util.List;
@@ -19,5 +19,7 @@
    void updateOutTask();
    boolean saveBatch(List<BigStorageCageOutTask> list);
    void deleteOutTask(String glassId);
}
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/service/impl/BigStorageCageFeedTaskServiceImpl.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mes.bigstorage.entity.BigStorageCageDetails;
import com.mes.bigstorage.entity.BigStorageDTO;
import com.mes.bigstoragetask.entity.BigStorageCageFeedTask;
import com.mes.bigstoragetask.mapper.BigStorageCageFeedTaskMapper;
import com.mes.bigstoragetask.service.BigStorageCageFeedTaskService;
@@ -39,7 +40,12 @@
    }
    @Override
    public List<String> querySitToUpGlass() {
    public BigStorageDTO querySitToUpRemainWidth(Integer line) {
        return baseMapper.querySitToUpRemainWidth(line);
    }
    @Override
    public List<Integer> querySitToUpGlass() {
        return baseMapper.querySitToUpGlass();
    }
}
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/service/impl/BigStorageCageOutTaskServiceImpl.java
@@ -1,13 +1,12 @@
package com.mes.bigstoragetask.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mes.bigstorage.entity.BigStorageCageDetails;
import com.mes.bigstorage.mapper.BigStorageCageDetailsMapper;
import com.mes.bigstoragetask.entity.BigStorageCageOutTask;
import com.mes.bigstoragetask.mapper.BigStorageCageOutTaskMapper;
import com.mes.bigstoragetask.service.BigStorageCageOutTaskService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mes.temperingglass.entity.TemperingGlassInfo;
import com.mes.temperingglass.mapper.TemperingGlassInfoMapper;
import lombok.extern.slf4j.Slf4j;
@@ -35,6 +34,11 @@
    @Resource
    BigStorageCageDetailsMapper bigStorageCageDetailsMapper;
    @Override
    public boolean saveBatch(List<BigStorageCageOutTask> list) {
        return baseMapper.saveBatch(list);
    }
    /**
     * 查询任务信息
     */
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/glassinfo/controller/GlassInfoController.java
File was deleted
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/glassinfo/mapper/GlassInfoMapper.java
File was deleted
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/glassinfo/service/GlassInfoService.java
File was deleted
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/glassinfo/service/impl/GlassInfoServiceImpl.java
File was deleted
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcSlicecage.java
@@ -66,9 +66,6 @@
            List<TemperingGlassInfo> temperingGlassInfoList= temperingGlassInfoService.list();
            jsonObject.append("temperingGlassInfoList", temperingGlassInfoList);
            //报警信息
            jsonObject.append("bigStorageCageFullAlarm", PlcStorageCageTask.bigStorageCageFullAlarm);
            //理片笼表格信息
            jsonObject.append("bigStorageCageInfo", bigStorageCageService.querybigStorageCageDetail(0));
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcStorageCageTask.java
@@ -2,13 +2,18 @@
import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.mes.base.entity.BigStorageCageBaseInfo;
import com.mes.bigstorage.entity.BigStorageCage;
import com.mes.bigstorage.entity.BigStorageCageDetails;
import com.mes.bigstorage.entity.BigStorageDTO;
import com.mes.bigstorage.entity.dto.SlotSequenceDTO;
import com.mes.bigstorage.entity.dto.TemperingLayoutDTO;
import com.mes.bigstorage.service.BigStorageCageDetailsService;
import com.mes.bigstorage.service.BigStorageCageService;
import com.mes.bigstoragetask.entity.BigStorageCageFeedTask;
import com.mes.bigstoragetask.entity.BigStorageCageOutTask;
import com.mes.bigstoragetask.service.BigStorageCageFeedTaskService;
@@ -30,10 +35,7 @@
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -43,6 +45,8 @@
@Slf4j
public class PlcStorageCageTask {
    @Resource
    private BigStorageCageService bigStorageCageService;
    @Resource
    private BigStorageCageDetailsService bigStorageCageDetailsService;
    @Resource
@@ -61,29 +65,45 @@
    @Value("${mes.sequence.order}")
    private boolean sequenceOrder;
    @Value("${mes.carWidth}")
    private Integer carWidth;
    @Value("${mes.slotWidth}")
    private Integer slotWidth;
    @Value("${mes.carMaxSize}")
    private Integer carMaxSize;
    @Value("${mes.galssGap}")
    private Integer galssGap;
    @Scheduled(fixedDelay = 5000)
    public void plcToHomeEdgScan() {
        PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject;
        String d01Request = plcParameterObject.getPlcParameter("D01Request").getValue();
        String d01Id = plcParameterObject.getPlcParameter("D01ID1").getValue();
        String d02SitState = plcParameterObject.getPlcParameter("D02SitState").getValue();
        String d04Request = plcParameterObject.getPlcParameter("D04Request").getValue();
        String d04Id = plcParameterObject.getPlcParameter("D04ID1").getValue();
        String d05SitState = plcParameterObject.getPlcParameter("D05SitState").getValue();
        log.info("1、获取到的请求字d01为:{},获取到的扫描ID为:{};获取到的请求字d04为:{},获取到的扫描ID为:{};",
                d01Request, d01Id, d04Request, d04Id);
        if (!REQUEST_WORD.equals(d01Request) && !REQUEST_WORD.equals(d04Request)) {
            log.info("两条线未收到进片任务,结束本次扫描进卧转立任务");
            return;
        }
        if (REQUEST_WORD.equals(d02SitState) && REQUEST_WORD.equals(d05SitState)) {
            log.info("两条线卧转立均在执行任务,结束本次扫描进卧转立任务");
            return;
        }
        Boolean flag01 = Boolean.FALSE;
        Boolean flag04 = Boolean.FALSE;
        //按照线路及玻璃id获取相邻两块玻璃 卧转立上的玻璃
        if (REQUEST_WORD.equals(d01Request)) {
        if (REQUEST_WORD.equals(d01Request) && !REQUEST_WORD.equals(d02SitState)) {
            flag01 = judgeGlassTypeStatus(d01Id, Const.A09_OUT_TARGET_POSITION);
        }
        if (REQUEST_WORD.equals(d04Request)) {
        if (REQUEST_WORD.equals(d04Request) && !REQUEST_WORD.equals(d05SitState)) {
            flag04 = judgeGlassTypeStatus(d04Id, Const.A10_OUT_TARGET_POSITION);
        }
        if (flag01 && flag04) {
@@ -103,9 +123,9 @@
    @Scheduled(fixedDelay = 5000)
    public void plcToHomeEdgFreeCarTask() {
        PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject;
        String freeCar = plcParameterObject.getPlcParameter("freeCar").getValue();
        if (REQUEST_WORD.equals(freeCar)) {
            log.info("大车非空闲");
        String e01Status = plcParameterObject.getPlcParameter("E01Status").getValue();
        if (REQUEST_WORD.equals(e01Status)) {
            log.info("进片大车非空闲");
            return;
        }
        String d01Request = plcParameterObject.getPlcParameter("D01Request").getValue();
@@ -116,23 +136,23 @@
                d01Request, d01Id, d04Request, d04Id);
        //两条线都有进卧转立任务,直接结束
        if (Const.BIG_STORAGE_REQUEST_IN.equals(d01Request)
                && Const.BIG_STORAGE_REQUEST_IN.equals(d04Request)
                && StringUtils.isNotBlank(d01Id)
                && StringUtils.isNotBlank(d04Id)) {
                && Const.BIG_STORAGE_REQUEST_IN.equals(d04Request)) {
            log.info("两条线都存在进片任务,结束任务");
            return;
        }
        //获取两条线卧转立是否有玻璃,且任务状态都为2
        List<String> lineList = bigStorageCageFeedTaskService.querySitToUpGlass();
        List<Integer> lineList = bigStorageCageFeedTaskService.querySitToUpGlass();
        if (CollectionUtils.isEmpty(lineList)) {
            log.info("两条线卧转立为空或者有进片任务未完成,结束任务");
            return;
        }
        String line1 = lineList.get(0);
        String flagLine = line1.equals(Const.A09_OUT_TARGET_POSITION) ? d01Id : d04Id;
        Integer lineFirst = lineList.get(0);
        String lineGlassId = lineFirst.equals(Const.A09_OUT_TARGET_POSITION) ? d01Id : d04Id;
        if (lineList.size() == 1) {
            //计算任务表进片格子 发送进片任务
            computeTargetByLine(Integer.parseInt(flagLine));
            if (StringUtils.isEmpty(lineGlassId)) {
                computeTargetByLine(lineFirst);
            }
            return;
        }
        if (StringUtils.isBlank(d01Id) && StringUtils.isBlank(d04Id)) {
@@ -149,70 +169,44 @@
    @Scheduled(fixedDelay = 5000)
    public void plcToHomeEdgOutTask() {
        //任务数据  获取车子存放玻璃最大数量  玻璃间隔
        List<BigStorageCageOutTask> bigStorageCageOutTaskList = new ArrayList<>();
        List<BigStorageCageOutTask> outingList = bigStorageCageOutTaskService.list(new LambdaQueryWrapper<BigStorageCageOutTask>().eq(BigStorageCageOutTask::getTaskState, Const.BIG_STORAGE_OUT_NEW));
        Assert.isTrue(CollectionUtils.isEmpty(outingList), "有正在执行出片的任务,结束当前出片线程");
        //是否有正在钢化的玻璃
        List<TemperingGlassInfo> temperingGlassInfoList = temperingGlassInfoService.list(new LambdaQueryWrapper<TemperingGlassInfo>()
        List<TemperingGlassInfo> temperingGlassInfoList = temperingGlassInfoService.selectJoinList(TemperingGlassInfo.class, new MPJLambdaWrapper<TemperingGlassInfo>()
                .selectAll(TemperingGlassInfo.class)
                .leftJoin(BigStorageCageOutTask.class, BigStorageCageOutTask::getGlassId, TemperingGlassInfo::getGlassId)
                .eq(TemperingGlassInfo::getState, Const.TEMPERING_NEW)
                .isNull(BigStorageCageOutTask::getGlassId)
                .orderBy(Boolean.TRUE, sequenceOrder, TemperingGlassInfo::getTemperingFeedSequence));
        if (CollectionUtils.isNotEmpty(temperingGlassInfoList)) {
            log.info("有正在出片的钢化任务");
            //打车剩余尺寸
            Integer remainWidth = Const.BIG_STORAGE_WIDTH;
            for (TemperingGlassInfo e : temperingGlassInfoList) {
                if (bigStorageCageOutTaskList.size() > 5 || e.getWidth() > remainWidth) {
                    break;
                }
                remainWidth = remainWidth - e.getWidth().intValue() - Const.BIG_STORAGE_GAP;
                bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getState(), Const.A09_OUT_TARGET_POSITION,
                        0, 0, 1));
            }
            bigStorageCageOutTaskService.saveBatch(bigStorageCageOutTaskList);
            computeOutGlassInfo(temperingGlassInfoList);
            return;
        }
        //todo:是否有人工下片任务   有直接出
        //笼内是否有人工下片玻璃 无 结束
        //是否有人工下片任务   有直接出
        List<BigStorageCageDetails> artificialList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>()
                .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_ARTIFICIAL).orderByDesc(BigStorageCageDetails::getWidth));
        if (CollectionUtils.isEmpty(artificialList)) {
            Integer remainWidth = Const.BIG_STORAGE_WIDTH;
            for (BigStorageCageDetails e : artificialList) {
                if (remainWidth < e.getWidth().intValue()) {
                    break;
                }
                bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), 0, 0, 0, 1));
                remainWidth = remainWidth - e.getWidth().intValue() - Const.BIG_STORAGE_GAP;
            }
            bigStorageCageOutTaskService.saveBatch(bigStorageCageOutTaskList);
        if (CollectionUtils.isNotEmpty(artificialList)) {
            computeOutGlassInfo(temperingGlassInfoList);
            return;
        }
        //钢化优先:获取理片笼  玻璃小片  破损表 数量   判断笼内版图是否到齐
        TemperingLayoutDTO temperingLayoutDTO = bigStorageCageDetailsService.temperingIsAll();
        if (null != temperingLayoutDTO) {
            //玻璃到齐
            //到齐,将玻璃小片数据存入钢化小片表,逻辑生成出片任务  结束
            List<BigStorageCageDetails> bigStorageCageDetails = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>()
                    .eq(BigStorageCageDetails::getTemperingLayoutId, temperingLayoutDTO.getTemperingLayoutId())
                    .eq(BigStorageCageDetails::getEngineerId, temperingLayoutDTO.getEngineerId()));
            List<TemperingGlassInfo> temperingGlassInfos = bigStorageCageDetails.stream().map(e -> {
                TemperingGlassInfo info = new TemperingGlassInfo();
                BeanUtils.copyProperties(e, info);
                return info;
            }).collect(Collectors.toList());
            List<TemperingGlassInfo> temperingGlassInfos = glassInfoService.selectJoinList(TemperingGlassInfo.class, JoinWrappers.lambda(GlassInfo.class)
                    .selectAll(GlassInfo.class)
                    .select("-1 as state")
                    .selectAs(BigStorageCageDetails::getSlot, TemperingGlassInfo::getSlot)
                    .innerJoin(BigStorageCageDetails.class, BigStorageCageDetails::getGlassId, GlassInfo::getGlassId)
                    .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN)
                    .eq(GlassInfo::getTemperingLayoutId, temperingLayoutDTO.getTemperingLayoutId())
                    .eq(GlassInfo::getEngineerId, temperingLayoutDTO.getEngineerId()));
            temperingGlassInfoService.saveBatch(temperingGlassInfos);
            //大车剩余尺寸
            Integer remainWidth = Const.BIG_STORAGE_WIDTH;
            for (TemperingGlassInfo e : temperingGlassInfoList) {
                if (bigStorageCageOutTaskList.size() > 5 || e.getWidth() > remainWidth) {
                    break;
                }
                remainWidth = remainWidth - e.getWidth().intValue() - Const.BIG_STORAGE_GAP;
                bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getState(), Const.A09_OUT_TARGET_POSITION,
                        0, 0, 1));
            }
            bigStorageCageOutTaskService.saveBatch(bigStorageCageOutTaskList);
            computeOutGlassInfo(temperingGlassInfoList);
            return;
        }
        //未到齐 执行内部调度任务
@@ -222,12 +216,13 @@
            for (int i = 0; i < slotSequenceList.size() - 1; i++) {
                SlotSequenceDTO first = slotSequenceList.get(i);
                SlotSequenceDTO second = slotSequenceList.get(i + 1);
                int slotWidth = carWidth - first.getRemainWidth() - galssGap;
                if (first.getMinSequence() == second.getMaxSequence() + 1
                        && second.getRemainWidth() > Const.BIG_STORAGE_WIDTH - first.getRemainWidth() - Const.BIG_STORAGE_GAP) {
                        && second.getRemainWidth() > slotWidth) {
                    List<BigStorageCageDetails> list = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>()
                            .eq(BigStorageCageDetails::getSlot, first.getSlot()).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN));
                    List<BigStorageCageOutTask> outTasks = list.stream().map(e -> new BigStorageCageOutTask(e.getGlassId(), first.getSlot(), second.getSlot(),
                            0, 0, 1)).collect(Collectors.toList());
                            slotWidth, 0, 0, 1)).collect(Collectors.toList());
                    bigStorageCageOutTaskService.saveBatch(outTasks);
                    return;
                }
@@ -247,25 +242,41 @@
                .orderByAsc(EdgGlassTaskInfo::getTime));
        Assert.isFalse(CollectionUtils.isEmpty(edgGlassTaskInfoList), "识别玻璃信息未出现在尺寸表中,获取相邻两块玻璃失败");
        //2、获取卧转立剩余宽度
        Map<String, Object> map = bigStorageCageFeedTaskService.getMap(new QueryWrapper<BigStorageCageFeedTask>()
                .select("cast(" + Const.BIG_STORAGE_WIDTH + " - sum(width + " + Const.BIG_STORAGE_GAP + ")  as INT) as remainWidth")
                .eq("line", line).eq("task_state", Const.BIG_STORAGE_IN_UP));
        Integer remainWidth = null == map ? Const.BIG_STORAGE_WIDTH : Integer.parseInt(map.get("remainWidth") + "");
        BigStorageDTO sitToUpRemainWidth = bigStorageCageFeedTaskService.querySitToUpRemainWidth(line);
        Integer remainWidth;
        Integer glassCount;
        if (0 == sitToUpRemainWidth.getGlassCount()) {
            remainWidth = carWidth;
            glassCount = 0;
        } else {
            remainWidth = sitToUpRemainWidth.getWidth();
            glassCount = sitToUpRemainWidth.getGlassCount();
        }
        //2、获取卧转立
        Integer widthFirst = edgGlassTaskInfoList.get(0).getWidth();
        if (edgGlassTaskInfoList.size() == 1) {
            if (remainWidth >= widthFirst) {
                if (glassCount <= 5) {
                addFeedTask(glassId, line, Const.BIG_STORAGE_IN_WAIT, widthFirst);
                return Boolean.FALSE;
                } else {
                    addFeedTask(glassId, line, Const.BIG_STORAGE_IN_RUN, widthFirst);
                    return Boolean.TRUE;
                }
            }
        } else {
            Integer widthSecond = edgGlassTaskInfoList.get(1).getWidth();
            if (remainWidth >= widthFirst) {
                if (remainWidth - widthFirst - Const.BIG_STORAGE_GAP >= widthSecond) {
                    addFeedTask(glassId, line, Const.BIG_STORAGE_IN_WAIT, widthSecond);
                if (remainWidth - widthFirst - galssGap >= widthSecond) {
                    if (glassCount <= carMaxSize - 1) {
                        addFeedTask(glassId, line, Const.BIG_STORAGE_IN_WAIT, widthFirst);
                    return Boolean.FALSE;
                } else {
                    addFeedTask(glassId, line, Const.BIG_STORAGE_IN_RUN, widthSecond);
                        addFeedTask(glassId, line, Const.BIG_STORAGE_IN_RUN, widthFirst);
                        return Boolean.TRUE;
                    }
                } else {
                    addFeedTask(glassId, line, Const.BIG_STORAGE_IN_RUN, widthFirst);
                }
            }
        }
@@ -279,7 +290,7 @@
    private Boolean addFeedTask(String glassId, Integer line, Integer taskType, Integer width) {
        BigStorageCageFeedTask bigStorageCageFeedTask = new BigStorageCageFeedTask();
        bigStorageCageFeedTask.setGlassId(glassId);
        bigStorageCageFeedTask.setTaskState(Const.BIG_STORAGE_REQUEST_IN);
        bigStorageCageFeedTask.setTaskState(Const.BIG_STORAGE_IN_NEW);
        bigStorageCageFeedTask.setLine(line);
        bigStorageCageFeedTask.setTaskType(taskType);
        bigStorageCageFeedTask.setWidth(width);
@@ -313,20 +324,12 @@
        //1、获取任务表中的所有玻璃(指定线路且已经进卧转立完成)
        List<BigStorageCageFeedTask> taskList = bigStorageCageFeedTaskService.list(new LambdaQueryWrapper<BigStorageCageFeedTask>()
                .eq(BigStorageCageFeedTask::getLine, line)
                .eq(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP)
                .in(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP_ALL)
                .orderByAsc(BigStorageCageFeedTask::getId));
        //2、去笼子内查找是否可以继续存放的笼子
        List<String> glassIds = taskList.stream().map(BigStorageCageFeedTask::getGlassId).collect(Collectors.toList());
        List<GlassInfo> glassInfos = glassInfoService.list(new LambdaQueryWrapper<GlassInfo>().in(GlassInfo::getGlassId, glassIds));
        List<BigStorageCageDetails> bigStorageCageDetailsList = new ArrayList<>();
        List<BigStorageCageDetails> temperingList = computeIsTemperingTargetByLine(glassInfos, taskList, Boolean.TRUE);
        List<BigStorageCageDetails> noTemperingList = computeIsTemperingTargetByLine(glassInfos, taskList, Boolean.FALSE);
        bigStorageCageDetailsList.addAll(temperingList);
        bigStorageCageDetailsList.addAll(noTemperingList);
        //4、在详情表中加入进片玻璃信息
        bigStorageCageDetailsService.saveBatch(bigStorageCageDetailsList);
        return Boolean.TRUE;
        return computeIsTemperingTargetByLine(glassInfos, taskList, Boolean.TRUE) && computeIsTemperingTargetByLine(glassInfos, taskList, Boolean.FALSE);
    }
    /**
@@ -336,22 +339,10 @@
     * @param taskList    当条线卧转立所有任务
     * @param isTempering true 钢化  false  不钢化
     */
    private List<BigStorageCageDetails> computeIsTemperingTargetByLine(List<GlassInfo> glassInfos, List<BigStorageCageFeedTask> taskList, Boolean isTempering) {
        Map<String, GlassInfo> glassInfoMap;
        if (isTempering) {
            glassInfoMap = glassInfos.stream().filter(e -> e.getTemperingLayoutId() != 0)
    private boolean computeIsTemperingTargetByLine(List<GlassInfo> glassInfos, List<BigStorageCageFeedTask> taskList, Boolean isTempering) {
        //1、将玻璃信息集合转为glassid为key的map
        Map<String, GlassInfo> glassInfoMap = glassInfos.stream()
                    .collect(Collectors.toMap(GlassInfo::getGlassId, p -> p));
        } else {
            glassInfoMap = glassInfos.stream().filter(e -> e.getTemperingLayoutId() == 0)
                    .collect(Collectors.toMap(GlassInfo::getGlassId, p -> p));
        }
        //设置临时变量接受版图id,版序、格子号及剩余宽度
        Integer temperingLayoutIdTemp = 0;
        Integer temperingFeedSequenceTemp = 0;
        BigStorageDTO bigStorageDTO = new BigStorageDTO();
        List<BigStorageCageDetails> bigStorageCageDetailsList = new ArrayList<>();
        for (BigStorageCageFeedTask e : taskList) {
            GlassInfo info = glassInfoMap.get(e.getGlassId());
            if (info == null) {
@@ -359,26 +350,77 @@
            }
            BigStorageCageDetails cageDetails = new BigStorageCageDetails();
            BeanUtils.copyProperties(info, cageDetails);
            if (temperingLayoutIdTemp.equals(info.getTemperingLayoutId())
                    && temperingFeedSequenceTemp.equals(info.getTemperingFeedSequence() + 1)
                    && info.getWidth() <= bigStorageDTO.getWidth()) {
                bigStorageDTO.setWidth(bigStorageDTO.getWidth() - info.getWidth().intValue() - Const.BIG_STORAGE_GAP);
            } else {
                bigStorageDTO = bigStorageCageDetailsService.queryTargetSlotByTempering(info);
            }
            cageDetails.setSlot(bigStorageDTO.getSlot());
            cageDetails.setState(Const.GLASS_STATE_IN);
            //2、获取目标格子信息
            BigStorageDTO bigStorageDTO = bigStorageCageDetailsService.queryTargetSlotByTempering(info);
            //3、更新大理片笼表剩余宽度
            bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, bigStorageDTO.getWidth())
                    .eq(BigStorageCage::getSlot, bigStorageDTO.getSlot()));
            //4、更新进片任务表,目标格子及状态(状态改为2 电气扫到自行处理)  遇到问题:无法批量更新,批量更新无法走指定从库
            e.setTargetSlot(bigStorageDTO.getSlot());
            e.setTaskType(Const.BIG_STORAGE_IN_RUN);
            temperingLayoutIdTemp = info.getTemperingLayoutId();
            temperingFeedSequenceTemp = info.getTemperingFeedSequence();
            //3、更新进片任务表  遇到问题:无法批量更新,批量更新无法走指定从库
            bigStorageCageFeedTaskService.updateById(e);
            bigStorageCageDetailsList.add(cageDetails);
            //5、将进片信息存入大理片笼详情表
            cageDetails.setSlot(bigStorageDTO.getSlot());
            cageDetails.setState(Const.GLASS_STATE_IN);
            bigStorageCageDetailsService.save(cageDetails);
        }
        return bigStorageCageDetailsList;
        return Boolean.TRUE;
    }
    private <T extends BigStorageCageBaseInfo> Boolean computeOutGlassInfo(List<T> list) {
        //任务数据  获取车子存放玻璃最大数量  玻璃间隔
        List<BigStorageCageOutTask> bigStorageCageOutTaskList = new ArrayList<>();
        //打车剩余尺寸
        Integer remainWidth = carWidth;
        for (T e : list) {
            if (bigStorageCageOutTaskList.size() > carMaxSize || e.getWidth() > remainWidth) {
                break;
            }
            remainWidth = remainWidth - e.getWidth().intValue() - galssGap;
            bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.A09_OUT_TARGET_POSITION,
                    e.getWidth().intValue(), 0, 0, 1));
        }
        Assert.isFalse(CollectionUtils.isEmpty(bigStorageCageOutTaskList), "未获取出片数据,结束出片任务");
        log.info("获取出片任务数据{}条,执行保存", bigStorageCageOutTaskList.size());
        bigStorageCageOutTaskService.saveBatch(bigStorageCageOutTaskList);
        List<String> glassIds = bigStorageCageOutTaskList.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList());
        log.info("将出片玻璃{}玻璃状态改为已出片", glassIds);
        bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>()
                .set(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT)
                .in(BigStorageCageDetails::getGlassId, glassIds));
        //更新笼子内格子的剩余尺寸
        updateSlotRemain(list, glassIds);
        return Boolean.TRUE;
    }
    /**
     * 更新笼子内格子的剩余尺寸
     *
     * @param list
     * @param taskGlassIds
     * @param <T>
     */
    public <T extends BigStorageCageBaseInfo> void updateSlotRemain(List<T> list, List<String> taskGlassIds) {
        //获取需要出去(包括待出去的)的所有玻璃格子号
        List<Integer> slotList = list.stream().map(T::getSlot).distinct().collect(Collectors.toList());
        //获取待出去的玻璃信息(等下车出去的玻璃)
        Map<Integer, Double> slotRemainMap = list.stream().filter(e -> !taskGlassIds.contains(e.getGlassId()))
                .collect(Collectors.groupingBy(T::getSlot, Collectors.summingDouble(item -> item.getWidth() + galssGap)));
        if (CollectionUtils.isNotEmpty(slotRemainMap)) {
            //按照格子号更新剩余尺寸
            slotRemainMap.forEach((e, v) -> {
                bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, slotWidth - v)
                        .eq(BigStorageCage::getSlot, e));
            });
        }
        Set<Integer> remainSlotList = slotRemainMap.keySet();
        slotList.removeAll(remainSlotList);
        if (CollectionUtils.isNotEmpty(slotList)) {
            bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, slotWidth)
                    .in(BigStorageCage::getSlot, slotList));
        }
    }
}
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/temperingglass/controller/TemperingGlassInfoController.java
@@ -39,14 +39,14 @@
    @ApiOperation("出片任务删除")
    @PostMapping("/deleteTemperingGlassInfo")
    public Result deleteTemperingGlassInfo(TemperingGlassInfo temperingGlassInfo) {
        temperingGlassInfoService.removeById(temperingGlassInfo);
        temperingGlassInfoService.removeById(temperingGlassInfo.getId());
        return Result.build(200,"删除成功",1);
    }
    @ApiOperation("出片任务破损")
    @ApiOperation("出片任务破损0/拿走1")
    @PostMapping("/damageTemperingGlassInfo")
    public Result damageTemperingGlassInfo(TemperingGlassInfo temperingGlassInfo) {
        bigStorageCageDetailsService.damageBigStorageCageDetails(temperingGlassInfo.getGlassId());
    public Result damageTemperingGlassInfo(TemperingGlassInfo temperingGlassInfo,int status) {
        bigStorageCageDetailsService.damageBigStorageCageDetails(temperingGlassInfo.getGlassId(),status);
        return Result.build(200,"破损成功",1);
    }
}
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/temperingglass/entity/TemperingGlassInfo.java
File was deleted
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/temperingglass/mapper/TemperingGlassInfoMapper.java
File was deleted
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/temperingglass/service/TemperingGlassInfoService.java
@@ -1,6 +1,6 @@
package com.mes.temperingglass.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.github.yulichang.base.MPJBaseService;
import com.mes.temperingglass.entity.TemperingGlassInfo;
import java.util.List;
@@ -13,9 +13,11 @@
 * @author zhoush
 * @since 2024-03-27
 */
public interface TemperingGlassInfoService extends IService<TemperingGlassInfo> {
public interface TemperingGlassInfoService extends MPJBaseService<TemperingGlassInfo> {
    public void addOutTask(List<TemperingGlassInfo> temperingGlassInfoList);
    boolean saveBatch(List<TemperingGlassInfo> list);
    void schedulingTask();
}
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/temperingglass/service/impl/TemperingGlassInfoServiceImpl.java
@@ -2,7 +2,6 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
@@ -11,7 +10,6 @@
import com.mes.bigstorage.mapper.BigStorageCageDetailsMapper;
import com.mes.bigstorage.mapper.BigStorageCageMapper;
import com.mes.bigstoragetask.entity.BigStorageCageOutTask;
import com.mes.glassinfo.mapper.GlassInfoMapper;
import com.mes.temperingglass.entity.TemperingGlassInfo;
import com.mes.temperingglass.mapper.TemperingGlassInfoMapper;
import com.mes.temperingglass.service.TemperingGlassInfoService;
@@ -61,6 +59,11 @@
        }
    }
    @Override
    public boolean saveBatch(List<TemperingGlassInfo> list) {
        return baseMapper.saveBatch(list);
    }
    //调度
    @Override
    public void schedulingTask(){
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/JsonFile/PlcCacheVerticalGlass.json
@@ -1,6 +1,6 @@
{
  "plcAddressBegin":"DB.0",
  "plcAddressLenght":"72",
  "plcAddressBegin":"DB14.0",
  "plcAddressLenght":"84",
  "dataType":"word",
  "parameteInfor":[
    {
@@ -19,7 +19,7 @@
    },
    {
      "codeId": "D04Request",
      "addressIndex":"8",
      "addressIndex":"34",
      "addressLenght":"2",
      "ratio":"1",
      "unit":""
@@ -27,28 +27,62 @@
    {
      "codeId": "D04ID1",
      "addressIndex":"10",
      "addressLenght":"6",
      "addressLenght":"36",
      "ratio":"1",
      "unit":""
    },
    {
      "codeId": "D02Go",
      "addressIndex":"20",
      "codeId": "E01Status",
      "addressIndex":"2",
      "addressLenght":"68",
      "ratio":"1",
      "unit":""
    },
    {
      "codeId": "E02Status",
      "addressIndex":"2",
      "addressLenght":"70",
      "ratio":"1",
      "unit":""
    },
    {
      "codeId": "MaxTaskNo",
      "addressIndex":"2",
      "addressLenght":"72",
      "ratio":"1",
      "unit":""
    },
    {
      "codeId": "D02MaxWidth",
      "addressIndex":"2",
      "addressLenght":"74",
      "ratio":"1",
      "unit":""
    },
    {
      "codeId": "D05MaxWidth",
      "addressIndex":"2",
      "addressLenght":"76",
      "ratio":"1",
      "unit":""
    },
    {
      "codeId": "GlassGap",
      "addressIndex":"2",
      "addressLenght":"78",
      "ratio":"1",
      "unit":""
    },
    {
      "codeId": "D02SitState",
      "addressIndex":"80",
      "addressLenght":"2",
      "ratio":"1",
      "unit":""
    },
    {
      "codeId": "D05Go",
      "addressIndex":"22",
      "addressLenght":"2",
      "ratio":"1",
      "unit":""
    }
  ,
    {
      "codeId": "DeviceStatus",
      "addressIndex":"70",
      "codeId": "D05SitState",
      "addressIndex":"82",
      "addressLenght":"2",
      "ratio":"1",
      "unit":""
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/application.yml
@@ -14,4 +14,7 @@
  sequence:
    order: false
  minCount: 5
  slotWidth: 5000
  carWidth: 5000   #大车宽度
  slotWidth: 5000   #大车宽度
  carMaxSize: 6     #大车最大存放玻璃数量
  galssGap: 20      #玻璃间距
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml
@@ -19,6 +19,8 @@
    </resultMap>
    <select id="temperingIsAll" resultMap="temperingLayoutDTO">
        SELECT T2.*
        FROM (
        SELECT T.ENGINEER_ID,
               T.TEMPERING_LAYOUT_ID,
               COUNT(T.TEMPERING_FEED_SEQUENCE) AS COUNT
@@ -27,22 +29,18 @@
            LEFT JOIN DAMAGE T1
        ON T.ENGINEER_ID = T1.ENGINEER_ID
            AND T.GLASS_ID = T1.GLASS_ID
            LEFT JOIN BIG_STORAGE_CAGE_DETAILS T2 ON T.ENGINEER_ID = T2.ENGINEER_ID
            AND T.GLASS_ID = T2.GLASS_ID
        WHERE
            T1.GLASS_ID IS NULL
          AND T2.GLASS_ID IS NULL
          AND ( T.ENGINEER_ID
            , T.TEMPERING_LAYOUT_ID ) IN ( SELECT DISTINCT ENGINEER_ID
            , TEMPERING_LAYOUT_ID FROM BIG_STORAGE_CAGE_DETAILS WHERE STATE = 100 )
        GROUP BY
            T.ENGINEER_ID,
            T.TEMPERING_LAYOUT_ID
        HAVING
            COUNT = 0
        ORDER BY
            T.TEMPERING_LAYOUT_ID
            LIMIT 1
             ) T2
                 INNER JOIN (SELECT ENGINEER_ID, TEMPERING_LAYOUT_ID, COUNT(TEMPERING_FEED_SEQUENCE) AS COUNT
                             FROM BIG_STORAGE_CAGE_DETAILS
                             WHERE STATE = 100
                             GROUP BY ENGINEER_ID, TEMPERING_LAYOUT_ID) T3 ON T2.ENGINEER_ID = T3.ENGINEER_ID
            AND T2.TEMPERING_LAYOUT_ID = T3.TEMPERING_LAYOUT_ID
            AND T2.COUNT = T3.COUNT LIMIT 1
    </select>
    <select id="queryTemperingOccupySlot" resultMap="temperingLayoutDTO">
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageFeedTaskMapper.xml
@@ -2,7 +2,12 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mes.bigstoragetask.mapper.BigStorageCageFeedTaskMapper">
    <select id="querySitToUpGlass" resultType="java.lang.String">
    <resultMap id="bigStorageDTO" type="com.mes.bigstorage.entity.BigStorageDTO">
        <result column="REMAIN_WIDTH" property="width"/>
        <result column="GLASS_COUNT" property="glassCount"/>
    </resultMap>
    <select id="querySitToUpGlass" resultType="java.lang.Integer">
        select t.line
        from (
                 select line,
@@ -10,9 +15,17 @@
                        SUM(case task_state when 2 then 1 else 0 end) as real_count
                 from big_storage_cage_feed_task
                 where task_state in (1, 2)
                   and target_slot is null
                 group by line
             ) t
        where t.total_count = t.real_count
    </select>
    <select id="querySitToUpRemainWidth" resultMap="bigStorageDTO">
        SELECT cast(5000 - sum(width + 20) as INT) as REMAIN_WIDTH,
               count(glass_id)                     as GLASS_COUNT
        FROM big_storage_cage_feed_task
        WHERE line = #{line}
          AND task_state in (1, 2)
    </select>
</mapper>
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageOutTaskMapper.xml
New file
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mes.bigstoragetask.mapper.BigStorageCageOutTaskMapper">
    <insert id="saveBatch">
        INSERT INTO big_storage_cage_out_task ( glass_id, start_slot, end_slot, train_number, serial_number, task_state
        )
        values
        <foreach collection="list" item="item" separator=",">
            (#{item.glassId}, #{item.startSlot}, #{item.endSlot}, #{item.trainNumber}, #{item.serialNumber},
            #{item.taskState})
        </foreach>
    </insert>
</mapper>
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/test/java/com/mes/CacheVerticalGlassModuleApplicationTest.java
@@ -38,27 +38,39 @@
    }
    @Test
    public void plcToHomeEdgOutTask() {
        plcStorageCageTask.plcToHomeEdgOutTask();
    }
    @Test
    public void plcToHomeEdgFreeCarTask() {
        plcStorageCageTask.plcToHomeEdgFreeCarTask();
    }
    @Test
    public void plcStorageCageTask() {
        plcStorageCageTask.plcToHomeEdgScan();
    }
    @Test
    public void computeTargetByLine() {
//        log.info("获取大理片笼信息:{}",bigStorageCageService.querybigStorageCageDetail());
        plcStorageCageTask.computeTargetByLine(2001, "", "");
        plcStorageCageTask.computeTargetByLine(2001);
    }
    @Test
    public void judgeGlassTypeStatus() {
//        log.info("获取大理片笼信息:{}",bigStorageCageService.querybigStorageCageDetail());
        plcStorageCageTask.judgeGlassTypeStatus("P24060403|6|7", Const.A09_OUT_TARGET_POSITION);
    }
    @Test
    public void getStartLine() {
//        log.info("获取大理片笼信息:{}",bigStorageCageService.querybigStorageCageDetail());
        Integer startLine = plcStorageCageTask.getStartLine();
        log.info("---------{}", startLine);
    }
    @Test
    public void selectBigStorageCageUsage() {
//        bigStorageCageService.querybigStorageCageDetail(1);
        log.info("获取大理片笼信息:{}", bigStorageCageService.selectBigStorageCageUsage());
    }
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/service/impl/UpPattenUsageServiceImpl.java
@@ -19,7 +19,6 @@
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
@@ -67,7 +66,7 @@
        List<OptimizeUpPattenUsage> upPattenUsageList = null;
        if (engineeringId != null) {
            upPattenUsageList = optimizeProjectMapper.selectJoinList(OptimizeUpPattenUsage.class, new MPJQueryWrapper<OptimizeProject>()
                    .select("t.project_no,t.glass_type,b.realwidth as width,b.realheight as height ,REGEXP_REPLACE(t.glass_thickness,'\\D','')as glass_thickness,b.stock_id")
                    .select("t.project_no,t.glass_type,b.o_width as width,b.o_height as height ,REGEXP_REPLACE(t.glass_thickness,'\\D','')as glass_thickness,b.stock_id")
                    .leftJoin("optimize_layout b on t.project_no=b.project_no")
                    .eq("b.project_no", engineeringId));
        }
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/mapper/DownGlassInfoMapper.java
@@ -1,11 +1,13 @@
package com.mes.downglassinfo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.github.yulichang.base.MPJBaseMapper;
import com.mes.downglassinfo.entity.DownGlassInfo;
import com.mes.glassinfo.entity.GlassInfo;
import org.springframework.stereotype.Repository;
@Repository
public interface DownGlassInfoMapper extends BaseMapper<DownGlassInfo> {
public interface DownGlassInfoMapper extends BaseMapper<DownGlassInfo>, MPJBaseMapper<DownGlassInfo> {
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/service/impl/DownGlassTaskServiceImpl.java
@@ -5,15 +5,21 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mes.downglassinfo.entity.DownGlassInfo;
import com.mes.downglassinfo.entity.DownGlassTask;
import com.mes.downglassinfo.mapper.DownGlassInfoMapper;
import com.mes.downglassinfo.mapper.DownGlassTaskMapper;
import com.mes.downglassinfo.service.DownGlassInfoService;
import com.mes.downglassinfo.service.DownGlassTaskService;
import com.mes.downworkstation.entity.DownWorkstation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
 * <p>
@@ -27,15 +33,33 @@
@Service
public class DownGlassTaskServiceImpl extends ServiceImpl<DownGlassTaskMapper, DownGlassTask> implements DownGlassTaskService {
    @Autowired
    private DownGlassInfoService downGlassInfoService; // MySQL Mapper
    @Autowired
    private DownGlassTaskMapper downGlassTaskMapper; // SQL Server Mapper
    @Override
    public List<DownGlassTask> getUnloadingTaskState() {
        log.info("出片或直通任务状态为1 的任务");
        log.info("排除已经下片的出片或直通任务状态为1的任务");
        // Step 1: 从 MySQL 中获取玻璃 ID 列表
        // Step 2: 从 SQL Server 中过滤掉这些玻璃 ID 并查询任务
        QueryWrapper<DownGlassTask> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("task_stauts", 1).eq("task_type", 2).or().eq("task_type", 3);
        queryWrapper.eq("task_stauts", 1)
                .and(qw -> qw.eq("task_type", 2).or().eq("task_type", 3));
        List<DownGlassInfo> excludedGlassIds = downGlassInfoService.list();
        if (!excludedGlassIds.isEmpty()) {
            queryWrapper.notIn("glass_id", excludedGlassIds.stream().map(DownGlassInfo::getGlassId).collect(Collectors.toList()));
        }
        log.info(String.valueOf(excludedGlassIds));
        return baseMapper.selectList(queryWrapper);
    }
    @Override
    public void updateTaskState(String id) {
        UpdateWrapper<DownGlassTask> updateWrapper = new UpdateWrapper<>();
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/service/DownStorageCageDetailsService.java
@@ -56,7 +56,17 @@
    /**
     * @param start
     * @param end
     * @return   根据传入的料架号 查询符合按照流程卡中顺序出片的小片
     */
    List<DownStorageCageDetails> CacheOut2(int start, int end);
//    /**
//     * @return 直通查询
//     */
//    List<GlassInfo>  DirectConnection();
    /**
     * @return 直通查询
     */
    List<GlassInfo>  DirectConnection();
    boolean DirectConnection(GlassInfo glassInfo);
}
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/service/impl/DownStorageCageDetailsServiceImpl.java
@@ -162,23 +162,39 @@
//
//    }
  //  @Override
//    public List<GlassInfo>  DirectConnection(){
//        LambdaQueryWrapper<GlassInfo> queryWrapper2 = Wrappers.lambdaQuery();
//        queryWrapper2.select(GlassInfo::getFlowCardId,
//                GlassInfo::getGlassId,
//                GlassInfo::getTemperingLayoutId,
//                GlassInfo::getTemperingFeedSequence)
//                .notInSql(GlassInfo::getGlassId, "SELECT glass_id FROM down_glass_info")
//                .orderByAsc(GlassInfo::getTemperingLayoutId)
//                .orderByDesc(GlassInfo::getTemperingFeedSequence)
//                .last("LIMIT 1");
//
//        // 查询 GlassInfo 表
//        log.info("直通查询");
//        return glassInfoMapper.selectList(queryWrapper2);
//
//    };
    @Override
    public List<GlassInfo>  DirectConnection(){
        LambdaQueryWrapper<GlassInfo> queryWrapper2 = Wrappers.lambdaQuery();
        queryWrapper2.select(GlassInfo::getFlowCardId,
                GlassInfo::getGlassId,
                GlassInfo::getTemperingLayoutId,
                GlassInfo::getTemperingFeedSequence)
    public boolean DirectConnection(GlassInfo glassInfo) {
        LambdaQueryWrapper<GlassInfo> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(GlassInfo::getGlassId, glassInfo.getGlassId())
                .notInSql(GlassInfo::getGlassId, "SELECT glass_id FROM down_glass_info")
                .orderByAsc(GlassInfo::getTemperingLayoutId)
                .orderByDesc(GlassInfo::getTemperingFeedSequence)
                .orderByDesc(GlassInfo::getGlassType)
                .groupBy(GlassInfo::getFlowCardId)
                .last("LIMIT 1");
        // 查询 GlassInfo 表
        log.info("直通查询");
        return glassInfoMapper.selectList(queryWrapper2);
        // 查询符合条件的 GlassInfo 记录数量
        int count = glassInfoMapper.selectCount(queryWrapper);
    };
        return count > 0;
    }
@@ -188,12 +204,15 @@
    public List<DownStorageCageDetails> CacheOut1(int start, int end) {
        List<DownStorageCageDetails> cageDetails = downStorageCageDetailsMapper.selectList(null);
        // 创建一个 LambdaQueryWrapper 实例
        LambdaQueryWrapper<DownStorageCageDetails> lambdaQueryWrapper = new LambdaQueryWrapper<>();
// 条件 state=100
        lambdaQueryWrapper.eq(DownStorageCageDetails::getState, Const.GLASS_STATE_IN);
        List<DownStorageCageDetails> cageDetails = downStorageCageDetailsMapper.selectList(lambdaQueryWrapper);
        // Step 5: 判断 down_storage_cage_details 结果数量是否为9,如果是,则执行另外一个查询
        if (cageDetails.size() == 9) {
            log.info("1、笼子满了的时候,按照笼内版图id 版图片序出");
            List<DownWorkstation> workstationList = downWorkstationMapper.selectList(new QueryWrapper<DownWorkstation>().between("workstation_id", start, end));
            List<String> flowCardIds = new ArrayList<>();
            for (DownWorkstation workstation : workstationList) {
@@ -217,12 +236,10 @@
            // Step 1: 查询 DownWorkstation 表获取对应 workstation_id 的 flow_card_id
            List<DownWorkstation> workstationList = downWorkstationMapper.selectList(new QueryWrapper<DownWorkstation>().between("workstation_id", start, end));
            List<String> flowCardIds = new ArrayList<>();
            for (DownWorkstation workstation : workstationList) {
                flowCardIds.add(workstation.getFlowCardId());
            }
            if (flowCardIds.isEmpty()) {
                log.error("2、未找到对应的 flow_card_id");
                return Collections.emptyList(); // 返回空列表或者抛出异常,视情况而定
@@ -250,7 +267,6 @@
            cageDetailsQueryWrapper.in(DownStorageCageDetails::getGlassId, glassIds);
            cageDetailsQueryWrapper.in(DownStorageCageDetails::getFlowCardId, flowCardIds);
            cageDetailsQueryWrapper.eq(DownStorageCageDetails::getState, Const.GLASS_STATE_IN);
            log.info("按照流程卡的版图id 版图片序出");
            // Step 4: 查询 down_storage_cage_details 表并返回结果
            return downStorageCageDetailsMapper.selectList(cageDetailsQueryWrapper);
@@ -260,4 +276,78 @@
    }
        @Override
        public List<DownStorageCageDetails> CacheOut2(int start, int end) {
            // 创建一个 LambdaQueryWrapper 实例
            LambdaQueryWrapper<DownStorageCageDetails> lambdaQueryWrapper = new LambdaQueryWrapper<>();
// 条件 state=100
            lambdaQueryWrapper.eq(DownStorageCageDetails::getState, Const.GLASS_STATE_IN);
            List<DownStorageCageDetails> cageDetails = downStorageCageDetailsMapper.selectList(lambdaQueryWrapper);
            // Step 5: 判断 down_storage_cage_details 结果数量是否为9,如果是,则执行另外一个查询
            if (cageDetails.size() == 9) {
                log.info("1、笼子满了的时候,按照笼内流程卡顺序出 GlassType目前是流程卡中的顺序");
                List<DownWorkstation> workstationList = downWorkstationMapper.selectList(new QueryWrapper<DownWorkstation>().between("workstation_id", start, end));
                List<String> flowCardIds = new ArrayList<>();
                for (DownWorkstation workstation : workstationList) {
                    flowCardIds.add(workstation.getFlowCardId());
                }
                if (flowCardIds.isEmpty()) {
                    log.error("未找到对应的 flow_card_id");
                    return Collections.emptyList(); // 返回空列表或者抛出异常,视情况而定
                }
                LambdaQueryWrapper<DownStorageCageDetails> anotherQueryWrapper = Wrappers.lambdaQuery();
                anotherQueryWrapper.orderByAsc(DownStorageCageDetails::getGlassType);
                anotherQueryWrapper.in(DownStorageCageDetails::getFlowCardId, flowCardIds);
                anotherQueryWrapper.eq(DownStorageCageDetails::getState, Const.GLASS_STATE_IN);
                anotherQueryWrapper.last("LIMIT 1");
                return downStorageCageDetailsMapper.selectList(anotherQueryWrapper);
            } else {
                // Step 1: 查询 DownWorkstation 表获取对应 workstation_id 的 flow_card_id
                List<DownWorkstation> workstationList = downWorkstationMapper.selectList(new QueryWrapper<DownWorkstation>().between("workstation_id", start, end));
                List<String> flowCardIds = new ArrayList<>();
                for (DownWorkstation workstation : workstationList) {
                    flowCardIds.add(workstation.getFlowCardId());
                }
                if (flowCardIds.isEmpty()) {
                    log.error("2、未找到对应的 flow_card_id");
                    return Collections.emptyList(); // 返回空列表或者抛出异常,视情况而定
                }
                log.info("流程卡:{}", flowCardIds);
                LambdaQueryWrapper<GlassInfo> queryWrapper2 = Wrappers.lambdaQuery();
                queryWrapper2.select(GlassInfo::getFlowCardId,
                        GlassInfo::getGlassId)
                        .notInSql(GlassInfo::getGlassId, "SELECT glass_id FROM down_glass_info")
                        .orderByAsc(GlassInfo::getGlassType)
                        .last("LIMIT 1");
                // 查询 GlassInfo 表
                List<GlassInfo> glassInfos = glassInfoMapper.selectList(queryWrapper2);
                if (glassInfos.isEmpty()) {
                    log.error("未找到对应的玻璃信息");
                    return Collections.emptyList(); // 返回空列表或者抛出异常,视情况而定
                }
                // Step 3: 构造查询 down_storage_cage_details 表的条件
                List<String> glassIds = glassInfos.stream().map(GlassInfo::getGlassId).collect(Collectors.toList());
                LambdaQueryWrapper<DownStorageCageDetails> cageDetailsQueryWrapper = Wrappers.lambdaQuery();
                cageDetailsQueryWrapper.in(DownStorageCageDetails::getGlassId, glassIds);
                cageDetailsQueryWrapper.in(DownStorageCageDetails::getFlowCardId, flowCardIds);
                cageDetailsQueryWrapper.eq(DownStorageCageDetails::getState, Const.GLASS_STATE_IN);
                log.info("按照流程卡的顺序出");
                // Step 4: 查询 down_storage_cage_details 表并返回结果
                return downStorageCageDetailsMapper.selectList(cageDetailsQueryWrapper);
            }
    }
}
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/job/DownCacheGlassTask.java
@@ -129,12 +129,12 @@
            }
        }
        if (("1".equals(G11RobotTaskRequestWord) || "1".equals(G06RobotTaskRequestWord)) || "1".equals(G13RobotTaskRequestWord)) {
            log.info("4、有机器人下片请求,执行下片任务");
        if (("0".equals(G11RobotTaskRequestWord) || "0".equals(G06RobotTaskRequestWord)) || "0".equals(G13RobotTaskRequestWord)) {
            log.info("4、有下片完成信号更新落架数量");
            insertdownglassinfo();
        }
        //自动绑定架子,如果工位表没有绑定架子,默认将笼子中数量最多的流程卡号绑定机器手2的空架子
    }
@@ -155,9 +155,10 @@
        }
        log.info("2、获取到的玻璃信息为{}", glassInfo);
        if (glassInfo.getGlassId().equals(downStorageCageDetailsService.DirectConnection())) {
        if (downStorageCageDetailsService.DirectConnection(glassInfo)) {
            //直通
            log.info("3、如果当前玻璃属于版图id和片序的顺序则直通,执行下片任务");
            //log.info("3、如果当前玻璃属于版图id和片序的顺序则直通,执行下片任务");
          log.info("3、如果当前玻璃属于流程卡中的片序的顺序则直通,执行下片任务");
            DownWorkstation downWorkstation = downWorkstationService.getOne(new LambdaQueryWrapper<DownWorkstation>().eq(DownWorkstation::getFlowCardId, glassInfo.getFlowCardId()));
            int WorkstationId = downWorkstation.getWorkstationId();
            DownGlassTask downGlassTask = downStorageCageService.createDownGlassTask(glassInfo, "0", String.valueOf(WorkstationId), "3");
@@ -165,7 +166,9 @@
        } else {
            log.info("4、如果不属于版图id和片序的顺序执行进片任务");
           // log.info("4、如果不属于版图id和片序的顺序执行进片任务");
            log.info("4、如果不属于流程卡中的片序的顺序执行进片任务");
            //添加进片任务  查找空格
            List<DownStorageCageDetails> list = downStorageCageService.selectCacheEmpty();
            if (list.size() > 0) {
@@ -201,11 +204,12 @@
     * @param MESSendingWord
     */
    private Boolean outTo(String MESSendingWord) {
        log.info("单片情况根据传入的料架号 查询符合按照版图id和片序出片,并且优先出满架的小片");
       // log.info("单片情况根据传入的料架号 查询符合按照版图id和片序出片,并且优先出满架的小片");
        log.info("单片情况根据传入的料架号 查询符合按照流程卡中顺序出片,并且优先出满架的小片");
        List<DownStorageCageDetails> list1to3 = downStorageCageDetailsService.CacheOut1(1, 3);
        List<DownStorageCageDetails> list4to6 = downStorageCageDetailsService.CacheOut1(4, 6);
        List<DownStorageCageDetails> list1to6 = downStorageCageDetailsService.CacheOut1(1, 6);
//        List<DownStorageCageDetails> list1to3 = downStorageCageDetailsService.CacheOut1(1, 3);
//        List<DownStorageCageDetails> list4to6 = downStorageCageDetailsService.CacheOut1(4, 6);
        List<DownStorageCageDetails> list1to6 = downStorageCageDetailsService.CacheOut2(1, 6);
        DownStorageCageDetails selectedItem = null;
@@ -214,27 +218,28 @@
        // 优先 超出尺寸优先人工出片 人工处理
        if (!list1to6.isEmpty()) {
            DownStorageCageDetails item3 = list1to6.get(0);
            //后期有生产规则
            if (item3.getHeight() >= 2500 && item3.getWidth() >= 2660) {
                log.info("人工处理");
                selectedItem = item3;
                endCell = "7";
            } else if (!list4to6.isEmpty() && !list1to6.isEmpty()) {
                log.info("前后端都空闲 优先后端出片并且优先满架");
                selectedItem = list4to6.get(0);
            } else if (!!list1to6.isEmpty()) {
                log.info("前后端都空闲优先满架");
                selectedItem = list1to6.get(0);
            }
        }
        // 按照版图id和片序符合前端出片
        if (selectedItem == null && !list1to3.isEmpty()) {
            log.info("前端出片");
            selectedItem = list1to3.get(0);
        }
        // 按照版图id和片序符合后端出片
        if (selectedItem == null && !list4to6.isEmpty()) {
            log.info("后端出片");
            selectedItem = list4to6.get(0);
        }
//        if (selectedItem == null && !list1to3.isEmpty()) {
//            log.info("前端出片");
//            selectedItem = list1to3.get(0);
//        }
//
//        // 按照版图id和片序符合后端出片
//        if (selectedItem == null && !list4to6.isEmpty()) {
//            log.info("后端出片");
//            selectedItem = list4to6.get(0);
//        }
        if (selectedItem != null) {
            DownWorkstation downWorkstation = downWorkstationService.getOne(
@@ -286,11 +291,11 @@
                    DownWorkstation downWorkstation1 = downWorkstationService.selectByFlowCardId(downGlassInfo.getFlowCardId());
                    downWorkstationService.updateracksnumber(downGlassInfo.getFlowCardId(), downWorkstation1.getRacksnumber() + 1);
                    log.info("更新落架数量");
                    LambdaQueryWrapper<DownGlassTask> wrapper = new LambdaQueryWrapper<>();
                    wrapper.eq(DownGlassTask::getGlassId, newdownGlassInfo.getGlassId());
                    DownGlassTask updateDetail = new DownGlassTask();
                    updateDetail.setTaskStauts(2);
                    downGlassTaskService.update(updateDetail, wrapper);
//                    LambdaQueryWrapper<DownGlassTask> wrapper = new LambdaQueryWrapper<>();
//                    wrapper.eq(DownGlassTask::getGlassId, newdownGlassInfo.getGlassId());
//                    DownGlassTask updateDetail = new DownGlassTask();
//                    updateDetail.setTaskStauts(2);
//                    downGlassTaskService.update(updateDetail, wrapper);
                    sequence++; // 递增顺序字段值
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/application-prod.yml
@@ -14,6 +14,11 @@
          username: sa
          password: beibo.123/
          driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
        pp:
          url: jdbc:mysql://10.153.19.150:3306/pp?serverTimezone=GMT%2b8
          username: root
          password: beibo.123/
          driver-class-name: com.mysql.cj.jdbc.Driver
  cloud:
    nacos:
      discovery:
hangzhoumesParent/moduleService/UnLoadGlassModule/src/test/java/mes/UnloadGlassModuleApplicationTest.java
@@ -1,6 +1,7 @@
package mes;
import com.mes.UnLoadGlassApplication;
import com.mes.downglassinfo.service.DownGlassTaskService;
import com.mes.downglassinfo.service.impl.DownGlassInfoServiceImpl;
import com.mes.downglassinfo.service.impl.DownGlassTaskServiceImpl;
import com.mes.downstorage.entity.DownStorageCage;
@@ -58,6 +59,8 @@
    DownWorkstationService downWorkstationService;
    @Autowired
    DownStorageCageService downStorageCageService;
    @Autowired
    DownGlassTaskService downGlassTaskService;
@@ -171,8 +174,15 @@
    @Test
    public void getFlowCardId() {
        glassInfoServiceImpl.getFlowCardId();
    }
    @Test
    public void getUnloadingTaskState() {
        downGlassTaskService.getUnloadingTaskState();
    }
    @Test