chen.lin
16 小时以前 5b1a1d32abc8441bf73b7e2dc609def87e5a580a
src/main/java/com/zy/service/impl/MainServiceImpl.java
@@ -27,9 +27,13 @@
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.BarcodeThread;
import com.zy.core.thread.LedThread;
import com.zy.core.thread.RgvThread;
import com.zy.core.thread.SiemensDevpThread;
import com.zy.core.model.RgvSlave;
import com.zy.core.model.protocol.RgvProtocol;
import com.zy.entity.*;
import com.zy.mapper.*;
import com.zy.mapper.BasRgvErrMapper;
import com.zy.service.*;
import com.zy.utils.*;
import lombok.extern.slf4j.Slf4j;
@@ -93,6 +97,9 @@
    @Resource
    private BasDevpErrLogService basDevpErrLogService;
    @Autowired
    private BasRgvErrMapper basRgvErrMapper;
    @Value("${wms.url}")
    private String wmsUrl;
@@ -161,13 +168,12 @@
                // 退回
                if (back   && staProtocol.isInEnable() && staProtocol.isLoading() && staProtocol.isPakMk()  && !staProtocol.isEmptyMk()  ) {
                    MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errMsg));
                    staProtocol.setWorkNo(wrkNo);
                    wrkNo++;
                    News.info("{}入库回退:{},任务号:{}", inSta.getStaNo(), errMsg,wrkNo);
                    News.info("{}入库回退:{},任务号:{}", inSta.getStaNo(), errMsg, staProtocol.getWorkNo());
                    staProtocol.setWorkNo(9999);
                    staProtocol.setStaNo(inSta.getBackSta().shortValue());
                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                    MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                    log.error("输送线下发1:"+wrkNo+","+inSta.getBackSta());
                    log.error("输送线下发1:"+staProtocol.getWorkNo()+","+inSta.getBackSta());
                    return;
                }
@@ -222,13 +228,12 @@
                                ledThread.errorReset();
                            }
                        } else {
                            staProtocol.setWorkNo(wrkNo);
                            wrkNo++;
                            staProtocol.setWorkNo(9999);
                            staProtocol.setStaNo(inSta.getBackSta().shortValue());
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            String errorMsg = jsonObject.getString("msg");
                            log.error("全版入库回退,"+wrkNo+","+errorMsg);
                            log.error("全版入库回退,"+staProtocol.getWorkNo()+","+errorMsg);
                            if (!Cools.isEmpty(errorMsg)) {
                                MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg));
                            }
@@ -296,12 +301,11 @@
                    StaDesc staDesc = staDescService.selectOne(wrapper);
                    if (Cools.isEmpty(staDesc)) {
                        News.error(""+mark+" - 2"+" - 入库路径不存在!type_no={},stn_no={},crn_no={}", wrkMast.getIoType(), pickSta.getStaNo(), wrkMast.getCrnNo());
                        staProtocol.setWorkNo(wrkNo);
                        wrkNo++;
                        staProtocol.setWorkNo(9999);
                        staProtocol.setStaNo((short) (pickSta.getStaNo().shortValue()-(short)1));
                        devpThread.setPakMk(staProtocol.getSiteId(), false);
                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                        log.error("输送线下发4:"+wrkNo+","+(pickSta.getStaNo().shortValue()-(short)1));
                        log.error("输送线下发4:"+staProtocol.getWorkNo()+","+(pickSta.getStaNo().shortValue()-(short)1));
                        //LED
                        LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, pickSta.getLed());
                        // led 异常显示
@@ -1086,6 +1090,65 @@
                        && staProtocol.isPakMk() //防止重复下发信号 站点无物 无任务号会自动变成true
                ) {
                    // 判断重复工作档
                    WrkMast wrkMast = null;
                    if (!Cools.isEmpty(barcode)) {
                        // 有条码时,检查是否有相同站点和条码的空板入库工作档
                        wrkMast = wrkMastMapper.selectPakInStep1(emptyInSta.getStaNo(), barcode);
                    } else {
                        // 无条码时,检查是否有相同站点且工作状态为2的空板入库工作档
                        wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>()
                                .eq("source_sta_no", emptyInSta.getStaNo())
                                .eq("wrk_sts", 2)
                                .eq("io_type", 10));
                    }
                    if (wrkMast != null) {
                        News.info("{}空板入库重复工作档检查:已存在工作档,工作号:{},条码:{}", emptyInSta.getStaNo(), wrkMast.getWrkNo(), barcode);
                        continue;
                    }
                    // 尺寸检测异常(复刻generateStoreWrkFile的逻辑,但不包括扫码失败)
                    boolean back = false;
                    String errMsg = "";
                    if (staProtocol.isFrontErr()) {
                        errMsg = "前超限";
                        back = true;
                    }
                    if (!back && staProtocol.isBackErr()) {
                        errMsg = "后超限";
                        back = true;
                    }
                    if (!back && staProtocol.isHighErr()) {
                        errMsg = "高超限";
                        back = true;
                    }
                    if (!back && staProtocol.isLeftErr()) {
                        errMsg = "左超限";
                        back = true;
                    }
                    if (!back && staProtocol.isRightErr()) {
                        errMsg = "右超限";
                        back = true;
                    }
                    if (!back && staProtocol.isWeightErr()) {
                        errMsg = "超重";
                        back = true;
                    }
                    // 退回(空托入库的条件是isEmptyMk为true)
                    if (back && staProtocol.isInEnable() && staProtocol.isLoading() && staProtocol.isPakMk() && staProtocol.isEmptyMk()) {
                        Integer ledId = emptyInSta.getLed();
                        if (ledId != null) {
                            MessageQueue.offer(SlaveType.Led, ledId, new Task(3, errMsg));
                        }
                        News.info("{}空板入库回退:{},任务号:{}", emptyInSta.getStaNo(), errMsg, staProtocol.getWorkNo());
                        staProtocol.setWorkNo(9999);
                        staProtocol.setStaNo(emptyInSta.getBackSta().shortValue());
                        devpThread.setPakMk(staProtocol.getSiteId(), false);
                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                        log.error("输送线下发1(空板):"+staProtocol.getWorkNo()+","+emptyInSta.getBackSta());
                        continue;
                    }
                    News.warnNoLog(""+mark+" - 0"+" - 开始执行:空栈板初始化入库,叉车入库站放货,条码:{}", barcode);
                    try {
@@ -1134,31 +1197,25 @@
                                ledCommand.setStaNo(dto.getStaNo());
                                commands.add(ledCommand);
                                MessageQueue.offer(SlaveType.Led, emptyInSta.getLed(), new Task(1, commands));
//                                ledThread.errorReset();
                            }
                            // 成功时重置LED错误
                            if (ledThread != null) {
                                ledThread.errorReset();
                            }
                        } else {
                            String errorMsg = jsonObject.getString("msg");
                            // 如果任务回退,并且站点不是自动状态,则不触发回退
                            if (!staProtocol.isAutoing()) {
                                log.error("空板入库回退"+wrkNo+","+errorMsg+",站点不是自动状态,不触发回退");
                                log.error("空板入库回退,"+staProtocol.getWorkNo()+","+errorMsg+",站点不是自动状态,不触发回退");
                                continue;
                            }
                            staProtocol.setWorkNo(wrkNo);
                            wrkNo++;
                            staProtocol.setWorkNo(9999);
                            staProtocol.setStaNo(emptyInSta.getBackSta().shortValue());
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            log.error("空板入库回退"+wrkNo+","+errorMsg);
                            if (!result) {
                                News.errorNoLog(""+mark+" - 2"+" - 更新plc站点信息失败");
                                throw new CoolException("更新plc站点信息失败");
                            }
                            if (ledThread != null) {
                                if (!Cools.isEmpty(errorMsg)) {
                                    MessageQueue.offer(SlaveType.Led, emptyInSta.getLed(), new Task(3, errorMsg));
                                }
                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            log.error("空板入库回退,"+staProtocol.getWorkNo()+","+errorMsg);
                            if (!Cools.isEmpty(errorMsg)) {
                                MessageQueue.offer(SlaveType.Led, emptyInSta.getLed(), new Task(3, errorMsg));
                            }
//                            News.error(""+mark+" - 3"+" - 请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response);
                        }
@@ -1231,6 +1288,31 @@
                                );
                                if (!basDevpErrLogService.insert(basErrLog)) {
                                    News.error("输送线异常信息插入表asr_bas_devp_err_log异常:{}", basErrLog);
                                }
                                // 输送线报警时托盘退回
                                if (staProtocol.isInEnable() && staProtocol.isLoading() && staProtocol.isPakMk() && !staProtocol.isEmptyMk()) {
                                    Integer backSta = findBackSta(devp, siteNo);
                                    if (backSta != null) {
                                        log.info("【输送线报警退回】站点:{},工作号:{},报警:{},退回站:{}", siteNo, workNo, plcErr, backSta);
                                        // 推送到LED显示报警信息
                                        Integer ledId = findLedId(devp, siteNo);
                                        if (ledId != null) {
                                            MessageQueue.offer(SlaveType.Led, ledId, new Task(3, plcErr));
                                        }
                                        // 设置退回站
                                        staProtocol.setWorkNo(9999);
                                        staProtocol.setStaNo(backSta.shortValue());
                                        devpThread.setPakMk(staProtocol.getSiteId(), false);
                                        boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                                        if (!result) {
                                            News.error("输送线报警退回失败,站点:{},工作号:{}", siteNo, workNo);
                                        } else {
                                            log.info("【输送线报警退回】成功下发退回指令,站点:{},工作号:{},退回站:{}", siteNo, workNo, backSta);
                                        }
                                    } else {
                                        log.warn("【输送线报警退回】未找到退回站配置,站点:{},工作号:{}", siteNo, workNo);
                                    }
                                }
                            }
                        } else {
@@ -1345,6 +1427,56 @@
    }
    /**
     * 根据站点号查找退回站
     */
    private Integer findBackSta(DevpSlave devp, Integer siteNo) {
        // 查找入库站
        for (DevpSlave.Sta inSta : devp.getInSta()) {
            if (inSta.getStaNo().equals(siteNo)) {
                return inSta.getBackSta();
            }
        }
        // 查找拣料站
        for (DevpSlave.Sta pickSta : devp.getPickSta()) {
            if (pickSta.getStaNo().equals(siteNo)) {
                return pickSta.getBackSta();
            }
        }
        // 查找空板入库站
        for (DevpSlave.Sta emptyInSta : devp.getEmptyInSta()) {
            if (emptyInSta.getStaNo().equals(siteNo)) {
                return emptyInSta.getBackSta();
            }
        }
        return null;
    }
    /**
     * 根据站点号查找LED ID
     */
    private Integer findLedId(DevpSlave devp, Integer siteNo) {
        // 查找入库站
        for (DevpSlave.Sta inSta : devp.getInSta()) {
            if (inSta.getStaNo().equals(siteNo)) {
                return inSta.getLed();
            }
        }
        // 查找拣料站
        for (DevpSlave.Sta pickSta : devp.getPickSta()) {
            if (pickSta.getStaNo().equals(siteNo)) {
                return pickSta.getLed();
            }
        }
        // 查找空板入库站
        for (DevpSlave.Sta emptyInSta : devp.getEmptyInSta()) {
            if (emptyInSta.getStaNo().equals(siteNo)) {
                return emptyInSta.getLed();
            }
        }
        return null;
    }
    /**
     * 出库  ===>> 工作档信息写入led显示器
     */
    public synchronized void ledExecute() {