Browse Source

pms功能优化 保养计划 功能优化

zhangcl 3 months ago
parent
commit
ad21a3031b
32 changed files with 656 additions and 59 deletions
  1. 1 0
      yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/ErrorCodeConstant.java
  2. 57 4
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/IotDeviceController.java
  3. 9 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotbom/IotBomController.java
  4. 9 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotbom/vo/IotBomPageReqVO.java
  5. 11 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotbom/vo/IotBomRespVO.java
  6. 8 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmaintenancebom/IotMaintenanceBomController.java
  7. 21 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmaintenancebom/vo/IotMaintenanceBomPageReqVO.java
  8. 22 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmaintenancebom/vo/IotMaintenanceBomRespVO.java
  9. 29 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmaintenancebom/vo/IotMaintenanceBomSaveReqVO.java
  10. 45 21
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintenance/IotMaintenancePlanController.java
  11. 1 3
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintenance/vo/IotMaintenancePlanSaveReqVO.java
  12. 17 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintenance/vo/IotMaintenanceSaveVO.java
  13. 16 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/vo/IotDevicePageReqVO.java
  14. 13 4
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/vo/IotDeviceRespVO.java
  15. 1 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotbom/IotBomDO.java
  16. 16 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotmaintenancebom/IotMaintenanceBomDO.java
  17. 19 2
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/IotDeviceMapper.java
  18. 22 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotbom/IotBomMapper.java
  19. 12 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotmaintenancebom/IotMaintenanceBomMapper.java
  20. 4 3
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/maintenance/IotMaintenancePlanMapper.java
  21. 46 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/redis/BizNoRedisDAO.java
  22. 18 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/redis/RedisKeyConstants.java
  23. 18 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/IotDeviceService.java
  24. 39 4
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/IotDeviceServiceImpl.java
  25. 30 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotbom/IotBomService.java
  26. 16 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotbom/IotBomServiceImpl.java
  27. 8 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotmaintenancebom/IotMaintenanceBomService.java
  28. 5 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotmaintenancebom/IotMaintenanceBomServiceImpl.java
  29. 4 4
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/maintenance/IotMaintenancePlanService.java
  30. 44 10
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/maintenance/IotMaintenancePlanServiceImpl.java
  31. 12 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/util/IotDeviceConvert.java
  32. 83 0
      yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotDeviceMapper.xml

+ 1 - 0
yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/ErrorCodeConstant.java

@@ -41,4 +41,5 @@ public interface ErrorCodeConstant{
     ErrorCode IOT_MAIN_PLAN_BOM_MATERIAL_NOT_EXISTS = new ErrorCode(136, "PMS 保养计划明细设备BOM挂载物料关联不存在");
     ErrorCode IOT_MAIN_PLAN_BOM_MATERIAL_NOT_EXISTS = new ErrorCode(136, "PMS 保养计划明细设备BOM挂载物料关联不存在");
     ErrorCode IOT_INSPECT_ROUTE_NOT_EXISTS = new ErrorCode(134, "巡检项不存在");
     ErrorCode IOT_INSPECT_ROUTE_NOT_EXISTS = new ErrorCode(134, "巡检项不存在");
     ErrorCode IOT_INSPECT_PLAN_NOT_EXISTS = new ErrorCode(135, "巡检计划不存在");
     ErrorCode IOT_INSPECT_PLAN_NOT_EXISTS = new ErrorCode(135, "巡检计划不存在");
+    ErrorCode IOT_MAINTENANCE_PLAN_NO_EXISTS = new ErrorCode(136, "生成保养计划序列号重复,请重试");
 }
 }

+ 57 - 4
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/IotDeviceController.java

@@ -12,9 +12,10 @@ import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceSaveReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.IotProductClassifyDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.IotProductClassifyDO;
-import cn.iocoder.yudao.module.pms.dal.dataobject.iotmodel.IotModelDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotbom.IotBomDO;
 import cn.iocoder.yudao.module.pms.service.IotDeviceService;
 import cn.iocoder.yudao.module.pms.service.IotDeviceService;
 import cn.iocoder.yudao.module.pms.service.IotProductClassifyService;
 import cn.iocoder.yudao.module.pms.service.IotProductClassifyService;
+import cn.iocoder.yudao.module.pms.service.iotbom.IotBomService;
 import cn.iocoder.yudao.module.pms.service.iotmodel.IotModelService;
 import cn.iocoder.yudao.module.pms.service.iotmodel.IotModelService;
 import cn.iocoder.yudao.module.pms.util.IotDeviceConvert;
 import cn.iocoder.yudao.module.pms.util.IotDeviceConvert;
 import cn.iocoder.yudao.module.supplier.dal.dataobject.product.SupplierDO;
 import cn.iocoder.yudao.module.supplier.dal.dataobject.product.SupplierDO;
@@ -34,13 +35,12 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import javax.validation.Valid;
 import java.io.IOException;
 import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 
 
 import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
 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.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
+import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen;
 
 
 
 
 @Tag(name = "管理后台 - 设备台账")
 @Tag(name = "管理后台 - 设备台账")
@@ -61,6 +61,8 @@ public class IotDeviceController {
     private IotProductClassifyService iotProductClassifyService;
     private IotProductClassifyService iotProductClassifyService;
     @Resource
     @Resource
     private IotModelService iotModelService;
     private IotModelService iotModelService;
+    @Resource
+    private IotBomService iotBomService;
 
 
     @PostMapping("/create")
     @PostMapping("/create")
     @Operation(summary = "创建设备台账")
     @Operation(summary = "创建设备台账")
@@ -123,6 +125,57 @@ public class IotDeviceController {
                 pageResult.getTotal()));
                 pageResult.getTotal()));
     }
     }
 
 
+    @GetMapping("/deviceAssociateBomPage")
+    @Operation(summary = "获得设备台账分页")
+    @PreAuthorize("@ss.hasPermission('rq:iot-device:query')")
+    public CommonResult<PageResult<IotDeviceRespVO>> deviceAssociateBomPage(@Valid IotDevicePageReqVO pageReqVO) {
+        PageResult<IotDeviceRespVO> pageResult = iotDeviceService.deviceAssociateBomPage(pageReqVO);
+        if (CollUtil.isEmpty(pageResult.getList())) {
+            return success(new PageResult<>(pageResult.getTotal()));
+        }
+        Map<Long, DeptDO> deptMap = deptService.getDeptMap(
+                convertList(pageResult.getList(), IotDeviceRespVO::getDeptId));
+        // 拼接BOM节点信息
+        // return success(new PageResult<>(buildDeviceAssociateBomList(pageResult.getList()), pageResult.getTotal()));
+        return success(new PageResult<>(IotDeviceConvert.INSTANCE.convertList1(pageResult.getList(), deptMap), pageResult.getTotal()));
+    }
+
+    @GetMapping("/deviceAssociateBomList")
+    @Operation(summary = "获得设备-bom关联关系列表")
+    @PreAuthorize("@ss.hasPermission('rq:iot-device:query')")
+    public CommonResult<List<IotDeviceRespVO>> deviceAssociateBomList(IotDevicePageReqVO pageReqVO) {
+        List<IotDeviceRespVO> devices = iotDeviceService.deviceAssociateBomList(pageReqVO.getDeviceIds());
+        if (CollUtil.isEmpty(devices)) {
+            return success(new ArrayList<>());
+        }
+        Map<Long, DeptDO> deptMap = deptService.getDeptMap(
+                convertList(devices, IotDeviceRespVO::getDeptId));
+        return success(IotDeviceConvert.INSTANCE.convertList1(devices, deptMap));
+    }
+
+    /**
+     * 组装 设备-bom 关联关系对象
+     * @param devices
+     * @return
+     */
+    private List<IotDeviceRespVO> buildDeviceAssociateBomList(List<IotDeviceDO> devices) {
+        if (CollUtil.isEmpty(devices)) {
+            return Collections.emptyList();
+        }
+        // 设备部门信息
+        Map<Long, DeptDO> deptMap = deptService.getDeptMap(
+                convertList(devices, IotDeviceDO::getDeptId));
+        // 拼接设备分类关联的BOM节点信息
+        Map<Long, IotBomDO> bomMap = iotBomService.getBomMap(convertList(devices, IotDeviceDO::getAssetClass));
+        // 2. 拼接数据
+        return BeanUtils.toBean(devices, IotDeviceRespVO.class, (deviceVO) -> {
+            // 2.1 拼接部门信息
+            findAndThen(deptMap, deviceVO.getDeptId(), dept -> deviceVO.setDeptName(dept.getName()));
+            // 2.2 设备关联的BOM节点信息
+            findAndThen(bomMap, deviceVO.getAssetClass(), bom -> {deviceVO.setName(bom.getName()); deviceVO.setCode(bom.getCode());});
+        });
+    }
+
     @GetMapping("/export-excel")
     @GetMapping("/export-excel")
     @Operation(summary = "导出设备台账 Excel")
     @Operation(summary = "导出设备台账 Excel")
     @PreAuthorize("@ss.hasPermission('rq:iot-device:export')")
     @PreAuthorize("@ss.hasPermission('rq:iot-device:export')")

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

@@ -78,6 +78,15 @@ public class IotBomController {
         return success(BeanUtils.toBean(pageResult, IotBomRespVO.class));
         return success(BeanUtils.toBean(pageResult, IotBomRespVO.class));
     }
     }
 
 
+    @GetMapping("/deviceAssociateBomPage")
+    @Operation(summary = "获得PMS 设备关联-BOM 关系分页")
+    @PreAuthorize("@ss.hasPermission('rq:iot-bom:query')")
+    public CommonResult<PageResult<IotBomRespVO>> deviceAssociateBomPage(@Valid IotBomPageReqVO pageReqVO) {
+        PageResult<IotBomDO> pageResult = iotBomService.deviceAssociateBomPage(pageReqVO);
+
+        return success(BeanUtils.toBean(pageResult, IotBomRespVO.class));
+    }
+
     @GetMapping("/list")
     @GetMapping("/list")
     @Operation(summary = "获取 Bom树 列表")
     @Operation(summary = "获取 Bom树 列表")
     @PreAuthorize("@ss.hasPermission('rq:iot-bom:query')")
     @PreAuthorize("@ss.hasPermission('rq:iot-bom:query')")

+ 9 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotbom/vo/IotBomPageReqVO.java

@@ -38,7 +38,7 @@ public class IotBomPageReqVO extends PageParam {
     @Schema(description = "显示顺序")
     @Schema(description = "显示顺序")
     private Integer sort;
     private Integer sort;
 
 
-    @Schema(description = "M维修 S保养 维修+保养", example = "1")
+    @Schema(description = "1维修 2保养 维修+保养", example = "1")
     private String type;
     private String type;
 
 
     @Schema(description = "状态 0启用  1停用", example = "1")
     @Schema(description = "状态 0启用  1停用", example = "1")
@@ -57,4 +57,12 @@ public class IotBomPageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
     private LocalDateTime[] createTime;
 
 
+    @Schema(description = "设备名称")
+    private String deviceName;
+    @Schema(description = "设备编码")
+    private String deviceCode;
+    @Schema(description = "设备状态")
+    private String deviceStatus;
+    @Schema(description = "资产性质")
+    private String assetProperty;
 }
 }

+ 11 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotbom/vo/IotBomRespVO.java

@@ -69,4 +69,15 @@ public class IotBomRespVO {
     @ExcelProperty("创建时间")
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;
     private LocalDateTime createTime;
 
 
+    /**
+     * 设备关联字段
+     */
+    @Schema(description = "设备名称")
+    private String deviceName;
+    @Schema(description = "设备编码")
+    private String deviceCode;
+    @Schema(description = "设备状态")
+    private String deviceStatus;
+    @Schema(description = "资产性质")
+    private String assetProperty;
 }
 }

+ 8 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmaintenancebom/IotMaintenanceBomController.java

@@ -77,6 +77,14 @@ public class IotMaintenanceBomController {
         return success(BeanUtils.toBean(pageResult, IotMaintenanceBomRespVO.class));
         return success(BeanUtils.toBean(pageResult, IotMaintenanceBomRespVO.class));
     }
     }
 
 
+    @GetMapping("/deviceAssociateBomPage")
+    @Operation(summary = "获得PMS 保养计划明细 设备关联-BOM分页")
+    @PreAuthorize("@ss.hasPermission('pms:iot-maintenance-bom:query')")
+    public CommonResult<PageResult<IotMaintenanceBomRespVO>> deviceAssociateBomPage(@Valid IotMaintenanceBomPageReqVO pageReqVO) {
+        PageResult<IotMaintenanceBomDO> pageResult = iotMaintenanceBomService.deviceAssociateBomPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, IotMaintenanceBomRespVO.class));
+    }
+
     @GetMapping("/export-excel")
     @GetMapping("/export-excel")
     @Operation(summary = "导出PMS 保养计划明细BOM Excel")
     @Operation(summary = "导出PMS 保养计划明细BOM Excel")
     @PreAuthorize("@ss.hasPermission('pms:iot-maintenance-bom:export')")
     @PreAuthorize("@ss.hasPermission('pms:iot-maintenance-bom:export')")

+ 21 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmaintenancebom/vo/IotMaintenanceBomPageReqVO.java

@@ -33,6 +33,13 @@ public class IotMaintenanceBomPageReqVO extends PageParam {
     @Schema(description = "保养规则(量程 运行时间 自然日期) 可多选")
     @Schema(description = "保养规则(量程 运行时间 自然日期) 可多选")
     private String rule;
     private String rule;
 
 
+    @Schema(description = "保养规则-里程(0启用 1停用)", example = "2")
+    private Integer mileageRule;
+    @Schema(description = "保养规则-自然日期(0启用 1停用)", example = "2")
+    private Integer naturalDateRule;
+    @Schema(description = "保养规则-运行时间(0启用 1停用)", example = "2")
+    private Integer runningTimeRule;
+
     @Schema(description = "上次保养运行时长(小时)")
     @Schema(description = "上次保养运行时长(小时)")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private BigDecimal[] lastRunningTime;
     private BigDecimal[] lastRunningTime;
@@ -55,6 +62,9 @@ public class IotMaintenanceBomPageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private BigDecimal[] nextNaturalDate;
     private BigDecimal[] nextNaturalDate;
 
 
+    @Schema(description = "BOM节点 id", example = "18063")
+    private Long bomNodeId;
+
     @Schema(description = "BOM名称", example = "张三")
     @Schema(description = "BOM名称", example = "张三")
     private String name;
     private String name;
 
 
@@ -92,4 +102,15 @@ public class IotMaintenanceBomPageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
     private LocalDateTime[] createTime;
 
 
+    /**
+     * 设备关联字段
+     */
+    @Schema(description = "设备名称")
+    private String deviceName;
+    @Schema(description = "设备编码")
+    private String deviceCode;
+    @Schema(description = "设备状态")
+    private String deviceStatus;
+    @Schema(description = "资产性质")
+    private String assetProperty;
 }
 }

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

@@ -37,6 +37,13 @@ public class IotMaintenanceBomRespVO {
     @ExcelProperty("保养规则(量程 运行时间 自然日期) 可多选")
     @ExcelProperty("保养规则(量程 运行时间 自然日期) 可多选")
     private String rule;
     private String rule;
 
 
+    @Schema(description = "保养规则-里程(0启用 1停用)", example = "2")
+    private Integer mileageRule;
+    @Schema(description = "保养规则-自然日期(0启用 1停用)", example = "2")
+    private Integer naturalDateRule;
+    @Schema(description = "保养规则-运行时间(0启用 1停用)", example = "2")
+    private Integer runningTimeRule;
+
     @Schema(description = "上次保养运行时长(小时)")
     @Schema(description = "上次保养运行时长(小时)")
     @ExcelProperty("上次保养运行时长(小时)")
     @ExcelProperty("上次保养运行时长(小时)")
     private BigDecimal lastRunningTime;
     private BigDecimal lastRunningTime;
@@ -61,6 +68,9 @@ public class IotMaintenanceBomRespVO {
     @ExcelProperty("下次保养自然日期(天)")
     @ExcelProperty("下次保养自然日期(天)")
     private BigDecimal nextNaturalDate;
     private BigDecimal nextNaturalDate;
 
 
+    @Schema(description = "BOM节点 id", example = "18063")
+    private Long bomNodeId;
+
     @Schema(description = "BOM名称", example = "张三")
     @Schema(description = "BOM名称", example = "张三")
     @ExcelProperty("BOM名称")
     @ExcelProperty("BOM名称")
     private String name;
     private String name;
@@ -109,4 +119,16 @@ public class IotMaintenanceBomRespVO {
     @ExcelProperty("创建时间")
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;
     private LocalDateTime createTime;
 
 
+    /**
+     * 设备关联字段
+     */
+    @Schema(description = "设备名称")
+    private String deviceName;
+    @Schema(description = "设备编码")
+    private String deviceCode;
+    @Schema(description = "设备状态")
+    private String deviceStatus;
+    @Schema(description = "资产性质")
+    private String assetProperty;
+
 }
 }

+ 29 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmaintenancebom/vo/IotMaintenanceBomSaveReqVO.java

@@ -27,6 +27,13 @@ public class IotMaintenanceBomSaveReqVO {
     @Schema(description = "保养规则(量程 运行时间 自然日期) 可多选")
     @Schema(description = "保养规则(量程 运行时间 自然日期) 可多选")
     private String rule;
     private String rule;
 
 
+    @Schema(description = "保养规则-里程(0启用 1停用)", example = "2")
+    private Integer mileageRule;
+    @Schema(description = "保养规则-自然日期(0启用 1停用)", example = "2")
+    private Integer naturalDateRule;
+    @Schema(description = "保养规则-运行时间(0启用 1停用)", example = "2")
+    private Integer runningTimeRule;
+
     @Schema(description = "上次保养运行时长(小时)")
     @Schema(description = "上次保养运行时长(小时)")
     private BigDecimal lastRunningTime;
     private BigDecimal lastRunningTime;
 
 
@@ -45,6 +52,9 @@ public class IotMaintenanceBomSaveReqVO {
     @Schema(description = "下次保养自然日期(天)")
     @Schema(description = "下次保养自然日期(天)")
     private BigDecimal nextNaturalDate;
     private BigDecimal nextNaturalDate;
 
 
+    @Schema(description = "BOM节点 id", example = "18063")
+    private Long bomNodeId;
+
     @Schema(description = "BOM名称", example = "张三")
     @Schema(description = "BOM名称", example = "张三")
     private String name;
     private String name;
 
 
@@ -78,4 +88,23 @@ public class IotMaintenanceBomSaveReqVO {
     @Schema(description = "版本")
     @Schema(description = "版本")
     private Integer version;
     private Integer version;
 
 
+    /**
+     * 设备关联字段
+     */
+    @Schema(description = "设备名称")
+    private String deviceName;
+    @Schema(description = "设备编码")
+    private String deviceCode;
+    @Schema(description = "设备状态")
+    private String deviceStatus;
+    @Schema(description = "资产性质")
+    private String assetProperty;
+    @Schema(description = "部门名称")
+    private String deptName;
+    @Schema(description = "设备类别")
+    private Long assetClass;
+    @Schema(description = "设备运行时间")
+    private BigDecimal runningTime;
+    @Schema(description = "设备运行公里数")
+    private BigDecimal runningKilometers;
 }
 }

+ 45 - 21
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintenance/IotMaintenancePlanController.java

@@ -1,34 +1,41 @@
 package cn.iocoder.yudao.module.pms.controller.admin.maintenance;
 package cn.iocoder.yudao.module.pms.controller.admin.maintenance;
 
 
+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;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
+import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
+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.maintenance.vo.IotMaintenancePlanPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenancePlanPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenancePlanRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenancePlanRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenancePlanSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenancePlanSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenanceSaveVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.maintenance.IotMaintenancePlanDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.maintenance.IotMaintenancePlanDO;
 import cn.iocoder.yudao.module.pms.service.maintenance.IotMaintenancePlanService;
 import cn.iocoder.yudao.module.pms.service.maintenance.IotMaintenancePlanService;
-import org.springframework.web.bind.annotation.*;
-import javax.annotation.Resource;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.security.access.prepost.PreAuthorize;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import io.swagger.v3.oas.annotations.Parameter;
+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.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
 
 
-import javax.validation.constraints.*;
-import javax.validation.*;
-import javax.servlet.http.*;
-import java.util.*;
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
 import java.io.IOException;
 import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Stream;
 
 
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+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.pojo.CommonResult.success;
-
-import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
-
-import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
-import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertListByFlatMap;
 
 
 
 
 @Tag(name = "管理后台 - 保养计划")
 @Tag(name = "管理后台 - 保养计划")
@@ -39,11 +46,13 @@ public class IotMaintenancePlanController {
 
 
     @Resource
     @Resource
     private IotMaintenancePlanService iotMaintenancePlanService;
     private IotMaintenancePlanService iotMaintenancePlanService;
+    @Resource
+    private AdminUserApi adminUserApi;
 
 
     @PostMapping("/create")
     @PostMapping("/create")
     @Operation(summary = "创建保养计划")
     @Operation(summary = "创建保养计划")
     @PreAuthorize("@ss.hasPermission('rq:iot-maintenance-plan:create')")
     @PreAuthorize("@ss.hasPermission('rq:iot-maintenance-plan:create')")
-    public CommonResult<Long> createIotMaintenancePlan(@Valid @RequestBody IotMaintenancePlanSaveReqVO createReqVO) {
+    public CommonResult<Long> createIotMaintenancePlan(@Valid @RequestBody IotMaintenanceSaveVO createReqVO) {
         return success(iotMaintenancePlanService.createIotMaintenancePlan(createReqVO));
         return success(iotMaintenancePlanService.createIotMaintenancePlan(createReqVO));
     }
     }
 
 
@@ -78,7 +87,7 @@ public class IotMaintenancePlanController {
     @PreAuthorize("@ss.hasPermission('rq:iot-maintenance-plan:query')")
     @PreAuthorize("@ss.hasPermission('rq:iot-maintenance-plan:query')")
     public CommonResult<PageResult<IotMaintenancePlanRespVO>> getIotMaintenancePlanPage(@Valid IotMaintenancePlanPageReqVO pageReqVO) {
     public CommonResult<PageResult<IotMaintenancePlanRespVO>> getIotMaintenancePlanPage(@Valid IotMaintenancePlanPageReqVO pageReqVO) {
         PageResult<IotMaintenancePlanDO> pageResult = iotMaintenancePlanService.getIotMaintenancePlanPage(pageReqVO);
         PageResult<IotMaintenancePlanDO> pageResult = iotMaintenancePlanService.getIotMaintenancePlanPage(pageReqVO);
-        return success(BeanUtils.toBean(pageResult, IotMaintenancePlanRespVO.class));
+        return success(new PageResult<>(buildMaintenancePlanList(pageResult.getList()), pageResult.getTotal()));
     }
     }
 
 
     @GetMapping("/export-excel")
     @GetMapping("/export-excel")
@@ -94,4 +103,19 @@ public class IotMaintenancePlanController {
                         BeanUtils.toBean(list, IotMaintenancePlanRespVO.class));
                         BeanUtils.toBean(list, IotMaintenancePlanRespVO.class));
     }
     }
 
 
+    private List<IotMaintenancePlanRespVO> buildMaintenancePlanList(List<IotMaintenancePlanDO> plans) {
+        if (CollUtil.isEmpty(plans)) {
+            return Collections.emptyList();
+        }
+        // 查询保养计划 负责人
+        Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertListByFlatMap(plans,
+                plan -> Stream.of(NumberUtils.parseLong(plan.getResponsiblePerson()))));
+        // 2. 转换成 VO
+        return BeanUtils.toBean(plans, IotMaintenancePlanRespVO.class, planVO -> {
+            // 2.2 设置创建人、负责人名称
+            MapUtils.findAndThen(userMap, NumberUtils.parseLong(planVO.getResponsiblePerson()),
+                    user -> planVO.setResponsiblePersonName(user.getNickname()));
+        });
+    }
+
 }
 }

+ 1 - 3
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintenance/vo/IotMaintenancePlanSaveReqVO.java

@@ -1,9 +1,7 @@
 package cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo;
 package cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo;
 
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
-import java.util.*;
-import javax.validation.constraints.*;
+import lombok.Data;
 
 
 @Schema(description = "管理后台 - 保养计划新增/修改 Request VO")
 @Schema(description = "管理后台 - 保养计划新增/修改 Request VO")
 @Data
 @Data

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

@@ -0,0 +1,17 @@
+package cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo;
+
+import cn.iocoder.yudao.module.pms.controller.admin.iotmaintenancebom.vo.IotMaintenanceBomSaveReqVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+@Schema(description = "管理后台 - 保养计划 保存/修改 Request VO")
+@Data
+public class IotMaintenanceSaveVO {
+    @Schema(description = "保养计划")
+    private IotMaintenancePlanSaveReqVO mainPlan;
+    @Schema(description = "保养计划明细")
+    private List<IotMaintenanceBomSaveReqVO> mainPlanBom;
+
+}

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

@@ -7,8 +7,8 @@ import lombok.EqualsAndHashCode;
 import lombok.ToString;
 import lombok.ToString;
 import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.format.annotation.DateTimeFormat;
 
 
-import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
+import java.util.List;
 
 
 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
 
 
@@ -106,4 +106,19 @@ public class IotDevicePageReqVO extends PageParam {
     private Long assetClass;
     private Long assetClass;
     @Schema(description = "创建时间")
     @Schema(description = "创建时间")
     private LocalDateTime createTime;
     private LocalDateTime createTime;
+
+    /**
+     * bom相关信息
+     */
+    @Schema(description = "BOM名称", example = "李四")
+    private String name;
+
+    @Schema(description = "BOM编码")
+    private String code;
+
+    /**
+     * 自定义请求参数
+     */
+    @Schema(description = "设备id集合")
+    private List<Long> deviceIds;
 }
 }

+ 13 - 4
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/vo/IotDeviceRespVO.java

@@ -1,12 +1,11 @@
 package cn.iocoder.yudao.module.pms.controller.admin.vo;
 package cn.iocoder.yudao.module.pms.controller.admin.vo;
 
 
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
+import lombok.Data;
 
 
-import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
-import java.util.*;
-import com.alibaba.excel.annotation.*;
 
 
 @Schema(description = "管理后台 - 设备台账 Response VO")
 @Schema(description = "管理后台 - 设备台账 Response VO")
 @Data
 @Data
@@ -144,4 +143,14 @@ public class IotDeviceRespVO {
     private String supplierName;
     private String supplierName;
     @Schema(description = "规格名称")
     @Schema(description = "规格名称")
     private String modelName;
     private String modelName;
+
+    /**
+     * 设备关联bom相关信息
+     */
+    @Schema(description = "bom节点id")
+    private String bomNodeId;
+    @Schema(description = "bom节点名称")
+    private String name;
+    @Schema(description = "bom节点编码")
+    private String code;
 }
 }

+ 1 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotbom/IotBomDO.java

@@ -59,7 +59,7 @@ public class IotBomDO extends BaseDO {
      */
      */
     private Integer sort;
     private Integer sort;
     /**
     /**
-     * M维修 S保养 维修+保养
+     * 1维修 2保养 维修+保养
      */
      */
     @TableField(typeHandler = IntegerListTypeHandler.class)
     @TableField(typeHandler = IntegerListTypeHandler.class)
     private List<Integer> type;
     private List<Integer> type;

+ 16 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotmaintenancebom/IotMaintenanceBomDO.java

@@ -48,6 +48,18 @@ public class IotMaintenanceBomDO extends BaseDO {
      * 保养规则(量程 运行时间 自然日期) 可多选
      * 保养规则(量程 运行时间 自然日期) 可多选
      */
      */
     private String rule;
     private String rule;
+    /**
+     * 保养规则-里程(0启用 1停用)
+     */
+    private Integer mileageRule;
+    /**
+     * 保养规则-自然日期(0启用 1停用)
+     */
+    private Integer naturalDateRule;
+    /**
+     * 保养规则-运行时间(0启用 1停用)
+     */
+    private Integer runningTimeRule;
     /**
     /**
      * 上次保养运行时长(小时)
      * 上次保养运行时长(小时)
      */
      */
@@ -72,6 +84,10 @@ public class IotMaintenanceBomDO extends BaseDO {
      * 下次保养自然日期(天)
      * 下次保养自然日期(天)
      */
      */
     private BigDecimal nextNaturalDate;
     private BigDecimal nextNaturalDate;
+    /**
+     * BOM节点id
+     */
+    private Long bomNodeId;
     /**
     /**
      * BOM名称
      * BOM名称
      */
      */

+ 19 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/IotDeviceMapper.java

@@ -4,12 +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.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDevicePageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDevicePageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
-import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO;
-import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 
 import java.util.Collection;
 import java.util.Collection;
+import java.util.List;
 
 
 /**
 /**
  * 设备台账 Mapper
  * 设备台账 Mapper
@@ -52,4 +54,19 @@ public interface IotDeviceMapper extends BaseMapperX<IotDeviceDO> {
                 .orderByDesc(IotDeviceDO::getId));
                 .orderByDesc(IotDeviceDO::getId));
     }
     }
 
 
+    /* default PageResult<IotDeviceDO> deviceAssociateBomPage(IotDevicePageReqVO reqVO, Collection<Long> deptIds) {
+        MPJLambdaWrapperX<IotDeviceDO> query = new MPJLambdaWrapperX<IotDeviceDO>();
+        query.innerJoin(IotBomDO.class, IotBomDO::getDeviceCategoryId, IotDeviceDO::getAssetClass)
+                .eq(IotBomDO::getLeafFlag, 1)
+                .like(IotBomDO::getType, "2")
+                .in(CollUtil.isNotEmpty(deptIds), IotDeviceDO::getDeptId, deptIds)
+                .like(StrUtil.isNotBlank(reqVO.getDeviceName()), IotDeviceDO::getDeviceName, reqVO.getDeviceName())
+                .like(StrUtil.isNotBlank(reqVO.getName()), IotBomDO::getName, reqVO.getName());
+        return selectJoinPage(reqVO, IotDeviceDO.class, query);
+    } */
+
+    IPage<IotDeviceRespVO> deviceAssociateBomPage(IPage<IotDeviceRespVO> page,
+                                                  @Param("reqVO") IotDevicePageReqVO reqVO, @Param("deptIds") Collection<Long> deptIds);
+
+    List<IotDeviceRespVO> deviceAssociateBomList(@Param("deviceIds") Collection<Long> deviceIds);
 }
 }

+ 22 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotbom/IotBomMapper.java

@@ -1,14 +1,18 @@
 package cn.iocoder.yudao.module.pms.dal.mysql.iotbom;
 package cn.iocoder.yudao.module.pms.dal.mysql.iotbom;
 
 
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 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.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
 import cn.iocoder.yudao.module.pms.controller.admin.iotbom.vo.IotBomListReqVO;
 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.IotBomPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotbom.vo.IotBomSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotbom.vo.IotBomSaveReqVO;
+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.iotbom.IotBomDO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
 
 
+import java.util.Collection;
 import java.util.List;
 import java.util.List;
 
 
 /**
 /**
@@ -47,4 +51,22 @@ public interface IotBomMapper extends BaseMapperX<IotBomDO> {
     default IotBomDO selectParentNode(IotBomSaveReqVO reqVO) {
     default IotBomDO selectParentNode(IotBomSaveReqVO reqVO) {
         return selectOne(IotBomDO::getId, reqVO.getParentId());
         return selectOne(IotBomDO::getId, reqVO.getParentId());
     }
     }
+
+    default PageResult<IotBomDO> deviceAssociateBomPage(IotBomPageReqVO reqVO) {
+        MPJLambdaWrapperX<IotBomDO> query = new MPJLambdaWrapperX<IotBomDO>();
+        query.innerJoin(IotDeviceDO.class, IotDeviceDO::getAssetClass, IotBomDO::getDeviceCategoryId)
+                .eq(IotBomDO::getLeafFlag, 1)
+                .like(IotBomDO::getType, "2")
+                .like(StrUtil.isNotBlank(reqVO.getDeviceName()), IotDeviceDO::getDeviceName, reqVO.getDeviceName())
+                .like(StrUtil.isNotBlank(reqVO.getName()), IotBomDO::getName, reqVO.getName());
+
+        return selectJoinPage(reqVO, IotBomDO.class, query);
+    }
+
+    default List<IotBomDO> getListByDeviceCategoryIds(Collection<Long> deviceCategoryIds) {
+        return selectList(new LambdaQueryWrapperX<IotBomDO>()
+                .inIfPresent(IotBomDO::getDeviceCategoryId, deviceCategoryIds)
+                .eq(IotBomDO::getLeafFlag, 1)
+                .like(IotBomDO::getType, "2"));
+    }
 }
 }

+ 12 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotmaintenancebom/IotMaintenanceBomMapper.java

@@ -1,9 +1,12 @@
 package cn.iocoder.yudao.module.pms.dal.mysql.iotmaintenancebom;
 package cn.iocoder.yudao.module.pms.dal.mysql.iotmaintenancebom;
 
 
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 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.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmaintenancebom.vo.IotMaintenanceBomPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmaintenancebom.vo.IotMaintenanceBomPageReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmaintenancebom.IotMaintenanceBomDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmaintenancebom.IotMaintenanceBomDO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
 
 
@@ -43,4 +46,13 @@ public interface IotMaintenanceBomMapper extends BaseMapperX<IotMaintenanceBomDO
                 .orderByDesc(IotMaintenanceBomDO::getId));
                 .orderByDesc(IotMaintenanceBomDO::getId));
     }
     }
 
 
+    default PageResult<IotMaintenanceBomDO> deviceAssociateBomPage(IotMaintenanceBomPageReqVO reqVO) {
+        MPJLambdaWrapperX<IotMaintenanceBomDO> query = new MPJLambdaWrapperX<IotMaintenanceBomDO>();
+        query.leftJoin(IotDeviceDO.class, IotDeviceDO::getAssetClass, IotMaintenanceBomDO::getDeviceCategoryId)
+                .like(StrUtil.isNotBlank(reqVO.getDeviceName()), IotDeviceDO::getDeviceName, reqVO.getDeviceName())
+                .like(StrUtil.isNotBlank(reqVO.getName()), IotMaintenanceBomDO::getName, reqVO.getName());
+
+        return selectJoinPage(reqVO, IotMaintenanceBomDO.class, query);
+    }
+
 }
 }

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

@@ -1,10 +1,8 @@
 package cn.iocoder.yudao.module.pms.dal.mysql.maintenance;
 package cn.iocoder.yudao.module.pms.dal.mysql.maintenance;
 
 
-import java.util.*;
-
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 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.maintenance.vo.IotMaintenancePlanPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenancePlanPageReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.maintenance.IotMaintenancePlanDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.maintenance.IotMaintenancePlanDO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
@@ -30,4 +28,7 @@ public interface IotMaintenancePlanMapper extends BaseMapperX<IotMaintenancePlan
                 .orderByDesc(IotMaintenancePlanDO::getId));
                 .orderByDesc(IotMaintenancePlanDO::getId));
     }
     }
 
 
+    default IotMaintenancePlanDO selectByNo(String no) {
+        return selectOne(IotMaintenancePlanDO::getSerialNumber, no);
+    }
 }
 }

+ 46 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/redis/BizNoRedisDAO.java

@@ -0,0 +1,46 @@
+package cn.iocoder.yudao.module.pms.dal.redis;
+
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Repository;
+
+import javax.annotation.Resource;
+import java.time.Duration;
+import java.time.LocalDateTime;
+
+
+/**
+ * pms 业务单据的 Redis DAO
+ *
+ * @author ruiqi
+ */
+@Repository
+public class BizNoRedisDAO {
+
+    /**
+     * 保养计划
+     */
+    public static final String MAIN_PLAN_NO_PREFIX = "BYJH";
+
+    @Resource
+    private StringRedisTemplate stringRedisTemplate;
+
+    /**
+     * 生成序号,使用当前日期,格式为 {PREFIX} + yyyyMMdd + 6 位自增
+     * 例如说:BYJH 202109 000001 (没有中间空格)
+     *
+     * @param prefix 前缀
+     * @return 序号
+     */
+    public String generate(String prefix) {
+        // 递增序号
+        String noPrefix = prefix + DateUtil.format(LocalDateTime.now(), DatePattern.PURE_DATE_PATTERN);
+        String key = RedisKeyConstants.NO + noPrefix;
+        Long no = stringRedisTemplate.opsForValue().increment(key);
+        // 设置过期时间
+        stringRedisTemplate.expire(key, Duration.ofDays(1L));
+        return noPrefix + String.format("%06d", no);
+    }
+
+}

+ 18 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/redis/RedisKeyConstants.java

@@ -0,0 +1,18 @@
+package cn.iocoder.yudao.module.pms.dal.redis;
+
+/**
+ * CRM Redis Key 枚举类
+ *
+ * @author ruiqi
+ */
+public interface RedisKeyConstants {
+
+    /**
+     * 序号的缓存
+     *
+     * KEY 格式:trade_no:{prefix}
+     * VALUE 数据格式:编号自增
+     */
+    String NO = "pms:main_plan:seq_no:";
+
+}

+ 18 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/IotDeviceService.java

@@ -2,10 +2,12 @@ package cn.iocoder.yudao.module.pms.service;
 
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDevicePageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDevicePageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceSaveReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
 
 
 import javax.validation.Valid;
 import javax.validation.Valid;
+import java.util.List;
 
 
 /**
 /**
  * 设备台账 Service 接口
  * 设备台账 Service 接口
@@ -52,4 +54,20 @@ public interface IotDeviceService {
      */
      */
     PageResult<IotDeviceDO> getIotDevicePage(IotDevicePageReqVO pageReqVO);
     PageResult<IotDeviceDO> getIotDevicePage(IotDevicePageReqVO pageReqVO);
 
 
+    /**
+     * 获得 设备bom 关联 关系 分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 设备bom 关联分页
+     */
+    PageResult<IotDeviceRespVO> deviceAssociateBomPage(IotDevicePageReqVO pageReqVO);
+
+    /**
+     * 获得 设备bom 关联 关系 列表
+     *
+     * @param deviceIds
+     * @return 设备bom 关联 列表
+     */
+    List<IotDeviceRespVO> deviceAssociateBomList(List<Long> deviceIds);
+
 }
 }

+ 39 - 4
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/IotDeviceServiceImpl.java

@@ -6,28 +6,28 @@ import cn.iocoder.yudao.framework.common.exception.ServiceException;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDevicePageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDevicePageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceSaveReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.IotInfoClassifyDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.IotInfoClassifyDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.IotTreeDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmodel.IotModelDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmodel.IotModelDO;
 import cn.iocoder.yudao.module.pms.dal.mysql.IotDeviceMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.IotDeviceMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.IotInfoClassifyMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.IotInfoClassifyMapper;
-import cn.iocoder.yudao.module.pms.dal.dataobject.IotTreeDO;
 import cn.iocoder.yudao.module.pms.dal.mysql.IotTreeMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.IotTreeMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotmodel.IotModelMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotmodel.IotModelMapper;
-import cn.iocoder.yudao.module.pms.service.iotmodel.IotModelService;
 import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO;
 import cn.iocoder.yudao.module.system.enums.ErrorCodeConstants;
 import cn.iocoder.yudao.module.system.enums.ErrorCodeConstants;
 import cn.iocoder.yudao.module.system.service.dept.DeptService;
 import cn.iocoder.yudao.module.system.service.dept.DeptService;
 import cn.iocoder.yudao.module.system.service.dict.DictDataService;
 import cn.iocoder.yudao.module.system.service.dict.DictDataService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableMap;
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
-
 import java.util.HashSet;
 import java.util.HashSet;
 import java.util.List;
 import java.util.List;
 import java.util.Objects;
 import java.util.Objects;
@@ -151,4 +151,39 @@ public class IotDeviceServiceImpl implements IotDeviceService {
         return iotDeviceMapper.selectPage(pageReqVO,ids);
         return iotDeviceMapper.selectPage(pageReqVO,ids);
     }
     }
 
 
+    /* @Override
+    public PageResult<IotDeviceDO> deviceAssociateBomPage(IotDevicePageReqVO pageReqVO) {
+        Set<Long> ids = new HashSet<>();
+        if (Objects.nonNull(pageReqVO.getDeptId())) {
+            ids = deptService.getChildDeptIdListFromCache(pageReqVO.getDeptId());
+            ids.add(pageReqVO.getDeptId());
+        }
+
+        return iotDeviceMapper.deviceAssociateBomPage(pageReqVO,ids);
+    } */
+
+    @Override
+    public PageResult<IotDeviceRespVO> deviceAssociateBomPage(IotDevicePageReqVO pageReqVO) {
+        Set<Long> ids = new HashSet<>();
+        if (Objects.nonNull(pageReqVO.getDeptId())) {
+            ids = deptService.getChildDeptIdListFromCache(pageReqVO.getDeptId());
+            ids.add(pageReqVO.getDeptId());
+        }
+        try {
+            IPage<IotDeviceRespVO> page = iotDeviceMapper.deviceAssociateBomPage(
+                    new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO, ids);
+            return new PageResult<>(page.getRecords(), page.getTotal());
+        } catch (Exception exception) {
+            if (exception.getMessage().contains("Table does not exist")) {
+                return PageResult.empty();
+            }
+            throw exception;
+        }
+    }
+
+    @Override
+    public List<IotDeviceRespVO> deviceAssociateBomList(List<Long> deviceIds) {
+        List<IotDeviceRespVO> devices = iotDeviceMapper.deviceAssociateBomList(deviceIds);
+        return devices;
+    }
 }
 }

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

@@ -1,13 +1,16 @@
 package cn.iocoder.yudao.module.pms.service.iotbom;
 package cn.iocoder.yudao.module.pms.service.iotbom;
 
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.iotbom.vo.IotBomListReqVO;
 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.IotBomPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotbom.vo.IotBomSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotbom.vo.IotBomSaveReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotbom.IotBomDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotbom.IotBomDO;
 
 
 import javax.validation.Valid;
 import javax.validation.Valid;
+import java.util.Collection;
 import java.util.List;
 import java.util.List;
+import java.util.Map;
 
 
 /**
 /**
  * PMS BOM 关系 Service 接口
  * PMS BOM 关系 Service 接口
@@ -61,4 +64,31 @@ public interface IotBomService {
      * @return BOM列表
      * @return BOM列表
      */
      */
     List<IotBomDO> getBomList(IotBomListReqVO reqVO);
     List<IotBomDO> getBomList(IotBomListReqVO reqVO);
+
+    /**
+     * 获得PMS 设备关联-BOM 关系分页
+     *
+     * @param pageReqVO 分页查询
+     * @return PMS 设备关联-BOM 关系分页
+     */
+    PageResult<IotBomDO> deviceAssociateBomPage(IotBomPageReqVO pageReqVO);
+
+    /**
+     * 获得 BOM节点 信息数组
+     *
+     * @param deviceCategoryIds bom 编号数组
+     * @return bom 信息数组
+     */
+    List<IotBomDO> getBomList(Collection<Long> deviceCategoryIds);
+
+    /**
+     * 获得指定编号的 BOM节点 Map
+     *
+     * @param deviceCategoryIds 设备分类 编号数组
+     * @return BOM节点 Map
+     */
+    default Map<Long, IotBomDO> getBomMap(Collection<Long> deviceCategoryIds) {
+        List<IotBomDO> list = getBomList(deviceCategoryIds);
+        return CollectionUtils.convertMap(list, IotBomDO::getDeviceCategoryId);
+    }
 }
 }

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

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.pms.service.iotbom;
 package cn.iocoder.yudao.module.pms.service.iotbom;
 
 
+import cn.hutool.core.collection.CollUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 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.IotBomListReqVO;
@@ -12,6 +13,8 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.Comparator;
 import java.util.List;
 import java.util.List;
 
 
@@ -88,4 +91,17 @@ public class IotBomServiceImpl implements IotBomService {
         return list;
         return list;
     }
     }
 
 
+    @Override
+    public PageResult<IotBomDO> deviceAssociateBomPage(IotBomPageReqVO pageReqVO) {
+        return iotBomMapper.deviceAssociateBomPage(pageReqVO);
+    }
+
+    @Override
+    public List<IotBomDO> getBomList(Collection<Long> deviceCategoryIds) {
+        if (CollUtil.isEmpty(deviceCategoryIds)) {
+            return Collections.emptyList();
+        }
+        return iotBomMapper.getListByDeviceCategoryIds(deviceCategoryIds);
+    }
+
 }
 }

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

@@ -52,4 +52,12 @@ public interface IotMaintenanceBomService {
      */
      */
     PageResult<IotMaintenanceBomDO> getIotMaintenanceBomPage(IotMaintenanceBomPageReqVO pageReqVO);
     PageResult<IotMaintenanceBomDO> getIotMaintenanceBomPage(IotMaintenanceBomPageReqVO pageReqVO);
 
 
+    /**
+     * 获得PMS 保养计划明细 设备关联-BOM节点 分页
+     *
+     * @param pageReqVO 分页查询
+     * @return PMS 保养计划 明细 设备关联-BOM分页
+     */
+    PageResult<IotMaintenanceBomDO> deviceAssociateBomPage(IotMaintenanceBomPageReqVO pageReqVO);
+
 }
 }

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

@@ -68,4 +68,9 @@ public class IotMaintenanceBomServiceImpl implements IotMaintenanceBomService {
         return iotMaintenanceBomMapper.selectPage(pageReqVO);
         return iotMaintenanceBomMapper.selectPage(pageReqVO);
     }
     }
 
 
+    @Override
+    public PageResult<IotMaintenanceBomDO> deviceAssociateBomPage(IotMaintenanceBomPageReqVO pageReqVO) {
+        return iotMaintenanceBomMapper.deviceAssociateBomPage(pageReqVO);
+    }
+
 }
 }

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

@@ -1,13 +1,13 @@
 package cn.iocoder.yudao.module.pms.service.maintenance;
 package cn.iocoder.yudao.module.pms.service.maintenance;
 
 
-import java.util.*;
-import javax.validation.*;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenancePlanPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenancePlanPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenancePlanSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenancePlanSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenanceSaveVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.maintenance.IotMaintenancePlanDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.maintenance.IotMaintenancePlanDO;
 
 
+import javax.validation.Valid;
+
 /**
 /**
  * 保养计划 Service 接口
  * 保养计划 Service 接口
  *
  *
@@ -21,7 +21,7 @@ public interface IotMaintenancePlanService {
      * @param createReqVO 创建信息
      * @param createReqVO 创建信息
      * @return 编号
      * @return 编号
      */
      */
-    Long createIotMaintenancePlan(@Valid IotMaintenancePlanSaveReqVO createReqVO);
+    Long createIotMaintenancePlan(@Valid IotMaintenanceSaveVO createReqVO);
 
 
     /**
     /**
      * 更新保养计划
      * 更新保养计划

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

@@ -1,22 +1,28 @@
 package cn.iocoder.yudao.module.pms.service.maintenance;
 package cn.iocoder.yudao.module.pms.service.maintenance;
 
 
+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.iotmaintenancebom.vo.IotMaintenanceBomSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenancePlanPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenancePlanPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenancePlanSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenancePlanSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenanceSaveVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotmaintenancebom.IotMaintenanceBomDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.maintenance.IotMaintenancePlanDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.maintenance.IotMaintenancePlanDO;
+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.mysql.maintenance.IotMaintenancePlanMapper;
+import cn.iocoder.yudao.module.pms.dal.redis.BizNoRedisDAO;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
-import javax.annotation.Resource;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.*;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
-import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 
 
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
 
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
 import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_MAINTENANCE_PLAN_NOT_EXISTS;
 import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_MAINTENANCE_PLAN_NOT_EXISTS;
+import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_MAINTENANCE_PLAN_NO_EXISTS;
 
 
 /**
 /**
  * 保养计划 Service 实现类
  * 保养计划 Service 实现类
@@ -29,12 +35,40 @@ public class IotMaintenancePlanServiceImpl implements IotMaintenancePlanService
 
 
     @Resource
     @Resource
     private IotMaintenancePlanMapper iotMaintenancePlanMapper;
     private IotMaintenancePlanMapper iotMaintenancePlanMapper;
+    @Resource
+    private IotMaintenanceBomMapper iotMaintenanceBomMapper;
+    @Resource
+    private BizNoRedisDAO bizNoRedisDAO;
 
 
     @Override
     @Override
-    public Long createIotMaintenancePlan(IotMaintenancePlanSaveReqVO createReqVO) {
-        // 插入
-        IotMaintenancePlanDO iotMaintenancePlan = BeanUtils.toBean(createReqVO, IotMaintenancePlanDO.class);
+    public Long createIotMaintenancePlan(IotMaintenanceSaveVO createReqVO) {
+        if (ObjectUtil.isEmpty(createReqVO)) {
+            throw exception(IOT_MAINTENANCE_PLAN_NOT_EXISTS);
+        }
+        if (ObjectUtil.isEmpty(createReqVO.getMainPlan())) {
+            throw exception(IOT_MAINTENANCE_PLAN_NOT_EXISTS);
+        }
+        List<IotMaintenanceBomSaveReqVO> deviceBOMs = createReqVO.getMainPlanBom();
+        if (ObjectUtil.isEmpty(deviceBOMs)) {
+            throw exception(IOT_MAINTENANCE_PLAN_NOT_EXISTS);
+        }
+        // 先保存保养计划主表 再根据主表id更新明细
+        IotMaintenancePlanSaveReqVO mainPlanSaveVO = createReqVO.getMainPlan();
+        // 自动生成保养计划编号 BYJH202504300001
+        // 插入 保养计划
+        IotMaintenancePlanDO iotMaintenancePlan = BeanUtils.toBean(mainPlanSaveVO, IotMaintenancePlanDO.class);
+        String no = bizNoRedisDAO.generate(BizNoRedisDAO.MAIN_PLAN_NO_PREFIX);
+        if (ObjectUtil.isNotEmpty(iotMaintenancePlanMapper.selectByNo(no))) {
+            throw exception(IOT_MAINTENANCE_PLAN_NO_EXISTS);
+        }
+        iotMaintenancePlan.setSerialNumber(no);
         iotMaintenancePlanMapper.insert(iotMaintenancePlan);
         iotMaintenancePlanMapper.insert(iotMaintenancePlan);
+        // 插入保养计划明细
+        List<IotMaintenanceBomDO> maintenanceBOMs = new ArrayList<>();
+        maintenanceBOMs = convertList(deviceBOMs, bom -> BeanUtils.toBean(bom, IotMaintenanceBomDO.class, item -> item
+                .setPlanId(iotMaintenancePlan.getId())
+                .setDeviceCategoryId(bom.getAssetClass())));
+        iotMaintenanceBomMapper.insertBatch(maintenanceBOMs);
         // 返回
         // 返回
         return iotMaintenancePlan.getId();
         return iotMaintenancePlan.getId();
     }
     }

+ 12 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/util/IotDeviceConvert.java

@@ -9,7 +9,6 @@ import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptSimpleRe
 import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostSimpleRespVO;
 import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostSimpleRespVO;
 import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleSimpleRespVO;
 import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleSimpleRespVO;
 import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileRespVO;
 import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileRespVO;
-import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserRespVO;
 import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSimpleRespVO;
 import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSimpleRespVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.dept.PostDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.dept.PostDO;
@@ -31,6 +30,10 @@ public interface IotDeviceConvert {
         return CollectionUtils.convertList(list, de -> convert(de, deptMap.get(de.getDeptId())));
         return CollectionUtils.convertList(list, de -> convert(de, deptMap.get(de.getDeptId())));
     }
     }
 
 
+    default List<IotDeviceRespVO> convertList1(List<IotDeviceRespVO> list, Map<Long, DeptDO> deptMap) {
+        return CollectionUtils.convertList(list, de -> convert1(de, deptMap.get(de.getDeptId())));
+    }
+
     default IotDeviceRespVO convert(IotDeviceDO user, DeptDO dept) {
     default IotDeviceRespVO convert(IotDeviceDO user, DeptDO dept) {
         IotDeviceRespVO userVO = BeanUtils.toBean(user, IotDeviceRespVO.class);
         IotDeviceRespVO userVO = BeanUtils.toBean(user, IotDeviceRespVO.class);
         if (dept != null) {
         if (dept != null) {
@@ -39,6 +42,14 @@ public interface IotDeviceConvert {
         return userVO;
         return userVO;
     }
     }
 
 
+    default IotDeviceRespVO convert1(IotDeviceRespVO user, DeptDO dept) {
+        IotDeviceRespVO userVO = BeanUtils.toBean(user, IotDeviceRespVO.class);
+        if (dept != null) {
+            userVO.setDeptName(dept.getName());
+        }
+        return userVO;
+    }
+
     default List<UserSimpleRespVO> convertSimpleList(List<AdminUserDO> list, Map<Long, DeptDO> deptMap) {
     default List<UserSimpleRespVO> convertSimpleList(List<AdminUserDO> list, Map<Long, DeptDO> deptMap) {
         return CollectionUtils.convertList(list, user -> {
         return CollectionUtils.convertList(list, user -> {
             UserSimpleRespVO userVO = BeanUtils.toBean(user, UserSimpleRespVO.class);
             UserSimpleRespVO userVO = BeanUtils.toBean(user, UserSimpleRespVO.class);

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

@@ -0,0 +1,83 @@
+<?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.IotDeviceMapper">
+
+    <!--
+        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
+        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
+        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
+        文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
+     -->
+    <select id="deviceAssociateBomPage"
+            resultType="cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO">
+        SELECT
+            t.id ,
+            t.device_code,
+            t.device_name,
+            t.brand,
+            t.model,
+            t.dept_id,
+            t.device_status,
+            t.asset_property,
+            t.pic_url,
+            t.remark,
+            t.create_time,
+            t1.id bomNodeId,
+            t1.`name`,
+            t1.`code`
+        FROM
+            rq_iot_device t
+        INNER JOIN rq_iot_bom t1 ON ( t1.device_category_id = t.asset_class AND t1.deleted = 0 )
+        WHERE
+            t.deleted = 0
+          AND t1.deleted = 0
+          AND t1.leaf_flag = 1
+          AND t1.type LIKE '%2%'
+        <if test="deptIds != null and deptIds.size &gt; 0">
+            AND t.dept_id IN
+            <foreach collection="deptIds" index="index" item="key" open="(" separator="," close=")">
+                #{key}
+            </foreach>
+        </if>
+        <if test="reqVO.deviceName!=null and reqVO.deviceName!=''">
+            AND t.device_name LIKE concat(concat("%",#{reqVO.deviceName}),"%")
+        </if>
+        <if test="reqVO.name!=null and reqVO.name!=''">
+            AND t1.name LIKE concat(concat("%",#{reqVO.name}),"%")
+        </if>
+    </select>
+
+    <select id="deviceAssociateBomList"
+            resultType="cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO">
+        SELECT
+        t.id ,
+        t.device_code,
+        t.device_name,
+        t.asset_class,
+        t.brand,
+        t.model,
+        t.dept_id,
+        t.device_status,
+        t.asset_property,
+        t.pic_url,
+        t.remark,
+        t.create_time,
+        t1.id bomNodeId,
+        t1.`name`,
+        t1.`code`
+        FROM
+        rq_iot_device t
+        INNER JOIN rq_iot_bom t1 ON ( t1.device_category_id = t.asset_class AND t1.deleted = 0 )
+        WHERE
+        t.deleted = 0
+        AND t1.deleted = 0
+        AND t1.leaf_flag = 1
+        AND t1.type LIKE '%2%'
+        <if test="deviceIds != null and deviceIds.size &gt; 0">
+            AND t.id IN
+            <foreach collection="deviceIds" index="index" item="key" open="(" separator="," close=")">
+                #{key}
+            </foreach>
+        </if>
+    </select>
+</mapper>