#
Junjie
2 天以前 3b564661c82994ad96229b07a6fd5c9d1648aab2
src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
@@ -28,13 +28,11 @@
import com.zy.core.model.protocol.StationProtocol;
import com.zy.core.thread.CrnThread;
import com.zy.core.thread.StationThread;
import lombok.Synchronized;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
@Component
public class CrnOperateProcessUtils {
@@ -82,7 +80,11 @@
            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                    .eq("crn_no", basCrnp.getCrnNo())
                    .in("wrk_sts", WrkStsType.INBOUND_RUN.sts, WrkStsType.OUTBOUND_RUN.sts)
                    .in("wrk_sts",
                            WrkStsType.INBOUND_RUN.sts
                            , WrkStsType.OUTBOUND_RUN.sts
                            , WrkStsType.LOC_MOVE_RUN.sts
                    )
            );
            if(!wrkMasts.isEmpty()){
                continue;
@@ -99,45 +101,61 @@
                // 如果最近一次是入库模式
                if (crnProtocol.getLastIo().equals("I")) {
                    if (basCrnp.getInEnable().equals("Y")) {
                        this.crnExecuteIn(basCrnp, crnThread); //  入库
                        boolean result = this.crnExecuteIn(basCrnp, crnThread);//  入库
                        crnProtocol.setLastIo("O");
                        if (result) {
                            break;
                        }
                    } else if (basCrnp.getOutEnable().equals("Y")) {
                        this.crnExecuteOut(basCrnp, crnThread); //  出库
                        boolean result = this.crnExecuteOut(basCrnp, crnThread);//  出库
                        crnProtocol.setLastIo("I");
                        if(result) {
                            break;
                        }
                    }
                }
                // 如果最近一次是出库模式
                else if (crnProtocol.getLastIo().equals("O")) {
                    if (basCrnp.getOutEnable().equals("Y")) {
                        this.crnExecuteOut(basCrnp, crnThread); //  出库
                        boolean result = this.crnExecuteOut(basCrnp, crnThread);//  出库
                        crnProtocol.setLastIo("I");
                        if (result) {
                            break;
                        }
                    } else if (basCrnp.getInEnable().equals("Y")) {
                        this.crnExecuteIn(basCrnp, crnThread); //  入库
                        boolean result = this.crnExecuteIn(basCrnp, crnThread);//  入库
                        crnProtocol.setLastIo("O");
                        if (result) {
                            break;
                        }
                    }
                }
                //库位移转
                this.crnExecuteLocTransfer(basCrnp, crnThread);
                boolean result = this.crnExecuteLocTransfer(basCrnp, crnThread);
                if(result) {
                    break;
                }
            }
        }
    }
    private synchronized void crnExecuteIn(BasCrnp basCrnp, CrnThread crnThread) {
    @Synchronized
    private boolean crnExecuteIn(BasCrnp basCrnp, CrnThread crnThread) {
        CrnProtocol crnProtocol = crnThread.getStatus();
        if(crnProtocol == null){
            return;
            return false;
        }
        if(!basCrnp.getInEnable().equals("Y")){
            News.info("堆垛机:{} 可入信号不满足", basCrnp.getCrnNo());
            return;
            return false;
        }
        List<StationObjModel> inStationList = basCrnp.getInStationList$();
        if(inStationList.isEmpty()){
            News.info("堆垛机:{} 入库站点未设置", basCrnp.getCrnNo());
            return;
            return false;
        }
        Integer crnNo = basCrnp.getCrnNo();
@@ -204,34 +222,43 @@
            String sourceLocNo = Utils.getLocNo(stationObjModel.getDeviceRow(), stationObjModel.getDeviceBay(), stationObjModel.getDeviceLev());
            CrnCommand command = crnThread.getPickAndPutCommand(sourceLocNo, wrkMast.getLocNo(), wrkMast.getWrkNo(), crnNo);
            wrkMast.setWrkSts(WrkStsType.INBOUND_RUN.sts);
            wrkMast.setCrnNo(crnNo);
            wrkMast.setSystemMsg("");
            wrkMast.setIoTime(new Date());
            //给库位白色指示灯亮灯
            String[] split = basCrnp.getArr().split(",");
            int i = Arrays.asList(split).indexOf(wrkMast.getLocNo());
            if (wrkMastService.updateById(wrkMast)) {
                if (i>-1){
                    command.setLocNo(wrkMast.getLocNo());
                    command.setIndex(i);
                    command.setValue((short)1);
                }
                MessageQueue.offer(SlaveType.Crn, crnNo, new Task(2, command));
                notifyUtils.notify(String.valueOf(SlaveType.Crn), crnNo, String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_IN_TASK_RUN, null);
                News.info("堆垛机命令下发成功,堆垛机号={},任务数据={}", crnNo, JSON.toJSON(command));
                return true;
            }
        }
        return false;
    }
    private synchronized void crnExecuteOut(BasCrnp basCrnp, CrnThread crnThread) {
    private synchronized boolean crnExecuteOut(BasCrnp basCrnp, CrnThread crnThread) {
        CrnProtocol crnProtocol = crnThread.getStatus();
        if(crnProtocol == null){
            return;
            return false;
        }
        if(!basCrnp.getOutEnable().equals("Y")){
            News.info("堆垛机:{} 可出信号不满足", basCrnp.getCrnNo());
            return;
            return false;
        }
        List<StationObjModel> outStationList = basCrnp.getOutStationList$();
        if(outStationList.isEmpty()){
            News.info("堆垛机:{} 出库站点未设置", basCrnp.getCrnNo());
            return;
            return false;
        }
        Integer crnNo = basCrnp.getCrnNo();
@@ -298,14 +325,23 @@
                wrkMast.setCrnNo(crnNo);
                wrkMast.setSystemMsg("");
                wrkMast.setIoTime(new Date());
                //给库位白色指示灯亮灯
                String[] split = basCrnp.getArr().split(",");
                int i = Arrays.asList(split).indexOf(wrkMast.getSourceLocNo());
                if (wrkMastService.updateById(wrkMast)) {
                    if (i>-1){
                        command.setLocNo(wrkMast.getSourceLocNo());
                        command.setIndex(i);
                        command.setValue((short)1);
                    }
                    MessageQueue.offer(SlaveType.Crn, crnNo, new Task(2, command));
                    notifyUtils.notify(String.valueOf(SlaveType.Crn), crnNo, String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_OUT_TASK_RUN, null);
                    News.info("堆垛机命令下发成功,堆垛机号={},任务数据={}", crnNo, JSON.toJSON(command));
                    return;
                    return true;
                }
            }
        }
        return false;
    }
    private synchronized boolean crnExecuteInPlanner(BasCrnp basCrnp, CrnThread crnThread, WrkMast wrkMast) {
@@ -486,10 +522,10 @@
        return false;
    }
    private synchronized void crnExecuteLocTransfer(BasCrnp basCrnp, CrnThread crnThread) {
    private synchronized boolean crnExecuteLocTransfer(BasCrnp basCrnp, CrnThread crnThread) {
        CrnProtocol crnProtocol = crnThread.getStatus();
        if(crnProtocol == null){
            return;
            return false;
        }
        Integer crnNo = basCrnp.getCrnNo();
@@ -530,13 +566,27 @@
            wrkMast.setCrnNo(crnNo);
            wrkMast.setSystemMsg("");
            wrkMast.setIoTime(new Date());
            //给库位白色指示灯亮灯
            String[] split = basCrnp.getArr().split(",");
            int i = Arrays.asList(split).indexOf(wrkMast.getLocNo());
            String locNo = wrkMast.getLocNo();
            if (i == -1) {
                i = Arrays.asList(split).indexOf(wrkMast.getSourceLocNo());
                locNo = wrkMast.getSourceLocNo();
            }
            if (wrkMastService.updateById(wrkMast)) {
                if (i>-1){
                    command.setLocNo(locNo);
                    command.setIndex(i);
                    command.setValue((short)1);
                }
                MessageQueue.offer(SlaveType.Crn, crnNo, new Task(2, command));
                notifyUtils.notify(String.valueOf(SlaveType.Crn), crnNo, String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_TRANSFER_TASK_RUN, null);
                News.info("堆垛机命令下发成功,堆垛机号={},任务数据={}", crnNo, JSON.toJSON(command));
                return;
                return true;
            }
        }
        return false;
    }
    //堆垛机任务执行完成
@@ -568,16 +618,29 @@
                    News.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
                    continue;
                }
                //给库位白色指示灯亮灯
                String[] split = basCrnp.getArr().split(",");
                int i = -1;
                String locNo = "";
                Long updateWrkSts = null;
                if(wrkMast.getWrkSts() == WrkStsType.INBOUND_RUN.sts){
                    updateWrkSts = WrkStsType.COMPLETE_INBOUND.sts;
                    i = Arrays.asList(split).indexOf(wrkMast.getLocNo());
                    locNo = wrkMast.getLocNo();
                    notifyUtils.notify(String.valueOf(SlaveType.Crn), crnProtocol.getCrnNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_IN_TASK_COMPLETE, null);
                }else if(wrkMast.getWrkSts() == WrkStsType.OUTBOUND_RUN.sts){
                    updateWrkSts = WrkStsType.OUTBOUND_RUN_COMPLETE.sts;
                    i = Arrays.asList(split).indexOf(wrkMast.getSourceLocNo());
                    locNo = wrkMast.getSourceLocNo();
                    notifyUtils.notify(String.valueOf(SlaveType.Crn), crnProtocol.getCrnNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_OUT_TASK_COMPLETE, null);
                }else if(wrkMast.getWrkSts() == WrkStsType.LOC_MOVE_RUN.sts){
                    updateWrkSts = WrkStsType.COMPLETE_LOC_MOVE.sts;
                    i = Arrays.asList(split).indexOf(wrkMast.getLocNo());
                    locNo = wrkMast.getLocNo();
                    if(i==-1){
                        i = Arrays.asList(split).indexOf(wrkMast.getSourceLocNo());
                        locNo = wrkMast.getSourceLocNo();
                    }
                    notifyUtils.notify(String.valueOf(SlaveType.Crn), crnProtocol.getCrnNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.CRN_TRANSFER_TASK_COMPLETE, null);
                }else{
                    News.error("堆垛机处于等待确认且任务完成状态,但工作状态异常。堆垛机号={},工作号={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
@@ -587,9 +650,15 @@
                wrkMast.setWrkSts(updateWrkSts);
                wrkMast.setSystemMsg("");
                wrkMast.setIoTime(new Date());
                wrkMast.setWeight(crnProtocol.getWeight());
                if (wrkMastService.updateById(wrkMast)) {
                    CrnCommand resetCommand = crnThread.getResetCommand(crnProtocol.getCrnNo());
                    MessageQueue.offer(SlaveType.Crn, crnProtocol.getCrnNo(), new Task(2, resetCommand));
                    if (i>-1){
                        resetCommand.setLocNo(locNo);
                        resetCommand.setIndex(i);
                        resetCommand.setValue((short)0);
                    }
                    MessageQueue.offer(SlaveType.Crn, crnProtocol.getCrnNo(), new Task(3, resetCommand));
                    News.info("堆垛机任务状态更新成功,堆垛机号={},工作号={}", basCrnp.getCrnNo(), crnProtocol.getTaskNo());
                }
@@ -794,7 +863,7 @@
                String moveLocNo = dto.getLocNo();
                CreateLocMoveTaskParam moveTaskParam = new CreateLocMoveTaskParam();
                moveTaskParam.setTaskNo(dto.getTaskNo());
                moveTaskParam.setTaskNo(String.valueOf(dto.getTaskNo()));
                moveTaskParam.setSourceLocNo(shallowLocNo);
                moveTaskParam.setLocNo(moveLocNo);
                try {