增加实现触发优化机器人/无人机任务控制
This commit is contained in:
parent
3fdf153036
commit
7b0eda3fb8
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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());
|
||||||
}
|
}
|
||||||
// 模型同步
|
// 模型同步
|
||||||
|
@ -26,4 +26,5 @@ public interface SubstationDeviceMapper extends BaseMapper<SubstationDevice> {
|
|||||||
|
|
||||||
String selectNextUavDeviceCode();
|
String selectNextUavDeviceCode();
|
||||||
|
|
||||||
|
List<Map<String, Object>> getRobotCodeByDeviceId(List<String> deviceIds);
|
||||||
}
|
}
|
||||||
|
@ -72,4 +72,5 @@ public interface ISubstationDeviceService extends IService<SubstationDevice> {
|
|||||||
|
|
||||||
String selectNextUavDeviceCode();
|
String selectNextUavDeviceCode();
|
||||||
|
|
||||||
|
List<Map<String, Object>> getRobotCodeByDeviceId(List<String> deviceIds);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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; // 找到后退出循环
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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' ) <> '' OR JSON_EXTRACT( video_pos, '$[0].robot_code' ) <> '' OR JSON_EXTRACT( video_pos, '$[0].uav_code' ) <> '' )
|
||||||
|
) AS subquery -- 将原查询作为子查询
|
||||||
|
GROUP BY device_code -- 按device_code分组
|
||||||
|
ORDER BY device_code DESC; -- 按device_code降序排列
|
||||||
|
</select>
|
||||||
</mapper>
|
</mapper>
|
||||||
|
Loading…
Reference in New Issue
Block a user