自动化立体仓库 - WMS系统
Junjie
3 天以前 193c3204f7f998df4d603df202dbea88a3074585
#入库逻辑变更
13个文件已修改
584 ■■■■ 已修改文件
src/main/java/com/zy/asrs/entity/Mat.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/LocDetlMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/LocMastMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/LocDetlService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/LocMastService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/service/CommonService.java 519 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/WcsController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/asrs/LocDetlMapper.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/asrs/LocMastMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/asrs/MatMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/Mat.java
@@ -325,6 +325,13 @@
    @TableField("store_max_date")
    private Integer storeMaxDate;
    /**
     * 特殊产品(呆滞料标记)
     * 0:普通 1:呆滞
     */
    @TableField("tscp")
    private Integer tscp;
    public Mat() {}
    public Mat(String uuid,Long tagId,String matnr,String maktx,String name,String specs,String model,String color,String brand,String unit,Double price,String sku,Double units,String barcode,String origin,String manu,String manuDate,String itemNum,Double safeQty,Double weight,Double manLength,Double volume,String threeCode,String supp,String suppCode,Integer beBatch,String deadTime,Integer deadWarn,Integer source,Integer inspect,Integer danger,Integer status,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
@@ -56,6 +56,8 @@
    @Select("SELECT ld.loc_no FROM asr_loc_detl ld LEFT JOIN asr_loc_mast lm ON ld.loc_no = lm.loc_no WHERE (1 = 1 AND ld.matnr = #{matnr} AND (lm.row1 >= #{start} AND lm.row1 <= #{end})  AND lm.loc_sts = 'F' AND DateDiff(dd, ld.appe_time, getdate()) = 0) ORDER BY ld.appe_time ASC")
    List<String> selectSameDetlToday(@Param("matnr") String matnr, @Param("start") Integer start, @Param("end") Integer end);
    List<String> getSameDetlList(@Param("matnr") String matnr,@Param("rows") List<Integer> rows);
    List<String> selectSameDetlTodayBatch(@Param("matnr") String matnr,@Param("batch") String batch, @Param("start") Integer start, @Param("end") Integer end);
    List<LocDetl> getStockStatis(Map<String, Object> map);
src/main/java/com/zy/asrs/mapper/LocMastMapper.java
@@ -62,4 +62,6 @@
     * @return 库位号
     */
    String findFirstFrozenLocNo(@Param("locNoList") List<String> locNoList);
    List<Integer> selectRowByCrnNo(Integer crnNo);
}
src/main/java/com/zy/asrs/service/LocDetlService.java
@@ -49,6 +49,11 @@
    /**
     * 获取当天相同规格货物的深库位号
     */
    List<String> getSameDetlList(String matnr, List<Integer> rows);
    /**
     * 获取当天相同规格货物的深库位号
     * @param matnr 商品编号
     * @param batch 批次号
     * @return locNo 库位号
src/main/java/com/zy/asrs/service/LocMastService.java
@@ -62,4 +62,6 @@
    //查询指定楼层的库位数据
    List<LocMast> selectLocByLev(Integer lev);
    List<Integer> selectRowByCrnNo(Integer crnNo);
}
src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
@@ -17,10 +17,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
@Service("locDetlService")
public class LocDetlServiceImpl extends ServiceImpl<LocDetlMapper, LocDetl> implements LocDetlService {
@@ -93,6 +90,11 @@
    }
    @Override
    public List<String> getSameDetlList(String matnr, List<Integer> rows) {
        return this.baseMapper.getSameDetlList(matnr, rows);
    }
    @Override
    public List<String> getSameDetlToday(String matnr,String batch, Integer start, Integer end) {
        return this.baseMapper.selectSameDetlTodayBatch(matnr,batch, start, end);
    }
src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java
@@ -10,6 +10,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
@Service("locMastService")
@@ -153,4 +154,9 @@
        }
        return this.baseMapper.selectLocShuttleMoveUnilateralN(bay,lev,type);
    }
    @Override
    public List<Integer> selectRowByCrnNo(Integer crnNo) {
        return this.baseMapper.selectRowByCrnNo(crnNo);
    }
}
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -119,7 +119,7 @@
//        List<String> matnrs = param.getList().stream().map(FullStoreParam.MatCodeStore::getMatnr).distinct().collect(Collectors.toList());
//        List<String> batchs = param.getList().stream().map(FullStoreParam.MatCodeStore::getBatch).distinct().collect(Collectors.toList());
        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(param.getList().get(0));
        StartupDto dto = commonService.getLocNo(1, param.getDevpNo(), findLocNoAttributeVo, locTypeDto);
        StartupDto dto = commonService.getLocNo(1, param.getDevpNo(), findLocNoAttributeVo, locTypeDto, param.getBarcode());
        if (Cools.isEmpty(dto)) {
            throw new CoolException("查询库位失败!!==》startupFullPutStore ==》 commonService.getLocNo");
        }
@@ -589,7 +589,7 @@
        LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo);
        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
        StartupDto dto = commonService.getLocNo(10, devpNo, findLocNoAttributeVo, locTypeDto);
        StartupDto dto = commonService.getLocNo(10, devpNo, findLocNoAttributeVo, locTypeDto, null);
        int workNo = dto.getWorkNo();
        Date now = new Date();
        // 生成工作档
src/main/java/com/zy/common/service/CommonService.java
@@ -55,6 +55,8 @@
    private WrkDetlService wrkDetlService;
    @Autowired
    private ConfigService configService;
    @Autowired
    private MatService matService;
    /**
     * 生成工作号
@@ -122,78 +124,473 @@
     * @return locNo 检索到的库位号
     */
    @Transactional
    public StartupDto getLocNo(Integer staDescId, Integer sourceStaNo, FindLocNoAttributeVo findLocNoAttributeVo, LocTypeDto locTypeDto) {
        // try {
        Integer whsType = Utils.GetWhsType(sourceStaNo);
        RowLastno rowLastno = rowLastnoService.selectById(whsType);
        RowLastnoType rowLastnoType = rowLastnoTypeService.selectById(rowLastno.getTypeId());
        /**
         * 库型 1: 标准堆垛机库  2: 平库  3: 穿梭板  4: 四向车  5: AGV  0: 未知
         */
        switch (rowLastnoType.getType()) {
            case 1:
                Config crnSearchDetectTaskCountConfig = configService.selectConfigByCode("crnSearchDetectTaskCount");
                int crnSearchDetectTaskCount = Integer.parseInt(crnSearchDetectTaskCountConfig.getValue());
    public StartupDto getLocNo(Integer staDescId, Integer sourceStaNo, FindLocNoAttributeVo findLocNoAttributeVo, LocTypeDto locTypeDto, String barcode) {
        List<Integer> crnList = new ArrayList<>();
        if (barcode.startsWith("11")) {
            crnList.add(4);
            crnList.add(5);
                Config applyInTaskTotalCountConfig = configService.selectConfigByCode("applyInTaskTotalCount");
                int applyInTaskTotalCount = Integer.parseInt(applyInTaskTotalCountConfig.getValue());
                int crnNo = 7;
                boolean flag = true;
                List<String> data = new ArrayList<>();
                while (crnNo > 1) {
                    crnNo--;
                    List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("loc_sts", "O").eq("crn_no", crnNo).eq("whs_type", rowLastnoType.getType().longValue()).eq("loc_type1", locTypeDto.getLocType1()).eq("loc_type2", locTypeDto.getLocType2()));
                    if (locMasts.size() <= 15) {
                        log.error(crnNo + "号堆垛机没有空库位!!! 尺寸规格: {}", JSON.toJSONString(locTypeDto));
                        data.add(crnNo + "号没有空库位;");
                    } else {
                        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("crn_no", crnNo).in("io_type", 1, 10, 53, 57));
                        if (wrkMasts.size() > crnSearchDetectTaskCount) {
                            log.error(crnNo + "号堆垛机已达到入库控制上限!!! 任务数量: {}, 控制数量:{}", wrkMasts.size(), crnSearchDetectTaskCount);
                            data.add(crnNo + "号入库控制上限;");
                            continue;
                        }
                        List<WrkMast> wrkMastsList = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("crn_no", crnNo).in("io_type", 1, 10, 53, 57, 101, 103, 107, 110));
                        if (wrkMastsList.size() > applyInTaskTotalCount) {
                            log.error(crnNo + "号堆垛机已达到申请入库时总任务数量上限(入库、出库)!!! 任务数量: {}, 控制数量:{}", wrkMastsList.size(), applyInTaskTotalCount);
                            data.add(crnNo + "号申请入库时总任务数量上限;");
                            continue;
                        }
                        flag = false;
                        break;
                    }
            Config config = configService.selectConfigByCode("11CrnConfig");
            List<Integer> list = JSON.parseArray(config.getValue(), Integer.class);
            for (Integer crn : list) {
                crnList.remove(crn);
            }
            if (crnList.isEmpty()) {
                crnList.add(4);
                crnList.add(5);
                configService.updateValue("11CrnConfig", "[]");
            }else {
                if (!list.isEmpty()) {
                    crnList.addAll(list);
                }
                if (!flag) {
                    return getLocNoRun(whsType, staDescId, sourceStaNo, findLocNoAttributeVo, 0, locTypeDto, 0);
                } else {
                    log.info("数据:{}", data);
                    throw new CoolException(data.toString());
            }
        }else if (barcode.startsWith("13")) {
            crnList.add(1);
            crnList.add(2);
            crnList.add(3);
            Config config = configService.selectConfigByCode("13CrnConfig");
            List<Integer> list = JSON.parseArray(config.getValue(), Integer.class);
            for (Integer crn : list) {
                crnList.remove(crn);
            }
            if (crnList.isEmpty()) {
                crnList.add(1);
                crnList.add(2);
                crnList.add(3);
                configService.updateValue("13CrnConfig", "[]");
            }else {
                if (!list.isEmpty()) {
                    crnList.addAll(list);
                }
            case 2:
                log.error("站点={} 未查询到对应的规则", sourceStaNo);
                break;
            case 3:
                log.error("站点={} 未查询到对应的规则", sourceStaNo);
                break;
            case 4:
                return getLocNoRun4(whsType, staDescId, sourceStaNo, findLocNoAttributeVo, 4, locTypeDto, 0);
            case 5:
                return getLocNoRun5(whsType, staDescId, sourceStaNo, findLocNoAttributeVo, 0, locTypeDto, 0);
            default:
                log.error("站点={} 未查询到对应的规则", sourceStaNo);
                break;
            }
            //检测是否为呆滞料
            String matnr = findLocNoAttributeVo.getMatnr();
            Mat mat = matService.selectByMatnr(matnr);
            if (mat == null) {
                throw new CoolException(matnr + "物料信息不存在");
            }
            if (mat.getTscp() != null && mat.getTscp() == 1) {
                crnList.add(0, 1);
            }
        }else if (barcode.startsWith("16")) {
            crnList.add(6);
        }else {
            throw new CoolException("托盘码:{}" + barcode + "规则错误,无法找到匹配堆垛机");
        }
//        } catch (Exception e) {
//            log.error("站点={} 未查询到对应的规则,{}", sourceStaNo, e.getMessage());
//        }
        return null;
        StartupDto startupDto = null;
        StringBuilder builder = new StringBuilder();
        for (Integer crnNo : crnList) {
            try {
                startupDto = searchLocNoByCrnNo(staDescId, sourceStaNo, findLocNoAttributeVo, locTypeDto, crnNo);
                if(startupDto != null) {
                    break;
                }
            } catch (Exception e) {
                builder.append(e.getMessage()).append(",");
            }
        }
        if(startupDto == null) {
            builder.append("找不到空库位");
            throw new CoolException(builder.toString());
        }
        Integer crnNo = startupDto.getCrnNo();
        if (barcode.startsWith("11")) {
            Config config = configService.selectConfigByCode("11CrnConfig");
            List<Integer> list = JSON.parseArray(config.getValue(), Integer.class);
            List<Integer> newList = new ArrayList<>();
            for (Integer crn : list) {
                if(crn == crnNo) {
                    continue;
                }
                newList.add(crn);
            }
            newList.add(crnNo);
            configService.updateValue("11CrnConfig", JSON.toJSONString(newList));
        }else if (barcode.startsWith("13")) {
            Config config = configService.selectConfigByCode("13CrnConfig");
            List<Integer> list = JSON.parseArray(config.getValue(), Integer.class);
            List<Integer> newList = new ArrayList<>();
            for (Integer crn : list) {
                if(crn == crnNo) {
                    continue;
                }
                newList.add(crn);
            }
            newList.add(crnNo);
            configService.updateValue("13CrnConfig", JSON.toJSONString(newList));
        }
        return startupDto;
    }
    /**
     * 检索库位号
     *
     * @param staDescId            路径ID
     * @param sourceStaNo          源站
     * @param findLocNoAttributeVo 属性
     * @param locTypeDto           类型
     * @return locNo 检索到的库位号
     */
    @Transactional
    public StartupDto searchLocNoByCrnNo(Integer staDescId, Integer sourceStaNo, FindLocNoAttributeVo findLocNoAttributeVo, LocTypeDto locTypeDto, Integer crnNo) {
        Config devpTaskStackOverConfig = configService.selectConfigByCode("devpTaskStackOver");
        int devpTaskStackOver = Integer.parseInt(devpTaskStackOverConfig.getValue());
        Integer devpWorkingCount = queryDevpWorkingCount();
        if (devpWorkingCount > devpTaskStackOver) {
            throw new CoolException("输送线任务过载,当前输送线承载数量:{}" + devpWorkingCount);
        }
        if (!basCrnpService.checkSiteError(crnNo, true)) {
            throw new CoolException(crnNo + "号堆垛机异常");
        }
        Config crnSearchDetectTaskCountConfig = configService.selectConfigByCode("crnSearchDetectTaskCount");
        int crnSearchDetectTaskCount = Integer.parseInt(crnSearchDetectTaskCountConfig.getValue());
        Config applyInTaskTotalCountConfig = configService.selectConfigByCode("applyInTaskTotalCount");
        int applyInTaskTotalCount = Integer.parseInt(applyInTaskTotalCountConfig.getValue());
        Config emptyInKeepLimitConfig = configService.selectConfigByCode("emptyInKeepLimit");
        int emptyInKeepLimit = Integer.parseInt(emptyInKeepLimitConfig.getValue());
        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("crn_no", crnNo).in("io_type", 1, 10, 53, 57));
        if (wrkMasts.size() > crnSearchDetectTaskCount) {
            log.error(crnNo + "号堆垛机已达到入库控制上限!!! 任务数量: {}, 控制数量:{}", wrkMasts.size(), crnSearchDetectTaskCount);
            throw new CoolException(crnNo + "号堆垛机已达到入库控制上限!");
        }
        List<WrkMast> wrkMastsList = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("crn_no", crnNo).in("io_type", 1, 10, 53, 57, 101, 103, 107, 110));
        if (wrkMastsList.size() > applyInTaskTotalCount) {
            log.error(crnNo + "号堆垛机已达到申请入库时总任务数量上限(入库、出库)!!! 任务数量: {}, 控制数量:{}", wrkMastsList.size(), applyInTaskTotalCount);
            throw new CoolException(crnNo + "号堆垛机已达到申请入库时总任务数量上限(入库、出库)!");
        }
        List<LocMast> searchLocMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("loc_type1", locTypeDto.getLocType1()).eq("loc_sts", "O").eq("crn_no", crnNo));
        if (searchLocMasts.size() <= emptyInKeepLimit) {
            log.error(crnNo + "号堆垛机到达空库位预留上限!!! 尺寸规格: {}", JSON.toJSONString(locTypeDto));
            throw new CoolException(crnNo + "号堆垛机到达空库位预留上限!尺寸规格:" + (locTypeDto.getLocType1() == 1 ? "高" : "低"));
        }
        if (crnNo == 1) {
            if (wrkMasts.size() >= 1) {
                log.error(crnNo + "号堆垛机已达到入库控制上限!!! 任务数量: {}, 控制数量:{}", wrkMasts.size(), 1);
                throw new CoolException(crnNo + "号堆垛机已达到入库控制上限!");
            }
        }
        LocMast locMast = null;
        if (staDescId == 10) {
            //搜索空托盘
            locMast = searchEmptyPallet(crnNo, locTypeDto);
        }else {
            //满托盘
            locMast = searchMaxPallet(crnNo, findLocNoAttributeVo, locTypeDto);
        }
        if(locMast == null) {
            throw new CoolException(crnNo + "号堆垛机找不到符合尺寸的空库位");
        }
        StartupDto startupDto = new StartupDto();
        // 获取目标站
        Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>().eq("type_no", staDescId).eq("stn_no", sourceStaNo).eq("crn_no", locMast.getCrnNo());
        StaDesc staDesc = staDescService.selectOne(wrapper);
        if (Cools.isEmpty(staDesc)) {
            log.error("type_no={},stn_no={},crn_no={}", staDescId, sourceStaNo, crnNo);
            throw new CoolException("入库路径不存在");
        } else {
            BasDevp staNo = basDevpService.selectById(staDesc.getCrnStn());
            if (!staNo.getAutoing().equals("Y")) {
                log.error("目标站" + staDesc.getCrnStn() + "不可用");
                throw new CoolException("目标站"+staDesc.getCrnStn()+"不可用");
            }
            startupDto.setStaNo(staNo.getDevNo());
        }
        String locNo = locMast.getLocNo();
        // 生成工作号
        int workNo = getWorkNo(0);
        // 返回dto
        startupDto.setWorkNo(workNo);
        startupDto.setCrnNo(locMast.getCrnNo());
        startupDto.setSourceStaNo(sourceStaNo);
        startupDto.setLocNo(locNo);
        return startupDto;
    }
    public Integer queryDevpWorkingCount() {
        List<WrkMast> wrkMastsIn = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                .in("wrk_sts", 2, 3, 4, 5));
        List<WrkMast> wrkMastsOut = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                .in("wrk_sts", 12, 14, 15));
        int count = 0;
        count += wrkMastsIn.size();
        count += wrkMastsOut.size();
        return count;
    }
    //搜索满托盘库位
    public LocMast searchMaxPallet(Integer crnNo, FindLocNoAttributeVo findLocNoAttributeVo, LocTypeDto locTypeDto) {
        //获取堆垛机排
        List<Integer> rowList = locMastService.selectRowByCrnNo(crnNo);
        //获取深库位排
        List<Integer> deepRowList = new ArrayList<>();
        for (Integer row : rowList) {
            if (Utils.isDeepLoc(slaveProperties, row)) {
                deepRowList.add(row);
            }
        }
        LocMast targetLocMast = null;
        List<String> locNos = locDetlService.getSameDetlList(findLocNoAttributeVo.getMatnr(), deepRowList);
        for (String locNo : locNos) {
            //检测对应浅库位是否可用
            String shallowLocNo = Utils.getShallowLoc(slaveProperties, locNo);
            LocMast shallowLoc = locMastService.selectById(shallowLocNo);
            if (shallowLoc != null && shallowLoc.getLocSts().equals("O")) {
                if (VersionUtils.locMoveCheckLocTypeComplete(shallowLoc, locTypeDto)) {
                    targetLocMast = shallowLoc;
                    break;
                }
            }
        }
        if(targetLocMast == null) {
            if (crnNo == 1) {
                return searchMaxPalletByOne(crnNo, findLocNoAttributeVo, locTypeDto);
            }
            //相近物料匹配失败,搜索深库位可用空库位
            List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
                    .eq("crn_no", crnNo)
                    .eq("loc_sts", "O")
                    .in("row1", deepRowList)
                    .orderBy("lev1", true)
                    .orderBy("bay1", true));
            for (LocMast locMast : locMasts) {
                if (!VersionUtils.locMoveCheckLocTypeComplete(locMast, locTypeDto)) {
                    continue;
                }
                //深库位直接选择
                targetLocMast = locMast;
                break;
            }
            if(targetLocMast == null) {
                //深库位搜索失败,搜索可用空库位
                List<LocMast> shallowLocMasts = locMastService.selectList(new EntityWrapper<LocMast>()
                        .eq("crn_no", crnNo)
                        .eq("loc_sts", "O")
                        .orderBy("lev1", true)
                        .orderBy("bay1", true));
                for (LocMast locMast : shallowLocMasts) {
                    if (!VersionUtils.locMoveCheckLocTypeComplete(locMast, locTypeDto)) {
                        continue;
                    }
                    targetLocMast = locMast;
                    break;
                }
            }
        }
        return targetLocMast;
    }
    //1号堆垛机搜索逻辑
    public LocMast searchMaxPalletByOne(Integer crnNo, FindLocNoAttributeVo findLocNoAttributeVo, LocTypeDto locTypeDto) {
        List<Integer> nearRowList = new ArrayList<Integer>() {{
            add(4);
            add(6);
            add(3);
            add(1);
        }};
        LocMast targetLocMast = null;
        for (Integer row : nearRowList) {
            //相近物料匹配失败,搜索深库位可用空库位
            List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
                    .eq("crn_no", crnNo)
                    .eq("loc_sts", "O")
                    .eq("row1", row)
                    .orderBy("lev1", true)
                    .orderBy("bay1", true));
            for (LocMast locMast : locMasts) {
                if (!VersionUtils.locMoveCheckLocTypeComplete(locMast, locTypeDto)) {
                    continue;
                }
                //深库位直接选择
                targetLocMast = locMast;
                break;
            }
            if (targetLocMast != null) {
                break;
            }
        }
        return targetLocMast;
    }
    //搜索空托盘
    public LocMast searchEmptyPallet(Integer crnNo, LocTypeDto locTypeDto) {
        // 靠近摆放规则 --- 空托
        LocMast targetLocMast = null;
        List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
                .eq("loc_sts", "D")
                .eq("crn_no", crnNo)
        );
        for (LocMast loc : locMasts) {
            if (Utils.isShallowLoc(slaveProperties, loc.getLocNo())) {
                continue;
            }
            String shallowLocNo = Utils.getShallowLoc(slaveProperties, loc.getLocNo());
            // 检测目标库位是否为空库位
            LocMast shallowLoc = locMastService.selectById(shallowLocNo);
            if (shallowLoc != null && shallowLoc.getLocSts().equals("O")) {
                if (VersionUtils.locMoveCheckLocTypeComplete(shallowLoc, locTypeDto)) {
                    targetLocMast = shallowLoc;
                    break;
                }
            }
        }
        if (targetLocMast == null) {
            List<LocMast> locMastsList = locMastService.selectList(new EntityWrapper<LocMast>()
                    .eq("loc_sts", "O")
                    .eq("crn_no", crnNo)
                    .orderBy("lev1", false)
                    .orderBy("bay1", true));
            for (LocMast locMast : locMastsList) {
                if (!VersionUtils.locMoveCheckLocTypeComplete(locMast, locTypeDto)) {
                    continue;
                }
                boolean shallowLoc = Utils.isShallowLoc(slaveProperties, locMast.getLocNo());
                if (shallowLoc) {
                    //浅库位,先判断深库位
                    String deepLoc2 = Utils.getDeepLoc2(slaveProperties, locMast.getLocNo());
                    if (!Cools.isEmpty(deepLoc2)) {
                        LocMast locMast2 = locMastService.selectOne(new EntityWrapper<LocMast>()
                                .eq("loc_no", deepLoc2)
                                .eq("loc_sts", "O")
                                .eq("crn_no", crnNo)
                        );
                        if (!Cools.isEmpty(locMast2)) {
                            targetLocMast = locMast2;
                            break;
                        }
                    }
                }else {
                    //空的深库位直接选择
                    targetLocMast = locMast;
                    break;
                }
            }
        }
        return targetLocMast;
    }
//    /**
//     * 检索库位号
//     *
//     * @param staDescId            路径ID
//     * @param sourceStaNo          源站
//     * @param findLocNoAttributeVo 属性
//     * @param locTypeDto           类型
//     * @return locNo 检索到的库位号
//     */
//    @Transactional
//    public StartupDto getLocNo(Integer staDescId, Integer sourceStaNo, FindLocNoAttributeVo findLocNoAttributeVo, LocTypeDto locTypeDto) {
//        // try {
//        Integer whsType = Utils.GetWhsType(sourceStaNo);
//        RowLastno rowLastno = rowLastnoService.selectById(whsType);
//        RowLastnoType rowLastnoType = rowLastnoTypeService.selectById(rowLastno.getTypeId());
//        /**
//         * 库型 1: 标准堆垛机库  2: 平库  3: 穿梭板  4: 四向车  5: AGV  0: 未知
//         */
//        switch (rowLastnoType.getType()) {
//            case 1:
//                Config crnSearchDetectTaskCountConfig = configService.selectConfigByCode("crnSearchDetectTaskCount");
//                int crnSearchDetectTaskCount = Integer.parseInt(crnSearchDetectTaskCountConfig.getValue());
//
//                Config applyInTaskTotalCountConfig = configService.selectConfigByCode("applyInTaskTotalCount");
//                int applyInTaskTotalCount = Integer.parseInt(applyInTaskTotalCountConfig.getValue());
//                int crnNo = 7;
//                boolean flag = true;
//                List<String> data = new ArrayList<>();
//                while (crnNo > 1) {
//                    crnNo--;
//                    List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("loc_sts", "O").eq("crn_no", crnNo).eq("whs_type", rowLastnoType.getType().longValue()).eq("loc_type1", locTypeDto.getLocType1()).eq("loc_type2", locTypeDto.getLocType2()));
//                    if (locMasts.size() <= 15) {
//                        log.error(crnNo + "号堆垛机没有空库位!!! 尺寸规格: {}", JSON.toJSONString(locTypeDto));
//                        data.add(crnNo + "号没有空库位;");
//                    } else {
//                        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("crn_no", crnNo).in("io_type", 1, 10, 53, 57));
//                        if (wrkMasts.size() > crnSearchDetectTaskCount) {
//                            log.error(crnNo + "号堆垛机已达到入库控制上限!!! 任务数量: {}, 控制数量:{}", wrkMasts.size(), crnSearchDetectTaskCount);
//                            data.add(crnNo + "号入库控制上限;");
//                            continue;
//                        }
//                        List<WrkMast> wrkMastsList = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("crn_no", crnNo).in("io_type", 1, 10, 53, 57, 101, 103, 107, 110));
//                        if (wrkMastsList.size() > applyInTaskTotalCount) {
//                            log.error(crnNo + "号堆垛机已达到申请入库时总任务数量上限(入库、出库)!!! 任务数量: {}, 控制数量:{}", wrkMastsList.size(), applyInTaskTotalCount);
//                            data.add(crnNo + "号申请入库时总任务数量上限;");
//                            continue;
//                        }
//                        flag = false;
//                        break;
//                    }
//
//                }
//                if (!flag) {
//                    return getLocNoRun(whsType, staDescId, sourceStaNo, findLocNoAttributeVo, 0, locTypeDto, 0);
//                } else {
//                    log.info("数据:{}", data);
//                    throw new CoolException(data.toString());
//                }
//            case 2:
//                log.error("站点={} 未查询到对应的规则", sourceStaNo);
//                break;
//            case 3:
//                log.error("站点={} 未查询到对应的规则", sourceStaNo);
//                break;
//            case 4:
//                return getLocNoRun4(whsType, staDescId, sourceStaNo, findLocNoAttributeVo, 4, locTypeDto, 0);
//            case 5:
//                return getLocNoRun5(whsType, staDescId, sourceStaNo, findLocNoAttributeVo, 0, locTypeDto, 0);
//            default:
//                log.error("站点={} 未查询到对应的规则", sourceStaNo);
//                break;
//        }
//
////        } catch (Exception e) {
////            log.error("站点={} 未查询到对应的规则,{}", sourceStaNo, e.getMessage());
////        }
//        return null;
//    }
    /**
     * 检索库位号
     *
     * @param whsType              类型 1:双深式货架
     * @param staDescId            路径ID
     * @param sourceStaNo          源站
src/main/java/com/zy/common/web/WcsController.java
@@ -122,7 +122,7 @@
        // 检索库位
        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
        StartupDto dto = commonService.getLocNo(10, 12, findLocNoAttributeVo, locTypeDto);
        StartupDto dto = commonService.getLocNo(10, 12, findLocNoAttributeVo, locTypeDto, null);
        Date now = new Date();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
@@ -178,6 +178,7 @@
//        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(matnrs.get(0), batchs.get(0));
        WaitPakin waitPakin1 = waitPakins.get(0);
        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
        findLocNoAttributeVo.setMatnr(waitPakin1.getMatnr());
        //TODO 测试
//        StartupDto dto = new StartupDto();
@@ -188,7 +189,7 @@
//        dto.setLocNo(locMastxx.getLocNo());
//        dto.setWorkNo(Integer.parseInt((System.currentTimeMillis() + "").substring(10)));
        StartupDto dto = commonService.getLocNo( 1, devpNo,findLocNoAttributeVo, locTypeDto);
        StartupDto dto = commonService.getLocNo(1, devpNo, findLocNoAttributeVo, locTypeDto, barcode);
        if (dto == null) {
            throw new CoolException("找不到空库位");
        }
@@ -264,7 +265,7 @@
        // 检索库位
        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
        StartupDto dto = commonService.getLocNo(10, devpNo, findLocNoAttributeVo, locTypeDto);
        StartupDto dto = commonService.getLocNo(10, devpNo, findLocNoAttributeVo, locTypeDto, barcode);
        int workNo = dto.getWorkNo();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
src/main/resources/mapper/asrs/LocDetlMapper.xml
@@ -742,4 +742,17 @@
        ) t where t.row between ((#{pageNumber}-1)*#{pageSize}+1) and (#{pageNumber}*#{pageSize})
    </select>
    <select id="getSameDetlList" resultType="java.lang.String">
        SELECT ld.loc_no FROM asr_loc_detl ld
        LEFT JOIN asr_loc_mast lm ON ld.loc_no = lm.loc_no
        WHERE 1 = 1
        AND ld.matnr = #{matnr}
        AND lm.loc_sts = 'F'
        AND lm.row1 in
        <foreach collection="rows" item="item" index="index" separator="," open="(" close=")">
            #{item}
        </foreach>
        ORDER BY ld.appe_time ASC
    </select>
</mapper>
src/main/resources/mapper/asrs/LocMastMapper.xml
@@ -200,4 +200,10 @@
        </foreach>
    </select>
    <select id="selectRowByCrnNo" resultType="java.lang.Integer">
        select DISTINCT row1 from asr_loc_mast
        where crn_no = #{crnNo}
        order by row1
    </select>
</mapper>
src/main/resources/mapper/asrs/MatMapper.xml
@@ -44,6 +44,7 @@
        <result column="memo" property="memo" />
        <result column="stock" property="stock" />
        <result column="tscp" property="tscp" />
    </resultMap>
    <select id="listByPage" resultMap="BaseResultMap">