UI-Project/src/lang/zh.js
@@ -93,9 +93,11 @@ disable:'禁用', start:'启用', deficiencieste:'报缺', updown:'人工下片', operate:'操作', prompt:'提示', information:'是否报缺该条信息?', infor:'是否人工下片该条信息?', yes:'是', cancel:'取消', }, @@ -198,6 +200,12 @@ fin:'是否完成任务?', sureadd:'确认添加', sureadda:'是否确认添加?', zailong:'在笼中', rengongxp:'人工下片', up:'上一页', down:'下一页', now:'当前页显示', tit:'条数据', }, workOrder:{ glassID:'玻璃ID', UI-Project/src/views/Caching/cachingun.vue
@@ -30,6 +30,7 @@ <el-table-column fixed="right" :label="$t('sorter.operate')" align="center" width="200"> <template #default="scope"> <el-button size="mini" type="text" plain @click="open(scope.row)">{{ $t('sorter.deficiencieste') }}</el-button> <el-button size="mini" type="text" plain @click="opena(scope.row)">{{ $t('sorter.updown') }}</el-button> </template> </el-table-column> </el-table> @@ -105,7 +106,7 @@ ); if (confirmResult === 'confirm') { // 用户点击了“是”,现在调用删除接口 var url="/cacheGlass/edgStorageCage/edgStorageCageGlass?edgStorageCageId="+row.id; var url="/unLoadGlass/downStorage/deleteDownStorageCage?edgStorageCageId="+row.id; console.log(url); const response = await request.post(url, { esdId: row.esdId @@ -114,13 +115,41 @@ ElMessage.success(response.message); } else { // 删除失败,您可以处理错误或显示错误信息给用户 ElMessage.error(response.msg); ElMessage.error(response.message); // alert('删除失败:' + deleteResponse.message); } } } catch (error) { // 处理可能出现的错误,比如 ElMessageBox 抛出的异常等 console.error('发生错误:', error); } }; // 人工下片 const opena = async(row) => { try { const confirmResult = await ElMessageBox.confirm( t('sorter.infor'), t('sorter.prompt'), { confirmButtonText: t('sorter.yes'), cancelButtonText: t('sorter.cancel'), type: 'warning', } ); if (confirmResult === 'confirm') { const response = await request.post("/unLoadGlass/downGlassTask/generateOutGlassTask", { glassId: row.glass_id }) if (response.code === 200) { ElMessage.success(response.message); } else { // 删除失败,您可以处理错误或显示错误信息给用户 ElMessage.error(response.message); // alert('删除失败:' + deleteResponse.message); } } } catch (error) { // 处理可能出现的错误,比如 ElMessageBox 抛出的异常等 console.error('发生错误:', error); UI-Project/src/views/GlassStorage/MaterialRackManagement.vue
@@ -6,7 +6,7 @@ <!-- 左侧按钮组 --> <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" >吊装位入库</el-button> </div> @@ -48,7 +48,7 @@ prop="shelf_status" > <template #default="scope"> <el-tag :type="getTagType(scope.row.shelf_status)"> <el-tag :type="getTagType(scope.row.shelf_status)" @click="toggleStatus(scope.row)"> {{ scope.row.shelf_status === 1 ? '启用' : '未启用' }} </el-tag> </template> @@ -104,7 +104,7 @@ <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="danger" size="mini" @click="handleDeletetask(row)">删除任务</el-button> <el-button type="success" size="mini" @click="handleComplete(row)">任务完成</el-button> </template> </el-table-column> @@ -198,7 +198,7 @@ </el-dialog> <el-dialog title="编辑" v-model="editdialogVisible" width="30%" @close="edithandleDialogClose"> <el-form :model="editForm" ref="editForm" label-width="80px"> <el-form :model="editForm" ref="editFormRef" label-width="80px"> <el-form-item label="数量"> <el-input v-model="editForm.quantity"></el-input> </el-form-item> @@ -207,7 +207,7 @@ </el-form-item> </el-form> <div slot="footer" class="dialog-footer"> <div class="dialog-footer"> <el-button @click="editdialogVisible = false">取消</el-button> <el-button type="primary" @click="editsaveEdit">保存</el-button> </div> @@ -224,6 +224,7 @@ <script setup> import { ref, onMounted, onBeforeUnmount } from 'vue'; // 导入 Vue 3 的模块 import * as echarts from 'echarts'; import { ElMessage, ElMessageBox } from 'element-plus' const loading = ref(false); @@ -235,7 +236,7 @@ height: '50', thickness: '10', quantity: '5', entry_time: '2024-06-19', entry_time: '2024-06-19 10:00:00', batchnumber:"444", shelf_status: 1 }, @@ -246,7 +247,7 @@ height: '60', thickness: '12', quantity: '10', entry_time: '2024-06-18', entry_time: '2024-06-19 10:00:00', batchnumber:"444", shelf_status: 0 }, @@ -257,7 +258,7 @@ height: '60', thickness: '12', quantity: '10', entry_time: '2024-06-18', entry_time: '2024-06-19 10:00:00', batchnumber:"444", shelf_status: 1 }, @@ -268,7 +269,7 @@ height: '60', thickness: '12', quantity: '10', entry_time: '2024-06-18', entry_time: '2024-06-19 10:00:00', batchnumber:"444", shelf_status: 1 }, @@ -279,7 +280,7 @@ height: '60', thickness: '12', quantity: '10', entry_time: '2024-06-18', entry_time: '2024-06-19 10:00:00', batchnumber:"444", shelf_status: 1 } @@ -305,6 +306,12 @@ 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([ @@ -342,12 +349,37 @@ }); const handleDelete = (row) => { // 使用 Element UI 的 MessageBox.confirm 方法进行二次确认 ElMessageBox.confirm('确定要执行删除操作吗?', '确认删除', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }).then(() => { // 点击确认按钮的回调,执行出库操作 console.log('执行删除操作', row); }).catch(() => { // 点击取消按钮的回调,不执行任何操作 console.log('取消删除操作'); }); }; const handleCheckout = (row) => { // 处理出库逻辑 console.log('Checkout:', row); // 使用 Element UI 的 MessageBox.confirm 方法进行二次确认 ElMessageBox.confirm('确定要执行出库操作吗?', '确认出库', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }).then(() => { // 点击确认按钮的回调,执行出库操作 console.log('执行出库操作', row); }).catch(() => { // 点击取消按钮的回调,不执行任何操作 console.log('取消出库操作'); }); }; const handleInbound = () => { // 打开入库对话框 @@ -421,12 +453,13 @@ quantity: '', batchnumber: '' }); const editFormRef = ref(null); let currentRow = ref(null); // 处理行点击事件 const edithandleRowClick = (row) => { currentRow.value = row; editForm.value.quantity = row.quantity; editForm.value.quantity = row.quantity.toString(); editForm.value.batchnumber = row.batchnumber; editdialogVisible.value = true; console.log(editForm.value) @@ -452,6 +485,82 @@ }; const handleRestart = (row) => { // 使用 Element UI 的 MessageBox.confirm 方法进行二次确认 ElMessageBox.confirm('确定要执行重新开始操作吗?', '确认重新开始', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }).then(() => { // 点击确认按钮的回调 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('取消删除任务操作'); }); }; const handleComplete = (row) => { // 使用 Element UI 的 MessageBox.confirm 方法进行二次确认 ElMessageBox.confirm('确定要执行任务完成操作吗?', '确认任务完成', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }).then(() => { // 点击确认按钮的回调 console.log('执行任务完成操作', row); }).catch(() => { // 点击取消按钮的回调,不执行任何操作 console.log('取消任务完成操作'); }); }; let chartInstance = null; onMounted(() => { UI-Project/src/views/Slicecage/slicecage.vue
@@ -7,7 +7,7 @@ const router = useRouter() import request from "@/utils/request" import { WebSocketHost ,host} from '@/utils/constants' import { ref, onMounted , onBeforeUnmount, reactive} from "vue"; import { ref, onMounted , onBeforeUnmount, reactive, computed } from "vue"; import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService'; import { ElMessage, ElMessageBox } from 'element-plus' import { tr } from "element-plus/es/locale"; @@ -70,8 +70,93 @@ const cell7=ref(true); const cell8=ref(true); const selectedRow = ref(null); // 存储选中的行数据 const currentPage4 = ref(4) const pageSize4 = ref(100) // 当前页码和每页显示的条数 const currentPage = ref(1); const itemsPerPage = computed(() => { if (currentPage.value === 1) { return 21; } else if (currentPage.value === 2) { return 21; } else if (currentPage.value === 3) { return 21; } else if (currentPage.value === 4) { return 21; } else if (currentPage.value === 5) { return 21; } else if (currentPage.value === 6) { return 21; } else if (currentPage.value === 7) { return 21; } else { return 21; // 默认值,可以根据实际需求修改 } }); // 计算分页后的数据 const paginatedUsers = computed(() => { const startIndex = calculateStartIndex(); const endIndex = startIndex + itemsPerPage.value; return tableData.value.slice(startIndex, endIndex); }); // 计算当前页的起始索引 function calculateStartIndex() { let index = 0; for (let i = 1; i < currentPage.value; i++) { if (i === 1) { index += 21; } else if (i === 2) { index += 21; } else if (i === 3) { index += 21; }else if (i === 4) { index += 21; }else if (i === 5) { index += 21; }else if (i === 6) { index += 21; }else if (i === 7) { index += 21; } else { index += 31; } } return index; } // 上一页和下一页方法 const prevPage = () => { if (currentPage.value > 1) { currentPage.value--; } }; const nextPage = () => { if (currentPage.value < totalPages.value) { currentPage.value++; } }; // 总页数计算 const totalPages = computed(() => { // let total = 0; // for (let i = 1; i <= users.value.length; i++) { // if (i === 1) { // total += 1; // } else if (i === 2) { // total += 2; // } else if (i === 3) { // total += 5; // } else { // total += 10; // } // } return 8; }); const getTableRow = (row,type) =>{ switch (type) { @@ -90,12 +175,9 @@ selectedRow.value = row; // 更新选中的行数据 currentRow.deviceId = row.deviceId; // 直接设置响应式属性 currentRow.slot = row.slot; console.log(row.deviceId); console.log(row.slot); window.localStorage.setItem('deviceId', row.deviceId) window.localStorage.setItem('slot', row.slot) add.value = true; // 打开绑定架子对话框 }; // 搜索 const searchout = async () => { @@ -148,6 +230,7 @@ // 用户点击了“是”,现在调用删除接口 const response = await request.post("/cacheVerticalGlass/bigStorageCageDetails/deleteBigStorageCageDetails",row) if (response.code === 200) { tableData.value = response.data; ElMessage.success(response.message); } else { // 删除失败,您可以处理错误或显示错误信息给用户 @@ -175,6 +258,7 @@ if (confirmResult === 'confirm') { const response = await request.post("/cacheVerticalGlass/bigStorageCageDetails/damageBigStorageCageDetails?status="+0, row) if (response.code === 200) { tableData.value = response.data; ElMessage.success(response.message); } else { ElMessage.error(response.message); @@ -199,6 +283,7 @@ if (confirmResult === 'confirm') { const response = await request.post("/cacheVerticalGlass/bigStorageCageDetails/damageBigStorageCageDetails?status="+1, row) if (response.code === 200) { tableData.value = response.data; ElMessage.success(response.message); } else { ElMessage.error(response.message); @@ -355,8 +440,12 @@ }; const response = await request.post("/cacheVerticalGlass/bigStorageCageDetails/insertBigStorageCageDetails", dataToSend) if (response.code === 200) { tableData.value = response.data; add.value = false; ElMessage.success(response.message); glassId.value = ''; tableDataf.value = ''; } else { ElMessage.error(response.message); } @@ -369,7 +458,6 @@ function handleRowClick(row) { selectedRow.value = row; // 更新选中的行数据 } const socketUrl = `ws://${WebSocketHost}:${host}/api/cacheVerticalGlass/api/talk/slicecage`; // 定义消息处理函数,更新 receivedData 变量 const handleMessage = (data) => { @@ -428,23 +516,23 @@ // 初始化 WebSocket,并传递消息处理函数 onMounted(() => { // fetchFlowCardId(); // fetchTableData(); // 获取数据 initializeWebSocket(socketUrl, handleMessage); }); function getStatusType(enableState: number) { switch (enableState) { case 0: return 'warning'; case 1: case 100: return 'success'; case 102: return 'warning'; } } function getStatusText(enableState: number) { switch (enableState) { case 0: return t('searchOrder.disable'); case 1: return t('searchOrder.enable'); case 100: return t('searchOrder.zailong'); case 102: return t('searchOrder.rengongxp'); } } function getStatusTypea(ishorizontal: number) { @@ -906,7 +994,7 @@ </el-dialog> <el-dialog v-model="dialogFormVisiblea" top="5vh" width="97%" :title="$t('searchOrder.cageinformation')"> <el-table :data="tableData" :data="paginatedUsers" @row-click="handleRowClick" height="500" @expand-change="handleExpandChange" @@ -925,8 +1013,8 @@ :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}" > <!-- <el-table-column prop="menuName" label="二级菜单栏" align="center" min-width="140" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"/> --> <el-table-column prop="glassId" :label="$t('searchOrder.glassID')" align="center" min-width="80"/> <el-table-column prop="sequence" align="center" :label="$t('searchOrder.pieceingrid')" min-width="100" /> <el-table-column prop="glassId" :label="$t('searchOrder.glassID')" align="center" min-width="90"/> <el-table-column prop="sequence" align="center" :label="$t('searchOrder.pieceingrid')" min-width="110" /> <el-table-column prop="flowCardId" align="center" :label="$t('searchOrder.cardnumber')" min-width="120" /> <el-table-column prop="glassType" align="center" :label="$t('searchOrder.typeglass')" min-width="80" /> <el-table-column prop="width" align="center" :label="$t('searchOrder.width')" min-width="80" /> @@ -939,6 +1027,7 @@ :label="$t('searchOrder.startstatus')" min-width="80" prop="state" > <template #default="scope"> <el-tag :type="getStatusType(scope.row.state)"> @@ -952,7 +1041,11 @@ <el-button size="mini" type="text" plain @click="broke(scope.row)">{{ $t('searchOrder.breakage') }}</el-button> <el-button size="mini" type="text" plain @click="brokec(scope.row)">{{ $t('searchOrder.takeout') }}</el-button> <el-button size="mini" type="text" plain @click="opena(scope.row)">{{ $t('searchOrder.delete') }}</el-button> <el-button size="mini" type="text" plain @click="outfil(scope.row)">{{ $t('searchOrder.outfilm') }}</el-button> <el-button size="mini" type="text" :disabled="!((props.row.bigStorageCageDetails[0].state !== 102 && scope.$index == 0 ) || (props.row.bigStorageCageDetails[(scope.$index - 1)<0?0:scope.$index-1].state==102)&&(scope.row.state!=102))" plain @click="outfil(scope.row)"> {{ $t('searchOrder.outfilm') }} </el-button> </template> </el-table-column> </el-table> @@ -985,22 +1078,20 @@ </template> </el-table-column> </el-table> <div id="demo-pagination-block"> <el-pagination style="margin-left: 850px;" v-model:current-page="currentPage4" v-model:page-size="pageSize4" :page-sizes="[100, 200, 300, 400]" :small="small" :disabled="disabled" :background="background" layout="total, sizes, prev, pager, next, jumper" :total="400" @size-change="handleSizeChange" @current-change="handleCurrentChange" /> <div> <div style="margin-top: 20px; text-align: center;"> <!-- 上一页按钮 --> <el-button @click="prevPage" :disabled="currentPage === 1">{{ $t('searchOrder.up') }}</el-button> <!-- 下一页按钮 --> <el-button @click="nextPage" :disabled="currentPage >= totalPages">{{ $t('searchOrder.down') }}</el-button> <!-- 当前页显示的条数 --> <span style="margin-left: 10px;">{{ $t('searchOrder.now') }} {{ itemsPerPage }} {{ $t('searchOrder.tit') }}</span> </div> </div> </el-dialog> <!-- </el-dialog> --> <el-dialog v-model="dialogFormVisibleb" top="5vh" width="85%" :title="$t('searchOrder.productionqueue')"> <!-- <div style="display: flex;"> <p style="margin-top: 3px;">队列状态:</p> hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/controller/DownGlassTaskController.java
@@ -2,6 +2,7 @@ import com.mes.downglassinfo.service.DownGlassInfoService; import com.mes.downstorage.entity.DownStorageCageDetails; import com.mes.utils.Result; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; @@ -28,8 +29,8 @@ @PostMapping("/generateOutGlassTask") @ApiOperation(value = "生成出片任务", notes = "生成出片任务") public Result<Boolean> generateOutGlassTask(@RequestBody String glassId) { return Result.success(downGlassInfoService.generateOutGlassTask(glassId)); public Result<Boolean> generateOutGlassTask(@RequestBody DownStorageCageDetails downStorageCageDetails) { return Result.success(downGlassInfoService.generateOutGlassTask(downStorageCageDetails.getGlassId())); } } hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/service/impl/DownGlassInfoServiceImpl.java
@@ -35,7 +35,7 @@ public Integer getMaxSequenceByFlowCardId(String flowCardId, int layer) { LambdaQueryWrapper<DownGlassInfo> lambdaQueryWrapper = Wrappers.lambdaQuery(); lambdaQueryWrapper.eq(DownGlassInfo::getFlowCardId, flowCardId) .eq(DownGlassInfo::getLayer, flowCardId) .eq(DownGlassInfo::getLayer, layer) .select(DownGlassInfo::getSequence) .orderByDesc(DownGlassInfo::getSequence) .last("LIMIT 1"); hangzhoumesParent/moduleService/UnLoadGlassModule/src/test/java/mes/UnloadGlassModuleApplicationTest.java
@@ -1,6 +1,7 @@ package mes; import com.mes.UnLoadGlassApplication; import com.mes.downglassinfo.service.DownGlassInfoService; import com.mes.downglassinfo.service.DownGlassTaskService; import com.mes.downglassinfo.service.impl.DownGlassInfoServiceImpl; import com.mes.downglassinfo.service.impl.DownGlassTaskServiceImpl; @@ -37,7 +38,7 @@ */ @Slf4j @RunWith(SpringRunner.class) @SpringBootTest(classes = UnLoadGlassApplication.class) @SpringBootTest(classes = UnLoadGlassApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class UnloadGlassModuleApplicationTest { @@ -61,6 +62,8 @@ DownStorageCageService downStorageCageService; @Autowired DownGlassTaskService downGlassTaskService; @Autowired DownGlassInfoService downGlassInfoService; @@ -153,7 +156,7 @@ public void getMaxSequenceByFlowCardId() { log.info("最大序号"); downGlassInfoServiceImpl.getMaxSequenceByFlowCardId("NG2023005"); downGlassInfoServiceImpl.getMaxSequenceByFlowCardId("NG2023005",1); } @Test @@ -182,7 +185,8 @@ public void getUnloadingTaskState() { downGlassTaskService.getUnloadingTaskState(); downGlassInfoService.generateOutGlassTask("NG24031401A01-4-3-1-3"); //downGlassTaskService.getUnloadingTaskState(); } @Test