自动化立体仓库 - WMS系统
pang.jiabao
2024-07-05 07c572bea979dbd3ee46ec24083cb1bdcc014e3a
src/main/java/com/zy/common/service/CommonService.java
@@ -7,6 +7,7 @@
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.mapper.LocMastMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.Utils;
import com.zy.asrs.utils.VersionUtils;
@@ -47,9 +48,12 @@
    @Autowired
    private SlaveProperties slaveProperties;
    @Autowired
    private LocMastMapper locMastMapper;
    /**
     * 生成工作号
     * @param wrkMk 0:入出库 ; 1:其他
     * @param wrkMk 0:入库 ; 1:出库;2拣选
     * @return workNo(工作号)
     */
    public int getWorkNo(Integer wrkMk) {
@@ -59,7 +63,7 @@
        }
        int workNo = 0;
        // 入出库类型
        if (wrkLastno.getWrkMk() == 0) {
        if (wrkLastno.getWrkMk() == 0 || wrkLastno.getWrkMk() == 1 || wrkLastno.getWrkMk() == 2) {
            workNo = wrkLastno.getWrkNo();
            int sNo = wrkLastno.getSNo();
            int eNo = wrkLastno.getENo();
@@ -105,11 +109,18 @@
    public StartupDto getLocNo(Integer whsType, Integer staDescId, Integer sourceStaNo, boolean emptyMk, List<String> matNos, LocTypeDto locTypeDto, LocTypeDto oldLocType, int times) {
        StartupDto startupDto = new StartupDto();
        // 生成工作号
        if (sourceStaNo == 103) {
        int crnNo = 0;
        if (sourceStaNo < 200) {
            whsType = 1;
        } else if (sourceStaNo == 203) {
            crnNo=1;
        } else if (sourceStaNo < 300) {
            whsType = 2;
            crnNo=2;
        }else {
            whsType = 3;
            crnNo=3;
        }
        int workNo = getWorkNo(0);
        RowLastno rowLastno = rowLastnoService.selectById(whsType);
        if (Cools.isEmpty(rowLastno)) {
@@ -121,12 +132,12 @@
        int crn_qty = rowLastno.getCrnQty();     // 堆垛机数量(巷道数量)
        int rowCount = eRow - sRow + 1;          // 库排总数
        // 目标堆垛机号
        int crnNo = 0;
//        int crnNo = 0;
        // 目标库位
        LocMast locMast = null;
        // 靠近摆放规则 --- 同天同规格物料
        if (!Cools.isEmpty(matNos)) {
        if (!Cools.isEmpty(matNos) && sourceStaNo < 200) {
            List<String> locNos = locDetlService.getSameDetlToday(matNos.get(0), sRow, eRow);
            for (String locNo : locNos) {
                if (Utils.isShallowLoc(slaveProperties, locNo)) {
@@ -153,7 +164,14 @@
        }
        // 靠近摆放规则 --- 空托
        if (emptyMk) {
            List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("loc_sts", "D").ge("row1", sRow).le("row1", eRow));
//            List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("loc_sts", "D").ge("row1", sRow).le("row1", eRow));
            List<LocMast> locMasts = null;
            if(crnNo==1) {
                locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("loc_sts", "D").eq("row1", 1));
            } else {
                locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("loc_sts", "D").ge("row1", sRow).le("row1", eRow));
            }
            if (locMasts.size() > 0) {
                for (LocMast loc : locMasts) {
                    if (Utils.isShallowLoc(slaveProperties, loc.getLocNo())) {
@@ -181,27 +199,39 @@
        if (null == locMast) {
            Shelves shelves = new Shelves(rowCount, crn_qty);
            if (whsType == 1) {
                for (int i = 0; i < shelves.group; i ++) {
                    curRow = shelves.start(curRow);
                    if (curRow < 0) {
                        throw new CoolException("检索库位失败,请联系管理员");
                    }
                    Integer crnNo1 = shelves.getCrnNo(curRow);
                    if (basCrnpService.checkSiteError(crnNo1, true)) {
                        crnNo = crnNo1;
                        if (curRow == 3 || curRow == 4) {
                            curRow = 3;
                        }
                        break;
                    }
                curRow = curRow + 1;
                if (curRow > eRow) {
                    curRow = sRow;
                }
                crnNo = whsType;
                basCrnpService.checkSiteStatus(crnNo, true);
//                for (int i = 0; i < shelves.group; i ++) {
//                    curRow = shelves.start(curRow);
//                    if (curRow < 0) {
//                        throw new CoolException("检索库位失败,请联系管理员");
//                    }
//                    Integer crnNo1 = shelves.getCrnNo(curRow);
//                    if (basCrnpService.checkSiteError(crnNo1, true)) {
//                        crnNo = crnNo1;
//                        if (curRow == 3 || curRow == 4) {
//                            curRow = 3;
//                        }
//                        break;
//                    }
//                }
            } else if (whsType == 2) {
                if (curRow == sRow) {
                    curRow = eRow;
                } else {
                    curRow = sRow;
                }
                crnNo = whsType;
                basCrnpService.checkSiteStatus(crnNo, true);
            }else {
                if (curRow == sRow) {
                    curRow = eRow;
                } else {
                    curRow = sRow;
                }
                basCrnpService.checkSiteStatus(crnNo, true);
            }
        }
@@ -235,15 +265,38 @@
        // 1.当检索库排为浅库位排时,优先寻找当前库排的深库位排
        if (locMast == null) {
            if (Utils.isShallowLoc(slaveProperties, curRow)) {
                Integer deepRow = Utils.getDeepRow(slaveProperties, curRow);
                locMast = locMastService.queryFreeLocMast(deepRow, locTypeDto.getLocType1(), locTypeDto.getLocType2(), locTypeDto.getLocType3());
                Integer deepRow = 0;
                if(curRow == 2) {
                    deepRow = Utils.getDeepRow(slaveProperties, curRow);
                } else {
                    deepRow = curRow;
                }
                if(emptyMk){
                    locMast = locMastService.queryFreeLocMastIncludeFirst(deepRow, locTypeDto.getLocType1(), locTypeDto.getLocType2(), locTypeDto.getLocType3());
                    if (Cools.isEmpty(locMast)){
                        locMast = locMastService.queryFreeLocMast(deepRow, locTypeDto.getLocType1(), locTypeDto.getLocType2(), locTypeDto.getLocType3());
                    }
                } else {
                    locMast = locMastService.queryFreeLocMastExceptFirst(deepRow, locTypeDto.getLocType1(), locTypeDto.getLocType2(), locTypeDto.getLocType3());
                }
//                locMast = locMastService.queryFreeLocMast(deepRow, locTypeDto.getLocType1(), locTypeDto.getLocType2(), locTypeDto.getLocType3());
                // 因库位移转、需预留空库位
                if (!locMastService.checkEmptyCount(locMast)) {
                    locMast = null;
                }
            }
            if (Cools.isEmpty(locMast)) {
                locMast = locMastService.queryFreeLocMast(curRow, locTypeDto.getLocType1(), locTypeDto.getLocType2(), locTypeDto.getLocType3());
                if(emptyMk){
                    locMast = locMastService.queryFreeLocMastIncludeFirst(curRow, locTypeDto.getLocType1(), locTypeDto.getLocType2(), locTypeDto.getLocType3());
                    if (Cools.isEmpty(locMast)){
                        locMast = locMastService.queryFreeLocMast(curRow, locTypeDto.getLocType1(), locTypeDto.getLocType2(), locTypeDto.getLocType3());
                    }
                } else {
                    locMast = locMastService.queryFreeLocMastExceptFirst(curRow, locTypeDto.getLocType1(), locTypeDto.getLocType2(), locTypeDto.getLocType3());
                }
//                locMast = locMastService.queryFreeLocMast(curRow, locTypeDto.getLocType1(), locTypeDto.getLocType2(), locTypeDto.getLocType3());
                // 因库位移转、需预留空库位
                if (!locMastService.checkEmptyCount(locMast)) {
                    locMast = null;
@@ -420,6 +473,7 @@
//        startupDto.setLocNo(locNo);
//        return startupDto;
//    }
//出深库位托盘
    public static void main(String[] args) {
        System.out.println(Arith.remainder(1, 4));
@@ -455,4 +509,158 @@
        }
    }
    public StartupDto emptyIngetLocNo(Integer devpNo) {
        int crnNo = 0;
        if (devpNo == 304) {
            crnNo = 3;
        } else if(devpNo == 204) {
            crnNo = 2;
        } else if(devpNo == 104) {
            crnNo = 1;
        }
        // 目标库位
        LocMast locMast = locMastMapper.queryEmptyLocNoByStaNo(crnNo);
        if (locMast == null) {
            throw new CoolException("没有空库位");
        }
        // 获取目标站
        Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
                .eq("type_no", 10)
                .eq("stn_no", devpNo)
                .eq("crn_no", crnNo);
        StaDesc staDesc = staDescService.selectOne(wrapper);
        if (Cools.isEmpty(staDesc)) {
            log.error("入库路径不存在, staDescId={}, sourceStaNo={}, crnNo={}", 10, devpNo, crnNo);
            throw new CoolException("入库路径不存在");
        }
        // 检测目标站
        BasDevp staNo = basDevpService.selectById(staDesc.getCrnStn());
        if (!staNo.getAutoing().equals("Y")) {
            throw new CoolException("目标站"+staDesc.getCrnStn()+"不可用");
        }
        basCrnpService.checkSiteStatus(crnNo, true);
        // 返回dto
        StartupDto startupDto = new StartupDto();
        startupDto.setWorkNo(getWorkNo(0));
        startupDto.setCrnNo(crnNo);
        startupDto.setSourceStaNo(devpNo);
        startupDto.setStaNo(devpNo);
        startupDto.setLocNo(locMast.getLocNo());
        return startupDto;
    }
    public StartupDto getLocNoBy304(String type) {
        int row;
        int devpNo = 304;
        int crnNo = 3;
        if (type.equals("1")) {
            row =  7;
        } else if (type.equals("2")) {
            row = 6;
        } else {
            throw new CoolException("304物料类别识别错误:" + type);
        }
        // 目标库位
        LocMast locMast = locMastMapper.queryLocByBarCode(row);
        if (locMast == null) {
            throw new CoolException("304入库没有空库位");
        }
        // 获取目标站
        Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
                .eq("type_no", 1)
                .eq("stn_no", devpNo)
                .eq("crn_no", crnNo);
        StaDesc staDesc = staDescService.selectOne(wrapper);
        if (Cools.isEmpty(staDesc)) {
            log.error("入库路径不存在, staDescId={}, sourceStaNo={}, crnNo={}", 1, devpNo, crnNo);
            throw new CoolException("入库路径不存在");
        }
        // 检测目标站
        BasDevp staNo = basDevpService.selectById(staDesc.getCrnStn());
        if (!staNo.getAutoing().equals("Y")) {
            throw new CoolException("目标站"+staDesc.getCrnStn()+"不可用");
        }
        basCrnpService.checkSiteStatus(crnNo, true);
        // 返回dto
        StartupDto startupDto = new StartupDto();
        startupDto.setWorkNo(getWorkNo(0));
        startupDto.setCrnNo(crnNo);
        startupDto.setSourceStaNo(devpNo);
        startupDto.setStaNo(devpNo);
        startupDto.setLocNo(locMast.getLocNo());
        return startupDto;
    }
    /**
     * 一期寻找库位
     * 1-6层 条码1或者2开头
     * 7-11层 条码8开头
     * @param ioType 1.入库
     * @param devpNo 入库站点
     * @param barcode 条码
     * @return 库位信息
     */
    public StartupDto getLocNoNew(int ioType, Integer devpNo, String barcode) {
        char type = barcode.charAt(0);
        int flag = 0;
        if (type == '1' || type == '2') {
            flag = 1;
        } else if( type == '8') {
            flag = 2;
        }
        if (flag == 0) {
            throw new CoolException("条码有误:" + barcode);
        }
        // 目标库位
        LocMast locMast = locMastMapper.queryLocByBarCodeNew(devpNo,flag);
        if (locMast == null) {
            throw new CoolException("入库没有空库位");
        }
        // 堆垛机号
        Integer crnNo = locMast.getCrnNo();
        // 获取目标站
        Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
                .eq("type_no", ioType)
                .eq("stn_no", devpNo)
                .eq("crn_no", crnNo);
        StaDesc staDesc = staDescService.selectOne(wrapper);
        if (Cools.isEmpty(staDesc)) {
            log.error("入库路径不存在, staDescId={}, sourceStaNo={}, crnNo={}", 1, devpNo, crnNo);
            throw new CoolException("入库路径不存在");
        }
        // 检测目标站
        BasDevp staNo = basDevpService.selectById(staDesc.getCrnStn());
        if (!staNo.getAutoing().equals("Y")) {
            throw new CoolException("目标站"+staDesc.getCrnStn()+"不可用");
        }
        basCrnpService.checkSiteStatus(crnNo, true);
        // 返回dto
        StartupDto startupDto = new StartupDto();
        startupDto.setWorkNo(getWorkNo(0));
        startupDto.setCrnNo(crnNo);
        startupDto.setSourceStaNo(devpNo);
        startupDto.setStaNo(devpNo);
        startupDto.setLocNo(locMast.getLocNo());
        return startupDto;
    }
}