pjb
2025-06-23 d8060afba15f67e443bb2f89410313905bdc7ebe
src/main/java/com/zy/service/impl/MainServiceImpl.java
@@ -26,8 +26,11 @@
import com.zy.core.thread.LedThread;
import com.zy.core.thread.SiemensDevpThread;
import com.zy.entity.*;
import com.zy.entity.param.StockOutParam;
import com.zy.mapper.*;
import com.zy.service.*;
import com.zy.system.entity.Config;
import com.zy.system.service.ConfigService;
import com.zy.utils.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -36,6 +39,7 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
@@ -90,7 +94,7 @@
        taskStaNoToRgvStaNoMap.put(1050,1044);taskStaNoToRgvStaNoMap.put(1078,1044);taskStaNoToRgvStaNoMap.put(1064,1044);taskStaNoToRgvStaNoMap.put(1071,1044);taskStaNoToRgvStaNoMap.put(1096,1094);
        taskStaNoToRgvStaNoMap.put(1104,1100);taskStaNoToRgvStaNoMap.put(1102,1100);taskStaNoToRgvStaNoMap.put(1090,1090);taskStaNoToRgvStaNoMap.put(1002,1001);taskStaNoToRgvStaNoMap.put(1016,1018);
        taskStaNoToRgvStaNoMap.put(1020,1019);taskStaNoToRgvStaNoMap.put(1024,1022);taskStaNoToRgvStaNoMap.put(1035,1034);taskStaNoToRgvStaNoMap.put(1040,1033);taskStaNoToRgvStaNoMap.put(1043,1041);
        taskStaNoToRgvStaNoMap.put(1020,1019);taskStaNoToRgvStaNoMap.put(1024,1022);taskStaNoToRgvStaNoMap.put(1031,1033);taskStaNoToRgvStaNoMap.put(1035,1034);taskStaNoToRgvStaNoMap.put(1040,1033);taskStaNoToRgvStaNoMap.put(1043,1041);
        canningLineRgvConnectionSiteList.add(1083);canningLineRgvConnectionSiteList.add(1086);
        canningLineRgvConnectionSiteList.add(1089);
@@ -136,6 +140,9 @@
    private WrkMastService wrkMastService;
    @Autowired
    private BasRgvMapService basRgvMapService;
    @Resource
    private ConfigService configService;
    @Value("${wms.url}")
    private String wmsUrl;
@@ -205,12 +212,11 @@
                    if (!staProtocol.isLoading()){
                        continue;
                    }
                    if (!staProtocol.isPakMk()) {
                        continue;
                    }
                    News.info("{}入库回退:{},任务号:{}", inSta.getStaNo(), errMsg,wrkNo);
                    log.error("{}入库回退:{},任务号:{}", inSta.getStaNo(), errMsg,wrkNo);
                    return;
                    // 如果超限报警或超重等,出到1024
                    if(errMsg.equals("扫码失败")) {
                        return;
                    }
                }
                // 判断是否满足入库条件
@@ -222,11 +228,13 @@
                ) {
                    if(Cools.isEmpty(barcode) || "NG".endsWith(barcode) || "NoRead".equals(barcode) || "00000000".equals(barcode) || barcode.startsWith("ERROR")) {
                        log.error("{}号条码检测失败,条码信息:{}", inSta.getBarcode(), barcode);
                        MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, "条码检测失败:"+barcode));
                        continue;
                    }
                    // 判断重复工作档
                    WrkMast wrkMast = wrkMastMapper.selectPakInStep1(inSta.getStaNo(), barcode);
                    if (wrkMast != null) {
                        MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, "条码已重复:" + barcode));
                        continue;
                    }
@@ -242,6 +250,7 @@
                        param.setBucketCount(staProtocol.getBucketCount());
                        param.setTailSupportFlag(staProtocol.isTailSupportFlag());
                        param.setWantBucketFlag(getWantBucketFlag());
                        param.setErrMsg(errMsg);
                        String response = new HttpHandler.Builder()
                                .setUri(wmsUrl)
@@ -293,8 +302,8 @@
        StaProtocol staProtocol1084 = devpThread.getStation().get(1084);
        StaProtocol staProtocol1087 = devpThread.getStation().get(1087);
        List<SearchLocParam.WantBucket> wantBucketList = new ArrayList<>();
        wantBucketList.add(new SearchLocParam.WantBucket(1071,staProtocol1081.getWantBucketFlag()));
        wantBucketList.add(new SearchLocParam.WantBucket(1064,staProtocol1084.getWantBucketFlag()));
        wantBucketList.add(new SearchLocParam.WantBucket(1071,staProtocol1081.getWantBucketFlag()));
        wantBucketList.add(new SearchLocParam.WantBucket(1078,staProtocol1087.getWantBucketFlag()));
        return wantBucketList;
    }
@@ -808,6 +817,14 @@
                        break;
                    }
                    if (crnStn.getStaNo() == 1093) { // 判断出库到到1093,判断1092是否有物,有物不可出
                        StaProtocol staProtocol2 = devpThread.getStation().get(1092);
                        if(!staProtocol2.isAutoing() || staProtocol2.isLoading() || staProtocol2.getWorkNo() != 0) {
                            log.warn("1号堆垛机出库取货前,判断1092站点信息自动:{},有物:{},工作号:{},不可入",staProtocol2.isAutoing(),staProtocol2.isLoading(),staProtocol2.getWorkNo());
                            continue;
                        }
                    }
                    // 双深库位且浅库位有货,则需先对浅库位进行库位移转
                    if (Utils.isDeepLoc(slaveProperties, wrkMast.getSourceLocNo())) {
                        News.warnNoLog(""+mark+" - 2"+" - 6"+" - 双深库位且浅库位有货,则需先对浅库位进行库位移转 : 开始执行 任务号={}",wrkMast.getWrkNo());
@@ -874,7 +891,7 @@
                        }
                        newLocNo = newLocNo + locNo.substring(2);
                        // 对应库位有无任务
                        WrkMast wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("source_loc_no", newLocNo));
                        WrkMast wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("source_loc_no", newLocNo).eq("wrk_sts",11));
                        if(wrkMast1 == null) {
                             if(locNo.startsWith("10") || locNo.startsWith("11")){ // 浅库位
@@ -928,7 +945,7 @@
                    crnCommand.setDestinationPosX(crnStn.getRow().shortValue());     // 目标库位排
                    // 源站1057
                    if(slave.getId() == 4 && crnStn.getStaNo() == 1057 && sourceSta.getRow1() == 12) {
                    if(slave.getId() == 4 && crnStn.getStaNo() == 1057 && (sourceSta.getRow1() == 11 || sourceSta.getRow1() == 12)) {
                        crnCommand.setDestinationPosX((short) 9);
                    }
                    crnCommand.setDestinationPosY(crnStn.getBay().shortValue());     // 目标库位列
@@ -1065,7 +1082,7 @@
            //  状态:等待确认 并且  任务完成位 = 1
            if (crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) {
                News.warnNoLog(""+mark+" - 0"+" - 开始执行对工作档的完成操作");
                if (crnProtocol.getTaskNo() == 9999) {
                if (crnProtocol.getTaskNo() == 9999) { // 回原点任务号
                    // 堆垛机复位
                    crnThread.setResetFlag(true);
                } else {
@@ -1111,6 +1128,51 @@
//        News.infoNoLog(""+mark+" - 0"+" - 对工作档的完成操作执行完成");
    }
    /**
     * 堆垛机回原点
     */
    public synchronized void originGo() {
        for (CrnSlave crn : slaveProperties.getCrn()) {
            // 获取堆垛机信息
            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
            if (crnProtocol == null) {
                continue;
            }
            if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO
                    && crnProtocol.getLoaded() == 0 && crnProtocol.getForkPos() == 0) {
                // 判断是不是已在原点
                if(crnProtocol.getBay() == 0 && crnProtocol.getLevel() == 1) {
                    continue;
                }
                // 判断是不是空闲三分钟
                BasCrnp basCrnp = basCrnpService.selectById(crn.getId());
                Date now = new Date();
                Date modiTime = basCrnp.getModiTime();
                long diffInMillis = now.getTime()-modiTime.getTime();
                if(diffInMillis < 3 * 60 * 1000) {
                    continue;
                }
                CrnCommand crnCommand = new CrnCommand();
                crnCommand.setCrnNo(crn.getId()); // 堆垛机编号
                crnCommand.setTaskNo((short) 9999); // 工作号
                crnCommand.setTaskMode(CrnTaskModeType.GO_ORIGIN); // 任务模式:  回原点
                crnCommand.setSourcePosX((short) (crn.getId() == 1 ? 4 : crn.getId() == 2 ? 6 : crn.getId() == 3 ? 7 : 11));     // 源库位排
                crnCommand.setSourcePosY((short) 0);     // 源库位列
                crnCommand.setSourcePosZ((short) 1);     // 源库位层
                crnCommand.setDestinationPosX((short) 0);     // 目标库位排
                crnCommand.setDestinationPosY((short) 0);     // 目标库位列
                crnCommand.setDestinationPosZ((short) 0);     // 目标库位层
                if (!MessageQueue.offer(SlaveType.Crn, crn.getId(), new Task(2, crnCommand))) {
                    News.error("回原点任务下发失败", crn.getId(), JSON.toJSON(crnCommand));
                } else {
                    log.info("{}号堆垛机回原点任务下发成功:{}", crn.getId(), JSON.toJSON(crnCommand));
                }
            }
        }
    }
    /**
     * 堆垛机异常信息记录
     */
@@ -1292,33 +1354,29 @@
                        break;
                }
                ledCommand.setSourceLocNo(wrkMast.getSourceLocNo());
                ledCommand.setLocNo(wrkMast.getLocNo());
                ledCommand.setSourceStaNo(wrkMast.getSourceStaNo());
                ledCommand.setStaNo(wrkMast.getStaNo());
                ledCommand.setBarcode(wrkMast.getBarcode());
                if (wrkMast.getIoType() != 110 && wrkMast.getIoType() != 10) {
                    List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
//                    List<WrkDetl> wrkDetls = wrkDetlService.findByWorkNo(wrkMast.getWrkNo());
                    wrkDetls.forEach(wrkDetl -> ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getSpecs(),wrkDetl.getManuDate(),wrkDetl.getModel(),wrkDetl.getWeight(),wrkDetl.getManLength(),wrkDetl.getVolume())));
//                    wrkDetls.forEach(wrkDetl -> {
//                        Double total = 0.0;
//                        EntityWrapper<LocDetl> wrapper = new EntityWrapper<>();
//                        LocDetl locDetl = locDetlService.selectOne(wrapper.eq("zpallet", wrkDetl.getZpallet()).eq("matnr", wrkDetl.getMatnr()));
//                        if (Cools.isEmpty(locDetl)) {
//                            total = wrkDetl.getAnfme();
//                        } else {
//                            total = locDetl.getAnfme();
//                        }
//                        if (wrkMast.getIoType() == 101 || wrkMast.getIoType() == 1) {
//                            ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getManu(), wrkDetl.getMemo(), wrkDetl.getAnfme(),total));
//                        }
//                        if (wrkMast.getIoType() == 103 && (null == wrkDetl.getInspect() || 0 == wrkDetl.getInspect())) {
//                            ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getManu(), wrkDetl.getMemo(), wrkDetl.getAnfme(),total));
//                        }
//                        if (wrkMast.getIoType() == 107) {
//                            ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getManu(), wrkDetl.getMemo(), wrkDetl.getAnfme(),total));
//                        }
//                    });
                MatDto matDto = new MatDto();
                // 明细
                WrkDetl wrkDetl1 = wrkDetlService.selectOne(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
                if (wrkDetl1 != null) {
                    ledCommand.setOrderNo(wrkDetl1.getOrderNo());
                    matDto.setMaknx(wrkDetl1.getMaktx());
                    matDto.setMatnr(wrkDetl1.getMatnr());
                    matDto.setBatch(wrkDetl1.getBatch());
                    matDto.setManuDate(wrkDetl1.getManuDate());
                    matDto.setAnfme(wrkDetl1.getAnfme());
                    matDto.setWeight(wrkDetl1.getWeight());
                    matDto.setGrossWeight(wrkDetl1.getManLength());
                    ledCommand.getMatDtos().add(matDto);
                }
                commands.add(ledCommand);
                // 订单
//                if(wrkDetl1 != null && !Cools.isEmpty(wrkDetl1.getOrderNo()))  {
//
//                }
                commands.add(0,ledCommand);
            }
            Set<Integer> workNos = wrkMasts.stream().map(WrkMast::getWrkNo).collect(Collectors.toSet());
            // 获取LED线程
@@ -1559,6 +1617,9 @@
                    case 1019:dismantlingMachine = 1020;break;
                    case 1034:dismantlingMachine = 1035;break;
                }
                if(staProtocol.getSiteId() == 1034 && staProtocol.isHigh()) {
                    continue;
                }
                if (wrkMastService.selectList(new EntityWrapper<WrkMast>().in("io_type", 110).eq("sta_no", dismantlingMachine)).size() > 0) {
//                    log.warn("{}站点已经存在两个空板出库任务", entry.getKey());
                    continue;
@@ -1578,7 +1639,7 @@
                    if (jsonObject.getInteger("code").equals(200)) {
                        log.info("空托出库请求成功:请求参数{},返回值:{}", map, response);
                    } else {
                        log.error("空拖出库请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/auto/emptyOut/v1", map, response);
//                        log.error("空拖出库请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/auto/emptyOut/v1", map, response);
                    }
                } catch (Exception e) {
                    log.error("空拖出库请求接口异常!!!url:{};request:{};response:{}", wmsUrl + "/rpc/auto/emptyOut/v1", map, response);
@@ -1609,10 +1670,17 @@
                    log.error("呼叫rgv,任务号不存在:{}",staProtocol.getWorkNo());
                    continue;
                }
                if (staProtocol.getSiteId() == 1090 && wrkMast.getLocNo() == null) {
                if (staProtocol.getSiteId() == 1090 && wrkMast.getStaNo() == 1090) {
                    continue;
                }
                if ((wrkMast.getWrkSts() == 2 || wrkMast.getWrkSts() == 15) && wrkMast.getRgvNo() == null) {
                if ((wrkMast.getWrkSts() == 2 || wrkMast.getWrkSts() == 15) && (wrkMast.getRgvNo() == null || wrkMast.getRgvDstaNo() == 1090)) {
                    // 有1090的任务跳过rgv分配
                    if(wrkMast.getStaNo() == 1090) {
                        int count = wrkMastService.selectCount(new EntityWrapper<WrkMast>().where("sta_no = 1090 or source_sta_no = 1090 "));
                        if (count > 1) {
                            continue;
                        }
                    }
                    wrkMast.setRgvNo(0);
                    wrkMast.setRgvSstaNo(site);
                    wrkMast.setRgvDstaNo(taskStaNoToRgvStaNoMap.get(wrkMast.getStaNo()));
@@ -1648,14 +1716,29 @@
                }
                if(wrkMast.getIoType() == 3 && (wrkMast.getStaNo() == 1024 || wrkMast.getStaNo() == 1016 || wrkMast.getStaNo() == 1043)) { // 到1024出库口,放到输送线后任务完成
                    wrkMast.setWrkSts(2L);
                    if(wrkMast.getWrkSts() != 2 ){
                        log.warn("rgv放货完成3,rgv未复位:rgv号{},任务号:{},任务状态{}",wrkMast.getRgvNo(),wrkMast.getWrkNo(),wrkMast.getWrkSts());
                        continue;
                    }
                    wrkMast.setWrkSts(5L);
//                    if(wrkMast.getStaNo() == 1090) {
//                        wrkMast.setWrkSts(3L);
//                    }
                    wrkMast.setModiTime(new Date());
                    wrkMastService.updateById(wrkMast);
                } else if(wrkMast.getIoType() == 101 && (wrkMast.getStaNo() == 1024 || wrkMast.getStaNo() == 1016 || wrkMast.getStaNo() == 1043)) {
                    if(wrkMast.getWrkSts() != 2 ) {
                        log.warn("rgv放货完成101,rgv未复位:rgv号{},任务号:{},任务状态{}", wrkMast.getRgvNo(), wrkMast.getWrkNo(), wrkMast.getWrkSts());
                        continue;
                    }
                    wrkMast.setWrkSts(15L);
                    wrkMast.setModiTime(new Date());
                    wrkMastService.updateById(wrkMast);
                } else if(wrkMast.getIoType() == 110 && (wrkMast.getStaNo() == 1002 || wrkMast.getStaNo() == 1020 ||wrkMast.getStaNo() == 1035)) {
                    if(wrkMast.getWrkSts() != 2 ){
                        log.warn("rgv放货完成110,rgv未复位:rgv号{},任务号:{},任务状态{}",wrkMast.getRgvNo(),wrkMast.getWrkNo(),wrkMast.getWrkSts());
                        continue;
                    }
                    wrkMast.setWrkSts(15L);
                    wrkMast.setModiTime(new Date());
                    wrkMastService.updateById(wrkMast);
@@ -1691,16 +1774,16 @@
                log.error("异常口入库任务号无任务:{}", staProtocol.getWorkNo());
                return;
            } else if (wrkMast.getLocNo() != null) {
                log.info("异常口入库库位已分配:{}", wrkMast.getLocNo());
//                log.info("异常口入库库位已分配:{}", wrkMast.getLocNo());
                return;
            } else if(wrkMast.getStaNo() != 1090) {
                log.info("异常口入库入库目标站点已分配:{}", wrkMast.getStaNo());
//                log.info("异常口入库入库目标站点已分配:{}", wrkMast.getStaNo());
                return;
            }
            try {
                CanningLineInLocParam param = new CanningLineInLocParam();
                param.setWrkNo(staProtocol.getWrkNo());
                param.setWrkNo(staProtocol.getWorkNo());
                param.setSourceStaNo(1090);
                param.setTbFlag(staProtocol.isInEnable()); // true入成品库,false入空桶库
@@ -1713,19 +1796,7 @@
                log.info("异常口入库请求wms原始返回:" + response);
                JSONObject jsonObject = JSON.parseObject(response);
                if (jsonObject.getInteger("code").equals(200)) {
//                    StartupDto dto = jsonObject.getObject("data", StartupDto.class);
//                    staProtocol.setWorkNo(dto.getWorkNo());
//                    staProtocol.setStaNo(dto.getStaNo().shortValue());
//                    devpThread.setPakMk(staProtocol.getSiteId(), false);
//                    boolean result = MessageQueue.offer(SlaveType.Devp, 2, new Task(2, staProtocol));
//                    if (result) {
//                        log.info("异常口入库推送输送线命令成功:" + dto.getWorkNo() + "," + 1090 + "," + dto.getStaNo());
//                        News.info("异常口入库推送输送线命令成功:" + dto.getWorkNo() + "," + 1090 + "," + dto.getStaNo());
//                    } else {
//                        log.error("异常口入库推送输送线命令失败:" + dto.getWorkNo() + "," + 1090 + "," + dto.getStaNo());
//                        News.error("异常口入库推送输送线命令失败:" + dto.getWorkNo() + "," + 1090 + "," + dto.getStaNo());
//                        throw new CoolException("异常口入库推送输送线命令失败:" + 1090);
//                    }
                    log.error("异常口入库请求接口成功常,url:{},request:{},response:{}", wmsUrl + "/rpc/pakin/CanningLine/loc/v1", JSON.toJSONString(param), response);
                } else {
                    log.error("异常口入库请求接口异常,url:{},request:{},response:{}", wmsUrl + "/rpc/pakin/CanningLine/loc/v1", JSON.toJSONString(param), response);
                    News.error("异常口入库请求接口异常!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/CanningLine/loc/v1", JSON.toJSONString(param), response);
@@ -1757,6 +1828,7 @@
                        SearchLocParam param = new SearchLocParam();
                        param.setIoType(10);
                        param.setSourceStaNo(site);
                        param.setBucketType("21"); // 空母托盘
                        param.setLocType1((short) 1);
                        String response = new HttpHandler.Builder()
@@ -1802,7 +1874,12 @@
        }
        // 站点条件判断
        if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.getWrkNo() == 0) {
        if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable()
                 && staProtocol.getWorkNo() == 0 && staProtocol.isHigh()) {
            WrkMast wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("io_type", 3).eq("source_sta_no", 1034).eq("sta_no", 1024));
            if (wrkMast1 != null) {
                return;
            }
            Date now = new Date();
            // 保存工作档
@@ -1811,6 +1888,7 @@
            wrkMast.setIoTime(now);
            wrkMast.setWrkSts(2L);
            wrkMast.setIoType(3);
            wrkMast.setIoPri(15D);
            wrkMast.setSourceStaNo(1034); // 源站
            wrkMast.setStaNo(1024); // 目标站
            wrkMast.setAppeTime(now);
@@ -1826,6 +1904,116 @@
                log.error("子托盘底座母托盘回流命令推送队列失败:" + wrkMast.getWrkNo() + "," + staProtocol.getSiteId());
            }
        }
    }
    public synchronized void autoOutEmptyBucket() {
        Config config = configService.selectOne(new EntityWrapper<Config>().eq("code","autoOutEmptyBucket").eq("status",1));
        if (config == null || Cools.isEmpty(config.getValue())) {
            return;
        }
        // 需要自动补空桶的站点
        String[] split = config.getValue().split("=");
        for (SearchLocParam.WantBucket wantBucket : getWantBucketFlag()) {
            if (wantBucket.getBucketType() != 0) { // 罐装线有要桶信号
                boolean flag = true; // 是否需要自动补,true不需要,false需要
                for(String item: split) {
                    if(String.valueOf(wantBucket.getSite()).equals(item)) {
                        flag = false;
                        break;
                    }
                }
                if(flag) {
                    return;
                }
                // <4 < 2 < 4
                int count = wrkMastMapper.selectInGzxCount(wantBucket.getSite());
                if (wantBucket.getSite() == 1071 && count <= 2 || wantBucket.getSite() == 1064 && count == 0 || wantBucket.getSite() == 1078 && count <= 2) {
                    // 判断库里有无空桶组
                    List<LocDetl> locDetlList = locDetlService.selectListByMatnr(wantBucket.getBucketType());
                    for (int i = 0; i < locDetlList.size(); i++) {
                        LocDetl locDetl = locDetlList.get(i);
                        String loc1 = locDetl.getLocNo();
                        String aisle1 = loc1.substring(0, 2);
                        String column1 = loc1.substring(2, 5);
                        String level1 = loc1.substring(5, 7);
                        for (int j = i + 1; j < locDetlList.size(); j++) {
                            LocDetl locDetl1 = locDetlList.get(j);
                            String loc2 = locDetl1.getLocNo();
                            String aisle2 = loc2.substring(0, 2);
                            String column2 = loc2.substring(2, 5);
                            String level2 = loc2.substring(5, 7);
                            // 检查是否满足组队条件
                            if (isSameAisleGroup(aisle1, aisle2) && column1.equals(column2) && level1.equals(level2)) {
                                // 创建空桶出库任务
                                try {
                                    StockOutParam param = new StockOutParam();
                                    param.setOutSite(wantBucket.getSite());
                                    List<StockOutParam.LocDetl> locDetls = new ArrayList<>();
                                    StockOutParam.LocDetl locDetl2 = new StockOutParam.LocDetl();
                                    locDetl2.setLocNo(locDetl.getLocNo());
                                    locDetl2.setMatnr(locDetl.getMatnr());
                                    locDetl2.setBatch(locDetl.getBatch());
                                    locDetl2.setBrand(locDetl.getBrand());
                                    locDetl2.setCount(locDetl.getAnfme());
                                    locDetl2.setBoxType1(locDetl.getBoxType1());
                                    locDetl2.setBoxType2(locDetl.getBoxType2());
                                    locDetl2.setBoxType3(locDetl.getBoxType3());
                                    locDetl2.setStandby1(locDetl.getStandby1());
                                    locDetl2.setStandby2(locDetl.getStandby2());
                                    locDetl2.setStandby3(locDetl.getStandby3());
                                    locDetls.add(locDetl2);
                                    StockOutParam.LocDetl locDetl3 = new StockOutParam.LocDetl();
                                    locDetl3.setLocNo(locDetl1.getLocNo());
                                    locDetl3.setMatnr(locDetl1.getMatnr());
                                    locDetl3.setBatch(locDetl1.getBatch());
                                    locDetl3.setBrand(locDetl1.getBrand());
                                    locDetl3.setCount(locDetl1.getAnfme());
                                    locDetl3.setBoxType1(locDetl1.getBoxType1());
                                    locDetl3.setBoxType2(locDetl1.getBoxType2());
                                    locDetl3.setBoxType3(locDetl1.getBoxType3());
                                    locDetl3.setStandby1(locDetl1.getStandby1());
                                    locDetl3.setStandby2(locDetl1.getStandby2());
                                    locDetl3.setStandby3(locDetl1.getStandby3());
                                    locDetls.add(locDetl3);
                                    param.setLocDetls(locDetls);
                                    String response = new HttpHandler.Builder()
                                            .setUri(wmsUrl)
                                            .setPath("/rpc/autoOutEmptyBucket")
                                            .setJson(JSON.toJSONString(param))
                                            .build()
                                            .doPost();
                                    log.info("自动出空桶请求wms原始返回:" + response);
                                    JSONObject jsonObject = JSON.parseObject(response);
                                    if (jsonObject.getInteger("code").equals(200)) {
                                        log.info("自动出空桶成功:{}",wantBucket.getSite());
                                        return;
                                    } else {
                                        News.error("自动空桶出库" + ":请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response);
                                    }
                                } catch (Exception e) {
                                    e.printStackTrace();
                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    // 判断两个排是否属于同一组
    private static boolean isSameAisleGroup(String aisle1, String aisle2) {
        return (aisle1.equals("09") && aisle2.equals("10")) ||
                (aisle1.equals("10") && aisle2.equals("09")) ||
                (aisle1.equals("11") && aisle2.equals("12")) ||
                (aisle1.equals("12") && aisle2.equals("11"));
    }
    /**
@@ -1864,13 +2052,14 @@
                    CanningLineInLocParam param = new CanningLineInLocParam();
                    param.setWrkNo(staProtocol.getWrkNo());
                    param.setMatnr(staProtocol.getMatnr().trim());
                    param.setBatch(staProtocol.getBatch());
                    param.setBatch(staProtocol.getBatch().trim());
                    param.setManuDate(staProtocol.getManuDate());
                    param.setWeight(staProtocol.getWeight());
                    param.setGrossWeight(staProtocol.getGrossWeight());
                    param.setWeight(Math.round(staProtocol.getWeight() * 100.0) / 100.0);
                    param.setGrossWeight(Math.round(staProtocol.getGrossWeight() * 100.0) / 100.0);
                    param.setReinspection(staProtocol.isReinspection());
                    param.setSourceStaNo(site + 2);
                    param.setTbFlag(staProtocol2.isBarcodeErr());
                    param.setCannedVolume(Math.round(staProtocol.getCannedVolume() * 100.0) / 100.0);
//                    param.setWrkNo(57);
//                    param.setMatnr("101");
//                    param.setBatch("tt1");
@@ -1942,7 +2131,7 @@
                    staProtocol.setBucketCount(wrkDetl.getAnfme().intValue());
                    boolean result = MessageQueue.offer(SlaveType.Devp, inGzxSiteList.indexOf(site) + 4, new Task(4, staProtocol));
                    if (result) {
                        log.info("告诉罐装线入库桶信息命令队列推送成功:" + staProtocol.getWorkNo() + "," + site + "," + staProtocol.getBucketType() +"," + staProtocol.getBucketCount());
                        log.info("告诉罐装线入库桶信息命令队列推送成功:" + staProtocol.getWorkNo() + "," +"托盘码:" + wrkMast.getBarcode() +"," + site + "," + staProtocol.getBucketType() +"," + staProtocol.getBucketCount());
                        News.info("告诉罐装线入库桶信息命令队列推送成功:" + staProtocol.getWorkNo() + "," + site + "," + staProtocol.getBucketType() +"," + staProtocol.getBucketCount());
                        wrkMast.setWhsType(1); // 更新推送标识,避免重复推送
                        wrkMastService.updateById(wrkMast);