Kaynağa Gözat

Merge commit 'f58277a9dd45f1b090c57ab4df360b34c6624063' into pre

linfutong 2 yıl önce
ebeveyn
işleme
262688ad4e
21 değiştirilmiş dosya ile 481 ekleme ve 71 silme
  1. 10 0
      release/sql/db_sql_v2.1-hotfix.sql
  2. 1 1
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/RemoteLaboratoryService.java
  3. 10 0
      zd-common/common-core/src/main/java/com/zd/common/core/utils/DESUtils.java
  4. 0 3
      zd-modules/zd-algorithm/src/main/java/com/zd/alg/iot/vmp/gb28181/event/offline/KeepliveTimeoutListener.java
  5. 4 5
      zd-modules/zd-base/src/main/java/com/zd/base/files/bigupload/controller/UploadController.java
  6. 4 0
      zd-modules/zd-modules-laboratory/pom.xml
  7. 1 1
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/AlgorithmController.java
  8. 15 9
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/device/DeviceRemoteController.java
  9. 0 1
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/event/RedisExpiredAndAddListener.java
  10. 31 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/ChannelMap.java
  11. 29 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/MessageCodec.java
  12. 48 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/NettyClient.java
  13. 76 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/NettyClientHandler.java
  14. 73 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/NettyServer.java
  15. 150 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/NettyServerHandler.java
  16. 18 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/PushMsgService.java
  17. 3 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/socket/runner/SocketRunner.java
  18. 6 12
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/socket/runner/TCPServer.java
  19. 2 0
      zd-modules/zd-modules-system/src/main/java/com/zd/system/controller/SysStudentController.java
  20. 0 1
      zd-modules/zd-modules-system/src/main/java/com/zd/system/service/impl/SysStudentServiceImpl.java
  21. 0 38
      zd.iml

+ 10 - 0
release/sql/db_sql_v2.1-hotfix.sql

@@ -6,3 +6,13 @@
 /*     添加时间:2023-2-23                 ****/
 /************************************************/
 ALTER TABLE sys_user MODIFY COLUMN nick_name VARCHAR(100);
+
+
+
+/************************************************/
+/*     更新表: lab_check_record_details    ****/
+/*     字段: jcx_id  ****/
+/*     添加人:xxf                    ****/
+/*     添加时间:2023-2-28                 ****/
+/************************************************/
+alter table lab_check_record_details modify column jcx_id varchar(50) COMMENT '检查项id';

+ 1 - 1
zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/RemoteLaboratoryService.java

@@ -262,7 +262,7 @@ public interface RemoteLaboratoryService {
     public R saveData(Algorithm algorithm);
 
     @PostMapping("/algorithm/saveAlgorithm")
-    public R saveAlgorithmData(Algorithm algorithm);
+    public R saveAlgorithmData(@RequestBody Algorithm algorithm);
 
     /**
      * 小程序查询实验室列表(用户端,管理端)

+ 10 - 0
zd-common/common-core/src/main/java/com/zd/common/core/utils/DESUtils.java

@@ -181,6 +181,16 @@ public class DESUtils {
             }
         }
         long num = Long.parseLong(cardNum,16);
+
+        //部分卡16进制没有上报补0,所以这里先统一认为是10位卡处理
+        if((placeholder+num).length()<10){
+            String numstr = "";
+            for(long i=(placeholder+num).length();i<10;i++){
+                numstr += "0";
+            }
+            return numstr+num;
+        }
+
         return placeholder+num;
     }
 

+ 0 - 3
zd-modules/zd-algorithm/src/main/java/com/zd/alg/iot/vmp/gb28181/event/offline/KeepliveTimeoutListener.java

@@ -1,7 +1,6 @@
 package com.zd.alg.iot.vmp.gb28181.event.offline;
 
 import com.zd.alg.iot.vmp.gb28181.event.EventPublisher;
-import lombok.extern.slf4j.Slf4j;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -18,7 +17,6 @@ import com.zd.alg.iot.vmp.common.VideoManagerConstants;
  * @date:   2020年5月6日 上午11:35:46
  */
 @Component
-@Slf4j
 public class KeepliveTimeoutListener extends KeyExpirationEventMessageListener {
 
     private Logger logger = LoggerFactory.getLogger(KeepliveTimeoutListener.class);
@@ -37,7 +35,6 @@ public class KeepliveTimeoutListener extends KeyExpirationEventMessageListener {
      */
     @Override
     public void onMessage(Message message, byte[] pattern) {
-
         //  获取失效的key
         String expiredKey = message.toString();
         if(!expiredKey.startsWith(VideoManagerConstants.KEEPLIVEKEY_PREFIX)){

+ 4 - 5
zd-modules/zd-base/src/main/java/com/zd/base/files/bigupload/controller/UploadController.java

@@ -23,7 +23,7 @@ public class UploadController {
     private IUploadService uploadService;
 
     /**
-     * 检查分片是否存��
+     * 检查分片是否存
      *
      * @return
      */
@@ -39,9 +39,9 @@ public class UploadController {
     }
 
     /**
-     * 检查分片是否存��
+     * 检查分片是否存
      * @param identifier  文件秘钥
-     * @param filename 文件��
+     * @param filename 文件
      * @param totalChunks 分片总数
      * @return
      */
@@ -51,7 +51,7 @@ public class UploadController {
                                               @RequestParam("totalChunks") Integer totalChunks) {
         FileChunkResultDTO fileChunkCheckDTO;
         try {
-            log.info("apk文件上传入参 identifier {}��filename {}, totalChunks {}", identifier, filename, totalChunks);
+            log.info("apk文件上传入参 identifier {}, filename {}, totalChunks {}", identifier, filename, totalChunks);
             FileChunkDTO chunkDTO = new FileChunkDTO();
             chunkDTO.setIdentifier(identifier);
             chunkDTO.setFilename(filename);
@@ -63,7 +63,6 @@ public class UploadController {
         }
     }
 
-
     /**
      * 上传文件分片
      *

+ 4 - 0
zd-modules/zd-modules-laboratory/pom.xml

@@ -111,6 +111,10 @@
             <artifactId>thumbnailator</artifactId>
             <version>0.4.8</version>
         </dependency>
+        <dependency>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-all</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

+ 1 - 1
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/AlgorithmController.java

@@ -51,7 +51,7 @@ public class AlgorithmController extends BaseController {
     }
 
     @PostMapping("/saveAlgorithm")
-    public ResultData saveAlgorithmData(Algorithm algorithm) {
+    public ResultData saveAlgorithmData(@RequestBody Algorithm algorithm) {
         logger.info("===================记录添加========================");
         return  ResultData.success(algorithmService.saveData(algorithm));
     }

+ 15 - 9
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/device/DeviceRemoteController.java

@@ -5,6 +5,7 @@ import com.zd.common.core.utils.ReUtil;
 import com.zd.laboratory.api.entity.CabinetLock;
 import com.zd.laboratory.api.entity.CabinetV2Lock;
 import com.zd.laboratory.mqtt.service.impl.CommonSend;
+import com.zd.laboratory.netty.PushMsgService;
 import com.zd.laboratory.socket.runner.TCPServer;
 import com.zd.laboratory.socket.service.SocketService;
 import com.zd.laboratory.utils.CRCCHECK;
@@ -35,6 +36,8 @@ public class DeviceRemoteController {
     private RedisService redisService;
     @Autowired
     private CommonSend commonSend;
+    @Autowired
+    private PushMsgService pushMsgService;
 
     @Value("${sys.lockTimer:30}")
     private Integer lockTimer;
@@ -66,11 +69,12 @@ public class DeviceRemoteController {
         OutputStream ops = TCPServer.cacheMap.get(relayCode);
 
         try {
-            ops.write(ReUtil.hexStringToByteArray(instruct));
-            ops.flush();
+//            ops.write(ReUtil.hexStringToByteArray(instruct));
+//            ops.flush();
+            pushMsgService.push(cabinetV2Lock.getRelayCode(), ReUtil.hexStringToByteArray(instruct));
             logger.info("柜锁开锁指令:" + instruct);
 
-            Thread.sleep(1000);
+            Thread.sleep(2000);
 //            ops.write(ReUtil.hexStringToByteArray(instruct));
 //            ops.flush();
 //
@@ -83,8 +87,9 @@ public class DeviceRemoteController {
             Integer status;
             while (timer > 1){
 
-                ops.write(ReUtil.hexStringToByteArray(instruct));
-                ops.flush();
+//                ops.write(ReUtil.hexStringToByteArray(instruct));
+//                ops.flush();
+                pushMsgService.push(cabinetV2Lock.getRelayCode(), ReUtil.hexStringToByteArray(instruct));
                 timer-=2;
 
                 Thread.sleep(1900);
@@ -165,10 +170,11 @@ public class DeviceRemoteController {
             String instruct = CRCCHECK.getReadLockOrder(Integer.parseInt(cabinetV2Lock.getLockId()));
             int timer = lockTimer;
             Integer status;
-            while (timer > 1){
+//            while (timer > 1){
 
-                ops.write(ReUtil.hexStringToByteArray(instruct));
-                ops.flush();
+//                ops.write(ReUtil.hexStringToByteArray(instruct));
+//                ops.flush();
+                pushMsgService.push(cabinetV2Lock.getRelayCode(), ReUtil.hexStringToByteArray(instruct));
                 timer-=2;
 
                 Thread.sleep(1900);
@@ -177,7 +183,7 @@ public class DeviceRemoteController {
                 if(status != null && status == 0){
                     return ResultData.success("关锁成功");
                 }
-            }
+//            }
 
 //            return ResultData.success("关锁成功");
         } catch (Exception e) {

+ 0 - 1
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/event/RedisExpiredAndAddListener.java

@@ -32,7 +32,6 @@ import java.util.stream.Collectors;
  * @Description:
  */
 @Component
-@Slf4j
 public class RedisExpiredAndAddListener extends KeyExpirationEventMessageListener {
 
     //监听的主题  现在只监听0号数据库

+ 31 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/ChannelMap.java

@@ -0,0 +1,31 @@
+package com.zd.laboratory.netty;
+
+import io.netty.channel.ChannelHandlerContext;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+public class ChannelMap {
+
+    /**
+     * 存放客户端标识ID(消息ID)与channel的对应关系
+     */
+    private static volatile ConcurrentHashMap<String, ChannelHandlerContext> channelMap = null;
+
+    private ChannelMap() {
+    }
+
+    public static ConcurrentHashMap<String, ChannelHandlerContext> getChannelMap() {
+        if (null == channelMap) {
+            synchronized (ChannelMap.class) {
+                if (null == channelMap) {
+                    channelMap = new ConcurrentHashMap<>();
+                }
+            }
+        }
+        return channelMap;
+    }
+
+    public static ChannelHandlerContext getChannel(String id) {
+        return getChannelMap().get(id);
+    }
+}

+ 29 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/MessageCodec.java

@@ -0,0 +1,29 @@
+package com.zd.laboratory.netty;
+
+import com.zd.common.core.utils.ReUtil;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.handler.codec.MessageToMessageCodec;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.List;
+
+@Slf4j
+public class MessageCodec extends MessageToMessageCodec<ByteBuf, String> {
+
+    @Override
+    protected void encode(ChannelHandlerContext channelHandlerContext, String msg, List<Object> list) throws Exception {
+        log.info("netty消息正在编码 " + msg);
+        list.add(Unpooled.copiedBuffer(ReUtil.hexStringToByteArray(msg)));
+//        list.add(ReUtil.hexStringToByteArray(msg));
+    }
+
+    @Override
+    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
+        log.info("netty消息正在解码" + byteBuf.readableBytes());
+        byte[] bytes = new byte[byteBuf.readableBytes()];
+        byteBuf.readBytes(bytes);
+        list.add(bytes);
+    }
+}

+ 48 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/NettyClient.java

@@ -0,0 +1,48 @@
+package com.zd.laboratory.netty;
+
+import io.netty.bootstrap.Bootstrap;
+import io.netty.channel.ChannelFuture;
+import io.netty.channel.ChannelInitializer;
+import io.netty.channel.EventLoopGroup;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.SocketChannel;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class NettyClient {
+
+    /**
+     * Netty客户端
+     */
+    public static void main(String[] args) throws InterruptedException {
+        //1. 创建线程组
+        EventLoopGroup group = new NioEventLoopGroup();
+        //2. 创建客户端启动助手
+        Bootstrap bootstrap = new Bootstrap();
+        //3. 设置线程组
+        bootstrap.group(group)
+                .channel(NioSocketChannel.class)//4. 设置客户端通道实现为NIO
+                .handler(new ChannelInitializer<SocketChannel>() {//5. 创建一个通道初始化对象
+                    @Override
+                    protected void initChannel(SocketChannel socketChannel) throws Exception {
+
+                        //6、向pipeline中添加自定的的解码编码handler
+//                        socketChannel.pipeline().addLast(new MessageDecoder());
+//                        socketChannel.pipeline().addLast(new MessageEncoder());
+                        //6、向pipeline中添加编解码器
+                        socketChannel.pipeline().addLast(new com.zd.laboratory.netty.MessageCodec());
+
+                        //6. 向pipeline中添加自定义业务处理handler
+                        socketChannel.pipeline().addLast(new NettyClientHandler());
+                    }
+                });
+
+        //7. 启动客户端,等待连接服务端,同时将异步改为同步
+        ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", NettyServer.inetPort);
+        log.info("netty客户端已启动。。。 端口号: " + NettyServer.inetPort);
+        //8. 关闭通道和关闭连接池
+        channelFuture.channel().closeFuture().sync();
+        group.shutdownGracefully();
+    }
+}

+ 76 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/NettyClientHandler.java

@@ -0,0 +1,76 @@
+package com.zd.laboratory.netty;
+
+import io.netty.channel.ChannelFuture;
+import io.netty.channel.ChannelFutureListener;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelInboundHandler;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class NettyClientHandler implements ChannelInboundHandler {
+    @Override
+    public void channelRegistered(ChannelHandlerContext channelHandlerContext) throws Exception {
+
+    }
+
+    @Override
+    public void channelUnregistered(ChannelHandlerContext channelHandlerContext) throws Exception {
+
+    }
+
+    /**
+      * @description: 客户端发送消息
+    */
+    @Override
+    public void channelActive(ChannelHandlerContext channelHandlerContext) throws Exception {
+        ChannelFuture channelFuture = channelHandlerContext.writeAndFlush("你好,我是客户端");
+        channelFuture.addListener(new ChannelFutureListener() {
+            @Override
+            public void operationComplete(ChannelFuture channelFuture) throws Exception {
+                if(channelFuture.isSuccess()){
+                    log.info("客户端数据发送成功");
+                }else{
+                    log.info("客户端数据发送失败");
+                }
+            }
+        });
+    }
+    @Override
+    public void channelInactive(ChannelHandlerContext channelHandlerContext) throws Exception {
+
+    }
+
+    /**
+      * @description: 读取消息
+    */
+    @Override
+    public void channelRead(ChannelHandlerContext channelHandlerContext, Object o) throws Exception {
+        String msg = (String) o;
+        log.info("客户端接受消息:"+msg);
+    }
+    @Override
+    public void channelReadComplete(ChannelHandlerContext channelHandlerContext) throws Exception {
+
+    }
+    @Override
+    public void userEventTriggered(ChannelHandlerContext channelHandlerContext, Object o) throws Exception {
+
+    }
+    @Override
+    public void channelWritabilityChanged(ChannelHandlerContext channelHandlerContext) throws Exception {
+
+    }
+    @Override
+    public void handlerAdded(ChannelHandlerContext channelHandlerContext) throws Exception {
+
+    }
+    @Override
+    public void handlerRemoved(ChannelHandlerContext channelHandlerContext) throws Exception {
+
+    }
+
+    @Override
+    public void exceptionCaught(ChannelHandlerContext channelHandlerContext, Throwable throwable) throws Exception {
+
+    }
+}

+ 73 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/NettyServer.java

@@ -0,0 +1,73 @@
+package com.zd.laboratory.netty;
+
+import io.netty.bootstrap.ServerBootstrap;
+import io.netty.channel.*;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.SocketChannel;
+import io.netty.channel.socket.nio.NioServerSocketChannel;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+
+@Component
+@Slf4j
+@Order(-999)
+public class NettyServer {
+    public static int inetPort = 12323;
+
+    /**
+     * Netty 服务端
+     */
+    @PostConstruct
+    public void start() throws InterruptedException {
+
+        //1. 创建bossGroup线程组: 处理网络事件--连接事件,不设置线程数默认为2*处理器线程数
+        EventLoopGroup bossGroup = new NioEventLoopGroup(1);
+
+        //2. 创建workerGroup线程组: 处理网络事件--读写事件,不设置线程数默认为2*处理器线程数
+        EventLoopGroup workerGroup = new NioEventLoopGroup();
+
+        //3. 创建服务端启动助手
+        ServerBootstrap bootstrap = new ServerBootstrap();
+
+        //4. 设置bossGroup线程组和workerGroup线程组
+        bootstrap.group(bossGroup,workerGroup)
+                .channel(NioServerSocketChannel.class)//5. 设置服务端通道实现为NIO
+                .option(ChannelOption.SO_BACKLOG,128)//6、参数设置-设置线程队列中等待链接个数
+                .childOption(ChannelOption.SO_KEEPALIVE,Boolean.TRUE)//6、参数设置-设置活跃状态,其中child设置的是workerGroup
+                .childHandler(new ChannelInitializer<SocketChannel>() {//7. 创建一个通道初始化对象
+                    @Override
+                    protected void initChannel(SocketChannel socketChannel) throws Exception {
+
+                        //8、向piple中添加编解码器
+                        socketChannel.pipeline().addLast(new MessageCodec());
+                        //8. 向pipeline中添加自定义业务处理handler
+                        socketChannel.pipeline().addLast(new NettyServerHandler());
+                    }
+                });
+
+        //9. 启动服务端并绑定端口
+        ChannelFuture channelFuture = bootstrap.bind(inetPort).sync();
+        channelFuture.addListener(new ChannelFutureListener() {
+            @Override
+            public void operationComplete(ChannelFuture channelFuture) throws Exception {
+                if(channelFuture.isSuccess()){
+                    log.info("netty绑定端口成功");
+                }else{
+                    log.info("netty绑定端口失败");
+                }
+            }
+        });
+        log.info("服务器启动成功");
+        //10. 关闭通道(并不是真正意义上的关闭通道,而是监听通道的关闭状态)和关闭链接
+        /*try {
+            channelFuture.channel().closeFuture().sync();
+            bossGroup.shutdownGracefully();
+            workerGroup.shutdownGracefully();
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }*/
+    }
+}

+ 150 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/NettyServerHandler.java

@@ -0,0 +1,150 @@
+package com.zd.laboratory.netty;
+
+import com.zd.common.core.redis.RedisService;
+import com.zd.common.core.utils.ReUtil;
+import com.zd.common.core.utils.SpringUtils;
+import com.zd.laboratory.socket.runner.TCPServer;
+import com.zd.laboratory.utils.CRCCHECK;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelInboundHandler;
+import lombok.extern.slf4j.Slf4j;
+
+import java.nio.ByteBuffer;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 服务器端handler
+ */
+@Slf4j
+public class NettyServerHandler implements ChannelInboundHandler {
+
+    /**
+    * 读取客户端发送的消息
+    */
+    @Override
+    public void channelRead(ChannelHandlerContext channelHandlerContext, Object o) throws Exception {
+        byte[] msg  = (byte[]) o;
+        String data = TCPServer.bytesToHexString(msg).toUpperCase();
+        log.info("netty服务端接受消息为:" + data);
+        if(data.equals("6862")){
+            return;
+        }
+
+        log.info("netty服务端接受消息转10进制为:" + ByteBuffer.wrap(msg).getLong());
+//        if(data.startsWith(SocketTypes.LOCK_PREFIX)){
+//        if(data.startsWith("33")){
+
+        String relayCode = data.substring(0, 108);
+//        33 31 20 33 30 20 36 33 20 33 36 20 36 34 20 33 37 20 33 36 20 33 33 20 33 31 20 33 35 20 33 31 20 33 35 20 33 30 20 36 33 20 33 33 20 33 35 20 33 32 20 33 37 20
+
+//        05 05 00 01 ee 00 d0 2e
+
+            // 将通道加入ChannelMap
+            ChannelMap.getChannelMap().put(data, channelHandlerContext);
+//        }else {
+//            if(data.length() != 12){
+//                log.info("netty柜锁回调指令非状态指令!" + data);
+//                return;
+//            }
+
+//            AtomicReference<String> relayCode = new AtomicReference<>("");
+//            ChannelMap.getChannelMap().entrySet().forEach(a -> {
+//                if(a.getValue() == channelHandlerContext){
+//                    relayCode.set(a.getKey());
+//                }
+//            });
+
+            if(data.length() > relayCode.length()) {
+                data = data.replaceAll(relayCode, "");
+                // 柜锁bit 位
+                long bit = CRCCHECK.getBitByCommand(data);
+                // 1开锁状态 0关锁状态
+                int status = CRCCHECK.getLockStatus(data);
+
+                log.info("netty柜锁回调:" + relayCode + ":" + bit + ",回调结果" + (status == 1 ? "开启": "关闭") + ",指令:" + data);
+
+                RedisService redisService = SpringUtils.getBean(RedisService.class);
+                redisService.setCacheObject(relayCode + ":" + bit, status, 3 * 60L, TimeUnit.SECONDS);
+            }
+
+    }
+
+    /**
+    * @description: 读取消息后开始的操作
+    */
+    @Override
+    public void channelReadComplete(ChannelHandlerContext channelHandlerContext) throws Exception {
+        String instruct = CRCCHECK.getOpenLockOrder(1);
+
+        byte[] bytes = ReUtil.hexStringToByteArray(instruct);
+//        log.info("netty服务端数据发送数据:" + instruct);
+//        ChannelFuture channelFuture = channelHandlerContext.writeAndFlush(bytes);
+//        ChannelFuture channelFuture = channelHandlerContext.writeAndFlush(instruct);
+//        channelFuture.addListener(new ChannelFutureListener() {
+//            @Override
+//            public void operationComplete(ChannelFuture channelFuture) throws Exception {
+//                if(channelFuture.isSuccess()){
+//                    log.info("服务端数据发送成功");
+//                }else{
+//                    log.info("服务端数据发送失败");
+//                }
+//            }
+//        });
+    }
+
+    /**
+    * @description: 异常发生时
+    */
+    @Override
+    public void exceptionCaught(ChannelHandlerContext channelHandlerContext, Throwable throwable) throws Exception {
+        throwable.printStackTrace();
+        channelHandlerContext.close();
+    }
+
+    @Override
+    public void channelRegistered(ChannelHandlerContext channelHandlerContext) throws Exception {
+
+    }
+
+    @Override
+    public void channelUnregistered(ChannelHandlerContext channelHandlerContext) throws Exception {
+
+    }
+
+    @Override
+    public void channelActive(ChannelHandlerContext channelHandlerContext) throws Exception {
+
+    }
+
+    @Override
+    public void channelInactive(ChannelHandlerContext channelHandlerContext) throws Exception {
+
+    }
+
+    @Override
+    public void userEventTriggered(ChannelHandlerContext channelHandlerContext, Object o) throws Exception {
+
+    }
+
+    @Override
+    public void channelWritabilityChanged(ChannelHandlerContext channelHandlerContext) throws Exception {
+
+    }
+
+    @Override
+    public void handlerAdded(ChannelHandlerContext channelHandlerContext) throws Exception {
+        log.info("netty客户端开始连接" + channelHandlerContext.toString());
+    }
+
+    @Override
+    public void handlerRemoved(ChannelHandlerContext channelHandlerContext) throws Exception {
+        log.info("netty客户端断开连接" + channelHandlerContext.toString());
+        ChannelMap.getChannelMap().entrySet().forEach(a -> {
+            if(a.getValue() == channelHandlerContext.channel()){
+                ChannelMap.getChannelMap().remove(a.getKey());
+            }
+        });
+    }
+
+
+}

+ 18 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/PushMsgService.java

@@ -0,0 +1,18 @@
+package com.zd.laboratory.netty;
+
+import io.netty.buffer.Unpooled;
+import io.netty.channel.ChannelHandlerContext;
+import org.springframework.stereotype.Service;
+
+@Service
+public class PushMsgService {
+
+    public void push(String relayCode, byte[] bytes) {
+        // 客户端ID
+        ChannelHandlerContext channelHandlerContext = ChannelMap.getChannel(relayCode);
+        if (null == channelHandlerContext) {
+            throw new RuntimeException("柜锁已离线");
+        }
+        channelHandlerContext.writeAndFlush(Unpooled.copiedBuffer(bytes));
+    }
+}

+ 3 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/socket/runner/SocketRunner.java

@@ -3,6 +3,7 @@ package com.zd.laboratory.socket.runner;
 
 import cn.hutool.core.collection.ConcurrentHashSet;
 import com.zd.laboratory.socket.properties.SocketProperties;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.core.annotation.Order;
@@ -22,6 +23,7 @@ import java.util.concurrent.*;
 
 @Component
 @Order(Integer.MAX_VALUE)
+@Slf4j
 public class SocketRunner implements CommandLineRunner {
 
     //地址
@@ -55,6 +57,7 @@ public class SocketRunner implements CommandLineRunner {
             while (true) {
                 socket = server.accept();
                 pool.execute(new TCPServer(socket));
+                log.info("SocketRunner---------pool: " + pool.toString());
             }
 
         } catch (IOException e) {

+ 6 - 12
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/socket/runner/TCPServer.java

@@ -11,10 +11,7 @@ import com.zd.laboratory.socket.vo.TransmissionVo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.BufferedInputStream;
-import java.io.DataInputStream;
-import java.io.IOException;
-import java.io.OutputStream;
+import java.io.*;
 import java.net.Socket;
 import java.net.SocketException;
 import java.util.Map;
@@ -51,7 +48,6 @@ public class TCPServer implements Runnable {
             socket.setSoTimeout(212000);
             log.info("客户 - " + socket.getRemoteSocketAddress() + " -> 机连接成功");
             while (true) {
-                Thread.sleep(1L);
                 handle();
             }
         } catch (SocketException e) {
@@ -59,8 +55,6 @@ public class TCPServer implements Runnable {
             log.error("Socket异常: " + e.getMessage());
         } catch (IOException e) {
             log.error("Socket异常: " + e.getMessage());
-        } catch (InterruptedException e) {
-            log.error("Socket异常: " + e.getMessage());
         } finally {
             try {
                 if (!socket.isClosed()) {
@@ -76,17 +70,17 @@ public class TCPServer implements Runnable {
     private void handle() throws IOException {
 
         StringBuilder ret = new StringBuilder();
-//        InputStream in = socket.getInputStream();
+        InputStream in = socket.getInputStream();
 
         // 解析二进制数据
-        BufferedInputStream bs = new BufferedInputStream(socket.getInputStream());
+//        BufferedInputStream bs = new BufferedInputStream(socket.getInputStream());
 
-        DataInputStream dis = new DataInputStream(bs);
+//        DataInputStream dis = new DataInputStream(bs);
 
         byte[] bytes = new byte[1];
-        while (dis.read(bytes) != -1){
+        while (in.read(bytes) != -1){
             ret.append(bytesToHexString(bytes) + " ");
-            if(dis.available() == 0){
+            if(in.available() == 0){
                 break;
             }
         }

+ 2 - 0
zd-modules/zd-modules-system/src/main/java/com/zd/system/controller/SysStudentController.java

@@ -240,6 +240,8 @@ public class SysStudentController extends BaseController {
         } else if (StringUtils.isNotEmpty(user.getEmail())
                 && UserConstants.NOT_UNIQUE.equals(sysStudentService.checkEmailUnique(user))) {
             return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
+        }else if (UserConstants.NOT_UNIQUE.equals(sysTeacherService.checkUserNameUniqueNotOwn(user.getUserId(),user.getUserName()))) {
+            return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,账号已存在");
         }
         if(StringUtils.isNotEmpty(user.getCardNum())){
 //            Long carNum10 = Long.parseLong(user.getCardNum());

+ 0 - 1
zd-modules/zd-modules-system/src/main/java/com/zd/system/service/impl/SysStudentServiceImpl.java

@@ -29,7 +29,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-
 import java.text.SimpleDateFormat;
 import java.util.*;
 

+ 0 - 38
zd.iml

@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" version="4">
-  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
-    <output url="file://$MODULE_DIR$/target/classes" />
-    <output-test url="file://$MODULE_DIR$/target/test-classes" />
-    <content url="file://$MODULE_DIR$">
-      <excludeFolder url="file://$MODULE_DIR$/target" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter-bootstrap:3.0.3" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter:3.0.3" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.5.3" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.5.3" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.3.9" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.3.9" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.3.9" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.3.9" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.5.3" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.5.3" level="project" />
-    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.4" level="project" />
-    <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.4" level="project" />
-    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.32" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.14.1" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.14.1" level="project" />
-    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.32" level="project" />
-    <orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-core:5.3.9" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.3.9" level="project" />
-    <orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.28" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-context:3.0.3" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.security:spring-security-crypto:5.5.1" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-commons:3.0.3" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.security:spring-security-rsa:1.0.10.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.bouncycastle:bcpkix-jdk15on:1.68" level="project" />
-    <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.68" level="project" />
-  </component>
-</module>