机器人状态上报
This commit is contained in:
parent
7ed63a7388
commit
64f0f0a32d
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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, "机器人告警信息不存在");
|
||||
|
||||
}
|
||||
|
@ -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())) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
package cn.iocoder.yudao.module.system.constant.robot;
|
||||
|
||||
/**
|
||||
* 机器人错误码
|
||||
*/
|
||||
public class RobotStatusCodeConstant {
|
||||
/**
|
||||
* 成功、正常
|
||||
*/
|
||||
public static final String OK = "1000";
|
||||
}
|
@ -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";
|
||||
}
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
|
||||
}
|
@ -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;
|
||||
|
||||
}
|
@ -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;
|
||||
|
||||
}
|
@ -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") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 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;
|
||||
|
||||
}
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
@ -73,4 +73,11 @@ public interface RobotInformationService {
|
||||
*/
|
||||
List<RobotInformationDO> getAllRobot();
|
||||
|
||||
/**
|
||||
* 查询机器人编号
|
||||
* @param mac
|
||||
* @return
|
||||
*/
|
||||
String getRobotNoByMac(String mac);
|
||||
|
||||
}
|
@ -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 "";
|
||||
}
|
||||
|
||||
}
|
@ -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);
|
||||
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
@ -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 = "";
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user