UI-Project/src/utils/api.js
@@ -1,14 +1,42 @@ // src/services/api.js import request from 'request'; import request from '../utils/request'; import { ElMessage } from 'element-plus'; // Replace with your actual backend base URL export const findTasks = (id, newState) => { // Function to find list of raw usages const BASE_URL = 'glassStorage/api/rawUsage'; const taskBASE_URL = 'glassStorage/api/storageTask'; export const findTasks = () => { const url = `glassStorage/api/storageTask/findTasks`; const options = { method: 'POST', method: 'get', url, json: true, body: { id, enableState: newState } }; return new Promise((resolve, reject) => { request(options, (error, response, body) => { if (error) { reject(new Error(error.message)); } else { resolve(body); } }); }); }; export const findList = (params) => { const url = `${BASE_URL}/findList`; const options = { method: 'post', url, json: true, body: params }; return new Promise((resolve, reject) => { @@ -21,3 +49,157 @@ }); }); }; // Function to find raw usage by ID export const findById = (id) => { const url = `${BASE_URL}/${id}`; const options = { method: 'get', url, json: true }; return new Promise((resolve, reject) => { request(options, (error, response, body) => { if (error) { reject(new Error(error.message)); } else { resolve(body); } }); }); }; // Function to insert a new raw usage export const insertRawUsage = (rawUsage) => { const url = `${BASE_URL}`; const options = { method: 'post', url, json: true, body: rawUsage }; return new Promise((resolve, reject) => { request(options, (error, response, body) => { if (error) { reject(new Error(error.message)); } else { resolve(body); } }); }); }; export const updateRawUsage = async (rawUsage) => { try { const response = await request.post(`${BASE_URL}/updaterawUsage`, rawUsage); ElMessage.success('修改成功'); return response.data; } catch (error) { ElMessage.error('修改失败'); throw error; } }; export const deleteRawUsage = async (id) => { try { const response = await request.post(`${BASE_URL}/id`, id); ElMessage.success('删除原始使用数据成功'); return response.data; } catch (error) { ElMessage.error('删除原始使用数据失败'); throw error; } }; export const inStorage = async (RawUsageAndShelfRack) => { try { const response = await request.post(`${BASE_URL}/inStorage`, RawUsageAndShelfRack); ElMessage.success('入库操作成功'); return response.data; } catch (error) { ElMessage.error('入库操作失败'); throw error; } }; export const outStorage = async (RawUsageAndShelfRack) => { try { const response = await request.post(`${BASE_URL}/outStorage`, RawUsageAndShelfRack); ElMessage.success('出库操作成功'); return response.data; } catch (error) { ElMessage.error('出库操作失败'); throw error; } }; export const taskUpdate = async (task) => { try { const response = await request.post(`${taskBASE_URL}/taskUpdate`, task); return response.data; } catch (error) { throw error; } }; const API_URL = 'glassStorage/api/shelfRack'; // Adjust this based on your actual API URL export const shelfRackfindList = (params) => { return request.post(`${API_URL}/findList`, params) .then(response => response.data) .catch(error => { throw error; // Handle errors appropriately in your frontend }); }; export const shelfRackfindById = (id) => { return request.get(`${API_URL}/${id}`) .then(response => response.data) .catch(error => { throw error; }); }; export const insertShelfRack = (shelfRack) => { return request.post(`${API_URL}`, shelfRack) .then(response => response.data) .catch(error => { throw error; }); }; export const updateShelfRack = (shelfRack) => { return request.put(`${API_URL}`, shelfRack) .then(response => response.data) .catch(error => { throw error; }); }; export const shelfRackdeleteById = (id) => { return request.delete(`${API_URL}/${id}`) .then(response => response.data) .catch(error => { throw error; }); }; export const findShelfRack = () => { return request.get(`${API_URL}/findshelfrack`) .then(response => response.data) .catch(error => { throw error; }); }; UI-Project/src/views/GlassStorage/MaterialRackManagement.vue
@@ -1,119 +1,174 @@ <template> <div class="app-container" style="height: 600px;"> <!-- <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" style="margin-left: 10px;" @click="storage()">原片仓储详情</el-button> <el-button type="success" size="mini" @click="handleInbound()">入库</el-button> <el-button type="success" size="mini" >吊装位入库</el-button> </div> <!-- 右侧选择框 --> <el-form-item style="margin-top: 15px; width: 150px;margin-left: 10px;"> <el-select v-model="formData2.dzw" placeholder="请选择吊装位"> <el-option label="吊装位1" value="吊装位1"></el-option> <el-option label="吊装位2" value="吊装位2"></el-option> <!-- 根据实际情况添加更多选项 --> </el-select> </el-form-item> </div> <el-dialog v-model="Hidden" top="10vh" width="80%" > <div class="app-container"> <el-card style="flex: 1; margin-left: 10px" :loading="loading"> <div slot="header" class="clearfix" style="display: flex; align-items: center" > <!-- 左侧按钮组 --> <div> <el-button type="success" size="mini" @click="storage()" >原片仓储详情</el-button > <el-button type="success" size="mini" @click="handleInbound()" >入库</el-button > <el-button type="success" size="mini">吊装位入库</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-dialog v-model="Hidden" top="10vh" width="80%"> <el-table :data="tableData" v-model="dialogVisible3" style="width: 98%; height: 200px" @selection-change="handleSelectionChange" :header-cell-style="{ background: '#F2F3F5', color: '#1D2129' }" ref="table" empty-text="No Data" > <el-table-column prop="number" label="库位号"></el-table-column> <el-table-column prop="rawType" label="类型"></el-table-column> <el-table-column prop="rawWidth" label="长度(mm)"></el-table-column> <el-table-column prop="rawHeight" label="高度(mm)"></el-table-column> <el-table-column prop="rawThickness" label="厚度(mm)" ></el-table-column> <el-table-column prop="pieces" label="数量"></el-table-column> <el-table-column prop="createTime" label="入库时间"></el-table-column> <el-table-column prop="batchId" label="批次号"></el-table-column> <el-table-column align="center" label="料架状态" min-width="80" prop="enableState" > <template #default="scope"> <el-tag :type="getTagType(scope.row.enableState)" @click="toggleStatus(scope.row)" > {{ scope.row.enableState === 1 ? "启用" : "未启用" }} </el-tag> </template> </el-table-column> <!-- 操作列 --> <el-table-column label="操作" width="250"> <template #default="{ row }"> <el-button type="primary" size="mini" @click="edithandleRowClick(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 > <!-- <el-button type="success" size="mini" @click="addglass()">添加原片</el-button> --> </template> </el-table-column> </el-table> <el-pagination v-if="totalItems > 0" background layout="prev, pager, next" :total="totalItems" :page-size="pageSize" @current-change="handleCurrentChange" ></el-pagination> </el-dialog> <el-table :data="tableData" v-model="dialogVisible3" style="width: 98%; height: 500px" :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="location" align="center" label="库位号"></el-table-column> <el-table-column prop="type" align="center" label="类型"></el-table-column> <el-table-column prop="length" align="center" label="长度(mm)"></el-table-column> <el-table-column prop="height" align="center" label="高度(mm)"></el-table-column> <el-table-column prop="thickness" align="center" label="厚度(mm)"></el-table-column> <el-table-column prop="quantity" align="center" label="数量"></el-table-column> <el-table-column prop="entry_time" align="center" min-width="180" label="入库时间"></el-table-column> <el-table-column prop="batchnumber" align="center" label="批次号"></el-table-column> <template #header> <div style="display: flex; align-items: center"> <span style="font-size: 16px; font-weight: bold; margin-right: 20px" >任务列表</span > </div> </template> <el-table-column prop="id" label="Glassid"></el-table-column> <el-table-column prop="taskType" label="任务描述" width="250" :formatter="formatTaskType" ></el-table-column> <el-table-column prop="rawThickness" label="玻璃厚度" ></el-table-column> <el-table-column prop="color" label="玻璃膜系"></el-table-column> <el-table-column prop="startTime" label="创建时间"></el-table-column> <el-table-column align="center" label="料架状态" label="任务状态" min-width="80" prop="shelf_status" prop="taskState" > <template #default="scope"> <el-tag :type="getTagType(scope.row.shelf_status)" @click="toggleStatus(scope.row)"> {{ scope.row.shelf_status === 1 ? '启用' : '未启用' }} </el-tag> </template> </el-table-column> <template #default="scope"> <el-tag :type="getTagType2(scope.row.taskState)"> {{ scope.row.taskState == "completed" ? "完成" : "进行中" }} </el-tag> </template> </el-table-column> <!-- 操作列 --> <el-table-column label="操作" align="center" width="250"> <el-table-column label="操作" width="350"> <template #default="{ row }"> <el-button type="primary" size="mini" @click="edithandleRowClick(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> <!-- <el-button type="success" size="mini" @click="addglass()">添加原片</el-button> --> <el-button type="primary" size="mini" @click="handleRestart(row)" >重新开始</el-button > <el-button type="danger" size="mini" @click="handleDeletetask(row)" >删除任务</el-button > <el-button type="success" size="mini" @click="handleComplete(row)" >任务完成</el-button > </template> </el-table-column> </el-table> <el-pagination v-if="totalItems > 0" background layout="prev, pager, next" :total="totalItems" :page-size="pageSize" @current-change="handleCurrentChange" ></el-pagination> </el-dialog> <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;" v-loading="loading"> <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;"> <el-table :data="tasktableData" height="240" @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="handleDeletetask(row)">删除任务</el-button> <el-button type="success" size="mini" @click="handleComplete(row)">任务完成</el-button> </template> </el-table-column> </el-table> </div> </el-card> <!-- </el-card> --> <div class="img-ypcc" > <div class="img-car1" :style="'z-index:999;left:397px;top:205px;position:absolute;'"> <div v-show="cellshow1" style="margin-top:10px;width:200px;height:5px;background-color:#409EFF;"></div> </el-card> <div class="img-ypcc"> <div class="img-car1" :style="'z-index:999;left:397px;top:205px;position:absolute;'" > <div v-show="cellshow1" style=" margin-top: 10px; width: 200px; height: 5px; background-color: #409eff; " ></div> </div> </div> </div> <!-- 入库对话框 --> <el-dialog title="入库" @@ -123,9 +178,9 @@ > <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 v-model="formData.number" placeholder="请选择进库料架"> <el-option label="1" value="1"></el-option> <el-option label="2" value="2"></el-option> <!-- 根据实际情况添加更多选项 --> </el-select> </el-form-item> @@ -137,348 +192,555 @@ </el-select> </el-form-item> <el-form-item label="宽度"> <el-input v-model.number="formData.width" placeholder="请输入宽度"></el-input> <el-input v-model.number="formData.rawWidth" placeholder="请输入宽度" ></el-input> </el-form-item> <el-form-item label="高度"> <el-input v-model.number="formData.height" placeholder="请输入高度"></el-input> <el-input v-model.number="formData.rawHeight" placeholder="请输入高度" ></el-input> </el-form-item> <el-form-item label="厚度"> <el-input v-model.number="formData.thickness" placeholder="请输入厚度"></el-input> <el-input v-model.number="formData.rawThickness" placeholder="请输入厚度" ></el-input> </el-form-item> <el-form-item label="数量"> <el-input v-model.number="formData.quantity" placeholder="请输入数量"></el-input> <el-input v-model.number="formData.pieces" placeholder="请输入数量" ></el-input> </el-form-item> </el-form> <div slot="footer" class="dialog-footer"> <el-button @click="dialogVisible = false">取 消</el-button> <el-button type="primary" @click="handleConfirmInbound">确 定</el-button> <el-button type="primary" @click="handleConfirmInbound" >确 定</el-button > </div> </el-dialog> <el-dialog title="添加原片" v-model="dialogVisible3" width="50%"> <el-form :model="formData3" ref="form" label-width="80px"> <el-form-item label="颜色膜系"> <el-input v-model="formData.selectedColor" readonly style="width: 250px; height: 35px; font-size: 20px"></el-input> <el-dropdown @command="handleCommand"> <span class="el-dropdown-link"> 选择<i class="el-icon-arrow-down el-icon--right"></i> </span> <el-dropdown-menu slot="dropdown"> <el-dropdown-item v-for="color in colors" :key="color['0_glass_id']" :command="color['0_glass_id']"> {{ color['0_glass_id'] }} </el-dropdown-item> </el-dropdown-menu> </el-dropdown> </el-form-item> <el-form-item label="长度"> <el-input v-model="formData.width" required style="width: 250px; font-size: 20px" @focus="clearInput('wid')"></el-input> </el-form-item> <el-form-item label="高度"> <el-input v-model="formData.height" required style="width: 250px; font-size: 20px" @focus="clearInput('heig')"></el-input> </el-form-item> <el-form-item label="厚度"> <el-input v-model="formData.thickness" required style="width: 250px; font-size: 20px" @focus="clearInput('thinkness')"></el-input> </el-form-item> <el-form-item label="数量"> <el-input-number v-model="formData.quantity" required :min="0" :max="9000" style="width: 250px; font-size: 20px" @focus="clearInput('num')"></el-input-number> </el-form-item> </el-form> <span slot="footer" class="dialog-footer"> <el-button @click="dialogVisible3 = false">关闭</el-button> <el-button type="primary" @click="submitForm">提交</el-button> </span> </el-dialog> <el-dialog title="编辑" v-model="editdialogVisible" width="30%" @close="edithandleDialogClose"> <el-form :model="editForm" ref="editFormRef" label-width="80px"> <el-form-item label="数量"> <el-input v-model="editForm.quantity"></el-input> <el-dialog title="添加原片" v-model="dialogVisible3" width="50%"> <el-form :model="formData3" ref="form" label-width="80px"> <el-form-item label="颜色膜系"> <el-input v-model="formData.selectedColor" readonly style="width: 250px; height: 35px; font-size: 20px" ></el-input> <el-dropdown @command="handleCommand"> <span class="el-dropdown-link"> 选择<i class="el-icon-arrow-down el-icon--right"></i> </span> <el-dropdown-menu slot="dropdown"> <el-dropdown-item v-for="color in colors" :key="color['0_glass_id']" :command="color['0_glass_id']" > {{ color["0_glass_id"] }} </el-dropdown-item> </el-dropdown-menu> </el-dropdown> </el-form-item> <el-form-item label="批次号"> <el-input v-model="editForm.batchnumber"></el-input> </el-form-item> <el-form-item label="长度"> <el-input v-model="editForm.length"></el-input> <el-input v-model="formData.width" required style="width: 250px; font-size: 20px" @focus="clearInput('wid')" ></el-input> </el-form-item> <el-form-item label="高度"> <el-input v-model="editForm.height"></el-input> <el-input v-model="formData.height" required style="width: 250px; font-size: 20px" @focus="clearInput('heig')" ></el-input> </el-form-item> <el-form-item label="厚度"> <el-input v-model="editForm.thickness"></el-input> <el-input v-model="formData.thickness" required style="width: 250px; font-size: 20px" @focus="clearInput('thinkness')" ></el-input> </el-form-item> <el-form-item label="数量"> <el-input-number v-model="formData.quantity" required :min="0" :max="9000" style="width: 250px; font-size: 20px" @focus="clearInput('num')" ></el-input-number> </el-form-item> </el-form> <div class="dialog-footer"> <span slot="footer" class="dialog-footer"> <el-button @click="dialogVisible3 = false">关闭</el-button> <el-button type="primary" @click="submitForm">提交</el-button> </span> </el-dialog> <el-dialog title="编辑" v-model="editdialogVisible" width="30%" @close="edithandleDialogClose" > <el-form :model="editForm" ref="editFormRef" label-width="80px"> <el-form-item label="数量"> <el-input v-model="editForm.pieces"></el-input> </el-form-item> <el-form-item label="批次号"> <el-input v-model="editForm.batchId"></el-input> </el-form-item> <el-form-item label="长度"> <el-input v-model="editForm.rawWidth"></el-input> </el-form-item> <el-form-item label="高度"> <el-input v-model="editForm.rawHeight"></el-input> </el-form-item> <el-form-item label="厚度"> <el-input v-model="editForm.rawThickness"></el-input> </el-form-item> </el-form> <div class="dialog-footer"> <el-button @click="editdialogVisible = false">取消</el-button> <el-button type="primary" @click="editsaveEdit">保存</el-button> </div> </el-dialog> </div> </template> <script setup> import { ref, onMounted, onBeforeUnmount } from 'vue'; // 导入 Vue 3 的模块 import * as echarts from 'echarts'; import { ElMessage, ElMessageBox } from 'element-plus' import {tableData} from '@/stores/tableData.js'; const loading = ref(false); const Hidden = ref(false) const totalItems = ref(0); totalItems.value = 10; const pageSize = 10; let currentPage = ref(1); const handleCurrentChange = (val) => { currentPage.value = val; }; const getTagType2 =(status) => { switch (status) { case 'completed': return 'success'; case 'in-progress': return 'info'; case 'warning': return 'warning'; case 'danger': return 'danger'; default: return ''; } } const getTagType =(status) => { return status === 1 ? 'success' : 'danger'; // 根据状态值决定标签类型,这里假设状态为1时为成功(绿色),否则为失败(红色) } const toggleStatus = (row) => { // 切换料架状态的逻辑 row.shelf_status = 1 - row.shelf_status; // Toggle between 0 and 1 // 此处可以添加保存状态的逻辑,比如调用 API 更新数据 }; 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 handleDelete = (row) => { // 使用 Element UI 的 MessageBox.confirm 方法进行二次确认 ElMessageBox.confirm('确定要执行删除操作吗?', '确认删除', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }).then(() => { // 点击确认按钮的回调,执行出库操作 console.log('执行删除操作', row); }).catch(() => { // 点击取消按钮的回调,不执行任何操作 console.log('取消删除操作'); }); import { ref, onMounted, onBeforeUnmount } from "vue"; // 导入 Vue 3 的模块 //import * as echarts from 'echarts'; import { ElMessage, ElMessageBox } from "element-plus"; // import {tableData} from '@/stores/tableData.js'; import { WebSocketHost, host } from "@/utils/constants"; import { initializeWebSocket, closeWebSocket } from "@/utils/WebSocketService"; import { updateRawUsage, deleteRawUsage, inStorage, outStorage, taskUpdate, } from "@/utils/api"; const loading = ref(false); const Hidden = ref(false); const tableData = ref([]); const totalItems = ref(0); totalItems.value = 10; const pageSize = 10; let currentPage = ref(1); const handleCurrentChange = (val) => { currentPage.value = val; }; const handleCheckout = (row) => { // 使用 Element UI 的 MessageBox.confirm 方法进行二次确认 ElMessageBox.confirm('确定要执行出库操作吗?', '确认出库', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }).then(() => { // 点击确认按钮的回调,执行出库操作 console.log('执行出库操作', row); }).catch(() => { // 点击取消按钮的回调,不执行任何操作 console.log('取消出库操作'); }); const formatTaskType = (row, column) => { if (row.taskType === "从仓位到吊装位") { return `从仓位${row.shelfRack}到吊装位${row.loadRack}`; } else if (row.taskType === "从仓位到上片位") { return `从仓位${row.shelfRack}到上片位${row.loadRack}`; } else if (row.taskType === "从上片位到仓位") { return `从上片位${row.loadRack}到仓位${row.shelfRack}`; } else if (row.taskType === "从吊装位到仓位") { return `从吊装位${row.loadRack}到仓位${row.shelfRack}`; } }; const handleInbound = () => { // 打开入库对话框 dialogVisible.value = true; }; const storage = () => { // 打开入库对话框 Hidden.value = true; }; const handleCloseDialog = () => { // 关闭对话框时重置表单数据 formData.value = { shelf: '', color: '', width: '', height: '', thickness: '', quantity: '' const getTagType2 = (status) => { switch (status) { case "completed": return "success"; case "in-progress": return "info"; case "warning": return "warning"; case "danger": return "danger"; default: return ""; } }; const getTagType = (status) => { return status === 1 ? "success" : "danger"; // 根据状态值决定标签类型,这里假设状态为1时为成功(绿色),否则为失败(红色) }; const toggleStatus = (row) => { // 切换料架状态的逻辑 row.enableState = 1 - row.enableState; // Toggle between 0 and 1 // 此处可以添加保存状态的逻辑,比如调用 API 更新数据 }; const socketUrl = `ws://${WebSocketHost}:${host}/api/glassStorage/api/talk/storageTask`; // 定义消息处理函数,更新 receivedData 变量 const handleMessage = (data) => { // 更新 tableData 的数据 tableData.value = data.rack[0]; // 假设 tableData 是响应式对象或变量 tableData.value.forEach((item) => { // 获取 createTime 的时间戳 const createTimeTimestamp = item.createTime; // 创建日期对象 const date = new Date(createTimeTimestamp); // 格式化日期时间为本地格式 const formattedDateTime = date.toLocaleString(); // 替换原来的 createTime 字段为格式化后的日期时间字符串 item.createTime = formattedDateTime; }); tasktableData.value = data.tasks[0]; // 假设 tasktableData 是响应式对象或变量 tasktableData.value.forEach((item) => { // 获取 createTime 的时间戳 const createTimeTimestamp = item.startTime; // 创建日期对象 const date = new Date(createTimeTimestamp); // 格式化日期时间为本地格式 const formattedDateTime = date.toLocaleString(); // 替换原来的 createTime 字段为格式化后的日期时间字符串 item.startTime = formattedDateTime; }); }; onMounted(() => { initializeWebSocket(socketUrl, handleMessage); }); onBeforeUnmount(() => { console.log("关闭了"); closeWebSocket(); }); const tasktableData = ref([]); const dialogVisible = ref(false); const formData = ref({ number: "", color: "", rawWidth: "", rawHeight: "", rawThickness: "", pieces: "", loadRack: 1, }); const formData2 = ref({ dzw: "", }); const handleDelete = (row) => { // 使用 Element UI 的 MessageBox.confirm 方法进行二次确认 ElMessageBox.confirm("确定要执行删除操作吗?", "确认删除", { confirmButtonText: "确认", cancelButtonText: "取消", type: "warning", }) .then(() => { // 点击确认按钮的回调,执行出库操作 const intNumber = { id: parseInt(row.number), }; dialogVisible.value = false; }; const handleConfirmInbound = () => { // 处理确认入库逻辑,可以在这里提交表单或者执行其他操作 console.log('Confirm Inbound:', formData.value); // 关闭对话框 dialogVisible.value = false; }; const dialogVisible3 = ref(false); const colors = ref([ { '0_glass_id': 'Red' }, { '0_glass_id': 'Green' }, { '0_glass_id': 'Blue' } // Add more colors as needed ]); const formData3 = ref({ selectedColor: '', wid: '', heig: '', thinkness: '', num: '' deleteRawUsage(intNumber); console.log("执行删除操作"); }) .catch(() => { // 点击取消按钮的回调,不执行任何操作 console.log("取消删除操作"); }); const addglass = () => { // 打开入库对话框 dialogVisible3.value = true; }; const handleCommand = (command) => { formData.value.selectedColor = command; }; const clearInput = (field) => { formData.value[field] = ''; }; const submitForm = () => { console.log('提交数据:', formData.value); dialogVisible3.value = false; // Add your submit logic here }; const editdialogVisible = ref(false); const editForm = ref({ quantity: '', batchnumber: '', length:'', height:'', thickness:'' }); const editFormRef = ref(null); let currentRow = ref(null); // 处理行点击事件 const edithandleRowClick = (row) => { currentRow.value = row; console.log(row) editForm.value.quantity = row.quantity.toString(); editForm.value.batchnumber = row.batchnumber; editForm.value.length = row.length; editForm.value.height = row.height; editForm.value.thickness = row.thickness; editdialogVisible.value = true; console.log(editForm.value) }; // 添加保存编辑内容 const editsaveEdit = () => { if (!currentRow.value) return; // 更新当前行数据 currentRow.value.quantity = parseInt(editForm.value.quantity); currentRow.value.batchnumber = editForm.value.batchnumber; // 关闭对话框 editdialogVisible.value = false; }; // 对话框关闭时重置编辑表单和当前行数据 const edithandleDialogClose = () => { editForm.value.quantity = ''; editForm.value.batchnumber = ''; editForm.value.width = ''; editForm.value.height = ''; editForm.value.thickness = ''; currentRow.value = null; }; const handleRestart = (row) => { // 使用 Element UI 的 MessageBox.confirm 方法进行二次确认 ElMessageBox.confirm('确定要执行重新开始操作吗?', '确认重新开始', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }).then(() => { // 点击确认按钮的回调 console.log('执行重新开始操作', row); }).catch(() => { // 点击取消按钮的回调,不执行任何操作 console.log('取消重新开始操作'); }); }; const handleCheckout = (row) => { // 使用 Element UI 的 MessageBox.confirm 方法进行二次确认 ElMessageBox.confirm("确定要执行出库操作吗?", "确认出库", { confirmButtonText: "确认", cancelButtonText: "取消", type: "warning", }) .then(() => { // 点击确认按钮的回调,执行出库操作 const raw={ number:parseInt(row.number), loadRack:2 } outStorage(raw) console.log("执行出库操作", row); }) .catch(() => { // 点击取消按钮的回调,不执行任何操作 console.log("取消出库操作"); }); }; const handleInbound = () => { // 打开入库对话框 dialogVisible.value = true; }; const storage = () => { // 打开入库对话框 Hidden.value = true; }; const handleCloseDialog = () => { // 关闭对话框时重置表单数据 formData.value = { number: "", color: "", rawWidth: "", rawHeight: "", rawThickness: "", pieces: "", }; dialogVisible.value = false; }; const handleConfirmInbound = () => { inStorage(formData.value); // 处理确认入库逻辑,可以在这里提交表单或者执行其他操作 console.log("Confirm Inbound:", formData.value); // 关闭对话框 dialogVisible.value = false; }; const dialogVisible3 = ref(false); const colors = ref([ { "0_glass_id": "Red" }, { "0_glass_id": "Green" }, { "0_glass_id": "Blue" }, // Add more colors as needed ]); const formData3 = ref({ selectedColor: "", wid: "", heig: "", thinkness: "", num: "", }); const addglass = () => { // 打开入库对话框 dialogVisible3.value = true; }; const handleCommand = (command) => { formData.value.selectedColor = command; }; const clearInput = (field) => { formData.value[field] = ""; }; const submitForm = () => { console.log("提交数据:", formData.value); dialogVisible3.value = false; // Add your submit logic here }; const editdialogVisible = ref(false); const editForm = ref({ id: "", pieces: "", batchId: "", rawWidth: "", rawHeight: "", rawThickness: "", }); const editFormRef = ref(null); let currentRow = ref(null); // 处理行点击事件 const edithandleRowClick = (row) => { currentRow.value = row; console.log(row); editForm.value.pieces = row.pieces.toString(); editForm.value.batchId = row.batchId; editForm.value.rawWidth = row.rawWidth; editForm.value.rawHeight = row.rawHeight; editForm.value.rawThickness = row.rawThickness; editForm.value.id = row.number; editdialogVisible.value = true; console.log(editForm.value); }; // 添加保存编辑内容 const editsaveEdit = () => { if (!currentRow.value) return; // 更新当前行数据 currentRow.value.pieces = editForm.value.pieces; currentRow.value.batchId = editForm.value.batchId; currentRow.value.rawWidth = editForm.value.rawWidth; currentRow.value.rawHeight = editForm.value.rawHeight; currentRow.value.rawThickness = editForm.value.rawThickness; // 调用更新函数,并处理其返回的 Promise updateRawUsage(editForm.value); // 关闭对话框 editdialogVisible.value = false; }; // 对话框关闭时重置编辑表单和当前行数据 const edithandleDialogClose = () => { editForm.value.pieces = ""; editForm.value.batchId = ""; editForm.value.rawWidth = ""; editForm.value.rawHeight = ""; editForm.value.rawThickness = ""; currentRow.value = null; }; const handleRestart = (row) => { // 使用 Element UI 的 MessageBox.confirm 方法进行二次确认 ElMessageBox.confirm("确定要执行重新开始操作吗?", "确认重新开始", { confirmButtonText: "确认", cancelButtonText: "取消", type: "warning", }) .then(() => { const taskdata={ id:row.id, Type:"重新开始" } taskUpdate(taskdata); console.log("执行重新开始操作", row); }) .catch(() => { // 点击取消按钮的回调,不执行任何操作 console.log("取消重新开始操作"); }); }; const handleDeletetask = (row) => { // 使用 Element UI 的 MessageBox.confirm 方法进行二次确认 ElMessageBox.confirm('确定要执行删除任务操作吗?', '确认删除任务', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }).then(() => { // 点击确认按钮的回调 console.log('执行删除任务操作', row); }).catch(() => { // 点击取消按钮的回调,不执行任何操作 console.log('取消删除任务操作'); }); ElMessageBox.confirm("确定要执行删除任务操作吗?", "确认删除任务", { confirmButtonText: "确认", cancelButtonText: "取消", type: "warning", }) .then(() => { // 点击确认按钮的回调 const taskdata={ id:row.id, Type:"删除" } taskUpdate(taskdata); console.log("执行删除任务操作", row); }) .catch(() => { // 点击取消按钮的回调,不执行任何操作 console.log("取消删除任务操作"); }); }; const handleComplete = (row) => { // 使用 Element UI 的 MessageBox.confirm 方法进行二次确认 ElMessageBox.confirm('确定要执行任务完成操作吗?', '确认任务完成', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }).then(() => { // 点击确认按钮的回调 console.log('执行任务完成操作', row); }).catch(() => { // 点击取消按钮的回调,不执行任何操作 console.log('取消任务完成操作'); }); ElMessageBox.confirm("确定要执行任务完成操作吗?", "确认任务完成", { confirmButtonText: "确认", cancelButtonText: "取消", type: "warning", }) .then(() => { const taskdata={ id:row.id, Type:"完成" } taskUpdate(taskdata); // 点击确认按钮的回调 console.log("执行任务完成操作", row); }) .catch(() => { // 点击取消按钮的回调,不执行任何操作 console.log("取消任务完成操作"); }); }; </script> <style scoped> #dt { display:block; float:left;line-height: 20px;margin-left: 100px;} #dta { display:block; float:left;line-height: 20px;margin-left: 80%;} #dialog-footer{ #dt { display: block; float: left; line-height: 20px; margin-left: 100px; } #dta { display: block; float: left; line-height: 20px; margin-left: 80%; } #dialog-footer { text-align: center; margin-top: -15px; } .img-ypcc{ margin-left: -40px; background-image:url('../../assets/ypcc.png'); .img-ypcc { margin-left: 80px; background-image: url("../../assets/ypcc.png"); background-repeat: no-repeat; background-attachment: local; min-height: 600px; width: 1400px; max-width: 100%; background-size: 1400px 600px; overflow: hidden; position:relative; margin-top: -30px background-attachment: local; min-height: 600px; width: 1400px; max-width: 100%; background-size: 1400px 600px; overflow: hidden; position: relative; margin-top: 0px; } .img-car1{ background-image:url('../../assets/ypccche.png'); .img-car1 { background-image: url("../../assets/ypccche.png"); position: absolute; background-repeat: no-repeat; background-attachment: local; min-height: 400px; width: 200px; max-width: 100%; background-size: 200px 170px; overflow: hidden; position:relative background-attachment: local; min-height: 400px; width: 200px; max-width: 100%; background-size: 200px 170px; overflow: hidden; position: relative; } .custom-dialog { max-height: 90vh; /* 最大高度为视口高度的90% */ overflow-y: auto; /* 对话框内部出现垂直滚动条 */ } </style> </style> hangzhoumesParent/gateway/src/main/resources/application.yml
@@ -6,7 +6,7 @@ cloud: nacos: discovery: server-addr: 127.0.0.1:8848 server-addr: 10.153.19.150:8848 gateway: discovery: locator: hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/taskcache/service/impl/TaskCacheServiceImpl.java
@@ -78,7 +78,7 @@ .eq(EdgStorageCageDetails::getGlassId, GlassInfo::getGlassId) .eq(EdgStorageCageDetails::getEngineerId, GlassInfo::getEngineerId)) .eq(GlassInfo::getGlassId,taskCache1.getGlassId()) .eq(EdgStorageCageDetails::getState,Const.GLASS_STATE_IN) .eq(EdgStorageCageDetails::getState,Const.GLASS_STATE_OUT) ); if(glassInfos.size()==1){ GlassInfo glassInfo=glassInfos.get(0); hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/job/push.java
New file @@ -0,0 +1,54 @@ package com.mes.job; import cn.hutool.json.JSONObject; import com.mes.shelfrack.entity.request.RawUsageAndShelfRack; import com.mes.shelfrack.service.ShelfRackService; import com.mes.storagetask.entity.request.StorageTaskRequest; import com.mes.storagetask.service.StorageTaskService; import com.mes.tools.WebSocketServer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; @Slf4j @Component public class push { @Autowired private StorageTaskService storageTaskService; @Autowired private ShelfRackService shelfRackService; @Scheduled(fixedDelay = 2000) public void sendDownWorkstations() { log.info("发送任务信息和架子信息"); JSONObject jsonObject = new JSONObject(); List<RawUsageAndShelfRack> rack = shelfRackService.selectshelf_rack(); List<StorageTaskRequest> tasks = storageTaskService.Tasks(); jsonObject.append("rack",rack); jsonObject.append("tasks",tasks); log.info(jsonObject.toString()); ArrayList<WebSocketServer> sendwServer = WebSocketServer.sessionMap.get("storageTask"); if (sendwServer != null) { for (WebSocketServer webserver : sendwServer) { if (webserver != null&&webserver.session.isOpen()) { log.info("已发送"); webserver.sendMessage(String.valueOf(jsonObject)); } } } } } hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/loadposition/entity/LoadPosition.java
@@ -1,5 +1,7 @@ package com.mes.loadposition.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -27,8 +29,8 @@ /** * */ @ApiModelProperty(" ") private Long id; @TableId(value = "id", type = IdType.AUTO) private Integer id; /** * 架子编号 @@ -58,7 +60,7 @@ * 仓储任务编号 */ @ApiModelProperty("仓储任务编号") private Long storageTaskId; private Integer storageTaskId; /** * 上片位类型 hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawusage/controller/RawUsageController.java
@@ -1,5 +1,6 @@ package com.mes.rawusage.controller; import com.mes.shelfrack.entity.request.RawUsageAndShelfRack; import com.mes.utils.Result; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; @@ -80,8 +81,8 @@ */ @ApiOperation(value = "修改", notes = "修改数据") @ApiResponses({@ApiResponse(code = 200, message = "操作成功")}) @PutMapping public Result update( @RequestBody RawUsage rawUsage) { @PostMapping("/updaterawUsage") public Result updaterawUsage(@RequestBody RawUsage rawUsage) { boolean result = rawUsageService.updateById(rawUsage); return Result.success(result); } @@ -89,14 +90,30 @@ /** * 删除 * * @param id * @param * @return */ @ApiOperation(value = "删除", notes = "删除数据") @DeleteMapping("/{id}") public Result delete(@PathVariable("id") Long id) { int result = rawUsageService.getBaseMapper().deleteById(id); return Result.success(result); @PostMapping("/id") public Result delete(@RequestBody RawUsage rawUsage) { rawUsageService.updateRawPackageAndStorageRack(rawUsage); return Result.success(); } @ApiOperation(value = "入库", notes = "入库") @PostMapping("/inStorage") public Result inStorage(@RequestBody RawUsageAndShelfRack rawUsage) { rawUsageService.inStorage(rawUsage); return Result.success(); } @ApiOperation(value = "出库", notes = "出库") @PostMapping("/outStorage") public Result outStorage(@RequestBody RawUsageAndShelfRack rawUsage) { rawUsageService.outStorage(rawUsage); return Result.success(); } } hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawusage/entity/RawUsage.java
@@ -2,6 +2,9 @@ import java.io.Serializable; import java.util.Date; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -27,8 +30,8 @@ /** * */ @ApiModelProperty(" ") private Long id; @TableId(value = "id", type = IdType.AUTO) private Integer id; /** * 玻璃类型 hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawusage/service/RawUsageService.java
@@ -2,6 +2,8 @@ import com.mes.rawusage.entity.RawUsage; import com.baomidou.mybatisplus.extension.service.IService; import com.mes.shelfrack.entity.ShelfRack; import com.mes.shelfrack.entity.request.RawUsageAndShelfRack; import java.util.List; /** @@ -12,6 +14,23 @@ List<RawUsage> findList(RawUsage params); /** * @param raw * 修改 */ void updateRawPackageAndStorageRack(RawUsage raw); /** * @param raw * 入库 */ void inStorage(RawUsageAndShelfRack raw); /** * @param raw * 出库 */ void outStorage(RawUsageAndShelfRack raw); } hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawusage/service/impl/RawUsageServiceImpl.java
@@ -6,9 +6,20 @@ import com.mes.rawusage.mapper.RawUsageMapper; import com.mes.rawusage.entity.RawUsage; import com.mes.rawusage.service.RawUsageService; import com.mes.shelfrack.entity.ShelfRack; import com.mes.shelfrack.entity.request.RawUsageAndShelfRack; import com.mes.shelfrack.mapper.ShelfRackMapper; import com.mes.storagetask.entity.StorageTask; import com.mes.storagetask.mapper.StorageTaskMapper; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.lang.reflect.InvocationTargetException; import java.time.LocalDateTime; import java.util.List; import static cn.hutool.core.date.DateTime.now; /** * @author system @@ -19,6 +30,10 @@ @Autowired private RawUsageMapper rawUsageMapper; @Autowired private ShelfRackMapper shelfRackMapper; @Autowired private StorageTaskMapper storageTaskMapper; @Override public List<RawUsage> findList(RawUsage params){ @@ -26,6 +41,98 @@ return rawUsageMapper.selectList(query); } @Override public void updateRawPackageAndStorageRack(RawUsage raw) { // Step 1: 查询raw_package_id LambdaQueryWrapper<ShelfRack> queryWrapper = Wrappers.lambdaQuery(ShelfRack.class) .eq(ShelfRack::getNumber, raw.getId()); ShelfRack shelfRack = shelfRackMapper.selectOne(queryWrapper); if (shelfRack == null) { throw new RuntimeException("未找到与指定货架ID关联的原料包信息"); } // Step 2: 更新raw_package表 RawUsage rawUsage=new RawUsage(); rawUsage.setState("空闲"); rawUsage.setId(shelfRack.getRawPackageId()); rawUsageMapper.updateById(rawUsage); // Step 3: 更新storage_rack表 ShelfRack rack = new ShelfRack(); rack.setState("空闲"); rack.setRawPackageId(null); // 设置RawPackageId为特定的空值,例如0 LambdaQueryWrapper<ShelfRack> queryWrapper2 = Wrappers.lambdaQuery(ShelfRack.class) .eq(ShelfRack::getNumber, raw.getId()); shelfRackMapper.update(rack, queryWrapper2); } @Override public void inStorage(RawUsageAndShelfRack raw) { RawUsage rawPackage = new RawUsage(); BeanUtils.copyProperties(raw,rawPackage); rawPackage.setRawType(raw.getRawThickness() + raw.getColor()); rawPackage.setState("使用中"); rawPackage.setLeftPieces(rawPackage.getPieces()); rawUsageMapper.insert(rawPackage); // 更新架表 ShelfRack rack = new ShelfRack(); rack.setState("使用中"); rack.setRawPackageId(rawPackage.getId()); // 设置RawPackageId为特定的空值,例如0 LambdaQueryWrapper<ShelfRack> queryWrapper = Wrappers.lambdaQuery(ShelfRack.class) .eq(ShelfRack::getNumber, raw.getNumber()); shelfRackMapper.update(rack, queryWrapper); StorageTask storageTask=new StorageTask(); storageTask.setTaskState("等待中"); storageTask.setTaskType("从仓位到吊装位"); storageTask.setLoadRack(raw.getLoadRack()); storageTask.setShelfRack(raw.getNumber()); storageTask.setRouteGroup(1); storageTask.setStartTime(now()); storageTask.setFinishTime(now()); insertTask(storageTask); } @Override public void outStorage(RawUsageAndShelfRack raw) { ShelfRack rack = new ShelfRack(); rack.setState("等待出库"); rack.setRawPackageId(null); // 设置RawPackageId为特定的空值,例如0 LambdaQueryWrapper<ShelfRack> queryWrapper = Wrappers.lambdaQuery(ShelfRack.class) .eq(ShelfRack::getNumber, raw.getNumber()); shelfRackMapper.update(rack, queryWrapper); StorageTask storageTask=new StorageTask(); storageTask.setTaskState("等待中"); storageTask.setTaskType("从仓位到吊装位"); storageTask.setLoadRack(raw.getLoadRack()); storageTask.setShelfRack(raw.getNumber()); storageTask.setRouteGroup(1); storageTask.setStartTime(now()); storageTask.setFinishTime(now()); insertTask(storageTask); } public void insertTask(StorageTask storageTask) { storageTaskMapper.insert(storageTask); } } hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/shelfrack/controller/ShelfRackController.java
@@ -1,5 +1,6 @@ package com.mes.shelfrack.controller; import com.mes.shelfrack.entity.request.RawUsageAndShelfRack; import com.mes.utils.Result; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; @@ -105,7 +106,7 @@ @ApiResponses({@ApiResponse(code = 200, message = "查询成功")}) @GetMapping("/findshelfrack") public Result findshelfrack() { List<Map<String, Object>> result = shelfRackService.selectshelf_rack(); List<RawUsageAndShelfRack> result = shelfRackService.selectshelf_rack(); return Result.success(result); } hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/shelfrack/entity/ShelfRack.java
@@ -2,6 +2,9 @@ import java.io.Serializable; import java.util.Date; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -27,8 +30,8 @@ /** * */ @ApiModelProperty(" ") private Long id; @TableId(value = "id", type = IdType.AUTO) private Integer id; /** * 架子编号 @@ -46,7 +49,7 @@ * 包号编号 */ @ApiModelProperty("包号编号") private Long rawPackageId; private Integer rawPackageId; /** * 修改时间 hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/shelfrack/entity/request/RawUsageAndShelfRack.java
New file @@ -0,0 +1,76 @@ package com.mes.shelfrack.entity.request; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; import java.util.Date; @Data @EqualsAndHashCode(callSuper = false) public class RawUsageAndShelfRack { private static final long serialVersionUID = 1L; @ApiModelProperty("ID") private Integer id; @ApiModelProperty("玻璃类型") private String rawType; @ApiModelProperty("宽度") private Float rawWidth; @ApiModelProperty("高度") private Float rawHeight; @ApiModelProperty("厚度") private Float rawThickness; @ApiModelProperty("颜色") private String color; @ApiModelProperty("总数量") private Integer pieces; @ApiModelProperty("剩余数量") private Integer leftPieces; @ApiModelProperty("物料编码") private String qrcode; @ApiModelProperty("创建时间") private Date createTime; private Date productionTime; @ApiModelProperty("批次号") private String batchId; @ApiModelProperty("架子编号") private String number; @ApiModelProperty("工作状态") private String state; @ApiModelProperty("包号编号") private Integer rawPackageId; private Date modTime; @ApiModelProperty("启用状态") private String enableState; @ApiModelProperty("上片位编号") private String loadRack; } hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/shelfrack/mapper/ShelfRackMapper.java
@@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.github.yulichang.base.MPJBaseMapper; import com.mes.shelfrack.entity.ShelfRack; import com.mes.shelfrack.entity.request.RawUsageAndShelfRack; import java.util.List; import java.util.Map; @@ -18,5 +19,5 @@ public interface ShelfRackMapper extends MPJBaseMapper<ShelfRack> { List<Map<String, Object>> selectshelf_rack(); List<RawUsageAndShelfRack> selectshelf_rack(); } hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/shelfrack/service/ShelfRackService.java
@@ -2,6 +2,7 @@ import com.mes.shelfrack.entity.ShelfRack; import com.baomidou.mybatisplus.extension.service.IService; import com.mes.shelfrack.entity.request.RawUsageAndShelfRack; import java.util.List; import java.util.Map; @@ -14,6 +15,6 @@ List<ShelfRack> findList(ShelfRack params); List<Map<String, Object>> selectshelf_rack(); List<RawUsageAndShelfRack> selectshelf_rack(); } hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/shelfrack/service/impl/ShelfRackServiceImpl.java
@@ -7,6 +7,7 @@ import com.github.yulichang.toolkit.JoinWrappers; import com.mes.common.config.Const; import com.mes.rawusage.entity.RawUsage; import com.mes.shelfrack.entity.request.RawUsageAndShelfRack; import com.mes.shelfrack.mapper.ShelfRackMapper; import com.mes.shelfrack.entity.ShelfRack; import com.mes.shelfrack.service.ShelfRackService; @@ -51,7 +52,7 @@ @Override public List<Map<String, Object>> selectshelf_rack() { public List<RawUsageAndShelfRack> selectshelf_rack() { return baseMapper.selectshelf_rack(); } hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/storagetask/controller/StorageTaskController.java
@@ -1,5 +1,7 @@ package com.mes.storagetask.controller; import com.mes.shelfrack.entity.request.RawUsageAndShelfRack; import com.mes.storagetask.entity.request.StorageTaskRequest; import com.mes.utils.Result; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; @@ -106,9 +108,22 @@ @ApiResponses({@ApiResponse(code = 200, message = "查询成功")}) @GetMapping("/findTasks") public Result findLatestTasks() { List<Map<String, Object>> result = storageTaskService.Tasks(); List<StorageTaskRequest> result = storageTaskService.Tasks(); return Result.success(result); } @ApiOperation(value = "任务操作", notes = "任务操作") @PostMapping("/taskUpdate") public Result taskUpdate(@RequestBody Map<String, Object> storageTaskMap) { StorageTask task = new StorageTask(); task.setType((String) storageTaskMap.get("Type")); // 假设Type是存储在Map中的一个键 task.setId((int) storageTaskMap.get("id")); storageTaskService.taskUpdate(task); return Result.success(); } } hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/storagetask/entity/StorageTask.java
@@ -2,11 +2,15 @@ import java.io.Serializable; import java.util.Date; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.xmlbeans.impl.xb.xsdschema.Public; import org.springframework.stereotype.Component; /** @@ -27,9 +31,8 @@ /** * */ @ApiModelProperty(" ") private Long id; @TableId(value = "id", type = IdType.AUTO) private Integer id; /** * 任务类型 */ @@ -72,6 +75,8 @@ @ApiModelProperty("完成时间") private Date finishTime; @ApiModelProperty("前端任务类型") private String Type; } hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/storagetask/entity/request/StorageTaskRequest.java
New file @@ -0,0 +1,77 @@ package com.mes.storagetask.entity.request; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.util.Date; @Data @EqualsAndHashCode(callSuper = false) public class StorageTaskRequest { private static final long serialVersionUID = 1L; /** * */ @TableId(value = "id", type = IdType.AUTO) private Integer id; /** * 任务类型 */ @ApiModelProperty("任务类型") private String taskType; @ApiModelProperty("前端任务类型") private String Type; /** * 工作状态 */ @ApiModelProperty("工作状态") private String taskState; /** * 仓储架号 */ @ApiModelProperty("仓储架号") private String shelfRack; /** * 上片位编号 */ @ApiModelProperty("上片位编号") private String loadRack; /** * 线路 */ @ApiModelProperty("线路") private Integer routeGroup; /** * 创建时间 */ @ApiModelProperty("创建时间") private Date startTime; /** * 完成时间 */ @ApiModelProperty("完成时间") private Date finishTime; @ApiModelProperty("颜色") private String color; @ApiModelProperty("厚度") private Float rawThickness; } hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/storagetask/mapper/StorageTaskMapper.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.mes.storagetask.entity.StorageTask; import com.mes.storagetask.entity.request.StorageTaskRequest; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; @@ -19,6 +20,6 @@ public interface StorageTaskMapper extends BaseMapper<StorageTask> { List<Map<String, Object>> selectTasks(); List<StorageTaskRequest> selectTasks(); } hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/storagetask/service/StorageTaskService.java
@@ -2,6 +2,7 @@ import com.mes.storagetask.entity.StorageTask; import com.baomidou.mybatisplus.extension.service.IService; import com.mes.storagetask.entity.request.StorageTaskRequest; import java.util.List; import java.util.Map; @@ -17,5 +18,7 @@ Map<String, Optional<StorageTask>> findLatestTasks(); List<Map<String, Object>> Tasks(); List<StorageTaskRequest> Tasks(); void taskUpdate(StorageTask storageTask); } hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/storagetask/service/impl/StorageTaskServiceImpl.java
@@ -3,6 +3,14 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.mes.loadposition.entity.LoadPosition; import com.mes.loadposition.mapper.LoadPositionMapper; import com.mes.rawusage.entity.RawUsage; import com.mes.rawusage.mapper.RawUsageMapper; import com.mes.shelfrack.entity.ShelfRack; import com.mes.shelfrack.entity.request.RawUsageAndShelfRack; import com.mes.shelfrack.mapper.ShelfRackMapper; import com.mes.storagetask.entity.request.StorageTaskRequest; import com.mes.storagetask.mapper.StorageTaskMapper; import com.mes.storagetask.entity.StorageTask; import com.mes.storagetask.service.StorageTaskService; @@ -25,6 +33,13 @@ @Autowired private StorageTaskMapper storageTaskMapper; @Autowired private LoadPositionMapper loadPositionMapper; @Autowired private ShelfRackMapper shelfRackMapper; @Autowired private RawUsageMapper rawUsageMapper; @Override public List<StorageTask> findList(StorageTask params){ @@ -56,12 +71,97 @@ @Override public List<Map<String, Object>> Tasks() { public List<StorageTaskRequest> Tasks() { return baseMapper.selectTasks(); } @Override public void taskUpdate(StorageTask request) { Integer taskId = request.getId(); String taskType = request.getTaskType(); String Type = request.getType(); String taskState = request.getTaskState(); String shelfRack = request.getShelfRack(); String loadRack = request.getLoadRack(); if ("重新开始".equals(Type)) { StorageTask storageTask = new StorageTask(); storageTask.setTaskState("等待中"); LambdaQueryWrapper<StorageTask> queryWrapper = Wrappers.lambdaQuery(StorageTask.class) .eq(StorageTask::getId, request.getId()); storageTaskMapper.update(request,queryWrapper); } else if ("完成".equals(Type)) { StorageTask existingTask = storageTaskMapper.selectById(taskId); if (existingTask != null && "正在工作".equals(existingTask.getTaskState())) { if ("从仓位到上片位".equals(taskType) || "从仓位到吊装位".equals(taskType)) { LoadPosition loadPosition = new LoadPosition(); loadPosition.setState("正在使用"); loadPosition.setStorageTaskId(request.getId()); LambdaQueryWrapper<LoadPosition> queryWrapper = Wrappers.lambdaQuery(LoadPosition.class) .eq(LoadPosition::getNumber, request.getLoadRack()); loadPositionMapper.update(loadPosition, queryWrapper); StorageTask storageTask = new StorageTask(); storageTask.setTaskState("正在使用"); LambdaQueryWrapper<StorageTask> StorageTaskqueryWrapper = Wrappers.lambdaQuery(StorageTask.class) .eq(StorageTask::getId, request.getId()); storageTaskMapper.update(request,StorageTaskqueryWrapper); } else if ("从上片位到仓位".equals(taskType)) { LoadPosition loadPosition = new LoadPosition(); loadPosition.setState("使用中"); loadPosition.setStorageTaskId(null); LambdaQueryWrapper<LoadPosition> queryWrapper = Wrappers.lambdaQuery(LoadPosition.class) .eq(LoadPosition::getNumber, request.getLoadRack()); loadPositionMapper.update(loadPosition, queryWrapper); ShelfRack loshelfRack = new ShelfRack(); LambdaQueryWrapper<RawUsage> RawUsagequeryWrapper = Wrappers.lambdaQuery(RawUsage.class) .eq(RawUsage::getId,loshelfRack.getRawPackageId()); RawUsage RawUsage = rawUsageMapper.selectOne(RawUsagequeryWrapper); if(RawUsage.getLeftPieces()==0){ loshelfRack.setState("空闲"); }else { loshelfRack.setState("使用中"); } LambdaQueryWrapper<ShelfRack> loshelfRackqueryWrapper = Wrappers.lambdaQuery(ShelfRack.class) .eq(ShelfRack::getNumber, request.getLoadRack()); shelfRackMapper.update(loshelfRack, loshelfRackqueryWrapper); } else if ("从吊装位到仓位".equals(taskType)) { LoadPosition loadPosition = new LoadPosition(); loadPosition.setState("空闲"); loadPosition.setStorageTaskId(null); LambdaQueryWrapper<LoadPosition> queryWrapper = Wrappers.lambdaQuery(LoadPosition.class) .eq(LoadPosition::getNumber, request.getLoadRack()); loadPositionMapper.update(loadPosition, queryWrapper); ShelfRack loshelfRack = new ShelfRack(); LambdaQueryWrapper<RawUsage> RawUsagequeryWrapper = Wrappers.lambdaQuery(RawUsage.class) .eq(RawUsage::getId,loshelfRack.getRawPackageId()); RawUsage RawUsage = rawUsageMapper.selectOne(RawUsagequeryWrapper); if(RawUsage.getLeftPieces()==1){ loshelfRack.setEnableState("启用"); }else { loshelfRack.setEnableState(loshelfRack.getEnableState()); } loadPosition.setState("使用中"); LambdaQueryWrapper<ShelfRack> loshelfRackqueryWrapper = Wrappers.lambdaQuery(ShelfRack.class) .eq(ShelfRack::getNumber, request.getLoadRack()); shelfRackMapper.update(loshelfRack, loshelfRackqueryWrapper); } StorageTask storageTask = new StorageTask(); storageTask.setTaskState("已完成"); LambdaQueryWrapper<StorageTask> StorageTaskqueryWrapper = Wrappers.lambdaQuery(StorageTask.class) .eq(StorageTask::getId, request.getId()); storageTaskMapper.update(storageTask, StorageTaskqueryWrapper); } } else if ("删除".equals(Type)) { LambdaQueryWrapper<StorageTask> StorageTaskqueryWrapper = Wrappers.lambdaQuery(StorageTask.class) .eq(StorageTask::getId, request.getId()); storageTaskMapper.delete(StorageTaskqueryWrapper); } } } hangzhoumesParent/moduleService/GlassStorageModule/src/main/resources/mapper/ShelfRackMapper.xml
@@ -2,15 +2,24 @@ <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.mes.shelfrack.mapper.ShelfRackMapper"> <select id="selectshelf_rack" resultType="java.util.Map"> <![CDATA[ SELECT a.number, b.raw_type, b.raw_width, b.raw_height, b.raw_thickness, b.left_pieces, a.mod_time, a.enable_state, b.pieces, datediff(now(), b.create_time) as rukutime, concat(if(ROUND(b.left_pieces / b.pieces * 100, 0) < 20, 20, ROUND(b.left_pieces / b.pieces * 100, 0)), '%') as bfb FROM shelf_rack AS a LEFT JOIN raw_usage AS b ON a.raw_package_id = b.id ]]> </select> <resultMap id="ShelfRackResultMap" type="com.mes.shelfrack.entity.request.RawUsageAndShelfRack"> <result property="number" column="number"/> <result property="rawType" column="raw_type"/> <result property="rawWidth" column="raw_width"/> <result property="rawHeight" column="raw_height"/> <result property="rawThickness" column="raw_thickness"/> <result property="enableState" column="enable_state"/> <result property="pieces" column="pieces"/> <result property="createTime" column="createTime" /> <result property="batchId" column="batch_id"/> </resultMap> <select id="selectshelf_rack" resultMap="ShelfRackResultMap"> <![CDATA[ SELECT a.number, b.raw_type, b.raw_width, b.raw_height, b.raw_thickness, a.enable_state, b.pieces, b.batch_id,DATE_FORMAT(b.create_time, '%Y-%m-%d %H:%i:%s') as createTime FROM shelf_rack AS a LEFT JOIN raw_usage AS b ON a.raw_package_id = b.id ]]> </select> </mapper> hangzhoumesParent/moduleService/GlassStorageModule/src/main/resources/mapper/StorageTaskMapper.xml
@@ -3,8 +3,21 @@ <mapper namespace="com.mes.storagetask.mapper.StorageTaskMapper"> <resultMap id="StorageTaskRequest" type="com.mes.storagetask.entity.request.StorageTaskRequest"> <result property="loadRack" column="load_rack"/> <result property="color" column="color"/> <result property="taskState" column="task_state"/> <result property="shelfRack" column="shelf_rack"/> <result property="startTime" column="start_time"/> <result property="rawThickness" column="raw_thickness"/> <result property="routeGroup" column="route_group"/> <result property="id" column="id" /> <result property="taskType" column="task_type"/> </resultMap> <select id="selectTasks" resultType="java.util.Map"> <select id="selectTasks" resultMap="StorageTaskRequest"> <![CDATA[ SELECT d.*, g.raw_thickness, g.color FROM ( hangzhoumesParent/moduleService/GlassStorageModule/src/test/java/mes/GlassStorageModuleApplicationTest.java
@@ -1,6 +1,9 @@ package mes; import com.mes.GlassStorageApplication; import com.mes.rawusage.entity.RawUsage; import com.mes.rawusage.service.RawUsageService; import com.mes.shelfrack.entity.ShelfRack; import com.mes.shelfrack.service.ShelfRackService; import com.mes.storagetask.entity.StorageTask; import com.mes.storagetask.service.StorageTaskService; @@ -30,6 +33,8 @@ private StorageTaskService storageTaskService; @Autowired private ShelfRackService shelfRackService; @Autowired private RawUsageService rawUsageService; @Test @@ -57,6 +62,13 @@ @Test public void updateRawPackageAndStorageRack() { RawUsage raw=new RawUsage(); raw.setId(null); rawUsageService.updateRawPackageAndStorageRack(raw); } hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/controller/DownWorkstationController.java
@@ -77,17 +77,9 @@ // 调用 DownWorkstationService 中的方法清除指定工位ID的信息 int workstationId = (int) requestData.get("workstationId"); int totalWorkstations = downWorkstationService.getTotalQuantity(workstationId); int downWorkstations = downWorkstationService.getRacksNumber(workstationId); if (downWorkstations == totalWorkstations) { downWorkstationService.clearFlowCardId(workstationId); return Result.build(200, "清除工位信息成功", 1); } else { // 如果总数量和落架数量不一致,返回错误响应 return Result.build(500, "清除工位信息失败", 1); } // 构建响应数据