From 08b68c503f12a28399f0c70e460ee6af8b7185ea Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期一, 10 二月 2025 12:46:13 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/asrs/domain/enums/NotifyMsgType.java   |   47 ++++
 src/main/java/com/zy/asrs/controller/OpenController.java    |   15 +
 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java |  246 +-----------------------
 src/main/java/com/zy/asrs/utils/NotifyUtils.java            |  113 +++++++++++
 src/main/java/com/zy/asrs/task/NotifyScheduler.java         |  126 ++++++++++++
 src/main/java/com/zy/core/MainProcess.java                  |    7 
 src/main/java/com/zy/core/enums/RedisKeyType.java           |    2 
 src/main/java/com/zy/asrs/domain/NotifyDto.java             |   37 +++
 8 files changed, 350 insertions(+), 243 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/OpenController.java b/src/main/java/com/zy/asrs/controller/OpenController.java
index 54e013d..da84136 100644
--- a/src/main/java/com/zy/asrs/controller/OpenController.java
+++ b/src/main/java/com/zy/asrs/controller/OpenController.java
@@ -1,14 +1,20 @@
 package com.zy.asrs.controller;
 
 import com.core.common.R;
+import com.zy.asrs.domain.NotifyDto;
+import com.zy.asrs.domain.enums.NotifyMsgType;
 import com.zy.asrs.domain.param.CancelTaskParam;
 import com.zy.asrs.domain.param.CompleteTaskParam;
 import com.zy.asrs.domain.param.CreateMoveTaskParam;
+import com.zy.asrs.utils.NotifyUtils;
 import com.zy.common.service.CommonService;
 import com.zy.core.dispatcher.ShuttleDispatchUtils;
+import com.zy.core.enums.SlaveType;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
 
 @Slf4j
 @RestController
@@ -19,6 +25,8 @@
     private CommonService commonService;
     @Autowired
     private ShuttleDispatchUtils shuttleDispatchUtils;
+    @Autowired
+    private NotifyUtils notifyUtils;
 
     @PostMapping("/createMoveTask")
     public R createMoveTask(@RequestBody CreateMoveTaskParam param) {
@@ -56,4 +64,11 @@
         return R.error("浠诲姟鍙栨秷澶辫触");
     }
 
+    @GetMapping("/test")
+    public R test() {
+        notifyUtils.notify(String.valueOf(SlaveType.Shuttle), 1, "9999", NotifyMsgType.SHUTTLE_MOVING);
+        notifyUtils.notify(String.valueOf(SlaveType.Shuttle), 2, "9999", NotifyMsgType.SHUTTLE_MOVE_COMPLETE);
+        return R.ok();
+    }
+
 }
diff --git a/src/main/java/com/zy/asrs/domain/NotifyDto.java b/src/main/java/com/zy/asrs/domain/NotifyDto.java
new file mode 100644
index 0000000..38d2f6a
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/NotifyDto.java
@@ -0,0 +1,37 @@
+package com.zy.asrs.domain;
+
+import lombok.Data;
+
+@Data
+public class NotifyDto {
+
+    private Long id;
+
+    //璁惧绫诲瀷
+    private String deviceType;
+
+    //璁惧鍙�
+    private Integer device;
+
+    //宸ヤ綔鍙�
+    private String taskNo;
+
+    //娑堟伅绫诲瀷
+    private String msgType;
+
+    //娑堟伅鍐呭
+    private String content;
+
+    //澶辫触閲嶈瘯娆℃暟
+    private Integer failTimes = 3;
+
+    //閲嶈瘯娆℃暟
+    private Integer retryTimes = 0;
+
+    //閲嶈瘯闂撮殧榛樿30s
+    private Integer retryTime = 30;
+
+    //涓婃閲嶈瘯鏃堕棿
+    private Long lastRetryTime = 0L;
+
+}
diff --git a/src/main/java/com/zy/asrs/domain/enums/NotifyMsgType.java b/src/main/java/com/zy/asrs/domain/enums/NotifyMsgType.java
new file mode 100644
index 0000000..11feb74
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/enums/NotifyMsgType.java
@@ -0,0 +1,47 @@
+package com.zy.asrs.domain.enums;
+
+public enum NotifyMsgType {
+    SHUTTLE_START_TAKE("shuttle_start_take", "灏忚溅寮�濮嬪彇璐�"),
+    SHUTTLE_TRANSPORT("shuttle_transport", "灏忚溅閫佽揣涓�"),
+    SHUTTLE_DELIVERY("shuttle_delivery", "灏忚溅鏀捐揣瀹屾垚"),
+    SHUTTLE_MOVING("shuttle_moving", "灏忚溅绉诲姩涓�"),
+    SHUTTLE_MOVE_COMPLETE("shuttle_move_complete", "灏忚溅绉诲姩瀹屾垚"),
+    SHUTTLE_POWER_LOW("shuttle_power_low", "灏忚溅浣庣數閲�"),
+    SHUTTLE_POWER_START("shuttle_power_start", "灏忚溅寮�濮嬪厖鐢�"),
+    SHUTTLE_POWER_COMPLETE("shuttle_power_complete", "灏忚溅鍏呯數瀹屾垚"),
+    SHUTTLE_ERROR("shuttle_error", "灏忚溅寮傚父"),
+    FORK_LIFT_ERROR("fork_lift_error", "璐у弶鎻愬崌鏈哄紓甯�"),
+    ;
+
+    public String flag;
+    public String desc;
+
+    NotifyMsgType(String flag, String desc) {
+        this.flag = flag;
+        this.desc = desc;
+    }
+
+    public static NotifyMsgType get(String flag) {
+        if (null == flag) {
+            return null;
+        }
+        for (NotifyMsgType type : NotifyMsgType.values()) {
+            if (type.flag.equals(flag)) {
+                return type;
+            }
+        }
+        return null;
+    }
+
+    public static NotifyMsgType get(NotifyMsgType type) {
+        if (null == type) {
+            return null;
+        }
+        for (NotifyMsgType type2 : NotifyMsgType.values()) {
+            if (type2 == type) {
+                return type2;
+            }
+        }
+        return null;
+    }
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
index dc1bfb5..3760f91 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -1,9 +1,11 @@
 package com.zy.asrs.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.zy.asrs.domain.enums.NotifyMsgType;
 import com.zy.asrs.entity.*;
 import com.zy.asrs.mapper.*;
 import com.zy.asrs.service.*;
+import com.zy.asrs.utils.NotifyUtils;
 import com.zy.asrs.utils.Utils;
 import com.zy.common.model.*;
 import com.zy.common.model.enums.NavigationMapType;
@@ -82,6 +84,8 @@
     private ShuttleAction shuttleAction;
     @Autowired
     private ForkLiftAction forkLiftAction;
+    @Autowired
+    private NotifyUtils notifyUtils;
 
 
 //    /**
@@ -851,10 +855,12 @@
                             //310.灏忚溅绉诲姩涓� ==> 311.灏忚溅绉诲姩瀹屾垚
                             wrkMast.setWrkSts(WrkStsType.COMPLETE_MOVE.sts);
                             shuttleThread.setSyncTaskNo(0);
+                            notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), NotifyMsgType.SHUTTLE_MOVE_COMPLETE);//瑙﹀彂閫氱煡
                         } else if (wrkMast.getWrkSts() == WrkStsType.CHARGE_SHUTTLE_WORKING.sts) {
                             //204.灏忚溅鍏呯數涓� ==> 205.灏忚溅鍏呯數瀹屾垚
                             wrkMast.setWrkSts(WrkStsType.CHARGE_SHUTTLE_COMPLETE.sts);
                             shuttleThread.setSyncTaskNo(0);
+                            notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), NotifyMsgType.SHUTTLE_POWER_COMPLETE);//瑙﹀彂閫氱煡
                         }else {
                             continue;
                         }
@@ -1561,206 +1567,6 @@
 //    }
 
     /**
-     * 鍑哄簱  ===>> 宸ヤ綔妗d俊鎭啓鍏ed鏄剧ず鍣�
-     */
-    public void ledExecute() {
-//        try {
-//            for (LedSlave led : slaveProperties.getLed()) {
-//                // 鑾峰彇杈撻�佺嚎plc绾跨▼
-//                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, led.getDevpPlcId());
-//                // 鍛戒护闆嗗悎
-//                List<LedCommand> commands = new ArrayList<>();
-//                // 宸ヤ綔妗i泦鍚�
-//                List<WrkMast> wrkMasts = new ArrayList<>();
-//                List<WrkMastLog> wrkMastLogs = new ArrayList<>();
-//                for (Integer staNo : led.getStaArr()) {
-//                    // 鑾峰彇鍙夎溅绔欑偣
-//                    StaProtocol staProtocol = devpThread.getStation().get(staNo);
-//                    if (null == staProtocol || null == staProtocol.getWorkNo() || 0 == staProtocol.getWorkNo() || !staProtocol.isLoading()) {
-//                        continue;
-//                    } else {
-//                        staProtocol = staProtocol.clone();
-//                    }
-//                    // 鑾峰彇宸ヤ綔妗f暟鎹�
-//                    WrkMast wrkMast = wrkMastMapper.selectById(staProtocol.getWorkNo());
-//                    Integer wrkNo = staProtocol.getWorkNo().intValue();
-//                    Integer ioType = null;
-//                    String sourceLocNo = null;
-//                    String locNo = null;
-//                    Integer wrkStaNo = null;
-//                    String barcode = null;
-//                    if (wrkMast == null) {
-//                        //鏌ヨ鍘嗗彶妗�
-//                        WrkMastLog wrkMastLog = wrkMastLogMapper.selectLatestByWorkNo(staProtocol.getWorkNo().intValue());
-//                        if (wrkMastLog == null) {
-//                            continue;
-//                        }
-//                        ioType = wrkMastLog.getIoType();
-//                        sourceLocNo = wrkMastLog.getSourceLocNo();
-//                        locNo = wrkMastLog.getLocNo();
-//                        wrkStaNo = wrkMastLog.getStaNo();
-//                        barcode = wrkMastLog.getBarcode();
-//                        wrkMastLogs.add(wrkMastLog);
-//                    }else {
-//                        if (wrkMast.getWrkSts() < 14 || wrkMast.getIoType() < 100) {
-//                            continue;
-//                        }
-//                        ioType = wrkMast.getIoType();
-//                        sourceLocNo = wrkMast.getSourceLocNo();
-//                        locNo = wrkMast.getLocNo();
-//                        wrkStaNo = wrkMast.getStaNo();
-//                        barcode = wrkMast.getBarcode();
-//                        wrkMasts.add(wrkMast);
-//                    }
-//                    // 缁勮鍛戒护
-//                    LedCommand ledCommand = new LedCommand();
-//                    ledCommand.setWorkNo(wrkNo);
-//                    ledCommand.setIoType(ioType);
-//                    // 鍑哄簱妯″紡
-//                    switch (ioType) {
-//                        case 101:
-//                            ledCommand.setTitle("鍏ㄦ澘鍑哄簱");
-//                            break;
-//                        case 103:
-//                            ledCommand.setTitle("鎷f枡鍑哄簱");
-//                            break;
-//                        case 104:
-//                            ledCommand.setTitle("骞舵澘鍑哄簱");
-//                            break;
-//                        case 107:
-//                            ledCommand.setTitle("鐩樼偣鍑哄簱");
-//                            break;
-//                        case 110:
-//                            ledCommand.setTitle("绌烘澘鍑哄簱");
-//                            ledCommand.setEmptyMk(true);
-//                            break;
-//                        default:
-//                            News.error("浠诲姟鍏ュ嚭搴撶被鍨嬮敊璇紒锛侊紒[宸ヤ綔鍙凤細{}] [鍏ュ嚭搴撶被鍨嬶細{}]", wrkNo, ioType);
-//                            break;
-//                    }
-//                    ledCommand.setSourceLocNo(sourceLocNo);
-//                    ledCommand.setLocNo(locNo);
-//                    ledCommand.setStaNo(wrkStaNo);
-//                    ledCommand.setBarcode(barcode);
-//                    if (ioType != 110 && ioType != 10) {
-//                        List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkNo));
-//                        if (!wrkDetls.isEmpty()) {
-//                            wrkDetls.forEach(wrkDetl -> {
-//                                double remainNum = wrkDetl.getStock() - wrkDetl.getAnfme();//鍓╀綑鏁伴噺
-//                                if (remainNum < 0) {
-//                                    remainNum = 0;
-//                                }
-//                                String matnr = wrkDetl.getMatnr();
-//                                Mat mat = matService.selectByMatnr(wrkDetl.getMatnr());
-//                                if (mat != null) {
-//                                    if (!mat.getMatnr().equals(mat.getMatnr2())) {
-//                                        matnr += " - " + mat.getMatnr2();
-//                                    }
-//                                }
-//                                ledCommand.getMatDtos().add(new MatDto(matnr, wrkDetl.getMaktx(), wrkDetl.getAnfme(), remainNum, wrkDetl.getSpecs(), wrkDetl.getSuppCode(), wrkDetl.getOrderNo()));
-//                            });
-//                        }else {
-//                            List<WrkDetlLog> wrkDetlLogs = wrkDetlLogService.selectLatestByWorkNo(wrkNo, barcode);
-//                            for (WrkDetlLog wrkDetlLog : wrkDetlLogs) {
-//                                double remainNum = wrkDetlLog.getStock() - wrkDetlLog.getAnfme();//鍓╀綑鏁伴噺
-//                                if (remainNum < 0) {
-//                                    remainNum = 0;
-//                                }
-//                                String matnr = wrkDetlLog.getMatnr();
-//                                Mat mat = matService.selectByMatnr(wrkDetlLog.getMatnr());
-//                                if (mat != null) {
-//                                    if (!mat.getMatnr().equals(mat.getMatnr2())) {
-//                                        matnr += " - " + mat.getMatnr2();
-//                                    }
-//                                }
-//                                ledCommand.getMatDtos().add(new MatDto(matnr, wrkDetlLog.getMaktx(), wrkDetlLog.getAnfme(), remainNum, wrkDetlLog.getSpecs(), wrkDetlLog.getSuppCode()));
-//                            }
-//                        }
-//                    commands.add(ledCommand);
-//                }
-//                Set<Integer> workNos = null;
-//                if (!wrkMasts.isEmpty()) {
-//                    workNos = wrkMasts.stream().map(WrkMast::getWrkNo).collect(Collectors.toSet());
-//                }else {
-//                    workNos = wrkMastLogs.stream().map(WrkMastLog::getWrkNo).collect(Collectors.toSet());
-//                }
-//                // 鑾峰彇LED绾跨▼
-//                LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, led.getId());
-//                // 鐩稿悓宸ヤ綔鍙烽泦鍚堝垯杩囨护
-//                if (CollectionUtils.equals(ledThread.getWorkNos(), workNos)) {
-//                    continue;
-//                }
-//                // 鍛戒护涓嬪彂 -------------------------------------------------------------------------------
-//                if (!commands.isEmpty()) {
-//                    if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(1, commands))) {
-//                        log.error("{}鍙稬ED鍛戒护涓嬪彂澶辫触锛侊紒锛乕ip锛歿}] [port锛歿}]", led.getId(), led.getIp(), led.getPort());
-//                        continue;
-//                    } else {
-//                        ledThread.setLedMk(false);
-//                    }
-//                }
-//
-//                try {
-//                    // 淇敼涓绘。led鏍囪
-//                    for (WrkMast wrkMast : wrkMasts) {
-//                        wrkMast.setOveMk("Y");
-//                        wrkMast.setModiTime(new Date());
-//                        if (wrkMastMapper.updateById(wrkMast) == 0) {
-//                            throw new CoolException("鏇存柊宸ヤ綔妗eけ璐�");
-//                        }
-//                    }
-//
-//                    // 鏇存柊绾跨▼褰撳墠宸ヤ綔鍙烽泦鍚�
-//                    ledThread.setWorkNos(workNos);
-//
-//                } catch (Exception e) {
-//                    e.printStackTrace();
-//                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-//                }
-//
-//            }
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//        }
-    }
-
-    /**
-     * 鍏朵粬  ===>> LED鏄剧ず鍣ㄥ浣嶏紝鏄剧ず榛樿淇℃伅
-     */
-    public void ledReset() {
-//        try {
-//            for (LedSlave led : slaveProperties.getLed()) {
-//                // 鑾峰彇杈撻�佺嚎plc绾跨▼
-//                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, led.getDevpPlcId());
-//                // 鍛戒护闆嗗悎
-//                boolean reset = true;
-//                for (Integer staNo : led.getStaArr()) {
-//                    // 鑾峰彇鍙夎溅绔欑偣
-//                    StaProtocol staProtocol = devpThread.getStation().get(staNo);
-//                    if (staProtocol == null) {
-//                        continue;
-//                    }
-//                    if (staProtocol.isLoading()) {
-//                        reset = false;
-//                        break;
-//                    }
-//                }
-//                // 鑾峰彇led绾跨▼
-//                LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, led.getId());
-//                // led鏄剧ず榛樿鍐呭
-//                if (reset) {
-//                    ledThread.setLedMk(true);
-//                    if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(2, new ArrayList<>()))) {
-//                        log.error("{}鍙稬ED鍛戒护涓嬪彂澶辫触锛侊紒锛乕ip锛歿}] [port锛歿}]", led.getId(), led.getIp(), led.getPort());
-//                    }
-//                }
-//            }
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//        }
-    }
-
-    /**
      * 鍥涘悜绌挎杞︾數閲忔娴� ===>> 鍙戣捣鍏呯數
      */
     public synchronized void loopShuttleCharge() {
@@ -1988,6 +1794,8 @@
 
             //涓嬪彂浠诲姟
             shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
+
+            notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), NotifyMsgType.SHUTTLE_POWER_START);//瑙﹀彂閫氱煡
             return false;
         }
         return true;
@@ -2188,6 +1996,8 @@
             if (wrkMastService.updateById(wrkMast)) {
                 //涓嬪彂浠诲姟
                 shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
+                //瑙﹀彂閫氱煡
+                notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), NotifyMsgType.SHUTTLE_MOVING);
                 return false;
             }
             return false;
@@ -2402,41 +2212,5 @@
         }
         return true;
     }
-
-//    //鎵弿璁惧PakMk鏍囪鏄惁瓒呮椂
-//    public synchronized void scanDevicePakMk() {
-//        try {
-//            //鎵弿灏忚溅
-//            for (ShuttleSlave slave : slaveProperties.getShuttle()) {
-//                NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, slave.getId());
-//                NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
-//                if (shuttleProtocol == null) {
-//                    continue;
-//                }
-//
-//                if ((System.currentTimeMillis() - shuttleProtocol.getSendTime() > (1000 * 60 * 5)) && shuttleProtocol.getPakMk()) {
-//                    //璁惧瓒呰繃5鍒嗛挓杩樻病澶嶄綅鏍囪
-//                    shuttleProtocol.setPakMk(false);//澶嶄綅鏍囪
-//                }
-//            }
-//
-//            //鎵弿鎻愬崌鏈�
-//            for (LiftSlave slave : slaveProperties.getLift()) {
-//                LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, slave.getId());
-//                LiftProtocol liftProtocol = liftThread.getLiftProtocol();
-//                if (liftProtocol == null) {
-//                    continue;
-//                }
-//
-//                if ((System.currentTimeMillis() - liftProtocol.getSendTime() > (1000 * 60 * 5)) && liftProtocol.getPakMk()) {
-//                    //璁惧瓒呰繃5鍒嗛挓杩樻病澶嶄綅鏍囪
-//                    liftProtocol.setPakMk(false);//澶嶄綅鏍囪
-//                }
-//            }
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//        }
-//
-//    }
 
 }
diff --git a/src/main/java/com/zy/asrs/task/NotifyScheduler.java b/src/main/java/com/zy/asrs/task/NotifyScheduler.java
new file mode 100644
index 0000000..601d9aa
--- /dev/null
+++ b/src/main/java/com/zy/asrs/task/NotifyScheduler.java
@@ -0,0 +1,126 @@
+package com.zy.asrs.task;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.zy.asrs.domain.NotifyDto;
+import com.zy.asrs.utils.NotifyUtils;
+import com.zy.common.utils.HttpHandler;
+import com.zy.common.utils.RedisUtil;
+import com.zy.core.enums.SlaveType;
+import com.zy.core.model.ForkLiftSlave;
+import com.zy.core.model.ShuttleSlave;
+import com.zy.core.properties.SlaveProperties;
+import com.zy.system.entity.Config;
+import com.zy.system.service.ConfigService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+@Slf4j
+public class NotifyScheduler {
+
+    @Autowired
+    private RedisUtil redisUtil;
+    @Autowired
+    private NotifyUtils notifyUtils;
+    @Autowired
+    private SlaveProperties slaveProperties;
+    @Autowired
+    private ConfigService configService;
+
+    @Scheduled(cron = "0/3 * * * * ? ")
+    public synchronized void notifyShuttle(){
+        for (ShuttleSlave slave : slaveProperties.getShuttle()) {
+            notifyMsg(String.valueOf(SlaveType.Shuttle), slave.getId());
+        }
+    }
+
+    @Scheduled(cron = "0/3 * * * * ? ")
+    public synchronized void notifyForkLift(){
+        for (ForkLiftSlave slave : slaveProperties.getForkLift()) {
+            notifyMsg(String.valueOf(SlaveType.ForkLift), slave.getId());
+        }
+    }
+
+    private synchronized void notifyMsg(String deviceType, Integer device) {
+        Config notifyEnableConfig = configService.selectOne(new EntityWrapper<Config>().eq("code", "notifyEnable"));
+        if(notifyEnableConfig == null){
+            return;
+        }
+        String notifyEnable = notifyEnableConfig.getValue();
+        if (!notifyEnable.equals("Y")) {
+            return;
+        }
+
+        Config notifyUriConfig = configService.selectOne(new EntityWrapper<Config>().eq("code", "notifyUri"));
+        if(notifyUriConfig == null){
+            return;
+        }
+        String notifyUri = notifyUriConfig.getValue();
+
+        Config notifyUriPathConfig = configService.selectOne(new EntityWrapper<Config>().eq("code", "notifyUriPath"));
+        if(notifyUriPathConfig == null){
+            return;
+        }
+        String notifyUriPath = notifyUriPathConfig.getValue();
+
+        List<String> keys = notifyUtils.takeKeys(deviceType, device);
+        if(keys == null){
+            return;
+        }
+
+        if (keys.isEmpty()) {
+            return;
+        }
+
+        for (String key : keys) {
+            Object object = redisUtil.get(key);
+            if (object == null) {
+                continue;
+            }
+            NotifyDto notifyDto = (NotifyDto) object;
+
+            if (System.currentTimeMillis() - notifyDto.getLastRetryTime() < 1000 * notifyDto.getRetryTime()) {
+                continue;
+            }
+
+            try {
+                //瑙﹀彂閫氱煡
+                String response = new HttpHandler.Builder()
+                        .setUri(notifyUri)
+                        .setPath(notifyUriPath)
+                        .setJson(JSON.toJSONString(notifyDto))
+                        .build()
+                        .doPost();
+                JSONObject jsonObject = JSON.parseObject(response);
+                Integer code = jsonObject.getInteger("code");
+                if(code == 200){
+                    //閫氱煡鎴愬姛
+                    redisUtil.del(key);
+                    return;
+                }
+            }catch (Exception e){
+                e.printStackTrace();
+            }
+
+            //閫氱煡澶辫触
+            int times = notifyDto.getRetryTimes() + 1;
+            if (times >= notifyDto.getFailTimes()) {
+                //瓒呰繃娆℃暟
+                redisUtil.del(key);
+                return;
+            }
+
+            notifyDto.setLastRetryTime(System.currentTimeMillis());
+            notifyDto.setRetryTimes(times);
+            redisUtil.set(key, notifyDto);
+            return;
+        }
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/utils/NotifyUtils.java b/src/main/java/com/zy/asrs/utils/NotifyUtils.java
new file mode 100644
index 0000000..6a1f480
--- /dev/null
+++ b/src/main/java/com/zy/asrs/utils/NotifyUtils.java
@@ -0,0 +1,113 @@
+package com.zy.asrs.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.core.common.SnowflakeIdWorker;
+import com.zy.asrs.domain.NotifyDto;
+import com.zy.asrs.domain.enums.NotifyMsgType;
+import com.zy.common.utils.RedisUtil;
+import com.zy.core.enums.RedisKeyType;
+import com.zy.core.enums.SlaveType;
+import com.zy.system.entity.Config;
+import com.zy.system.service.ConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+@Component
+public class NotifyUtils {
+
+    @Autowired
+    private RedisUtil redisUtil;
+    @Autowired
+    private SnowflakeIdWorker snowflakeIdWorker;
+    @Autowired
+    private ConfigService configService;
+
+    public synchronized boolean notify(String deviceType, Integer device, String taskNo, NotifyMsgType msgType) {
+        SlaveType type = SlaveType.findInstance(deviceType);
+        if (type == null) {
+            return false;
+        }
+        return append(type, device, taskNo, msgType);
+    }
+
+    public synchronized List<String> takeKeys(String deviceType, Integer device) {
+        String key = getKey(deviceType, device);
+        if(key == null){
+            return null;
+        }
+
+        Set keys = redisUtil.keys(key + "*");
+        if (keys == null) {
+            return null;
+        }
+
+        List<String> list = new ArrayList<>();
+        for (Object object : keys) {
+            list.add(object.toString());
+        }
+        return list;
+    }
+
+    public String getKey(String deviceType, Integer device) {
+        SlaveType type = SlaveType.findInstance(deviceType);
+        if (type == null) {
+            return null;
+        }
+        String key = null;
+        switch (type) {
+            case Shuttle:
+                key = RedisKeyType.QUEUE_SHUTTLE.key + device;
+                break;
+            case ForkLift:
+                key = RedisKeyType.QUEUE_FORK_LIFT.key + device;
+                break;
+            default:
+                return null;
+        }
+
+        return key;
+    }
+
+    private boolean append(SlaveType deviceType, Integer device, String taskNo, NotifyMsgType msgType) {
+        String key = null;
+        switch (deviceType) {
+            case Shuttle:
+                key = RedisKeyType.QUEUE_SHUTTLE.key + device;
+                break;
+            case ForkLift:
+                key = RedisKeyType.QUEUE_FORK_LIFT.key + device;
+                break;
+            default:
+                return false;
+        }
+
+        NotifyDto dto = new NotifyDto();
+        dto.setId(snowflakeIdWorker.nextId());
+        dto.setDeviceType(String.valueOf(deviceType));
+        dto.setDevice(device);
+        dto.setMsgType(msgType.flag);
+        dto.setContent(msgType.desc);
+        dto.setTaskNo(taskNo);
+
+        //閲嶈瘯娆℃暟
+        Config notifyFailTimesConfig = configService.selectOne(new EntityWrapper<Config>().eq("code", "notifyFailTimes"));
+        if (notifyFailTimesConfig != null) {
+            dto.setFailTimes(Integer.parseInt(notifyFailTimesConfig.getValue()));
+        }
+
+        //閲嶈瘯闂撮殧
+        Config notifyRetryTimeConfig = configService.selectOne(new EntityWrapper<Config>().eq("code", "notifyRetryTime"));
+        if (notifyRetryTimeConfig != null) {
+            dto.setRetryTime(Integer.parseInt(notifyRetryTimeConfig.getValue()));
+        }
+
+        redisUtil.set(key + "_" + dto.getId(), dto);
+        return true;
+    }
+
+}
diff --git a/src/main/java/com/zy/core/MainProcess.java b/src/main/java/com/zy/core/MainProcess.java
index 2d10c2a..1778208 100644
--- a/src/main/java/com/zy/core/MainProcess.java
+++ b/src/main/java/com/zy/core/MainProcess.java
@@ -66,16 +66,9 @@
                     mainService.recErr();
 //                    // 鍏ュ簱  ===>> 绌烘爤鏉垮垵濮嬪寲鍏ュ簱,鍙夎溅鍏ュ簱绔欐斁璐�
 //                    mainService.storeEmptyPlt();
-//                    // 鍑哄簱  ===>> 宸ヤ綔妗d俊鎭啓鍏ed鏄剧ず鍣�
-//                    mainService.ledExecute();
-//                    // 鍏朵粬  ===>> LED鏄剧ず鍣ㄥ浣嶏紝鏄剧ず榛樿淇℃伅
-//                    mainService.ledReset();
                     // 绌挎杞� ===>> 灏忚溅鐢甸噺妫�娴嬪厖鐢�
                     mainService.loopShuttleCharge();
                     mainService.executeShuttleCharge();
-
-//                    //鎵弿璁惧PakMk鏍囪鏄惁瓒呮椂
-//                    mainService.scanDevicePakMk();
 
                     // 闂撮殧
                     Thread.sleep(200);
diff --git a/src/main/java/com/zy/core/enums/RedisKeyType.java b/src/main/java/com/zy/core/enums/RedisKeyType.java
index 821dc8e..fb0f9f7 100644
--- a/src/main/java/com/zy/core/enums/RedisKeyType.java
+++ b/src/main/java/com/zy/core/enums/RedisKeyType.java
@@ -8,6 +8,8 @@
     FORK_LIFT_FLAG("fork_lift_"),
     MAP("realtimeBasMap_"),
     BASIC_MAP("basicMap_"),
+    QUEUE_SHUTTLE("queue_shuttle_"),
+    QUEUE_FORK_LIFT("queue_fork_lift_"),
     ;
 
     public String key;

--
Gitblit v1.9.1