自动化立体仓库 - WMS系统
pang.jiabao
8 天以前 8407e277e156a55fee38e7bb7b8930ec16a15f0e
src/main/java/com/zy/common/service/CommonService.java
@@ -7,6 +7,7 @@
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.result.FindLocNoAttributeVo;
import com.zy.asrs.mapper.LocMastMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.Utils;
import com.zy.asrs.utils.VersionUtils;
@@ -18,7 +19,9 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
 * 货架核心功能
@@ -1024,4 +1027,127 @@
        }
    }
    @Resource
    private LocMastMapper locMastMapper;
    public StartupDto getLocNoNew(int ioType, Integer sourceStaNo, Integer locType, List<Integer> rows, int sortRole) {
        // 寻找到的库位
        LocMast locMast = null;
        // 可用堆垛机
        List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>().eq("crn_sts", 3).eq("crn_err", 0).eq("in_enable","Y"));
        if (basCrnps.size() == 0) {
            log.error("入库请求库位失败,没有联机堆垛机或堆垛机异常");
            throw new CoolException("入库请求库位失败,没有联机堆垛机或堆垛机异常");
        }
        // 一次查所有堆垛机任务数(group by)
        List<Map<String, Object>> countList = locMastMapper.selectMaps(
                new EntityWrapper<LocMast>()
                        .setSqlSelect("crn_no, COUNT(*) AS cnt")
                        .eq("loc_sts", "S")
                        .in("crn_no", basCrnps.stream().map(BasCrnp::getCrnNo).collect(Collectors.toList()))
                        .groupBy("crn_no")
        );
        // 堆垛机对应任务数
        Map<Integer, Integer> countMap = countList.stream()
                .collect(Collectors.toMap(
                        m -> (Integer) m.get("crn_no"),
                        m -> ((Number) m.get("cnt")).intValue()
                ));
        Wrapper<LocMast> wrapper = new EntityWrapper<LocMast>()
                .eq("loc_type1", locType)
                .eq("loc_sts", 'O')
                .in("crn_no", basCrnps.stream().map(BasCrnp::getCrnNo).collect(Collectors.toList()));
        if(sortRole == 0) {
            wrapper.last("ORDER BY CASE WHEN row1 IN (1,4,5,8,9,12) THEN 0 ELSE 1 END, lev1, bay1, row1");
        } else {
            wrapper.last("ORDER BY CASE WHEN row1 IN (1,4,5,8,9,12) THEN 0 ELSE 1 END, lev1, bay1 desc, row1");
        }
        // 所有满足条件的库位
        List<LocMast> allLocs = locMastMapper.selectList(wrapper);
        // 按堆垛机分组
        Map<Integer, List<LocMast>> locMap = allLocs.stream()
                .collect(Collectors.groupingBy(LocMast::getCrnNo));
        // 堆垛机对应库位类型的剩余库位数大于4个的堆垛机保留
        List<BasCrnp> availableCrn = basCrnps.stream()
                .filter(c -> locMap.containsKey(c.getCrnNo()) && locMap.get(c.getCrnNo()).size() > 4)
                .collect(Collectors.toList());
        if (availableCrn.isEmpty()) {
            // 递归兼容
            if (locType >= 3) return null;
            return getLocNoNew(ioType, sourceStaNo, locType + 1, rows, sortRole);
        }
        availableCrn.sort(Comparator.comparing(c -> countMap.getOrDefault(c.getCrnNo(), 0)));
        for (BasCrnp crnp : availableCrn) {
            List<LocMast> locs = locMap.get(crnp.getCrnNo());
            if (locs == null || locs.isEmpty()) {
                continue;
            }
            Map<String, LocMast> locNoMap = locs.stream()
                    .collect(Collectors.toMap(LocMast::getLocNo, e -> e));
            for(LocMast locMast1: locs) {
                String locNo = locMast1.getLocNo();
                // 是深库位
                if(Utils.isDeepLoc(slaveProperties,locMast1.getLocNo())){
                    // 获取浅库位
                    String shallowLoc = Utils.getShallowLoc(slaveProperties, locNo);
                    LocMast shallow = locNoMap.get(shallowLoc);
                    // 浅库位是空库位,放深库位
                    if (shallow != null) {
                        locMast = locMast1;
                        break;
                    }
                } else { // 是浅库位,判断深库位是否为空,是则放,不是则跳过
                    // 获取深库位
                    String deepLoc = Utils.getDeepLoc(slaveProperties, locNo);
                    LocMast deep = locNoMap.get(deepLoc);
                    // 深库位不空放深库位
                    if (deep != null) {
                        locMast = deep;
                        break;
                    } else {
                        locMast = locMast1;
                        break;
                    }
                }
            }
            if (locMast != null) {
                break;
            }
        }
        if (locMast == null) {
            if (locType >= 3) return null;
            return getLocNoNew(ioType, sourceStaNo, locType + 1, rows, sortRole);
        }
        // 根据入库类型和源站点获取工作路径
        StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>().eq("type_no", ioType).eq("stn_no", sourceStaNo).eq("crn_no",locMast.getCrnNo()));
        if (staDesc == null) {
            log.error("获取工作路径异常,类型:{},源站点:{},库位:{}",ioType,sourceStaNo,locMast.getLocNo());
            throw new CoolException("获取工作路径异常");
        }
        // 生成工作号
        int workNo = getWorkNo(0);
        // 返回dto
        StartupDto startupDto = new StartupDto();
        startupDto.setWorkNo(workNo);
        startupDto.setCrnNo(locMast.getCrnNo());
        startupDto.setSourceStaNo(sourceStaNo);
        startupDto.setStaNo(staDesc.getCrnStn());
        startupDto.setLocNo(locMast.getLocNo());
        startupDto.setTaskPri(13D);
        return startupDto;
    }
}