机器人充电任务优化
This commit is contained in:
parent
981a8fdb56
commit
ee3631b559
@ -109,4 +109,10 @@ public interface RobotTaskDetailMapper extends BaseMapperX<RobotTaskDetailDO> {
|
||||
* @return
|
||||
*/
|
||||
List<RobotTaskDetailDO> getLastTaskGroupByRobotNo();
|
||||
|
||||
/**
|
||||
* 设置状态为完成
|
||||
* @param ids
|
||||
*/
|
||||
void updateDoneByIds(@Param("ids") List<Long> ids);
|
||||
}
|
@ -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);
|
||||
}
|
@ -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) {
|
||||
|
@ -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());
|
||||
|
@ -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());
|
||||
|
@ -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())) {
|
||||
|
||||
if (ObjectUtil.isNotEmpty(taskDetailDO.getFromLocationId())) {
|
||||
pathPlanning.setTakeLocationNumber(Math.abs(locationNumberReduce - taskDetailDO.getFromLocationNumber()));
|
||||
pathPlanning.setTakePointId(fromLocation.getMapItemId());
|
||||
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());
|
||||
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())) {
|
||||
//取的是普通点位
|
||||
}else {
|
||||
pathPlanning.setTakeGroupId("POINT_" + taskDetailDO.getFromMapItemId());
|
||||
pathPlanning.setTakeLocationNumber(Math.abs(locationNumberReduce - taskDetailDO.getFromLocationNumber()));
|
||||
pathPlanning.setTakePointId(fromLocation.getMapItemId());
|
||||
pathPlanning.setTakeHeight(Double.valueOf(fromLocation.getLocationTrayHeight() + ""));
|
||||
pathPlanning.setTakeLevel(fromLocation.getLocationStorey());
|
||||
pathPlanning.setTakeOffsetHeight(offsetHeight);
|
||||
}
|
||||
}
|
||||
|
||||
//放是线库
|
||||
if (ObjectUtil.isNotEmpty(taskDetailDO.getToLocationId())
|
||||
&& ObjectUtil.isNotEmpty(taskDetailDO.getToLaneId())) {
|
||||
|
||||
if (ObjectUtil.isNotEmpty(taskDetailDO.getToLocationId())){
|
||||
pathPlanning.setReleaseLocationNumber(taskDetailDO.getToLocationNumber());
|
||||
pathPlanning.setReleasePointId(toLocation.getMapItemId());
|
||||
if (ObjectUtil.isNotEmpty(toLocation.getLocationTrayHeight())) {
|
||||
pathPlanning.setReleaseHeight(Double.valueOf(toLocation.getLocationTrayHeight() + ""));
|
||||
}
|
||||
pathPlanning.setReleaseLevel(toLocation.getLocationStorey());
|
||||
pathPlanning.setReleaseOffsetHeight(offsetHeight);
|
||||
if (ObjectUtil.isNotEmpty(taskDetailDO.getToLaneId())){
|
||||
pathPlanning.setReleaseGroupId("LINE_" + taskDetailDO.getToLaneId());
|
||||
pathPlanning.setReleaseLocationNumber(taskDetailDO.getToLocationNumber());
|
||||
pathPlanning.setReleasePointId(toLocation.getMapItemId());
|
||||
pathPlanning.setReleaseHeight(Double.valueOf(toLocation.getLocationTrayHeight() + ""));
|
||||
pathPlanning.setReleaseLevel(toLocation.getLocationStorey());
|
||||
pathPlanning.setReleaseOffsetHeight(offsetHeight);
|
||||
|
||||
} else if (ObjectUtil.isNotEmpty(taskDetailDO.getToLocationId())
|
||||
&& ObjectUtil.isEmpty(taskDetailDO.getToLaneId())) {
|
||||
//放的是普通点位
|
||||
}else {
|
||||
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);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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">
|
||||
|
@ -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">
|
||||
|
Loading…
Reference in New Issue
Block a user