自动化立体仓库 - WMS系统
59edf651d9fe7da0662d16c43d3e31e3dd80e9fa..f8ee1bea8543296792f23489d142e8b3231cd66c
2025-12-16 dubin
#1
f8ee1b 对比 | 目录
2025-12-16 dubin
#1
44c51c 对比 | 目录
2025-12-16 dubin
#1
c809a0 对比 | 目录
2个文件已添加
17个文件已修改
359 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/entity/result/FindLocNoAttributeVo.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/BasCrnpMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/LocDetlMapper.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/LocMastMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/BasCrnpService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/LocDetlService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/LocMastService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasCrnpServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/Utils.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/LocGroupOrder.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/properties/SlaveProperties.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/service/CommonService.java 205 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/WcsController.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasCrnpMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/LocDetlMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/LocMastMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/result/FindLocNoAttributeVo.java
New file
@@ -0,0 +1,17 @@
package com.zy.asrs.entity.result;
import lombok.Data;
@Data
public class FindLocNoAttributeVo {
    private String matnr = "";
    private String specs = "";
    private String batch = "";
    private String grade = "";
    private String brand = "";
}
src/main/java/com/zy/asrs/mapper/BasCrnpMapper.java
@@ -5,8 +5,11 @@
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;
@Mapper
@Repository
public interface BasCrnpMapper extends BaseMapper<BasCrnp> {
    List<Integer> getLevList();
}
src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
@@ -80,4 +80,5 @@
    List<LocDetl> selectLocDetlUnilateralMoveShuttleY(@Param("matnr")String matnr,@Param("batch")String batch,@Param("grade")String grade);
    List<LocDetl> selectLocDetlUnilateralMoveShuttleN(@Param("matnr")String matnr,@Param("batch")String batch,@Param("grade")String grade);
    List<String> getSameDetlList(String matnr);
}
src/main/java/com/zy/asrs/mapper/LocMastMapper.java
@@ -55,4 +55,6 @@
    LocMast selectLocByLocStsPakInO2(@Param("crnNo") Integer crnNo,@Param("bay") Integer bay,@Param("lev") Integer lev,@Param("gro") Integer gro,@Param("whsType") Long whsType);
    List<LocMast> queryFreeLocMast2(Short locType1, Integer rowBeg, Integer rowEnd, Integer bayBeg, Integer bayEnd, Integer levBeg, Integer levEnd);
    List<Integer> getLevList();
}
src/main/java/com/zy/asrs/service/BasCrnpService.java
@@ -3,10 +3,13 @@
import com.baomidou.mybatisplus.service.IService;
import com.zy.asrs.entity.BasCrnp;
import java.util.List;
public interface BasCrnpService extends IService<BasCrnp> {
    BasCrnp checkSiteStatus(Integer crnId);
    boolean checkSiteError(Integer crnNo, boolean pakin);
    List<Integer> getLevList();
}
src/main/java/com/zy/asrs/service/LocDetlService.java
@@ -71,4 +71,6 @@
    List<Map<String, Object>> selectLocDetlUnilateralMoveShuttleMap(Integer crnNo);
    List<LocDetl> selectLocDetlUnilateralMoveShuttle(String matnr,String batch,String grade,Integer crnNo);
    List<String> getSameDetlList(String matnr);
}
src/main/java/com/zy/asrs/service/LocMastService.java
@@ -66,4 +66,5 @@
     */
    List<LocMast> queryFreeLocMast2(Short locType1, Integer rowBeg, Integer rowEnd, Integer bayBeg, Integer bayEnd, Integer levBeg, Integer levEnd);
    List<Integer> getLevList();
}
src/main/java/com/zy/asrs/service/impl/BasCrnpServiceImpl.java
@@ -13,6 +13,9 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
@Slf4j
@Service("basCrnpService")
public class BasCrnpServiceImpl extends ServiceImpl<BasCrnpMapper, BasCrnp> implements BasCrnpService {
@@ -78,4 +81,9 @@
        return true;
    }
    @Override
    public List<Integer> getLevList() {
        return this.baseMapper.getLevList();
    }
}
src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
@@ -8,6 +8,7 @@
import com.zy.asrs.service.LocDetlService;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -147,4 +148,9 @@
        }
        return this.baseMapper.selectLocDetlUnilateralMoveShuttleN(matnr,batch,grade);
    }
    @Override
    public List<String> getSameDetlList(String matnr) {
        return this.baseMapper.getSameDetlList(matnr);
    }
}
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 @@
    public List<LocMast> queryFreeLocMast2(Short locType1, Integer rowBeg, Integer rowEnd, Integer bayBeg, Integer bayEnd, Integer levBeg, Integer levEnd) {
        return this.baseMapper.queryFreeLocMast2(locType1, rowBeg, rowEnd, bayBeg, bayEnd, levBeg, levEnd);
    }
    @Override
    public List<Integer> getLevList() {
        return this.baseMapper.getLevList();
    }
}
src/main/java/com/zy/asrs/utils/Utils.java
@@ -10,6 +10,7 @@
import com.zy.asrs.service.RowLastnoService;
import com.zy.common.CodeBuilder;
import com.zy.common.model.LocDetlDto;
import com.zy.common.model.LocGroupOrder;
import com.zy.common.properties.SlaveProperties;
import com.zy.common.service.CommonService;
import com.zy.system.service.UserService;
@@ -631,4 +632,48 @@
        return result;
    }
    public static List<Integer> getLocGroupDesc(SlaveProperties slaveProperties, String locNo) {
        List<Integer> copy = getLocGroupAsc(slaveProperties,locNo);
        Collections.reverse(copy);
        return copy;
    }
    public static String getLocNo(Integer row, int bay, int lev) {
        return zerofill(String.valueOf(row), 2) + zerofill(String.valueOf(bay), 3) + zerofill(String.valueOf(lev), 2);
    }
    public static List<Integer> getLocGroupAsc(SlaveProperties slaveProperties, String locNo) {
        LocGroupOrder checkOrder = findLocGroupOrder(slaveProperties, locNo);
        List<Integer> rowList = checkOrder.getRowList();
        return new ArrayList<>(rowList);
    }
    public static LocGroupOrder findLocGroupOrder(SlaveProperties slaveProperties, String locNo) {
        int row1 = Utils.getRow(locNo);
        int bay1 = Utils.getBay(locNo);
        List<LocGroupOrder> locGroupAscOrder = slaveProperties.getLocGroupAscOrder();
        LocGroupOrder checkOrder = null;
        for (LocGroupOrder order : locGroupAscOrder) {
            if (!order.getRowList().contains(row1)){
                continue;
            }
            if (bay1 < order.getMinBay()){
                continue;
            }
            if (bay1 > order.getMaxBay()){
                continue;
            }
            checkOrder = order;
        }
        if (checkOrder == null){
            throw new RuntimeException(locNo + "库位号,未定义库位组规则");
        }
        return checkOrder;
    }
}
src/main/java/com/zy/common/model/LocGroupOrder.java
New file
@@ -0,0 +1,14 @@
package com.zy.common.model;
import lombok.Data;
import java.util.List;
@Data
public class LocGroupOrder {
    private List<Integer> rowList;
    private Integer minBay;
    private Integer maxBay;
}
src/main/java/com/zy/common/properties/SlaveProperties.java
@@ -1,5 +1,6 @@
package com.zy.common.properties;
import com.zy.common.model.LocGroupOrder;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@@ -25,4 +26,6 @@
    private int groupCount;
    private List<LocGroupOrder> locGroupAscOrder;
}
src/main/java/com/zy/common/service/CommonService.java
@@ -6,6 +6,7 @@
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.result.FindLocNoAttributeVo;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.Utils;
import com.zy.asrs.utils.VersionUtils;
@@ -17,7 +18,9 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.sql.rowset.WebRowSet;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
@@ -136,6 +139,208 @@
        return null;
    }
    @Transactional
    public StartupDto getLocNoNew(Integer staDescId, Integer sourceStaNo,FindLocNoAttributeVo findLocNoAttributeVo,LocTypeDto locTypeDto,String barcode){
        StartupDto startupDto = null;
        StringBuilder builder = new StringBuilder();
        try {
            startupDto = searchLocNoByCrnNo(staDescId,sourceStaNo,findLocNoAttributeVo,locTypeDto);
        }catch (Exception e){
            builder.append(e.getMessage()).append(",");
        }
        if (startupDto == null){
            builder.append("找不到空库位");
            throw new CoolException(builder.toString());
        }
        return startupDto;
    }
    @Transactional
    public StartupDto searchLocNoByCrnNo(Integer staDescId,Integer sourceStaNo,FindLocNoAttributeVo findLocNoAttributeVo,LocTypeDto locTypeDto){
        LocMast locMast = null;
        if (staDescId == 10){
            //搜索空托盘
            locMast = searchEmptyPallet(locTypeDto);
        }else {
            //满托盘
            locMast = searchMaxPallet(findLocNoAttributeVo,locTypeDto);
        }
        if (locMast == null){
            throw new CoolException("找不到符合尺寸的空库位");
        }
        StartupDto startupDto = new StartupDto();
        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 LocMast searchMaxPallet(FindLocNoAttributeVo findLocNoAttributeVo, LocTypeDto locTypeDto){
        LocMast targetLocMast = null;
        List<String> locNos = locDetlService.getSameDetlList(findLocNoAttributeVo.getMatnr());
        for (String locNo : locNos) {
            //获取通道组
            List<Integer> locRowGroupDesc = Utils.getLocGroupDesc(slaveProperties,locNo);
            for (Integer row : locRowGroupDesc) {
                String deepLocNo = Utils.getLocNo(row,Utils.getBay(locNo),Utils.getLev(locNo));
                LocMast deepLoc = locMastService.selectById(deepLocNo);
                if (deepLoc == null){
                    continue;
                }
                if (deepLoc.getLocSts().equals("F")){
                    continue;
                }else if (deepLoc.getLocSts().equals("O")){
                    targetLocMast = deepLoc;
                    break;
                }else {
                    break;
                }
            }
        }
        if (targetLocMast == null){
            //相近物料匹配失败,搜索可用空库位组
            //获取设备楼层
            List<Integer> levList = basCrnpService.getLevList();
            Collections.shuffle(levList);
            List<Integer> locLevList = locMastService.getLevList();
            levList.addAll(locLevList);
            for (Integer lev : levList) {
                List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("loc_sts", "O").eq("lev1", lev).orderBy("bay1", true));
                for (LocMast locMast : locMasts) {
                    String locNo = locMast.getLocNo();
                    //获取通道组
                    List<Integer> locRowGroupDesc = Utils.getLocGroupDesc(slaveProperties,locNo);
                    boolean flag = true;
                    for (Integer row : locRowGroupDesc) {
                        String deepLocNo = Utils.getLocNo(row,Utils.getBay(locNo),Utils.getLev(locNo));
                        LocMast deepLoc = locMastService.selectById(deepLocNo);
                        if (deepLoc == null){
                            continue;
                        }
                        if (!deepLoc.getLocSts().equals("O")){
                            flag = false;
                            break;
                        }
                    }
                    if (flag){
                        for (Integer row : locRowGroupDesc) {
                            String deepLocNo = Utils.getLocNo(row,Utils.getBay(locNo),Utils.getLev(locNo));
                            LocMast deepLoc = locMastService.selectById(deepLocNo);
                            if (deepLoc == null){
                                continue;
                            }
                            targetLocMast = deepLoc;
                            break;
                        }
                        break;
                    }
                }
                if (targetLocMast != null){
                    break;
                }
            }
        }
        return targetLocMast;
    }
    //搜索空托盘库位
    public LocMast searchEmptyPallet(LocTypeDto locTypeDto){
        LocMast targetLocMast = null;
        List<LocMast> locMastsD = locMastService.selectList(new EntityWrapper<LocMast>().eq("loc_sts", "D"));
        for (LocMast locMast : locMastsD) {
            String locNo = locMast.getLocNo();
            //获取通道组
            List<Integer> locGroupDesc = Utils.getLocGroupDesc(slaveProperties, locNo);
            for (Integer row : locGroupDesc) {
                String deepLocNo = Utils.getLocNo(row, Utils.getBay(locNo), Utils.getLev(locNo));
                LocMast deepLoc = locMastService.selectById(deepLocNo);
                if (deepLoc == null){
                    continue;
                }
                if (deepLoc.getLocSts().equals("F")){
                    continue;
                }else if (deepLoc.getLocSts().equals("O")){
                    targetLocMast = deepLoc;
                    break;
                }else {
                    break;
                }
            }
        }
        if (targetLocMast == null){
            //获取设备楼层
            List<Integer> levList = basCrnpService.getLevList();
            Collections.shuffle(levList);
            List<Integer> locLevList = locMastService.getLevList();
            levList.addAll(locLevList);
            for (Integer lev : levList) {
                //相近物料匹配失败,搜索可用空库位组
                List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("loc_sts", "O").eq("lev1", lev).orderBy("bay1", true));
                for (LocMast locMast : locMasts) {
                    String locNo = locMast.getLocNo();
                    //获取通道组
                    List<Integer> locGroupDesc = Utils.getLocGroupDesc(slaveProperties, locNo);
                    boolean flag = true;
                    for (Integer row : locGroupDesc) {
                        String deepLocNo = Utils.getLocNo(row, Utils.getBay(locNo), Utils.getLev(locNo));
                        LocMast deepLoc = locMastService.selectById(deepLocNo);
                        if (deepLoc == null){
                            continue;
                        }
                        if (!deepLoc.getLocSts().equals("O")){
                            flag = false;
                            break;
                        }
                    }
                    if (flag){
                        for (Integer row : locGroupDesc) {
                            String deepLocNo = Utils.getLocNo(row, Utils.getBay(locNo), Utils.getLev(locNo));
                            LocMast deepLoc = locMastService.selectById(deepLocNo);
                            if (deepLoc == null){
                                continue;
                            }
                            targetLocMast = deepLoc;
                            break;
                        }
                        break;
                    }
                }
                if (targetLocMast != null){
                    break;
                }
            }
        }
        return targetLocMast;
    }
    /**
     * 检索库位号
     *
src/main/java/com/zy/common/web/WcsController.java
@@ -10,6 +10,7 @@
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.EmptyPlateOutParam;
import com.zy.asrs.entity.param.StatusParam;
import com.zy.asrs.entity.result.FindLocNoAttributeVo;
import com.zy.asrs.mapper.WrkMastMapper;
import com.zy.asrs.service.*;
import com.zy.common.CodeRes;
@@ -174,7 +175,8 @@
        StartupDto dto = null;
        dto = emptyPlateIn(Integer.valueOf(param.getFromPort()), locTypeDto);
//        dto = emptyPlateIn(Integer.valueOf(param.getFromPort()), locTypeDto);
        dto = startupFullPutStore(Integer.valueOf(param.getFromPort()), null, locTypeDto, null);
        log.info("WCS入库接口返参:{},托盘码:{}", dto);
        return Re.ok();
    }
@@ -239,9 +241,14 @@
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
        // 检索库位
        List<String> matnrs = waitPakins.stream().map(WaitPakin::getMatnr).distinct().collect(Collectors.toList());
        List<String> batchs = waitPakins.stream().map(WaitPakin::getBatch).distinct().collect(Collectors.toList());
        StartupDto dto = commonService.getLocNo(1, devpNo, matnrs.get(0), batchs.get(0), null, locTypeDto);
//        List<String> matnrs = waitPakins.stream().map(WaitPakin::getMatnr).distinct().collect(Collectors.toList());
//        List<String> batchs = waitPakins.stream().map(WaitPakin::getBatch).distinct().collect(Collectors.toList());
        WaitPakin waitPakin1 = waitPakins.get(0);
        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
        findLocNoAttributeVo.setMatnr(waitPakin1.getMatnr());
//        StartupDto dto = commonService.getLocNo(1, devpNo, matnrs.get(0), batchs.get(0), null, locTypeDto);
        StartupDto dto = commonService.getLocNoNew(1, devpNo, findLocNoAttributeVo, locTypeDto,barcode);
        if (dto == null) {
            throw new CoolException("没有检索到空库位");
        }
@@ -270,6 +277,8 @@
        // 操作人员数据
        wrkMast.setAppeTime(now);
        wrkMast.setModiTime(now);
        wrkMast.setModiUser(waitPakin1.getModiUser());
        wrkMast.setAppeUser(waitPakin1.getAppeUser());
        boolean res = wrkMastService.insert(wrkMast);
        if (!res) {
            throw new CoolException("保存工作档失败");
src/main/resources/application.yml
@@ -48,11 +48,16 @@
# 下位机配置
wcs-slave:
  # 双深
  doubleDeep: true
  #doubleDeep: true
  # 双深库位排号
  doubleLocs: 1,2,3,4,5
  #doubleLocs: 1,2,3,4,5
  # 一个堆垛机负责的货架排数
  groupCount: 4
  #groupCount: 4
  # 由浅入深
  locGroupAscOrder: [
    {rowList: [1],minBay: 1,maxBay: 16},
    {rowList: [2,3,4,5,6],minBay: 1,maxBay: 16},
  ]
  #是否开启wms下发任务给wcs
  workIssued-fig : true
  #地址
src/main/resources/mapper/BasCrnpMapper.xml
@@ -28,4 +28,8 @@
        <result column="origin" property="origin" />
    </resultMap>
    <select id="getLevList" resultType="integer">
        select distinct lev1 from asr_bas_crnp
    </select>
</mapper>
src/main/resources/mapper/LocDetlMapper.xml
@@ -409,4 +409,12 @@
        order by row1
    </select>
    <select id="getSameDetlList" resultMap="java.lang.String">
        select ld.loc_no from asr_loc_detl as ld
        left join asr_loc_mast as lm on ld.loc_no = lm.loc_no
        where 1 = 1
        and ld.matnr = #{matnr}
        and lm.loc_sts = 'F'
        order by ld.appe_time asc
    </select>
</mapper>
src/main/resources/mapper/LocMastMapper.xml
@@ -223,4 +223,7 @@
            order by loc_sts desc ,row1 desc,lev1 asc,bay1 asc
        </select>
    <select id="getLevList" resultType="integer">
        select distinct lev1 from asr_loc_mast
    </select>
</mapper>