package com.mes.bigstorage.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.mes.bigstorage.entity.BigStorageCage; import com.mes.bigstorage.entity.BigStorageCageDetails; import com.mes.bigstorage.mapper.BigStorageCageDetailsMapper; import com.mes.bigstorage.mapper.BigStorageCageMapper; import com.mes.bigstorage.service.BigStorageCageService; import com.mes.glassinfo.entity.GlassInfo; import com.mes.temperingglass.entity.TemperingGlassInfo; import com.mes.temperingglass.service.TemperingGlassInfoService; import lombok.extern.slf4j.Slf4j; import com.mes.glassinfo.entity.GlassInfo; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** *

* 服务实现类 *

* * @author zhoush * @since 2024-03-27 */ @Service @Slf4j public class BigStorageCageServiceImpl extends ServiceImpl implements BigStorageCageService { @Resource private BigStorageCageMapper bigStorageCageMapper; @Resource private BigStorageCageDetailsMapper bigStorageCageDetailsMapper; @Resource private TemperingGlassInfoService temperingGlassInfoService; @Override public BigStorageCageDetails feedGlass(GlassInfo glassInfo, BigStorageCageDetails bigStorageCageDetails) { log.info("1、查询理片笼内片序+1等于当前玻璃片序的玻璃"); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(BigStorageCageDetails::getTemperingLayoutId, glassInfo.getTemperingLayoutId()) .eq(BigStorageCageDetails::getTemperingFeedSequence, glassInfo.getTemperingFeedSequence() + 1); BigStorageCageDetails layoutSlotInfo; layoutSlotInfo= bigStorageCageDetailsMapper.selectOne(wrapper); BeanUtils.copyProperties(glassInfo, bigStorageCageDetails); log.info("2、查询理片笼内片序+1等于当前玻璃片序的玻璃的结果不为空时"); if (layoutSlotInfo.getSlot() != null) { bigStorageCageDetails.setSlot(layoutSlotInfo.getSlot()); } else { log.info("3、查询理片笼内片序+1等于当前玻璃片序的玻璃的结果为空时获取当前玻璃版图id是否存在理片笼内"); LambdaQueryWrapper BigStorageCageDetailslambdaQueryWrapper = new LambdaQueryWrapper<>(); BigStorageCageDetailslambdaQueryWrapper .select(BigStorageCageDetails::getTemperingLayoutId); layoutSlotInfo = bigStorageCageDetailsMapper.selectOne(BigStorageCageDetailslambdaQueryWrapper); if(layoutSlotInfo != null){ log.info("4、获取笼子内适合的格子"); BigStorageCage bigStorageCage=bigStorageCageSlot(layoutSlotInfo.getDeviceId()); bigStorageCageDetails.setSlot(bigStorageCage.getSlot()); }else{ log.info("5、获取每个笼子版图id的个数"); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.select("a.device_id", "COUNT(DISTINCT b.tempering_layout_id) AS layoutCount") .groupBy("a.device_id") .apply("LEFT JOIN (SELECT device_id, tempering_layout_id FROM big_storage_cage_details) b ON a.device_id = b.device_id AND a.slot = b.slot") .orderByAsc("layoutCount") .orderByAsc("a.device_id"); List> BigStorageCageDetailsCount= bigStorageCageDetailsMapper.selectMaps(queryWrapper); log.info("5、查询笼子内是否有合适的格子"); for (Map map : BigStorageCageDetailsCount) { for (Map.Entry entry : map.entrySet()) { int deviceId = Integer.parseInt(entry.getKey()); BigStorageCage bigStorageCage=bigStorageCageSlot(deviceId); if(bigStorageCage!=null){ bigStorageCageDetails.setSlot(bigStorageCage.getSlot()); } } } } } log.info("6、当找到合适的格子时添加玻璃到笼子表"); if (bigStorageCageDetails.getSlot() != null) { bigStorageCageDetails.setState(0); bigStorageCageDetailsMapper.insert(bigStorageCageDetails); updateRemainWidth(bigStorageCageDetails.getSlot()) ; } return bigStorageCageDetails; } //获取笼子内的空格子 private BigStorageCage bigStorageCageSlot(Integer deviceId) { LambdaQueryWrapper bigStorageCageWrapper=new LambdaQueryWrapper<>(); bigStorageCageWrapper .eq(BigStorageCage::getRemainWidth,"5000") .eq(BigStorageCage::getEnableState,"0") .eq(BigStorageCage::getDeviceId,deviceId) .orderByAsc(BigStorageCage::getSlot) .last("LIMIT 1"); return bigStorageCageMapper.selectOne(bigStorageCageWrapper); } @Override public boolean outGlass() { List temperingGlassInfoList = temperingGlassInfoService.list(); log.info("1、查询钢化小片任务表是否有待出玻璃"+temperingGlassInfoList.size()); if(temperingGlassInfoList!=null){ temperingGlassInfoService.addOutTask(temperingGlassInfoList); log.info("2、添加任务到任务表"); return true; }else{ log.info("3、没有可出的玻璃时获取是否有小片到齐的版图"); LambdaQueryWrapper bigStorageCageDetailslambdaQueryWrapper = new LambdaQueryWrapper<>(); bigStorageCageDetailslambdaQueryWrapper .select(BigStorageCageDetails::getTemperingLayoutId) .groupBy(BigStorageCageDetails::getTemperingLayoutId); List> temperingLayoutIdList = bigStorageCageDetailsMapper.selectMaps(bigStorageCageDetailslambdaQueryWrapper); for (Map map : temperingLayoutIdList) { for (Map.Entry entry : map.entrySet()) { String layoutId = entry.getKey().substring(0, entry.getKey().indexOf('-')); String layoutNum = entry.getKey().substring(entry.getKey().indexOf('-') + 1); if (layoutNum.equals(entry.getValue())) { //4、添加此钢化版图id所有小片小片到钢化小片表 return false; } } } } return false; } //计算格子剩余宽度 @Override public void updateRemainWidth(int slot) { log.info("获取该格子内玻璃信息,计算格子剩余宽度"); Integer width = 5000; List bigStorageCageDetailsList = Collections.singletonList(bigStorageCageDetailsMapper.selectById(slot)); for (BigStorageCageDetails bigStorageCageDetails : bigStorageCageDetailsList ) { width -= Integer.parseInt(bigStorageCageDetails.getWidth().toString()) + bigStorageCageDetails.getGap(); } //修改格子剩余宽度 BigStorageCage bigStorageCage = new BigStorageCage(); bigStorageCage.setRemainWidth(width); UpdateWrapper bigStorageCageWrapper = new UpdateWrapper<>(); bigStorageCageWrapper.eq("remain_width", width); bigStorageCageMapper.update(bigStorageCage, bigStorageCageWrapper); } @Override public List querybigStorageCageDetail() { //1、获取大理片笼信息 List bigStorageCages = bigStorageCageMapper.selectList(null); log.info("1、获取大理片笼信息完成,获取到的数据{}", bigStorageCages.size()); //2获取理片笼所有信息 List bigStorageCageDetailsList = bigStorageCageDetailsMapper.selectList(null); Map> listMap = bigStorageCageDetailsList.stream().collect(Collectors.groupingBy(BigStorageCageDetails::getSlot)); for (BigStorageCage bigStorageCage : bigStorageCages) { List bigStorageCageDetails = listMap.get(bigStorageCage.getSlot()); bigStorageCage.setBigStorageCageDetails(bigStorageCageDetails); } return bigStorageCages; } }