package com.mes.job; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.mes.downglassinfo.entity.DownGlassInfo; import com.mes.downglassinfo.entity.DownGlassTask; import com.mes.downglassinfo.service.DownGlassInfoService; import com.mes.downglassinfo.service.DownGlassTaskService; import com.mes.downstorage.entity.DownStorageCageDetails; import com.mes.downstorage.service.DownStorageCageDetailsService; import com.mes.downstorage.service.DownStorageCageService; import com.mes.downworkstation.entity.DownWorkstation; import com.mes.downworkstation.service.DownWorkstationService; import com.mes.downworkstation.service.DownWorkstationTaskService; import com.mes.glassinfo.entity.GlassInfo; import com.mes.glassinfo.service.GlassInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.List; /** * @Author : zhoush * @Date: 2024/5/8 8:17 * @Description: */ @Component @Slf4j public class DownCacheGlassTask { @Autowired DownGlassTaskService downGlassTaskService; @Autowired GlassInfoService glassInfoService; @Autowired DownStorageCageDetailsService downStorageCageDetailsService; @Autowired DownStorageCageService downStorageCageService; @Autowired DownWorkstationService downWorkstationService; @Autowired DownGlassInfoService downGlassInfoService; @Autowired private DownWorkstationTaskService downWorkstationTaskService; // @Value("${mes.threshold}") private int threshold; // @Scheduled(fixedDelay = 1000) public void plcdownGlassTask() { // PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject; // String taskRequestTypeValue = plcParameterObject.getPlcParameter("A06_request_word").getValue(); // String glassIdeValue = plcParameterObject.getPlcParameter("A05_scanning_ID").getValue(); // String confirmationWrodValue = plcParameterObject.getPlcParameter("MES_confirmation_word").getValue(); // String outGlassstate = plcParameterObject.getPlcParameter("A09_glass_status").getValue(); // String confirmationWrodAddress = plcParameterObject.getPlcParameter("MES_confirmation_word").getAddress(); // String G06RobotTaskRequestWord = plcParameterObject.getPlcParameter("G06RobotTaskRequestWord").getAddress(); String taskRequestTypeValue ="0"; String glassIdeValue ="NG24041101C002-2-6-1-6"; String confirmationWrodValue ="1"; String outGlassstate="1"; String confirmationWrodAddress="1"; String G11RobotTaskRequestWord ="0"; String G06RobotTaskRequestWord ="0"; String G13RobotTaskRequestWord ="0"; log.info("1、获取到的请求字为:{},获取到的扫描ID为:{},获取到的确认字为:{},获取到的出片状态为:{}", taskRequestTypeValue, glassIdeValue, confirmationWrodValue, outGlassstate); // if ("0".equals(taskRequestTypeValue)) { // if ("0".equals(confirmationWrodValue)) { // log.info("2、获取到的请求字为0,且确认字为0,不执行任务"); // return; // } // log.info("2、获取到的请求字为0,将确认字改为0"); // S7object.getinstance().plccontrol.WriteWord(confirmationWrodAddress, (short) 0); // return; // } // if (!"0".equals(confirmationWrodValue)) { // log.info("2、获取到的请求字不为0,将确认字改为0"); // S7object.getinstance().plccontrol.WriteWord(confirmationWrodAddress, (short) 0); // return; // } if ("1".equals(taskRequestTypeValue)) { log.info("3、进片请求,且确认字为0,执行进片任务"); inTo(glassIdeValue, confirmationWrodAddress); } else if ("2".equals(taskRequestTypeValue)) { log.info("3、出片请求,且确认字为0,执行进片任务"); outTo( confirmationWrodAddress); } else if ("3".equals(taskRequestTypeValue)) { log.info("3、进片和出片都空闲,执行出片任务"); if (outTo(confirmationWrodAddress)) { inTo(glassIdeValue, confirmationWrodAddress); } } if (("1".equals(G11RobotTaskRequestWord) || "1".equals(G06RobotTaskRequestWord)) || "1".equals(G13RobotTaskRequestWord)) { log.info("4、有机器人下片请求,执行下片任务"); insertdownglassinfo(); } //自动绑定架子,如果工位表没有绑定架子,默认将笼子中数量最多的流程卡号绑定机器手2的空架子 } /** * 进片任务 * @param glassId * @param confirmationWrodAddress * @param */ private void inTo(String glassId, String confirmationWrodAddress) { log.info("1、按照玻璃id:{}获取玻璃小片信息", glassId); GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper().eq(GlassInfo::getGlassId, glassId)); if (glassInfo == null) { log.info("2、此玻璃编号不存在"); return; } log.info("2、获取到的玻璃信息为{}", glassInfo); if (glassInfo.getGlassId().equals(downStorageCageDetailsService.DirectConnection()) ) { //直通 log.info("3、如果当前玻璃属于版图id和片序的顺序则直通,执行下片任务"); DownWorkstation downWorkstation = downWorkstationService.getOne(new LambdaQueryWrapper().eq(DownWorkstation::getFlowCardId, glassInfo.getFlowCardId())); int WorkstationId=downWorkstation.getWorkstationId(); DownGlassTask downGlassTask = downStorageCageService.createDownGlassTask(glassInfo, "0", String.valueOf(WorkstationId), "3"); downGlassTaskService.insertCacheTask(downGlassTask); }else{ log.info("4、如果不属于版图id和片序的顺序执行进片任务"); //添加进片任务 查找空格 List list = downStorageCageService.selectCacheEmpty(); if(list.size()>0){ DownStorageCageDetails item = list.get(0); log.info("5、查询卧式理片笼里面的空格:{}", list); log.info("6、将玻璃信息插入卧式理片笼,当前玻璃信息:{}", glassInfo); DownStorageCageDetails details = new DownStorageCageDetails(); BeanUtils.copyProperties(glassInfo, details); details.setState(1); details.setGlassId(glassInfo.getGlassId()); details.setSlot(item.getSlot()); details.setDeviceId(item.getDeviceId()); downStorageCageDetailsService.save(details); log.info("7、玻璃信息已存入理片笼详情表,玻璃信息为{}", details); DownGlassTask downGlassTask = downStorageCageService.createDownGlassTask(glassInfo, "0", item.getSlot() + "", "1"); //添加进片任务 log.info("8、生成进片任务信息存入任务表{}", downGlassTask); downGlassTaskService.insertCacheTask(downGlassTask); } } log.info("9、发送确认字完成"); //S7object.getinstance().plccontrol.WriteWord(confirmationWrodAddress, (short) 1); } /** * 出片任务 * * @param confirmationWrodAddress * */ private Boolean outTo( String confirmationWrodAddress) { log.info("单片情况根据传入的料架号 查询符合按照版图id和片序出片,并且优先出满架的小片"); List list = downStorageCageDetailsService.CacheOut1(1,3); List list2 = downStorageCageDetailsService.CacheOut1(4,6); List list3 = downStorageCageDetailsService.CacheOut1(1,6); // 优先 超出尺寸优先人工出片 人工处理 if (!list3.isEmpty()) { DownStorageCageDetails item3 = list3.get(0); if (item3.getHeight() >= 2500 && item3.getWidth() >= 2660) { log.info("人工处理"); String endcell = "7"; DownGlassTask downGlassTask = downStorageCageService.createDownGlassTask(item3, "9", endcell, "2"); downGlassTaskService.insertCacheTask(downGlassTask); // S7object.getinstance().plccontrol.WriteWord(confirmationWrodAddress, (short) 2); return true; } else if (!list2.isEmpty() && !list3.isEmpty()) { log.info("前后端都空闲 优先后端出片并且优先满架"); DownStorageCageDetails item4 = list2.get(0); DownWorkstation downWorkstation = downWorkstationService.getOne(new LambdaQueryWrapper().eq(DownWorkstation::getFlowCardId, item4.getFlowCardId())); String endcell = String.valueOf(downWorkstation.getWorkstationId()); DownGlassTask downGlassTask = downStorageCageService.createDownGlassTask(item4, "9", endcell, "2"); downGlassTaskService.insertCacheTask(downGlassTask); //S7object.getinstance().plccontrol.WriteWord(confirmationWrodAddress, (short) 2); return true; } // 按照版图id和片序符合前端出片 else if (!list.isEmpty()) { log.info("前端出片"); DownStorageCageDetails item = list.get(0); DownWorkstation downWorkstation = downWorkstationService.getOne(new LambdaQueryWrapper().eq(DownWorkstation::getFlowCardId, item.getFlowCardId())); String endcell = String.valueOf(downWorkstation.getWorkstationId()); // 出到 G06 DownGlassTask downGlassTask = downStorageCageService.createDownGlassTask(item, "9", endcell, "2"); downGlassTaskService.insertCacheTask(downGlassTask); // S7object.getinstance().plccontrol.WriteWord(confirmationWrodAddress, (short) 2); return true; // 按照版图id和片序符合后端出片 } else if (!list2.isEmpty()) { log.info("后端出片"); DownStorageCageDetails item2 = list2.get(0); DownWorkstation downWorkstation = downWorkstationService.getOne(new LambdaQueryWrapper().eq(DownWorkstation::getFlowCardId, item2.getFlowCardId())); String endcell = String.valueOf(downWorkstation.getWorkstationId()); // 出到 G11 DownGlassTask downGlassTask = downStorageCageService.createDownGlassTask(item2, "9", endcell, "2"); downGlassTaskService.insertCacheTask(downGlassTask); // S7object.getinstance().plccontrol.WriteWord(confirmationWrodAddress, (short) 2); return true; } } //如果同时前后端都空闲 优先后端出片并且优先满架 // 返回结果 return false; } // public void insertdownglassinfo() { try { List taskdownGlassInf = downGlassTaskService.getUnloadingTaskState(); if (taskdownGlassInf != null && !taskdownGlassInf.isEmpty()) { for (DownGlassTask downGlassInfo : taskdownGlassInf) { // 创建新的 DownGlassInfo 对象并设置相关属性 DownGlassInfo newdownGlassInfo = new DownGlassInfo(); Integer maxSequence = downGlassInfoService.getMaxSequenceByFlowCardId(downGlassInfo.getFlowCardId()); // 初始化顺序字段值 int sequence = maxSequence != null ? maxSequence + 1 : 1; BeanUtils.copyProperties(downGlassInfo, newdownGlassInfo); // 设置顺序字段值 newdownGlassInfo.setSequence(sequence); // 插入数据到下片玻璃信息表 downGlassInfoService.insertDownGlassInfo(newdownGlassInfo); log.info("插入数据到下片玻璃信息表"); DownWorkstation downWorkstation1 = downWorkstationService.selectByFlowCardId(downGlassInfo.getFlowCardId()); downWorkstationService.updateracksnumber(downGlassInfo.getFlowCardId(), downWorkstation1.getRacksnumber() + 1); log.info("更新落架数量"); sequence++; // 递增顺序字段值 } } } catch (Exception e) { // 打印异常信息 e.printStackTrace(); // 或者可以进行其他异常处理,比如记录日志或者返回特定的错误信息 } } }