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.glassinfo.service.GlassInfoService; 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.ArrayList; 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; @Resource private GlassInfoService glassInfoService; //进片逻辑 @Override public BigStorageCageDetails feedGlass(GlassInfo glassInfo, BigStorageCageDetails bigStorageCageDetails) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(BigStorageCageDetails::getTemperingLayoutId, glassInfo.getTemperingLayoutId()) .eq(BigStorageCageDetails::getTemperingFeedSequence, glassInfo.getTemperingFeedSequence() - 1); BigStorageCageDetails layoutSlotInfo; layoutSlotInfo= bigStorageCageDetailsMapper.selectOne(wrapper); log.info("1、查询理片笼内片序-1等于当前玻璃片序的玻璃"+layoutSlotInfo); BeanUtils.copyProperties(glassInfo, bigStorageCageDetails); log.info("2、查询理片笼内片序-1等于当前玻璃片序的玻璃的结果不为空时"+layoutSlotInfo.getSlot()); if (layoutSlotInfo.getSlot() != null&&selectWidthSufficient(layoutSlotInfo,bigStorageCageDetails.getWidth())) { 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&&selectWidthSufficient(layoutSlotInfo,bigStorageCageDetails.getWidth())){ 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、查询笼子内是否有合适的格子"); boolean found=false; 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()); found=true; break; } } if(found){ break; } } } } if (bigStorageCageDetails.getSlot() != null) { log.info("6、当找到合适的格子时添加玻璃到笼子表"); 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() { LambdaQueryWrapper temperingGlassInfoWrapper=new LambdaQueryWrapper<>(); temperingGlassInfoWrapper.eq(TemperingGlassInfo::getState,-1); List temperingGlassInfoList = temperingGlassInfoService.list(temperingGlassInfoWrapper); log.info("1、查询钢化小片任务表是否有待出玻璃"+temperingGlassInfoList.size()); if(temperingGlassInfoList.size()>0){ 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())) { log.info("4、添加此钢化版图id所有小片小片到钢化小片表"); LambdaQueryWrapper glassInfoWrapper=new LambdaQueryWrapper<>(); glassInfoWrapper.select(GlassInfo::getTemperingLayoutId) .orderByDesc(GlassInfo::getTemperingFeedSequence); List glassInfoList= glassInfoService.list(glassInfoWrapper); for (GlassInfo glassInfo:glassInfoList ) { TemperingGlassInfo temperingGlassInfo=new TemperingGlassInfo(); BeanUtils.copyProperties(glassInfo, temperingGlassInfo); temperingGlassInfoService.save(temperingGlassInfo); } 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(int deviceId) { LambdaQueryWrapper BigStorageCageWrapper =new LambdaQueryWrapper<>(); BigStorageCageWrapper.eq(BigStorageCage::getSlot,deviceId); LambdaQueryWrapper BigStorageCageDetailsWrapper =new LambdaQueryWrapper<>(); BigStorageCageDetailsWrapper.eq(BigStorageCageDetails::getSlot,deviceId); List bigStorageCages = bigStorageCageMapper.selectList(BigStorageCageWrapper); log.info("1、获取大理片笼信息完成,获取到的数据{}", bigStorageCages.size()); List bigStorageCageDetailsList = bigStorageCageDetailsMapper.selectList(BigStorageCageDetailsWrapper); Map> listMap = bigStorageCageDetailsList.stream().collect(Collectors.groupingBy(BigStorageCageDetails::getSlot)); for (BigStorageCage bigStorageCage : bigStorageCages) { List bigStorageCageDetails = listMap.get(bigStorageCage.getSlot()); bigStorageCage.setBigStorageCageDetails(bigStorageCageDetails); } return bigStorageCages; } //笼子使用情况,界面展示用 @Override public List> selectBigStorageCageUsage() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.select("device_id") .select("ROUND(1 - SUM(CASE WHEN remain_width = 5000 THEN 1 ELSE 0 END) / COUNT(device_id), 2) AS percentage") .select("COUNT(device_id) - SUM(CASE WHEN remain_width = 5000 THEN 1 ELSE 0 END) AS count") .groupBy("device_id"); List> bigStorageCageUsages=baseMapper.selectMaps(wrapper); return bigStorageCageUsages; } //判断笼子剩余宽度是否足够 @Override public boolean selectWidthSufficient(BigStorageCageDetails layoutSlotInfo,double width) { LambdaQueryWrapper BigStorageCageWrapper = new LambdaQueryWrapper<>(); BigStorageCageWrapper.eq(BigStorageCage::getSlot,layoutSlotInfo.getSlot()); BigStorageCage bigStorageCage=baseMapper.selectOne(BigStorageCageWrapper); if(bigStorageCage.getRemainWidth()>width){ return true; }else{ return false; } } }