Bläddra i källkod

pms功能优化 组织部门与 SAP工厂/成本中心/库存地点关联

zhangcl 4 månader sedan
förälder
incheckning
c60dcfa082
14 ändrade filer med 253 tillägg och 3 borttagningar
  1. 10 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptRespVO.java
  2. 10 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptSaveReqVO.java
  3. 9 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/deptsaporg/vo/DeptSapOrgPageReqVO.java
  4. 12 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/deptsaporg/vo/DeptSapOrgRespVO.java
  5. 12 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/deptsaporg/vo/DeptSapOrgSaveReqVO.java
  6. 15 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/saporg/SapOrgController.java
  7. 39 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/saporg/vo/SapOrgSimpleRespVO.java
  8. 6 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/DeptDO.java
  9. 12 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/deptsaporg/DeptSapOrgDO.java
  10. 25 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/deptsaporg/DeptSapOrgMapper.java
  11. 11 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/saporg/SapOrgMapper.java
  12. 71 2
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java
  13. 14 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/saporg/SapOrgService.java
  14. 7 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/saporg/SapOrgServiceImpl.java

+ 10 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptRespVO.java

@@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import java.time.LocalDateTime;
+import java.util.Set;
 
 @Schema(description = "管理后台 - 部门信息 Response VO")
 @Data
@@ -33,6 +34,15 @@ public class DeptRespVO {
     @Schema(description = "状态,见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     private Integer status;
 
+    @Schema(description = "工厂(SAP)编号数组", example = "6006,6005")
+    private Set<Long> factoryIds;
+
+    @Schema(description = "成本中心(SAP)编号数组", example = "6006F,6005F")
+    private Set<Long> costCenterIds;
+
+    @Schema(description = "库存地点(SAP)编号数组", example = "3001,3004")
+    private Set<Long> stockLocationIds;
+
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式")
     private LocalDateTime createTime;
 

+ 10 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/vo/dept/DeptSaveReqVO.java

@@ -9,6 +9,7 @@ import javax.validation.constraints.Email;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Size;
+import java.util.Set;
 
 @Schema(description = "管理后台 - 部门创建/修改 Request VO")
 @Data
@@ -41,6 +42,15 @@ public class DeptSaveReqVO {
     @Size(max = 50, message = "邮箱长度不能超过 50 个字符")
     private String email;
 
+    @Schema(description = "工厂(SAP)编号数组", example = "1")
+    private Set<Long> factoryIds;
+
+    @Schema(description = "成本中心(SAP)编号数组", example = "1")
+    private Set<Long> costCenterIds;
+
+    @Schema(description = "库存地点(SAP)编号数组", example = "1")
+    private Set<Long> stockLocationIds;
+
     @Schema(description = "状态,见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     @NotNull(message = "状态不能为空")
     @InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}")

+ 9 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/deptsaporg/vo/DeptSapOrgPageReqVO.java

@@ -23,6 +23,15 @@ public class DeptSapOrgPageReqVO extends PageParam {
     @Schema(description = "SAP组织id(工厂/成本中心)", example = "32319")
     private Long sapOrgId;
 
+    @Schema(description = "SAP工厂id", example = "32319")
+    private Long factoryId;
+
+    @Schema(description = "SAP成本中心id", example = "32319")
+    private Long costCenterId;
+
+    @Schema(description = "SAP库存地点id", example = "32319")
+    private Long stockLocationId;
+
     @Schema(description = "创建时间")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;

+ 12 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/deptsaporg/vo/DeptSapOrgRespVO.java

@@ -24,6 +24,18 @@ public class DeptSapOrgRespVO {
     @ExcelProperty("SAP组织id(工厂/成本中心)")
     private Long sapOrgId;
 
+    @Schema(description = "SAP工厂id", requiredMode = Schema.RequiredMode.REQUIRED, example = "32319")
+    @ExcelProperty("SAP工厂id")
+    private Long factoryId;
+
+    @Schema(description = "SAP成本中心id", requiredMode = Schema.RequiredMode.REQUIRED, example = "32319")
+    @ExcelProperty("SAP成本中心id")
+    private Long costCenterId;
+
+    @Schema(description = "SAP库存地点id", requiredMode = Schema.RequiredMode.REQUIRED, example = "32319")
+    @ExcelProperty("SAP库存地点id")
+    private Long stockLocationId;
+
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;

+ 12 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/deptsaporg/vo/DeptSapOrgSaveReqVO.java

@@ -20,4 +20,16 @@ public class DeptSapOrgSaveReqVO {
     @NotNull(message = "SAP组织id(工厂/成本中心)不能为空")
     private Long sapOrgId;
 
+    @Schema(description = "SAP工厂id", requiredMode = Schema.RequiredMode.REQUIRED, example = "32319")
+    @NotNull(message = "SAP工厂id")
+    private Long factoryId;
+
+    @Schema(description = "SAP成本中心id", requiredMode = Schema.RequiredMode.REQUIRED, example = "32319")
+    @NotNull(message = "SAP成本中心id")
+    private Long costCenterId;
+
+    @Schema(description = "SAP库存地点id", requiredMode = Schema.RequiredMode.REQUIRED, example = "32319")
+    @NotNull(message = "SAP库存地点id")
+    private Long stockLocationId;
+
 }

+ 15 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/saporg/SapOrgController.java

@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.module.system.controller.admin.saporg;
 
 import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
@@ -9,6 +10,7 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.module.system.controller.admin.saporg.vo.SapOrgPageReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.saporg.vo.SapOrgRespVO;
 import cn.iocoder.yudao.module.system.controller.admin.saporg.vo.SapOrgSaveReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.saporg.vo.SapOrgSimpleRespVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.saporg.SapOrgDO;
 import cn.iocoder.yudao.module.system.service.saporg.SapOrgService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -22,6 +24,8 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.io.IOException;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 
 import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
@@ -77,6 +81,17 @@ public class SapOrgController {
         return success(BeanUtils.toBean(pageResult, SapOrgRespVO.class));
     }
 
+    @GetMapping(value = {"/list-all-simple", "simple-list"})
+    @Parameter(name = "type", description = "类型", required = true, example = "1工厂 2成本中心 3库存地点")
+    @Operation(summary = "获取SAP工厂/成本中心/库存地点全列表", description = "只包含被开启的数据,主要用于前端的下拉选项")
+    public CommonResult<List<SapOrgSimpleRespVO>> getSimpleSapOrgList(@RequestParam("type") Integer type) {
+        // 获得SAP工厂/成本中心/库存地点列表,只要开启状态的
+        List<SapOrgDO> list = sapOrgService.getSapOrgList(null, type, Collections.singleton(CommonStatusEnum.ENABLE.getStatus()));
+        // 排序后,返回给前端
+        list.sort(Comparator.comparing(SapOrgDO::getSort));
+        return success(BeanUtils.toBean(list, SapOrgSimpleRespVO.class));
+    }
+
     @GetMapping("/export-excel")
     @Operation(summary = "导出SAP中的组织主数据(工厂 成本中心) Excel")
     @PreAuthorize("@ss.hasPermission('system:sap-org:export')")

+ 39 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/saporg/vo/SapOrgSimpleRespVO.java

@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.module.system.controller.admin.saporg.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - SAP工厂/成本中心/库存地点信息的精简 Response VO")
+@Data
+public class SapOrgSimpleRespVO {
+
+    @Schema(description = "岗位序号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+    @ExcelProperty("SAP工厂/成本中心/库存地点序号")
+    private Long id;
+
+    @Schema(description = "SAP工厂code", requiredMode = Schema.RequiredMode.REQUIRED, example = "小土豆")
+    @ExcelProperty("SAP工厂code")
+    private String factoryCode;
+
+    @Schema(description = "SAP工厂名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "小土豆")
+    @ExcelProperty("SAP工厂名称")
+    private String factoryName;
+
+    @Schema(description = "SAP成本中心编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "小土豆")
+    @ExcelProperty("SAP成本中心编码")
+    private String costCenterCode;
+
+    @Schema(description = "SAP成本中心名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "小土豆")
+    @ExcelProperty("SAP成本中心名称")
+    private String costCenterName;
+
+    @Schema(description = "SAP库存地点编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "小土豆")
+    @ExcelProperty("SAP库存地点编码")
+    private String storageLocationCode;
+
+    @Schema(description = "SAP库存地点名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "小土豆")
+    @ExcelProperty("SAP库存地点名称")
+    private String storageLocationName;
+
+}

+ 6 - 1
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dept/DeptDO.java

@@ -19,7 +19,7 @@ import java.util.Set;
  * @author ruoyi
  * @author 芋道源码
  */
-@TableName("system_dept")
+@TableName(value = "system_dept", autoResultMap = true)
 @KeySequence("system_dept_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
 @Data
 @EqualsAndHashCode(callSuper = true)
@@ -70,6 +70,11 @@ public class DeptDO extends TenantBaseDO {
      */
     @TableField(typeHandler = JacksonTypeHandler.class)
     private Set<Long> costCenterIds;
+    /**
+     * 库存地点(SAP)编号数组
+     */
+    @TableField(typeHandler = JacksonTypeHandler.class)
+    private Set<Long> stockLocationIds;
     /**
      * 部门状态
      *

+ 12 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/deptsaporg/DeptSapOrgDO.java

@@ -34,5 +34,17 @@ public class DeptSapOrgDO extends BaseDO {
      * SAP组织id(工厂/成本中心)
      */
     private Long sapOrgId;
+    /**
+     * SAP工厂id
+     */
+    private Long factoryId;
+    /**
+     * SAP成本中心id
+     */
+    private Long costCenterId;
+    /**
+     * SAP库存地点id
+     */
+    private Long stockLocationId;
 
 }

+ 25 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/deptsaporg/DeptSapOrgMapper.java

@@ -7,6 +7,9 @@ import cn.iocoder.yudao.module.system.controller.admin.deptsaporg.vo.DeptSapOrgP
 import cn.iocoder.yudao.module.system.dal.dataobject.deptsaporg.DeptSapOrgDO;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.Collection;
+import java.util.List;
+
 /**
  * PMS 组织部门与SAP工厂/成本中心 对应关系 Mapper
  *
@@ -23,4 +26,26 @@ public interface DeptSapOrgMapper extends BaseMapperX<DeptSapOrgDO> {
                 .orderByDesc(DeptSapOrgDO::getId));
     }
 
+    default List<DeptSapOrgDO> selectListByDeptId(Long deptId) {
+        return selectList(DeptSapOrgDO::getDeptId, deptId);
+    }
+
+    default void deleteByDeptIdAndFactoryId(Long deptId, Collection<Long> factoryIds) {
+        delete(new LambdaQueryWrapperX<DeptSapOrgDO>()
+                .eq(DeptSapOrgDO::getDeptId, deptId)
+                .in(DeptSapOrgDO::getFactoryId, factoryIds));
+    }
+
+    default void deleteByDeptIdAndCostCenterId(Long deptId, Collection<Long> costCenterIds) {
+        delete(new LambdaQueryWrapperX<DeptSapOrgDO>()
+                .eq(DeptSapOrgDO::getDeptId, deptId)
+                .in(DeptSapOrgDO::getCostCenterId, costCenterIds));
+    }
+
+    default void deleteByDeptIdAndStockLocationId(Long deptId, Collection<Long> stockLocationIds) {
+        delete(new LambdaQueryWrapperX<DeptSapOrgDO>()
+                .eq(DeptSapOrgDO::getDeptId, deptId)
+                .in(DeptSapOrgDO::getStockLocationId, stockLocationIds));
+    }
+
 }

+ 11 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/saporg/SapOrgMapper.java

@@ -7,6 +7,9 @@ import cn.iocoder.yudao.module.system.controller.admin.saporg.vo.SapOrgPageReqVO
 import cn.iocoder.yudao.module.system.dal.dataobject.saporg.SapOrgDO;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.Collection;
+import java.util.List;
+
 /**
  * SAP中的组织主数据(工厂 成本中心) Mapper
  *
@@ -32,4 +35,12 @@ public interface SapOrgMapper extends BaseMapperX<SapOrgDO> {
                 .orderByDesc(SapOrgDO::getId));
     }
 
+    default List<SapOrgDO> selectList(Collection<Long> ids, Integer type, Collection<Integer> statuses) {
+        return selectList(new LambdaQueryWrapperX<SapOrgDO>()
+                .inIfPresent(SapOrgDO::getId, ids)
+                .eqIfPresent(SapOrgDO::getType, type)
+                .inIfPresent(SapOrgDO::getStatus, statuses)
+                .orderByAsc(SapOrgDO::getSort));
+    }
+
 }

+ 71 - 2
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptServiceImpl.java

@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.module.system.service.dept;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
@@ -8,7 +9,9 @@ import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
 import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptSaveReqVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.deptsaporg.DeptSapOrgDO;
 import cn.iocoder.yudao.module.system.dal.mysql.dept.DeptMapper;
+import cn.iocoder.yudao.module.system.dal.mysql.deptsaporg.DeptSapOrgMapper;
 import cn.iocoder.yudao.module.system.dal.redis.RedisKeyConstants;
 import com.google.common.annotations.VisibleForTesting;
 import lombok.extern.slf4j.Slf4j;
@@ -22,6 +25,7 @@ import javax.annotation.Resource;
 import java.util.*;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
 import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
 
@@ -37,8 +41,8 @@ public class DeptServiceImpl implements DeptService {
 
     @Resource
     private DeptMapper deptMapper;
-//    @Resource
-//    private IotTreeMapper iotTreeMapper;
+    @Resource
+    private DeptSapOrgMapper deptSapOrgMapper;
 
     @Override
     @CacheEvict(cacheNames = RedisKeyConstants.DEPT_CHILDREN_ID_LIST,
@@ -56,6 +60,22 @@ public class DeptServiceImpl implements DeptService {
         // 插入部门
         DeptDO dept = BeanUtils.toBean(createReqVO, DeptDO.class);
         deptMapper.insert(dept);
+        // 2.2 插入关联SAP工厂
+        if (CollectionUtil.isNotEmpty(dept.getFactoryIds())) {
+            deptSapOrgMapper.insertBatch(convertList(dept.getFactoryIds(),
+                    factoryId -> new DeptSapOrgDO().setDeptId(dept.getId()).setFactoryId(factoryId)));
+        }
+        // 2.2 插入关联SAP成本中心
+        if (CollectionUtil.isNotEmpty(dept.getCostCenterIds())) {
+            deptSapOrgMapper.insertBatch(convertList(dept.getCostCenterIds(),
+                    costCenterId -> new DeptSapOrgDO().setDeptId(dept.getId()).setCostCenterId(costCenterId)));
+        }
+        // 2.2 插入关联SAP库存地点
+        if (CollectionUtil.isNotEmpty(dept.getStockLocationIds())) {
+            deptSapOrgMapper.insertBatch(convertList(dept.getStockLocationIds(),
+                    stockLocationId -> new DeptSapOrgDO().setDeptId(dept.getId()).setStockLocationId(stockLocationId)));
+        }
+
         return dept.getId();
     }
 
@@ -77,6 +97,55 @@ public class DeptServiceImpl implements DeptService {
         DeptDO updateObj = BeanUtils.toBean(updateReqVO, DeptDO.class);
 
         deptMapper.updateById(updateObj);
+
+        // 2.2 更新SAP工厂/成本中心/库存地点
+        updateSapOrg(updateReqVO, updateObj);
+    }
+
+    private void updateSapOrg(DeptSaveReqVO updateReqVO, DeptDO updateObj) {
+        Long deptId = updateReqVO.getId();
+        // 查询部门已经关联的SAP工厂
+        Set<Long> dbFactoryIds = convertSet(deptSapOrgMapper.selectListByDeptId(deptId), DeptSapOrgDO::getFactoryId);
+        // 查询部门已经关联的SAP成本中心
+        Set<Long> dbCostCenterIds = convertSet(deptSapOrgMapper.selectListByDeptId(deptId), DeptSapOrgDO::getCostCenterId);
+        // 查询部门已经关联的SAP库存地点
+        Set<Long> dbStockLocationIds = convertSet(deptSapOrgMapper.selectListByDeptId(deptId), DeptSapOrgDO::getStockLocationId);
+        // 计算新增和删除的SAP工厂编号
+        Set<Long> factoryIds = CollUtil.emptyIfNull(updateObj.getFactoryIds());
+        Collection<Long> createFactoryIds = CollUtil.subtract(factoryIds, dbFactoryIds);
+        Collection<Long> deleteFactoryIds = CollUtil.subtract(dbFactoryIds, factoryIds);
+        // 执行新增和删除。对于已经授权的 SAP工厂,不用做任何处理
+        if (!CollectionUtil.isEmpty(createFactoryIds)) {
+            deptSapOrgMapper.insertBatch(convertList(createFactoryIds,
+                    factoryId -> new DeptSapOrgDO().setDeptId(deptId).setFactoryId(factoryId)));
+        }
+        if (!CollectionUtil.isEmpty(deleteFactoryIds)) {
+            deptSapOrgMapper.deleteByDeptIdAndFactoryId(deptId, deleteFactoryIds);
+        }
+        // 计算新增和删除的SAP成本中心
+        Set<Long> costCenterIds = CollUtil.emptyIfNull(updateObj.getCostCenterIds());
+        Collection<Long> createCostCenterIds = CollUtil.subtract(costCenterIds, dbCostCenterIds);
+        Collection<Long> deleteCostCenterIds = CollUtil.subtract(dbCostCenterIds, costCenterIds);
+        // 执行新增和删除。对于已经授权的 SAP成本中心,不用做任何处理
+        if (!CollectionUtil.isEmpty(createCostCenterIds)) {
+            deptSapOrgMapper.insertBatch(convertList(createCostCenterIds,
+                    costCenterId -> new DeptSapOrgDO().setDeptId(deptId).setCostCenterId(costCenterId)));
+        }
+        if (!CollectionUtil.isEmpty(deleteCostCenterIds)) {
+            deptSapOrgMapper.deleteByDeptIdAndCostCenterId(deptId, deleteCostCenterIds);
+        }
+        // 计算新增和删除的SAP库存地点
+        Set<Long> stockLocationIds = CollUtil.emptyIfNull(updateObj.getStockLocationIds());
+        Collection<Long> createStockLocationIds = CollUtil.subtract(stockLocationIds, dbStockLocationIds);
+        Collection<Long> deleteStockLocationIds = CollUtil.subtract(dbStockLocationIds, stockLocationIds);
+        // 执行新增和删除。对于已经授权的 SAP库存地点,不用做任何处理
+        if (!CollectionUtil.isEmpty(createStockLocationIds)) {
+            deptSapOrgMapper.insertBatch(convertList(createStockLocationIds,
+                    stockLocationId -> new DeptSapOrgDO().setDeptId(deptId).setStockLocationId(stockLocationId)));
+        }
+        if (!CollectionUtil.isEmpty(deleteStockLocationIds)) {
+            deptSapOrgMapper.deleteByDeptIdAndStockLocationId(deptId, deleteStockLocationIds);
+        }
     }
 
     @Override

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

@@ -4,8 +4,11 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
 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;
+import org.springframework.lang.Nullable;
 
 import javax.validation.Valid;
+import java.util.Collection;
+import java.util.List;
 
 /**
  * SAP中的组织主数据(工厂 成本中心) Service 接口
@@ -52,4 +55,15 @@ public interface SapOrgService {
      */
     PageResult<SapOrgDO> getSapOrgPage(SapOrgPageReqVO pageReqVO);
 
+    /**
+     * 获得符合条件的 SAP工厂/成本中心/库存地点 列表
+     *
+     * @param ids (SAP工厂/成本中心/库存地点)id 编号数组。如果为空,不进行筛选
+     * @param type 类型(1工厂 2成本中心 3库存地点)
+     * @param statuses 状态数组。如果为空,不进行筛选
+     * @return 部门列表
+     */
+    List<SapOrgDO> getSapOrgList(@Nullable Collection<Long> ids,
+                             @Nullable Integer type,
+                             @Nullable Collection<Integer> statuses);
 }

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

@@ -10,6 +10,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
+import java.util.Collection;
+import java.util.List;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.SAP_ORG_NOT_EXISTS;
@@ -68,4 +70,9 @@ public class SapOrgServiceImpl implements SapOrgService {
         return sapOrgMapper.selectPage(pageReqVO);
     }
 
+    @Override
+    public List<SapOrgDO> getSapOrgList(Collection<Long> ids, Integer type, Collection<Integer> statuses) {
+        return sapOrgMapper.selectList(ids, type, statuses);
+    }
+
 }