Ver código fonte

pms功能优化 库区/货架/货位代码初始化

zhangcl 4 meses atrás
pai
commit
7f46925c2f
32 arquivos alterados com 2050 adições e 0 exclusões
  1. 3 0
      yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/ErrorCodeConstant.java
  2. 93 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotcargolocation/IotCargoLocationController.java
  3. 82 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotcargolocation/vo/IotCargoLocationPageReqVO.java
  4. 100 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotcargolocation/vo/IotCargoLocationRespVO.java
  5. 72 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotcargolocation/vo/IotCargoLocationSaveReqVO.java
  6. 111 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotshelves/IotShelvesController.java
  7. 69 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotshelves/vo/IotShelvesPageReqVO.java
  8. 91 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotshelves/vo/IotShelvesRespVO.java
  9. 58 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotshelves/vo/IotShelvesSaveReqVO.java
  10. 105 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotstoragearea/IotStorageAreaController.java
  11. 66 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotstoragearea/vo/IotStorageAreaPageReqVO.java
  12. 83 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotstoragearea/vo/IotStorageAreaRespVO.java
  13. 55 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotstoragearea/vo/IotStorageAreaSaveReqVO.java
  14. 31 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/convert/iotstoragearea/IotStorageAreaConvert.java
  15. 36 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/convert/shelves/IotShelvesConvert.java
  16. 108 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotcargolocation/IotCargoLocationDO.java
  17. 90 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotshelves/IotShelvesDO.java
  18. 86 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotstoragearea/IotStorageAreaDO.java
  19. 43 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotcargolocation/IotCargoLocationMapper.java
  20. 39 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotshelves/IotShelvesMapper.java
  21. 38 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotstoragearea/IotStorageAreaMapper.java
  22. 55 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotcargolocation/IotCargoLocationService.java
  23. 71 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotcargolocation/IotCargoLocationServiceImpl.java
  24. 55 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotshelves/IotShelvesService.java
  25. 71 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotshelves/IotShelvesServiceImpl.java
  26. 78 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotstoragearea/IotStorageAreaService.java
  27. 84 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotstoragearea/IotStorageAreaServiceImpl.java
  28. 36 0
      yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/saporg/SapOrgApi.java
  29. 80 0
      yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/saporg/dto/SapOrgRespDTO.java
  30. 30 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/saporg/SapOrgApiImpl.java
  31. 21 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/saporg/SapOrgService.java
  32. 10 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/saporg/SapOrgServiceImpl.java

+ 3 - 0
yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/ErrorCodeConstant.java

@@ -30,4 +30,7 @@ public interface ErrorCodeConstant{
     ErrorCode IOT_SAP_STOCK_NOT_EXISTS = new ErrorCode(131, "PMS SAP 库存(通用库存/项目部库存)不存在");
     ErrorCode IOT_MAINTAIN_MATERIAL_NOT_EXISTS = new ErrorCode(129, "工单物料不存在");
     ErrorCode IOT_INFORMATION_DB_NOT_EXISTS = new ErrorCode(130, "知识库不存在");
+    ErrorCode IOT_STORAGE_AREA_NOT_EXISTS = new ErrorCode(131, "PMS 库区不存在");
+    ErrorCode IOT_SHELVES_NOT_EXISTS = new ErrorCode(132, "PMS 货架不存在");
+    ErrorCode IOT_CARGO_LOCATION_NOT_EXISTS = new ErrorCode(133, "PMS 货位不存在");
 }

+ 93 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotcargolocation/IotCargoLocationController.java

@@ -0,0 +1,93 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotcargolocation;
+
+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.pms.controller.admin.iotcargolocation.vo.IotCargoLocationPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotcargolocation.vo.IotCargoLocationRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotcargolocation.vo.IotCargoLocationSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotcargolocation.IotCargoLocationDO;
+import cn.iocoder.yudao.module.pms.service.iotcargolocation.IotCargoLocationService;
+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.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 = "管理后台 - PMS 货位")
+@RestController
+@RequestMapping("/pms/iot-cargo-location")
+@Validated
+public class IotCargoLocationController {
+
+    @Resource
+    private IotCargoLocationService iotCargoLocationService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建PMS 货位")
+    @PreAuthorize("@ss.hasPermission('pms:iot-cargo-location:create')")
+    public CommonResult<Long> createIotCargoLocation(@Valid @RequestBody IotCargoLocationSaveReqVO createReqVO) {
+        return success(iotCargoLocationService.createIotCargoLocation(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新PMS 货位")
+    @PreAuthorize("@ss.hasPermission('pms:iot-cargo-location:update')")
+    public CommonResult<Boolean> updateIotCargoLocation(@Valid @RequestBody IotCargoLocationSaveReqVO updateReqVO) {
+        iotCargoLocationService.updateIotCargoLocation(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除PMS 货位")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('pms:iot-cargo-location:delete')")
+    public CommonResult<Boolean> deleteIotCargoLocation(@RequestParam("id") Long id) {
+        iotCargoLocationService.deleteIotCargoLocation(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得PMS 货位")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('pms:iot-cargo-location:query')")
+    public CommonResult<IotCargoLocationRespVO> getIotCargoLocation(@RequestParam("id") Long id) {
+        IotCargoLocationDO iotCargoLocation = iotCargoLocationService.getIotCargoLocation(id);
+        return success(BeanUtils.toBean(iotCargoLocation, IotCargoLocationRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得PMS 货位分页")
+    @PreAuthorize("@ss.hasPermission('pms:iot-cargo-location:query')")
+    public CommonResult<PageResult<IotCargoLocationRespVO>> getIotCargoLocationPage(@Valid IotCargoLocationPageReqVO pageReqVO) {
+        PageResult<IotCargoLocationDO> pageResult = iotCargoLocationService.getIotCargoLocationPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, IotCargoLocationRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出PMS 货位 Excel")
+    @PreAuthorize("@ss.hasPermission('pms:iot-cargo-location:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportIotCargoLocationExcel(@Valid IotCargoLocationPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<IotCargoLocationDO> list = iotCargoLocationService.getIotCargoLocationPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "PMS 货位.xls", "数据", IotCargoLocationRespVO.class,
+                        BeanUtils.toBean(list, IotCargoLocationRespVO.class));
+    }
+
+}

+ 82 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotcargolocation/vo/IotCargoLocationPageReqVO.java

@@ -0,0 +1,82 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotcargolocation.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - PMS 货位分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class IotCargoLocationPageReqVO extends PageParam {
+
+    @Schema(description = "部门id", example = "1867")
+    private Long deptId;
+
+    @Schema(description = "工厂id(SAP) 专业公司", example = "389")
+    private Long factoryId;
+
+    @Schema(description = "工厂编码")
+    private String factoryCode;
+
+    @Schema(description = "成本中心id (system_sap_org表id)", example = "9437")
+    private Long costCenterId;
+
+    @Schema(description = "成本中心 code")
+    private String costCenterCode;
+
+    @Schema(description = "库存地点id (system_sap_org表id)", example = "7908")
+    private Long storageLocationId;
+
+    @Schema(description = "库存地点编码 - 项目部")
+    private String storageLocationCode;
+
+    @Schema(description = "货架id", example = "9384")
+    private Long shelvesId;
+
+    @Schema(description = "货位编码")
+    private String code;
+
+    @Schema(description = "货位名称", example = "芋艿")
+    private String name;
+
+    @Schema(description = "货位类型", example = "1")
+    private Integer type;
+
+    @Schema(description = "排号(货架的水平分区)")
+    private Integer row;
+
+    @Schema(description = "层号(货架的垂直分区)")
+    private Integer layer;
+
+    @Schema(description = "列号(货架的纵深分区)")
+    private Integer column;
+
+    @Schema(description = "货位容量(单位:可自定义,如件数、体积m³、重量kg)")
+    private BigDecimal capacity;
+
+    @Schema(description = "当前已使用容量")
+    private BigDecimal currentUsage;
+
+    @Schema(description = "显示顺序")
+    private Integer sort;
+
+    @Schema(description = "状态 0启用  1停用", example = "2")
+    private Integer status;
+
+    @Schema(description = "备注", example = "你猜")
+    private String remark;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 100 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotcargolocation/vo/IotCargoLocationRespVO.java

@@ -0,0 +1,100 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotcargolocation.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - PMS 货位 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class IotCargoLocationRespVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "27668")
+    @ExcelProperty("主键")
+    private Long id;
+
+    @Schema(description = "部门id", example = "1867")
+    @ExcelProperty("部门id")
+    private Long deptId;
+
+    @Schema(description = "工厂id(SAP) 专业公司", example = "389")
+    @ExcelProperty("工厂id(SAP) 专业公司")
+    private Long factoryId;
+
+    @Schema(description = "工厂编码")
+    @ExcelProperty("工厂编码")
+    private String factoryCode;
+
+    @Schema(description = "成本中心id (system_sap_org表id)", example = "9437")
+    @ExcelProperty("成本中心id (system_sap_org表id)")
+    private Long costCenterId;
+
+    @Schema(description = "成本中心 code")
+    @ExcelProperty("成本中心 code")
+    private String costCenterCode;
+
+    @Schema(description = "库存地点id (system_sap_org表id)", example = "7908")
+    @ExcelProperty("库存地点id (system_sap_org表id)")
+    private Long storageLocationId;
+
+    @Schema(description = "库存地点编码 - 项目部")
+    @ExcelProperty("库存地点编码 - 项目部")
+    private String storageLocationCode;
+
+    @Schema(description = "货架id", example = "9384")
+    @ExcelProperty("货架id")
+    private Long shelvesId;
+
+    @Schema(description = "货位编码")
+    @ExcelProperty("货位编码")
+    private String code;
+
+    @Schema(description = "货位名称", example = "芋艿")
+    @ExcelProperty("货位名称")
+    private String name;
+
+    @Schema(description = "货位类型", example = "1")
+    @ExcelProperty("货位类型")
+    private Integer type;
+
+    @Schema(description = "排号(货架的水平分区)")
+    @ExcelProperty("排号(货架的水平分区)")
+    private Integer row;
+
+    @Schema(description = "层号(货架的垂直分区)")
+    @ExcelProperty("层号(货架的垂直分区)")
+    private Integer layer;
+
+    @Schema(description = "列号(货架的纵深分区)")
+    @ExcelProperty("列号(货架的纵深分区)")
+    private Integer column;
+
+    @Schema(description = "货位容量(单位:可自定义,如件数、体积m³、重量kg)")
+    @ExcelProperty("货位容量(单位:可自定义,如件数、体积m³、重量kg)")
+    private BigDecimal capacity;
+
+    @Schema(description = "当前已使用容量")
+    @ExcelProperty("当前已使用容量")
+    private BigDecimal currentUsage;
+
+    @Schema(description = "显示顺序")
+    @ExcelProperty("显示顺序")
+    private Integer sort;
+
+    @Schema(description = "状态 0启用  1停用", example = "2")
+    @ExcelProperty("状态 0启用  1停用")
+    private Integer status;
+
+    @Schema(description = "备注", example = "你猜")
+    @ExcelProperty("备注")
+    private String remark;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 72 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotcargolocation/vo/IotCargoLocationSaveReqVO.java

@@ -0,0 +1,72 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotcargolocation.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Schema(description = "管理后台 - PMS 货位新增/修改 Request VO")
+@Data
+public class IotCargoLocationSaveReqVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "27668")
+    private Long id;
+
+    @Schema(description = "部门id", example = "1867")
+    private Long deptId;
+
+    @Schema(description = "工厂id(SAP) 专业公司", example = "389")
+    private Long factoryId;
+
+    @Schema(description = "工厂编码")
+    private String factoryCode;
+
+    @Schema(description = "成本中心id (system_sap_org表id)", example = "9437")
+    private Long costCenterId;
+
+    @Schema(description = "成本中心 code")
+    private String costCenterCode;
+
+    @Schema(description = "库存地点id (system_sap_org表id)", example = "7908")
+    private Long storageLocationId;
+
+    @Schema(description = "库存地点编码 - 项目部")
+    private String storageLocationCode;
+
+    @Schema(description = "货架id", example = "9384")
+    private Long shelvesId;
+
+    @Schema(description = "货位编码")
+    private String code;
+
+    @Schema(description = "货位名称", example = "芋艿")
+    private String name;
+
+    @Schema(description = "货位类型", example = "1")
+    private Integer type;
+
+    @Schema(description = "排号(货架的水平分区)")
+    private Integer row;
+
+    @Schema(description = "层号(货架的垂直分区)")
+    private Integer layer;
+
+    @Schema(description = "列号(货架的纵深分区)")
+    private Integer column;
+
+    @Schema(description = "货位容量(单位:可自定义,如件数、体积m³、重量kg)")
+    private BigDecimal capacity;
+
+    @Schema(description = "当前已使用容量")
+    private BigDecimal currentUsage;
+
+    @Schema(description = "显示顺序")
+    private Integer sort;
+
+    @Schema(description = "状态 0启用  1停用", example = "2")
+    private Integer status;
+
+    @Schema(description = "备注", example = "你猜")
+    private String remark;
+
+}

+ 111 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotshelves/IotShelvesController.java

@@ -0,0 +1,111 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotshelves;
+
+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.pms.controller.admin.iotshelves.vo.IotShelvesPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotshelves.vo.IotShelvesRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotshelves.vo.IotShelvesSaveReqVO;
+import cn.iocoder.yudao.module.pms.convert.shelves.IotShelvesConvert;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotshelves.IotShelvesDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotstoragearea.IotStorageAreaDO;
+import cn.iocoder.yudao.module.pms.service.iotshelves.IotShelvesService;
+import cn.iocoder.yudao.module.pms.service.iotstoragearea.IotStorageAreaService;
+import cn.iocoder.yudao.module.system.api.saporg.SapOrgApi;
+import cn.iocoder.yudao.module.system.api.saporg.dto.SapOrgRespDTO;
+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.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
+
+@Tag(name = "管理后台 - PMS 货架")
+@RestController
+@RequestMapping("/pms/iot-shelves")
+@Validated
+public class IotShelvesController {
+
+    @Resource
+    private IotShelvesService iotShelvesService;
+    @Resource
+    private SapOrgApi sapOrgApi;
+    @Resource
+    private IotStorageAreaService iotStorageAreaService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建PMS 货架")
+    @PreAuthorize("@ss.hasPermission('pms:iot-shelves:create')")
+    public CommonResult<Long> createIotShelves(@Valid @RequestBody IotShelvesSaveReqVO createReqVO) {
+        return success(iotShelvesService.createIotShelves(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新PMS 货架")
+    @PreAuthorize("@ss.hasPermission('pms:iot-shelves:update')")
+    public CommonResult<Boolean> updateIotShelves(@Valid @RequestBody IotShelvesSaveReqVO updateReqVO) {
+        iotShelvesService.updateIotShelves(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除PMS 货架")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('pms:iot-shelves:delete')")
+    public CommonResult<Boolean> deleteIotShelves(@RequestParam("id") Long id) {
+        iotShelvesService.deleteIotShelves(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得PMS 货架")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('pms:iot-shelves:query')")
+    public CommonResult<IotShelvesRespVO> getIotShelves(@RequestParam("id") Long id) {
+        IotShelvesDO iotShelves = iotShelvesService.getIotShelves(id);
+        return success(BeanUtils.toBean(iotShelves, IotShelvesRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得PMS 货架分页")
+    @PreAuthorize("@ss.hasPermission('pms:iot-shelves:query')")
+    public CommonResult<PageResult<IotShelvesRespVO>> getIotShelvesPage(@Valid IotShelvesPageReqVO pageReqVO) {
+        PageResult<IotShelvesDO> pageResult = iotShelvesService.getIotShelvesPage(pageReqVO);
+        // 拼接库存地点数据
+        Map<Long, SapOrgRespDTO> storageLocationMap = sapOrgApi.getSapOrgMap(
+                convertList(pageResult.getList(), IotShelvesDO::getStorageLocationId));
+        // 拼接库区数据
+        Map<Long, IotStorageAreaDO> storageAreaMap = iotStorageAreaService.getStorageAreaMap(
+                convertList(pageResult.getList(), IotShelvesDO::getStorageAreaId));
+        return success(new PageResult<>(IotShelvesConvert.INSTANCE.convertList(pageResult.getList(), storageLocationMap, storageAreaMap),
+                pageResult.getTotal()));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出PMS 货架 Excel")
+    @PreAuthorize("@ss.hasPermission('pms:iot-shelves:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportIotShelvesExcel(@Valid IotShelvesPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<IotShelvesDO> list = iotShelvesService.getIotShelvesPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "PMS 货架.xls", "数据", IotShelvesRespVO.class,
+                        BeanUtils.toBean(list, IotShelvesRespVO.class));
+    }
+
+}

+ 69 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotshelves/vo/IotShelvesPageReqVO.java

@@ -0,0 +1,69 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotshelves.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - PMS 货架分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class IotShelvesPageReqVO extends PageParam {
+
+    @Schema(description = "部门id", example = "32315")
+    private Long deptId;
+
+    @Schema(description = "工厂id(SAP) 专业公司id system_sap_org表id", example = "16927")
+    private Long factoryId;
+
+    @Schema(description = "工厂code")
+    private String factoryCode;
+
+    @Schema(description = "工厂name", example = "赵六")
+    private String factoryName;
+
+    @Schema(description = "成本中心id (system_sap_org表id)", example = "15077")
+    private Long costCenterId;
+
+    @Schema(description = "成本中心 code")
+    private String costCenterCode;
+
+    @Schema(description = "库存地点id (system_sap_org表id)", example = "2176")
+    private Long storageLocationId;
+
+    @Schema(description = "库存地点 - 项目部")
+    private String storageLocationCode;
+
+    @Schema(description = "仓库区域(A区 B区)", example = "9339")
+    private Long storageAreaId;
+
+    @Schema(description = "货架编码")
+    private String code;
+
+    @Schema(description = "货架名称", example = "芋艿")
+    private String name;
+
+    @Schema(description = "货架类型", example = "2")
+    private Integer type;
+
+    @Schema(description = "显示顺序")
+    private Integer sort;
+
+    @Schema(description = "状态 0启用  1停用", example = "2")
+    private Integer status;
+
+    @Schema(description = "备注", example = "你说的对")
+    private String remark;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 91 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotshelves/vo/IotShelvesRespVO.java

@@ -0,0 +1,91 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotshelves.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - PMS 货架 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class IotShelvesRespVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "30381")
+    @ExcelProperty("主键")
+    private Long id;
+
+    @Schema(description = "部门id", example = "32315")
+    @ExcelProperty("部门id")
+    private Long deptId;
+
+    @Schema(description = "工厂id(SAP) 专业公司id system_sap_org表id", example = "16927")
+    @ExcelProperty("工厂id(SAP) 专业公司id system_sap_org表id")
+    private Long factoryId;
+
+    @Schema(description = "工厂code")
+    @ExcelProperty("工厂code")
+    private String factoryCode;
+
+    @Schema(description = "工厂name", example = "赵六")
+    @ExcelProperty("工厂name")
+    private String factoryName;
+
+    @Schema(description = "成本中心id (system_sap_org表id)", example = "15077")
+    @ExcelProperty("成本中心id (system_sap_org表id)")
+    private Long costCenterId;
+
+    @Schema(description = "成本中心 code")
+    @ExcelProperty("成本中心 code")
+    private String costCenterCode;
+
+    @Schema(description = "库存地点id (system_sap_org表id)", example = "2176")
+    @ExcelProperty("库存地点id (system_sap_org表id)")
+    private Long storageLocationId;
+
+    @Schema(description = "库存地点 - 项目部")
+    @ExcelProperty("库存地点 - 项目部")
+    private String storageLocationCode;
+
+    @Schema(description = "库存地点名称")
+    @ExcelProperty("库存地点名称")
+    private String storageLocationName;
+
+    @Schema(description = "仓库区域(A区 B区)", example = "9339")
+    @ExcelProperty("仓库区域(A区 B区)")
+    private Long storageAreaId;
+
+    @Schema(description = "仓库区域(A区 B区)名称", example = "区域")
+    @ExcelProperty("仓库区域(A区 B区)名称")
+    private String storageAreaName;
+
+    @Schema(description = "货架编码")
+    @ExcelProperty("货架编码")
+    private String code;
+
+    @Schema(description = "货架名称", example = "芋艿")
+    @ExcelProperty("货架名称")
+    private String name;
+
+    @Schema(description = "货架类型", example = "2")
+    @ExcelProperty("货架类型")
+    private Integer type;
+
+    @Schema(description = "显示顺序")
+    @ExcelProperty("显示顺序")
+    private Integer sort;
+
+    @Schema(description = "状态 0启用  1停用", example = "2")
+    @ExcelProperty("状态 0启用  1停用")
+    private Integer status;
+
+    @Schema(description = "备注", example = "你说的对")
+    @ExcelProperty("备注")
+    private String remark;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 58 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotshelves/vo/IotShelvesSaveReqVO.java

@@ -0,0 +1,58 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotshelves.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - PMS 货架新增/修改 Request VO")
+@Data
+public class IotShelvesSaveReqVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "30381")
+    private Long id;
+
+    @Schema(description = "部门id", example = "32315")
+    private Long deptId;
+
+    @Schema(description = "工厂id(SAP) 专业公司id system_sap_org表id", example = "16927")
+    private Long factoryId;
+
+    @Schema(description = "工厂code")
+    private String factoryCode;
+
+    @Schema(description = "工厂name", example = "赵六")
+    private String factoryName;
+
+    @Schema(description = "成本中心id (system_sap_org表id)", example = "15077")
+    private Long costCenterId;
+
+    @Schema(description = "成本中心 code")
+    private String costCenterCode;
+
+    @Schema(description = "库存地点id (system_sap_org表id)", example = "2176")
+    private Long storageLocationId;
+
+    @Schema(description = "库存地点 - 项目部")
+    private String storageLocationCode;
+
+    @Schema(description = "仓库区域(A区 B区)", example = "9339")
+    private Long storageAreaId;
+
+    @Schema(description = "货架编码")
+    private String code;
+
+    @Schema(description = "货架名称", example = "芋艿")
+    private String name;
+
+    @Schema(description = "货架类型", example = "2")
+    private Integer type;
+
+    @Schema(description = "显示顺序")
+    private Integer sort;
+
+    @Schema(description = "状态 0启用  1停用", example = "2")
+    private Integer status;
+
+    @Schema(description = "备注", example = "你说的对")
+    private String remark;
+
+}

+ 105 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotstoragearea/IotStorageAreaController.java

@@ -0,0 +1,105 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotstoragearea;
+
+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.pms.controller.admin.iotstoragearea.vo.IotStorageAreaPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotstoragearea.vo.IotStorageAreaRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotstoragearea.vo.IotStorageAreaSaveReqVO;
+import cn.iocoder.yudao.module.pms.convert.iotstoragearea.IotStorageAreaConvert;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotstoragearea.IotStorageAreaDO;
+import cn.iocoder.yudao.module.pms.service.iotstoragearea.IotStorageAreaService;
+import cn.iocoder.yudao.module.system.api.saporg.SapOrgApi;
+import cn.iocoder.yudao.module.system.api.saporg.dto.SapOrgRespDTO;
+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.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
+
+@Tag(name = "管理后台 - PMS 库区")
+@RestController
+@RequestMapping("/pms/iot-storage-area")
+@Validated
+public class IotStorageAreaController {
+
+    @Resource
+    private IotStorageAreaService iotStorageAreaService;
+    @Resource
+    private SapOrgApi sapOrgApi;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建PMS 库区")
+    @PreAuthorize("@ss.hasPermission('pms:iot-storage-area:create')")
+    public CommonResult<Long> createIotStorageArea(@Valid @RequestBody IotStorageAreaSaveReqVO createReqVO) {
+        return success(iotStorageAreaService.createIotStorageArea(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新PMS 库区")
+    @PreAuthorize("@ss.hasPermission('pms:iot-storage-area:update')")
+    public CommonResult<Boolean> updateIotStorageArea(@Valid @RequestBody IotStorageAreaSaveReqVO updateReqVO) {
+        iotStorageAreaService.updateIotStorageArea(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除PMS 库区")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('pms:iot-storage-area:delete')")
+    public CommonResult<Boolean> deleteIotStorageArea(@RequestParam("id") Long id) {
+        iotStorageAreaService.deleteIotStorageArea(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得PMS 库区")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('pms:iot-storage-area:query')")
+    public CommonResult<IotStorageAreaRespVO> getIotStorageArea(@RequestParam("id") Long id) {
+        IotStorageAreaDO iotStorageArea = iotStorageAreaService.getIotStorageArea(id);
+        return success(BeanUtils.toBean(iotStorageArea, IotStorageAreaRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得PMS 库区分页")
+    @PreAuthorize("@ss.hasPermission('pms:iot-storage-area:query')")
+    public CommonResult<PageResult<IotStorageAreaRespVO>> getIotStorageAreaPage(@Valid IotStorageAreaPageReqVO pageReqVO) {
+        PageResult<IotStorageAreaDO> pageResult = iotStorageAreaService.getIotStorageAreaPage(pageReqVO);
+        // 拼接库存地点数据
+        Map<Long, SapOrgRespDTO> storageLocationMap = sapOrgApi.getSapOrgMap(
+                convertList(pageResult.getList(), IotStorageAreaDO::getStorageLocationId));
+        // return success(BeanUtils.toBean(pageResult, IotStorageAreaRespVO.class));
+        return success(new PageResult<>(IotStorageAreaConvert.INSTANCE.convertList(pageResult.getList(), storageLocationMap),
+                pageResult.getTotal()));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出PMS 库区 Excel")
+    @PreAuthorize("@ss.hasPermission('pms:iot-storage-area:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportIotStorageAreaExcel(@Valid IotStorageAreaPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<IotStorageAreaDO> list = iotStorageAreaService.getIotStorageAreaPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "PMS 库区.xls", "数据", IotStorageAreaRespVO.class,
+                        BeanUtils.toBean(list, IotStorageAreaRespVO.class));
+    }
+
+}

+ 66 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotstoragearea/vo/IotStorageAreaPageReqVO.java

@@ -0,0 +1,66 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotstoragearea.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - PMS 库区分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class IotStorageAreaPageReqVO extends PageParam {
+
+    @Schema(description = "部门id", example = "8104")
+    private Long deptId;
+
+    @Schema(description = "工厂id(SAP) 专业公司id system_sap_org表id", example = "2902")
+    private Long factoryId;
+
+    @Schema(description = "工厂code")
+    private String factoryCode;
+
+    @Schema(description = "工厂name", example = "芋艿")
+    private String factoryName;
+
+    @Schema(description = "成本中心id (system_sap_org表id)", example = "270")
+    private Long costCenterId;
+
+    @Schema(description = "成本中心 code")
+    private String costCenterCode;
+
+    @Schema(description = "库存地点id (system_sap_org表id)", example = "21420")
+    private Long storageLocationId;
+
+    @Schema(description = "库存地点 - 项目部")
+    private String storageLocationCode;
+
+    @Schema(description = "库区编码")
+    private String code;
+
+    @Schema(description = "库区名称", example = "李四")
+    private String name;
+
+    @Schema(description = "库区类型", example = "1")
+    private Integer type;
+
+    @Schema(description = "显示顺序")
+    private Integer sort;
+
+    @Schema(description = "状态 0启用  1停用", example = "1")
+    private Integer status;
+
+    @Schema(description = "备注", example = "你说的对")
+    private String remark;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 83 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotstoragearea/vo/IotStorageAreaRespVO.java

@@ -0,0 +1,83 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotstoragearea.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - PMS 库区 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class IotStorageAreaRespVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "25777")
+    @ExcelProperty("主键")
+    private Long id;
+
+    @Schema(description = "部门id", example = "8104")
+    @ExcelProperty("部门id")
+    private Long deptId;
+
+    @Schema(description = "工厂id(SAP) 专业公司id system_sap_org表id", example = "2902")
+    @ExcelProperty("工厂id(SAP) 专业公司id system_sap_org表id")
+    private Long factoryId;
+
+    @Schema(description = "工厂code")
+    @ExcelProperty("工厂code")
+    private String factoryCode;
+
+    @Schema(description = "工厂name", example = "芋艿")
+    @ExcelProperty("工厂name")
+    private String factoryName;
+
+    @Schema(description = "成本中心id (system_sap_org表id)", example = "270")
+    @ExcelProperty("成本中心id (system_sap_org表id)")
+    private Long costCenterId;
+
+    @Schema(description = "成本中心 code")
+    @ExcelProperty("成本中心 code")
+    private String costCenterCode;
+
+    @Schema(description = "库存地点id (system_sap_org表id)", example = "21420")
+    @ExcelProperty("库存地点id (system_sap_org表id)")
+    private Long storageLocationId;
+
+    @Schema(description = "库存地点 - 项目部")
+    @ExcelProperty("库存地点 - 项目部")
+    private String storageLocationCode;
+
+    @Schema(description = "库存地点名称")
+    @ExcelProperty("库存地点名称")
+    private String storageLocationName;
+
+    @Schema(description = "库区编码")
+    @ExcelProperty("库区编码")
+    private String code;
+
+    @Schema(description = "库区名称", example = "李四")
+    @ExcelProperty("库区名称")
+    private String name;
+
+    @Schema(description = "库区类型", example = "1")
+    @ExcelProperty("库区类型")
+    private Integer type;
+
+    @Schema(description = "显示顺序")
+    @ExcelProperty("显示顺序")
+    private Integer sort;
+
+    @Schema(description = "状态 0启用  1停用", example = "1")
+    @ExcelProperty("状态 0启用  1停用")
+    private Integer status;
+
+    @Schema(description = "备注", example = "你说的对")
+    @ExcelProperty("备注")
+    private String remark;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 55 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotstoragearea/vo/IotStorageAreaSaveReqVO.java

@@ -0,0 +1,55 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotstoragearea.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - PMS 库区新增/修改 Request VO")
+@Data
+public class IotStorageAreaSaveReqVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "25777")
+    private Long id;
+
+    @Schema(description = "部门id", example = "8104")
+    private Long deptId;
+
+    @Schema(description = "工厂id(SAP) 专业公司id system_sap_org表id", example = "2902")
+    private Long factoryId;
+
+    @Schema(description = "工厂code")
+    private String factoryCode;
+
+    @Schema(description = "工厂name", example = "芋艿")
+    private String factoryName;
+
+    @Schema(description = "成本中心id (system_sap_org表id)", example = "270")
+    private Long costCenterId;
+
+    @Schema(description = "成本中心 code")
+    private String costCenterCode;
+
+    @Schema(description = "库存地点id (system_sap_org表id)", example = "21420")
+    private Long storageLocationId;
+
+    @Schema(description = "库存地点 - 项目部")
+    private String storageLocationCode;
+
+    @Schema(description = "库区编码")
+    private String code;
+
+    @Schema(description = "库区名称", example = "李四")
+    private String name;
+
+    @Schema(description = "库区类型", example = "1")
+    private Integer type;
+
+    @Schema(description = "显示顺序")
+    private Integer sort;
+
+    @Schema(description = "状态 0启用  1停用", example = "1")
+    private Integer status;
+
+    @Schema(description = "备注", example = "你说的对")
+    private String remark;
+
+}

+ 31 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/convert/iotstoragearea/IotStorageAreaConvert.java

@@ -0,0 +1,31 @@
+package cn.iocoder.yudao.module.pms.convert.iotstoragearea;
+
+import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.pms.controller.admin.iotstoragearea.vo.IotStorageAreaRespVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotstoragearea.IotStorageAreaDO;
+import cn.iocoder.yudao.module.system.api.saporg.dto.SapOrgRespDTO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+import java.util.Map;
+
+@Mapper
+public interface IotStorageAreaConvert {
+
+    IotStorageAreaConvert INSTANCE = Mappers.getMapper(IotStorageAreaConvert.class);
+
+    default List<IotStorageAreaRespVO> convertList(List<IotStorageAreaDO> list, Map<Long, SapOrgRespDTO> sapOrgMap) {
+        return CollectionUtils.convertList(list, area -> convert(area, sapOrgMap.get(area.getStorageLocationId())));
+    }
+
+    default IotStorageAreaRespVO convert(IotStorageAreaDO storageArea, SapOrgRespDTO sapOrg) {
+        IotStorageAreaRespVO areaVO = BeanUtils.toBean(storageArea, IotStorageAreaRespVO.class);
+        if (sapOrg != null) {
+            areaVO.setStorageLocationName(sapOrg.getStorageLocationName());
+        }
+        return areaVO;
+    }
+
+}

+ 36 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/convert/shelves/IotShelvesConvert.java

@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.pms.convert.shelves;
+
+import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.pms.controller.admin.iotshelves.vo.IotShelvesRespVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotshelves.IotShelvesDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotstoragearea.IotStorageAreaDO;
+import cn.iocoder.yudao.module.system.api.saporg.dto.SapOrgRespDTO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+import java.util.Map;
+
+@Mapper
+public interface IotShelvesConvert {
+
+    IotShelvesConvert INSTANCE = Mappers.getMapper(IotShelvesConvert.class);
+
+    default List<IotShelvesRespVO> convertList(List<IotShelvesDO> list, Map<Long, SapOrgRespDTO> sapOrgMap, Map<Long, IotStorageAreaDO> areaMap) {
+        return CollectionUtils.convertList(list, shelves -> convert1(shelves, sapOrgMap.get(shelves.getStorageLocationId()),
+                areaMap.get(shelves.getStorageAreaId())));
+    }
+
+    default IotShelvesRespVO convert1(IotShelvesDO shelves, SapOrgRespDTO sapOrg, IotStorageAreaDO storageArea) {
+        IotShelvesRespVO shelvesVO = BeanUtils.toBean(shelves, IotShelvesRespVO.class);
+        if (sapOrg != null) {
+            shelvesVO.setStorageLocationName(sapOrg.getStorageLocationName());
+        }
+        if (storageArea != null) {
+            shelvesVO.setStorageAreaName(storageArea.getName());
+        }
+        return shelvesVO;
+    }
+
+}

+ 108 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotcargolocation/IotCargoLocationDO.java

@@ -0,0 +1,108 @@
+package cn.iocoder.yudao.module.pms.dal.dataobject.iotcargolocation;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import java.math.BigDecimal;
+
+/**
+ * PMS 货位 DO
+ *
+ * @author ruiqi
+ */
+@TableName("rq_iot_cargo_location")
+@KeySequence("rq_iot_cargo_location_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class IotCargoLocationDO extends BaseDO {
+
+    /**
+     * 主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * 部门id
+     */
+    private Long deptId;
+    /**
+     * 工厂id(SAP) 专业公司
+     */
+    private Long factoryId;
+    /**
+     * 工厂编码
+     */
+    private String factoryCode;
+    /**
+     * 成本中心id (system_sap_org表id)
+     */
+    private Long costCenterId;
+    /**
+     * 成本中心 code
+     */
+    private String costCenterCode;
+    /**
+     * 库存地点id (system_sap_org表id)
+     */
+    private Long storageLocationId;
+    /**
+     * 库存地点编码 - 项目部
+     */
+    private String storageLocationCode;
+    /**
+     * 货架id
+     */
+    private Long shelvesId;
+    /**
+     * 货位编码
+     */
+    private String code;
+    /**
+     * 货位名称
+     */
+    private String name;
+    /**
+     * 货位类型
+     */
+    private Integer type;
+    /**
+     * 排号(货架的水平分区)
+     */
+    private Integer row;
+    /**
+     * 层号(货架的垂直分区)
+     */
+    private Integer layer;
+    /**
+     * 列号(货架的纵深分区)
+     */
+    private Integer column;
+    /**
+     * 货位容量(单位:可自定义,如件数、体积m³、重量kg)
+     */
+    private BigDecimal capacity;
+    /**
+     * 当前已使用容量
+     */
+    private BigDecimal currentUsage;
+    /**
+     * 显示顺序
+     */
+    private Integer sort;
+    /**
+     * 状态 0启用  1停用
+     */
+    private Integer status;
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 90 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotshelves/IotShelvesDO.java

@@ -0,0 +1,90 @@
+package cn.iocoder.yudao.module.pms.dal.dataobject.iotshelves;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * PMS 货架 DO
+ *
+ * @author ruiqi
+ */
+@TableName("rq_iot_shelves")
+@KeySequence("rq_iot_shelves_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class IotShelvesDO extends BaseDO {
+
+    /**
+     * 主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * 部门id
+     */
+    private Long deptId;
+    /**
+     * 工厂id(SAP) 专业公司id system_sap_org表id
+     */
+    private Long factoryId;
+    /**
+     * 工厂code
+     */
+    private String factoryCode;
+    /**
+     * 工厂name
+     */
+    private String factoryName;
+    /**
+     * 成本中心id (system_sap_org表id)
+     */
+    private Long costCenterId;
+    /**
+     * 成本中心 code
+     */
+    private String costCenterCode;
+    /**
+     * 库存地点id (system_sap_org表id)
+     */
+    private Long storageLocationId;
+    /**
+     * 库存地点 - 项目部
+     */
+    private String storageLocationCode;
+    /**
+     * 仓库区域(A区 B区)
+     */
+    private Long storageAreaId;
+    /**
+     * 货架编码
+     */
+    private String code;
+    /**
+     * 货架名称
+     */
+    private String name;
+    /**
+     * 货架类型
+     */
+    private Integer type;
+    /**
+     * 显示顺序
+     */
+    private Integer sort;
+    /**
+     * 状态 0启用  1停用
+     */
+    private Integer status;
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 86 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotstoragearea/IotStorageAreaDO.java

@@ -0,0 +1,86 @@
+package cn.iocoder.yudao.module.pms.dal.dataobject.iotstoragearea;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * PMS 库区 DO
+ *
+ * @author ruiqi
+ */
+@TableName("rq_iot_storage_area")
+@KeySequence("rq_iot_storage_area_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class IotStorageAreaDO extends BaseDO {
+
+    /**
+     * 主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * 部门id
+     */
+    private Long deptId;
+    /**
+     * 工厂id(SAP) 专业公司id system_sap_org表id
+     */
+    private Long factoryId;
+    /**
+     * 工厂code
+     */
+    private String factoryCode;
+    /**
+     * 工厂name
+     */
+    private String factoryName;
+    /**
+     * 成本中心id (system_sap_org表id)
+     */
+    private Long costCenterId;
+    /**
+     * 成本中心 code
+     */
+    private String costCenterCode;
+    /**
+     * 库存地点id (system_sap_org表id)
+     */
+    private Long storageLocationId;
+    /**
+     * 库存地点 - 项目部
+     */
+    private String storageLocationCode;
+    /**
+     * 库区编码
+     */
+    private String code;
+    /**
+     * 库区名称
+     */
+    private String name;
+    /**
+     * 库区类型
+     */
+    private Integer type;
+    /**
+     * 显示顺序
+     */
+    private Integer sort;
+    /**
+     * 状态 0启用  1停用
+     */
+    private Integer status;
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 43 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotcargolocation/IotCargoLocationMapper.java

@@ -0,0 +1,43 @@
+package cn.iocoder.yudao.module.pms.dal.mysql.iotcargolocation;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.pms.controller.admin.iotcargolocation.vo.IotCargoLocationPageReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotcargolocation.IotCargoLocationDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * PMS 货位 Mapper
+ *
+ * @author ruiqi
+ */
+@Mapper
+public interface IotCargoLocationMapper extends BaseMapperX<IotCargoLocationDO> {
+
+    default PageResult<IotCargoLocationDO> selectPage(IotCargoLocationPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<IotCargoLocationDO>()
+                .eqIfPresent(IotCargoLocationDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(IotCargoLocationDO::getFactoryId, reqVO.getFactoryId())
+                .eqIfPresent(IotCargoLocationDO::getFactoryCode, reqVO.getFactoryCode())
+                .eqIfPresent(IotCargoLocationDO::getCostCenterId, reqVO.getCostCenterId())
+                .eqIfPresent(IotCargoLocationDO::getCostCenterCode, reqVO.getCostCenterCode())
+                .eqIfPresent(IotCargoLocationDO::getStorageLocationId, reqVO.getStorageLocationId())
+                .eqIfPresent(IotCargoLocationDO::getStorageLocationCode, reqVO.getStorageLocationCode())
+                .eqIfPresent(IotCargoLocationDO::getShelvesId, reqVO.getShelvesId())
+                .eqIfPresent(IotCargoLocationDO::getCode, reqVO.getCode())
+                .likeIfPresent(IotCargoLocationDO::getName, reqVO.getName())
+                .eqIfPresent(IotCargoLocationDO::getType, reqVO.getType())
+                .eqIfPresent(IotCargoLocationDO::getRow, reqVO.getRow())
+                .eqIfPresent(IotCargoLocationDO::getLayer, reqVO.getLayer())
+                .eqIfPresent(IotCargoLocationDO::getColumn, reqVO.getColumn())
+                .eqIfPresent(IotCargoLocationDO::getCapacity, reqVO.getCapacity())
+                .eqIfPresent(IotCargoLocationDO::getCurrentUsage, reqVO.getCurrentUsage())
+                .eqIfPresent(IotCargoLocationDO::getSort, reqVO.getSort())
+                .eqIfPresent(IotCargoLocationDO::getStatus, reqVO.getStatus())
+                .eqIfPresent(IotCargoLocationDO::getRemark, reqVO.getRemark())
+                .betweenIfPresent(IotCargoLocationDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(IotCargoLocationDO::getId));
+    }
+
+}

+ 39 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotshelves/IotShelvesMapper.java

@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.module.pms.dal.mysql.iotshelves;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.pms.controller.admin.iotshelves.vo.IotShelvesPageReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotshelves.IotShelvesDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * PMS 货架 Mapper
+ *
+ * @author ruiqi
+ */
+@Mapper
+public interface IotShelvesMapper extends BaseMapperX<IotShelvesDO> {
+
+    default PageResult<IotShelvesDO> selectPage(IotShelvesPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<IotShelvesDO>()
+                .eqIfPresent(IotShelvesDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(IotShelvesDO::getFactoryId, reqVO.getFactoryId())
+                .eqIfPresent(IotShelvesDO::getFactoryCode, reqVO.getFactoryCode())
+                .likeIfPresent(IotShelvesDO::getFactoryName, reqVO.getFactoryName())
+                .eqIfPresent(IotShelvesDO::getCostCenterId, reqVO.getCostCenterId())
+                .eqIfPresent(IotShelvesDO::getCostCenterCode, reqVO.getCostCenterCode())
+                .eqIfPresent(IotShelvesDO::getStorageLocationId, reqVO.getStorageLocationId())
+                .eqIfPresent(IotShelvesDO::getStorageLocationCode, reqVO.getStorageLocationCode())
+                .eqIfPresent(IotShelvesDO::getStorageAreaId, reqVO.getStorageAreaId())
+                .eqIfPresent(IotShelvesDO::getCode, reqVO.getCode())
+                .likeIfPresent(IotShelvesDO::getName, reqVO.getName())
+                .eqIfPresent(IotShelvesDO::getType, reqVO.getType())
+                .eqIfPresent(IotShelvesDO::getSort, reqVO.getSort())
+                .eqIfPresent(IotShelvesDO::getStatus, reqVO.getStatus())
+                .eqIfPresent(IotShelvesDO::getRemark, reqVO.getRemark())
+                .betweenIfPresent(IotShelvesDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(IotShelvesDO::getId));
+    }
+
+}

+ 38 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotstoragearea/IotStorageAreaMapper.java

@@ -0,0 +1,38 @@
+package cn.iocoder.yudao.module.pms.dal.mysql.iotstoragearea;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.pms.controller.admin.iotstoragearea.vo.IotStorageAreaPageReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotstoragearea.IotStorageAreaDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * PMS 库区 Mapper
+ *
+ * @author ruiqi
+ */
+@Mapper
+public interface IotStorageAreaMapper extends BaseMapperX<IotStorageAreaDO> {
+
+    default PageResult<IotStorageAreaDO> selectPage(IotStorageAreaPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<IotStorageAreaDO>()
+                .eqIfPresent(IotStorageAreaDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(IotStorageAreaDO::getFactoryId, reqVO.getFactoryId())
+                .eqIfPresent(IotStorageAreaDO::getFactoryCode, reqVO.getFactoryCode())
+                .likeIfPresent(IotStorageAreaDO::getFactoryName, reqVO.getFactoryName())
+                .eqIfPresent(IotStorageAreaDO::getCostCenterId, reqVO.getCostCenterId())
+                .eqIfPresent(IotStorageAreaDO::getCostCenterCode, reqVO.getCostCenterCode())
+                .eqIfPresent(IotStorageAreaDO::getStorageLocationId, reqVO.getStorageLocationId())
+                .eqIfPresent(IotStorageAreaDO::getStorageLocationCode, reqVO.getStorageLocationCode())
+                .eqIfPresent(IotStorageAreaDO::getCode, reqVO.getCode())
+                .likeIfPresent(IotStorageAreaDO::getName, reqVO.getName())
+                .eqIfPresent(IotStorageAreaDO::getType, reqVO.getType())
+                .eqIfPresent(IotStorageAreaDO::getSort, reqVO.getSort())
+                .eqIfPresent(IotStorageAreaDO::getStatus, reqVO.getStatus())
+                .eqIfPresent(IotStorageAreaDO::getRemark, reqVO.getRemark())
+                .betweenIfPresent(IotStorageAreaDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(IotStorageAreaDO::getId));
+    }
+
+}

+ 55 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotcargolocation/IotCargoLocationService.java

@@ -0,0 +1,55 @@
+package cn.iocoder.yudao.module.pms.service.iotcargolocation;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.pms.controller.admin.iotcargolocation.vo.IotCargoLocationPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotcargolocation.vo.IotCargoLocationSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotcargolocation.IotCargoLocationDO;
+
+import javax.validation.Valid;
+
+/**
+ * PMS 货位 Service 接口
+ *
+ * @author ruiqi
+ */
+public interface IotCargoLocationService {
+
+    /**
+     * 创建PMS 货位
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createIotCargoLocation(@Valid IotCargoLocationSaveReqVO createReqVO);
+
+    /**
+     * 更新PMS 货位
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateIotCargoLocation(@Valid IotCargoLocationSaveReqVO updateReqVO);
+
+    /**
+     * 删除PMS 货位
+     *
+     * @param id 编号
+     */
+    void deleteIotCargoLocation(Long id);
+
+    /**
+     * 获得PMS 货位
+     *
+     * @param id 编号
+     * @return PMS 货位
+     */
+    IotCargoLocationDO getIotCargoLocation(Long id);
+
+    /**
+     * 获得PMS 货位分页
+     *
+     * @param pageReqVO 分页查询
+     * @return PMS 货位分页
+     */
+    PageResult<IotCargoLocationDO> getIotCargoLocationPage(IotCargoLocationPageReqVO pageReqVO);
+
+}

+ 71 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotcargolocation/IotCargoLocationServiceImpl.java

@@ -0,0 +1,71 @@
+package cn.iocoder.yudao.module.pms.service.iotcargolocation;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.pms.controller.admin.iotcargolocation.vo.IotCargoLocationPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotcargolocation.vo.IotCargoLocationSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotcargolocation.IotCargoLocationDO;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotcargolocation.IotCargoLocationMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_CARGO_LOCATION_NOT_EXISTS;
+
+/**
+ * PMS 货位 Service 实现类
+ *
+ * @author ruiqi
+ */
+@Service
+@Validated
+public class IotCargoLocationServiceImpl implements IotCargoLocationService {
+
+    @Resource
+    private IotCargoLocationMapper iotCargoLocationMapper;
+
+    @Override
+    public Long createIotCargoLocation(IotCargoLocationSaveReqVO createReqVO) {
+        // 插入
+        IotCargoLocationDO iotCargoLocation = BeanUtils.toBean(createReqVO, IotCargoLocationDO.class);
+        iotCargoLocationMapper.insert(iotCargoLocation);
+        // 返回
+        return iotCargoLocation.getId();
+    }
+
+    @Override
+    public void updateIotCargoLocation(IotCargoLocationSaveReqVO updateReqVO) {
+        // 校验存在
+        validateIotCargoLocationExists(updateReqVO.getId());
+        // 更新
+        IotCargoLocationDO updateObj = BeanUtils.toBean(updateReqVO, IotCargoLocationDO.class);
+        iotCargoLocationMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteIotCargoLocation(Long id) {
+        // 校验存在
+        validateIotCargoLocationExists(id);
+        // 删除
+        iotCargoLocationMapper.deleteById(id);
+    }
+
+    private void validateIotCargoLocationExists(Long id) {
+        if (iotCargoLocationMapper.selectById(id) == null) {
+            throw exception(IOT_CARGO_LOCATION_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public IotCargoLocationDO getIotCargoLocation(Long id) {
+        return iotCargoLocationMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<IotCargoLocationDO> getIotCargoLocationPage(IotCargoLocationPageReqVO pageReqVO) {
+        return iotCargoLocationMapper.selectPage(pageReqVO);
+    }
+
+}

+ 55 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotshelves/IotShelvesService.java

@@ -0,0 +1,55 @@
+package cn.iocoder.yudao.module.pms.service.iotshelves;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.pms.controller.admin.iotshelves.vo.IotShelvesPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotshelves.vo.IotShelvesSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotshelves.IotShelvesDO;
+
+import javax.validation.Valid;
+
+/**
+ * PMS 货架 Service 接口
+ *
+ * @author ruiqi
+ */
+public interface IotShelvesService {
+
+    /**
+     * 创建PMS 货架
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createIotShelves(@Valid IotShelvesSaveReqVO createReqVO);
+
+    /**
+     * 更新PMS 货架
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateIotShelves(@Valid IotShelvesSaveReqVO updateReqVO);
+
+    /**
+     * 删除PMS 货架
+     *
+     * @param id 编号
+     */
+    void deleteIotShelves(Long id);
+
+    /**
+     * 获得PMS 货架
+     *
+     * @param id 编号
+     * @return PMS 货架
+     */
+    IotShelvesDO getIotShelves(Long id);
+
+    /**
+     * 获得PMS 货架分页
+     *
+     * @param pageReqVO 分页查询
+     * @return PMS 货架分页
+     */
+    PageResult<IotShelvesDO> getIotShelvesPage(IotShelvesPageReqVO pageReqVO);
+
+}

+ 71 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotshelves/IotShelvesServiceImpl.java

@@ -0,0 +1,71 @@
+package cn.iocoder.yudao.module.pms.service.iotshelves;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.pms.controller.admin.iotshelves.vo.IotShelvesPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotshelves.vo.IotShelvesSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotshelves.IotShelvesDO;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotshelves.IotShelvesMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_SHELVES_NOT_EXISTS;
+
+/**
+ * PMS 货架 Service 实现类
+ *
+ * @author ruiqi
+ */
+@Service
+@Validated
+public class IotShelvesServiceImpl implements IotShelvesService {
+
+    @Resource
+    private IotShelvesMapper iotShelvesMapper;
+
+    @Override
+    public Long createIotShelves(IotShelvesSaveReqVO createReqVO) {
+        // 插入
+        IotShelvesDO iotShelves = BeanUtils.toBean(createReqVO, IotShelvesDO.class);
+        iotShelvesMapper.insert(iotShelves);
+        // 返回
+        return iotShelves.getId();
+    }
+
+    @Override
+    public void updateIotShelves(IotShelvesSaveReqVO updateReqVO) {
+        // 校验存在
+        validateIotShelvesExists(updateReqVO.getId());
+        // 更新
+        IotShelvesDO updateObj = BeanUtils.toBean(updateReqVO, IotShelvesDO.class);
+        iotShelvesMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteIotShelves(Long id) {
+        // 校验存在
+        validateIotShelvesExists(id);
+        // 删除
+        iotShelvesMapper.deleteById(id);
+    }
+
+    private void validateIotShelvesExists(Long id) {
+        if (iotShelvesMapper.selectById(id) == null) {
+            throw exception(IOT_SHELVES_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public IotShelvesDO getIotShelves(Long id) {
+        return iotShelvesMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<IotShelvesDO> getIotShelvesPage(IotShelvesPageReqVO pageReqVO) {
+        return iotShelvesMapper.selectPage(pageReqVO);
+    }
+
+}

+ 78 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotstoragearea/IotStorageAreaService.java

@@ -0,0 +1,78 @@
+package cn.iocoder.yudao.module.pms.service.iotstoragearea;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
+import cn.iocoder.yudao.module.pms.controller.admin.iotstoragearea.vo.IotStorageAreaPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotstoragearea.vo.IotStorageAreaSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotstoragearea.IotStorageAreaDO;
+
+import javax.validation.Valid;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * PMS 库区 Service 接口
+ *
+ * @author ruiqi
+ */
+public interface IotStorageAreaService {
+
+    /**
+     * 创建PMS 库区
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createIotStorageArea(@Valid IotStorageAreaSaveReqVO createReqVO);
+
+    /**
+     * 更新PMS 库区
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateIotStorageArea(@Valid IotStorageAreaSaveReqVO updateReqVO);
+
+    /**
+     * 删除PMS 库区
+     *
+     * @param id 编号
+     */
+    void deleteIotStorageArea(Long id);
+
+    /**
+     * 获得PMS 库区
+     *
+     * @param id 编号
+     * @return PMS 库区
+     */
+    IotStorageAreaDO getIotStorageArea(Long id);
+
+    /**
+     * 获得PMS 库区分页
+     *
+     * @param pageReqVO 分页查询
+     * @return PMS 库区分页
+     */
+    PageResult<IotStorageAreaDO> getIotStorageAreaPage(IotStorageAreaPageReqVO pageReqVO);
+
+    /**
+     * 获得库区信息数组
+     *
+     * @param ids 库区编号数组
+     * @return 库区信息数组
+     */
+    List<IotStorageAreaDO> getStorageAreaList(Collection<Long> ids);
+
+    /**
+     * 获得指定编号的库区 Map
+     *
+     * @param ids 库区编号数组
+     * @return 库区 Map
+     */
+    default Map<Long, IotStorageAreaDO> getStorageAreaMap(Collection<Long> ids) {
+        List<IotStorageAreaDO> list = getStorageAreaList(ids);
+        return CollectionUtils.convertMap(list, IotStorageAreaDO::getId);
+    }
+
+}

+ 84 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotstoragearea/IotStorageAreaServiceImpl.java

@@ -0,0 +1,84 @@
+package cn.iocoder.yudao.module.pms.service.iotstoragearea;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.pms.controller.admin.iotstoragearea.vo.IotStorageAreaPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotstoragearea.vo.IotStorageAreaSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotstoragearea.IotStorageAreaDO;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotstoragearea.IotStorageAreaMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_STORAGE_AREA_NOT_EXISTS;
+
+/**
+ * PMS 库区 Service 实现类
+ *
+ * @author ruiqi
+ */
+@Service
+@Validated
+public class IotStorageAreaServiceImpl implements IotStorageAreaService {
+
+    @Resource
+    private IotStorageAreaMapper iotStorageAreaMapper;
+
+    @Override
+    public Long createIotStorageArea(IotStorageAreaSaveReqVO createReqVO) {
+        // 插入
+        IotStorageAreaDO iotStorageArea = BeanUtils.toBean(createReqVO, IotStorageAreaDO.class);
+        iotStorageAreaMapper.insert(iotStorageArea);
+        // 返回
+        return iotStorageArea.getId();
+    }
+
+    @Override
+    public void updateIotStorageArea(IotStorageAreaSaveReqVO updateReqVO) {
+        // 校验存在
+        validateIotStorageAreaExists(updateReqVO.getId());
+        // 更新
+        IotStorageAreaDO updateObj = BeanUtils.toBean(updateReqVO, IotStorageAreaDO.class);
+        iotStorageAreaMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteIotStorageArea(Long id) {
+        // 校验存在
+        validateIotStorageAreaExists(id);
+        // 删除
+        iotStorageAreaMapper.deleteById(id);
+    }
+
+    private void validateIotStorageAreaExists(Long id) {
+        if (iotStorageAreaMapper.selectById(id) == null) {
+            throw exception(IOT_STORAGE_AREA_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public IotStorageAreaDO getIotStorageArea(Long id) {
+        return iotStorageAreaMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<IotStorageAreaDO> getIotStorageAreaPage(IotStorageAreaPageReqVO pageReqVO) {
+        return iotStorageAreaMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public List<IotStorageAreaDO> getStorageAreaList(Collection<Long> ids) {
+        if (CollUtil.isEmpty(ids)) {
+            return Collections.emptyList();
+        }
+        return iotStorageAreaMapper.selectBatchIds(ids);
+    }
+
+}

+ 36 - 0
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/saporg/SapOrgApi.java

@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.system.api.saporg;
+
+import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
+import cn.iocoder.yudao.module.system.api.saporg.dto.SapOrgRespDTO;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Sap 组织部门 API 接口
+ *
+ * @author ruiqi
+ */
+public interface SapOrgApi {
+
+    /**
+     * 获得 sap org 信息数组
+     *
+     * @param ids sap org 编号数组
+     * @return sap org信息数组
+     */
+    List<SapOrgRespDTO> getSapOrgList(Collection<Long> ids);
+
+    /**
+     * 获得指定编号的 sap org Map
+     *
+     * @param ids sap org 编号数组
+     * @return sap org Map
+     */
+    default Map<Long, SapOrgRespDTO> getSapOrgMap(Collection<Long> ids) {
+        List<SapOrgRespDTO> list = getSapOrgList(ids);
+        return CollectionUtils.convertMap(list, SapOrgRespDTO::getId);
+    }
+
+}

+ 80 - 0
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/saporg/dto/SapOrgRespDTO.java

@@ -0,0 +1,80 @@
+package cn.iocoder.yudao.module.system.api.saporg.dto;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * sap org Response DTO
+ *
+ * @author ruiqi
+ */
+@Data
+public class SapOrgRespDTO {
+
+    /**
+     * 部门编号
+     */
+    private Long id;
+
+    /**
+     * 部门编号
+     */
+    private String factoryCode;
+
+    /**
+     * 部门编号
+     */
+    private String factoryName;
+
+    /**
+     * 部门编号
+     */
+    private String costCenterCode;
+
+    /**
+     * 部门编号
+     */
+    private String costCenterName;
+
+    /**
+     * 部门编号
+     */
+    private String storageLocationCode;
+
+    /**
+     * 部门编号
+     */
+    private String storageLocationName;
+
+    /**
+     * 部门编号
+     */
+    private Integer type;
+
+    /**
+     * 部门编号
+     */
+    private String responsiblePerson;
+
+    /**
+     * 部门编号
+     */
+    private Integer sort;
+
+    /**
+     * 部门编号
+     */
+    private Integer status;
+
+    /**
+     * 部门编号
+     */
+    private String remark;
+
+    /**
+     * 部门编号
+     */
+    private LocalDateTime createTime;
+
+}

+ 30 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/saporg/SapOrgApiImpl.java

@@ -0,0 +1,30 @@
+package cn.iocoder.yudao.module.system.api.saporg;
+
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.system.api.saporg.dto.SapOrgRespDTO;
+import cn.iocoder.yudao.module.system.dal.dataobject.saporg.SapOrgDO;
+import cn.iocoder.yudao.module.system.service.saporg.SapOrgService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * sap org API 实现类
+ *
+ * @author ruiqi
+ */
+@Service
+public class SapOrgApiImpl implements SapOrgApi {
+
+    @Resource
+    private SapOrgService sapOrgService;
+
+    @Override
+    public List<SapOrgRespDTO> getSapOrgList(Collection<Long> ids) {
+        List<SapOrgDO> sapOrgs = sapOrgService.getSapOrgList(ids);
+        return BeanUtils.toBean(sapOrgs, SapOrgRespDTO.class);
+    }
+
+}

+ 21 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/saporg/SapOrgService.java

@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.module.system.service.saporg;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 import cn.iocoder.yudao.module.system.controller.admin.saporg.vo.SapOrgPageReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.saporg.vo.SapOrgSaveReqVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.saporg.SapOrgDO;
@@ -9,6 +10,7 @@ import org.springframework.lang.Nullable;
 import javax.validation.Valid;
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
 /**
  * SAP中的组织主数据(工厂 成本中心) Service 接口
@@ -66,4 +68,23 @@ public interface SapOrgService {
     List<SapOrgDO> getSapOrgList(@Nullable Collection<Long> ids,
                              @Nullable Integer type,
                              @Nullable Collection<Integer> statuses);
+
+    /**
+     * 获得指定编号的SAP组织 Map
+     *
+     * @param ids SAP组织编号数组
+     * @return SAP组织 Map
+     */
+    default Map<Long, SapOrgDO> getSapOrgMap(Collection<Long> ids) {
+        List<SapOrgDO> list = getSapOrgList(ids);
+        return CollectionUtils.convertMap(list, SapOrgDO::getId);
+    }
+
+    /**
+     * 获得SAP组织信息数组
+     *
+     * @param ids SAP组织编号数组
+     * @return SAP组织信息数组
+     */
+    List<SapOrgDO> getSapOrgList(Collection<Long> ids);
 }

+ 10 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/saporg/SapOrgServiceImpl.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.system.service.saporg;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.system.controller.admin.saporg.vo.SapOrgPageReqVO;
@@ -11,6 +12,7 @@ import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -75,4 +77,12 @@ public class SapOrgServiceImpl implements SapOrgService {
         return sapOrgMapper.selectList(ids, type, statuses);
     }
 
+    @Override
+    public List<SapOrgDO> getSapOrgList(Collection<Long> ids) {
+        if (CollUtil.isEmpty(ids)) {
+            return Collections.emptyList();
+        }
+        return sapOrgMapper.selectBatchIds(ids);
+    }
+
 }