机器人充电任务优化

This commit is contained in:
cbs 2025-03-18 14:38:07 +08:00
parent 981a8fdb56
commit ee3631b559
8 changed files with 140 additions and 37 deletions

View File

@ -109,4 +109,10 @@ public interface RobotTaskDetailMapper extends BaseMapperX<RobotTaskDetailDO> {
* @return
*/
List<RobotTaskDetailDO> getLastTaskGroupByRobotNo();
/**
* 设置状态为完成
* @param ids
*/
void updateDoneByIds(@Param("ids") List<Long> ids);
}

View File

@ -73,4 +73,10 @@ public interface RobotTaskMapper extends BaseMapperX<RobotTaskDO> {
*/
IPage<RobotTaskDetailLogResoVO> selectLogPageList(@Param("mpPage") IPage mpPage,
@Param("pageReqVO") RobotTaskDetailLogVO pageReqVO);
/**
* 更新任务完成
* @param ids
*/
void updateDoneByIds(@Param("ids") List<Long> ids);
}

View File

@ -219,7 +219,7 @@ public class AutoChargeServiceImpl implements AutoChargeService {
}
if (ObjectUtil.isNotEmpty(detailMap) && detailMap.containsKey(robot.getRobotNo())
&& ObjectUtil.isEmpty(robot.getAutoCharge()) && ObjectUtil.isNotEmpty(chargeConfig.getStartAutoCharge())) {
&& ObjectUtil.isNotEmpty(chargeConfig.getStartAutoCharge())) {
//任务充电
BigDecimal robotConfigElectricity = new BigDecimal(String.valueOf(chargeConfig.getStartAutoCharge()));
if (robotRemainingElectricity.compareTo(robotConfigElectricity) < 0) {
@ -234,7 +234,7 @@ public class AutoChargeServiceImpl implements AutoChargeService {
}
if (ObjectUtil.isNotEmpty(detailMap) && detailMap.containsKey(robot.getRobotNo())
&& ObjectUtil.isEmpty(robot.getAutoCharge()) && ObjectUtil.isNotEmpty(chargeConfig.getChanceChargeStart())) {
&& ObjectUtil.isNotEmpty(chargeConfig.getChanceChargeStart())) {
//任务充电
BigDecimal robotConfigElectricity = new BigDecimal(String.valueOf(chargeConfig.getChanceChargeStart()));
if (robotRemainingElectricity.compareTo(robotConfigElectricity) < 0) {

View File

@ -97,9 +97,11 @@ public class CycleServiceImpl implements CycleService {
List<RobotTaskDetailDO> taskDetailDOS = getTaskDetailData(taskData,taskIdMap,v.getId());
taskDOList.add(taskData);
taskDetailList.addAll(taskDetailDOS);
v.setRemainingCycleNumber(0l);
}
taskMapper.insertBatch(taskDOList);
taskMapper.updateBatch(taskList);
taskDetailMapper.insertBatch(taskDetailList);
List<Long> fromLocationIds = taskDetailList.stream().map(RobotTaskDetailDO::getFromLocationId).collect(Collectors.toList());

View File

@ -98,6 +98,8 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
lastTaskDetailMap = lastTaskDetails.stream().collect(Collectors.toMap(v -> v.getRobotNo(), Function.identity()));
}
CommonConfigVO chargeConfig = JSONUtil.toBean(commonConfigDO.getConfigStr(), CommonConfigVO.class);
for (RobotInformationDO robot : robots) {
String taskStatusKey = RobotTaskChcheConstant.ROBOT_TASK_STATUS + robot.getMacAddress();
String cargoDetectedKey = RobotTaskChcheConstant.ROBOT_CARGO_DETECTED + robot.getMacAddress();
@ -114,6 +116,19 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
continue;
}
if (ObjectUtil.isNotEmpty(chargeConfig) && ObjectUtil.isNotEmpty(chargeConfig.getStartAutoCharge())) {
String pose2dKey = RobotTaskChcheConstant.ROBOT_INFORMATION_POSE_BAT_SOC + robot.getMacAddress();
Object poseCache = redisUtil.get(pose2dKey);
RobotStatusDataPoseDTO dataPoseDTO = JSON.parseObject((String) poseCache, RobotStatusDataPoseDTO.class);
BigDecimal robotRemainingElectricity = new BigDecimal(dataPoseDTO.getBatSoc());
BigDecimal robotEndElectricity = new BigDecimal(chargeConfig.getStartAutoCharge()+"");
if (robotRemainingElectricity.compareTo(robotEndElectricity) < 0) {
robot.setRobotStatus(RobotStatusEnum.DOING.getType());
log.info("机器人的电量少于自动充电电量,不能接任务 :{}",robot.getRobotNo());
continue;
}
}
if (ObjectUtil.isEmpty(cargoDetected) || RobotStatusCodeConstant.CARGO_DETECTED.equals(Boolean.parseBoolean(String.valueOf(cargoDetected)))) {
robot.setRobotStatus(RobotStatusEnum.DOING.getType());
log.info("车机上报传感器被按下--不允许接任务 :{}",robot.getRobotNo());

View File

@ -23,6 +23,7 @@ import cn.iocoder.yudao.module.system.dal.mysql.houselocation.WareHouseLocationM
import cn.iocoder.yudao.module.system.dal.mysql.positionmap.PositionMapItemMapper;
import cn.iocoder.yudao.module.system.dal.mysql.positionmap.PositionMapMapper;
import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotTaskDetailMapper;
import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotTaskMapper;
import cn.iocoder.yudao.module.system.dal.mysql.wait.MoveToWaitMapper;
import cn.iocoder.yudao.module.system.enums.common.ZeroOneEnum;
import cn.iocoder.yudao.module.system.enums.item.PositionMapItemEnum;
@ -93,6 +94,9 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
@Resource
private MoveToWaitMapper moveToWaitMapper;
@Autowired
private RobotTaskMapper robotTaskMapper;
/**
* 下发任务给PP
*/
@ -117,11 +121,46 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
return;
}
//停车不锁车
taskDetailDOS = doPark(taskDetailDOS);
if (ObjectUtil.isEmpty(taskDetailDOS)) {
log.info("--不存在需要执行的任务---");
return;
}
log.info("-------查找到车子和任务------");
distributeTasksToPP(robots, taskDetailDOS);
}
/**
* 处理停车不锁车的任务
* @param taskDetailDOS
* @return
*/
private List<RobotTaskDetailDO> doPark(List<RobotTaskDetailDO> taskDetailDOS) {
List<RobotTaskDetailDO> parkList = new ArrayList<>();
List<RobotTaskDetailDO> detailList = new ArrayList<>();
for (RobotTaskDetailDO v : taskDetailDOS) {
if (RobotTaskTypeEnum.PARK.getType().equals(v.getTaskType())
&& ZeroOneEnum.ZERO.getType().equals(v.getNeedLock())) {
parkList.add(v);
}else if (!RobotTaskTypeEnum.CHARGE.getType().equals(v.getTaskType())){
detailList.add(v);
}
}
if (ObjectUtil.isNotEmpty(parkList)) {
List<Long> detailIds = parkList.stream().map(RobotTaskDetailDO::getId).collect(Collectors.toList());
List<RobotTaskDetailDO> taskDetails = robotTaskDetailMapper.selectBatchIds(detailIds);
List<Long> taskIds = taskDetails.stream().map(RobotTaskDetailDO::getRobotTaskId).collect(Collectors.toList());
robotTaskDetailMapper.updateDoneByIds(detailIds);
robotTaskMapper.updateDoneByIds(taskIds);
}
return detailList;
}
/**
* 派车辆去等待点
*
@ -252,6 +291,7 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
.priority(1l)
.createTime(LocalDateTime.now())
.taskType(PathTaskTypeToRobotEnum.MOVE.getType())
.waitIds(waitIds)
.build();
pathPlanningList.add(pathPlanning);
}
@ -348,6 +388,18 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
//前一个任务是仅取货
List<String> robotDoTake = getRobotDoTake(robots);
List<PositionMapItemDO> positionMapItems = positionMapItemMapper.selectList(new LambdaQueryWrapperX<PositionMapItemDO>()
.eq(PositionMapItemDO::getType, PositionMapItemEnum.STOP.getType())
.eq(PositionMapItemDO::getUseStatus, ZeroOneEnum.ZERO.getType()));
List<String> waitIds = null;
if (ObjectUtil.isNotEmpty(positionMapItems)) {
waitIds = positionMapItems
.stream()
.map(u -> u.getId() + "")
.collect(Collectors.toList());
}
Integer i = 0;
log.info("开始组装需要下发给PP的任务");
for (RobotTaskDetailDO taskDetailDO : taskDetailDOS) {
@ -360,6 +412,15 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
.createTime(taskDetailDO.getCreateTime())
.build();
if (RobotTaskTypeEnum.PARK.getType().equals(taskDetailDO.getTaskType())
&& (ObjectUtil.isEmpty(waitIds) || waitIds.size() < i)) {
log.info("停车任务,没有多余的空闲点位 {}",taskDetailDO.getId());
return;
}else if (RobotTaskTypeEnum.PARK.getType().equals(taskDetailDO.getTaskType())) {
pathPlanning.setWaitIds(waitIds);
i++;
}
if (ObjectUtil.isNotEmpty(robotDoTake) && ObjectUtil.isNotEmpty(taskDetailDO.getRobotNo())
&& robotDoTake.contains(taskDetailDO.getRobotNo())
&& !RobotTaskTypeEnum.RELEASE.getType().equals(taskDetailDO.getTaskType())) {
@ -383,51 +444,36 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
WareHouseLocationDO fromLocation = locationDOMap.get(taskDetailDO.getFromLocationId());
WareHouseLocationDO toLocation = locationDOMap.get(taskDetailDO.getToLocationId());
//取是线库
if (ObjectUtil.isNotEmpty(taskDetailDO.getFromLocationId())
&& ObjectUtil.isNotEmpty(taskDetailDO.getFromLaneId())) {
pathPlanning.setTakeGroupId("LINE_" + taskDetailDO.getFromLaneId());
if (ObjectUtil.isNotEmpty(taskDetailDO.getFromLocationId())) {
pathPlanning.setTakeLocationNumber(Math.abs(locationNumberReduce - taskDetailDO.getFromLocationNumber()));
pathPlanning.setTakePointId(fromLocation.getMapItemId());
pathPlanning.setTakeHeight(Double.valueOf(fromLocation.getLocationTrayHeight() + ""));
pathPlanning.setTakeLevel(fromLocation.getLocationStorey());
pathPlanning.setTakeOffsetHeight(offsetHeight);
} else if (ObjectUtil.isNotEmpty(taskDetailDO.getFromLocationId())
&& ObjectUtil.isEmpty(taskDetailDO.getFromLaneId())) {
//取的是普通点位
pathPlanning.setTakeGroupId("POINT_" + taskDetailDO.getFromMapItemId());
pathPlanning.setTakeLocationNumber(Math.abs(locationNumberReduce - taskDetailDO.getFromLocationNumber()));
pathPlanning.setTakePointId(fromLocation.getMapItemId());
pathPlanning.setTakeHeight(Double.valueOf(fromLocation.getLocationTrayHeight() + ""));
if (ObjectUtil.isNotEmpty(fromLocation.getLocationTrayHeight())) {
pathPlanning.setTakeHeight(Double.valueOf(fromLocation.getLocationTrayHeight() + ""));
}
pathPlanning.setTakeLevel(fromLocation.getLocationStorey());
pathPlanning.setTakeOffsetHeight(offsetHeight);
if (ObjectUtil.isNotEmpty(taskDetailDO.getFromLaneId())) {
pathPlanning.setTakeGroupId("LINE_" + taskDetailDO.getFromLaneId());
}else {
pathPlanning.setTakeGroupId("POINT_" + taskDetailDO.getFromMapItemId());
}
}
//放是线库
if (ObjectUtil.isNotEmpty(taskDetailDO.getToLocationId())
&& ObjectUtil.isNotEmpty(taskDetailDO.getToLaneId())) {
pathPlanning.setReleaseGroupId("LINE_" + taskDetailDO.getToLaneId());
if (ObjectUtil.isNotEmpty(taskDetailDO.getToLocationId())){
pathPlanning.setReleaseLocationNumber(taskDetailDO.getToLocationNumber());
pathPlanning.setReleasePointId(toLocation.getMapItemId());
pathPlanning.setReleaseHeight(Double.valueOf(toLocation.getLocationTrayHeight() + ""));
if (ObjectUtil.isNotEmpty(toLocation.getLocationTrayHeight())) {
pathPlanning.setReleaseHeight(Double.valueOf(toLocation.getLocationTrayHeight() + ""));
}
pathPlanning.setReleaseLevel(toLocation.getLocationStorey());
pathPlanning.setReleaseOffsetHeight(offsetHeight);
} else if (ObjectUtil.isNotEmpty(taskDetailDO.getToLocationId())
&& ObjectUtil.isEmpty(taskDetailDO.getToLaneId())) {
//放的是普通点位
pathPlanning.setReleaseGroupId("POINT_" + taskDetailDO.getToMapItemId());
pathPlanning.setReleaseLocationNumber(taskDetailDO.getToLocationNumber());
pathPlanning.setReleasePointId(toLocation.getMapItemId());
pathPlanning.setReleaseHeight(Double.valueOf(toLocation.getLocationTrayHeight() + ""));
pathPlanning.setReleaseLevel(toLocation.getLocationStorey());
pathPlanning.setReleaseOffsetHeight(offsetHeight);
if (ObjectUtil.isNotEmpty(taskDetailDO.getToLaneId())){
pathPlanning.setReleaseGroupId("LINE_" + taskDetailDO.getToLaneId());
}else {
pathPlanning.setReleaseGroupId("POINT_" + taskDetailDO.getToMapItemId());
}
}
pathPlanningList.add(pathPlanning);
}
@ -554,8 +600,6 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
List<RobotTaskDetailDO> detailDOS = taskDetailDOS.stream()
.filter(v -> !laneIds.contains(v.getFromLaneId())
&& !laneIds.contains(v.getToLaneId())
&& !RobotTaskTypeEnum.PARK.getType().equals(v.getTaskType()) //停车在充电的任务做
&& !RobotTaskTypeEnum.CHARGE.getType().equals(v.getTaskType()) //停车在充电的任务做
&& !mapIds.contains(v.getFromMapItemId())
&& !mapIds.contains(v.getToMapItemId()))
.collect(Collectors.toList());
@ -615,6 +659,8 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
} else if (RobotTaskTypeEnum.TAKE.getType().equals(v.getTaskType())) {
//仅取货
takeSetTask(list, v, fromLane, toLane, fromLocation, toLocation, toHaveFrom, fromHaveTo);
}else if (RobotTaskTypeEnum.PARK.getType().equals(v.getTaskType())) {
list.add(v);
}
}

View File

@ -28,6 +28,7 @@
<result property="robotAction" column="robot_action" jdbcType="VARCHAR"/>
<result property="taskStatus" column="task_status" jdbcType="INTEGER"/>
<result property="taskStage" column="task_stage" jdbcType="INTEGER"/>
<result property="needLock" column="need_lock" jdbcType="INTEGER"/>
<result property="startTime" column="start_time" jdbcType="TIMESTAMP"/>
<result property="endTime" column="end_time" jdbcType="TIMESTAMP"/>
<result property="creator" column="creator" jdbcType="VARCHAR"/>
@ -70,6 +71,7 @@
from_location_number,
to_location_number,
from_map_item_id,
need_lock,
to_map_item_id
</sql>
@ -317,6 +319,19 @@
</set>
where id = #{id}
</update>
<update id="updateDoneByIds">
update
robot_task_detail
set
task_status = '2',
task_stage = '5'
where
id in
<foreach collection="ids" item="id" index="index" open="(" close=")"
separator=",">
#{id}
</foreach>
</update>
<!--通过主键删除-->
<delete id="deleteById">

View File

@ -461,6 +461,19 @@
</set>
where id = #{id}
</update>
<update id="updateDoneByIds">
update
robot_task
set
task_status = '2',
task_stage = '5'
where
id in
<foreach collection="ids" item="id" index="index" open="(" close=")"
separator=",">
#{id}
</foreach>
</update>
<!--通过主键删除-->
<delete id="deleteById">