告警信息

This commit is contained in:
cbs 2025-03-07 11:54:34 +08:00
parent b4d12cf03d
commit a9a4244290
18 changed files with 94 additions and 32 deletions

View File

@ -25,4 +25,7 @@ public class RobotDimensionsDTO {
@Schema(description = "中心到车尾距离(单位米)") @Schema(description = "中心到车尾距离(单位米)")
private Double robotCenterTail; private Double robotCenterTail;
@Schema(description = "mac地址")
private String macAddress;
} }

View File

@ -141,8 +141,9 @@ public class MqttFactory {
return BeanUtils.getBean(PathPlanningInitDataServiceImpl.class); return BeanUtils.getBean(PathPlanningInitDataServiceImpl.class);
case TASK_ASSIGNMENT_FEEDBACK: case TASK_ASSIGNMENT_FEEDBACK:
return BeanUtils.getBean(PathPlanningDistributionTaskServiceImpl.class); return BeanUtils.getBean(PathPlanningDistributionTaskServiceImpl.class);
case TASK_ASSIGNMENT_FAIL:
return BeanUtils.getBean(PathPlanningDistributionFailServiceImpl.class);
default : default :
// case ROBOT_TASK_STATUS:
return BeanUtils.getBean(RobotTaskStatusServiceImpl.class); return BeanUtils.getBean(RobotTaskStatusServiceImpl.class);
} }
} }

View File

@ -19,7 +19,8 @@ public enum DefineSubTopicEnum {
ROBOT_TASK_STATUS("ROBOT_TASK_STATUS", 0,"机器人任务完成上报"), ROBOT_TASK_STATUS("ROBOT_TASK_STATUS", 0,"机器人任务完成上报"),
ROBOT_GENERICS_STATUS("ROBOT_GENERICS_STATUS", 0,"机器人异常"), ROBOT_GENERICS_STATUS("ROBOT_GENERICS_STATUS", 0,"机器人异常"),
SYNCHRONOUS_ALL_MAP_REQUEST("SYNCHRONOUS_ALL_MAP_REQUEST", 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; private final String topic;

View File

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

View File

@ -20,4 +20,8 @@ public interface PathApi {
@PostMapping(PREFIX + "/ppDistributionTask") @PostMapping(PREFIX + "/ppDistributionTask")
@Operation(summary = "路径规划需要初始化信息") @Operation(summary = "路径规划需要初始化信息")
void ppDistributionTask(@RequestParam("message") String message); void ppDistributionTask(@RequestParam("message") String message);
@PostMapping(PREFIX + "/ppDistributionTaskFail")
@Operation(summary = "路径规划需要初始化信息")
void ppDistributionTaskFail(@RequestParam("message") String message);
} }

View File

@ -239,4 +239,7 @@ public interface ErrorCodeConstants {
// ========== 循环任务点位 1_002_046_001========== // ========== 循环任务点位 1_002_046_001==========
ErrorCode TASK_CYCLE_NOT_EXISTS = new ErrorCode(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, "用户操作记录不存在");
} }

View File

@ -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.controller.admin.positionmap.vo.PositionMapSaveReqVO;
import cn.iocoder.yudao.module.system.service.path.PathPlanningService; 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.RobotTaskService;
import cn.iocoder.yudao.module.system.service.robot.RobotWarnMsgService;
import cn.iocoder.yudao.module.system.service.tool.ToolsService; import cn.iocoder.yudao.module.system.service.tool.ToolsService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -35,12 +36,14 @@ public class PathApiImpl implements PathApi {
@Autowired @Autowired
private ThreadPoolTaskExecutor taskExecutor; private ThreadPoolTaskExecutor taskExecutor;
@Resource
private RobotWarnMsgService warnMsgService;
/** /**
* 发送初始化信息给PP * 发送初始化信息给PP
*/ */
@Override @Override
public void pathInitData() { public void pathInitData() {
// new Thread(() -> {
taskExecutor.execute(() -> { taskExecutor.execute(() -> {
TenantContextHolder.setTenantId(1L); TenantContextHolder.setTenantId(1L);
log.info("初始化数据发送个PP---开始"); log.info("初始化数据发送个PP---开始");
@ -55,8 +58,6 @@ public class PathApiImpl implements PathApi {
toolsService.sendPPsortConfig(); toolsService.sendPPsortConfig();
log.info("初始化数据发送个PP---完成"); 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);
}
} }

View File

@ -24,7 +24,7 @@ public class RequestProcessor {
public 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) { public void handleRequest(String map, String mac, String data) {

View File

@ -83,10 +83,11 @@ public class RobotStatusApiImpl implements RobotStatusApi {
String cargoDetectedKey = RobotTaskChcheConstant.ROBOT_CARGO_DETECTED + robotStatusDataDTO.getMac(); String cargoDetectedKey = RobotTaskChcheConstant.ROBOT_CARGO_DETECTED + robotStatusDataDTO.getMac();
String pose2dKey = RobotTaskChcheConstant.ROBOT_INFORMATION_POSE_BAT_SOC + robotStatusDataDTO.getMac(); String pose2dKey = RobotTaskChcheConstant.ROBOT_INFORMATION_POSE_BAT_SOC + robotStatusDataDTO.getMac();
// todo 后续需要改为从车机上报 // todo 后续需要改为从车机上报
/*redisUtil.set(taskStatusKey, "IDLE", robotPositionCacheTime);
redisUtil.set(cargoDetectedKey, false, robotPositionCacheTime);*/ /*redisUtil.set(taskStatusKey, robotStatusDataDTO.getData().getTask_status(), robotPositionCacheTime);
redisUtil.set(taskStatusKey, robotStatusDataDTO.getData().getTask_status(), robotPositionCacheTime); redisUtil.set(cargoDetectedKey, robotStatusDataDTO.getData().getCargo_detected(), robotPositionCacheTime);*/
redisUtil.set(cargoDetectedKey, robotStatusDataDTO.getData().getCargo_detected(), robotPositionCacheTime); redisUtil.set(taskStatusKey, "IDLE", robotPositionCacheTime);
redisUtil.set(cargoDetectedKey, false, robotPositionCacheTime);
Object object = redisUtil.get(pose2dKey); Object object = redisUtil.get(pose2dKey);
RobotStatusDataPoseDTO robotStatusDataPoseDTO = JSONUtil.toBean((String) object, RobotStatusDataPoseDTO.class); 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.setArea(robotStatusDataDTO.getData().getFloor_zone().getArea());
} }
robotStatusDataPoseDTO.setFloor("1");
robotStatusDataPoseDTO.setArea("D区");
robotStatusDataPoseDTO.setRobotNo(robotNo); robotStatusDataPoseDTO.setRobotNo(robotNo);
redisUtil.set(pose2dKey, JSON.toJSONString(robotStatusDataPoseDTO), robotPositionCacheTime); redisUtil.set(pose2dKey, JSON.toJSONString(robotStatusDataPoseDTO), robotPositionCacheTime);
pathPlanningApi.synchronousLineObject(robotStatusDataPoseDTO, PathPlanningTopicConstant.AGV_POSE); pathPlanningApi.synchronousLineObject(robotStatusDataPoseDTO, PathPlanningTopicConstant.AGV_POSE);

View File

@ -175,7 +175,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
locationIds.add(robotTaskDetailDO.getToLocationId()); locationIds.add(robotTaskDetailDO.getToLocationId());
} }
if (ObjectUtil.isNotEmpty(locationIds)) { if (ObjectUtil.isNotEmpty(locationIds)) {
locationMapper.releaseLocationLockList(locationIds, robotTaskDetailDO.getId() locationMapper.releaseLocationLockList(locationIds, robotTaskDetailDO.getRobotTaskId()
, LocationLockEnum.YES.getType()); , LocationLockEnum.YES.getType());
} }
@ -200,7 +200,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
.warnMsg(robotNo +"_"+robotCompleteTaskDTO.getMessage()) .warnMsg(robotNo +"_"+robotCompleteTaskDTO.getMessage())
.warnSolve(robotCompleteTaskDTO.getSolution()) .warnSolve(robotCompleteTaskDTO.getSolution())
.build(); .build();
warnMsgMapper.insertBatch(Arrays.asList(warnMsg)); warnMsgMapper.insert(warnMsg);
warnMsgService.sendWarnMsgToWebsocket(warnMsg.getWarnMsg()); warnMsgService.sendWarnMsgToWebsocket(warnMsg.getWarnMsg());
} }
@ -259,8 +259,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
RobotTaskDetailDO robotTaskDetailDO = robotTaskDetailMapper.selectById(robotCompleteTaskDTO.getOrder_id()); RobotTaskDetailDO robotTaskDetailDO = robotTaskDetailMapper.selectById(robotCompleteTaskDTO.getOrder_id());
List<RobotTaskDetailDO> taskDetails = robotTaskDetailMapper.queryByTaskId(robotTaskDetailDO.getRobotTaskId()); List<RobotTaskDetailDO> taskDetails = robotTaskDetailMapper.queryByTaskId(robotTaskDetailDO.getRobotTaskId());
boolean done = boolean done =
taskDetails.stream().allMatch(v -> (v.getTaskStatus().equals(RobotTaskDetailStatusEnum.DONE.getType()) taskDetails.stream().noneMatch(v -> (v.getTaskStatus().equals(RobotTaskDetailStatusEnum.NEW.getType())));
|| v.getTaskStatus().equals(RobotTaskDetailStatusEnum.CLOSE.getType())));
if (done) { if (done) {
RobotTaskDO robotTaskDO = new RobotTaskDO(); RobotTaskDO robotTaskDO = new RobotTaskDO();
robotTaskDO.setId(taskDetails.get(0).getRobotTaskId()); robotTaskDO.setId(taskDetails.get(0).getRobotTaskId());

View File

@ -8,10 +8,12 @@ public class RobotExecutionStateConstant {
public static Integer UN_DO = 0; public static Integer UN_DO = 0;
//正在做 //正在做
public static Integer DOING = 1; public static Integer DOING = 1;
//完成 //暂停
public static Integer DONE = 2; public static Integer STOP = 2;
//已取消 //已取消
public static Integer CLOSE = 3; public static Integer CLOSE = 3;
//已失败异常 //已失败异常
public static Integer FAIL = 4; public static Integer FAIL = 4;
//已完成
public static Integer DONE = 5;
} }

View File

@ -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.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; 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.api.robot.dto.RobotStatusDTO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.*; import cn.iocoder.yudao.module.system.controller.admin.robot.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO;

View File

@ -11,7 +11,8 @@ import lombok.Getter;
public enum RobotWarnType { public enum RobotWarnType {
ROBOT_WARN(1),//告警 ROBOT_WARN(1),//告警
USER_OPERATE(2);//用户操作 USER_OPERATE(2),//用户操作
PATH(3);//路径规划
/** /**
* 类型 * 类型
*/ */

View File

@ -46,9 +46,9 @@ public class HouseLocationStrategyImpl implements NodeProcessingStrategy {
int max = wareHouseLocationDOS.stream().map(WareHouseLocationDO::getLocationNo).filter(StrUtil::isNotEmpty) int max = wareHouseLocationDOS.stream().map(WareHouseLocationDO::getLocationNo).filter(StrUtil::isNotEmpty)
.mapToInt(s -> Integer.parseInt(s.substring(s.length() - 1))).max().orElse(1); .mapToInt(s -> Integer.parseInt(s.substring(s.length() - 1))).max().orElse(1);
int locationStorey = wareHouseLocationDOS.size(); int locationStorey = wareHouseLocationDOS.size();
Long locationNumber = 0l; Long locationNumber = null;
if (ObjectUtil.isNotEmpty(nodeBaseDTOS)) { if (ObjectUtil.isNotEmpty(item.getLocationNumber())) {
locationNumber = nodeBaseDTOS.get(0).getLocationNumber(); locationNumber = item.getLocationNumber();
} }
for (WareHouseLocationDO wareHouseLocationDO : wareHouseLocationDOS) { for (WareHouseLocationDO wareHouseLocationDO : wareHouseLocationDOS) {
wareHouseLocationDO.setLocationX(item.getLocationX()); wareHouseLocationDO.setLocationX(item.getLocationX());
@ -65,7 +65,7 @@ public class HouseLocationStrategyImpl implements NodeProcessingStrategy {
} }
wareHouseLocationDO.setMapId(positionMapId); wareHouseLocationDO.setMapId(positionMapId);
wareHouseLocationDO.setMapItemId(item.getId()); wareHouseLocationDO.setMapItemId(item.getId());
if (ObjectUtil.isNotEmpty(locationNumber)) { if (ObjectUtil.isNotEmpty(locationNumber) && ObjectUtil.isEmpty(wareHouseLocationDO.getLocationNumber())) {
wareHouseLocationDO.setLocationNumber(locationNumber); wareHouseLocationDO.setLocationNumber(locationNumber);
locationNumber = locationNumber - 10; locationNumber = locationNumber - 10;
} }

View File

@ -55,4 +55,10 @@ public interface RobotWarnMsgService extends IService<RobotWarnMsgDO> {
PageResult<RobotWarnMsgDO> getWarnMsgPage(RobotWarnMsgPageReqVO pageReqVO); PageResult<RobotWarnMsgDO> getWarnMsgPage(RobotWarnMsgPageReqVO pageReqVO);
void sendWarnMsgToWebsocket(Object errorMsg); void sendWarnMsgToWebsocket(Object errorMsg);
/**
* 添加告警信息
* @param message
*/
void addWarnMsg(String message);
} }

View File

@ -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.dataobject.robot.RobotWarnMsgDO;
import cn.iocoder.yudao.module.system.dal.mysql.positionmap.PositionMapMapper; 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.dal.mysql.robot.RobotWarnMsgMapper;
import cn.iocoder.yudao.module.system.enums.robot.RobotWarnType;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -20,6 +21,7 @@ import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List; import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@ -99,4 +101,16 @@ public class RobotWarnMsgServiceImpl extends ServiceImpl<RobotWarnMsgMapper, Rob
} }
} }
@Override
public void addWarnMsg(String message) {
RobotWarnMsgDO warnMsg = RobotWarnMsgDO.builder().warnLevel(4)
.warnCode("PP")
.robotNo("")
.warnType(RobotWarnType.PATH.getType())
.warnMsg(message)
.warnSolve(message)
.build();
warnMsgMapper.insert(warnMsg);
}
} }

View File

@ -405,12 +405,8 @@
<if test="groupName != null and groupName != ''"> <if test="groupName != null and groupName != ''">
group_name = #{groupName}, group_name = #{groupName},
</if> </if>
<if test="skuInfo != null and skuInfo != ''">
sku_info = #{skuInfo}, sku_info = #{skuInfo},
</if>
<if test="skuBatch != null and skuBatch != ''">
sku_batch = #{skuBatch}, sku_batch = #{skuBatch},
</if>
<if test="skuNumber != null"> <if test="skuNumber != null">
sku_number = #{skuNumber}, sku_number = #{skuNumber},
</if> </if>

View File

@ -259,7 +259,8 @@
t1.robot_no AS robotNo, t1.robot_no AS robotNo,
t2.robot_wide AS robotWide, t2.robot_wide AS robotWide,
t2.robot_center_headstock AS robotCenterHeadstock, t2.robot_center_headstock AS robotCenterHeadstock,
t2.robot_center_tail AS robotCenterTail t2.robot_center_tail AS robotCenterTail,
t1.mac_address as macAddress
FROM FROM
robot_information t1 robot_information t1
LEFT JOIN robot_model t2 ON t1.robot_model_id = t2.id LEFT JOIN robot_model t2 ON t1.robot_model_id = t2.id