diff --git a/riis-system/src/main/java/com/yfd/platform/component/nettyclient/BootNettyChannelInboundHandlerAdapter.java b/riis-system/src/main/java/com/yfd/platform/component/nettyclient/BootNettyChannelInboundHandlerAdapter.java index ec3f58b..ed4c4fc 100644 --- a/riis-system/src/main/java/com/yfd/platform/component/nettyclient/BootNettyChannelInboundHandlerAdapter.java +++ b/riis-system/src/main/java/com/yfd/platform/component/nettyclient/BootNettyChannelInboundHandlerAdapter.java @@ -21,10 +21,7 @@ import com.yfd.platform.modules.basedata.domain.AlgorithmManufacturerVersion; import com.yfd.platform.modules.basedata.domain.AlgorithmModel; import com.yfd.platform.modules.basedata.domain.Substation; import com.yfd.platform.modules.basedata.domain.SubstationPatroldevice; -import com.yfd.platform.modules.basedata.service.IAlgorithmManufacturerVersionService; -import com.yfd.platform.modules.basedata.service.IAlgorithmModelService; -import com.yfd.platform.modules.basedata.service.ISubstationPatroldeviceService; -import com.yfd.platform.modules.basedata.service.ISubstationService; +import com.yfd.platform.modules.basedata.service.*; import com.yfd.platform.modules.patroltask.domain.ExaminePlan; import com.yfd.platform.modules.patroltask.domain.Task; import com.yfd.platform.modules.patroltask.domain.TaskTodo; @@ -91,7 +88,9 @@ public class BootNettyChannelInboundHandlerAdapter extends ChannelInboundHandler StringRedisTemplate redisTemplate = SpringContextHolder.getBean(StringRedisTemplate.class); TLSFTPUtils tlsftpUtils = SpringContextHolder.getBean(TLSFTPUtils.class); HttpRESTfulUtils httpRESTfulUtils = SpringContextHolder.getBean(HttpRESTfulUtils.class); - + EventManager eventManager = SpringContextHolder.getBean(EventManager.class); + ISubstationDeviceService substationDeviceService = + SpringContextHolder.getBean(ISubstationDeviceService.class); @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { @@ -372,105 +371,23 @@ public class BootNettyChannelInboundHandlerAdapter extends ChannelInboundHandler Map map, String Type, String Command, String Code) throws InterruptedException { JSONArray taskArray = new JSONArray(); if (SystemCode.COMMAND_TASK_START_CODE.getCode().equals(Command)) { - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(Task::getTaskCode, Code).set(Task::getIsenable, "1"); - taskService.update(updateWrapper); - // 查询任务 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Task::getTaskCode, Code); - Task task = taskService.getOne(queryWrapper); - String robotCode = task.getRobotCode(); - if (StrUtil.isNotBlank(robotCode)) { - List list = - substationPatroldeviceService.list(new LambdaQueryWrapper().eq(SubstationPatroldevice::getPatroldeviceCode, robotCode)); - if (list.size() > 0) { - SubstationPatroldevice substationPatroldevice = list.get(0); - stationRobotService.sendCommand(substationPatroldevice.getIpaddr(), - httpServerConfig.getPatrolServerid(), substationPatroldevice.getCustom3(), Type, Command, - Code, null); - - } - } else { - // 控制 - List list = taskTodoService.list(new LambdaQueryWrapper().eq(TaskTodo::getTaskId, - task.getTaskId()).select(TaskTodo::getTaskTodoId)); - for (TaskTodo taskTodo : list) { - JSONObject taskData = new JSONObject(); - taskData.putOnce("task_patrolled_id", taskTodo.getTaskTodoId()); - if (taskArray.size() <= 0) { - //摄像头命令 暂停 - taskTodoService.doCurrentTask(taskTodo.getTaskTodoId(), SystemCode.TASK_RUN_CODE.getCode()); - } - taskArray.add(taskData); - } - } - + runNow(Code, Type, Command, ctx, receivedmsg); } if (SystemCode.COMMAND_TASK_PAUSE_CODE.getCode().equals(Command)) { - JSONObject taskData = new JSONObject(); - taskData.putOnce("task_patrolled_id", Code); - taskArray.add(taskData); - TaskTodo taskTodo = taskTodoService.getById(Code); - if (StrUtil.isNotBlank(taskTodo.getRobotCode())) { - List list = - substationPatroldeviceService.list(new LambdaQueryWrapper().eq(SubstationPatroldevice::getPatroldeviceCode, taskTodo.getRobotCode())); - if (list.size() > 0) { - SubstationPatroldevice substationPatroldevice = list.get(0); - stationRobotService.sendCommand(substationPatroldevice.getIpaddr(), - httpServerConfig.getPatrolServerid(), substationPatroldevice.getCustom3(), Type, Command, - Code, null); - } - } else { - //摄像头命令 暂停 - taskTodoService.doCurrentTask(taskTodo.getTaskTodoId(), SystemCode.TASK_PAUSE_CODE.getCode()); - } + // 暂停任务 + pauseTask(Code, Type, Command, ctx, receivedmsg); } if (SystemCode.COMMAND_TASK_RESUME_CODE.getCode().equals(Command)) { - JSONObject taskData = new JSONObject(); - taskData.putOnce("task_patrolled_id", Code); - taskArray.add(taskData); - TaskTodo taskTodo = taskTodoService.getById(Code); - if (StrUtil.isNotBlank(taskTodo.getRobotCode())) { - List list = - substationPatroldeviceService.list(new LambdaQueryWrapper().eq(SubstationPatroldevice::getPatroldeviceCode, taskTodo.getRobotCode())); - if (list.size() > 0) { - SubstationPatroldevice substationPatroldevice = list.get(0); - stationRobotService.sendCommand(substationPatroldevice.getIpaddr(), - httpServerConfig.getPatrolServerid(), substationPatroldevice.getCustom3(), Type, Command, - Code, null); - } - } else { - //摄像头命令 恢复 - taskTodoService.doCurrentTask(taskTodo.getTaskTodoId(), SystemCode.TASK_RESUME_CODE.getCode()); - } + // 恢复任务 + resumeTask(Code, Type, Command, ctx, receivedmsg); } if (SystemCode.COMMAND_TASK_STOP_CODE.getCode().equals(Command)) { - JSONObject taskData = new JSONObject(); - taskData.putOnce("task_patrolled_id", Code); - taskArray.add(taskData); - TaskTodo taskTodo = taskTodoService.getById(Code); - if (StrUtil.isNotBlank(taskTodo.getRobotCode())) { - List list = - substationPatroldeviceService.list(new LambdaQueryWrapper().eq(SubstationPatroldevice::getPatroldeviceCode, taskTodo.getRobotCode())); - if (list.size() > 0) { - SubstationPatroldevice substationPatroldevice = list.get(0); - stationRobotService.sendCommand(substationPatroldevice.getIpaddr(), - httpServerConfig.getPatrolServerid(), substationPatroldevice.getCustom3(), Type, - Command, Code, null); - } - } else { - //摄像头命令 终止 - taskTodoService.doCurrentTask(taskTodo.getTaskTodoId(), SystemCode.TASK_STOP_CODE.getCode()); - } + // 停止任务 + stopTask(Code, Type, Command, ctx, receivedmsg); } - // 响应给上级系统 - String reponsexml = MyXmlUtil.getXml(map.get("ReceiveCode").toString(), map.get("SendCode").toString(), - SystemCode.TYPE_SYSTEM_MESSAGE_CODE.getCode(), SystemCode.COMMAND_ITEM_RESPONSE_CODE.getCode(), - SystemCode.SUCCESS_STATUS_CODE.getCode(), taskArray.toString()); - sendResponseData(ctx, receivedmsg, reponsexml); } @@ -878,4 +795,289 @@ public class BootNettyChannelInboundHandlerAdapter extends ChannelInboundHandler ctx.flush(); } + private void pauseTask(String Code, String Type, String Command, ChannelHandlerContext ctx, + MyMessageProtocol receivedmsg) { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(Task::getTaskCode, Code).set(Task::getDatastatus, "2").set(Task::getIsenable, "0"); + taskService.update(updateWrapper); + TaskTodo taskTodo = taskTodoService.getById(Code); + String stationCode = taskTodo.getStationCode(); + // 发送任务到边缘节点 + List substations = + substationService.list(new LambdaQueryWrapper().eq(Substation::getStationCode, + stationCode)); + if (substations.size() > 0) { + Substation substation = substations.get(0); + if ("1".equals(substation.getIsStationFlag())) { + stationRobotService.sendCommand(substation.getNodeId(), + httpServerConfig.getPatrolServerid(), substation.getNodeId(), Type, Command, + Code, null); + // 创建事件并注册 + Event event = new Event(taskTodo.getTaskTodoId(), response -> { + // 回调逻辑:调用 sendResponseData 方法回复上级服务 + String responseXml = (String) response; + sendResponseData(ctx, receivedmsg, responseXml); + }); + eventManager.registerEvent(taskTodo.getTaskTodoId(), event); + } else { + String taskId = taskTodo.getTaskId(); + Task task = taskService.getById(taskId); + String deviceList = task.getDeviceList(); + List deviceIds = StrUtil.split(deviceList, ","); + List> robotMapList = substationDeviceService.getRobotCodeByDeviceId(deviceIds); + if (robotMapList != null && robotMapList.size() > 0) { + for (Map robotMap : robotMapList) { + String robotCode = ObjectUtil.isEmpty(robotMap.get("deviceCode")) ? "" : robotMap.get( + "deviceCode").toString(); + String deviceIdList = ObjectUtil.isEmpty(robotMap.get("deviceIds")) ? "" : robotMap.get( + "deviceIds").toString(); + if (StrUtil.isBlank(robotCode) || StrUtil.isBlank(deviceIdList)) { + logger.error("机器人或点位集合是空的"); + return; + } + List list = + substationPatroldeviceService.list(new LambdaQueryWrapper().eq(SubstationPatroldevice::getInternationalId, robotCode)); + if (list.size() <= 0) { + return; + } + SubstationPatroldevice substationPatroldevice = list.get(0); + String patroldeviceType = substationPatroldevice.getType(); + if ("1".equals(patroldeviceType) || "2".equals(patroldeviceType) || "3".equals(patroldeviceType) || "13".equals(patroldeviceType) || "14".equals(patroldeviceType)) { + // 机器人系统编码 + String internationalId = substationPatroldevice.getInternationalId(); + // 机器人任务 + stationRobotService.sendCommand(substationPatroldevice.getIpaddr(), + httpServerConfig.getPatrolServerid(), internationalId, Type, Command, Code, null); + // 创建事件并注册 + Event event = new Event(taskTodo.getTaskTodoId(), response -> { + // 回调逻辑:调用 sendResponseData 方法回复上级服务 + String responseXml = (String) response; // 假设响应数据是 XML 字符串 + sendResponseData(ctx, receivedmsg, responseXml); + }); + eventManager.registerEvent(taskTodo.getTaskTodoId(), event); + } + + } + } + } + } + } + + private void stopTask(String Code, String Type, String Command, ChannelHandlerContext ctx, + MyMessageProtocol receivedmsg) { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(Task::getTaskCode, Code).set(Task::getDatastatus, "2").set(Task::getIsenable, "0"); + taskService.update(updateWrapper); + TaskTodo taskTodo = taskTodoService.getById(Code); + String stationCode = taskTodo.getStationCode(); + // 发送任务到边缘节点 + List substations = + substationService.list(new LambdaQueryWrapper().eq(Substation::getStationCode, + stationCode)); + if (substations.size() > 0) { + Substation substation = substations.get(0); + if ("1".equals(substation.getIsStationFlag())) { + stationRobotService.sendCommand(substation.getNodeId(), + httpServerConfig.getPatrolServerid(), substation.getNodeId(), Type, Command, + Code, null); + // 创建事件并注册 + Event event = new Event(taskTodo.getTaskTodoId(), response -> { + // 回调逻辑:调用 sendResponseData 方法回复上级服务 + String responseXml = (String) response; + sendResponseData(ctx, receivedmsg, responseXml); + }); + eventManager.registerEvent(taskTodo.getTaskTodoId(), event); + }else{ + String taskId = taskTodo.getTaskId(); + Task task = taskService.getById(taskId); + String deviceList = task.getDeviceList(); + List deviceIds = StrUtil.split(deviceList, ","); + List> robotMapList = substationDeviceService.getRobotCodeByDeviceId(deviceIds); + if (robotMapList != null && robotMapList.size() > 0) { + for (Map robotMap : robotMapList) { + String robotCode = ObjectUtil.isEmpty(robotMap.get("deviceCode")) ? "" : robotMap.get( + "deviceCode").toString(); + String deviceIdList = ObjectUtil.isEmpty(robotMap.get("deviceIds")) ? "" : robotMap.get( + "deviceIds").toString(); + if (StrUtil.isBlank(robotCode) || StrUtil.isBlank(deviceIdList)) { + logger.error("机器人或点位集合是空的"); + return; + } + List list = + substationPatroldeviceService.list(new LambdaQueryWrapper().eq(SubstationPatroldevice::getInternationalId, robotCode)); + if (list.size() <= 0) { + return; + } + SubstationPatroldevice substationPatroldevice = list.get(0); + String patroldeviceType = substationPatroldevice.getType(); + if ("1".equals(patroldeviceType) || "2".equals(patroldeviceType) || "3".equals(patroldeviceType) || "13".equals(patroldeviceType) || "14".equals(patroldeviceType)) { + // 机器人系统编码 + String internationalId = substationPatroldevice.getInternationalId(); + // 机器人任务 + stationRobotService.sendCommand(substationPatroldevice.getIpaddr(), + httpServerConfig.getPatrolServerid(), internationalId, Type, Command, Code, null); + // 创建事件并注册 + Event event = new Event(taskTodo.getTaskTodoId(), response -> { + // 回调逻辑:调用 sendResponseData 方法回复上级服务 + String responseXml = (String) response; // 假设响应数据是 XML 字符串 + sendResponseData(ctx, receivedmsg, responseXml); + }); + eventManager.registerEvent(taskTodo.getTaskTodoId(), event); + } + + } + } + } + } + } + + private void runNow(String Code, String Type, String Command, ChannelHandlerContext ctx, + MyMessageProtocol receivedmsg) { + // 查询任务 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Task::getTaskCode, Code); + Task task = taskService.getOne(queryWrapper); + String deviceList = task.getDeviceList(); + String nowPriority = task.getPriority(); + String stationCode = task.getStationCode(); + // 发送任务到边缘节点 + List substations = + substationService.list(new LambdaQueryWrapper().eq(Substation::getStationCode, + stationCode)); + if (substations.size() > 0) { + Substation substation = substations.get(0); + if ("1".equals(substation.getIsStationFlag())) { + // 所有正在执行的任务 + List list = + taskTodoService.list(new LambdaQueryWrapper().lt(TaskTodo::getPriority, + nowPriority).eq(TaskTodo::getTaskState, "2").eq(TaskTodo::getStationCode, + task.getStationCode()).select(TaskTodo::getTaskTodoId)); + for (TaskTodo taskTodo : list) { + stationRobotService.sendCommand(substation.getNodeId(), + httpServerConfig.getPatrolServerid(), substation.getNodeId(), Type, "2", + taskTodo.getTaskTodoId(), null); + } + stationRobotService.sendCommand(substation.getNodeId(), + httpServerConfig.getPatrolServerid(), substation.getNodeId(), Type, Command, + Code, null); + // 创建事件并注册 + Event event = new Event(task.getTaskCode(), response -> { + // 回调逻辑:调用 sendResponseData 方法回复上级服务 + String responseXml = (String) response; + sendResponseData(ctx, receivedmsg, responseXml); + }); + eventManager.registerEvent(task.getTaskCode(), event); + } else { + List deviceIds = StrUtil.split(deviceList, ","); + List> robotMapList = substationDeviceService.getRobotCodeByDeviceId(deviceIds); + if (robotMapList != null && robotMapList.size() > 0) { + for (Map robotMap : robotMapList) { + String robotCode = ObjectUtil.isEmpty(robotMap.get("deviceCode")) ? "" : robotMap.get( + "deviceCode").toString(); + String deviceIdList = ObjectUtil.isEmpty(robotMap.get("deviceIds")) ? "" : robotMap.get( + "deviceIds").toString(); + if (StrUtil.isBlank(robotCode) || StrUtil.isBlank(deviceIdList)) { + System.out.println("机器人或点位集合是空的"); + return; + } + List list = + substationPatroldeviceService.list(new LambdaQueryWrapper().eq(SubstationPatroldevice::getInternationalId, robotCode)); + if (list.size() <= 0) { + return; + } + SubstationPatroldevice substationPatroldevice = list.get(0); + String patroldeviceType = substationPatroldevice.getType(); + if ("1".equals(patroldeviceType) || "2".equals(patroldeviceType) || "3".equals(patroldeviceType) || "13".equals(patroldeviceType) || "14".equals(patroldeviceType)) { + // 机器人系统编码 + String internationalId = substationPatroldevice.getInternationalId(); + // 机器人任务 + stationRobotService.sendCommand(substationPatroldevice.getIpaddr(), + httpServerConfig.getPatrolServerid(), internationalId, Type, Command, Code, null); + // 创建事件并注册 + Event event = new Event(task.getTaskCode(), response -> { + // 回调逻辑:调用 sendResponseData 方法回复上级服务 + String responseXml = (String) response; // 假设响应数据是 XML 字符串 + sendResponseData(ctx, receivedmsg, responseXml); + }); + eventManager.registerEvent(task.getTaskCode(), event); + + } + } + } + } + } + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(Task::getTaskCode, Code).set(Task::getIsenable, "0"); + taskService.update(updateWrapper); + + } + + private void resumeTask(String Code, String Type, String Command, ChannelHandlerContext ctx, + MyMessageProtocol receivedmsg) { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(Task::getTaskCode, Code).set(Task::getDatastatus, "2").set(Task::getIsenable, "0"); + taskService.update(updateWrapper); + TaskTodo taskTodo = taskTodoService.getById(Code); + String stationCode = taskTodo.getStationCode(); + // 发送任务到边缘节点 + List substations = + substationService.list(new LambdaQueryWrapper().eq(Substation::getStationCode, + stationCode)); + if (substations.size() > 0) { + Substation substation = substations.get(0); + if ("1".equals(substation.getIsStationFlag())) { + stationRobotService.sendCommand(substation.getNodeId(), + httpServerConfig.getPatrolServerid(), substation.getNodeId(), Type, Command, + Code, null); + // 创建事件并注册 + Event event = new Event(taskTodo.getTaskTodoId(), response -> { + // 回调逻辑:调用 sendResponseData 方法回复上级服务 + String responseXml = (String) response; // 假设响应数据是 XML 字符串 + sendResponseData(ctx, receivedmsg, responseXml); + }); + eventManager.registerEvent(taskTodo.getTaskTodoId(), event); + } else { + String taskId = taskTodo.getTaskId(); + Task task = taskService.getById(taskId); + String deviceList = task.getDeviceList(); + List deviceIds = StrUtil.split(deviceList, ","); + List> robotMapList = substationDeviceService.getRobotCodeByDeviceId(deviceIds); + if (robotMapList != null && robotMapList.size() > 0) { + for (Map robotMap : robotMapList) { + String robotCode = ObjectUtil.isEmpty(robotMap.get("deviceCode")) ? "" : robotMap.get( + "deviceCode").toString(); + String deviceIdList = ObjectUtil.isEmpty(robotMap.get("deviceIds")) ? "" : robotMap.get( + "deviceIds").toString(); + if (StrUtil.isBlank(robotCode) || StrUtil.isBlank(deviceIdList)) { + logger.error("机器人或点位集合是空的"); + return; + } + List list = + substationPatroldeviceService.list(new LambdaQueryWrapper().eq(SubstationPatroldevice::getInternationalId, robotCode)); + if (list.size() <= 0) { + return; + } + SubstationPatroldevice substationPatroldevice = list.get(0); + String patroldeviceType = substationPatroldevice.getType(); + if ("1".equals(patroldeviceType) || "2".equals(patroldeviceType) || "3".equals(patroldeviceType) || "13".equals(patroldeviceType) || "14".equals(patroldeviceType)) { + // 机器人系统编码 + String internationalId = substationPatroldevice.getInternationalId(); + // 机器人任务 + stationRobotService.sendCommand(substationPatroldevice.getIpaddr(), + httpServerConfig.getPatrolServerid(), internationalId, Type, Command, Code, null); + // 创建事件并注册 + Event event = new Event(taskTodo.getTaskTodoId(), response -> { + // 回调逻辑:调用 sendResponseData 方法回复上级服务 + String responseXml = (String) response; // 假设响应数据是 XML 字符串 + sendResponseData(ctx, receivedmsg, responseXml); + }); + eventManager.registerEvent(taskTodo.getTaskTodoId(), event); + } + + } + } + } + } + } + } diff --git a/riis-system/src/main/java/com/yfd/platform/component/nettyclient/Event.java b/riis-system/src/main/java/com/yfd/platform/component/nettyclient/Event.java new file mode 100644 index 0000000..36b668e --- /dev/null +++ b/riis-system/src/main/java/com/yfd/platform/component/nettyclient/Event.java @@ -0,0 +1,26 @@ +package com.yfd.platform.component.nettyclient; + +import java.util.function.Consumer; + +public class Event { + // 事件的唯一 ID + private String eventId; + // 事件触发后的回调逻辑 + private Consumer callback; + + public Event(String eventId, Consumer callback) { + this.eventId = eventId; + this.callback = callback; + } + + public String getEventId() { + return eventId; + } + + public void trigger(Object data) { + if (callback != null) { + // 触发事件 + callback.accept(data); + } + } +} diff --git a/riis-system/src/main/java/com/yfd/platform/component/nettyclient/EventManager.java b/riis-system/src/main/java/com/yfd/platform/component/nettyclient/EventManager.java new file mode 100644 index 0000000..2df31d9 --- /dev/null +++ b/riis-system/src/main/java/com/yfd/platform/component/nettyclient/EventManager.java @@ -0,0 +1,36 @@ +package com.yfd.platform.component.nettyclient; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +@Component +@Slf4j +public class EventManager { + + // 存储事件 ID 和事件的映射 + private Map eventMap = new ConcurrentHashMap<>(); + + // 注册事件 + public void registerEvent(String eventId, Event event) { + if (eventMap.containsKey(eventId)) { + return; + } + eventMap.put(eventId, event); + } + + // 触发事件 + public void triggerEvent(String eventId, Object data) { + Event event = eventMap.get(eventId); + if (event != null) { + // 触发事件 + event.trigger(data); + // 触发后移除事件 + eventMap.remove(eventId); + } else { + log.error("没有发现事件eventId: " + eventId); + } + } +} diff --git a/riis-system/src/main/java/com/yfd/platform/component/nettyserver/NettyServerHandler.java b/riis-system/src/main/java/com/yfd/platform/component/nettyserver/NettyServerHandler.java index 01f47c1..95d80d0 100644 --- a/riis-system/src/main/java/com/yfd/platform/component/nettyserver/NettyServerHandler.java +++ b/riis-system/src/main/java/com/yfd/platform/component/nettyserver/NettyServerHandler.java @@ -11,6 +11,7 @@ import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.yfd.platform.component.WebSocketServer; +import com.yfd.platform.component.nettyclient.EventManager; import com.yfd.platform.config.HttpServerConfig; import com.yfd.platform.config.ParentConfig; import com.yfd.platform.constant.Constant; @@ -125,6 +126,9 @@ public class NettyServerHandler extends SimpleChannelInboundHandler xmlMap = MyXmlUtil.xmlToMap(xmlContent); // 发送的指令 String responseType = xmlMap.get("Type").toString(); String responseCommand = xmlMap.get("Command").toString(); + String responseCode = ObjectUtil.isEmpty(xmlMap.get("Code")) ? "" : xmlMap.get("Code").toString(); List> items = (List>) map.get("Items"); + // 任务启动响应 if (SystemCode.TYPE_TASK_CONTROL_CODE.getCode().equals(responseType) && SystemCode.COMMAND_TASK_START_CODE.getCode().equals(responseCommand)) { log.info("任务控制-任务启动响应!{}", map.toString()); - JSONObject jsonObject = new JSONObject(); - Map map1 = items.get(0); - jsonObject.putOnce("task_patrolled_id", map1.get("task_patrolled_id")); -// nettyServerHandler.stationRobotService.sendParentData(map.get("ReceiveCode").toString(), -// nettyServerHandler.parentConfig.getParentId(), Type, Command, Code, jsonObject.toString()); - // for (Map item : items) { - // TaskTodo taskTodo = new TaskTodo(); - // String taskPatrolledId = item.get("task_patrolled_id"); - // taskTodo.setTaskTodoId(taskPatrolledId); - // taskTodo.setDatastatus("1"); - // taskTodo.setLastmodifier("机器人系统"); - // taskTodo.setLastmodifydate(new Timestamp(System.currentTimeMillis())); - // // 新增任务执行数据 - // nettyServerHandler.taskTodoService.save(taskTodo); - // } + if (StrUtil.isNotBlank(responseCode)) { + JSONArray jsonArray = JSONUtil.parseArray(items); + nettyServerHandler.eventManager.triggerEvent(responseCode, jsonArray.toString()); + if (SystemCode.SUCCESS_STATUS_CODE.getCode().equals(Code)) { + for (Map item : items) { + String taskPatrolledId = item.get("task_patrolled_id"); + int count = + nettyServerHandler.taskTodoService.count(new LambdaQueryWrapper().eq(TaskTodo::getTaskTodoId, taskPatrolledId)); + if (count <= 0) { + TaskTodo taskTodo = new TaskTodo(); + taskTodo.setTaskTodoId(taskPatrolledId); + taskTodo.setDatastatus("1"); + taskTodo.setTaskState("2"); + taskTodo.setTaskCode(responseCode); + Task task = + nettyServerHandler.taskService.getOne(new LambdaQueryWrapper().eq(Task::getTaskCode, responseCode)); + if (task != null) { + taskTodo.setTaskId(task.getTaskId()); + taskTodo.setTaskType(task.getTaskType()); + taskTodo.setTaskState("2"); + taskTodo.setTaskName(task.getTaskName()); + taskTodo.setPriority(task.getPriority()); + taskTodo.setTaskClass(task.getTaskClass()); + taskTodo.setDeviceUnusualnum(0); + taskTodo.setDeviceDeforeNum(0); + taskTodo.setDeviceFailureNum(0); + taskTodo.setStationCode(task.getStationCode()); + String deviceList = task.getDeviceList(); + List split = StrUtil.split(deviceList, ","); + taskTodo.setDeviceSumnum(split.size()); + taskTodo.setPlanStartTime(task.getFixedStartTime()); + taskTodo.setStartTime(DateUtil.now()); + taskTodo.setTaskProgress("0"); + taskTodo.setExamineFlag("0"); + taskTodo.setType(task.getType()); + } + taskTodo.setLastmodifier("机器人系统"); + taskTodo.setLastmodifydate(new Timestamp(System.currentTimeMillis())); + // 新增任务执行数据 + nettyServerHandler.taskTodoService.saveOrUpdate(taskTodo); + } + } + } + } + } // 任务暂停响应 if (SystemCode.TYPE_TASK_CONTROL_CODE.getCode().equals(responseType) && SystemCode.COMMAND_TASK_PAUSE_CODE.getCode().equals(responseCommand)) { - JSONObject jsonObject = new JSONObject(); - Map map1 = items.get(0); - jsonObject.putOnce("task_patrolled_id", map1.get("task_patrolled_id")); - nettyServerHandler.stationRobotService.sendParentData(map.get("ReceiveCode").toString(), - nettyServerHandler.parentConfig.getParentId(), Type, Command, Code, jsonObject.toString()); + if (StrUtil.isNotBlank(responseCode)) { + JSONArray jsonArray = JSONUtil.parseArray(items); + nettyServerHandler.eventManager.triggerEvent(responseCode, jsonArray.toString()); + if (SystemCode.SUCCESS_STATUS_CODE.getCode().equals(Code)) { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(TaskTodo::getTaskTodoId, responseCode).set(TaskTodo::getTaskState, "3"); + nettyServerHandler.taskTodoService.update(updateWrapper); + } + } + log.info("任务控制-任务暂停响应!{}", map.toString()); } // 任务继续响应 if (SystemCode.TYPE_TASK_CONTROL_CODE.getCode().equals(responseType) && SystemCode.COMMAND_TASK_RESUME_CODE.getCode().equals(responseCommand)) { - JSONObject jsonObject = new JSONObject(); - Map map1 = items.get(0); - jsonObject.putOnce("task_patrolled_id", map1.get("task_patrolled_id")); - nettyServerHandler.stationRobotService.sendParentData(map.get("ReceiveCode").toString(), - nettyServerHandler.parentConfig.getParentId(), Type, Command, Code, jsonObject.toString()); + if (StrUtil.isNotBlank(responseCode)) { + JSONArray jsonArray = JSONUtil.parseArray(items); + nettyServerHandler.eventManager.triggerEvent(responseCode, jsonArray.toString()); + if (SystemCode.SUCCESS_STATUS_CODE.getCode().equals(Code)) { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(TaskTodo::getTaskTodoId, responseCode).set(TaskTodo::getTaskState, "2"); + nettyServerHandler.taskTodoService.update(updateWrapper); + } + } + log.info("任务控制-任务继续响应!{}", map.toString()); } // 任务停止响应 if (SystemCode.TYPE_TASK_CONTROL_CODE.getCode().equals(responseType) && SystemCode.COMMAND_TASK_STOP_CODE.getCode().equals(responseCommand)) { - JSONObject jsonObject = new JSONObject(); - Map map1 = items.get(0); - jsonObject.putOnce("task_patrolled_id", map1.get("task_patrolled_id")); - nettyServerHandler.stationRobotService.sendParentData(map.get("ReceiveCode").toString(), - nettyServerHandler.parentConfig.getParentId(), Type, Command, Code, jsonObject.toString()); + if (StrUtil.isNotBlank(responseCode)) { + JSONArray jsonArray = JSONUtil.parseArray(items); + nettyServerHandler.eventManager.triggerEvent(responseCode, jsonArray.toString()); + if (SystemCode.SUCCESS_STATUS_CODE.getCode().equals(Code)) { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(TaskTodo::getTaskTodoId, responseCode).set(TaskTodo::getTaskState, "2"); + nettyServerHandler.taskTodoService.update(updateWrapper); + } + } + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(TaskTodo::getTaskTodoId, responseCode).set(TaskTodo::getTaskState, "4"); + nettyServerHandler.taskTodoService.update(updateWrapper); log.info("任务控制-任务停止响应!{}", map.toString()); } // 模型同步 diff --git a/riis-system/src/main/java/com/yfd/platform/modules/basedata/mapper/SubstationDeviceMapper.java b/riis-system/src/main/java/com/yfd/platform/modules/basedata/mapper/SubstationDeviceMapper.java index b2dca50..cd7730d 100644 --- a/riis-system/src/main/java/com/yfd/platform/modules/basedata/mapper/SubstationDeviceMapper.java +++ b/riis-system/src/main/java/com/yfd/platform/modules/basedata/mapper/SubstationDeviceMapper.java @@ -26,4 +26,5 @@ public interface SubstationDeviceMapper extends BaseMapper { String selectNextUavDeviceCode(); + List> getRobotCodeByDeviceId(List deviceIds); } diff --git a/riis-system/src/main/java/com/yfd/platform/modules/basedata/service/ISubstationDeviceService.java b/riis-system/src/main/java/com/yfd/platform/modules/basedata/service/ISubstationDeviceService.java index 24aa6e4..75269a4 100644 --- a/riis-system/src/main/java/com/yfd/platform/modules/basedata/service/ISubstationDeviceService.java +++ b/riis-system/src/main/java/com/yfd/platform/modules/basedata/service/ISubstationDeviceService.java @@ -72,4 +72,5 @@ public interface ISubstationDeviceService extends IService { String selectNextUavDeviceCode(); + List> getRobotCodeByDeviceId(List deviceIds); } diff --git a/riis-system/src/main/java/com/yfd/platform/modules/basedata/service/impl/SubstationDeviceServiceImpl.java b/riis-system/src/main/java/com/yfd/platform/modules/basedata/service/impl/SubstationDeviceServiceImpl.java index 60b13fb..ebdfe33 100644 --- a/riis-system/src/main/java/com/yfd/platform/modules/basedata/service/impl/SubstationDeviceServiceImpl.java +++ b/riis-system/src/main/java/com/yfd/platform/modules/basedata/service/impl/SubstationDeviceServiceImpl.java @@ -869,4 +869,10 @@ public class SubstationDeviceServiceImpl extends ServiceImpl> getRobotCodeByDeviceId(List deviceIds) { + return substationDeviceMapper.getRobotCodeByDeviceId(deviceIds); + } + } diff --git a/riis-system/src/main/java/com/yfd/platform/modules/basedata/service/impl/SubstationMaindeviceServiceImpl.java b/riis-system/src/main/java/com/yfd/platform/modules/basedata/service/impl/SubstationMaindeviceServiceImpl.java index c151a98..5c4949e 100644 --- a/riis-system/src/main/java/com/yfd/platform/modules/basedata/service/impl/SubstationMaindeviceServiceImpl.java +++ b/riis-system/src/main/java/com/yfd/platform/modules/basedata/service/impl/SubstationMaindeviceServiceImpl.java @@ -667,49 +667,72 @@ public class SubstationMaindeviceServiceImpl extends ServiceImpl> list = this.listMaps(queryWrapper); List> mapList = list.stream().distinct().collect(Collectors.toList()); - // 分组并构建树形结构 - Map stationMap = new HashMap<>(); - Map areaNodeMap = new HashMap<>(); - Map bayNodeMap = new HashMap<>(); - Map mainDeviceMap = new HashMap<>(); - for (Map map : mapList) { - // String code = (String) map.get("stationCode"); - String areaId = (String) map.get("areaId"); - String bayId = (String) map.get("bayId"); - String mainDeviceId = (String) map.get("mainDeviceId"); - // String mainDeviceid = (String) map.get("mainDeviceId"); - // TreeNode stationNode = stationMap.computeIfAbsent(code, k -> new TreeNode(code, (String) - // map.get("stationName"))); - // 创建或获取Area节点 - TreeNode areaNode = areaNodeMap.computeIfAbsent(areaId, k -> new TreeNode(areaId, (String) - map.get("areaName"))); - // stationNode.getChildren().add(areaNode); - // 创建或获取Bay节点,并将其添加到Area节点的children中 - TreeNode bayNode = bayNodeMap.computeIfAbsent(bayId, k -> new TreeNode(bayId, (String) map - .get("bayName"))); - areaNode.getChildren().add(bayNode); + List treeNodes = this.buildTree(mapList); + return treeNodes.get(0); + } - TreeNode mainDeviceNode = mainDeviceMap.computeIfAbsent(mainDeviceId, k -> new TreeNode - (mainDeviceId, - (String) map.get("mainDeviceName"))); - bayNode.getChildren().add(mainDeviceNode); + public List buildTree(List> dataList) { + // 存储所有节点(使用ID作为键) + Map nodeMap = new HashMap<>(); + // 存储最终返回的根节点列表 + List roots = new ArrayList<>(); + + // 遍历原始数据 + for (Map data : dataList) { + // 1. 解析各层级信息(根据实际字段名称调整) + String stationCode = (String) data.get("stationCode"); + String stationName = (String) data.get("stationName"); + String areaId = (String) data.get("areaId"); + String areaName = (String) data.get("areaName"); + String bayId = (String) data.get("bayId"); + String bayName = (String) data.get("bayName"); + String mainDeviceId = (String) data.get("mainDeviceId"); + String mainDeviceName = (String) data.get("mainDeviceName"); + + // 2. 逐级创建/获取节点(假设层级关系:station -> area -> bay -> device) + + // 处理变电站层级 + TreeNode stationNode = nodeMap.computeIfAbsent(stationCode, + k -> { + TreeNode node = new TreeNode(stationCode, stationName); + roots.add(node); // 将变电站作为根节点 + return node; + }); + + // 处理区域层级 + if (StrUtil.isNotBlank(areaId)) { + TreeNode areaNode = nodeMap.computeIfAbsent(areaId, + k -> { + TreeNode node = new TreeNode(areaId, areaName); + stationNode.getChildren().add(node); + return node; + }); + + // 处理间隔层级 + if (StrUtil.isNotBlank(bayId)) { + TreeNode bayNode = nodeMap.computeIfAbsent(bayId, + k -> { + TreeNode node = new TreeNode(bayId, bayName); + areaNode.getChildren().add(node); + return node; + }); + + // 处理主设备层级 + if (StrUtil.isNotBlank(mainDeviceId)) { + nodeMap.computeIfAbsent(mainDeviceId, + k -> { + TreeNode node = new TreeNode(mainDeviceId, mainDeviceName); + bayNode.getChildren().add(node); + return node; + }); + } + } + } } - TreeNode stationNode = new TreeNode(); - List substations = - substationMapper.selectList(new LambdaQueryWrapper().eq(Substation::getStationCode, - stationCode)); - if (substations.size() <= 0) { - return null; - } - Substation substation = substations.get(0); - stationNode.setId(stationCode); - stationNode.setName(substation.getStationName()); - stationNode.setChildren(new ArrayList<>(areaNodeMap.values())); - stationMap.put(stationCode, stationNode); - return stationMap.get(stationCode); + return roots; } } diff --git a/riis-system/src/main/java/com/yfd/platform/utils/TestFileDir.java b/riis-system/src/main/java/com/yfd/platform/utils/TestFileDir.java index f9646c5..f96b362 100644 --- a/riis-system/src/main/java/com/yfd/platform/utils/TestFileDir.java +++ b/riis-system/src/main/java/com/yfd/platform/utils/TestFileDir.java @@ -1,81 +1,24 @@ package com.yfd.platform.utils; -import cn.hutool.core.date.DateTime; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.util.NumberUtil; -import cn.hutool.core.util.RandomUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONArray; -import cn.hutool.json.JSONObject; -import cn.hutool.json.JSONUtil; -import com.yfd.platform.config.ResponseResult; -import org.bytedeco.javacpp.presets.opencv_core; -import org.checkerframework.checker.units.qual.A; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.net.URLDecoder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class TestFileDir { public static void main(String[] args) throws Exception { + // //获取告警触发条件 + String str = "20<=value<50"; + // 定义正则表达式 + String regex = "(\\d+)\\s*((?:==?|!=|<=?|>=?))\\s*value\\s*((?:==?|!=|<=?|>=?))\\s*(\\d+)"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(str); - String sipMessage = "INVITE sip:170330000303060021@22.58.166.219:5060 SIP/2.0\n" + - "Via: SIP/2.0/UDP 22.58.160.19:5060;branch=z9hG4bKfa0e9e68ba6a17b28ec894f73309fe46e.0\n" + - "Via: SIP/2.0/UDP 22.58.160.19:5083;rport=5083;branch=z9hG4bK1223840924\n" + - "Record-Route: \n" + - "From: ;tag=1759705377\n" + - "To: \n" + - "Call-ID: 768969706\n" + - "CSeq: 20 INVITE\n" + - "Contact: \n" + - "Max-forwards: 69\n" + - "User-agent: eXosip/5.0.0\n" + - "Content-Type: application/sdp\n" + - "Content-Length: 199\n" + - "\n" + - "v=0\n" + - "o=- 0 0 IN IP4 22.58.160.19\n" + - "s=Play\n" + - "u=\n" + - "c=IN IP4 22.58.160.19\n" + - "m=video 9000 RTP/AVP 108\n" + - "y=382557257\n" + - "a=mime:\n" + - "a=rtpmap:108 H265/90000\n" + - "a=fmtp:108 CIF=1;4CIF=1;F=1;K=1\n" + - "a=rate:sub\n" + - "a=recvonly"; // 在这里替换为您的SIP消息 - - // 找到SDP内容的开始位置(即Content-Type头部之后的空行) - - - // 查找以m=开头的行 - String[] sdpLines = sipMessage.split("\r\n"); - for (String line : sdpLines) { - if (line.startsWith("m=")) { - // 提取动态载荷类型(PT) - String[] parts = line.split(" "); - if (parts.length >= 4 && "video".equals(parts[1])) { - // 假设第三个字段是RTP/AVP,第四个字段是PT - String pt = parts[3].split("/")[1]; // 分割RTP/AVP和PT - System.out.println("提取到的PT是: " + pt); - break; // 找到后退出循环 - } - } + if (matcher.find()) { + String number1 = matcher.group(1); // 第一个数字 + String operator1 = matcher.group(2); // 第一个比较符 + String operator2 = matcher.group(3); // 第二个比较符 + String number2 = matcher.group(4); // 第二个数字 + System.out.printf("%s %s value %s %s%n", number1, operator1, operator2, number2); } + System.out.println(""); } } diff --git a/riis-system/src/main/resources/mapper/basedata/SubstationDeviceMapper.xml b/riis-system/src/main/resources/mapper/basedata/SubstationDeviceMapper.xml index 4df71ef..1cdb8da 100644 --- a/riis-system/src/main/resources/mapper/basedata/SubstationDeviceMapper.xml +++ b/riis-system/src/main/resources/mapper/basedata/SubstationDeviceMapper.xml @@ -34,4 +34,27 @@ +