处理PP上报的任务

This commit is contained in:
cbs 2025-02-27 17:54:41 +08:00
parent 3bdb4e2d19
commit 9b515e2f04
26 changed files with 422 additions and 148 deletions

View File

@ -19,7 +19,7 @@ import java.util.List;
public class TaskToPathPlanningDTO {
@Schema(description = "robot_task_detail/robot_charge_log 的 id")
private Long id;
private String id;
@Schema(description = "任务类型(TASK:robot_task的任务、CHARGE:充电任务)")
private String type;

View File

@ -139,7 +139,7 @@ public class MqttFactory {
return BeanUtils.getBean(RobotStatusServiceImpl.class);
case SYNCHRONOUS_ALL_MAP_REQUEST:
return BeanUtils.getBean(PathPlanningInitDataServiceImpl.class);
case DISTRIBUTION_TASK:
case TASK_ASSIGNMENT_FEEDBACK:
return BeanUtils.getBean(PathPlanningDistributionTaskServiceImpl.class);
default :
// case ROBOT_TASK_STATUS:

View File

@ -19,7 +19,7 @@ public enum DefineSubTopicEnum {
ROBOT_TASK_STATUS("ROBOT_TASK_STATUS", 0,"机器人任务完成上报"),
ROBOT_GENERICS_STATUS("ROBOT_GENERICS_STATUS", 0,"机器人异常"),
SYNCHRONOUS_ALL_MAP_REQUEST("SYNCHRONOUS_ALL_MAP_REQUEST", 0,"路径规划需要初始数据上报"),
DISTRIBUTION_TASK("DISTRIBUTION_TASK", 0,"路径规划任务分配上报");
TASK_ASSIGNMENT_FEEDBACK("TASK_ASSIGNMENT_FEEDBACK", 0,"路径规划任务分配上报");
private final String topic;

View File

@ -23,7 +23,7 @@ public class PathPlanningDistributionTaskServiceImpl implements MqttService{
*/
@Override
public void analysisMessage(String message) {
log.info("PP上报任务分配");
log.info("PP上报任务分配 :{}", message);
pathApi.ppDistributionTask(message);
}
}

View File

@ -33,7 +33,7 @@ import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
@Tag(name = "管理后台 - 车辆动作记录")
@RestController
@RequestMapping("/robot/task-detail-action-log")
@RequestMapping("/system/robot/task-detail-action-log")
@Validated
public class RobotTaskDetailActionLogController {

View File

@ -1,5 +1,7 @@
package cn.iocoder.yudao.module.system.controller.admin.robot;
import cn.iocoder.yudao.module.system.controller.admin.robot.detail.RobotTaskDetailLogResoVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.detail.RobotTaskDetailLogVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskRespVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskSaveReqVO;
@ -103,4 +105,12 @@ public class RobotTaskController {
BeanUtils.toBean(list, RobotTaskRespVO.class));
}
@PostMapping("/logPage")
@Operation(summary = "任务日志分页")
@PreAuthorize("@ss.hasPermission('robot:task:logPage')")
public CommonResult<PageResult<RobotTaskDetailLogResoVO>> logPage(@Valid @RequestBody RobotTaskDetailLogVO pageReqVO) {
PageResult<RobotTaskDetailLogResoVO> pageResult = taskService.logPage(pageReqVO);
return success(pageResult);
}
}

View File

@ -0,0 +1,41 @@
package cn.iocoder.yudao.module.system.controller.admin.robot.detail;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class RobotTaskDetailLogResoVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "26224")
private Long id;
@Schema(description = "任务号")
private String taskNo;
@Schema(description = "任务类型1取放货、2停车、 3充电、4移动、5仅取货、6仅放货", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
private Integer taskType;
@Schema(description = "任务内容")
private String msg;
@Schema(description = "任务状态(0:未开始、1执行中、2已完成、3已取消、4:异常)", example = "1")
private Integer taskStatus;
@Schema(description = "开始时间")
private LocalDateTime startTime;
@Schema(description = "结束时间")
private LocalDateTime endTime;
@Schema(description = "创建时间")
private LocalDateTime createTime;
@Schema(description = "计算后的目标库位编号")
private String toLocationNo;
@Schema(description = "计算后的来源库位编号")
private String fromLocationNo;
}

View File

@ -0,0 +1,33 @@
package cn.iocoder.yudao.module.system.controller.admin.robot.detail;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.Date;
@Data
public class RobotTaskDetailLogVO extends PageParam {
@Schema(description = "任务号")
private String taskNo;
@Schema(description = "任务类型1取放货、2停车、 3充电、4移动、5仅取货、6仅放货、", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
private Integer taskType;
@Schema(description = "任务状态(0:未开始、1执行中、2已完成、3已取消、4:异常)", example = "1")
private Integer taskStatus;
@Schema(description = "开始时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date startTime;
@Schema(description = "结束时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date endTime;
@Schema(description = "关键词")
private String msg;
}

View File

@ -7,7 +7,7 @@ import lombok.Data;
public class TaskPathPlanningDTO {
@Schema(description = "出发点id(点位子表id)", example = "20863")
private String startingPointId;
private String id;
private Double x;

View File

@ -53,7 +53,7 @@ public class RobotTaskDetailPageReqVO extends PageParam {
@Schema(description = "放货线库id")
private Long toLaneId;
@Schema(description = "任务状态(0:未开始、1执行中、2已完成、3已取消)", example = "1")
@Schema(description = "任务状态(0:未开始、1执行中、2已完成、3已取消、4:异常)", example = "1")
private Integer taskStatus;
@Schema(description = "任务阶段(0:待执行、1前往取货、2取货中、3运输中、4放货中、5结束)")

View File

@ -58,8 +58,8 @@ public class RobotTaskDetailRespVO {
@ExcelProperty("AGV动作")
private String robotAction;
@Schema(description = "任务状态(0:未开始、1执行中、2已完成、3已取消)", example = "1")
@ExcelProperty("任务状态(0:未开始、1执行中、2已完成、3已取消)")
@Schema(description = "任务状态(0:未开始、1执行中、2已完成、3已取消、4:异常)", example = "1")
@ExcelProperty("任务状态(0:未开始、1执行中、2已完成、3已取消、4:异常)")
private Integer taskStatus;
@Schema(description = "任务阶段(0:待执行、1前往取货、2取货中、3运输中、4放货中、5结束)")

View File

@ -59,7 +59,7 @@ public class RobotTaskDetailSaveReqVO {
@Schema(description = "AGV动作")
private String robotAction;
@Schema(description = "任务状态(0:未开始、1执行中、2已完成、3已取消)", example = "1")
@Schema(description = "任务状态(0:未开始、1执行中、2已完成、3已取消、4:异常)", example = "1")
private Integer taskStatus;
@Schema(description = "任务阶段(0:待执行、1前往取货、2取货中、3运输中、4放货中、5结束)")

View File

@ -22,7 +22,7 @@ public interface RobotTaskDetailActionLogMapper extends BaseMapperX<RobotTaskDet
.eqIfPresent(RobotTaskDetailActionLogDO::getCommandId, reqVO.getCommandId())
.eqIfPresent(RobotTaskDetailActionLogDO::getCommandType, reqVO.getCommandType())
.eqIfPresent(RobotTaskDetailActionLogDO::getCommandMsg, reqVO.getCommandMsg())
.eqIfPresent(RobotTaskDetailActionLogDO::getActionMsg, reqVO.getActionMsg())
.likeIfPresent(RobotTaskDetailActionLogDO::getActionMsg, reqVO.getActionMsg())
.eqIfPresent(RobotTaskDetailActionLogDO::getActionStatus, reqVO.getActionStatus())
.eqIfPresent(RobotTaskDetailActionLogDO::getRobotNo, reqVO.getRobotNo())
.betweenIfPresent(RobotTaskDetailActionLogDO::getCreateTime, reqVO.getCreateTime())

View File

@ -5,6 +5,8 @@ import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.system.controller.admin.robot.detail.RobotTaskDetailLogResoVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.detail.RobotTaskDetailLogVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskPageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDO;
import com.baomidou.mybatisplus.core.metadata.IPage;
@ -62,4 +64,13 @@ public interface RobotTaskMapper extends BaseMapperX<RobotTaskDO> {
*/
IPage<RobotTaskDO> selectPageList(@Param("mpPage") IPage mpPage,
@Param("pageReqVO") RobotTaskPageReqVO pageReqVO);
/**
* 任务日志
* @param mpPage
* @param pageReqVO
* @return
*/
IPage<RobotTaskDetailLogResoVO> selectLogPageList(@Param("mpPage") IPage mpPage,
@Param("pageReqVO") RobotTaskDetailLogVO pageReqVO);
}

View File

@ -0,0 +1,23 @@
package cn.iocoder.yudao.module.system.enums.device;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* device_information的`device_attribute` tinyint DEFAULT NULL COMMENT '设备专有属性1自动充电类型充电桩0手动充电类型充电桩',
*/
@Getter
@AllArgsConstructor
public enum DeviceAttributeEnum {
AUTO_CHARGE(1, "自动充电类型充电桩"),
HAND_MOVEMENT(0, "手动充电类型充电桩");
/**
* 类型
*/
private final Integer type;
/**
* 说明
*/
private final String msg;
}

View File

@ -34,7 +34,10 @@ public class HouseLocationStrategyImpl implements NodeProcessingStrategy {
// -- 策略1 处理库位点
// -- 将data里面的json 数据转为实体类 - 再对比节点id - 然后做新增删除修改操作
List<WareHouseLocationDO> newList = new ArrayList<>();
Long locationNumber = nodeBaseDTOS.get(0).getLocationNumber();
Long locationNumber = 0l;
if (ObjectUtil.isNotEmpty(nodeBaseDTOS)) {
locationNumber = nodeBaseDTOS.get(0).getLocationNumber();
}
for (NodeBaseDTO item : nodeBaseDTOS) {
if (item.getId() == null) {
@ -73,14 +76,14 @@ public class HouseLocationStrategyImpl implements NodeProcessingStrategy {
item.setDataJson(JSONUtil.toJsonStr(wareHouseLocationDOS));
}
//判断排序是否重复
List<Long> locationNumbers = newList.stream().map(WareHouseLocationDO::getLocationNumber).collect(Collectors.toList());
//判断排序是否重复 后续改成一条线库的库位编号不能重复 todo
/*List<Long> locationNumbers = newList.stream().map(WareHouseLocationDO::getLocationNumber).collect(Collectors.toList());
if (ObjectUtil.isNotEmpty(locationNumbers)) {
List<WareHouseLocationDO> list = houseLocationService.getLocationByLocationNumbers(locationNumbers);
if (ObjectUtil.isNotEmpty(list)) {
throw exception(HOUSE_LOCATION_NO_EXIST);
}
}
}*/
List<WareHouseLocationDO> oldList = houseLocationService.getByMapId(positionMapId);
List<List<WareHouseLocationDO>> list = CollectionUtils.compareLists(oldList, newList,

View File

@ -4,6 +4,8 @@ import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.module.system.controller.admin.robot.detail.RobotTaskDetailLogResoVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.detail.RobotTaskDetailLogVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskRespVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskSaveReqVO;
@ -66,4 +68,11 @@ public interface RobotTaskService extends IService<RobotTaskDO> {
* @param message
*/
void ppDistributionTask(String message);
/**
* 任务日志分页
* @param pageReqVO
* @return
*/
PageResult<RobotTaskDetailLogResoVO> logPage( RobotTaskDetailLogVO pageReqVO);
}

View File

@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.system.service.robot;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
@ -8,6 +9,8 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
import cn.iocoder.yudao.module.mqtt.enums.path.TaskTypeEnum;
import cn.iocoder.yudao.module.system.controller.admin.robot.detail.RobotTaskDetailLogResoVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.detail.RobotTaskDetailLogVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.task.TaskPPDistribution;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.houselocation.WareHouseLocationDO;
@ -25,6 +28,7 @@ import cn.iocoder.yudao.module.system.enums.robot.*;
import cn.iocoder.yudao.module.system.service.robot.job.RobotCommonTaskService;
import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
import cn.iocoder.yudao.module.system.util.redis.RedissonUtils;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Lists;
@ -726,11 +730,15 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper,RobotTaskD
* @param message
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void ppDistributionTask(String message) {
log.info("PP分配任务 :{}",message);
TaskPPDistribution[] array = new Gson().fromJson(message, TaskPPDistribution[].class);
List<TaskPPDistribution> list = Arrays.asList(array);
//todo 如果车辆状态是充电中 更新充电表的充电数据
TaskPPDistribution distribution = JSON.parseObject(message,TaskPPDistribution.class);
List<TaskPPDistribution> list = Arrays.asList(distribution);
List<TaskPPDistribution> taskList = list.stream()
.filter(v -> TaskTypeEnum.TASK.getType().equals(v.getType()))
@ -740,19 +748,19 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper,RobotTaskD
.filter(v -> TaskTypeEnum.CHARGE.getType().equals(v.getType()))
.collect(Collectors.toList());
List<Long> detailIds = new ArrayList<>();
Map<Long, TaskPPDistribution> taskMap =
list.stream().collect(Collectors.toMap(v -> v.getId(), Function.identity()));
List<Long> chargeDetaildIds = null;
List<RobotChargeLogDO> robotChargeLogs = null;
/**
* 充电
*/
if (ObjectUtil.isNotEmpty(chargeList)) {
List<Long> chargeIds = chargeList.stream().map(TaskPPDistribution::getId).collect(Collectors.toList());
List<RobotChargeLogDO> robotChargeLogs = chargeLogMapper.selectBatchIds(chargeIds);
robotChargeLogs = chargeLogMapper.selectBatchIds(chargeIds);
robotChargeLogs.stream().forEach(taskDetailDO -> {
taskDetailDO.setTaskStatus(RobotTaskDetailStatusEnum.DOING.getType());
});
@ -797,39 +805,72 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper,RobotTaskD
tasks.stream().forEach(task -> {
task.setTaskStatus(RobotTaskStatusEnum.DOING.getType());
});
taskDetailMapper.updateBatch(taskDetailDOS);
taskMapper.updateBatch(tasks);
}
robotCommonTaskService.sendTaskToRobot(taskList);
robotCommonTaskService.sendChargeTaskToRobot(chargeList);
robotCommonTaskService.sendChargeTaskToRobot(chargeList,robotChargeLogs);
}
/**
* 任务日志分页
* @param pageReqVO
* @return
*/
@Override
public PageResult<RobotTaskDetailLogResoVO> logPage(RobotTaskDetailLogVO pageReqVO) {
PageResult<RobotTaskDetailLogResoVO> dataPage = new PageResult<>();
IPage mpPage = MyBatisUtils.buildPage(pageReqVO);
IPage<RobotTaskDetailLogResoVO> page = taskMapper.selectLogPageList(mpPage, pageReqVO);
dataPage.setTotal(page.getTotal());
List<RobotTaskDetailLogResoVO> list = page.getRecords();
List<RobotTaskDetailLogResoVO> targetList = BeanUtil.copyToList(list, RobotTaskDetailLogResoVO.class);
for (RobotTaskDetailLogResoVO robotTaskRespVO : targetList) {
String msg = "";
RobotTaskTypeEnum robotTaskType = RobotTaskTypeEnum.getRobotTaskType(robotTaskRespVO.getTaskType());
switch (robotTaskType) {
case TAKE_RELEASE:
msg = "取货点 " + robotTaskRespVO.getFromLocationNo() +" 放货点 " + robotTaskRespVO.getToLocationNo();
break;
case PARK:
if (ObjectUtil.isNotEmpty(robotTaskRespVO.getToLocationNo())) {
msg = "停车点 " + robotTaskRespVO.getToLocationNo();
}else {
msg = "停车点";
}
break;
case CHARGE:
if (ObjectUtil.isNotEmpty(robotTaskRespVO.getToLocationNo())) {
msg = "充电点 " + robotTaskRespVO.getToLocationNo();
}else {
msg = "充电点";
}
break;
case MOVE:
if (ObjectUtil.isNotEmpty(robotTaskRespVO.getToLocationNo())) {
msg = "移动点 " + robotTaskRespVO.getToLocationNo();
}else {
msg = "移动点";
}
break;
case TAKE:
msg = "取货点 " + robotTaskRespVO.getFromLocationNo();
break;
case RELEASE:
msg = "放货点 " + robotTaskRespVO.getToLocationNo();
break;
default:
log.error("任务类型不存在");
}
robotTaskRespVO.setMsg(msg);
}
dataPage.setList(targetList);
return dataPage;
}
}

View File

@ -27,6 +27,7 @@ import cn.iocoder.yudao.module.system.enums.device.DeviceUseStatusEnum;
import cn.iocoder.yudao.module.system.enums.redis.RobotCacheLockEnum;
import cn.iocoder.yudao.module.system.enums.robot.*;
import cn.iocoder.yudao.module.system.enums.robot.charge.ChargeModelEnum;
import cn.iocoder.yudao.module.system.service.robot.pathplanning.RobotPathPlanningService;
import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -76,6 +77,9 @@ public class AutoChargeServiceImpl implements AutoChargeService {
@Value("${zn.full_electricity:100}")
private String fullElectricity;
@Autowired
private RobotPathPlanningService robotPathPlanningService;
/**
* 自动充电
*/
@ -128,43 +132,18 @@ public class AutoChargeServiceImpl implements AutoChargeService {
detailMap = taskDetailDOS.stream().collect(Collectors.groupingBy(RobotTaskDetailDO::getRobotNo));
}
List<RobotTaskDetailDO> updateTaskDetails = new ArrayList<>();
List<RobotChargeLogDO> logs = new ArrayList<>();
Set<Long> taskIds = new HashSet<>();
//组装充电任务
assembleChargeTask(robots,deviceInformationDOS,chargeConfig,chargeFullNos,updateTaskDetails,logs,taskIds,detailMap);
assembleChargeTask(robots,deviceInformationDOS,chargeConfig,chargeFullNos,logs,detailMap);
if (ObjectUtil.isEmpty(logs)) {
log.info("没有需要执行的充电任务");
return;
}
if (ObjectUtil.isNotEmpty(updateTaskDetails)) {
robotTaskDetailMapper.updateBatch(updateTaskDetails);
}
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);
}
Set<String> robotLists = logs.stream()
.map(RobotChargeLogDO::getDeviceNo)
.collect(Collectors.toSet());
if (ObjectUtil.isNotEmpty(robotLists)) {
robotInformationMapper.updateRobotListStatus(robotLists,RobotStatusEnum.DOING.getType());
}
chargeLogMapper.insertBatch(logs);
//todo 发送给路PP
robotPathPlanningService.sendChargeTaskToPP(logs);
//改成异步
logs.stream().forEach(v -> {
@ -180,14 +159,12 @@ public class AutoChargeServiceImpl implements AutoChargeService {
* @param deviceInformationDOS
* @param chargeConfig
* @param chargeFullNos
* @param updateTaskDetails
* @param logs
* @param taskIds
* @param detailMap
*/
public void assembleChargeTask(List<RobotInformationDO> robots, List<DeviceInformationDO> deviceInformationDOS,
CommonConfigVO chargeConfig, List<String> chargeFullNos, List<RobotTaskDetailDO> updateTaskDetails,
List<RobotChargeLogDO> logs, Set<Long> taskIds, Map<String, List<RobotTaskDetailDO>> detailMap) {
CommonConfigVO chargeConfig, List<String> chargeFullNos,
List<RobotChargeLogDO> logs, Map<String, List<RobotTaskDetailDO>> detailMap) {
//判断机器人身上的电量少于设定的电量
for (RobotInformationDO robot : robots) {
String pose2dKey = RobotTaskChcheConstant.ROBOT_INFORMATION_POSE_BAT_SOC +robot.getMacAddress();
@ -203,12 +180,20 @@ public class AutoChargeServiceImpl implements AutoChargeService {
break;
}
RobotChargeLogDO log = new RobotChargeLogDO();
log.setRobotNo(robot.getRobotNo());
// todo 后续需要根据车辆的自动充电/手动充电来分配充电桩
log.setDeviceNo(deviceInformationDOS.get(0).getDeviceNo());
DeviceInformationDO deviceInformationDO = deviceInformationDOS.stream()
.filter(v -> v.getDeviceAttribute().equals(robot.getChargeType()))
.findFirst()
.orElse(new DeviceInformationDO());
if (ObjectUtil.isEmpty(deviceInformationDO.getDeviceNo())) {
log.info("当前机器人查不到对应的充电桩类型 :{}",robot.getRobotNo());
continue;
}
RobotChargeLogDO logDo = new RobotChargeLogDO();
logDo.setRobotNo(robot.getRobotNo());
logDo.setDeviceNo(deviceInformationDO.getDeviceNo());
String[] split = dataPoseDTO.getBat_soc().split("\\.");
log.setStartElectricity(Integer.valueOf(split[0]));
logDo.setStartElectricity(Integer.valueOf(split[0]));
//配置的充满电电量
BigDecimal robotFullElectricity = new BigDecimal(fullElectricity);
//车子剩余电量
@ -216,9 +201,10 @@ public class AutoChargeServiceImpl implements AutoChargeService {
if (ObjectUtil.isNotEmpty(chargeConfig.getChanceCycle()) && !chargeFullNos.contains(robot.getRobotNo())
&& robotRemainingElectricity.compareTo(robotFullElectricity) < 0) {
//充满电
log.setChargeModel(ChargeModelEnum.FULL.getType());
logs.add(log);
deviceInformationDOS.removeIf(v -> log.getDeviceNo().equals(v.getDeviceNo()));
logDo.setChargeModel(ChargeModelEnum.FULL.getType());
logs.add(logDo);
deviceInformationDOS.removeIf(v -> logDo.getDeviceNo().equals(v.getDeviceNo()));
log.info("分配到充满电充电任务 :{} ,充电设备编号是 :{}, 任务id :{}",logDo.getRobotNo(),logDo.getDeviceNo(),logDo.getTaskDetailId());
continue;
}
@ -228,15 +214,11 @@ public class AutoChargeServiceImpl implements AutoChargeService {
BigDecimal robotConfigElectricity = new BigDecimal(String.valueOf(robot.getAutoCharge()));
if (robotRemainingElectricity.compareTo(robotConfigElectricity) < 0) {
RobotTaskDetailDO robotTaskDetailDO = detailMap.get(robot.getRobotNo()).get(0);
robotTaskDetailDO.setRobotNo(robot.getRobotNo());
robotTaskDetailDO.setStartTime(LocalDateTime.now());
robotTaskDetailDO.setTaskStatus(RobotTaskDetailStatusEnum.DOING.getType());
updateTaskDetails.add(robotTaskDetailDO);
taskIds.add(robotTaskDetailDO.getRobotTaskId());
deviceInformationDOS.removeIf(v -> log.getDeviceNo().equals(v.getDeviceNo()));
log.setChargeModel(ChargeModelEnum.TASK.getType());
log.setTaskDetailId(robotTaskDetailDO.getId());
logs.add(log);
deviceInformationDOS.removeIf(v -> logDo.getDeviceNo().equals(v.getDeviceNo()));
logDo.setChargeModel(ChargeModelEnum.TASK.getType());
logDo.setTaskDetailId(robotTaskDetailDO.getId());
logs.add(logDo);
log.info("分配到任务充电任务 :{} ,充电设备编号是 :{}, 任务id :{}",logDo.getRobotNo(),logDo.getDeviceNo(),logDo.getTaskDetailId());
continue;
}
}
@ -247,15 +229,11 @@ public class AutoChargeServiceImpl implements AutoChargeService {
BigDecimal robotConfigElectricity = new BigDecimal(String.valueOf(chargeConfig.getStartAutoCharge()));
if (robotRemainingElectricity.compareTo(robotConfigElectricity) < 0) {
RobotTaskDetailDO robotTaskDetailDO = detailMap.get(robot.getRobotNo()).get(0);
robotTaskDetailDO.setRobotNo(robot.getRobotNo());
robotTaskDetailDO.setStartTime(LocalDateTime.now());
robotTaskDetailDO.setTaskStatus(RobotTaskDetailStatusEnum.DOING.getType());
updateTaskDetails.add(robotTaskDetailDO);
taskIds.add(robotTaskDetailDO.getRobotTaskId());
deviceInformationDOS.removeIf(v -> log.getDeviceNo().equals(v.getDeviceNo()));
log.setChargeModel(ChargeModelEnum.TASK.getType());
log.setTaskDetailId(robotTaskDetailDO.getId());
logs.add(log);
deviceInformationDOS.removeIf(v -> logDo.getDeviceNo().equals(v.getDeviceNo()));
logDo.setChargeModel(ChargeModelEnum.TASK.getType());
logDo.setTaskDetailId(robotTaskDetailDO.getId());
logs.add(logDo);
log.info("分配到任务充电任务 :{} ,充电设备编号是 :{}, 任务id :{}",logDo.getRobotNo(),logDo.getDeviceNo(),logDo.getTaskDetailId());
continue;
}
}
@ -266,15 +244,11 @@ public class AutoChargeServiceImpl implements AutoChargeService {
BigDecimal robotConfigElectricity = new BigDecimal(String.valueOf(chargeConfig.getChanceChargeStart()));
if (robotRemainingElectricity.compareTo(robotConfigElectricity) < 0) {
RobotTaskDetailDO robotTaskDetailDO = detailMap.get(robot.getRobotNo()).get(0);
robotTaskDetailDO.setRobotNo(robot.getRobotNo());
robotTaskDetailDO.setStartTime(LocalDateTime.now());
robotTaskDetailDO.setTaskStatus(RobotTaskDetailStatusEnum.DOING.getType());
updateTaskDetails.add(robotTaskDetailDO);
taskIds.add(robotTaskDetailDO.getRobotTaskId());
deviceInformationDOS.removeIf(v -> log.getDeviceNo().equals(v.getDeviceNo()));
log.setChargeModel(ChargeModelEnum.TASK.getType());
log.setTaskDetailId(robotTaskDetailDO.getId());
logs.add(log);
deviceInformationDOS.removeIf(v -> logDo.getDeviceNo().equals(v.getDeviceNo()));
logDo.setChargeModel(ChargeModelEnum.TASK.getType());
logDo.setTaskDetailId(robotTaskDetailDO.getId());
logs.add(logDo);
log.info("分配到任务充电任务 :{} ,充电设备编号是 :{}, 任务id :{}",logDo.getRobotNo(),logDo.getDeviceNo(),logDo.getTaskDetailId());
continue;
}
}
@ -283,9 +257,10 @@ public class AutoChargeServiceImpl implements AutoChargeService {
//自动充电
BigDecimal robotConfigElectricity = new BigDecimal(String.valueOf(robot.getAutoCharge()));
if (robotRemainingElectricity.compareTo(robotConfigElectricity) < 0) {
log.setChargeModel(ChargeModelEnum.AUTO.getType());
logs.add(log);
deviceInformationDOS.removeIf(v -> log.getDeviceNo().equals(v.getDeviceNo()));
logDo.setChargeModel(ChargeModelEnum.AUTO.getType());
logs.add(logDo);
deviceInformationDOS.removeIf(v -> logDo.getDeviceNo().equals(v.getDeviceNo()));
log.info("分配到自动充电任务 :{} ,充电设备编号是 :{}",logDo.getRobotNo(),logDo.getDeviceNo());
continue;
}
}
@ -294,9 +269,10 @@ public class AutoChargeServiceImpl implements AutoChargeService {
//自动充电
BigDecimal robotConfigElectricity = new BigDecimal(String.valueOf(chargeConfig.getStartAutoCharge()));
if (robotRemainingElectricity.compareTo(robotConfigElectricity) < 0) {
log.setChargeModel(ChargeModelEnum.AUTO.getType());
logs.add(log);
deviceInformationDOS.removeIf(v -> log.getDeviceNo().equals(v.getDeviceNo()));
logDo.setChargeModel(ChargeModelEnum.AUTO.getType());
logs.add(logDo);
deviceInformationDOS.removeIf(v -> logDo.getDeviceNo().equals(v.getDeviceNo()));
log.info("分配到自动充电任务 :{} ,充电设备编号是 :{}",logDo.getRobotNo(),logDo.getDeviceNo());
continue;
}
}
@ -305,9 +281,10 @@ public class AutoChargeServiceImpl implements AutoChargeService {
//机会充电
BigDecimal robotConfigElectricity = new BigDecimal(String.valueOf(chargeConfig.getChanceChargeStart()));
if (robotRemainingElectricity.compareTo(robotConfigElectricity) < 0) {
log.setChargeModel(ChargeModelEnum.CHANCE.getType());
logs.add(log);
deviceInformationDOS.removeIf(v -> log.getDeviceNo().equals(v.getDeviceNo()));
logDo.setChargeModel(ChargeModelEnum.CHANCE.getType());
logs.add(logDo);
deviceInformationDOS.removeIf(v -> logDo.getDeviceNo().equals(v.getDeviceNo()));
log.info("分配到机会充电任务 :{} ,充电设备编号是 :{}",logDo.getRobotNo(),logDo.getDeviceNo());
}
}
}

View File

@ -250,7 +250,7 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
Object chargeModelCache = redisUtil.get(chargeModelKey);
Object poseCache = redisUtil.get(pose2dKey);
RobotStatusDataPoseDTO dataPoseDTO = JSON.parseObject((String) poseCache, RobotStatusDataPoseDTO.class);
log.info("机器人编号:{} ,信息: {}", robot.getRobotNo(), JSON.toJSONString(dataPoseDTO));
log.info("充电机器人编号:{} ,信息: {}", robot.getRobotNo(), JSON.toJSONString(dataPoseDTO));
if (ObjectUtil.isEmpty(commonConfigDO) || ObjectUtil.isEmpty(poseCache) || ObjectUtil.isEmpty(dataPoseDTO.getBat_soc())) {
return;

View File

@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.system.service.robot.job;
import cn.iocoder.yudao.module.system.controller.admin.robot.task.TaskPPDistribution;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotChargeLogDO;
import java.util.List;
@ -21,5 +22,5 @@ public interface RobotCommonTaskService {
* 发送充电任务给车机
* @param chargeList
*/
void sendChargeTaskToRobot(List<TaskPPDistribution> chargeList);
void sendChargeTaskToRobot(List<TaskPPDistribution> chargeList,List<RobotChargeLogDO> robotChargeLogs);
}

View File

@ -4,7 +4,6 @@ import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.mqtt.api.common.CommonApi;
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.RobotAcceptTaskDTO;
import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotAcceptTaskData;
@ -14,6 +13,7 @@ import cn.iocoder.yudao.module.system.controller.admin.robot.task.TaskPPDistribu
import cn.iocoder.yudao.module.system.controller.admin.robot.task.TaskPathPlanningDTO;
import cn.iocoder.yudao.module.system.dal.dataobject.actionlog.RobotTaskDetailActionLogDO;
import cn.iocoder.yudao.module.system.dal.dataobject.houselocation.WareHouseLocationDO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotChargeLogDO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDetailDO;
import cn.iocoder.yudao.module.system.dal.mysql.actionlog.RobotTaskDetailActionLogMapper;
import cn.iocoder.yudao.module.system.dal.mysql.houselocation.WareHouseLocationMapper;
@ -91,8 +91,11 @@ public class RobotCommonTaskServiceImpl implements RobotCommonTaskService {
@Value("${zn.robot_doing_action.scan}")
private String scan;
@Value("${zn.robot_doing_action.move}")
private String move;
@Value("${zn.robot_doing_action.parking_space}")
private String parkingSpace;
@Value("${zn.robot_doing_action.charge}")
private String charge;
@Resource
private WareHouseLocationMapper houseLocationMapper;
@ -289,8 +292,8 @@ public class RobotCommonTaskServiceImpl implements RobotCommonTaskService {
List<RobotTaskDetailActionLogDO> logList = new ArrayList<>();
//移动
RobotTaskDetailActionLogDO logOne = new RobotTaskDetailActionLogDO();
String msg = move + robotTaskDetailDO.getToLocationNo();
RobotAcceptTaskData oneMoveAndFork = onlyMove(logOne, serial, v, robotTaskDetailDO, msg);
String msg = parkingSpace + robotTaskDetailDO.getToLocationNo();
RobotAcceptTaskData oneMoveAndFork = onlyMove(logOne, serial, v, msg);
list.add(oneMoveAndFork);
logList.add(logOne);
@ -305,11 +308,9 @@ public class RobotCommonTaskServiceImpl implements RobotCommonTaskService {
* @param logOne
* @param serial
* @param v
* @param robotTaskDetailDO
* @return
*/
private RobotAcceptTaskData onlyMove(RobotTaskDetailActionLogDO logOne, Integer serial, TaskPPDistribution v,
RobotTaskDetailDO robotTaskDetailDO, String msg) {
String msg) {
logOne.setCommandId(getId());
RobotAcceptTaskData robotAcceptTaskData = new RobotAcceptTaskData();
robotAcceptTaskData.setSerial(String.valueOf(serial));
@ -322,7 +323,7 @@ public class RobotCommonTaskServiceImpl implements RobotCommonTaskService {
robotAcceptTaskData.setArg(arg);
logOne.setActionMsg(msg);
setCommand(logOne, robotAcceptTaskData, robotTaskDetailDO);
setCommand(logOne, robotAcceptTaskData, v.getRobotNo());
return robotAcceptTaskData;
}
@ -414,7 +415,7 @@ public class RobotCommonTaskServiceImpl implements RobotCommonTaskService {
robotAcceptTaskData.setArg(arg);
logTwelve.setActionMsg(completeTask);
setCommand(logTwelve, robotAcceptTaskData, robotTaskDetailDO);
setCommand(logTwelve, robotAcceptTaskData, robotTaskDetailDO.getRobotNo());
return robotAcceptTaskData;
}
@ -446,7 +447,7 @@ public class RobotCommonTaskServiceImpl implements RobotCommonTaskService {
robotAcceptTaskData.setArg(arg);
logNight.setActionMsg(String.format("机器人正在前往%s%s", robotTaskDetailDO.getToLocationNo(), "放货"));
setCommand(logNight, robotAcceptTaskData, robotTaskDetailDO);
setCommand(logNight, robotAcceptTaskData, robotTaskDetailDO.getRobotNo());
return robotAcceptTaskData;
}
@ -482,7 +483,7 @@ public class RobotCommonTaskServiceImpl implements RobotCommonTaskService {
RobotArgDTO arg = RobotArgDTO.builder().pose2d(pose2d).build();
robotAcceptTaskData.setArg(arg);
logEight.setActionMsg(msg);
setCommand(logEight, robotAcceptTaskData, robotTaskDetailDO);
setCommand(logEight, robotAcceptTaskData, robotTaskDetailDO.getRobotNo());
return robotAcceptTaskData;
}
@ -504,7 +505,7 @@ public class RobotCommonTaskServiceImpl implements RobotCommonTaskService {
serial++;
robotAcceptTaskData.setCommand_type(CommandTypeEnum.MOVE_TO_PALLET_POSE.getType());
logSix.setActionMsg(msg);
setCommand(logSix, robotAcceptTaskData, robotTaskDetailDO);
setCommand(logSix, robotAcceptTaskData, robotTaskDetailDO.getRobotNo());
return robotAcceptTaskData;
}
@ -526,7 +527,7 @@ public class RobotCommonTaskServiceImpl implements RobotCommonTaskService {
serial++;
robotAcceptTaskData.setCommand_type(CommandTypeEnum.GET_PALLET_TOPIC.getType());
logFour.setActionMsg(getPalletTopic);
setCommand(logFour, robotAcceptTaskData, robotTaskDetailDO);
setCommand(logFour, robotAcceptTaskData, robotTaskDetailDO.getRobotNo());
return robotAcceptTaskData;
}
@ -543,7 +544,7 @@ public class RobotCommonTaskServiceImpl implements RobotCommonTaskService {
robotAcceptTaskData.setArg(arg);
logThree.setActionMsg(scan);
setCommand(logThree, robotAcceptTaskData, robotTaskDetailDO);
setCommand(logThree, robotAcceptTaskData, robotTaskDetailDO.getRobotNo());
return robotAcceptTaskData;
}
@ -586,7 +587,7 @@ public class RobotCommonTaskServiceImpl implements RobotCommonTaskService {
robotAcceptTaskData.setArg(arg);
logTwo.setActionMsg(msg);
setCommand(logTwo, robotAcceptTaskData, robotTaskDetailDO);
setCommand(logTwo, robotAcceptTaskData, robotTaskDetailDO.getRobotNo());
return robotAcceptTaskData;
}
@ -614,13 +615,13 @@ public class RobotCommonTaskServiceImpl implements RobotCommonTaskService {
robotAcceptTaskData.setArg(arg);
logOne.setActionMsg(String.format("机器人正在前往%s%s", robotTaskDetailDO.getFromLocationNo(), "取货"));
setCommand(logOne, robotAcceptTaskData, robotTaskDetailDO);
setCommand(logOne, robotAcceptTaskData, robotTaskDetailDO.getRobotNo());
return robotAcceptTaskData;
}
public void setCommand(RobotTaskDetailActionLogDO logOne, RobotAcceptTaskData robotAcceptTaskData, RobotTaskDetailDO robotTaskDetailDO) {
public void setCommand(RobotTaskDetailActionLogDO logOne, RobotAcceptTaskData robotAcceptTaskData, String robotNo) {
logOne.setCommandType(robotAcceptTaskData.getCommand_type());
logOne.setRobotNo(robotTaskDetailDO.getRobotNo());
logOne.setRobotNo(robotNo);
String str = JSON.toJSONString(robotAcceptTaskData);
if (str.length() > 210) {
logOne.setCommandMsg(str.substring(0, 200));
@ -633,13 +634,82 @@ public class RobotCommonTaskServiceImpl implements RobotCommonTaskService {
/**
* 充电任务
*
* @param chargeList
*/
@Override
@Async(NOTIFY_THREAD_POOL_TASK_EXECUTOR)
public void sendChargeTaskToRobot(List<TaskPPDistribution> chargeList) {
public void sendChargeTaskToRobot(List<TaskPPDistribution> chargeList,List<RobotChargeLogDO> robotChargeLogs) {
if (ObjectUtil.isEmpty(chargeList) || ObjectUtil.isEmpty(robotChargeLogs)) {
return;
}
Map<Long, RobotChargeLogDO> chargeMap =
robotChargeLogs.stream().collect(Collectors.toMap(v -> v.getId(), Function.identity()));
List<RobotTaskDetailActionLogDO> logList = new ArrayList<>();
for (TaskPPDistribution v : chargeList) {
RobotChargeLogDO chargeLogDO = chargeMap.get(v.getId());
RobotAcceptTaskDTO robotTask = new RobotAcceptTaskDTO();
robotTask.setOrder_id(v.getId().toString());
String mac = robotInformationService.getMacByRobotNo(v.getRobotNo());
robotTask.setTopic(RobotTopicConstant.ROBOT_TASK_TOPIC + mac);
robotTask.setOrder_type(RobotTaksOrderTypeEnum.TASK.getType());
Integer serial = 1;
List<RobotAcceptTaskData> list = new ArrayList<>();
//移动
RobotTaskDetailActionLogDO logOne = new RobotTaskDetailActionLogDO();
String msg = charge + chargeLogDO.getDeviceNo();
RobotAcceptTaskData oneMoveAndFork = onlyMove(logOne, serial, v, msg);
list.add(oneMoveAndFork);
robotTask.setData(list);
logList.add(logOne);
log.info("发送给车机下发--充电任务 :{}", JSON.toJSONString(robotTask));
commonApi.commonMethod(robotTask, robotTask.getTopic());
}
//todo 充电后往 task_detail更新下 to_location_no
// todo 后续改为放缓存等车机上报了再插入
taskDetailActionLogMapper.insertBatch(logList);
}
}

View File

@ -1,5 +1,11 @@
package cn.iocoder.yudao.module.system.service.robot.pathplanning;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotChargeLogDO;
import java.util.List;
public interface RobotPathPlanningService {
void sendTaskToPP();
void sendChargeTaskToPP(List<RobotChargeLogDO> logs);
}

View File

@ -16,6 +16,7 @@ import cn.iocoder.yudao.module.system.constant.path.PathPlanningTopicConstant;
import cn.iocoder.yudao.module.system.constant.robot.RobotTopicConstant;
import cn.iocoder.yudao.module.system.dal.dataobject.houselocation.WareHouseLocationDO;
import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapDO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotChargeLogDO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDetailDO;
import cn.iocoder.yudao.module.system.dal.mysql.config.CommonConfigMapper;
@ -132,6 +133,13 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
}
@Override
public void sendChargeTaskToPP(List<RobotChargeLogDO> logs) {
for (RobotChargeLogDO robotChargeLogDO : logs) {
}
}
@Transactional(rollbackFor = Exception.class)
public void distributeTasksToPP(List<RobotInformationDO> robots, List<RobotTaskDetailDO> taskDetailDOS) {
//目前一个点位/线库 只能派一辆车去做
@ -168,7 +176,7 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
for (RobotTaskDetailDO taskDetailDO : taskDetailDOS) {
TaskToPathPlanningDTO pathPlanning = TaskToPathPlanningDTO.builder()
.id(taskDetailDO.getId())
.id(String.valueOf(taskDetailDO.getId()))
.type(TaskTypeEnum.TASK.getType())
.priority(taskDetailDO.getPriority())
.createTime(taskDetailDO.getCreateTime())

View File

@ -243,4 +243,5 @@ zn:
complete_task: 机器人完成任务
get_pallet_topic: 机器人扫描托盘位置
scan: 机器人正在扫描
move: 机器人正在前往停车位
parking_space: 机器人正在前往停车位
charge: 机器人正在前往充电位

View File

@ -287,6 +287,46 @@
order by t1.create_time desc
</select>
<select id="selectLogPageList"
resultType="cn.iocoder.yudao.module.system.controller.admin.robot.detail.RobotTaskDetailLogResoVO">
select
t1.task_no as taskNo,
t1.create_time as createTime,
t2.id,
t2.task_type as taskType,
t2.task_status as taskStatus,
t2.start_time as startTime,
t2.end_time as endTime,
t2.from_location_no as fromLocationNo,
t2.to_location_no as toLocationNo
from
robot_task t1 inner join robot_task_detail t2
on t1.id = t2.robot_task_id
<where>
t1.deleted = '0'
and t2.deleted = '0'
<if test="pageReqVO.taskNo != null and pageReqVO.taskNo != ''">
and t1.task_no like concat('%', #{pageReqVO.taskNo}, '%')
</if>
<if test="pageReqVO.taskType != null and pageReqVO.taskType != ''">
and t2.task_type = #{pageReqVO.taskType}
</if>
<if test="pageReqVO.taskStatus != null">
and t2.task_status = #{pageReqVO.taskStatus}
</if>
<if test="pageReqVO.msg != null and pageReqVO.msg != ''">
and (t2.from_location_no like concat('%', #{pageReqVO.msg}, '%') or t2.to_location_no like concat('%', #{pageReqVO.msg}, '%'))
</if>
<if test="pageReqVO.startTime!=null ">
AND t1.create_time >= #{pageReqVO.startTime}
</if>
<if test="pageReqVO.endTime!=null ">
AND t1.create_time &lt;= #{pageReqVO.endTime}
</if>
</where>
order by t1.create_time desc
</select>
<!--新增所有列-->
<insert id="insertEntity" keyProperty="id" useGeneratedKeys="true">