#
xjj
2024-02-27 1b576a30a84b8b57f5b7d7a22424f9fc08d08516
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/CommonService.java
@@ -1,8 +1,12 @@
package com.zy.asrs.common.wms.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zy.asrs.common.domain.dto.LocRangeDto;
import com.zy.asrs.common.domain.dto.LocTypeDto;
import com.zy.asrs.common.domain.dto.StartupDto;
import com.zy.asrs.common.domain.entity.StaDesc;
import com.zy.asrs.common.sys.service.StaDescService;
import com.zy.asrs.common.utils.VersionUtils;
import com.zy.asrs.common.wms.entity.*;
import com.zy.asrs.framework.common.Cools;
import com.zy.asrs.framework.exception.CoolException;
@@ -35,6 +39,8 @@
    private LocMastService locMastService;
    @Autowired
    private LocDetlService locDetlService;
    @Autowired
    private LocRuleService locRuleService;
    /**
     * 生成工作号
@@ -43,7 +49,7 @@
     * @return workNo(工作号)
     */
    public int getWorkNo(Integer wrkMk) {
        WrkLastno wrkLastno = wrkLastnoService.getById(wrkMk);
        WrkLastno wrkLastno = wrkLastnoService.getOne(new LambdaQueryWrapper<WrkLastno>().eq(WrkLastno::getWrkMk, wrkMk));
        if (Cools.isEmpty(wrkLastno)) {
            throw new CoolException("数据异常,请联系管理员");
        }
@@ -78,41 +84,35 @@
    /**
     * 检索库位号
     *
     * @param whsType     类型 1:双深式货架
     * @param staDescId   路径ID
     * @param sourceStaNo 源站
     * @param matnr       物料号集合
     * @return locNo 检索到的库位号
     */
    @Transactional
    public StartupDto getLocNo(Integer whsType, Integer staDescId, Integer sourceStaNo, Integer moveCrnNo, LocTypeDto locTypeDto, int times) {
    public StartupDto getLocNo(Integer staDescId, Integer sourceStaNo, List<String> matnrs, String batch, Long hostId, LocTypeDto locTypeDto, int times) {
        // 目标库位
        LocMast locMast = null;
        // 靠近摆放规则 --- 空托
        locMast = getLocNoStep4(staDescId, locTypeDto, sourceStaNo);
        locMast = getLocNoEmptyPakIn(staDescId, locTypeDto, sourceStaNo, hostId);
        if (locMast != null) {
            //找到库位,返回dto
            return getLocNoStep6(staDescId, sourceStaNo, locMast);//返回dto
        }
//        //库位规则
//        locMast = getLocNoStepRule(matnr, locTypeDto, staDescId, sourceStaNo);
//        if (locMast != null) {
//            //找到库位,返回dto
//            return getLocNoStep6(staDescId, sourceStaNo, locMast);//返回dto
//        }
        //库位规则
        locMast = getLocNoStepRule(matnrs, batch, locTypeDto, hostId);
        if (locMast != null) {
            //找到库位,返回dto
            return getLocNoStep6(staDescId, sourceStaNo, locMast);//返回dto
        }
//        // 靠近摆放规则 --- 相同订单号, 同天同规格物料
//        locMast = getLocNoStep3(staDescId, matnr, batch, grade, locTypeDto, sourceStaNo);
//        if (locMast != null) {
//            //找到库位,返回dto
//            return getLocNoStep6(staDescId, sourceStaNo, locMast);//返回dto
//        }
        // 靠近摆放规则 --- 相同订单号, 同天同规格物料
        locMast = getLocNoNearPlace(staDescId, matnrs, batch, locTypeDto, sourceStaNo, hostId);
        if (locMast != null) {
            //找到库位,返回dto
            return getLocNoStep6(staDescId, sourceStaNo, locMast);//返回dto
        }
        //搜索整个空库位组
        locMast = getLocNoStepSingle(locTypeDto, staDescId, sourceStaNo);
        locMast = getLocNoStepSingle(locTypeDto, staDescId, sourceStaNo, hostId);
        if (locMast != null) {
            //找到库位,返回dto
            return getLocNoStep6(staDescId, sourceStaNo, locMast);//返回dto
@@ -122,121 +122,138 @@
        throw new CoolException("没有空库位");
    }
//    /**
//     * 库位规则
//     */
//    private LocMast getLocNoStepRule(String matnr, LocTypeDto locTypeDto, Integer staDescId, Integer sourceStaNo) {
//        LocMast locMast = null;
//
//        // 库区锁定
//        List<LocRule> locRules = locRuleService.find(matnr);
//        if (locRules == null || locRules.isEmpty()) {
//            return null;//没有库位规则,跳出当前任务
//        }
//
//        // 获取目标站
//        Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
//                .eq("type_no", staDescId)
//                .eq("stn_no", sourceStaNo);
//        StaDesc staDesc = staDescService.selectOne(wrapper);
//        if (staDesc == null) {
//            throw new CoolException("入库路径不存在");
//        }
//
//        for (LocRule locRule : locRules) {
//            if (locRule == null) {
//                continue;
//            }
//
//            List<LocMast> locMasts = locMastService.queryFreeLocMast2(locTypeDto.getLocType1(), locRule.getRowBeg(), locRule.getRowEnd(), locRule.getBayBeg(), locRule.getBayEnd(), locRule.getLevBeg(), locRule.getLevEnd(), staDesc.getCrnNo());
//            for (LocMast locMast0 : locMasts) {
//                //预留空库位
//                if (locMastService.checkEmptyCount(locMast0, 10)) {
//                    return locMast0;
//                }
//            }
//        }
//
//        if (locRules.get(0).getKeepGo() == 0) {
//            //找不到空库位,且禁止继续寻找其他非混载区域库位
//            //找不到库位,抛出异常
//            throw new CoolException("规则区域没有空库位");
//        }
//
//        return locMast;
//    }
    /**
     * 库位规则
     */
    private LocMast getLocNoStepRule(List<String> matnrs, String batch, LocTypeDto locTypeDto, Long hostId) {
        if (matnrs.size() != 1) {
            return null;
        }
        String matnr = matnrs.get(0);
        LambdaQueryWrapper<LocRule> wrapper = new LambdaQueryWrapper<LocRule>()
                .eq(LocRule::getHostId, hostId)
                .eq(LocRule::getMatnr, matnr);
        if (batch != null) {
            wrapper.eq(LocRule::getBatch, batch);
        }
        List<LocRule> locRules = locRuleService.list(wrapper);
        if (locRules == null || locRules.isEmpty()) {
            return null;//没有库位规则,跳出当前任务
        }
//    // 靠近摆放规则 --- 相同订单号, 同天同规格物料
//    private LocMast getLocNoStep3(Integer staDescId, String matnr, String batch, String grade, LocTypeDto locTypeDto, Integer sourceStaNo) {
//        LocMast locMast = null;
//        if (staDescId == 1) {
//            // 获取目标站
//            Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
//                    .eq("type_no", staDescId)
//                    .eq("stn_no", sourceStaNo);
//            StaDesc staDesc = staDescService.selectOne(wrapper);
//            if (staDesc == null) {
//                throw new CoolException("入库路径不存在");
//            }
//
//            //先判断工作档,查找主档IOType=1, wrkSts < 10的工作明细,料号相同的明细库位
//            List<WrkMast> wrkMasts = wrkMastService.selectSameMatnrs(matnr, batch, grade, staDesc.getCrnNo());
//            for (WrkMast wrkMast : wrkMasts) {
//                LocMast locMast0 = locMastService.findNearloc(wrkMast.getLocNo());
//                if (null != locMast0) {
//                    // 浅库位符合尺寸检测
//                    if (VersionUtils.checkLocType(locMast0, locTypeDto)) {
//                        locMast = locMast0;
//                    }
//                }
//            }
//            if (Cools.isEmpty(locMast)) {
//                //再判断库存明细档,料号相同的明细库位
//                List<String> locNos = locDetlService.getSameDetl(matnr, batch, grade, staDesc.getCrnNo());
//                for (String locNo : locNos) {
//                    LocMast locMast0 = locMastService.findNearloc(locNo);
//                    if (null != locMast0) {
//                        // 浅库位符合尺寸检测
//                        if (VersionUtils.checkLocType(locMast0, locTypeDto)) {
//                            locMast = locMast0;
//                            break;
//                        }
//                    }
//                }
//            }
//        }
//
//        return locMast;
//    }
        for (LocRule locRule : locRules) {
            if (locRule == null) {
                continue;
            }
            List<LocMast> locMasts = locMastService.queryFreeLocMast2(locTypeDto.getLocType1(), locRule.getRowBeg(), locRule.getRowEnd(), locRule.getBayBeg(), locRule.getBayEnd(), locRule.getLevBeg(), locRule.getLevEnd(), hostId);
            for (LocMast locMast0 : locMasts) {
                //预留空库位
                if (locMastService.checkEmptyCount(locMast0, 10, hostId)) {
                    return locMast0;
                }
            }
        }
        if (locRules.get(0).getKeepGo() == 0) {
            //找不到空库位,且禁止继续寻找其他非混载区域库位
            //找不到库位,抛出异常
            throw new CoolException("规则区域没有空库位");
        }
        return null;
    }
    // 靠近摆放规则 --- 相同订单号, 同天同规格物料
    private LocMast getLocNoNearPlace(Integer staDescId, List<String> matnrs, String batch, LocTypeDto locTypeDto, Integer sourceStaNo, Long hostId) {
        LocMast locMast = null;
        if (staDescId == 1) {
            // 获取目标站
            LambdaQueryWrapper<StaDesc> wrapper = new LambdaQueryWrapper<StaDesc>()
                    .eq(StaDesc::getTypeNo, staDescId)
                    .eq(StaDesc::getStnNo, sourceStaNo)
                    .eq(StaDesc::getHostId, hostId);
            StaDesc staDesc = staDescService.getOne(wrapper);
            if (staDesc == null) {
                throw new CoolException("入库路径不存在");
            }
            String matnr = matnrs.get(0);
            //库位搜索范围
            LocRangeDto locRangeDto = locTypeDto.getLocRangeDto();
            //先判断工作档,查找主档IOType=1, wrkSts < 10的工作明细,料号相同的明细库位
            List<WrkMast> wrkMasts = wrkMastService.selectSameMatnrs(matnr, batch, locTypeDto.getLocRangeDto(), hostId);
            for (WrkMast wrkMast : wrkMasts) {
                LocMast locMast0 = locMastService.findNearloc(wrkMast.getLocNo(), hostId, locRangeDto);
                if (null != locMast0) {
                    // 浅库位符合尺寸检测
                    if (VersionUtils.checkLocType(locMast0, locTypeDto)) {
                        locMast = locMast0;
                    }
                }
            }
            if (Cools.isEmpty(locMast)) {
                //再判断库存明细档,料号相同的明细库位
                List<String> locNos = locDetlService.getSameDetl(matnr, batch, hostId);
                for (String locNo : locNos) {
                    LocMast locMast0 = locMastService.findNearloc(locNo, hostId, locRangeDto);
                    if (null != locMast0) {
                        // 浅库位符合尺寸检测
                        if (VersionUtils.checkLocType(locMast0, locTypeDto)) {
                            locMast = locMast0;
                            break;
                        }
                    }
                }
            }
        }
        return locMast;
    }
    // 靠近摆放规则 --- 空托
    private LocMast getLocNoStep4(Integer staDescId, LocTypeDto locTypeDto, Integer sourceStaNo) {
    private LocMast getLocNoEmptyPakIn(Integer staDescId, LocTypeDto locTypeDto, Integer sourceStaNo, Long hostId) {
        LocMast locMast = null;
        // 靠近摆放规则 --- 空托
        if (staDescId == 10) {
            // 获取目标站
            LambdaQueryWrapper<StaDesc> wrapper = new LambdaQueryWrapper<StaDesc>()
                    .eq(StaDesc::getTypeNo, staDescId)
                    .eq(StaDesc::getStnNo, sourceStaNo);
                    .eq(StaDesc::getStnNo, sourceStaNo)
                    .eq(StaDesc::getHostId,hostId);
            StaDesc staDesc = staDescService.getOne(wrapper);
            if (staDesc == null) {
                throw new CoolException("入库路径不存在");
            }
            List<LocMast> locMasts = locMastService.list(new LambdaQueryWrapper<LocMast>()
            LambdaQueryWrapper<LocMast> wrapper1 = new LambdaQueryWrapper<LocMast>()
                    .eq(LocMast::getLocSts, "O")
                    .eq(LocMast::getLocType1, 1)
                    .eq(LocMast::getCrnNo, staDesc.getCrnNo())
                    .orderByAsc(LocMast::getLev1, LocMast::getBay1, LocMast::getRow1));
                    .eq(LocMast::getCrnNo, staDesc.getDeviceNo())
                    .eq(LocMast::getHostId, hostId)
                    .orderByAsc(LocMast::getLev1, LocMast::getBay1, LocMast::getRow1);
            //库位搜索范围
            LocRangeDto locRangeDto = locTypeDto.getLocRangeDto();
            if (locRangeDto != null) {
                wrapper1.ge(LocMast::getRow1, locRangeDto.getStartRow());
                wrapper1.le(LocMast::getRow1, locRangeDto.getTargetRow());
                wrapper1.ge(LocMast::getBay1, locRangeDto.getStartBay());
                wrapper1.le(LocMast::getBay1, locRangeDto.getTargetBay());
                wrapper1.ge(LocMast::getLev1, locRangeDto.getStartLev());
                wrapper1.le(LocMast::getLev1, locRangeDto.getTargetLev());
            }
            List<LocMast> locMasts = locMastService.list(wrapper1);
            if (!locMasts.isEmpty()) {
                for (LocMast loc : locMasts) {
//                    LocMast locMast0 = locMastService.findNearloc(loc.getLocNo());
//                    if (null != locMast0) {
//                        locMast = locMast0;
//                        break;
//                    }
                    locMast = loc;
                    break;
                    LocMast locMast0 = locMastService.findNearloc(loc.getLocNo(), hostId, locRangeDto);
                    if (null != locMast0) {
                        locMast = locMast0;
                        break;
                    }
                }
            }
@@ -248,28 +265,38 @@
    }
    // 搜索单品(整个库位组)
    private LocMast getLocNoStepSingle(LocTypeDto locTypeDto, Integer staDescId, Integer sourceStaNo) {
    private LocMast getLocNoStepSingle(LocTypeDto locTypeDto, Integer staDescId, Integer sourceStaNo, Long hostId) {
        LocMast locMast = null;
        // 获取目标站
        LambdaQueryWrapper<StaDesc> wrapper = new LambdaQueryWrapper<StaDesc>()
                .eq(StaDesc::getTypeNo, staDescId)
                .eq(StaDesc::getStnNo, sourceStaNo);
                .eq(StaDesc::getStnNo, sourceStaNo)
                .eq(StaDesc::getHostId, hostId);
        StaDesc staDesc = staDescService.getOne(wrapper);
        if (staDesc == null) {
            throw new CoolException("入库路径不存在");
        }
        List<LocMast> locMasts = locMastService.list(new LambdaQueryWrapper<LocMast>().eq(LocMast::getLocSts, "O"));//搜索货物
        if (locMasts == null) {
            return null;
        LambdaQueryWrapper<LocMast> wrapper1 = new LambdaQueryWrapper<LocMast>()
                .eq(LocMast::getLocSts, "O")
                .eq(LocMast::getHostId, hostId);
        //库位搜索范围
        LocRangeDto locRangeDto = locTypeDto.getLocRangeDto();
        if (locRangeDto != null) {
            wrapper1.ge(LocMast::getRow1, locRangeDto.getStartRow());
            wrapper1.le(LocMast::getRow1, locRangeDto.getTargetRow());
            wrapper1.ge(LocMast::getBay1, locRangeDto.getStartBay());
            wrapper1.le(LocMast::getBay1, locRangeDto.getTargetBay());
            wrapper1.ge(LocMast::getLev1, locRangeDto.getStartLev());
            wrapper1.le(LocMast::getLev1, locRangeDto.getTargetLev());
        }
        List<LocMast> locMasts = locMastService.list(wrapper1);//搜索货物
        for (LocMast mast : locMasts) {
            locMast = mast;
            break;
            if (VersionUtils.checkLocType(mast, locTypeDto)) {
                locMast = mast;
                break;
            }
        }
        return locMast;
    }
@@ -279,8 +306,7 @@
        // 获取目标站
        LambdaQueryWrapper<StaDesc> wrapper = new LambdaQueryWrapper<StaDesc>()
                .eq(StaDesc::getTypeNo, staDescId)
                .eq(StaDesc::getStnNo, sourceStaNo)
                .eq(StaDesc::getCrnNo,locMast.getCrnNo());
                .eq(StaDesc::getStnNo, sourceStaNo);
        StaDesc staDesc = staDescService.getOne(wrapper);
        if (Cools.isEmpty(staDesc)) {
            log.error("入库路径不存在, staDescId={}, sourceStaNo={}", staDescId, sourceStaNo);
@@ -288,9 +314,9 @@
        }
        // 检测目标站
        BasDevp staNo = basDevpService.getById(staDesc.getCrnStn());
        BasDevp staNo = basDevpService.getById(staDesc.getDeviceStn());
        if (!staNo.getAutoing().equals("Y")) {
            throw new CoolException("目标站" + staDesc.getCrnStn() + "不可用");
            throw new CoolException("目标站" + staDesc.getDeviceStn() + "不可用");
        }
        // 生成工作号
@@ -300,7 +326,6 @@
        startupDto.setSourceStaNo(sourceStaNo);
        startupDto.setStaNo(staNo.getDevNo());
        startupDto.setLocNo(locMast.getLocNo());
        startupDto.setCrnNo(staDesc.getCrnNo());
        return startupDto;
    }
}