From 63a1882e1e042c13ab809508ce58549f37ca5ad6 Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期四, 21 三月 2024 13:24:41 +0800
Subject: [PATCH] Merge branch 'Four-Way-Rack' of http://47.97.1.152:5880/r/zy-asrs-master into Four-Way-Rack

---
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/MainProcess.java                  |   85 +++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/controller/DeviceController.java   |    4 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/ServerBootstrap.java              |  126 +++++
 zy-asrs-wcs/pom.xml                                                              |    5 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java |   18 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/common/config/MybatisPlusConfig.java   |   16 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/News.java                         |  183 ++++++++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/cache/MessageQueue.java           |  153 ++++++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/RedisUtil.java              |  620 ++++++++++++++++++++++++++++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/Task.java                   |   22 +
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/entity/Device.java                 |    9 
 zy-asrs-flow/src/services/route.js                                               |   21 
 12 files changed, 1,249 insertions(+), 13 deletions(-)

diff --git a/zy-asrs-flow/src/services/route.js b/zy-asrs-flow/src/services/route.js
index 0b5a631..398ea8a 100644
--- a/zy-asrs-flow/src/services/route.js
+++ b/zy-asrs-flow/src/services/route.js
@@ -77,14 +77,21 @@
     for (const menu of children) {
         if (menu.component !== null && menu.component !== undefined) {
             // children
-            const Component = require(`@/pages${menu.path}/index.jsx`).default
-            const newRoute = {
-                name: menu.name,
-                path: menu.path,
-                element: <Component />,
+            let Component;
+            try {
+                Component = require(`@/pages${menu.path}/index.jsx`).default
+            } catch (error) {
+                console.error('An error has occurred: ', error);
             }
-            parent.routes.push(newRoute);
-            parent.children.push(newRoute);
+            if (Component) {
+                const newRoute = {
+                    name: menu.name,
+                    path: menu.path,
+                    element: <Component />,
+                }
+                parent.routes.push(newRoute);
+                parent.children.push(newRoute);
+            }
         } else {
             // parent
             const newRoute = {
diff --git a/zy-asrs-wcs/pom.xml b/zy-asrs-wcs/pom.xml
index 83e100c..93571b5 100644
--- a/zy-asrs-wcs/pom.xml
+++ b/zy-asrs-wcs/pom.xml
@@ -62,6 +62,11 @@
             <version>5.2.5.RELEASE</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+
     </dependencies>
 
     <build>
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/common/config/MybatisPlusConfig.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/common/config/MybatisPlusConfig.java
index 2f81dd6..706a703 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/common/config/MybatisPlusConfig.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/common/config/MybatisPlusConfig.java
@@ -42,11 +42,15 @@
 
             @Override
             public boolean ignoreTable(String tableName) {
-                return Arrays.asList(
-                        "sys_host",
-                        "sys_user_role",
-                        "sys_role_menu"
-                ).contains(tableName);
+                if (getTenantId() == null) {
+                    return true;
+                }else {
+                    return Arrays.asList(
+                            "sys_host",
+                            "sys_user_role",
+                            "sys_role_menu"
+                    ).contains(tableName);
+                }
             }
 
         };
@@ -76,7 +80,7 @@
         } catch (Exception e) {
             System.out.println(e.getMessage());
         }
-        return new NullValue();
+        return null;
     }
 
 }
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/MainProcess.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/MainProcess.java
new file mode 100644
index 0000000..7ec2c53
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/MainProcess.java
@@ -0,0 +1,85 @@
+package com.zy.asrs.wcs.core;
+
+import com.zy.asrs.wcs.core.service.impl.MainServiceImpl;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PreDestroy;
+
+/**
+ * WCS涓绘祦绋�
+ * Created by vincent on 2020/8/6
+ */
+@Data
+@Slf4j
+@Component
+public class MainProcess {
+
+    @Autowired
+    private MainServiceImpl mainService;
+    // 鎵�灞炵嚎绋�
+    private Thread thread;
+    // 棰戠巼
+    private int i = 0;
+
+    /**
+     * =====>>  寮�濮嬪伐浣�
+     */
+    public void start(){
+        thread = new Thread(() -> {
+            while (!Thread.currentThread().isInterrupted()) {
+                try {
+
+                    // 闂撮殧
+                    Thread.sleep(300);
+
+//                    // 绯荤粺杩愯鐘舵�佸垽鏂�
+//                    if (!SystemProperties.WCS_RUNNING_STATUS.get()) {
+//                        continue;
+//                    }
+//
+//                    // 鍏ュ簱  ===>> 鍏ュ簱绔欏埌鍫嗗灈鏈虹珯锛屾牴鎹潯鐮佹壂鎻忕敓鎴愬叆搴撳伐浣滄。
+//                    mainService.generateInboundWrk(); // 缁勬墭
+//
+//                    // 闂撮殧
+//                    Thread.sleep(500);
+//
+//                    //鍒濆鍖栧疄鏃跺湴鍥�
+//                    mainService.initRealtimeBasMap();
+//                    // 鎷f枡銆佸苟鏉裤�佺洏鐐瑰啀鍏ュ簱
+////                    mainService.stnToCrnStnPick();
+//                    // 鍑哄簱 =====>>
+//                    mainService.generateOutboundWrkMast();
+//                    // 瑙f瀽鍏ュ簱宸ヤ綔妗�
+//                    mainService.analyzeInBoundWrk();
+//                    // 寮傚父淇℃伅璁板綍
+//                    mainService.recErr();
+//                    // 鍏ュ簱  ===>> 绌烘爤鏉垮垵濮嬪寲鍏ュ簱,鍙夎溅鍏ュ簱绔欐斁璐�
+//                    mainService.storeEmptyPlt();
+//                    // 鍑哄簱  ===>> 宸ヤ綔妗d俊鎭啓鍏ed鏄剧ず鍣�
+//                    mainService.ledExecute();
+//                    // 鍏朵粬  ===>> LED鏄剧ず鍣ㄥ浣嶏紝鏄剧ず榛樿淇℃伅
+//                    mainService.ledReset();
+//                    // 绌挎杞� ===>> 灏忚溅鐢甸噺妫�娴嬪厖鐢�
+//                    mainService.loopShuttleCharge();
+//                    // 绌挎杞� ===>> 灏忚溅鐢甸噺婊$數鍚庡洖寰呮満浣�
+//                    mainService.loopShuttleToStandbyCauseCharge();
+//                    // 鎵弿宸茬粡鍦ㄥ嚭搴撳彛鐨勮揣鐗� => 鍛煎彨agv鑷虫斁璐х珯鐐�
+//                    mainService.scanOutCallAgv();
+
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        });
+        thread.start();
+    }
+
+    @PreDestroy
+    public void shutDown(){
+        if (thread != null) thread.interrupt();
+    }
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/News.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/News.java
new file mode 100644
index 0000000..3389ad3
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/News.java
@@ -0,0 +1,183 @@
+package com.zy.asrs.wcs.core;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.lang.reflect.Array;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * news stories for zoneyung
+ * Created by vincent on 2022/12/22
+ */
+@Slf4j
+public class News {
+
+    public static void main(String[] args) {
+        News.info("info{}", 1);
+        News.warn("warn{}", 2);
+        News.error("error{}", 3);
+        System.out.println(News.print());
+    }
+
+    interface NewsSupport<T> { boolean execute(T t); }
+
+    private static final NewsQueue<NewsDomain> NEWS_QUEUE = new NewsQueue<>(NewsDomain.class, 1024);
+
+    @SuppressWarnings({"unchecked"})
+    static class NewsQueue<T> {
+
+        private final transient Class<T> cls;
+        private final T[] arr;
+        private final int capacity;
+        private int head;
+        private int tail;
+
+        { this.head = 0; this.tail = 0; }
+
+        public NewsQueue(Class<T> cls, int capacity) {
+            this.cls = cls;
+            this.arr = (T[]) Array.newInstance(cls, capacity);
+            this.capacity = capacity;
+        }
+
+        public synchronized boolean offer(T t) {
+            if (this.tail == this.capacity) {
+                this.peek();
+            }
+            this.reform();
+            this.arr[this.tail] = t;
+            this.tail ++;
+            return true;
+        }
+
+        public synchronized boolean put(T t) {
+            if (this.tail == this.capacity) {
+                return false;
+            } else {
+                this.reform();
+            }
+            this.arr[this.tail] = t;
+            this.tail ++;
+            return true;
+        }
+
+        public synchronized T peek() {
+            if (this.head == this.tail) {
+                return null;
+            }
+            T t = this.arr[this.head];
+            this.head ++;
+            this.reform();
+            return t;
+        }
+
+        private void reform() {
+            for (int i = this.head; i < this.tail; i++) {
+                this.arr[i-this.head] = this.arr[i];
+            }
+            this.tail -= this.head;
+            this.head = 0;
+        }
+
+        public synchronized int size() {
+            return this.tail - this.head;
+        }
+
+        public synchronized List<T> data() {
+            T[] ts = (T[]) Array.newInstance(this.cls, size());
+            if (this.tail - this.head >= 0) {
+                System.arraycopy(this.arr, this.head, ts, 0, this.tail - this.head);
+            }
+            return Arrays.asList(ts);
+        }
+
+    }
+
+    public static void info(String format, Object... arguments) {
+        log.info(format, arguments);
+        offer(NewsLevel.INFO, format, arguments);
+    }
+
+    public static void warn(String format, Object... arguments) {
+        log.warn(format, arguments);
+        offer(NewsLevel.WARN, format, arguments);
+    }
+
+    public static void error(String format, Object... arguments) {
+        log.error(format, arguments);
+        offer(NewsLevel.ERROR, format, arguments);
+    }
+
+    public static String printStr() {
+        StringBuilder sb = new StringBuilder("[");
+        List<NewsDomain> domains = NEWS_QUEUE.data();
+        for (int i = 0; i < domains.size(); i++) {
+            NewsDomain domain = domains.get(i);
+            sb.append("{");
+            sb.append("\"l\":").append(domain.level.idx).append(",");
+            sb.append("\"v\":\"").append(domain.content).append("\"").append(",");
+            sb.append("\"t\":\"").append(domain.date).append("\"");
+            sb.append("}");
+            if (i < domains.size() - 1) {
+                sb.append(",");
+            }
+        }
+        sb.append("]");
+        return sb.toString();
+    }
+
+    public static List<Map<String, Object>> print() {
+        List<Map<String, Object>> res = new ArrayList<>();
+        for (NewsDomain datum : NEWS_QUEUE.data()) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("l", datum.level.idx);
+            map.put("v", datum.content);
+            map.put("t", datum.date);
+            res.add(map);
+        }
+        return res;
+    }
+
+    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){
+        if (null == objs || objs.length == 0 || null == str || "".equals(str.trim())) {
+            return str;
+        } else {
+            StringBuilder sb = new StringBuilder(str);
+            for (Object obj : objs) {
+                int idx = sb.indexOf("{}");
+                if (idx == -1) { break; }
+                sb.replace(idx, idx + 2, String.valueOf(obj));
+            }
+            return sb.toString();
+        }
+    }
+
+    static class NewsDomain {
+        public NewsLevel level;
+        public String content;
+        public String date;
+
+        public NewsDomain(NewsLevel level, String content, String date) {
+            this.level = level;
+            this.content = content;
+            this.date = date;
+        }
+    }
+
+    enum NewsLevel {
+        INFO(1),
+        WARN(2),
+        ERROR(3),
+        ;
+        public int idx;
+        NewsLevel(int idx) {
+            this.idx = idx;
+        }
+    }
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/ServerBootstrap.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/ServerBootstrap.java
new file mode 100644
index 0000000..2d0ccf6
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/ServerBootstrap.java
@@ -0,0 +1,126 @@
+package com.zy.asrs.wcs.core;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zy.asrs.wcs.core.cache.MessageQueue;
+import com.zy.asrs.wcs.core.model.enums.SlaveType;
+import com.zy.asrs.wcs.core.utils.RedisUtil;
+import com.zy.asrs.wcs.rcs.entity.Device;
+import com.zy.asrs.wcs.rcs.entity.DeviceType;
+import com.zy.asrs.wcs.rcs.service.DeviceService;
+import com.zy.asrs.wcs.rcs.service.DeviceTypeService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import java.util.List;
+
+/**
+ * Created by vincent on 2020/8/4
+ */
+@Slf4j
+@Component
+public class ServerBootstrap {
+
+    @Autowired
+    private MainProcess mainProcess;
+    @Autowired
+    private RedisUtil redisUtil;
+    @Autowired
+    private DeviceService deviceService;
+    @Autowired
+    private DeviceTypeService deviceTypeService;
+
+    @PostConstruct
+    @Async
+    public void init() throws InterruptedException {
+        News.info("鏍稿績鎺у埗灞傚紑濮嬪垵濮嬪寲...............................................");
+        Thread.sleep(2000);
+        // 鍒濆鍖栨秷鎭槦鍒�
+        initMq();
+        // 鍒濆鍖栦笅浣嶆満绾跨▼
+        initThread();
+        // 寮�濮嬩富娴佺▼杩涚▼
+        mainProcess.start();
+        News.info("鏍稿績鎺у埗灞傚凡鍚姩...............................................");
+    }
+
+    private void initMq(){
+        // 鍒濆鍖栬澶噈q
+        for (Device device : deviceService.list()) {
+            DeviceType type = deviceTypeService.getById(device.getDeviceType());
+            SlaveType slaveType = SlaveType.findInstance(type.getFlag());
+            if (slaveType != null) {
+                MessageQueue.init(slaveType, device.getId().intValue());
+            }
+        }
+    }
+
+    private void initThread(){
+        List<DeviceType> list1 = deviceTypeService.list();
+        for (DeviceType type : deviceTypeService.list()) {
+            List<Device> list = deviceService.list(new LambdaQueryWrapper<Device>()
+                    .eq(Device::getDeviceType, type.getId())
+                    .eq(Device::getStatus, 1)
+            );
+            if (list.isEmpty()) {
+                continue;
+            }
+
+            News.info("鍒濆鍖杮}绾跨▼...................................................", type.getName());
+        }
+
+
+//        // 鍒濆鍖栬緭閫佺嚎绾跨▼
+//        News.info("鍒濆鍖栬緭閫佺嚎绾跨▼...................................................");
+//        for (DevpSlave devp : slaveProperties.getDevp()) {
+//            DevpThread devpThread = new SiemensDevpThread(devp);
+//            new Thread((Runnable) devpThread).start();
+//            SlaveConnection.put(SlaveType.Devp, devp.getId(), devpThread);
+//        }
+//        // 鍒濆鍖栨彁鍗囨満
+//        News.info("鍒濆鍖栨彁鍗囨満........................................................");
+//        for (LiftSlave liftSlave : slaveProperties.getLift()) {
+//            SiemensLiftThread liftThread = new SiemensLiftThread(liftSlave, redisUtil);
+//            new Thread(liftThread).start();
+//            SlaveConnection.put(SlaveType.Lift, liftSlave.getId(), liftThread);
+//        }
+//        // 鍒濆鍖栧洓鍚戠┛姊溅
+//        News.info("鍒濆鍖栧洓鍚戠┛姊溅......................................................");
+//        for (ShuttleSlave shuttleSlave : slaveProperties.getShuttle()) {
+//            ShuttleThread shuttleThread = new ShuttleThread(shuttleSlave,redisUtil);
+//            new Thread(shuttleThread).start();
+//            SlaveConnection.put(SlaveType.Shuttle, shuttleSlave.getId(), shuttleThread);
+//        }
+//        // 鍒濆鍖栨潯鐮佹壂鎻忎华绾跨▼
+//        News.info("鍒濆鍖栨潯鐮佹壂鎻忎华绾跨▼...................................................");
+//        for (Slave barcode : slaveProperties.getBarcode()) {
+//            BarcodeThread barcodeThread = new BarcodeThread(barcode);
+//            new Thread(barcodeThread).start();
+//            SlaveConnection.put(SlaveType.Barcode, barcode.getId(), barcodeThread);
+//        }
+//        // 鍒濆鍖朙ED绾跨▼
+//        News.info("鍒濆鍖朙ED绾跨▼...................................................");
+//        for (LedSlave led : slaveProperties.getLed()) {
+//            LedThread ledThread = new LedThread(led);
+//            new Thread(ledThread).start();
+//            SlaveConnection.put(SlaveType.Led, led.getId(), ledThread);
+//        }
+        // 鍒濆鍖栫绉ょ嚎绋�
+//        News.info("鍒濆鍖栫绉ょ嚎绋�...................................................");
+//        for (Slave scale : slaveProperties.getScale()) {
+//            ScaleThread barcodeThread = new ScaleThread(scale);
+//            new Thread(barcodeThread).start();
+//            SlaveConnection.put(SlaveType.Scale, scale.getId(), barcodeThread);
+//        }
+    }
+
+
+    @PreDestroy
+    public void destroy() {
+    }
+
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/cache/MessageQueue.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/cache/MessageQueue.java
new file mode 100644
index 0000000..82670eb
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/cache/MessageQueue.java
@@ -0,0 +1,153 @@
+package com.zy.asrs.wcs.core.cache;
+
+import com.zy.asrs.wcs.core.model.Task;
+import com.zy.asrs.wcs.core.model.enums.SlaveType;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+
+/**
+ * 娑堟伅闃熷垪
+ * Created by vincent on 2020/8/5
+ */
+public class MessageQueue {
+
+    // 杈撻�佺嚎mq浜ゆ崲鏈�
+    private static final Map<Integer, ConcurrentLinkedQueue<Task>> DEVP_EXCHANGE = new ConcurrentHashMap<>();
+    // 鏉$爜鎵弿浠猰q浜ゆ崲鏈�
+    private static final Map<Integer, ConcurrentLinkedQueue<Task>> BARCODE_EXCHANGE = new ConcurrentHashMap<>();
+    // Led鐏� mq浜ゆ崲鏈�
+    private static final Map<Integer, LinkedBlockingQueue<Task>> LED_EXCHANGE = new ConcurrentHashMap<>();
+    // 纾呯Оmq浜ゆ崲鏈�
+    private static final Map<Integer, ConcurrentLinkedQueue<Task>> SCALE_EXCHANGE = new ConcurrentHashMap<>();
+    // 鍙拌溅mq浜ゆ崲鏈�
+    private static final Map<Integer, ConcurrentLinkedQueue<Task>> CAR_EXCHANGE = new ConcurrentHashMap<>();
+    //鍥涘悜绌挎杞q浜ゆ崲鏈�
+    private static final Map<Integer, ConcurrentLinkedQueue<Task>> SHUTTLE_EXCHANGE = new ConcurrentHashMap<>();
+    //鎻愬崌鏈簃q浜ゆ崲鏈�
+    private static final Map<Integer, ConcurrentLinkedQueue<Task>> LIFT_EXCHANGE = new ConcurrentHashMap<>();
+
+    /**
+     * mq 浜ゆ崲鏈哄垵濮嬪寲
+     */
+    public static void init(SlaveType type, Integer id) {
+        switch (type) {
+            case Devp:
+                DEVP_EXCHANGE.put(id, new ConcurrentLinkedQueue<>());
+                break;
+            case Barcode:
+                BARCODE_EXCHANGE.put(id, new ConcurrentLinkedQueue<>());
+                break;
+            case Led:
+                LED_EXCHANGE.put(id, new LinkedBlockingQueue<>(1));
+                break;
+            case Scale:
+                SCALE_EXCHANGE.put(id, new ConcurrentLinkedQueue<>());
+                break;
+            case Shuttle:
+                SHUTTLE_EXCHANGE.put(id, new ConcurrentLinkedQueue<>());
+                break;
+            case Lift:
+                LIFT_EXCHANGE.put(id, new ConcurrentLinkedQueue<>());
+                break;
+            default:
+                break;
+        }
+    }
+
+    /**
+     * 娣诲姞鍏冪礌
+     * 濡傛灉鍙戠幇闃熷垪宸叉弧鏃犳硶娣诲姞鐨勮瘽锛屼細鐩存帴杩斿洖false銆�
+     */
+    public static boolean offer(SlaveType type, Integer id, Task task) {
+        switch (type) {
+            case Devp:
+                return DEVP_EXCHANGE.get(id).offer(task);
+            case Barcode:
+                return BARCODE_EXCHANGE.get(id).offer(task);
+            case Led:
+                return LED_EXCHANGE.get(id).offer(task);
+            case Scale:
+                return SCALE_EXCHANGE.get(id).offer(task);
+            case Shuttle:
+                return SHUTTLE_EXCHANGE.get(id).offer(task);
+            case Lift:
+                return LIFT_EXCHANGE.get(id).offer(task);
+            default:
+                return false;
+        }
+    }
+
+    /**
+     * 绉婚櫎鍏冪礌
+     * 鑻ラ槦鍒椾负绌猴紝杩斿洖null銆�
+     */
+    public static Task poll(SlaveType type, Integer id) {
+        switch (type) {
+            case Devp:
+                return DEVP_EXCHANGE.get(id).poll();
+            case Barcode:
+                return BARCODE_EXCHANGE.get(id).poll();
+            case Led:
+                return LED_EXCHANGE.get(id).poll();
+            case Scale:
+                return SCALE_EXCHANGE.get(id).poll();
+            case Shuttle:
+                return SHUTTLE_EXCHANGE.get(id).poll();
+            case Lift:
+                return LIFT_EXCHANGE.get(id).poll();
+            default:
+                return null;
+        }
+    }
+
+    /**
+     * 鍙栧嚭鍏冪礌锛屽苟涓嶅垹闄�.
+     */
+    public static Task peek(SlaveType type, Integer id) {
+        switch (type) {
+            case Devp:
+                return DEVP_EXCHANGE.get(id).peek();
+            case Barcode:
+                return BARCODE_EXCHANGE.get(id).peek();
+            case Led:
+                return LED_EXCHANGE.get(id).peek();
+            case Scale:
+                return SCALE_EXCHANGE.get(id).peek();
+            case Shuttle:
+                return SHUTTLE_EXCHANGE.get(id).peek();
+            case Lift:
+                return LIFT_EXCHANGE.get(id).peek();
+            default:
+                return null;
+        }
+    }
+
+    public static void clear(SlaveType type, Integer id){
+        switch (type) {
+            case Devp:
+                DEVP_EXCHANGE.get(id).clear();
+                break;
+            case Barcode:
+                BARCODE_EXCHANGE.get(id).clear();
+                break;
+            case Led:
+                LED_EXCHANGE.get(id).clear();
+                break;
+            case Scale:
+                SCALE_EXCHANGE.get(id).clear();
+                break;
+            case Shuttle:
+                SHUTTLE_EXCHANGE.get(id).clear();
+                break;
+            case Lift:
+                LIFT_EXCHANGE.get(id).clear();
+                break;
+            default:
+                break;
+        }
+    }
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/Task.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/Task.java
new file mode 100644
index 0000000..2c4f222
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/Task.java
@@ -0,0 +1,22 @@
+package com.zy.asrs.wcs.core.model;
+
+import lombok.Data;
+
+/**
+ * Created by vincent on 2020/8/5
+ */
+@Data
+public class Task {
+
+    private Integer step;
+
+    private Object data;
+
+    public Task() {
+    }
+
+    public Task(Integer step, Object data) {
+        this.step = step;
+        this.data = data;
+    }
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java
new file mode 100644
index 0000000..3ddd277
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java
@@ -0,0 +1,18 @@
+package com.zy.asrs.wcs.core.service.impl;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * 绔嬩綋浠撳簱WCS绯荤粺涓绘祦绋嬩笟鍔�
+ * Created by vincent on 2020/8/6
+ */
+@Slf4j
+@Service("mainService")
+@Transactional
+public class MainServiceImpl {
+
+
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/RedisUtil.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/RedisUtil.java
new file mode 100644
index 0000000..dfc62e1
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/RedisUtil.java
@@ -0,0 +1,620 @@
+package com.zy.asrs.wcs.core.utils;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * redisTemplate灏佽
+ *
+ */
+@Component
+public class RedisUtil {
+
+//    @Autowired
+//    private RedisTemplate<String, Object> redisTemplate;
+
+    @Autowired
+    private RedisTemplate redisTemplate;
+
+    public RedisTemplate getRedisTemplate() {
+        return redisTemplate;
+    }
+
+    public RedisUtil(RedisTemplate redisTemplate) {
+        this.redisTemplate = redisTemplate;
+    }
+
+    /**
+     * 鎸囧畾缂撳瓨澶辨晥鏃堕棿
+     *
+     * @param key  閿�
+     * @param time 鏃堕棿(绉�)
+     * @return
+     */
+    public boolean expire(String key, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.expire(key, time, TimeUnit.SECONDS);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 鏍规嵁key 鑾峰彇杩囨湡鏃堕棿
+     *
+     * @param key 閿� 涓嶈兘涓簄ull
+     * @return 鏃堕棿(绉�) 杩斿洖0浠h〃涓烘案涔呮湁鏁�
+     */
+    public long getExpire(String key) {
+        return redisTemplate.getExpire(key, TimeUnit.SECONDS);
+    }
+
+    /**
+     * 鍒ゆ柇key鏄惁瀛樺湪
+     *
+     * @param key 閿�
+     * @return true 瀛樺湪 false涓嶅瓨鍦�
+     */
+    public boolean hasKey(String key) {
+        try {
+            return redisTemplate.hasKey(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 鍒犻櫎缂撳瓨
+     *
+     * @param key 鍙互浼犱竴涓�� 鎴栧涓�
+     */
+    @SuppressWarnings("unchecked")
+    public void del(String... key) {
+        if (key != null && key.length > 0) {
+            if (key.length == 1) {
+                redisTemplate.delete(key[0]);
+            } else {
+                redisTemplate.delete(CollectionUtils.arrayToList(key));
+            }
+        }
+    }
+
+    //============================ String =============================
+
+    /**
+     * 鏅�氱紦瀛樿幏鍙�
+     *
+     * @param key 閿�
+     * @return 鍊�
+     */
+    public Object get(String key) {
+        return key == null ? null : redisTemplate.opsForValue().get(key);
+    }
+
+    /**
+     * 鑾峰彇鍏ㄩ儴鏁版嵁
+     * @return
+     */
+    public HashMap<Object, Object> getRedis() {
+        Set<String> keys = redisTemplate.keys("*");
+        HashMap<Object, Object> map = new HashMap<>();
+        for (String key : keys) {
+            Object value = redisTemplate.opsForValue().get(key);
+            map.put(key, value);
+        }
+
+        return map;//杩斿洖鍏ㄩ儴鏁版嵁闆嗗悎
+    }
+
+    /**
+     * 鏅�氱紦瀛樻斁鍏�
+     *
+     * @param key   閿�
+     * @param value 鍊�
+     * @return true鎴愬姛 false澶辫触
+     */
+    public boolean set(String key, Object value) {
+        try {
+            redisTemplate.opsForValue().set(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 鏅�氱紦瀛樻斁鍏ュ苟璁剧疆鏃堕棿
+     *
+     * @param key   閿�
+     * @param value 鍊�
+     * @param time  鏃堕棿(绉�) time瑕佸ぇ浜�0 濡傛灉time灏忎簬绛変簬0 灏嗚缃棤闄愭湡
+     * @return true鎴愬姛 false 澶辫触
+     */
+    public boolean set(String key, Object value, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
+            } else {
+                set(key, value);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 閫掑
+     *
+     * @param key   閿�
+     * @param delta 瑕佸鍔犲嚑(澶т簬0)
+     * @return
+     */
+    public long incr(String key, long delta) {
+        if (delta < 0) {
+            throw new RuntimeException("閫掑鍥犲瓙蹇呴』澶т簬0");
+        }
+        return redisTemplate.opsForValue().increment(key, delta);
+    }
+
+    /**
+     * 閫掑噺
+     *
+     * @param key   閿�
+     * @param delta 瑕佸噺灏戝嚑(灏忎簬0)
+     * @return
+     */
+    public long decr(String key, long delta) {
+        if (delta < 0) {
+            throw new RuntimeException("閫掑噺鍥犲瓙蹇呴』澶т簬0");
+        }
+        return redisTemplate.opsForValue().increment(key, -delta);
+    }
+
+    //================================ Hash =================================
+
+    /**
+     * HashGet
+     *
+     * @param key  閿� 涓嶈兘涓簄ull
+     * @param item 椤� 涓嶈兘涓簄ull
+     * @return 鍊�
+     */
+    public Object hget(String key, String item) {
+        return redisTemplate.opsForHash().get(key, item);
+    }
+
+    /**
+     * 鑾峰彇hashKey瀵瑰簲鐨勬墍鏈夐敭鍊�
+     *
+     * @param key 閿�
+     * @return 瀵瑰簲鐨勫涓敭鍊�
+     */
+    public Map<Object, Object> hmget(String key) {
+        return redisTemplate.opsForHash().entries(key);
+    }
+
+    /**
+     * HashSet
+     *
+     * @param key 閿�
+     * @param map 瀵瑰簲澶氫釜閿��
+     * @return true 鎴愬姛 false 澶辫触
+     */
+    public boolean hmset(String key, Map<String, Object> map) {
+        try {
+            redisTemplate.opsForHash().putAll(key, map);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * HashSet 骞惰缃椂闂�
+     *
+     * @param key  閿�
+     * @param map  瀵瑰簲澶氫釜閿��
+     * @param time 鏃堕棿(绉�)
+     * @return true鎴愬姛 false澶辫触
+     */
+    public boolean hmset(String key, Map<String, Object> map, long time) {
+        try {
+            redisTemplate.opsForHash().putAll(key, map);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 鍚戜竴寮爃ash琛ㄤ腑鏀惧叆鏁版嵁,濡傛灉涓嶅瓨鍦ㄥ皢鍒涘缓
+     *
+     * @param key   閿�
+     * @param item  椤�
+     * @param value 鍊�
+     * @return true 鎴愬姛 false澶辫触
+     */
+    public boolean hset(String key, String item, Object value) {
+        try {
+            redisTemplate.opsForHash().put(key, item, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 鍚戜竴寮爃ash琛ㄤ腑鏀惧叆鏁版嵁,濡傛灉涓嶅瓨鍦ㄥ皢鍒涘缓
+     *
+     * @param key   閿�
+     * @param item  椤�
+     * @param value 鍊�
+     * @param time  鏃堕棿(绉�)  娉ㄦ剰:濡傛灉宸插瓨鍦ㄧ殑hash琛ㄦ湁鏃堕棿,杩欓噷灏嗕細鏇挎崲鍘熸湁鐨勬椂闂�
+     * @return true 鎴愬姛 false澶辫触
+     */
+    public boolean hset(String key, String item, Object value, long time) {
+        try {
+            redisTemplate.opsForHash().put(key, item, value);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 鍒犻櫎hash琛ㄤ腑鐨勫��
+     *
+     * @param key  閿� 涓嶈兘涓簄ull
+     * @param item 椤� 鍙互浣垮涓� 涓嶈兘涓簄ull
+     */
+    public void hdel(String key, Object... item) {
+        redisTemplate.opsForHash().delete(key, item);
+    }
+
+    /**
+     * 鍒ゆ柇hash琛ㄤ腑鏄惁鏈夎椤圭殑鍊�
+     *
+     * @param key  閿� 涓嶈兘涓簄ull
+     * @param item 椤� 涓嶈兘涓簄ull
+     * @return true 瀛樺湪 false涓嶅瓨鍦�
+     */
+    public boolean hHasKey(String key, String item) {
+        return redisTemplate.opsForHash().hasKey(key, item);
+    }
+
+    /**
+     * hash閫掑 濡傛灉涓嶅瓨鍦�,灏变細鍒涘缓涓�涓� 骞舵妸鏂板鍚庣殑鍊艰繑鍥�
+     *
+     * @param key  閿�
+     * @param item 椤�
+     * @param by   瑕佸鍔犲嚑(澶т簬0)
+     * @return
+     */
+    public double hincr(String key, String item, double by) {
+        return redisTemplate.opsForHash().increment(key, item, by);
+    }
+
+    /**
+     * hash閫掑噺
+     *
+     * @param key  閿�
+     * @param item 椤�
+     * @param by   瑕佸噺灏戣(灏忎簬0)
+     * @return
+     */
+    public double hdecr(String key, String item, double by) {
+        return redisTemplate.opsForHash().increment(key, item, -by);
+    }
+
+    //============================ set =============================
+
+    /**
+     * 鏍规嵁key鑾峰彇Set涓殑鎵�鏈夊��
+     *
+     * @param key 閿�
+     * @return
+     */
+    public Set<Object> sGet(String key) {
+        try {
+            return redisTemplate.opsForSet().members(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 鏍规嵁value浠庝竴涓猻et涓煡璇�,鏄惁瀛樺湪
+     *
+     * @param key   閿�
+     * @param value 鍊�
+     * @return true 瀛樺湪 false涓嶅瓨鍦�
+     */
+    public boolean sHasKey(String key, Object value) {
+        try {
+            return redisTemplate.opsForSet().isMember(key, value);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 灏嗘暟鎹斁鍏et缂撳瓨
+     *
+     * @param key    閿�
+     * @param values 鍊� 鍙互鏄涓�
+     * @return 鎴愬姛涓暟
+     */
+    public long sSet(String key, Object... values) {
+        try {
+            return redisTemplate.opsForSet().add(key, values);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    /**
+     * 灏唖et鏁版嵁鏀惧叆缂撳瓨
+     *
+     * @param key    閿�
+     * @param time   鏃堕棿(绉�)
+     * @param values 鍊� 鍙互鏄涓�
+     * @return 鎴愬姛涓暟
+     */
+    public long sSetAndTime(String key, long time, Object... values) {
+        try {
+            Long count = redisTemplate.opsForSet().add(key, values);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return count;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    /**
+     * 鑾峰彇set缂撳瓨鐨勯暱搴�
+     *
+     * @param key 閿�
+     * @return
+     */
+    public long sGetSetSize(String key) {
+        try {
+            return redisTemplate.opsForSet().size(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    /**
+     * 绉婚櫎鍊间负value鐨�
+     *
+     * @param key    閿�
+     * @param values 鍊� 鍙互鏄涓�
+     * @return 绉婚櫎鐨勪釜鏁�
+     */
+    public long setRemove(String key, Object... values) {
+        try {
+            Long count = redisTemplate.opsForSet().remove(key, values);
+            return count;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+    //===============================list=================================
+
+    /**
+     * 鑾峰彇list缂撳瓨鐨勫唴瀹�
+     *
+     * @param key   閿�
+     * @param start 寮�濮�
+     * @param end   缁撴潫  0 鍒� -1浠h〃鎵�鏈夊��
+     * @return
+     */
+    public List<Object> lGet(String key, long start, long end) {
+        try {
+            return redisTemplate.opsForList().range(key, start, end);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 鑾峰彇list缂撳瓨鐨勯暱搴�
+     *
+     * @param key 閿�
+     * @return
+     */
+    public long lGetListSize(String key) {
+        try {
+            return redisTemplate.opsForList().size(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    /**
+     * 閫氳繃绱㈠紩 鑾峰彇list涓殑鍊�
+     *
+     * @param key   閿�
+     * @param index 绱㈠紩  index>=0鏃讹紝 0 琛ㄥご锛�1 绗簩涓厓绱狅紝渚濇绫绘帹锛沬ndex<0鏃讹紝-1锛岃〃灏撅紝-2鍊掓暟绗簩涓厓绱狅紝渚濇绫绘帹
+     * @return
+     */
+    public Object lGetIndex(String key, long index) {
+        try {
+            return redisTemplate.opsForList().index(key, index);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 灏唋ist鏀惧叆缂撳瓨
+     *
+     * @param key   閿�
+     * @param value 鍊�
+     * @return
+     */
+    public boolean lSet(String key, Object value) {
+        try {
+            redisTemplate.opsForList().rightPush(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 灏唋ist鏀惧叆缂撳瓨
+     *
+     * @param key   閿�
+     * @param value 鍊�
+     * @param time  鏃堕棿(绉�)
+     * @return
+     */
+    public boolean lSet(String key, Object value, long time) {
+        try {
+            redisTemplate.opsForList().rightPush(key, value);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 灏唋ist鏀惧叆缂撳瓨
+     *
+     * @param key   閿�
+     * @param value 鍊�
+     * @return
+     */
+    public boolean lSet(String key, List<Object> value) {
+        try {
+            redisTemplate.opsForList().rightPushAll(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 灏唋ist鏀惧叆缂撳瓨
+     *
+     * @param key   閿�
+     * @param value 鍊�
+     * @param time  鏃堕棿(绉�)
+     * @return
+     */
+    public boolean lSet(String key, List<Object> value, long time) {
+        try {
+            redisTemplate.opsForList().rightPushAll(key, value);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 鏍规嵁绱㈠紩淇敼list涓殑鏌愭潯鏁版嵁
+     *
+     * @param key   閿�
+     * @param index 绱㈠紩
+     * @param value 鍊�
+     * @return
+     */
+    public boolean lUpdateIndex(String key, long index, Object value) {
+        try {
+            redisTemplate.opsForList().set(key, index, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 绉婚櫎N涓�间负value
+     *
+     * @param key   閿�
+     * @param count 绉婚櫎澶氬皯涓�
+     * @param value 鍊�
+     * @return 绉婚櫎鐨勪釜鏁�
+     */
+    public long lRemove(String key, long count, Object value) {
+        try {
+            Long remove = redisTemplate.opsForList().remove(key, count, value);
+            return remove;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    /**
+     * 妯$硦鏌ヨ鑾峰彇key鍊�
+     *
+     * @param pattern
+     * @return
+     */
+    public Set keys(String pattern) {
+        return redisTemplate.keys(pattern);
+    }
+
+    /**
+     * 浣跨敤Redis鐨勬秷鎭槦鍒�
+     *
+     * @param channel
+     * @param message 娑堟伅鍐呭
+     */
+    public void convertAndSend(String channel, Object message) {
+        redisTemplate.convertAndSend(channel, message);
+    }
+
+
+}
+
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/controller/DeviceController.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/controller/DeviceController.java
index 2db0a9a..b77ded9 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/controller/DeviceController.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/controller/DeviceController.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
+import com.zy.asrs.framework.common.SnowflakeIdWorker;
 import com.zy.asrs.wcs.common.annotation.OperationLog;
 import com.zy.asrs.wcs.common.domain.BaseParam;
 import com.zy.asrs.wcs.common.domain.KeyValVo;
@@ -27,6 +28,8 @@
 
     @Autowired
     private DeviceService deviceService;
+    @Autowired
+    private SnowflakeIdWorker snowflakeIdWorker;
 
     @PreAuthorize("hasAuthority('rcs:device:list')")
     @PostMapping("/device/page")
@@ -55,6 +58,7 @@
         if (!deviceService.save(device)) {
             return R.error("娣诲姞澶辫触");
         }
+        device.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
         return R.ok("娣诲姞鎴愬姛");
     }
 
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/entity/Device.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/entity/Device.java
index 86eca35..94d0b0e 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/entity/Device.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/entity/Device.java
@@ -183,6 +183,15 @@
         DeviceTypeService service = SpringUtils.getBean(DeviceTypeService.class);
         DeviceType deviceType = service.getById(this.deviceType);
         if (!Cools.isEmpty(deviceType)){
+            return String.valueOf(deviceType.getFlag());
+        }
+        return null;
+    }
+
+    public String getDeviceTypeName$(){
+        DeviceTypeService service = SpringUtils.getBean(DeviceTypeService.class);
+        DeviceType deviceType = service.getById(this.deviceType);
+        if (!Cools.isEmpty(deviceType)){
             return String.valueOf(deviceType.getName());
         }
         return null;

--
Gitblit v1.9.1