Compare commits

...

4 Commits

Author SHA1 Message Date
aikai
5c9ef72ba0 refactor(system): 优化车头朝向逻辑
- 修改 PathPlanningServiceImpl 中的车头朝向处理
2025-02-17 15:20:00 +08:00
cbs
bd3aadaffd Merge branch 'dev' into cbs 2025-02-17 15:00:12 +08:00
cbs
c850f2e315 配置充电时间 2025-02-17 14:59:25 +08:00
cbs
25082c5784 点位信息同步给路径规划算法 2025-02-15 17:51:40 +08:00
30 changed files with 847 additions and 57 deletions

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}
}
}

View File

@ -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;
}

View File

@ -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);
}
}
}

View File

@ -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);
}

View File

@ -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";
}

View File

@ -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";
}

View File

@ -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;
}

View File

@ -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("同步完成");
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;

View File

@ -108,7 +108,7 @@ public class PositionMapLineDO extends BaseDO {
private BigDecimal reverseSpeedLimit;
/**
* 车头朝向( 0:正向 1:反向)
* 车头朝向(0:正正 1:正反 2:反正 3:反反)
*/
private Integer toward;
}

View File

@ -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);
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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);
}
}
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);

View File

@ -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);

View File

@ -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();

View File

@ -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;

View File

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

View File

@ -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);
}
}

View File

@ -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,