Quellcode durchsuchen

pms功能优化 本地库存

zhangcl vor 4 Monaten
Ursprung
Commit
04ca6c64fd
16 geänderte Dateien mit 439 neuen und 1 gelöschten Zeilen
  1. 29 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotlockstock/IotLockStockController.java
  2. 55 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotlockstock/vo/IotLockStockMaterialSaveReqVO.java
  3. 13 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotlockstock/vo/IotLockStockPageReqVO.java
  4. 19 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotlockstock/vo/IotLockStockRespVO.java
  5. 13 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotlockstock/vo/IotLockStockSaveReqVO.java
  6. 35 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/convert/iotlockstock/IotLockStockConvert.java
  7. 24 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotlockstock/IotLockStockDO.java
  8. 6 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotlockstock/IotLockStockMapper.java
  9. 8 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotlockstock/IotLockStockService.java
  10. 56 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotlockstock/IotLockStockServiceImpl.java
  11. 22 0
      yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dept/DeptSapOrgApi.java
  12. 61 0
      yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dept/SapOrgApi.java
  13. 50 0
      yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dept/dto/DeptSapOrgRespDTO.java
  14. 32 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/dept/DeptSapOrgApiImpl.java
  15. 9 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/deptsaporg/DeptSapOrgService.java
  16. 7 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/deptsaporg/DeptSapOrgServiceImpl.java

+ 29 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotlockstock/IotLockStockController.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.pms.controller.admin.iotlockstock;
 
+import cn.hutool.core.collection.CollUtil;
 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;
@@ -9,8 +10,13 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.iotlockstock.vo.IotLockStockPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotlockstock.vo.IotLockStockRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotlockstock.vo.IotLockStockSaveReqVO;
+import cn.iocoder.yudao.module.pms.convert.iotlockstock.IotLockStockConvert;
+import cn.iocoder.yudao.module.pms.convert.shelves.IotShelvesConvert;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotlockstock.IotLockStockDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotshelves.IotShelvesDO;
 import cn.iocoder.yudao.module.pms.service.iotlockstock.IotLockStockService;
+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;
@@ -23,9 +29,13 @@ 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.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
+import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_LOCK_STOCK_NOT_EXISTS;
 
 @Tag(name = "管理后台 - PMS 本地 库存")
 @RestController
@@ -35,6 +45,8 @@ public class IotLockStockController {
 
     @Resource
     private IotLockStockService iotLockStockService;
+    @Resource
+    private SapOrgApi sapOrgApi;
 
     @PostMapping("/create")
     @Operation(summary = "创建PMS 本地 库存")
@@ -43,6 +55,16 @@ public class IotLockStockController {
         return success(iotLockStockService.createIotLockStock(createReqVO));
     }
 
+    @PostMapping("/manualWarehouse")
+    @Operation(summary = "手动新增入库")
+    @PreAuthorize("@ss.hasPermission('pms:iot-lock-stock:create')")
+    public CommonResult<Long> manualWarehouse(@Valid @RequestBody List<IotLockStockSaveReqVO> reqVO) {
+        if (CollUtil.isEmpty(reqVO)) {
+            throw exception(IOT_LOCK_STOCK_NOT_EXISTS);
+        }
+        return success(iotLockStockService.manualWarehouse(reqVO));
+    }
+
     @PutMapping("/update")
     @Operation(summary = "更新PMS 本地 库存")
     @PreAuthorize("@ss.hasPermission('pms:iot-lock-stock:update')")
@@ -74,7 +96,13 @@ public class IotLockStockController {
     @PreAuthorize("@ss.hasPermission('pms:iot-lock-stock:query')")
     public CommonResult<PageResult<IotLockStockRespVO>> getIotLockStockPage(@Valid IotLockStockPageReqVO pageReqVO) {
         PageResult<IotLockStockDO> pageResult = iotLockStockService.getIotLockStockPage(pageReqVO);
-        return success(BeanUtils.toBean(pageResult, IotLockStockRespVO.class));
+        // 拼接 工厂 成本中心 库存地点
+        Map<Long, SapOrgRespDTO> factoryMap = sapOrgApi.getSapOrgMap(
+                convertList(pageResult.getList(), IotLockStockDO::getFactoryId));
+        Map<Long, SapOrgRespDTO> costCenterMap = sapOrgApi.getSapOrgMap(
+                convertList(pageResult.getList(), IotLockStockDO::getCostCenterId));
+        return success(new PageResult<>(IotLockStockConvert.INSTANCE.convertList(pageResult.getList(), factoryMap, costCenterMap),
+                pageResult.getTotal()));
     }
 
     @GetMapping("/export-excel")

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

@@ -0,0 +1,55 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotlockstock.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - PMS 功能优化 手动新增入库 Request VO")
+@Data
+public class IotLockStockMaterialSaveReqVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "8816")
+    private Long id;
+
+    @Schema(description = "物料组id", example = "14786")
+    private Long materialGroupId;
+
+    @Schema(description = "BOM叶子节点", example = "10893")
+    private Long bomId;
+
+    @Schema(description = "物料类型 ROH原材料 FERT成品 HALB半成品", example = "1")
+    private String type;
+
+    @Schema(description = "物料编码")
+    private String code;
+
+    @Schema(description = "物料名称", example = "芋艿")
+    private String name;
+
+    @Schema(description = "规格型号")
+    private String model;
+
+    @Schema(description = "单位 字典表")
+    private String unit;
+
+    @Schema(description = "数量")
+    private BigDecimal quantity;
+
+    @Schema(description = "单价", example = "5632")
+    private BigDecimal unitPrice;
+
+    @Schema(description = "SAP系统中的物料唯一编号")
+    private String sapCode;
+
+    @Schema(description = "排序")
+    private Integer sort;
+
+    @Schema(description = "状态 0启用  1停用", example = "2")
+    private Integer status;
+
+    @Schema(description = "备注", example = "你说的对")
+    private String remark;
+
+}

+ 13 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotlockstock/vo/IotLockStockPageReqVO.java

@@ -21,12 +21,18 @@ public class IotLockStockPageReqVO extends PageParam {
     @Schema(description = "组织部门id", example = "4517")
     private Long deptId;
 
+    @Schema(description = "工厂 SAP id", example = "4517")
+    private Long factoryId;
     @Schema(description = "工厂(SAP) 专业公司")
     private String factory;
 
+    @Schema(description = "库存地点 SAP id", example = "4517")
+    private Long storageLocationId;
     @Schema(description = "库存地点 - SAP 部门 项目部级")
     private String projectDepartment;
 
+    @Schema(description = "成本中心 SAP id", example = "4517")
+    private Long costCenterId;
     @Schema(description = "成本中心(SAP) 库存地点 小队")
     private String costCenter;
 
@@ -58,6 +64,13 @@ public class IotLockStockPageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] storageTime;
 
+    @Schema(description = "库区id", example = "23371")
+    private Long storageAreaId;
+    @Schema(description = "货架id", example = "23371")
+    private Long shelvesId;
+    @Schema(description = "货位id", example = "23371")
+    private Long cargoLocationId;
+
     @Schema(description = "排序")
     private Integer sort;
 

+ 19 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotlockstock/vo/IotLockStockRespVO.java

@@ -21,14 +21,23 @@ public class IotLockStockRespVO {
     @ExcelProperty("组织部门id")
     private Long deptId;
 
+    @Schema(description = "工厂id", example = "4517")
+    @ExcelProperty("工厂id")
+    private Long factoryId;
     @Schema(description = "工厂(SAP) 专业公司")
     @ExcelProperty("工厂(SAP) 专业公司")
     private String factory;
 
+    @Schema(description = "库存地点id", example = "4517")
+    @ExcelProperty("库存地点id")
+    private Long storageLocationId;
     @Schema(description = "库存地点 - SAP 部门 项目部级")
     @ExcelProperty("库存地点 - SAP 部门 项目部级")
     private String projectDepartment;
 
+    @Schema(description = "成本中心id", example = "4517")
+    @ExcelProperty("成本中心id")
+    private Long costCenterId;
     @Schema(description = "成本中心(SAP) 库存地点 小队")
     @ExcelProperty("成本中心(SAP) 库存地点 小队")
     private String costCenter;
@@ -69,6 +78,16 @@ public class IotLockStockRespVO {
     @ExcelProperty("入库时间")
     private LocalDateTime storageTime;
 
+    @Schema(description = "库区id", example = "4517")
+    @ExcelProperty("库区id")
+    private Long storageAreaId;
+    @Schema(description = "货架id", example = "4517")
+    @ExcelProperty("货架id")
+    private Long shelvesId;
+    @Schema(description = "货位id", example = "4517")
+    @ExcelProperty("货位id")
+    private Long cargoLocationId;
+
     @Schema(description = "排序")
     @ExcelProperty("排序")
     private Integer sort;

+ 13 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotlockstock/vo/IotLockStockSaveReqVO.java

@@ -16,12 +16,18 @@ public class IotLockStockSaveReqVO {
     @Schema(description = "组织部门id", example = "4517")
     private Long deptId;
 
+    @Schema(description = "工厂id", example = "4517")
+    private Long factoryId;
     @Schema(description = "工厂(SAP) 专业公司")
     private String factory;
 
+    @Schema(description = "库存地点id", example = "4517")
+    private Long storageLocationId;
     @Schema(description = "库存地点 - SAP 部门 项目部级")
     private String projectDepartment;
 
+    @Schema(description = "成本中心id", example = "4517")
+    private Long costCenterId;
     @Schema(description = "成本中心(SAP) 库存地点 小队")
     private String costCenter;
 
@@ -52,6 +58,13 @@ public class IotLockStockSaveReqVO {
     @Schema(description = "入库时间")
     private LocalDateTime storageTime;
 
+    @Schema(description = "库区id", example = "4517")
+    private Long storageAreaId;
+    @Schema(description = "货架id", example = "4517")
+    private Long shelvesId;
+    @Schema(description = "货位id", example = "4517")
+    private Long cargoLocationId;
+
     @Schema(description = "排序")
     private Integer sort;
 

+ 35 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/convert/iotlockstock/IotLockStockConvert.java

@@ -0,0 +1,35 @@
+package cn.iocoder.yudao.module.pms.convert.iotlockstock;
+
+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.iotlockstock.vo.IotLockStockRespVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotlockstock.IotLockStockDO;
+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 IotLockStockConvert {
+
+    IotLockStockConvert INSTANCE = Mappers.getMapper(IotLockStockConvert.class);
+
+    default List<IotLockStockRespVO> convertList(List<IotLockStockDO> list, Map<Long, SapOrgRespDTO> factoryMap, Map<Long, SapOrgRespDTO> costCenterMap) {
+        return CollectionUtils.convertList(list, lockStock -> convert1(lockStock, factoryMap.get(lockStock.getFactoryId()),
+                costCenterMap.get(lockStock.getCostCenterId())));
+    }
+
+    default IotLockStockRespVO convert1(IotLockStockDO lockStock, SapOrgRespDTO factory, SapOrgRespDTO costCenter) {
+        IotLockStockRespVO lockStockVO = BeanUtils.toBean(lockStock, IotLockStockRespVO.class);
+        if (factory != null) {
+            lockStockVO.setFactory(factory.getFactoryName());
+        }
+        if (costCenter != null) {
+            lockStockVO.setCostCenter(costCenter.getCostCenterName());
+        }
+        return lockStockVO;
+    }
+
+}

+ 24 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotlockstock/IotLockStockDO.java

@@ -33,14 +33,26 @@ public class IotLockStockDO extends BaseDO {
      * 组织部门id
      */
     private Long deptId;
+    /**
+     * 工厂 SAP id
+     */
+    private Long factoryId;
     /**
      * 工厂(SAP) 专业公司
      */
     private String factory;
+    /**
+     * 库存地点 SAP id
+     */
+    private Long storageLocationId;
     /**
      * 库存地点 - SAP 部门 项目部级
      */
     private String projectDepartment;
+    /**
+     * 成本中心 SAP id
+     */
+    private Long costCenterId;
     /**
      * 成本中心(SAP) 库存地点 小队
      */
@@ -81,6 +93,18 @@ public class IotLockStockDO extends BaseDO {
      * 入库时间
      */
     private LocalDateTime storageTime;
+    /**
+     * 库区id
+     */
+    private Long storageAreaId;
+    /**
+     * 货架id
+     */
+    private Long shelvesId;
+    /**
+     * 货位id
+     */
+    private Long cargoLocationId;
     /**
      * 排序
      */

+ 6 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotlockstock/IotLockStockMapper.java

@@ -18,8 +18,11 @@ public interface IotLockStockMapper extends BaseMapperX<IotLockStockDO> {
     default PageResult<IotLockStockDO> selectPage(IotLockStockPageReqVO reqVO) {
         return selectPage(reqVO, new LambdaQueryWrapperX<IotLockStockDO>()
                 .eqIfPresent(IotLockStockDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(IotLockStockDO::getFactoryId, reqVO.getFactoryId())
                 .eqIfPresent(IotLockStockDO::getFactory, reqVO.getFactory())
+                .eqIfPresent(IotLockStockDO::getStorageLocationId, reqVO.getStorageLocationId())
                 .eqIfPresent(IotLockStockDO::getProjectDepartment, reqVO.getProjectDepartment())
+                .eqIfPresent(IotLockStockDO::getCostCenterId, reqVO.getCostCenterId())
                 .eqIfPresent(IotLockStockDO::getCostCenter, reqVO.getCostCenter())
                 .eqIfPresent(IotLockStockDO::getPickingListNumber, reqVO.getPickingListNumber())
                 .eqIfPresent(IotLockStockDO::getMaterialCode, reqVO.getMaterialCode())
@@ -30,6 +33,9 @@ public interface IotLockStockMapper extends BaseMapperX<IotLockStockDO> {
                 .eqIfPresent(IotLockStockDO::getUnitPrice, reqVO.getUnitPrice())
                 .eqIfPresent(IotLockStockDO::getUnit, reqVO.getUnit())
                 .betweenIfPresent(IotLockStockDO::getStorageTime, reqVO.getStorageTime())
+                .eqIfPresent(IotLockStockDO::getStorageAreaId, reqVO.getStorageAreaId())
+                .eqIfPresent(IotLockStockDO::getShelvesId, reqVO.getShelvesId())
+                .eqIfPresent(IotLockStockDO::getCargoLocationId, reqVO.getCargoLocationId())
                 .eqIfPresent(IotLockStockDO::getSort, reqVO.getSort())
                 .eqIfPresent(IotLockStockDO::getStatus, reqVO.getStatus())
                 .eqIfPresent(IotLockStockDO::getProcessInstanceId, reqVO.getProcessInstanceId())

+ 8 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotlockstock/IotLockStockService.java

@@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotlockstock.vo.IotLockStock
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotlockstock.IotLockStockDO;
 
 import javax.validation.Valid;
+import java.util.List;
 
 /**
  * PMS 本地 库存 Service 接口
@@ -52,4 +53,11 @@ public interface IotLockStockService {
      */
     PageResult<IotLockStockDO> getIotLockStockPage(IotLockStockPageReqVO pageReqVO);
 
+    /**
+     * 手动添加入库
+     *
+     * @param createReqVO 入库物料列表
+     * @return 入库物料记录数
+     */
+    Long manualWarehouse(List<IotLockStockSaveReqVO> createReqVO);
 }

+ 56 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotlockstock/IotLockStockServiceImpl.java

@@ -1,15 +1,26 @@
 package cn.iocoder.yudao.module.pms.service.iotlockstock;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.iotlockstock.vo.IotLockStockPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotlockstock.vo.IotLockStockSaveReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotlockstock.IotLockStockDO;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotlockstock.IotLockStockMapper;
+import cn.iocoder.yudao.module.system.api.dept.DeptSapOrgApi;
+import cn.iocoder.yudao.module.system.api.dept.dto.DeptSapOrgRespDTO;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Date;
+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_LOCK_STOCK_NOT_EXISTS;
@@ -25,6 +36,10 @@ public class IotLockStockServiceImpl implements IotLockStockService {
 
     @Resource
     private IotLockStockMapper iotLockStockMapper;
+    @Resource
+    private AdminUserApi adminUserApi;
+    @Resource
+    private DeptSapOrgApi deptSapOrgApi;
 
     @Override
     public Long createIotLockStock(IotLockStockSaveReqVO createReqVO) {
@@ -68,4 +83,45 @@ public class IotLockStockServiceImpl implements IotLockStockService {
         return iotLockStockMapper.selectPage(pageReqVO);
     }
 
+    @Override
+    public Long manualWarehouse(List<IotLockStockSaveReqVO> createReqVO) {
+        // 查询当前登录人所属组织 关联的工厂 库存地点 成本中心
+        Long userId = SecurityFrameworkUtils.getLoginUserId();
+        AdminUserRespDTO user = adminUserApi.getUser(userId);
+        Long deptId = user.getDeptId();
+        List<DeptSapOrgRespDTO> deptSapOrgs = deptSapOrgApi.getDeptSapOrgList(deptId);
+        List<Long> factoryIds = new ArrayList<>();
+        List<Long> costCenterIds = new ArrayList<>();
+        List<Long> storageLocationIds = new ArrayList<>();
+        // 遍历数组 获得 工厂 成本中心
+        deptSapOrgs.forEach(sapOrg -> {
+            if (ObjectUtil.isNotNull(sapOrg.getFactoryId())) {
+                factoryIds.add(sapOrg.getFactoryId());
+            }
+            if (ObjectUtil.isNotNull(sapOrg.getCostCenterId())) {
+                costCenterIds.add(sapOrg.getCostCenterId());
+            }
+            if (ObjectUtil.isNotNull(sapOrg.getStockLocationId())) {
+                storageLocationIds.add(sapOrg.getStockLocationId());
+            }
+        });
+        // 保存入库数据
+        createReqVO.forEach(req -> {
+            req.setDeptId(deptId);
+            if (CollUtil.isNotEmpty(factoryIds)) {
+                req.setFactoryId(factoryIds.get(0));
+            }
+            if (CollUtil.isNotEmpty(costCenterIds)) {
+                req.setCostCenterId(costCenterIds.get(0));
+            }
+            if (CollUtil.isNotEmpty(storageLocationIds)) {
+                req.setStorageLocationId(storageLocationIds.get(0));
+            }
+            req.setStorageTime(LocalDateTime.now());
+        });
+        List<IotLockStockDO> lockStockDOS = BeanUtils.toBean(createReqVO, IotLockStockDO.class);
+        iotLockStockMapper.insertBatch(lockStockDOS);
+        return 0l;
+    }
+
 }

+ 22 - 0
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dept/DeptSapOrgApi.java

@@ -0,0 +1,22 @@
+package cn.iocoder.yudao.module.system.api.dept;
+
+import cn.iocoder.yudao.module.system.api.dept.dto.DeptSapOrgRespDTO;
+
+import java.util.List;
+
+/**
+ * dept 与 SAP 组织主数据 关联关系 API 接口
+ *
+ * @author ruiqi
+ */
+public interface DeptSapOrgApi {
+
+    /**
+     * 根据部门id 查询 部门 关联 的 SAP组织主数据
+     *
+     * @param id 部门编号
+     * @return 部门 关联 的 SAP组织主数据
+     */
+    List<DeptSapOrgRespDTO> getDeptSapOrgList(Long id);
+
+}

+ 61 - 0
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dept/SapOrgApi.java

@@ -0,0 +1,61 @@
+package cn.iocoder.yudao.module.system.api.dept;
+
+import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
+import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * SAP 组织主数据 API 接口
+ *
+ * @author ruiqi
+ */
+public interface SapOrgApi {
+    DeptRespDTO getDeptNoPermission(Long id);
+    /**
+     * 获得部门信息
+     *
+     * @param id 部门编号
+     * @return 部门信息
+     */
+    DeptRespDTO getDept(Long id);
+
+    /**
+     * 获得部门信息数组
+     *
+     * @param ids 部门编号数组
+     * @return 部门信息数组
+     */
+    List<DeptRespDTO> getDeptList(Collection<Long> ids);
+
+    /**
+     * 校验部门们是否有效。如下情况,视为无效:
+     * 1. 部门编号不存在
+     * 2. 部门被禁用
+     *
+     * @param ids 角色编号数组
+     */
+    void validateDeptList(Collection<Long> ids);
+
+    /**
+     * 获得指定编号的部门 Map
+     *
+     * @param ids 部门编号数组
+     * @return 部门 Map
+     */
+    default Map<Long, DeptRespDTO> getDeptMap(Collection<Long> ids) {
+        List<DeptRespDTO> list = getDeptList(ids);
+        return CollectionUtils.convertMap(list, DeptRespDTO::getId);
+    }
+
+    /**
+     * 获得指定部门的所有子部门
+     *
+     * @param id 部门编号
+     * @return 子部门列表
+     */
+    List<DeptRespDTO> getChildDeptList(Long id);
+
+}

+ 50 - 0
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dept/dto/DeptSapOrgRespDTO.java

@@ -0,0 +1,50 @@
+package cn.iocoder.yudao.module.system.api.dept.dto;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 部门 与 SAP 组织主数据 关联关系 Response DTO
+ *
+ * @author ruiqi
+ */
+@Data
+public class DeptSapOrgRespDTO {
+
+    /**
+     * id
+     */
+    private Long id;
+
+    /**
+     * 组织部门id
+     */
+    private Long deptId;
+
+    /**
+     * SAP组织id(工厂/成本中心)
+     */
+    private Long sapOrgId;
+
+    /**
+     * SAP工厂id
+     */
+    private Long factoryId;
+
+    /**
+     * SAP成本中心id
+     */
+    private Long costCenterId;
+
+    /**
+     * SAP库存地点id
+     */
+    private Long stockLocationId;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+}

+ 32 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/dept/DeptSapOrgApiImpl.java

@@ -0,0 +1,32 @@
+package cn.iocoder.yudao.module.system.api.dept;
+
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.system.api.dept.dto.DeptSapOrgRespDTO;
+import cn.iocoder.yudao.module.system.controller.admin.deptsaporg.vo.DeptSapOrgPageReqVO;
+import cn.iocoder.yudao.module.system.dal.dataobject.deptsaporg.DeptSapOrgDO;
+import cn.iocoder.yudao.module.system.service.deptsaporg.DeptSapOrgService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 部门 关联的 SAP 组织主数据 API 实现类
+ *
+ * @author ruiqi
+ */
+@Service
+public class DeptSapOrgApiImpl implements DeptSapOrgApi {
+
+    @Resource
+    private DeptSapOrgService deptSapOrgService;
+
+
+    @Override
+    public List<DeptSapOrgRespDTO> getDeptSapOrgList(Long id) {
+        DeptSapOrgPageReqVO reqVO = new DeptSapOrgPageReqVO();
+        reqVO.setDeptId(id);
+        List<DeptSapOrgDO> deptSapOrgDOS = deptSapOrgService.getDeptSapOrgList(reqVO);
+        return BeanUtils.toBean(deptSapOrgDOS, DeptSapOrgRespDTO.class);
+    }
+}

+ 9 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/deptsaporg/DeptSapOrgService.java

@@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.system.controller.admin.deptsaporg.vo.DeptSapOrgS
 import cn.iocoder.yudao.module.system.dal.dataobject.deptsaporg.DeptSapOrgDO;
 
 import javax.validation.Valid;
+import java.util.List;
 
 /**
  * PMS 组织部门与SAP工厂/成本中心 对应关系 Service 接口
@@ -52,4 +53,12 @@ public interface DeptSapOrgService {
      */
     PageResult<DeptSapOrgDO> getDeptSapOrgPage(DeptSapOrgPageReqVO pageReqVO);
 
+    /**
+     * 获得PMS 组织部门与SAP工厂/成本中心 对应关系列表
+     *
+     * @param reqVO 列表查询
+     * @return PMS 组织部门与SAP工厂/成本中心 对应关系 列表
+     */
+    List<DeptSapOrgDO> getDeptSapOrgList(DeptSapOrgPageReqVO reqVO);
+
 }

+ 7 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/deptsaporg/DeptSapOrgServiceImpl.java

@@ -11,6 +11,8 @@ import org.springframework.validation.annotation.Validated;
 
 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.DEPT_SAP_ORG_NOT_EXISTS;
 
@@ -68,4 +70,9 @@ public class DeptSapOrgServiceImpl implements DeptSapOrgService {
         return deptSapOrgMapper.selectPage(pageReqVO);
     }
 
+    @Override
+    public List<DeptSapOrgDO> getDeptSapOrgList(DeptSapOrgPageReqVO reqVO) {
+        return deptSapOrgMapper.selectListByDeptId(reqVO.getDeptId());
+    }
+
 }