优化任务下发的更新顺序
This commit is contained in:
parent
39b34faa75
commit
e2f46b2978
@ -32,11 +32,6 @@ public interface RobotInformationMapper extends BaseMapperX<RobotInformationDO>
|
||||
.orderByDesc(RobotInformationDO::getId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询空闲的机器人
|
||||
* @return
|
||||
*/
|
||||
List<RobotInformationDO> selectFreeRobot();
|
||||
|
||||
/**
|
||||
* 更新机器人状态
|
||||
|
@ -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
|
||||
|
@ -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());
|
||||
}
|
||||
|
||||
|
||||
|
@ -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">
|
||||
|
Loading…
Reference in New Issue
Block a user