浏览代码

pms功能优化 保养工单 填报 功能优化

zhangcl 3 月之前
父节点
当前提交
7d0f01d05b
共有 14 个文件被更改,包括 282 次插入4 次删除
  1. 9 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmainworkorder/IotMainWorkOrderController.java
  2. 22 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmainworkorder/vo/IotMainWorkOrderSaveVO.java
  3. 15 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmainworkorderbommaterial/IotMainWorkOrderBomMaterialController.java
  4. 5 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmainworkorderbommaterial/vo/IotMainWorkOrderBomMaterialPageReqVO.java
  5. 9 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmainworkorderbommaterial/vo/IotMainWorkOrderBomMaterialRespVO.java
  6. 3 3
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotcommonbommaterial/IotCommonBomMaterialMapper.java
  7. 8 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotmainworkorderbommaterial/IotMainWorkOrderBomMaterialMapper.java
  8. 9 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotcommonbommaterial/IotCommonBomMaterialService.java
  9. 5 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotcommonbommaterial/IotCommonBomMaterialServiceImpl.java
  10. 8 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotmainworkorder/IotMainWorkOrderService.java
  11. 53 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotmainworkorder/IotMainWorkOrderServiceImpl.java
  12. 10 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotmainworkorderbommaterial/IotMainWorkOrderBomMaterialService.java
  13. 38 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotmainworkorderbommaterial/IotMainWorkOrderBomMaterialServiceImpl.java
  14. 88 0
      yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotWorkOrderMaterialMapper.xml

+ 9 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmainworkorder/IotMainWorkOrderController.java

@@ -9,6 +9,7 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo.IotMainWorkOrderPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo.IotMainWorkOrderRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo.IotMainWorkOrderSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo.IotMainWorkOrderSaveVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorder.IotMainWorkOrderDO;
 import cn.iocoder.yudao.module.pms.service.iotmainworkorder.IotMainWorkOrderService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -51,6 +52,14 @@ public class IotMainWorkOrderController {
         return success(true);
     }
 
+    @PutMapping("/fillWorkOrder")
+    @Operation(summary = "填写保养工单")
+    @PreAuthorize("@ss.hasPermission('pms:iot-main-work-order:update')")
+    public CommonResult<Boolean> fillWorkOrder(@Valid @RequestBody IotMainWorkOrderSaveVO saveVO) {
+        iotMainWorkOrderService.fillWorkOrder(saveVO);
+        return success(true);
+    }
+
     @DeleteMapping("/delete")
     @Operation(summary = "删除保养工单")
     @Parameter(name = "id", description = "编号", required = true)

+ 22 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmainworkorder/vo/IotMainWorkOrderSaveVO.java

@@ -0,0 +1,22 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo;
+
+import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbom.vo.IotMainWorkOrderBomSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbommaterial.vo.IotMainWorkOrderBomMaterialSaveReqVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+@Schema(description = "管理后台 - 保养工单 保存/修改 Request VO")
+@Data
+public class IotMainWorkOrderSaveVO {
+    @Schema(description = "保养工单主表")
+    private IotMainWorkOrderSaveReqVO mainWorkOrder;
+
+    @Schema(description = "保养工单明细")
+    private List<IotMainWorkOrderBomSaveReqVO> mainWorkOrderBom;
+
+    @Schema(description = "保养工单 物料")
+    private List<IotMainWorkOrderBomMaterialSaveReqVO> mainWorkOrderMaterials;
+
+}

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

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbommaterial;
 
+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;
@@ -77,6 +78,20 @@ public class IotMainWorkOrderBomMaterialController {
         return success(BeanUtils.toBean(pageResult, IotMainWorkOrderBomMaterialRespVO.class));
     }
 
+    @GetMapping("/workOrderMaterials")
+    @Operation(summary = "获得保养工单物料")
+    @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);
+    }
+
     @GetMapping("/export-excel")
     @Operation(summary = "导出PMS 保养工单明细设备BOM挂载物料关联 Excel")
     @PreAuthorize("@ss.hasPermission('pms:iot-main-work-order-bom-material:export')")

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

@@ -94,4 +94,9 @@ public class IotMainWorkOrderBomMaterialPageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
 
+    /**
+     * 扩展字段
+     */
+    @Schema(description = "部门id", example = "21957")
+    private Long deptId;
 }

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

@@ -117,4 +117,13 @@ public class IotMainWorkOrderBomMaterialRespVO {
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;
 
+    /**
+     * 扩展字段
+     */
+    @Schema(description = "总库存数量")
+    private BigDecimal totalInventoryQuantity;
+
+    @Schema(description = "单位", example = "kg")
+    private String unit;
+
 }

+ 3 - 3
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotcommonbommaterial/IotCommonBomMaterialMapper.java

@@ -34,9 +34,9 @@ public interface IotCommonBomMaterialMapper extends BaseMapperX<IotCommonBomMate
 
     default List<IotCommonBomMaterialDO> selectList(IotCommonBomMaterialSaveReqVO reqVO) {
         return selectList(new LambdaQueryWrapperX<IotCommonBomMaterialDO>()
-                .eq(IotCommonBomMaterialDO::getDeviceCategoryId, reqVO.getDeviceCategoryId())
-                .eq(IotCommonBomMaterialDO::getBomNodeId, reqVO.getBomNodeId())
-                .eq(IotCommonBomMaterialDO::getMaterialId, reqVO.getMaterialId()));
+                .eqIfPresent(IotCommonBomMaterialDO::getDeviceCategoryId, reqVO.getDeviceCategoryId())
+                .eqIfPresent(IotCommonBomMaterialDO::getBomNodeId, reqVO.getBomNodeId())
+                .eqIfPresent(IotCommonBomMaterialDO::getMaterialId, reqVO.getMaterialId()));
     }
 
 }

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

@@ -4,8 +4,14 @@ 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.iotmainworkorderbommaterial.vo.IotMainWorkOrderBomMaterialPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbommaterial.vo.IotMainWorkOrderBomMaterialRespVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbommaterial.IotMainWorkOrderBomMaterialDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.material.IotMaintainMaterialDO;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * PMS 保养工单明细设备BOM挂载物料关联 Mapper
@@ -45,4 +51,6 @@ 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);
 }

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

@@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotcommonbommaterial.vo.IotC
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotcommonbommaterial.IotCommonBomMaterialDO;
 
 import javax.validation.Valid;
+import java.util.List;
 
 /**
  * PMS 设备分类公共BOM挂载物料关联 Service 接口
@@ -52,4 +53,12 @@ public interface IotCommonBomMaterialService {
      */
     PageResult<IotCommonBomMaterialDO> getIotCommonBomMaterialPage(IotCommonBomMaterialPageReqVO pageReqVO);
 
+    /**
+     * 获得PMS 设备分类公共BOM挂载物料关联列表
+     *
+     * @param reqVO 列表查询
+     * @return PMS 设备分类公共BOM挂载物料关联列表
+     */
+    List<IotCommonBomMaterialDO> getIotCommonBomMaterials(IotCommonBomMaterialSaveReqVO reqVO);
+
 }

+ 5 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotcommonbommaterial/IotCommonBomMaterialServiceImpl.java

@@ -77,4 +77,9 @@ public class IotCommonBomMaterialServiceImpl implements IotCommonBomMaterialServ
         return iotCommonBomMaterialMapper.selectPage(pageReqVO);
     }
 
+    @Override
+    public List<IotCommonBomMaterialDO> getIotCommonBomMaterials(IotCommonBomMaterialSaveReqVO reqVO) {
+        return iotCommonBomMaterialMapper.selectList(reqVO);
+    }
+
 }

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

@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.pms.service.iotmainworkorder;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo.IotMainWorkOrderPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo.IotMainWorkOrderSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo.IotMainWorkOrderSaveVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorder.IotMainWorkOrderDO;
 
 import javax.validation.Valid;
@@ -73,4 +74,11 @@ public interface IotMainWorkOrderService {
      * @return
      */
     void batchAddOrders(List<IotMainWorkOrderDO> workOrders);
+
+    /**
+     * 填报 保养 工单
+     *
+     * @return
+     */
+    void fillWorkOrder(IotMainWorkOrderSaveVO saveVO);
 }

+ 53 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotmainworkorder/IotMainWorkOrderServiceImpl.java

@@ -1,18 +1,27 @@
 package cn.iocoder.yudao.module.pms.service.iotmainworkorder;
 
 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.module.pms.controller.admin.iotmainworkorder.vo.IotMainWorkOrderPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo.IotMainWorkOrderSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo.IotMainWorkOrderSaveVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbom.vo.IotMainWorkOrderBomSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbommaterial.vo.IotMainWorkOrderBomMaterialSaveReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorder.IotMainWorkOrderDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbom.IotMainWorkOrderBomDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbommaterial.IotMainWorkOrderBomMaterialDO;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotmainworkorder.IotMainWorkOrderMapper;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotmainworkorderbom.IotMainWorkOrderBomMapper;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotmainworkorderbommaterial.IotMainWorkOrderBomMaterialMapper;
 import cn.iocoder.yudao.module.pms.dal.redis.BizNoRedisDAO;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
-
+import java.util.ArrayList;
 import java.util.List;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -31,6 +40,10 @@ public class IotMainWorkOrderServiceImpl implements IotMainWorkOrderService {
     private IotMainWorkOrderMapper iotMainWorkOrderMapper;
     @Resource
     private BizNoRedisDAO bizNoRedisDAO;
+    @Resource
+    private IotMainWorkOrderBomMapper iotMainWorkOrderBomMapper;
+    @Resource
+    private IotMainWorkOrderBomMaterialMapper iotMainWorkOrderBomMaterialMapper;
 
     @Override
     public Long createIotMainWorkOrder(IotMainWorkOrderSaveReqVO createReqVO) {
@@ -90,4 +103,43 @@ public class IotMainWorkOrderServiceImpl implements IotMainWorkOrderService {
         iotMainWorkOrderMapper.insertBatch(workOrders);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void fillWorkOrder(IotMainWorkOrderSaveVO saveVO) {
+        if (ObjectUtil.isEmpty(saveVO)) {
+            throw exception(IOT_MAIN_WORK_ORDER_NOT_EXISTS);
+        }
+        IotMainWorkOrderSaveReqVO mainWorkOrder = saveVO.getMainWorkOrder();
+        if (ObjectUtil.isEmpty(saveVO.getMainWorkOrder())) {
+            throw exception(IOT_MAIN_WORK_ORDER_NOT_EXISTS);
+        }
+        List<IotMainWorkOrderBomSaveReqVO> workOrderBOMs = saveVO.getMainWorkOrderBom();
+        if (ObjectUtil.isEmpty(workOrderBOMs)) {
+            throw exception(IOT_MAIN_WORK_ORDER_NOT_EXISTS);
+        }
+        List<IotMainWorkOrderBomMaterialSaveReqVO> workOrderMaterials = saveVO.getMainWorkOrderMaterials();
+        if (ObjectUtil.isEmpty(workOrderMaterials)) {
+            throw exception(IOT_MAIN_WORK_ORDER_NOT_EXISTS);
+        }
+        // todo 保养工单 主表 还有 保养费用 、人工费用 、其他费用
+        IotMainWorkOrderDO updateObj = BeanUtils.toBean(mainWorkOrder, IotMainWorkOrderDO.class);
+        iotMainWorkOrderMapper.updateById(updateObj);
+        // 保养工单明细
+        List<IotMainWorkOrderBomDO> workOrderBomDOS = new ArrayList<>();
+        workOrderBOMs.forEach(bom -> {
+            IotMainWorkOrderBomDO tempBom = BeanUtils.toBean(bom, IotMainWorkOrderBomDO.class);
+            workOrderBomDOS.add(tempBom);
+        });
+        iotMainWorkOrderBomMapper.updateBatch(workOrderBomDOS);
+        // 保养工单 bom 明细关联的物料消耗
+        List<IotMainWorkOrderBomMaterialDO> workOrderBomMaterialDOS = new ArrayList<>();
+        workOrderMaterials.forEach(material -> {
+            IotMainWorkOrderBomMaterialDO tempMaterial = BeanUtils.toBean(material, IotMainWorkOrderBomMaterialDO.class);
+            tempMaterial.setWorkOrderId(mainWorkOrder.getId());
+            workOrderBomMaterialDOS.add(tempMaterial);
+        });
+        iotMainWorkOrderBomMaterialMapper.insertBatch(workOrderBomMaterialDOS);
+        // todo 处理库存减少
+    }
+
 }

+ 10 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotmainworkorderbommaterial/IotMainWorkOrderBomMaterialService.java

@@ -2,8 +2,11 @@ package cn.iocoder.yudao.module.pms.service.iotmainworkorderbommaterial;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 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.controller.admin.maintain.material.vo.IotMaintainMaterialPageReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbommaterial.IotMainWorkOrderBomMaterialDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.material.IotMaintainMaterialDO;
 
 import javax.validation.Valid;
 
@@ -52,4 +55,11 @@ public interface IotMainWorkOrderBomMaterialService {
      */
     PageResult<IotMainWorkOrderBomMaterialDO> getIotMainWorkOrderBomMaterialPage(IotMainWorkOrderBomMaterialPageReqVO pageReqVO);
 
+    /**
+     * 获得选择的 保养工单物料
+     *
+     * @param pageReqVO 请求对象 包含deptId
+     * @return 工单物料
+     */
+    PageResult<IotMainWorkOrderBomMaterialRespVO> selectMaterialsByDept(IotMainWorkOrderBomMaterialPageReqVO pageReqVO);
 }

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

@@ -1,15 +1,30 @@
 package cn.iocoder.yudao.module.pms.service.iotmainworkorderbommaterial;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.iocoder.yudao.framework.common.exception.ServiceException;
 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.iotcommonbommaterial.vo.IotCommonBomMaterialSaveReqVO;
 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.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.iotcommonbommaterial.IotCommonBomMaterialService;
+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;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_MAIN_WORK_ORDER_BOM_MATERIAL_NOT_EXISTS;
@@ -26,6 +41,10 @@ public class IotMainWorkOrderBomMaterialServiceImpl implements IotMainWorkOrderB
 
     @Resource
     private IotMainWorkOrderBomMaterialMapper iotMainWorkOrderBomMaterialMapper;
+    @Autowired
+    private DeptService deptService;
+    @Autowired
+    private IotCommonBomMaterialService iotCommonBomMaterialService;
 
     @Override
     public Long createIotMainWorkOrderBomMaterial(IotMainWorkOrderBomMaterialSaveReqVO createReqVO) {
@@ -69,4 +88,23 @@ public class IotMainWorkOrderBomMaterialServiceImpl implements IotMainWorkOrderB
         return iotMainWorkOrderBomMaterialMapper.selectPage(pageReqVO);
     }
 
+    @Override
+    public PageResult<IotMainWorkOrderBomMaterialRespVO> selectMaterialsByDept(IotMainWorkOrderBomMaterialPageReqVO pageReqVO) {
+        DeptDO dept = deptService.getDept(pageReqVO.getDeptId());
+        if (Objects.isNull(dept)) {throw new ServiceException();}
+        // 查询 bom 节点已经关联的物料列表
+        IotCommonBomMaterialSaveReqVO reqVO = new IotCommonBomMaterialSaveReqVO();
+        reqVO.setBomNodeId(pageReqVO.getBomNodeId());
+        List<IotCommonBomMaterialDO> bomMaterials = iotCommonBomMaterialService.getIotCommonBomMaterials(reqVO);
+        List<String> materialCodes = new ArrayList<>();
+        if (CollUtil.isNotEmpty(bomMaterials)) {
+            materialCodes = bomMaterials.stream()
+                    .map(IotCommonBomMaterialDO::getCode) // 提取每个元素的 code 属性
+                    .collect(Collectors.toList());
+        }
+        IPage<IotMainWorkOrderBomMaterialRespVO> iotMaintainMaterialDOIPage =
+                iotMainWorkOrderBomMaterialMapper.selectMaterialsByDept(Page.of(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO.getDeptId(), dept.getParentId(), materialCodes);
+        return new PageResult<>(iotMaintainMaterialDOIPage.getRecords(), iotMaintainMaterialDOIPage.getTotal());
+    }
+
 }

+ 88 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotWorkOrderMaterialMapper.xml

@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!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"
+            resultType="cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbommaterial.vo.IotMainWorkOrderBomMaterialRespVO">
+        -- 本地库存中与bom节点关联的物料
+        SELECT
+            lo.material_code AS materialCode,
+            lo.material_name AS materialName,
+            lo.unit_price AS unitPrice,
+            lo.quantity AS totalInventoryQuantity,
+            lo.unit AS unit,
+            '本地库存' AS materialSource
+        FROM
+            rq_iot_lock_stock lo
+        WHERE
+            lo.dept_id = #{deptId}
+        <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>
+
+        UNION ALL
+        -- 本地库存物料
+        SELECT
+            lo.material_code AS materialCode,
+            lo.material_name AS materialName,
+            lo.unit_price AS unitPrice,
+            lo.quantity AS totalInventoryQuantity,
+            lo.unit AS unit,
+            '本地库存' AS materialSource
+        FROM
+            rq_iot_lock_stock lo
+        WHERE
+            lo.dept_id = #{deptId}
+        <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>
+
+        UNION ALL
+
+        -- sap库存物料
+        SELECT
+            sap.material_code AS materialCode,
+            sap.material_name AS materialName,
+            sap.unit_price AS unitPrice,
+            sap.quantity AS totalInventoryQuantity,
+            sap.unit AS unit,
+            'sap库存' AS materialSource
+        FROM
+            rq_iot_sap_stock sap
+        WHERE
+            sap.dept_id = #{parentDept}
+        <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>
+
+        UNION ALL
+        -- sap库存物料
+        SELECT
+            sap.material_code AS materialCode,
+            sap.material_name AS materialName,
+            sap.unit_price AS unitPrice,
+            sap.quantity AS totalInventoryQuantity,
+            sap.unit AS unit,
+            'sap库存' AS materialSource
+        FROM
+            rq_iot_sap_stock sap
+        WHERE
+            sap.dept_id = #{parentDept}
+        <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>
+
+    </select>
+</mapper>