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.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.yulichang.base.MPJBaseServiceImpl;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
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.common.config.Const;
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 MPJBaseServiceImpl 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) {
BeanUtils.copyProperties(glassInfo, bigStorageCageDetails);
//玻璃不钢化时
if(glassInfo.getTemperingLayoutId()==null){
BigStorageCage bigStorageCage=baseMapper.selectJoinOne(BigStorageCage.class, new MPJLambdaWrapper()
.selectAll(BigStorageCage.class)
.leftJoin(BigStorageCageDetails.class, on -> on
.eq(BigStorageCage::getDeviceId, BigStorageCageDetails::getDeviceId)
.eq(BigStorageCage::getSlot, BigStorageCageDetails::getSlot))
.isNull(BigStorageCageDetails::getTemperingLayoutId)
.gt(BigStorageCage::getRemainWidth, 2000)
.orderByAsc(BigStorageCage::getDeviceId, BigStorageCage::getSlot)
.last("limit 1")
);
if(bigStorageCage.getSlot()!=null){
bigStorageCageDetails.setSlot(bigStorageCage.getSlot());
bigStorageCageDetails.setDeviceId(bigStorageCage.getDeviceId());
}
}else{
//玻璃钢化时
BigStorageCage bigStorageCage=new BigStorageCage();
bigStorageCage=baseMapper.selectJoinOne(BigStorageCage.class, new MPJLambdaWrapper()
.selectAll(BigStorageCage.class)
.leftJoin(BigStorageCageDetails.class, on -> on
.eq(BigStorageCage::getDeviceId, BigStorageCageDetails::getDeviceId)
.eq(BigStorageCage::getSlot, BigStorageCageDetails::getSlot))
.eq(BigStorageCageDetails::getTemperingLayoutId, glassInfo.getTemperingLayoutId())
.eq(BigStorageCageDetails::getTemperingFeedSequence, glassInfo.getTemperingFeedSequence() - 1)
.gt(BigStorageCage::getRemainWidth, glassInfo.getWidth())
);
log.info("1、查询理片笼内片序-1等于当前玻璃片序的玻璃"+bigStorageCage);
log.info("2、查询理片笼内片序-1等于当前玻璃片序的玻璃的结果不为空时"+bigStorageCage.getSlot());
if (bigStorageCage.getSlot() != null) {
bigStorageCageDetails.setSlot(bigStorageCage.getSlot());
bigStorageCageDetails.setDeviceId(bigStorageCage.getDeviceId());
} else {
log.info("3、查询理片笼内片序-1等于当前玻璃片序的玻璃的结果为空时获取当前玻璃版图id是否存在理片笼内");
bigStorageCage=baseMapper.selectJoinOne(BigStorageCage.class, new MPJLambdaWrapper()
.selectAll(BigStorageCage.class)
.leftJoin(BigStorageCageDetails.class, on -> on
.eq(BigStorageCage::getDeviceId, BigStorageCageDetails::getDeviceId)
.eq(BigStorageCage::getSlot, BigStorageCageDetails::getSlot))
.eq(BigStorageCageDetails::getTemperingLayoutId, glassInfo.getTemperingLayoutId())
.gt(BigStorageCage::getRemainWidth, glassInfo.getWidth())
);
if(bigStorageCage != null){
log.info("4、获取笼子内适合的格子");
BigStorageCage bigStorageCages=bigStorageCageSlot(bigStorageCage.getDeviceId());
bigStorageCageDetails.setSlot(bigStorageCages.getSlot());
bigStorageCageDetails.setDeviceId(bigStorageCages.getDeviceId());
}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