Compare commits

...

4 Commits

Author SHA1 Message Date
cbs
248b0bdeba 循环任务 2025-03-04 09:16:34 +08:00
cbs
5c2a8cfe9d 创建订单过滤禁用点位 2025-03-03 09:11:21 +08:00
cbs
b270a21595 创建订单校验物料 2025-03-01 17:05:06 +08:00
cbs
94a34981c6 过滤不能取放的库位 2025-03-01 15:23:08 +08:00
39 changed files with 1382 additions and 259 deletions

View File

@ -237,4 +237,6 @@ public interface ErrorCodeConstants {
// ========== 车辆动作记录 1_002_045_001 ==========
ErrorCode TASK_DETAIL_ACTION_LOG_NOT_EXISTS = new ErrorCode(1_002_045_001, "车辆动作记录不存在");
// ========== 循环任务点位 1_002_046_001==========
ErrorCode TASK_CYCLE_NOT_EXISTS = new ErrorCode(1_002_046_001, "循环任务点位不存在");
}

View File

@ -76,16 +76,28 @@ public class RobotStatusApiImpl implements RobotStatusApi {
String taskStatusKey = RobotTaskChcheConstant.ROBOT_TASK_STATUS + robotStatusDataDTO.getMac();
String cargoDetectedKey = RobotTaskChcheConstant.ROBOT_CARGO_DETECTED + robotStatusDataDTO.getMac();
String pose2dKey = RobotTaskChcheConstant.ROBOT_INFORMATION_POSE_BAT_SOC + robotStatusDataDTO.getMac();
redisUtil.set(taskStatusKey, robotStatusDataDTO.getData().getTask_status(), robotPositionCacheTime);
redisUtil.set(cargoDetectedKey, robotStatusDataDTO.getData().getCargo_detected(), robotPositionCacheTime);
// todo 后续需要改为从车机上报
redisUtil.set(taskStatusKey, "IDLE", robotPositionCacheTime);
redisUtil.set(cargoDetectedKey, false, robotPositionCacheTime);
/*redisUtil.set(taskStatusKey, robotStatusDataDTO.getData().getTask_status(), robotPositionCacheTime);
redisUtil.set(cargoDetectedKey, robotStatusDataDTO.getData().getCargo_detected(), robotPositionCacheTime);*/
Object object = redisUtil.get(pose2dKey);
RobotStatusDataPoseDTO robotStatusDataPoseDTO = JSONUtil.toBean((String) object, RobotStatusDataPoseDTO.class);
robotStatusDataPoseDTO.setX(robotStatusDataDTO.getData().getPose2d().getX());
robotStatusDataPoseDTO.setY(robotStatusDataDTO.getData().getPose2d().getY());
robotStatusDataPoseDTO.setYaw(robotStatusDataDTO.getData().getPose2d().getYaw());
robotStatusDataPoseDTO.setFloor(robotStatusDataDTO.getData().getFloor_zone().getFloor());
robotStatusDataPoseDTO.setArea(robotStatusDataDTO.getData().getFloor_zone().getArea());
if (ObjectUtil.isNotEmpty(robotStatusDataDTO.getData())
&& ObjectUtil.isNotEmpty(robotStatusDataDTO.getData().getPose2d())) {
robotStatusDataPoseDTO.setX(robotStatusDataDTO.getData().getPose2d().getX());
robotStatusDataPoseDTO.setY(robotStatusDataDTO.getData().getPose2d().getY());
robotStatusDataPoseDTO.setYaw(robotStatusDataDTO.getData().getPose2d().getYaw());
}
if (ObjectUtil.isNotEmpty(robotStatusDataDTO.getData())
&& ObjectUtil.isNotEmpty(robotStatusDataDTO.getData().getFloor_zone())) {
robotStatusDataPoseDTO.setFloor(robotStatusDataDTO.getData().getFloor_zone().getFloor());
robotStatusDataPoseDTO.setArea(robotStatusDataDTO.getData().getFloor_zone().getArea());
}
robotStatusDataPoseDTO.setRobotNo(robotNo);
redisUtil.set(pose2dKey, JSON.toJSONString(robotStatusDataPoseDTO), robotPositionCacheTime);
pathPlanningApi.synchronousLineObject(robotStatusDataPoseDTO, PathPlanningTopicConstant.AGV_POSE);

View File

@ -15,6 +15,7 @@ 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.actionlog.RobotTaskDetailActionLogMapper;
import cn.iocoder.yudao.module.system.dal.mysql.cycle.TaskCycleMapper;
import cn.iocoder.yudao.module.system.dal.mysql.houselocation.WareHouseLocationMapper;
import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotInformationMapper;
import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotTaskDetailMapper;
@ -65,6 +66,9 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
@Autowired
private ThreadPoolTaskExecutor taskExecutor;
@Resource
private TaskCycleMapper taskCycleMapper;
@Resource
private WareHouseLocationMapper houseLocationMapper;
@ -157,6 +161,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
robotTaskDO.setEndTime(LocalDateTime.now());
robotTaskDO.setTaskStatus(RobotTaskDetailStatusEnum.DONE.getType());
robotTaskMapper.updateRobot(robotTaskDO);
taskCycleMapper.deletByRobotTaskId(taskDetails.get(0).getRobotTaskId());
}
if (RobotTaskTypeEnum.MOVE.getType().equals(robotTaskDetailDO.getTaskType())) {

View File

@ -0,0 +1,97 @@
package cn.iocoder.yudao.module.system.controller.admin.cycle;
import cn.iocoder.yudao.module.system.controller.admin.cycle.vo.TaskCyclePageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.cycle.vo.TaskCycleRespVO;
import cn.iocoder.yudao.module.system.controller.admin.cycle.vo.TaskCycleSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.cycle.TaskCycleDO;
import cn.iocoder.yudao.module.system.service.cycle.TaskCycleService;
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/task-cycle")
@Validated
public class TaskCycleController {
@Resource
private TaskCycleService taskCycleService;
@PostMapping("/create")
@Operation(summary = "创建循环任务点位")
@PreAuthorize("@ss.hasPermission('robot:task-cycle:create')")
public CommonResult<Long> createTaskCycle(@Valid @RequestBody TaskCycleSaveReqVO createReqVO) {
return success(taskCycleService.createTaskCycle(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新循环任务点位")
@PreAuthorize("@ss.hasPermission('robot:task-cycle:update')")
public CommonResult<Boolean> updateTaskCycle(@Valid @RequestBody TaskCycleSaveReqVO updateReqVO) {
taskCycleService.updateTaskCycle(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除循环任务点位")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('robot:task-cycle:delete')")
public CommonResult<Boolean> deleteTaskCycle(@RequestParam("id") Long id) {
taskCycleService.deleteTaskCycle(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得循环任务点位")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('robot:task-cycle:query')")
public CommonResult<TaskCycleRespVO> getTaskCycle(@RequestParam("id") Long id) {
TaskCycleDO taskCycle = taskCycleService.getTaskCycle(id);
return success(BeanUtils.toBean(taskCycle, TaskCycleRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得循环任务点位分页")
@PreAuthorize("@ss.hasPermission('robot:task-cycle:query')")
public CommonResult<PageResult<TaskCycleRespVO>> getTaskCyclePage(@Valid TaskCyclePageReqVO pageReqVO) {
PageResult<TaskCycleDO> pageResult = taskCycleService.getTaskCyclePage(pageReqVO);
return success(BeanUtils.toBean(pageResult, TaskCycleRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出循环任务点位 Excel")
@PreAuthorize("@ss.hasPermission('robot:task-cycle:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportTaskCycleExcel(@Valid TaskCyclePageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<TaskCycleDO> list = taskCycleService.getTaskCyclePage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "循环任务点位.xls", "数据", TaskCycleRespVO.class,
BeanUtils.toBean(list, TaskCycleRespVO.class));
}
}

View File

@ -0,0 +1,28 @@
package cn.iocoder.yudao.module.system.controller.admin.cycle.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 TaskCyclePageReqVO extends PageParam {
@Schema(description = "机器人任务主表id", example = "2231")
private Long robotTaskId;
@Schema(description = "ware_position_map_item的id", example = "923")
private Long mapItemId;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@ -0,0 +1,31 @@
package cn.iocoder.yudao.module.system.controller.admin.cycle.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 TaskCycleRespVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "9553")
@ExcelProperty("主键ID")
private Long id;
@Schema(description = "机器人任务主表id", example = "2231")
@ExcelProperty("机器人任务主表id")
private Long robotTaskId;
@Schema(description = "ware_position_map_item的id", example = "923")
@ExcelProperty("ware_position_map_item的id")
private Long mapItemId;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

View File

@ -0,0 +1,21 @@
package cn.iocoder.yudao.module.system.controller.admin.cycle.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - 循环任务点位新增/修改 Request VO")
@Data
public class TaskCycleSaveReqVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "9553")
private Long id;
@Schema(description = "机器人任务主表id", example = "2231")
private Long robotTaskId;
@Schema(description = "ware_position_map_item的id", example = "923")
private Long mapItemId;
}

View File

@ -110,8 +110,8 @@ public class RobotInformationController {
@Operation(summary = "查询所有车辆")
@PreAuthorize("@ss.hasPermission('robot:information:getAllRobot')")
public CommonResult<List<RobotInformationRespVO>> getAllRobot() {
List<RobotInformationDO> result = informationService.getAllRobot();
return success(BeanUtils.toBean(result, RobotInformationRespVO.class));
List<RobotInformationRespVO> result = informationService.getAllRobotAndErrorMsg();
return success(result);
}
@GetMapping("/list")

View File

@ -58,6 +58,14 @@ public class RobotTaskController {
return success(true);
}
@PutMapping("/close")
@Operation(summary = "更新机器人任务主表")
@PreAuthorize("@ss.hasPermission('robot:task:close')")
public CommonResult<Boolean> closeTask(@Valid @RequestBody RobotTaskSaveReqVO updateReqVO) {
taskService.closeTask(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除机器人任务主表")
@Parameter(name = "id", description = "编号", required = true)

View File

@ -78,4 +78,7 @@ public class RobotInformationRespVO {
@ExcelProperty("区域")
public String area;
@Schema(description = "机器人错误信息")
public String errorMsg;
}

View File

@ -66,11 +66,11 @@ public class RobotTaskDetailAddVO {
@Schema(description = "放货库位的排序")
private Long toLocationNumber;
@Schema(description = "取货库位ware_position_map的id")
private Long fromMapId;
@Schema(description = "取货库位ware_position_map_item的id")
private Long fromMapItemId;
@Schema(description = "放货库位ware_position_map的id")
private Long toMapId;
@Schema(description = "放货库位ware_position_map_item的id")
private Long toMapItemId;
public Long getPriority() {
if (ObjectUtil.isEmpty(priority)) {

View File

@ -88,9 +88,9 @@ public class RobotTaskDetailPageReqVO extends PageParam {
@Schema(description = "放货库位的排序")
private Long toLocationNumber;
@Schema(description = "取货库位ware_position_map的id")
private Long fromMapId;
@Schema(description = "取货库位ware_position_map_item的id")
private Long fromMapItemId;
@Schema(description = "放货库位ware_position_map的id")
private Long toMapId;
@Schema(description = "放货库位ware_position_map_item的id")
private Long toMapItemId;
}

View File

@ -110,11 +110,9 @@ public class RobotTaskDetailRespVO {
@ExcelProperty("放货库位的排序")
private Long toLocationNumber;
@Schema(description = "取货库位ware_position_map的id")
@ExcelProperty("取货库位ware_position_map的id")
private Long fromMapId;
@Schema(description = "取货库位ware_position_map_item的id")
private Long fromMapItemId;
@Schema(description = "放货库位ware_position_map的id")
@ExcelProperty("放货库位ware_position_map的id")
private Long toMapId;
@Schema(description = "放货库位ware_position_map_item的id")
private Long toMapItemId;
}

View File

@ -88,10 +88,10 @@ public class RobotTaskDetailSaveReqVO {
@Schema(description = "放货库位的排序")
private Long toLocationNumber;
@Schema(description = "取货库位ware_position_map的id")
private Long fromMapId;
@Schema(description = "取货库位ware_position_map_item的id")
private Long fromMapItemId;
@Schema(description = "放货库位ware_position_map的id")
private Long toMapId;
@Schema(description = "放货库位ware_position_map_item的id")
private Long toMapItemId;
}

View File

@ -0,0 +1,39 @@
package cn.iocoder.yudao.module.system.dal.dataobject.cycle;
import lombok.*;
import java.util.*;
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_task_cycle")
@KeySequence("robot_task_cycle_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TaskCycleDO extends BaseDO {
/**
* 主键ID
*/
@TableId
private Long id;
/**
* 机器人任务主表id
*/
private Long robotTaskId;
/**
* ware_position_map_item的id
*/
private Long mapItemId;
}

View File

@ -129,12 +129,14 @@ public class RobotTaskDetailDO extends BaseDO {
private Integer electricity;
/**
* ware_position_map的id
* ware_position_map_item的id的id
*/
private Long fromMapId;
private Long fromMapItemId;
/**
* ware_position_map的id
* ware_position_map_item的id的id
*/
private Long toMapId;
private Long toMapItemId;
//todo 需要改为ware_position_map_item的id
}

View File

@ -0,0 +1,30 @@
package cn.iocoder.yudao.module.system.dal.mysql.cycle;
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.cycle.vo.TaskCyclePageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.cycle.TaskCycleDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* 循环任务点位 Mapper
*
* @author 陈宾顺
*/
@Mapper
public interface TaskCycleMapper extends BaseMapperX<TaskCycleDO> {
default PageResult<TaskCycleDO> selectPage(TaskCyclePageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<TaskCycleDO>()
.eqIfPresent(TaskCycleDO::getRobotTaskId, reqVO.getRobotTaskId())
.eqIfPresent(TaskCycleDO::getMapItemId, reqVO.getMapItemId())
.betweenIfPresent(TaskCycleDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(TaskCycleDO::getId));
}
void deletByRobotTaskId(@Param("robotTaskId") Long robotTaskId);
}

View File

@ -64,7 +64,10 @@ public interface WareHouseLocationMapper extends BaseMapperX<WareHouseLocationDO
@Param("takeType") Integer takeType,
@Param("id") Long id,
@Param("locationIds") List<Long> locationIds,
@Param("mapIds") Set<Long> mapIds);
@Param("mapIds") Set<Long> mapIds,
@Param("takeMapItemIds") List<Long> takeMapItemIds,
@Param("laneIds") List<Long> laneIds,
@Param("areaIds") List<Long> areaIds);
/**
* 普通查询(未删除)
@ -76,13 +79,14 @@ public interface WareHouseLocationMapper extends BaseMapperX<WareHouseLocationDO
/**
* 查询库位
* @param query
* @param locationIds
* @return
* (注意:----------不能修改排序-----------------)
*/
List<WareHouseLocationDO> selectLocations(@Param("query") WareHouseLocationDO query,
@Param("locationIds") List<Long> locationIds,
@Param("mapIds") Set<Long> mapIds);
@Param("mapIds") Set<Long> mapIds,
@Param("laneIds") List<Long> laneIds,
@Param("areaIds") List<Long> areaIds,
@Param("mapItemIds") List<Long> mapItemIds);
void updateLocationLockList( @Param("locationIds") List<Long> locationIds,
@Param("taskId") Long taskId,
@ -114,4 +118,8 @@ public interface WareHouseLocationMapper extends BaseMapperX<WareHouseLocationDO
* @param wareHouseLocationDO
*/
void updateEntity(WareHouseLocationDO wareHouseLocationDO);
void releaseLocationLockList(@Param("locationIds") List<Long> locationIds,
@Param("taskId") Long taskId,
@Param("locationLock") Integer locationLock);
}

View File

@ -65,10 +65,10 @@ public interface RobotInformationMapper extends BaseMapperX<RobotInformationDO>
/**
* 批量更新机器人状态
* @param robotNos
* @param robotNo
* @param robotStatus
*/
void updateRobotListStatus(@Param("robotNos") Set<String> robotNos, @Param("robotStatus") Integer robotStatus);
void updateRobotListStatus(@Param("robotNo") String robotNo, @Param("robotStatus") Integer robotStatus);
/**
* 查询车辆尺寸

View File

@ -92,4 +92,21 @@ public interface RobotTaskDetailMapper extends BaseMapperX<RobotTaskDetailDO> {
*/
List<RobotTaskDetailDO> getChargeTaskDetail();
/**
* 取货中的map_item_id
* @return
*/
List<Long> selectTakeMapItemIds();
/**
* 放货中的map_item_id
* @return
*/
List<Long> selectReleaseMapItemIds();
/**
* 查询需要创建循环任务且已经完成的订单
* @return
*/
List<RobotTaskDetailDO> selectAutoCreateCycleTask();
}

View File

@ -0,0 +1,21 @@
package cn.iocoder.yudao.module.system.enums.robot.charge;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* robot_charge_log的task_status
*/
@Getter
@AllArgsConstructor
public enum ChargeTaskStatusEnum {
NEW(0),//未开始
DOING(1),//执行中
DONE(2),//已完成
CLOSE(3), //已取消
ABNORMAL(4); //异常
/**
* 类型
*/
private final Integer type;
}

View File

@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.tenant.core.job.TenantJob;
import cn.iocoder.yudao.module.system.enums.redis.RobotCacheLockEnum;
import cn.iocoder.yudao.module.system.service.robot.RobotTaskService;
import cn.iocoder.yudao.module.system.service.robot.job.AutoChargeService;
import cn.iocoder.yudao.module.system.service.robot.job.CycleService;
import cn.iocoder.yudao.module.system.service.robot.job.DistributeTasksService;
import cn.iocoder.yudao.module.system.service.robot.job.RobotTaskAutoMoveService;
import cn.iocoder.yudao.module.system.service.robot.pathplanning.RobotPathPlanningService;
@ -39,6 +40,9 @@ public class RobotJob {
@Autowired
private AutoChargeService autoChargeService;
@Autowired
private CycleService cycleService;
@Autowired
private RobotPathPlanningService robotPathPlanningService;
@ -129,4 +133,28 @@ public class RobotJob {
}
}
/**
* 创建循环任务
*/
@XxlJob("CycleTaskJob")
@TenantJob
public void cycleTaskJob() {
RLock lock = redissonUtils.getLock(RobotCacheLockEnum.ROBOT_TASK_ADD_LOCK.getKey());
if (lock.tryLock()){
try {
log.info("----创建循环任务----");
cycleService.cycleTaskJob();
} catch (Exception e) {
log.error("创建循环任务异常 :{}", e);
} finally {
lock.unlock();
}
}else {
log.info("下发任务给路径规划未获取到锁");
throw exception(REDISSON_NOT_OBTAIN_LOCK);
}
}
}

View File

@ -0,0 +1,56 @@
package cn.iocoder.yudao.module.system.service.cycle;
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.cycle.vo.TaskCyclePageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.cycle.vo.TaskCycleSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.cycle.TaskCycleDO;
/**
* 循环任务点位 Service 接口
*
* @author 陈宾顺
*/
public interface TaskCycleService {
/**
* 创建循环任务点位
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createTaskCycle(@Valid TaskCycleSaveReqVO createReqVO);
/**
* 更新循环任务点位
*
* @param updateReqVO 更新信息
*/
void updateTaskCycle(@Valid TaskCycleSaveReqVO updateReqVO);
/**
* 删除循环任务点位
*
* @param id 编号
*/
void deleteTaskCycle(Long id);
/**
* 获得循环任务点位
*
* @param id 编号
* @return 循环任务点位
*/
TaskCycleDO getTaskCycle(Long id);
/**
* 获得循环任务点位分页
*
* @param pageReqVO 分页查询
* @return 循环任务点位分页
*/
PageResult<TaskCycleDO> getTaskCyclePage(TaskCyclePageReqVO pageReqVO);
}

View File

@ -0,0 +1,75 @@
package cn.iocoder.yudao.module.system.service.cycle;
import cn.iocoder.yudao.module.system.controller.admin.cycle.vo.TaskCyclePageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.cycle.vo.TaskCycleSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.cycle.TaskCycleDO;
import cn.iocoder.yudao.module.system.dal.mysql.cycle.TaskCycleMapper;
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.TASK_CYCLE_NOT_EXISTS;
/**
* 循环任务点位 Service 实现类
*
* @author 陈宾顺
*/
@Service
@Validated
public class TaskCycleServiceImpl implements TaskCycleService {
@Resource
private TaskCycleMapper taskCycleMapper;
@Override
public Long createTaskCycle(TaskCycleSaveReqVO createReqVO) {
// 插入
TaskCycleDO taskCycle = BeanUtils.toBean(createReqVO, TaskCycleDO.class);
taskCycleMapper.insert(taskCycle);
// 返回
return taskCycle.getId();
}
@Override
public void updateTaskCycle(TaskCycleSaveReqVO updateReqVO) {
// 校验存在
validateTaskCycleExists(updateReqVO.getId());
// 更新
TaskCycleDO updateObj = BeanUtils.toBean(updateReqVO, TaskCycleDO.class);
taskCycleMapper.updateById(updateObj);
}
@Override
public void deleteTaskCycle(Long id) {
// 校验存在
validateTaskCycleExists(id);
// 删除
taskCycleMapper.deleteById(id);
}
private void validateTaskCycleExists(Long id) {
if (taskCycleMapper.selectById(id) == null) {
throw exception(TASK_CYCLE_NOT_EXISTS);
}
}
@Override
public TaskCycleDO getTaskCycle(Long id) {
return taskCycleMapper.selectById(id);
}
@Override
public PageResult<TaskCycleDO> getTaskCyclePage(TaskCyclePageReqVO pageReqVO) {
return taskCycleMapper.selectPage(pageReqVO);
}
}

View File

@ -117,4 +117,11 @@ public interface RobotInformationService extends IService<RobotInformationDO> {
* @return
*/
String getMacByRobotNo(String robotNo);
/**
* 获取机器人全部信息和异常信息
* @return
*/
List<RobotInformationRespVO> getAllRobotAndErrorMsg();
}

View File

@ -30,10 +30,7 @@ import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@ -513,4 +510,24 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
}
return "";
}
@Override
public List<RobotInformationRespVO> getAllRobotAndErrorMsg() {
RobotInformationDO query = new RobotInformationDO();
List<RobotInformationDO> robotInformationDOS = informationMapper.queryAllByLimit(query);
if (ObjectUtil.isEmpty(robotInformationDOS)) {
return new ArrayList<>();
}
List<RobotInformationRespVO> list = BeanUtils.toBean(robotInformationDOS, RobotInformationRespVO.class);
for (RobotInformationRespVO v : list) {
String errorMsgKey = RobotTaskChcheConstant.ROBOT_ERROR_MSG + v.getMacAddress();
Object errorMsg = redisUtil.get(errorMsgKey);
if (ObjectUtil.isNotEmpty(errorMsg)) {
v.setErrorMsg(String.valueOf(errorMsg));
}
}
return list;
}
}

View File

@ -3,6 +3,7 @@ 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.RobotTaskDetailRespVO;
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;
@ -86,6 +87,8 @@ public class RobotTaskDetailServiceImpl implements RobotTaskDetailService {
@Override
@Transactional(rollbackFor = Exception.class)
public void insertRobotDetailList(List<RobotTaskDetailAddVO> taskDetailList) {
taskDetailMapper.insertBatchList(taskDetailList);
List<RobotTaskDetailDO> bean = BeanUtils.toBean(taskDetailList, RobotTaskDetailDO.class);
taskDetailMapper.insertBatch(bean);
// taskDetailMapper.insertBatchList(taskDetailList);
}
}

View File

@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.module.system.controller.admin.robot.detail.RobotTaskDetailLogResoVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.detail.RobotTaskDetailLogVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskDetailAddVO;
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;
@ -75,4 +76,13 @@ public interface RobotTaskService extends IService<RobotTaskDO> {
* @return
*/
PageResult<RobotTaskDetailLogResoVO> logPage( RobotTaskDetailLogVO pageReqVO);
/**
* 添加循环任务点位
* @param id
* @param taskDetailList
*/
void addCycle(Long id, List<RobotTaskDetailAddVO> taskDetailList);
void closeTask(@Valid RobotTaskSaveReqVO updateReqVO);
}

View File

@ -0,0 +1,5 @@
package cn.iocoder.yudao.module.system.service.robot.job;
public interface CycleService {
void cycleTaskJob();
}

View File

@ -0,0 +1,220 @@
package cn.iocoder.yudao.module.system.service.robot.job;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskDetailAddVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskRespVO;
import cn.iocoder.yudao.module.system.dal.dataobject.houselocation.WareHouseLocationDO;
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.dataobject.robot.RobotWarnCodeMappingDO;
import cn.iocoder.yudao.module.system.dal.mysql.houselocation.WareHouseLocationMapper;
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.redis.RobotCacheLockEnum;
import cn.iocoder.yudao.module.system.enums.robot.LocationLockEnum;
import cn.iocoder.yudao.module.system.enums.robot.RobotTaskDetailStatusEnum;
import cn.iocoder.yudao.module.system.enums.robot.RobotTaskStatusEnum;
import cn.iocoder.yudao.module.system.service.robot.RobotTaskDetailService;
import cn.iocoder.yudao.module.system.service.robot.RobotTaskService;
import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static com.baomidou.mybatisplus.core.toolkit.IdWorker.getId;
@Service
@Slf4j
public class CycleServiceImpl implements CycleService {
@Resource
private RobotTaskMapper taskMapper;
@Resource
private RobotTaskDetailMapper taskDetailMapper;
@Value("${zn.do_cycle:true}")
private Boolean doCycle;
@Value("${zn.task-no:ZN}")
private String taskNo;
@Resource
private RedisUtil redisUtil;
@Resource
private WareHouseLocationMapper locationMapper;
@Resource
private RobotTaskService robotTaskService;
/**
* 创建循环任务
*/
@Override
public void cycleTaskJob() {
TenantContextHolder.setTenantId(1L);
if (!doCycle) {
log.info("循环任务关闭了--不自动创建循环任务");
}
List<RobotTaskDetailDO> detailDOS = taskDetailMapper.selectAutoCreateCycleTask();
if (ObjectUtil.isEmpty(detailDOS)) {
log.info("---不存在需要自动创建循环的任务--");
return;
}
Set<Long> taskIds = detailDOS.stream().map(RobotTaskDetailDO::getRobotTaskId).collect(Collectors.toSet());
List<RobotTaskDO> taskList = taskMapper.selectList(new LambdaQueryWrapper<RobotTaskDO>()
.in(RobotTaskDO::getId, taskIds));
Map<Long, List<RobotTaskDetailDO>> taskIdMap =
detailDOS.stream().collect(Collectors.groupingBy(RobotTaskDetailDO::getRobotTaskId));
String incrementByKey = redisUtil.getIncrementByKey(RobotCacheLockEnum.TASK_NO.getKey());
List<RobotTaskDO> taskDOList = new ArrayList<>();
List<RobotTaskDetailDO> taskDetailList = new ArrayList<>();
for (RobotTaskDO v : taskList) {
RobotTaskDO taskData = getTaskData(incrementByKey, v);
List<RobotTaskDetailDO> taskDetailDOS = getTaskDetailData(taskData,taskIdMap,v.getId());
taskDOList.add(taskData);
taskDetailList.addAll(taskDetailDOS);
}
taskMapper.insertBatch(taskDOList);
taskDetailMapper.insertBatch(taskDetailList);
List<Long> fromLocationIds = taskDetailList.stream().map(RobotTaskDetailDO::getFromLocationId).collect(Collectors.toList());
List<Long> toLocationIds = taskDetailList.stream().map(RobotTaskDetailDO::getToLocationId).collect(Collectors.toList());
List<Long> locationIds = new ArrayList<>();
locationIds.addAll(fromLocationIds);
locationIds.addAll(toLocationIds);
List<List<Long>> fromPartition = Lists.partition(locationIds, 100);
fromPartition.forEach(list -> {
locationMapper.updateLocationLockList(list, -1l, LocationLockEnum.NO.getType());
});
List<RobotTaskDetailAddVO> bean = BeanUtils.toBean(taskDetailList, RobotTaskDetailAddVO.class);
Map<Long, List<RobotTaskDetailAddVO>> taskDetailMap =
bean.stream().collect(Collectors.groupingBy(RobotTaskDetailAddVO::getRobotTaskId));
taskDetailMap.forEach((k,v) ->{
robotTaskService.addCycle(k,v);
});
}
private List<RobotTaskDetailDO> getTaskDetailData(RobotTaskDO taskData, Map<Long,
List<RobotTaskDetailDO>> taskIdMap, Long id) {
List<RobotTaskDetailDO> taskDetailDOList = new ArrayList<>();
List<RobotTaskDetailDO> taskDetailDOS = taskIdMap.get(id);
for (RobotTaskDetailDO v : taskDetailDOS) {
RobotTaskDetailDO build = RobotTaskDetailDO.builder()
.robotTaskId(taskData.getId())
.taskType(v.getTaskType())
.releaseType(v.getTakeType())
.takeType(v.getReleaseType())
.releaseId(v.getTakeId())
.takeId(v.getReleaseId())
.fromLocationNo(v.getToLocationNo())
.fromLocationId(v.getToLocationId())
.fromLaneId(v.getToLaneId())
.toLaneId(v.getFromLaneId())
.toLocationNo(v.getFromLocationNo())
.toLocationId(v.getFromLocationId())
.fromLocationStorey(v.getToLocationStorey())
.toLocationStorey(v.getFromLocationStorey())
.priority(v.getPriority())
.taskStatus(RobotTaskDetailStatusEnum.NEW.getType())
.taskStage(0l)
.needLock(v.getNeedLock())
.startTime(null)
.endTime(null)
.fromLocationNumber(v.getToLocationNumber())
.toLocationNumber(v.getFromLocationNumber())
.fromMapItemId(v.getToMapItemId())
.toMapItemId(v.getFromMapItemId())
.build();
taskDetailDOList.add(build);
}
return taskDetailDOList;
}
/**
* 设置任务主表数据
* @param incrementByKey
* @param v
* @return
*/
public RobotTaskDO getTaskData(String incrementByKey, RobotTaskDO v ) {
String taskNoStr = taskNo + DateUtils.getYearMonthDay() + incrementByKey;
RobotTaskDO task = new RobotTaskDO();
BeanUtils.copyProperties(v, task);
task.setRemainingCycleNumber(v.getRemainingCycleNumber() - 1);
task.setTaskNo(taskNoStr);
task.setTaskStatus(RobotTaskStatusEnum.NEW.getType());
task.setTaskStage(0l);
task.setStartTime(null);
task.setEndTime(null);
task.setCreateTime(LocalDateTime.now());
task.setUpdateTime(LocalDateTime.now());
task.setId(getId());
return task;
}
}

View File

@ -192,7 +192,7 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
//不拼接
List<Long> singleTaskIds =taskDOList.stream()
.filter(v -> MontageTaskEnum.YES.getType().equals(v.getMontageTask()))
.filter(v -> MontageTaskEnum.NO.getType().equals(v.getMontageTask()))
.map(RobotTaskDO::getId)
.collect(Collectors.toList());
@ -366,9 +366,6 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
if (ObjectUtil.isNotEmpty(updateTaskDetails)) {
robotTaskDetailMapper.updateBatch(updateTaskDetails);
}
if (ObjectUtil.isNotEmpty(robotNos)) {
robotInformationMapper.updateRobotListStatus(robotNos, RobotStatusEnum.DOING.getType());
}
}
/**
@ -664,7 +661,7 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
taskNigth.setCommand_type(CommandTypeEnum.MOVE_POSES.getType());
List<Pose2ds> pose2dsNight = new ArrayList<>();
WareHouseLocationDO ware = WareHouseLocationDO.builder()
/* WareHouseLocationDO ware = WareHouseLocationDO.builder()
.laneId(-2l)
.build();
List<WareHouseLocationDO> releaseStockList =
@ -672,7 +669,7 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
for (WareHouseLocationDO wareHouseLocationDO : releaseStockList) {
Pose2ds pose = positionMapItemMapper.selectByLocationId(wareHouseLocationDO.getId());
pose2dsNight.add(pose);
}
}*/
// taskNigth.setPose2ds(pose2dsNight);

View File

@ -192,7 +192,7 @@ public class RobotTaskAutoMoveServiceImpl implements RobotTaskAutoMoveService {
List<List<Long>> fromPartition = Lists.partition(locationIds, 100);
fromPartition.forEach(list-> {
locationMapper.updateLocationLockList(list,0l,LocationLockEnum.NO.getType());
// locationMapper.updateLocationLockList(list,0l,LocationLockEnum.NO.getType());
});
// todo 搬运任务下发给机器人

View File

@ -254,7 +254,7 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
} else if (ObjectUtil.isNotEmpty(taskDetailDO.getFromLocationId())
&& ObjectUtil.isEmpty(taskDetailDO.getFromLaneId())) {
//取的是普通点位
pathPlanning.setTakeGroupId("POINT_" + taskDetailDO.getFromMapId());
pathPlanning.setTakeGroupId("POINT_" + taskDetailDO.getFromMapItemId());
pathPlanning.setTakeLocationNumber(Math.abs(locationNumberReduce - taskDetailDO.getFromLocationNumber()));
pathPlanning.setTakePointId(locationDOMap.get(taskDetailDO.getFromLocationId()).getMapItemId());
}
@ -270,7 +270,7 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
} else if (ObjectUtil.isNotEmpty(taskDetailDO.getToLocationId())
&& ObjectUtil.isEmpty(taskDetailDO.getToLaneId())) {
//放的是普通点位
pathPlanning.setReleaseGroupId("POINT_" + taskDetailDO.getToMapId());
pathPlanning.setReleaseGroupId("POINT_" + taskDetailDO.getToMapItemId());
pathPlanning.setReleaseLocationNumber(taskDetailDO.getToLocationNumber());
pathPlanning.setReleasePointId(locationDOMap.get(taskDetailDO.getToLocationId()).getMapItemId());
}
@ -340,8 +340,8 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
|| RobotTaskTypeEnum.RELEASE.getType().equals(detail.getTaskType())) {
laneIds.add(detail.getFromLaneId());
laneIds.add(detail.getToLaneId());
mapIds.add(detail.getFromMapId());
mapIds.add(detail.getToMapId());
mapIds.add(detail.getFromMapItemId());
mapIds.add(detail.getToMapItemId());
}
}
}
@ -352,8 +352,8 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
&& !laneIds.contains(v.getToLaneId())
&& !RobotTaskTypeEnum.PARK.getType().equals(v.getTaskType()) //停车在充电的任务做
&& !RobotTaskTypeEnum.CHARGE.getType().equals(v.getTaskType()) //停车在充电的任务做
&& !mapIds.contains(v.getFromMapId())
&& !mapIds.contains(v.getToMapId()))
&& !mapIds.contains(v.getFromMapItemId())
&& !mapIds.contains(v.getToMapItemId()))
.collect(Collectors.toList());
if (ObjectUtil.isEmpty(detailDOS)) {
@ -375,15 +375,15 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
//取货点位--最小
Map<Long, Long> fromLocationMap = detailDOS.stream()
.filter(v -> ObjectUtil.isNotEmpty(v.getFromMapId()))
.collect(Collectors.groupingBy(RobotTaskDetailDO::getFromMapId,
.filter(v -> ObjectUtil.isNotEmpty(v.getFromMapItemId()))
.collect(Collectors.groupingBy(RobotTaskDetailDO::getFromMapItemId,
Collectors.collectingAndThen(Collectors.minBy(Comparator.comparingLong(RobotTaskDetailDO::getFromLocationNumber)),
a -> a.isPresent() ? a.get().getFromLocationNumber() : null)));
//放货点位--最大
Map<Long, Long> toLocationMap = detailDOS.stream()
.filter(v -> ObjectUtil.isNotEmpty(v.getToMapId()))
.collect(Collectors.groupingBy(RobotTaskDetailDO::getToMapId,
.filter(v -> ObjectUtil.isNotEmpty(v.getToMapItemId()))
.collect(Collectors.groupingBy(RobotTaskDetailDO::getToMapItemId,
Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparingLong(RobotTaskDetailDO::getToLocationNumber)),
a -> a.isPresent() ? a.get().getToLocationNumber() : null)));
@ -392,14 +392,14 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
for (RobotTaskDetailDO v : detailDOS) {
RobotTaskDetailDO fromLane = ObjectUtil.isNotEmpty(v.getFromLaneId()) ? fromLaneMap.get(v.getFromLaneId()) : null;
RobotTaskDetailDO toLane = ObjectUtil.isNotEmpty(v.getToLaneId()) ? toLaneMap.get(v.getToLaneId()) : null;
Long fromLocation = ObjectUtil.isNotEmpty(v.getFromMapId()) ? fromLocationMap.get(v.getFromMapId()) : null;
Long toLocation = ObjectUtil.isNotEmpty(v.getToMapId()) ? toLocationMap.get(v.getToMapId()) : null;
Long fromLocation = ObjectUtil.isNotEmpty(v.getFromMapItemId()) ? fromLocationMap.get(v.getFromMapItemId()) : null;
Long toLocation = ObjectUtil.isNotEmpty(v.getToMapItemId()) ? toLocationMap.get(v.getToMapItemId()) : null;
//校验放货线库有取的任务
RobotTaskDetailDO fromLaneDoRelease = ObjectUtil.isNotEmpty(v.getToLaneId()) ? fromLaneMap.get(v.getToLaneId()) : null;
//校验放的普通库位有取的任务
Long toHaveFrom = ObjectUtil.isNotEmpty(v.getToMapId()) ? fromLocationMap.get(v.getToMapId()) : null;
Long toHaveFrom = ObjectUtil.isNotEmpty(v.getToMapItemId()) ? fromLocationMap.get(v.getToMapItemId()) : null;
//校验取货库位有放的任务
Long fromHaveTo = ObjectUtil.isNotEmpty(v.getFromMapId()) ? toLocationMap.get(v.getFromMapId()) : null;
Long fromHaveTo = ObjectUtil.isNotEmpty(v.getFromMapItemId()) ? toLocationMap.get(v.getFromMapItemId()) : null;
//取放模式
if (RobotTaskTypeEnum.TAKE_RELEASE.getType().equals(v.getTaskType())) {
@ -694,7 +694,7 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
taskNigth.setCommand_type(CommandTypeEnum.MOVE_POSES.getType());
List<Pose2ds> pose2dsNight = new ArrayList<>();
WareHouseLocationDO ware = WareHouseLocationDO.builder()
/*WareHouseLocationDO ware = WareHouseLocationDO.builder()
.laneId(-2l)
.build();
List<WareHouseLocationDO> releaseStockList =
@ -702,7 +702,7 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
for (WareHouseLocationDO wareHouseLocationDO : releaseStockList) {
Pose2ds pose = positionMapItemMapper.selectByLocationId(wareHouseLocationDO.getId());
pose2dsNight.add(pose);
}
}*/
// taskNigth.setPose2ds(pose2dsNight);

View File

@ -250,4 +250,6 @@ zn:
robot_chearg: #机器人充电的配置
release_location_number_config: 50 #同一组序号,越大越先执行
priority_config: 50 #优先级
task: #任务相关的配置
check_sku_info: true #校验物料信息

View File

@ -496,47 +496,90 @@
#{id}
</foreach>
</update>
<update id="releaseLocationLockList">
update
ware_house_location
set
location_lock = #{locationLock}
where
task_id = #{taskId}
and location_lock = '0'
and id in
<foreach collection="locationIds" item="id" index="index" open="(" close=")"
separator=",">
#{id}
</foreach>
</update>
<select id="selectByTypeAndId" resultMap="BaseResultMap">
select
<include refid="base_sql"></include>
from
ware_house_location
ware_house_location t1
<where>
<if test= " locationUseStatus != null ">
AND location_use_status = #{locationUseStatus}
AND t1.location_use_status = #{locationUseStatus}
</if>
<if test= "takeType != null and takeType == '1'.toString()">
AND id = #{id}
AND t1.id = #{id}
</if>
<if test= "takeType != null and takeType == '2'.toString()">
AND lane_id = #{id}
AND t1.lane_id = #{id}
</if>
<if test= "takeType != null and takeType == '3'.toString()">
AND area_id = #{id}
AND t1.area_id = #{id}
</if>
<if test= " locationIds != null and locationIds.size() > 0">
AND id not in
AND t1.id not in
<foreach collection="locationIds" item="id" index="index" open="(" close=")"
separator=",">
#{id}
</foreach>
</if>
<if test= " mapIds != null and mapIds.size() > 0">
AND map_id in
AND t1.map_id in
<foreach collection="mapIds" item="mapId" index="index" open="(" close=")"
separator=",">
#{mapId}
</foreach>
</if>
<if test= '"1"=="1"'>
AND location_enable = '1'
AND location_lock = '1'
AND location_type = '0'
AND t1.location_enable = '1'
AND t1.location_lock = '1'
AND t1.location_type = '0'
</if>
<if test= "locationUseStatus != null and locationUseStatus == '0'.toString()">
AND ((t1.lane_id > 0
and t1.location_number &lt; (SELECT IFNULL(min( t2.location_number ) ,10000000000) from ware_house_location t2
where t1.lane_id = t2.lane_id
AND t2.location_type = '0'
AND (t2.location_use_status = '1' or t2.location_enable = '0' or t2.location_lock = '0'))
) or t1.lane_id is null)
</if>
<if test= " takeMapItemIds != null and takeMapItemIds.size() > 0">
AND t1.map_item_id not in
<foreach collection="takeMapItemIds" item="mapItemId" index="index" open="(" close=")"
separator=",">
#{mapItemId}
</foreach>
</if>
<if test= " laneIds != null and laneIds.size() > 0">
AND t1.lane_id in
<foreach collection="laneIds" item="laneId" index="index" open="(" close=")"
separator=",">
#{laneId}
</foreach>
</if>
<if test= " areaIds != null and areaIds.size() > 0">
AND t1.area_id in
<foreach collection="areaIds" item="areaId" index="index" open="(" close=")"
separator=",">
#{areaId}
</foreach>
</if>
</where>
order by location_number desc , location_storey asc
order by t1.location_number desc , t1.location_storey asc
limit 1
</select>
@ -642,8 +685,29 @@
#{mapId}
</foreach>
</if>
<if test="laneIds != null and laneIds.size() > 0">
and lane_id in
<foreach collection="laneIds" item="item" index="index" open="(" close=")"
separator=",">
#{item}
</foreach>
</if>
<if test="areaIds != null and areaIds.size() > 0">
and area_id in
<foreach collection="areaIds" item="item" index="index" open="(" close=")"
separator=",">
#{item}
</foreach>
</if>
<if test="mapItemIds != null and mapItemIds.size() > 0">
and map_item_id not in
<foreach collection="mapItemIds" item="item" index="index" open="(" close=")"
separator=",">
#{item}
</foreach>
</if>
</where>
order by id asc
order by location_number asc
</select>
<select id="getLocationByName" resultType="cn.iocoder.yudao.module.system.controller.admin.houselocation.vo.WareHouseLocationRespVO">
<choose>

View File

@ -267,11 +267,7 @@
set
robot_status = #{robotStatus}
where
robot_no in
<foreach collection="robotNos" item="robotNo" index="index" open="(" close=")"
separator=",">
#{robotNo}
</foreach>
robot_no = #{robotNo}
</update>
<!--通过主键删除-->

View File

@ -17,8 +17,8 @@
<result property="toLaneId" column="to_lane_id" jdbcType="INTEGER"/>
<result property="fromLocationNumber" column="from_location_number" jdbcType="INTEGER"/>
<result property="toLocationNumber" column="to_location_number" jdbcType="INTEGER"/>
<result property="fromMapId" column="from_map_id" jdbcType="INTEGER"/>
<result property="toMapId" column="to_map_id" jdbcType="INTEGER"/>
<result property="fromMapItemId" column="from_map_item_id" jdbcType="INTEGER"/>
<result property="toMapItemId" column="to_map_item_id" jdbcType="INTEGER"/>
<result property="toLocationNo" column="to_location_no" jdbcType="VARCHAR"/>
<result property="toLocationId" column="to_location_id" jdbcType="INTEGER"/>
<result property="fromLocationStorey" column="from_location_storey" jdbcType="INTEGER"/>
@ -69,8 +69,8 @@
priority,
from_location_number,
to_location_number,
from_map_id,
to_map_id
from_map_item_id,
to_map_item_id
</sql>
@ -197,20 +197,55 @@
and t2.task_type = '3'
</select>
<select id="selectTakeMapItemIds" resultType="java.lang.Long">
select
t2.map_item_id
from
robot_task_detail t1, ware_house_location t2
where
t1.from_location_id = t2.id
and t1.task_status in ('0','1')
</select>
<select id="selectReleaseMapItemIds" resultType="java.lang.Long">
select
t2.map_item_id
from
robot_task_detail t1, ware_house_location t2
where
t1.to_location_id = t2.id
and t1.task_status in ('0','1')
</select>
<select id="selectAutoCreateCycleTask"
resultType="cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDetailDO">
select
t1.*
from
robot_task_detail t1, robot_task t2
where
t2.id = t1.robot_task_id
and t2.remaining_cycle_number > 1
and t2.task_status = '2'
and t1.task_status = '2'
and t1.deleted = '0'
and t2.deleted = '0'
</select>
<!--keyProperty="id" useGeneratedKeys="true"-->
<insert id="insertBatchList" >
insert into robot_task_detail(robot_task_id, task_type, release_type, take_type, release_id, take_id,
from_location_no, from_location_id, to_location_no, to_location_id, robot_no,from_location_storey,
to_location_storey,priority,from_lane_id,to_lane_id,from_location_number,to_location_number,
from_map_id,to_map_id)
from_map_item_id,to_map_item_id)
values
<foreach collection="taskDetailList" item="entity" separator=",">
(#{entity.robotTaskId}, #{entity.taskType}, #{entity.releaseType}, #{entity.takeType}, #{entity.releaseId},
#{entity.takeId}, #{entity.fromLocationNo}, #{entity.fromLocationId}, #{entity.toLocationNo},
#{entity.toLocationId}, #{entity.robotNo}, #{entity.fromLocationStorey}, #{entity.toLocationStorey}
, #{entity.priority}, #{entity.fromLaneId}, #{entity.toLaneId}, #{entity.fromLocationNumber},
#{entity.toLocationNumber}, #{entity.fromMapId}, #{entity.toMapId})
#{entity.toLocationNumber}, #{entity.fromMapItemId}, #{entity.toMapItemId})
</foreach>
</insert>

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.system.dal.mysql.cycle.TaskCycleMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
<delete id="deletByRobotTaskId">
delete from robot_task_cycle where robot_task_id = #{robotTaskId}
</delete>
</mapper>