车辆暂停/库位类型/

This commit is contained in:
cbs 2025-06-25 17:35:05 +08:00
parent 296bcebf77
commit 2283466164
37 changed files with 736 additions and 71 deletions

View File

@ -36,6 +36,7 @@ public class ApiAccessLogInterceptor implements HandlerInterceptor {
private static final List<String> ignoreInterfaceUrls = Arrays.asList("/rpc-api/system/task/robotStatusUpdate",
"/rpc-api/system/task/robotReactiveStatus",
"/rpc-api/infra/websocket/send",
"/rpc-api/system/task/updateRobotCommonStatus");
@Override

View File

@ -18,11 +18,11 @@ public interface CommonApi {
String PREFIX = ApiConstants.PREFIX + "/config";
@PostMapping(PREFIX + "/commonMethod")
/* @PostMapping(PREFIX + "/commonMethod")
@Operation(summary = "公共方法")
void commonMethod(@RequestBody Object obj, @RequestParam("topic") String topic);
@PostMapping(PREFIX + "/commonMethodStr")
@Operation(summary = "公共方法")
void commonMethodStr(@RequestParam("str") String str, @RequestParam("topic") String topic);
void commonMethodStr(@RequestParam("str") String str, @RequestParam("topic") String topic);*/
}

View File

@ -35,4 +35,10 @@ public class RobotDimensionsDTO {
@Schema(description = "偏移量")
private Double robotOffset;
@Schema(description = "检测点最短距离")
private Double checkShortestDistance;
@Schema(description = "检测点最长距离")
private Double checkLongestDistance;
}

View File

@ -44,7 +44,7 @@ public class TCPServerApplicationRunner implements ApplicationRunner {
System.out.println(new String(bytes,0,len));
OutputStream os= socket.getOutputStream();
//响应给客户端
os.write("收到谢谢".getBytes());
os.write("socket :".getBytes());
socket.close();
} catch (IOException e) {
e.printStackTrace();

View File

@ -329,4 +329,7 @@ public interface ErrorCodeConstants {
// ========== 车辆工作时长统计 1_002_058_001 ==========
ErrorCode ROBOT_WORKING_HOURS_STATISTICS_NOT_EXISTS = new ErrorCode(1_002_058_001, "车辆工作时长统计不存在");
// ========== 库位类型 1_002_059_001 ==========
ErrorCode HOUSE_LOCATION_TYPE_NOT_EXISTS = new ErrorCode(1_002_059_001, "库位类型不存在");
}

View File

@ -388,7 +388,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
.id(robotCompleteTaskDTO.getOrderId().toString())
.build();
// commonApi.commonMethod(closePathPlanting, PathPlanningTopicConstant.KILL_TASK);
mqttUtils.pub(PathPlanningTopicConstant.KILL_TASK,JSON.toJSONString(closePathPlanting));
mqttUtils.pub(PathPlanningTopicConstant.KILL_TASK, JSON.toJSONString(closePathPlanting));
log.info("通知PP把任务取消 :{}", robotCompleteTaskDTO.getOrderId());
}
@ -424,9 +424,11 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
robotTaskDetailDO.setOccurError(ZeroOneEnum.ZERO.getType());
robotTaskDetailMapper.updateById(robotTaskDetailDO);
String taskNo = taskDetailService.getTaskNoByDetailId(robotCompleteTaskDTO.getOrderId());
msg = robotNo + "_" + "车辆发生异常,重新分配其他车辆执行此任务" + taskNo;
msg = robotNo + "_" + "车辆发生异常,重新分配其他车辆执行此任务" + taskNo + " - " + robotCompleteTaskDTO.getOrderId();
}
}
//先不释放库位状态
/*if (RobotTaksOrderTypeEnum.TASK.getType().equals(robotCompleteTaskDTO.getOrderType())) {
RobotTaskDetailDO robotTaskDetailDO = closeTaskDetail(robotCompleteTaskDTO.getOrderId());
@ -581,12 +583,12 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
logOne.setActionMsg("车辆正在前往" + robotTaskDetailDO.getFromLocationNo() + "取货");
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.GO_TAKE.getType());
} else if (CommandTypeEnum.WORK_PICK_UP_GOODS.getType().equals(commandType)) {
logOne.setActionMsg("车辆正在取货");
logOne.setActionMsg("车辆正在取货" + robotTaskDetailDO.getFromLocationNo());
if (!RobotTaskStageEnum.GO_RELEASE.getType().equals(taskStage)) {
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.TAKEING.getType());
}
} else if (CommandTypeEnum.WORK_DROP_OFF_GOODS.getType().equals(commandType)) {
logOne.setActionMsg("车辆正在放货");
logOne.setActionMsg("车辆正在放货" + robotTaskDetailDO.getToLocationNo());
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.RELEASEING.getType());
} else if (CommandTypeEnum.MOVE_POSES.getType().equals(commandType)) {
logOne.setActionMsg("车辆正在前往" + robotTaskDetailDO.getToLocationNo() + "放货");
@ -599,10 +601,10 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
|| PathTaskTypeEnum.AUTO_CHARGE.getType().equals(robotCompleteTaskDTO.getOrderType())) {
RobotChargeLogDO robotChargeLogDO = chargeLogMapper.selectById(robotCompleteTaskDTO.getOrderId());
if (CommandTypeEnum.MOVE_POSES.getType().equals(commandType)) {
logOne.setActionMsg("车辆正在前往" + robotChargeLogDO.getDeviceNo() + "充电");
logOne.setActionMsg("车辆正在前往 " + robotChargeLogDO.getDeviceNo() + "充电");
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.MOVE.getType());
} else {
logOne.setActionMsg("车辆正在充电");
logOne.setActionMsg("车辆正在充电 " + robotChargeLogDO.getDeviceNo());
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.CHARGEING.getType());
}
@ -623,7 +625,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
logOne.setActionMsg("车辆正在前往" + robotTaskDetailDO.getFromLocationNo() + "取货");
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.GO_TAKE.getType());
} else if (CommandTypeEnum.WORK_PICK_UP_GOODS.getType().equals(commandType)) {
logOne.setActionMsg("车辆正在取货");
logOne.setActionMsg("车辆正在取货" + robotTaskDetailDO.getFromLocationNo());
if (!RobotTaskStageEnum.DONE.getType().equals(taskStage)) {
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.TAKEING.getType());
}
@ -634,7 +636,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
logOne.setActionMsg("车辆正在前往" + robotTaskDetailDO.getToLocationNo() + "放货");
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.GO_RELEASE.getType());
} else if (CommandTypeEnum.WORK_DROP_OFF_GOODS.getType().equals(commandType)) {
logOne.setActionMsg("车辆正在放货");
logOne.setActionMsg("车辆正在放货"+ robotTaskDetailDO.getToLocationNo());
if (!RobotTaskStageEnum.DONE.getType().equals(taskStage)) {
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.RELEASEING.getType());
}

View File

@ -34,4 +34,6 @@ public class ZnConfigConstant {
private Boolean sendRobotInitPose;
private Integer synchronousAllMapNode;
private Boolean taskNotCheck;
private Double checkShortestDistance;
private Double checkLongestDistance;
}

View File

@ -0,0 +1,105 @@
package cn.iocoder.yudao.module.system.controller.admin.houselocation;
import cn.iocoder.yudao.module.system.controller.admin.houselocation.vo.WareHouseLocationTypePageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.houselocation.vo.WareHouseLocationTypeRespVO;
import cn.iocoder.yudao.module.system.controller.admin.houselocation.vo.WareHouseLocationTypeSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.houselocation.WareHouseLocationTypeDO;
import cn.iocoder.yudao.module.system.service.houselocation.WareHouseLocationTypeService;
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("/system/ware/house-location-type")
@Validated
public class WareHouseLocationTypeController {
@Resource
private WareHouseLocationTypeService houseLocationTypeService;
@PostMapping("/create")
@Operation(summary = "创建库位类型")
@PreAuthorize("@ss.hasPermission('ware:house-location-type:create')")
public CommonResult<Long> createHouseLocationType(@Valid @RequestBody WareHouseLocationTypeSaveReqVO createReqVO) {
return success(houseLocationTypeService.createHouseLocationType(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新库位类型")
@PreAuthorize("@ss.hasPermission('ware:house-location-type:update')")
public CommonResult<Boolean> updateHouseLocationType(@Valid @RequestBody WareHouseLocationTypeSaveReqVO updateReqVO) {
houseLocationTypeService.updateHouseLocationType(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除库位类型")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('ware:house-location-type:delete')")
public CommonResult<Boolean> deleteHouseLocationType(@RequestParam("id") Long id) {
houseLocationTypeService.deleteHouseLocationType(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得库位类型")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('ware:house-location-type:query')")
public CommonResult<WareHouseLocationTypeRespVO> getHouseLocationType(@RequestParam("id") Long id) {
WareHouseLocationTypeDO houseLocationType = houseLocationTypeService.getHouseLocationType(id);
return success(BeanUtils.toBean(houseLocationType, WareHouseLocationTypeRespVO.class));
}
@GetMapping("/getList")
@Operation(summary = "获得库位类型集合")
@PreAuthorize("@ss.hasPermission('ware:house-location-type:getList')")
public CommonResult<List<WareHouseLocationTypeRespVO>> getHouseLocationTypeList() {
List<WareHouseLocationTypeDO> list = houseLocationTypeService.getHouseLocationTypeList();
return success(BeanUtils.toBean(list, WareHouseLocationTypeRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得库位类型分页")
@PreAuthorize("@ss.hasPermission('ware:house-location-type:query')")
public CommonResult<PageResult<WareHouseLocationTypeRespVO>> getHouseLocationTypePage(@Valid WareHouseLocationTypePageReqVO pageReqVO) {
PageResult<WareHouseLocationTypeDO> pageResult = houseLocationTypeService.getHouseLocationTypePage(pageReqVO);
return success(BeanUtils.toBean(pageResult, WareHouseLocationTypeRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出库位类型 Excel")
@PreAuthorize("@ss.hasPermission('ware:house-location-type:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportHouseLocationTypeExcel(@Valid WareHouseLocationTypePageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<WareHouseLocationTypeDO> list = houseLocationTypeService.getHouseLocationTypePage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "库位类型.xls", "数据", WareHouseLocationTypeRespVO.class,
BeanUtils.toBean(list, WareHouseLocationTypeRespVO.class));
}
}

View File

@ -111,4 +111,7 @@ public class WareHouseLocationPageReqVO extends PageParam {
@Schema(description = "ware_position_map的id", example = "1")
private Long mapId;
@Schema(description = "库位类型表的id")
private Long locationTypeId;
}

View File

@ -144,4 +144,8 @@ public class WareHouseLocationRespVO {
@Schema(description = "ware_position_map_item的id", example = "1")
@ExcelProperty("ware_position_map_item的id")
private Long mapItemId;
@Schema(description = "库位类型表的id")
@ExcelProperty("库位类型表的id")
private Long locationTypeId;
}

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.system.controller.admin.houselocation.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@ -103,4 +104,7 @@ public class WareHouseLocationSaveReqVO {
@Schema(description = "ware_position_map的id", example = "1")
private Long mapId;
@Schema(description = "库位类型表的id")
private Long locationTypeId;
}

View File

@ -0,0 +1,40 @@
package cn.iocoder.yudao.module.system.controller.admin.houselocation.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 WareHouseLocationTypePageReqVO extends PageParam {
@Schema(description = "库位类型名称", example = "赵六")
private String typeName;
@Schema(description = "排序,越大越靠前")
private Integer locationSort;
@Schema(description = "宽度,单位厘米")
private String locationWide;
@Schema(description = "深度,单位厘米")
private String locationDeep;
@Schema(description = "高,单位厘米")
private String locationHeight;
@Schema(description = "载重,单位公斤")
private String locationLoad;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@ -0,0 +1,47 @@
package cn.iocoder.yudao.module.system.controller.admin.houselocation.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 WareHouseLocationTypeRespVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "8811")
@ExcelProperty("主键ID")
private Long id;
@Schema(description = "库位类型名称", example = "赵六")
@ExcelProperty("库位类型名称")
private String typeName;
@Schema(description = "排序,越大越靠前")
@ExcelProperty("排序,越大越靠前")
private Integer locationSort;
@Schema(description = "宽度,单位厘米")
@ExcelProperty("宽度,单位厘米")
private String locationWide;
@Schema(description = "深度,单位厘米")
@ExcelProperty("深度,单位厘米")
private String locationDeep;
@Schema(description = "高,单位厘米")
@ExcelProperty("高,单位厘米")
private String locationHeight;
@Schema(description = "载重,单位公斤")
@ExcelProperty("载重,单位公斤")
private String locationLoad;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

View File

@ -0,0 +1,33 @@
package cn.iocoder.yudao.module.system.controller.admin.houselocation.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 WareHouseLocationTypeSaveReqVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "8811")
private Long id;
@Schema(description = "库位类型名称", example = "赵六")
private String typeName;
@Schema(description = "排序,越大越靠前")
private Integer locationSort;
@Schema(description = "宽度,单位厘米")
private String locationWide;
@Schema(description = "深度,单位厘米")
private String locationDeep;
@Schema(description = "高,单位厘米")
private String locationHeight;
@Schema(description = "载重,单位公斤")
private String locationLoad;
}

View File

@ -163,4 +163,21 @@ public class RobotInformationController {
public CommonResult<List<String>> getRobotByFloorAndArea(@RequestParam("floor") String floor, @RequestParam("area") String area) {
return success(informationService.getRobotByFloorAndArea(floor,area));
}
@PostMapping("/stopRobot")
@Operation(summary = "暂停车辆")
@PreAuthorize("@ss.hasPermission('robot:information:stopRobot')")
public CommonResult<Boolean> stopRobot(@RequestParam("robotNo") String robotNo) {
informationService.stopRobot(robotNo);
return success(true);
}
@PostMapping("/continueRobot")
@Operation(summary = "恢复车辆")
@PreAuthorize("@ss.hasPermission('robot:information:continueRobot')")
public CommonResult<Boolean> continueRobot(@RequestParam("robotNo") String robotNo) {
informationService.continueRobot(robotNo);
return success(true);
}
}

View File

@ -100,4 +100,7 @@ public class RobotInformationPageRespVO {
@Schema(description = "车辆是否有货")
private String cargoDetected;
@Schema(description = "车辆是否暂停 : 1:已暂停, 其他:未暂停, ")
private Integer isStop;
}

View File

@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.system.dal.dataobject.houselocation;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.math.BigDecimal;
@ -163,4 +164,9 @@ public class WareHouseLocationDO extends BaseDO {
* ware_position_map_item的id
*/
private Long mapItemId;
/**
* 库位类型表的id
*/
private Long locationTypeId;
}

View File

@ -0,0 +1,55 @@
package cn.iocoder.yudao.module.system.dal.dataobject.houselocation;
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("ware_house_location_type")
@KeySequence("ware_house_location_type_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WareHouseLocationTypeDO extends BaseDO {
/**
* 主键ID
*/
@TableId
private Long id;
/**
* 库位类型名称
*/
private String typeName;
/**
* 排序,越大越靠前
*/
private Integer locationSort;
/**
* 宽度,单位厘米
*/
private String locationWide;
/**
* 深度,单位厘米
*/
private String locationDeep;
/**
* ,单位厘米
*/
private String locationHeight;
/**
* 载重,单位公斤
*/
private String locationLoad;
}

View File

@ -0,0 +1,32 @@
package cn.iocoder.yudao.module.system.dal.mysql.houselocation;
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.houselocation.vo.WareHouseLocationTypePageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.houselocation.WareHouseLocationTypeDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 库位类型 Mapper
*
* @author 陈宾顺
*/
@Mapper
public interface WareHouseLocationTypeMapper extends BaseMapperX<WareHouseLocationTypeDO> {
default PageResult<WareHouseLocationTypeDO> selectPage(WareHouseLocationTypePageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<WareHouseLocationTypeDO>()
.likeIfPresent(WareHouseLocationTypeDO::getTypeName, reqVO.getTypeName())
.eqIfPresent(WareHouseLocationTypeDO::getLocationSort, reqVO.getLocationSort())
.eqIfPresent(WareHouseLocationTypeDO::getLocationWide, reqVO.getLocationWide())
.eqIfPresent(WareHouseLocationTypeDO::getLocationDeep, reqVO.getLocationDeep())
.eqIfPresent(WareHouseLocationTypeDO::getLocationHeight, reqVO.getLocationHeight())
.eqIfPresent(WareHouseLocationTypeDO::getLocationLoad, reqVO.getLocationLoad())
.betweenIfPresent(WareHouseLocationTypeDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(WareHouseLocationTypeDO::getId));
}
}

View File

@ -9,7 +9,9 @@ import lombok.Getter;
@Getter
@AllArgsConstructor
public enum RobotStatusEnum {
LAST_TASK_IS_TAKE(1,"上一个任务是仅取货(这是一个过渡状态,数据库没有这种状态)"),
LAST_TASK_IS_TAKE(-1,"上一个任务是仅取货(这是一个过渡状态,数据库没有这种状态)"),
STOP_FREE(0,"暂停且待命中"),
STOP_DOING(1,"暂停且任务中"),
DOING(2,"任务中"),
STAND_BY(3,"待命"),
CHARGE(4,"充电中");
@ -18,4 +20,13 @@ public enum RobotStatusEnum {
*/
private final Integer type;
private final String msg;
public static String getMsg(Integer type) {
for (RobotStatusEnum item : RobotStatusEnum.values()) {
if (item.getType().equals(type)) {
return item.getMsg();
}
}
return "";
}
}

View File

@ -13,8 +13,8 @@ public enum RobotCommandTypeEnum {
WORK_DROP_OFF_GOODS("WORK_DROP_OFF_GOODS","放货"),
MOVE_POSE("MOVE_POSE","仿真移动点位"),
MODE("MODE","远遥/RCS模式切换"),
EMERGENCY_STOP("EMERGENCY_STOP","急停车辆"),
RECOVERY("RECOVERY","恢复车辆");
PAUSE("PAUSE","急停车辆"),
CONTINUE("CONTINUE","恢复车辆");
/**
* 类型
*/

View File

@ -16,7 +16,9 @@ public enum RobotTaskStageEnum {
CHARGEING(7L,"待执行正在充电"),
CLOSE(8L,"任务已取消"),
MANUALLY_COMPLETED(9L,"人工完成"),
EXCEPTION(10L,"异常");
EXCEPTION(10L,"异常"),
TAKEING_EXCEPTION(11L,"取货异常"),
RELEASEING_EXCEPTION(12L,"放货异常");
/**
* 类型
*/

View File

@ -40,7 +40,7 @@ public class RcsMapScheduled {
private static final ExecutorService FIXED_THREAD_POOL = Executors.newFixedThreadPool(10);
// 这个方法将每200毫秒执行一次
@Scheduled(fixedDelay = 100, timeUnit = TimeUnit.MILLISECONDS)
@Scheduled(fixedDelay = 150, timeUnit = TimeUnit.MILLISECONDS)
public void executeTask() {
FIXED_THREAD_POOL.execute(this::sendRobotInformationToRcsMap);
}

View File

@ -0,0 +1,63 @@
package cn.iocoder.yudao.module.system.service.houselocation;
import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.module.system.controller.admin.houselocation.vo.WareHouseLocationTypePageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.houselocation.vo.WareHouseLocationTypeSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.houselocation.WareHouseLocationTypeDO;
import com.baomidou.mybatisplus.extension.service.IService;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
/**
* 库位类型 Service 接口
*
* @author 陈宾顺
*/
public interface WareHouseLocationTypeService extends IService<WareHouseLocationTypeDO> {
/**
* 创建库位类型
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createHouseLocationType(@Valid WareHouseLocationTypeSaveReqVO createReqVO);
/**
* 更新库位类型
*
* @param updateReqVO 更新信息
*/
void updateHouseLocationType(@Valid WareHouseLocationTypeSaveReqVO updateReqVO);
/**
* 删除库位类型
*
* @param id 编号
*/
void deleteHouseLocationType(Long id);
/**
* 获得库位类型
*
* @param id 编号
* @return 库位类型
*/
WareHouseLocationTypeDO getHouseLocationType(Long id);
/**
* 获得库位类型分页
*
* @param pageReqVO 分页查询
* @return 库位类型分页
*/
PageResult<WareHouseLocationTypeDO> getHouseLocationTypePage(WareHouseLocationTypePageReqVO pageReqVO);
/**
* 获取所有库位类型
* @return
*/
List<WareHouseLocationTypeDO> getHouseLocationTypeList();
}

View File

@ -0,0 +1,88 @@
package cn.iocoder.yudao.module.system.service.houselocation;
import cn.iocoder.yudao.module.system.controller.admin.houselocation.vo.WareHouseLocationTypePageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.houselocation.vo.WareHouseLocationTypeSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.houselocation.WareHouseLocationDO;
import cn.iocoder.yudao.module.system.dal.dataobject.houselocation.WareHouseLocationTypeDO;
import cn.iocoder.yudao.module.system.dal.mysql.houselocation.WareHouseLocationTypeMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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 com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.HOUSE_LOCATION_TYPE_NOT_EXISTS;
/**
* 库位类型 Service 实现类
*
* @author 陈宾顺
*/
@Service
@Validated
public class WareHouseLocationTypeServiceImpl extends ServiceImpl<WareHouseLocationTypeMapper, WareHouseLocationTypeDO> implements WareHouseLocationTypeService {
@Resource
private WareHouseLocationTypeMapper houseLocationTypeMapper;
@Override
public Long createHouseLocationType(WareHouseLocationTypeSaveReqVO createReqVO) {
// 插入
WareHouseLocationTypeDO houseLocationType = BeanUtils.toBean(createReqVO, WareHouseLocationTypeDO.class);
houseLocationTypeMapper.insert(houseLocationType);
// 返回
return houseLocationType.getId();
}
@Override
public void updateHouseLocationType(WareHouseLocationTypeSaveReqVO updateReqVO) {
// 校验存在
validateHouseLocationTypeExists(updateReqVO.getId());
// 更新
WareHouseLocationTypeDO updateObj = BeanUtils.toBean(updateReqVO, WareHouseLocationTypeDO.class);
houseLocationTypeMapper.updateById(updateObj);
}
@Override
public void deleteHouseLocationType(Long id) {
// 校验存在
validateHouseLocationTypeExists(id);
// 删除
houseLocationTypeMapper.deleteById(id);
}
private void validateHouseLocationTypeExists(Long id) {
if (houseLocationTypeMapper.selectById(id) == null) {
throw exception(HOUSE_LOCATION_TYPE_NOT_EXISTS);
}
}
@Override
public WareHouseLocationTypeDO getHouseLocationType(Long id) {
return houseLocationTypeMapper.selectById(id);
}
@Override
public PageResult<WareHouseLocationTypeDO> getHouseLocationTypePage(WareHouseLocationTypePageReqVO pageReqVO) {
return houseLocationTypeMapper.selectPage(pageReqVO);
}
/**
* 获取所有库位类型
* @return
*/
@Override
public List<WareHouseLocationTypeDO> getHouseLocationTypeList() {
return houseLocationTypeMapper.selectList(new LambdaQueryWrapper<WareHouseLocationTypeDO>()
.orderByDesc(WareHouseLocationTypeDO::getLocationSort));
}
}

View File

@ -84,9 +84,6 @@ import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.PATH_PLANN
@Service
public class PathPlanningServiceImpl implements PathPlanningService {
private static final double PI = Math.PI;
@Resource
private PositionMapLineMapper positionMapLineMapper;
@ -459,9 +456,7 @@ public class PathPlanningServiceImpl implements PathPlanningService {
@Override
public void robotDimensions() {
List<RobotDimensionsDTO> list = informationMapper.selectRobotDimensions();
// commonApi.commonMethod(list, PathPlanningTopicConstant.SEND_ROBOT_DIMENSIONS);
mqttUtils.pub(PathPlanningTopicConstant.SEND_ROBOT_DIMENSIONS,JSON.toJSONString(list));
robotInformationService.sendRobotConfigToPP();
}
/**

View File

@ -6,7 +6,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.mqtt.api.common.CommonApi;
import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotAcceptTaskDTO;
import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotSimulationPoseDTO;
import cn.iocoder.yudao.module.system.api.path.PathApi;
import cn.iocoder.yudao.module.system.api.remote.dto.RemoteRobotDTO;
@ -418,7 +418,7 @@ public class PositionMapServiceImpl extends ServiceImpl<PositionMapMapper, Posit
// 先获取当前地图上的所有AGV信息
PositionMapDO positionMapDO = positionMapMapper.selectById(id);
RobotSimulationPoseDTO robotSimulationPose = new RobotSimulationPoseDTO();
RobotAcceptTaskDTO robotSimulationPose = new RobotAcceptTaskDTO();
List<String> robotNos = new ArrayList<>();
String str = "";
@ -426,8 +426,8 @@ public class PositionMapServiceImpl extends ServiceImpl<PositionMapMapper, Posit
//暂停
if (ZeroOneEnum.ONE.getType().equals(type)) {
robotNos = informationService.getRobotByFloorAndArea(String.valueOf(positionMapDO.getFloor()), positionMapDO.getArea());
robotSimulationPose.setCommandType(RobotCommandTypeEnum.EMERGENCY_STOP.getType());
str = RobotCommandTypeEnum.EMERGENCY_STOP.getMsg();
robotSimulationPose.setExecutionType(RobotCommandTypeEnum.PAUSE.getType());
str = RobotCommandTypeEnum.PAUSE.getMsg();
if (isRemote) {
mapStr = "远遥一键暂停 " + mapStr;
} else {
@ -446,8 +446,8 @@ public class PositionMapServiceImpl extends ServiceImpl<PositionMapMapper, Posit
} else {
//恢复
robotNos = robotMapStopService.getStopRobotNoByMapIds(id);
robotSimulationPose.setCommandType(RobotCommandTypeEnum.RECOVERY.getType());
str = RobotCommandTypeEnum.RECOVERY.getMsg();
robotSimulationPose.setExecutionType(RobotCommandTypeEnum.CONTINUE.getType());
str = RobotCommandTypeEnum.CONTINUE.getMsg();
if (isRemote) {
mapStr = "远遥一键恢复 " + mapStr;
} else {

View File

@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.system.service.robot;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotAcceptTaskDTO;
import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotSimulationPoseDTO;
import cn.iocoder.yudao.module.system.api.robot.dto.FloorZoneDTO;
import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDTO;
@ -186,7 +187,7 @@ public interface RobotInformationService extends IService<RobotInformationDO> {
* @param robotNos
* @param str
*/
void sendEmergencyStopOrRecoveryToRobot(RobotSimulationPoseDTO robotSimulationPose, List<String> robotNos, String str);
void sendEmergencyStopOrRecoveryToRobot(RobotAcceptTaskDTO robotSimulationPose, List<String> robotNos, String str);
/**
* 查询机器人处理中的任务
@ -255,4 +256,10 @@ public interface RobotInformationService extends IService<RobotInformationDO> {
* @return
*/
Long getRobotMapIdByRobotNo(String robotNo);
void sendRobotConfigToPP();
void stopRobot(String robotNo);
void continueRobot(String robotNo);
}

View File

@ -10,13 +10,11 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.module.mqtt.api.common.CommonApi;
import cn.iocoder.yudao.module.mqtt.api.path.dto.RobotDimensionsDTO;
import cn.iocoder.yudao.module.mqtt.api.path.task.TaskRobotNoLimittationAreaDTO;
import cn.iocoder.yudao.module.mqtt.api.path.task.TaskToPathPlanningDTO;
import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotAcceptTaskDTO;
import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotRcsHeartBeatDTO;
import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotSimulationPoseDTO;
import cn.iocoder.yudao.module.mqtt.enums.task.ExecutionTypeEnum;
import cn.iocoder.yudao.module.system.api.path.vo.RobotClosePathPlantingDTO;
import cn.iocoder.yudao.module.system.api.robot.processor.RequestProcessor;
@ -78,6 +76,7 @@ import cn.iocoder.yudao.module.system.service.log.RobotTaskDetailActionLogServic
import cn.iocoder.yudao.module.system.service.log.UserOperationLogService;
import cn.iocoder.yudao.module.system.service.positionmap.PositionMapItemService;
import cn.iocoder.yudao.module.system.service.robot.camera.RobotCameraService;
import cn.iocoder.yudao.module.system.service.robot.mapstop.RobotMapStopService;
import cn.iocoder.yudao.module.system.service.robot.pathplanning.RobotPathPlanningService;
import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
import cn.iocoder.yudao.module.system.util.redis.RedissonUtils;
@ -87,7 +86,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
@ -182,12 +181,16 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
@Autowired
private ZnConfigConstant znConfigConstant;
@Resource
@Lazy
private RobotMapStopService mapStopService;
@Override
@Transactional(rollbackFor = Exception.class)
public Long createInformation(RobotInformationSaveReqVO createReqVO) {
RobotInformationDO existRobotInformationDO =
informationMapper.selectByMacAndIdNotIn(createReqVO.getMacAddress(),null);
informationMapper.selectByMacAndIdNotIn(createReqVO.getMacAddress(), null);
if (ObjectUtil.isNotEmpty(existRobotInformationDO)) {
throw exception(ROBOT_MAC_ADDRESS_EXISTS);
}
@ -240,9 +243,7 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
.nickName(SecurityFrameworkUtils.getLoginUserNickname()).build();
userOperationLogService.createUserOperationLog(operationLog);
List<RobotDimensionsDTO> list = informationMapper.selectRobotDimensions();
// commonApi.commonMethod(list, PathPlanningTopicConstant.SEND_ROBOT_DIMENSIONS);
mqttUtils.pub(PathPlanningTopicConstant.SEND_ROBOT_DIMENSIONS, JSON.toJSONString(list));
sendRobotConfigToPP();
redisUtil.del(key);
// 返回
@ -341,6 +342,48 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
return positionMap.getId();
}
@Override
public void sendRobotConfigToPP() {
List<RobotDimensionsDTO> robotDimensionsList = informationMapper.selectRobotDimensions();
if (ObjectUtil.isNotEmpty(robotDimensionsList)) {
for (RobotDimensionsDTO robotDimensionsDTO : robotDimensionsList) {
robotDimensionsDTO.setCheckShortestDistance(znConfigConstant.getCheckShortestDistance());
robotDimensionsDTO.setCheckLongestDistance(znConfigConstant.getCheckLongestDistance());
}
}
mqttUtils.pub(PathPlanningTopicConstant.SEND_ROBOT_DIMENSIONS, JSON.toJSONString(robotDimensionsList));
}
@Override
@Transactional(rollbackFor = Exception.class)
public void stopRobot(String robotNo) {
RobotInformationDO robotInformationDO = informationMapper.selectOne(new LambdaQueryWrapper<RobotInformationDO>()
.eq(RobotInformationDO::getRobotNo, robotNo)
.last("limit 1"));
RobotAcceptTaskDTO robotTask = new RobotAcceptTaskDTO();
robotTask.setOrderId(robotInformationDO.getTaskDetailId()+"");
robotTask.setTopic(RobotTopicConstant.ROBOT_TASK_MOVE_TOPIC + robotInformationDO.getMacAddress());
robotTask.setExecutionType(ExecutionTypeEnum.PAUSE.getType());
mqttUtils.pub(robotTask.getTopic(), JSON.toJSONString(robotTask));
mapStopService.rcsStopRobotAddLog(robotNo);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void continueRobot(String robotNo) {
RobotInformationDO robotInformationDO = informationMapper.selectOne(new LambdaQueryWrapper<RobotInformationDO>()
.eq(RobotInformationDO::getRobotNo, robotNo)
.last("limit 1"));
RobotAcceptTaskDTO robotTask = new RobotAcceptTaskDTO();
robotTask.setOrderId(robotInformationDO.getTaskDetailId()+"");
robotTask.setTopic(RobotTopicConstant.ROBOT_TASK_MOVE_TOPIC + robotInformationDO.getMacAddress());
robotTask.setExecutionType(ExecutionTypeEnum.CONTINUE.getType());
mqttUtils.pub(robotTask.getTopic(), JSON.toJSONString(robotTask));
mapStopService.rcsDeleteStopRobotAddLog(robotNo);
}
/**
* 校验IP地址是否合法
@ -358,6 +401,7 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
public void updateInformation(RobotInformationSaveReqVO updateReqVO) {
// 校验存在
validateInformationExists(updateReqVO.getId());
String str = "";
RobotInformationDO robotInformationDO = informationMapper.selectById(updateReqVO.getId());
if (RobotStatusEnum.STAND_BY.getType().equals(robotInformationDO.getRobotStatus())) {
@ -391,9 +435,16 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
}
}
if (RobotStatusEnum.STOP_FREE.getType().equals(updateReqVO.getRobotStatus())
|| RobotStatusEnum.STOP_DOING.getType().equals(updateReqVO.getRobotStatus())) {
updateReqVO.setRobotStatus(robotInformationDO.getRobotStatus());
}else if (!updateReqVO.getRobotStatus().equals(robotInformationDO.getRobotStatus())) {
str = str + " 修改车辆状态: " +RobotStatusEnum.getMsg(updateReqVO.getRobotStatus());
}
if (!updateReqVO.getRobotNo().equals(robotInformationDO.getRobotNo())) {
RobotInformationDO existRobotInformationDO =
informationMapper.selectByRobotNoAndIdNotIn(updateReqVO.getRobotNo(),updateReqVO.getId());
informationMapper.selectByRobotNoAndIdNotIn(updateReqVO.getRobotNo(), updateReqVO.getId());
if (ObjectUtil.isNotEmpty(existRobotInformationDO)) {
throw exception(ROBOT_ROBOT_NO_EXISTS);
}
@ -401,7 +452,7 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
if (!updateReqVO.getMacAddress().equals(robotInformationDO.getMacAddress())) {
RobotInformationDO existRobotInformationDO =
informationMapper.selectByMacAndIdNotIn(updateReqVO.getMacAddress(),updateReqVO.getId());
informationMapper.selectByMacAndIdNotIn(updateReqVO.getMacAddress(), updateReqVO.getId());
if (ObjectUtil.isNotEmpty(existRobotInformationDO)) {
throw exception(ROBOT_MAC_ADDRESS_EXISTS);
}
@ -446,7 +497,7 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
redisUtil.del(key);
String str = "";
if (!robotInformationDO.getRobotTaskModel().equals(updateReqVO.getRobotTaskModel())
&& RobotTaskModelEnum.REJECTION.getType().equals(updateReqVO.getRobotTaskModel())) {
str = ",且设置车辆锁定";
@ -481,9 +532,7 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
.nickName(SecurityFrameworkUtils.getLoginUserNickname()).build();
userOperationLogService.createUserOperationLog(operationLog);
List<RobotDimensionsDTO> robotDimensions = informationMapper.selectRobotDimensions();
// commonApi.commonMethod(robotDimensions, PathPlanningTopicConstant.SEND_ROBOT_DIMENSIONS);
mqttUtils.pub(PathPlanningTopicConstant.SEND_ROBOT_DIMENSIONS, JSON.toJSONString(robotDimensions));
sendRobotConfigToPP();
}
/**
@ -562,9 +611,7 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
//释放暂停记录
releaseRobotStop(robotInformationDO);
List<RobotDimensionsDTO> robotDimensions = informationMapper.selectRobotDimensions();
// commonApi.commonMethod(robotDimensions, PathPlanningTopicConstant.SEND_ROBOT_DIMENSIONS);
mqttUtils.pub(PathPlanningTopicConstant.SEND_ROBOT_DIMENSIONS, JSON.toJSONString(robotDimensions));
sendRobotConfigToPP();
String pose2dKey = RobotTaskChcheConstant.ROBOT_INFORMATION_POSE_BAT + robotInformationDO.getMacAddress();
redisUtil.del(pose2dKey);
@ -594,9 +641,9 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
if (ObjectUtil.isEmpty(robotMapStops)) {
return;
}
RobotSimulationPoseDTO robotSimulationPose = new RobotSimulationPoseDTO();
robotSimulationPose.setCommandType(RobotCommandTypeEnum.RECOVERY.getType());
List<String> robotNoList = Arrays.asList(robotInformationDO.getRobotNo());
RobotAcceptTaskDTO robotSimulationPose = new RobotAcceptTaskDTO();
robotSimulationPose.setExecutionType(RobotCommandTypeEnum.CONTINUE.getType());
List<String> robotNoList = Collections.singletonList(robotInformationDO.getRobotNo());
sendEmergencyStopOrRecoveryToRobot(robotSimulationPose, robotNoList, "删除车辆时恢复车辆");
mapStopMapper.deleteRobotMapStopByRobotNos(robotNoList);
@ -672,8 +719,14 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
List<RobotInformationDO> list = pageResult.getList();
List<RobotInformationPageRespVO> targetList = BeanUtil.copyToList(list, RobotInformationPageRespVO.class);
List<RobotMapStopDO> allRobotMapStops = mapStopService.getAllRobotMapStops(ZeroOneEnum.ONE.getType());
List<String> stopRobotNos = new ArrayList<>();
if (ObjectUtil.isNotEmpty(allRobotMapStops)) {
stopRobotNos = allRobotMapStops.stream().map(RobotMapStopDO::getRobotNo).collect(Collectors.toList());
}
for (RobotInformationPageRespVO v : targetList) {
setMsgAndRobotStatus(v, pageReqVO.getRobotStatisticsType());
setMsgAndRobotStatus(v,stopRobotNos);
}
if (ObjectUtil.isNotEmpty(pageReqVO.getRobotStatisticsType())) {
@ -736,7 +789,12 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
*
* @param v
*/
private void setMsgAndRobotStatus(RobotInformationPageRespVO v, String robotStatisticsType) {
private void setMsgAndRobotStatus(RobotInformationPageRespVO v,List<String> stopRobotNos) {
if (ObjectUtil.isNotEmpty(stopRobotNos) && stopRobotNos.contains(v.getRobotNo())) {
v.setIsStop(ZeroOneEnum.ONE.getType());
}
String pose2dKey = RobotTaskChcheConstant.ROBOT_INFORMATION_POSE_BAT + v.getMacAddress();
Object object = redisUtil.get(pose2dKey);
RobotStatusDataPoseDTO robotStatusDataPoseDTO = JSONUtil.toBean((String) object, RobotStatusDataPoseDTO.class);
@ -1193,10 +1251,10 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
RobotClosePathPlantingDTO closePathPlanting = RobotClosePathPlantingDTO.builder()
.robotNo(robotNo)
.id(actionLog.getTaskDetailId()+"")
.id(actionLog.getTaskDetailId() + "")
.build();
// commonApi.commonMethod(closePathPlanting, PathPlanningTopicConstant.KILL_TASK);
mqttUtils.pub(PathPlanningTopicConstant.KILL_TASK,JSON.toJSONString(closePathPlanting));
mqttUtils.pub(PathPlanningTopicConstant.KILL_TASK, JSON.toJSONString(closePathPlanting));
Object o = checkTaskDetailExist(actionLog.getTaskDetailId());
@ -1314,7 +1372,7 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
public RobotTaskDetailDO checkTaskDone(String id) {
RobotTaskDetailDO robotTaskDetail = taskDetailMapper.selectById(id);
if (RobotTaskStageEnum.DONE.getType().equals(robotTaskDetail.getTaskStage())
|| RobotTaskStageEnum.MANUALLY_COMPLETED.getType().equals(robotTaskDetail.getTaskStage()) ) {
|| RobotTaskStageEnum.MANUALLY_COMPLETED.getType().equals(robotTaskDetail.getTaskStage())) {
throw exception(ROBOT_LAST_TASK_NO_EXISTS);
}
return robotTaskDetail;
@ -1331,6 +1389,7 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
if (RobotTaskStageEnum.UN_START.getType().equals(robotTaskDetail.getTaskStage())
|| RobotTaskStageEnum.GO_TAKE.getType().equals(robotTaskDetail.getTaskStage())
|| RobotTaskStageEnum.TAKEING_EXCEPTION.getType().equals(robotTaskDetail.getTaskStage())
|| RobotTaskStageEnum.TAKEING.getType().equals(robotTaskDetail.getTaskStage())) {
return;
}
@ -1343,10 +1402,11 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
//说明取货完成
takeDone(pathPlanning, robotTaskDetail);
} else if (RobotTaskStageEnum.GO_RELEASE.getType().equals(robotTaskDetail.getTaskStage())
|| RobotTaskStageEnum.RELEASEING.getType().equals(robotTaskDetail.getTaskStage())) {
|| RobotTaskStageEnum.RELEASEING.getType().equals(robotTaskDetail.getTaskStage())
|| RobotTaskStageEnum.RELEASEING_EXCEPTION.getType().equals(robotTaskDetail.getTaskStage())) {
takeDone(pathPlanning, robotTaskDetail);
} else if (RobotTaskStageEnum.CLOSE.getType().equals(robotTaskDetail.getTaskStage())
|| RobotTaskStageEnum.EXCEPTION.getType().equals(robotTaskDetail.getTaskStage()) ) {
|| RobotTaskStageEnum.EXCEPTION.getType().equals(robotTaskDetail.getTaskStage())) {
WareHouseLocationDO wareHouseLocation = wareHouseLocationMapper.selectById(robotTaskDetail.getFromLocationId());
if (ZeroOneEnum.ZERO.getType().equals(wareHouseLocation.getLocationUseStatus())) {
takeDone(pathPlanning, robotTaskDetail);
@ -1473,7 +1533,7 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
}
pathPlanning.setReleaseGroupId("POINT_" + deviceInformationDO.getPositionMapItemId());
pathPlanning.setReleasePointId(deviceInformationDO.getPositionMapItemId()+"");
pathPlanning.setReleasePointId(deviceInformationDO.getPositionMapItemId() + "");
}
/**
@ -1578,13 +1638,14 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
* @param str
*/
@Override
public void sendEmergencyStopOrRecoveryToRobot(RobotSimulationPoseDTO robotSimulationPose, List<String> robotNos, String str) {
for (String robotNo : robotNos) {
String mac = getMacByRobotNo(robotNo);
// commonApi.commonMethod(robotSimulationPose, RobotTopicConstant.ROBOT_COMMAND_TOPIC + mac);
mqttUtils.pub(RobotTopicConstant.ROBOT_COMMAND_TOPIC + mac, JSON.toJSONString(robotSimulationPose));
public void sendEmergencyStopOrRecoveryToRobot(RobotAcceptTaskDTO robotSimulationPose, List<String> robotNos, String str) {
List<RobotInformationDO> robotInformationDOS = informationMapper.selectList(new LambdaQueryWrapperX<RobotInformationDO>()
.in(RobotInformationDO::getRobotNo, robotNos));
for (RobotInformationDO robotInformationDO : robotInformationDOS) {
robotSimulationPose.setOrderId(robotInformationDO.getTaskDetailId()+"");
mqttUtils.pub(RobotTopicConstant.ROBOT_TASK_MOVE_TOPIC + robotInformationDO.getMacAddress(), JSON.toJSONString(robotSimulationPose));
UserOperationLogSaveReqVO operationLog = UserOperationLogSaveReqVO.builder()
.operateAction(str + robotNo)
.operateAction(str + robotInformationDO.getRobotNo())
.nickName(SecurityFrameworkUtils.getLoginUserNickname()).build();
userOperationLogService.createUserOperationLog(operationLog);
}

View File

@ -250,9 +250,24 @@ public class RobotTaskDetailServiceImpl implements RobotTaskDetailService {
@Override
public void setTaskDetailError(Long id) {
RobotTaskDetailDO detailDO = taskDetailMapper.selectById(id);
RobotTaskDetailDO robotTaskDetailDO = new RobotTaskDetailDO();
robotTaskDetailDO.setId(id);
robotTaskDetailDO.setTaskStatus(RobotTaskStatusEnum.Exc.getType());
if (RobotTaskTypeEnum.TAKE_RELEASE.getType().equals(detailDO.getTaskType())) {
if (RobotTaskStageEnum.UN_START.getType().equals(detailDO.getTaskStage())
|| RobotTaskStageEnum.GO_TAKE.getType().equals(detailDO.getTaskStage())
|| RobotTaskStageEnum.TAKEING.getType().equals(detailDO.getTaskStage())) {
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.TAKEING_EXCEPTION.getType());
}else {
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.RELEASEING_EXCEPTION.getType());
}
} else if(RobotTaskTypeEnum.TAKE.getType().equals(detailDO.getTaskType())) {
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.TAKEING_EXCEPTION.getType());
}else if(RobotTaskTypeEnum.RELEASE.getType().equals(detailDO.getTaskType())) {
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.RELEASEING_EXCEPTION.getType());
}else {
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.EXCEPTION.getType());
}
robotTaskDetailDO.setOccurError(ZeroOneEnum.ONE.getType());
taskDetailMapper.updateById(robotTaskDetailDO);
}

View File

@ -8,7 +8,6 @@ import cn.iocoder.yudao.module.system.controller.admin.robot.mapstop.RobotMapSto
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotMapStopDO;
import com.baomidou.mybatisplus.extension.service.IService;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
/**
* 车辆(地图)急停记录 Service 接口
@ -127,4 +126,8 @@ public interface RobotMapStopService extends IService<RobotMapStopDO> {
* @return
*/
List<RobotMapStopDO> getStopRobotNoByRobotNoList(List<String> robotNos);
void rcsStopRobotAddLog(String robotNo);
void rcsDeleteStopRobotAddLog(String robotNo);
}

View File

@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.system.service.robot.mapstop;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotAcceptTaskDTO;
import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotSimulationPoseDTO;
import cn.iocoder.yudao.module.system.api.robot.dto.FloorZoneDTO;
import cn.iocoder.yudao.module.system.constant.robot.RobotTaskChcheConstant;
@ -186,9 +187,9 @@ public class RobotMapStopServiceImpl extends ServiceImpl<RobotMapStopMapper, Rob
throw exception(ROBOT_ALREADY_STOP);
}
RobotSimulationPoseDTO robotSimulationPose = new RobotSimulationPoseDTO();
robotSimulationPose.setCommandType(RobotCommandTypeEnum.EMERGENCY_STOP.getType());
List<String> list = Arrays.asList(robotNo);
RobotAcceptTaskDTO robotSimulationPose = new RobotAcceptTaskDTO();
robotSimulationPose.setExecutionType(RobotCommandTypeEnum.PAUSE.getType());
List<String> list = Collections.singletonList(robotNo);
informationService.sendEmergencyStopOrRecoveryToRobot(robotSimulationPose, list, "远遥暂停车辆");
String mac = informationService.getMacByRobotNo(robotNo);
@ -240,9 +241,9 @@ public class RobotMapStopServiceImpl extends ServiceImpl<RobotMapStopMapper, Rob
}
}
RobotSimulationPoseDTO robotSimulationPose = new RobotSimulationPoseDTO();
robotSimulationPose.setCommandType(RobotCommandTypeEnum.RECOVERY.getType());
List<String> list = Arrays.asList(robotNo);
RobotAcceptTaskDTO robotSimulationPose = new RobotAcceptTaskDTO();
robotSimulationPose.setExecutionType(RobotCommandTypeEnum.CONTINUE.getType());
List<String> list = Collections.singletonList(robotNo);
informationService.sendEmergencyStopOrRecoveryToRobot(robotSimulationPose, list, "远遥恢复车辆");
deleteRobotMapStopByRobotNos(list);
@ -271,5 +272,43 @@ public class RobotMapStopServiceImpl extends ServiceImpl<RobotMapStopMapper, Rob
.in(RobotMapStopDO::getRobotNo, robotNos));
}
@Override
public void rcsStopRobotAddLog(String robotNo) {
String mac = informationService.getMacByRobotNo(robotNo);
List<String> list = Collections.singletonList(robotNo);
String floorAreaKey = RobotTaskChcheConstant.ROBOT_FLOOR_AREA + mac;
Object o = redisUtil.get(floorAreaKey);
Long id = -1l;
if (ObjectUtil.isNotEmpty(o)) {
FloorZoneDTO floorZone = JSON.parseObject((String) o, FloorZoneDTO.class);
PositionMapDO positionMap = positionMapMapper.selectOne(new LambdaQueryWrapperX<PositionMapDO>()
.eq(PositionMapDO::getFloor, floorZone.getFloor())
.eq(PositionMapDO::getArea, floorZone.getArea()));
if (ObjectUtil.isNotEmpty(positionMap)) {
id = positionMap.getId();
}
}
createRobotMapStop(id, list);
}
@Override
public void rcsDeleteStopRobotAddLog(String robotNo) {
List<RobotMapStopDO> stopRobotNoByRobotNo = getStopRobotNoByRobotNo(robotNo);
if (ObjectUtil.isEmpty(stopRobotNoByRobotNo) ){
return;
}
Long mapId = stopRobotNoByRobotNo.get(0).getPositionMapId();
deleteRobotMapStopByRobotNos(Collections.singletonList(robotNo));
List<RobotMapStopDO> positionMapItems = mapStopMapper.selectList(new LambdaQueryWrapperX<RobotMapStopDO>()
.eq(RobotMapStopDO::getStopType, ZeroOneEnum.ONE.getType())
.eq(RobotMapStopDO::getPositionMapId, mapId));
if (ObjectUtil.isNotEmpty(positionMapItems)) {
return;
}
mapStopMapper.deleteRobotMapStopByMapId(mapId);
}
}

View File

@ -212,6 +212,8 @@ zn:
send_robot_init_pose: true # 是否为发送默认的车辆所在地图和点位
synchronous_all_map_node: 500 # 点位信息每次发送的数据量
task_not_check: true # 创建任务不校验
check_shortest_distance: 1.5 # 检测点最短距离
check_longest_distance: 3.0 # 检测点最长距离
#海康威视的相关配置

View File

@ -247,6 +247,8 @@ zn:
send_robot_init_pose: true # 是否为发送默认的车辆所在地图和点位
synchronous_all_map_node: 500 # 点位信息每次发送的数据量
task_not_check: true # 创建任务不校验
check_shortest_distance: 1.5 # 检测点最短距离
check_longest_distance: 3.0 # 检测点最长距离
logging:
file:

View File

@ -240,6 +240,8 @@ zn:
send_robot_init_pose: true # 是否为发送默认的车辆所在地图和点位
synchronous_all_map_node: 500 # 点位信息每次发送的数据量
task_not_check: true # 创建任务不校验
check_shortest_distance: 1.5 # 检测点最短距离
check_longest_distance: 3.0 # 检测点最长距离
#海康威视的相关配置
isc:

View File

@ -0,0 +1,12 @@
<?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.houselocation.WareHouseLocationTypeMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>

View File

@ -346,7 +346,7 @@
t1.deleted = '0'
and t2.deleted = '0'
and t2.occur_error = '1'
and ((t2.task_type = '1' and t2.task_stage in ('2','3','4')) or (t2.task_type = '6') or (t2.task_type = '5' and t2.task_stage = '2'))
and ((t2.task_type = '1' and t2.task_stage in ('1','2','3','4')) or (t2.task_type = '6') or (t2.task_type = '5' and t2.task_stage = '2'))
and t2.task_status = '1'
and t1.task_status = '1'
<if test="pageReqVO.robotNo != null and pageReqVO.robotNo != ''">