#
Administrator
2026-04-27 007ee7bc1b63aa381b3a414952bbf41aeebed60e
src/main/java/com/zy/core/utils/DualCrnOperateProcessUtils.java
@@ -29,6 +29,8 @@
import com.zy.core.model.param.SendDualCrnCommandParam;
import com.zy.core.model.protocol.DualCrnProtocol;
import com.zy.core.model.protocol.StationProtocol;
import com.zy.core.task.MainProcessLane;
import com.zy.core.task.MainProcessTaskSubmitter;
import com.zy.core.thread.DualCrnThread;
import com.zy.core.thread.StationThread;
import org.springframework.beans.factory.annotation.Autowired;
@@ -60,52 +62,63 @@
    private CommonService commonService;
    @Autowired
    private NotifyUtils notifyUtils;
    @Autowired
    private MainProcessTaskSubmitter mainProcessTaskSubmitter;
    //入出库  ===>>  双工位堆垛机入出库作业下发
    public synchronized void dualCrnIoExecute() {
    public void dualCrnIoExecute() {
        List<BasDualCrnp> basDualCrnps = basDualCrnpService.selectList(new EntityWrapper<>());
        for (BasDualCrnp basDualCrnp : basDualCrnps) {
            DualCrnThread dualCrnThread = (DualCrnThread) SlaveConnection.get(SlaveType.DualCrn, basDualCrnp.getCrnNo());
            if(dualCrnThread == null){
                continue;
            }
            DualCrnProtocol dualCrnProtocol = dualCrnThread.getStatus();
            if(dualCrnProtocol == null){
                continue;
            }
            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                    .eq("dual_crn_no", basDualCrnp.getCrnNo())
                    .in("wrk_sts", WrkStsType.INBOUND_RUN.sts, WrkStsType.OUTBOUND_RUN.sts)
            );
            if(wrkMasts.size() >= 2){
                continue;
            }
            if(dualCrnProtocol.getMode() != DualCrnModeType.AUTO.id) {
                continue;
            }
            if(dualCrnProtocol.getAlarm() != 0) {
                continue;
            }
            if(dualCrnProtocol.getTaskSend() != 0 || dualCrnProtocol.getTaskSendTwo() != 0) {
                continue;
            }
            this.crnExecute(basDualCrnp, dualCrnThread);
            dualCrnIoExecute(basDualCrnp);
        }
    }
    private synchronized void crnExecute(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread) {
    public void dualCrnIoExecute(BasDualCrnp basDualCrnp) {
        if (basDualCrnp == null || basDualCrnp.getCrnNo() == null) {
            return;
        }
        DualCrnThread dualCrnThread = (DualCrnThread) SlaveConnection.get(SlaveType.DualCrn, basDualCrnp.getCrnNo());
        if(dualCrnThread == null){
            return;
        }
        DualCrnProtocol dualCrnProtocol = dualCrnThread.getStatus();
        if(dualCrnProtocol == null){
            return;
        }
        if (!(dualCrnProtocol.getStatusType().equals(DualCrnStatusType.IDLE) && dualCrnProtocol.getStatusTypeTwo().equals(DualCrnStatusType.IDLE))) {
        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                .eq("dual_crn_no", basDualCrnp.getCrnNo())
                .in("wrk_sts", WrkStsType.INBOUND_RUN.sts, WrkStsType.OUTBOUND_RUN.sts)
        );
        if(wrkMasts == null || wrkMasts.size() >= 2){
            return;
        }
        if(!DualCrnModeType.AUTO.id.equals(dualCrnProtocol.getMode())) {
            return;
        }
        if(dualCrnProtocol.getAlarm() == null || dualCrnProtocol.getAlarm() != 0) {
            return;
        }
        if((dualCrnProtocol.getTaskSend() != null && dualCrnProtocol.getTaskSend() != 0)
                || (dualCrnProtocol.getTaskSendTwo() != null && dualCrnProtocol.getTaskSendTwo() != 0)) {
            return;
        }
        this.crnExecute(basDualCrnp, dualCrnThread);
    }
    private void crnExecute(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread) {
        DualCrnProtocol dualCrnProtocol = dualCrnThread.getStatus();
        if(dualCrnProtocol == null){
            return;
        }
        if (!(DualCrnStatusType.IDLE.equals(dualCrnProtocol.getStatusType())
                && DualCrnStatusType.IDLE.equals(dualCrnProtocol.getStatusTypeTwo()))) {
            return;
        }
@@ -115,7 +128,7 @@
        }
        // 如果最近一次是出库模式
        if (dualCrnProtocol.getLastIo().equals("O")) {
        if ("O".equals(dualCrnProtocol.getLastIo())) {
            boolean executeResult1 = processLoveMove(basDualCrnp, dualCrnThread);
            if (executeResult1) {
                return;
@@ -130,7 +143,7 @@
            }
        }
        // 如果最近一次是入库模式
        else if (dualCrnProtocol.getLastIo().equals("I")) {
        else if ("I".equals(dualCrnProtocol.getLastIo())) {
            boolean executeResult1 = processLoveMove(basDualCrnp, dualCrnThread);
            if (executeResult1) {
                return;
@@ -381,7 +394,7 @@
        return list;
    }
    private synchronized SendDualCrnCommandParam crnExecuteIn(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread, WrkMast wrkMast) {
    private SendDualCrnCommandParam crnExecuteIn(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread, WrkMast wrkMast) {
        DualCrnProtocol dualCrnProtocol = dualCrnThread.getStatus();
        if (dualCrnProtocol == null) {
            return null;
@@ -514,7 +527,7 @@
        return null;
    }
    private synchronized SendDualCrnCommandParam crnExecuteOut(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread, WrkMast wrkMast, int station) {
    private SendDualCrnCommandParam crnExecuteOut(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread, WrkMast wrkMast, int station) {
        DualCrnProtocol dualCrnProtocol = dualCrnThread.getStatus();
        if (dualCrnProtocol == null) {
            return null;
@@ -625,7 +638,7 @@
        return null;
    }
    private synchronized SendDualCrnCommandParam crnExecuteLocMove(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread, WrkMast wrkMast, int station) {
    private SendDualCrnCommandParam crnExecuteLocMove(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread, WrkMast wrkMast, int station) {
        DualCrnProtocol dualCrnProtocol = dualCrnThread.getStatus();
        if (dualCrnProtocol == null) {
            return null;
@@ -688,36 +701,128 @@
    }
    //双工位堆垛机任务执行完成
    public synchronized void dualCrnIoExecuteFinish() {
    public void dualCrnIoExecuteFinish() {
        List<BasDualCrnp> basDualCrnps = basDualCrnpService.selectList(new EntityWrapper<>());
        for (BasDualCrnp basDualCrnp : basDualCrnps) {
            DualCrnThread dualCrnThread = (DualCrnThread) SlaveConnection.get(SlaveType.DualCrn, basDualCrnp.getCrnNo());
            if(dualCrnThread == null){
                continue;
            }
            dualCrnIoExecuteFinish(basDualCrnp);
        }
    }
            DualCrnProtocol dualCrnProtocol = dualCrnThread.getStatus();
            if(dualCrnProtocol == null){
                continue;
            }
    public void dualCrnIoExecuteFinish(BasDualCrnp basDualCrnp) {
        if (basDualCrnp == null || basDualCrnp.getCrnNo() == null) {
            return;
        }
        DualCrnThread dualCrnThread = (DualCrnThread) SlaveConnection.get(SlaveType.DualCrn, basDualCrnp.getCrnNo());
        if(dualCrnThread == null){
            return;
        }
            if(dualCrnProtocol.getMode() != DualCrnModeType.AUTO.id) {
                continue;
            }
        DualCrnProtocol dualCrnProtocol = dualCrnThread.getStatus();
        if(dualCrnProtocol == null){
            return;
        }
            if(dualCrnProtocol.getAlarm() != 0) {
                continue;
            }
        if(!DualCrnModeType.AUTO.id.equals(dualCrnProtocol.getMode())) {
            return;
        }
            if((dualCrnProtocol.getTaskNo() > 0 && dualCrnProtocol.getDeviceTaskNo() > 0) && dualCrnProtocol.getTaskSend() == 0 && dualCrnProtocol.getStatus().equals(DualCrnStatusType.WAITING.id)) {
                executeFinish(basDualCrnp, dualCrnThread, dualCrnProtocol, dualCrnProtocol.getTaskNo(), 1);
                continue;
            }
        if(dualCrnProtocol.getAlarm() == null || dualCrnProtocol.getAlarm() != 0) {
            return;
        }
            if((dualCrnProtocol.getTaskNoTwo() > 0 && dualCrnProtocol.getDeviceTaskNoTwo() > 0) && dualCrnProtocol.getTaskSendTwo() == 0 && dualCrnProtocol.getStatusTwo().equals(DualCrnStatusType.WAITING.id)) {
                executeFinish(basDualCrnp, dualCrnThread, dualCrnProtocol, dualCrnProtocol.getTaskNoTwo(), 2);
        if((dualCrnProtocol.getTaskNo() != null && dualCrnProtocol.getTaskNo() > 0
                && dualCrnProtocol.getDeviceTaskNo() != null && dualCrnProtocol.getDeviceTaskNo() > 0)
                && (dualCrnProtocol.getTaskSend() == null || dualCrnProtocol.getTaskSend() == 0)
                && DualCrnStatusType.WAITING.id.equals(dualCrnProtocol.getStatus())) {
            executeFinish(basDualCrnp, dualCrnThread, dualCrnProtocol, dualCrnProtocol.getTaskNo(), 1);
            return;
        }
        if((dualCrnProtocol.getTaskNoTwo() != null && dualCrnProtocol.getTaskNoTwo() > 0
                && dualCrnProtocol.getDeviceTaskNoTwo() != null && dualCrnProtocol.getDeviceTaskNoTwo() > 0)
                && (dualCrnProtocol.getTaskSendTwo() == null || dualCrnProtocol.getTaskSendTwo() == 0)
                && DualCrnStatusType.WAITING.id.equals(dualCrnProtocol.getStatusTwo())) {
            executeFinish(basDualCrnp, dualCrnThread, dualCrnProtocol, dualCrnProtocol.getTaskNoTwo(), 2);
        }
    }
    public void submitDualCrnIoTasks(long minIntervalMs) {
        submitDualCrnIoTasks(MainProcessLane.DUAL_CRN_IO, minIntervalMs);
    }
    public void submitDualCrnIoTasks(MainProcessLane lane, long minIntervalMs) {
        mainProcessTaskSubmitter.submitSerialTask(
                MainProcessLane.DUAL_CRN_SCAN,
                "submitDualCrnIoTasks",
                minIntervalMs,
                new Runnable() {
                    @Override
                    public void run() {
                        submitDualCrnIoTasksInternal(lane, minIntervalMs);
                    }
                }
        );
    }
    private void submitDualCrnIoTasksInternal(MainProcessLane lane, long minIntervalMs) {
        List<BasDualCrnp> basDualCrnps = basDualCrnpService.selectList(new EntityWrapper<>());
        for (final BasDualCrnp basDualCrnp : basDualCrnps) {
            Integer crnNo = basDualCrnp == null ? null : basDualCrnp.getCrnNo();
            if (crnNo == null) {
                continue;
            }
            mainProcessTaskSubmitter.submitKeyedSerialTask(
                    lane,
                    crnNo,
                    "dualCrnIoExecute",
                    minIntervalMs,
                    new Runnable() {
                        @Override
                        public void run() {
                            dualCrnIoExecute(basDualCrnp);
                        }
                    }
            );
        }
    }
    public void submitDualCrnIoExecuteFinishTasks(long minIntervalMs) {
        submitDualCrnIoExecuteFinishTasks(MainProcessLane.DUAL_CRN_IO_FINISH, minIntervalMs);
    }
    public void submitDualCrnIoExecuteFinishTasks(MainProcessLane lane, long minIntervalMs) {
        mainProcessTaskSubmitter.submitSerialTask(
                MainProcessLane.DUAL_CRN_SCAN,
                "submitDualCrnIoExecuteFinishTasks",
                minIntervalMs,
                new Runnable() {
                    @Override
                    public void run() {
                        submitDualCrnIoExecuteFinishTasksInternal(lane, minIntervalMs);
                    }
                }
        );
    }
    private void submitDualCrnIoExecuteFinishTasksInternal(MainProcessLane lane, long minIntervalMs) {
        List<BasDualCrnp> basDualCrnps = basDualCrnpService.selectList(new EntityWrapper<>());
        for (final BasDualCrnp basDualCrnp : basDualCrnps) {
            Integer crnNo = basDualCrnp == null ? null : basDualCrnp.getCrnNo();
            if (crnNo == null) {
                continue;
            }
            mainProcessTaskSubmitter.submitKeyedSerialTask(
                    lane,
                    crnNo,
                    "dualCrnIoExecuteFinish",
                    minIntervalMs,
                    new Runnable() {
                        @Override
                        public void run() {
                            dualCrnIoExecuteFinish(basDualCrnp);
                        }
                    }
            );
        }
    }
@@ -806,7 +911,7 @@
    }
    //检测浅库位状态
    public synchronized boolean checkShallowLocStatus(String locNo, Integer taskNo) {
    public boolean checkShallowLocStatus(String locNo, Integer taskNo) {
        String checkDeepLocOutTaskBlockReport = "Y";
        Object systemConfigMapObj = redisUtil.get(RedisKeyType.SYSTEM_CONFIG_MAP.key);
        if (systemConfigMapObj != null) {