3D物料信息
This commit is contained in:
parent
26fa0dfb97
commit
bf2fdaa023
@ -29,9 +29,9 @@ import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.REMOTE_ROB
|
|||||||
@Component
|
@Component
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class RemoteControllerProcessor {
|
public class RemoteControllerProcessor {
|
||||||
private final ConcurrentHashMap<String, RemoteControllerSocketDTO> cache = new ConcurrentHashMap<>();
|
public final ConcurrentHashMap<String, RemoteControllerSocketDTO> cache = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
|
public final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
|
||||||
|
|
||||||
@Value("${remote.msg}")
|
@Value("${remote.msg}")
|
||||||
private String defaultMsg;
|
private String defaultMsg;
|
||||||
@ -185,12 +185,12 @@ public class RemoteControllerProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public RemoteControllerProcessor() {
|
/*public RemoteControllerProcessor() {
|
||||||
// 每秒执行一次 - 处理并发送数据 - 避免数据丢失
|
// 每秒执行一次 - 处理并发送数据 - 避免数据丢失
|
||||||
scheduler.scheduleAtFixedRate(this::processAndSend, 150, 150, TimeUnit.MILLISECONDS);
|
scheduler.scheduleAtFixedRate(this::processAndSend, 150, 150, TimeUnit.MILLISECONDS);
|
||||||
}
|
}*/
|
||||||
|
|
||||||
private void processAndSend() {
|
public void processAndSend() {
|
||||||
if (ObjectUtil.isEmpty(cache)) {
|
if (ObjectUtil.isEmpty(cache)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,36 @@
|
|||||||
|
package cn.iocoder.yudao.module.remote.api.robot;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||||
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
@EnableScheduling
|
||||||
|
@Component
|
||||||
|
@Slf4j
|
||||||
|
public class RemoteScheduledTasks {
|
||||||
|
|
||||||
|
private static final ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private RemoteControllerProcessor remoteControllerProcessor;
|
||||||
|
|
||||||
|
// 这个方法将每200毫秒执行一次
|
||||||
|
@Scheduled(fixedDelay = 300, timeUnit = TimeUnit.MILLISECONDS)
|
||||||
|
public void executeTask() {
|
||||||
|
fixedThreadPool.execute(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
remoteControllerProcessor.processAndSend();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -31,4 +31,9 @@ public class RobotInformationVO {
|
|||||||
* 车辆即将走的点位
|
* 车辆即将走的点位
|
||||||
*/
|
*/
|
||||||
private List<String> data;
|
private List<String> data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 车辆身上的物料信息和数量
|
||||||
|
*/
|
||||||
|
private Object skuInfo;
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.system.api.robot.dto.FloorZoneDTO;
|
|||||||
import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDataErrorDTO;
|
import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDataErrorDTO;
|
||||||
import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDataPoseDTO;
|
import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDataPoseDTO;
|
||||||
import cn.iocoder.yudao.module.system.api.robot.vo.RobotReactiveStatusDTO;
|
import cn.iocoder.yudao.module.system.api.robot.vo.RobotReactiveStatusDTO;
|
||||||
|
import cn.iocoder.yudao.module.system.constant.area.FloorAreaConstant;
|
||||||
import cn.iocoder.yudao.module.system.constant.robot.RobotTaskChcheConstant;
|
import cn.iocoder.yudao.module.system.constant.robot.RobotTaskChcheConstant;
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.log.RobotTaskDetailActionLogDO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.log.RobotTaskDetailActionLogDO;
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotWarnCodeMappingDO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotWarnCodeMappingDO;
|
||||||
@ -75,6 +76,12 @@ public class RobotReactiveStatusApiImpl implements RobotReactiveStatusApi {
|
|||||||
floorZone = JSON.parseObject((String) o, FloorZoneDTO.class);
|
floorZone = JSON.parseObject((String) o, FloorZoneDTO.class);
|
||||||
String oldFloorArea = floorZone.getFloor() + "-" + floorZone.getArea();
|
String oldFloorArea = floorZone.getFloor() + "-" + floorZone.getArea();
|
||||||
redisUtil.hdel(oldFloorArea, robotNo);
|
redisUtil.hdel(oldFloorArea, robotNo);
|
||||||
|
|
||||||
|
String newFloorArea = data.getFloorZone().getFloor() + "-" + data.getFloorZone().getArea();
|
||||||
|
String key = FloorAreaConstant.FLOOR_AREA_ROBOT + floorZone.getFloor() + "-" + floorZone.getArea();
|
||||||
|
if (!oldFloorArea.equals(newFloorArea)) {
|
||||||
|
redisUtil.hdel(key, robotNo);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
floorZone.setArea(data.getFloorZone().getArea());
|
floorZone.setArea(data.getFloorZone().getArea());
|
||||||
|
@ -105,7 +105,7 @@ public class RobotStatusApiImpl implements RobotStatusApi {
|
|||||||
|
|
||||||
Map<String, Object> map = new HashMap<>();
|
Map<String, Object> map = new HashMap<>();
|
||||||
String value = FloorAreaConstant.FLOOR_AREA_ROBOT + floorZoneDTO.getFloor() + "-" + floorZoneDTO.getArea();
|
String value = FloorAreaConstant.FLOOR_AREA_ROBOT + floorZoneDTO.getFloor() + "-" + floorZoneDTO.getArea();
|
||||||
map.put(robotNo, robotInformationVO);
|
map.put(robotStatusDataDTO.getMac(), JSON.toJSONString(robotInformationVO));
|
||||||
redisUtil.hmset(value, map, 20);
|
redisUtil.hmset(value, map, 20);
|
||||||
|
|
||||||
// 合并请求 - 这里接受到的数据都丢给 RequestProcessor - 再整合数据通过WebSocket丢给前端
|
// 合并请求 - 这里接受到的数据都丢给 RequestProcessor - 再整合数据通过WebSocket丢给前端
|
||||||
|
@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.mqtt.api.common.CommonApi;
|
|||||||
import cn.iocoder.yudao.module.system.api.path.vo.RobotClosePathPlantingDTO;
|
import cn.iocoder.yudao.module.system.api.path.vo.RobotClosePathPlantingDTO;
|
||||||
import cn.iocoder.yudao.module.system.api.robot.dto.RobotCommandStateDTO;
|
import cn.iocoder.yudao.module.system.api.robot.dto.RobotCommandStateDTO;
|
||||||
import cn.iocoder.yudao.module.system.api.robot.dto.RobotCompleteTaskDTO;
|
import cn.iocoder.yudao.module.system.api.robot.dto.RobotCompleteTaskDTO;
|
||||||
|
import cn.iocoder.yudao.module.system.api.robot.vo.RobotSkuInfoDTO;
|
||||||
import cn.iocoder.yudao.module.system.constant.CommonConstant;
|
import cn.iocoder.yudao.module.system.constant.CommonConstant;
|
||||||
import cn.iocoder.yudao.module.system.constant.path.PathPlanningTopicConstant;
|
import cn.iocoder.yudao.module.system.constant.path.PathPlanningTopicConstant;
|
||||||
import cn.iocoder.yudao.module.system.constant.robot.RobotExecutionStateConstant;
|
import cn.iocoder.yudao.module.system.constant.robot.RobotExecutionStateConstant;
|
||||||
@ -204,6 +205,19 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
|
|||||||
*/
|
*/
|
||||||
private void robotTaskDone(RobotCompleteTaskDTO robotCompleteTaskDTO) {
|
private void robotTaskDone(RobotCompleteTaskDTO robotCompleteTaskDTO) {
|
||||||
setLastLogDone(robotCompleteTaskDTO.getOrderId());
|
setLastLogDone(robotCompleteTaskDTO.getOrderId());
|
||||||
|
|
||||||
|
//释放库位数据
|
||||||
|
if (PathTaskTypeEnum.TAKE.getType().equals(robotCompleteTaskDTO.getOrderType())
|
||||||
|
|| (PathTaskTypeEnum.TAKE_RELEASE.getType().equals(robotCompleteTaskDTO.getOrderType())
|
||||||
|
&& CommandTypeEnum.WORK_PICK_UP_GOODS.getType().equals(robotCompleteTaskDTO.getCommandStatus().getCommandType()))) {
|
||||||
|
releaseFromLocationAndSetRobotSkuInfo(robotCompleteTaskDTO);
|
||||||
|
} else if (PathTaskTypeEnum.RELEASE.getType().equals(robotCompleteTaskDTO.getOrderType())
|
||||||
|
|| PathTaskTypeEnum.TAKE_RELEASE.getType().equals(robotCompleteTaskDTO.getOrderType())) {
|
||||||
|
releaseToLocation(robotCompleteTaskDTO);
|
||||||
|
redisUtil.del(RobotTaskChcheConstant.ROBOT_TASK_SKU_INFO + robotCompleteTaskDTO.getMac());
|
||||||
|
} else {
|
||||||
|
redisUtil.del(RobotTaskChcheConstant.ROBOT_TASK_SKU_INFO + robotCompleteTaskDTO.getMac());
|
||||||
|
}
|
||||||
//todo 后面考虑下充电,车机目前对充电的逻辑未定义
|
//todo 后面考虑下充电,车机目前对充电的逻辑未定义
|
||||||
if (PathTaskTypeEnum.MOVE.getType().equals(robotCompleteTaskDTO.getOrderType())
|
if (PathTaskTypeEnum.MOVE.getType().equals(robotCompleteTaskDTO.getOrderType())
|
||||||
|| PathTaskTypeEnum.MOVE_TO_WAIT_STOP.getType().equals(robotCompleteTaskDTO.getOrderType())
|
|| PathTaskTypeEnum.MOVE_TO_WAIT_STOP.getType().equals(robotCompleteTaskDTO.getOrderType())
|
||||||
@ -237,6 +251,85 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
|
|||||||
chargeLogMapper.updateById(build);
|
chargeLogMapper.updateById(build);
|
||||||
}
|
}
|
||||||
taskDetailActionLogMapper.updateActionStatus(robotCompleteTaskDTO.getOrderId(), ActionStatusEnum.DONE.getType(), LocalDateTime.now());
|
taskDetailActionLogMapper.updateActionStatus(robotCompleteTaskDTO.getOrderId(), ActionStatusEnum.DONE.getType(), LocalDateTime.now());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 释放放货库位
|
||||||
|
*
|
||||||
|
* @param robotCompleteTaskDTO
|
||||||
|
*/
|
||||||
|
private void releaseToLocation(RobotCompleteTaskDTO robotCompleteTaskDTO) {
|
||||||
|
RobotTaskDetailDO robotTaskDetailDO = robotTaskDetailMapper.selectById(robotCompleteTaskDTO.getOrderId());
|
||||||
|
if (ObjectUtil.isEmpty(robotTaskDetailDO) || ObjectUtil.isEmpty(robotTaskDetailDO.getToLocationId())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
WareHouseLocationDO toWareHouseLocation = locationMapper.selectById(robotTaskDetailDO.getToLocationId());
|
||||||
|
if (ObjectUtil.isEmpty(toWareHouseLocation)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//查询最近一起取货任务
|
||||||
|
WareHouseLocationDO fromWareHouseLocation = getFromLocation(robotTaskDetailDO);
|
||||||
|
if (ObjectUtil.isNotEmpty(fromWareHouseLocation)) {
|
||||||
|
toWareHouseLocation.setSkuNumber(fromWareHouseLocation.getSkuNumber());
|
||||||
|
toWareHouseLocation.setSkuInfo(fromWareHouseLocation.getSkuInfo());
|
||||||
|
}
|
||||||
|
toWareHouseLocation.setLocationLock(LocationLockEnum.YES.getType());
|
||||||
|
toWareHouseLocation.setLocationUseStatus(LocationUseStatusEnum.YES.getType());
|
||||||
|
locationMapper.updateById(toWareHouseLocation);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询最近一次取货任务
|
||||||
|
*
|
||||||
|
* @param robotTaskDetailDO
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private WareHouseLocationDO getFromLocation(RobotTaskDetailDO robotTaskDetailDO) {
|
||||||
|
if (RobotTaskTypeEnum.TAKE_RELEASE.getType().equals(robotTaskDetailDO.getTaskType())
|
||||||
|
&& ObjectUtil.isNotEmpty(robotTaskDetailDO.getFromLocationId())) {
|
||||||
|
return locationMapper.selectById(robotTaskDetailDO.getFromLocationId());
|
||||||
|
}
|
||||||
|
List<RobotTaskDetailActionLogDO> actionLogs = taskDetailActionLogMapper.getLastTwoTask(robotTaskDetailDO.getRobotNo());
|
||||||
|
if (ObjectUtil.isEmpty(actionLogs)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
for (RobotTaskDetailActionLogDO actionLog : actionLogs) {
|
||||||
|
if (!robotTaskDetailDO.getId().equals(actionLog.getTaskDetailId())) {
|
||||||
|
RobotTaskDetailDO taskDetail = robotTaskDetailMapper.selectById(actionLog.getTaskDetailId());
|
||||||
|
if (ObjectUtil.isEmpty(taskDetail) || !RobotTaskTypeEnum.TAKE.getType().equals(taskDetail.getTaskType())
|
||||||
|
|| ObjectUtil.isEmpty(taskDetail.getFromLocationId())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
locationMapper.selectById(taskDetail.getFromLocationId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置车辆上的物料信息,释放取货库位
|
||||||
|
*
|
||||||
|
* @param robotCompleteTaskDTO
|
||||||
|
*/
|
||||||
|
private void releaseFromLocationAndSetRobotSkuInfo(RobotCompleteTaskDTO robotCompleteTaskDTO) {
|
||||||
|
RobotTaskDetailDO robotTaskDetailDO = robotTaskDetailMapper.selectById(robotCompleteTaskDTO.getOrderId());
|
||||||
|
if (ObjectUtil.isEmpty(robotTaskDetailDO) || ObjectUtil.isEmpty(robotTaskDetailDO.getFromLocationId())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
WareHouseLocationDO wareHouseLocationDO = locationMapper.selectById(robotTaskDetailDO.getFromLocationId());
|
||||||
|
if (ObjectUtil.isEmpty(wareHouseLocationDO)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
RobotSkuInfoDTO robotSkuInfo = new RobotSkuInfoDTO();
|
||||||
|
robotSkuInfo.setSkuNumber(wareHouseLocationDO.getSkuNumber());
|
||||||
|
robotSkuInfo.setSkuInfo(wareHouseLocationDO.getSkuInfo());
|
||||||
|
redisUtil.set(RobotTaskChcheConstant.ROBOT_TASK_SKU_INFO + robotCompleteTaskDTO.getMac(), JSON.toJSONString(robotSkuInfo));
|
||||||
|
wareHouseLocationDO.setSkuInfo(null);
|
||||||
|
wareHouseLocationDO.setSkuNumber(0L);
|
||||||
|
wareHouseLocationDO.setLocationLock(LocationLockEnum.YES.getType());
|
||||||
|
wareHouseLocationDO.setLocationUseStatus(LocationUseStatusEnum.NO.getType());
|
||||||
|
locationMapper.updateById(wareHouseLocationDO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.system.api.robot.processor;
|
|||||||
|
|
||||||
import cn.hutool.core.map.MapUtil;
|
import cn.hutool.core.map.MapUtil;
|
||||||
import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi;
|
import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi;
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@ -45,7 +46,7 @@ public class RequestProcessor {
|
|||||||
private void sendData(String map, Map<String, String> data) {
|
private void sendData(String map, Map<String, String> data) {
|
||||||
// -- 发送给对应的websocket
|
// -- 发送给对应的websocket
|
||||||
// System.out.println("key:" + map + "发送数据:" + data);
|
// System.out.println("key:" + map + "发送数据:" + data);
|
||||||
// log.info("key:" + map + "发送数据:" + data);
|
log.info("key:" + map + "发送数据:" + data);
|
||||||
webSocketSenderApi.sendObject(map, "map_push", data);
|
webSocketSenderApi.sendObject(map, "map_push", data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,59 +0,0 @@
|
|||||||
/*
|
|
||||||
package cn.iocoder.yudao.module.system.api.robot.processor;
|
|
||||||
|
|
||||||
import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi;
|
|
||||||
import cn.iocoder.yudao.module.system.constant.area.FloorAreaConstant;
|
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapDO;
|
|
||||||
import cn.iocoder.yudao.module.system.service.positionmap.PositionMapService;
|
|
||||||
import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
|
|
||||||
import com.alibaba.fastjson.JSON;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
|
||||||
import java.util.concurrent.Executors;
|
|
||||||
import java.util.concurrent.ScheduledExecutorService;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* 3D推送车辆信息
|
|
||||||
*//*
|
|
||||||
|
|
||||||
@Component
|
|
||||||
@Slf4j
|
|
||||||
public class ThreeDRequestProcessor {
|
|
||||||
|
|
||||||
private final ConcurrentHashMap<String, ConcurrentHashMap<String, String>> cache = new ConcurrentHashMap<>();
|
|
||||||
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
|
|
||||||
|
|
||||||
@Resource
|
|
||||||
private PositionMapService positionMapService;
|
|
||||||
|
|
||||||
@Resource
|
|
||||||
private RedisUtil redisUtil;
|
|
||||||
|
|
||||||
@Resource
|
|
||||||
public WebSocketSenderApi webSocketSenderApi;
|
|
||||||
|
|
||||||
public ThreeDRequestProcessor() {
|
|
||||||
// 每秒执行一次 - 处理并发送数据 - 避免数据丢失
|
|
||||||
scheduler.scheduleAtFixedRate(this::processAndSend, 300, 300, TimeUnit.MILLISECONDS);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void processAndSend() {
|
|
||||||
List<PositionMapDO> allMap = positionMapService.getAllMap();
|
|
||||||
for (PositionMapDO map : allMap) {
|
|
||||||
String key = FloorAreaConstant.FLOOR_AREA_ROBOT + map.getFloor() + "-" + map.getArea();
|
|
||||||
Map<Object, Object> data = redisUtil.hmget(key);
|
|
||||||
System.out.println("3D发送数据 "+ JSON.toJSONString(data));
|
|
||||||
webSocketSenderApi.sendObject(key, "3d_map_robot", data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
*/
|
|
@ -0,0 +1,118 @@
|
|||||||
|
package cn.iocoder.yudao.module.system.api.robot.schedul;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
|
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
|
||||||
|
import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi;
|
||||||
|
import cn.iocoder.yudao.module.system.api.robot.vo.RobotInformationVO;
|
||||||
|
import cn.iocoder.yudao.module.system.constant.area.FloorAreaConstant;
|
||||||
|
import cn.iocoder.yudao.module.system.constant.robot.RobotTaskChcheConstant;
|
||||||
|
import cn.iocoder.yudao.module.system.controller.admin.robot.task.TaskAssignDTO;
|
||||||
|
import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapDO;
|
||||||
|
import cn.iocoder.yudao.module.system.service.positionmap.PositionMapService;
|
||||||
|
import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||||
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
@EnableScheduling
|
||||||
|
@Component
|
||||||
|
@Slf4j
|
||||||
|
public class ScheduledTasks {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private PositionMapService positionMapService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private RedisUtil redisUtil;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
public WebSocketSenderApi webSocketSenderApi;
|
||||||
|
|
||||||
|
private static final ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
|
||||||
|
|
||||||
|
// 这个方法将每200毫秒执行一次
|
||||||
|
@Scheduled(fixedDelay = 300, timeUnit = TimeUnit.MILLISECONDS)
|
||||||
|
public void executeTask() {
|
||||||
|
fixedThreadPool.execute(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
sendData();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendData() {
|
||||||
|
TenantContextHolder.setTenantId(1L);
|
||||||
|
Object o = redisUtil.get(FloorAreaConstant.FLOOR_AREA_ALL);
|
||||||
|
List<PositionMapDO> allMap = null;
|
||||||
|
if (ObjectUtil.isEmpty(o)) {
|
||||||
|
allMap = positionMapService.getAllMap();
|
||||||
|
if (ObjectUtil.isEmpty(allMap)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
redisUtil.set(FloorAreaConstant.FLOOR_AREA_ALL,JSON.toJSONString(allMap),60);
|
||||||
|
}else {
|
||||||
|
allMap = JSON.parseArray(String.valueOf(o), PositionMapDO.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (PositionMapDO positionMap : allMap) {
|
||||||
|
String key = FloorAreaConstant.FLOOR_AREA_ROBOT + positionMap.getFloor() + "-" + positionMap.getArea();
|
||||||
|
Map<Object, Object> data = redisUtil.hmget(key);
|
||||||
|
if (ObjectUtil.isEmpty(data)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<Object, Object> map = new HashMap<>();
|
||||||
|
data.forEach((k,v) ->{
|
||||||
|
Object skuInfo = redisUtil.get(RobotTaskChcheConstant.ROBOT_TASK_SKU_INFO + k);
|
||||||
|
if (ObjectUtil.isNotEmpty(skuInfo)) {
|
||||||
|
RobotInformationVO informationVO = JSON.parseObject(v.toString(), RobotInformationVO.class);
|
||||||
|
informationVO.setSkuInfo(skuInfo);
|
||||||
|
map.put(k,informationVO);
|
||||||
|
}else {
|
||||||
|
map.put(k,v);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// log.info("3D发送数据:{}", JSON.toJSONString(map));
|
||||||
|
webSocketSenderApi.sendObject(key, "3d_map_push", map);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package cn.iocoder.yudao.module.system.api.robot.vo;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class RobotSkuInfoDTO {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 物料信息
|
||||||
|
*/
|
||||||
|
private String skuInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 物料数量
|
||||||
|
*/
|
||||||
|
private Long skuNumber;
|
||||||
|
}
|
@ -6,7 +6,8 @@ public class FloorAreaConstant {
|
|||||||
//仅限给WEBSOCKET推送给前端使用,缓存15秒
|
//仅限给WEBSOCKET推送给前端使用,缓存15秒
|
||||||
public static String FLOOR_AREA_ROBOT = "floor:area:robot";
|
public static String FLOOR_AREA_ROBOT = "floor:area:robot";
|
||||||
|
|
||||||
|
//所有的楼层区域
|
||||||
|
public static String FLOOR_AREA_ALL = "floor:area:all";
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -46,4 +46,7 @@ public class RobotTaskChcheConstant {
|
|||||||
|
|
||||||
//机器人开始空闲的时间 (拼接的是车辆编号robotNo)
|
//机器人开始空闲的时间 (拼接的是车辆编号robotNo)
|
||||||
public static String ROBOT_LAST_FREE_TIME = "robot:last:free:time";
|
public static String ROBOT_LAST_FREE_TIME = "robot:last:free:time";
|
||||||
|
|
||||||
|
//机器人物料数量(拼接的是mac地址)
|
||||||
|
public static String ROBOT_TASK_SKU_INFO = "robot:task:sku:info";
|
||||||
}
|
}
|
||||||
|
@ -54,4 +54,11 @@ public interface RobotTaskDetailActionLogMapper extends BaseMapperX<RobotTaskDet
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
List<RobotTaskDetailActionLogDO> getUnStatisticsDurationLog();
|
List<RobotTaskDetailActionLogDO> getUnStatisticsDurationLog();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询机器人最后两条任务
|
||||||
|
* @param robotNo
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
List<RobotTaskDetailActionLogDO> getLastTwoTask(@Param("robotNo") String robotNo);
|
||||||
}
|
}
|
@ -547,6 +547,7 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper, RobotTask
|
|||||||
String mac = robotInformationService.getMacByRobotNo(taskAssignDTO.getRobotNo());
|
String mac = robotInformationService.getMacByRobotNo(taskAssignDTO.getRobotNo());
|
||||||
String robotDoingActionKey = RobotTaskChcheConstant.ROBOT_QUERY_DOING_ACTION + mac;
|
String robotDoingActionKey = RobotTaskChcheConstant.ROBOT_QUERY_DOING_ACTION + mac;
|
||||||
redisUtil.del(robotDoingActionKey);
|
redisUtil.del(robotDoingActionKey);
|
||||||
|
redisUtil.del(RobotTaskChcheConstant.ROBOT_TASK_SKU_INFO + mac);
|
||||||
|
|
||||||
Map<Long, String> deviceNoMap = new HashMap<>();
|
Map<Long, String> deviceNoMap = new HashMap<>();
|
||||||
Integer robotStatus = RobotStatusEnum.DOING.getType();
|
Integer robotStatus = RobotStatusEnum.DOING.getType();
|
||||||
|
@ -50,4 +50,16 @@
|
|||||||
and already_counted = '0'
|
and already_counted = '0'
|
||||||
and create_time >= DATE_SUB(NOW(), INTERVAL 48 HOUR)
|
and create_time >= DATE_SUB(NOW(), INTERVAL 48 HOUR)
|
||||||
</select>
|
</select>
|
||||||
|
<select id="getLastTwoTask"
|
||||||
|
resultType="cn.iocoder.yudao.module.system.dal.dataobject.log.RobotTaskDetailActionLogDO">
|
||||||
|
select
|
||||||
|
*
|
||||||
|
from
|
||||||
|
robot_task_detail_action_log
|
||||||
|
where
|
||||||
|
command_id = '-1'
|
||||||
|
and deleted = '0'
|
||||||
|
and robot_no = #{robotNo}
|
||||||
|
order by create_time desc
|
||||||
|
</select>
|
||||||
</mapper>
|
</mapper>
|
Loading…
Reference in New Issue
Block a user