#
Junjie
2024-04-12 b7a88cf890d7259d2164bef402be3e8423a38007
#
7个文件已修改
125 ■■■■■ 已修改文件
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/action/ShuttleAction.java 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/command/ShuttleCommandService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/NavigateNode.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/command/ShuttleAssignCommand.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/command/ShuttleRedisCommand.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/model/protocol/ShuttleProtocol.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayShuttleThread.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/action/ShuttleAction.java
@@ -87,7 +87,11 @@
        if (obj == null) {
            return false;
        }
        ShuttleRedisCommand redisCommand = JSON.parseObject(obj.toString(), ShuttleRedisCommand.class);
        JSONObject jsonObject = JSON.parseObject(String.valueOf(obj));
        System.out.println(JSON.parseObject(String.valueOf(obj)));
        ShuttleRedisCommand redisCommand = JSON.parseObject(String.valueOf(obj), ShuttleRedisCommand.class);
        System.out.println(JSON.toJSONString(redisCommand));
        if (redisCommand == null) {
            return false;
        }
@@ -177,12 +181,12 @@
                // 系统任务
                if (assignCommand.getAuto()) {
                    if (!assignCommand.getCharge()) {
                        //对主线程抛出等待确认状态waiting
                        shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.WAITING);
                    }else {
                        shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.CHARGING_WAITING);
                    }
//                    if (!assignCommand.getCharge()) {
//                        //对主线程抛出等待确认状态waiting
//                        shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.WAITING);
//                    }else {
//                        shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.CHARGING_WAITING);
//                    }
                    News.info("四向穿梭车任务执行下发完成等待执行结束,穿梭车号={},任务数据={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(command));
                    // 手动任务
@@ -211,6 +215,11 @@
            return false;
        }
        commandStep++;
        //更新redis数据
        redisCommand.setCommandStep(commandStep);
        //任务数据保存到redis
        redisUtil.set(DeviceRedisConstant.SHUTTLE_WORK_FLAG + redisCommand.getWrkNo(), JSON.toJSONString(redisCommand));
        return true;
    }
@@ -379,4 +388,10 @@
        return result;
    }
    public static void main(String[] args) {
        String s = "{\"commandStep\":0,\"liftSecurityMk\":false,\"shuttleNo\":6,\"wrkNo\":30095,\"assignCommand\":{\"sourceLocNo\":\"3-1-1\",\"auto\":true,\"shuttleNo\":6,\"taskMode\":19,\"charge\":false,\"nodes\":[{\"isInflectionPoint\":false,\"f\":0,\"g\":0,\"h\":0,\"x\":3,\"y\":1,\"nodeZ\":1,\"z\":1,\"direction\":\"top\"},{\"isInflectionPoint\":false,\"f\":1,\"g\":0,\"h\":1,\"x\":2,\"y\":1,\"nodeZ\":1,\"z\":1},{\"isInflectionPoint\":false,\"f\":1,\"g\":1,\"h\":0,\"x\":1,\"y\":1,\"nodeZ\":1,\"z\":1}],\"locNo\":\"1-1-1\",\"taskNo\":30095,\"deviceId\":6,\"commands\":[{\"mode\":1,\"targetLocNo\":\"1-1-1\",\"shuttleNo\":78,\"nodes\":[{\"isInflectionPoint\":false,\"moveDistance\":1000,\"f\":0,\"g\":0,\"h\":0,\"x\":3,\"y\":1,\"nodeZ\":1,\"z\":1,\"direction\":\"top\"},{\"isInflectionPoint\":false,\"moveDistance\":1000,\"f\":1,\"g\":0,\"h\":1,\"x\":2,\"y\":1,\"nodeZ\":1,\"z\":1,\"direction\":\"top\"},{\"isInflectionPoint\":false,\"moveDistance\":1000,\"f\":1,\"g\":1,\"h\":0,\"x\":1,\"y\":1,\"nodeZ\":1,\"z\":1,\"direction\":\"top\"}],\"taskNo\":0,\"body\":\"{\\\"messageName\\\":\\\"runOrder\\\",\\\"nodeX\\\":1,\\\"nodeY\\\":1,\\\"msgTime\\\":\\\"2024-04-12 17:39:16\\\",\\\"nodeZ\\\":1,\\\"deviceNo\\\":78,\\\"taskId\\\":5}\",\"complete\":false}]}}";
        ShuttleRedisCommand shuttleRedisCommand = JSON.parseObject(s, ShuttleRedisCommand.class);
        System.out.println(shuttleRedisCommand);
    }
}
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/command/ShuttleCommandService.java
@@ -1,5 +1,6 @@
package com.zy.asrs.wcs.core.kernel.command;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zy.asrs.framework.common.Cools;
import com.zy.asrs.framework.exception.CoolException;
@@ -29,10 +30,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.*;
/**
 * Created by vincent on 2023/10/23
@@ -99,7 +97,7 @@
                // 如果已经在当前条码则过滤
                if (String.valueOf(shuttleProtocol.getCurrentCode()).equals(locService.getOne(new LambdaQueryWrapper<Loc>()
                        .eq(Loc::getLocNo, motion.getTarget())
                        .eq(Loc::getHostId, motion.getHostId())).getCode())) {
                            .eq(Loc::getHostId, motion.getHostId())).getCode())) {
                    return true;
                }
                shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.NORMAL.id, assignCommand, shuttleThread);
@@ -341,7 +339,11 @@
            News.error("{} dash {} can't find navigate path!", startLocNo, endLocNo);
            return null;
        }
        List<NavigateNode> allNode = new ArrayList<>(nodeList);
        List<NavigateNode> allNode = new ArrayList<>();
        for (NavigateNode node : nodeList) {
            allNode.add(node.clone());
        }
        List<ShuttleCommand> commands = new ArrayList<>();
        //获取分段路径
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/NavigateNode.java
@@ -2,15 +2,20 @@
import lombok.Data;
import java.io.Serializable;
/**
 * A*寻路算法Node节点
 */
@Data
public class NavigateNode implements Comparable<NavigateNode>{
public class NavigateNode implements Comparable<NavigateNode>, Cloneable, Serializable {
    private static final long serialVersionUID = 1L;
    private int x;//坐标x
    private int y;//坐标y
    private int z;//坐标z(高度)
    private int nodeZ;
    private int F;//综合花费的步数
    private int G;//已经花费的步数
    private int H;//将要花费的步数
@@ -46,4 +51,18 @@
        return Integer.compare(this.F, o.F);
    }
    public void setZ(int z) {
        this.z = z;
        this.nodeZ = z;
    }
    @Override
    public NavigateNode clone() {
        try {
            return (NavigateNode) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }
}
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/command/ShuttleAssignCommand.java
@@ -3,11 +3,14 @@
import com.zy.asrs.wcs.core.model.NavigateNode;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@Data
public class ShuttleAssignCommand {
public class ShuttleAssignCommand implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * 四向穿梭车号
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/command/ShuttleRedisCommand.java
@@ -10,6 +10,8 @@
@Data
public class ShuttleRedisCommand implements Serializable {
    private static final long serialVersionUID = 1L;
    //四向穿梭车号
    private Integer shuttleNo;
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/model/protocol/ShuttleProtocol.java
@@ -207,28 +207,6 @@
        return "";
    }
    /**
     * 获取小车空闲状态
     */
    public Boolean getIdle() {
        if (this.deviceStatus == null) {
            return false;
        }
        ShuttleDeviceStatusService shuttleDeviceStatusService = SpringUtils.getBean(ShuttleDeviceStatusService.class);
        ShuttleDeviceStatus status = shuttleDeviceStatusService.getOne(new LambdaQueryWrapper<ShuttleDeviceStatus>()
                .eq(ShuttleDeviceStatus::getHostId, this.device.getHostId())
                .eq(ShuttleDeviceStatus::getDevicePlc, this.device.getDevicePlc())
                .eq(ShuttleDeviceStatus::getStatus, 1)
                .eq(ShuttleDeviceStatus::getDeviceStatus, this.deviceStatus));
        if (status != null) {
            if (status.getFlag() != null && status.getFlag().equals(String.valueOf(ShuttleDeviceStatusType.IDLE))) {
                return true;//空闲中
            }
        }
        return false;//默认不空闲
    }
    public Integer getTaskNo() {
        RedisUtil redisUtil = SpringUtils.getBean(RedisUtil.class);
        if (null != redisUtil) {
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayShuttleThread.java
@@ -135,7 +135,7 @@
                ///读取四向穿梭车状态-end
                //小车处于忙碌状态,将标记置为true
                if (!shuttleProtocol.getIdle()) {
                if (deviceStatus == 1 || deviceStatus == 2 || deviceStatus == 5) {
                    shuttleProtocol.setPakMk(true);
                }
@@ -228,21 +228,33 @@
            ArrayList<HashMap<String, Object>> modes = new ArrayList<>();
            //获取分段路径
            ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(nodes);
            for (ArrayList<NavigateNode> sectionNodes : data) {
            for (int idx = 0; idx < data.size(); idx++) {
                ArrayList<NavigateNode> sectionNodes = data.get(idx);
                boolean isRemoveFooterNode = false;//是否剔除尾节点
                if (idx != data.size() - 1) {
                    isRemoveFooterNode = true;//剔除尾节点
                }
                boolean flag = true;
                int oper;
                //开始路径
                NavigateNode startPath = nodes.get(0);
                NavigateNode startPath = sectionNodes.get(0);
                //结束路径
                NavigateNode targetPath = sectionNodes.get(sectionNodes.size() - 1);
                if (ShuttleRunDirection.get(startPath.getDirection()) == ShuttleRunDirection.LEFT
                        || ShuttleRunDirection.get(startPath.getDirection()) == ShuttleRunDirection.RIGHT) {
                    //母轨方向
                    oper = 5;
                }else {
                } else {
                    //子轨方向
                    oper = 6;
                }
                for (NavigateNode node : sectionNodes) {
                for (int i = 0; i < sectionNodes.size(); i++) {
                    if (isRemoveFooterNode && i == sectionNodes.size() - 1) {
                        continue;
                    }
                    NavigateNode node = sectionNodes.get(i);
                    HashMap<String, Object> map = new HashMap<>();
                    map.put("nodeX", node.getX());
                    map.put("nodeY", node.getY());
@@ -389,7 +401,7 @@
                return false;
            }
        }
        if (this.shuttleProtocol.getIdle() == null
        if (this.shuttleProtocol.getDeviceStatus() == null
                || this.shuttleProtocol.getPakMk() == null
                || this.shuttleProtocol.getErrorCode() == null
                || this.shuttleProtocol.getProtocolStatus() == null
@@ -397,7 +409,7 @@
            return false;
        }
        boolean res = this.shuttleProtocol.getIdle()
        boolean res = (this.shuttleProtocol.getDeviceStatus() == 3 || this.shuttleProtocol.getDeviceStatus() == 11)
                && this.shuttleProtocol.getPakMk()
                && this.shuttleProtocol.getErrorCode().equals("0")
                && this.shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.IDLE.id
@@ -407,7 +419,7 @@
    @Override
    public boolean isRequireCharge() {
        if (this.shuttleProtocol.getIdle() == null
        if (this.shuttleProtocol.getDeviceStatus() == null
                || this.shuttleProtocol.getPakMk() == null
                || this.shuttleProtocol.getErrorCode() == null
                || this.shuttleProtocol.getProtocolStatus() == null
@@ -415,7 +427,7 @@
            return false;
        }
        boolean res = this.shuttleProtocol.getIdle()
        boolean res = (this.shuttleProtocol.getDeviceStatus() == 3)
                && this.shuttleProtocol.getPakMk()
                && this.shuttleProtocol.getErrorCode().equals("0")
                && this.shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.IDLE.id
@@ -475,7 +487,7 @@
        ArrayList<NavigateNode> path = new ArrayList<>();
        if (shuttleProtocol.getTaskNo() != 0) {
            //存在任务,获取指令
            Object object = redisUtil.get(DeviceRedisConstant.SHUTTLE_FLAG + shuttleProtocol.getTaskNo());
            Object object = redisUtil.get(DeviceRedisConstant.SHUTTLE_WORK_FLAG + shuttleProtocol.getTaskNo());
            if (object != null) {
                ShuttleRedisCommand redisCommand = JSON.parseObject(object.toString(), ShuttleRedisCommand.class);
                List<NavigateNode> nodes = redisCommand.getAssignCommand().getNodes();//穿梭车预计路径