自动化立体仓库 - WMS系统
#
lsh
2024-06-19 7ace63f8e1f245d78ea8c9635686cd08a43765bb
#
1个文件已添加
12个文件已修改
770 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/LocMastController.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/LocMastMapper.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/LocMastService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/WrkMastService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/DigitAndSortUrils.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/Utils.java 83 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/service/CommonService.java 444 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/LocMastMapper.xml 79 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/image/logo.png 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/LocMastController.java
@@ -193,27 +193,24 @@
                        String locNo = String.format("%02d", r) + String.format("%03d", b) + String.format("%02d", l);
                        // 获取堆垛机号
                        int crnNo = 0;
                        if (basWhs.getIdentifying().equals("1") || basWhs.getIdentifying().equals("3")){
                            try{
                                Shelves shelves = new Shelves(param.getEndRow() - param.getStartRow() + 1, param.getCrnAmount(),param.getStartRow());
                                for (List<Integer> node : shelves.nodes){
                        try{
                            Shelves shelves = new Shelves(param.getEndRow() - param.getStartRow() + 1, param.getCrnAmount(),param.getStartRow());
                            for (List<Integer> node : shelves.nodes){
                                    if (node.contains(r)) {
                                        if (!Cools.isEmpty(param.getStaCrn()) && param.getStaCrn() > 0){
                                            crnNo = shelves.nodes.indexOf(node) + param.getStaCrn();
                                        }else {
                                            crnNo = shelves.nodes.indexOf(node) + 1;
                                        }
                                        break;
                                if (node.contains(r)) {
                                    if (!Cools.isEmpty(param.getStaCrn()) && param.getStaCrn() > 0){
                                        crnNo = shelves.nodes.indexOf(node) + param.getStaCrn();
                                    }else {
                                        crnNo = shelves.nodes.indexOf(node) + 1;
                                    }
                                    break;
                                }
                            }catch (Exception e){
                                throw new Exception("解析堆垛机号失败,请填写正确的数据!!!");
                            }
                        }else {
                            crnNo = param.getStaCrn();
                        }catch (Exception e){
                            throw new Exception("解析堆垛机号失败,请填写正确的数据!!!");
                        }
                        Date now =  new Date();
                        LocMast locMast = new LocMast();
                        locMast.setLocNo(locNo);
@@ -221,7 +218,7 @@
                        locMast.setRow1(r); // 排
                        locMast.setBay1(b); // 列
                        locMast.setLev1(l); // 层
                        locMast.setGro1(0); // 组
                        locMast.setGro1(r); // 组
                        locMast.setCrnNo(crnNo); // 堆垛机
                        locMast.setLocType1(!Cools.isEmpty(param.getLocType1()) ? param.getLocType1() : 1);
                        locMast.setLocType2(param.getLocType2());
src/main/java/com/zy/asrs/mapper/LocMastMapper.java
@@ -29,20 +29,28 @@
    /*
     * 获取目标库位所在巷道最浅非空库位  深>浅
     * */
    LocMast selectLocByLocStsPakInF1(@Param("locNos") List<String> locNos,@Param("whsType") Long whsType);
//    LocMast selectLocByLocStsPakInF1(@Param("locNos") List<String> locNos,@Param("whsType") Long whsType);
    LocMast selectLocByLocStsPakInF1(@Param("crnNo") Integer crnNo,@Param("bay") Integer bay,@Param("lev") Integer lev,@Param("gro") Integer gro,@Param("whsType") Long whsType);
    /*
     * 获取目标库位所在巷道最浅非空库位  深<浅
     * */
    LocMast selectLocByLocStsPakInF2(@Param("locNos") List<String> locNos,@Param("whsType") Long whsType);
//    LocMast selectLocByLocStsPakInF2(@Param("locNos") List<String> locNos,@Param("whsType") Long whsType);
    LocMast selectLocByLocStsPakInF2(@Param("crnNo") Integer crnNo,@Param("bay") Integer bay,@Param("lev") Integer lev,@Param("gro") Integer gro,@Param("whsType") Long whsType);
    /*
     * 获取目标库位所在巷道最深空库位  深>浅
     * */
    LocMast selectLocByLocStsPakInO1(@Param("locNos") List<String> locNos,@Param("whsType") Long whsType);
//    LocMast selectLocByLocStsPakInO1(@Param("locNos") List<String> locNos,@Param("whsType") Long whsType);
    LocMast selectLocByLocStsPakInO1(@Param("crnNo") Integer crnNo,@Param("bay") Integer bay,@Param("lev") Integer lev,@Param("gro") Integer gro,@Param("whsType") Long whsType);
    /*
     * 获取目标库位所在巷道最深空库位  深<浅
     * */
    LocMast selectLocByLocStsPakInO2(@Param("locNos") List<String> locNos,@Param("whsType") Long whsType);
//    LocMast selectLocByLocStsPakInO2(@Param("locNos") List<String> locNos,@Param("whsType") Long whsType);
    LocMast selectLocByLocStsPakInO2(@Param("crnNo") Integer crnNo,@Param("bay") Integer bay,@Param("lev") Integer lev,@Param("gro") Integer gro,@Param("whsType") Long whsType);
}
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.zy.asrs.entity.WrkMast;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
@@ -20,4 +21,6 @@
    @Select("select count(1) from asr_wrk_mast where 1=1 and io_type = #{ioType} and sta_no = #{staNo}")
    int selectWrkMastBareBoardStaNo(Integer ioType,Integer staNo);
    List<WrkMast> selectWrkMastWrkDetlMatnrBatch(@Param("ioType") Integer ioType, @Param("matnr") String matnr , @Param("batch") String batch , @Param("grade") String grade , @Param("crnNo") Integer crnNo);
}
src/main/java/com/zy/asrs/service/LocMastService.java
@@ -50,12 +50,14 @@
    /*
     * 获取目标库位所在巷道最浅非空库位
     * */
    LocMast selectLocByLocStsPakInF(Integer curRow,Integer nearRow,List<String> locNos);
    LocMast selectLocByLocStsPakInF(Integer curRow,Integer nearRow,List<String> locNos, Long whsType);
//    LocMast selectLocByLocStsPakInF(Integer curRow,Integer nearRow,List<String> locNos);
//    LocMast selectLocByLocStsPakInF(Integer curRow,Integer nearRow,List<String> locNos, Long whsType);
    LocMast selectLocByLocStsPakInF(Integer curRow,Integer nearRow,LocMast locNo, Long whsType);
    /*
     * 获取目标库位所在巷道最深空库位
     * */
    LocMast selectLocByLocStsPakInO(Integer curRow,Integer nearRow,List<String> locNos);
    LocMast selectLocByLocStsPakInO(Integer curRow,Integer nearRow,List<String> locNos, Long whsType);
//    LocMast selectLocByLocStsPakInO(Integer curRow,Integer nearRow,List<String> locNos);
//    LocMast selectLocByLocStsPakInO(Integer curRow,Integer nearRow,List<String> locNos, Long whsType);
    LocMast selectLocByLocStsPakInO(Integer curRow,Integer nearRow,LocMast locNoo, Long whsType);
}
src/main/java/com/zy/asrs/service/WrkMastService.java
@@ -23,4 +23,7 @@
    int getStoreCount(Integer crnNo);
    int selectWrkMastBareBoardStaNo(Integer ioType,Integer staNo);
    List<WrkMast> selectWrkMastWrkDetlMatnrBatch(Integer ioType,String matnr , String batch ,String grade,Integer crnNo);
}
src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java
@@ -71,38 +71,46 @@
    /*
     *获取目标库位所在巷道最浅非空库位
     * */
    @Override
    public LocMast selectLocByLocStsPakInF(Integer curRow,Integer nearRow,List<String> locNos) {
        if (curRow<nearRow){
            return this.baseMapper.selectLocByLocStsPakInF1(locNos,1L);
        }
        return this.baseMapper.selectLocByLocStsPakInF2(locNos,1L);
    }
//    @Override
//    public LocMast selectLocByLocStsPakInF(Integer curRow,Integer nearRow,List<String> locNos) {
//        if (curRow<nearRow){
//            return this.baseMapper.selectLocByLocStsPakInF1(locNos,1L);
//        }
//        return this.baseMapper.selectLocByLocStsPakInF2(locNos,1L);
//    }
//
//    @Override
//    public LocMast selectLocByLocStsPakInF(Integer curRow,Integer nearRow,List<String> locNos,Long type) {
//        if (curRow<nearRow){
//            return this.baseMapper.selectLocByLocStsPakInF1(locNos,type);
//        }
//        return this.baseMapper.selectLocByLocStsPakInF2(locNos,type);
//    }
    @Override
    public LocMast selectLocByLocStsPakInF(Integer curRow,Integer nearRow,List<String> locNos,Long type) {
    public LocMast selectLocByLocStsPakInF(Integer curRow,Integer nearRow,LocMast locMast,Long type) {
        if (curRow<nearRow){
            return this.baseMapper.selectLocByLocStsPakInF1(locNos,type);
            return this.baseMapper.selectLocByLocStsPakInF1(locMast.getCrnNo(),locMast.getBay1(),locMast.getLev1(),locMast.getGro1(),type);
        }
        return this.baseMapper.selectLocByLocStsPakInF2(locNos,type);
        return this.baseMapper.selectLocByLocStsPakInF2(locMast.getCrnNo(),locMast.getBay1(),locMast.getLev1(),locMast.getGro1(),type);
    }
    /*
     * 获取目标库位所在巷道最深空库位
     * */
//    @Override
//    public LocMast selectLocByLocStsPakInO(Integer curRow,Integer nearRow,List<String> locNos) {
//        if (curRow<nearRow){
//            return this.baseMapper.selectLocByLocStsPakInO1(locNos,1L);
//        }
//        return this.baseMapper.selectLocByLocStsPakInO2(locNos,1L);
//    }
    @Override
    public LocMast selectLocByLocStsPakInO(Integer curRow,Integer nearRow,List<String> locNos) {
    public LocMast selectLocByLocStsPakInO(Integer curRow,Integer nearRow,LocMast locMast,Long type) {
        if (curRow<nearRow){
            return this.baseMapper.selectLocByLocStsPakInO1(locNos,1L);
            return this.baseMapper.selectLocByLocStsPakInO1(locMast.getCrnNo(),locMast.getBay1(),locMast.getLev1(),locMast.getGro1(),type);
        }
        return this.baseMapper.selectLocByLocStsPakInO2(locNos,1L);
    }
    @Override
    public LocMast selectLocByLocStsPakInO(Integer curRow,Integer nearRow,List<String> locNos,Long type) {
        if (curRow<nearRow){
            return this.baseMapper.selectLocByLocStsPakInO1(locNos,type);
        }
        return this.baseMapper.selectLocByLocStsPakInO2(locNos,type);
        return this.baseMapper.selectLocByLocStsPakInO2(locMast.getCrnNo(),locMast.getBay1(),locMast.getLev1(),locMast.getGro1(),type);
    }
    @Override
src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java
@@ -50,4 +50,8 @@
        return this.baseMapper.selectWrkMastBareBoardStaNo(ioType,staNo);
    }
    @Override
    public List<WrkMast> selectWrkMastWrkDetlMatnrBatch(Integer ioType,String matnr , String batch ,String grade ,Integer crnNo) {
        return this.baseMapper.selectWrkMastWrkDetlMatnrBatch(ioType,matnr,batch,grade,crnNo);
    }
}
src/main/java/com/zy/asrs/utils/DigitAndSortUrils.java
New file
@@ -0,0 +1,24 @@
package com.zy.asrs.utils;
import java.util.Arrays;
public class DigitAndSortUrils {
    public static void main(String[] args) {
        int[] numbers = {5, 10, 15, 3, 8}; // 假设这是你的一组数字
        System.out.println(digitMax(numbers)+":max");
        System.out.println(digitMin(numbers)+":min");
    }
    public static Integer digitMax(int[] numbers) {
        int max = Arrays.stream(numbers).max().getAsInt();
        return max;
    }
    public static Integer digitMin(int[] numbers) {
        int min = Arrays.stream(numbers).min().getAsInt();
        return min;
    }
}
src/main/java/com/zy/asrs/utils/Utils.java
@@ -8,10 +8,12 @@
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.entity.RowLastno;
import com.zy.asrs.service.RowLastnoService;
import com.zy.common.CodeBuilder;
import com.zy.common.model.LocDetlDto;
import com.zy.common.properties.SlaveProperties;
import com.zy.common.service.CommonService;
import com.zy.system.service.UserService;
import java.text.DecimalFormat;
import java.util.ArrayList;
@@ -254,26 +256,24 @@
        return false;
    }
    public static int RowCount(Integer whsType, Integer curRow, Integer crnNumber) {
        return LocNecessaryParameters(whsType, curRow, crnNumber)[0];
    public static int RowCount(RowLastno rowLastno, Integer curRow, Integer crnNumber) {
        return LocNecessaryParameters(rowLastno, curRow, crnNumber)[0];
    }
    public static int getCurRow(Integer whsType, Integer curRow, Integer crnNumber) {
        return LocNecessaryParameters(whsType, curRow, crnNumber)[1];
    public static int getCurRow(RowLastno rowLastno, Integer curRow, Integer crnNumber) {
        return LocNecessaryParameters(rowLastno, curRow, crnNumber)[1];
    }
    public static int getCrnNo(Integer whsType, Integer curRow, Integer crnNumber) {
        return LocNecessaryParameters(whsType, curRow, crnNumber)[2];
    public static int getCrnNo(RowLastno rowLastno, Integer curRow, Integer crnNumber) {
        return LocNecessaryParameters(rowLastno, curRow, crnNumber)[2];
    }
    public static int getNearRow(Integer whsType, Integer curRow, Integer crnNumber) {
        return LocNecessaryParameters(whsType, curRow, crnNumber)[3];
    public static int getNearRow(RowLastno rowLastno, Integer curRow, Integer crnNumber) {
        return LocNecessaryParameters(rowLastno, curRow, crnNumber)[3];
    }
    //库位排号分配
    public static int[] LocNecessaryParameters(Integer whsType, Integer curRow, Integer crnNumber) {
        RowLastnoService rowLastnoService = SpringUtils.getBean(RowLastnoService.class);
        RowLastno rowLastno = rowLastnoService.selectById(whsType);
    public static int[] LocNecessaryParameters(RowLastno rowLastno, Integer curRow, Integer crnNumber) {
        switch (rowLastno.getTypeId()) {
            case 1://经典双伸库位
                return LocNecessaryParametersDoubleExtension(rowLastno, curRow, crnNumber); //已完善
@@ -285,6 +285,8 @@
                return LocNecessaryParametersDoubleExtension4(rowLastno, curRow, crnNumber); //未完善
            case 5://双工位单伸库位(4排货架)
                return LocNecessaryParametersDoubleExtension5(rowLastno, curRow, crnNumber); //已完善
            case 6://四向库(牛眼车)eg:光泰四向
                return LocNecessaryParametersDoubleExtension6(rowLastno, curRow, crnNumber); //已完善
            default:
                return LocNecessaryParametersMove(rowLastno, curRow, crnNumber);//moveCrnNo
        }
@@ -417,8 +419,8 @@
    //经典单双伸库位  左双右单(小双大单)
    public static int[] LocNecessaryParametersDoubleExtension4(RowLastno rowLastno, Integer curRow, Integer crnNumber) {
        int[] necessaryParameters = new int[]{0, 0, 0, 0};
        Integer sRow = rowLastno.getsRow();
        Integer sCrnNo = rowLastno.getsCrnNo();
        Integer sRow = rowLastno.getsRow();//起始排号
        Integer sCrnNo = rowLastno.getsCrnNo();//起始堆垛机号
        necessaryParameters[0] = crnNumber; // 轮询次数
        //满板正常入库
        if (curRow.equals(crnNumber * 3 + sRow - 1)) {
@@ -485,6 +487,53 @@
        return necessaryParameters;
    }
    //四向库(牛眼\光泰)
    public static int[] LocNecessaryParametersDoubleExtension6(RowLastno rowLastno, Integer curRow, Integer crnNumber) {
        int[] necessaryParameters = new int[]{0, 0, 0, 0};
        Integer sRow = rowLastno.getsRow();//起始排号
        Integer offset = 0;//起始排号
        Integer sCrnNo = rowLastno.getsCrnNo();//起始堆垛机号
        necessaryParameters[0] = crnNumber; // 轮询次数
        curRow = curRow - offset;
        //满板正常入库
        switch (curRow){
            case 2:
                necessaryParameters[1] = 4;    //curRow   最深库位排
                necessaryParameters[2] = sCrnNo;     //crnNo     堆垛机号
                necessaryParameters[3] = 7;    //nearRow  最浅库位排
                break;
            case 7:
                necessaryParameters[1] = 9;    //curRow   最深库位排
                necessaryParameters[2] = sCrnNo;     //crnNo     堆垛机号
                necessaryParameters[3] = 12;    //nearRow  最浅库位排
                break;
            case 12:
                necessaryParameters[1] = 7;    //curRow   最深库位排
                necessaryParameters[2] = sCrnNo;     //crnNo     堆垛机号
                necessaryParameters[3] = 4;    //nearRow  最浅库位排
                break;
            case 4:
                necessaryParameters[1] = 12;    //curRow   最深库位排
                necessaryParameters[2] = sCrnNo;     //crnNo     堆垛机号
                necessaryParameters[3] = 9;    //nearRow  最浅库位排
                break;
            case 9:
                necessaryParameters[1] = 14;    //curRow   最深库位排
                necessaryParameters[2] = sCrnNo;     //crnNo     堆垛机号
                necessaryParameters[3] = 14;    //nearRow  最浅库位排
                break;
            case 14:
                necessaryParameters[1] = 1;    //curRow   最深库位排
                necessaryParameters[2] = sCrnNo;     //crnNo     堆垛机号
                necessaryParameters[3] = 2;    //nearRow  最浅库位排
                break;
            default:
                throw new CoolException("库位排号异常:排号:" + curRow);
        }
        necessaryParameters[1] = necessaryParameters[1] + offset;
        necessaryParameters[3] = necessaryParameters[3] + offset;
        return necessaryParameters;
    }
    public static void main(String[] args) {
@@ -548,12 +597,12 @@
    // 外侧方向的货位  优先入库方向 ===>> 反之
    public static List<String> getGroupOutLocCrn(Integer curRow, Integer nearRow, String locNo, boolean pakin) {
        List<String> result = new ArrayList<>();
        if (pakin) {
            for (int row = curRow; row <= nearRow; row++) {
        if (pakin){
            for (int row = curRow;row>=nearRow;row--){
                result.add(zerofill(String.valueOf(row), 2) + locNo.substring(2));
            }
        } else {
            for (int row = curRow; row >= curRow; row--) {
        }else {
            for (int row = curRow;row<=nearRow;row++){
                result.add(zerofill(String.valueOf(row), 2) + locNo.substring(2));
            }
        }
src/main/java/com/zy/common/service/CommonService.java
@@ -54,6 +54,8 @@
    private LocDetlService locDetlService;
    @Autowired
    private SlaveProperties slaveProperties;
    @Autowired
    private WrkDetlService wrkDetlService;
    /**
     * 生成工作号
@@ -137,7 +139,7 @@
                    log.error("站点={} 未查询到对应的规则",sourceStaNo);
                    break;
                case 4:
                    return getLocNoRun(whsType,staDescId,sourceStaNo,matnr,batch,grade,0,locTypeDto,0);
                    return getLocNoRun2(whsType,staDescId,sourceStaNo,matnr,batch,grade,3,locTypeDto,0);
                case 5:
                    log.error("站点={} 未查询到对应的规则",sourceStaNo);
                    break;
@@ -182,14 +184,18 @@
        StartupDto startupDto = new StartupDto();
        RowLastno rowLastno = rowLastnoService.selectById(whsType);
        if (Cools.isEmpty(rowLastno)) {
            throw new CoolException("数据异常,请联系管理员===>库位规则未知");
        }
        RowLastnoType rowLastnoType = rowLastnoTypeService.selectById(rowLastno.getTypeId());
        if (Cools.isEmpty(rowLastnoType)) {
            throw new CoolException("数据异常,请联系管理员===》库位规则类型未知");
        }
        int sRow = rowLastno.getsRow();
        int eRow = rowLastno.geteRow();
        int crnNumber = rowLastno.getCrnQty();
        if (Cools.isEmpty(rowLastno)) {
            throw new CoolException("数据异常,请联系管理员");
        }
        // ===============>>>> 开始执行
        curRow = rowLastno.getCurrentRow();
@@ -204,7 +210,7 @@
        //此程序用于优化堆垛机异常时的运行时间
        for (int i = times; i < crnNumber*2; i++) {
            int[] locNecessaryParameters = Utils.LocNecessaryParameters(whsType, curRow, crnNumber);
            int[] locNecessaryParameters = Utils.LocNecessaryParameters(rowLastno, curRow, crnNumber);
            curRow = locNecessaryParameters[1];
            crnNo = locNecessaryParameters[2];
            if (basCrnpService.checkSiteError(crnNo, true)) {
@@ -251,14 +257,17 @@
                        .eq("row1", nearRow).eq("loc_sts", "O").eq("whs_type",rowLastnoType.getType().longValue()));
                for (LocMast locMast1:locMasts){
                    //获取巷道
                    List<String> groupOutsideLocCrn = Utils.getGroupOutLocCrn(curRow,nearRow,locMast1.getLocNo(), curRow>nearRow);
//                    List<String> groupOutsideLocCrn = Utils.getGroupOutLocCrn(curRow,nearRow,locMast1.getLocNo(), curRow>nearRow);
//                    LocMast locMastGro = locMastService.selectById(wrkMast.getLocNo());
                    //获取目标库位所在巷道最浅非空库位
                    LocMast locMastF = locMastService.selectLocByLocStsPakInF(curRow,nearRow,groupOutsideLocCrn,rowLastnoType.getType().longValue());
                    LocMast locMastF = locMastService.selectLocByLocStsPakInF(curRow,nearRow,locMast1,rowLastnoType.getType().longValue());
                    if (!Cools.isEmpty(locMastF) && locMastF.getLocSts().equals("F")){
                        LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no", locMastF.getLocNo()));
                        if (!Cools.isEmpty(locDetl) && matnr.equals(locDetl.getMatnr()) && batch.equals(Cools.isEmpty(locDetl.getBatch()) ? "" : locDetl.getBatch()) && grade.equals(Cools.isEmpty(locDetl.getBrand()) ? "" : locDetl.getBrand())) {
                            //获取目标库位所在巷道最浅非空库位
                            locMast = locMastService.selectLocByLocStsPakInO(curRow,nearRow,groupOutsideLocCrn,rowLastnoType.getType().longValue());
                        if (!Cools.isEmpty(locDetl) && matnr.equals(locDetl.getMatnr())
                                && batch.equals(batch.isEmpty() ? "" : locDetl.getBatch())
                                && grade.equals(grade.isEmpty() ? "" : locDetl.getBrand())) {
                            //获取目标库位所在巷道最深空库位
                            locMast = locMastService.selectLocByLocStsPakInO(curRow,nearRow,locMast1,rowLastnoType.getType().longValue());
                            break;
                        }
                    }
@@ -454,4 +463,419 @@
        return startupDto;
    }
    public StartupDto getLocNoRun2(Integer whsType, Integer staDescId, Integer sourceStaNo, String matnr, String batch, String grade, Integer moveCrnNo, LocTypeDto locTypeDto, int times) {
        if (Cools.isEmpty(matnr)) {  //物料号
            matnr = "";
        }
        if (Cools.isEmpty(batch)) {  //批次
            batch = "";
        }
        if (Cools.isEmpty(grade)) {  //备用
            grade = "";
        }
        // 初始化参数
        int crnNo = 0;      //堆垛机号
        int nearRow = 0;    //最浅库位排
        int curRow = 0;     //最深库位排
        int rowCount = 0;   //轮询轮次
        LocMast locMast = null;     // 目标库位
        StartupDto startupDto = new StartupDto();
        RowLastno rowLastno = rowLastnoService.selectById(whsType);
        if (Cools.isEmpty(rowLastno)) {
            throw new CoolException("数据异常,请联系管理员===>库位规则未知");
        }
        RowLastnoType rowLastnoType = rowLastnoTypeService.selectById(rowLastno.getTypeId());
        if (Cools.isEmpty(rowLastnoType)) {
            throw new CoolException("数据异常,请联系管理员===》库位规则类型未知");
        }
        int sRow = rowLastno.getsRow();
        int eRow = rowLastno.geteRow();
        int crnNumber = rowLastno.getCrnQty();
        // ===============>>>> 开始执行
        curRow = rowLastno.getCurrentRow();
        if (!Cools.isEmpty(moveCrnNo) && moveCrnNo!=0){
            crnNumber = moveCrnNo;
//            if (times==0){
//                curRow = moveCrnNo*4-1;
//            }else {
//                curRow = moveCrnNo*4-2;
//            }
        }
        //此程序用于优化堆垛机异常时的运行时间
        for (int i = times; i < crnNumber*2; i++) {
            int[] locNecessaryParameters = Utils.LocNecessaryParameters(rowLastno, curRow, crnNumber);
            curRow = locNecessaryParameters[1];
            crnNo = locNecessaryParameters[2];
            if (basCrnpService.checkSiteError(crnNo, true)) {
                rowCount =  locNecessaryParameters[0];
                nearRow = locNecessaryParameters[3];
                List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
                        .eq("crn_no", crnNo).eq("loc_sts", "O").eq("whs_type",rowLastnoType.getType().longValue()));
                if (locMasts.size()<=5){
                    times++;
                    continue;
                }
                break;
            } else {
                times++;
            }
        }
        if (crnNo == 0) {
            throw new CoolException("无可用库位");
        }
        // 相似工作档案 --- 同天同规格物料
        if (!Cools.isEmpty(matnr) && (staDescId == 1 || staDescId == 11 || staDescId == 111) ) {
            //查询相似工作档案
            List<WrkMast> wrkMasts = wrkMastService.selectWrkMastWrkDetlMatnrBatch(staDescId, matnr, batch,grade, crnNo);
            int nearbay = 0;    //相似工作档案 目标库位列
            int nearlev = 0;    //相似工作档案 目标库位层
            for (WrkMast wrkMast:wrkMasts){
                if (Cools.isEmpty(wrkMast.getLocNo())){
                    continue;
                }
                //目标排为最外层排
                if (Utils.getRow(wrkMast.getLocNo())==nearRow){
                    continue;
                }
                //起始站不一致
                if (!wrkMast.getSourceStaNo().equals(sourceStaNo)){
                    continue;
                }
                //相同列、层过滤
                if (Utils.getBay(wrkMast.getLocNo())==nearbay && Utils.getLev(wrkMast.getLocNo())==nearlev){
                    continue;
                }else {
                    nearbay=Utils.getBay(wrkMast.getLocNo());
                    nearlev=Utils.getLev(wrkMast.getLocNo());
                }
                //获取目标库位所在巷道并排序
//                List<String> groupOutsideLocCrn = Utils.getGroupOutLocCrn(curRow,nearRow,wrkMast.getLocNo(), curRow>nearRow);
                LocMast locMastGro = locMastService.selectById(wrkMast.getLocNo());
                //获取目标库位所在巷道最浅非空库位
                LocMast locMast2 = locMastService.selectLocByLocStsPakInF(curRow,nearRow,locMastGro,rowLastnoType.getType().longValue());
                //目标库位所在巷道最浅非空库位存在&&非最外侧库位&&入库状态
                if (!Cools.isEmpty(locMast2) && Utils.getRow(locMast2.getLocNo())!=nearRow && (locMast2.getLocSts().equals("S") || locMast2.getLocSts().equals("Q"))){
                    //获取库存明细
                    WrkDetl wrkDetl = wrkDetlService.selectOne(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
                    //判断同规格物料
                    if (!Cools.isEmpty(wrkDetl) && matnr.equals(wrkDetl.getMatnr())
                            && batch.equals(batch.isEmpty() ? "":wrkDetl.getBatch())
                            && grade.equals(grade.isEmpty()? "":wrkDetl.getBrand())){
                        int row2=0;
                        if (Utils.getRow(locMast2.getLocNo())>nearRow){
                            row2=Utils.getRow(locMast2.getLocNo())-1;
                        } else {
                            row2=Utils.getRow(locMast2.getLocNo())+1;
                        }
                        String targetLocNo = zerofill(String.valueOf(row2), 2) + locMast2.getLocNo().substring(2);
                        locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no",targetLocNo));
                        break;
                    }
                }
            }
        }
        // 相似工作档 --- 空托
        if (Cools.isEmpty(locMast) && staDescId == 10) {
            List<WrkMast> wrkMasts =wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("io_type",10).eq("crn_no",crnNo).eq("whs_type",rowLastnoType.getType().longValue()));
            int nearbay = 0;
            int nearlev = 0;
            for (WrkMast wrkMast:wrkMasts){
                if (Cools.isEmpty(wrkMast.getLocNo())){
                    continue;
                }
                if (Utils.getRow(wrkMast.getLocNo())==nearRow){
                    continue;
                }
                //起始站不一致
                if (!wrkMast.getSourceStaNo().equals(sourceStaNo)){
                    continue;
                }
                if (Utils.getBay(wrkMast.getLocNo())==nearbay && Utils.getLev(wrkMast.getLocNo())==nearlev){
                    continue;
                }else {
                    nearbay=Utils.getBay(wrkMast.getLocNo());
                    nearlev=Utils.getLev(wrkMast.getLocNo());
                }
//                List<String> groupOutsideLocCrn = Utils.getGroupOutLocCrn(curRow,nearRow,wrkMast.getLocNo(), curRow>nearRow);
                LocMast locMastGro = locMastService.selectById(wrkMast.getLocNo());
                LocMast locMast2 = locMastService.selectLocByLocStsPakInF(curRow,nearRow,locMastGro,rowLastnoType.getType().longValue());
                if (!Cools.isEmpty(locMast2) && Utils.getRow(locMast2.getLocNo())!=nearRow && locMast2.getLocSts().equals("S")){
                    int row2=0;
                    if (Utils.getRow(locMast2.getLocNo())>nearRow){
                        row2=Utils.getRow(locMast2.getLocNo())-1;
                    }else {
                        row2=Utils.getRow(locMast2.getLocNo())+1;
                    }
                    String targetLocNo = zerofill(String.valueOf(row2), 2) + locMast2.getLocNo().substring(2);
                    locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no",targetLocNo));
                    break;
                }
            }
        }
        boolean signRule1 = false;
        boolean signRule2 = false;
        if (Utils.BooleanWhsTypeStaIoType(rowLastno)){
            // 靠近摆放规则 --- 同天同规格物料 //分离版
            if (!Cools.isEmpty(matnr) &&  staDescId == 1){
                signRule1 = true;
            }
            // 靠近摆放规则 --- 同天同规格物料 //互通版
            if (!Cools.isEmpty(matnr) && staDescId == 1) {
                signRule2 = true;
            }
            if (!Cools.isEmpty(matnr) &&  (staDescId == 11 || staDescId == 111)) {
                signRule1 = true;
            }
        }
        if (signRule1){
            if (nearRow!=curRow){
                List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
                        .eq("row1", nearRow).eq("loc_sts", "O").eq("whs_type",rowLastnoType.getType().longValue()));
                for (LocMast locMast1:locMasts){
                    //获取巷道
//                    List<String> groupOutsideLocCrn = Utils.getGroupOutLocCrn(curRow,nearRow,locMast1.getLocNo(), curRow>nearRow);
                    //获取目标库位所在巷道最浅非空库位
                    LocMast locMastF = locMastService.selectLocByLocStsPakInF(curRow,nearRow,locMast1,rowLastnoType.getType().longValue());
                    if (!Cools.isEmpty(locMastF) && locMastF.getLocSts().equals("F")){
                        LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no", locMastF.getLocNo()));
                        if (!Cools.isEmpty(locDetl) && matnr.equals(locDetl.getMatnr())
                                && batch.equals(batch.isEmpty() ? "" : locDetl.getBatch())
                                && grade.equals(grade.isEmpty() ? "" : locDetl.getBrand())) {
                            //获取目标库位所在巷道最深空库位
                            locMast = locMastService.selectLocByLocStsPakInO(curRow,nearRow,locMast1,rowLastnoType.getType().longValue());
                            break;
                        }
                    }
                }
            }
        }else if (signRule2){
            List<String> locNos = locDetlService.getSameDetlToday(matnr, sRow, eRow);
            for (String locNo : locNos) {
                if (Utils.isShallowLoc(slaveProperties, locNo)) {
                    continue;
                }
                String shallowLocNo = Utils.getShallowLoc(slaveProperties, locNo);
                // 检测目标库位是否为空库位
                LocMast shallowLoc = locMastService.selectById(shallowLocNo);
                if (shallowLoc != null && shallowLoc.getLocSts().equals("O")) {
                    if (VersionUtils.locMoveCheckLocTypeComplete(shallowLoc, locTypeDto)) {
                        if (basCrnpService.checkSiteError(shallowLoc.getCrnNo(), true)) {
                            locMast = shallowLoc;
                            crnNo = locMast.getCrnNo();
                            break;
                        }
                    }
                }
            }
        }
        // 靠近摆放规则 --- 空托  //分离版
        if (staDescId == 10 && Utils.BooleanWhsTypeStaIoType(rowLastno)) {
            List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("row1", nearRow).eq("loc_sts", "O"));
            for (LocMast locMast1:locMasts){
                //获取巷道
//                List<String> groupOutsideLocCrn = Utils.getGroupOutLocCrn(curRow,nearRow,locMast1.getLocNo(), curRow>nearRow);
                //获取目标库位所在巷道最浅非空库位
                LocMast locMastF = locMastService.selectLocByLocStsPakInF(curRow,nearRow,locMast1,rowLastnoType.getType().longValue());
                if (!Cools.isEmpty(locMastF) && locMastF.getLocSts().equals("D")){
                    //获取目标库位所在巷道最浅非空库位
                    locMast = locMastService.selectLocByLocStsPakInO(curRow,nearRow,locMast1,rowLastnoType.getType().longValue());
                    break;
                }
            }
        }
//        // 靠近摆放规则 --- 空托 //互通版
//        if (staDescId == 10  && Utils.BooleanWhsTypeStaIoType(whsType)) {
//            List<LocMast> 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())) {
//                        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)) {
//                            if (basCrnpService.checkSiteError(shallowLoc.getCrnNo(), true)) {
//                                locMast = shallowLoc;
//                                crnNo = locMast.getCrnNo();
//                                break;
//                            }
//                        }
//                    }
//                }
//            }
//        }
        Wrapper<StaDesc> wrapper = null;
        StaDesc staDesc = null;
        BasDevp staNo = null;
        if (Utils.BooleanWhsTypeSta(rowLastno, staDescId)) {
            // 获取目标站
            wrapper = new EntityWrapper<StaDesc>()
                    .eq("type_no", staDescId)
                    .eq("stn_no", sourceStaNo)
                    .eq("crn_no", crnNo);
            staDesc = staDescService.selectOne(wrapper);
            if (Cools.isEmpty(staDesc)) {
                log.error("type_no={},stn_no={},crn_no={}", staDescId, sourceStaNo, crnNo);
//                throw new CoolException("入库路径不存在");
                crnNo = 0;
            }else {
                staNo = basDevpService.selectById(staDesc.getCrnStn());
                if (!staNo.getAutoing().equals("Y")) {
                    log.error("目标站"+staDesc.getCrnStn()+"不可用");
//                throw new CoolException("目标站"+staDesc.getCrnStn()+"不可用");
                    crnNo = 0;
                }
                startupDto.setStaNo(staNo.getDevNo());
            }
        }
        // 更新库位排号
        if (Utils.BooleanWhsTypeSta(rowLastno, staDescId) && Cools.isEmpty(locMast)) {
            rowLastno.setCurrentRow(curRow);
            rowLastnoService.updateById(rowLastno);
        }
        // 开始查找库位 ==============================>>
        // 1.按规则查找库位
        if (Cools.isEmpty(locMast) && crnNo != 0) {
            List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
                    .eq("row1", nearRow)
                    .eq("loc_sts", "O").eq("whs_type",rowLastnoType.getType().longValue())
                    .orderBy("lev1",true).orderBy("bay1",true));//最浅库位
            for (LocMast locMast1 : locMasts) {
                if (!VersionUtils.locMoveCheckLocTypeComplete(locMast1, locTypeDto)) {
                    continue;
                }
                if (Utils.BooleanWhsTypeStaIoType(rowLastno)){
//                    String shallowLoc = Utils.getDeepLocYTl(slaveProperties, locMast1.getLocNo());
//                    LocMast locMast2 = locMastService.selectOne(new EntityWrapper<LocMast>()
//                            .eq("loc_no", shallowLoc).eq("loc_sts", "O").eq("whs_type",rowLastnoType.getType().longValue()));
                    //获取目标库位所在巷道最深空库位
                    LocMast locMast2 = locMastService.selectLocByLocStsPakInO(curRow,nearRow,locMast1,rowLastnoType.getType().longValue());
                    if (!Cools.isEmpty(locMast2) && locMast2.getBay1()==curRow) {
                        locMast = locMast2;
                        break;
                    }
                }
            }
            //未找到  允许混料
            if (Cools.isEmpty(locMast) && Utils.BooleanWhsTypeStaIoType(rowLastno)){
                for (LocMast locMast1 : locMasts) {
                    if (!VersionUtils.locMoveCheckLocTypeComplete(locMast1, locTypeDto)) {
                        continue;
                    }
                    if (Utils.BooleanWhsTypeStaIoType(rowLastno)){
                        //获取目标库位所在巷道并排序
//                        List<String> groupOutsideLocCrn = Utils.getGroupOutLocCrn(curRow,nearRow,locMast1.getLocNo(), curRow>nearRow);
                        //获取目标库位所在巷道最浅非空库位
                        LocMast locMast2 = locMastService.selectLocByLocStsPakInF(curRow,nearRow,locMast1,rowLastnoType.getType().longValue());
                        if (Cools.isEmpty(locMast2)) {
                            LocMast locMast3 = locMastService.selectLocByLocStsPakInO(curRow,nearRow,locMast1,rowLastnoType.getType().longValue());
                            if (!Cools.isEmpty(locMast3)) {
                                locMast = locMast3;
                                break;
                            }
                        } else {
                            if ((locMast2.getLocSts().equals("F") && staDescId == 1) || (locMast2.getLocSts().equals("D") && staDescId == 10)){
                                LocMast locMast3 = locMastService.selectLocByLocStsPakInO(curRow,nearRow,locMast1,rowLastnoType.getType().longValue());
                                if (!Cools.isEmpty(locMast3)) {
                                    locMast = locMast3;
                                    break;
                                }
                            }
                        }
                    }
                }
            }
//            //未找到  找第一排
//            if (Cools.isEmpty(locMast) && Utils.BooleanWhsTypeStaIoType(rowLastno)){
//                locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
//                        .eq("row1", 1)
//                        .eq("loc_sts", "O")
//                        .orderBy("lev1",true).orderBy("bay1",true));
//                for (LocMast locMast1 : locMasts) {
//                    if (!VersionUtils.locMoveCheckLocTypeComplete(locMast1, locTypeDto)) {
//                        continue;
//                    }
//                    locMast = locMast1;
//                    break;
//                }
//            }
        }
        if (!Cools.isEmpty(locMast) && !basCrnpService.checkSiteError(crnNo, true)) {
            locMast = null;
        }
        // 递归查询
        if (Cools.isEmpty(locMast) || !locMast.getLocSts().equals("O")) {
            // 当前巷道无空库位时,递归调整至下一巷道,检索全部巷道无果后,跳出递归
            if (times < rowCount*2) {
                times = times + 1;
                return getLocNoRun(whsType, staDescId, sourceStaNo, matnr, batch, grade,moveCrnNo, locTypeDto, times);
            }
//            // 2.库位当前所属尺寸无空库位时,调整尺寸参数,向上兼容检索库位
//            if (locTypeDto.getLocType1() < 2) {
//                int i = locTypeDto.getLocType1() + 1;
//                locTypeDto.setLocType1((short)i);
//                return getLocNo(1, staDescId, sourceStaNo, matnr,batch,grade, locTypeDto, 0);
//            }
            log.error("系统没有空库位!!! 尺寸规格: {}, 轮询次数:{}", JSON.toJSONString(locTypeDto), times);
            throw new CoolException("没有空库位");
        }
        String locNo = locMast.getLocNo();
        // 生成工作号
        int workNo = getWorkNo(0);
        // 返回dto
        startupDto.setWorkNo(workNo);
        startupDto.setCrnNo(crnNo);
        startupDto.setSourceStaNo(sourceStaNo);
        startupDto.setLocNo(locNo);
        return startupDto;
    }
    public static String zerofill(String msg, Integer count) {
        if (msg.length() == count) {
            return msg;
        } else if (msg.length() > count) {
            return msg.substring(0, 16);
        } else {
            StringBuilder msgBuilder = new StringBuilder(msg);
            for(int i = 0; i < count - msg.length(); ++i) {
                msgBuilder.insert(0, "0");
            }
            return msgBuilder.toString();
        }
    }
}
src/main/resources/mapper/LocMastMapper.xml
@@ -102,51 +102,94 @@
        order by row1 desc
    </select>
<!--    <select id="selectLocByLocStsPakInF1" resultMap="BaseResultMap">-->
<!--        SELECT top 1 *-->
<!--        FROM [dbo].[asr_loc_mast]-->
<!--        WHERE 1=1-->
<!--        and whs_type=#{whsType}-->
<!--        and loc_no in-->
<!--        <foreach collection="locNos" item="locNo" index="index" open="(" close=")" separator=",">-->
<!--            #{locNo}-->
<!--        </foreach>-->
<!--        AND loc_sts not in ('O') order by row1-->
<!--    </select>-->
    <select id="selectLocByLocStsPakInF1" resultMap="BaseResultMap">
        SELECT top 1 *
        FROM [dbo].[asr_loc_mast]
        WHERE 1=1
        and whs_type=#{whsType}
        and loc_no in
        <foreach collection="locNos" item="locNo" index="index" open="(" close=")" separator=",">
            #{locNo}
        </foreach>
        and crn_no=#{crnNo}
        and bay1 = #{bay}
        and lev1 = #{lev}
        and gro1 = #{gro}
        AND loc_sts not in ('O') order by row1
    </select>
<!--    <select id="selectLocByLocStsPakInF2" resultMap="BaseResultMap">-->
<!--        SELECT top 1 *-->
<!--        FROM [dbo].[asr_loc_mast]-->
<!--        WHERE 1=1-->
<!--        and whs_type=#{whsType}-->
<!--        and loc_no in-->
<!--        <foreach collection="locNos" item="locNo" index="index" open="(" close=")" separator=",">-->
<!--            #{locNo}-->
<!--        </foreach>-->
<!--        AND loc_sts not in ('O') order by row1 desc-->
<!--    </select>-->
    <select id="selectLocByLocStsPakInF2" resultMap="BaseResultMap">
        SELECT top 1 *
        FROM [dbo].[asr_loc_mast]
        WHERE 1=1
        and whs_type=#{whsType}
        and loc_no in
        <foreach collection="locNos" item="locNo" index="index" open="(" close=")" separator=",">
            #{locNo}
        </foreach>
        and crn_no=#{crnNo}
        and bay1 = #{bay}
        and lev1 = #{lev}
        and gro1 = #{gro}
        AND loc_sts not in ('O') order by row1 desc
    </select>
<!--    <select id="selectLocByLocStsPakInO1" resultMap="BaseResultMap">-->
<!--        SELECT top 1 *-->
<!--        FROM [dbo].[asr_loc_mast]-->
<!--        WHERE 1=1-->
<!--        and whs_type=#{whsType}-->
<!--        and loc_no in-->
<!--        <foreach collection="locNos" item="locNo" index="index" open="(" close=")" separator=",">-->
<!--            #{locNo}-->
<!--        </foreach>-->
<!--        AND loc_sts in ('O') order by row1 desc-->
<!--    </select>-->
    <select id="selectLocByLocStsPakInO1" resultMap="BaseResultMap">
        SELECT top 1 *
        FROM [dbo].[asr_loc_mast]
        WHERE 1=1
        and whs_type=#{whsType}
        and loc_no in
        <foreach collection="locNos" item="locNo" index="index" open="(" close=")" separator=",">
            #{locNo}
        </foreach>
        and crn_no=#{crnNo}
        and bay1 = #{bay}
        and lev1 = #{lev}
        and gro1 = #{gro}
        AND loc_sts in ('O') order by row1 desc
    </select>
<!--    <select id="selectLocByLocStsPakInO2" resultMap="BaseResultMap">-->
<!--        SELECT top 1 *-->
<!--        FROM [dbo].[asr_loc_mast]-->
<!--        WHERE 1=1-->
<!--        and whs_type=#{whsType}-->
<!--        and loc_no in-->
<!--        <foreach collection="locNos" item="locNo" index="index" open="(" close=")" separator=",">-->
<!--            #{locNo}-->
<!--        </foreach>-->
<!--        AND loc_sts in ('O') order by row1-->
<!--    </select>-->
    <select id="selectLocByLocStsPakInO2" resultMap="BaseResultMap">
        SELECT top 1 *
        FROM [dbo].[asr_loc_mast]
        WHERE 1=1
        and whs_type=#{whsType}
        and loc_no in
        <foreach collection="locNos" item="locNo" index="index" open="(" close=")" separator=",">
            #{locNo}
        </foreach>
        and crn_no=#{crnNo}
        and bay1 = #{bay}
        and lev1 = #{lev}
        and gro1 = #{gro}
        AND loc_sts in ('O') order by row1
    </select>
src/main/resources/mapper/WrkMastMapper.xml
@@ -75,4 +75,29 @@
        order by io_time,wrk_no asc
    </select>
    <select id="selectWrkMastWrkDetlMatnrBatch" resultMap="BaseResultMap">
        select m.* from asr_wrk_mast m,asr_wrk_detl d
        where 1=1
        and m.wrk_no = d.wrk_no
        and m.io_type = #{ioType}
        and m.crn_no = #{crnNo}
        and d.matnr = #{matnr}
        <choose>
            <when test="batch != null and batch != ''">
                and d.batch = #{batch}
            </when>
            <otherwise>
                and (d.batch IS NULL OR d.batch = '')
            </otherwise>
        </choose>
        <choose>
            <when test="grade != null and grade != ''">
                and d.brand = #{grade}
            </when>
            <otherwise>
                and (d.brand IS NULL OR d.brand = '')
            </otherwise>
        </choose>
    </select>
</mapper>
src/main/webapp/static/image/logo.png