Compare commits
4 Commits
5c736b266f
...
5c9ef72ba0
Author | SHA1 | Date | |
---|---|---|---|
![]() |
5c9ef72ba0 | ||
![]() |
bd3aadaffd | ||
![]() |
c850f2e315 | ||
![]() |
25082c5784 |
@ -1,6 +1,7 @@
|
||||
package cn.iocoder.yudao.module.mqtt.api.path;
|
||||
|
||||
import cn.iocoder.yudao.module.mqtt.api.path.dto.RelatedPathNode;
|
||||
import cn.iocoder.yudao.module.mqtt.api.path.dto.PositionMapItemSynDTO;
|
||||
import cn.iocoder.yudao.module.mqtt.api.path.dto.PositionMapLinePathDTO;
|
||||
import cn.iocoder.yudao.module.mqtt.enums.ApiConstants;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
@ -9,7 +10,7 @@ import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import java.util.List;
|
||||
|
||||
@FeignClient(name = ApiConstants.NAME) // TODO 芋艿:fallbackFactory =
|
||||
@Tag(name = "MQTT 服务 - 参数配置")
|
||||
@ -17,6 +18,15 @@ public interface PathPlanningApi {
|
||||
String PREFIX = ApiConstants.PREFIX + "/config";
|
||||
|
||||
@PostMapping(PREFIX + "/synchronousPoint")
|
||||
@Operation(summary = "下发任务给车机")
|
||||
void synchronousPointToPP( @RequestBody RelatedPathNode relatedPathNode, @RequestParam("topic") String topic);
|
||||
@Operation(summary = "同步ware_position_map_line的点位信息")
|
||||
void synchronousPointToPP(@RequestBody PositionMapLinePathDTO relatedPathNode, @RequestParam("topic") String topic);
|
||||
|
||||
@PostMapping(PREFIX + "/synchronousAllItemToPP")
|
||||
@Operation(summary = "同步ware_position_map_item的点位信息")
|
||||
void synchronousAllItemToPP(@RequestBody List<PositionMapItemSynDTO> positionMapItemSynDTOS,
|
||||
@RequestParam("topic") String topic);
|
||||
|
||||
@PostMapping(PREFIX + "/synchronousLineObject")
|
||||
@Operation(summary = "同步Object信息给PP")
|
||||
void synchronousLineObject(@RequestBody Object obj, @RequestParam("topic") String topic);
|
||||
}
|
||||
|
@ -0,0 +1,30 @@
|
||||
package cn.iocoder.yudao.module.mqtt.api.path.dto;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class PositionMapItemPathDTO {
|
||||
|
||||
@Schema(description = "楼层", example = "20863")
|
||||
private Integer floor;
|
||||
|
||||
@Schema(description = "区域", example = "20863")
|
||||
private String area;
|
||||
|
||||
@Schema(description = "功能(0:新增、1:删除、2:更新)", example = "20863")
|
||||
private Integer type = 0;
|
||||
|
||||
@Schema(description = "点位信息", example = "20863")
|
||||
private List<PositionMapItemSynDTO> control_nodes;
|
||||
|
||||
@Schema(description = "id集合", example = "20863")
|
||||
private List<Long> ids;
|
||||
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
package cn.iocoder.yudao.module.mqtt.api.path.dto;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class PositionMapItemSynDTO {
|
||||
|
||||
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "31007")
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "坐标x轴")
|
||||
private String locationX;
|
||||
|
||||
@Schema(description = "坐标y轴")
|
||||
private String locationY;
|
||||
|
||||
@Schema(description = "类型 1.路径点位 2.库位点 3.充电桩 4.停车点 5.区域变更点 6.等待点 --- 后续补充", example = "1")
|
||||
private Integer type;
|
||||
|
||||
}
|
@ -7,7 +7,6 @@ import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@ -62,6 +61,23 @@ public class PositionMapLineDTO {
|
||||
@Schema(description = "膨胀区域右")
|
||||
private BigDecimal expansionZoneRight;
|
||||
|
||||
@Schema(description = "车头朝向( 0:正向 1:反向)", example = "15890")
|
||||
@Schema(description = "车头朝向( 0:正正 1:正反 2:反正 3:反反)", example = "15890")
|
||||
private Integer toward;
|
||||
|
||||
/**
|
||||
* 双向车道 反向行走变更车头朝向
|
||||
* @param toward
|
||||
* @return
|
||||
*/
|
||||
public Integer changeToward(Integer toward) {
|
||||
if (toward == 0) {
|
||||
return 3;
|
||||
} else if (toward == 1) {
|
||||
return 2;
|
||||
} else if (toward == 2) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -10,7 +10,7 @@ import java.util.List;
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class RelatedPathNode {
|
||||
public class PositionMapLinePathDTO {
|
||||
|
||||
@Schema(description = "楼层", example = "20863")
|
||||
private Integer floor;
|
||||
@ -18,8 +18,10 @@ public class RelatedPathNode {
|
||||
@Schema(description = "区域", example = "20863")
|
||||
private String area;
|
||||
|
||||
@Schema(description = "点位状态(0:新增、1:删除、2:更新)", example = "20863")
|
||||
private Integer pointStatus = 0;
|
||||
@Schema(description = "功能(0:新增、1:删除、2:更新)", example = "20863")
|
||||
private Integer type = 0;
|
||||
|
||||
private List<PositionMapLineDTO> control_nodes;
|
||||
|
||||
private List<Long> ids;
|
||||
}
|
@ -1,7 +1,8 @@
|
||||
package cn.iododer.yudao.module.mqtt.api.path;
|
||||
|
||||
import cn.iocoder.yudao.module.mqtt.api.path.PathPlanningApi;
|
||||
import cn.iocoder.yudao.module.mqtt.api.path.dto.RelatedPathNode;
|
||||
import cn.iocoder.yudao.module.mqtt.api.path.dto.PositionMapItemSynDTO;
|
||||
import cn.iocoder.yudao.module.mqtt.api.path.dto.PositionMapLinePathDTO;
|
||||
import cn.iododer.yudao.module.mqtt.util.MqttUtils;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@ -10,6 +11,8 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@RestController // 提供 RESTful API 接口,给 Feign 调用
|
||||
@Validated
|
||||
@Slf4j
|
||||
@ -18,8 +21,13 @@ public class PathPlanningApiImpl implements PathPlanningApi {
|
||||
@Autowired
|
||||
private MqttUtils mqttUtils;
|
||||
|
||||
/**
|
||||
* 同步ware_position_map_line的点位信息
|
||||
* @param relatedPathNode
|
||||
* @param topic
|
||||
*/
|
||||
@Override
|
||||
public void synchronousPointToPP(RelatedPathNode relatedPathNode, String topic) {
|
||||
public void synchronousPointToPP(PositionMapLinePathDTO relatedPathNode, String topic) {
|
||||
try {
|
||||
mqttUtils.pub(topic, JSON.toJSONString(relatedPathNode));
|
||||
log.info("同步给路径规划完成 :{}", topic);
|
||||
@ -27,4 +35,29 @@ public class PathPlanningApiImpl implements PathPlanningApi {
|
||||
log.info("同步点位信息给路径规划异常 :{}",e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 同步ware_position_map_item的点位信息
|
||||
* @param positionMapItemSynDTOS
|
||||
* @param topic
|
||||
*/
|
||||
@Override
|
||||
public void synchronousAllItemToPP(List<PositionMapItemSynDTO> positionMapItemSynDTOS, String topic) {
|
||||
try {
|
||||
mqttUtils.pub(topic, JSON.toJSONString(positionMapItemSynDTOS));
|
||||
log.info("同步ware_position_map_item的点位信息--完成 :{}", topic);
|
||||
} catch (MqttException e) {
|
||||
log.info("同步ware_position_map_item的点位信息--异常 :{}",e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void synchronousLineObject(Object obj, String topic) {
|
||||
try {
|
||||
mqttUtils.pub(topic, JSON.toJSONString(obj));
|
||||
log.info("同步信息给PP--完成 :{}", topic);
|
||||
} catch (MqttException e) {
|
||||
log.info("同步信息给PP--完成--异常 :{}",e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -64,7 +64,6 @@ public class RobotStatusApiImpl implements RobotStatusApi {
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
@Async(NOTIFY_THREAD_POOL_TASK_EXECUTOR)
|
||||
public void robotStatusUpdate(RobotStatusDTO robotStatusDataDTO) {
|
||||
TenantContextHolder.setTenantId(1L);
|
||||
if (ObjectUtil.isEmpty(robotStatusDataDTO) || ObjectUtil.isEmpty(robotStatusDataDTO.getMac())) {
|
||||
@ -119,13 +118,12 @@ public class RobotStatusApiImpl implements RobotStatusApi {
|
||||
String errorLevelKey = RobotTaskChcheConstant.ROBOT_ERROR_LEVEL + robotStatusDataDTO.getMac();
|
||||
Object errorLevel = redisUtil.get(errorLevelKey);
|
||||
|
||||
String errorMsgKey = RobotTaskChcheConstant.ROBOT_ERROR_MSG + robotStatusDataDTO.getMac();
|
||||
Object errorMsg = redisUtil.get(errorMsgKey);
|
||||
|
||||
Integer level = ObjectUtil.isEmpty(errorLevel) ? 0 : Integer.valueOf(errorLevel.toString());
|
||||
|
||||
for (RobotStatusDataErrorDTO robotStatusData : errCode) {
|
||||
if (level.intValue() < Integer.valueOf(robotStatusData.getCode_level()).intValue()) {
|
||||
level = Integer.valueOf(robotStatusData.getCode_level());
|
||||
}
|
||||
|
||||
List<RobotWarnCodeMappingDO> mappingDOS = warnCodeMapping.get(robotStatusData.getError_code());
|
||||
if (ObjectUtil.isEmpty(mappingDOS)) {
|
||||
log.info("当前告警类型查不到对应的告警信息 :{}", robotStatusData.getError_code());
|
||||
@ -139,8 +137,14 @@ public class RobotStatusApiImpl implements RobotStatusApi {
|
||||
.warnSolve(mappingDOS.get(0).getWarnSolve())
|
||||
.build();
|
||||
warnMsgDOS.add(warnMsg);
|
||||
|
||||
if (level.intValue() < Integer.valueOf(robotStatusData.getCode_level()).intValue()) {
|
||||
level = Integer.valueOf(robotStatusData.getCode_level());
|
||||
errorMsg = warnMsg.getWarnMsg();
|
||||
}
|
||||
}
|
||||
redisUtil.set(errorLevelKey, level, robotErrorLevelTime);
|
||||
redisUtil.set(errorMsgKey, errorMsg, robotErrorLevelTime);
|
||||
|
||||
warnMsgMapper.insertBatch(warnMsgDOS);
|
||||
}
|
||||
|
@ -5,25 +5,46 @@ package cn.iocoder.yudao.module.system.constant.path;
|
||||
*/
|
||||
public class PathPlanningTopicConstant {
|
||||
/**
|
||||
* 同步全部地图点位
|
||||
* 同步全部地图点位 ware_position_map_line数据
|
||||
*/
|
||||
public static String SYNCHRONOUS_ALL_MAP_POINT = "SYNCHRONOUS_MAP_POINT";
|
||||
|
||||
/**
|
||||
* 添加地图点位给PP
|
||||
* 同步 ware_position_map_item数据
|
||||
*/
|
||||
public static String SYNCHRONOUS_ALL_ITEM = "SYNCHRONOUS_ALL_ITEM";
|
||||
|
||||
/**
|
||||
* 添加ware_position_map_line地图点位给PP
|
||||
*/
|
||||
public static String ADD_MAP_POINT = "ADD_MAP_POINT";
|
||||
|
||||
/**
|
||||
* 删除地图点位
|
||||
* 删除ware_position_map_line地图点位给PP
|
||||
*/
|
||||
public static String DELETE_MAP_POINT = "DELETE_MAP_POINT";
|
||||
|
||||
/**
|
||||
* 更新地图点位
|
||||
* 更新ware_position_map_line地图点位给PP
|
||||
*/
|
||||
public static String UPDATE_MAP_POINT = "UPDATE_MAP_POINT";
|
||||
|
||||
|
||||
/**
|
||||
* 添加ware_position_map_item地图点位给PP
|
||||
*/
|
||||
public static String ADD_MAP_ITEM = "ADD_MAP_ITEM";
|
||||
|
||||
/**
|
||||
* 删除ware_position_map_item地图点位给PP
|
||||
*/
|
||||
public static String DELETE_MAP_ITEM = "DELETE_MAP_ITEM";
|
||||
|
||||
/**
|
||||
* 更新ware_position_map_item地图点位给PP
|
||||
*/
|
||||
public static String UPDATE_MAP_ITEM = "UPDATE_MAP_ITEM";
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -25,4 +25,7 @@ public class RobotTaskChcheConstant {
|
||||
|
||||
//机器人异常等级 (拼接的是mac地址)
|
||||
public static String ROBOT_ERROR_LEVEL = "robot:information:error:level";
|
||||
|
||||
//机器人异常信息(拼接的是mac地址)
|
||||
public static String ROBOT_ERROR_MSG = "robot:information:error:msg";
|
||||
}
|
||||
|
@ -39,4 +39,15 @@ public class CommonConfigVO {
|
||||
@Schema(description = "遇障告警设置-等待时间")
|
||||
private Integer warnWaitTime;
|
||||
|
||||
@Schema(description = "每天(0:未勾选(1次)、1:勾选)")
|
||||
private Integer everyDay;
|
||||
|
||||
@Schema(description = "未勾选(1次)--开始时间")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private LocalDateTime onceStartTime;
|
||||
|
||||
@Schema(description = "未勾选(1次)--结束时间")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private LocalDateTime onceEndTime;
|
||||
|
||||
}
|
||||
|
@ -1,6 +1,9 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.path;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemRespVO;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemSaveReqVO;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapLineSaveReqVO;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapSaveReqVO;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotInformationSaveReqVO;
|
||||
import cn.iocoder.yudao.module.system.service.path.PathPlanningService;
|
||||
@ -24,12 +27,68 @@ public class PathPlanningController {
|
||||
@Resource
|
||||
private PathPlanningService pathPlanningService;
|
||||
|
||||
@PostMapping("/synchronousPoint")
|
||||
@Operation(summary = "同步全部的点位信息")
|
||||
@PostMapping("/line/all")
|
||||
@Operation(summary = "同步ware_position_map_line的点位信息")
|
||||
@PreAuthorize("@ss.hasPermission('robot:information:synchronousPoint')")
|
||||
public CommonResult<String> synchronousPoint(@RequestBody PositionMapSaveReqVO positionMapSaveReqVO) {
|
||||
pathPlanningService.synchronousPoint(positionMapSaveReqVO);
|
||||
return success("同步完成");
|
||||
}
|
||||
|
||||
@PostMapping("/line/add")
|
||||
@Operation(summary = "添加ware_position_map_line的点位信息")
|
||||
@PreAuthorize("@ss.hasPermission('robot:information:synchronousLineAdd')")
|
||||
public CommonResult<String> synchronousLineAdd(@RequestBody PositionMapLineSaveReqVO data) {
|
||||
pathPlanningService.synchronousLineAdd(data);
|
||||
return success("同步完成");
|
||||
}
|
||||
|
||||
@PostMapping("/line/delete")
|
||||
@Operation(summary = "删除ware_position_map_line的点位信息")
|
||||
@PreAuthorize("@ss.hasPermission('robot:information:synchronousLineDelete')")
|
||||
public CommonResult<String> synchronousLineDelete(@RequestBody PositionMapLineSaveReqVO data) {
|
||||
pathPlanningService.synchronousLineDelete(data);
|
||||
return success("同步完成");
|
||||
}
|
||||
|
||||
@PostMapping("/line/update")
|
||||
@Operation(summary = "更新ware_position_map_line的点位信息")
|
||||
@PreAuthorize("@ss.hasPermission('robot:information:synchronousLineUpdate')")
|
||||
public CommonResult<String> synchronousLineUpdate(@RequestBody PositionMapLineSaveReqVO data) {
|
||||
pathPlanningService.synchronousLineUpdate(data);
|
||||
return success("同步完成");
|
||||
}
|
||||
|
||||
@PostMapping("/all/item")
|
||||
@Operation(summary = "同步ware_position_map_item的点位信息")
|
||||
@PreAuthorize("@ss.hasPermission('robot:information:synchronousItem')")
|
||||
public CommonResult<String> synchronousAllItem(@RequestBody PositionMapSaveReqVO positionMapSaveReqVO) {
|
||||
pathPlanningService.synchronousAllItem(positionMapSaveReqVO);
|
||||
return success("同步完成");
|
||||
}
|
||||
|
||||
@PostMapping("/item/add")
|
||||
@Operation(summary = "添加ware_position_map_item的点位信息")
|
||||
@PreAuthorize("@ss.hasPermission('robot:information:synchronousItemAdd')")
|
||||
public CommonResult<String> synchronousAllItemAdd(@RequestBody PositionMapItemSaveReqVO positionMapItemSaveReqVO) {
|
||||
pathPlanningService.synchronousAllItemAdd(positionMapItemSaveReqVO);
|
||||
return success("同步完成");
|
||||
}
|
||||
|
||||
@PostMapping("/item/delete")
|
||||
@Operation(summary = "删除ware_position_map_item的点位信息")
|
||||
@PreAuthorize("@ss.hasPermission('robot:information:synchronousItemDelete')")
|
||||
public CommonResult<String> synchronousItemDelete(@RequestBody PositionMapItemSaveReqVO positionMapItemSaveReqVO) {
|
||||
pathPlanningService.synchronousItemDelete(positionMapItemSaveReqVO);
|
||||
return success("同步完成");
|
||||
}
|
||||
|
||||
@PostMapping("/item/update")
|
||||
@Operation(summary = "更新ware_position_map_item的点位信息")
|
||||
@PreAuthorize("@ss.hasPermission('robot:information:synchronousItemUpdate')")
|
||||
public CommonResult<String> synchronousItemUpdate(@RequestBody PositionMapItemSaveReqVO positionMapItemSaveReqVO) {
|
||||
pathPlanningService.synchronousItemUpdate(positionMapItemSaveReqVO);
|
||||
return success("同步完成");
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -59,6 +59,6 @@ public class PositionMapLineDTO {
|
||||
@Schema(description = "膨胀区域右")
|
||||
private BigDecimal expansionZoneRight;
|
||||
|
||||
@Schema(description = "车头朝向( 0:正向 1:反向)")
|
||||
@Schema(description = "车头朝向( 0:正正 1:正反 2:反正 3:反反)")
|
||||
private Integer toward;
|
||||
}
|
||||
|
@ -78,7 +78,7 @@ public class PositionMapLinePageReqVO extends PageParam {
|
||||
private LocalDateTime[] createTime;
|
||||
|
||||
|
||||
@Schema(description = "车头朝向( 0:正向 1:反向)", example = "15890")
|
||||
@Schema(description = "车头朝向( 0:正正 1:正反 2:反正 3:反反)", example = "15890")
|
||||
private Integer toward;
|
||||
|
||||
}
|
||||
|
@ -90,8 +90,8 @@ public class PositionMapLineRespVO {
|
||||
@ExcelProperty("创建时间")
|
||||
private LocalDateTime createTime;
|
||||
|
||||
@Schema(description = "车头朝向( 0:正向 1:反向)", example = "15890")
|
||||
@ExcelProperty("车头朝向( 0:正向 1:反向)")
|
||||
@Schema(description = "车头朝向( 0:正正 1:正反 2:反正 3:反反)", example = "15890")
|
||||
@ExcelProperty("车头朝向( 0:正正 1:正反 2:反正 3:反反)")
|
||||
private Integer toward;
|
||||
|
||||
}
|
||||
|
@ -71,7 +71,7 @@ public class PositionMapLineSaveReqVO {
|
||||
private BigDecimal reverseSpeedLimit;
|
||||
|
||||
|
||||
@Schema(description = "车头朝向( 0:正向 1:反向)", example = "15890")
|
||||
@Schema(description = "车头朝向( 0:正正 1:正反 2:反正 3:反反)", example = "15890")
|
||||
private Integer toward;
|
||||
|
||||
}
|
||||
|
@ -52,6 +52,10 @@ public class RobotInformationPageRespVO {
|
||||
@ExcelProperty("异常等级(0,1,2,3,4)")
|
||||
private Integer robotCodeLevel = 0;
|
||||
|
||||
@Schema(description = "异常信息", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
|
||||
@ExcelProperty("异常信息")
|
||||
private String robotCodeMsg;
|
||||
|
||||
@Schema(description = "AGV状态(0:暂停且无任务、1:暂停(有处理中的任务)、2:任务中、3:待命)", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
|
||||
@ExcelProperty("AGV状态(0:暂停且无任务、1:暂停(有处理中的任务)、2:任务中、3:待命)")
|
||||
private Integer robotStatus;
|
||||
|
@ -108,7 +108,7 @@ public class PositionMapLineDO extends BaseDO {
|
||||
private BigDecimal reverseSpeedLimit;
|
||||
|
||||
/**
|
||||
* 车头朝向( 0:正向 1:反向)
|
||||
* 车头朝向(0:正正 1:正反 2:反正 3:反反)
|
||||
*/
|
||||
private Integer toward;
|
||||
}
|
||||
|
@ -3,11 +3,14 @@ package cn.iocoder.yudao.module.system.dal.mysql.positionmap;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import cn.iocoder.yudao.module.mqtt.api.path.dto.PositionMapItemSynDTO;
|
||||
import cn.iocoder.yudao.module.mqtt.api.task.dto.Pose2ds;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemPageReqVO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapItemDO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 仓库点位地图子表 Mapper
|
||||
*
|
||||
@ -32,4 +35,11 @@ public interface PositionMapItemMapper extends BaseMapperX<PositionMapItemDO> {
|
||||
* @return
|
||||
*/
|
||||
Pose2ds selectByLocationId(Long locationId);
|
||||
|
||||
/**
|
||||
* 根据position_map_id 查询
|
||||
* @param positionMapId
|
||||
* @return
|
||||
*/
|
||||
List<PositionMapItemSynDTO> getAllByMapId(Long positionMapId);
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.system.enums.robot;
|
||||
package cn.iocoder.yudao.module.system.enums.common;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
@ -0,0 +1,22 @@
|
||||
package cn.iocoder.yudao.module.system.enums.path;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* ware_position_map_line表的direction
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum PathTypeEnum {
|
||||
ADD(0,"新增"),
|
||||
DELETE(1,"删除"),
|
||||
UPDATE(2,"更新"),
|
||||
INIT(4,"初始化");
|
||||
/**
|
||||
* 类型
|
||||
*/
|
||||
private final Integer type;
|
||||
|
||||
private final String msg;
|
||||
}
|
@ -2,9 +2,11 @@ package cn.iocoder.yudao.module.system.job.robot;
|
||||
|
||||
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.DistributeTasksService;
|
||||
import cn.iocoder.yudao.module.system.service.robot.job.RobotTaskAutoMoveService;
|
||||
import cn.iocoder.yudao.module.system.service.robot.pathplanning.RobotPathPlanningService;
|
||||
import cn.iocoder.yudao.module.system.util.redis.RedissonUtils;
|
||||
import com.xxl.job.core.handler.annotation.XxlJob;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@ -37,8 +39,11 @@ public class RobotJob {
|
||||
@Autowired
|
||||
private AutoChargeService autoChargeService;
|
||||
|
||||
//下发任务给车机
|
||||
@XxlJob("DistributeTasksJob")
|
||||
@Autowired
|
||||
private RobotPathPlanningService robotPathPlanningService;
|
||||
|
||||
//下发任务给车机---废弃---因为这一版没有结合路径规划
|
||||
// @XxlJob("DistributeTasksJob")
|
||||
@TenantJob
|
||||
public void distributeTasksJob() throws InterruptedException {
|
||||
log.info("----下发任务给车机----");
|
||||
@ -57,8 +62,8 @@ public class RobotJob {
|
||||
}
|
||||
}
|
||||
|
||||
//下发自动移库任务
|
||||
@XxlJob("DistributeAutoMoveJob")
|
||||
//下发自动移库任务--- 废弃---产品不要自动移库
|
||||
// @XxlJob("DistributeAutoMoveJob")
|
||||
@TenantJob
|
||||
public void distributeAutoMoveJob() throws InterruptedException {
|
||||
log.info("----下发自动移库任务----");
|
||||
@ -101,6 +106,27 @@ public class RobotJob {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 下发任务给路径规划
|
||||
*/
|
||||
@XxlJob("DistributeTasksToPathPlanningJob")
|
||||
@TenantJob
|
||||
public void DistributeTasksToPathPlanningJob() {
|
||||
|
||||
RLock lock = redissonUtils.getLock(RobotCacheLockEnum.ROBOT_TASK_DISTRIBUTE_LOCK.getKey());
|
||||
if (lock.tryLock()){
|
||||
try {
|
||||
log.info("----下发任务给路径规划----");
|
||||
robotPathPlanningService.sendTaskToPP();
|
||||
} catch (Exception e) {
|
||||
log.error("下发任务给路径规划现异常 :{}",e);
|
||||
} finally {
|
||||
lock.unlock();
|
||||
}
|
||||
}else {
|
||||
log.info("下发任务给路径规划未获取到锁");
|
||||
throw exception(REDISSON_NOT_OBTAIN_LOCK);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,15 +1,23 @@
|
||||
package cn.iocoder.yudao.module.system.service.config;
|
||||
|
||||
import cn.hutool.core.date.DateTime;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.json.JSONObject;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.config.vo.*;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.config.CommonConfigDO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDetailDO;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.config.CommonConfigMapper;
|
||||
import cn.iocoder.yudao.module.system.enums.common.ZeroOneEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
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.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.*;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
@ -35,17 +43,80 @@ public class CommonConfigServiceImpl implements CommonConfigService {
|
||||
public Long createConfig(CommonConfigSaveReqVO createReqVO) {
|
||||
// 插入
|
||||
CommonConfigDO config = BeanUtils.toBean(createReqVO, CommonConfigDO.class);
|
||||
|
||||
if (ZeroOneEnum.ONE.getType().equals(config.getConfigType())) {
|
||||
CommonConfigVO chargeConfig= JSONUtil.toBean(config.getConfigStr(),CommonConfigVO.class);
|
||||
//一次
|
||||
if (ZeroOneEnum.ZERO.getType().equals(chargeConfig.getEveryDay())
|
||||
&& ObjectUtil.isNotEmpty(chargeConfig.getScheduleChargeStartTime())) {
|
||||
setOnceStartTimeConfig(config,chargeConfig);
|
||||
}
|
||||
}
|
||||
|
||||
configMapper.insert(config);
|
||||
// 返回
|
||||
return config.getId();
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置一次的开始时间和结束时间
|
||||
* @param config
|
||||
* @param chargeConfig
|
||||
*/
|
||||
private void setOnceStartTimeConfig(CommonConfigDO config, CommonConfigVO chargeConfig) {
|
||||
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
LocalDateTime nowEnd = LocalDateTime.now();
|
||||
|
||||
if (now.isAfter(chargeConfig.getScheduleChargeEndTime())) {
|
||||
now.plusDays(1);
|
||||
nowEnd.plusDays(1);
|
||||
}
|
||||
|
||||
LocalDateTime s = LocalDateTime.of(now.getYear(), now.getMonth(), now.getDayOfMonth(),
|
||||
chargeConfig.getScheduleChargeStartTime().getHour(),
|
||||
chargeConfig.getScheduleChargeStartTime().getMinute(), 00);
|
||||
|
||||
LocalDateTime e = LocalDateTime.of(nowEnd.getYear(), nowEnd.getMonth(), nowEnd.getDayOfMonth(),
|
||||
chargeConfig.getScheduleChargeEndTime().getHour(),
|
||||
chargeConfig.getScheduleChargeEndTime().getMinute(), 00);
|
||||
|
||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
String onceStartTime = s.format(formatter);
|
||||
String onceEndTime = e.format(formatter);
|
||||
|
||||
JSONObject jsonObject = new JSONObject(config.getConfigStr());
|
||||
jsonObject.put("onceStartTime", onceStartTime);
|
||||
jsonObject.put("onceEndTime", onceEndTime);
|
||||
|
||||
String str = JSON.toJSONString(jsonObject);
|
||||
|
||||
config.setConfigStr(str);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateConfig(CommonConfigSaveReqVO updateReqVO) {
|
||||
// 校验存在
|
||||
validateConfigExists(updateReqVO.getId());
|
||||
// 更新
|
||||
CommonConfigDO updateObj = BeanUtils.toBean(updateReqVO, CommonConfigDO.class);
|
||||
|
||||
if (ZeroOneEnum.ONE.getType().equals(updateReqVO.getConfigType())) {
|
||||
CommonConfigVO chargeConfig= JSONUtil.toBean(updateReqVO.getConfigStr(),CommonConfigVO.class);
|
||||
//一次
|
||||
if (ZeroOneEnum.ZERO.getType().equals(chargeConfig.getEveryDay())
|
||||
&& ObjectUtil.isNotEmpty(chargeConfig.getScheduleChargeStartTime())) {
|
||||
setOnceStartTimeConfig(updateObj,chargeConfig);
|
||||
}else if(ZeroOneEnum.ONE.getType().equals(chargeConfig.getEveryDay()) ) {
|
||||
JSONObject jsonObject = new JSONObject(updateObj.getConfigStr());
|
||||
jsonObject.put("onceStartTime", "");
|
||||
jsonObject.put("onceEndTime", "");
|
||||
String str = JSON.toJSONString(jsonObject);
|
||||
updateObj.setConfigStr(str);
|
||||
}
|
||||
}
|
||||
|
||||
configMapper.updateById(updateObj);
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,24 @@
|
||||
package cn.iocoder.yudao.module.system.service.path;
|
||||
|
||||
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemRespVO;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemSaveReqVO;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapLineSaveReqVO;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapSaveReqVO;
|
||||
|
||||
public interface PathPlanningService {
|
||||
void synchronousPoint(PositionMapSaveReqVO positionMapSaveReqVO);
|
||||
|
||||
void synchronousAllItem(PositionMapSaveReqVO positionMapSaveReqVO);
|
||||
|
||||
void synchronousLineAdd(PositionMapLineSaveReqVO data);
|
||||
|
||||
void synchronousLineDelete(PositionMapLineSaveReqVO data);
|
||||
|
||||
void synchronousLineUpdate(PositionMapLineSaveReqVO data);
|
||||
|
||||
void synchronousAllItemAdd(PositionMapItemSaveReqVO positionMapItemSaveReqVO);
|
||||
|
||||
void synchronousItemDelete(PositionMapItemSaveReqVO positionMapItemSaveReqVO);
|
||||
|
||||
void synchronousItemUpdate(PositionMapItemSaveReqVO positionMapItemSaveReqVO);
|
||||
}
|
||||
|
@ -3,20 +3,28 @@ package cn.iocoder.yudao.module.system.service.path;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import cn.iocoder.yudao.module.mqtt.api.path.PathPlanningApi;
|
||||
import cn.iocoder.yudao.module.mqtt.api.path.dto.PositionMapItemPathDTO;
|
||||
import cn.iocoder.yudao.module.mqtt.api.path.dto.PositionMapItemSynDTO;
|
||||
import cn.iocoder.yudao.module.mqtt.api.path.dto.PositionMapLineDTO;
|
||||
import cn.iocoder.yudao.module.mqtt.api.path.dto.RelatedPathNode;
|
||||
import cn.iocoder.yudao.module.mqtt.api.path.dto.PositionMapLinePathDTO;
|
||||
import cn.iocoder.yudao.module.system.constant.path.PathPlanningTopicConstant;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemSaveReqVO;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapLineSaveReqVO;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapSaveReqVO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapDO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapItemDO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapLineDO;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.positionmap.PositionMapItemMapper;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.positionmap.PositionMapLineMapper;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.positionmap.PositionMapMapper;
|
||||
import cn.iocoder.yudao.module.system.enums.line.DirectionEnum;
|
||||
import cn.iocoder.yudao.module.system.enums.path.PathTypeEnum;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
@ -24,6 +32,7 @@ import java.util.concurrent.Executors;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception0;
|
||||
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.PATH_PLANNING_NOT_EXISTS;
|
||||
|
||||
/**
|
||||
@ -45,8 +54,11 @@ public class PathPlanningServiceImpl implements PathPlanningService {
|
||||
@Resource
|
||||
private PathPlanningApi pathPlanningApi;
|
||||
|
||||
@Resource
|
||||
private PositionMapItemMapper positionMapItemMapper;
|
||||
|
||||
/**
|
||||
* 同步全部的点位信息
|
||||
* 同步ware_position_map_line的点位信息
|
||||
*/
|
||||
@Override
|
||||
public void synchronousPoint(PositionMapSaveReqVO data) {
|
||||
@ -55,20 +67,25 @@ public class PathPlanningServiceImpl implements PathPlanningService {
|
||||
.eq(ObjectUtil.isNotEmpty(data.getFloor()), PositionMapDO::getFloor, data.getFloor())
|
||||
.eq(ObjectUtil.isNotEmpty(data.getArea()), PositionMapDO::getArea, data.getArea()));
|
||||
|
||||
if (ObjectUtil.isEmpty(positionMapDOS) ) {
|
||||
throw exception(PATH_PLANNING_NOT_EXISTS);
|
||||
}
|
||||
|
||||
PositionMapLineDO positionMapLineDO = new PositionMapLineDO();
|
||||
List<PositionMapLineDTO> positionLines = positionMapLineMapper.getAllPositionMapLine(positionMapLineDO);
|
||||
|
||||
// List<PositionMapLineDO> positionLines = positionMapLineMapper.selectList(new LambdaQueryWrapperX<PositionMapLineDO>());
|
||||
if (ObjectUtil.isEmpty(positionMapDOS) || ObjectUtil.isEmpty(positionLines)) {
|
||||
if ( ObjectUtil.isEmpty(positionLines)) {
|
||||
throw exception(PATH_PLANNING_NOT_EXISTS);
|
||||
}
|
||||
|
||||
Map<Long, List<PositionMapLineDTO>> positionMapLineMap = positionLines.stream()
|
||||
.collect(Collectors.groupingBy(PositionMapLineDTO::getPositionMapId));
|
||||
for (PositionMapDO positionMapDO : positionMapDOS) {
|
||||
RelatedPathNode relatedPathNode = new RelatedPathNode();
|
||||
PositionMapLinePathDTO relatedPathNode = new PositionMapLinePathDTO();
|
||||
relatedPathNode.setFloor(positionMapDO.getFloor());
|
||||
relatedPathNode.setArea(positionMapDO.getArea());
|
||||
relatedPathNode.setType(PathTypeEnum.INIT.getType());
|
||||
List<PositionMapLineDTO> positionMapLineDOS = positionMapLineMap.get(positionMapDO.getId());
|
||||
if (ObjectUtil.isEmpty(positionMapLineDOS)) {
|
||||
continue;
|
||||
@ -79,12 +96,288 @@ public class PathPlanningServiceImpl implements PathPlanningService {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 同步ware_position_map_item的点位信息
|
||||
* @param data
|
||||
*/
|
||||
@Override
|
||||
public void synchronousAllItem(PositionMapSaveReqVO data) {
|
||||
List<PositionMapDO> positionMapDOS = positionMapMapper.selectList(new LambdaQueryWrapperX<PositionMapDO>()
|
||||
.eq(ObjectUtil.isNotEmpty(data.getFloor()), PositionMapDO::getFloor, data.getFloor())
|
||||
.eq(ObjectUtil.isNotEmpty(data.getArea()), PositionMapDO::getArea, data.getArea()));
|
||||
if (ObjectUtil.isEmpty(positionMapDOS)) {
|
||||
throw exception(PATH_PLANNING_NOT_EXISTS);
|
||||
}
|
||||
|
||||
for (PositionMapDO positionMapDO : positionMapDOS) {
|
||||
|
||||
List<PositionMapItemSynDTO> positionMapItemSynDTOS = positionMapItemMapper.getAllByMapId(positionMapDO.getId());
|
||||
if (ObjectUtil.isEmpty(positionMapItemSynDTOS)) {
|
||||
continue;
|
||||
}
|
||||
PositionMapItemPathDTO relatedPathNode = new PositionMapItemPathDTO();
|
||||
relatedPathNode.setFloor(positionMapDO.getFloor());
|
||||
relatedPathNode.setArea(positionMapDO.getArea());
|
||||
relatedPathNode.setType(PathTypeEnum.INIT.getType());
|
||||
relatedPathNode.setControl_nodes(positionMapItemSynDTOS);
|
||||
|
||||
pathPlanningApi.synchronousLineObject(relatedPathNode, PathPlanningTopicConstant.SYNCHRONOUS_ALL_ITEM);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加ware_position_map_line的点位信息
|
||||
* @param data
|
||||
*/
|
||||
@Override
|
||||
public void synchronousLineAdd(PositionMapLineSaveReqVO data) {
|
||||
if (ObjectUtil.isEmpty(data.getPositionMapId())) {
|
||||
throw exception0(PATH_PLANNING_NOT_EXISTS.getCode(), "请传positionMapId");
|
||||
}
|
||||
|
||||
PositionMapDO positionMapDO = positionMapMapper.selectOne(new LambdaQueryWrapperX<PositionMapDO>()
|
||||
.eq(ObjectUtil.isNotEmpty(data.getPositionMapId()), PositionMapDO::getId, data.getPositionMapId()));
|
||||
|
||||
if (ObjectUtil.isEmpty(positionMapDO)) {
|
||||
throw exception(PATH_PLANNING_NOT_EXISTS);
|
||||
}
|
||||
|
||||
PositionMapLineDO positionMapLine = new PositionMapLineDO();
|
||||
positionMapLine.setId(data.getId());
|
||||
List<PositionMapLineDTO> positionMapLineDOS = positionMapLineMapper.getAllPositionMapLine(positionMapLine);
|
||||
|
||||
if (ObjectUtil.isEmpty(positionMapLineDOS)) {
|
||||
throw exception(PATH_PLANNING_NOT_EXISTS);
|
||||
}
|
||||
|
||||
List<PositionMapLineDTO> list = new ArrayList<>();
|
||||
for (PositionMapLineDTO positionMapLineDO : positionMapLineDOS) {
|
||||
list.add(positionMapLineDO);
|
||||
if (DirectionEnum.ONE_WAY.getType().equals(positionMapLineDO.getDirection())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
list.add(setPositionMapLineDTOData(positionMapLineDO));
|
||||
}
|
||||
|
||||
PositionMapLinePathDTO relatedPathNode = new PositionMapLinePathDTO();
|
||||
relatedPathNode.setFloor(positionMapDO.getFloor());
|
||||
relatedPathNode.setArea(positionMapDO.getArea());
|
||||
relatedPathNode.setControl_nodes(list);
|
||||
|
||||
pathPlanningApi.synchronousLineObject(relatedPathNode, PathPlanningTopicConstant.ADD_MAP_POINT);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除 ware_position_map_line的点位信息
|
||||
* @param data
|
||||
*/
|
||||
@Override
|
||||
public void synchronousLineDelete(PositionMapLineSaveReqVO data) {
|
||||
if (ObjectUtil.isEmpty(data.getPositionMapId())) {
|
||||
throw exception0(PATH_PLANNING_NOT_EXISTS.getCode(), "请传positionMapId");
|
||||
}
|
||||
|
||||
PositionMapDO positionMapDO = positionMapMapper.selectOne(new LambdaQueryWrapperX<PositionMapDO>()
|
||||
.eq(ObjectUtil.isNotEmpty(data.getPositionMapId()), PositionMapDO::getId, data.getPositionMapId()));
|
||||
|
||||
if (ObjectUtil.isEmpty(positionMapDO)) {
|
||||
throw exception(PATH_PLANNING_NOT_EXISTS);
|
||||
}
|
||||
|
||||
PositionMapLinePathDTO relatedPathNode = new PositionMapLinePathDTO();
|
||||
relatedPathNode.setFloor(positionMapDO.getFloor());
|
||||
relatedPathNode.setArea(positionMapDO.getArea());
|
||||
relatedPathNode.setType(PathTypeEnum.DELETE.getType());
|
||||
|
||||
List<Long> ids = new ArrayList<>();
|
||||
ids.add(data.getId());
|
||||
relatedPathNode.setIds(ids);
|
||||
|
||||
pathPlanningApi.synchronousLineObject(relatedPathNode, PathPlanningTopicConstant.DELETE_MAP_POINT);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新ware_position_map_line
|
||||
* @param data
|
||||
*/
|
||||
@Override
|
||||
public void synchronousLineUpdate(PositionMapLineSaveReqVO data) {
|
||||
if (ObjectUtil.isEmpty(data.getPositionMapId())) {
|
||||
throw exception0(PATH_PLANNING_NOT_EXISTS.getCode(), "请传positionMapId");
|
||||
}
|
||||
|
||||
PositionMapDO positionMapDO = positionMapMapper.selectOne(new LambdaQueryWrapperX<PositionMapDO>()
|
||||
.eq(ObjectUtil.isNotEmpty(data.getPositionMapId()), PositionMapDO::getId, data.getPositionMapId()));
|
||||
|
||||
if (ObjectUtil.isEmpty(positionMapDO)) {
|
||||
throw exception(PATH_PLANNING_NOT_EXISTS);
|
||||
}
|
||||
|
||||
PositionMapLineDO positionMapLine = new PositionMapLineDO();
|
||||
positionMapLine.setId(data.getId());
|
||||
List<PositionMapLineDTO> positionMapLineDOS = positionMapLineMapper.getAllPositionMapLine(positionMapLine);
|
||||
|
||||
if (ObjectUtil.isEmpty(positionMapLineDOS)) {
|
||||
throw exception(PATH_PLANNING_NOT_EXISTS);
|
||||
}
|
||||
|
||||
List<PositionMapLineDTO> list = new ArrayList<>();
|
||||
for (PositionMapLineDTO positionMapLineDO : positionMapLineDOS) {
|
||||
list.add(positionMapLineDO);
|
||||
if (DirectionEnum.ONE_WAY.getType().equals(positionMapLineDO.getDirection())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
list.add(setPositionMapLineDTOData(positionMapLineDO));
|
||||
}
|
||||
|
||||
PositionMapLinePathDTO relatedPathNode = new PositionMapLinePathDTO();
|
||||
relatedPathNode.setFloor(positionMapDO.getFloor());
|
||||
relatedPathNode.setArea(positionMapDO.getArea());
|
||||
relatedPathNode.setType(PathTypeEnum.UPDATE.getType());
|
||||
relatedPathNode.setControl_nodes(list);
|
||||
|
||||
pathPlanningApi.synchronousLineObject(relatedPathNode, PathPlanningTopicConstant.UPDATE_MAP_POINT);
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加ware_position_map_item
|
||||
* @param data
|
||||
*/
|
||||
@Override
|
||||
public void synchronousAllItemAdd(PositionMapItemSaveReqVO data) {
|
||||
if (ObjectUtil.isEmpty(data.getId())) {
|
||||
throw exception0(PATH_PLANNING_NOT_EXISTS.getCode(), "请传ware_position_map_item的id");
|
||||
}
|
||||
|
||||
PositionMapItemDO positionMapItemDO = positionMapItemMapper.selectOne(new LambdaQueryWrapperX<PositionMapItemDO>()
|
||||
.eq(PositionMapItemDO::getId, data.getId()));
|
||||
|
||||
if (ObjectUtil.isEmpty(positionMapItemDO)) {
|
||||
throw exception(PATH_PLANNING_NOT_EXISTS);
|
||||
}
|
||||
|
||||
PositionMapDO positionMapDO = positionMapMapper.selectOne(new LambdaQueryWrapperX<PositionMapDO>()
|
||||
.eq(PositionMapDO::getId, positionMapItemDO.getPositionMapId()));
|
||||
|
||||
if (ObjectUtil.isEmpty(positionMapDO)) {
|
||||
throw exception(PATH_PLANNING_NOT_EXISTS);
|
||||
}
|
||||
|
||||
PositionMapItemSynDTO build = PositionMapItemSynDTO.builder()
|
||||
.type(positionMapItemDO.getType())
|
||||
.locationX(positionMapItemDO.getLocationX())
|
||||
.locationY(positionMapItemDO.getLocationY())
|
||||
.id(positionMapItemDO.getId()).build();
|
||||
|
||||
PositionMapItemPathDTO PositionMapItemPathDTO = new PositionMapItemPathDTO();
|
||||
PositionMapItemPathDTO.setFloor(positionMapDO.getFloor());
|
||||
PositionMapItemPathDTO.setArea(positionMapDO.getArea());
|
||||
PositionMapItemPathDTO.setType(PathTypeEnum.ADD.getType());
|
||||
PositionMapItemPathDTO.setControl_nodes(Arrays.asList(build));
|
||||
|
||||
pathPlanningApi.synchronousLineObject(PositionMapItemPathDTO, PathPlanningTopicConstant.ADD_MAP_ITEM);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除ware_position_map_item
|
||||
* @param data
|
||||
*/
|
||||
@Override
|
||||
public void synchronousItemDelete(PositionMapItemSaveReqVO data) {
|
||||
if (ObjectUtil.isEmpty(data.getId())) {
|
||||
throw exception0(PATH_PLANNING_NOT_EXISTS.getCode(), "请传ware_position_map_item的id");
|
||||
}
|
||||
|
||||
PositionMapItemDO positionMapItemDO = positionMapItemMapper.selectOne(new LambdaQueryWrapperX<PositionMapItemDO>()
|
||||
.eq(PositionMapItemDO::getId, data.getId()));
|
||||
|
||||
if (ObjectUtil.isEmpty(positionMapItemDO)) {
|
||||
throw exception(PATH_PLANNING_NOT_EXISTS);
|
||||
}
|
||||
|
||||
PositionMapDO positionMapDO = positionMapMapper.selectOne(new LambdaQueryWrapperX<PositionMapDO>()
|
||||
.eq(PositionMapDO::getId, positionMapItemDO.getPositionMapId()));
|
||||
|
||||
if (ObjectUtil.isEmpty(positionMapDO)) {
|
||||
throw exception(PATH_PLANNING_NOT_EXISTS);
|
||||
}
|
||||
|
||||
PositionMapItemPathDTO PositionMapItemPathDTO = new PositionMapItemPathDTO();
|
||||
PositionMapItemPathDTO.setFloor(positionMapDO.getFloor());
|
||||
PositionMapItemPathDTO.setArea(positionMapDO.getArea());
|
||||
PositionMapItemPathDTO.setType(PathTypeEnum.DELETE.getType());
|
||||
PositionMapItemPathDTO.setIds(Arrays.asList(data.getId()));
|
||||
|
||||
pathPlanningApi.synchronousLineObject(PositionMapItemPathDTO, PathPlanningTopicConstant.DELETE_MAP_ITEM);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void synchronousItemUpdate(PositionMapItemSaveReqVO data) {
|
||||
if (ObjectUtil.isEmpty(data.getId())) {
|
||||
throw exception0(PATH_PLANNING_NOT_EXISTS.getCode(), "请传ware_position_map_item的id");
|
||||
}
|
||||
|
||||
PositionMapItemDO positionMapItemDO = positionMapItemMapper.selectOne(new LambdaQueryWrapperX<PositionMapItemDO>()
|
||||
.eq(PositionMapItemDO::getId, data.getId()));
|
||||
|
||||
if (ObjectUtil.isEmpty(positionMapItemDO)) {
|
||||
throw exception(PATH_PLANNING_NOT_EXISTS);
|
||||
}
|
||||
|
||||
PositionMapDO positionMapDO = positionMapMapper.selectOne(new LambdaQueryWrapperX<PositionMapDO>()
|
||||
.eq(PositionMapDO::getId, positionMapItemDO.getPositionMapId()));
|
||||
|
||||
if (ObjectUtil.isEmpty(positionMapDO)) {
|
||||
throw exception(PATH_PLANNING_NOT_EXISTS);
|
||||
}
|
||||
|
||||
PositionMapItemSynDTO build = PositionMapItemSynDTO.builder()
|
||||
.type(positionMapItemDO.getType())
|
||||
.locationX(positionMapItemDO.getLocationX())
|
||||
.locationY(positionMapItemDO.getLocationY())
|
||||
.id(positionMapItemDO.getId()).build();
|
||||
|
||||
PositionMapItemPathDTO PositionMapItemPathDTO = new PositionMapItemPathDTO();
|
||||
PositionMapItemPathDTO.setFloor(positionMapDO.getFloor());
|
||||
PositionMapItemPathDTO.setArea(positionMapDO.getArea());
|
||||
PositionMapItemPathDTO.setType(PathTypeEnum.UPDATE.getType());
|
||||
PositionMapItemPathDTO.setControl_nodes(Arrays.asList(build));
|
||||
|
||||
pathPlanningApi.synchronousLineObject(PositionMapItemPathDTO, PathPlanningTopicConstant.UPDATE_MAP_ITEM);
|
||||
}
|
||||
|
||||
public PositionMapLineDTO setPositionMapLineDTOData(PositionMapLineDTO positionMapLineDO) {
|
||||
PositionMapLineDTO build = PositionMapLineDTO.builder()
|
||||
.id(positionMapLineDO.getId())
|
||||
.positionMapId(positionMapLineDO.getPositionMapId())
|
||||
.startingPointId(positionMapLineDO.getEndPointId())
|
||||
.endPointId(positionMapLineDO.getStartingPointId())
|
||||
.direction(1)
|
||||
.forwardSpeedLimit(positionMapLineDO.getReverseSpeedLimit())
|
||||
.reverseSpeedLimit(positionMapLineDO.getForwardSpeedLimit())
|
||||
.beginControlX(positionMapLineDO.getEndControlX())
|
||||
.beginControlY(positionMapLineDO.getEndControlY())
|
||||
.endControlX(positionMapLineDO.getBeginControlX())
|
||||
.endControlY(positionMapLineDO.getBeginControlY())
|
||||
.expansionZoneFront(positionMapLineDO.getExpansionZoneAfter())
|
||||
.expansionZoneAfter(positionMapLineDO.getExpansionZoneFront())
|
||||
.expansionZoneLeft(positionMapLineDO.getExpansionZoneRight())
|
||||
.expansionZoneRight(positionMapLineDO.getExpansionZoneLeft())
|
||||
.toward(positionMapLineDO.changeToward(positionMapLineDO.getToward()))
|
||||
.build();
|
||||
return build;
|
||||
}
|
||||
|
||||
/**
|
||||
* 组装数据发送到PP
|
||||
* @param relatedPathNode
|
||||
* @param positionMapLineDOS
|
||||
*/
|
||||
private void assembleDataToPP(RelatedPathNode relatedPathNode, List<PositionMapLineDTO> positionMapLineDOS) {
|
||||
private void assembleDataToPP(PositionMapLinePathDTO relatedPathNode, List<PositionMapLineDTO> positionMapLineDOS) {
|
||||
executor.execute(() -> {
|
||||
List<PositionMapLineDTO> list = new ArrayList<>();
|
||||
for (PositionMapLineDTO positionMapLineDO : positionMapLineDOS) {
|
||||
@ -93,25 +386,7 @@ public class PathPlanningServiceImpl implements PathPlanningService {
|
||||
continue;
|
||||
}
|
||||
|
||||
PositionMapLineDTO build = PositionMapLineDTO.builder()
|
||||
.id(positionMapLineDO.getId())
|
||||
.positionMapId(positionMapLineDO.getPositionMapId())
|
||||
.startingPointId(positionMapLineDO.getEndPointId())
|
||||
.endPointId(positionMapLineDO.getStartingPointId())
|
||||
.direction(1)
|
||||
.forwardSpeedLimit(positionMapLineDO.getReverseSpeedLimit())
|
||||
.reverseSpeedLimit(positionMapLineDO.getForwardSpeedLimit())
|
||||
.beginControlX(positionMapLineDO.getEndControlX())
|
||||
.beginControlY(positionMapLineDO.getEndControlY())
|
||||
.endControlX(positionMapLineDO.getBeginControlX())
|
||||
.endControlY(positionMapLineDO.getBeginControlY())
|
||||
.expansionZoneFront(positionMapLineDO.getExpansionZoneAfter())
|
||||
.expansionZoneAfter(positionMapLineDO.getExpansionZoneFront())
|
||||
.expansionZoneLeft(positionMapLineDO.getExpansionZoneRight())
|
||||
.expansionZoneRight(positionMapLineDO.getExpansionZoneLeft())
|
||||
.toward(positionMapLineDO.getToward())
|
||||
.build();
|
||||
list.add(build);
|
||||
list.add(setPositionMapLineDTOData(positionMapLineDO));
|
||||
}
|
||||
|
||||
relatedPathNode.setControl_nodes(list);
|
||||
|
@ -227,6 +227,16 @@ public class RobotInformationServiceImpl implements RobotInformationService {
|
||||
v.setRobotEssenceStatus(2);
|
||||
}
|
||||
|
||||
if (ObjectUtil.isNotEmpty(errorLevel)) {
|
||||
v.setRobotCodeLevel(Integer.valueOf(errorLevel.toString()).intValue());
|
||||
}
|
||||
|
||||
String errorMsgKey = RobotTaskChcheConstant.ROBOT_ERROR_MSG + v.getMacAddress();
|
||||
Object errorMsg = redisUtil.get(errorMsgKey);
|
||||
if (ObjectUtil.isNotEmpty(errorMsg)) {
|
||||
v.setRobotCodeMsg(errorMsg.toString());
|
||||
}
|
||||
|
||||
if (RobotStatusEnum.STAND_BY.getType().equals(v.getRobotStatus())) {
|
||||
//待命中
|
||||
v.setRobotTaskStatus(0);
|
||||
|
@ -19,6 +19,7 @@ import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotChargeLogMapper;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotInformationMapper;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotTaskDetailMapper;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotTaskMapper;
|
||||
import cn.iocoder.yudao.module.system.enums.common.ZeroOneEnum;
|
||||
import cn.iocoder.yudao.module.system.enums.config.CommandConfigTypeEnum;
|
||||
import cn.iocoder.yudao.module.system.enums.device.DeviceTypeEnum;
|
||||
import cn.iocoder.yudao.module.system.enums.device.DeviceUseStatusEnum;
|
||||
@ -155,6 +156,8 @@ public class AutoChargeServiceImpl implements AutoChargeService {
|
||||
|
||||
chargeLogMapper.insertBatch(logs);
|
||||
|
||||
//todo 发送给路PP
|
||||
|
||||
//改成异步
|
||||
logs.stream().forEach(v -> {
|
||||
String chargeModelKey = RobotTaskChcheConstant.ROBOT_CHARGE_MODEL +v.getRobotNo();
|
||||
|
@ -17,6 +17,7 @@ import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotInformationMapper;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotTaskAutoMoveMapper;
|
||||
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.common.ZeroOneEnum;
|
||||
import cn.iocoder.yudao.module.system.enums.robot.*;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.google.common.collect.Lists;
|
||||
|
@ -0,0 +1,5 @@
|
||||
package cn.iocoder.yudao.module.system.service.robot.pathplanning;
|
||||
|
||||
public interface RobotPathPlanningService {
|
||||
void sendTaskToPP();
|
||||
}
|
@ -0,0 +1,116 @@
|
||||
package cn.iocoder.yudao.module.system.service.robot.pathplanning;
|
||||
|
||||
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
|
||||
import cn.iocoder.yudao.module.mqtt.api.task.RobotTaskApi;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.config.CommonConfigMapper;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.houselocation.WareHouseLocationMapper;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.positionmap.PositionMapItemMapper;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotInformationMapper;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotTaskDetailMapper;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotTaskMapper;
|
||||
import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
@Service
|
||||
@Validated
|
||||
public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
|
||||
@Autowired
|
||||
private RobotInformationMapper robotInformationMapper;
|
||||
|
||||
@Autowired
|
||||
private RobotTaskMapper robotTaskMapper;
|
||||
|
||||
@Autowired
|
||||
private RobotTaskDetailMapper robotTaskDetailMapper;
|
||||
|
||||
@Resource
|
||||
private RobotTaskApi robotTaskApi;
|
||||
|
||||
@Resource
|
||||
private PositionMapItemMapper positionMapItemMapper;
|
||||
|
||||
@Value("${zn.init_height:0.0}")
|
||||
private double initHeight;
|
||||
|
||||
@Value("${zn.scan_height:0.4}")
|
||||
private double scanHeight;
|
||||
|
||||
@Value("${zn.parm:5000}")
|
||||
private Integer parm;
|
||||
|
||||
@Value("${zn.lift_height:0.1}")
|
||||
private double liftHeight;
|
||||
|
||||
@Value("${zn.move_height:0.1}")
|
||||
private double moveHeight;
|
||||
|
||||
@Value("${zn.full_electricity:100}")
|
||||
private String fullElectricity;
|
||||
|
||||
@Resource
|
||||
private CommonConfigMapper configMapper;
|
||||
|
||||
|
||||
@Resource
|
||||
private WareHouseLocationMapper locationMapper;
|
||||
|
||||
@Resource
|
||||
private RedisUtil redisUtil;
|
||||
|
||||
/**
|
||||
* 下发任务给PP
|
||||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void sendTaskToPP() {
|
||||
TenantContextHolder.setTenantId(1L);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
@ -165,6 +165,18 @@
|
||||
and t2.id = #{locationId}
|
||||
</select>
|
||||
|
||||
<select id="getAllByMapId" resultType="cn.iocoder.yudao.module.mqtt.api.path.dto.PositionMapItemSynDTO">
|
||||
select
|
||||
id,
|
||||
location_x as locationX,
|
||||
location_y as locationY,
|
||||
type
|
||||
from
|
||||
ware_position_map_item
|
||||
where
|
||||
position_map_id = #{positionMapId}
|
||||
</select>
|
||||
|
||||
<!--新增所有列-->
|
||||
<insert id="insertEntity" keyProperty="id" useGeneratedKeys="true">
|
||||
insert into ware_position_map_item(position_map_id, area_id, lane_id, location_x, location_y, type, data_json,
|
||||
|
Loading…
Reference in New Issue
Block a user