ソースを参照

Merge remote-tracking branch 'origin/master'

lipenghui 3 ヶ月 前
コミット
26635f048c
18 ファイル変更354 行追加61 行削除
  1. 35 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdevicebom/IotDeviceBomController.java
  2. 9 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdevicebom/vo/IotDeviceBomRespVO.java
  3. 6 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdevicematerial/vo/IotDeviceMaterialSaveReqVO.java
  4. 1 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmaintenancebom/vo/IotTobeMaintenanceBomRespVO.java
  5. 10 2
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmaterial/IotMaterialController.java
  6. 0 2
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotdevicebom/IotDeviceBomMapper.java
  7. 13 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotdevicematerial/IotDeviceMaterialMapper.java
  8. 8 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotmaterial/IotMaterialMapper.java
  9. 16 2
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/maintenance/IotMaintenancePlanMapper.java
  10. 127 36
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/mainworkorder/CreateMainWorkOrderJob.java
  11. 75 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotbom/IotBomServiceImpl.java
  12. 8 2
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdevicematerial/IotDeviceMaterialService.java
  13. 6 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdevicematerial/IotDeviceMaterialServiceImpl.java
  14. 8 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotmaterial/IotMaterialService.java
  15. 5 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotmaterial/IotMaterialServiceImpl.java
  16. 8 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/maintenance/IotMaintenancePlanService.java
  17. 14 3
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/maintenance/IotMaintenancePlanServiceImpl.java
  18. 5 10
      yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotDeviceRunLogMapper.xml

+ 35 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdevicebom/IotDeviceBomController.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.pms.controller.admin.iotdevicebom;
 
+import cn.hutool.core.collection.CollUtil;
 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;
@@ -8,8 +9,11 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicebom.vo.*;
+import cn.iocoder.yudao.module.pms.controller.admin.iotdevicematerial.vo.IotDeviceMaterialSaveReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicebom.IotDeviceBomDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicematerial.IotDeviceMaterialDO;
 import cn.iocoder.yudao.module.pms.service.iotdevicebom.IotDeviceBomService;
+import cn.iocoder.yudao.module.pms.service.iotdevicematerial.IotDeviceMaterialService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -21,7 +25,11 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -34,6 +42,8 @@ public class IotDeviceBomController {
 
     @Resource
     private IotDeviceBomService iotDeviceBomService;
+    @Resource
+    private IotDeviceMaterialService iotDeviceMaterialService;
 
     @PostMapping("/create")
     @Operation(summary = "创建PMS 设备BOM 关系")
@@ -89,7 +99,31 @@ public class IotDeviceBomController {
     @PreAuthorize("@ss.hasPermission('rq:iot-material-group:query')")
     public CommonResult<List<IotDeviceBomRespVO>> getDeviceBomList(IotDeviceBomListReqVO reqVO) {
         List<IotDeviceBomDO> list = iotDeviceBomService.getDeviceBomList(reqVO);
-        return success(BeanUtils.toBean(list, IotDeviceBomRespVO.class));
+        if (CollUtil.isEmpty(list)) {
+            return success(Collections.emptyList());
+        }
+        // 当前设备 设备类别 下所有BOM节点
+        List<Long> bomNodeIds = list.stream()
+                .map(IotDeviceBomDO::getId)
+                .collect(Collectors.toList());
+        IotDeviceMaterialSaveReqVO saveReqVO = new IotDeviceMaterialSaveReqVO();
+        saveReqVO.setBomNodeIds(bomNodeIds);
+        // 查询所有bom节点已经绑定的物料列表
+        List<IotDeviceMaterialDO> deviceMaterials = iotDeviceMaterialService.getIotDeviceMaterials(saveReqVO);
+        Map<Long, Integer> bomMaterialCount = new HashMap<>();
+        if (CollUtil.isNotEmpty(deviceMaterials)) {
+            deviceMaterials.forEach(material -> {
+                if (bomMaterialCount.containsKey(material.getBomNodeId())) {
+                    bomMaterialCount.put(material.getBomNodeId(), bomMaterialCount.get(material.getBomNodeId())+1);
+                } else {
+                    bomMaterialCount.put(material.getBomNodeId(), 1);
+                }
+            });
+        }
+        return success(BeanUtils.toBean(list, IotDeviceBomRespVO.class, bom -> {
+            Integer materialCount = bomMaterialCount.getOrDefault(bom.getId(), 0);
+            bom.setMaterials(materialCount);
+        }));
     }
 
     @GetMapping("/export-excel")

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

@@ -73,4 +73,13 @@ public class IotDeviceBomRespVO {
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;
 
+    /**
+     * 扩展字段
+     */
+    @Schema(description = "已经绑定的物料数量")
+    private Integer materials;
+
+    @Schema(description = "所属设备分类名称", example = "空压机")
+    @ExcelProperty("所属设备分类")
+    private String deviceCategoryName;
 }

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

@@ -5,6 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 @Schema(description = "管理后台 - PMS 设备BOM物料关联新增/修改 Request VO")
 @Data
@@ -41,4 +42,9 @@ public class IotDeviceMaterialSaveReqVO {
     @Schema(description = "备注", example = "你说的对")
     private String remark;
 
+    /**
+     * 扩展字段
+     */
+    @Schema(description = "bom节点id集合", example = "随便")
+    private List<Long> bomNodeIds;
 }

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmaintenancebom/vo/IotTobeMaintenanceBomRespVO.java

@@ -172,6 +172,6 @@ public class IotTobeMaintenanceBomRespVO {
     /**
      * 新生成的保养工单id
      */
-    @Schema(description = "需要根据自然日周期保养")
+    @Schema(description = "保养工单id")
     private Long workOrderId;
 }

+ 10 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmaterial/IotMaterialController.java

@@ -114,8 +114,16 @@ public class IotMaterialController {
     @Operation(summary = "根据设备分类bom节点id获取物料列表")
     @PreAuthorize("@ss.hasPermission('rq:iot-material:query')")
     public CommonResult<PageResult<IotMaterialRespVO>> getMaterialsByBomId(@Valid IotMaterialPageReqVO reqVO) {
-        PageResult<IotMaterialDO> deviceTemplateAttrs = iotMaterialService.getMaterialsByBomId(reqVO);
-        return success(buildMaterialVOPageResult(deviceTemplateAttrs));
+        PageResult<IotMaterialDO> bomMaterials = iotMaterialService.getMaterialsByBomId(reqVO);
+        return success(buildMaterialVOPageResult(bomMaterials));
+    }
+
+    @GetMapping("/list-by-device-bom-id")
+    @Operation(summary = "根据设备bom节点id获取物料列表")
+    @PreAuthorize("@ss.hasPermission('rq:iot-material:query')")
+    public CommonResult<PageResult<IotMaterialRespVO>> getMaterialsByDeviceBomId(@Valid IotMaterialPageReqVO reqVO) {
+        PageResult<IotMaterialDO> deviceMaterials = iotMaterialService.getMaterialsByDeviceBomId(reqVO);
+        return success(buildMaterialVOPageResult(deviceMaterials));
     }
 
     @GetMapping("/export-excel")

+ 0 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotdevicebom/IotDeviceBomMapper.java

@@ -5,9 +5,7 @@ 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.iotdevicebom.vo.IotDeviceBomListReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicebom.vo.IotDeviceBomPageReqVO;
-import cn.iocoder.yudao.module.pms.controller.admin.iotmaterialgroup.vo.IotMaterialGroupListReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicebom.IotDeviceBomDO;
-import cn.iocoder.yudao.module.pms.dal.dataobject.iotmaterialgroup.IotMaterialGroupDO;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.util.List;

+ 13 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotdevicematerial/IotDeviceMaterialMapper.java

@@ -1,16 +1,21 @@
 package cn.iocoder.yudao.module.pms.dal.mysql.iotdevicematerial;
 
+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.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
+import cn.iocoder.yudao.module.pms.controller.admin.iotcommonbommaterial.vo.IotCommonBomMaterialSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicematerial.vo.IotDeviceMaterialPageReqVO;
-import cn.iocoder.yudao.module.pms.controller.admin.iotmaterial.vo.IotMaterialPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotdevicematerial.vo.IotDeviceMaterialSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotcommonbommaterial.IotCommonBomMaterialDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicematerial.IotDeviceMaterialDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmaterial.IotMaterialDO;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.List;
+
 /**
  * PMS 设备BOM物料关联 Mapper
  *
@@ -41,4 +46,11 @@ public interface IotDeviceMaterialMapper extends BaseMapperX<IotDeviceMaterialDO
         return selectJoinPage(reqVO, IotDeviceMaterialDO.class, query);
     }
 
+    default List<IotDeviceMaterialDO> selectList(IotDeviceMaterialSaveReqVO reqVO) {
+        MPJLambdaWrapperX<IotDeviceMaterialDO> query = new MPJLambdaWrapperX<IotDeviceMaterialDO>();
+        query.innerJoin(IotMaterialDO.class, IotMaterialDO::getId, IotDeviceMaterialDO::getMaterialId)
+                .eq(ObjectUtil.isNotEmpty(reqVO.getDeviceCategoryId()), IotDeviceMaterialDO::getDeviceCategoryId, reqVO.getDeviceCategoryId())
+                .in(CollUtil.isNotEmpty(reqVO.getBomNodeIds()), IotDeviceMaterialDO::getBomNodeId, reqVO.getBomNodeIds());
+        return selectJoinList(IotDeviceMaterialDO.class, query);
+    }
 }

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

@@ -55,4 +55,12 @@ public interface IotMaterialMapper extends BaseMapperX<IotMaterialDO> {
         return selectJoinPage(reqVO, IotMaterialDO.class, query);
     }
 
+    default PageResult<IotMaterialDO> getMaterialsByDeviceBomId(IotMaterialPageReqVO reqVO) {
+        MPJLambdaWrapperX<IotMaterialDO> query = new MPJLambdaWrapperX<IotMaterialDO>();
+        query.leftJoin(IotDeviceMaterialDO.class, IotDeviceMaterialDO::getMaterialId, IotMaterialDO::getId)
+                .eq(ObjectUtil.isNotNull(reqVO.getBomId()), IotDeviceMaterialDO::getBomNodeId, reqVO.getBomId())
+                .like(IotDeviceMaterialDO::getName, reqVO.getName());
+        return selectJoinPage(reqVO, IotMaterialDO.class, query);
+    }
+
 }

+ 16 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/maintenance/IotMaintenancePlanMapper.java

@@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenanc
 import cn.iocoder.yudao.module.pms.dal.dataobject.maintenance.IotMaintenancePlanDO;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.Collection;
 import java.util.List;
 
 /**
@@ -18,8 +19,22 @@ import java.util.List;
 @Mapper
 public interface IotMaintenancePlanMapper extends BaseMapperX<IotMaintenancePlanDO> {
 
-    default PageResult<IotMaintenancePlanDO> selectPage(IotMaintenancePlanPageReqVO reqVO) {
+    default PageResult<IotMaintenancePlanDO> selectPage(IotMaintenancePlanPageReqVO reqVO, Collection<Long> ids) {
         return selectPage(reqVO, new LambdaQueryWrapperX<IotMaintenancePlanDO>()
+                .eqIfPresent(IotMaintenancePlanDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(IotMaintenancePlanDO::getSerialNumber, reqVO.getSerialNumber())
+                .likeIfPresent(IotMaintenancePlanDO::getName, reqVO.getName())
+                .eqIfPresent(IotMaintenancePlanDO::getResponsiblePerson, reqVO.getResponsiblePerson())
+                .likeIfPresent(IotMaintenancePlanDO::getResponsiblePersonName, reqVO.getResponsiblePersonName())
+                .eqIfPresent(IotMaintenancePlanDO::getRemark, reqVO.getRemark())
+                .eqIfPresent(IotMaintenancePlanDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(IotMaintenancePlanDO::getCreateTime, reqVO.getCreateTime())
+                .inIfPresent(IotMaintenancePlanDO::getDeptId, ids)
+                .orderByDesc(IotMaintenancePlanDO::getId));
+    }
+
+    default List<IotMaintenancePlanDO> selectList(IotMaintenancePlanPageReqVO reqVO) {
+        return selectList(new LambdaQueryWrapperX<IotMaintenancePlanDO>()
                 .eqIfPresent(IotMaintenancePlanDO::getDeptId, reqVO.getDeptId())
                 .eqIfPresent(IotMaintenancePlanDO::getSerialNumber, reqVO.getSerialNumber())
                 .likeIfPresent(IotMaintenancePlanDO::getName, reqVO.getName())
@@ -35,6 +50,5 @@ public interface IotMaintenancePlanMapper extends BaseMapperX<IotMaintenancePlan
         return selectOne(IotMaintenancePlanDO::getSerialNumber, no);
     }
 
-
     List<IotTobeMaintenanceBomRespVO> toBeMaintenanceDeviceBOMs();
 }

+ 127 - 36
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/mainworkorder/CreateMainWorkOrderJob.java

@@ -1,15 +1,22 @@
 package cn.iocoder.yudao.module.pms.job.mainworkorder;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjUtil;
 import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
 import cn.iocoder.yudao.framework.tenant.core.job.TenantJob;
-import cn.iocoder.yudao.module.pms.controller.admin.iotmaintenancebom.vo.IotTobeMaintenanceBomRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotdeviceperson.vo.IotDevicePersonPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotdevicerunlog.vo.IotDeviceRunLogRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotmaintenancebom.vo.IotMaintenanceBomPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenancePlanPageReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotdeviceperson.IotDevicePersonDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotmaintenancebom.IotMaintenanceBomDO;
 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.mysql.inspect.IotInspectOrderDetailMapper;
-import cn.iocoder.yudao.module.pms.dal.mysql.inspect.IotInspectOrderMapper;
-import cn.iocoder.yudao.module.pms.dal.mysql.inspect.IotInspectPlanMapper;
+import cn.iocoder.yudao.module.pms.dal.dataobject.maintenance.IotMaintenancePlanDO;
 import cn.iocoder.yudao.module.pms.enums.common.FailureAuditStatusEnum;
+import cn.iocoder.yudao.module.pms.service.iotdeviceperson.IotDevicePersonService;
+import cn.iocoder.yudao.module.pms.service.iotdevicerunlog.IotDeviceRunLogService;
+import cn.iocoder.yudao.module.pms.service.iotmaintenancebom.IotMaintenanceBomService;
 import cn.iocoder.yudao.module.pms.service.iotmainworkorder.IotMainWorkOrderService;
 import cn.iocoder.yudao.module.pms.service.iotmainworkorderbom.IotMainWorkOrderBomService;
 import cn.iocoder.yudao.module.pms.service.maintenance.IotMaintenancePlanService;
@@ -18,21 +25,26 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Stream;
+
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertListByFlatMap;
 
 @Component
 @Slf4j
 public class CreateMainWorkOrderJob implements JobHandler {
     @Resource
-    private IotInspectPlanMapper iotInspectPlanMapper;
+    private IotDevicePersonService iotDevicePersonService;
     @Resource
-    private IotInspectOrderMapper iotInspectOrderMapper;
+    private IotMaintenanceBomService iotMaintenanceBomService;
     @Autowired
-    private IotInspectOrderDetailMapper iotInspectOrderDetailMapper;
+    private IotDeviceRunLogService iotDeviceRunLogService;
 
     @Resource
     private IotMaintenancePlanService iotMaintenancePlanService;
@@ -44,15 +56,91 @@ public class CreateMainWorkOrderJob implements JobHandler {
     @Override
     @TenantJob
     public String execute(String param) throws Exception {
-        // 查询所有的 在保养规则周期内的 设备-bom 关联信息
-        List<IotTobeMaintenanceBomRespVO> tobeMaintenanceBomRespVOS = iotMaintenancePlanService.toBeMaintenanceDeviceBOMs();
+        // 查询所有 保养计划明细
+        IotMaintenanceBomPageReqVO reqVO = new IotMaintenanceBomPageReqVO();
+        List<IotMaintenanceBomDO> mainBomList = iotMaintenanceBomService.getIotMainPlanBomList(reqVO);
+        // 查询所有保养计划 保养工单会复制保养计划的部分信息
+        IotMaintenancePlanPageReqVO planReqVO = new IotMaintenancePlanPageReqVO();
+        List<IotMaintenancePlanDO> plans = iotMaintenancePlanService.maintenancePlans(planReqVO);
+        if (CollUtil.isEmpty(plans)) {
+            return "没有待保养项";
+        }
+        if (CollUtil.isEmpty(mainBomList)) {
+            return "没有待保养项";
+        }
+        List<Long> deviceIds = new ArrayList<>();
+        mainBomList.forEach(bom -> {
+            // 查询保养计划明细中所有设备id
+            deviceIds.add(bom.getDeviceId());
+        });
+        if (CollUtil.isEmpty(deviceIds)) {
+            return "没有设备信息";
+        }
+        // 查询所有设备的责任人
+        IotDevicePersonPageReqVO devicePersonReqVO = new IotDevicePersonPageReqVO();
+        devicePersonReqVO.setDeviceIds(deviceIds);
+        List<IotDevicePersonDO> devicePersons = iotDevicePersonService.getPersonsByDeviceIds(devicePersonReqVO);
 
-        Map<String, IotTobeMaintenanceBomRespVO> maintenancePair = new HashMap<>();
-        Map<String, Long> workOrderIdPair = new HashMap<>();
-        if (CollUtil.isNotEmpty(tobeMaintenanceBomRespVOS)) {
-            tobeMaintenanceBomRespVOS.forEach(maintenance -> {
-                maintenancePair.put(maintenance.getSerialNumber(), maintenance);
-            });
+        // 查询保养计划明细中所有设备的累计运行里程、累计运行时间
+        Map<Long, IotDeviceRunLogRespVO> deviceRunLogMap = iotDeviceRunLogService.getDeviceRunLogMap(convertListByFlatMap(mainBomList,
+                bom -> Stream.of(bom.getDeviceId())));
+        List<IotMaintenanceBomDO> tobeMaintenanceBomList = new ArrayList<>();
+                // 遍历保养计划明细 根据保养项规则 筛选出当前满足保养项规则的 明细记录
+        mainBomList.forEach(bom -> {
+            if (deviceRunLogMap.containsKey(bom.getDeviceId())) {
+                BigDecimal totalRunTime = deviceRunLogMap.get(bom.getDeviceId()).getTotalRunTime();
+                BigDecimal totalMileage = deviceRunLogMap.get(bom.getDeviceId()).getTotalMileage();
+                boolean runningTimeArrive = false;
+                boolean runningKiloArrive = false;
+                boolean naturalDateArrive = false;
+                if (0 == bom.getRunningTimeRule()) {
+                    // 累计运行时间规则   累计运行时间 >= (上次保养运行时间+运行时间周期-提前量)
+                    BigDecimal lastRunningTime = bom.getLastRunningTime();      // 上次保养运行时间
+                    BigDecimal runningTimePeriod = bom.getNextRunningTime();    // 运行时间周期
+                    BigDecimal timePeriodLead = bom.getTimePeriodLead();    // 运行时间周期提前量
+                    if (totalRunTime.compareTo(lastRunningTime.add(runningTimePeriod).subtract(timePeriodLead)) >= 0) {
+                        runningTimeArrive = true;
+                    }
+                }
+                if (0 == bom.getMileageRule()) {
+                    // 累计运行里程规则 累计运行里程 >= (上次保养运行里程+运行里程周期-提前量)
+                    BigDecimal lastRunningKilo = bom.getLastRunningKilometers();      // 上次保养运行里程
+                    BigDecimal runningKiloPeriod = bom.getNextRunningKilometers();    // 运行里程周期
+                    BigDecimal kiloCycleLead = bom.getKiloCycleLead();    // 运行里程周期提前量
+                    if (totalMileage.compareTo(lastRunningKilo.add(runningKiloPeriod).subtract(kiloCycleLead)) >= 0) {
+                        runningKiloArrive = true;
+                    }
+
+                }
+                if (0 == bom.getNaturalDateRule()) {
+                    // 自然日期规则  当前日期 >= (上次保养自然日期+自然日周期-提前量)
+                    LocalDateTime lastNaturalDate = bom.getLastNaturalDate();      // 上次保养自然日期
+                    BigDecimal naturalDatePeriod = bom.getNextNaturalDate();        // 自然日周期
+                    BigDecimal natualDateLead = bom.getNaturalDatePeriodLead();    // 自然日周期提前量
+                    if (ObjUtil.isNotEmpty(lastNaturalDate) && ObjUtil.isNotEmpty(lastNaturalDate) && ObjUtil.isNotEmpty(lastNaturalDate)) {
+                        // 计算有效天数 = 自然日周期 - 提前量
+                        long days = naturalDatePeriod.subtract(natualDateLead).longValue(); // 转为长整型天数
+                        // 计算目标日期:上次保养日期 + 有效天数(注意:LocalDateTime加天数会自动处理日期进位)
+                        LocalDateTime targetDate = lastNaturalDate.plusDays(days);
+                        // 获取当前日期时间(可根据需求调整为指定时区,如:ZoneId.systemDefault())
+                        LocalDateTime now = LocalDateTime.now();
+                        // 判断当前时间是否大于等于目标日期
+                        naturalDateArrive = now.isAfter(targetDate) || now.isEqual(targetDate);
+                    }
+                }
+                if (runningTimeArrive || runningKiloArrive || naturalDateArrive) {
+                    // 3个保养规则中有任何一个规则达到条件即触发 保养
+                    tobeMaintenanceBomList.add(bom);
+                }
+            }
+        });
+
+        Map<String, IotMaintenancePlanDO> maintenancePair = new HashMap<>();
+        plans.forEach(plan -> {
+            maintenancePair.put(plan.getSerialNumber(), plan);
+        });
+        Map<Long, Long> workOrderIdPair = new HashMap<>();
+        if (CollUtil.isNotEmpty(tobeMaintenanceBomList)) {
             // 暂时使用以保养计划为维度,生成保养工单
             // 查询最新的保养工单id
             AtomicReference<Long> theMaxId = new AtomicReference<>(iotMainWorkOrderService.theMaxId());
@@ -66,35 +154,38 @@ public class CreateMainWorkOrderJob implements JobHandler {
                 workOrder.setDeptId(v.getDeptId());
                 workOrder.setPlanId(v.getId());
                 workOrder.setOrderNumber(iotMainWorkOrderService.createWorkOrderNumber());
-                workOrder.setName(v.getPlanName());
+                workOrder.setName(v.getName() + " 工单");
                 workOrder.setType(1);   // 计划生成
+                workOrder.setResult(1); // 待执行
                 workOrder.setResponsiblePerson(v.getResponsiblePerson());
                 workOrder.setAuditStatus(FailureAuditStatusEnum.DRAFT.getStatus());
                 workOrder.setCreator(v.getResponsiblePerson());
                 workOrders.add(workOrder);
-                workOrderIdPair.put(k, theMaxId.get());
+                workOrderIdPair.put(v.getId(), theMaxId.get());
             });
             // 组装 工单明细 集合
-            tobeMaintenanceBomRespVOS.forEach(maintenance -> {
+            // 根据保养计划明细中的 保养项的保养规则 生成保养工单明细
+            // 查询保养计划明细中设备累计运行时间、累计运行里程
+            tobeMaintenanceBomList.forEach(bom -> {
                 IotMainWorkOrderBomDO workOrderBom = new IotMainWorkOrderBomDO();
-                workOrderBom.setWorkOrderId(workOrderIdPair.get(maintenance.getSerialNumber()));
-                workOrderBom.setDeviceCategoryId(maintenance.getDeviceCategoryId());
-                workOrderBom.setDeviceId(maintenance.getDeviceId());
-                workOrderBom.setMileageRule(maintenance.getMileageRule());
-                workOrderBom.setRunningTimeRule(maintenance.getRunningTimeRule());
-                workOrderBom.setNaturalDateRule(maintenance.getNaturalDateRule());
-                workOrderBom.setLastRunningTime(maintenance.getLastRunningTime());
-                workOrderBom.setNextRunningTime(maintenance.getNextRunningTime());
-                workOrderBom.setTimePeriodLead(maintenance.getTimePeriodLead());
-                workOrderBom.setLastRunningKilometers(maintenance.getLastRunningKilometers());
-                workOrderBom.setNextRunningKilometers(maintenance.getNextRunningKilometers());
-                workOrderBom.setKiloCycleLead(maintenance.getKiloCycleLead());
-                workOrderBom.setLastNaturalDate(maintenance.getLastNaturalDate());
-                workOrderBom.setNextNaturalDate(maintenance.getNextNaturalDate());
-                workOrderBom.setNaturalDatePeriodLead(maintenance.getNaturalDatePeriodLead());
-                workOrderBom.setBomNodeId(maintenance.getBomNodeId());
-                workOrderBom.setName(maintenance.getNodeName());
-                workOrderBom.setCode(maintenance.getCode());
+                workOrderBom.setWorkOrderId(workOrderIdPair.get(bom.getPlanId()));
+                workOrderBom.setDeviceCategoryId(bom.getDeviceCategoryId());
+                workOrderBom.setDeviceId(bom.getDeviceId());
+                workOrderBom.setMileageRule(bom.getMileageRule());
+                workOrderBom.setRunningTimeRule(bom.getRunningTimeRule());
+                workOrderBom.setNaturalDateRule(bom.getNaturalDateRule());
+                workOrderBom.setLastRunningTime(bom.getLastRunningTime());
+                workOrderBom.setNextRunningTime(bom.getNextRunningTime());
+                workOrderBom.setTimePeriodLead(bom.getTimePeriodLead());
+                workOrderBom.setLastRunningKilometers(bom.getLastRunningKilometers());
+                workOrderBom.setNextRunningKilometers(bom.getNextRunningKilometers());
+                workOrderBom.setKiloCycleLead(bom.getKiloCycleLead());
+                workOrderBom.setLastNaturalDate(bom.getLastNaturalDate());
+                workOrderBom.setNextNaturalDate(bom.getNextNaturalDate());
+                workOrderBom.setNaturalDatePeriodLead(bom.getNaturalDatePeriodLead());
+                workOrderBom.setBomNodeId(bom.getBomNodeId());
+                workOrderBom.setName(bom.getName());
+                workOrderBom.setCode(bom.getCode());
                 workOrderBOMs.add(workOrderBom);
             });
             // 批量新增 保养工单记录

+ 75 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotbom/IotBomServiceImpl.java

@@ -7,13 +7,18 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.iotbom.vo.IotBomListReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotbom.vo.IotBomPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotbom.vo.IotBomSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotcommonbommaterial.vo.IotCommonBomMaterialSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDevicePageReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotbom.IotBomDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotcommonbommaterial.IotCommonBomMaterialDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicebom.IotDeviceBomDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicematerial.IotDeviceMaterialDO;
 import cn.iocoder.yudao.module.pms.dal.mysql.IotDeviceMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotbom.IotBomMapper;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotcommonbommaterial.IotCommonBomMaterialMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotdevicebom.IotDeviceBomMapper;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotdevicematerial.IotDeviceMaterialMapper;
 import cn.iocoder.yudao.module.pms.service.IotProductClassifyService;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -24,8 +29,11 @@ import org.springframework.validation.annotation.Validated;
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
 import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertListByFlatMap;
 import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_BOM_NOT_EXISTS;
 
 /**
@@ -45,6 +53,10 @@ public class IotBomServiceImpl implements IotBomService {
     private IotDeviceBomMapper iotDeviceBomMapper;
     @Resource
     private IotDeviceMapper iotDeviceMapper;
+    @Resource
+    private IotCommonBomMaterialMapper iotCommonBomMaterialMapper;
+    @Resource
+    private IotDeviceMaterialMapper iotDeviceMaterialMapper;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -84,7 +96,20 @@ public class IotBomServiceImpl implements IotBomService {
             List<IotBomDO> bomList = deviceCategoryBom(updateObj.getDeviceCategoryId());
             // 3. 构建树形结构并获取层级顺序
             List<IotBomDO> orderedBoms = buildHierarchyOrder(bomList);
+            // 当前设备分类下所有bom节点id
+            List<Long> bomIds = convertListByFlatMap(orderedBoms, bom -> Stream.of(bom.getId()));
+            IotCommonBomMaterialSaveReqVO saveReqVO = new IotCommonBomMaterialSaveReqVO();
+            saveReqVO.setBomNodeIds(bomIds);
+            List<IotCommonBomMaterialDO> bomMaterials = iotCommonBomMaterialMapper.selectList(saveReqVO);
+            Map<Long, List<IotCommonBomMaterialDO>> bomNodeMaterialMap = bomMaterials.stream()
+                    .collect(Collectors.groupingBy(
+                            IotCommonBomMaterialDO::getBomNodeId,  // 分组键:提取 bomNodeId
+                            Collectors.toList()                      // 分组值:保存为列表
+                    ));
+            // 设备bom列表
             List<IotDeviceBomDO> resultDeviceBomList = new ArrayList<>();
+            // 设备bom关联物料列表
+            List<IotDeviceMaterialDO> deviceMaterialList = new ArrayList<>();
             List<Long> deviceIds = new ArrayList<>();
             devices.forEach(device -> {
                 deviceIds.add(device.getId());
@@ -93,11 +118,18 @@ public class IotBomServiceImpl implements IotBomService {
                 orderedBoms.forEach(bom -> idMapping.put(bom.getId(), IdGenerator.nextId()));
                 // 5. 转换目标对象
                 List<IotDeviceBomDO> targetBoms = convertBoms(orderedBoms, idMapping, device.getId());
+                // 转换 bom关联的物料 目标对象
+                List<IotDeviceMaterialDO> targetDeviceMaterials = convertBomMaterials(idMapping, device.getAssetClass(), device.getId(), bomNodeMaterialMap);
                 resultDeviceBomList.addAll(targetBoms);
+                deviceMaterialList.addAll(targetDeviceMaterials);
             });
             if (CollUtil.isNotEmpty(resultDeviceBomList)) {
                 // 批量插入设备BOM
                 iotDeviceBomMapper.insertBatch(resultDeviceBomList);
+                if (CollUtil.isNotEmpty(deviceMaterialList)) {
+                    // 批量插入设备关联的物料
+                    iotDeviceMaterialMapper.insertBatch(deviceMaterialList);
+                }
                 // 批量设置 设备 的BOM同步标识 bom_sync_status = 1
                 batchUpdateBomSyncStatus(deviceIds);
             }
@@ -175,11 +207,25 @@ public class IotBomServiceImpl implements IotBomService {
         }
         // 2. 构建树形结构并获取层级顺序
         List<IotBomDO> orderedBoms = buildHierarchyOrder(sourceBoms);
+        // 查询当前所有BOM节点关联的所有物料
+        List<Long> bomIds = convertListByFlatMap(orderedBoms, bom -> Stream.of(bom.getId()));
+        IotCommonBomMaterialSaveReqVO reqVO = new IotCommonBomMaterialSaveReqVO();
+        reqVO.setBomNodeIds(bomIds);
+        List<IotCommonBomMaterialDO> bomMaterials = iotCommonBomMaterialMapper.selectList(reqVO);
+        Map<Long, List<IotCommonBomMaterialDO>> bomNodeMaterialMap = bomMaterials.stream()
+                .collect(Collectors.groupingBy(
+                        IotCommonBomMaterialDO::getBomNodeId,  // 分组键:提取 bomNodeId
+                        Collectors.toList()                      // 分组值:保存为列表
+                ));
         // 3. 生成ID映射关系
         Map<Long, Long> idMapping = new LinkedHashMap<>();
         orderedBoms.forEach(bom -> idMapping.put(bom.getId(), IdGenerator.nextId()));
         // 4. 转换目标对象
         List<IotDeviceBomDO> targetBoms = convertBoms(orderedBoms, idMapping, deviceId);
+        // 转换 bom关联的物料 目标对象
+        List<IotDeviceMaterialDO> targetDeviceMaterials = convertBomMaterials(idMapping, deviceCategoryId, deviceId, bomNodeMaterialMap);
+        // 批量插入 设备bom关联的物料  // 设备分类BOM已经挂载的物料 也要拷贝到 设备BOM关联物料表
+        iotDeviceMaterialMapper.insertBatch(targetDeviceMaterials);
         // 批量插入设备BOM
         iotDeviceBomMapper.insertBatch(targetBoms);
         // 拷贝BOM成功后 设置设备 bom_sync_status 字段 为 1已同步
@@ -198,6 +244,35 @@ public class IotBomServiceImpl implements IotBomService {
         return sourceBoms;
     }
 
+    /**
+     * 转换目标对象
+     * @param
+     * @param idMapping
+     * @return
+     */
+    private List<IotDeviceMaterialDO> convertBomMaterials(Map<Long, Long> idMapping, Long deviceCategoryId,
+                                                          Long deviceId, Map<Long, List<IotCommonBomMaterialDO>> bomNodeMaterialMap) {
+        List<IotDeviceMaterialDO> targetDeviceMaterials = new ArrayList<>();
+        bomNodeMaterialMap.forEach((k,v) -> {
+            // k bomNodeId    v bomNodeId关联的物料集合
+            // 获取 bomNodeId 对应的 设备bom nodeId
+            Long deviceBomNodeId = idMapping.get(k);
+            v.forEach(bomMaterial -> {
+                IotDeviceMaterialDO deviceMaterial = new IotDeviceMaterialDO();
+                deviceMaterial.setDeviceCategoryId(deviceCategoryId);
+                deviceMaterial.setDeviceId(deviceId);
+                deviceMaterial.setBomNodeId(deviceBomNodeId);
+                deviceMaterial.setName(bomMaterial.getName());
+                deviceMaterial.setCode(bomMaterial.getCode());
+                deviceMaterial.setMaterialId(bomMaterial.getMaterialId());
+                deviceMaterial.setCreator(bomMaterial.getCreator());
+                deviceMaterial.setCreateTime(LocalDateTime.now());
+                targetDeviceMaterials.add(deviceMaterial);
+            });
+        });
+        return targetDeviceMaterials;
+    }
+
     /**
      * 转换目标对象
      * @param orderedBoms

+ 8 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdevicematerial/IotDeviceMaterialService.java

@@ -3,11 +3,10 @@ package cn.iocoder.yudao.module.pms.service.iotdevicematerial;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicematerial.vo.IotDeviceMaterialPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicematerial.vo.IotDeviceMaterialSaveReqVO;
-import cn.iocoder.yudao.module.pms.controller.admin.iotmaterial.vo.IotMaterialPageReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicematerial.IotDeviceMaterialDO;
-import cn.iocoder.yudao.module.pms.dal.dataobject.iotmaterial.IotMaterialDO;
 
 import javax.validation.Valid;
+import java.util.List;
 
 /**
  * PMS 设备BOM物料关联 Service 接口
@@ -62,4 +61,11 @@ public interface IotDeviceMaterialService {
      */
     PageResult<IotDeviceMaterialDO> getDeviceMaterialsByBomId(IotDeviceMaterialPageReqVO reqVO);
 
+    /**
+     * 获得PMS 设备BOM挂载物料关联列表
+     *
+     * @param saveReqVO 列表查询
+     * @return PMS 设备BOM挂载物料关联列表
+     */
+    List<IotDeviceMaterialDO> getIotDeviceMaterials(IotDeviceMaterialSaveReqVO saveReqVO);
 }

+ 6 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdevicematerial/IotDeviceMaterialServiceImpl.java

@@ -4,13 +4,13 @@ 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.iotdevicematerial.vo.IotDeviceMaterialPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicematerial.vo.IotDeviceMaterialSaveReqVO;
-import cn.iocoder.yudao.module.pms.controller.admin.iotmaterial.vo.IotMaterialPageReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicematerial.IotDeviceMaterialDO;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotdevicematerial.IotDeviceMaterialMapper;
 import org.springframework.stereotype.Service;
 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.pms.enums.ErrorCodeConstant.IOT_DEVICE_MATERIAL_NOT_EXISTS;
@@ -75,4 +75,9 @@ public class IotDeviceMaterialServiceImpl implements IotDeviceMaterialService {
         return iotDeviceMaterialMapper.getMaterialsByBomId(reqVO);
     }
 
+    @Override
+    public List<IotDeviceMaterialDO> getIotDeviceMaterials(IotDeviceMaterialSaveReqVO saveReqVO) {
+        return iotDeviceMaterialMapper.selectList(saveReqVO);
+    }
+
 }

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

@@ -76,4 +76,12 @@ public interface IotMaterialService {
      * @return 物料列表
      */
     PageResult<IotMaterialDO> getMaterialsByBomId(IotMaterialPageReqVO reqVO);
+
+    /**
+     * 根据设备bom节点id获取物料列表
+     *
+     * @param reqVO bom节点id
+     * @return 物料列表
+     */
+    PageResult<IotMaterialDO> getMaterialsByDeviceBomId(IotMaterialPageReqVO reqVO);
 }

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

@@ -106,4 +106,9 @@ public class IotMaterialServiceImpl implements IotMaterialService {
         return iotMaterialMapper.getMaterialsByBomId(reqVO);
     }
 
+    @Override
+    public PageResult<IotMaterialDO> getMaterialsByDeviceBomId(IotMaterialPageReqVO reqVO) {
+        return iotMaterialMapper.getMaterialsByDeviceBomId(reqVO);
+    }
+
 }

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

@@ -55,6 +55,14 @@ public interface IotMaintenancePlanService {
      */
     PageResult<IotMaintenancePlanDO> getIotMaintenancePlanPage(IotMaintenancePlanPageReqVO pageReqVO);
 
+    /**
+     * 获得保养计划分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 保养计划分页
+     */
+    List<IotMaintenancePlanDO> maintenancePlans(IotMaintenancePlanPageReqVO pageReqVO);
+
     /**
      * 获取待保养的设备-bom关联信息
      *

+ 14 - 3
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/maintenance/IotMaintenancePlanServiceImpl.java

@@ -13,13 +13,13 @@ import cn.iocoder.yudao.module.pms.dal.dataobject.maintenance.IotMaintenancePlan
 import cn.iocoder.yudao.module.pms.dal.mysql.iotmaintenancebom.IotMaintenanceBomMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.maintenance.IotMaintenancePlanMapper;
 import cn.iocoder.yudao.module.pms.dal.redis.BizNoRedisDAO;
+import cn.iocoder.yudao.module.system.service.dept.DeptService;
 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 java.util.*;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
@@ -41,6 +41,8 @@ public class IotMaintenancePlanServiceImpl implements IotMaintenancePlanService
     private IotMaintenanceBomMapper iotMaintenanceBomMapper;
     @Resource
     private BizNoRedisDAO bizNoRedisDAO;
+    @Resource
+    private DeptService deptService;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -107,8 +109,17 @@ public class IotMaintenancePlanServiceImpl implements IotMaintenancePlanService
     @Override
     public PageResult<IotMaintenancePlanDO> getIotMaintenancePlanPage(IotMaintenancePlanPageReqVO pageReqVO) {
         // 查询当前部门及子部门下所有数据
+        Set<Long> ids = new HashSet<>();
+        if (Objects.nonNull(pageReqVO.getDeptId())) {
+            ids = deptService.getChildDeptIdListFromCache(pageReqVO.getDeptId());
+            ids.add(pageReqVO.getDeptId());
+        }
+        return iotMaintenancePlanMapper.selectPage(pageReqVO, ids);
+    }
 
-        return iotMaintenancePlanMapper.selectPage(pageReqVO);
+    @Override
+    public List<IotMaintenancePlanDO> maintenancePlans(IotMaintenancePlanPageReqVO pageReqVO) {
+        return iotMaintenancePlanMapper.selectList(pageReqVO);
     }
 
     @Override

+ 5 - 10
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotDeviceRunLogMapper.xml

@@ -10,21 +10,16 @@
      -->
     <select id="distinctDevices"
             resultType="cn.iocoder.yudao.module.pms.controller.admin.iotdevicerunlog.vo.IotDeviceRunLogRespVO">
-        SELECT
-            l.device_id,
-            l.total_run_time,
-            l.total_mileage,
-            l.time
-        FROM
-            rq_iot_device_run_log l
-            RIGHT JOIN ( SELECT device_id, MAX( time ) AS latest_time, MAX( id ) AS max_id FROM rq_iot_device_run_log GROUP BY device_id ) AS latest ON l.device_id = latest.device_id
-            AND l.id = latest.max_id
+        SELECT device_id, MAX(total_run_time) AS total_run_time, MAX(total_mileage) AS total_mileage
+        FROM rq_iot_device_run_log
+        WHERE deleted = 0
         <if test="deviceIds != null and deviceIds.size &gt; 0">
-            AND latest.device_id IN
+            AND device_id IN
             <foreach collection="deviceIds" index="index" item="key" open="(" separator="," close=")">
                 #{key}
             </foreach>
         </if>
+        GROUP BY device_id
     </select>
 
 </mapper>