# update 权限相关
This commit is contained in:
@@ -40,6 +40,6 @@ public class DevicePlanTask extends OrgBaseDO {
|
||||
private LocalDateTime canExecuteTime; // 这个时间之前都不能执行
|
||||
|
||||
@TableField(exist = false)
|
||||
private boolean taskAccepted = false; //任务被上位机接收
|
||||
private volatile boolean taskAccepted = false; //任务被上位机接收
|
||||
|
||||
}
|
||||
|
||||
@@ -30,6 +30,10 @@ import java.util.ArrayList;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Queue;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.ScheduledFuture;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
@Slf4j
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@@ -67,6 +71,9 @@ public class NettyDevice extends Connector {
|
||||
@JsonIgnore
|
||||
private WorkRecordMapper workRecordMapper = SpringUtils.getBean(WorkRecordMapper.class);
|
||||
|
||||
@JsonIgnore
|
||||
private ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService");
|
||||
|
||||
private static final String mqttClientId = "maibu-mqtt-client";
|
||||
|
||||
public NettyDevice(String connectorId) {
|
||||
@@ -80,7 +87,7 @@ public class NettyDevice extends Connector {
|
||||
}
|
||||
|
||||
|
||||
public void status(Integer onlineStatus){
|
||||
public void status(Integer onlineStatus) {
|
||||
this.onlineStatus = onlineStatus;
|
||||
}
|
||||
|
||||
@@ -318,9 +325,46 @@ public class NettyDevice extends Connector {
|
||||
if (executingTask)
|
||||
return;
|
||||
if (task != null) {
|
||||
// startTime 在启动前记录
|
||||
task.setStartTime(LocalDateTime.now());
|
||||
executingTask = true;
|
||||
sendNavigationCommand();
|
||||
|
||||
AtomicInteger count = new AtomicInteger(0);
|
||||
ScheduledFuture<?>[] futureHolder = new ScheduledFuture<?>[1];
|
||||
futureHolder[0] = executor.scheduleWithFixedDelay(() -> {
|
||||
int current = count.incrementAndGet();
|
||||
try {
|
||||
executingTask = true;
|
||||
if (task.isTaskAccepted()) {
|
||||
// 成功,停止后续执行
|
||||
futureHolder[0].cancel(false);
|
||||
log.info("任务执行成功,停止重试,执行次数={}", current);
|
||||
return;
|
||||
}
|
||||
sendNavigationCommand();
|
||||
// 达到最大次数
|
||||
if (current >= 10) {
|
||||
futureHolder[0].cancel(false);
|
||||
log.warn("任务执行达到最大次数,停止执行");
|
||||
executingTask = false;
|
||||
task.setTaskStaus(DeviceTaskStaus.FAILED);
|
||||
devicePlanTaskMapper.saveOrUpdate(task);
|
||||
task = null;
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("任务执行异常,次数={}", current, e);
|
||||
|
||||
// 异常是否算一次,可以根据你的业务决定
|
||||
if (current >= 10) {
|
||||
futureHolder[0].cancel(false);
|
||||
}
|
||||
executingTask = false;
|
||||
task.setTaskStaus(DeviceTaskStaus.FAILED);
|
||||
devicePlanTaskMapper.saveOrUpdate(task);
|
||||
task = null;
|
||||
}
|
||||
|
||||
}, 0, 3, TimeUnit.SECONDS);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
|
||||
@@ -48,6 +48,12 @@ public class LoginUser implements UserDetails {
|
||||
*/
|
||||
private String token;
|
||||
|
||||
|
||||
/**
|
||||
* 用户唯一标识 用户控制设备
|
||||
*/
|
||||
private String realToken;
|
||||
|
||||
/**
|
||||
* 登录时间
|
||||
*/
|
||||
@@ -108,7 +114,7 @@ public class LoginUser implements UserDetails {
|
||||
this.permissions = permissions;
|
||||
}
|
||||
|
||||
public LoginUser(Long userId, Long deptId, Long orgId, Long siteId, Long roleId,String language, SysUser user, Set<String> permissions) {
|
||||
public LoginUser(Long userId, Long deptId, Long orgId, Long siteId, Long roleId, String language, SysUser user, Set<String> permissions) {
|
||||
this.userId = userId;
|
||||
this.deptId = deptId;
|
||||
this.orgId = orgId;
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
package com.maibu.core.host;
|
||||
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
public class HostNavigationReplyDTO extends HostBase {
|
||||
|
||||
private String task_id; //任务唯一编号
|
||||
private String command_id;//指令唯一编号
|
||||
private boolean accepted;//是否接收
|
||||
private String code;//任务动作 OK|INVALID|BUSY|ERROR
|
||||
|
||||
private String message;
|
||||
|
||||
|
||||
}
|
||||
@@ -109,7 +109,8 @@ public class GlobalMemory {
|
||||
MqttTopic.MOWER_WILDCARD_LOCATION,//位置 经纬度
|
||||
MqttTopic.MOWER_WILDCARD_TASK_ROUTE, //路径回复
|
||||
MqttTopic.MOWER_WILDCARD_ERROR,//错误
|
||||
MqttTopic.MOWER_WILDCARD_REALTIME //状态消息
|
||||
MqttTopic.MOWER_WILDCARD_REALTIME, //状态消息
|
||||
MqttTopic.MOWER_WILDCARD_TASK_TARGET_REPLY //路径规划下发回复
|
||||
));
|
||||
deviceConfig.setHandlerType(Constant.mqttHandleKey); //唯一的 用于处理上位机mqtt的
|
||||
customMqttDeviceMonitor.registerDevice(deviceConfig);
|
||||
|
||||
@@ -8,10 +8,7 @@ import com.maibu.core.business.device.NettyDevice;
|
||||
import com.maibu.core.business.dto.WebStatusMessageDTO;
|
||||
import com.maibu.core.business.inter.WebsocketMesDispather;
|
||||
import com.maibu.core.enums.MesType;
|
||||
import com.maibu.core.host.HeartBeatDTO;
|
||||
import com.maibu.core.host.HostLocationRelTimeDTO;
|
||||
import com.maibu.core.host.HostTaskStatusDTO;
|
||||
import com.maibu.core.host.HostVehicleRelTimeDTO;
|
||||
import com.maibu.core.host.*;
|
||||
import com.maibu.memory.DeviceSessionManager;
|
||||
import com.maibu.memory.GlobalMemory;
|
||||
import com.maibu.utils.StringUtils;
|
||||
@@ -100,6 +97,9 @@ public class HostMessageHandler implements CustomMqttMessageHandler {
|
||||
case "control_reply":
|
||||
handleControlReply(deviceId, topic, payload);
|
||||
break;
|
||||
case "route_reply":
|
||||
handleRouteReply(deviceId, topic, payload);
|
||||
break;
|
||||
default:
|
||||
log.debug("割草机消息: deviceId={}, topic={}, action={}", deviceId, topic, action);
|
||||
break;
|
||||
@@ -307,6 +307,23 @@ public class HostMessageHandler implements CustomMqttMessageHandler {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 处理控制指令响应
|
||||
*/
|
||||
private void handleRouteReply(String deviceId, String topic, String payload) {
|
||||
log.debug("【路径任务下发响应】deviceId={}, payload={}", deviceId, payload);
|
||||
|
||||
//todo 更新任务接收状态
|
||||
HostNavigationReplyDTO replyDTO = SpringUtils.getBean(HostNavigationReplyDTO.class);
|
||||
NettyDevice device = deviceSessionManager.getDevice(deviceId);
|
||||
if (replyDTO.isAccepted()) {
|
||||
if (device != null && device.getTask() != null && String.valueOf(device.getTask().getId()).equals(replyDTO.getTask_id())) {
|
||||
device.getTask().setTaskAccepted(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 从 Topic 中解析 deviceId
|
||||
* Topic 格式:mower/{deviceId}/...
|
||||
@@ -349,6 +366,7 @@ public class HostMessageHandler implements CustomMqttMessageHandler {
|
||||
if (remaining.equals("task/finish/post")) return "task_finish_post";
|
||||
if (remaining.equals("action/config/reply")) return "config_reply";
|
||||
if (remaining.equals("action/control/reply")) return "control_reply";
|
||||
if (remaining.equals("/task/target/reply")) return "route_reply";
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -94,6 +94,8 @@ public class MqttTopic {
|
||||
|
||||
public static final String MOWER_WILDCARD_TASK_ROUTE = "mower/+/task/route/post";
|
||||
|
||||
public static final String MOWER_WILDCARD_TASK_TARGET_REPLY = "mower/+/task/target/reply";
|
||||
|
||||
public static final String MOWER_HEARTBEAT = "mower/+/event/heartbeat/post";
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user