自动化立体仓库 - WCS系统
#
Junjie
2025-01-14 ba77f258c619b296e51cadc0958bff23965dfc6d
#
15个文件已修改
161 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/ForkLiftController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/LiftMsgTableVo.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkMast.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkMastLog.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/utils/ShuttleOperaUtils.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/News.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/ShuttleThread.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/impl/NyShuttleThread.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/impl/ZyForkLiftThread.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastLogMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/forklift.html 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/ForkLiftController.java
@@ -27,6 +27,7 @@
import com.zy.core.model.Task;
import com.zy.core.model.command.*;
import com.zy.core.model.protocol.ForkLiftProtocol;
import com.zy.core.model.protocol.ForkLiftStaProtocol;
import com.zy.core.model.protocol.LiftStaProtocol;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.ForkLiftThread;
@@ -75,6 +76,8 @@
                continue;
            }
            JSONObject data = JSON.parseObject(JSON.toJSONString(forkLiftProtocol));
            List<ForkLiftStaProtocol> forkLiftStaProtocols = forkLiftThread.getForkLiftStaProtocols();
            data.put("forkLiftStaProtocols", forkLiftStaProtocols);
            baseObj.putAll(data);
        }
        return R.ok().add(list);
@@ -99,8 +102,9 @@
                continue;
            }
            vo.setWorkNo(forkLiftProtocol.getTaskNo().intValue());//任务号
            vo.setWorkNo(forkLiftProtocol.getTaskNo());//任务号
            vo.setPakMk(forkLiftProtocol.getPakMk()?"Y" : "N");    // 作业标记
            vo.setForkLiftStaProtocols(forkLiftThread.getForkLiftStaProtocols());
        }
        return R.ok().add(list);
    }
src/main/java/com/zy/asrs/domain/vo/LiftMsgTableVo.java
@@ -1,6 +1,9 @@
package com.zy.asrs.domain.vo;
import com.zy.core.model.protocol.ForkLiftStaProtocol;
import lombok.Data;
import java.util.List;
@Data
public class LiftMsgTableVo {
@@ -15,34 +18,13 @@
    private String pakMk = "-";
    /**
     * 任务地址
     * 站点信息
     */
    private Short taskAddress;
    /**
     * 目的地址
     */
    private Short distAddress;
    /**
     * 已完成的任务号
     */
    private Short completeTaskNo;
    /**
     * 层
     */
    private Short lev;
    private List<ForkLiftStaProtocol> forkLiftStaProtocols;
    /**
     * 穿梭车号
     */
    private Integer shuttleNo;
    /**
     * 令牌
     */
    private Integer token;
}
src/main/java/com/zy/asrs/entity/WrkMast.java
@@ -161,6 +161,13 @@
    @TableField(value = "wms_wrk_no")
    private String wmsWrkNo;
    /**
     * 系统消息
     */
    @ApiModelProperty(value= "系统消息")
    @TableField(value = "system_msg")
    private String systemMsg;
    public String getWrkSts$(){
        BasWrkStatusMapper mapper = SpringUtils.getBean(BasWrkStatusMapper.class);
        BasWrkStatus entity = mapper.selectById(this.wrkSts);
src/main/java/com/zy/asrs/entity/WrkMastLog.java
@@ -167,6 +167,13 @@
    @TableField(value = "wms_wrk_no")
    private String wmsWrkNo;
    /**
     * 系统消息
     */
    @ApiModelProperty(value= "系统消息")
    @TableField(value = "system_msg")
    private String systemMsg;
    public WrkMastLog() {}
    public String getWrkSts$(){
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -2105,7 +2105,7 @@
            //小车处于空闲状态
            if (!shuttleThread.isIdle()) {
                News.info("{}任务,{}小车,小车忙碌中", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车,小车忙碌中", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                return false;
            }
@@ -2129,7 +2129,7 @@
            //判断提升机是否有其他任务(该任务需要换层必须提前独占提升机)
            WrkMast liftWrkMast = wrkMastService.selectLiftWrkMast(liftSta.getLiftNo());
            if (liftWrkMast != null) {
                News.info("{}任务,{}号提升机,提升机存在未完成任务,禁止派发", wrkMast.getWrkNo(), liftSta.getLiftNo());
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号提升机,提升机存在未完成任务,禁止派发", wrkMast.getWrkNo(), liftSta.getLiftNo());
                return false;//当前提升机存在未完成任务,等待下一次轮询
            }
@@ -2142,7 +2142,7 @@
            //获取小车到输送站点行走命令
            List<ShuttleCommand> commands = shuttleOperaUtils.getStartToTargetCommands(shuttleProtocol.getCurrentLocNo(), liftSta.getLocNo(), NavigationMapType.NORMAL.id, assignCommand, shuttleThread);
            if (commands == null) {
                News.info("{}任务,{}小车,路径计算失败", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车,路径计算失败", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                return false;//路径解锁失败
            }
@@ -2200,14 +2200,14 @@
                return false;
            }
            if (!forkLiftThread.isIdle()) {
                News.info("{}任务,{}号提升机,提升机忙碌中,禁止派发", wrkMast.getWrkNo(), wrkMast.getLiftNo());
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号提升机,提升机忙碌中,禁止派发", wrkMast.getWrkNo(), wrkMast.getLiftNo());
                return false;
            }
            //判断提升机是否有其他任务
            WrkMast liftWrkMast = wrkMastService.selectLiftWrkMast(wrkMast.getLiftNo());
            if (liftWrkMast != null) {
                if (!liftWrkMast.getWrkNo().equals(wrkMast.getWrkNo())) {//提升机任务和当前任务不相同
                    News.info("{}任务,{}号提升机,提升机存在未完成任务,禁止派发", wrkMast.getWrkNo(), wrkMast.getLiftNo());
                    News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号提升机,提升机存在未完成任务,禁止派发", wrkMast.getWrkNo(), wrkMast.getLiftNo());
                    return false;//当前提升机存在未完成任务,等待下一次轮询
                }
            }
@@ -2217,7 +2217,7 @@
            //获取目标站
            ForkLiftStaProtocol liftSta = ForkLiftUtils.getLiftStaByStaNo(wrkMast.getStaNo());
            if (sourceLiftSta == null || liftSta == null) {
                News.info("{}任务,缺少站点信息,禁止派发", wrkMast.getWrkNo());
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,缺少站点信息,禁止派发", wrkMast.getWrkNo());
                return false;//缺少站点信息
            }
@@ -2268,7 +2268,7 @@
            //小车处于空闲状态
            if (!shuttleThread.isIdle()) {
                News.info("{}任务,{}小车,小车忙碌中,禁止派发", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}小车,小车忙碌中,禁止派发", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo());
                return false;
            }
src/main/java/com/zy/common/utils/ShuttleOperaUtils.java
@@ -47,6 +47,7 @@
        List<NavigateNode> nodeList = navigateUtils.calc(startLocNo, endLocNo, mapType, Utils.getShuttlePoints(shuttleNo, Utils.getLev(startLocNo)), null);
        if (nodeList == null) {
            News.error("{} dash {} can't find navigate path!", startLocNo, endLocNo);
            shuttleThread.offerSystemMsg("{} dash {} can't find navigate path!", startLocNo, endLocNo);
            return null;
        }
@@ -81,6 +82,7 @@
        boolean result = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(startLocNo), shuttleNo, allNode, true);//锁定路径
        if (!result) {
            News.error("{} dash {} can't lock path!", startLocNo, endLocNo);
            shuttleThread.offerSystemMsg("{} dash {} can't lock path!", startLocNo, endLocNo);
            return null;//路径锁定失败
        }
        return commands;
@@ -103,6 +105,7 @@
        boolean lockResult = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(endLocNo), shuttleProtocol.getShuttleNo(), unlockPath, false);//所使用的路径进行解锁
        if (!lockResult) {
            News.error("{} dash {} can't find unlock path!", startLocNo, endLocNo);
            shuttleThread.offerSystemMsg("{} dash {} can't find unlock path!", startLocNo, endLocNo);
            return null;//解锁失败
        }
@@ -111,6 +114,7 @@
        List<NavigateNode> nodeList = navigateUtils.calc(startLocNo, endLocNo, mapType, Utils.getShuttlePoints(shuttleNo, Utils.getLev(startLocNo)), null);
        if (nodeList == null) {
            News.error("{} dash {} can't find navigate path!", startLocNo, endLocNo);
            shuttleThread.offerSystemMsg("{} dash {} can't find navigate path!", startLocNo, endLocNo);
            return null;
        }
src/main/java/com/zy/core/News.java
@@ -1,5 +1,8 @@
package com.zy.core;
import com.core.common.SpringUtils;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.service.WrkMastService;
import lombok.extern.slf4j.Slf4j;
import java.lang.reflect.Array;
@@ -109,6 +112,21 @@
        offer(NewsLevel.ERROR, format, arguments);
    }
    public static void taskInfo(Integer wrkNo, String format, Object... arguments) {
        info(format, arguments);
        offerTask(wrkNo, format, arguments);
    }
    public static void taskWarn(Integer wrkNo, String format, Object... arguments) {
        warn(format, arguments);
        offerTask(wrkNo, format, arguments);
    }
    public static void taskError(Integer wrkNo, String format, Object... arguments) {
        error(format, arguments);
        offerTask(wrkNo, format, arguments);
    }
    public static String printStr() {
        StringBuilder sb = new StringBuilder("[");
        List<NewsDomain> domains = NEWS_QUEUE.data();
@@ -139,11 +157,30 @@
        return res;
    }
    private static boolean offerTask(Integer wrkNo, String msg, Object[] args) {
        WrkMastService wrkMastService = SpringUtils.getBean(WrkMastService.class);
        if (wrkMastService == null) {
            return false;
        }
        WrkMast wrkMast = wrkMastService.selectByWorkNo(wrkNo);
        if (wrkMast == null) {
            return false;
        }
        String systemMsg = replace(msg, args);
        if (systemMsg.equals(wrkMast.getSystemMsg())) {
            wrkMast.setSystemMsg(systemMsg);
            wrkMast.setModiTime(new Date());
            wrkMastService.updateById(wrkMast);
        }
        return true;
    }
    private static boolean offer(NewsLevel level, String msg, Object[] args) {
        return NEWS_QUEUE.offer(new NewsDomain(level, replace(msg, args), (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date())));
    }
    private static String replace(String str, Object[] objs){
    public static String replace(String str, Object[] objs){
        if (null == objs || objs.length == 0 || null == str || "".equals(str.trim())) {
            return str;
        } else {
src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java
@@ -188,6 +188,11 @@
     */
    private Object extend;
    /**
     * 系统消息
     */
    private String systemMsg;
    public String getProtocolStatus$() {
        if (this.protocolStatusType == null) {
            return "";
src/main/java/com/zy/core/thread/ShuttleThread.java
@@ -63,6 +63,8 @@
    boolean enableDemo(boolean enable);//演示模式
    boolean offerSystemMsg(String format, Object... arguments);
    //***************获取命令*****************
    ShuttleCommand getMoveCommand(Integer taskNo, String startCodeNum, String distCodeNum, Integer allDistance, Integer runDirection, Integer runSpeed, List<NavigateNode> nodes);//获取移动命令
src/main/java/com/zy/core/thread/impl/NyShuttleThread.java
@@ -813,6 +813,13 @@
    }
    @Override
    public boolean offerSystemMsg(String format, Object... arguments) {
        String msg = News.replace(format, arguments);
        shuttleProtocol.setSystemMsg(msg);
        return true;
    }
    @Override
    public ShuttleCommand getMoveCommand(Integer taskNo, String startCodeNum, String distCodeNum, Integer allDistance, Integer runDirection, Integer runSpeed, List<NavigateNode> nodes) {
        NavigateMapData navigateMapData = SpringUtils.getBean(NavigateMapData.class);
        NyShuttleHttpCommand httpStandard = getHttpStandard(slave.getId(), taskNo);
src/main/java/com/zy/core/thread/impl/ZyForkLiftThread.java
@@ -170,6 +170,21 @@
                OutputQueue.FORKLIFT.offer(MessageFormat.format("【{0}】{1}读取货叉提升机状态信息失败", DateUtils.convert(new Date()), slave.getId()));
            }
            OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB102.0", (short) 8);
            if (result2.IsSuccess) {
                for (int i = 0; i < this.slave.getSta().size(); i++) {
                    ForkLiftSlave.Sta sta = this.slave.getSta().get(i);
                    if (forkLiftStaProtocols.isEmpty()) {
                        continue;
                    }
                    ForkLiftStaProtocol forkLiftStaProtocol = forkLiftStaProtocols.get(i);
                    boolean[] status1 = siemensS7Net.getByteTransform().TransBool(result2.Content, i * 2, 2);
                    forkLiftStaProtocol.setHasTray(status1[0]);
                    forkLiftStaProtocol.setHasCar(status1[1]);
                }
            }
            if (System.currentTimeMillis() - forkLiftProtocol.getDeviceDataLog() > 1000 * 5) {
                //采集时间超过5s,保存一次数据记录
                //保存数据记录
@@ -241,7 +256,7 @@
        array[3] = command.getPut();//放货数据
        OperateResult result = siemensS7Net.Write("DB103.0", array);
        if (result.IsSuccess) {
            OperateResult result2 = siemensS7Net.Write("DB103.16", command.getConfirm());
            OperateResult result2 = siemensS7Net.Write("DB103.8", command.getConfirm());
            if (result2.IsSuccess) {
                response.setResult(true);
            }
src/main/resources/application.yml
@@ -144,7 +144,7 @@
    port: 102
    rack: 0
    slot: 0
    staRow: 10
    staRow: 9
    staBay: 6
    sta[0]:
      staNo: 101
src/main/resources/mapper/WrkMastLogMapper.xml
@@ -26,6 +26,7 @@
        <result column="lift_no" property="liftNo" />
        <result column="shuttle_no" property="shuttleNo" />
        <result column="wms_wrk_no" property="wmsWrkNo" />
        <result column="system_msg" property="systemMsg" />
    </resultMap>
</mapper>
src/main/resources/mapper/WrkMastMapper.xml
@@ -25,6 +25,7 @@
        <result column="shuttle_no" property="shuttleNo" />
        <result column="lift_no" property="liftNo" />
        <result column="wms_wrk_no" property="wmsWrkNo" />
        <result column="system_msg" property="systemMsg" />
    </resultMap>
src/main/webapp/views/forklift.html
@@ -50,12 +50,8 @@
                <tr>
                    <th>提升机</th>
                    <th>工作号</th>
                    <th>任务地址</th>
                    <th>目的地址</th>
                    <th>已完成的任务号</th>
                    <th>层</th>
                    <th>站点信息</th>
                    <th>作业标记</th>
                    <th>穿梭车号</th>
                </tr>
                </thead>
                <tbody>
@@ -276,14 +272,17 @@
                    }
                    for (var i=1;i<=table.length;i++){
                        var tr = tableEl.find("tr").eq(i);
                        let staDiv = "";
                        table[i-1].forkLiftStaProtocols.forEach((item) => {
                            let hasTray = item.hasTray ? "Y" : "N";
                            let hasCar = item.hasCar ? "Y" : "N";
                            staDiv += "<div>" + item.lev + "层,托盘:" + hasTray + ",小车:" + hasCar + "</div>"
                        })
                        setVal(tr.children("td").eq(0), table[i-1].liftNo);
                        setVal(tr.children("td").eq(1), table[i-1].workNo);
                        setVal(tr.children("td").eq(2), table[i-1].taskAddress);
                        setVal(tr.children("td").eq(3), table[i-1].distAddress);
                        setVal(tr.children("td").eq(4), table[i-1].completeTaskNo);
                        setVal(tr.children("td").eq(5), table[i-1].lev);
                        setVal(tr.children("td").eq(6), table[i-1].pakMk);
                        setVal(tr.children("td").eq(7), table[i-1].shuttleNo);
                        setVal(tr.children("td").eq(2), staDiv);
                        setVal(tr.children("td").eq(3), table[i-1].pakMk);
                    }
                } else if (res.code === 403){
                    window.location.href = baseUrl+"/login";