package com.mes.job; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.kangaroohy.milo.runner.subscription.SubscriptionCallback; import com.kangaroohy.milo.service.MiloService; import com.mes.bigstorage.entity.BigStorageCage; import com.mes.bigstorage.entity.BigStorageCageDetails; import com.mes.bigstorage.service.BigStorageCageDetailsService; import com.mes.bigstorage.service.BigStorageCageService; import com.mes.bigstoragetask.entity.BigStorageCageFeedTask; import com.mes.bigstoragetask.entity.BigStorageCageOutTask; import com.mes.bigstoragetask.entity.UpdateBigStorageCageDTO; import com.mes.bigstoragetask.service.BigStorageCageFeedTaskService; import com.mes.bigstoragetask.service.BigStorageCageOutTaskService; import com.mes.common.config.Const; import com.mes.damage.entity.Damage; import com.mes.damage.service.DamageService; import com.mes.edgglasstask.service.EdgGlassTaskInfoService; import com.mes.glassinfo.service.GlassInfoService; import com.mes.temperingglass.entity.TemperingGlassInfo; import com.mes.temperingglass.service.TemperingGlassInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; /** * @author SNG-015 */ @Component @Slf4j public class OpcPlcStorageCageTask { @Resource private BigStorageCageService bigStorageCageService; @Resource private BigStorageCageDetailsService bigStorageCageDetailsService; @Resource private GlassInfoService glassInfoService; @Resource private BigStorageCageFeedTaskService bigStorageCageFeedTaskService; @Resource private BigStorageCageOutTaskService bigStorageCageOutTaskService; @Resource private EdgGlassTaskInfoService edgGlassTaskInfoService; @Resource private TemperingGlassInfoService temperingGlassInfoService; @Resource private DamageService damageService; @Autowired(required = false) MiloService miloService; @Resource(name = "bigStorageStartCallback") SubscriptionCallback bigStorageStartCallback; @Value("${mes.carWidth}") private Integer carWidth; @Value("${mes.slotWidth}") private Integer slotWidth; @Value("${mes.glassGap}") private Integer glassGap; @Scheduled(fixedDelay = Long.MAX_VALUE) public void startOpcTask() throws Exception { //设备一二的进片请求 miloService.subscriptionFromOpcUa(Arrays.asList("my.device01.x1", "my.device02.x1"), bigStorageStartCallback); } @Scheduled(fixedDelay = Long.MAX_VALUE) public void outOpcTask() throws Exception { //设备1的出片请求 miloService.subscriptionFromOpcUa(Arrays.asList("my.device03.x1"), bigStorageStartCallback); } @Scheduled(fixedDelay = 300) public void updateInGlassStateTask() { Date startDate = new Date(); log.info("1、大理片笼进片完成后更新大理片笼数据任务开始执行时间:{}", startDate); //因为大理片笼和出片任务是两个库的数据,所以要分开查找 List list = bigStorageCageDetailsService.listObjs(new LambdaQueryWrapper() .select(BigStorageCageDetails::getGlassId).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_NEW)); if (CollectionUtils.isNotEmpty(list)) { log.info("2、获取所有正在进片的玻璃信息id:{}", list); List glassIds = list.stream().map(String::valueOf).collect(Collectors.toList()); List inSuccessGlass = bigStorageCageFeedTaskService.list(new LambdaQueryWrapper() .in(BigStorageCageFeedTask::getGlassId, glassIds) .in(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_SLOT)); if (CollectionUtils.isNotEmpty(inSuccessGlass)) { log.info("3、获取进片已完成的玻璃信息id:{}", inSuccessGlass); List inSuccessGlassSlot = inSuccessGlass.stream().map(BigStorageCageFeedTask::getTargetSlot).collect(Collectors.toList()); List storageCageDTOList = inSuccessGlass.stream().map(e -> { UpdateBigStorageCageDTO storageCageDTO = new UpdateBigStorageCageDTO(); BeanUtils.copyProperties(e, storageCageDTO); return storageCageDTO; }).collect(Collectors.toList()); bigStorageCageDetailsService.updateBySlot(storageCageDTOList, Const.GLASS_STATE_IN); log.info("4、大理片笼进片状态已完成已完成的玻璃信息id:{}", inSuccessGlass); //更新理片笼玻璃尺寸 updateSlotRemainBySlots(inSuccessGlassSlot); log.info("5、大理片笼进片目标格子尺寸更新完成"); } } Date endDate = new Date(); log.info("end:大理片笼进片完成后更新大理片笼数据任务结束时间:{},共耗时:{}ms,结束任务", endDate, endDate.getTime() - startDate.getTime()); return; } @Scheduled(fixedDelay = 300) public void updateOutGlassStateTask() { Date startDate = new Date(); log.info("1、大理片笼出片完成后更新大理片笼数据任务开始执行时间:{}", startDate); //因为大理片笼和出片任务是两个库的数据,所以要分开查找 List list = bigStorageCageDetailsService.listObjs(new LambdaQueryWrapper() .select(BigStorageCageDetails::getGlassId).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT_ING)); if (CollectionUtils.isNotEmpty(list)) { log.info("2、获取所有正在出片的玻璃信息id:{}", list); List glassIds = list.stream().map(String::valueOf).collect(Collectors.toList()); List outSuccessGlass = bigStorageCageOutTaskService.list(new LambdaQueryWrapper() .in(BigStorageCageOutTask::getGlassId, glassIds).in(BigStorageCageOutTask::getTaskState, Const.BIG_STORAGE_OUT_ALL)); if (CollectionUtils.isNotEmpty(outSuccessGlass)) { for (BigStorageCageOutTask bigStorageCageOutTask : outSuccessGlass ) { if (bigStorageCageOutTask.getEndSlot().equals(Const.ARTIFICIAL_OUT_TARGET_POSITION)) { temperingGlassInfoService.update( new LambdaUpdateWrapper() .set(TemperingGlassInfo::getState, Const.TEMPERING_END) .eq(TemperingGlassInfo::getGlassId, bigStorageCageOutTask.getGlassId()) ); } } log.info("3、获取出片已完成的玻璃信息id:{}", outSuccessGlass); List storageCageDTOList = outSuccessGlass.stream().map(e -> { UpdateBigStorageCageDTO storageCageDTO = new UpdateBigStorageCageDTO(); storageCageDTO.setGlassId(e.getGlassId()); storageCageDTO.setTargetSlot(e.getStartSlot()); return storageCageDTO; }).collect(Collectors.toList()); bigStorageCageDetailsService.updateBySlot(storageCageDTOList, Const.GLASS_STATE_OUT); List outSuccessSlotList = outSuccessGlass.stream().map(BigStorageCageOutTask::getStartSlot).collect(Collectors.toList()); log.info("4、大理片笼出片状态已完成已完成的玻璃信息id:{}", outSuccessGlass); //更新理片笼玻璃尺寸 updateSlotRemainBySlots(outSuccessSlotList); log.info("5、大理片笼进片目标格子尺寸更新完成"); } } Date endDate = new Date(); log.info("end:大理片笼出片完成后更新大理片笼数据任务结束时间:{},共耗时:{}ms,结束任务", endDate, endDate.getTime() - startDate.getTime()); return; } @Scheduled(fixedDelay = 300) public void updateScheduleGlassStateTask() { Date startDate = new Date(); log.info("1、大理片笼调度完成后更新大理片笼数据任务开始执行时间:{}", startDate); //因为大理片笼和调度任务是两个库的数据,所以要分开查找 List list = bigStorageCageDetailsService.listObjs(new LambdaQueryWrapper() .select(BigStorageCageDetails::getGlassId).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_SCHEDULE_ING)); if (CollectionUtils.isNotEmpty(list)) { log.info("2、获取所有正在出片的玻璃信息id:{}", list); List glassIds = list.stream().map(String::valueOf).collect(Collectors.toList()); List scheduleSuccessGlass = bigStorageCageOutTaskService.list(new LambdaQueryWrapper() .in(BigStorageCageOutTask::getGlassId, glassIds).eq(BigStorageCageOutTask::getTaskState, Const.BIG_STORAGE_OUT_SUCCESS) .notIn(BigStorageCageOutTask::getEndSlot, Const.TEMPERING_OUT_TARGET_POSITION, Const.ARTIFICIAL_OUT_TARGET_POSITION)); if (CollectionUtils.isNotEmpty(scheduleSuccessGlass)) { log.info("3、获取调度已完成的玻璃信息id:{}", scheduleSuccessGlass); List storageCageDTOList = scheduleSuccessGlass.stream().map(e -> { UpdateBigStorageCageDTO storageCageDTO = new UpdateBigStorageCageDTO(); storageCageDTO.setGlassId(e.getGlassId()); storageCageDTO.setTargetSlot(e.getEndSlot()); return storageCageDTO; }).collect(Collectors.toList()); bigStorageCageDetailsService.updateBySlot(storageCageDTOList, Const.GLASS_STATE_IN); List scheduleSuccessGlassIds = scheduleSuccessGlass.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList()); log.info("4、大理片笼出片状态已完成已完成的玻璃信息id:{}", scheduleSuccessGlassIds); //更新理片笼玻璃尺寸 List slotList = scheduleSuccessGlass.stream().map(BigStorageCageOutTask::getStartSlot).distinct().collect(Collectors.toList()); slotList.addAll(scheduleSuccessGlass.stream().map(BigStorageCageOutTask::getEndSlot).distinct().collect(Collectors.toList())); updateSlotRemainBySlots(slotList); log.info("5、大理片笼进片目标格子尺寸更新完成"); } } Date endDate = new Date(); log.info("end:大理片笼出片完成后更新大理片笼数据任务结束时间:{},共耗时:{}ms,结束任务", endDate, endDate.getTime() - startDate.getTime()); return; } /** * 处理破损表任务 */ @Scheduled(fixedDelay = 300) public void dealDamageTask() { Date startDate = new Date(); log.info("大理片笼破损玻璃清除任务开始执行时间:{}", startDate); //获取进片任务表中状态为破损的数据 List inDamageTaskInfoList = bigStorageCageFeedTaskService.list(new LambdaQueryWrapper() .in(BigStorageCageFeedTask::getTaskState, Const.GLASS_STATE_DAMAGE_TAKE)); if (CollectionUtils.isNotEmpty(inDamageTaskInfoList)) { log.info("获取进片任务表中破损的玻璃信息{}", inDamageTaskInfoList); bigStorageCageFeedTaskService.remove(new LambdaQueryWrapper().in(BigStorageCageFeedTask::getTaskState, Const.GLASS_STATE_DAMAGE_TAKE)); //理片笼详情表数据状态更新 bigStorageCageDetailsService.remove(new LambdaQueryWrapper() .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_NEW).in(BigStorageCageDetails::getGlassId, inDamageTaskInfoList.stream().map(BigStorageCageFeedTask::getGlassId).collect(Collectors.toList()))); //将破损信息新增入破损表 List slotList = new ArrayList<>(); for (BigStorageCageFeedTask bigStorageCageFeedTask : inDamageTaskInfoList) { Damage damage = new Damage(); damage.setGlassId(bigStorageCageFeedTask.getGlassId()); damage.setLine(bigStorageCageFeedTask.getLine()); damage.setWorkingProcedure("磨边"); damage.setRemark("进笼前卧转立"); damage.setStatus(1); damage.setType(bigStorageCageFeedTask.getTaskState()); damageService.insertDamage(damage); slotList.add(bigStorageCageFeedTask.getTargetSlot()); } //更新格子剩余宽度 updateSlotRemainBySlots(slotList); log.info("进片任务执行完成"); } //获取出片任务表中状态为破损的数据 List outDamageTaskInfoList = bigStorageCageOutTaskService.list(new LambdaQueryWrapper() .in(BigStorageCageOutTask::getTaskState, Const.GLASS_STATE_DAMAGE_TAKE)); if (CollectionUtils.isNotEmpty(outDamageTaskInfoList)) { log.info("获取出片任务表中破损的玻璃信息{}", outDamageTaskInfoList); bigStorageCageOutTaskService.remove(new LambdaQueryWrapper().in(BigStorageCageOutTask::getTaskState, Const.GLASS_STATE_DAMAGE_TAKE)); List glassIdList = outDamageTaskInfoList.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList()); //移除钢化下片表数据 temperingGlassInfoService.remove(new LambdaQueryWrapper().in(TemperingGlassInfo::getGlassId, glassIdList)); //理片笼详情表数据状态删除 bigStorageCageDetailsService.remove(new LambdaQueryWrapper().in(BigStorageCageDetails::getGlassId, glassIdList)); //将破损信息新增入破损表 List slotList = new ArrayList<>(); for (BigStorageCageOutTask bigStorageCageOutTask : outDamageTaskInfoList) { Damage damage = new Damage(); damage.setGlassId(bigStorageCageOutTask.getGlassId()); damage.setLine(bigStorageCageOutTask.getEndSlot()); damage.setWorkingProcedure("钢化"); damage.setRemark("出片后卧转立"); damage.setStatus(1); damage.setType(bigStorageCageOutTask.getTaskState()); damageService.insertDamage(damage); slotList.add(bigStorageCageOutTask.getStartSlot()); } //更新格子剩余宽度 updateSlotRemainBySlots(slotList); log.info("出片任务执行完成"); } Date endDate = new Date(); log.info("大理片笼破损玻璃清除任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime()); return; } public void updateSlotRemainBySlots(List slotList) { //获取格子内所有的玻璃信息 List inSlotGlassList = bigStorageCageDetailsService.list(new LambdaQueryWrapper() .in(BigStorageCageDetails::getSlot, slotList).in(BigStorageCageDetails::getState, Const.GLASS_STATE_IN_ALL)); Map slotRemainMap = new HashMap<>(); //是否存在有格子非空的玻璃 if (CollectionUtils.isNotEmpty(inSlotGlassList)) { //存在 将格子内的玻璃分别进行更新 slotRemainMap = inSlotGlassList.stream() .collect(Collectors.groupingBy(BigStorageCageDetails::getSlot, Collectors.summingDouble(item -> Math.max(item.getWidth(), item.getHeight()) + glassGap))); slotRemainMap.forEach((e, v) -> { double remainWidth = slotWidth - v >= 0 ? slotWidth - v : 0; bigStorageCageService.update(new LambdaUpdateWrapper().set(BigStorageCage::getRemainWidth, remainWidth) .eq(BigStorageCage::getSlot, e)); }); } //过滤不存在玻璃的格子 将宽度重置为原始宽度5000 Set remainSlotList = slotRemainMap.keySet(); slotList.removeAll(remainSlotList); if (CollectionUtils.isNotEmpty(slotList)) { bigStorageCageService.update(new LambdaUpdateWrapper().set(BigStorageCage::getRemainWidth, slotWidth) .in(BigStorageCage::getSlot, slotList)); } } }