优化任务下发的更新顺序

This commit is contained in:
cbs 2025-01-20 19:07:03 +08:00
parent 39b34faa75
commit e2f46b2978
4 changed files with 75 additions and 71 deletions

View File

@ -32,11 +32,6 @@ public interface RobotInformationMapper extends BaseMapperX<RobotInformationDO>
.orderByDesc(RobotInformationDO::getId));
}
/**
* 查询空闲的机器人
* @return
*/
List<RobotInformationDO> selectFreeRobot();
/**
* 更新机器人状态

View File

@ -169,10 +169,11 @@ public class RobotTaskServiceImpl implements RobotTaskService {
// todo 更新数据库顺序 后续改为xxl-job一致
//查找库位
List<Long> locationIds = new ArrayList<>();
if (MoveAllEnum.NO.getType().equals(createReqVO.getDoMoveAll())) {
setSingleLocationIdNo(createReqVO.getTaskDetailList(),task);
locationIds = setSingleLocationIdNo(createReqVO.getTaskDetailList(),task);
} else {
setAllLocationIdNo(createReqVO,task.getId());
locationIds = setAllLocationIdNo(createReqVO,task.getId());
}
// 插入
@ -182,6 +183,11 @@ public class RobotTaskServiceImpl implements RobotTaskService {
});
robotTaskDetailService.insertRobotDetailList(createReqVO.getTaskDetailList());
List<List<Long>> fromPartition = Lists.partition(locationIds, 100);
fromPartition.forEach(list-> {
locationMapper.updateLocationLockList(list,task.getId(),LocationLockEnum.NO.getType());
});
return RESULT;
}
@ -191,7 +197,7 @@ public class RobotTaskServiceImpl implements RobotTaskService {
* @param taskId
*/
@Transactional(rollbackFor = Exception.class)
public void setAllLocationIdNo(RobotTaskSaveReqVO createReqVO, Long taskId) {
public List<Long> setAllLocationIdNo(RobotTaskSaveReqVO createReqVO, Long taskId) {
List<RobotTaskDetailAddVO> taskDetailList = createReqVO.getTaskDetailList();
List<RobotTaskDetailAddVO> newTaskDetailList = new ArrayList<>();
@ -268,17 +274,11 @@ public class RobotTaskServiceImpl implements RobotTaskService {
}
createReqVO.setTaskDetailList(newTaskDetailList);
//跟新库位状态为锁定
List<List<Long>> toPartition = Lists.partition(toLocationIds, 100);
toPartition.forEach(list-> {
locationMapper.updateLocationLockList(list,taskId,LocationLockEnum.NO.getType());
});
List<List<Long>> fromPartition = Lists.partition(fromLocationIds, 100);
fromPartition.forEach(list-> {
locationMapper.updateLocationLockList(list,taskId,LocationLockEnum.NO.getType());
});
if (ObjectUtil.isNotEmpty(fromLocationIds)) {
toLocationIds.addAll(fromLocationIds);
}
return toLocationIds;
}
/**
@ -324,7 +324,7 @@ public class RobotTaskServiceImpl implements RobotTaskService {
* @return
*/
@Transactional(rollbackFor = Exception.class)
public void setSingleLocationIdNo(List<RobotTaskDetailAddVO> taskDetailList, RobotTaskDO task){
public List<Long> setSingleLocationIdNo(List<RobotTaskDetailAddVO> taskDetailList, RobotTaskDO task){
List<Long> locationIds = new ArrayList<>();
for (RobotTaskDetailAddVO robotTaskVo : taskDetailList) {
robotTaskVo.setRobotTaskId(task.getId());
@ -350,16 +350,17 @@ public class RobotTaskServiceImpl implements RobotTaskService {
doRelease(robotTaskVo,locationIds);
break;
case SCAN:
doScan(robotTaskVo);
doScan(robotTaskVo,locationIds);
break;
case DETECTING_TRAYS:
doDetectingTrays(robotTaskVo);
doDetectingTrays(robotTaskVo,locationIds);
break;
default :
log.error("任务类型不存在 ");
throw new RuntimeException("任务类型不存在");
}
}
return locationIds;
}
/**
@ -367,9 +368,9 @@ public class RobotTaskServiceImpl implements RobotTaskService {
* @param robotTaskVo
*/
@Transactional(rollbackFor = Exception.class)
public void doDetectingTrays(RobotTaskDetailAddVO robotTaskVo) {
public void doDetectingTrays(RobotTaskDetailAddVO robotTaskVo, List<Long> locationIds) {
setToLocation(robotTaskVo,getMapIdsByRobotNo(robotTaskVo.getRobotNo()),new ArrayList<>());
locationMapper.updateLocationLockStatus(robotTaskVo.getToLocationId(),0,robotTaskVo.getRobotTaskId());
locationIds.add(robotTaskVo.getToLocationId());
}
/**
@ -377,9 +378,9 @@ public class RobotTaskServiceImpl implements RobotTaskService {
* @param robotTaskVo
*/
@Transactional(rollbackFor = Exception.class)
public void doScan(RobotTaskDetailAddVO robotTaskVo) {
public void doScan(RobotTaskDetailAddVO robotTaskVo, List<Long> locationIds) {
setToLocation(robotTaskVo,getMapIdsByRobotNo(robotTaskVo.getRobotNo()),new ArrayList<>());
locationMapper.updateLocationLockStatus(robotTaskVo.getToLocationId(),0,robotTaskVo.getRobotTaskId());
locationIds.add(robotTaskVo.getToLocationId());
}
/**
@ -389,7 +390,6 @@ public class RobotTaskServiceImpl implements RobotTaskService {
@Transactional(rollbackFor = Exception.class)
public void doRelease(RobotTaskDetailAddVO robotTaskVo, List<Long> locationIds) {
setToLocation(robotTaskVo,getMapIdsByRobotNo(robotTaskVo.getRobotNo()),locationIds);
locationMapper.updateLocationLockStatus(robotTaskVo.getToLocationId(),0,robotTaskVo.getRobotTaskId());
locationIds.add(robotTaskVo.getToLocationId());
}
@ -539,9 +539,6 @@ public class RobotTaskServiceImpl implements RobotTaskService {
throw new RuntimeException("取货库位,存在未完成的任务 ");
}
//设置为锁定
locationMapper.updateLocationLockStatus(robotTaskVo.getToLocationId(),0,robotTaskVo.getRobotTaskId());
locationMapper.updateLocationLockStatus(robotTaskVo.getFromLocationId(),0,robotTaskVo.getRobotTaskId());
}
@Override

View File

@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.system.service.robot.job;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.module.mqtt.api.task.RobotTaskApi;
import cn.iocoder.yudao.module.mqtt.api.task.dto.Pose2ds;
@ -75,7 +76,11 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
@Transactional(rollbackFor = Exception.class)
public void distributeTasks() {
TenantContextHolder.setTenantId(1L);
List<RobotInformationDO> robots = robotInformationMapper.selectFreeRobot();
List<RobotInformationDO> robots = robotInformationMapper.selectList(new LambdaQueryWrapperX<RobotInformationDO>()
.eq(RobotInformationDO::getRobotStatus, (RobotStatusEnum.STAND_BY.getType()))
.eq(RobotInformationDO::getRobotTaskModel, RobotTaskModelEnum.NORMAL.getType())
.orderByDesc(RobotInformationDO::getUpdateTime));
if (robots.isEmpty()) {
log.info("暂无空闲的机器人");
return;
@ -132,6 +137,12 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
@Transactional(rollbackFor = Exception.class)
public void distributeTasks(List<RobotInformationDO> robots, List<RobotTaskDetailDO> taskDetailDOS) {
List<RobotAcceptTaskDTO> robotTaskDOS = new ArrayList<>();
//需要更新的任务明细id
List<RobotTaskDetailDO> updateTaskDetails = new ArrayList<>();
//需要更新的任务id
Set<Long> taskIds = new HashSet<>();
//需要更新的机器人编号
Set<String> robotNos = new HashSet<>();
for (RobotTaskDetailDO taskDetailDO : taskDetailDOS) {
if (ObjectUtil.isEmpty(robots)) {
break;
@ -140,7 +151,7 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
RobotTaskTypeEnum robotTaskType = RobotTaskTypeEnum.getRobotTaskType(taskDetailDO.getTaskType());
switch (robotTaskType) {
case TAKE_RELEASE:
doTakeReleaseDistribute(taskDetailDO, robots,robotTaskDOS);
doTakeReleaseDistribute(taskDetailDO, robots,robotTaskDOS,taskIds,updateTaskDetails,robotNos);
break;
/*case PARK:
doParkDistribute(taskDetailDO, robots,robotTaskDOS);
@ -172,6 +183,27 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
log.info("任务下发给车机 :{}", JSON.toJSONString(robotTaskDOS));
robotTaskApi.sendTaskToRobot(robotTaskDOS);
}
if (ObjectUtil.isNotEmpty(taskIds)) {
List<RobotTaskDO> taskDOS = robotTaskMapper.selectBatchIds(taskIds);
for (RobotTaskDO taskDO : taskDOS) {
if (RobotTaskStatusEnum.NEW.getType().equals(taskDO.getTaskStatus())) {
taskDO.setTaskStatus(RobotTaskStatusEnum.DOING.getType());
taskDO.setStartTime(LocalDateTime.now());
}
}
robotTaskMapper.updateBatch(taskDOS);
}
if (ObjectUtil.isNotEmpty(updateTaskDetails)) {
robotTaskDetailMapper.updateBatch(updateTaskDetails);
}
if (ObjectUtil.isNotEmpty(robotNos)) {
List<RobotInformationDO> robotInformationDOS = robotInformationMapper.selectByRobotNos(robotNos);
robotInformationDOS.stream().forEach(robotInformationDO -> {
robotInformationDO.setRobotStatus(RobotStatusEnum.DOING.getType());
});
robotInformationMapper.updateBatch(robotInformationDOS);
}
}
/**
@ -346,7 +378,8 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
*/
@Transactional(rollbackFor = Exception.class)
public void doTakeReleaseDistribute(RobotTaskDetailDO taskDetailDO, List<RobotInformationDO> robots,
List<RobotAcceptTaskDTO> robotTaskDOS) {
List<RobotAcceptTaskDTO> robotTaskDOS,Set<Long> taskIdSet,
List<RobotTaskDetailDO> updateTaskDetail, Set<String> robotNos) {
WareHouseLocationDO query = WareHouseLocationDO.builder().id(taskDetailDO.getFromLocationId()).build();
WareHouseLocationDO fromLocation = locationMapper.queryAllByLimit(query);
@ -459,26 +492,6 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
}
/*Pose2ds poseOne = new Pose2ds();
poseOne.setX(-2.097);
poseOne.setY(-0.325);
poseOne.setYaw(1.571);
Pose2ds poseTwo = new Pose2ds();
poseTwo.setX(-0.856);
poseTwo.setY(1.622);
poseTwo.setYaw(0.034);
Pose2ds poseThree = new Pose2ds();
poseThree.setX(1.955);
poseThree.setY(-0.381);
poseThree.setYaw(-1.540);
Pose2ds poseFour = new Pose2ds();
poseFour.setX(3.046);
poseFour.setY(3.219);
poseFour.setYaw(-3.141);
pose2dsNight.add(poseOne);
pose2dsNight.add(poseTwo);
pose2dsNight.add(poseThree);
pose2dsNight.add(poseFour);*/
taskNigth.setPose2ds(pose2dsNight);
//10
@ -561,7 +574,13 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
final String mac = macAddress;
robots.removeIf(v -> v.getMacAddress().equals(mac));
updateTaskStatus(robotNo,taskDetailDO);
taskDetailDO.setRobotNo(robotNo);
taskDetailDO.setStartTime(LocalDateTime.now());
taskDetailDO.setTaskStatus(RobotTaskDetailStatusEnum.DOING.getType());
updateTaskDetail.add(taskDetailDO);
robotNos.add(robotNo);
taskIdSet.add(taskDetailDO.getRobotTaskId());
}
private Pair<String, String> getMadAddressRobotNo(RobotTaskDetailDO taskDetailDO, List<RobotInformationDO> robots,
@ -576,7 +595,9 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
.orElse("");
} else {
RobotInformationDO robotInformationDO = robots.stream()
.filter(v -> v.getFloorAreaJson().contains(fromLocation.getAreaId())
.filter(v ->
ObjectUtil.isNotEmpty(v.getMacAddress())
&& v.getFloorAreaJson().contains(fromLocation.getAreaId())
&& v.getFloorAreaJson().contains(toLocation.getAreaId()))
.findFirst()
.orElse(new RobotInformationDO());
@ -589,18 +610,20 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
@Transactional(rollbackFor = Exception.class)
public void updateTaskStatus(String robotNo, RobotTaskDetailDO taskDetailDO) {
robotInformationMapper.updateRobotStatus(robotNo, RobotStatusEnum.DOING.getType());
RobotTaskDetailDO detailDO = new RobotTaskDetailDO();
detailDO.setId(taskDetailDO.getId());
detailDO.setStartTime(LocalDateTime.now());
detailDO.setTaskStatus(RobotTaskDetailStatusEnum.DOING.getType());
robotTaskDetailMapper.updateRobotDetailById(detailDO);
RobotTaskDO robotTaskDO = new RobotTaskDO();
robotTaskDO.setId(taskDetailDO.getRobotTaskId());
robotTaskDO.setStartTime(LocalDateTime.now());
robotTaskDO.setTaskStatus(RobotTaskDetailStatusEnum.DOING.getType());
robotTaskMapper.updateRobot(robotTaskDO);
RobotTaskDetailDO detailDO = new RobotTaskDetailDO();
detailDO.setId(taskDetailDO.getId());
detailDO.setStartTime(LocalDateTime.now());
detailDO.setTaskStatus(RobotTaskDetailStatusEnum.DOING.getType());
robotTaskDetailMapper.updateRobotDetailById(detailDO);
robotInformationMapper.updateRobotStatus(robotNo, RobotStatusEnum.DOING.getType());
}

View File

@ -271,17 +271,6 @@
where id = #{id}
</delete>
<select id="selectFreeRobot" resultMap="BaseResultMap">
select
<include refid="base_sql"></include>
from
robot_information
where
robot_task_model = '1'
and deleted = '0'
and robot_status = '3'
order by update_time asc
</select>
<select id="statisticsInformation"
resultType="cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotInformationStatisticsVO">