package com.mes.downstorage.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.mes.common.config.Const;
import com.mes.downglassinfo.entity.DownGlassTask;
import com.mes.downglassinfo.service.DownGlassTaskService;
import com.mes.downstorage.entity.DownStorageCage;
import com.mes.downstorage.entity.DownStorageCageDetails;
import com.mes.downstorage.mapper.DownStorageCageDetailsMapper;
import com.mes.downstorage.mapper.DownStorageCageMapper;
import com.mes.downstorage.service.DownStorageCageDetailsService;
import com.mes.downstorage.service.DownStorageCageService;
import com.mes.glassinfo.entity.GlassInfo;
import com.mes.glassinfo.service.GlassInfoService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
*
* 服务实现类
*
*
* @author zhoush
* @since 2024-03-27
*/
@Slf4j
@Service
public class DownStorageCageServiceImpl extends ServiceImpl implements DownStorageCageService {
@Autowired(required = false)
private DownStorageCageMapper downStorageCageMapper;
@Autowired
private GlassInfoService glassInfoService;
@Autowired
private DownGlassTaskService downGlassTaskService;
@Autowired
private DownStorageCageDetailsService downStorageCageDetailsService;
@Autowired
private DownStorageCageDetailsMapper downStorageCageDetailsMapper;
@Override
public DownGlassTask createDownGlassTask(GlassInfo glassInfo, String startCell, String endCell, String taskType) {
DownGlassTask downGlassTask = new DownGlassTask();
BeanUtils.copyProperties(glassInfo, downGlassTask);
downGlassTask.setStartCell(startCell);
downGlassTask.setTaskType(taskType);
downGlassTask.setEndCell(endCell);
return downGlassTask;
}
@Override
public DownGlassTask createDownGlassTask(DownStorageCageDetails glassInfo, String startCell, String endCell, String taskType) {
DownGlassTask downGlassTask = new DownGlassTask();
BeanUtils.copyProperties(glassInfo, downGlassTask);
downGlassTask.setStartCell(startCell);
downGlassTask.setTaskType(taskType);
downGlassTask.setEndCell(endCell);
return downGlassTask;
}
//找到空格子
@Override
public List selectCacheEmpty() {
return this.selectJoinList(DownStorageCageDetails.class,
JoinWrappers.lambda(DownStorageCage.class)
.selectAll(DownStorageCage.class)
.leftJoin(DownStorageCageDetails.class, on -> on
.eq(DownStorageCageDetails::getDeviceId, DownStorageCage::getDeviceId)
.eq(DownStorageCageDetails::getSlot, DownStorageCage::getSlot)
.eq(DownStorageCageDetails::getState, Const.GLASS_STATE_IN))
.isNull(DownStorageCageDetails::getSlot)
);
}
//找到空格子
@Override
public DownStorageCage selectCacheEmpty(int currentSlot, boolean flag) {
List emptyList = this.selectJoinList(DownStorageCage.class,
JoinWrappers.lambda(DownStorageCage.class)
.selectAll(DownStorageCage.class)
.leftJoin(DownStorageCageDetails.class, on -> on
.eq(DownStorageCageDetails::getDeviceId, DownStorageCage::getDeviceId)
.eq(DownStorageCageDetails::getSlot, DownStorageCage::getSlot)
.eq(DownStorageCageDetails::getState, Const.GLASS_STATE_IN))
.isNull(DownStorageCageDetails::getSlot)
.last("order by abs(t.slot - " + currentSlot + ") asc limit 2")
);
if (flag && CollectionUtil.isNotEmpty(emptyList)) {
return emptyList.get(0);
}
if (CollectionUtil.isEmpty(emptyList) || emptyList.size() == 1) {
return null;
}
return emptyList.get(0);
}
@Override
public List selectCacheMax() {
return baseMapper.selectJoinList(DownStorageCageDetails.class,
JoinWrappers.lambda(DownStorageCage.class)
// 添加 DownStorageCage 的 enableState 为 1 的条件
.select(DownStorageCageDetails::getFlowCardId)
.leftJoin(DownStorageCageDetails.class, on -> on
.eq(DownStorageCageDetails::getDeviceId, DownStorageCage::getDeviceId)
.eq(DownStorageCageDetails::getSlot, DownStorageCage::getSlot)
.eq(DownStorageCageDetails::getState, Const.GLASS_STATE_IN))
.isNull(DownStorageCageDetails::getSlot)
.eq(DownStorageCage::getEnableState, 1)
.groupBy(DownStorageCageDetails::getFlowCardId) // 根据 flowCardId 分组
// 使用子查询和排序来获取相同 FlowCardId 中的最多记录
.having("count(*) = (select max(cnt) from (select count(*) as cnt from down_storage_cage_details group by flow_card_id) as temp)")
);
}
@Override
public List