#
Junjie
2023-12-28 a773bdb50cee323e17a2f07c46bcab3906af60f8
#
1个文件已修改
466 ■■■■■ 已修改文件
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/CommonService.java 466 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/CommonService.java
@@ -1,19 +1,16 @@
package com.zy.asrs.common.wms.service;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zy.asrs.common.domain.dto.LocTypeDto;
import com.zy.asrs.common.domain.dto.StartupDto;
import com.zy.asrs.common.wms.entity.LocMast;
import com.zy.asrs.common.wms.entity.WrkLastno;
import com.zy.asrs.common.wms.entity.WrkMast;
import com.zy.asrs.common.wms.entity.*;
import com.zy.asrs.framework.common.Cools;
import com.zy.asrs.framework.exception.CoolException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
/**
@@ -23,32 +20,6 @@
@Slf4j
@Service
public class CommonService {
    public static final List<Integer> FIRST_GROUP_ROW_LIST = new ArrayList<Integer>() {{
        add(1);
    }};
    public static final List<Integer> SECOND_GROUP_ROW_LIST = new ArrayList<Integer>() {{
        add(3);add(4);
    }};
    public static final List<Integer> THIRD_GROUP_ROW_LIST = new ArrayList<Integer>() {{
        add(6);add(7);
    }};
    public static final List<Integer> FOURTH_GROUP_ROW_LIST = new ArrayList<Integer>() {{
        add(8);
    }};
    public static final List<Integer> FIFTH_GROUP_ROW_LIST = new ArrayList<Integer>() {{
        add(10);add(11);
    }};
    public static final List<Integer> SIXTH_GROUP_ROW_LIST = new ArrayList<Integer>() {{
        add(13);add(14);add(15);add(16);
    }};
    public static final List<Integer> SEVENTH_GROUP_ROW_LIST = new ArrayList<Integer>() {{
        add(13);add(14);
    }};
    public static final List<Integer> EIGHTH_GROUP_ROW_LIST = new ArrayList<Integer>() {{
        add(16);
    }};
    @Autowired
    private WrkMastService wrkMastService;
@@ -67,7 +38,8 @@
    /**
     * 生成工作号
     * @param wrkMk 0:入出库 ; 1:其他
     *
     * @param wrkMk
     * @return workNo(工作号)
     */
    public int getWorkNo(Integer wrkMk) {
@@ -75,26 +47,25 @@
        if (Cools.isEmpty(wrkLastno)) {
            throw new CoolException("数据异常,请联系管理员");
        }
        int workNo = 0;
        // 入出库类型
        workNo = wrkLastno.getWrkNo();
        int workNo = wrkLastno.getWrkNo();
        int sNo = wrkLastno.getStartNo();
        int eNo = wrkLastno.getTargetNo();
        workNo = workNo>=eNo ? sNo : workNo+1;
        workNo = workNo >= eNo ? sNo : workNo + 1;
        while (true) {
            WrkMast wrkMast = wrkMastService.getOne(new LambdaQueryWrapper<WrkMast>().eq(WrkMast::getWrkNo, workNo));
            if (null != wrkMast) {
                workNo = workNo>=eNo ? sNo : workNo+1;
                workNo = workNo >= eNo ? sNo : workNo + 1;
            } else {
                break;
            }
        }
        if (workNo > 0){
        // 修改序号记录
        if (workNo > 0) {
            wrkLastno.setWrkNo(workNo);
            wrkLastnoService.updateById(wrkLastno);
        }
        // 检验
        if (workNo == 0) {
            throw new CoolException("生成工作号失败,请联系管理员");
        } else {
@@ -105,56 +76,47 @@
        return workNo;
    }
    public StartupDto getLocNo(Integer whsType, Integer staDescId, Integer sourceStaNo, List<String> matNos, LocTypeDto locTypeDto, int times) {
        return getLocNo(staDescId, sourceStaNo, matNos, locTypeDto, times);
    }
    /**
     * 检索库位号
     *
     * @param whsType     类型 1:双深式货架
     * @param staDescId   路径ID
     * @param sourceStaNo 源站
     * @param matNos      物料号集合
     * @param matnr       物料号集合
     * @return locNo 检索到的库位号
     */
    public StartupDto getLocNo(Integer staDescId, Integer sourceStaNo, List<String> matNos, LocTypeDto locTypeDto, int times) {
    @Transactional
    public StartupDto getLocNo(Integer whsType, Integer staDescId, Integer sourceStaNo, Integer moveCrnNo, LocTypeDto locTypeDto, int times) {
        // 目标库位
        LocMast locMast = null;
//        // 靠近摆放规则 --- 空托
//        locMast = getLocNoStep4(staDescId, locTypeDto);
//        if (locMast != null) {
//            //找到库位,返回dto
//            return getLocNoStep6(staDescId, sourceStaNo, locMast);//返回dto
//        }
        // 靠近摆放规则 --- 空托
        locMast = getLocNoStep4(staDescId, locTypeDto, sourceStaNo);
        if (locMast != null) {
            //找到库位,返回dto
            return getLocNoStep6(staDescId, sourceStaNo, locMast);//返回dto
        }
//        //库位规则
//        locMast = getLocNoStepRule(matNos, locTypeDto);
//        locMast = getLocNoStepRule(matnr, locTypeDto, staDescId, sourceStaNo);
//        if (locMast != null) {
//            //找到库位,返回dto
//            return getLocNoStep6(staDescId, sourceStaNo, locMast);//返回dto
//        }
//        // 靠近摆放规则 --- 相同订单号, 同天同规格物料
//        locMast = getLocNoStep3(staDescId, matNos, locTypeDto);
//        locMast = getLocNoStep3(staDescId, matnr, batch, grade, locTypeDto, sourceStaNo);
//        if (locMast != null) {
//            //找到库位,返回dto
//            return getLocNoStep6(staDescId, sourceStaNo, locMast);//返回dto
//        }
//
//        //搜索单品
//        locMast = getLocNoStepSingle(matNos, locTypeDto);
//        if (locMast != null) {
//            //找到库位,返回dto
//            return getLocNoStep6(staDescId, sourceStaNo, locMast);//返回dto
//        }
//
//        //搜索混放
//        locMast = getLocNoStepMixed(matNos, locTypeDto, times);
//        if (locMast != null) {
//            //找到库位,返回dto
//            return getLocNoStep6(staDescId, sourceStaNo, locMast);//返回dto
//        }
        //搜索整个空库位组
        locMast = getLocNoStepSingle(locTypeDto, staDescId, sourceStaNo);
        if (locMast != null) {
            //找到库位,返回dto
            return getLocNoStep6(staDescId, sourceStaNo, locMast);//返回dto
        }
        //找不到库位,抛出异常
        throw new CoolException("没有空库位");
@@ -163,43 +125,62 @@
//    /**
//     * 库位规则
//     */
//    private LocMast getLocNoStepRule(List<String> matNos, LocTypeDto locTypeDto) {
//    private LocMast getLocNoStepRule(String matnr, LocTypeDto locTypeDto, Integer staDescId, Integer sourceStaNo) {
//        LocMast locMast = null;
//
//        //库位规则只能在单品货物中生效
//        if (matNos.size() == 1) {
//            // 库区锁定
//            List<LocRule> locRules = locRuleService.find(Cools.isEmpty(matNos) ? null : matNos.get(0));
//            if (locRules == null || locRules.isEmpty()) {
//                return 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;
//            }
//
//            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;
//                }
//
//                List<LocMast> locMasts = locMastService.queryFreeLocMast2(locTypeDto.getLocType1(), locRule.getRowBeg(), locRule.getRowEnd(), locRule.getBayBeg(), locRule.getBayEnd(), locRule.getLevBeg(), locRule.getLevEnd());
//                locMast = locFilter(locMasts, matNos,locTypeDto);
//
//            }
//        }
//
//            if (locRules.get(0).getKeepGo() == 0) {
//                //找不到空库位,且禁止继续寻找其他非混载区域库位
//                //找不到库位,抛出异常
//                throw new CoolException("规则区域没有空库位");
//            }
//        if (locRules.get(0).getKeepGo() == 0) {
//            //找不到空库位,且禁止继续寻找其他非混载区域库位
//            //找不到库位,抛出异常
//            throw new CoolException("规则区域没有空库位");
//        }
//
//        return locMast;
//    }
//    // 靠近摆放规则 --- 相同订单号, 同天同规格物料
//    private LocMast getLocNoStep3(Integer staDescId, List<String> matNos, LocTypeDto locTypeDto) {
//    private LocMast getLocNoStep3(Integer staDescId, String matnr, String batch, String grade, LocTypeDto locTypeDto, Integer sourceStaNo) {
//        LocMast locMast = null;
//        if (!Cools.isEmpty(matNos) && matNos.size() == 1 && staDescId == 1) {
//        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(matNos.get(0));
//            List<WrkMast> wrkMasts = wrkMastService.selectSameMatnrs(matnr, batch, grade, staDesc.getCrnNo());
//            for (WrkMast wrkMast : wrkMasts) {
//                LocMast locMast0 = locMastService.findNearloc(wrkMast.getLocNo());
//                if (null != locMast0) {
@@ -211,9 +192,9 @@
//            }
//            if (Cools.isEmpty(locMast)) {
//                //再判断库存明细档,料号相同的明细库位
//                List<String> locNos = locDetlService.getSameDetl(matNos.get(0));
//                List<String> locNos = locDetlService.getSameDetl(matnr, batch, grade, staDesc.getCrnNo());
//                for (String locNo : locNos) {
//                    LocMast locMast0 = locMastService.findInnerLoc(locNo);
//                    LocMast locMast0 = locMastService.findNearloc(locNo);
//                    if (null != locMast0) {
//                        // 浅库位符合尺寸检测
//                        if (VersionUtils.checkLocType(locMast0, locTypeDto)) {
@@ -227,218 +208,99 @@
//
//        return locMast;
//    }
//
//    // 靠近摆放规则 --- 空托
//    private LocMast getLocNoStep4(Integer staDescId, LocTypeDto locTypeDto) {
//        LocMast locMast = null;
//        // 靠近摆放规则 --- 空托
//        if (staDescId == 10) {
//            //先判断工作档,查找主档IOType=1, wrkSts < 10的工作明细,料号相同的明细库位
//            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("io_type",10));
//            for (WrkMast wrkMast : wrkMasts) {
//                LocMast locMast0 = locMastService.findNearloc(wrkMast.getLocNo());
//                if (null != locMast0) {
//                    // 浅库位符合尺寸检测
//                    if (VersionUtils.checkLocType(locMast0, locTypeDto)) {
    // 靠近摆放规则 --- 空托
    private LocMast getLocNoStep4(Integer staDescId, LocTypeDto locTypeDto, Integer sourceStaNo) {
        LocMast locMast = null;
        // 靠近摆放规则 --- 空托
        if (staDescId == 10) {
            // 获取目标站
            LambdaQueryWrapper<StaDesc> wrapper = new LambdaQueryWrapper<StaDesc>()
                    .eq(StaDesc::getTypeNo, staDescId)
                    .eq(StaDesc::getStnNo, sourceStaNo);
            StaDesc staDesc = staDescService.getOne(wrapper);
            if (staDesc == null) {
                throw new CoolException("入库路径不存在");
            }
            List<LocMast> locMasts = locMastService.list(new LambdaQueryWrapper<LocMast>()
                    .eq(LocMast::getLocSts, "O")
                    .eq(LocMast::getLocType1, 1)
                    .eq(LocMast::getCrnNo, staDesc.getCrnNo())
                    .orderByAsc(LocMast::getLev1, LocMast::getBay1, LocMast::getRow1));
            if (!locMasts.isEmpty()) {
                for (LocMast loc : locMasts) {
//                    LocMast locMast0 = locMastService.findNearloc(loc.getLocNo());
//                    if (null != locMast0) {
//                        locMast = locMast0;
//                        break;
//                    }
//                }
//            }
//            if (Cools.isEmpty(locMast)){
//                List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
//                        .eq("loc_sts", "O"));
//                if (locMasts.size() > 0) {
//                    for (LocMast loc : locMasts) {
//                        LocMast locMast0 = locMastService.findNearloc(loc.getLocNo());
//                        if (null != locMast0) {
//                            // 浅库位符合尺寸检测
//                            if (VersionUtils.checkLocType(locMast0, locTypeDto)) {
//                                locMast = locMast0;
//                                break;
//                            }
//                        }
//                    }
//                }
//            }
//        }
//
//        return locMast;
//    }
//
//    // 搜索混放
//    private LocMast getLocNoStepMixed(List<String> matNos, LocTypeDto locTypeDto, int times) {
//        LocMast locMast = null;
//
//        if (matNos.size() > 1) {
//            List<LocMast> locMasts = locMastService.selectAreaEmpty(locTypeDto.getLocType1(), 1);//搜索混放库位
//            //混放区域直接取第一个即可
//            for (LocMast mast : locMasts) {
//                //预留空库位
//                if (locMastService.checkEmptyCount(mast, 10)) {
//                    locMast = mast;
//                    break;
//                }
//            }
//        }
//
//        // 2.库位当前所属尺寸无空库位时,调整尺寸参数,向上兼容检索库位
//        if (Cools.isEmpty(locMast)) {
//            log.error("系统没有空库位!!! 尺寸规格: {}, 轮询次数:{}", JSON.toJSONString(locTypeDto), times);
//        }
//
//        return locMast;
//    }
//
//    // 搜索单品
//    private LocMast getLocNoStepSingle(List<String> matNos, LocTypeDto locTypeDto) {
//        LocMast locMast = null;
//        // 1.先搜索单品
//        if (matNos.size() == 1) {
//            //单品
//            List<LocMast> locMasts = locMastService.selectAreaEmpty(locTypeDto.getLocType1(), 2);//搜索单品库位
//
//            for (LocMast mast : locMasts) {
//                List<String> groupLoc = Utils.getGroupLoc(mast.getLocNo());
//                if (!locMastService.checkAllLocEmpty(groupLoc)) {
//                    continue;
//                }
//
//                LocMast tmp = null;
//                for (String loc : groupLoc) {
//                    LocMast locMast1 = locMastService.selectByLoc(loc);
//                    if (locMast1 == null) {
//                        continue;
//                    }
//
//                    if (!locMast1.getLocSts().equals("O")) {
//                        continue;
//                    }
//
//                    tmp = locMast1;
//                    break;
//                }
//
//                //预留空库位
//                if (tmp != null && locMastService.checkEmptyCount(mast, 10)) {
//                    locMast = tmp;
//                    break;
//                }
//            }
//
//            if (locMast == null) {
//                //单品找不到库位,允许尝试从混放区域中进行搜索
//                List<LocMast> locMasts2 = locMastService.selectAreaEmpty(locTypeDto.getLocType1(), 1);//搜索单品库位
//                //混放区域直接取第一个即可
//                for (LocMast mast : locMasts2) {
//                    //预留空库位
//                    if (locMastService.checkEmptyCount(mast, 10)) {
//                        locMast = mast;
//                        break;
//                    }
//                }
//            }
//        }
//
//        return locMast;
//    }
//
//    /*
//    库存规则搜索到的库位确认
//     */
//    private LocMast locFilter(List<LocMast> locMasts,List<String> matNos,LocTypeDto locTypeDto){
//        for (LocMast locMast0 : locMasts) {
//            if(!VersionUtils.checkLocType(locMast0,locTypeDto)){
//                continue;
//            }
//            //单品物料
//            if (matNos.size() == 1) {
//                //如果不是深浅,则直接返回当前库位
//                if(Cools.isEmpty(Utils.getGroupDeepLoc(locMast0.getLocNo()))){
//                    return locMast0;
//                }else{
//                    List<String> groupInnerLoc = Utils.getGroupInnerLoc(locMast0.getLocNo());
//                    //如果是深浅库位,但是内测无库位的情况下,则直接返回当前库位
//                    if (Cools.isEmpty(groupInnerLoc)) {
//                        return locMast0;
//                    }else {
//                        //获取最深的库位
//                        String loc = groupInnerLoc.get(groupInnerLoc.size() - 1);
//                        LocMast locMast1 = locMastService.selectByLoc(loc);
//                        //如果最深测库位为空库位,则直接返回最深库位
//                        if("O".equals(locMast1.getLocSts())){
//                            return locMast1;
//                        }else {
//                            //如果最深库位状态不为F或者O,则跳出当前的深浅库位查找
//                            if(!"F".equals(locMast1.getLocSts())){
//                                continue;
//                            }
//                            List<LocDetl> locDetls = locDetlService.selectByLocNo(loc);
//                            //如果当前深库位物料与入库物料不相符,则跳出当前深浅库位查找
//                            if(!Cools.eq(locDetls.get(0).getMatnr(),matNos.get(0))){
//                                continue;
//                            }
//                            //从里往外依次遍历该组深浅库位
//                            for (int i=groupInnerLoc.size()-1; i>=0 ;i--){
//                                LocMast locMast2 = locMastService.selectByLoc(groupInnerLoc.get(i));
//                                if("O".equals(locMast2.getLocSts())){
//                                    //如果深库位中含有0状态的库位,则直接返回该库位
//                                    return locMast2;
//                                }else if("F".equals(locMast2.getLocSts())){
//                                    //如果对于locaMast0最近的一个库位也为F状态,则返回locaMastO
//                                    if(i==0){
//                                        return locMast0;
//                                    }else {
//                                        //如果该组深浅库位中含有既不为F也不为O的库位,则跳出当前深浅库位查找
//                                        continue;
//                                    }
//                                }else {
//                                    break;
//                                }
//                            }
//                        }
//
//                    }
//                }
//            }else {
//                if(Cools.isEmpty(Utils.getGroupDeepLoc(locMast0.getLocNo()))){
//                    return locMast0;
//                }
//            }
//
//        }
//        return null;
//    }
//
//    //返回dto
//    private StartupDto getLocNoStep6(Integer staDescId, Integer sourceStaNo, LocMast locMast) {
//        StartupDto startupDto = new StartupDto();
//        String locNo = locMast.getLocNo();
//        // 获取目标站
//        Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
//                .eq("type_no", staDescId)
//                .eq("stn_no", sourceStaNo)
//                .eq("crn_no",Utils.stnNoToLiftNo(sourceStaNo));//借用堆垛机号字段充当提升机号
//        StaDesc staDesc = staDescService.selectOne(wrapper);
//        if (Cools.isEmpty(staDesc)) {
//            log.error("入库路径不存在, staDescId={}, sourceStaNo={}", staDescId, sourceStaNo);
//            throw new CoolException("入库路径不存在");
//        }
//
//        // 检测目标站
//        BasDevp staNo = basDevpService.selectById(staDesc.getCrnStn());
//        if (!staNo.getAutoing().equals("Y")) {
//            throw new CoolException("目标站" + staDesc.getCrnStn() + "不可用");
//        }
//
//        // 生成工作号
//        int workNo = getWorkNo(0);
//        // 返回dto
//        startupDto.setWorkNo(workNo);
//        startupDto.setSourceStaNo(sourceStaNo);
//        startupDto.setStaNo(staNo.getDevNo());
//        startupDto.setLocNo(locMast.getLocNo());
//        return startupDto;
//    }
                    locMast = loc;
                    break;
                }
            }
            if (locMast == null) {
                throw new CoolException("缺少空库位");
            }
        }
        return locMast;
    }
    // 搜索单品(整个库位组)
    private LocMast getLocNoStepSingle(LocTypeDto locTypeDto, Integer staDescId, Integer sourceStaNo) {
        LocMast locMast = null;
        // 获取目标站
        LambdaQueryWrapper<StaDesc> wrapper = new LambdaQueryWrapper<StaDesc>()
                .eq(StaDesc::getTypeNo, staDescId)
                .eq(StaDesc::getStnNo, sourceStaNo);
        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;
        }
        for (LocMast mast : locMasts) {
            locMast = mast;
            break;
        }
        return locMast;
    }
    //返回dto
    private StartupDto getLocNoStep6(Integer staDescId, Integer sourceStaNo, LocMast locMast) {
        StartupDto startupDto = new StartupDto();
        // 获取目标站
        LambdaQueryWrapper<StaDesc> wrapper = new LambdaQueryWrapper<StaDesc>()
                .eq(StaDesc::getTypeNo, staDescId)
                .eq(StaDesc::getStnNo, sourceStaNo)
                .eq(StaDesc::getCrnNo,locMast.getCrnNo());
        StaDesc staDesc = staDescService.getOne(wrapper);
        if (Cools.isEmpty(staDesc)) {
            log.error("入库路径不存在, staDescId={}, sourceStaNo={}", staDescId, sourceStaNo);
            throw new CoolException("入库路径不存在");
        }
        // 检测目标站
        BasDevp staNo = basDevpService.getById(staDesc.getCrnStn());
        if (!staNo.getAutoing().equals("Y")) {
            throw new CoolException("目标站" + staDesc.getCrnStn() + "不可用");
        }
        // 生成工作号
        int workNo = getWorkNo(0);
        // 返回dto
        startupDto.setWorkNo(workNo);
        startupDto.setSourceStaNo(sourceStaNo);
        startupDto.setStaNo(staNo.getDevNo());
        startupDto.setLocNo(locMast.getLocNo());
        startupDto.setCrnNo(staDesc.getCrnNo());
        return startupDto;
    }
}