| | |
| | | "@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"
|
| | | >
|
| | | <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="taskStatus" label="任务状态"></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>
|
| | |
| | | * bean注册:会自动扫描带有@ServerEndpoint注解声明的Websocket Endpoint(端点),注册成为Websocket bean。 |
| | | * 要注意,如果项目使用外置的servlet容器,而不是直接使用springboot内置容器的话,就不要注入ServerEndpointExporter,因为它将由容器自己提供和管理。 |
| | | */ |
| | | @Bean |
| | | public ServerEndpointExporter serverEndpointExporter() { |
| | | return new ServerEndpointExporter(); |
| | | } |
| | | // @Bean |
| | | // public ServerEndpointExporter serverEndpointExporter() { |
| | | // return new ServerEndpointExporter(); |
| | | // } |
| | | |
| | | } |
| | |
| | | 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> |
| | |
| | | |
| | | @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; |
| | | } |
| | | |
| | | |
| | |
| | | // 优先 超出尺寸优先人工出片 人工处理 |
| | | if (!list1to6.isEmpty()) { |
| | | DownStorageCageDetails item3 = list1to6.get(0); |
| | | //后期有生产规则 |
| | | if (item3.getHeight() >= 2500 && item3.getWidth() >= 2660) { |
| | | log.info("人工处理"); |
| | | selectedItem = item3; |
| | | |
| | | } else if (!!list1to6.isEmpty()) { |
| | | log.info("前后端都空闲 优先后端出片并且优先满架"); |
| | | log.info("前后端都空闲优先满架"); |
| | | selectedItem = list1to6.get(0); |
| | | } |
| | | } |
| | |
| | | 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: |