diff --git a/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/path/dto/RobotDimensionsDTO.java b/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/path/dto/RobotDimensionsDTO.java index 81685544c..606bd16e9 100644 --- a/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/path/dto/RobotDimensionsDTO.java +++ b/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/path/dto/RobotDimensionsDTO.java @@ -25,4 +25,7 @@ public class RobotDimensionsDTO { @Schema(description = "中心到车尾距离(单位米)") private Double robotCenterTail; + + @Schema(description = "mac地址") + private String macAddress; } diff --git a/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/config/MqttFactory.java b/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/config/MqttFactory.java index e6ed432ec..c564b3c18 100644 --- a/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/config/MqttFactory.java +++ b/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/config/MqttFactory.java @@ -141,8 +141,9 @@ public class MqttFactory { return BeanUtils.getBean(PathPlanningInitDataServiceImpl.class); case TASK_ASSIGNMENT_FEEDBACK: return BeanUtils.getBean(PathPlanningDistributionTaskServiceImpl.class); + case TASK_ASSIGNMENT_FAIL: + return BeanUtils.getBean(PathPlanningDistributionFailServiceImpl.class); default : -// case ROBOT_TASK_STATUS: return BeanUtils.getBean(RobotTaskStatusServiceImpl.class); } } diff --git a/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/enums/DefineSubTopicEnum.java b/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/enums/DefineSubTopicEnum.java index e060d94c9..713276f20 100644 --- a/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/enums/DefineSubTopicEnum.java +++ b/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/enums/DefineSubTopicEnum.java @@ -19,7 +19,8 @@ public enum DefineSubTopicEnum { ROBOT_TASK_STATUS("ROBOT_TASK_STATUS", 0,"机器人任务完成上报"), ROBOT_GENERICS_STATUS("ROBOT_GENERICS_STATUS", 0,"机器人异常"), SYNCHRONOUS_ALL_MAP_REQUEST("SYNCHRONOUS_ALL_MAP_REQUEST", 0,"路径规划需要初始数据上报"), - TASK_ASSIGNMENT_FEEDBACK("TASK_ASSIGNMENT_FEEDBACK", 0,"路径规划任务分配上报"); + TASK_ASSIGNMENT_FEEDBACK("TASK_ASSIGNMENT_FEEDBACK", 0,"路径规划任务分配上报"), + TASK_ASSIGNMENT_FAIL("TASK_ASSIGNMENT_FAIL", 0,"路径规划失败上报"); private final String topic; diff --git a/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/service/PathPlanningDistributionFailServiceImpl.java b/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/service/PathPlanningDistributionFailServiceImpl.java new file mode 100644 index 000000000..9380158a3 --- /dev/null +++ b/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/service/PathPlanningDistributionFailServiceImpl.java @@ -0,0 +1,22 @@ +package cn.iododer.yudao.module.mqtt.service; + +import cn.iocoder.yudao.module.system.api.path.PathApi; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Service +@Slf4j +public class PathPlanningDistributionFailServiceImpl implements MqttService{ + + @Resource + private PathApi pathApi; + + + @Override + public void analysisMessage(String message) { + log.info("路径规划失败信息上报 :{}", message); + pathApi.ppDistributionTaskFail(message); + } +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/path/PathApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/path/PathApi.java index 30600a352..617f30fe3 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/path/PathApi.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/path/PathApi.java @@ -20,4 +20,8 @@ public interface PathApi { @PostMapping(PREFIX + "/ppDistributionTask") @Operation(summary = "路径规划需要初始化信息") void ppDistributionTask(@RequestParam("message") String message); + + @PostMapping(PREFIX + "/ppDistributionTaskFail") + @Operation(summary = "路径规划需要初始化信息") + void ppDistributionTaskFail(@RequestParam("message") String message); } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index 14a962309..c482d1cc1 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -239,4 +239,7 @@ public interface ErrorCodeConstants { // ========== 循环任务点位 1_002_046_001========== ErrorCode TASK_CYCLE_NOT_EXISTS = new ErrorCode(1_002_046_001, "循环任务点位不存在"); + // ========== 用户操作记录 1_002_047_001 ========== + ErrorCode OPERATE_LOG_NOT_EXISTS = new ErrorCode(1_002_047_001, "用户操作记录不存在"); + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/path/PathApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/path/PathApiImpl.java index f97703976..bbb598a38 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/path/PathApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/path/PathApiImpl.java @@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapSaveReqVO; import cn.iocoder.yudao.module.system.service.path.PathPlanningService; import cn.iocoder.yudao.module.system.service.robot.RobotTaskService; +import cn.iocoder.yudao.module.system.service.robot.RobotWarnMsgService; import cn.iocoder.yudao.module.system.service.tool.ToolsService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -35,12 +36,14 @@ public class PathApiImpl implements PathApi { @Autowired private ThreadPoolTaskExecutor taskExecutor; + @Resource + private RobotWarnMsgService warnMsgService; + /** * 发送初始化信息给PP */ @Override public void pathInitData() { -// new Thread(() -> { taskExecutor.execute(() -> { TenantContextHolder.setTenantId(1L); log.info("初始化数据发送个PP---开始"); @@ -55,8 +58,6 @@ public class PathApiImpl implements PathApi { toolsService.sendPPsortConfig(); log.info("初始化数据发送个PP---完成"); }); - -// }).start(); } /** @@ -74,12 +75,14 @@ public class PathApiImpl implements PathApi { }); } - - - - - - + /** + * PP处理任务失败 + * @param message + */ + @Override + public void ppDistributionTaskFail(String message) { + warnMsgService.addWarnMsg(message); + } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RequestProcessor.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RequestProcessor.java index 878b98acc..843a9e20b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RequestProcessor.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RequestProcessor.java @@ -24,7 +24,7 @@ public class RequestProcessor { public RequestProcessor() { // 每秒执行一次 - 处理并发送数据 - 避免数据丢失 - scheduler.scheduleAtFixedRate(this::processAndSend, 1, 1, TimeUnit.SECONDS); + scheduler.scheduleAtFixedRate(this::processAndSend, 300, 300, TimeUnit.MILLISECONDS); } public void handleRequest(String map, String mac, String data) { diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotStatusApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotStatusApiImpl.java index 9c735ff50..fb3296c3e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotStatusApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotStatusApiImpl.java @@ -83,10 +83,11 @@ public class RobotStatusApiImpl implements RobotStatusApi { String cargoDetectedKey = RobotTaskChcheConstant.ROBOT_CARGO_DETECTED + robotStatusDataDTO.getMac(); String pose2dKey = RobotTaskChcheConstant.ROBOT_INFORMATION_POSE_BAT_SOC + robotStatusDataDTO.getMac(); // todo 后续需要改为从车机上报 - /*redisUtil.set(taskStatusKey, "IDLE", robotPositionCacheTime); - redisUtil.set(cargoDetectedKey, false, robotPositionCacheTime);*/ - redisUtil.set(taskStatusKey, robotStatusDataDTO.getData().getTask_status(), robotPositionCacheTime); - redisUtil.set(cargoDetectedKey, robotStatusDataDTO.getData().getCargo_detected(), robotPositionCacheTime); + + /*redisUtil.set(taskStatusKey, robotStatusDataDTO.getData().getTask_status(), robotPositionCacheTime); + redisUtil.set(cargoDetectedKey, robotStatusDataDTO.getData().getCargo_detected(), robotPositionCacheTime);*/ + redisUtil.set(taskStatusKey, "IDLE", robotPositionCacheTime); + redisUtil.set(cargoDetectedKey, false, robotPositionCacheTime); Object object = redisUtil.get(pose2dKey); RobotStatusDataPoseDTO robotStatusDataPoseDTO = JSONUtil.toBean((String) object, RobotStatusDataPoseDTO.class); @@ -104,6 +105,9 @@ public class RobotStatusApiImpl implements RobotStatusApi { robotStatusDataPoseDTO.setArea(robotStatusDataDTO.getData().getFloor_zone().getArea()); } + robotStatusDataPoseDTO.setFloor("1"); + robotStatusDataPoseDTO.setArea("D区"); + robotStatusDataPoseDTO.setRobotNo(robotNo); redisUtil.set(pose2dKey, JSON.toJSONString(robotStatusDataPoseDTO), robotPositionCacheTime); pathPlanningApi.synchronousLineObject(robotStatusDataPoseDTO, PathPlanningTopicConstant.AGV_POSE); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotTaskStatusApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotTaskStatusApiImpl.java index 3745c8cc5..5f83c4322 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotTaskStatusApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotTaskStatusApiImpl.java @@ -175,7 +175,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi { locationIds.add(robotTaskDetailDO.getToLocationId()); } if (ObjectUtil.isNotEmpty(locationIds)) { - locationMapper.releaseLocationLockList(locationIds, robotTaskDetailDO.getId() + locationMapper.releaseLocationLockList(locationIds, robotTaskDetailDO.getRobotTaskId() , LocationLockEnum.YES.getType()); } @@ -200,7 +200,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi { .warnMsg(robotNo +"_"+robotCompleteTaskDTO.getMessage()) .warnSolve(robotCompleteTaskDTO.getSolution()) .build(); - warnMsgMapper.insertBatch(Arrays.asList(warnMsg)); + warnMsgMapper.insert(warnMsg); warnMsgService.sendWarnMsgToWebsocket(warnMsg.getWarnMsg()); } @@ -259,8 +259,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi { RobotTaskDetailDO robotTaskDetailDO = robotTaskDetailMapper.selectById(robotCompleteTaskDTO.getOrder_id()); List taskDetails = robotTaskDetailMapper.queryByTaskId(robotTaskDetailDO.getRobotTaskId()); boolean done = - taskDetails.stream().allMatch(v -> (v.getTaskStatus().equals(RobotTaskDetailStatusEnum.DONE.getType()) - || v.getTaskStatus().equals(RobotTaskDetailStatusEnum.CLOSE.getType()))); + taskDetails.stream().noneMatch(v -> (v.getTaskStatus().equals(RobotTaskDetailStatusEnum.NEW.getType()))); if (done) { RobotTaskDO robotTaskDO = new RobotTaskDO(); robotTaskDO.setId(taskDetails.get(0).getRobotTaskId()); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/robot/RobotExecutionStateConstant.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/robot/RobotExecutionStateConstant.java index b7f751f3c..be93ff8b5 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/robot/RobotExecutionStateConstant.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/robot/RobotExecutionStateConstant.java @@ -8,10 +8,12 @@ public class RobotExecutionStateConstant { public static Integer UN_DO = 0; //正在做 public static Integer DOING = 1; - //已完成 - public static Integer DONE = 2; + //已暂停 + public static Integer STOP = 2; //已取消 public static Integer CLOSE = 3; //已失败、异常 public static Integer FAIL = 4; + //已完成 + public static Integer DONE = 5; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/RobotInformationController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/RobotInformationController.java index 8b034ee83..95bfcd1f6 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/RobotInformationController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/RobotInformationController.java @@ -6,6 +6,8 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.security.core.LoginUser; +import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDTO; import cn.iocoder.yudao.module.system.controller.admin.robot.vo.*; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/robot/RobotWarnType.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/robot/RobotWarnType.java index c6e5605c7..dfc5051fc 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/robot/RobotWarnType.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/robot/RobotWarnType.java @@ -11,7 +11,8 @@ import lombok.Getter; public enum RobotWarnType { ROBOT_WARN(1),//告警 - USER_OPERATE(2);//用户操作 + USER_OPERATE(2),//用户操作 + PATH(3);//路径规划 /** * 类型 */ diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/handler/mapnode/strategy/HouseLocationStrategyImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/handler/mapnode/strategy/HouseLocationStrategyImpl.java index 1edf8096f..3b7f49622 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/handler/mapnode/strategy/HouseLocationStrategyImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/handler/mapnode/strategy/HouseLocationStrategyImpl.java @@ -46,9 +46,9 @@ public class HouseLocationStrategyImpl implements NodeProcessingStrategy { int max = wareHouseLocationDOS.stream().map(WareHouseLocationDO::getLocationNo).filter(StrUtil::isNotEmpty) .mapToInt(s -> Integer.parseInt(s.substring(s.length() - 1))).max().orElse(1); int locationStorey = wareHouseLocationDOS.size(); - Long locationNumber = 0l; - if (ObjectUtil.isNotEmpty(nodeBaseDTOS)) { - locationNumber = nodeBaseDTOS.get(0).getLocationNumber(); + Long locationNumber = null; + if (ObjectUtil.isNotEmpty(item.getLocationNumber())) { + locationNumber = item.getLocationNumber(); } for (WareHouseLocationDO wareHouseLocationDO : wareHouseLocationDOS) { wareHouseLocationDO.setLocationX(item.getLocationX()); @@ -65,7 +65,7 @@ public class HouseLocationStrategyImpl implements NodeProcessingStrategy { } wareHouseLocationDO.setMapId(positionMapId); wareHouseLocationDO.setMapItemId(item.getId()); - if (ObjectUtil.isNotEmpty(locationNumber)) { + if (ObjectUtil.isNotEmpty(locationNumber) && ObjectUtil.isEmpty(wareHouseLocationDO.getLocationNumber())) { wareHouseLocationDO.setLocationNumber(locationNumber); locationNumber = locationNumber - 10; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotWarnMsgService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotWarnMsgService.java index 1e3a722b4..53abf098d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotWarnMsgService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotWarnMsgService.java @@ -55,4 +55,10 @@ public interface RobotWarnMsgService extends IService { PageResult getWarnMsgPage(RobotWarnMsgPageReqVO pageReqVO); void sendWarnMsgToWebsocket(Object errorMsg); + + /** + * 添加告警信息 + * @param message + */ + void addWarnMsg(String message); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotWarnMsgServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotWarnMsgServiceImpl.java index ad3de5fdd..3e0b24eb7 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotWarnMsgServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotWarnMsgServiceImpl.java @@ -13,6 +13,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapDO; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotWarnMsgDO; import cn.iocoder.yudao.module.system.dal.mysql.positionmap.PositionMapMapper; import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotWarnMsgMapper; +import cn.iocoder.yudao.module.system.enums.robot.RobotWarnType; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -20,6 +21,7 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.util.Arrays; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -99,4 +101,16 @@ public class RobotWarnMsgServiceImpl extends ServiceImpl group_name = #{groupName}, - sku_info = #{skuInfo}, - - sku_batch = #{skuBatch}, - sku_number = #{skuNumber}, diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotInformationMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotInformationMapper.xml index 3385c3779..160a3b20e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotInformationMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotInformationMapper.xml @@ -259,7 +259,8 @@ t1.robot_no AS robotNo, t2.robot_wide AS robotWide, t2.robot_center_headstock AS robotCenterHeadstock, - t2.robot_center_tail AS robotCenterTail + t2.robot_center_tail AS robotCenterTail, + t1.mac_address as macAddress FROM robot_information t1 LEFT JOIN robot_model t2 ON t1.robot_model_id = t2.id