Browse Source

pms功能优化 工单物料消耗 设备责任人 功能优化

zhangcl 3 months ago
parent
commit
870b9578df
18 changed files with 300 additions and 19 deletions
  1. 32 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdeviceperson/IotDevicePersonController.java
  2. 6 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdeviceperson/vo/IotDevicePersonPageReqVO.java
  3. 19 7
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmainworkorderbommaterial/IotMainWorkOrderBomMaterialController.java
  4. 3 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmainworkorderbommaterial/vo/IotMainWorkOrderBomMaterialPageReqVO.java
  5. 17 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmainworkorderbommaterial/vo/IotMainWorkOrderBomMaterialRespVO.java
  6. 41 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/convert/iotmainworkorderbommaterial/IotWorkOrderBomMaterialConvert.java
  7. 6 2
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotmainworkorderbommaterial/IotMainWorkOrderBomMaterialMapper.java
  8. 8 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdeviceperson/IotDevicePersonService.java
  9. 9 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdeviceperson/IotDevicePersonServiceImpl.java
  10. 51 4
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotmainworkorderbommaterial/IotMainWorkOrderBomMaterialServiceImpl.java
  11. 1 1
      yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotDeviceMapper.xml
  12. 65 5
      yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotWorkOrderMaterialMapper.xml
  13. 9 0
      yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dept/DeptSapOrgApi.java
  14. 9 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/dept/DeptSapOrgApiImpl.java
  15. 6 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/deptsaporg/vo/DeptSapOrgPageReqVO.java
  16. 5 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/deptsaporg/DeptSapOrgMapper.java
  17. 8 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/deptsaporg/DeptSapOrgService.java
  18. 5 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/deptsaporg/DeptSapOrgServiceImpl.java

+ 32 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdeviceperson/IotDevicePersonController.java

@@ -5,6 +5,7 @@ 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.collection.MapUtils;
 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.iotdeviceperson.vo.IotDevicePersonPageReqVO;
@@ -13,6 +14,8 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotdeviceperson.vo.IotDevice
 import cn.iocoder.yudao.module.pms.controller.admin.iotdeviceperson.vo.IotDevicePersonSaveReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdeviceperson.IotDevicePersonDO;
 import cn.iocoder.yudao.module.pms.service.iotdeviceperson.IotDevicePersonService;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -24,10 +27,15 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Stream;
 
 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.convertListByFlatMap;
 
 @Tag(name = "管理后台 - 设备负责人分配")
 @RestController
@@ -37,6 +45,8 @@ public class IotDevicePersonController {
 
     @Resource
     private IotDevicePersonService iotDevicePersonService;
+    @Resource
+    private AdminUserApi adminUserApi;
 
     @PostMapping("/create")
     @Operation(summary = "创建设备负责人分配")
@@ -86,6 +96,28 @@ public class IotDevicePersonController {
         return success(BeanUtils.toBean(pageResult, IotDevicePersonRespVO.class));
     }
 
+    @GetMapping("/getPersonsByDeviceIds")
+    @Operation(summary = "根据设备id集合查询设备的负责人列表")
+    @PreAuthorize("@ss.hasPermission('pms:iot-device-person:query')")
+    public CommonResult<List<IotDevicePersonRespVO>> getPersonsByDeviceIds(@Valid IotDevicePersonPageReqVO pageReqVO) {
+        List<IotDevicePersonDO> persons = iotDevicePersonService.getPersonsByDeviceIds(pageReqVO);
+        return success(new ArrayList<>(buildDevicePersonList(persons)));
+    }
+
+    private List<IotDevicePersonRespVO> buildDevicePersonList(List<IotDevicePersonDO> persons) {
+        if (CollUtil.isEmpty(persons)) {
+            return Collections.emptyList();
+        }
+        // 查询设备 负责人 对应名称
+        Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertListByFlatMap(persons,
+                person -> Stream.of(person.getPersonId())));
+        // 2. 转换成 VO
+        return BeanUtils.toBean(persons, IotDevicePersonRespVO.class, personVO -> {
+            // 2.2 设置创建人、负责人名称
+            MapUtils.findAndThen(userMap, personVO.getPersonId(), user -> personVO.setPersonName(user.getNickname()));
+        });
+    }
+
     @GetMapping("/export-excel")
     @Operation(summary = "导出设备负责人分配 Excel")
     @PreAuthorize("@ss.hasPermission('pms:iot-device-person:export')")

+ 6 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdeviceperson/vo/IotDevicePersonPageReqVO.java

@@ -8,6 +8,7 @@ import lombok.ToString;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.time.LocalDateTime;
+import java.util.Collection;
 
 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
 
@@ -33,4 +34,9 @@ public class IotDevicePersonPageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
 
+    /**
+     * 扩展字段
+     */
+    @Schema(description = "设备id集合", example = "[1,2,3]")
+    private Collection<Long> deviceIds;
 }

+ 19 - 7
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmainworkorderbommaterial/IotMainWorkOrderBomMaterialController.java

@@ -9,8 +9,13 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbommaterial.vo.IotMainWorkOrderBomMaterialPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbommaterial.vo.IotMainWorkOrderBomMaterialRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbommaterial.vo.IotMainWorkOrderBomMaterialSaveReqVO;
+import cn.iocoder.yudao.module.pms.convert.iotlockstock.IotLockStockConvert;
+import cn.iocoder.yudao.module.pms.convert.iotmainworkorderbommaterial.IotWorkOrderBomMaterialConvert;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotlockstock.IotLockStockDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbommaterial.IotMainWorkOrderBomMaterialDO;
 import cn.iocoder.yudao.module.pms.service.iotmainworkorderbommaterial.IotMainWorkOrderBomMaterialService;
+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 +28,11 @@ 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 保养工单明细设备BOM挂载物料关联")
 @RestController
@@ -35,6 +42,8 @@ public class IotMainWorkOrderBomMaterialController {
 
     @Resource
     private IotMainWorkOrderBomMaterialService iotMainWorkOrderBomMaterialService;
+    @Resource
+    private SapOrgApi sapOrgApi;
 
     @PostMapping("/create")
     @Operation(summary = "创建PMS 保养工单明细设备BOM挂载物料关联")
@@ -82,13 +91,16 @@ public class IotMainWorkOrderBomMaterialController {
     @PreAuthorize("@ss.hasPermission('pms:iot-main-work-order-bom-material:query')")
     public CommonResult<PageResult<IotMainWorkOrderBomMaterialRespVO>> getMainWorkOrderMaterials(@Valid IotMainWorkOrderBomMaterialPageReqVO pageReqVO) {
         PageResult<IotMainWorkOrderBomMaterialRespVO> iotMaintainMaterials = iotMainWorkOrderBomMaterialService.selectMaterialsByDept(pageReqVO);
-        // 设置每个物料关联的的BOM节点
-        /* if(CollUtil.isNotEmpty(iotMaintainMaterials.getList())){
-            iotMaintainMaterials.getList().forEach(material -> {
-                material.setBomNodeId(pageReqVO.getBomNodeId());
-            });
-        } */
-        return success(iotMaintainMaterials);
+        // 设置每个库存物料关联的BOM工厂 成本中心 库存地点
+        // 拼接 工厂 成本中心 库存地点
+        Map<Long, SapOrgRespDTO> factoryMap = sapOrgApi.getSapOrgMap(
+                convertList(iotMaintainMaterials.getList(), IotMainWorkOrderBomMaterialRespVO::getFactoryId));
+        Map<Long, SapOrgRespDTO> costCenterMap = sapOrgApi.getSapOrgMap(
+                convertList(iotMaintainMaterials.getList(), IotMainWorkOrderBomMaterialRespVO::getCostCenterId));
+        Map<Long, SapOrgRespDTO> storageLocationMap = sapOrgApi.getSapOrgMap(
+                convertList(iotMaintainMaterials.getList(), IotMainWorkOrderBomMaterialRespVO::getStorageLocationId));
+        return success(new PageResult<>(IotWorkOrderBomMaterialConvert.INSTANCE.convertList(iotMaintainMaterials.getList(), factoryMap, costCenterMap, storageLocationMap),
+                iotMaintainMaterials.getTotal()));
     }
 
     @GetMapping("/export-excel")

+ 3 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmainworkorderbommaterial/vo/IotMainWorkOrderBomMaterialPageReqVO.java

@@ -102,4 +102,7 @@ public class IotMainWorkOrderBomMaterialPageReqVO extends PageParam {
      */
     @Schema(description = "部门id", example = "21957")
     private Long deptId;
+
+    @Schema(description = "设备id", example = "21957")
+    private Long deviceId;
 }

+ 17 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmainworkorderbommaterial/vo/IotMainWorkOrderBomMaterialRespVO.java

@@ -129,4 +129,21 @@ public class IotMainWorkOrderBomMaterialRespVO {
     @Schema(description = "是否是bom节点关联的物料", example = "Y N")
     private String bomMaterialFlag;
 
+    @Schema(description = "sap 工厂id", example = "30856")
+    private Long factoryId;
+
+    @Schema(description = "sap 成本中心id", example = "30856")
+    private Long costCenterId;
+
+    @Schema(description = "sap 库存地点id", example = "30856")
+    private Long storageLocationId;
+
+    @Schema(description = "sap 工厂名称", example = "四川瑞都")
+    private String factory;
+
+    @Schema(description = "sap 成本中心", example = "HY-01")
+    private String costCenter;
+
+    @Schema(description = "sap 库存地点", example = "新疆项目部")
+    private String projectDepartment;
 }

+ 41 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/convert/iotmainworkorderbommaterial/IotWorkOrderBomMaterialConvert.java

@@ -0,0 +1,41 @@
+package cn.iocoder.yudao.module.pms.convert.iotmainworkorderbommaterial;
+
+import cn.hutool.core.util.ObjectUtil;
+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.iotmainworkorderbommaterial.vo.IotMainWorkOrderBomMaterialRespVO;
+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 IotWorkOrderBomMaterialConvert {
+
+    IotWorkOrderBomMaterialConvert INSTANCE = Mappers.getMapper(IotWorkOrderBomMaterialConvert.class);
+
+    default List<IotMainWorkOrderBomMaterialRespVO> convertList(List<IotMainWorkOrderBomMaterialRespVO> list,
+                                                                Map<Long, SapOrgRespDTO> factoryMap,
+                                                                Map<Long, SapOrgRespDTO> costCenterMap, Map<Long, SapOrgRespDTO> stockLocationMap) {
+        return CollectionUtils.convertList(list, stock -> convert1(stock, factoryMap.get(stock.getFactoryId()),
+                costCenterMap.get(stock.getCostCenterId()), stockLocationMap.get(stock.getStorageLocationId())));
+    }
+
+    default IotMainWorkOrderBomMaterialRespVO convert1(IotMainWorkOrderBomMaterialRespVO stock,
+                                                       SapOrgRespDTO factory, SapOrgRespDTO costCenter, SapOrgRespDTO projectDepartment) {
+        IotMainWorkOrderBomMaterialRespVO stockVO = BeanUtils.toBean(stock, IotMainWorkOrderBomMaterialRespVO.class);
+        if (ObjectUtil.isNotEmpty(factory)) {
+            stockVO.setFactory(factory.getFactoryName());
+        }
+        if (ObjectUtil.isNotEmpty(costCenter)) {
+            stockVO.setCostCenter(costCenter.getCostCenterName());
+        }
+        if (ObjectUtil.isNotEmpty(projectDepartment)) {
+            stockVO.setProjectDepartment(projectDepartment.getStorageLocationName());
+        }
+        return stockVO;
+    }
+
+}

+ 6 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotmainworkorderbommaterial/IotMainWorkOrderBomMaterialMapper.java

@@ -11,6 +11,7 @@ import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * PMS 保养工单明细设备BOM挂载物料关联 Mapper
@@ -51,6 +52,9 @@ public interface IotMainWorkOrderBomMaterialMapper extends BaseMapperX<IotMainWo
                 .orderByDesc(IotMainWorkOrderBomMaterialDO::getId));
     }
 
-    IPage<IotMainWorkOrderBomMaterialRespVO> selectMaterialsByDept(IPage<IotMainWorkOrderBomMaterialRespVO> page, @Param("deptId") Long deptId,
-                                                                   @Param("parentDept") Long parentDept, @Param("materialCodes") List<String> materialCodes);
+    IPage<IotMainWorkOrderBomMaterialRespVO> selectMaterialsBySapOrg(IPage<IotMainWorkOrderBomMaterialRespVO> page, @Param("deptId") Long deptId,
+                                                                   @Param("parentDept") Long parentDept, @Param("materialCodes") List<String> materialCodes,
+                                                                     @Param("factoryIds") Set<Long> factoryIds,
+                                                                     @Param("costCenterIds") Set<Long> costCenterIds,
+                                                                     @Param("stockLocationIds") Set<Long> stockLocationIds);
 }

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

@@ -79,4 +79,12 @@ public interface IotDevicePersonService {
      * @return
      */
     Long saveDeviceStatuses(List<IotDevicePersonRelationSaveReqVO> reqVOS);
+
+    /**
+     * 根据设备id集合查询设备的负责人列表
+     *
+     * @param pageReqVO 设备id 集合
+     * @return
+     */
+    List<IotDevicePersonDO> getPersonsByDeviceIds(IotDevicePersonPageReqVO pageReqVO);
 }

+ 9 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdeviceperson/IotDevicePersonServiceImpl.java

@@ -186,4 +186,13 @@ public class IotDevicePersonServiceImpl implements IotDevicePersonService {
         return 0l;
     }
 
+    @Override
+    public List<IotDevicePersonDO> getPersonsByDeviceIds(IotDevicePersonPageReqVO pageReqVO) {
+        Collection<Long> deviceIds = pageReqVO.getDeviceIds();
+        if (CollUtil.isEmpty(deviceIds)) {
+            throw exception(IOT_DEVICE_PERSON_NOT_EXISTS);
+        }
+        return iotDevicePersonMapper.selectList(deviceIds);
+    }
+
 }

+ 51 - 4
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotmainworkorderbommaterial/IotMainWorkOrderBomMaterialServiceImpl.java

@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.module.pms.service.iotmainworkorderbommaterial;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjUtil;
 import cn.iocoder.yudao.framework.common.exception.ServiceException;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
@@ -9,10 +10,15 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotcommonbommaterial.vo.IotC
 import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbommaterial.vo.IotMainWorkOrderBomMaterialPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbommaterial.vo.IotMainWorkOrderBomMaterialRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbommaterial.vo.IotMainWorkOrderBomMaterialSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotcommonbommaterial.IotCommonBomMaterialDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbommaterial.IotMainWorkOrderBomMaterialDO;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotmainworkorderbommaterial.IotMainWorkOrderBomMaterialMapper;
+import cn.iocoder.yudao.module.pms.service.IotDeviceService;
 import cn.iocoder.yudao.module.pms.service.iotcommonbommaterial.IotCommonBomMaterialService;
+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.saporg.SapOrgApi;
 import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
 import cn.iocoder.yudao.module.system.service.dept.DeptService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -44,6 +50,12 @@ public class IotMainWorkOrderBomMaterialServiceImpl implements IotMainWorkOrderB
     private DeptService deptService;
     @Autowired
     private IotCommonBomMaterialService iotCommonBomMaterialService;
+    @Autowired
+    private IotDeviceService iotDeviceService;
+    @Autowired
+    private SapOrgApi sapOrgApi;
+    @Autowired
+    private DeptSapOrgApi deptSapOrgApi;
 
     @Override
     public Long createIotMainWorkOrderBomMaterial(IotMainWorkOrderBomMaterialSaveReqVO createReqVO) {
@@ -89,8 +101,43 @@ public class IotMainWorkOrderBomMaterialServiceImpl implements IotMainWorkOrderB
 
     @Override
     public PageResult<IotMainWorkOrderBomMaterialRespVO> selectMaterialsByDept(IotMainWorkOrderBomMaterialPageReqVO pageReqVO) {
-        DeptDO dept = deptService.getDept(pageReqVO.getDeptId());
-        if (Objects.isNull(dept)) {throw new ServiceException();}
+        // 根据 设备 关联的 SAP工厂 库存地点 成本中心 查询 本地库存 SAP库存
+        // 查询设备所属的部门
+        IotDeviceDO device = iotDeviceService.getIotDevice(pageReqVO.getDeviceId());
+        if (ObjUtil.isEmpty(device)) {
+            throw exception(IOT_MAIN_WORK_ORDER_BOM_MATERIAL_NOT_EXISTS);
+        }
+        if (Objects.isNull(device.getDeptId())) {
+            throw exception(IOT_MAIN_WORK_ORDER_BOM_MATERIAL_NOT_EXISTS);
+        }
+        // 查询设备所属部门下的所有子部门列表
+        Set<Long> ids = new HashSet<>();
+        ids = deptService.getChildDeptIdListFromCache(pageReqVO.getDeptId());
+        ids.add(device.getDeptId());
+        // 查询设备所属部门关联的SAP工厂 成本中心 库存地点
+        List<DeptSapOrgRespDTO> sapOrgS = deptSapOrgApi.getSapOrgListByDeptIds(ids);
+        Set<Long> factoryIds = new HashSet<>();
+        Set<Long> costCenterIds = new HashSet<>();
+        Set<Long> stockLocationIds = new HashSet<>();
+        if (CollUtil.isEmpty(sapOrgS)) {
+            throw exception(IOT_MAIN_WORK_ORDER_BOM_MATERIAL_NOT_EXISTS);
+        }
+        sapOrgS.forEach(sapOrg -> {
+            if (ObjUtil.isNotEmpty(sapOrg.getFactoryId())) {
+                factoryIds.add(sapOrg.getFactoryId());
+            }
+            if (ObjUtil.isNotEmpty(sapOrg.getCostCenterId())) {
+                costCenterIds.add(sapOrg.getCostCenterId());
+            }
+            if (ObjUtil.isNotEmpty(sapOrg.getStockLocationId())) {
+                stockLocationIds.add(sapOrg.getStockLocationId());
+            }
+        });
+
+
+
+        // DeptDO dept = deptService.getDept(pageReqVO.getDeptId());
+        // if (Objects.isNull(dept)) {throw new ServiceException();}
         // 查询 bom 节点已经关联的物料列表
         IotCommonBomMaterialSaveReqVO reqVO = new IotCommonBomMaterialSaveReqVO();
         reqVO.setBomNodeId(pageReqVO.getBomNodeId());
@@ -105,8 +152,8 @@ public class IotMainWorkOrderBomMaterialServiceImpl implements IotMainWorkOrderB
             bomNodePair = CollectionUtils.convertMap(bomMaterials, IotCommonBomMaterialDO::getCode);
         }
         IPage<IotMainWorkOrderBomMaterialRespVO> iotMaintainMaterialDOIPage =
-                iotMainWorkOrderBomMaterialMapper.selectMaterialsByDept(Page.of(pageReqVO.getPageNo(), pageReqVO.getPageSize()),
-                        pageReqVO.getDeptId(), dept.getParentId(), materialCodes);
+                iotMainWorkOrderBomMaterialMapper.selectMaterialsBySapOrg(Page.of(pageReqVO.getPageNo(), pageReqVO.getPageSize()),
+                        pageReqVO.getDeptId(), null, materialCodes, factoryIds, costCenterIds, stockLocationIds);
         List<IotMainWorkOrderBomMaterialRespVO> materials = iotMaintainMaterialDOIPage.getRecords();
         if (CollUtil.isNotEmpty(materials)) {
             for (IotMainWorkOrderBomMaterialRespVO material : materials) {

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotDeviceMapper.xml

@@ -76,7 +76,7 @@
             AND t.device_name LIKE concat(concat("%",#{reqVO.deviceName}),"%")
         </if>
         <if test="reqVO.deviceCode!=null and reqVO.deviceCode!=''">
-            AND t.device_code LIKE concat(concat("%",#{deviceCode}),"%")
+            AND t.device_code LIKE concat(concat("%",#{reqVO.deviceCode}),"%")
         </if>
     </select>
 

+ 65 - 5
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotWorkOrderMaterialMapper.xml

@@ -2,10 +2,13 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="cn.iocoder.yudao.module.pms.dal.mysql.iotmainworkorderbommaterial.IotMainWorkOrderBomMaterialMapper">
 
-    <select id="selectMaterialsByDept"
+    <select id="selectMaterialsBySapOrg"
             resultType="cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbommaterial.vo.IotMainWorkOrderBomMaterialRespVO">
         -- 本地库存中与bom节点关联的物料
         SELECT
+            lo.factory_id AS factoryId,
+            lo.cost_center_id AS costCenterId,
+            lo.storage_location_id AS storageLocationId,
             lo.material_code AS materialCode,
             lo.material_name AS materialName,
             lo.unit_price AS unitPrice,
@@ -15,17 +18,32 @@
         FROM
             rq_iot_lock_stock lo
         WHERE
-            lo.dept_id = #{deptId}
+            1=1
         <if test="materialCodes != null and materialCodes.size &gt; 0">
             AND lo.material_code IN
             <foreach collection="materialCodes" index="index" item="key" open="(" separator="," close=")">
                 #{key}
             </foreach>
         </if>
+        <if test="factoryIds != null and factoryIds.size &gt; 0">
+            AND lo.factory_id IN
+            <foreach collection="factoryIds" index="index" item="key" open="(" separator="," close=")">
+                #{key}
+            </foreach>
+        </if>
+        <if test="costCenterIds != null and costCenterIds.size &gt; 0">
+            AND lo.cost_center_id IN
+            <foreach collection="costCenterIds" index="index" item="key" open="(" separator="," close=")">
+                #{key}
+            </foreach>
+        </if>
 
         UNION ALL
         -- 本地库存物料
         SELECT
+            lo.factory_id AS factoryId,
+            lo.cost_center_id AS costCenterId,
+            lo.storage_location_id AS storageLocationId,
             lo.material_code AS materialCode,
             lo.material_name AS materialName,
             lo.unit_price AS unitPrice,
@@ -35,18 +53,33 @@
         FROM
             rq_iot_lock_stock lo
         WHERE
-            lo.dept_id = #{deptId}
+            1=1
         <if test="materialCodes != null and materialCodes.size &gt; 0">
             AND lo.material_code NOT IN
             <foreach collection="materialCodes" index="index" item="key" open="(" separator="," close=")">
                 #{key}
             </foreach>
         </if>
+        <if test="factoryIds != null and factoryIds.size &gt; 0">
+            AND lo.factory_id IN
+            <foreach collection="factoryIds" index="index" item="key" open="(" separator="," close=")">
+                #{key}
+            </foreach>
+        </if>
+        <if test="costCenterIds != null and costCenterIds.size &gt; 0">
+            AND lo.cost_center_id IN
+            <foreach collection="costCenterIds" index="index" item="key" open="(" separator="," close=")">
+                #{key}
+            </foreach>
+        </if>
 
         UNION ALL
 
         -- sap库存物料
         SELECT
+            sap.factory_id AS factoryId,
+            0 AS costCenterId,
+            sap.storage_location_id AS storageLocationId,
             sap.material_code AS materialCode,
             sap.material_name AS materialName,
             sap.unit_price AS unitPrice,
@@ -56,17 +89,32 @@
         FROM
             rq_iot_sap_stock sap
         WHERE
-            sap.dept_id = #{parentDept}
+            1=1
         <if test="materialCodes != null and materialCodes.size &gt; 0">
             AND sap.material_code IN
             <foreach collection="materialCodes" index="index" item="key" open="(" separator="," close=")">
                 #{key}
             </foreach>
         </if>
+        <if test="factoryIds != null and factoryIds.size &gt; 0">
+            AND sap.factory_id IN
+            <foreach collection="factoryIds" index="index" item="key" open="(" separator="," close=")">
+                #{key}
+            </foreach>
+        </if>
+        <if test="stockLocationIds != null and stockLocationIds.size &gt; 0">
+            AND sap.storage_location_id IN
+            <foreach collection="stockLocationIds" index="index" item="key" open="(" separator="," close=")">
+                #{key}
+            </foreach>
+        </if>
 
         UNION ALL
         -- sap库存物料
         SELECT
+            sap.factory_id AS factoryId,
+            0 AS costCenterId,
+            sap.storage_location_id AS storageLocationId,
             sap.material_code AS materialCode,
             sap.material_name AS materialName,
             sap.unit_price AS unitPrice,
@@ -76,13 +124,25 @@
         FROM
             rq_iot_sap_stock sap
         WHERE
-            sap.dept_id = #{parentDept}
+            1=1
         <if test="materialCodes != null and materialCodes.size &gt; 0">
             AND sap.material_code NOT IN
             <foreach collection="materialCodes" index="index" item="key" open="(" separator="," close=")">
                 #{key}
             </foreach>
         </if>
+        <if test="factoryIds != null and factoryIds.size &gt; 0">
+            AND sap.factory_id IN
+            <foreach collection="factoryIds" index="index" item="key" open="(" separator="," close=")">
+                #{key}
+            </foreach>
+        </if>
+        <if test="stockLocationIds != null and stockLocationIds.size &gt; 0">
+            AND sap.storage_location_id IN
+            <foreach collection="stockLocationIds" index="index" item="key" open="(" separator="," close=")">
+                #{key}
+            </foreach>
+        </if>
 
     </select>
 </mapper>

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

@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.system.api.dept;
 
 import cn.iocoder.yudao.module.system.api.dept.dto.DeptSapOrgRespDTO;
 
+import java.util.Collection;
 import java.util.List;
 
 /**
@@ -19,4 +20,12 @@ public interface DeptSapOrgApi {
      */
     List<DeptSapOrgRespDTO> getDeptSapOrgList(Long id);
 
+    /**
+     * 根据部门id数组 查询 所有部门 关联 的 SAP组织主数据 列表
+     *
+     * @param deptIds 部门编号 数组
+     * @return 部门 关联 的 SAP组织主数据
+     */
+    List<DeptSapOrgRespDTO> getSapOrgListByDeptIds(Collection<Long> deptIds);
+
 }

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

@@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.system.service.deptsaporg.DeptSapOrgService;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.util.Collection;
 import java.util.List;
 
 /**
@@ -29,4 +30,12 @@ public class DeptSapOrgApiImpl implements DeptSapOrgApi {
         List<DeptSapOrgDO> deptSapOrgDOS = deptSapOrgService.getDeptSapOrgList(reqVO);
         return BeanUtils.toBean(deptSapOrgDOS, DeptSapOrgRespDTO.class);
     }
+
+    @Override
+    public List<DeptSapOrgRespDTO> getSapOrgListByDeptIds(Collection<Long> deptIds) {
+        DeptSapOrgPageReqVO reqVO = new DeptSapOrgPageReqVO();
+        reqVO.setDeptIds(deptIds);
+        List<DeptSapOrgDO> deptSapOrgDOS = deptSapOrgService.getSapOrgListByDeptIds(reqVO);
+        return BeanUtils.toBean(deptSapOrgDOS, DeptSapOrgRespDTO.class);
+    }
 }

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

@@ -8,6 +8,7 @@ import lombok.ToString;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.time.LocalDateTime;
+import java.util.Collection;
 
 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
 
@@ -36,4 +37,9 @@ public class DeptSapOrgPageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
 
+    /**
+     * 扩展字段
+     */
+    @Schema(description = "部门id集合", example = "32319")
+    private Collection<Long> deptIds;
 }

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

@@ -30,6 +30,11 @@ public interface DeptSapOrgMapper extends BaseMapperX<DeptSapOrgDO> {
         return selectList(DeptSapOrgDO::getDeptId, deptId);
     }
 
+    default List<DeptSapOrgDO> selectListByDeptIds(Collection<Long> deptIds) {
+        return selectList(new LambdaQueryWrapperX<DeptSapOrgDO>()
+                .inIfPresent(DeptSapOrgDO::getDeptId, deptIds));
+    }
+
     default void deleteByDeptIdAndFactoryId(Long deptId, Collection<Long> factoryIds) {
         delete(new LambdaQueryWrapperX<DeptSapOrgDO>()
                 .eq(DeptSapOrgDO::getDeptId, deptId)

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

@@ -61,4 +61,12 @@ public interface DeptSapOrgService {
      */
     List<DeptSapOrgDO> getDeptSapOrgList(DeptSapOrgPageReqVO reqVO);
 
+    /**
+     * 根据部门id数组 查询 所有部门 关联 的 SAP组织主数据 列表
+     *
+     * @param reqVO 列表查询
+     * @return PMS 组织部门与SAP工厂/成本中心 对应关系 列表
+     */
+    List<DeptSapOrgDO> getSapOrgListByDeptIds(DeptSapOrgPageReqVO reqVO);
+
 }

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

@@ -75,4 +75,9 @@ public class DeptSapOrgServiceImpl implements DeptSapOrgService {
         return deptSapOrgMapper.selectListByDeptId(reqVO.getDeptId());
     }
 
+    @Override
+    public List<DeptSapOrgDO> getSapOrgListByDeptIds(DeptSapOrgPageReqVO reqVO) {
+        return deptSapOrgMapper.selectListByDeptIds(reqVO.getDeptIds());
+    }
+
 }