修复bug

This commit is contained in:
cbs 2025-04-01 16:08:40 +08:00
parent 35da84a95d
commit 51d283bbbf
8 changed files with 167 additions and 21 deletions

View File

@ -191,7 +191,7 @@ public interface ErrorCodeConstants {
ErrorCode ROBOT_LAST_TASK_DELETE = new ErrorCode(1-002-034-005, "超过限制的时间,无法继续执行前一个任务");
ErrorCode ROBOT_NOT_FOUND_WAIT_ITEM = new ErrorCode(1-002-034-006, "没有空闲的停车点");
ErrorCode ROBOT_NOT_FOUND_FREE_CHARGING_STATION = new ErrorCode(1-002-034-007, "没有空闲的充电桩");
ErrorCode ROBOT_HAVE_DOING_TASK = new ErrorCode(1-002-034-010, "车辆有处理中的任务");
ErrorCode ROBOT_HAVE_DOING_TASK = new ErrorCode(1-002-034-010, "车辆有处理中的任务,不允许修改/删除车辆编号和Mac地址");
// ========== 机器人任务主表 1-002-035-000 ==========
ErrorCode TASK_NOT_EXISTS = new ErrorCode(1-002-035-001, "机器人任务主表不存在");

View File

@ -156,4 +156,11 @@ public class RobotInformationController {
informationService.doTaskContinue(robotNo);
return success(true);
}
@PostMapping("/getRobotByFloorAndArea")
@Operation(summary = "获取楼层区域对应的机器人编号")
@PreAuthorize("@ss.hasPermission('robot:information:getRobotByFloorAndArea')")
public CommonResult<List<String>> getRobotByFloorAndArea(@RequestParam("floor") String floor,@RequestParam("area") String area) {
return success(informationService.getRobotByFloorAndArea(floor,area));
}
}

View File

@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.system.api.robot.vo.RobotInformationVO;
import cn.iocoder.yudao.module.system.controller.admin.houselocation.vo.WareHouseLocationPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.houselocation.vo.WareHouseLocationRespVO;
import cn.iocoder.yudao.module.system.controller.admin.houselocation.vo.WareHouseLocationSaveReqVO;
@ -12,6 +13,7 @@ import cn.iocoder.yudao.module.system.controller.admin.houselocation.vo.WareHous
import cn.iocoder.yudao.module.system.controller.admin.log.vo.UserOperationLogSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.houselocation.WareHouseLocationDO;
import cn.iocoder.yudao.module.system.dal.mysql.houselocation.WareHouseLocationMapper;
import cn.iocoder.yudao.module.system.enums.common.ZeroOneEnum;
import cn.iocoder.yudao.module.system.enums.robot.LocationEnableEnum;
import cn.iocoder.yudao.module.system.enums.robot.LocationUseStatusEnum;
import cn.iocoder.yudao.module.system.service.log.UserOperationLogService;
@ -25,6 +27,8 @@ import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import static cn.hutool.core.collection.CollUtil.isNotEmpty;
@ -62,8 +66,27 @@ public class HouseLocationServiceImpl extends ServiceImpl<WareHouseLocationMappe
public void updateHouseLocation(WareHouseLocationSaveReqVO updateReqVO) {
// 校验存在
validateHouseLocationExists(updateReqVO.getId());
String str = "修改库位信息 ";
WareHouseLocationDO wareHouseLocationDO = houseLocationMapper.selectById(updateReqVO.getId());
// 更新
WareHouseLocationDO updateObj = BeanUtils.toBean(updateReqVO, WareHouseLocationDO.class);
String str = getChangeInfo(wareHouseLocationDO, updateObj);
if (ObjectUtil.isNotEmpty(str)) {
str = "修改库位信息:" + updateReqVO.getLocationNo() + "_" + str;
}
UserOperationLogSaveReqVO operationLog = UserOperationLogSaveReqVO.builder()
.operateAction(str)
.nickName(SecurityFrameworkUtils.getLoginUserNickname()).build();
userOperationLogService.createUserOperationLog(operationLog);
houseLocationMapper.updateById(updateObj);
}
public String getChangeInfo(WareHouseLocationDO wareHouseLocationDO, WareHouseLocationDO updateReqVO) {
String str = "";
if (!wareHouseLocationDO.getLocationEnable().equals(updateReqVO.getLocationEnable())) {
if (LocationEnableEnum.YES.getType().equals(updateReqVO.getLocationEnable())) {
str = str + "设置库位" + LocationEnableEnum.YES.getMsg() + " ";
@ -91,15 +114,16 @@ public class HouseLocationServiceImpl extends ServiceImpl<WareHouseLocationMappe
str = str + "设置库位物料信息为 " + updateReqVO.getSkuInfo();
}
UserOperationLogSaveReqVO operationLog = UserOperationLogSaveReqVO.builder()
.operateAction(str)
.nickName(SecurityFrameworkUtils.getLoginUserNickname()).build();
userOperationLogService.createUserOperationLog(operationLog);
// 更新
WareHouseLocationDO updateObj = BeanUtils.toBean(updateReqVO, WareHouseLocationDO.class);
houseLocationMapper.updateById(updateObj);
if (!wareHouseLocationDO.getLocationUseStatus().equals(updateReqVO.getLocationUseStatus())
&& ZeroOneEnum.ZERO.getType().equals(updateReqVO.getLocationUseStatus())) {
str = str + "设置库位锁定状态为正常" ;
}else if (!wareHouseLocationDO.getLocationUseStatus().equals(updateReqVO.getLocationUseStatus())
&& ZeroOneEnum.ONE.getType().equals(updateReqVO.getLocationUseStatus())) {
str = str + "设置库位锁定状态为锁定" ;
}
return str;
}
@Override
@ -147,7 +171,7 @@ public class HouseLocationServiceImpl extends ServiceImpl<WareHouseLocationMappe
@Override
public void updateLocationLaneNameByLaneId(Long laneId, String laneName) {
houseLocationMapper.updateLocationLaneNameByLaneId(laneId,laneName);
houseLocationMapper.updateLocationLaneNameByLaneId(laneId, laneName);
}
@Override
@ -156,15 +180,39 @@ public class HouseLocationServiceImpl extends ServiceImpl<WareHouseLocationMappe
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateHouseLocationList(List<WareHouseLocationSaveReqVO> list) {
List<WareHouseLocationDO> locationDOList = BeanUtils.toBean(list, WareHouseLocationDO.class);
List<String> locationNos = locationDOList.stream().map(WareHouseLocationDO::getLocationNo).collect(Collectors.toList());
List<WareHouseLocationDO> locations = houseLocationMapper.selectList(new LambdaQueryWrapper<WareHouseLocationDO>()
.in(WareHouseLocationDO::getLocationNo, locationNos));
Map<Long, WareHouseLocationDO> locationMap =
locations.stream().collect(Collectors.toMap(WareHouseLocationDO::getId, Function.identity(), (v1, v2) -> v1));
houseLocationMapper.updateById(locationDOList);
List<String> locationNos = locationDOList.stream().map(WareHouseLocationDO::getLocationNo).collect(Collectors.toList());
String str = StringUtils.join(locationNos, ",");
StringBuilder str = new StringBuilder();
for (WareHouseLocationDO updateLocation : locationDOList) {
WareHouseLocationDO oldLocation = locationMap.get(updateLocation.getId());
if (ObjectUtil.isEmpty(oldLocation)) {
continue;
}
String updateStr = getChangeInfo(oldLocation, updateLocation);
if (ObjectUtil.isNotEmpty(updateStr)) {
str.append("修改库位信息:").append(oldLocation.getLocationNo()).append("_").append(updateStr).append(";");
}
}
if (ObjectUtil.isEmpty(str.toString())) {
return;
}
if (str.length() > 100) {
str = new StringBuilder(str.substring(0, 95));
}
UserOperationLogSaveReqVO operationLog = UserOperationLogSaveReqVO.builder()
.operateAction(str)
.operateAction(str.toString())
.nickName(SecurityFrameworkUtils.getLoginUserNickname()).build();
userOperationLogService.createUserOperationLog(operationLog);
}

View File

@ -17,15 +17,18 @@ import cn.iocoder.yudao.module.system.dal.dataobject.config.CommonConfigDO;
import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO;
import cn.iocoder.yudao.module.system.dal.dataobject.information.DeviceInformationDO;
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.mysql.information.DeviceInformationMapper;
import cn.iocoder.yudao.module.system.dal.mysql.positionmap.PositionMapMapper;
import cn.iocoder.yudao.module.system.enums.device.DeviceAttributeEnum;
import cn.iocoder.yudao.module.system.enums.device.DeviceStatusEnum;
import cn.iocoder.yudao.module.system.enums.device.DeviceTypeEnum;
import cn.iocoder.yudao.module.system.enums.device.PictureConfigEnum;
import cn.iocoder.yudao.module.system.enums.item.PositionMapItemEnum;
import cn.iocoder.yudao.module.system.service.config.CommonConfigService;
import cn.iocoder.yudao.module.system.service.dict.DictDataService;
import cn.iocoder.yudao.module.system.service.log.UserOperationLogService;
import cn.iocoder.yudao.module.system.service.positionmap.PositionMapItemService;
import cn.iocoder.yudao.module.system.service.robot.RobotWarnMsgService;
import cn.iocoder.yudao.module.system.util.modbus3.ModbusUtils;
import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
@ -83,6 +86,9 @@ public class DeviceInformationServiceImpl extends ServiceImpl<DeviceInformationM
@Resource
private CommonConfigService configService;
@Resource
private PositionMapItemService positionMapItemService;
@Override
public Long createInformation(DeviceInformationSaveReqVO createReqVO) {
// -- 先判断库里是否有相通的mac地址数据
@ -138,6 +144,7 @@ public class DeviceInformationServiceImpl extends ServiceImpl<DeviceInformationM
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteInformation(Long id) {
// 校验存在
validateInformationExists(id);
@ -148,6 +155,13 @@ public class DeviceInformationServiceImpl extends ServiceImpl<DeviceInformationM
// 删除
informationMapper.deleteById(id);
if (ObjectUtil.isNotEmpty(deviceInformationDO.getPositionMapItemId())) {
PositionMapItemDO positionMapItem = positionMapItemService.getPositionMapItem(deviceInformationDO.getPositionMapItemId());
positionMapItem.setType(PositionMapItemEnum.PATH.getType());
positionMapItem.setDataJson(null);
positionMapItemService.updateById(positionMapItem);
}
userOperationLogService.createUserOperationLog(operationLog);
}
@ -307,10 +321,12 @@ public class DeviceInformationServiceImpl extends ServiceImpl<DeviceInformationM
// todo 需要设置设备通讯的时间
for (DeviceInformationRespVO deviceInformationDO : beans) {
PositionMapDO positionMapDO = positionMap.get(deviceInformationDO.getPositionMapId());
if (ObjectUtil.isNotEmpty(deviceInformationDO.getPositionMapId())
&& ObjectUtil.isNotEmpty(positionMap.get(deviceInformationDO.getPositionMapId()))) {
deviceInformationDO.setFloor(positionMap.get(deviceInformationDO.getPositionMapId()).getFloor() + "");
deviceInformationDO.setArea(positionMap.get(deviceInformationDO.getPositionMapId()).getArea());
&& ObjectUtil.isNotEmpty(positionMapDO)) {
deviceInformationDO.setFloor(positionMapDO.getFloor() + "");
deviceInformationDO.setArea(positionMapDO.getArea());
deviceInformationDO.setDeviceLocation(positionMapDO.getFloor()+"层-"+positionMapDO.getArea());
}
String deviceKey = DeviceChcheConstant.DEVICE_LAST_TIME + deviceInformationDO.getMacAddress();

View File

@ -158,4 +158,12 @@ public interface RobotInformationService extends IService<RobotInformationDO> {
* @param orderType
*/
void robotCloseTaskDetail(String id, String mac, String orderType);
/**
* 获取楼层区域对应的机器人编号
* @param floor
* @param area
* @return
*/
List<String> getRobotByFloorAndArea(String floor, String area);
}

View File

@ -208,8 +208,14 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
// 校验存在
validateInformationExists(updateReqVO.getId());
RobotInformationDO robotInformationDO = informationMapper.selectById(updateReqVO.getId());
if (robotInformationDO == null) {
throw exception(ROBOT_INFORMATION_NOT_EXISTS);
if (!updateReqVO.getRobotNo().equals(robotInformationDO.getRobotNo())
|| !updateReqVO.getMacAddress().equals(robotInformationDO.getMacAddress())) {
List<RobotTaskDO> list = taskMapper.selectDoingTaskByRobotNo(robotInformationDO.getRobotNo());
if (ObjectUtil.isNotEmpty(list)) {
throw exception(ROBOT_HAVE_DOING_TASK);
}
}
//校验MAC地址
@ -747,14 +753,21 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
|| PathTaskTypeEnum.RELEASE.getType().equals(log.getCommandType())) {
takeReleaseCleanTrafficManagement(robotTaskDetail);
}
//不释放机器人状态怕机器人接新任务
RobotInformationDO robotInformationDO = informationMapper.selectOne(new LambdaQueryWrapper<RobotInformationDO>()
.eq(RobotInformationDO::getRobotNo, robotNo)
.last("limit 1"));
robotInformationDO.setRobotStatus(RobotStatusEnum.STAND_BY.getType());
robotInformationDO.setRobotTaskModel(RobotTaskModelEnum.REJECTION.getType());
informationMapper.updateById(robotInformationDO);
}
public RobotTaskDetailActionLogDO closeTask(String robotNo) {
CleanAgvDTO build = CleanAgvDTO.builder().robotNo(robotNo).build();
commonApi.commonMethod(build, PathPlanningTopicConstant.CLEAN_AGV);
RobotTaskDetailActionLogDO log = taskDetailActionLogService.getLastTaskByRobotNo(robotNo);
if (ObjectUtil.isEmpty(log) || ActionStatusEnum.DONE.getType().equals(log.getActionStatus())) {
if (ObjectUtil.isEmpty(log) || ActionStatusEnum.DONE.getType().equals(log.getActionStatus())
|| ActionStatusEnum.CLOSE.getType().equals(log.getActionStatus())) {
return null;
}
String mac = getMacByRobotNo(robotNo);
@ -768,6 +781,7 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
* @param robotNo
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void doTaskContinue(String robotNo) {
UserOperationLogSaveReqVO operationLog = UserOperationLogSaveReqVO.builder()
.operateAction("继续做任务 " + robotNo)
@ -805,6 +819,17 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
if (ObjectUtil.isNotEmpty(msg)) {
throw exception0(TASK_CHECK_EXCEPTION.getCode(), msg);
}
RobotInformationDO robotInformationDO = informationMapper.selectOne(new LambdaQueryWrapper<RobotInformationDO>()
.eq(RobotInformationDO::getRobotNo, robotNo)
.last("limit 1"));
if (PathTaskTypeEnum.CHARGE.getType().equals(pathPlanning.getOrderType())
|| PathTaskTypeEnum.AUTO_CHARGE.getType().equals(pathPlanning.getOrderType())) {
robotInformationDO.setRobotStatus(RobotStatusEnum.CHARGE.getType());
}else {
robotInformationDO.setRobotStatus(RobotStatusEnum.DOING.getType());
}
informationMapper.updateById(robotInformationDO);
}
/**
@ -1050,5 +1075,36 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
commonApi.commonMethod(robotTask, robotTask.getTopic());
}
/**
* 获取楼层区域对应的机器人编号
* @param floor
* @param area
* @return
*/
@Override
public List<String> getRobotByFloorAndArea(String floor, String area) {
RobotInformationDO query = new RobotInformationDO();
List<RobotInformationDO> robotInformations = informationMapper.queryAllByLimit(query);
List<String> list = new ArrayList<>();
if (ObjectUtil.isEmpty(robotInformations)) {
return list;
}
for (RobotInformationDO robotInformationDO : robotInformations) {
String floorAreaKey = RobotTaskChcheConstant.ROBOT_FLOOR_AREA + robotInformationDO.getMacAddress();
Object floorAreaObject = redisUtil.get(floorAreaKey);
if (ObjectUtil.isEmpty(floorAreaObject)) {
continue;
}
FloorZoneDTO floorZoneDTO = JSONUtil.toBean((String) floorAreaObject, FloorZoneDTO.class);
if (floor.equals(floorZoneDTO.getFloor()) && area.equals(floorZoneDTO.getArea()) ) {
list.add(robotInformationDO.getRobotNo());
}
}
return list;
}
}

View File

@ -181,13 +181,19 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper, RobotTask
String addResult = "";
if (lock.tryLock(60l, TimeUnit.MINUTES)) {
try {
/*try {
addResult = addTask(createReqVO);
} catch (Exception e) {
log.error("下发任务出现异常 :{}", e);
addResult = ObjectUtil.isNotEmpty(e.getMessage()) ? e.getMessage(): "创建任务失败";
} finally {
lock.unlock();
}*/
try {
addResult = addTask(createReqVO);
} finally {
lock.unlock();
}
} else {
throw exception(REDISSON_NOT_OBTAIN_LOCK);

View File

@ -272,6 +272,11 @@ public class AdminUserServiceImpl implements AdminUserService {
// 2.2 删除用户岗位
userPostMapper.deleteByUserId(id);
UserOperationLogSaveReqVO operationLog = UserOperationLogSaveReqVO.builder()
.operateAction("删除用户 " + user.getUsername())
.nickName(SecurityFrameworkUtils.getLoginUserNickname()).build();
userOperationLogService.createUserOperationLog(operationLog);
// 3. 记录操作日志上下文
LogRecordContext.putVariable("user", user);
}