ソースを参照

下发命令逻辑更改===>一条条下发

qzyReal 3 年 前
コミット
febe964390

+ 31 - 6
sp-core/src/main/java/com/pj/current/netty/command/config/CommandNettyServerHandler.java

@@ -2,16 +2,20 @@ package com.pj.current.netty.command.config;
 
 import cn.hutool.cache.CacheUtil;
 import cn.hutool.cache.impl.TimedCache;
+import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.spring.SpringUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.pj.current.config.MyConfig;
+import com.pj.current.netty.command.constants.CommandType;
 import com.pj.current.netty.command.factory.CommandFactory;
 import com.pj.current.netty.dto.RequestPackageDTO;
+import com.pj.current.task.TaskService;
 import com.pj.project.tb_command_log.TbCommandLog;
 import com.pj.project.tb_command_log.TbCommandLogService;
 import com.pj.project.tb_terminal.TbTerminalService;
+import com.pj.project.tb_terminal.task.FinishCommandTask;
 import com.pj.utils.cache.RedisUtil;
 import io.netty.channel.*;
 import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
@@ -87,17 +91,38 @@ public class CommandNettyServerHandler extends ChannelInboundHandlerAdapter {
         JSONObject reqObj = JSONUtil.parseObj(str);
         Integer code = reqObj.getInt("code");
         if (code != null) {//设备端回复服务器的消息,无需再回复设备
-            String msgId = RedisUtil.get(channelId);
+            String msgId = RedisUtil.rPorp(channelId);
+            log.info("下发命令回复:{},{},{}", channelId,msgId, msg);
             TbCommandLogService tbCommandLogService = SpringUtil.getBean(TbCommandLogService.class);
             TbCommandLog tbCommandLog = tbCommandLogService.findByMsgId(msgId);
-            tbCommandLog.setResponseCode(code)
-                    .setResponseContent(str)
-                    .setResponseTime(new Date());
-            tbCommandLogService.updateById(tbCommandLog);
-            RedisUtil.del(channelId);
+            if (tbCommandLog!=null){
+                tbCommandLog.setResponseCode(code)
+                        .setResponseContent(str)
+                        .setResponseTime(new Date());
+                tbCommandLogService.updateById(tbCommandLog);
+            }
+            //查下还有没有新的命令
+            String sn = RedisUtil.get("sn:" + channelId);
+            MyConfig myConfig = SpringUtil.getBean(MyConfig.class);
+            String key = myConfig.getCommandPrefix() + sn;
+            String command = RedisUtil.rPorp(key);
+            if (StrUtil.isNotEmpty(command)) {
+                RequestPackageDTO requestPackageDTO = JSONUtil.toBean(command, RequestPackageDTO.class);
+                String newMsgId = requestPackageDTO.getMsgId();
+                RedisUtil.lPush(channelId, newMsgId);
+                ctx.write(command);
+                ctx.flush();
+            }else {
+                //命令下发完成
+                TaskService taskService=SpringUtil.getBean(TaskService.class);
+                taskService.addTask(new FinishCommandTask(RandomUtil.randomNumbers(10), 300, ctx));
+            }
             return;
         }
         RequestPackageDTO packageDTO = JSONUtil.toBean(str, RequestPackageDTO.class);
+        Object params = packageDTO.getPayload().getParams();
+        String sn = JSONUtil.parseObj(params).getStr("sn");
+        RedisUtil.set("sn:"+channelId, sn);
         String funcId = packageDTO.getFuncId();
         CommandFactory commandFactory = SpringUtil.getBean(CommandFactory.class);
         commandFactory.handler(funcId).handler(ctx, packageDTO);

+ 3 - 3
sp-core/src/main/java/com/pj/current/netty/command/handler/impl/HealthlogHandler.java

@@ -94,7 +94,7 @@ public class HealthlogHandler implements IHandler {
 
         if (tbPersonFiling == null) {
             if (!SpCfgUtil.termianlFilling()) {
-                log.error("系统不允许设备端进行备案============>删除设备端自动备份的信息,:{}",idCard);
+                log.error("系统不允许设备端进行备案============>删除设备端自动备份的信息,:{}", idCard);
                 tbPersonFilingService.deleteTerminalWhilte(idCard);
                 ctx.write(OKMsg.ok());
                 ctx.flush();
@@ -173,7 +173,7 @@ public class HealthlogHandler implements IHandler {
         double minTemperature = SpCfgUtil.getMinTemperature();
         String healthStatus = dto.getHealth_status();
         String now = DateUtil.now();
-        if (minTemperature < Double.valueOf(dto.getTemperature())) {
+        if (StrUtil.isNotEmpty(dto.getTemperature()) && minTemperature < Double.valueOf(dto.getTemperature())) {
             log.info("发送体温异常提醒============");
             MsgDataBO msgDataBO = new MsgDataBO("您收到一条人员体温异常提醒", dto.getName(), dto.getTemperature(), now, "请及时处理");
             //todo 触发体温预警
@@ -182,7 +182,7 @@ public class HealthlogHandler implements IHandler {
                 wxService.sendTemplateMsg(wxConfig.getTemperatureErrorTemplate(), tbManager.getOpenid(), msgDataBO, detailUrl);
             });
         }
-        if (!healthStatus.equals(TbPersonVisitRecord.HealthEnum.GREEN.getStatus())) {
+        if (StrUtil.isNotEmpty(healthStatus) && !healthStatus.equals(TbPersonVisitRecord.HealthEnum.GREEN.getStatus())) {
             log.info("发送健康码异常提醒============");
             // todo 黄码,红码预警
             MsgDataBO msgDataBO = new MsgDataBO("您收到一条人员健康码异常提醒", dto.getName(), now, tbTerminal.getName(), healthStatus, tbVenues.getName(), "请及时处理");

+ 7 - 2
sp-core/src/main/java/com/pj/current/netty/command/handler/impl/TerminalOptionHandler.java

@@ -1,7 +1,9 @@
 package com.pj.current.netty.command.handler.impl;
 
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.XmlUtil;
+import cn.hutool.extra.spring.SpringUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.pj.current.config.MyConfig;
@@ -9,8 +11,10 @@ import com.pj.current.netty.command.constants.CommandType;
 import com.pj.current.netty.command.handler.IHandler;
 import com.pj.current.netty.dto.OKMsg;
 import com.pj.current.netty.dto.RequestPackageDTO;
+import com.pj.current.task.TaskService;
 import com.pj.project.tb_terminal.TbTerminal;
 import com.pj.project.tb_terminal.TbTerminalService;
+import com.pj.project.tb_terminal.task.FinishCommandTask;
 import io.netty.channel.ChannelHandlerContext;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -28,6 +32,8 @@ public class TerminalOptionHandler implements IHandler {
     private TbTerminalService tbTerminalService;
     @Resource
     private MyConfig myConfig;
+    @Resource
+    TaskService taskService;
 
     @Override
     public CommandType commandType() {
@@ -47,7 +53,6 @@ public class TerminalOptionHandler implements IHandler {
         if (myConfig.getLimitUserCount()<=userCount) {
 
         }
-        ctx.write(OKMsg.ok());
-        ctx.flush();
+        taskService.addTask(new FinishCommandTask(RandomUtil.randomNumbers(10), 300, ctx));
     }
 }

+ 10 - 13
sp-core/src/main/java/com/pj/current/netty/command/handler/impl/UploadCommandHandler.java

@@ -37,20 +37,17 @@ public class UploadCommandHandler implements IHandler {
 
     @Override
     public void handler(ChannelHandlerContext ctx, RequestPackageDTO packageDTO) {
-        log.info("进入请求命令处理========================");
+        log.info("进入下发命令处理========================");
         String sn = JSONUtil.parseObj(packageDTO.getPayload().getParams()).getStr("sn");
         String key = myConfig.getCommandPrefix() + sn;
-        String commandListStr = RedisUtil.get(key);
-        List<String> list = JSONUtil.toList(commandListStr, String.class);
-        long delay = Long.parseLong(RandomUtil.randomNumbers(3));
-        for (String command : list) {
-            RequestPackageDTO requestPackageDTO = JSONUtil.toBean(command, RequestPackageDTO.class);
-            String taskId = RandomUtil.randomNumbers(16);
-            String msgId = requestPackageDTO.getMsgId();
-            taskService.addTask(new CommandDelayTask(taskId, delay, ctx, command, msgId));
-            delay = delay + 1000;
-        }
-        taskService.addTask(new FinishCommandTask(RandomUtil.randomNumbers(10), delay + 300, ctx));
-        RedisUtil.del(key);
+        String command = RedisUtil.rPorp(key);
+        RequestPackageDTO requestPackageDTO = JSONUtil.toBean(command, RequestPackageDTO.class);
+        String msgId = requestPackageDTO.getMsgId();
+        String channelId = ctx.channel().id().asShortText();
+        RedisUtil.lPush(channelId, msgId);
+        log.info("下发命令:{},{}", ctx.channel().id().asShortText(), command);
+        ctx.write(command);
+        ctx.flush();
+
     }
 }

+ 1 - 1
sp-core/src/main/java/com/pj/project/tb_person_filing/TbPersonFilingMapper.xml

@@ -38,7 +38,7 @@
             <if test=' this.has("id") '>and id = #{id}</if>
             <if test=' this.has("deptId") '>and dept_id = #{deptId}</if>
 
-            <if test=' this.has("name") '>and name = #{name}</if>
+            <if test=' this.has("name") '>and name like concat('%',#{name},'%')</if>
             <if test=' this.has("type") '>and type = #{type}</if>
             <if test=' this.has("idCard") '>and id_card = #{idCard}</if>
             <if test=' this.has("visitReason") '>and visit_reason = #{visitReason}</if>

+ 7 - 11
sp-core/src/main/java/com/pj/project/tb_terminal/TbTerminalService.java

@@ -182,22 +182,23 @@ public class TbTerminalService extends ServiceImpl<TbTerminalMapper, TbTerminal>
         String sn = tbTerminal.getSn();
         String msgId = RandomUtil.randomNumbers(8);
         String key = myConfig.getCommandPrefix() + sn;
-        String commandStr = RedisUtil.get(key);
-        List<RequestPackageDTO> commandList = JSONUtil.toList(commandStr, RequestPackageDTO.class);
+     //   String commandStr = RedisUtil.get(key);
+       // List<RequestPackageDTO> commandList = JSONUtil.toList(commandStr, RequestPackageDTO.class);
         RequestPackageDTO commandDTO = new RequestPackageDTO();
         RequestPackageDTO.PayloadBean payloadBean = new RequestPackageDTO.PayloadBean();
 
         payloadBean.setParams(params);
         commandDTO.setFuncId(funcId).setPayload(payloadBean)
                 .setMsgId(msgId);
-        commandList.add(commandDTO);
+       // commandList.add(commandDTO);
         TbCommandLog tbCommandLog = new TbCommandLog();
         tbCommandLog.setChannelName(tbTerminal.getChannelName()).setCommand(JSONUtil.toJsonStr(commandDTO))
                 .setMsgId(msgId).setSn(sn)
                 .setTerminalName(tbTerminal.getName()).setCreateTime(new Date()).setCreateBy(StpUserUtil.getAdminName());
         //日志记录
         tbCommandLogService.save(tbCommandLog);
-        RedisUtil.set(key, JSONUtil.toJsonStr(commandList));
+        RedisUtil.lPush(key,JSONUtil.toJsonStr(commandDTO));
+      //  RedisUtil.set(key, JSONUtil.toJsonStr(commandList));
     }
 
     /**
@@ -209,13 +210,10 @@ public class TbTerminalService extends ServiceImpl<TbTerminalMapper, TbTerminal>
     public void checkOptions(String funcId, String sn) {
         String msgId = RandomUtil.randomNumbers(8);
         String key = myConfig.getCommandPrefix() + sn;
-        String commandStr = RedisUtil.get(key);
-        List<RequestPackageDTO> commandList = JSONUtil.toList(commandStr, RequestPackageDTO.class);
         RequestPackageDTO commandDTO = new RequestPackageDTO();
         commandDTO.setFuncId(funcId)
                 .setMsgId(msgId);
-        commandList.add(commandDTO);
-        RedisUtil.set(myConfig.getCommandPrefix() + sn, JSONUtil.toJsonStr(commandList));
+        RedisUtil.lPush(key, JSONUtil.toJsonStr(commandDTO));
     }
 
     /**
@@ -387,6 +385,7 @@ public class TbTerminalService extends ServiceImpl<TbTerminalMapper, TbTerminal>
             return AjaxJson.getSuccess(msg, checkDataDTO);
         }
         checkDataDTO.setIs_pass(1);
+        log.info("返回信息=放行:{},{}", msg, JSONUtil.toJsonStr(checkDataDTO));
         return AjaxJson.getSuccess(msg, checkDataDTO);
     }
     public void down(Long id) {
@@ -396,9 +395,6 @@ public class TbTerminalService extends ServiceImpl<TbTerminalMapper, TbTerminal>
         }
         tbPersonFilingService.issued(tbTerminal);
         tbPersonBlackService.issued(tbTerminal);
-        String sn = tbTerminal.getSn();
-        String key = myConfig.getCommandPrefix() + sn;
-        log.info("list:{}",RedisUtil.get(key));
         this.startHeartCommand(tbTerminal.getSn());
     }
 }

+ 2 - 1
sp-core/src/main/java/com/pj/project/tb_terminal/task/CommandDelayTask.java

@@ -33,7 +33,8 @@ public class CommandDelayTask extends Task {
     public void run() {
         log.info("延迟发送命令:{}",command);
         String channelId = cx.channel().id().asShortText();
-        RedisUtil.setBySecond(channelId, msgId, 20);
+        RedisUtil.lPush(channelId,msgId);
+       // RedisUtil.setBySecond(channelId, msgId, 20);
         cx.write(command);
         cx.flush();
     }

+ 118 - 104
sp-core/src/main/java/com/pj/utils/cache/RedisUtil.java

@@ -3,6 +3,8 @@ package com.pj.utils.cache;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 
+import cn.hutool.cache.Cache;
+import cn.hutool.cache.CacheUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.core.StringRedisTemplate;
@@ -12,114 +14,126 @@ import org.springframework.stereotype.Component;
 
 /**
  * Redis工具类
- * @author kongyongshun
  *
+ * @author kongyongshun
  */
 @Component
 public class RedisUtil {
 
-	public static long ttl = 24* 7;	//默认超时时间,单位周,此为一周
-
-	/**
-	 * 对象专用
-	 */
-	public static RedisTemplate<String, Object> redisTemplate;
-	@Autowired
-	@SuppressWarnings({ "rawtypes", "unchecked" })
-	public void setRedisTemplate(RedisTemplate redisTemplate) {
-		// 配置 key 序列化为 json序列化格式 
-		StringRedisSerializer keySerializer = new StringRedisSerializer();
-		redisTemplate.setKeySerializer(keySerializer);
-		redisTemplate.setHashKeySerializer(keySerializer);
-		// 配置 value 序列化为 json序列化格式 
-		GenericJackson2JsonRedisSerializer valueSerializer = new GenericJackson2JsonRedisSerializer();
-		redisTemplate.setValueSerializer(valueSerializer);
-		redisTemplate.setHashValueSerializer(valueSerializer);
-		// 
-		RedisUtil.redisTemplate = redisTemplate;
-	}
-
-	/**
-	 * string专用
-	 */
-	static StringRedisTemplate stringRedisTemplate;
-	@Autowired
-	public void setStringRedisTemplate(StringRedisTemplate stringRedisTemplates) {
-		RedisUtil.stringRedisTemplate = stringRedisTemplates;
-	}
-
-
-	/* * * * * * * * * * * * * * * * String操作 * * * * * * * * * * * * * * * * * * * * * * * * */
-
-
-	// 默认7*24小时
-	public static void set(String key, String value) {
-		stringRedisTemplate.opsForValue().set(key, value, ttl, TimeUnit.HOURS);
-	}
-
-	// 写入,并设置时长,单位 Hours
-	public static void setByHour(String key, String value, int timeout) {
-		stringRedisTemplate.opsForValue().set(key, value, timeout, TimeUnit.HOURS);
-	}
-	
-	// 写入,并设置时长,单位 分钟 MINUTES
-	public static void setByMINUTES(String key, String value, int timeout) {
-		stringRedisTemplate.opsForValue().set(key, value, timeout, TimeUnit.MINUTES);
-	}
-	// 写入,并设置时长,单位 秒
-	public static void setBySecond(String key, String value, int timeout) {
-		stringRedisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
-	}
-
-	// 写入,永久有效 
-	public static void setByForever(String key, String value) {
-		stringRedisTemplate.opsForValue().set(key, value);
-	}
-
-	// 读取
-	public static String get(String key) {
-		return stringRedisTemplate.opsForValue().get(key);
-	}
-
-
-	// 删除
-	public static void del(String key) {
-		stringRedisTemplate.delete(key);
-	}
-
-
-	/* * * * * * * * * * * * * * * * Object值操作 * * * * * * * * * * * * * * * * * * * * * * * * */
-
-	// 写入值
-	public static void forValueSet(String key, Object value){
-		redisTemplate.opsForValue().set(key, value, ttl, TimeUnit.HOURS);
-	}
-
-	// 读取值
-	@SuppressWarnings("unchecked")
-	public static <T>T forValueGet(String key, Class<T> cs){
-		return (T) redisTemplate.opsForValue().get(key);
-	}
-
-
-	/* * * * * * * * * * * * * * * * List集合操作 * * * * * * * * * * * * * * * * * * * * * * * * */
-
-	// 查询
-	public static List<Object> forListGet(String key){
-		return redisTemplate.opsForList().range(key, 0, -1);
-	}
-
-	// 追加键值
-	public static void forListAdd(String key, Object... args){
-		redisTemplate.opsForList().rightPushAll(key,  args);
-	}
-
-	// 移除所有键值
-	public static void forListRemove(String key){
-		List<Object> list = forListGet(key);
-		for (int i = 0; i < list.size(); i++) {
-			redisTemplate.opsForList().remove(key, -1,list.get(i));
-		}
-	}
+    public static long ttl = 24 * 7;    //默认超时时间,单位周,此为一周
 
+    /**
+     * 对象专用
+     */
+    public static RedisTemplate<String, Object> redisTemplate;
+
+    @Autowired
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    public void setRedisTemplate(RedisTemplate redisTemplate) {
+        // 配置 key 序列化为 json序列化格式
+        StringRedisSerializer keySerializer = new StringRedisSerializer();
+        redisTemplate.setKeySerializer(keySerializer);
+        redisTemplate.setHashKeySerializer(keySerializer);
+        // 配置 value 序列化为 json序列化格式
+        GenericJackson2JsonRedisSerializer valueSerializer = new GenericJackson2JsonRedisSerializer();
+        redisTemplate.setValueSerializer(valueSerializer);
+        redisTemplate.setHashValueSerializer(valueSerializer);
+        //
+        RedisUtil.redisTemplate = redisTemplate;
+    }
+
+    /**
+     * string专用
+     */
+    static StringRedisTemplate stringRedisTemplate;
+
+    @Autowired
+    public void setStringRedisTemplate(StringRedisTemplate stringRedisTemplates) {
+        RedisUtil.stringRedisTemplate = stringRedisTemplates;
+    }
+
+
+    /* * * * * * * * * * * * * * * * String操作 * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+    // 默认7*24小时
+    public static void set(String key, String value) {
+        stringRedisTemplate.opsForValue().set(key, value, ttl, TimeUnit.HOURS);
+    }
+
+    // 写入,并设置时长,单位 Hours
+    public static void setByHour(String key, String value, int timeout) {
+        stringRedisTemplate.opsForValue().set(key, value, timeout, TimeUnit.HOURS);
+    }
+
+    // 写入,并设置时长,单位 分钟 MINUTES
+    public static void setByMINUTES(String key, String value, int timeout) {
+        stringRedisTemplate.opsForValue().set(key, value, timeout, TimeUnit.MINUTES);
+    }
+
+    // 写入,并设置时长,单位 秒
+    public static void setBySecond(String key, String value, int timeout) {
+        stringRedisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
+    }
+
+    // 写入,永久有效
+    public static void setByForever(String key, String value) {
+        stringRedisTemplate.opsForValue().set(key, value);
+    }
+
+    // 读取
+    public static String get(String key) {
+        return stringRedisTemplate.opsForValue().get(key);
+    }
+
+
+    // 删除
+    public static void del(String key) {
+        stringRedisTemplate.delete(key);
+    }
+
+
+    /* * * * * * * * * * * * * * * * Object值操作 * * * * * * * * * * * * * * * * * * * * * * * * */
+
+    // 写入值
+    public static void forValueSet(String key, Object value) {
+        redisTemplate.opsForValue().set(key, value, ttl, TimeUnit.HOURS);
+    }
+
+    // 读取值
+    @SuppressWarnings("unchecked")
+    public static <T> T forValueGet(String key, Class<T> cs) {
+        return (T) redisTemplate.opsForValue().get(key);
+    }
+
+
+    /* * * * * * * * * * * * * * * * List集合操作 * * * * * * * * * * * * * * * * * * * * * * * * */
+
+    // 查询
+    public static List<Object> forListGet(String key) {
+        return redisTemplate.opsForList().range(key, 0, -1);
+    }
+
+    // 追加键值
+    public static void forListAdd(String key, Object... args) {
+        redisTemplate.opsForList().rightPushAll(key, args);
+    }
+
+    // 移除所有键值
+    public static void forListRemove(String key) {
+        List<Object> list = forListGet(key);
+        for (int i = 0; i < list.size(); i++) {
+            redisTemplate.opsForList().remove(key, -1, list.get(i));
+        }
+    }
+
+
+    public static void lPush(String key, String value) {
+        redisTemplate.opsForList().leftPush(key, value);
+    }
+
+    public static String rPorp(String key) {
+        Object v = redisTemplate.opsForList().rightPop(key);
+        return v == null ? "" : v.toString();
+    }
 }