Merge branch 'dev' into cbs

This commit is contained in:
cbs 2025-03-24 15:27:24 +08:00
commit 24dae58da0
19 changed files with 114 additions and 79 deletions

View File

@ -128,3 +128,7 @@ spring:
# 芋道配置项,设置当前项目所有自定义的配置
yudao:
demo: true # 开启演示模式
logging:
file:
name: D:/project/rcs/logs/${spring.application.name}.log

View File

@ -41,4 +41,6 @@ mqtt:
timeout: 10
keepalive: 20
logging:
file:
name: D:/project/rcs/logs/${spring.application.name}.log

View File

@ -170,9 +170,11 @@ public interface ErrorCodeConstants {
// ========== 线库/巷道 1-002-030-000 ==========
ErrorCode HOUSE_LANE_NOT_EXISTS = new ErrorCode(1-002-030-001, "线库不存在");
ErrorCode DUPLICATE_LINE_LIBRARY_NAME = new ErrorCode(1-002-030-002, "线库名称重复");
// ========== 库区 1-002-031-000 ==========
ErrorCode HOUSE_AREA_NOT_EXISTS = new ErrorCode(1-002-031-001, "库区不存在");
ErrorCode DUPLICATE_RESERVOIR_NAME = new ErrorCode(1-002-031-002, "库区名称重复");
// ========== 库位 1-002-032-000 ==========
ErrorCode HOUSE_LOCATION_NOT_EXISTS = new ErrorCode(1-002-032-001, "库位不存在");

View File

@ -1,32 +1,31 @@
package cn.iocoder.yudao.module.system.controller.admin.config;
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.service.config.CommonConfigService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.system.controller.admin.config.vo.CommonConfigPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.config.vo.CommonConfigRespVO;
import cn.iocoder.yudao.module.system.controller.admin.config.vo.CommonConfigSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.config.CommonConfigDO;
import cn.iocoder.yudao.module.system.service.config.CommonConfigService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.List;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 通用配置")
@ -92,4 +91,4 @@ public class CommonConfigController {
BeanUtils.toBean(list, CommonConfigRespVO.class));
}
}
}

View File

@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.system.controller.admin.housearea.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.List;
@Schema(description = "管理后台 - 库区新增/修改 Request VO")
@ -15,10 +16,11 @@ public class HouseAreaSaveReqVO {
@Schema(description = "地图id", example = "芋艿")
private Long positionMapId;
@Schema(description = "地图id", example = "芋艿")
@Schema(description = "物料说明", example = "芋艿")
private String skuInfo;
@Schema(description = "库区名称", example = "李四")
@NotNull(message = "库区名称不能为空")
private String areaName;
@Schema(description = "库区说明")

View File

@ -20,12 +20,12 @@ public class WareHouseLaneRespVO {
@ExcelProperty("地图id")
private Long positionMapId;
@Schema(description = "巷道名称", example = "芋艿")
@ExcelProperty("巷道名称")
@Schema(description = "线库名称", example = "芋艿")
@ExcelProperty("线库名称")
private String laneName;
@Schema(description = "巷道说明(可以拓展为区域说明)")
@ExcelProperty("巷道说明(可以拓展为区域说明)")
@Schema(description = "线库说明(可以拓展为区域说明)")
@ExcelProperty("线库说明(可以拓展为区域说明)")
private String laneMsg;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)

View File

@ -15,7 +15,11 @@ public class WareHouseLaneSaveReqVO {
@Schema(description = "地图id", example = "芋艿")
private Long positionMapId;
@Schema(description = "物料说明", example = "芋艿")
private String skuInfo;
@Schema(description = "线库名称", example = "芋艿")
@NotNull(message = "线库名称不能为空")
private String laneName;
@Schema(description = "线库说明(可以拓展为说明)")

View File

@ -1,10 +1,8 @@
package cn.iocoder.yudao.module.system.controller.admin.houselocation.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
import lombok.Data;
import java.math.BigDecimal;
@Schema(description = "管理后台 - 库位新增/修改 Request VO")
@ -104,4 +102,4 @@ public class WareHouseLocationSaveReqVO {
@Schema(description = "ware_position_map的id", example = "1")
private Long mapId;
}
}

View File

@ -1,12 +1,11 @@
package cn.iocoder.yudao.module.system.controller.admin.robot.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import java.util.Set;
import javax.validation.constraints.NotNull;
import java.util.Set;
@Schema(description = "管理后台 - 车辆信息新增/修改 Request VO")
@Data
@ -51,4 +50,4 @@ public class RobotInformationSaveReqVO {
@Schema(description = "robot_task_detail的id")
private Long taskDetailId;
}
}

View File

@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.system.dal.dataobject.houselane;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.List;
@ -31,14 +32,19 @@ public class WareHouseLaneDO extends BaseDO {
*/
private Long positionMapId;
/**
* 巷道名称
* 线库名称
*/
private String laneName;
/**
* 巷道说明(可以拓展为区域说明)
* 线库说明(可以拓展为区域说明)
*/
private String laneMsg;
/**
* 物料信息
*/
private String skuInfo;
/**
* 节点ids
*/

View File

@ -1,10 +1,8 @@
package cn.iocoder.yudao.module.system.dal.mysql.housearea;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.controller.admin.housearea.vo.HouseAreaPageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.housearea.HouseAreaDO;
import org.apache.ibatis.annotations.Mapper;
@ -19,6 +17,7 @@ public interface HouseAreaMapper extends BaseMapperX<HouseAreaDO> {
default PageResult<HouseAreaDO> selectPage(HouseAreaPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<HouseAreaDO>()
.eqIfPresent(HouseAreaDO::getPositionMapId, reqVO.getPositionMapId())
.likeIfPresent(HouseAreaDO::getAreaName, reqVO.getAreaName())
.eqIfPresent(HouseAreaDO::getAreaMsg, reqVO.getAreaMsg())
.betweenIfPresent(HouseAreaDO::getCreateTime, reqVO.getCreateTime())

View File

@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.system.service.bulletinboard;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.json.JSONUtil;
@ -31,6 +32,7 @@ import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
@ -109,7 +111,10 @@ public class BulletinBoardServiceImpl implements BulletinBoardService {
List<RobotElectricityLevelVO> robotElectricityLevelVOS = new ArrayList<>();
List<RobotInformationDO> allRobot = robotInformationService.getAllRobot();
List<RobotInfoStatusVO> agvListStatusInfo = robotInformationService.getAGVListStatusInfo();
Map<String, RobotInfoStatusVO> map = agvListStatusInfo.stream().collect(Collectors.toMap(RobotInfoStatusVO::getMacAddress, Function.identity()));
Map<String, RobotInfoStatusVO> map = new HashMap<>();
if (CollUtil.isNotEmpty(agvListStatusInfo)){
map = agvListStatusInfo.stream().collect(Collectors.toMap(RobotInfoStatusVO::getMacAddress, Function.identity()));
}
for (RobotInformationDO robotInformationDO : allRobot) {
String pose2dKey = RobotTaskChcheConstant.ROBOT_INFORMATION_POSE_BAT_SOC + robotInformationDO.getMacAddress();
Object object = redisUtil.get(pose2dKey);

View File

@ -1,12 +1,12 @@
package cn.iocoder.yudao.module.system.service.config;
import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.module.system.controller.admin.config.vo.*;
import cn.iocoder.yudao.module.system.controller.admin.config.vo.CommonConfigPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.config.vo.CommonConfigSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.config.CommonConfigDO;
import javax.validation.Valid;
/**
* 通用配置 Service 接口
*
@ -52,4 +52,4 @@ public interface CommonConfigService {
*/
PageResult<CommonConfigDO> getConfigPage(CommonConfigPageReqVO pageReqVO);
}
}

View File

@ -1,14 +1,16 @@
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.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.system.controller.admin.config.vo.*;
import cn.iocoder.yudao.module.system.controller.admin.config.vo.CommonConfigPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.config.vo.CommonConfigSaveReqVO;
import cn.iocoder.yudao.module.system.controller.admin.config.vo.CommonConfigVO;
import cn.iocoder.yudao.module.system.controller.admin.log.vo.UserOperationLogSaveReqVO;
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 cn.iocoder.yudao.module.system.enums.config.CommandConfigTypeEnum;
@ -17,20 +19,11 @@ import cn.iocoder.yudao.module.system.service.tool.ToolsService;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
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;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.CONFIG_NOT_EXISTS;
@ -174,4 +167,4 @@ public class CommonConfigServiceImpl implements CommonConfigService {
return configMapper.selectPage(pageReqVO);
}
}
}

View File

@ -30,8 +30,7 @@ import java.util.List;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.HOUSE_AREA_NOT_EXISTS;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.THERE_ARE_ALREADY_STORAGE_LOCATIONS_IN_OTHER_STORAGE_AREAS;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
/**
* 库区 Service 实现类
@ -95,6 +94,15 @@ public class HouseAreaServiceImpl extends ServiceImpl<HouseAreaMapper, HouseArea
@Override
@Transactional(rollbackFor = Exception.class)
public void createOrEditOrDel(HouseAreaSaveReqVO createReqVO) {
// 判断名称唯一
Long count = houseAreaMapper.selectCount(
new LambdaQueryWrapper<HouseAreaDO>()
.eq(HouseAreaDO::getAreaName, createReqVO.getAreaName())
.ne(ObjectUtil.isNotNull(createReqVO.getId()), HouseAreaDO::getId, createReqVO.getId())
);
if (count > 0) {
throw exception(DUPLICATE_RESERVOIR_NAME);
}
HouseAreaDO houseArea = BeanUtil.copyProperties(createReqVO, HouseAreaDO.class);
houseAreaMapper.insertOrUpdate(houseArea);
// -- 先判定这些点位是否在同一区域内 - 如果不在则提示 哪些点位不在同一区域内
@ -105,12 +113,12 @@ public class HouseAreaServiceImpl extends ServiceImpl<HouseAreaMapper, HouseArea
.setAreaId(createReqVO.getId())
.setType(NodeTypeEnum.WARE.getType()));
//2.查询目前的点位列表 - 如果没有的话 - 就设为空列表先 -
List<PositionMapItemDO> list = CollUtil.isEmpty(createReqVO.getMapItemIds()) ? Collections.emptyList() :
positionMapItemService.getByCondition(new PositionMapConditionDTO()
//2.查询目前的地图所有的库位点位列表 - 如果没有的话 - 就设为空列表先 -
List<PositionMapItemDO> list = positionMapItemService.getByCondition(new PositionMapConditionDTO()
.setPositionMapId(createReqVO.getPositionMapId())
.setType(NodeTypeEnum.WARE.getType())
.setIds(createReqVO.getMapItemIds()));
.setIds(createReqVO.getMapItemIds())
.setAreaId(createReqVO.getId()));
//3.判定当前这些点位是否已经有包含线库了 -
List<PositionMapItemDO> containList = list.stream().filter(a -> a.getAreaId() != null && !a.getAreaId().equals(createReqVO.getId())).collect(Collectors.toList());

View File

@ -7,17 +7,16 @@ import cn.hutool.json.JSONUtil;
import cn.iocoder.yudao.framework.common.enums.NodeTypeEnum;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.controller.admin.houselane.vo.WareHouseLanePageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.houselane.vo.WareHouseLaneSaveReqVO;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.dto.PositionMapConditionDTO;
import cn.iocoder.yudao.module.system.dal.dataobject.housearea.HouseAreaDO;
import cn.iocoder.yudao.module.system.dal.dataobject.houselane.WareHouseLaneDO;
import cn.iocoder.yudao.module.system.dal.dataobject.houselocation.WareHouseLocationDO;
import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapItemDO;
import cn.iocoder.yudao.module.system.dal.mysql.houselane.WareHouseLaneMapper;
import cn.iocoder.yudao.module.system.service.houselocation.HouseLocationService;
import cn.iocoder.yudao.module.system.service.positionmap.PositionMapItemService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -30,8 +29,7 @@ import java.util.List;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.THERE_ARE_ALREADY_STORAGE_LOCATIONS_IN_OTHER_LINE_WAREHOUSES;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.THE_LINE_LIBRARY_POINTS_ARE_NOT_LOCATED_IN_THE_SAME_AREA;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
/**
@ -70,6 +68,15 @@ public class WareHouseLaneServiceImpl extends ServiceImpl<WareHouseLaneMapper, W
@Override
@Transactional(rollbackFor = Exception.class)
public void createOrEditOrDel(WareHouseLaneSaveReqVO createReqVO) {
// 判断名称唯一
Long num = houseLaneMapper.selectCount(
new LambdaQueryWrapper<WareHouseLaneDO>()
.eq(WareHouseLaneDO::getLaneName, createReqVO.getLaneName())
.ne(ObjectUtil.isNotNull(createReqVO.getId()), WareHouseLaneDO::getId, createReqVO.getId())
);
if (num > 0) {
throw exception(DUPLICATE_LINE_LIBRARY_NAME);
}
WareHouseLaneDO houseLane = BeanUtil.copyProperties(createReqVO, WareHouseLaneDO.class);
houseLaneMapper.insertOrUpdate(houseLane);
// -- 先判定这些点位是否在同一区域内 - 如果不在则提示 哪些点位不在同一区域内
@ -81,9 +88,9 @@ public class WareHouseLaneServiceImpl extends ServiceImpl<WareHouseLaneMapper, W
.setType(NodeTypeEnum.WARE.getType()));
//2.查询目前的点位列表 - 如果没有的话 - 就设为空列表先 -
List<PositionMapItemDO> list = CollUtil.isEmpty(createReqVO.getMapItemIds()) ? Collections.emptyList() :
positionMapItemService.getByCondition(new PositionMapConditionDTO()
List<PositionMapItemDO> list = positionMapItemService.getByCondition(new PositionMapConditionDTO()
.setPositionMapId(createReqVO.getPositionMapId())
.setLaneId(createReqVO.getId())
.setType(NodeTypeEnum.WARE.getType())
.setIds(createReqVO.getMapItemIds()));

View File

@ -29,6 +29,7 @@ import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@ -118,9 +119,10 @@ public class PositionMapServiceImpl extends ServiceImpl<PositionMapMapper, Posit
byte[] bytes = yamlFile.getBytes();
// Parse the YAML file
Yaml yaml = new Yaml();
Map<String, Object> data = yaml.load(new String(bytes));
Map<String, Object> data = yaml.load(new String(bytes,StandardCharsets.UTF_8));
Object floor = data.get("floor");
Object area = data.get("area");
// -- 根据楼和区域查询是否有存在地图信息 - 如果有存在则替换 - 并且通知所有该楼该区域的AGV
if (ObjUtil.isEmpty(floor) || ObjUtil.isEmpty(area)) {
throw exception(AGV_UPLOAD_INFORMATION_DOES_NOT_INCLUDE_FLOOR_OR_AREA_INFORMATION);

View File

@ -413,12 +413,13 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
public List<RobotInfoStatusVO> getAGVListStatusInfo() {
List<RobotInfoStatusVO> list = new ArrayList<>();
// -- 先从缓存中 获取AGV状态信息 - 如果没有的话 - 再从数据库中获取 - 并且缓存到redis中
List<RobotInformationDO> robotInformationDO = informationMapper.selectList();
if (robotInformationDO == null) {
List<RobotInformationDO> robotInformationDOS = informationMapper.selectList();
if (CollUtil.isEmpty(robotInformationDOS)) {
return list;
}
for (RobotInformationDO informationDO : robotInformationDO) {
for (RobotInformationDO informationDO : robotInformationDOS) {
RobotInfoStatusVO vo = new RobotInfoStatusVO();
vo.setMacAddress(informationDO.getMacAddress());
//0待命1任务中2锁定3离线4:充电中5:故障
String pose2dKey = RobotTaskChcheConstant.ROBOT_INFORMATION_POSE_BAT_SOC + informationDO.getMacAddress();
Object object = redisUtil.get(pose2dKey);

View File

@ -231,3 +231,7 @@ zn:
robot_config: #机器人取放货默认配置
offset_height: 0.1 #叉起货需要在原来高度基础上偏移的高度
default_tray_height: 1.1 #默认每层高度
logging:
file:
name: D:/project/rcs/logs/${spring.application.name}.log