package com.mes.job; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.github.xingshuangs.iot.protocol.s7.serializer.S7Serializer; import com.kangaroohy.milo.model.ReadWriteEntity; import com.kangaroohy.milo.service.MiloService; import com.mes.common.config.Const; import com.mes.engineering.entity.Engineering; import com.mes.engineering.mapper.EngineeringMapper; import com.mes.opctask.entity.LoadGlassDeviceTask; import com.mes.opctask.service.LoadGlassDeviceTaskService; import com.mes.rawglassdetails.entity.RawGlassStorageDetails; import com.mes.rawglassdetails.service.RawGlassStorageDetailsService; import com.mes.rawglassstation.entity.RawGlassStorageStation; import com.mes.rawglassstation.service.RawGlassStorageStationService; import com.mes.rawglasstask.entity.RawGlassStorageTask; import com.mes.rawglasstask.service.RawGlassStorageTaskService; import com.mes.s7.entity.S7Data; import com.mes.s7.job.S7Job; import com.mes.uppattenusage.entity.UpPattenUsage; import com.mes.uppattenusage.entity.vo.UpPattenUsageVO; import com.mes.uppattenusage.mapper.UpPattenUsageMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; /** * @Author : zhoush * @Date: 2024/10/11 16:13 * @Description: */ @Slf4j @Component public class RawGlassTask { @Autowired private RawGlassStorageDetailsService rawGlassStorageDetailsService; @Autowired private RawGlassStorageTaskService rawGlassStorageTaskService; @Autowired private RawGlassStorageStationService rawGlassStorageStationService; @Resource private EngineeringMapper engineeringMapper; @Resource private UpPattenUsageMapper upPattenUsageMapper; @Resource private LoadGlassDeviceTaskService loadGlassDeviceTaskService; @Autowired(required = false) private MiloService miloService; @Autowired(required = false) S7Serializer s7Serializer; private static final String LOAD_GLASS_DEVICE_ONE_TASK = "load_glass_device_one_task"; private static final String LOAD_GLASS_DEVICE_TWO_TASK = "load_glass_device_two_task"; private static final List LOAD_STATION_01 = Arrays.asList(101, 102); private static final List LOAD_STATION_02 = Arrays.asList(103, 104); private static final List LOAD_STATION_ALL = Arrays.asList(101, 102, 103, 104); private static final Integer LEFTING_01 = 98; private static final Integer LEFTING_02 = 99; private static final Integer LOAD_GLASS_ONE_DEVICE = 5; private static final Integer LOAD_GLASS_TWO_DEVICE = 6; @Scheduled(fixedDelay = 1000) public void rawStorageTask() throws Exception { // S7Data S7DataWL1 = s7Serializer.read(S7Data.class); // String requestWord = S7DataWL1.getRequest().toString(); // String confireWord = S7DataWL1.getConfirmation().toString(); // String reportWord = S7DataWL1.getReportWord().toString(); // String taskWord = S7DataWL1.getTaskWord().toString(); // String requestValue = requestWord; ReadWriteEntity requestWord = miloService.readFromOpcUa("CC.CC.request"); ReadWriteEntity confireWord = miloService.readFromOpcUa("CC.CC.confirmation"); ReadWriteEntity reportWord = miloService.readFromOpcUa("CC.CC.reportWord"); ReadWriteEntity taskWord = miloService.readFromOpcUa("CC.CC.taskWord"); String requestValue = requestWord.getValue() + ""; if ("0".equals(requestValue)) { if ("1".equals(confireWord) && "0".equals(reportWord)) { // if ("1".equals(confireWord.getValue() + "") && "0".equals(reportWord.getValue() + "")) { S7Data s7Data = new S7Data(); s7Data.setConfirmation((short) 0); s7Serializer.write(s7Data); // List list = new ArrayList<>(); // list.add(generateReadWriteEntity("CC.CC.confirmation", 0)); // miloService.writeToOpcWord(list); } if ("1".equals(taskWord)) { // if ("1".equals(taskWord.getValue() + "")) { S7Data s7Data = new S7Data(); s7Data.setTaskWord((short) 0); s7Data.setStartSlot((short) 0); s7Data.setEndSlot((short) 0); s7Serializer.write(s7Data); // List list = new ArrayList<>(); // list.add(generateReadWriteEntity("CC.CC.taskWord", 0)); // list.add(generateReadWriteEntity("CC.CC.startSlot", 0)); // list.add(generateReadWriteEntity("CC.CC.endSlot", 0)); // miloService.writeToOpcWord(list); } return; } if (!"1".equals(requestValue)) { log.info("无请求"); return; } //是否有正在执行的任务 boolean flag = isHasRunningTask(); if (flag) { log.info("有未完成的任务,结束"); return; } //todo:优先进上片机位 flag = rawGlassDispatchTask(); if (flag) { log.info("执行调度任务,结束"); return; } flag = outboundTask(); if (flag) { log.info("执行出库任务,结束"); return; } flag = warehouseTask(); if (flag) { log.info("执行入库任务"); return; } flag = shelfResetTask(); if (flag) { log.info("执行复位任务"); return; } log.info("无任务执行,结束"); } @Scheduled(fixedDelay = 1000) public void rawStorageInCar() throws Exception { // S7Data S7DataWL1 = s7Serializer.read(S7Data.class); // String value = S7DataWL1.getInCar().toString(); ReadWriteEntity entity = miloService.readFromOpcUa("CC.CC.inCar"); String value = entity.getValue() + ""; if (!"1".equals(value)) { log.info("大车上没有架子"); return; } //查询任务 RawGlassStorageDetails one = rawGlassStorageDetailsService.getOne(new LambdaQueryWrapper() .eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING)); if (one == null) { log.info("没有正在执行的任务"); return; } rawGlassStorageDetailsService.update(new LambdaUpdateWrapper().eq(RawGlassStorageDetails::getId, one.getId()) .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_CAR)); } @Scheduled(fixedDelay = 1000) public void rawStorageFinish() throws Exception { // S7Data S7DataWL1 = s7Serializer.read(S7Data.class); // String value = S7DataWL1.getReportWord().toString(); ReadWriteEntity entity = miloService.readFromOpcUa("CC.CC.reportWord"); String value = entity.getValue() + ""; if ("0".equals(value)) { log.info("当前任务未汇报,结束本次任务"); return; } RawGlassStorageDetails details = rawGlassStorageDetailsService.getOne(new LambdaUpdateWrapper() .eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_CAR)); if (null == details) { log.info("无执行中的任务"); return; } RawGlassStorageTask task = rawGlassStorageTaskService.getOne(new LambdaQueryWrapper() .in(RawGlassStorageTask::getTaskState, Const.RAW_GLASS_TASK_NEW)); RawGlassStorageDetails targetDetails = rawGlassStorageDetailsService.generateDetails(details, task.getEndSlot()); int deviceId = details.getDeviceId(); Integer taskType = task.getTaskType(); if ("1".equals(value)) { log.info("将详情表的状态改为已出库"); rawGlassStorageDetailsService.update(new LambdaUpdateWrapper() .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_OUT) .eq(RawGlassStorageDetails::getSlot, task.getStartSlot()).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_CAR)); log.info("任务状态已更改为:已完成"); rawGlassStorageTaskService.update(new LambdaUpdateWrapper() .eq(RawGlassStorageTask::getTaskState, Const.RAW_GLASS_TASK_NEW) .set(RawGlassStorageTask::getTaskState, Const.RAW_GLASS_TASK_SUCCESS)); switch (taskType) { case 1: case 3: log.info("1、入库,3、调度任务。{}", taskType); if (targetDetails.getRemainQuantity() > 0) { rawGlassStorageDetailsService.save(targetDetails); } break; case 2: case 4: log.info("2、出片,4、入库请求。{}", taskType); targetDetails = new RawGlassStorageDetails(); targetDetails.setSlot(task.getEndSlot()); targetDetails.setDeviceId(deviceId); targetDetails.setShelf(task.getStartSlot()); targetDetails.setState(Const.RAW_GLASS_STATE_IN); rawGlassStorageDetailsService.save(targetDetails); break; default: break; } } else { if (taskType.equals(Const.RAW_GLASS_TASK_TYPE_IN_REQUEST)) { rawGlassStorageDetailsService.update(new LambdaUpdateWrapper() .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_OUT) .eq(RawGlassStorageDetails::getSlot, task.getStartSlot()) .in(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING, Const.RAW_GLASS_STATE_CAR)); } else { rawGlassStorageDetailsService.update(new LambdaUpdateWrapper() .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN) .eq(RawGlassStorageDetails::getSlot, task.getStartSlot()) .in(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING, Const.RAW_GLASS_STATE_CAR)); } rawGlassStorageTaskService.update(new LambdaUpdateWrapper() .eq(RawGlassStorageTask::getTaskState, Const.RAW_GLASS_TASK_NEW) .set(RawGlassStorageTask::getTaskState, Const.RAW_GLASS_TASK_FAILURE)); } S7Data s7Data = new S7Data(); s7Data.setConfirmation((short) 1); s7Serializer.write(s7Data); // List list = new ArrayList<>(); // list.add(generateReadWriteEntity("CC.CC.confirmation", 1)); // miloService.writeToOpcWord(list); } private boolean isHasRunningTask() { RawGlassStorageTask task = rawGlassStorageTaskService.getOne(new LambdaQueryWrapper() .in(RawGlassStorageTask::getTaskState, Const.RAW_GLASS_TASK_NEW)); return task == null ? Boolean.FALSE : Boolean.TRUE; } /** * 原片调度:1、查询工程原片表,按照顺序将原片放入上片1号位,后续原片放上片2号位,出现尺寸替换,判断原上片位是否有玻璃,有 先出后进,无 直接进片 */ public boolean rawGlassDispatchTask() throws Exception { //查询当前系统正在执行的订单 List engineeringList = engineeringMapper.selectList(new LambdaQueryWrapper() .eq(Engineering::getState, Const.ENGINEERING_RUNNING).last("order by id")); if (CollectionUtils.isEmpty(engineeringList)) { log.info("没有正在执行的工程"); return false; } for (Engineering engineering : engineeringList) { boolean flag = rawGlassDispatchByEngineering(engineering.getStationCell(), engineering.getEngineerId()); if (flag) { return flag; } } return Boolean.FALSE; } /** * 出库任务:1、点出库,立马生成出片任务 2、点出库修改工位详情内的状态为待出库,定时任务扫描生成出库任务 */ public boolean outboundTask() throws Exception { List rawGlassList = rawGlassStorageDetailsService.list(new LambdaQueryWrapper() .eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_WAIT_OUT) .inSql(RawGlassStorageDetails::getSlot, "select slot from raw_glass_storage_station where enable_state = 1")); if (CollectionUtil.isEmpty(rawGlassList)) { log.info("系统没有需要出库的原片信息"); return Boolean.FALSE; } //获取工位上是否有架子, List emptyLeftingList = rawGlassStorageDetailsService.list(new LambdaQueryWrapper() .in(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN_ALL) .in(RawGlassStorageDetails::getSlot, "select slot from raw_glass_storage_station where enable_state = 1 and device_id = 4")); if (CollectionUtil.isNotEmpty(emptyLeftingList) && emptyLeftingList.size() > 1) { log.info("吊装位当前都有架子,结束出片任务"); return Boolean.FALSE; } //获取需要落架的 List leftingList = emptyLeftingList.stream().map(RawGlassStorageDetails::getSlot).collect(Collectors.toList()); int lefting = CollectionUtil.isEmpty(leftingList) ? LEFTING_01 : leftingList.get(0).equals(LEFTING_01) ? LEFTING_02 : LEFTING_01; Integer startSlot = rawGlassList.get(0).getSlot(); //生成出库任务 rawGlassStorageDetailsService.generateTask(startSlot, lefting, startSlot, rawGlassList.get(0).getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_OUT); // List list = new ArrayList<>(); // list.add(generateReadWriteEntity("CC.CC.taskWord", 1)); // list.add(generateReadWriteEntity("CC.CC.taskSending", 1)); // list.add(generateReadWriteEntity("CC.CC.startSlot", startSlot)); // list.add(generateReadWriteEntity("CC.CC.endSlot", lefting)); // miloService.writeToOpcWord(list); //修改出片任务状态 rawGlassStorageDetailsService.update(new LambdaUpdateWrapper() .eq(RawGlassStorageDetails::getSlot, rawGlassList.get(0).getSlot()) .eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_WAIT_OUT) .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING)); return Boolean.TRUE; } /** * 复位任务:1、点复位,立马生成复位任务 2、点出库修改工位详情内的状态为架子复位,定时任务扫描生成复位任务 */ public boolean shelfResetTask() throws Exception { List rawGlassList = rawGlassStorageDetailsService.list(new LambdaQueryWrapper() .eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RESET) .inSql(RawGlassStorageDetails::getSlot, "select slot from raw_glass_storage_station where enable_state = 1")); if (CollectionUtil.isEmpty(rawGlassList)) { log.info("系统没有需要复位的原片信息"); return Boolean.FALSE; } //生成复位任务 // rawGlassStorageDetailsService.generatask(rawGlassList.get(0).getSlot(), rawGlassList.get(0).getShelf(), rawGlassList.get(0).getShelf(), rawGlassList.get(0).getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH); // List list = new ArrayList<>(); // list.add(generateReadWriteEntity("CC.CC.taskWord", 1)); // list.add(generateReadWriteEntity("CC.CC.taskSending", 1)); // list.add(generateReadWriteEntity("CC.CC.startSlot", startSlot)); // list.add(generateReadWriteEntity("CC.CC.endSlot", lefting)); // miloService.writeToOpcWord(list); //修改复位任务状态 rawGlassStorageDetailsService.update(new LambdaUpdateWrapper() .eq(RawGlassStorageDetails::getSlot, rawGlassList.get(0).getSlot()) .eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RESET) .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING)); return Boolean.TRUE; } /** * 入库任务:吊装位有玻璃,先去工位表查询空格子,生成入库任务从吊装位到目标格子 * * @throws Exception */ public boolean warehouseTask() throws Exception { List rawGlassList = rawGlassStorageDetailsService.list(new LambdaQueryWrapper() .eq(RawGlassStorageDetails::getState, Const.GLASS_STATE_IN) .gt(RawGlassStorageDetails::getRemainQuantity, 0) .inSql(RawGlassStorageDetails::getSlot, "select slot from raw_glass_storage_station where enable_state = 1 and device_id = 4") .inSql(RawGlassStorageDetails::getShelf, "select slot from raw_glass_storage_station where enable_state = 1 ")); if (CollectionUtil.isEmpty(rawGlassList)) { log.info("吊装位被禁用/架子所在工位被禁用/无原片信息"); return Boolean.FALSE; } //生成进笼任务 RawGlassStorageDetails details = rawGlassList.get(0); rawGlassStorageDetailsService.generateTask(details.getSlot(), details.getShelf(), details.getShelf(), details.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_IN); // List list = new ArrayList<>(); // list.add(generateReadWriteEntity("CC.CC.taskWord", 1)); // list.add(generateReadWriteEntity("CC.CC.taskSending", 1)); // list.add(generateReadWriteEntity("CC.CC.startSlot", details.getSlot())); // list.add(generateReadWriteEntity("CC.CC.endSlot", details.getShelf())); // miloService.writeToOpcWord(list); //生成工位任务,将吊装位的玻璃状态改位进笼中 //修改吊装位的原片状态为103 出片中 //修改出片任务状态 rawGlassStorageDetailsService.update(new LambdaUpdateWrapper() .eq(RawGlassStorageDetails::getSlot, rawGlassList.get(0).getSlot()) .eq(RawGlassStorageDetails::getState, Const.GLASS_STATE_IN) .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING)); return Boolean.TRUE; } /** * @param stationCell 设备信息 5 、 6 * @param enginneerId 共亨号 * @return * @throws Exception */ private boolean rawGlassDispatchByEngineering(int stationCell, String enginneerId) throws Exception { //当前尺寸需要上片的数量 List pattenUsageList = upPattenUsageMapper.queryRawGlassByEngineeringId(enginneerId); if (CollectionUtils.isEmpty(pattenUsageList)) { log.info("正在执行的工程原片无可上片的原片信息"); return Boolean.FALSE; } //获取当前需要上片的原片数据 Map> upListMap = pattenUsageList.stream() .collect(Collectors.groupingBy(UpPattenUsageVO::getGroupNumber)); List usageVOS = upListMap.get("1"); //获取当前上片位1号架子信息 List loadStation = LOAD_GLASS_ONE_DEVICE.equals(stationCell) ? LOAD_STATION_01 : LOAD_STATION_02; List stations = rawGlassStorageStationService.list(new LambdaQueryWrapper() .in(RawGlassStorageStation::getSlot, loadStation) .eq(RawGlassStorageStation::getEnableState, Const.SLOT_ON).orderByAsc(RawGlassStorageStation::getSlot)); if (CollectionUtils.isEmpty(stations)) { log.info("没有可用的上片位"); return Boolean.FALSE; } List loadStationList = rawGlassStorageDetailsService.list(new LambdaQueryWrapper() .inSql(RawGlassStorageDetails::getSlot, "select slot from raw_glass_storage_station where enable_state = 1") .eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN) .eq(RawGlassStorageDetails::getDeviceId, stationCell)); if (stations.size() == 1) { if (CollectionUtils.isEmpty(loadStationList)) { RawGlassStorageDetails rawDetails = getRawGlassStorageDetailsBySize(usageVOS.get(0), usageVOS.size()); rawGlassStorageDetailsService.generateTask(rawDetails.getSlot(), stations.get(0).getSlot(), rawDetails.getShelf(), rawDetails.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH); //结束调度任务 修改工位状态(起始位)状态为103 RAW_GLASS_STATE_RUNNING 任务完成后将状态改为101 目标位新增一条数据,架子号为(起始位) rawGlassStorageDetailsService.update(new LambdaUpdateWrapper() .eq(RawGlassStorageDetails::getSlot, rawDetails.getSlot()).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN) .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING)); return Boolean.TRUE; } RawGlassStorageDetails oneLoadStation = loadStationList.get(0); if (oneLoadStation.getRemainQuantity() <= 0 || !compareRawSize(usageVOS.get(0), oneLoadStation)) { rawGlassStorageDetailsService.generateTask(stations.get(0).getSlot(), oneLoadStation.getShelf(), oneLoadStation.getShelf(), oneLoadStation.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH); rawGlassStorageDetailsService.update(new LambdaUpdateWrapper() .eq(RawGlassStorageDetails::getSlot, oneLoadStation.getSlot()).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN) .set(RawGlassStorageDetails::getDeviceId, Const.RAW_GLASS_STATE_RUNNING)); return Boolean.FALSE; } } log.info("获取{}上片线的工位信息{}", stationCell, loadStationList); if (CollectionUtils.isEmpty(loadStationList)) { log.info("1号上片位生成调度任务"); RawGlassStorageDetails rawDetails = getRawGlassStorageDetailsBySize(usageVOS.get(0), usageVOS.size()); if (CollectionUtils.isEmpty(loadStationList)) { log.info("仓库内无匹配的玻璃"); return Boolean.FALSE; } rawGlassStorageDetailsService.generateTask(rawDetails.getSlot(), loadStation.get(0), rawDetails.getShelf(), rawDetails.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH); //结束调度任务 修改工位状态(起始位)状态为103 RAW_GLASS_STATE_RUNNING 任务完成后将状态改为101 目标位新增一条数据,架子号为(起始位) rawGlassStorageDetailsService.update(new LambdaUpdateWrapper() .eq(RawGlassStorageDetails::getSlot, rawDetails.getSlot()).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN) .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING)); return Boolean.TRUE; } RawGlassStorageDetails oneLoadStation = loadStationList.stream().filter(e -> e.getSlot().equals(loadStation.get(0))).findFirst().orElse(null); if (null == oneLoadStation) { RawGlassStorageDetails twoLoadStation = loadStationList.stream().filter(e -> e.getSlot().equals(loadStation.get(1))).findFirst().orElse(null); if (twoLoadStation.getRemainQuantity() > 0) { if (compareRawSize(usageVOS.get(0), twoLoadStation)) { // 2号上片位的原片信息源工程信息一致,可上片操作,结束本次任务 return Boolean.FALSE; } else { // 生成1号位入库任务 log.info("2号上片位玻璃尺寸不一致,1号上片位生成调度任务"); //按照尺寸及数量获取数量最接近的格子信息 RawGlassStorageDetails rawDetails = getRawGlassStorageDetailsBySize(usageVOS.get(0), usageVOS.size()); if (null == rawDetails) { log.info("仓库内无需要上架的玻璃"); return Boolean.FALSE; } rawGlassStorageDetailsService.generateTask(rawDetails.getSlot(), loadStation.get(0), rawDetails.getShelf(), rawDetails.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH); //结束调度任务 修改工位状态(起始位)状态为103 RAW_GLASS_STATE_RUNNING 任务完成后将状态改为101 目标位新增一条数据,架子号为(起始位) rawGlassStorageDetailsService.update(new LambdaUpdateWrapper() .eq(RawGlassStorageDetails::getSlot, rawDetails.getSlot()).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN) .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING)); return Boolean.TRUE; } } else { // 生成1号位入库任务 log.info("2号上片位仅剩空架子,1号上片位生成调度任务"); RawGlassStorageDetails rawDetails = getRawGlassStorageDetailsBySize(usageVOS.get(0), usageVOS.size()); rawGlassStorageDetailsService.generateTask(rawDetails.getSlot(), loadStation.get(0), rawDetails.getShelf(), rawDetails.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH); rawGlassStorageDetailsService.update(new LambdaUpdateWrapper() .eq(RawGlassStorageDetails::getSlot, rawDetails.getSlot()).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN) .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING)); return Boolean.TRUE; } } else { String tableName = stationCell == 5 ? LOAD_GLASS_DEVICE_ONE_TASK : LOAD_GLASS_DEVICE_TWO_TASK; if (oneLoadStation.getRemainQuantity() > 0) { if (compareRawSize(usageVOS.get(0), oneLoadStation)) { //结束仓储调度,等待上片任务 //在上片任务执行空闲过程中,可执行二号位出入库任务 二号架子的信息是否需要调度,不需要调度直接放回false log.info("获取二号位原片信息"); RawGlassStorageDetails twoLoadStation = loadStationList.stream().filter(e -> e.getSlot().equals(loadStation.get(1))).findFirst().orElse(null); if (null == twoLoadStation) { //按照尺寸生成二号位上片任务信息 LoadGlassDeviceTask loadTask = loadGlassDeviceTaskService.queryTaskMessage(tableName); RawGlassStorageDetails rawDetails = null; if (oneLoadStation.getRemainQuantity() > (loadTask.getTotalCount() + loadTask.getDamageCount())) { usageVOS = upListMap.get("2"); if (CollectionUtils.isEmpty(usageVOS)) { log.info("当前工程的原片即将用完,结束本次调度"); return Boolean.FALSE; } rawDetails = getRawGlassStorageDetailsBySize(usageVOS.get(0), usageVOS.size()); } else { rawDetails = getRawGlassStorageDetailsBySize(usageVOS.get(0), usageVOS.size()); } if (null == rawDetails) { log.info("原片仓储没有相同尺寸的玻璃"); return Boolean.FALSE; } rawGlassStorageDetailsService.generateTask(rawDetails.getSlot(), loadStation.get(1), rawDetails.getShelf(), rawDetails.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH); //结束调度任务 修改工位状态(起始位)状态为103 RAW_GLASS_STATE_RUNNING 任务完成后将状态改为101 目标位新增一条数据,架子号为(起始位) rawGlassStorageDetailsService.update(new LambdaUpdateWrapper() .eq(RawGlassStorageDetails::getSlot, rawDetails.getSlot()).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN) .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING)); return Boolean.TRUE; } else { //todo:当二号为的尺寸大于0时,是否执行调度任务,更换当前原片的尺寸,等待下一次任务的直接执行;还是继续等待,当尺寸不一样,等待一号工位的进出库调度任务。 if (twoLoadStation.getRemainQuantity() > 0) { LoadGlassDeviceTask loadTask = loadGlassDeviceTaskService.queryTaskMessage(tableName); if (oneLoadStation.getRemainQuantity() > (loadTask.getTotalCount() + loadTask.getDamageCount())) { usageVOS = upListMap.get("2"); if (CollectionUtils.isEmpty(usageVOS)) { log.info("当前工程的原片即将用完,结束本次调度"); return Boolean.FALSE; } } if (compareRawSize(usageVOS.get(0), twoLoadStation)) { // //2号上片位的原片信息源工程信息一致,可上片操作,结束本次任务 return Boolean.FALSE; } else { // 生成1号位入库任务 log.info("2号上片位玻璃尺寸不一致,2号上片位生成出片调度任务"); //按照尺寸及数量获取数量最接近的格子信息 rawGlassStorageDetailsService.generateTask(loadStation.get(1), twoLoadStation.getShelf(), twoLoadStation.getShelf(), twoLoadStation.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH); //结束调度任务 修改工位状态(起始位)状态为103 RAW_GLASS_STATE_RUNNING 任务完成后将状态改为101 目标位新增一条数据,架子号为(起始位) rawGlassStorageDetailsService.update(new LambdaUpdateWrapper() .eq(RawGlassStorageDetails::getSlot, loadStation.get(1)).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN) .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING)); return Boolean.TRUE; } } else { //todo:生成出库任务 rawGlassStorageDetailsService.generateTask(loadStation.get(1), twoLoadStation.getShelf(), twoLoadStation.getShelf(), twoLoadStation.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH); //结束调度任务 修改工位状态(起始位)状态为103 RAW_GLASS_STATE_RUNNING 任务完成后将状态改为101 目标位新增一条数据,架子号为(起始位) rawGlassStorageDetailsService.update(new LambdaUpdateWrapper() .eq(RawGlassStorageDetails::getSlot, loadStation.get(1)).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN) .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING)); return Boolean.TRUE; } } // return Boolean.FALSE; } else { log.info("2号上片位仅剩空架子,1号上片位生成出库调度任务"); rawGlassStorageDetailsService.generateTask(loadStation.get(0), oneLoadStation.getShelf(), oneLoadStation.getShelf(), oneLoadStation.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH); rawGlassStorageDetailsService.update(new LambdaUpdateWrapper() .eq(RawGlassStorageDetails::getSlot, loadStation.get(0)).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN) .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING)); return Boolean.TRUE; } } else { log.info("1号上片位玻璃尺寸不一致,1号上片位生成出库调度任务"); rawGlassStorageDetailsService.generateTask(loadStation.get(0), oneLoadStation.getSlot(), oneLoadStation.getShelf(), oneLoadStation.getRemainQuantity(), Const.RAW_GLASS_TASK_TYPE_DISPATCH); rawGlassStorageDetailsService.update(new LambdaUpdateWrapper() .eq(RawGlassStorageDetails::getSlot, loadStation.get(0)).eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN) .set(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_RUNNING)); return Boolean.TRUE; } } } private ReadWriteEntity generateReadWriteEntity(String identifier, int value) { ReadWriteEntity readWriteEntity = new ReadWriteEntity(); readWriteEntity.setIdentifier(identifier); readWriteEntity.setValue(value); return readWriteEntity; } private RawGlassStorageDetails getRawGlassStorageDetailsBySize(UpPattenUsageVO usageVO, int remainQuantity) { return rawGlassStorageDetailsService.getOne(new LambdaQueryWrapper() .eq(RawGlassStorageDetails::getFilmsId, usageVO.getFilmsId()) .eq(RawGlassStorageDetails::getPatternWidth, usageVO.getWidth()) .eq(RawGlassStorageDetails::getPatternHeight, usageVO.getHeight()) .eq(RawGlassStorageDetails::getPatternThickness, usageVO.getThickness()) .notIn(RawGlassStorageDetails::getSlot, LOAD_STATION_ALL) .eq(RawGlassStorageDetails::getState, Const.GLASS_STATE_IN) .orderByAsc(RawGlassStorageDetails::getRemainQuantity) .last("order by abs(t.remain_quantity - " + remainQuantity + ") asc") .last("limit 1")); } /** * 尺寸一样并且原片数量大于0 * * @param upPattenUsage * @param details * @return */ private boolean compareRawSize(UpPattenUsage upPattenUsage, RawGlassStorageDetails details) { boolean flag = upPattenUsage.getWidth() == details.getPatternWidth() && upPattenUsage.getHeight() == details.getPatternHeight() && upPattenUsage.getThickness() == details.getPatternThickness() && upPattenUsage.getFilmsId().equals(details.getFilmsId()); return flag; } }