增加实现触发优化机器人/无人机任务控制

This commit is contained in:
weitang 2025-04-25 09:44:28 +08:00
parent 3fdf153036
commit 7b0eda3fb8
10 changed files with 555 additions and 235 deletions

View File

@ -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.AlgorithmModel;
import com.yfd.platform.modules.basedata.domain.Substation; import com.yfd.platform.modules.basedata.domain.Substation;
import com.yfd.platform.modules.basedata.domain.SubstationPatroldevice; import com.yfd.platform.modules.basedata.domain.SubstationPatroldevice;
import com.yfd.platform.modules.basedata.service.IAlgorithmManufacturerVersionService; import com.yfd.platform.modules.basedata.service.*;
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.patroltask.domain.ExaminePlan; import com.yfd.platform.modules.patroltask.domain.ExaminePlan;
import com.yfd.platform.modules.patroltask.domain.Task; import com.yfd.platform.modules.patroltask.domain.Task;
import com.yfd.platform.modules.patroltask.domain.TaskTodo; import com.yfd.platform.modules.patroltask.domain.TaskTodo;
@ -91,7 +88,9 @@ public class BootNettyChannelInboundHandlerAdapter extends ChannelInboundHandler
StringRedisTemplate redisTemplate = SpringContextHolder.getBean(StringRedisTemplate.class); StringRedisTemplate redisTemplate = SpringContextHolder.getBean(StringRedisTemplate.class);
TLSFTPUtils tlsftpUtils = SpringContextHolder.getBean(TLSFTPUtils.class); TLSFTPUtils tlsftpUtils = SpringContextHolder.getBean(TLSFTPUtils.class);
HttpRESTfulUtils httpRESTfulUtils = SpringContextHolder.getBean(HttpRESTfulUtils.class); HttpRESTfulUtils httpRESTfulUtils = SpringContextHolder.getBean(HttpRESTfulUtils.class);
EventManager eventManager = SpringContextHolder.getBean(EventManager.class);
ISubstationDeviceService substationDeviceService =
SpringContextHolder.getBean(ISubstationDeviceService.class);
@Override @Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
@ -372,105 +371,23 @@ public class BootNettyChannelInboundHandlerAdapter extends ChannelInboundHandler
Map<String, Object> map, String Type, String Command, String Code) throws InterruptedException { Map<String, Object> map, String Type, String Command, String Code) throws InterruptedException {
JSONArray taskArray = new JSONArray(); JSONArray taskArray = new JSONArray();
if (SystemCode.COMMAND_TASK_START_CODE.getCode().equals(Command)) { if (SystemCode.COMMAND_TASK_START_CODE.getCode().equals(Command)) {
LambdaUpdateWrapper<Task> updateWrapper = new LambdaUpdateWrapper<>(); runNow(Code, Type, Command, ctx, receivedmsg);
updateWrapper.eq(Task::getTaskCode, Code).set(Task::getIsenable, "1");
taskService.update(updateWrapper);
// 查询任务
LambdaQueryWrapper<Task> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Task::getTaskCode, Code);
Task task = taskService.getOne(queryWrapper);
String robotCode = task.getRobotCode();
if (StrUtil.isNotBlank(robotCode)) {
List<SubstationPatroldevice> list =
substationPatroldeviceService.list(new LambdaQueryWrapper<SubstationPatroldevice>().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<TaskTodo> list = taskTodoService.list(new LambdaQueryWrapper<TaskTodo>().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);
}
}
} }
if (SystemCode.COMMAND_TASK_PAUSE_CODE.getCode().equals(Command)) { if (SystemCode.COMMAND_TASK_PAUSE_CODE.getCode().equals(Command)) {
JSONObject taskData = new JSONObject(); // 暂停任务
taskData.putOnce("task_patrolled_id", Code); pauseTask(Code, Type, Command, ctx, receivedmsg);
taskArray.add(taskData);
TaskTodo taskTodo = taskTodoService.getById(Code);
if (StrUtil.isNotBlank(taskTodo.getRobotCode())) {
List<SubstationPatroldevice> list =
substationPatroldeviceService.list(new LambdaQueryWrapper<SubstationPatroldevice>().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());
}
} }
if (SystemCode.COMMAND_TASK_RESUME_CODE.getCode().equals(Command)) { if (SystemCode.COMMAND_TASK_RESUME_CODE.getCode().equals(Command)) {
JSONObject taskData = new JSONObject(); // 恢复任务
taskData.putOnce("task_patrolled_id", Code); resumeTask(Code, Type, Command, ctx, receivedmsg);
taskArray.add(taskData);
TaskTodo taskTodo = taskTodoService.getById(Code);
if (StrUtil.isNotBlank(taskTodo.getRobotCode())) {
List<SubstationPatroldevice> list =
substationPatroldeviceService.list(new LambdaQueryWrapper<SubstationPatroldevice>().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());
}
} }
if (SystemCode.COMMAND_TASK_STOP_CODE.getCode().equals(Command)) { if (SystemCode.COMMAND_TASK_STOP_CODE.getCode().equals(Command)) {
JSONObject taskData = new JSONObject(); // 停止任务
taskData.putOnce("task_patrolled_id", Code); stopTask(Code, Type, Command, ctx, receivedmsg);
taskArray.add(taskData);
TaskTodo taskTodo = taskTodoService.getById(Code);
if (StrUtil.isNotBlank(taskTodo.getRobotCode())) {
List<SubstationPatroldevice> list =
substationPatroldeviceService.list(new LambdaQueryWrapper<SubstationPatroldevice>().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());
}
}
// 响应给上级系统
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(); ctx.flush();
} }
private void pauseTask(String Code, String Type, String Command, ChannelHandlerContext ctx,
MyMessageProtocol receivedmsg) {
LambdaUpdateWrapper<Task> 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<Substation> substations =
substationService.list(new LambdaQueryWrapper<Substation>().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<String> deviceIds = StrUtil.split(deviceList, ",");
List<Map<String, Object>> robotMapList = substationDeviceService.getRobotCodeByDeviceId(deviceIds);
if (robotMapList != null && robotMapList.size() > 0) {
for (Map<String, Object> 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<SubstationPatroldevice> list =
substationPatroldeviceService.list(new LambdaQueryWrapper<SubstationPatroldevice>().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<Task> 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<Substation> substations =
substationService.list(new LambdaQueryWrapper<Substation>().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<String> deviceIds = StrUtil.split(deviceList, ",");
List<Map<String, Object>> robotMapList = substationDeviceService.getRobotCodeByDeviceId(deviceIds);
if (robotMapList != null && robotMapList.size() > 0) {
for (Map<String, Object> 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<SubstationPatroldevice> list =
substationPatroldeviceService.list(new LambdaQueryWrapper<SubstationPatroldevice>().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<Task> 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<Substation> substations =
substationService.list(new LambdaQueryWrapper<Substation>().eq(Substation::getStationCode,
stationCode));
if (substations.size() > 0) {
Substation substation = substations.get(0);
if ("1".equals(substation.getIsStationFlag())) {
// 所有正在执行的任务
List<TaskTodo> list =
taskTodoService.list(new LambdaQueryWrapper<TaskTodo>().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<String> deviceIds = StrUtil.split(deviceList, ",");
List<Map<String, Object>> robotMapList = substationDeviceService.getRobotCodeByDeviceId(deviceIds);
if (robotMapList != null && robotMapList.size() > 0) {
for (Map<String, Object> 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<SubstationPatroldevice> list =
substationPatroldeviceService.list(new LambdaQueryWrapper<SubstationPatroldevice>().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<Task> 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<Task> 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<Substation> substations =
substationService.list(new LambdaQueryWrapper<Substation>().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<String> deviceIds = StrUtil.split(deviceList, ",");
List<Map<String, Object>> robotMapList = substationDeviceService.getRobotCodeByDeviceId(deviceIds);
if (robotMapList != null && robotMapList.size() > 0) {
for (Map<String, Object> 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<SubstationPatroldevice> list =
substationPatroldeviceService.list(new LambdaQueryWrapper<SubstationPatroldevice>().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);
}
}
}
}
}
}
} }

View File

@ -0,0 +1,26 @@
package com.yfd.platform.component.nettyclient;
import java.util.function.Consumer;
public class Event {
// 事件的唯一 ID
private String eventId;
// 事件触发后的回调逻辑
private Consumer<Object> callback;
public Event(String eventId, Consumer<Object> callback) {
this.eventId = eventId;
this.callback = callback;
}
public String getEventId() {
return eventId;
}
public void trigger(Object data) {
if (callback != null) {
// 触发事件
callback.accept(data);
}
}
}

View File

@ -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<String, Event> 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);
}
}
}

View File

@ -11,6 +11,7 @@ import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.yfd.platform.component.WebSocketServer; import com.yfd.platform.component.WebSocketServer;
import com.yfd.platform.component.nettyclient.EventManager;
import com.yfd.platform.config.HttpServerConfig; import com.yfd.platform.config.HttpServerConfig;
import com.yfd.platform.config.ParentConfig; import com.yfd.platform.config.ParentConfig;
import com.yfd.platform.constant.Constant; import com.yfd.platform.constant.Constant;
@ -125,6 +126,9 @@ public class NettyServerHandler extends SimpleChannelInboundHandler<MyMessagePro
@Resource @Resource
private IPlatformParentSystemService platformParentSystemService; private IPlatformParentSystemService platformParentSystemService;
private long count = 1; private long count = 1;
// 事件管理器
@Resource
private EventManager eventManager;
@PostConstruct @PostConstruct
public void init() { public void init() {
@ -151,6 +155,7 @@ public class NettyServerHandler extends SimpleChannelInboundHandler<MyMessagePro
nettyServerHandler.robotOfflineLogService = this.robotOfflineLogService; nettyServerHandler.robotOfflineLogService = this.robotOfflineLogService;
nettyServerHandler.sysDictionaryItemsService = this.sysDictionaryItemsService; nettyServerHandler.sysDictionaryItemsService = this.sysDictionaryItemsService;
nettyServerHandler.platformParentSystemService = this.platformParentSystemService; nettyServerHandler.platformParentSystemService = this.platformParentSystemService;
nettyServerHandler.eventManager = this.eventManager;
} }
/** /**
@ -314,55 +319,109 @@ public class NettyServerHandler extends SimpleChannelInboundHandler<MyMessagePro
log.info("序列号展示" + msg.getReceiverSerialNo()); log.info("序列号展示" + msg.getReceiverSerialNo());
String xmlContent = String xmlContent =
nettyServerHandler.redisTemplate.opsForValue().get(Constant.ROBOT_SEND_CODE + receiverSerialNo); nettyServerHandler.redisTemplate.opsForValue().get(Constant.ROBOT_SEND_CODE + receiverSerialNo);
if (StrUtil.isBlank(xmlContent)) {
return;
}
xmlContent = StrUtil.strip(xmlContent, "\"");
xmlContent = xmlContent.replace("\\n", "").replace("\\", "");
Map<String, Object> xmlMap = MyXmlUtil.xmlToMap(xmlContent); Map<String, Object> xmlMap = MyXmlUtil.xmlToMap(xmlContent);
// 发送的指令 // 发送的指令
String responseType = xmlMap.get("Type").toString(); String responseType = xmlMap.get("Type").toString();
String responseCommand = xmlMap.get("Command").toString(); String responseCommand = xmlMap.get("Command").toString();
String responseCode = ObjectUtil.isEmpty(xmlMap.get("Code")) ? "" : xmlMap.get("Code").toString();
List<Map<String, String>> items = (List<Map<String, String>>) map.get("Items"); List<Map<String, String>> items = (List<Map<String, String>>) map.get("Items");
// 任务启动响应 // 任务启动响应
if (SystemCode.TYPE_TASK_CONTROL_CODE.getCode().equals(responseType) && SystemCode.COMMAND_TASK_START_CODE.getCode().equals(responseCommand)) { if (SystemCode.TYPE_TASK_CONTROL_CODE.getCode().equals(responseType) && SystemCode.COMMAND_TASK_START_CODE.getCode().equals(responseCommand)) {
log.info("任务控制-任务启动响应!{}", map.toString()); log.info("任务控制-任务启动响应!{}", map.toString());
JSONObject jsonObject = new JSONObject(); if (StrUtil.isNotBlank(responseCode)) {
Map<String, String> map1 = items.get(0); JSONArray jsonArray = JSONUtil.parseArray(items);
jsonObject.putOnce("task_patrolled_id", map1.get("task_patrolled_id")); nettyServerHandler.eventManager.triggerEvent(responseCode, jsonArray.toString());
// nettyServerHandler.stationRobotService.sendParentData(map.get("ReceiveCode").toString(), if (SystemCode.SUCCESS_STATUS_CODE.getCode().equals(Code)) {
// nettyServerHandler.parentConfig.getParentId(), Type, Command, Code, jsonObject.toString()); for (Map<String, String> item : items) {
// for (Map<String, String> item : items) { String taskPatrolledId = item.get("task_patrolled_id");
// TaskTodo taskTodo = new TaskTodo(); int count =
// String taskPatrolledId = item.get("task_patrolled_id"); nettyServerHandler.taskTodoService.count(new LambdaQueryWrapper<TaskTodo>().eq(TaskTodo::getTaskTodoId, taskPatrolledId));
// taskTodo.setTaskTodoId(taskPatrolledId); if (count <= 0) {
// taskTodo.setDatastatus("1"); TaskTodo taskTodo = new TaskTodo();
// taskTodo.setLastmodifier("机器人系统"); taskTodo.setTaskTodoId(taskPatrolledId);
// taskTodo.setLastmodifydate(new Timestamp(System.currentTimeMillis())); taskTodo.setDatastatus("1");
// // 新增任务执行数据 taskTodo.setTaskState("2");
// nettyServerHandler.taskTodoService.save(taskTodo); taskTodo.setTaskCode(responseCode);
// } Task task =
nettyServerHandler.taskService.getOne(new LambdaQueryWrapper<Task>().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<String> 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)) { if (SystemCode.TYPE_TASK_CONTROL_CODE.getCode().equals(responseType) && SystemCode.COMMAND_TASK_PAUSE_CODE.getCode().equals(responseCommand)) {
JSONObject jsonObject = new JSONObject(); if (StrUtil.isNotBlank(responseCode)) {
Map<String, String> map1 = items.get(0); JSONArray jsonArray = JSONUtil.parseArray(items);
jsonObject.putOnce("task_patrolled_id", map1.get("task_patrolled_id")); nettyServerHandler.eventManager.triggerEvent(responseCode, jsonArray.toString());
nettyServerHandler.stationRobotService.sendParentData(map.get("ReceiveCode").toString(), if (SystemCode.SUCCESS_STATUS_CODE.getCode().equals(Code)) {
nettyServerHandler.parentConfig.getParentId(), Type, Command, Code, jsonObject.toString()); LambdaUpdateWrapper<TaskTodo> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(TaskTodo::getTaskTodoId, responseCode).set(TaskTodo::getTaskState, "3");
nettyServerHandler.taskTodoService.update(updateWrapper);
}
}
log.info("任务控制-任务暂停响应!{}", map.toString()); log.info("任务控制-任务暂停响应!{}", map.toString());
} }
// 任务继续响应 // 任务继续响应
if (SystemCode.TYPE_TASK_CONTROL_CODE.getCode().equals(responseType) && SystemCode.COMMAND_TASK_RESUME_CODE.getCode().equals(responseCommand)) { if (SystemCode.TYPE_TASK_CONTROL_CODE.getCode().equals(responseType) && SystemCode.COMMAND_TASK_RESUME_CODE.getCode().equals(responseCommand)) {
JSONObject jsonObject = new JSONObject(); if (StrUtil.isNotBlank(responseCode)) {
Map<String, String> map1 = items.get(0); JSONArray jsonArray = JSONUtil.parseArray(items);
jsonObject.putOnce("task_patrolled_id", map1.get("task_patrolled_id")); nettyServerHandler.eventManager.triggerEvent(responseCode, jsonArray.toString());
nettyServerHandler.stationRobotService.sendParentData(map.get("ReceiveCode").toString(), if (SystemCode.SUCCESS_STATUS_CODE.getCode().equals(Code)) {
nettyServerHandler.parentConfig.getParentId(), Type, Command, Code, jsonObject.toString()); LambdaUpdateWrapper<TaskTodo> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(TaskTodo::getTaskTodoId, responseCode).set(TaskTodo::getTaskState, "2");
nettyServerHandler.taskTodoService.update(updateWrapper);
}
}
log.info("任务控制-任务继续响应!{}", map.toString()); log.info("任务控制-任务继续响应!{}", map.toString());
} }
// 任务停止响应 // 任务停止响应
if (SystemCode.TYPE_TASK_CONTROL_CODE.getCode().equals(responseType) && SystemCode.COMMAND_TASK_STOP_CODE.getCode().equals(responseCommand)) { if (SystemCode.TYPE_TASK_CONTROL_CODE.getCode().equals(responseType) && SystemCode.COMMAND_TASK_STOP_CODE.getCode().equals(responseCommand)) {
JSONObject jsonObject = new JSONObject(); if (StrUtil.isNotBlank(responseCode)) {
Map<String, String> map1 = items.get(0); JSONArray jsonArray = JSONUtil.parseArray(items);
jsonObject.putOnce("task_patrolled_id", map1.get("task_patrolled_id")); nettyServerHandler.eventManager.triggerEvent(responseCode, jsonArray.toString());
nettyServerHandler.stationRobotService.sendParentData(map.get("ReceiveCode").toString(), if (SystemCode.SUCCESS_STATUS_CODE.getCode().equals(Code)) {
nettyServerHandler.parentConfig.getParentId(), Type, Command, Code, jsonObject.toString()); LambdaUpdateWrapper<TaskTodo> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(TaskTodo::getTaskTodoId, responseCode).set(TaskTodo::getTaskState, "2");
nettyServerHandler.taskTodoService.update(updateWrapper);
}
}
LambdaUpdateWrapper<TaskTodo> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(TaskTodo::getTaskTodoId, responseCode).set(TaskTodo::getTaskState, "4");
nettyServerHandler.taskTodoService.update(updateWrapper);
log.info("任务控制-任务停止响应!{}", map.toString()); log.info("任务控制-任务停止响应!{}", map.toString());
} }
// 模型同步 // 模型同步

View File

@ -26,4 +26,5 @@ public interface SubstationDeviceMapper extends BaseMapper<SubstationDevice> {
String selectNextUavDeviceCode(); String selectNextUavDeviceCode();
List<Map<String, Object>> getRobotCodeByDeviceId(List<String> deviceIds);
} }

View File

@ -72,4 +72,5 @@ public interface ISubstationDeviceService extends IService<SubstationDevice> {
String selectNextUavDeviceCode(); String selectNextUavDeviceCode();
List<Map<String, Object>> getRobotCodeByDeviceId(List<String> deviceIds);
} }

View File

@ -869,4 +869,10 @@ public class SubstationDeviceServiceImpl extends ServiceImpl<SubstationDeviceMap
return substationDeviceMapper.selectNextUavDeviceCode(); return substationDeviceMapper.selectNextUavDeviceCode();
} }
@Override
public List<Map<String, Object>> getRobotCodeByDeviceId(List<String> deviceIds) {
return substationDeviceMapper.getRobotCodeByDeviceId(deviceIds);
}
} }

View File

@ -667,49 +667,72 @@ public class SubstationMaindeviceServiceImpl extends ServiceImpl<SubstationMaind
queryWrapper.select(SubstationMaindevice::getStationCode, queryWrapper.select(SubstationMaindevice::getStationCode,
SubstationMaindevice::getStationName, SubstationMaindevice::getStationName, SubstationMaindevice::getStationName, SubstationMaindevice::getStationName,
SubstationMaindevice::getAreaId, SubstationMaindevice::getAreaId,
SubstationMaindevice::getAreaName, SubstationMaindevice::getBayId, SubstationMaindevice::getBayName); SubstationMaindevice::getAreaName, SubstationMaindevice::getBayId, SubstationMaindevice::getBayName, SubstationMaindevice::getMainDeviceId, SubstationMaindevice::getMainDeviceName);
List<Map<String, Object>> list = this.listMaps(queryWrapper); List<Map<String, Object>> list = this.listMaps(queryWrapper);
List<Map<String, Object>> mapList = list.stream().distinct().collect(Collectors.toList()); List<Map<String, Object>> mapList = list.stream().distinct().collect(Collectors.toList());
// 分组并构建树形结构 List<TreeNode> treeNodes = this.buildTree(mapList);
Map<String, TreeNode> stationMap = new HashMap<>(); return treeNodes.get(0);
Map<String, TreeNode> areaNodeMap = new HashMap<>(); }
Map<String, TreeNode> bayNodeMap = new HashMap<>();
Map<String, TreeNode> mainDeviceMap = new HashMap<>();
for (Map<String, Object> 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);
TreeNode mainDeviceNode = mainDeviceMap.computeIfAbsent(mainDeviceId, k -> new TreeNode
(mainDeviceId,
(String) map.get("mainDeviceName")));
bayNode.getChildren().add(mainDeviceNode);
} public List<TreeNode> buildTree(List<Map<String, Object>> dataList) {
TreeNode stationNode = new TreeNode(); // 存储所有节点使用ID作为键
List<Substation> substations = Map<String, TreeNode> nodeMap = new HashMap<>();
substationMapper.selectList(new LambdaQueryWrapper<Substation>().eq(Substation::getStationCode, // 存储最终返回的根节点列表
stationCode)); List<TreeNode> roots = new ArrayList<>();
if (substations.size() <= 0) {
return null; // 遍历原始数据
} for (Map<String, Object> data : dataList) {
Substation substation = substations.get(0); // 1. 解析各层级信息根据实际字段名称调整
stationNode.setId(stationCode); String stationCode = (String) data.get("stationCode");
stationNode.setName(substation.getStationName()); String stationName = (String) data.get("stationName");
stationNode.setChildren(new ArrayList<>(areaNodeMap.values())); String areaId = (String) data.get("areaId");
stationMap.put(stationCode, stationNode); String areaName = (String) data.get("areaName");
return stationMap.get(stationCode); 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;
});
}
}
}
}
return roots;
} }
} }

View File

@ -1,81 +1,24 @@
package com.yfd.platform.utils; package com.yfd.platform.utils;
import cn.hutool.core.date.DateTime; import java.util.regex.Matcher;
import cn.hutool.core.date.DateUtil; import java.util.regex.Pattern;
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;
public class TestFileDir { public class TestFileDir {
public static void main(String[] args) throws Exception { 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" + if (matcher.find()) {
"Via: SIP/2.0/UDP 22.58.160.19:5060;branch=z9hG4bKfa0e9e68ba6a17b28ec894f73309fe46e.0\n" + String number1 = matcher.group(1); // 第一个数字
"Via: SIP/2.0/UDP 22.58.160.19:5083;rport=5083;branch=z9hG4bK1223840924\n" + String operator1 = matcher.group(2); // 第一个比较符
"Record-Route: <sip:22.58.160.19:5060;lr;psp=c7cf91fad1006c97c3a71a36db01f7dd>\n" + String operator2 = matcher.group(3); // 第二个比较符
"From: <sip:170010000001000000@22.58.160.19:5060>;tag=1759705377\n" + String number2 = matcher.group(4); // 第二个数字
"To: <sip:170330000303060021@22.58.166.219:5060>\n" + System.out.printf("%s %s value %s %s%n", number1, operator1, operator2, number2);
"Call-ID: 768969706\n" + }
"CSeq: 20 INVITE\n" + System.out.println("");
"Contact: <sip:170010000001000000@22.58.160.19:5083>\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; // 找到后退出循环
}
}
}
} }
} }

View File

@ -34,4 +34,27 @@
<select id="selectNextUavDeviceCode" resultType="java.lang.String"> <select id="selectNextUavDeviceCode" resultType="java.lang.String">
SELECT (MAX(CAST(SUBSTRING(device_code, 4) AS UNSIGNED))+1) device_code FROM `iis_substation_device` WHERE device_code LIKE 'DJ_%' SELECT (MAX(CAST(SUBSTRING(device_code, 4) AS UNSIGNED))+1) device_code FROM `iis_substation_device` WHERE device_code LIKE 'DJ_%'
</select> </select>
<select id="getRobotCodeByDeviceId" resultType="java.util.Map">
SELECT
device_code,
GROUP_CONCAT(device_id SEPARATOR ',') AS device_ids -- 将device_id用逗号合并
FROM (
SELECT COALESCE
(
NULLIF( JSON_UNQUOTE( JSON_EXTRACT( video_pos, '$[0].device_code' )), '' ),
NULLIF( JSON_UNQUOTE( JSON_EXTRACT( video_pos, '$[0].robot_code' )), '' ),
NULLIF( JSON_UNQUOTE( JSON_EXTRACT( video_pos, '$[0].uav_code' )), '' )
) AS device_code,device_id
FROM
iis_substation_device
WHERE
device_id IN
<foreach collection ='deviceIds' item='id' open ='(' separator=',' close=')' >
#{id}
</foreach>
AND ( JSON_EXTRACT( video_pos, '$[0].device_code' ) &lt;&gt; '' OR JSON_EXTRACT( video_pos, '$[0].robot_code' ) &lt;&gt; '' OR JSON_EXTRACT( video_pos, '$[0].uav_code' ) &lt;&gt; '' )
) AS subquery -- 将原查询作为子查询
GROUP BY device_code -- 按device_code分组
ORDER BY device_code DESC; -- 按device_code降序排列
</select>
</mapper> </mapper>