refactor(ware): 重构线库功能

- 修改 NodeProcessingContext 中的策略判断逻辑
-重命名 NodeTypeEnum 中的字段名称
- 更新 PositionMapItemDO 中的字段注释
- 新增 PositionMapItemService 接口及实现类
- 重构 WareHouseLaneController,改为仅处理线库相关操作
- 更新相关 VO 类,移除巷道相关字段- 重构 WareHouseLaneService接口,新增 createOrEditOrDel 方法
- 实现 WareHouseLaneServiceImpl 中的 createOrEditOrDel 方法
This commit is contained in:
aikai 2025-01-17 09:57:58 +08:00
parent 0a7b1b72d0
commit 69c1168dcc
13 changed files with 164 additions and 145 deletions

View File

@ -22,11 +22,11 @@ public enum NodeTypeEnum {
WAIT(6, "等待点");
/**
* 状态值
* 类型
*/
private final Integer status;
private final Integer type;
/**
* 状态名
* 说明
*/
private final String name;

View File

@ -208,4 +208,5 @@ public interface ErrorCodeConstants {
ErrorCode PLEASE_UPLOAD_PNG_AND_YAML_FILES = new ErrorCode(1_002_038_003, "请上传png和yaml两个文件并且文件内容不为空");
ErrorCode AGV_MAP_NOT_FOUND = new ErrorCode(1_002_038_004, "找不到AGV地图信息");
ErrorCode AGV_IMAGE_CONVERSION_TO_BASE64_FAILED = new ErrorCode(1_002_038_005, "AGV图片转base64失败");
ErrorCode THE_LINE_LIBRARY_POINTS_ARE_NOT_LOCATED_IN_THE_SAME_AREA = new ErrorCode(1_002_038_006, "线库点位不在同一区域内");
}

View File

@ -1,37 +1,34 @@
package cn.iocoder.yudao.module.system.controller.admin.houselane;
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.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.system.controller.admin.houselane.vo.WareHouseLanePageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.houselane.vo.WareHouseLaneRespVO;
import cn.iocoder.yudao.module.system.controller.admin.houselane.vo.WareHouseLaneSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.houselane.WareHouseLaneDO;
import cn.iocoder.yudao.module.system.service.houselane.WareHouseLaneService;
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 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 javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.List;
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.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
@Tag(name = "管理后台 - 线库/巷道")
@Tag(name = "管理后台 - 线库")
@RestController
@RequestMapping("/system/ware/house-lane")
@Validated
@ -40,32 +37,16 @@ public class WareHouseLaneController {
@Resource
private WareHouseLaneService houseLaneService;
@PostMapping("/create")
@Operation(summary = "创建线库/巷道")
@PostMapping("/createOrEditOrDel")
@Operation(summary = "创建修改删除线库")
@PreAuthorize("@ss.hasPermission('ware:house-lane:create')")
public CommonResult<Long> createHouseLane(@Valid @RequestBody WareHouseLaneSaveReqVO createReqVO) {
return success(houseLaneService.createHouseLane(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新线库/巷道")
@PreAuthorize("@ss.hasPermission('ware:house-lane:update')")
public CommonResult<Boolean> updateHouseLane(@Valid @RequestBody WareHouseLaneSaveReqVO updateReqVO) {
houseLaneService.updateHouseLane(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除线库/巷道")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('ware:house-lane:delete')")
public CommonResult<Boolean> deleteHouseLane(@RequestParam("id") Long id) {
houseLaneService.deleteHouseLane(id);
public CommonResult<Boolean> createOrEditOrDel(@Valid @RequestBody WareHouseLaneSaveReqVO createReqVO) {
houseLaneService.createOrEditOrDel(createReqVO);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得线库/巷道")
@Operation(summary = "获得线库")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('ware:house-lane:query')")
public CommonResult<WareHouseLaneRespVO> getHouseLane(@RequestParam("id") Long id) {
@ -74,7 +55,7 @@ public class WareHouseLaneController {
}
@GetMapping("/page")
@Operation(summary = "获得线库/巷道分页")
@Operation(summary = "获得线库分页")
@PreAuthorize("@ss.hasPermission('ware:house-lane:query')")
public CommonResult<PageResult<WareHouseLaneRespVO>> getHouseLanePage(@Valid WareHouseLanePageReqVO pageReqVO) {
PageResult<WareHouseLaneDO> pageResult = houseLaneService.getHouseLanePage(pageReqVO);
@ -82,16 +63,16 @@ public class WareHouseLaneController {
}
@GetMapping("/export-excel")
@Operation(summary = "导出线库/巷道 Excel")
@Operation(summary = "导出线库 Excel")
@PreAuthorize("@ss.hasPermission('ware:house-lane:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportHouseLaneExcel(@Valid WareHouseLanePageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<WareHouseLaneDO> list = houseLaneService.getHouseLanePage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "线库/巷道.xls", "数据", WareHouseLaneRespVO.class,
BeanUtils.toBean(list, WareHouseLaneRespVO.class));
ExcelUtils.write(response, "线库.xls", "数据", WareHouseLaneRespVO.class,
BeanUtils.toBean(list, WareHouseLaneRespVO.class));
}
}
}

View File

@ -15,9 +15,6 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
@ToString(callSuper = true)
public class WareHouseLanePageReqVO extends PageParam {
@Schema(description = "巷道id(自定义)", example = "276")
private Long laneId;
@Schema(description = "巷道名称", example = "芋艿")
private String laneName;
@ -28,4 +25,4 @@ public class WareHouseLanePageReqVO extends PageParam {
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}
}

View File

@ -16,10 +16,6 @@ public class WareHouseLaneRespVO {
@ExcelProperty("主键ID")
private Long id;
@Schema(description = "巷道id(自定义)", requiredMode = Schema.RequiredMode.REQUIRED, example = "276")
@ExcelProperty("巷道id(自定义)")
private Long laneId;
@Schema(description = "巷道名称", example = "芋艿")
@ExcelProperty("巷道名称")
private String laneName;
@ -32,4 +28,4 @@ public class WareHouseLaneRespVO {
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}
}

View File

@ -5,21 +5,22 @@ import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - 线库/巷道新增/修改 Request VO")
@Schema(description = "管理后台 - 线库新增/修改 Request VO")
@Data
public class WareHouseLaneSaveReqVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4293")
private Long id;
@Schema(description = "巷道id(自定义)", requiredMode = Schema.RequiredMode.REQUIRED, example = "276")
@NotNull(message = "巷道id(自定义)不能为空")
private Long laneId;
@Schema(description = "巷道名称", example = "芋艿")
@Schema(description = "线库名称", example = "芋艿")
private String laneName;
@Schema(description = "巷道说明(可以拓展为区域说明)")
@Schema(description = "线库说明(可以拓展为说明)")
private String laneMsg;
}
@Schema(description = "地图id")
private Long mapId;
@Schema(description = "地图库位节点ids")
private List<Long> mapItemIds;
}

View File

@ -0,0 +1,27 @@
package cn.iocoder.yudao.module.system.controller.admin.positionmap.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
@Schema(description = "管理后台 - 仓库点位地图查询")
@Data
@Accessors(chain = true)
public class PositionMapConditionDTO {
@Schema(description = "ids")
private List<Long> ids;
@Schema(description = "仓库点位地图表id")
private Long positionMapId;
@Schema(description = "库区id")
private Long areaId;
@Schema(description = "巷道id")
private Long laneId;
@Schema(description = "类型 1.路径点位 2.库位点 3.充电桩 4.停车点 5.区域变更点 6.等待点 --- 后续补充")
private Integer type;
}

View File

@ -33,11 +33,11 @@ public class PositionMapItemDO extends BaseDO {
*/
private Long positionMapId;
/**
* 库区id(自定义)
* 库区id
*/
private Long areaId;
/**
* 巷道id(自定义)
* 线库id
*/
private Long laneId;
/**

View File

@ -44,7 +44,7 @@ public class NodeProcessingContext {
// 节点
// strategyMap.put(1, positionMapItemStrategyImpl);
// 库位
strategyMap.put(NodeTypeEnum.WARE.getStatus(), houseLocationStrategyImpl);
strategyMap.put(NodeTypeEnum.WARE.getType(), houseLocationStrategyImpl);
// todo 可以继续添加更多的策略
}
@ -57,7 +57,7 @@ public class NodeProcessingContext {
}
item.setPositionMapId(positionMapId);
// -- 如果是库位点 - 可能是一对多情况 - 需要将多个库位点的id set进去
if (Objects.equals(item.getType(), NodeTypeEnum.WARE.getStatus())) {
if (Objects.equals(item.getType(), NodeTypeEnum.WARE.getType())) {
List<WareHouseLocationDO> wareHouseLocationDOS = JSONUtil.toList(item.getDataJson(), WareHouseLocationDO.class);
wareHouseLocationDOS.forEach(wareHouseLocationDO -> {
wareHouseLocationDO.setLocationX(item.getLocationX());

View File

@ -1,56 +1,39 @@
package cn.iocoder.yudao.module.system.service.houselane;
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.houselane.vo.WareHouseLanePageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.houselane.vo.WareHouseLaneSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.houselane.WareHouseLaneDO;
import javax.validation.Valid;
/**
* 线库/巷道 Service 接口
* 线库 Service 接口
*
* @author 陈宾顺
*/
public interface WareHouseLaneService {
/**
* 创建线库/巷道
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createHouseLane(@Valid WareHouseLaneSaveReqVO createReqVO);
/**
* 更新线库/巷道
*
* @param updateReqVO 更新信息
*/
void updateHouseLane(@Valid WareHouseLaneSaveReqVO updateReqVO);
/**
* 删除线库/巷道
* 获得线库
*
* @param id 编号
*/
void deleteHouseLane(Long id);
/**
* 获得线库/巷道
*
* @param id 编号
* @return 线库/巷道
* @return 线库
*/
WareHouseLaneDO getHouseLane(Long id);
/**
* 获得线库/巷道分页
* 获得线库分页
*
* @param pageReqVO 分页查询
* @return 线库/巷道分页
* @return 线库分页
*/
PageResult<WareHouseLaneDO> getHouseLanePage(WareHouseLanePageReqVO pageReqVO);
}
/**
* 创建修改删除线库
*
* @param createReqVO
*/
void createOrEditOrDel(@Valid WareHouseLaneSaveReqVO createReqVO);
}

View File

@ -1,19 +1,26 @@
package cn.iocoder.yudao.module.system.service.houselane;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
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.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.positionmap.PositionMapItemService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import javax.annotation.Resource;
import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.HOUSE_LANE_NOT_EXISTS;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.THE_LINE_LIBRARY_POINTS_ARE_NOT_LOCATED_IN_THE_SAME_AREA;
/**
@ -27,38 +34,8 @@ public class WareHouseLaneServiceImpl implements WareHouseLaneService {
@Resource
private WareHouseLaneMapper houseLaneMapper;
@Override
public Long createHouseLane(WareHouseLaneSaveReqVO createReqVO) {
// 插入
WareHouseLaneDO houseLane = BeanUtils.toBean(createReqVO, WareHouseLaneDO.class);
houseLaneMapper.insert(houseLane);
// 返回
return houseLane.getId();
}
@Override
public void updateHouseLane(WareHouseLaneSaveReqVO updateReqVO) {
// 校验存在
validateHouseLaneExists(updateReqVO.getId());
// 更新
WareHouseLaneDO updateObj = BeanUtils.toBean(updateReqVO, WareHouseLaneDO.class);
houseLaneMapper.updateById(updateObj);
}
@Override
public void deleteHouseLane(Long id) {
// 校验存在
validateHouseLaneExists(id);
// 删除
houseLaneMapper.deleteById(id);
}
private void validateHouseLaneExists(Long id) {
if (houseLaneMapper.selectById(id) == null) {
throw exception(HOUSE_LANE_NOT_EXISTS);
}
}
@Resource
private PositionMapItemService positionMapItemService;
@Override
public WareHouseLaneDO getHouseLane(Long id) {
@ -70,4 +47,38 @@ public class WareHouseLaneServiceImpl implements WareHouseLaneService {
return houseLaneMapper.selectPage(pageReqVO);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void createOrEditOrDel(WareHouseLaneSaveReqVO createReqVO) {
// // -- 先判定这些点位是否在同一区域内 - 如果不在则提示 哪些点位不在同一区域内
// List<PositionMapItemDO> oldList = positionMapItemService.getByCondition(new PositionMapConditionDTO()
// .setPositionMapId(createReqVO.getMapId())
// .setLaneId(createReqVO.getId()));
//
//
// List<PositionMapItemDO> list = positionMapItemService.getByCondition(new PositionMapConditionDTO()
// .setPositionMapId(createReqVO.getMapId())
// .setIds(createReqVO.getMapItemIds()));
//
// if (CollUtil.isNotEmpty(list)) {
// // 判定是否都在同一区域内
// long count = list.stream().map(PositionMapItemDO::getAreaId).distinct().count();
// if (count > 1) {
// throw exception(THE_LINE_LIBRARY_POINTS_ARE_NOT_LOCATED_IN_THE_SAME_AREA);
// }
// }
// WareHouseLaneDO houseLane = BeanUtil.copyProperties(createReqVO, WareHouseLaneDO.class);
// houseLaneMapper.insertOrUpdate(houseLane);
//
// list.forEach(item -> {
// item.setLaneId(createReqVO.getId());
// List<WareHouseLocationDO> wareHouseLocationDOS = JSONUtil.toList(item.getDataJson(), WareHouseLocationDO.class);
// wareHouseLocationDOS.forEach(a -> {
// a.setLaneId(createReqVO.getId());
// a.setLaneName(createReqVO.getLaneName());
// });
// });
// positionMapItemService.update
}
}

View File

@ -1,9 +1,11 @@
package cn.iocoder.yudao.module.system.service.positionmap;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.dto.PositionMapConditionDTO;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapItemDO;
import com.baomidou.mybatisplus.extension.service.IService;
import javax.validation.Valid;
import java.util.List;
@ -13,7 +15,7 @@ import java.util.List;
*
* @author 芋道源码
*/
public interface PositionMapItemService {
public interface PositionMapItemService extends IService<PositionMapItemDO> {
/**
* 创建仓库点位地图子表
@ -67,4 +69,12 @@ public interface PositionMapItemService {
* @param list
*/
void batchSaveOrEditOrDel(Long positionMapId, List<List<PositionMapItemDO>> list);
/**
* 根据条件搜索地图点位信息
*
* @param positionMapConditionDTO
* @return
*/
List<PositionMapItemDO> getByCondition(PositionMapConditionDTO positionMapConditionDTO);
}

View File

@ -1,15 +1,14 @@
package cn.iocoder.yudao.module.system.service.positionmap;
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.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.dto.PositionMapConditionDTO;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemSaveReqVO;
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.positionmap.PositionMapItemMapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
@ -26,7 +25,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.
*/
@Service
@Validated
public class PositionMapItemServiceImpl implements PositionMapItemService {
public class PositionMapItemServiceImpl extends ServiceImpl<PositionMapItemMapper, PositionMapItemDO> implements PositionMapItemService {
@Resource
private PositionMapItemMapper positionMapItemMapper;
@ -82,4 +81,17 @@ public class PositionMapItemServiceImpl implements PositionMapItemService {
positionMapItemMapper.deleteByIds(convertList(list.get(2), PositionMapItemDO::getId));
}
}
@Override
public List<PositionMapItemDO> getByCondition(PositionMapConditionDTO dto) {
return positionMapItemMapper.selectList(new LambdaQueryWrapperX<PositionMapItemDO>()
.eqIfPresent(PositionMapItemDO::getPositionMapId, dto.getPositionMapId())
.eqIfPresent(PositionMapItemDO::getType, dto.getType())
.inIfPresent(PositionMapItemDO::getId, dto.getIds())
.eqIfPresent(PositionMapItemDO::getAreaId, dto.getAreaId())
.eqIfPresent(PositionMapItemDO::getLaneId, dto.getLaneId()));
}
}