From 681d8d7dc23763b107abf006e10a7bbfabe3a128 Mon Sep 17 00:00:00 2001 From: cbs <18617195505@163.com> Date: Mon, 28 Apr 2025 17:55:03 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BD=AC=E6=8D=A2=E7=82=B9=E7=BB=91=E5=AE=9A?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/enums/ErrorCodeConstants.java | 3 +- .../PositionChangePointBindingPageReqVO.java | 2 + .../vo/PositionChangePointBindingRespVO.java | 4 + .../PositionChangePointBindingSaveReqVO.java | 5 ++ .../PositionChangePointBindingDO.java | 7 +- .../dataobject/positionmap/PositionMapDO.java | 2 +- .../mapnode/NodeProcessingContext.java | 4 +- .../strategy/ChangeNodeStrategyImpl.java | 81 +++++++++++++++++++ .../PositionChangePointBindingService.java | 29 +++++++ ...PositionChangePointBindingServiceImpl.java | 58 ++++++++++++- .../RobotPathPlanningServiceImpl.java | 3 +- 11 files changed, 191 insertions(+), 7 deletions(-) create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/handler/mapnode/strategy/ChangeNodeStrategyImpl.java diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index 738a46d76..976b333f7 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -307,5 +307,6 @@ public interface ErrorCodeConstants { // ========== 区域变更点绑定 1_002_057_001 ========== ErrorCode POSITION_CHANGE_POINT_BINDING_NOT_EXISTS = new ErrorCode(1_002_057_001, "区域变更点绑定不存在"); - ErrorCode POSITION_CHANGE_POINT_SAME_MAP = new ErrorCode(1_002_057_001, "区域变更点绑定,不能是同一张地图"); + ErrorCode POSITION_CHANGE_POINT_SAME_MAP = new ErrorCode(1_002_057_002, "区域变更点绑定,不能是同一张地图"); + ErrorCode POSITION_CHANGE_POINT_ALREADY_BINDING = new ErrorCode(1_002_057_003, "请勿重复绑定区域变更点"); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionChangePointBindingPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionChangePointBindingPageReqVO.java index db4bcca7d..1570a0fab 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionChangePointBindingPageReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionChangePointBindingPageReqVO.java @@ -31,4 +31,6 @@ public class PositionChangePointBindingPageReqVO extends PageParam { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] createTime; + @Schema(description = "startingPointId的地图id") + private Long positionMapId; } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionChangePointBindingRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionChangePointBindingRespVO.java index ed9548835..e231fe941 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionChangePointBindingRespVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionChangePointBindingRespVO.java @@ -36,4 +36,8 @@ public class PositionChangePointBindingRespVO { @ExcelProperty("创建时间") private LocalDateTime createTime; + @Schema(description = "startingPointId的地图id") + @ExcelProperty("startingPointId的地图id") + private Long positionMapId; + } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionChangePointBindingSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionChangePointBindingSaveReqVO.java index 8e820a38f..ea7a31c2d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionChangePointBindingSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionChangePointBindingSaveReqVO.java @@ -1,5 +1,7 @@ package cn.iocoder.yudao.module.system.controller.admin.positionmap.vo; +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.util.*; @@ -24,4 +26,7 @@ public class PositionChangePointBindingSaveReqVO { @Schema(description = "点位2自增排序") private Long endPointSortNum; + @Schema(description = "startingPointId的地图id") + private Long positionMapId; + } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/positionmap/PositionChangePointBindingDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/positionmap/PositionChangePointBindingDO.java index f82ea8ae9..6f97338e1 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/positionmap/PositionChangePointBindingDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/positionmap/PositionChangePointBindingDO.java @@ -25,7 +25,7 @@ public class PositionChangePointBindingDO extends BaseDO { /** * 主键ID */ - @TableId + @TableId(type = IdType.ASSIGN_ID) private Long id; /** * 点位1的id @@ -43,5 +43,10 @@ public class PositionChangePointBindingDO extends BaseDO { * 点位2自增排序 */ private Long endPointSortNum; + /** + * 地图id + */ + @TableField(updateStrategy = FieldStrategy.IGNORED) + private Long positionMapId; } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/positionmap/PositionMapDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/positionmap/PositionMapDO.java index 92fffce8e..7099a5160 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/positionmap/PositionMapDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/positionmap/PositionMapDO.java @@ -25,7 +25,7 @@ public class PositionMapDO extends BaseDO { /** * 主键ID */ - @TableId + @TableId(type = IdType.ASSIGN_ID) private Long id; /** * 楼层 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/handler/mapnode/NodeProcessingContext.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/handler/mapnode/NodeProcessingContext.java index ccd0a0f96..478642e10 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/handler/mapnode/NodeProcessingContext.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/handler/mapnode/NodeProcessingContext.java @@ -27,6 +27,8 @@ public class NodeProcessingContext { @Autowired private MapNodeStrategyImpl mapNodeStrategyImpl; @Autowired + private ChangeNodeStrategyImpl changeNodeStrategyImpl; + @Autowired private HouseLocationStrategyImpl houseLocationStrategyImpl; @Autowired private ParkingSpotStrategyImpl parkingSpotStrategyImpl; @@ -47,7 +49,7 @@ public class NodeProcessingContext { // 停车点 strategyMap.put(NodeTypeEnum.PARKING.getType(), parkingSpotStrategyImpl); // 路径点 - strategyMap.put(NodeTypeEnum.CHANGE.getType(), mapNodeStrategyImpl); + strategyMap.put(NodeTypeEnum.CHANGE.getType(), changeNodeStrategyImpl); // 等待点 strategyMap.put(NodeTypeEnum.WAIT.getType(), mapNodeStrategyImpl); // 文字点 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/handler/mapnode/strategy/ChangeNodeStrategyImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/handler/mapnode/strategy/ChangeNodeStrategyImpl.java new file mode 100644 index 000000000..0aa284dc6 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/handler/mapnode/strategy/ChangeNodeStrategyImpl.java @@ -0,0 +1,81 @@ +package cn.iocoder.yudao.module.system.handler.mapnode.strategy; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.module.system.controller.admin.positionmap.dto.NodeBaseDTO; +import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionChangePointBindingDO; +import cn.iocoder.yudao.module.system.service.positionmap.PositionChangePointBindingService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception0; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.HOUSE_LOCATION_HAVE_TASK; + +@Component +public class ChangeNodeStrategyImpl implements NodeProcessingStrategy { + + @Resource + private PositionChangePointBindingService positionChangePointBindingService; + + @Override + public void processNodes(Long positionMapId, List nodeBaseDTOS) { + + List newList = new ArrayList<>(); + // -- 拿到这个地图所绑定的设备 - + List oldList = positionChangePointBindingService.getPositionChangePointBindingByMapId(positionMapId); + + List startPointIds = new ArrayList<>(); + List endPointIds = new ArrayList<>(); + List sortNums = new ArrayList<>(); + + for (NodeBaseDTO item : nodeBaseDTOS) { + if (ObjectUtil.isEmpty(item.getDataJson())) { + continue; + } + PositionChangePointBindingDO positionChangePointBindingDO = new PositionChangePointBindingDO(); + NodeBaseDTO nodeBase = JSONUtil.toBean(item.getDataJson(), NodeBaseDTO.class); + + if (sortNums.contains(nodeBase.getSortNum())) { + throw exception0(HOUSE_LOCATION_HAVE_TASK.getCode(), "以下点位已经被选中: " + nodeBase.getSortNum(), nodeBase.getSortNum()); + } + + positionChangePointBindingDO.setPositionMapId(positionMapId); + positionChangePointBindingDO.setStartingPointId(item.getId()); + positionChangePointBindingDO.setStartingPointSortNum(item.getSortNum()); + positionChangePointBindingDO.setEndPointId(nodeBase.getId()); + positionChangePointBindingDO.setEndPointSortNum(nodeBase.getSortNum()); + newList.add(positionChangePointBindingDO); + startPointIds.add(item.getId()); + endPointIds.add(nodeBase.getId()); + sortNums.add(item.getSortNum()); + sortNums.add(nodeBase.getSortNum()); + } + + //判断这些点是否被绑定过 + if (ObjectUtil.isNotEmpty(endPointIds)) { + List existList = positionChangePointBindingService.getByMapIdAndEndPointIds(positionMapId, endPointIds); + if (ObjectUtil.isNotEmpty(existList)) { + List sortNumList = existList.stream().map(PositionChangePointBindingDO::getEndPointSortNum).collect(Collectors.toList()); + String join = StringUtils.join(sortNumList, ","); + throw exception0(HOUSE_LOCATION_HAVE_TASK.getCode(), "以下区域变更点已经被其他地图绑定:"+join,join); + } + + List existBindingList = positionChangePointBindingService.getByMapIdAndStartPointIds(positionMapId, endPointIds,startPointIds); + if (ObjectUtil.isNotEmpty(existBindingList)) { + List sortNumList = existBindingList.stream().map(PositionChangePointBindingDO::getStartingPointSortNum).collect(Collectors.toList()); + String join = StringUtils.join(sortNumList, ","); + throw exception0(HOUSE_LOCATION_HAVE_TASK.getCode(), "以下区域变更点绑定的点位错乱(出现A绑定B,B绑定C的情况):"+join,join); + } + } + + List> list = CollectionUtils.compareLists(oldList, newList, + (oldVal, newVal) -> ObjectUtil.equal(oldVal.getEndPointId(), newVal.getEndPointId())); + positionChangePointBindingService.batchEditOrDel(list); + } +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionChangePointBindingService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionChangePointBindingService.java index c3daeeeca..40c6e0d5c 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionChangePointBindingService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionChangePointBindingService.java @@ -61,4 +61,33 @@ public interface PositionChangePointBindingService extends IService getAllPositionChangePointBinding(); + + /** + * 根据地图id查询 + * @param positionMapId + * @return + */ + List getPositionChangePointBindingByMapId(Long positionMapId); + + /** + * 批量新增删除修改 + * @param list + */ + void batchEditOrDel(List> list); + + /** + * 不在此地图id的被绑定变更点 + * @param positionMapId + * @param endPointIds + * @return + */ + List getByMapIdAndEndPointIds(Long positionMapId, List endPointIds); + + /** + * 不在此地图id的绑定变更点 + * @param positionMapId + * @param startPointIds + * @return + */ + List getByMapIdAndStartPointIds(Long positionMapId, List endPointIds, List startPointIds); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionChangePointBindingServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionChangePointBindingServiceImpl.java index de2d9f4e1..9ace0837a 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionChangePointBindingServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionChangePointBindingServiceImpl.java @@ -6,6 +6,8 @@ import cn.iocoder.yudao.module.mqtt.api.path.dto.PositionAllChangePointBindingDT import cn.iocoder.yudao.module.system.controller.admin.positionmap.dto.PositionChangePointBindingDTO; import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionChangePointBindingPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionChangePointBindingSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.houselocation.WareHouseLocationDO; +import cn.iocoder.yudao.module.system.dal.dataobject.information.DeviceInformationDO; import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionChangePointBindingDO; import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapDO; import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapItemDO; @@ -25,7 +27,9 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import static cn.hutool.core.collection.CollUtil.isNotEmpty; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; /** @@ -44,6 +48,7 @@ public class PositionChangePointBindingServiceImpl extends ServiceImpl() + .eq(PositionChangePointBindingDO::getStartingPointId, createReqVO.getStartingPointId()).last("limit 1")); + if (ObjectUtil.isNotEmpty(startPosition)) { + throw exception(POSITION_CHANGE_POINT_ALREADY_BINDING); + } + + PositionChangePointBindingDO endPosition = positionChangePointBindingMapper.selectOne(new LambdaQueryWrapperX() + .eq(PositionChangePointBindingDO::getStartingPointId, createReqVO.getEndPointId()).last("limit 1")); + if (ObjectUtil.isNotEmpty(endPosition)) { + throw exception(POSITION_CHANGE_POINT_ALREADY_BINDING); + } + // 返回 return positionChangePointBinding.getId(); } @Override + @Transactional(rollbackFor = Exception.class) public void updatePositionChangePointBinding(PositionChangePointBindingSaveReqVO updateReqVO) { // 校验存在 validatePositionChangePointBindingExists(updateReqVO.getId()); @@ -86,7 +104,7 @@ public class PositionChangePointBindingServiceImpl extends ServiceImpl() - .eq(PositionChangePointBindingDO::getStartingPointId, mapItemId)); + .eq(PositionChangePointBindingDO::getStartingPointId, mapItemId).last("limit 1")); if (ObjectUtil.isNotEmpty(position)) { positionChangePointBinding.setId(position.getId()); positionChangePointBinding.setSortNum(position.getEndPointSortNum()); @@ -95,7 +113,7 @@ public class PositionChangePointBindingServiceImpl extends ServiceImpl() - .eq(PositionChangePointBindingDO::getEndPointId, mapItemId)); + .eq(PositionChangePointBindingDO::getEndPointId, mapItemId).last("limit 1")); if (ObjectUtil.isNotEmpty(startPosition)) { positionChangePointBinding.setId(startPosition.getId()); positionChangePointBinding.setSortNum(startPosition.getStartingPointSortNum()); @@ -115,5 +133,41 @@ public class PositionChangePointBindingServiceImpl extends ServiceImpl getPositionChangePointBindingByMapId(Long positionMapId) { + return positionChangePointBindingMapper.selectList(new LambdaQueryWrapperX() + .eq(PositionChangePointBindingDO::getPositionMapId, positionMapId)); + } + + @Override + public void batchEditOrDel(List> list) { + //批量添加、修改、删除 + //批量添加、修改、删除 + if (isNotEmpty(list.get(0))) { + positionChangePointBindingMapper.insertBatch(list.get(0)); + } + if (isNotEmpty(list.get(1))) { + positionChangePointBindingMapper.updateBatch(list.get(1)); + } + if (isNotEmpty(list.get(2))) { + positionChangePointBindingMapper.deleteByIds(convertList(list.get(2), PositionChangePointBindingDO::getId)); + } + } + + @Override + public List getByMapIdAndEndPointIds(Long positionMapId, List endPointIds) { + return positionChangePointBindingMapper.selectList(new LambdaQueryWrapperX() + .ne(PositionChangePointBindingDO::getPositionMapId, positionMapId) + .in(PositionChangePointBindingDO::getEndPointId,endPointIds)); + } + + @Override + public List getByMapIdAndStartPointIds(Long positionMapId, List endPointIds, List startPointIds) { + return positionChangePointBindingMapper.selectList(new LambdaQueryWrapperX() + .ne(PositionChangePointBindingDO::getPositionMapId, positionMapId) + .in(PositionChangePointBindingDO::getStartingPointId,endPointIds) + .notIn(PositionChangePointBindingDO::getEndPointId,startPointIds)); + } + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/pathplanning/RobotPathPlanningServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/pathplanning/RobotPathPlanningServiceImpl.java index 48e7db8a0..7fd837521 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/pathplanning/RobotPathPlanningServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/pathplanning/RobotPathPlanningServiceImpl.java @@ -701,7 +701,8 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { } else if (RobotTaskTypeEnum.TAKE.getType().equals(v.getTaskType())) { //仅取货 takeSetTask(list, v, fromLane, toLane, fromLocation, toLocation, toHaveFrom, fromHaveTo); - } else if (RobotTaskTypeEnum.PARK.getType().equals(v.getTaskType())) { + } else if (RobotTaskTypeEnum.PARK.getType().equals(v.getTaskType()) + || RobotTaskTypeEnum.MOVE_TO_POINT.getType().equals(v.getTaskType())) { list.add(v); } }