UI-Project/src/views/Identify/identify.vue
@@ -1,10 +1,10 @@ <template> <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;" v-loading="loading"> <el-scrollbar height="600px"> <el-scrollbar height="600px" > <div id="app" style="margin-top: 20px;"> <div :style="{ width: `${olWidth}px`, height: `${olHeight}px`,position: 'relative' }" > <!-- <div :style="{ width: `${olWidth}px`, height: `${olHeight}px`,position: 'relative',}" > --> <div v-for="(rect, index) in adjustedRects" :key="rect.glass_id" @@ -34,7 +34,7 @@ {{ $t('order.Takeaway') }}</el-button> </el-dialog> </div> </div> <!-- </div> --> </el-scrollbar> </el-card> </template> @@ -64,42 +64,42 @@ currentGlassId.value = glassId; blind.value = true; } onMounted(async () => { try { const response = await request.post('/cacheGlass/taskCache/currentCutTerritory'); // 替换为你的API端点 if (response.code === 200) { // const process_id = response.data[0].process_id const rawRects = response.data; // 设置矩形数据 console.log(response.data); const { olWidth: newolWidth, olHeight: newolHeight, process_id: newprocess_id ,glass_id:newglass_id } = response.data; // 获取尺寸 olWidth.value = newolWidth; // 设置容器宽度 olHeight.value = newolHeight; // 设置容器高度 process_id.value = newprocess_id; glass_id.value = newglass_id; // onMounted(async () => { // try { // const response = await request.post('/cacheGlass/taskCache/currentCutTerritory'); // 替换为你的API端点 // if (response.code === 200) { // // const process_id = response.data[0].process_id // const rawRects = response.data; // 设置矩形数据 // console.log(response.data); // const { olWidth: newolWidth, olHeight: newolHeight, process_id: newprocess_id ,glass_id:newglass_id } = response.data; // 获取尺寸 // olWidth.value = newolWidth; // 设置容器宽度 // olHeight.value = newolHeight; // 设置容器高度 // process_id.value = newprocess_id; // glass_id.value = newglass_id; adjustedRects.value = rawRects.map(rect => ({ ...rect, // 复制原始对象的其他属性 x_axis: (rect.x_axis*100) * 0.003, // 将x值除以3 y_axis: (rect.y_axis*100) * 0.003, width: (rect.width*100) * 0.002 , widtha: rect.width , heighta: rect.height , height:( rect.height*100) * 0.002 , glass_state: rect.glass_state })); console.log(adjustedRects.value); // adjustedRects.value = rawRects.map(rect => ({ // ...rect, // 复制原始对象的其他属性 // x_axis: (rect.x_axis*100) * 0.003, // 将x值除以3 // y_axis: (rect.y_axis*100) * 0.003, // width: (rect.width*100) * 0.002 , // widtha: rect.width , // heighta: rect.height , // height:( rect.height*100) * 0.002 , // glass_state: rect.glass_state // })); // console.log(adjustedRects.value); // console.log( (rect.width*100) / 300 ); } else { // console.error('Failed to fetch rectangles from API.'); console.error('Failed to fetch rects from API.'); } } catch (error) { // console.error('Error fetching rectangles :', error); console.error('Error fetching rects :', error); } }); // // console.log( (rect.width*100) / 300 ); // } else { // // console.error('Failed to fetch rectangles from API.'); // console.error('Failed to fetch rects from API.'); // } // } catch (error) { // // console.error('Error fetching rectangles :', error); // console.error('Error fetching rects :', error); // } // }); // 破损 const handleDamage = async () => { try { @@ -187,7 +187,8 @@ // adjustedRects.value = data.currentCutTerritory[0] adjustedRects.value = data.currentCutTerritory[0].map(rect => ({ ...rect, x_axis: (rect.x_axis*100) * 0.003, x_axis: 1360 -(rect.x_axis + rect.width) * 0.37, // x_axis: (rect.x_axis*100) * 0.003, y_axis: (rect.y_axis*100) * 0.003, width: (rect.width*100) * 0.002 , widtha: rect.width , UI-Project/src/views/Returns/returns.vue
@@ -28,6 +28,8 @@ const filmsId = ref(''); const patternThickness = ref(''); const number = ref(''); const canSelectProject = ref(true); // 假设开始时可以选择项目 const canStartLoading = ref(false); import { WebSocketHost ,host} from '@/utils/constants' import request from "@/utils/request" const ida = ref(null); @@ -195,13 +197,30 @@ const socketUrl = `ws://${WebSocketHost}:${host}/api/loadGlass/api/talk/loadGlass`; // 定义消息处理函数,更新 receivedData 变量 const handleMessage = (data) => { // 更新 tableData 的数据 if(data.prioritylist!=null){ tableData.splice(0, tableData.length, ...data.prioritylist[0]); } if(data.list!=null){ tableDataa.value = data.list[0] } if(data.engineering ){ if ( Array.isArray(data.engineering) && data.engineering.length !== 0) { canSelectProject.value = false; canStartLoading.value = true; }else{ canSelectProject.value = true; canStartLoading.value = false; } } if (data.InkageStatus) { if(data.InkageStatus!=null){ const status = data.InkageStatus[0]; cuttingMachine.value = status; upstatus.value = status === '1' ? t('basicData.machine') : t('basicData.machineaa'); cuttingMachineStatusColor.value = status === '1' ? 'green' : '#911005'; inKageWord.value = status === '1' ? 0 : 1; } } }; const requestData = { state: 100 @@ -615,47 +634,46 @@ ElMessage.error(t('basicData.glassnull')); } }; const wsUrl = `ws://${WebSocketHost}:${host}/api/loadGlass/api/talk/loadGlass`; const ws = new WebSocket(wsUrl); ws.onopen = () => { console.log('WebSocket连接已打开'); }; // 上片机联机状态 // const wsUrl = `ws://${WebSocketHost}:${host}/api/loadGlass/api/talk/loadGlass`; // const ws = new WebSocket(wsUrl); // ws.onopen = () => { // console.log('WebSocket连接已打开'); // }; // 监听WebSocket的错误事件 ws.onerror = (error) => { console.error('WebSocket发生错误:', error); }; // // 监听WebSocket的错误事件 // ws.onerror = (error) => { // console.error('WebSocket发生错误:', error); // }; // 监听WebSocket的关闭事件 ws.onclose = (event) => { if (event.wasClean) { console.log('WebSocket连接已正常关闭'); } else { console.error('WebSocket连接异常关闭'); } }; // 监听WebSocket的消息事件 ws.onmessage = (event) => { try { const data = JSON.parse(event.data.replace('<END>', '')); // 解析消息为JSON if (data && Array.isArray(data.InkageStatus) && data.InkageStatus.length > 0) { if(data.InkageStatus!=null){ const status = data.InkageStatus[0]; cuttingMachine.value = status; upstatus.value = status === '1' ? t('basicData.machine') : t('basicData.machineaa'); cuttingMachineStatusColor.value = status === '1' ? 'green' : '#911005'; inKageWord.value = status === '1' ? 0 : 1; } } else { // 处理错误情况或无效数据 // console.error('接收到的数据无效', data); } } catch (error) { // console.error('解析WebSocket消息时发生错误', error); } }; // // 监听WebSocket的关闭事件 // ws.onclose = (event) => { // if (event.wasClean) { // console.log('WebSocket连接已正常关闭'); // } else { // console.error('WebSocket连接异常关闭'); // } // }; // // 监听WebSocket的消息事件 // ws.onmessage = (event) => { // try { // const data = JSON.parse(event.data.replace('<END>', '')); // 解析消息为JSON // if (data && Array.isArray(data.InkageStatus) && data.InkageStatus.length > 0) { // if(data.InkageStatus!=null){ // const status = data.InkageStatus[0]; // cuttingMachine.value = status; // upstatus.value = status === '1' ? t('basicData.machine') : t('basicData.machineaa'); // cuttingMachineStatusColor.value = status === '1' ? 'green' : '#911005'; // inKageWord.value = status === '1' ? 0 : 1; // } // } else { // // 处理错误情况或无效数据 // // console.error('接收到的数据无效', data); // } // } catch (error) { // // console.error('解析WebSocket消息时发生错误', error); // } // }; const confirmCutting = async () => { try { const response = await request.post('/loadGlass/LoadGlass/updateMesInkageLoad', @@ -691,8 +709,8 @@ <el-button @click="confirmCutting" style="margin-left: 30px;margin-top: -3px;" >{{ $t('basicData.change') }}</el-button> </div> <el-button style="margin-top: 5px;margin-left: 15px;" id="searchButton" type="primary" @click="dialogFormVisible = true">{{ $t('basicData.selectproject') }}</el-button> <el-button style="margin-top: 5px;margin-left: 20px;" id="searchButton" type="primary" @click="handleBind">{{ $t('basicData.startloading') }}</el-button> <el-button :disabled="!canSelectProject" style="margin-top: 5px;margin-left: 15px;" type="primary" @click="dialogFormVisible = true">{{ $t('basicData.selectproject') }}</el-button> <el-button :style="{ backgroundColor: canStartLoading ? 'green' : 'initial',color: canStartLoading ? 'white' : 'black', }" style="margin-top: 5px;margin-left: 20px;" @click="handleBind">{{ $t('basicData.startloading') }}</el-button> <el-button style="margin-top: 5px;margin-left: 20px;" id="searchButton" type="warning" @click="handleBinda">{{ $t('basicData.stop') }}</el-button> <el-button style="margin-top: 5px;margin-left: 20px;" id="searchButton" type="info" @click="handlezhiban">{{ $t('searchOrder.dutyinformation') }}</el-button> <!-- <el-button style="margin-top: 5px;margin-left: 20px;" id="searchButton" type="danger" @click="handleBindb">停止任务</el-button> --> hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/service/impl/DamageServiceImpl.java
@@ -24,7 +24,7 @@ /** * <p> * 服务实现类 * 服务实现类 * </p> * * @author wu @@ -42,17 +42,17 @@ * 查询报工信息 */ @Override public List<Damage> selectDamage(String startTime, String endTime, int type, int status, String workingProcedure){ LambdaQueryWrapper<Damage> damageSelectWrapper =new LambdaQueryWrapper<>(); damageSelectWrapper.between(Damage::getDamageTime,startTime,endTime); if (type!=0){ damageSelectWrapper.eq(Damage::getType,type); public List<Damage> selectDamage(String startTime, String endTime, int type, int status, String workingProcedure) { LambdaQueryWrapper<Damage> damageSelectWrapper = new LambdaQueryWrapper<>(); damageSelectWrapper.between(Damage::getDamageTime, startTime, endTime); if (type != 0) { damageSelectWrapper.eq(Damage::getType, type); } if (status!=0){ damageSelectWrapper.eq(Damage::getStatus,status); if (status != 0) { damageSelectWrapper.eq(Damage::getStatus, status); } if(!"0".equals(workingProcedure)){ damageSelectWrapper.eq(Damage::getWorkingProcedure,workingProcedure); if (!"0".equals(workingProcedure)) { damageSelectWrapper.eq(Damage::getWorkingProcedure, workingProcedure); } List<Damage> damageList = baseMapper.selectList(damageSelectWrapper); @@ -66,116 +66,23 @@ * 提交报工 */ @Override public void submitDamage(List<Damage> damageList){ Map<String, Map<String, Map<String, Map<String, List<Damage>>>>> resultMap = damageList.stream() .collect(Collectors.groupingBy( Damage::getProcessId, Collectors.groupingBy( Damage::getWorkingProcedure, Collectors.groupingBy( Damage::getDeviceName, Collectors.groupingBy(Damage::getTeamsGroupsName) ) ) )); // 遍历 resultMap for (Map.Entry<String, Map<String, Map<String, Map<String, List<Damage>>>>> processEntry : resultMap.entrySet()) { String processId = processEntry.getKey(); System.out.println("ProcessId: " + processId); public void submitDamage(List<Damage> damageList) { Map<String, List<Damage>> firstMap = damageList.stream().collect(Collectors.groupingBy(e -> e.getProcessId() + ":" + e.getWorkingProcedure() + ":" + e.getDeviceName() + ":" + e.getTeamsGroupsName())); // 获取第二层的 Map,按 workingProcedure 分组的结果 Map<String, Map<String, Map<String, List<Damage>>>> workingProcedureMap = processEntry.getValue(); for (Map.Entry<String, List<Damage>> entry : firstMap.entrySet()) { String key = entry.getKey(); List<Damage> damages = entry.getValue(); // 遍历 workingProcedureMap for (Map.Entry<String, Map<String, Map<String, List<Damage>>>> workingProcedureEntry : workingProcedureMap.entrySet()) { String workingProcedure = workingProcedureEntry.getKey(); System.out.println(" WorkingProcedure: " + workingProcedure); System.out.println("Key: " + key); // 获取第三层的 Map,按 deviceName 分组的结果 Map<String, Map<String, List<Damage>>> deviceNameMap = workingProcedureEntry.getValue(); Map<String, List<Damage>> secondMap = damageList.stream().collect(Collectors.groupingBy(e -> e.getProcessId() + ":" + e.getWorkingProcedure() + ":" + e.getDeviceName() + ":" + e.getTeamsGroupsName())); // 遍历 deviceNameMap for (Map.Entry<String, Map<String, List<Damage>>> deviceNameEntry : deviceNameMap.entrySet()) { String deviceName = deviceNameEntry.getKey(); System.out.println(" DeviceName: " + deviceName); for (Map.Entry<String, List<Damage>> entrys : secondMap.entrySet()) { // 获取第四层的 Map,按 teamsGroupsName 分组的结果 Map<String, List<Damage>> teamsGroupsNameMap = deviceNameEntry.getValue(); // 遍历 teamsGroupsNameMap for (Map.Entry<String, List<Damage>> teamsGroupsNameEntry : teamsGroupsNameMap.entrySet()) { String teamsGroupsName = teamsGroupsNameEntry.getKey(); System.out.println(" TeamsGroupsName: " + teamsGroupsName); // 获取 Damage 列表 List<Damage> damageListForTeamsGroupsName = teamsGroupsNameEntry.getValue(); //报工主表数据 ReportingWork reportingWork=new ReportingWork(); reportingWork.setProcessId(processId); reportingWork.setThisProcess(workingProcedure); reportingWork.setDeviceName(deviceName); reportingWork.setTeamsGroupsName(teamsGroupsName); Map<Integer, Map<Integer, Map<String, List<Damage>>>> groupedByOrderTechBreakage = damageListForTeamsGroupsName.stream() .map(damage -> Optional.ofNullable(damage)) // 使用Optional处理可能为null的元素 .filter(Optional::isPresent) // 过滤掉空的Optional .map(Optional::get) // 获取非空的Damage对象 .collect(Collectors.groupingBy( damage -> Optional.ofNullable(damage.getOrderNumber()).orElse(0), // 使用orElse设置默认值,以处理null值 Collectors.groupingBy( damage -> Optional.ofNullable(damage.getTechnologyNumber()).orElse(0), // 同样处理technologyNumber可能为null的情况 Collectors.groupingBy( damage -> Optional.ofNullable(damage.getBreakageType()).orElse("Unknown"), // 处理breakageType可能为null的情况 Collectors.toList() ) ) )); // 遍历 groupedByOrderTechBreakage for (Map.Entry<Integer, Map<Integer, Map<String, List<Damage>>>> orderEntry : groupedByOrderTechBreakage.entrySet()) { Integer orderNumber = orderEntry.getKey(); System.out.println(" OrderNumber: " + orderNumber); // 获取第二层的 Map,按 technologyNumber 分组的结果 Map<Integer, Map<String, List<Damage>>> technologyNumberMap = orderEntry.getValue(); // 遍历 technologyNumberMap for (Map.Entry<Integer, Map<String, List<Damage>>> technologyEntry : technologyNumberMap.entrySet()) { Integer technologyNumber = technologyEntry.getKey(); System.out.println(" TechnologyNumber: " + technologyNumber); // 获取第三层的 Map,按 breakageType 分组的结果 Map<String, List<Damage>> breakageTypeMap = technologyEntry.getValue(); // 遍历 breakageTypeMap for (Map.Entry<String, List<Damage>> breakageTypeEntry : breakageTypeMap.entrySet()) { String breakageType = breakageTypeEntry.getKey(); System.out.println(" BreakageType: " + breakageType); // 获取 Damage 列表 List<Damage> damageListForBreakageType = breakageTypeEntry.getValue(); int completedQuantity=0; int breakageQuantity=0; // 遍历 Damage 列表 for (Damage damage : damageListForBreakageType) { // 打印或处理每个 Damage 对象 System.out.println(" Damage: " + damage.toString()); if(damage.getType()==1){ completedQuantity+=1; }else if(damage.getType()==2){ breakageQuantity+=1; } } } } } } } } } } @@ -184,26 +91,26 @@ * 添加报工信息 */ @Override public void insertDamage(Damage damage){ LambdaQueryWrapper<GlassInfo> glassInfoSelectWrapper=new LambdaQueryWrapper<>(); glassInfoSelectWrapper.eq(GlassInfo::getGlassId,damage.getGlassId()); GlassInfo glassInfo=glassInfoMapper.selectOne(glassInfoSelectWrapper); public void insertDamage(Damage damage) { LambdaQueryWrapper<GlassInfo> glassInfoSelectWrapper = new LambdaQueryWrapper<>(); glassInfoSelectWrapper.eq(GlassInfo::getGlassId, damage.getGlassId()); GlassInfo glassInfo = glassInfoMapper.selectOne(glassInfoSelectWrapper); BeanUtils.copyProperties(glassInfo, damage); LambdaQueryWrapper<WorkAssignment> workAssignmentSelectWrapper=new LambdaQueryWrapper<>(); LambdaQueryWrapper<WorkAssignment> workAssignmentSelectWrapper = new LambdaQueryWrapper<>(); workAssignmentSelectWrapper .eq(WorkAssignment::getLine,damage.getLine()) .eq(WorkAssignment::getWorkProcesses,damage.getWorkingProcedure()); WorkAssignment workAssignment=workAssignmentMapper.selectOne(workAssignmentSelectWrapper); if(workAssignment!=null){ .eq(WorkAssignment::getLine, damage.getLine()) .eq(WorkAssignment::getWorkProcesses, damage.getWorkingProcedure()); WorkAssignment workAssignment = workAssignmentMapper.selectOne(workAssignmentSelectWrapper); if (workAssignment != null) { damage.setTeamsGroupsName(workAssignment.getTeamsGroupsName()); damage.setDeviceName(workAssignment.getDeviceName()); damage.setProcessId(glassInfo.getFlowCardId()); damage.setOrderNumber(glassInfo.getGlassType()); damage.setTechnologyNumber(glassInfo.getLayer()); damage.setDamageTime(Timestamp.valueOf(LocalDateTime.now())); damage.setType(2); baseMapper.insert(damage); } damage.setProcessId(glassInfo.getFlowCardId()); damage.setOrderNumber(glassInfo.getGlassType()); damage.setTechnologyNumber(glassInfo.getLayer()); damage.setDamageTime(Timestamp.valueOf(LocalDateTime.now())); damage.setType(2); baseMapper.insert(damage); } } hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java
@@ -27,9 +27,11 @@ import com.mes.glassinfo.entity.GlassInfo; import com.mes.glassinfo.mapper.GlassInfoMapper; import com.mes.glassinfo.service.GlassInfoService; import com.mes.job.PlcStorageCageTask; import com.mes.temperingglass.entity.TemperingGlassInfo; import com.mes.temperingglass.mapper.TemperingGlassInfoMapper; import com.mes.temperingglass.service.TemperingGlassInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -49,6 +51,7 @@ * @author zhoush * @since 2024-03-27 */ @Slf4j @Service public class BigStorageCageDetailsServiceImpl extends MPJBaseServiceImpl<BigStorageCageDetailsMapper, BigStorageCageDetails> implements BigStorageCageDetailsService { @@ -68,6 +71,9 @@ @Resource private TemperingGlassInfoService temperingGlassInfoService; @Resource private PlcStorageCageTask plcStorageCageTask; @Resource private DamageService damageService; @@ -277,6 +283,7 @@ } BigStorageCage bigStorageCage = bigStorageCageService.selectJoinOne(BigStorageCage.class, wrapper); if (null != bigStorageCage) { log.info("无钢化版图id或根据当前玻璃片序+1找到目标格子:{},玻璃id:{}", bigStorageCage.getSlot(), glassInfo.getGlassId()); bigStorageDTO = new BigStorageDTO(); bigStorageDTO.setWidth(bigStorageCage.getRemainWidth()); bigStorageDTO.setSlot(bigStorageCage.getSlot()); @@ -291,6 +298,7 @@ "select distinct device_id from big_storage_cage_details where engineer_id = "+glassInfo.getEngineerId()+" and tempering_layout_id = " + glassInfo.getTemperingLayoutId()) .last("limit 1")); if (null != bigStorageCage) { log.info("根据版图id找到笼子内的目标格子:{},玻璃id:{}", bigStorageCage.getSlot(), glassInfo.getGlassId()); bigStorageDTO = new BigStorageDTO(); bigStorageDTO.setWidth(bigStorageCage.getRemainWidth()); bigStorageDTO.setSlot(bigStorageCage.getSlot()); @@ -309,6 +317,7 @@ .orderByAsc(BigStorageCage::getDeviceId) .last("limit 1")); if (null != bigStorageCage) { log.info("版图id首次进笼且不是所有笼子都有版图id,版图版图id:{},格子:{},玻璃id:{}", glassInfo.getTemperingLayoutId() , bigStorageCage.getSlot(), glassInfo.getGlassId()); bigStorageDTO = new BigStorageDTO(); bigStorageDTO.setWidth(bigStorageCage.getRemainWidth()); bigStorageDTO.setSlot(bigStorageCage.getSlot()); @@ -323,6 +332,7 @@ .orderByAsc(BigStorageCage::getDeviceId) .last("limit 1")); Assert.isTrue(null != bigStorageCage, "没有空余的笼子存放玻璃"); log.info("版图id首次进笼且是所有笼子都有版图id,版图版图id:{},格子:{},玻璃id:{}", glassInfo.getTemperingLayoutId() , bigStorageCage.getSlot(), glassInfo.getGlassId()); bigStorageDTO = new BigStorageDTO(); bigStorageDTO.setWidth(bigStorageCage.getRemainWidth()); bigStorageDTO.setSlot(bigStorageCage.getSlot()); hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/job/PlcLoadGlassTask.java
@@ -129,11 +129,8 @@ jsonObject.append("list", upWorkstations); //是否开始工程 Engineering engineering = engineeringService.selectInitiate(1); if (engineering != null){ jsonObject.append("engineering", engineering); }else { jsonObject.append("engineering", "0"); } jsonObject.append("engineering", engineering); ArrayList<WebSocketServer> sendwServer = WebSocketServer.sessionMap.get("loadGlass"); if (sendwServer != null) { for (WebSocketServer webserver : sendwServer) { @@ -156,7 +153,7 @@ JSONObject jsonObject = new JSONObject(); //正在进行的任务 String inkageStatus =plcParameterObject.getPlcParameter("InkageStatus").getValue(); //String inkageStatus ="1"; // String inkageStatus ="1"; jsonObject.append("InkageStatus", inkageStatus); ArrayList<WebSocketServer> sendwServer = WebSocketServer.sessionMap.get("loadGlass"); if (sendwServer != null) {