diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index 7ea92facd..cd5ce903b 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -191,9 +191,13 @@ public interface ErrorCodeConstants { ErrorCode TASK_CYCLE_NOT_OPEN = new ErrorCode(1-002-035-003, "循环任务的配置未开启!"); ErrorCode TASK_ONLY_CHOOSE_LOCATION = new ErrorCode(1-002-035-004, "搬空任务只能选择线库或者区域"); ErrorCode TASK_CHECK_EXCEPTION = new ErrorCode(1-002-035-005, "任务下发失败"); + ErrorCode TASK_CHECK_ID_EXCEPTION = new ErrorCode(1-002-035-006, "请输入ID"); + ErrorCode TASK_CHECK_TASK_PRIORITY = new ErrorCode(1-002-035-007, "非新单据不能修改优先级"); + ErrorCode TASK_CHECK_TASK_STATUS = new ErrorCode(1-002-035-100, "订单已完成"); // ========== 机器人任务明细 1-002-036-000 ========== ErrorCode TASK_DETAIL_NOT_EXISTS = new ErrorCode(1-002-036-001, "机器人任务明细不存在"); + ErrorCode TASK_DETAIL_CHANGE_ROBOT = new ErrorCode(1-002-036-002, "非新单据不能修改车辆"); // ========== 机器人任务明细 1-002-037-000 ========== ErrorCode REDISSON_NOT_OBTAIN_LOCK = new ErrorCode(1-002-037-001, "有正在下发中的任务请稍后重试!"); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotTaskStatusApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotTaskStatusApiImpl.java index a924c8187..47ef544f2 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotTaskStatusApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotTaskStatusApiImpl.java @@ -3,9 +3,14 @@ package cn.iocoder.yudao.module.system.api.robot; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; import cn.iocoder.yudao.module.system.api.robot.dto.RobotCompleteTaskDTO; +import cn.iocoder.yudao.module.system.constant.robot.RobotExecutionStateConstant; +import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO; +import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDO; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDetailDO; +import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotInformationMapper; import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotTaskDetailMapper; import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotTaskMapper; +import cn.iocoder.yudao.module.system.enums.robot.RobotStatusEnum; import cn.iocoder.yudao.module.system.enums.robot.RobotTaskDetailStatusEnum; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; @@ -14,6 +19,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RestController; +import javax.annotation.Resource; import java.time.LocalDateTime; import java.util.List; @@ -28,6 +34,9 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi { @Autowired private RobotTaskMapper robotTaskMapper; + @Autowired@Resource + private RobotInformationMapper robotInformationMapper; + /** * 机器人完成任务上报 * @param robotCompleteTaskDTO @@ -38,20 +47,36 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi { public CommonResult robotDoneTask(RobotCompleteTaskDTO robotCompleteTaskDTO) { log.info("机器人完成任务上报 :{}", JSON.toJSONString(robotCompleteTaskDTO)); TenantContextHolder.setTenantId(1L); - + if (RobotExecutionStateConstant.UN_DO.equals(robotCompleteTaskDTO.getExecution_state())) { + return CommonResult.success(Boolean.TRUE); + } + //更新任务状态 RobotTaskDetailDO detailDO = new RobotTaskDetailDO(); detailDO.setId(robotCompleteTaskDTO.getOrder_id()); detailDO.setEndTime(LocalDateTime.now()); detailDO.setTaskStatus(robotCompleteTaskDTO.getExecution_state()); robotTaskDetailMapper.updateRobotDetailById(detailDO); - + //更新任务状态 RobotTaskDetailDO robotTaskDetailDO = robotTaskDetailMapper.selectById(robotCompleteTaskDTO.getOrder_id()); List taskDetails = robotTaskDetailMapper.queryByTaskId(robotTaskDetailDO.getRobotTaskId()); - boolean b = + boolean done = taskDetails.stream().allMatch(v -> (v.getTaskStatus().equals(RobotTaskDetailStatusEnum.DONE.getType()) || v.getTaskStatus().equals(RobotTaskDetailStatusEnum.CLOSE.getType()) )); - if(b) { - robotTaskMapper.updateRobotStatus(taskDetails.get(0).getRobotTaskId(), RobotTaskDetailStatusEnum.DONE.getType()); + if(done) { + RobotTaskDO robotTaskDO = new RobotTaskDO(); + robotTaskDO.setId(taskDetails.get(0).getRobotTaskId()); + robotTaskDO.setEndTime(LocalDateTime.now()); + robotTaskDO.setTaskStatus(RobotTaskDetailStatusEnum.DONE.getType()); + robotTaskMapper.updateRobot(robotTaskDO); + } + //更新机器人任务状态 + if (RobotExecutionStateConstant.DONE.equals(robotCompleteTaskDTO.getExecution_state()) || + RobotExecutionStateConstant.CLOSE.equals(robotCompleteTaskDTO.getExecution_state())) { + RobotInformationDO query = new RobotInformationDO(); + query.setMacAddress(robotCompleteTaskDTO.getMac()); + List existRobotMac = robotInformationMapper.queryAllByLimit(query); + String robotNo = existRobotMac.get(0).getRobotNo(); + robotInformationMapper.updateRobotStatus(robotNo, RobotStatusEnum.STAND_BY.getType()); } return CommonResult.success(true); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/robot/RobotExecutionStateConstant.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/robot/RobotExecutionStateConstant.java new file mode 100644 index 000000000..f37d06e9f --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/robot/RobotExecutionStateConstant.java @@ -0,0 +1,17 @@ +package cn.iocoder.yudao.module.system.constant.robot; + +/** + * 机器人上报的状态 + */ +public class RobotExecutionStateConstant { + //未开始 + public static Integer UN_DO = 0; + //正在做 + public static Integer DOING = 1; + //已完成 + public static Integer DONE = 2; + //已取消 + public static Integer CLOSE = 3; + //已失败 + public static Integer FAIL = 4; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/RobotInformationController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/RobotInformationController.java index dc38ddbcc..1d1ff9ef8 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/RobotInformationController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/RobotInformationController.java @@ -101,4 +101,12 @@ public class RobotInformationController { return success(informationService.statisticsInformation()); } + @PostMapping("/getCanUseRobot") + @Operation(summary = "查询能正常使用的车辆") + @PreAuthorize("@ss.hasPermission('robot:information:getCanUseRobot')") + public CommonResult> getCanUseRobot() { + List result = informationService.getCanUseRobot(); + return success(BeanUtils.toBean(result, RobotInformationRespVO.class)); + } + } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/RobotTaskController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/RobotTaskController.java index aaa3c9b50..903752224 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/RobotTaskController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/RobotTaskController.java @@ -74,11 +74,19 @@ public class RobotTaskController { return success(BeanUtils.toBean(task, RobotTaskRespVO.class)); } + @GetMapping("/getTaskNo") + @Operation(summary = "获得任务号") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('robot:task:getTaskNo')") + public CommonResult getTaskNo() { + return success(taskService.getTaskNo()); + } + @GetMapping("/page") @Operation(summary = "获得机器人任务主表分页") @PreAuthorize("@ss.hasPermission('robot:task:query')") public CommonResult> getTaskPage(@Valid RobotTaskPageReqVO pageReqVO) { - PageResult pageResult = taskService.getTaskPage(pageReqVO); + PageResult pageResult = taskService.getTaskPage(pageReqVO); return success(BeanUtils.toBean(pageResult, RobotTaskRespVO.class)); } @@ -89,7 +97,7 @@ public class RobotTaskController { public void exportTaskExcel(@Valid RobotTaskPageReqVO pageReqVO, HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List list = taskService.getTaskPage(pageReqVO).getList(); + List list = taskService.getTaskPage(pageReqVO).getList(); // 导出 Excel ExcelUtils.write(response, "机器人任务主表.xls", "数据", RobotTaskRespVO.class, BeanUtils.toBean(list, RobotTaskRespVO.class)); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskDetailAddVo.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskDetailAddVo.java index f42eb50b6..78b22de52 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskDetailAddVo.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskDetailAddVo.java @@ -31,6 +31,11 @@ public class RobotTaskDetailAddVo { @Schema(description = "AGV编号") private String robotNo; + @Schema(description = "停车后是否锁定(0:否、1:是)") + private Integer needLock; + @Schema(description = "所选车辆电量(充电模式)") + private Integer electricity; + @Schema(description = "计算后的来源库位编号(前端不用传此字段)") private String fromLocationNo; @Schema(description = "计算后的来源库位id(前端不用传此字段)") diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskDetailPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskDetailPageReqVO.java index 9efa5f792..79d86b125 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskDetailPageReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskDetailPageReqVO.java @@ -71,4 +71,8 @@ public class RobotTaskDetailPageReqVO extends PageParam { private Integer toLocationStorey; @Schema(description = "优先级") private Long priority; + @Schema(description = "停车后是否锁定(0:否、1:是)") + private Integer needLock; + @Schema(description = "所选车辆电量(充电模式)") + private Integer electricity; } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskDetailRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskDetailRespVO.java index b1cd674aa..d597bb276 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskDetailRespVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskDetailRespVO.java @@ -87,5 +87,11 @@ public class RobotTaskDetailRespVO { @Schema(description = "优先级") @ExcelProperty("优先级") private Long priority; + @Schema(description = "停车后是否锁定(0:否、1:是)") + @ExcelProperty("停车后是否锁定(0:否、1:是)") + private Integer needLock; + @Schema(description = "所选车辆电量(充电模式)") + @ExcelProperty("所选车辆电量(充电模式)") + private Integer electricity; } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskDetailSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskDetailSaveReqVO.java index 11b7b45d4..32a23e67c 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskDetailSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskDetailSaveReqVO.java @@ -71,5 +71,9 @@ public class RobotTaskDetailSaveReqVO { private Integer toLocationStorey; @Schema(description = "优先级") private Long priority; + @Schema(description = "停车后是否锁定(0:否、1:是)") + private Integer needLock; + @Schema(description = "所选车辆电量(充电模式)") + private Integer electricity; } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskPageReqVO.java index 7f6bad898..1ca7d987b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskPageReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskPageReqVO.java @@ -52,7 +52,7 @@ public class RobotTaskPageReqVO extends PageParam { private String taskNo; @Schema(description = "任务状态(0:未开始、1:执行中、2:已完成、3:已取消)", example = "2") - private Long taskStatus; + private Integer taskStatus; @Schema(description = "任务阶段(0:待执行、1:前往取货、2:取货中、3:运输中、4:放货中、5:结束)") private Long taskStage; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskRespVO.java index c5ca73e4a..34abc01a3 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskRespVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskRespVO.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.system.controller.admin.robot.vo; +import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDetailDO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.util.*; @@ -7,6 +8,8 @@ import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; import com.alibaba.excel.annotation.*; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + @Schema(description = "管理后台 - 机器人任务主表 Response VO") @Data @ExcelIgnoreUnannotated @@ -66,7 +69,7 @@ public class RobotTaskRespVO { @Schema(description = "任务状态(0:未开始、1:执行中、2:已完成、3:已取消)", example = "2") @ExcelProperty("任务状态(0:未开始、1:执行中、2:已完成、3:已取消)") - private Long taskStatus; + private Integer taskStatus; @Schema(description = "任务阶段(0:待执行、1:前往取货、2:取货中、3:运输中、4:放货中、5:结束)") @ExcelProperty("任务阶段(0:待执行、1:前往取货、2:取货中、3:运输中、4:放货中、5:结束)") @@ -74,14 +77,19 @@ public class RobotTaskRespVO { @Schema(description = "开始时间") @ExcelProperty("开始时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime startTime; @Schema(description = "结束时间") @ExcelProperty("结束时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime endTime; @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime createTime; + @Schema(description = "子任务明细") + List details; } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskSaveReqVO.java index 8f05b3fa7..28a563cc8 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskSaveReqVO.java @@ -57,7 +57,7 @@ public class RobotTaskSaveReqVO { private String taskNo; @Schema(description = "任务状态(0:未开始、1:执行中、2:已完成、3:已取消)", example = "2") - private Long taskStatus; + private Integer taskStatus; @Schema(description = "任务阶段(0:待执行、1:前往取货、2:取货中、3:运输中、4:放货中、5:结束)") private Long taskStage; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/robot/RobotTaskDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/robot/RobotTaskDO.java index 5f02112b5..63ba237f6 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/robot/RobotTaskDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/robot/RobotTaskDO.java @@ -80,7 +80,7 @@ public class RobotTaskDO extends BaseDO { /** * 任务状态(0:未开始、1:执行中、2:已完成、3:已取消) */ - private Long taskStatus; + private Integer taskStatus; /** * 任务阶段(0:待执行、1:前往取货、2:取货中、3:运输中、4:放货中、5:结束) */ diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/robot/RobotTaskDetailDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/robot/RobotTaskDetailDO.java index 37fffcc06..c5c6a17c2 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/robot/RobotTaskDetailDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/robot/RobotTaskDetailDO.java @@ -1,6 +1,5 @@ package cn.iocoder.yudao.module.system.dal.dataobject.robot; -import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.time.LocalDateTime; @@ -104,5 +103,12 @@ public class RobotTaskDetailDO extends BaseDO { * 优先级 */ private Long priority; - + /** + * 停车后是否锁定(0:否、1:是) + */ + private Integer needLock; + /** + * 所选车辆电量(充电模式) + */ + private Integer electricity; } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotTaskDetailMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotTaskDetailMapper.java index a26d3e8d9..458785827 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotTaskDetailMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotTaskDetailMapper.java @@ -58,7 +58,7 @@ public interface RobotTaskDetailMapper extends BaseMapperX { * 查询未执行的明细任务 * @return */ - List getUnDoTask(); + List getUnDoTask(@Param("taskIds") List taskIds); List queryByTaskId(@Param("robotTaskId") Long robotTaskId); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotTaskMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotTaskMapper.java index 2e56eebb5..089a03eb0 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotTaskMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotTaskMapper.java @@ -40,12 +40,16 @@ public interface RobotTaskMapper extends BaseMapperX { .orderByDesc(RobotTaskDO::getId)); } + /** + * 更新 + * @param robotTaskDO + */ + void updateRobot(RobotTaskDO robotTaskDO); /** - * 更新任务状态 - * @param id - * @param taskStatus + * 获取未完成的订单id + * @return */ - void updateRobotStatus(@Param("id") Long id, - @Param("taskStatus") Integer taskStatus); + List getUnDoAndDoingTaskIds(); + } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/redis/RobotCacheLockEnum.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/redis/RobotCacheLockEnum.java index 7ff482451..d34cbcccd 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/redis/RobotCacheLockEnum.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/redis/RobotCacheLockEnum.java @@ -12,6 +12,7 @@ public enum RobotCacheLockEnum { TASK_NO("task:robot:no", "任务号"), ROBOT_TASK_ADD_LOCK("robot:task:add:lock", "所有创建机器人任务的锁"), + //取消订单、修改优先级 ROBOT_TASK_DISTRIBUTE_LOCK("robot:task:distribute:lock", "下发任务给机器人的锁"), ROBOT_TASK_LOCATION_LOCK("robot:task:location:lock", "库位取/放任务下发互斥锁(仅仅锁某个库位)"), ROBOT_TASK_LANE_LOCK("robot:task:lane:lock", "线库/巷道, 取/放任务下发互斥锁(仅仅锁某个线库/巷道)"), diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/robot/RobotTaskTypeEnum.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/robot/RobotTaskTypeEnum.java new file mode 100644 index 000000000..813447a2d --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/robot/RobotTaskTypeEnum.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.system.enums.robot; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum RobotTaskTypeEnum { + TAKE_RELEASE(1),//取放货 + PARK(2),//停车 + CHARGE(3),//充电 + MOVE(4),//移动 + TAKE(5),//仅取货 + RELEASE(6),//仅放货 + SCAN(7),//扫描码 + DETECTING_TRAYS(8); //检测托盘类型 + /** + * 类型 + */ + private final Integer type; + + public static RobotTaskTypeEnum getRobotTaskType(Integer type) { + for (RobotTaskTypeEnum item : RobotTaskTypeEnum.values()) { + if (item.getType().equals(type)) { + return item; + } + } + return null; + } +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationService.java index 453c022ea..b734d4281 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationService.java @@ -60,4 +60,10 @@ public interface RobotInformationService { * @return */ RobotInformationStatisticsVO statisticsInformation(); + + /** + * 查询能正常使用的车辆 + * @return + */ + List getCanUseRobot(); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationServiceImpl.java index 90da1a77d..0f9c464fa 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationServiceImpl.java @@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapDO; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO; 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 org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -161,4 +162,15 @@ public class RobotInformationServiceImpl implements RobotInformationService { return info; } + /** + * + * @return + */ + @Override + public List getCanUseRobot() { + RobotInformationDO query = new RobotInformationDO(); + query.setRobotTaskModel(RobotTaskModelEnum.NORMAL.getType()); + return informationMapper.queryAllByLimit(query); + } + } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskDetailServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskDetailServiceImpl.java index dc0cf6b0f..b021c297d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskDetailServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskDetailServiceImpl.java @@ -1,10 +1,12 @@ package cn.iocoder.yudao.module.system.service.robot; +import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskDetailAddVo; import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskDetailPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskDetailSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDetailDO; import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotTaskDetailMapper; +import cn.iocoder.yudao.module.system.enums.robot.RobotTaskDetailStatusEnum; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -19,6 +21,7 @@ import java.util.Collections; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.TASK_DETAIL_CHANGE_ROBOT; import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.TASK_DETAIL_NOT_EXISTS; @@ -47,6 +50,11 @@ public class RobotTaskDetailServiceImpl implements RobotTaskDetailService { public void updateTaskDetail(RobotTaskDetailSaveReqVO updateReqVO) { // 校验存在 validateTaskDetailExists(updateReqVO.getId()); + RobotTaskDetailDO robotTaskDetailDO = taskDetailMapper.selectById(updateReqVO.getId()); + if (ObjectUtil.isNotEmpty(updateReqVO.getRobotNo()) && + !RobotTaskDetailStatusEnum.NEW.getType().equals(robotTaskDetailDO.getTaskStatus())) { + throw exception(TASK_DETAIL_CHANGE_ROBOT); + } // 更新 RobotTaskDetailDO updateObj = BeanUtils.toBean(updateReqVO, RobotTaskDetailDO.class); taskDetailMapper.updateById(updateObj); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskService.java index 60430edc3..34954dcfe 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskService.java @@ -5,6 +5,7 @@ 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.RobotTaskPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskRespVO; import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDO; @@ -51,6 +52,11 @@ public interface RobotTaskService { * @param pageReqVO 分页查询 * @return 机器人任务主表分页 */ - PageResult getTaskPage(RobotTaskPageReqVO pageReqVO); + PageResult getTaskPage(RobotTaskPageReqVO pageReqVO); + /** + * 获取任务号 + * @return + */ + String getTaskNo(); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskServiceImpl.java index 28b49fda6..e48474712 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskServiceImpl.java @@ -1,11 +1,10 @@ package cn.iocoder.yudao.module.system.service.robot; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.common.util.date.DateUtils; -import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotInformationPageReqVO; -import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskDetailAddVo; -import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskPageReqVO; -import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskSaveReqVO; +import cn.iocoder.yudao.module.system.constant.robot.RobotTaskChcheConstant; +import cn.iocoder.yudao.module.system.controller.admin.robot.vo.*; import cn.iocoder.yudao.module.system.dal.dataobject.houselocation.WareHouseLocationDO; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDO; @@ -169,7 +168,7 @@ public class RobotTaskServiceImpl implements RobotTaskService { //查找库位 if (MoveAllEnum.NO.getType().equals(createReqVO.getDoMoveAll())) { - setSingleLocationIdNo(createReqVO.getTaskDetailList(),task.getId()); + setSingleLocationIdNo(createReqVO.getTaskDetailList(),task); } else { setAllLocationIdNo(createReqVO,task.getId()); } @@ -323,91 +322,230 @@ public class RobotTaskServiceImpl implements RobotTaskService { * @return */ @Transactional(rollbackFor = Exception.class) - public void setSingleLocationIdNo(List taskDetailList, Long taskId){ + public void setSingleLocationIdNo(List taskDetailList, RobotTaskDO task){ List locationIds = new ArrayList<>(); for (RobotTaskDetailAddVo robotTaskVo : taskDetailList) { - Set mapIds = new HashSet<>(); - if (ObjectUtil.isNotEmpty(robotTaskVo.getRobotNo())) { - RobotInformationPageReqVO pageReqVO = new RobotInformationPageReqVO(); - pageReqVO.setRobotNo(robotTaskVo.getRobotNo()); - mapIds = informationMapper.selectPage(pageReqVO).getList() - .stream() - .findFirst() - .map(RobotInformationDO::getFloorAreaJson) - .orElse(new HashSet<>()); + robotTaskVo.setRobotTaskId(task.getId()); + robotTaskVo.setPriority(task.getPriority()); + RobotTaskTypeEnum robotTaskType = RobotTaskTypeEnum.getRobotTaskType(robotTaskVo.getTaskType()); + switch (robotTaskType){ + case TAKE_RELEASE: + doTakeRelease(robotTaskVo,locationIds); + break; + case PARK: + doPark(robotTaskVo); + break; + case CHARGE: + doCharge(robotTaskVo); + break; + case MOVE: + doMove(robotTaskVo); + break; + case TAKE: + doTake(robotTaskVo); + break; + case RELEASE: + doRelease(robotTaskVo); + break; + case SCAN: + doScan(robotTaskVo); + break; + case DETECTING_TRAYS: + doDetectingTrays(robotTaskVo); + break; + default : + log.error("任务类型不存在 "); + throw new RuntimeException("任务类型不存在"); } - - //校验放货库位 - if (ReleaseTakeEnum.TO_LOCATION.getType().equals(robotTaskVo.getReleaseType())) { - WareHouseLocationDO query = WareHouseLocationDO.builder().id(robotTaskVo.getReleaseId()).build(); - WareHouseLocationDO locationDO = locationMapper.queryAllByLimit(query); - robotTaskVo.setToLocationNo(locationDO.getLocationNo()); - robotTaskVo.setToLocationId(robotTaskVo.getReleaseId()); - robotTaskVo.setToLocationStorey(locationDO.getLocationStorey()); - if (ObjectUtil.isNotEmpty(mapIds) && !mapIds.contains(locationDO.getMapId())) { - log.error("机器人不能在此放货库位放货 :{}, 机器人编号 :{}", locationDO.getLocationNo(),robotTaskVo.getRobotNo()); - throw new RuntimeException("机器人不能在此放货库位放货 "+ robotTaskVo.getReleaseId()); - } - } else { - WareHouseLocationDO wareHouseLocationDO = - locationMapper.selectByTypeAndId(LocationUseStatusEnum.NO.getType(), robotTaskVo.getReleaseType() - ,robotTaskVo.getReleaseId(),locationIds,mapIds); - if (ObjectUtil.isEmpty(wareHouseLocationDO)) { - log.error("放货库位为空或者已锁定或者机器人取放货区域受限制 :{}", robotTaskVo.getReleaseId()); - throw new RuntimeException("放货库位为空或者已锁定或者机器人取放货区域受限制 "+ robotTaskVo.getReleaseId()); - } - robotTaskVo.setToLocationNo(wareHouseLocationDO.getLocationNo()); - robotTaskVo.setToLocationId(wareHouseLocationDO.getId()); - robotTaskVo.setToLocationStorey(wareHouseLocationDO.getLocationStorey()); - } - robotTaskVo.setPriority(robotTaskVo.getPriority()); - locationIds.add(robotTaskVo.getToLocationId()); - //校验取货库位 - if (ReleaseTakeEnum.TO_LOCATION.getType().equals(robotTaskVo.getTakeType())) { - WareHouseLocationDO query = WareHouseLocationDO.builder().id(robotTaskVo.getTakeId()).build(); - WareHouseLocationDO locationDO = locationMapper.queryAllByLimit(query); - robotTaskVo.setFromLocationNo(locationDO.getLocationNo()); - robotTaskVo.setFromLocationId(robotTaskVo.getTakeId()); - robotTaskVo.setFromLocationStorey(locationDO.getLocationStorey()); - if (ObjectUtil.isNotEmpty(mapIds) && !mapIds.contains(locationDO.getMapId())) { - log.error("机器人不能在此取货库位取货 :{}, 机器人编号 :{}", locationDO.getLocationNo(),robotTaskVo.getRobotNo()); - throw new RuntimeException("机器人不能在此取货库位取货 "+ robotTaskVo.getTakeId()); - } - } else { - WareHouseLocationDO wareHouseLocationDO = - locationMapper.selectByTypeAndId(LocationUseStatusEnum.YES.getType(),robotTaskVo.getTakeType(), - robotTaskVo.getTakeId(),locationIds,mapIds); - if (ObjectUtil.isEmpty(wareHouseLocationDO)) { - log.error("取货库位为空或者已锁定或者机器人取放货区域受限制 :{}", robotTaskVo.getTakeId()); - throw new RuntimeException("取货库位为空或者已锁定或者机器人取放货区域受限制 "+ robotTaskVo.getTakeId()); - } - robotTaskVo.setFromLocationNo(wareHouseLocationDO.getLocationNo()); - robotTaskVo.setFromLocationId(wareHouseLocationDO.getId()); - robotTaskVo.setFromLocationStorey(wareHouseLocationDO.getLocationStorey()); - } - locationIds.add(robotTaskVo.getFromLocationId()); - //验证取货库位是否存在未完成的任务 - Set set = new HashSet<>(); - set.add(robotTaskVo.getFromLocationId()); - List doingTasks = taskDetailMapper.queryDoingTaskByIds(set); - if (ObjectUtil.isNotEmpty(doingTasks)) { - log.error("取货库位,存在未完成的任务 :{}", robotTaskVo.getTakeId()); - throw new RuntimeException("取货库位,存在未完成的任务"); - } - - //设置为锁定 - locationMapper.updateLocationLockStatus(robotTaskVo.getToLocationId(),0,taskId); - locationMapper.updateLocationLockStatus(robotTaskVo.getFromLocationId(),0,taskId); } } + /** + * 检测托盘类型 + * @param robotTaskVo + */ + private void doDetectingTrays(RobotTaskDetailAddVo robotTaskVo) { + + } + + /** + * 扫描码 + * @param robotTaskVo + */ + private void doScan(RobotTaskDetailAddVo robotTaskVo) { + + } + + /** + * 仅放货 + * @param robotTaskVo + */ + private void doRelease(RobotTaskDetailAddVo robotTaskVo) { + locationMapper.updateLocationLockStatus(robotTaskVo.getToLocationId(),0,robotTaskVo.getRobotTaskId()); + } + + /** + * 仅取货 + * @param robotTaskVo + */ + private void doTake(RobotTaskDetailAddVo robotTaskVo) { + locationMapper.updateLocationLockStatus(robotTaskVo.getFromLocationId(),0,robotTaskVo.getRobotTaskId()); + } + + /** + * 移动 + * @param robotTaskVo + */ + private void doMove(RobotTaskDetailAddVo robotTaskVo) { + + } + + /** + * 充电 + * @param robotTaskVo + */ + private void doCharge(RobotTaskDetailAddVo robotTaskVo) { + + } + + /** + * 停车 + * @param robotTaskVo + */ + private void doPark(RobotTaskDetailAddVo robotTaskVo) { + + } + + /** + * 查询此机器人对应的楼层/区域(json) + * @param robotNo + * @return + */ + public Set getMapIdsByRobotNo(String robotNo) { + if (ObjectUtil.isNotEmpty(robotNo)) { + RobotInformationPageReqVO pageReqVO = new RobotInformationPageReqVO(); + pageReqVO.setRobotNo(robotNo); + return informationMapper.selectPage(pageReqVO).getList() + .stream() + .findFirst() + .map(RobotInformationDO::getFloorAreaJson) + .orElse(new HashSet<>()); + } + return new HashSet<>(); + } + + /** + * 取放 + * @param robotTaskVo + */ + @Transactional(rollbackFor = Exception.class) + public void doTakeRelease(RobotTaskDetailAddVo robotTaskVo,List locationIds) { + Set mapIds = new HashSet<>(); + if (ObjectUtil.isNotEmpty(robotTaskVo.getRobotNo())) { + mapIds = getMapIdsByRobotNo(robotTaskVo.getRobotNo()); + } + + //校验放货库位 + if (ReleaseTakeEnum.TO_LOCATION.getType().equals(robotTaskVo.getReleaseType())) { + WareHouseLocationDO query = WareHouseLocationDO.builder().id(robotTaskVo.getReleaseId()).build(); + WareHouseLocationDO locationDO = locationMapper.queryAllByLimit(query); + robotTaskVo.setToLocationNo(locationDO.getLocationNo()); + robotTaskVo.setToLocationId(robotTaskVo.getReleaseId()); + robotTaskVo.setToLocationStorey(locationDO.getLocationStorey()); + if (ObjectUtil.isNotEmpty(mapIds) && !mapIds.contains(locationDO.getMapId())) { + log.error("机器人不能在此放货库位放货 :{}, 机器人编号 :{}", locationDO.getLocationNo(),robotTaskVo.getRobotNo()); + throw new RuntimeException("机器人不能在此放货库位放货 "+ robotTaskVo.getReleaseId()); + } + } else { + WareHouseLocationDO wareHouseLocationDO = + locationMapper.selectByTypeAndId(LocationUseStatusEnum.NO.getType(), robotTaskVo.getReleaseType() + ,robotTaskVo.getReleaseId(),locationIds,mapIds); + if (ObjectUtil.isEmpty(wareHouseLocationDO)) { + log.error("放货库位为空或者已锁定或者机器人取放货区域受限制 :{}", robotTaskVo.getReleaseId()); + throw new RuntimeException("放货库位为空或者已锁定或者机器人取放货区域受限制 "+ robotTaskVo.getReleaseId()); + } + robotTaskVo.setToLocationNo(wareHouseLocationDO.getLocationNo()); + robotTaskVo.setToLocationId(wareHouseLocationDO.getId()); + robotTaskVo.setToLocationStorey(wareHouseLocationDO.getLocationStorey()); + } + locationIds.add(robotTaskVo.getToLocationId()); + //校验取货库位 + if (ReleaseTakeEnum.TO_LOCATION.getType().equals(robotTaskVo.getTakeType())) { + WareHouseLocationDO query = WareHouseLocationDO.builder().id(robotTaskVo.getTakeId()).build(); + WareHouseLocationDO locationDO = locationMapper.queryAllByLimit(query); + robotTaskVo.setFromLocationNo(locationDO.getLocationNo()); + robotTaskVo.setFromLocationId(robotTaskVo.getTakeId()); + robotTaskVo.setFromLocationStorey(locationDO.getLocationStorey()); + if (ObjectUtil.isNotEmpty(mapIds) && !mapIds.contains(locationDO.getMapId())) { + log.error("机器人不能在此取货库位取货 :{}, 机器人编号 :{}", locationDO.getLocationNo(),robotTaskVo.getRobotNo()); + throw new RuntimeException("机器人不能在此取货库位取货 "+ robotTaskVo.getTakeId()); + } + } else { + WareHouseLocationDO wareHouseLocationDO = + locationMapper.selectByTypeAndId(LocationUseStatusEnum.YES.getType(),robotTaskVo.getTakeType(), + robotTaskVo.getTakeId(),locationIds,mapIds); + if (ObjectUtil.isEmpty(wareHouseLocationDO)) { + log.error("取货库位为空或者已锁定或者机器人取放货区域受限制 :{}", robotTaskVo.getTakeId()); + throw new RuntimeException("取货库位为空或者已锁定或者机器人取放货区域受限制 "+ robotTaskVo.getTakeId()); + } + robotTaskVo.setFromLocationNo(wareHouseLocationDO.getLocationNo()); + robotTaskVo.setFromLocationId(wareHouseLocationDO.getId()); + robotTaskVo.setFromLocationStorey(wareHouseLocationDO.getLocationStorey()); + } + locationIds.add(robotTaskVo.getFromLocationId()); + //验证取货库位是否存在未完成的任务 + Set set = new HashSet<>(); + set.add(robotTaskVo.getFromLocationId()); + List doingTasks = taskDetailMapper.queryDoingTaskByIds(set); + if (ObjectUtil.isNotEmpty(doingTasks)) { + log.error("取货库位,存在未完成的任务 :{}", robotTaskVo.getTakeId()); + throw new RuntimeException("取货库位,存在未完成的任务"); + } + + //设置为锁定 + locationMapper.updateLocationLockStatus(robotTaskVo.getToLocationId(),0,robotTaskVo.getRobotTaskId()); + locationMapper.updateLocationLockStatus(robotTaskVo.getFromLocationId(),0,robotTaskVo.getRobotTaskId()); + } + @Override + @Transactional(rollbackFor = Exception.class) public void updateTask(RobotTaskSaveReqVO updateReqVO) { - // 校验存在 - validateTaskExists(updateReqVO.getId()); - // 更新 - RobotTaskDO updateObj = BeanUtils.toBean(updateReqVO, RobotTaskDO.class); - taskMapper.updateById(updateObj); + RLock lock = redissonUtils.getLock(RobotCacheLockEnum.ROBOT_TASK_DISTRIBUTE_LOCK.getKey()); + if (lock.tryLock()){ + try { + // 校验存在 + validateTaskExists(updateReqVO.getId()); + if (ObjectUtil.isEmpty(updateReqVO.getId())) { + throw exception(TASK_CHECK_ID_EXCEPTION); + } + // 更新 + //修改优先级需要订单状态为未开始 + RobotTaskDO robotTaskDO = taskMapper.selectById(updateReqVO.getId()); + if (ObjectUtil.isNotEmpty(updateReqVO.getPriority())) { + if (!RobotTaskStatusEnum.NEW.getType().equals(robotTaskDO.getTaskStatus())) { + throw exception(TASK_CHECK_TASK_PRIORITY); + } + List taskDetailDOS = taskDetailMapper.queryByTaskId(updateReqVO.getId()); + for (RobotTaskDetailDO taskDetailDO : taskDetailDOS) { + taskDetailDO.setPriority(updateReqVO.getPriority()); + taskDetailMapper.updateRobotDetailById(taskDetailDO); + } + } + //修改订单状态 + if (ObjectUtil.isNotEmpty(updateReqVO.getTaskStatus()) && + RobotTaskStatusEnum.DONE.getType().equals(robotTaskDO.getTaskStatus())) { + throw exception(TASK_CHECK_TASK_STATUS); + } + RobotTaskDO updateObj = BeanUtils.toBean(updateReqVO, RobotTaskDO.class); + taskMapper.updateById(updateObj); + } catch (Exception e) { + log.error("下发任务给车机出现异常 :{}",e.getMessage()); + } finally { + lock.unlock(); + } + } else { + throw exception(REDISSON_NOT_OBTAIN_LOCK); + } } @Override @@ -430,8 +568,23 @@ public class RobotTaskServiceImpl implements RobotTaskService { } @Override - public PageResult getTaskPage(RobotTaskPageReqVO pageReqVO) { - return taskMapper.selectPage(pageReqVO); + public PageResult getTaskPage(RobotTaskPageReqVO pageReqVO) { + PageResult pageResult = taskMapper.selectPage(pageReqVO); + PageResult dataPage = new PageResult<>(); + dataPage.setTotal(pageResult.getTotal()); + List list = pageResult.getList(); + List targetList = BeanUtil.copyToList(list, RobotTaskRespVO.class); + for (RobotTaskRespVO robotTaskRespVO : targetList) { + robotTaskRespVO.setDetails(taskDetailMapper.queryByTaskId(robotTaskRespVO.getId())); + } + dataPage.setList(targetList); + return dataPage; + } + + @Override + public String getTaskNo() { + String incrementByKey = redisUtil.getIncrementByKey(RobotCacheLockEnum.TASK_NO.getKey()); + return taskNo+ DateUtils.getYearMonthDay()+incrementByKey; } } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/job/DistributeTasksServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/job/DistributeTasksServiceImpl.java index 56f199377..08b1bfac9 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/job/DistributeTasksServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/job/DistributeTasksServiceImpl.java @@ -1,11 +1,13 @@ package cn.iocoder.yudao.module.system.service.robot.job; +import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; 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; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO; +import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDO; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDetailDO; import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotInformationMapper; import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotTaskDetailMapper; @@ -51,9 +53,15 @@ public class DistributeTasksServiceImpl implements DistributeTasksService { return; } - List taskDetailDOS = robotTaskDetailMapper.getUnDoTask(); + List taskIds = robotTaskMapper.getUnDoAndDoingTaskIds(); + if (ObjectUtil.isEmpty(taskIds)) { + log.info("暂无需要处理的主任务"); + return; + } + + List taskDetailDOS = robotTaskDetailMapper.getUnDoTask(taskIds); if (taskDetailDOS.isEmpty()) { - log.info("暂无需要处理的任务"); + log.info("暂无需要处理的明细任务"); return; } @@ -170,7 +178,12 @@ public class DistributeTasksServiceImpl implements DistributeTasksService { detailDO.setStartTime(LocalDateTime.now()); detailDO.setTaskStatus(RobotTaskDetailStatusEnum.DOING.getType()); robotTaskDetailMapper.updateRobotDetailById(detailDO); - robotTaskMapper.updateRobotStatus(taskDetailDO.getRobotTaskId(), RobotTaskStatusEnum.DOING.getType()); + + RobotTaskDO robotTaskDO = new RobotTaskDO(); + robotTaskDO.setId(taskDetailDO.getRobotTaskId()); + robotTaskDO.setStartTime(LocalDateTime.now()); + robotTaskDO.setTaskStatus(RobotTaskDetailStatusEnum.DOING.getType()); + robotTaskMapper.updateRobot(robotTaskDO); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotTaskDetailMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotTaskDetailMapper.xml index 421828df5..cefd08154 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotTaskDetailMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotTaskDetailMapper.xml @@ -251,6 +251,13 @@ where task_status = '0' and deleted = '0' + + and robot_task_id in + + #{taskId} + + order by priority, create_time asc diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotTaskMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotTaskMapper.xml index 2b09b2ec5..482151f85 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotTaskMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotTaskMapper.xml @@ -227,7 +227,15 @@ - + @@ -294,7 +302,7 @@ - + update robot_task @@ -360,22 +368,10 @@ deleted = #{deleted}, - - tenant_id = #{tenantId}, - where id = #{id} - - - update - robot_task - set - task_status = #{taskStatus} - where id = #{id} - - delete