Merge branch 'master' of http://10.153.19.25:10101/r/HangZhouMes
| | |
| | | "@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", |
| | |
| | | "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", |
| | |
| | | "@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" |
| | | } |
| | | }, |
| | |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "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", |
| | |
| | | }, |
| | | "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": { |
| | |
| | | "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", |
| | |
| | | "@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": { |
| | |
| | | }, |
| | | "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" |
| | | } |
| | | } |
| | | }, |
| | |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "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", |
| | |
| | | "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": { |
| | |
| | | "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", |
| | |
| | | "@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": { |
| | |
| | | "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" |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | "@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", |
| | |
| | | "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", |
| | |
| | | "@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" |
| | | } |
| | | } |
| | |
| | | ] |
| | | }, |
| | | |
| | | { |
| | | path: 'GlassStorage', |
| | | name: 'GlassStorage', |
| | | component: () => import('../views/GlassStorage/MaterialRackManagement.vue'), |
| | | children:[ |
| | | { |
| | | path: '/GlassStorage/MaterialRackManagement', |
| | | name: 'MaterialRackManagement', |
| | | component: () => import('../views/GlassStorage/MaterialRackManagement.vue') |
| | | } |
| | | ] |
| | | }, |
| | | |
| | | /*----------- 可视化系统 ----------------*/ |
| | | { |
| | | path: 'Visualization', |
New file |
| | |
| | | <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>
|
| | |
| | | { |
| | | "plcAddressBegin":"DB.0", |
| | | "plcAddressLenght":"72", |
| | | "plcAddressBegin":"DB14.0", |
| | | "plcAddressLenght":"84", |
| | | "dataType":"word", |
| | | "parameteInfor":[ |
| | | { |
| | |
| | | }, |
| | | { |
| | | "codeId": "D04Request", |
| | | "addressIndex":"8", |
| | | "addressIndex":"34", |
| | | "addressLenght":"2", |
| | | "ratio":"1", |
| | | "unit":"" |
| | |
| | | { |
| | | "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":"" |
New file |
| | |
| | | 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; |
| | | |
| | | } |
| | |
| | | * 磨边清洗前 |
| | | */ |
| | | /** |
| | | * 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; |
| | |
| | | * 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; |
| | | |
| | | /** |
| | | * 卧转立进片请求 |
| | |
| | | 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 任务生成 |
| | |
| | | */ |
| | | 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; |
| | | |
| | | /** |
| | | * 钢化小片表 |
| | |
| | | |
| | | import com.github.yulichang.base.MPJBaseMapper; |
| | | import com.mes.glassinfo.entity.GlassInfo; |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | |
| | | /** |
| | | * <p> |
| | |
| | | * @author wu |
| | | * @since 2024-04-29 |
| | | */ |
| | | public interface GlassInfoMapper extends BaseMapper<GlassInfo>, MPJBaseMapper<GlassInfo> { |
| | | public interface GlassInfoMapper extends MPJBaseMapper<GlassInfo> { |
| | | |
| | | } |
| | |
| | | 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> |
| | |
| | | public class GlassInfoServiceImpl extends MPJBaseServiceImpl<GlassInfoMapper, GlassInfo> implements GlassInfoService { |
| | | @Autowired |
| | | OptimizeProjectMapper optimizeProjectMapper; |
| | | |
| | | @Override |
| | | @DS("pp") |
| | | public List<GlassInfo> selectGlassInfo(String engineeringId) { |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | @Override |
| | | public int getGlassInfoCountByFlowCardId(String flowCardId) { |
| | | return baseMapper.selectCount(new QueryWrapper<GlassInfo>().lambda() |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | @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; |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | } |
| | |
| | | |
| | | 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; |
| | | |
| | |
| | | * </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; |
| | | |
| | | |
| | | } |
| | |
| | | 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> |
| | |
| | | @DS("salve_hangzhoumes") |
| | | public interface TemperingGlassInfoMapper extends MPJBaseMapper<TemperingGlassInfo> { |
| | | |
| | | boolean saveBatch(@Param(value = "list") List<TemperingGlassInfo> list); |
| | | |
| | | } |
New file |
| | |
| | | <?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> |
| | |
| | | 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: |
| | |
| | | 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); |
| | | } |
| | | |
| | |
| | | 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; |
| | |
| | | @Api(description = "大理片笼详情") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = false) |
| | | public class BigStorageCageDetails implements Serializable { |
| | | public class BigStorageCageDetails extends BigStorageCageBaseInfo implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | |
| | | @ApiModelProperty(value = "设备id", position = 3) |
| | | private Integer deviceId; |
| | | |
| | | /** |
| | | * 栅格号 |
| | | */ |
| | | @ApiModelProperty(value = "栅格号", position = 4) |
| | | private Integer slot; |
| | | |
| | | /** |
| | | * 玻璃id |
| | | */ |
| | | @ApiModelProperty(value = "玻璃id", position = 5) |
| | | private String glassId; |
| | | |
| | | /** |
| | | * 小片在格内的顺序 |
| | |
| | | */ |
| | | @ApiModelProperty(value = "玻璃类型", position = 8) |
| | | private Integer glassType; |
| | | |
| | | /** |
| | | * 宽 |
| | | */ |
| | | @ApiModelProperty(value = "宽", position = 9) |
| | | private Double width; |
| | | |
| | | /** |
| | | * 高 |
| | |
| | | */ |
| | | @Data |
| | | public class BigStorageDTO { |
| | | /** |
| | | * 格子号 |
| | | */ |
| | | private Integer slot; |
| | | /** |
| | | * 剩余宽度 |
| | | */ |
| | | private Integer width; |
| | | |
| | | /** |
| | | * 玻璃数量 |
| | | */ |
| | | private Integer glassCount; |
| | | } |
| | |
| | | |
| | | void deleteBigStorageCageDetails(BigStorageCageDetails bigStorageCageDetails); |
| | | |
| | | void damageBigStorageCageDetails(String glassId); |
| | | void damageBigStorageCageDetails(String glassId,int status); |
| | | |
| | | BigStorageCageDetails selectBigStorageCageDetails(String glassId); |
| | | |
| | |
| | | @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)); |
| | |
| | | } 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)); |
| | |
| | | } |
| | | return bigStorageCageDetailsList; |
| | | } |
| | | |
| | | } |
| | | |
| | | /** |
| | |
| | | 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; |
| | |
| | | |
| | | //理片笼详情破损 |
| | | @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); |
| | |
| | | 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()); |
| | |
| | | BigStorageCageDetails bigStorageCageDetails = new BigStorageCageDetails(); |
| | | BeanUtils.copyProperties(glassInfo, bigStorageCageDetails); |
| | | bigStorageCageDetails.setState(0); |
| | | bigStorageCageDetails.setGap(20); |
| | | bigStorageCageDetails.setGap(galssGap); |
| | | return bigStorageCageDetails; |
| | | } |
| | | |
| | |
| | | //理片笼详情完成 |
| | | @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")); |
| | |
| | | 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 |
| | |
| | | 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; |
| | |
| | | @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); |
| | | } |
| | | |
| | |
| | | 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; |
| | |
| | | |
| | | 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; |
| | | |
| | |
| | | * @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); |
| | | } |
| | |
| | | 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> |
| | |
| | | @DS("salve_hangzhoumes") |
| | | public interface BigStorageCageOutTaskMapper extends BaseMapper<BigStorageCageOutTask> { |
| | | |
| | | boolean saveBatch(@Param(value = "list") List<BigStorageCageOutTask> list); |
| | | } |
| | |
| | | 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; |
| | |
| | | * @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); |
| | | |
| | |
| | | /** |
| | | * 查询卧转立玻璃是否进片完成 |
| | | */ |
| | | List<String> querySitToUpGlass(); |
| | | BigStorageDTO querySitToUpRemainWidth(Integer line); |
| | | |
| | | /** |
| | | * 查询卧转立玻璃是否进片完成 |
| | | */ |
| | | List<Integer> querySitToUpGlass(); |
| | | } |
| | |
| | | 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; |
| | | |
| | |
| | | |
| | | void updateOutTask(); |
| | | |
| | | boolean saveBatch(List<BigStorageCageOutTask> list); |
| | | |
| | | void deleteOutTask(String glassId); |
| | | } |
| | |
| | | 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; |
| | |
| | | } |
| | | |
| | | @Override |
| | | public List<String> querySitToUpGlass() { |
| | | public BigStorageDTO querySitToUpRemainWidth(Integer line) { |
| | | return baseMapper.querySitToUpRemainWidth(line); |
| | | } |
| | | |
| | | @Override |
| | | public List<Integer> querySitToUpGlass() { |
| | | return baseMapper.querySitToUpGlass(); |
| | | } |
| | | } |
| | |
| | | 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; |
| | |
| | | @Resource |
| | | BigStorageCageDetailsMapper bigStorageCageDetailsMapper; |
| | | |
| | | @Override |
| | | public boolean saveBatch(List<BigStorageCageOutTask> list) { |
| | | return baseMapper.saveBatch(list); |
| | | } |
| | | |
| | | /** |
| | | * 查询任务信息 |
| | | */ |
| | |
| | | List<TemperingGlassInfo> temperingGlassInfoList= temperingGlassInfoService.list(); |
| | | jsonObject.append("temperingGlassInfoList", temperingGlassInfoList); |
| | | |
| | | //报警信息 |
| | | jsonObject.append("bigStorageCageFullAlarm", PlcStorageCageTask.bigStorageCageFullAlarm); |
| | | |
| | | //理片笼表格信息 |
| | | jsonObject.append("bigStorageCageInfo", bigStorageCageService.querybigStorageCageDetail(0)); |
| | | |
| | |
| | | |
| | | 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; |
| | |
| | | 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; |
| | | |
| | | /** |
| | |
| | | @Slf4j |
| | | public class PlcStorageCageTask { |
| | | |
| | | @Resource |
| | | private BigStorageCageService bigStorageCageService; |
| | | @Resource |
| | | private BigStorageCageDetailsService bigStorageCageDetailsService; |
| | | @Resource |
| | |
| | | @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) { |
| | |
| | | @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(); |
| | |
| | | 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)) { |
| | |
| | | |
| | | @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; |
| | | } |
| | | //未到齐 执行内部调度任务 |
| | |
| | | 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; |
| | | } |
| | |
| | | .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); |
| | | } |
| | | } |
| | | } |
| | |
| | | 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); |
| | |
| | | //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); |
| | | } |
| | | |
| | | /** |
| | |
| | | * @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) { |
| | |
| | | } |
| | | 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)); |
| | | } |
| | | |
| | | |
| | | } |
| | | } |
| | |
| | | @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); |
| | | } |
| | | } |
| | |
| | | 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; |
| | |
| | | * @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(); |
| | | } |
| | |
| | | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public boolean saveBatch(List<TemperingGlassInfo> list) { |
| | | return baseMapper.saveBatch(list); |
| | | } |
| | | |
| | | //调度 |
| | | @Override |
| | | public void schedulingTask(){ |
| | |
| | | { |
| | | "plcAddressBegin":"DB.0", |
| | | "plcAddressLenght":"72", |
| | | "plcAddressBegin":"DB14.0", |
| | | "plcAddressLenght":"84", |
| | | "dataType":"word", |
| | | "parameteInfor":[ |
| | | { |
| | |
| | | }, |
| | | { |
| | | "codeId": "D04Request", |
| | | "addressIndex":"8", |
| | | "addressIndex":"34", |
| | | "addressLenght":"2", |
| | | "ratio":"1", |
| | | "unit":"" |
| | |
| | | { |
| | | "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":"" |
| | |
| | | sequence: |
| | | order: false |
| | | minCount: 5 |
| | | slotWidth: 5000 |
| | | carWidth: 5000 #大车宽度 |
| | | slotWidth: 5000 #大车宽度 |
| | | carMaxSize: 6 #大车最大存放玻璃数量 |
| | | galssGap: 20 #玻璃间距 |
| | |
| | | </resultMap> |
| | | |
| | | <select id="temperingIsAll" resultMap="temperingLayoutDTO"> |
| | | SELECT T2.* |
| | | FROM ( |
| | | SELECT T.ENGINEER_ID, |
| | | T.TEMPERING_LAYOUT_ID, |
| | | COUNT(T.TEMPERING_FEED_SEQUENCE) AS COUNT |
| | |
| | | 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"> |
| | |
| | | <!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, |
| | |
| | | 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> |
New file |
| | |
| | | <?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> |
| | |
| | | } |
| | | |
| | | @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()); |
| | | } |
| | | |
| | |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | |
| | | /** |
| | |
| | | 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)); |
| | | } |
| | |
| | | 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> { |
| | | |
| | | |
| | | |
| | |
| | | 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> |
| | |
| | | @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<>(); |
| | |
| | | |
| | | |
| | | /** |
| | | * @param start |
| | | * @param end |
| | | * @return 根据传入的料架号 查询符合按照流程卡中顺序出片的小片 |
| | | */ |
| | | List<DownStorageCageDetails> CacheOut2(int start, int end); |
| | | // /** |
| | | // * @return 直通查询 |
| | | // */ |
| | | // List<GlassInfo> DirectConnection(); |
| | | /** |
| | | * @return 直通查询 |
| | | */ |
| | | List<GlassInfo> DirectConnection(); |
| | | boolean DirectConnection(GlassInfo glassInfo); |
| | | } |
| | |
| | | // |
| | | // } |
| | | |
| | | // @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; |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | |
| | | 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) { |
| | |
| | | // 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(); // 返回空列表或者抛出异常,视情况而定 |
| | |
| | | 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); |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | @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); |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | 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的空架子 |
| | | |
| | | |
| | | |
| | | } |
| | |
| | | } |
| | | 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"); |
| | |
| | | |
| | | } else { |
| | | |
| | | log.info("4、如果不属于版图id和片序的顺序执行进片任务"); |
| | | // log.info("4、如果不属于版图id和片序的顺序执行进片任务"); |
| | | log.info("4、如果不属于流程卡中的片序的顺序执行进片任务"); |
| | | |
| | | //添加进片任务 查找空格 |
| | | List<DownStorageCageDetails> list = downStorageCageService.selectCacheEmpty(); |
| | | if (list.size() > 0) { |
| | |
| | | * @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; |
| | | |
| | |
| | | // 优先 超出尺寸优先人工出片 人工处理 |
| | | 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( |
| | |
| | | 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++; // 递增顺序字段值 |
| | | |
| | | |
| | |
| | | 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: |
| | |
| | | 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; |
| | |
| | | DownWorkstationService downWorkstationService; |
| | | @Autowired |
| | | DownStorageCageService downStorageCageService; |
| | | @Autowired |
| | | DownGlassTaskService downGlassTaskService; |
| | | |
| | | |
| | | |
| | |
| | | @Test |
| | | public void getFlowCardId() { |
| | | |
| | | |
| | | glassInfoServiceImpl.getFlowCardId(); |
| | | |
| | | } |
| | | |
| | | @Test |
| | | public void getUnloadingTaskState() { |
| | | |
| | | |
| | | downGlassTaskService.getUnloadingTaskState(); |
| | | } |
| | | |
| | | @Test |