机器人状态上报

This commit is contained in:
cbs 2025-01-24 11:18:52 +08:00
parent 7ed63a7388
commit 64f0f0a32d
23 changed files with 740 additions and 7 deletions

View File

@ -1,6 +1,9 @@
package cn.iododer.yudao.module.mqtt.service;
import cn.iocoder.yudao.module.system.api.robot.RobotStatusApi;
import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDTO;
import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDataDTO;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@ -18,6 +21,8 @@ public class RobotStatusServiceImpl implements MqttService{
*/
@Override
public void analysisMessage(String message) {
// log.info("处理RobotStatusServiceImpl的消息 :{}",message);
log.info("处理RobotStatusServiceImpl的消息 :{}",message);
RobotStatusDTO robotStatusData = JSON.parseObject(message , RobotStatusDTO.class);
robotStatusApi.robotStatusUpdate(robotStatusData);
}
}

View File

@ -1,11 +1,22 @@
package cn.iocoder.yudao.module.system.api.robot;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.system.api.robot.dto.RobotCompleteTaskDTO;
import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDTO;
import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDataDTO;
import cn.iocoder.yudao.module.system.enums.ApiConstants;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@FeignClient(name = ApiConstants.NAME) // TODO 芋艿fallbackFactory =
@Tag(name = "RPC 服务 - 机器人点位上报")
public interface RobotStatusApi {
String PREFIX = ApiConstants.PREFIX + "/task";
@PostMapping(PREFIX + "/robotStatusUpdate")
@Operation(summary = "机器人点位状态/异常/是否能做任务上报")
void robotStatusUpdate(@RequestBody RobotStatusDTO robotStatusDataDTO);
}

View File

@ -0,0 +1,26 @@
package cn.iocoder.yudao.module.system.api.robot.dto;
import lombok.Data;
@Data
public class RobotStatusDTO {
/**
* 错误码
*/
public String status_code;
/**
* 错误信息
*/
public String message;
/**
* 解决方法
*/
public String solution;
/**
* mac地址
*/
public String mac;
public RobotStatusDataDTO data;
}

View File

@ -0,0 +1,40 @@
package cn.iocoder.yudao.module.system.api.robot.dto;
import lombok.Data;
import java.util.List;
/**
* 机器人点位/异常/能否做任务
*/
@Data
public class RobotStatusDataDTO {
/**
* 机器人位姿
*/
public RobotStatusDataPoseDTO pose2d;
/**
* 货叉高度
*/
public String forkHeight;
/**
* 车辆运行速度
*/
public RobotStatusDataSpeedDTO agv_speed;
/**
* 错误信息
*/
public List<RobotStatusDataErrorDTO> err_code;
/**
* 货物到位传感器触发状态被按下则 true否则 false
*/
public Boolean cargo_detected;
/**
* IDLE RUNNING,类型string
*/
public String task_status;
}

View File

@ -0,0 +1,18 @@
package cn.iocoder.yudao.module.system.api.robot.dto;
import lombok.Data;
/**
* 错误信息
*/
@Data
public class RobotStatusDataErrorDTO {
/**
* 错误码
*/
public String error_code;
/**
* 错误等级
*/
public String code_level;
}

View File

@ -0,0 +1,13 @@
package cn.iocoder.yudao.module.system.api.robot.dto;
import lombok.Data;
/**
* 位姿
*/
@Data
public class RobotStatusDataPoseDTO {
public String y;
public String x;
public String yaw;
}

View File

@ -0,0 +1,18 @@
package cn.iocoder.yudao.module.system.api.robot.dto;
import lombok.Data;
/**
* 车辆运行速度
*/
@Data
public class RobotStatusDataSpeedDTO {
/**
* 线速度 float 单位m/s
*/
public String linear_speed;
/**
* 角速度 float rad/s
*/
public String angle_speed;
}

View File

@ -217,4 +217,7 @@ public interface ErrorCodeConstants {
// ========== 机器人自动移库 1-002-039-000 ==========
ErrorCode TASK_AUTO_MOVE_NOT_EXISTS = new ErrorCode(1_002_039_001, "机器人自动移库不存在");
// ========== 机器人告警信息 1_002_040_001==========
ErrorCode WARN_MSG_NOT_EXISTS = new ErrorCode(1_002_040_001, "机器人告警信息不存在");
}

View File

@ -0,0 +1,50 @@
package cn.iocoder.yudao.module.system.api.robot;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDTO;
import cn.iocoder.yudao.module.system.constant.robot.RobotStatusCodeConstant;
import cn.iocoder.yudao.module.system.constant.robot.RobotTaskChcheConstant;
import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@Slf4j
@RestController // 提供 RESTful API 接口 Feign 调用
@Validated
public class RobotStatusApiImpl implements RobotStatusApi {
@Resource
private RedisUtil redisUtil;
/**
* 更新机器人点位/异常/能否做任务
* @param robotStatusDataDTO
* @return
*/
@Override
public void robotStatusUpdate(RobotStatusDTO robotStatusDataDTO) {
if (ObjectUtil.isNotNull(robotStatusDataDTO) || RobotStatusCodeConstant.OK.equals(robotStatusDataDTO.getStatus_code())
|| ObjectUtil.isEmpty(robotStatusDataDTO.getMac())) {
}
String doTaskKey = RobotTaskChcheConstant.ROBOT_DO_TASK+robotStatusDataDTO.getMac();
String haveTrayKey = RobotTaskChcheConstant.ROBOT_HAVE_TRAY+robotStatusDataDTO.getMac();
String pose2dKey = RobotTaskChcheConstant.ROBOT_POSE2D+robotStatusDataDTO.getMac();
redisUtil.set(doTaskKey, robotStatusDataDTO.getData().getTask_status(),10*60);
redisUtil.set(haveTrayKey,robotStatusDataDTO.getData().getCargo_detected(),10*60);
redisUtil.set(pose2dKey,String.valueOf(robotStatusDataDTO.getData().getCargo_detected()),10*60);
if (ObjectUtil.isNotNull(robotStatusDataDTO.getData().getErr_code())) {
}
}
}

View File

@ -0,0 +1,11 @@
package cn.iocoder.yudao.module.system.constant.robot;
/**
* 机器人错误码
*/
public class RobotStatusCodeConstant {
/**
* 成功正常
*/
public static final String OK = "1000";
}

View File

@ -3,4 +3,16 @@ package cn.iocoder.yudao.module.system.constant.robot;
public class RobotTaskChcheConstant {
//机器人电量
public static String ROBOT_ELECTRICITY = "robot:information:electricity";
//机器人能否做任务
public static String ROBOT_DO_TASK = "robot:information:do:task";
//机器人身上是否有货
public static String ROBOT_HAVE_TRAY = "robot:information:have:tray";
//机器人点位
public static String ROBOT_POSE2D = "robot:information:pose2d";
//机器人mac地址和机器人编号映射
public static String ROBOT_NO_MAPPING_MAC = "robot:information:no:mapping:mac";
}

View File

@ -0,0 +1,97 @@
package cn.iocoder.yudao.module.system.controller.admin.robot;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotWarnMsgPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotWarnMsgRespVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotWarnMsgSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotWarnMsgDO;
import cn.iocoder.yudao.module.system.service.robot.RobotWarnMsgService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
@Tag(name = "管理后台 - 机器人告警信息")
@RestController
@RequestMapping("/robot/warn-msg")
@Validated
public class RobotWarnMsgController {
@Resource
private RobotWarnMsgService warnMsgService;
@PostMapping("/create")
@Operation(summary = "创建机器人告警信息")
@PreAuthorize("@ss.hasPermission('robot:warn-msg:create')")
public CommonResult<Long> createWarnMsg(@Valid @RequestBody RobotWarnMsgSaveReqVO createReqVO) {
return success(warnMsgService.createWarnMsg(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新机器人告警信息")
@PreAuthorize("@ss.hasPermission('robot:warn-msg:update')")
public CommonResult<Boolean> updateWarnMsg(@Valid @RequestBody RobotWarnMsgSaveReqVO updateReqVO) {
warnMsgService.updateWarnMsg(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除机器人告警信息")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('robot:warn-msg:delete')")
public CommonResult<Boolean> deleteWarnMsg(@RequestParam("id") Long id) {
warnMsgService.deleteWarnMsg(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得机器人告警信息")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('robot:warn-msg:query')")
public CommonResult<RobotWarnMsgRespVO> getWarnMsg(@RequestParam("id") Long id) {
RobotWarnMsgDO warnMsg = warnMsgService.getWarnMsg(id);
return success(BeanUtils.toBean(warnMsg, RobotWarnMsgRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得机器人告警信息分页")
@PreAuthorize("@ss.hasPermission('robot:warn-msg:query')")
public CommonResult<PageResult<RobotWarnMsgRespVO>> getWarnMsgPage(@Valid RobotWarnMsgPageReqVO pageReqVO) {
PageResult<RobotWarnMsgDO> pageResult = warnMsgService.getWarnMsgPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, RobotWarnMsgRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出机器人告警信息 Excel")
@PreAuthorize("@ss.hasPermission('robot:warn-msg:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportWarnMsgExcel(@Valid RobotWarnMsgPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<RobotWarnMsgDO> list = warnMsgService.getWarnMsgPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "机器人告警信息.xls", "数据", RobotWarnMsgRespVO.class,
BeanUtils.toBean(list, RobotWarnMsgRespVO.class));
}
}

View File

@ -0,0 +1,41 @@
package cn.iocoder.yudao.module.system.controller.admin.robot.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 机器人告警信息分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class RobotWarnMsgPageReqVO extends PageParam {
@Schema(description = "AGV编号")
private String robotNo;
@Schema(description = "告警等级 (1,2,3,4)")
private Integer warnLevel;
@Schema(description = "告警编号")
private String warnCode;
@Schema(description = "告警信息")
private String warnMsg;
@Schema(description = "告警解决方法")
private String warnSolve;
@Schema(description = "结束时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] solveTime;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@ -0,0 +1,47 @@
package cn.iocoder.yudao.module.system.controller.admin.robot.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - 机器人告警信息 Response VO")
@Data
@ExcelIgnoreUnannotated
public class RobotWarnMsgRespVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "26180")
@ExcelProperty("主键ID")
private Long id;
@Schema(description = "AGV编号")
@ExcelProperty("AGV编号")
private String robotNo;
@Schema(description = "告警等级 (1,2,3,4)")
@ExcelProperty("告警等级 (1,2,3,4)")
private Integer warnLevel;
@Schema(description = "告警编号")
@ExcelProperty("告警编号")
private String warnCode;
@Schema(description = "告警信息")
@ExcelProperty("告警信息")
private String warnMsg;
@Schema(description = "告警解决方法")
@ExcelProperty("告警解决方法")
private String warnSolve;
@Schema(description = "结束时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("结束时间")
private LocalDateTime solveTime;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

View File

@ -0,0 +1,36 @@
package cn.iocoder.yudao.module.system.controller.admin.robot.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 机器人告警信息新增/修改 Request VO")
@Data
public class RobotWarnMsgSaveReqVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "26180")
private Long id;
@Schema(description = "AGV编号")
private String robotNo;
@Schema(description = "告警等级 (1,2,3,4)")
private Integer warnLevel;
@Schema(description = "告警编号")
private String warnCode;
@Schema(description = "告警信息")
private String warnMsg;
@Schema(description = "告警解决方法")
private String warnSolve;
@Schema(description = "结束时间", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "结束时间不能为空")
private LocalDateTime solveTime;
}

View File

@ -0,0 +1,56 @@
package cn.iocoder.yudao.module.system.dal.dataobject.robot;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
/**
* 机器人告警信息 DO
*
* @author 陈宾顺
*/
@TableName("robot_warn_msg")
@KeySequence("robot_warn_msg_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class RobotWarnMsgDO extends BaseDO {
/**
* 主键ID
*/
@TableId
private Long id;
/**
* AGV编号
*/
private String robotNo;
/**
* 告警等级 (1,2,3,4)
*/
private Integer warnLevel;
/**
* 告警编号
*/
private String warnCode;
/**
* 告警信息
*/
private String warnMsg;
/**
* 告警解决方法
*/
private String warnSolve;
/**
* 结束时间
*/
private LocalDateTime solveTime;
}

View File

@ -0,0 +1,32 @@
package cn.iocoder.yudao.module.system.dal.mysql.robot;
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.vo.RobotWarnMsgPageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotWarnMsgDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 机器人告警信息 Mapper
*
* @author 陈宾顺
*/
@Mapper
public interface RobotWarnMsgMapper extends BaseMapperX<RobotWarnMsgDO> {
default PageResult<RobotWarnMsgDO> selectPage(RobotWarnMsgPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<RobotWarnMsgDO>()
.eqIfPresent(RobotWarnMsgDO::getRobotNo, reqVO.getRobotNo())
.eqIfPresent(RobotWarnMsgDO::getWarnLevel, reqVO.getWarnLevel())
.eqIfPresent(RobotWarnMsgDO::getWarnCode, reqVO.getWarnCode())
.eqIfPresent(RobotWarnMsgDO::getWarnMsg, reqVO.getWarnMsg())
.eqIfPresent(RobotWarnMsgDO::getWarnSolve, reqVO.getWarnSolve())
.betweenIfPresent(RobotWarnMsgDO::getSolveTime, reqVO.getSolveTime())
.betweenIfPresent(RobotWarnMsgDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(RobotWarnMsgDO::getId));
}
}

View File

@ -73,4 +73,11 @@ public interface RobotInformationService {
*/
List<RobotInformationDO> getAllRobot();
/**
* 查询机器人编号
* @param mac
* @return
*/
String getRobotNoByMac(String mac);
}

View File

@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.system.dal.mysql.positionmap.PositionMapMapper;
import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotInformationMapper;
import cn.iocoder.yudao.module.system.enums.robot.RobotTaskModelEnum;
import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@ -179,4 +180,29 @@ public class RobotInformationServiceImpl implements RobotInformationService {
return informationMapper.queryAllByLimit(query);
}
/**
* 根据mac查询机器人编号
* @param mac
* @return
*/
@Override
public String getRobotNoByMac(String mac) {
if (ObjectUtil.isEmpty(mac)) {
return "";
}
String robotNo = (String) redisUtil.get(RobotTaskChcheConstant.ROBOT_NO_MAPPING_MAC + mac);
if (ObjectUtil.isNotEmpty(robotNo)) {
return robotNo;
}
RobotInformationDO robotInformationDO = informationMapper.selectOne(new LambdaQueryWrapper<RobotInformationDO>()
.eq(RobotInformationDO::getMacAddress, mac)
.last("limit 1"));
if (ObjectUtil.isNotEmpty(robotInformationDO)) {
return robotInformationDO.getRobotNo();
}
return "";
}
}

View File

@ -0,0 +1,56 @@
package cn.iocoder.yudao.module.system.service.robot;
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.vo.RobotWarnMsgPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotWarnMsgSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotWarnMsgDO;
/**
* 机器人告警信息 Service 接口
*
* @author 陈宾顺
*/
public interface RobotWarnMsgService {
/**
* 创建机器人告警信息
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createWarnMsg(@Valid RobotWarnMsgSaveReqVO createReqVO);
/**
* 更新机器人告警信息
*
* @param updateReqVO 更新信息
*/
void updateWarnMsg(@Valid RobotWarnMsgSaveReqVO updateReqVO);
/**
* 删除机器人告警信息
*
* @param id 编号
*/
void deleteWarnMsg(Long id);
/**
* 获得机器人告警信息
*
* @param id 编号
* @return 机器人告警信息
*/
RobotWarnMsgDO getWarnMsg(Long id);
/**
* 获得机器人告警信息分页
*
* @param pageReqVO 分页查询
* @return 机器人告警信息分页
*/
PageResult<RobotWarnMsgDO> getWarnMsgPage(RobotWarnMsgPageReqVO pageReqVO);
}

View File

@ -0,0 +1,74 @@
package cn.iocoder.yudao.module.system.service.robot;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotWarnMsgPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotWarnMsgSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotWarnMsgDO;
import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotWarnMsgMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.WARN_MSG_NOT_EXISTS;
/**
* 机器人告警信息 Service 实现类
*
* @author 陈宾顺
*/
@Service
@Validated
public class RobotWarnMsgServiceImpl implements RobotWarnMsgService {
@Resource
private RobotWarnMsgMapper warnMsgMapper;
@Override
public Long createWarnMsg(RobotWarnMsgSaveReqVO createReqVO) {
// 插入
RobotWarnMsgDO warnMsg = BeanUtils.toBean(createReqVO, RobotWarnMsgDO.class);
warnMsgMapper.insert(warnMsg);
// 返回
return warnMsg.getId();
}
@Override
public void updateWarnMsg(RobotWarnMsgSaveReqVO updateReqVO) {
// 校验存在
validateWarnMsgExists(updateReqVO.getId());
// 更新
RobotWarnMsgDO updateObj = BeanUtils.toBean(updateReqVO, RobotWarnMsgDO.class);
warnMsgMapper.updateById(updateObj);
}
@Override
public void deleteWarnMsg(Long id) {
// 校验存在
validateWarnMsgExists(id);
// 删除
warnMsgMapper.deleteById(id);
}
private void validateWarnMsgExists(Long id) {
if (warnMsgMapper.selectById(id) == null) {
throw exception(WARN_MSG_NOT_EXISTS);
}
}
@Override
public RobotWarnMsgDO getWarnMsg(Long id) {
return warnMsgMapper.selectById(id);
}
@Override
public PageResult<RobotWarnMsgDO> getWarnMsgPage(RobotWarnMsgPageReqVO pageReqVO) {
return warnMsgMapper.selectPage(pageReqVO);
}
}

View File

@ -29,6 +29,8 @@ import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
@ -161,15 +163,17 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
Set<Long> taskIds = new HashSet<>();
//需要更新的机器人编号
Set<String> robotNos = new HashSet<>();
//当前需要移动的库位id
Set<Long> doingLocationIds = new HashSet<>();
for (RobotTaskDetailDO taskDetailDO : taskDetailDOS) {
if (ObjectUtil.isEmpty(robots)) {
break;
}
// todo 后续建个移库记录表 记录 库位A移动到库位B
RobotTaskTypeEnum robotTaskType = RobotTaskTypeEnum.getRobotTaskType(taskDetailDO.getTaskType());
switch (robotTaskType) {
case TAKE_RELEASE:
doTakeReleaseDistribute(taskDetailDO, robots,robotTaskDOS,taskIds,updateTaskDetails,robotNos);
doTakeReleaseDistribute(taskDetailDO, robots,robotTaskDOS,taskIds,updateTaskDetails,robotNos,doingLocationIds);
break;
/*case PARK:
doParkDistribute(taskDetailDO, robots,robotTaskDOS);
@ -397,7 +401,8 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
@Transactional(rollbackFor = Exception.class)
public void doTakeReleaseDistribute(RobotTaskDetailDO taskDetailDO, List<RobotInformationDO> robots,
List<RobotAcceptTaskDTO> robotTaskDOS,Set<Long> taskIdSet,
List<RobotTaskDetailDO> updateTaskDetail, Set<String> robotNos) {
List<RobotTaskDetailDO> updateTaskDetail, Set<String> robotNos
,Set<Long> doingLocationIds) {
WareHouseLocationDO query = WareHouseLocationDO.builder().id(taskDetailDO.getFromLocationId()).build();
WareHouseLocationDO fromLocation = locationMapper.queryAllByLimit(query);
@ -413,7 +418,15 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
return;
}
// todo 需要校验取放线库 都没有移库的任务
// 取货/放货 校验有没有其他库位挡住
Boolean fromCanMove = checkCanMove(fromLocation,doingLocationIds);
if (!fromCanMove) {
return;
}
Boolean toCanMove = checkCanMove(toLocation,doingLocationIds);
if (!toCanMove) {
return;
}
RobotAcceptTaskDTO robotTaskDO = new RobotAcceptTaskDTO();
robotTaskDO.setOrder_id(taskDetailDO.getId().toString());
@ -603,6 +616,47 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
taskIdSet.add(taskDetailDO.getRobotTaskId());
}
/**
* 校验当前库位能否取放
* @param fromLocation
* @return false : 有货不能移动 true: 没货 能移动
*/
private Boolean checkCanMove(WareHouseLocationDO fromLocation, Set<Long> locationIds) {
Long laneId = fromLocation.getLaneId();
if (ObjectUtil.isEmpty(laneId)) {
Set<Long> doingLocationIds = new HashSet<>();
doingLocationIds.add(fromLocation.getId());
List<WareHouseLocationDO> locationDOS = locationMapper.selectNeedMoveLocation(doingLocationIds);
locationDOS = locationDOS.stream()
.filter(v -> !locationIds.contains(v.getId()))
.collect(Collectors.toList());
if (ObjectUtil.isNotEmpty(locationDOS)) {
// todo 后续记录到异常表
log.info("普通库位--库位上有其他货物, 库位号:{} ,无法进行移动 :{}",fromLocation.getLocationNo() ,locationDOS);
return false;
}
} else {
List<WareHouseLocationDO> locations = new ArrayList<>();
WareHouseLocationDO location = WareHouseLocationDO.builder().locationNumber(fromLocation.getLocationNumber())
.locationUseStatus(LocationUseStatusEnum.YES.getType())
.laneId(fromLocation.getLaneId()).build();
locations.add(location);
List<WareHouseLocationDO> wareHouseLocationDOS = locationMapper.selectLocationByList(locations);
wareHouseLocationDOS = wareHouseLocationDOS.stream()
.filter(v -> !locationIds.contains(v.getId()))
.collect(Collectors.toList());
if (ObjectUtil.isNotEmpty(wareHouseLocationDOS)) {
// todo 后续记录到异常表
log.info("线库-当前库位上有其他货物, 库位号:{},无法进行移动 :{}",fromLocation.getLocationNo() ,wareHouseLocationDOS);
return false;
}
}
locationIds.add(fromLocation.getId());
return true;
}
public Pair<String, String> getMadAddressRobotNo(RobotTaskDetailDO taskDetailDO, List<RobotInformationDO> robots,
WareHouseLocationDO fromLocation, WareHouseLocationDO toLocation) {
String macAddress = "";

View File

@ -213,13 +213,13 @@ public class RobotTaskAutoMoveServiceImpl implements RobotTaskAutoMoveService {
}
List<WareHouseLocationDO> locationDOS = locationMapper.selectNeedMoveLocation(doingLocationIds);
if (ObjectUtil.isEmpty(locationDOS)) {
log.info("暂无需要自动移库的库位 :{}" ,robotTaskDetailDO);
log.info("暂无需要自动移库的库位 :{}" ,String.valueOf(robotTaskDetailDO));
continue;
}
boolean enableOrLock = locationDOS.stream().anyMatch(v -> LocationEnableEnum.NO.getType().equals(v.getLocationEnable())
|| LocationLockEnum.NO.getType().equals(v.getLocationLock()));
if (enableOrLock) {
log.info("此库位被锁定或者禁用,无法执行移库 :{}",locationDOS);
log.info("此库位被锁定或者禁用,无法执行移库 :{}",String.valueOf(locationDOS));
//todo 后期加到告警表里面 方便排查问题
continue;
}