任务日志添加原始执行车辆编号

This commit is contained in:
cbs 2025-05-29 11:44:13 +08:00
parent febd063152
commit e8419a002f
16 changed files with 119 additions and 32 deletions

View File

@ -16,6 +16,8 @@ public class RobotStatusDataPoseDTO {
public String floor;
//区域
public String area;
//货叉高度
public Double forkHeight;
//电池剩余容量 废弃 从ROBOT_INFORMATION_SOC 获取电量
// public String batSoc;
}

View File

@ -224,6 +224,7 @@ public interface ErrorCodeConstants {
ErrorCode TASK_CREATE_FAIL = new ErrorCode(1-002-035-110, "任务创建失败:");
ErrorCode ROBOT_DO_TASK_FAIL = new ErrorCode(1-002-035-112, "车机反馈不能接任务");
ErrorCode TASK_COMMONG_FAIL = new ErrorCode(1-002-035-113, "下发失败");
ErrorCode TASK_ASSIGN_OTHER_ROBOT = new ErrorCode(1-002-035-114, "此任务已经转移给其他车辆");
// ========== 机器人任务明细 1-002-036-000 ==========
ErrorCode TASK_DETAIL_NOT_EXISTS = new ErrorCode(1-002-036-001, "车辆任务明细不存在");

View File

@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.mqtt.api.common.CommonApi;
import cn.iocoder.yudao.module.system.api.robot.dto.*;
import cn.iocoder.yudao.module.system.api.robot.processor.RequestProcessor;
import cn.iocoder.yudao.module.system.api.robot.vo.RobotInformationVO;
import cn.iocoder.yudao.module.system.api.robot.vo.RobotReactiveStatusDTO;
import cn.iocoder.yudao.module.system.config.ratelimiter.SystemRateLimiter;
import cn.iocoder.yudao.module.system.constant.area.FloorAreaConstant;
import cn.iocoder.yudao.module.system.constant.path.PathPlanningTopicConstant;
@ -87,6 +88,14 @@ public class RobotStatusApiImpl implements RobotStatusApi {
robotStatusDataPoseDTO.setRobotNo(robotNo);
robotStatusDataPoseDTO.setFloor(floorZoneDTO.getFloor());
robotStatusDataPoseDTO.setArea(floorZoneDTO.getArea());
String speedKey = RobotTaskChcheConstant.ROBOT_SPEED_FORK_HEIGHT + robotNo;
Object speedObject = redisUtil.get(speedKey);
if (ObjectUtil.isNotEmpty(speedObject)) {
RobotReactiveStatusDTO data = JSON.parseObject(speedObject.toString(), RobotReactiveStatusDTO.class);
robotStatusDataPoseDTO.setForkHeight(data.getForkHeight());
}
redisUtil.set(pose2dKey, JSON.toJSONString(robotStatusDataPoseDTO), robotPositionCacheTime);
//机器人身上是否有货

View File

@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.system.api.robot.dto.RobotCommandStateDTO;
import cn.iocoder.yudao.module.system.api.robot.dto.RobotCompleteTaskDTO;
import cn.iocoder.yudao.module.system.api.robot.vo.RobotSkuInfoDTO;
import cn.iocoder.yudao.module.system.constant.CommonConstant;
import cn.iocoder.yudao.module.system.constant.path.PathPlanningChcheConstant;
import cn.iocoder.yudao.module.system.constant.path.PathPlanningTopicConstant;
import cn.iocoder.yudao.module.system.constant.robot.RobotExecutionStateConstant;
import cn.iocoder.yudao.module.system.constant.robot.RobotTaskChcheConstant;
@ -111,6 +112,9 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
@Value("${zn.robot_doing_action.doing_action_cache_time:2*24*60*60}")
private Long doingActionCacheTime;
@Value("${zn.is_simulation:false}")
private Boolean isSimulation;
@Transactional(rollbackFor = Exception.class)
public void doRobotDoneTask(RobotCompleteTaskDTO robotCompleteTaskDTO) {
log.info("机器人完成任务上报 :{}", JSON.toJSONString(robotCompleteTaskDTO));
@ -492,6 +496,11 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
//同步任务完成给PP
pathPlanningService.updateBehavior(String.valueOf(robotCompleteTaskDTO.getOrderId()), robotTaskDetailDO.getRobotNo()
, "", PathIsReachEnum.END_WORK.getType());
if (!isSimulation) {
String plantingKey = PathPlanningChcheConstant.PATH_PLANNING_TASK + robotCompleteTaskDTO.getOrderId();
redisUtil.del(plantingKey);
}
}
@ -579,6 +588,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
String robotNo = robotInformationService.getRobotNoByMac(robotCompleteTaskDTO.getMac());
logOne.setRobotNo(robotNo);
logOne.setOriginalRobotNo(robotNo);
logOne.setTaskDetailId(robotCompleteTaskDTO.getOrderId());
logOne.setTaskStage(robotTaskDetailDO.getTaskStage());
logOne.setCommandType(PathTaskTypeEnum.getTaskType(robotTaskDetailDO.getTaskType()));

View File

@ -57,4 +57,6 @@ public class RobotTaskDetailActionLogPageReqVO extends PageParam {
@Schema(description = "是否已经统计(0:未统计、1已经统计)")
private Integer alreadyCounted;
@Schema(description = "这条任务第一次执行的AGV编号")
private String originalRobotNo;
}

View File

@ -69,4 +69,7 @@ public class RobotTaskDetailActionLogRespVO {
@ExcelProperty("是否已经统计(0:未统计、1已经统计)")
private Integer alreadyCounted;
@Schema(description = "这条任务第一次执行的AGV编号")
@ExcelProperty("这条任务第一次执行的AGV编号")
private String originalRobotNo;
}

View File

@ -52,4 +52,7 @@ public class RobotTaskDetailActionLogSaveReqVO {
@Schema(description = "是否已经统计(0:未统计、1已经统计)")
private Integer alreadyCounted;
@Schema(description = "这条任务第一次执行的AGV编号")
private String originalRobotNo;
}

View File

@ -87,5 +87,9 @@ public class RobotTaskDetailActionLogDO extends BaseDO {
* 时长,单位分钟
*/
private Long duration;
/**
* 这条任务第一次执行的AGV编号
*/
private String originalRobotNo;
}

View File

@ -1,4 +1,4 @@
package cn.iocoder.yudao.module.system.api.robot.schedul;
package cn.iocoder.yudao.module.system.schedul;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
@ -7,7 +7,6 @@ import cn.iocoder.yudao.module.system.api.robot.vo.RobotInformationVO;
import cn.iocoder.yudao.module.system.constant.area.FloorAreaConstant;
import cn.iocoder.yudao.module.system.constant.robot.RobotTaskChcheConstant;
import cn.iocoder.yudao.module.system.constant.webSocket.WebSocketConstant;
import cn.iocoder.yudao.module.system.controller.admin.robot.task.TaskAssignDTO;
import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapDO;
import cn.iocoder.yudao.module.system.service.positionmap.PositionMapService;
import cn.iocoder.yudao.module.system.util.redis.RedisUtil;

View File

@ -60,7 +60,7 @@ public interface RobotTaskDetailActionLogService {
RobotTaskDetailActionLogDO setPreviousTaskDoneByOrderId(Long orderId);
/**
* 获取车辆的最后一条任务
* 获取车辆的最后一条任务(限处理中的任务使用)
* @param robotNo
* @return
*/
@ -84,4 +84,10 @@ public interface RobotTaskDetailActionLogService {
*/
List<RobotTaskDetailActionLogDO> getUnStatisticsDurationLog();
/**
* 获取这台车最后一次执行的任务(查真实的分配记录)
* @param robotNo
* @return
*/
RobotTaskDetailActionLogDO getOriginalLastTaskByRobotNo(String robotNo);
}

View File

@ -2,19 +2,12 @@ package cn.iocoder.yudao.module.system.service.log;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.constant.robot.RobotTaskChcheConstant;
import cn.iocoder.yudao.module.system.controller.admin.log.vo.RobotTaskDetailActionLogPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.log.vo.RobotTaskDetailActionLogSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.log.RobotTaskDetailActionLogDO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotChargeLogDO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDetailDO;
import cn.iocoder.yudao.module.system.dal.mysql.log.RobotTaskDetailActionLogMapper;
import cn.iocoder.yudao.module.system.enums.robot.RobotTaskStatusEnum;
import cn.iocoder.yudao.module.system.enums.robot.actionlog.ActionStatusEnum;
import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
import com.alibaba.fastjson.JSON;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import cn.iocoder.yudao.module.system.enums.robot.actionlog.CommandIdEnum;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@ -134,4 +127,18 @@ public class RobotTaskDetailActionLogServiceImpl implements RobotTaskDetailActio
return taskDetailActionLogMapper.getUnStatisticsDurationLog();
}
/**
* 查这台车最后一次分配的任务
* @param robotNo
* @return
*/
@Override
public RobotTaskDetailActionLogDO getOriginalLastTaskByRobotNo(String robotNo) {
return taskDetailActionLogMapper.selectOne(new LambdaQueryWrapperX<RobotTaskDetailActionLogDO>()
.eq(RobotTaskDetailActionLogDO::getOriginalRobotNo, robotNo)
.eq(RobotTaskDetailActionLogDO::getCommandId, CommandIdEnum.TASK.getType())
.orderByDesc(RobotTaskDetailActionLogDO::getCreateTime)
.last("limit 1"));
}
}

View File

@ -546,7 +546,7 @@ public class PathPlanningServiceImpl implements PathPlanningService {
}
List<PositionMapItemDO> itemDOList = new ArrayList<>();
List<PositionMapItemDO> items = positionMapItemService.getPositionMapItemByMapAndType(positionMap.getId(), PositionMapItemEnum.WAIT.getType());
List<PositionMapItemDO> items = positionMapItemService.getPositionMapItemByMapAndType(positionMap.getId(), PositionMapItemEnum.STOP.getType());
if (ObjectUtil.isEmpty(items) || items.size() < robots.size()) {
List<PositionMapItemDO> itemPoses = positionMapItemService.getPositionMapItemByMapAndType(positionMap.getId(), PositionMapItemEnum.PATH.getType());
itemDOList.addAll(itemPoses);

View File

@ -57,6 +57,8 @@ import cn.iocoder.yudao.module.system.enums.item.UseStatusEnum;
import cn.iocoder.yudao.module.system.enums.path.PathTaskTypeEnum;
import cn.iocoder.yudao.module.system.enums.path.PathTaskTypeToRobotEnum;
import cn.iocoder.yudao.module.system.enums.redis.RobotCacheLockEnum;
import cn.iocoder.yudao.module.system.enums.robot.LocationLockEnum;
import cn.iocoder.yudao.module.system.enums.robot.LocationUseStatusEnum;
import cn.iocoder.yudao.module.system.enums.robot.RobotStatusEnum;
import cn.iocoder.yudao.module.system.enums.robot.RobotTaskDetailStatusEnum;
import cn.iocoder.yudao.module.system.enums.robot.RobotTaskModelEnum;
@ -92,6 +94,7 @@ import java.util.function.Function;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception0;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
/**
@ -162,6 +165,9 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
@Value("${zn.full_electricity:95}")
private String fullElectricity;
@Value("${zn.path_planning.task_chche_time:604800}")
private Long taskChcheTime;
@Resource
private RobotCameraService cameraService;
@ -313,6 +319,7 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
/**
* 查询车辆所在的地图id
*
* @param robotNo
* @return
*/
@ -1073,10 +1080,16 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
@Transactional(rollbackFor = Exception.class)
public void doTaskContinue(String robotNo) {
RobotTaskDetailActionLogDO actionLog = taskDetailActionLogService.getLastTaskByRobotNo(robotNo,CommandIdEnum.TASK.getType());
RobotTaskDetailActionLogDO actionLog = taskDetailActionLogService.getOriginalLastTaskByRobotNo(robotNo);
if (ObjectUtil.isEmpty(actionLog)) {
throw exception(ROBOT_LAST_TASK_NO_EXISTS);
}
if (!actionLog.getRobotNo().equals(actionLog.getOriginalRobotNo())) {
throw exception0(TASK_ASSIGN_OTHER_ROBOT.getCode(), TASK_ASSIGN_OTHER_ROBOT.getMsg() + actionLog.getRobotNo(),
TASK_ASSIGN_OTHER_ROBOT.getMsg() + actionLog.getRobotNo());
}
String mac = getMacByRobotNo(robotNo);
robotCloseTaskDetail(actionLog.getTaskDetailId() + "", mac, actionLog.getCommandType());
@ -1158,6 +1171,10 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
List<TaskToPathPlanningDTO> pathPlanningList = new ArrayList<>();
pathPlanningList.add(pathPlanning);
String plantingKey = PathPlanningChcheConstant.PATH_PLANNING_TASK + pathPlanning.getOrderId();
redisUtil.set(plantingKey, JSON.toJSONString(pathPlanning), taskChcheTime);
log.info("任务下发给PP :{}", JSON.toJSONString(pathPlanningList));
commonApi.commonMethod(pathPlanningList, PathPlanningTopicConstant.TASK_ASSIGNMENT_REQUEST);
}
@ -1175,7 +1192,8 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
takeTask(pathPlanning, isRemote);
} else if (PathTaskTypeEnum.RELEASE.getType().equals(actionLog.getCommandType())) {
releaseTask(pathPlanning);
} else if (PathTaskTypeEnum.MOVE.getType().equals(actionLog.getCommandType())) {
} else if (PathTaskTypeEnum.MOVE.getType().equals(actionLog.getCommandType())
|| PathTaskTypeEnum.MOVE_TO_POINT.getType().equals(actionLog.getCommandType())) {
}
}
@ -1214,11 +1232,14 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
* @param pathPlanning
*/
private void takeReleaseTask(TaskToPathPlanningDTO pathPlanning, Boolean isRemote) {
RobotTaskDetailDO robotTaskDetail = checkTaskDone(pathPlanning.getOrderId());
if (!RobotTaskStageEnum.TAKEING.getType().equals(robotTaskDetail.getTaskStage())
&& !RobotTaskStageEnum.GO_TAKE.getType().equals(robotTaskDetail.getTaskStage())
&& !RobotTaskStageEnum.UN_START.getType().equals(robotTaskDetail.getTaskStage())) {
//只要放货
String robotNo = pathPlanning.getRobotNoLimitationAreaDTOS().get(0).getRobotNo();
String mac = getMacByRobotNo(robotNo);
String cargoDetectedKey = RobotTaskChcheConstant.ROBOT_CARGO_DETECTED + mac;
Object cargoDetected = redisUtil.get(cargoDetectedKey);
if (ObjectUtil.isNotEmpty(cargoDetected) && RobotStatusCodeConstant.CARGO_DETECTED.equals(Boolean.parseBoolean(String.valueOf(cargoDetected)))) {
//说明取货完成
pathPlanning.setTakeLevel(null);
pathPlanning.setTakeGroupId(null);
pathPlanning.setTakeLocationNumber(null);
@ -1226,7 +1247,15 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
pathPlanning.setTakeOffsetHeight(null);
pathPlanning.setTakeOffsetHeight(null);
pathPlanning.setTaskType(PathTaskTypeToRobotEnum.DROP_OFF_GOODS.getType());
} else {
WareHouseLocationDO wareHouseLocation = wareHouseLocationMapper.selectById(robotTaskDetail.getFromLocationId());
if (wareHouseLocation.getTaskId().equals(robotTaskDetail.getTakeId()) && LocationLockEnum.NO.getType().equals(wareHouseLocation.getLocationLock())) {
wareHouseLocation.setSkuInfo(null);
wareHouseLocation.setSkuNumber(0L);
wareHouseLocation.setLocationLock(LocationLockEnum.YES.getType());
wareHouseLocation.setLocationUseStatus(LocationUseStatusEnum.NO.getType());
wareHouseLocationMapper.updateById(wareHouseLocation);
}
}else {
takeCheck(robotTaskDetail.getFromLocationId(), robotTaskDetail.getRobotTaskId(), isRemote);
}
releaseCheck(robotTaskDetail.getToLocationId(), robotTaskDetail.getRobotTaskId());
@ -1511,14 +1540,15 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
@Override
@Transactional(rollbackFor = Exception.class)
public void rmoteTransferTaskToNewFreeRobo(String oldRobotNo, Long id, String robotNo) {
RobotTaskDetailActionLogDO actionLog = taskDetailActionLogService.getLastTaskByRobotNo(robotNo,CommandIdEnum.TASK.getType());
RobotTaskDetailActionLogDO actionLog = taskDetailActionLogService.getOriginalLastTaskByRobotNo(oldRobotNo);
if (ObjectUtil.isEmpty(actionLog)) {
log.info("车辆前一个任务不存在或已经完成");
throw exception(ROBOT_LAST_TASK_NO_EXISTS);
}
if (!actionLog.getTaskDetailId().equals(id)) {
log.info("车辆最新的任务id是 {}, 车辆的前一个任务是 :{}", id, actionLog.getTaskDetailId());
throw exception(ROBOT_LAST_TASK_NO_EXISTS);
if (!oldRobotNo.equals(actionLog.getRobotNo())) {
log.info("此任务已经被转移到车辆 :{}", actionLog.getRobotNo());
throw exception0(TASK_ASSIGN_OTHER_ROBOT.getCode(), TASK_ASSIGN_OTHER_ROBOT.getMsg() + actionLog.getRobotNo(),
TASK_ASSIGN_OTHER_ROBOT.getMsg() + actionLog.getRobotNo());
}
if (ActionStatusEnum.DONE.getType().equals(actionLog.getActionStatus())) {
@ -1562,6 +1592,9 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
resendToPPData(pathPlanning, actionLog, robotInformationDO, true);
String plantingKey = PathPlanningChcheConstant.PATH_PLANNING_TASK + pathPlanning.getOrderId();
redisUtil.set(plantingKey, JSON.toJSONString(pathPlanning), taskChcheTime);
List<TaskToPathPlanningDTO> pathPlanningList = new ArrayList<>();
pathPlanningList.add(pathPlanning);
log.info("远遥任务转移, 任务下发给PP :{}", JSON.toJSONString(pathPlanningList));

View File

@ -585,6 +585,7 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper, RobotTask
String actionMsg = taskAssignDTO.getRobotActionMsg() + robotTaskDO.getTaskNo();
logOne.setActionMsg(actionMsg);
logOne.setRobotNo(taskAssignDTO.getRobotNo());
logOne.setOriginalRobotNo(taskAssignDTO.getRobotNo());
logOne.setStartTime(LocalDateTime.now());
logOne.setTaskNo(robotTaskDO.getTaskNo());
logOne.setCommandId(-1L);

View File

@ -177,13 +177,26 @@ public class RobotWarnMsgServiceImpl extends ServiceImpl<RobotWarnMsgMapper, Rob
@Override
public Map<String, List<RobotWarnMsgClassificationDTO>> robotWarnMsgClassification(String type) {
if (TimeTypeEnum.WEEK.getType().equals(type)) {
List<RobotWarnMsgClassificationDTO> data = warnMsgMapper.getRobotWarnMsgClassification(type);
if (ObjectUtil.isEmpty(data)) {
return null;
}
return data.stream().collect(Collectors.groupingBy(RobotWarnMsgClassificationDTO::getWarnTime));
Map<String, List<RobotWarnMsgClassificationDTO>> map =
data.stream().collect(Collectors.groupingBy(RobotWarnMsgClassificationDTO::getWarnTime));
Calendar now = Calendar.getInstance();
now.setTime(new Date());
for (int i = 0; i < 7; i++) {
String timeStr = DateUtils.getYYYMMDD(now.getTime());
if (!map.containsKey(timeStr)) {
map.put(timeStr,new ArrayList<>());
}
now.set(Calendar.DATE, now.get(Calendar.DATE) - 1);
}
return map;
}
//季度是90天分成10份是9. getMonthData已经扣了1所以是8
@ -198,7 +211,7 @@ public class RobotWarnMsgServiceImpl extends ServiceImpl<RobotWarnMsgMapper, Rob
/**
* 按月查询
*
* @param data
* @param day
* @return
*/
private LinkedHashMap<String, List<RobotWarnMsgClassificationDTO>> getMonthData(int day) {

View File

@ -55,12 +55,6 @@
<when test="type == 1">
AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) &lt;= date(create_time)
</when>
<when test="type == 2">
AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) &lt;= date(create_time)
</when>
<when test="type == 3">
AND DATE_SUB(CURDATE(), INTERVAL 90 DAY) &lt;= date(create_time)
</when>
</choose>
</where>
GROUP BY warnTime ,warn_level