ZengTao
2024-05-30 9247ea3d414c528ff2210c4b1ccdb38741f52101
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageServiceImpl.java
@@ -1,20 +1,30 @@
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.uppattenusage.entity.GlassInfo;
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;
/**
 * <p>
@@ -27,72 +37,199 @@
@Service
@Slf4j
public class BigStorageCageServiceImpl extends ServiceImpl<BigStorageCageMapper, BigStorageCage> 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) {
    public BigStorageCageDetails feedGlass(GlassInfo glassInfo, BigStorageCageDetails bigStorageCageDetails) {
        LambdaQueryWrapper<BigStorageCageDetails> 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);
        //获取同钢化版图id可进片的格子
        BigStorageCageDetails layoutSlotInfo = bigStorageCageMapper.SelectTemperingFeedSlot(glassInfo);
        //有符合条件的格子时
        if (layoutSlotInfo != null) {
            //将玻璃信息填入理片笼详情表
        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<BigStorageCageDetails> bigStorageCageDetailslambdaQueryWrapper = new LambdaQueryWrapper<>();
            bigStorageCageDetailslambdaQueryWrapper
                    .select(BigStorageCageDetails::getTemperingLayoutId);
            layoutSlotInfo = bigStorageCageDetailsMapper.selectOne(bigStorageCageDetailslambdaQueryWrapper);
            //获取可进片格子信息
            BigStorageCageDetails EmptySlotInfo = bigStorageCageMapper.SelectEmptyFeedSlot();
            if (EmptySlotInfo != null) {
                bigStorageCageDetails.setSlot(EmptySlotInfo.getSlot());
            } else {
                //获取其他笼格子-
                BigStorageCageDetails OtherSlotInfo = bigStorageCageMapper.SelectOtherFeedSlot();
                bigStorageCageDetails.setSlot(OtherSlotInfo.getSlot());
            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<BigStorageCageDetails> 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<Map<String, Object>> bigStorageCageDetailsCount= bigStorageCageDetailsMapper.selectMaps(queryWrapper);
                log.info("5、查询笼子内是否有合适的格子");
                boolean found=false;
                for (Map<String, Object> map : bigStorageCageDetailsCount) {
                    for (Map.Entry<String, Object> 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;
                    }
                }
            }
            //将玻璃信息放入该格子
        }
        updateRemainWidth(bigStorageCageDetails.getSlot());
        if (bigStorageCageDetails.getSlot() != null) {
            log.info("6、当找到合适的格子时添加玻璃到笼子表");
            bigStorageCageDetails.setState(0);
            bigStorageCageDetailsMapper.insert(bigStorageCageDetails);
            updateRemainWidth(bigStorageCageDetails.getSlot()) ;
        }
        return bigStorageCageDetails;
    }
    //获取笼子内的空格子
    private BigStorageCage bigStorageCageSlot(Integer deviceId) {
        LambdaQueryWrapper<BigStorageCage> 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 List<BigStorageCage> querybigStorageCageDetail() {
        //1、获取大理片笼信息
//        List<BigStorageCage> bigStorageCages = bigStorageCageMapper.querybigStorageCageDetail(null);
        List<BigStorageCage> bigStorageCages = bigStorageCageMapper.selectList(null);
    public boolean outGlass() {
        LambdaQueryWrapper<TemperingGlassInfo> temperingGlassInfoWrapper=new LambdaQueryWrapper<>();
        temperingGlassInfoWrapper.eq(TemperingGlassInfo::getState,-1);
        List<TemperingGlassInfo> 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<BigStorageCageDetails> bigStorageCageDetailslambdaQueryWrapper = new LambdaQueryWrapper<>();
            bigStorageCageDetailslambdaQueryWrapper
                    .select(BigStorageCageDetails::getTemperingLayoutId)
                    .groupBy(BigStorageCageDetails::getTemperingLayoutId);
            List<Map<String, Object>> temperingLayoutIdList = bigStorageCageDetailsMapper.selectMaps(bigStorageCageDetailslambdaQueryWrapper);
            for (Map<String, Object> map : temperingLayoutIdList) {
                for (Map.Entry<String, Object> 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<GlassInfo> glassInfoWrapper=new LambdaQueryWrapper<>();
                        glassInfoWrapper.select(GlassInfo::getTemperingLayoutId)
                                .orderByDesc(GlassInfo::getTemperingFeedSequence);
                        List<GlassInfo> 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<BigStorageCageDetails> 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<BigStorageCage> bigStorageCageWrapper = new UpdateWrapper<>();
        bigStorageCageWrapper.eq("remain_width", width);
        bigStorageCageMapper.update(bigStorageCage, bigStorageCageWrapper);
    }
    //查询大理片信息,前端展示用
    @Override
    public List<BigStorageCage> querybigStorageCageDetail(int deviceId) {
        LambdaQueryWrapper<BigStorageCage> BigStorageCageWrapper =new LambdaQueryWrapper<>();
        BigStorageCageWrapper.eq(BigStorageCage::getSlot,deviceId);
        LambdaQueryWrapper<BigStorageCageDetails> BigStorageCageDetailsWrapper =new LambdaQueryWrapper<>();
        BigStorageCageDetailsWrapper.eq(BigStorageCageDetails::getSlot,deviceId);
        List<BigStorageCage> bigStorageCages = bigStorageCageMapper.selectList(BigStorageCageWrapper);
        log.info("1、获取大理片笼信息完成,获取到的数据{}", bigStorageCages.size());
        //2获取理片笼所有信息
        List<BigStorageCageDetails> bigStorageCageDetailsList = bigStorageCageDetailsMapper.selectList(null);
        List<BigStorageCageDetails> bigStorageCageDetailsList = bigStorageCageDetailsMapper.selectList(BigStorageCageDetailsWrapper);
        Map<Integer, List<BigStorageCageDetails>> listMap = bigStorageCageDetailsList.stream().collect(Collectors.groupingBy(BigStorageCageDetails::getSlot));
        for (BigStorageCage bigStorageCage : bigStorageCages) {
            List<BigStorageCageDetails> bigStorageCageDetails = listMap.get(bigStorageCage.getSlot());
            bigStorageCage.setBigStorageCageDetails(bigStorageCageDetails);
        }
        return bigStorageCages;
    }
    //修改格子剩余宽度
    //笼子使用情况,界面展示用
    @Override
    public void updateRemainWidth(int Slot) {
        //获取该格子内玻璃信息
        int width = 5000;
        List<BigStorageCageDetails> bigStorageCageDetailsList = Collections.singletonList(bigStorageCageDetailsMapper.selectById(Slot));
        for (BigStorageCageDetails bigStorageCageDetails : bigStorageCageDetailsList
        ) {
            width -= Integer.parseInt(bigStorageCageDetails.getWidth().toString()) + bigStorageCageDetails.getGap();
        }
        //修改格子剩余宽度
        bigStorageCageMapper.UpdateRemainWidth(Slot, width);
    public List<Map<String, Object>> selectBigStorageCageUsage() {
        QueryWrapper<BigStorageCage> 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<Map<String, Object>> bigStorageCageUsages=baseMapper.selectMaps(wrapper);
        return bigStorageCageUsages;
    }
    //判断笼子剩余宽度是否足够
    @Override
    public boolean selectWidthSufficient(BigStorageCageDetails layoutSlotInfo,double width) {
        LambdaQueryWrapper<BigStorageCage> BigStorageCageWrapper = new LambdaQueryWrapper<>();
        BigStorageCageWrapper.eq(BigStorageCage::getSlot,layoutSlotInfo.getSlot());
        BigStorageCage bigStorageCage=baseMapper.selectOne(BigStorageCageWrapper);
        if(bigStorageCage.getRemainWidth()>width){
            return true;
        }else{
            return false;
        }
    }
}