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;
@@ -136,6 +140,9 @@
    private WrkMastService wrkMastService;
    @Autowired
    private BasRgvMapService basRgvMapService;
    @Resource
    private ConfigService configService;
    @Value("${wms.url}")
    private String wmsUrl;
@@ -884,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")){ // 浅库位
@@ -1075,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 {
@@ -1121,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));
                }
            }
        }
    }
    /**
     * 堆垛机异常信息记录
     */
@@ -1565,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;
@@ -1584,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);
@@ -1615,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()));
@@ -1655,15 +1717,18 @@
                if(wrkMast.getIoType() == 3 && (wrkMast.getStaNo() == 1024 || wrkMast.getStaNo() == 1016 || wrkMast.getStaNo() == 1043)) { // 到1024出库口,放到输送线后任务完成
                    if(wrkMast.getWrkSts() != 2 ){
                        log.warn("rgv放货完成,rgv未复位:rgv号{},任务号:{},任务状态{}",wrkMast.getRgvNo(),wrkMast.getWrkNo(),wrkMast.getWrkSts());
                        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放货完成,rgv未复位:rgv号{},任务号:{},任务状态{}", wrkMast.getRgvNo(), wrkMast.getWrkNo(), wrkMast.getWrkSts());
                        log.warn("rgv放货完成101,rgv未复位:rgv号{},任务号:{},任务状态{}", wrkMast.getRgvNo(), wrkMast.getWrkNo(), wrkMast.getWrkSts());
                        continue;
                    }
                    wrkMast.setWrkSts(15L);
@@ -1671,7 +1736,7 @@
                    wrkMastService.updateById(wrkMast);
                } else if(wrkMast.getIoType() == 110 && (wrkMast.getStaNo() == 1002 || wrkMast.getStaNo() == 1020 ||wrkMast.getStaNo() == 1035)) {
                    if(wrkMast.getWrkSts() != 2 ){
                        log.warn("rgv放货完成,rgv未复位:rgv号{},任务号:{},任务状态{}",wrkMast.getRgvNo(),wrkMast.getWrkNo(),wrkMast.getWrkSts());
                        log.warn("rgv放货完成110,rgv未复位:rgv号{},任务号:{},任务状态{}",wrkMast.getRgvNo(),wrkMast.getWrkNo(),wrkMast.getWrkSts());
                        continue;
                    }
                    wrkMast.setWrkSts(15L);
@@ -1709,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入空桶库
@@ -1731,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);
@@ -1821,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();
            // 保存工作档
@@ -1830,6 +1888,7 @@
            wrkMast.setIoTime(now);
            wrkMast.setWrkSts(2L);
            wrkMast.setIoType(3);
            wrkMast.setIoPri(15D);
            wrkMast.setSourceStaNo(1034); // 源站
            wrkMast.setStaNo(1024); // 目标站
            wrkMast.setAppeTime(now);
@@ -1845,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"));
    }
    /**
@@ -1885,12 +2054,12 @@
                    param.setMatnr(staProtocol.getMatnr().trim());
                    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");