远遥登录

This commit is contained in:
cbs 2025-05-12 10:40:29 +08:00
parent 465f737edd
commit e46ccfc8ce
6 changed files with 28 additions and 12 deletions

View File

@ -1,15 +1,15 @@
package cn.iododer.yudao.module.mqtt.config; package cn.iododer.yudao.module.mqtt.config;
import cn.iododer.yudao.module.mqtt.service.MqttService; import cn.iododer.yudao.module.mqtt.service.MqttService;
import cn.iododer.yudao.module.mqtt.service.RobotTaskStatusServiceImpl;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.IMqttAsyncClient; import org.eclipse.paho.client.mqttv3.IMqttAsyncClient;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback; import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage; import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import java.nio.charset.StandardCharsets;
/** /**
* MQTT回调 * MQTT回调
*/ */
@ -35,7 +35,7 @@ public class MqttCallBack implements MqttCallback {
*/ */
@Override @Override
public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception { public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
String msg = new String(mqttMessage.getPayload()); String msg = new String(mqttMessage.getPayload(), StandardCharsets.UTF_8);
// log.info("[MQTT]接收当前消息为 :{}", msg); // log.info("[MQTT]接收当前消息为 :{}", msg);
try { try {

View File

@ -228,7 +228,7 @@ public interface ErrorCodeConstants {
// ========== 机器人任务明细 1-002-036-000 ========== // ========== 机器人任务明细 1-002-036-000 ==========
ErrorCode TASK_DETAIL_NOT_EXISTS = new ErrorCode(1-002-036-001, "车辆任务明细不存在"); ErrorCode TASK_DETAIL_NOT_EXISTS = new ErrorCode(1-002-036-001, "车辆任务明细不存在");
ErrorCode TASK_DETAIL_CHANGE_ROBOT = new ErrorCode(1-002-036-002, "非新单据不能修改车辆"); ErrorCode TASK_DETAIL_CHANGE_ROBOT = new ErrorCode(1-002-036-002, "非新单据不能修改车辆");
ErrorCode TASK_NOT_TAKE_RELEASE = new ErrorCode(1-002-036-003, "非取货任务,不能点击取货完成"); ErrorCode TASK_NOT_TAKE_RELEASE = new ErrorCode(1-002-036-003, "已经取完货,不能点击取货完成,只能点击任务完成");
// ========== 机器人任务明细 1-002-037-000 ========== // ========== 机器人任务明细 1-002-037-000 ==========
ErrorCode REDISSON_NOT_OBTAIN_LOCK = new ErrorCode(1-002-037-001, "有正在下发中的任务请稍后重试!"); ErrorCode REDISSON_NOT_OBTAIN_LOCK = new ErrorCode(1-002-037-001, "有正在下发中的任务请稍后重试!");
@ -292,7 +292,6 @@ public interface ErrorCodeConstants {
ErrorCode REMOTE_NOT_HAVE_PATH_MATCH = new ErrorCode(1_002_053_007, "车辆未匹配路网"); ErrorCode REMOTE_NOT_HAVE_PATH_MATCH = new ErrorCode(1_002_053_007, "车辆未匹配路网");
ErrorCode REMOTE_AUTOMATIC_CAN_NOT_CHANGE_TO_FREE = new ErrorCode(1_002_053_008, "手动模式只能切换到自动模式"); ErrorCode REMOTE_AUTOMATIC_CAN_NOT_CHANGE_TO_FREE = new ErrorCode(1_002_053_008, "手动模式只能切换到自动模式");
ErrorCode REMOTE_FREE_CAN_NOT_CHANGE_TO_HAND_MOVEMENT = new ErrorCode(1_002_053_009, "自由模式只能切换到自动模式"); ErrorCode REMOTE_FREE_CAN_NOT_CHANGE_TO_HAND_MOVEMENT = new ErrorCode(1_002_053_009, "自由模式只能切换到自动模式");
ErrorCode REMOTE_NOT_HAVE_BINDING_ROBOT = new ErrorCode(1_002_053_010, "远遥设备未选择车辆");
ErrorCode REMOTE_TASK_HAVE_CHOOSE = new ErrorCode(1_002_053_011, "此任务已经被远遥设备选中"); ErrorCode REMOTE_TASK_HAVE_CHOOSE = new ErrorCode(1_002_053_011, "此任务已经被远遥设备选中");
ErrorCode REMOTE_TASK_NOT_OCCUR_ERROR = new ErrorCode(1_002_053_012, "此任务未发发生4级异常"); ErrorCode REMOTE_TASK_NOT_OCCUR_ERROR = new ErrorCode(1_002_053_012, "此任务未发发生4级异常");
ErrorCode REMOTE_TASK_NOT_TAKE_RELEASE = new ErrorCode(1_002_053_013, "非取货或者放货任务,不能转移"); ErrorCode REMOTE_TASK_NOT_TAKE_RELEASE = new ErrorCode(1_002_053_013, "非取货或者放货任务,不能转移");
@ -300,6 +299,8 @@ public interface ErrorCodeConstants {
ErrorCode REMOTE_ROBOT_HAVE_MORE_TASK = new ErrorCode(1_002_053_015, "此车辆有一个以上的处理中任务,请先检查数据"); ErrorCode REMOTE_ROBOT_HAVE_MORE_TASK = new ErrorCode(1_002_053_015, "此车辆有一个以上的处理中任务,请先检查数据");
ErrorCode REMOTE_ROBOT_HAVE_NOT_TASK = new ErrorCode(1_002_053_016, "此车辆没有处理中的任务"); ErrorCode REMOTE_ROBOT_HAVE_NOT_TASK = new ErrorCode(1_002_053_016, "此车辆没有处理中的任务");
ErrorCode REMOTE_ROBOT_CONNECT_FAIL = new ErrorCode(1_002_053_017, "与远遥工控机连接失败"); ErrorCode REMOTE_ROBOT_CONNECT_FAIL = new ErrorCode(1_002_053_017, "与远遥工控机连接失败");
ErrorCode REMOTE_TRANSFER_NOT_SAME_ROBOT = new ErrorCode(1_002_053_018, "任务转移车辆与发生异常的车辆,不能是同一台车");
ErrorCode REMOTE_ROBOT_HAVE_TASK = new ErrorCode(1_002_053_019, "此车辆有处理中的任务,不能进行任务转移。请选择其他车辆");
// ========== 车辆摄像头信息 1_002_054_001 ========== // ========== 车辆摄像头信息 1_002_054_001 ==========
ErrorCode CAMERA_NOT_EXISTS = new ErrorCode(1_002_054_001, "车辆摄像头信息不存在"); ErrorCode CAMERA_NOT_EXISTS = new ErrorCode(1_002_054_001, "车辆摄像头信息不存在");

View File

@ -8,5 +8,6 @@ package cn.iocoder.yudao.module.system.enums.oauth2;
public interface OAuth2ClientConstants { public interface OAuth2ClientConstants {
String CLIENT_ID_DEFAULT = "default"; String CLIENT_ID_DEFAULT = "default";
String CLIENT_ID_REMOTE = "remote";
} }

View File

@ -51,6 +51,9 @@ public class AuthLoginReqVO {
@Schema(description = "state", requiredMode = Schema.RequiredMode.REQUIRED, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62") @Schema(description = "state", requiredMode = Schema.RequiredMode.REQUIRED, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62")
private String socialState; private String socialState;
@Schema(description = "登录来源地址, 远遥传: remote")
private String clientId;
/** /**
* 开启验证码的 Group * 开启验证码的 Group
*/ */

View File

@ -105,8 +105,11 @@ public class AdminAuthServiceImpl implements AdminAuthService {
socialUserService.bindSocialUser(new SocialUserBindReqDTO(user.getId(), getUserType().getValue(), socialUserService.bindSocialUser(new SocialUserBindReqDTO(user.getId(), getUserType().getValue(),
reqVO.getSocialType(), reqVO.getSocialCode(), reqVO.getSocialState())); reqVO.getSocialType(), reqVO.getSocialCode(), reqVO.getSocialState()));
} }
String clientId = ObjectUtil.isNotEmpty(reqVO.getClientId()) ? reqVO.getClientId() : OAuth2ClientConstants.CLIENT_ID_DEFAULT;
// 创建 Token 令牌记录登录日志 // 创建 Token 令牌记录登录日志
return createTokenAfterLoginSuccess(user.getId(), reqVO.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME); return createTokenAfterLoginSuccess(user.getId(), reqVO.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME, clientId);
} }
@Override @Override
@ -131,7 +134,7 @@ public class AdminAuthServiceImpl implements AdminAuthService {
} }
// 创建 Token 令牌记录登录日志 // 创建 Token 令牌记录登录日志
return createTokenAfterLoginSuccess(user.getId(), reqVO.getMobile(), LoginLogTypeEnum.LOGIN_MOBILE); return createTokenAfterLoginSuccess(user.getId(), reqVO.getMobile(), LoginLogTypeEnum.LOGIN_MOBILE, OAuth2ClientConstants.CLIENT_ID_DEFAULT);
} }
private void createLoginLog(Long userId, String username, private void createLoginLog(Long userId, String username,
@ -169,7 +172,7 @@ public class AdminAuthServiceImpl implements AdminAuthService {
} }
// 创建 Token 令牌记录登录日志 // 创建 Token 令牌记录登录日志
return createTokenAfterLoginSuccess(user.getId(), user.getUsername(), LoginLogTypeEnum.LOGIN_SOCIAL); return createTokenAfterLoginSuccess(user.getId(), user.getUsername(), LoginLogTypeEnum.LOGIN_SOCIAL,OAuth2ClientConstants.CLIENT_ID_DEFAULT);
} }
@VisibleForTesting @VisibleForTesting
@ -191,12 +194,12 @@ public class AdminAuthServiceImpl implements AdminAuthService {
} }
} }
private AuthLoginRespVO createTokenAfterLoginSuccess(Long userId, String username, LoginLogTypeEnum logType) { private AuthLoginRespVO createTokenAfterLoginSuccess(Long userId, String username, LoginLogTypeEnum logType, String clientId) {
// 插入登陆日志 // 插入登陆日志
createLoginLog(userId, username, logType, LoginResultEnum.SUCCESS); createLoginLog(userId, username, logType, LoginResultEnum.SUCCESS);
// 创建访问令牌 // 创建访问令牌
OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.createAccessToken(userId, getUserType().getValue(), OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.createAccessToken(userId, getUserType().getValue(),
OAuth2ClientConstants.CLIENT_ID_DEFAULT, null); clientId, null);
// 构建返回结果 // 构建返回结果
return AuthConvert.INSTANCE.convert(accessTokenDO); return AuthConvert.INSTANCE.convert(accessTokenDO);
} }
@ -256,7 +259,7 @@ public class AdminAuthServiceImpl implements AdminAuthService {
Long userId = userService.registerUser(registerReqVO); Long userId = userService.registerUser(registerReqVO);
// 3. 创建 Token 令牌记录登录日志 // 3. 创建 Token 令牌记录登录日志
return createTokenAfterLoginSuccess(userId, registerReqVO.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME); return createTokenAfterLoginSuccess(userId, registerReqVO.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME,OAuth2ClientConstants.CLIENT_ID_DEFAULT);
} }
@VisibleForTesting @VisibleForTesting

View File

@ -307,6 +307,7 @@ public class RemoteControllerInformationServiceImpl extends ServiceImpl<RemoteCo
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public RemoteRobotTransferDTO robotChangeMode(Integer remoteMode, String remoteIp, String robotNo, int remoteControllerPort, String remoteControllerIp) { public RemoteRobotTransferDTO robotChangeMode(Integer remoteMode, String remoteIp, String robotNo, int remoteControllerPort, String remoteControllerIp) {
log.info("切换的模式 :{}, 远遥IP :{}, 车辆编号 :{}, 驾舱端口:{}, 驾舱IP :{}",remoteMode,remoteIp,robotNo,remoteControllerPort,remoteControllerIp);
RLock lock = redissonUtils.getLock(RobotCacheLockEnum.ROBOT_TASK_DISTRIBUTE_LOCK.getKey()); RLock lock = redissonUtils.getLock(RobotCacheLockEnum.ROBOT_TASK_DISTRIBUTE_LOCK.getKey());
if (lock.tryLock()) { if (lock.tryLock()) {
try { try {
@ -464,7 +465,7 @@ public class RemoteControllerInformationServiceImpl extends ServiceImpl<RemoteCo
.eq(RemoteControllerInformationDO::getRemoteIp, remoteIp) .eq(RemoteControllerInformationDO::getRemoteIp, remoteIp)
.last("limit 1")); .last("limit 1"));
if (ObjectUtil.isEmpty(information) || ObjectUtil.isEmpty(information.getRobotNo())) { if (ObjectUtil.isEmpty(information) || ObjectUtil.isEmpty(information.getRobotNo())) {
throw exception(REMOTE_NOT_HAVE_BINDING_ROBOT); throw exception(REMOTE_DEVICE_NOT_SET_UP);
} }
return information; return information;
} }
@ -491,9 +492,16 @@ public class RemoteControllerInformationServiceImpl extends ServiceImpl<RemoteCo
//任务异常 //任务异常
RobotTaskDetailDO taskDetail = taskDetailService.getTaskDetail(data.getId()); RobotTaskDetailDO taskDetail = taskDetailService.getTaskDetail(data.getId());
String oldRobotNo = taskDetail.getRobotNo(); String oldRobotNo = taskDetail.getRobotNo();
List<RobotDoingTaskDTO> robotDoingTaskNo = taskDetailService.getRobotDoingTaskNo(oldRobotNo);
if (ObjectUtil.isNotEmpty(robotDoingTaskNo)) {
throw exception(REMOTE_ROBOT_HAVE_TASK);
}
if (ZeroOneEnum.ZERO.getType().equals(taskDetail.getOccurError())) { if (ZeroOneEnum.ZERO.getType().equals(taskDetail.getOccurError())) {
throw exception(REMOTE_TASK_NOT_OCCUR_ERROR); throw exception(REMOTE_TASK_NOT_OCCUR_ERROR);
} }
if (information.getRobotNo().equals(oldRobotNo)) {
throw exception(REMOTE_TRANSFER_NOT_SAME_ROBOT);
}
taskDetail.setRobotNo(information.getRobotNo()); taskDetail.setRobotNo(information.getRobotNo());
if (!RobotTaskTypeEnum.TAKE_RELEASE.getType().equals(taskDetail.getTaskType()) if (!RobotTaskTypeEnum.TAKE_RELEASE.getType().equals(taskDetail.getTaskType())
&& !RobotTaskTypeEnum.TAKE.getType().equals(taskDetail.getTaskType()) && !RobotTaskTypeEnum.TAKE.getType().equals(taskDetail.getTaskType())