优化任务下发的更新顺序

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)); .orderByDesc(RobotInformationDO::getId));
} }
/**
* 查询空闲的机器人
* @return
*/
List<RobotInformationDO> selectFreeRobot();
/** /**
* 更新机器人状态 * 更新机器人状态

View File

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

View File

@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.system.service.robot.job; package cn.iocoder.yudao.module.system.service.robot.job;
import cn.hutool.core.util.ObjectUtil; 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.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.module.mqtt.api.task.RobotTaskApi; import cn.iocoder.yudao.module.mqtt.api.task.RobotTaskApi;
import cn.iocoder.yudao.module.mqtt.api.task.dto.Pose2ds; import cn.iocoder.yudao.module.mqtt.api.task.dto.Pose2ds;
@ -75,7 +76,11 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void distributeTasks() { public void distributeTasks() {
TenantContextHolder.setTenantId(1L); 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()) { if (robots.isEmpty()) {
log.info("暂无空闲的机器人"); log.info("暂无空闲的机器人");
return; return;
@ -132,6 +137,12 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void distributeTasks(List<RobotInformationDO> robots, List<RobotTaskDetailDO> taskDetailDOS) { public void distributeTasks(List<RobotInformationDO> robots, List<RobotTaskDetailDO> taskDetailDOS) {
List<RobotAcceptTaskDTO> robotTaskDOS = new ArrayList<>(); 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) { for (RobotTaskDetailDO taskDetailDO : taskDetailDOS) {
if (ObjectUtil.isEmpty(robots)) { if (ObjectUtil.isEmpty(robots)) {
break; break;
@ -140,7 +151,7 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
RobotTaskTypeEnum robotTaskType = RobotTaskTypeEnum.getRobotTaskType(taskDetailDO.getTaskType()); RobotTaskTypeEnum robotTaskType = RobotTaskTypeEnum.getRobotTaskType(taskDetailDO.getTaskType());
switch (robotTaskType) { switch (robotTaskType) {
case TAKE_RELEASE: case TAKE_RELEASE:
doTakeReleaseDistribute(taskDetailDO, robots,robotTaskDOS); doTakeReleaseDistribute(taskDetailDO, robots,robotTaskDOS,taskIds,updateTaskDetails,robotNos);
break; break;
/*case PARK: /*case PARK:
doParkDistribute(taskDetailDO, robots,robotTaskDOS); doParkDistribute(taskDetailDO, robots,robotTaskDOS);
@ -172,6 +183,27 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
log.info("任务下发给车机 :{}", JSON.toJSONString(robotTaskDOS)); log.info("任务下发给车机 :{}", JSON.toJSONString(robotTaskDOS));
robotTaskApi.sendTaskToRobot(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) @Transactional(rollbackFor = Exception.class)
public void doTakeReleaseDistribute(RobotTaskDetailDO taskDetailDO, List<RobotInformationDO> robots, 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 query = WareHouseLocationDO.builder().id(taskDetailDO.getFromLocationId()).build();
WareHouseLocationDO fromLocation = locationMapper.queryAllByLimit(query); 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); taskNigth.setPose2ds(pose2dsNight);
//10 //10
@ -561,7 +574,13 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
final String mac = macAddress; final String mac = macAddress;
robots.removeIf(v -> v.getMacAddress().equals(mac)); 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, private Pair<String, String> getMadAddressRobotNo(RobotTaskDetailDO taskDetailDO, List<RobotInformationDO> robots,
@ -576,7 +595,9 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
.orElse(""); .orElse("");
} else { } else {
RobotInformationDO robotInformationDO = robots.stream() 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())) && v.getFloorAreaJson().contains(toLocation.getAreaId()))
.findFirst() .findFirst()
.orElse(new RobotInformationDO()); .orElse(new RobotInformationDO());
@ -589,18 +610,20 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void updateTaskStatus(String robotNo, RobotTaskDetailDO taskDetailDO) { 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 robotTaskDO = new RobotTaskDO();
robotTaskDO.setId(taskDetailDO.getRobotTaskId()); robotTaskDO.setId(taskDetailDO.getRobotTaskId());
robotTaskDO.setStartTime(LocalDateTime.now()); robotTaskDO.setStartTime(LocalDateTime.now());
robotTaskDO.setTaskStatus(RobotTaskDetailStatusEnum.DOING.getType()); robotTaskDO.setTaskStatus(RobotTaskDetailStatusEnum.DOING.getType());
robotTaskMapper.updateRobot(robotTaskDO); 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} where id = #{id}
</delete> </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" <select id="statisticsInformation"
resultType="cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotInformationStatisticsVO"> resultType="cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotInformationStatisticsVO">