#
Junjie
2024-06-12 7180e7e7c548c78f327a9f66c2bc89af64039e7e
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayLiftThread.java
@@ -2,24 +2,23 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zy.asrs.common.utils.HttpHandler;
import com.zy.asrs.framework.common.DateUtils;
import com.zy.asrs.framework.common.SpringUtils;
import com.zy.asrs.framework.exception.CoolException;
import com.zy.asrs.wcs.core.entity.Loc;
import com.zy.asrs.wcs.common.ExecuteSupport;
import com.zy.asrs.wcs.core.model.command.LiftCommand;
import com.zy.asrs.wcs.core.model.command.ShuttleCommand;
import com.zy.asrs.wcs.core.model.enums.LiftCommandModeType;
import com.zy.asrs.wcs.core.model.enums.ShuttleCommandModeType;
import com.zy.asrs.wcs.core.service.LocService;
import com.zy.asrs.wcs.rcs.News;
import com.zy.asrs.wcs.rcs.cache.OutputQueue;
import com.zy.asrs.wcs.rcs.entity.DeviceDataLog;
import com.zy.asrs.wcs.rcs.model.enums.LiftProtocolStatusType;
import com.zy.asrs.wcs.rcs.model.protocol.LiftProtocol;
import com.zy.asrs.wcs.rcs.service.DeviceDataLogService;
import com.zy.asrs.wcs.rcs.thread.LiftThread;
import com.zy.asrs.wcs.core.utils.RedisUtil;
import com.zy.asrs.wcs.rcs.entity.Device;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.text.MessageFormat;
@@ -60,18 +59,10 @@
        try {
            readStatus();
//            //提升机处于运行状态,将标记置为false
//            if (liftProtocol.getBusy()) {
//                liftProtocol.setPakMk(false);
//            }
//
//            //提升机处于未运行、就绪、标记true、有任务号
//            if (!liftProtocol.getBusy()
//                    && !liftProtocol.getPakMk()
//                    && liftProtocol.getTaskNo() != 0) {
//                //还有未完成的命令
//                executeWork(liftProtocol.getTaskNo());
//            }
            //提升机处于运行状态,将标记置为false
            if (liftProtocol.getRun()) {
                liftProtocol.setPakMk(false);
            }
        } catch (Exception e) {
            OutputQueue.LIFT.offer(MessageFormat.format("【{0}】读取提升机状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), device.getId(), device.getIp(), device.getPort()));
        }
@@ -87,6 +78,10 @@
                    liftProtocol.setLiftNo(Integer.valueOf(device.getDeviceNo()));
                    liftProtocol.setProtocolStatus(LiftProtocolStatusType.IDLE);
                    liftProtocol.setDevice(device);
                    InnerLiftExtend innerLiftExtend = new InnerLiftExtend();
                    innerLiftExtend.setLock(false);//默认未锁定
                    liftProtocol.setExtend(innerLiftExtend);
                }
                //----------读取提升机状态-----------
@@ -104,6 +99,13 @@
                liftProtocol.setErrorCode("");
                //层
                liftProtocol.setLev(data.getInteger("curFloor"));
                //************补充扩展字段*************
                InnerLiftExtend liftExtend = JSON.parseObject(JSON.toJSONString(liftProtocol.getExtend()), InnerLiftExtend.class);
                liftExtend.setLock(data.getInteger("lockStatus") == 1 ? true : false);
                liftProtocol.setExtend(liftExtend);
//                //前超限
//                liftProtocol.setFrontOverrun(status1[4]);
//                //后超限
@@ -129,6 +131,24 @@
//                //已完成任务号
//                liftProtocol.setCompleteTaskNo(siemensS7Net.getByteTransform().TransInt16(result1.Content, 6));
//                liftProtocol.setLev(lev);
                if (System.currentTimeMillis() - liftProtocol.getDeviceDataLog() > 1000 * 5) {
                    //采集时间超过5s,保存一次数据记录
                    //保存数据记录
                    DeviceDataLogService deviceDataLogService = SpringUtils.getBean(DeviceDataLogService.class);
                    DeviceDataLog deviceDataLog = new DeviceDataLog();
                    deviceDataLog.setOriginData(JSON.toJSONString(data));
                    deviceDataLog.setWcsData(JSON.toJSONString(liftProtocol));
                    deviceDataLog.setType("lift");
                    deviceDataLog.setDeviceNo(String.valueOf(liftProtocol.getLiftNo()));
                    deviceDataLog.setCreateTime(new Date());
                    deviceDataLog.setHostId(device.getHostId());
                    deviceDataLogService.save(deviceDataLog);
                    //更新采集时间
                    liftProtocol.setDeviceDataLog(System.currentTimeMillis());
                }
            }else {
                OutputQueue.LIFT.offer(MessageFormat.format("【{0}】{1}读取提升机状态信息失败", DateUtils.convert(new Date()), device.getId()));
                throw new CoolException(MessageFormat.format( "读取提升机状态信息失败 ===>> [id:{0}] [ip:{1}] [port:{2}]", device.getId(), device.getIp(), device.getPort()));
@@ -151,7 +171,7 @@
    @Override
    public LiftProtocol getStatus() {
        return this.liftProtocol;
        return this.liftProtocol.clone();
    }
    @Override
@@ -280,6 +300,51 @@
        return false;
    }
    @Override
    public boolean isIdle() {
        return isIdle(null);
    }
    @Override
    public boolean isIdle(ExecuteSupport support) {
        if (null != support) {
            if (!support.judgement()) {
                return false;
            }
        }
        InnerLiftExtend extend = (InnerLiftExtend) this.liftProtocol.getExtend();//获取扩展字段
        // 判断提升机是否自动、就绪、空闲、未锁定
        if (this.liftProtocol.getModel()
                && !this.liftProtocol.getRun()
                && this.liftProtocol.getReady()
                && this.liftProtocol.getPakMk()
                && this.liftProtocol.getErrorCode().equals("0")
                && this.liftProtocol.getProtocolStatus().equals(LiftProtocolStatusType.IDLE)
                && !extend.getLock()
        ) {
            return true;
        }
        return false;
    }
    @Override
    public boolean setProtocolStatus(LiftProtocolStatusType status) {
        this.liftProtocol.setProtocolStatus(status);
        return true;
    }
    @Override
    public boolean setSyncTaskNo(Integer taskNo) {
        this.liftProtocol.setTaskNo(taskNo);
        return true;
    }
    @Override
    public boolean isLock(ExecuteSupport support) {
        InnerLiftExtend extend = (InnerLiftExtend) this.liftProtocol.getExtend();
        return extend.getLock();
    }
    //***************设备层通讯-不同厂商设备通讯方案不一致***************
    //请求登录
@@ -344,7 +409,9 @@
    //空载移动
    @Override
    public LiftCommand getEmptyMoveCommand(Integer taskNo, Integer targetLev) {
    public LiftCommand getMoveCommand(Integer taskNo, Integer sourceLev, Integer targetLev, LiftCommandModeType mode) {
        int taskMode = 3;//空载移动
        HashMap<String, Object> body = new HashMap<>();
        body.put("messageName", "lifterTask");
        body.put("msgTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
@@ -352,7 +419,7 @@
        body.put("taskId", taskNo);
        body.put("startLayer", 0);
        body.put("endLayer", targetLev);
        body.put("model", 3);//空载移动
        body.put("model", taskMode);
        LiftCommand command = new LiftCommand();
        command.setLiftNo(Integer.valueOf(this.device.getDeviceNo()));
@@ -365,13 +432,13 @@
    //载车移动
    @Override
    public LiftCommand getMoveWithShuttleCommand(Integer taskNo, Integer originLev, Integer targetLev) {
    public LiftCommand getMoveWithShuttleCommand(Integer taskNo, Integer sourceLev, Integer targetLev, LiftCommandModeType mode) {
        HashMap<String, Object> body = new HashMap<>();
        body.put("messageName", "lifterTask");
        body.put("msgTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        body.put("deviceNo", Integer.parseInt(this.device.getDeviceNo()));
        body.put("taskId", taskNo);
        body.put("startLayer", originLev);
        body.put("startLayer", sourceLev);
        body.put("endLayer", targetLev);
        body.put("model", 2);//载车移动
@@ -379,20 +446,20 @@
        command.setLiftNo(Integer.valueOf(this.device.getDeviceNo()));
        command.setBody(JSON.toJSONString(body));
        command.setMode(LiftCommandModeType.MOVE.id);
        command.setOriginLev(originLev);
        command.setOriginLev(sourceLev);
        command.setTargetLev(targetLev);
        return command;
    }
    //托盘出入
    @Override
    public LiftCommand getPalletInOutCommand(Integer taskNo, Integer originLev, Integer targetLev, Integer originSta, Integer targetSta) {
    public LiftCommand getPalletInOutCommand(Integer taskNo, Integer sourceLev, Integer targetLev, Integer originSta, Integer targetSta, LiftCommandModeType mode) {
        HashMap<String, Object> body = new HashMap<>();
        body.put("messageName", "lifterTask");
        body.put("msgTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        body.put("deviceNo", Integer.parseInt(this.device.getDeviceNo()));
        body.put("taskId", taskNo);
        body.put("startLayer", originLev);
        body.put("startLayer", sourceLev);
        body.put("endLayer", targetLev);
        body.put("startLocation", originSta);
        body.put("endLocation", targetSta);
@@ -402,7 +469,7 @@
        command.setLiftNo(Integer.valueOf(this.device.getDeviceNo()));
        command.setBody(JSON.toJSONString(body));
        command.setMode(LiftCommandModeType.PALLET_INOUT.id);
        command.setOriginLev(originLev);
        command.setOriginLev(sourceLev);
        command.setTargetLev(targetLev);
        command.setOriginSta(originSta);
        command.setTargetSta(targetSta);
@@ -444,4 +511,17 @@
        return command;
    }
    /**
     * 扩展字段
     */
    @Data
    private class InnerLiftExtend {
        /**
         * 提升机锁定
         */
        private Boolean lock = false;
    }
}