自动化立体仓库 - WMS系统
#
lsh
2025-04-08 abc40d18cdfde0826bd7ae1377e9973cff3eefb8
src/main/java/com/zy/asrs/task/handler/BareBoardHandler.java
@@ -21,9 +21,7 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.*;
/**
 * Created by Monkey D. Luffy on 2023.07.24
@@ -45,34 +43,85 @@
    @Autowired
    private BasCrnpService basCrnpService;
    public ReturnT<String> start() {
    public static final List<Integer> rows1 = new ArrayList<Integer>() {{
        add(1);add(5);add(9);add(13);add(17);add(21);
    }};
    public static final List<Integer> rows2 = new ArrayList<Integer>() {{
        add(4);add(8);add(12);add(16);add(20);add(24);
    }};
    public ReturnT<String> start(Integer staNo) {
        try {
            if (!Cools.isEmpty(wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("io_type", 110).eq("staNo", 213)))){
            if (!Cools.isEmpty(wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("io_type", 110).eq("sta_no", staNo)))){
                return null;
            }
            // 获取工作号
            int workNo = commonService.getWorkNo(WorkNoType.PAKOUT.type);
            ArrayList<Integer> crns =new ArrayList<>();
            List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>().eq("crn_sts", 3).eq("out_enable", "Y").eq("wrk_no", 0));
            for (BasCrnp basCrnp : basCrnps){
                crns.add(basCrnp.getCrnNo());
            }
            crns.add(1);
            crns.add(2);
            crns.add(3);
            crns.add(4);
            crns.add(5);
            crns.add(6);
            boolean sign = true;
            ArrayList<Integer> crnList =new ArrayList<>();
            int[] crnCount = new int[6];
            for (Integer crnNo : crns){
                int crnCountD = locMastService.selectCount(new EntityWrapper<LocMast>().eq("loc_sts", "D").eq("crn_no", crnNo));
                crnCount[crnNo-1] = crnCountD;
            }
            int[] sortedCrnNos = getSortedCrnNos(crnCount);
            for (int crnNo : sortedCrnNos){
                crnList.add(crnNo);
            }
            crnList.add(6);
            crnList.add(1);
            crnList.add(4);
            crnList.add(3);
            crnList.add(5);
            crnList.add(2);
//            List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>().eq("crn_sts", 3).eq("out_enable", "Y").eq("wrk_no", 0));
//            for (BasCrnp basCrnp : basCrnps){
//                crns.add(basCrnp.getCrnNo());
//            }
            boolean sign = true;
            for (Integer crnNo : crnList){
                BasCrnp basCrnp = basCrnpService.selectById(crnNo);
                if (basCrnp.getCrnSts()!=3 || !basCrnp.getOutEnable().equals("Y")){
                    continue;
                }
                sign = true;
                // 获取库位
                LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts","D").eq("crn_no",crnNo));
                if (Cools.isEmpty(locMast)) {
//                    throw new CoolException("库中无空板!!!");
                    sign=false;
                }
                if (sign){
                    if (rows1.contains(locMast.getRow1())){
                        LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", "D").eq("row1", locMast.getRow1() + 1)
                                .eq("bay1", locMast.getBay1()).eq("lev1", locMast.getLev1()));
                        if (!Cools.isEmpty(locMast1)) {
                            locMast = locMast1;
                        }
                    }else if (rows2.contains(locMast.getRow1())){
                        LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", "D").eq("row1", locMast.getRow1() - 1)
                                .eq("bay1", locMast.getBay1()).eq("lev1", locMast.getLev1()));
                        if (!Cools.isEmpty(locMast1)) {
                            locMast = locMast1;
                        }
                    }
                }
                if (sign && Cools.isEmpty(locMast)) {
//                    throw new CoolException("库中无空板!!!");
                    sign=false;
                }
                if (sign && !locMast.getLocSts().equals("D")){
//                    throw new CoolException("所选库位存在状态不为D的库位,库位号:"+locMast.getLocNo()+" 、当前状态:"+locMast.getLocSts()+"-"+locMast.getLocSts$());
                    sign=false;
@@ -81,13 +130,20 @@
                    // 获取源站
                    Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
                            .eq("type_no", 110)
                            .eq("stn_no", 213)
                            .eq("stn_no", staNo)
                            .eq("crn_no", locMast.getCrnNo());
                    StaDesc staDesc = staDescService.selectOne(wrapper);
                    Integer sourceStaNo = staDesc.getCrnStn();
                    if (!Cools.isEmpty(sourceStaNo)) {
                    if (Cools.isEmpty(staDesc)) {
//                    throw new CoolException("检索源站失败");
                        sign = false;
                    }
                    Integer sourceStaNo = null;
                    if (sign){
                        sourceStaNo = staDesc.getCrnStn();
                        if (Cools.isEmpty(sourceStaNo)) {
//                    throw new CoolException("检索源站失败");
                            sign = false;
                        }
                    }
                    if (sign){
                        Date now = new Date();
@@ -97,9 +153,9 @@
                        wrkMast.setIoTime(now);
                        wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID
                        wrkMast.setIoType(110); // 入出库状态: 110.空板出库
                        wrkMast.setIoPri(10D);
                        wrkMast.setIoPri(99999999D);
                        wrkMast.setSourceStaNo(sourceStaNo); // 源站
                        wrkMast.setStaNo(213); // 目标站
                        wrkMast.setStaNo(staNo); // 目标站
                        wrkMast.setCrnNo(locMast.getCrnNo());
                        wrkMast.setSourceLocNo(locMast.getLocNo()); // 源库位
                        wrkMast.setFullPlt("N"); // 满板:Y
@@ -139,4 +195,29 @@
        }
        return SUCCESS;
    }
    /**
     * 根据堆垛机数量从大到小排序,返回排序后的堆垛机号
     *
     * @param crnCount 堆垛机数量数组,索引表示堆垛机号减 1
     * @return 排序后的堆垛机号数组
     */
    public static int[] getSortedCrnNos(int[] crnCount) {
        // 创建一个列表,存储堆垛机号和对应的值
        List<Map.Entry<Integer, Integer>> list = new ArrayList<>();
        for (int i = 0; i < crnCount.length; i++) {
            list.add(new AbstractMap.SimpleEntry<>(i + 1, crnCount[i])); // 堆垛机号从 1 开始
        }
        // 根据值从大到小排序
        list.sort((entry1, entry2) -> entry2.getValue().compareTo(entry1.getValue()));
        // 提取排序后的堆垛机号
        int[] sortedCrnNos = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            sortedCrnNos[i] = list.get(i).getKey();
        }
        return sortedCrnNos;
    }
}