告警信息

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 = "中心到车尾距离(单位米)")
private Double robotCenterTail;
@Schema(description = "mac地址")
private String macAddress;
}

View File

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

View File

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

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")
@Operation(summary = "路径规划需要初始化信息")
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==========
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.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);
}
}

View File

@ -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) {

View File

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

View File

@ -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<RobotTaskDetailDO> 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());

View File

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

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.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;

View File

@ -11,7 +11,8 @@ import lombok.Getter;
public enum RobotWarnType {
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)
.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;
}

View File

@ -55,4 +55,10 @@ public interface RobotWarnMsgService extends IService<RobotWarnMsgDO> {
PageResult<RobotWarnMsgDO> getWarnMsgPage(RobotWarnMsgPageReqVO pageReqVO);
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.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<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 != ''">
group_name = #{groupName},
</if>
<if test="skuInfo != null and skuInfo != ''">
sku_info = #{skuInfo},
</if>
<if test="skuBatch != null and skuBatch != ''">
sku_batch = #{skuBatch},
</if>
<if test="skuNumber != null">
sku_number = #{skuNumber},
</if>

View File

@ -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