浏览代码

pms 保养计划列表导出

zhangcl 3 天之前
父节点
当前提交
6c28e9feb1

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

@@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
 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.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicerunlog.vo.IotDeviceRunLogRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicerunlog.vo.IotDeviceRunLogRespVO;
@@ -14,15 +15,20 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotmaintenancebom.vo.IotMain
 import cn.iocoder.yudao.module.pms.controller.admin.iotmaintenancebom.vo.IotMaintenanceBomRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmaintenancebom.vo.IotMaintenanceBomRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmaintenancebom.vo.IotMaintenanceBomSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmaintenancebom.vo.IotMaintenanceBomSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmodeltemplateattrs.vo.IotModelTemplateAttrsPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmodeltemplateattrs.vo.IotModelTemplateAttrsPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.maintenance.vo.IotMaintenancePlanPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmaintenancebom.IotMaintenanceBomDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmaintenancebom.IotMaintenanceBomDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbom.IotMainWorkOrderBomDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbom.IotMainWorkOrderBomDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmodeltemplateattrs.IotModelTemplateAttrsDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmodeltemplateattrs.IotModelTemplateAttrsDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.maintenance.IotMaintenancePlanDO;
 import cn.iocoder.yudao.module.pms.service.IotDeviceService;
 import cn.iocoder.yudao.module.pms.service.IotDeviceService;
 import cn.iocoder.yudao.module.pms.service.iotdevicerunlog.IotDeviceRunLogService;
 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.iotmaintenancebom.IotMaintenanceBomService;
 import cn.iocoder.yudao.module.pms.service.iotmainworkorder.IotMainWorkOrderService;
 import cn.iocoder.yudao.module.pms.service.iotmainworkorder.IotMainWorkOrderService;
 import cn.iocoder.yudao.module.pms.service.iotmodeltemplateattrs.IotModelTemplateAttrsService;
 import cn.iocoder.yudao.module.pms.service.iotmodeltemplateattrs.IotModelTemplateAttrsService;
+import cn.iocoder.yudao.module.pms.service.maintenance.IotMaintenancePlanService;
+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.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -59,6 +65,10 @@ public class IotMaintenanceBomController {
     private IotModelTemplateAttrsService iotModelTemplateAttrsService;
     private IotModelTemplateAttrsService iotModelTemplateAttrsService;
     @Resource
     @Resource
     private IotMainWorkOrderService iotMainWorkOrderService;
     private IotMainWorkOrderService iotMainWorkOrderService;
+    @Resource
+    private IotMaintenancePlanService iotMaintenancePlanService;
+    @Resource
+    private AdminUserApi adminUserApi;
 
 
     @PostMapping("/create")
     @PostMapping("/create")
     @Operation(summary = "创建PMS 保养计划明细BOM")
     @Operation(summary = "创建PMS 保养计划明细BOM")
@@ -409,4 +419,71 @@ public class IotMaintenanceBomController {
                         BeanUtils.toBean(list, IotMaintenanceBomRespVO.class));
                         BeanUtils.toBean(list, IotMaintenanceBomRespVO.class));
     }
     }
 
 
+    @GetMapping("/exportPlans")
+    @Operation(summary = "导出PMS 保养计划明细列表 主表附加到明细表 Excel")
+    @PreAuthorize("@ss.hasPermission('pms:iot-maintenance-bom:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportPlans(@Valid IotMaintenanceBomPageReqVO pageReqVO,
+                                             HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        // 先查询符合条件的保养计划 id 集合
+        // 再根据 保养计划id 集合 查询所有保养计划明细
+        IotMaintenancePlanPageReqVO planReqVO = new IotMaintenancePlanPageReqVO();
+        BeanUtils.copyProperties(pageReqVO, planReqVO);
+        if (StrUtil.isNotBlank(pageReqVO.getName())) {
+            planReqVO.setName(pageReqVO.getName());
+        }
+        planReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<IotMaintenancePlanDO> plans = iotMaintenancePlanService.getIotMaintenancePlanPage(planReqVO).getList();
+        Map<Long, IotMaintenancePlanDO> planPair = new HashMap<>();
+        List<Long> planIds = new ArrayList<>();
+        if (CollUtil.isNotEmpty(plans)) {
+            plans.forEach(plan -> {
+                planIds.add(plan.getId());
+                planPair.put(plan.getId(), plan);
+            });
+        }
+        pageReqVO.setPlanIds(planIds);
+        List<IotMaintenanceBomDO> list = iotMaintenanceBomService.getIotMainPlanBomList(pageReqVO);
+        List<IotMaintenanceBomRespVO> planBoms = buildMainPlanBomList(list);
+        // 查询保养计划 负责人
+        Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertListByFlatMap(plans,
+                plan -> Stream.of(NumberUtils.parseLong(plan.getResponsiblePerson()))));
+        if (CollUtil.isNotEmpty(planBoms)) {
+            planBoms.forEach(bom -> {
+                // 保养计划明细
+                if (planPair.containsKey(bom.getPlanId())) {
+                    IotMaintenancePlanDO plan = planPair.get(bom.getPlanId());
+                    bom.setPlanName(plan.getName());
+                    bom.setSerialNumber(plan.getSerialNumber());
+                    // 计划负责人
+                    if (userMap.containsKey(Long.valueOf(plan.getResponsiblePerson()))) {
+                        bom.setResponsiblePersonName(userMap.get(Long.valueOf(plan.getResponsiblePerson())).getNickname());
+                    }
+                }
+                // 设置保养规则
+                if (bom.getMileageRule() == 0) {
+                    bom.setMileageRuleName("是");
+                } else {
+                    bom.setMileageRuleName("否");
+                }
+                // 运行时间规则
+                if (bom.getRunningTimeRule() == 0) {
+                    bom.setRunningTimeRuleName("是");
+                } else {
+                    bom.setRunningTimeRuleName("否");
+                }
+                // 自然日期规则
+                if (bom.getNaturalDateRule() == 0) {
+                    bom.setNaturalDateRuleName("是");
+                } else {
+                    bom.setNaturalDateRuleName("否");
+                }
+            });
+        }
+        // 导出 Excel
+        ExcelUtils.write(response, "保养计划明细.xls", "保养计划明细", IotMaintenanceBomRespVO.class,
+                planBoms);
+    }
+
 }
 }

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

@@ -9,6 +9,7 @@ import org.springframework.format.annotation.DateTimeFormat;
 
 
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
+import java.util.Collection;
 import java.util.List;
 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;
@@ -122,4 +123,17 @@ public class IotMaintenanceBomPageReqVO extends PageParam {
 
 
     @Schema(description = "保养计划id 唯一性校验", example = "18063")
     @Schema(description = "保养计划id 唯一性校验", example = "18063")
     private Long notPlanId;
     private Long notPlanId;
+
+    @Schema(description = "保养计划id 集合", example = "181,182")
+    private Collection<Long> planIds;
+
+
+    @Schema(description = "保养计划查询条件")
+    private Long deptId;
+
+    @Schema(description = "计划编号")
+    private String serialNumber;
+
+    @Schema(description = "计划名称")
+    private String planName;
 }
 }

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

@@ -16,27 +16,45 @@ import java.util.List;
 public class IotMaintenanceBomRespVO {
 public class IotMaintenanceBomRespVO {
 
 
     @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "27423")
     @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "27423")
-    @ExcelProperty("主键")
     private Long id;
     private Long id;
 
 
     @Schema(description = "保养计划id", example = "11371")
     @Schema(description = "保养计划id", example = "11371")
-    @ExcelProperty("保养计划id")
     private Long planId;
     private Long planId;
 
 
+    @Schema(description = "保养计划名称", example = "连油主车鲁EA5535")
+    @ExcelProperty("保养计划名称")
+    private String planName;
+
+    @Schema(description = "保养计划编号")
+    @ExcelProperty("保养计划编号")
+    private String serialNumber;
+
+    @Schema(description = "保养计划负责人")
+    @ExcelProperty("保养计划负责人")
+    private String responsiblePersonName;
+
     @Schema(description = "保养计划明细id", example = "17738")
     @Schema(description = "保养计划明细id", example = "17738")
-    @ExcelProperty("保养计划明细id")
     private Long planDetailId;
     private Long planDetailId;
 
 
     @Schema(description = "所属设备分类", example = "21283")
     @Schema(description = "所属设备分类", example = "21283")
-    @ExcelProperty("所属设备分类")
     private Long deviceCategoryId;
     private Long deviceCategoryId;
 
 
     @Schema(description = "设备id", example = "19729")
     @Schema(description = "设备id", example = "19729")
-    @ExcelProperty("设备id")
     private Long deviceId;
     private Long deviceId;
 
 
+    @Schema(description = "设备名称")
+    @ExcelProperty("设备名称")
+    private String deviceName;
+
+    @Schema(description = "设备编码")
+    @ExcelProperty("设备编码")
+    private String deviceCode;
+
+    @Schema(description = "BOM名称", example = "张三")
+    @ExcelProperty("保养项名称")
+    private String name;
+
     @Schema(description = "保养规则(量程 运行时间 自然日期) 可多选")
     @Schema(description = "保养规则(量程 运行时间 自然日期) 可多选")
-    @ExcelProperty("保养规则(量程 运行时间 自然日期) 可多选")
     private String rule;
     private String rule;
 
 
     @Schema(description = "保养规则-里程(0启用 1停用)", example = "2")
     @Schema(description = "保养规则-里程(0启用 1停用)", example = "2")
@@ -46,108 +64,124 @@ public class IotMaintenanceBomRespVO {
     @Schema(description = "保养规则-运行时间(0启用 1停用)", example = "2")
     @Schema(description = "保养规则-运行时间(0启用 1停用)", example = "2")
     private Integer runningTimeRule;
     private Integer runningTimeRule;
 
 
+    @Schema(description = "保养规则-里程(0启用 1停用)", example = "2")
+    @ExcelProperty("运行里程规则")
+    private String mileageRuleName;
+    @Schema(description = "保养规则-自然日期(0启用 1停用)", example = "2")
+    @ExcelProperty("自然日期规则")
+    private String naturalDateRuleName;
+    @Schema(description = "保养规则-运行时间(0启用 1停用)", example = "2")
+    @ExcelProperty("运行时间规则")
+    private String runningTimeRuleName;
+
+    @Schema(description = "累计运行公里数", example = "20238km")
+    @ExcelProperty("累计运行公里数(KM)")
+    private BigDecimal totalMileage;
+
+    @Schema(description = "上次保养时间")
+    @ExcelProperty("上次保养时间")
+    private String lastMaintenanceDateStr;
+
     @Schema(description = "上次保养运行时长(小时)")
     @Schema(description = "上次保养运行时长(小时)")
-    @ExcelProperty("上次保养运行时长(小时)")
+    @ExcelProperty("上次保养时长(H)")
     private BigDecimal lastRunningTime;
     private BigDecimal lastRunningTime;
 
 
-    @Schema(description = "下次保养运行时长(小时)")
-    @ExcelProperty("下次保养运行时长(小时)")
+    @Schema(description = "运行时间周期(小时)")
+    @ExcelProperty("运行时间周期(H)")
     private BigDecimal nextRunningTime;
     private BigDecimal nextRunningTime;
 
 
+    @Schema(description = "下次保养时长(小时)")
+    @ExcelProperty("下次保养时长(H)")
+    private BigDecimal nextMaintenanceTime;
+
+    @Schema(description = "剩余时长(小时)")
+    @ExcelProperty("剩余时长(H)")
+    private BigDecimal remainMaintenanceTime;
+
     @Schema(description = "运行时长周期提前量 H")
     @Schema(description = "运行时长周期提前量 H")
-    @ExcelProperty("运行时长周期提前量 H")
+    @ExcelProperty("时间周期提前量(H)")
     private BigDecimal timePeriodLead;
     private BigDecimal timePeriodLead;
 
 
     @Schema(description = "上次保养运行公里数(千米)")
     @Schema(description = "上次保养运行公里数(千米)")
-    @ExcelProperty("上次保养运行公里数(千米)")
+    @ExcelProperty("上次保养里程数(KM)")
     private BigDecimal lastRunningKilometers;
     private BigDecimal lastRunningKilometers;
 
 
     @Schema(description = "下次保养运行公里数(千米)")
     @Schema(description = "下次保养运行公里数(千米)")
-    @ExcelProperty("下次保养运行公里数(千米)")
+    @ExcelProperty("运行里程周期(KM)")
     private BigDecimal nextRunningKilometers;
     private BigDecimal nextRunningKilometers;
 
 
+    @Schema(description = "下次保养公里数(KM)")
+    @ExcelProperty("下次保养公里数(KM)")
+    private BigDecimal nextMaintenanceKilo;
+
+    @Schema(description = "剩余公里数(KM)")
+    @ExcelProperty("剩余公里数(KM)")
+    private BigDecimal remainMaintenanceKilo;
+
     @Schema(description = "公里数周期-提前量 km")
     @Schema(description = "公里数周期-提前量 km")
-    @ExcelProperty("公里数周期-提前量 km")
+    @ExcelProperty("里程周期提前量(KM)")
     private BigDecimal kiloCycleLead;
     private BigDecimal kiloCycleLead;
 
 
     @Schema(description = "上次保养自然日期(天)")
     @Schema(description = "上次保养自然日期(天)")
-    @ExcelProperty("上次保养自然日期(天)")
     private LocalDateTime lastNaturalDate;
     private LocalDateTime lastNaturalDate;
 
 
+    @Schema(description = "上次保养自然日期(天)")
+    @ExcelProperty("上次保养日期")
+    private LocalDateTime lastNaturalDateStr;
+
     @Schema(description = "下次保养自然日期(天)")
     @Schema(description = "下次保养自然日期(天)")
-    @ExcelProperty("下次保养自然日期(天)")
+    @ExcelProperty("自然日周期(D)")
     private BigDecimal nextNaturalDate;
     private BigDecimal nextNaturalDate;
 
 
     @Schema(description = "自然日周期-提前量(天)")
     @Schema(description = "自然日周期-提前量(天)")
-    @ExcelProperty("自然日周期-提前量(天)")
+    @ExcelProperty("自然日周期提前量(D)")
     private BigDecimal naturalDatePeriodLead;
     private BigDecimal naturalDatePeriodLead;
 
 
     @Schema(description = "BOM节点 id", example = "18063")
     @Schema(description = "BOM节点 id", example = "18063")
     private Long bomNodeId;
     private Long bomNodeId;
 
 
-    @Schema(description = "BOM名称", example = "张三")
-    @ExcelProperty("BOM名称")
-    private String name;
-
     @Schema(description = "BOM编码")
     @Schema(description = "BOM编码")
-    @ExcelProperty("BOM编码")
     private String code;
     private String code;
 
 
     @Schema(description = "父BOM id 顶级为0", example = "18063")
     @Schema(description = "父BOM id 顶级为0", example = "18063")
-    @ExcelProperty("父BOM id 顶级为0")
     private Long parentId;
     private Long parentId;
 
 
     @Schema(description = "子节点id 逗号分隔")
     @Schema(description = "子节点id 逗号分隔")
-    @ExcelProperty("子节点id 逗号分隔")
     private String childIds;
     private String childIds;
 
 
     @Schema(description = "层级")
     @Schema(description = "层级")
-    @ExcelProperty("层级")
     private Integer level;
     private Integer level;
 
 
     @Schema(description = "是否叶子节点 0是 1否")
     @Schema(description = "是否叶子节点 0是 1否")
-    @ExcelProperty("是否叶子节点 0是 1否")
     private Integer leafFlag;
     private Integer leafFlag;
 
 
     @Schema(description = "显示顺序")
     @Schema(description = "显示顺序")
-    @ExcelProperty("显示顺序")
     private Integer sort;
     private Integer sort;
 
 
     @Schema(description = "M维修 S保养 维修+保养", example = "2")
     @Schema(description = "M维修 S保养 维修+保养", example = "2")
-    @ExcelProperty("M维修 S保养 维修+保养")
     private String type;
     private String type;
 
 
     @Schema(description = "状态 0启用  1停用", example = "2")
     @Schema(description = "状态 0启用  1停用", example = "2")
-    @ExcelProperty("状态 0启用  1停用")
     private Integer status;
     private Integer status;
 
 
     @Schema(description = "备注", example = "你说的对")
     @Schema(description = "备注", example = "你说的对")
-    @ExcelProperty("备注")
     private String remark;
     private String remark;
 
 
     @Schema(description = "版本")
     @Schema(description = "版本")
-    @ExcelProperty("版本")
     private Integer version;
     private Integer version;
 
 
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
-    @ExcelProperty("创建时间")
     private LocalDateTime createTime;
     private LocalDateTime createTime;
 
 
     /**
     /**
      * 扩展属性 设备关联字段
      * 扩展属性 设备关联字段
      */
      */
-    @Schema(description = "设备名称")
-    private String deviceName;
-    @Schema(description = "设备编码")
-    private String deviceCode;
     @Schema(description = "设备状态")
     @Schema(description = "设备状态")
     private String deviceStatus;
     private String deviceStatus;
     @Schema(description = "资产性质")
     @Schema(description = "资产性质")
     private String assetProperty;
     private String assetProperty;
     @Schema(description = "累计运行时间", example = "30000H")
     @Schema(description = "累计运行时间", example = "30000H")
     private BigDecimal totalRunTime;
     private BigDecimal totalRunTime;
-    @Schema(description = "累计运行公里数", example = "20238km")
-    private BigDecimal totalMileage;
 
 
     @Schema(description = "临时 累计运行时间 用于运行记录模板中包含多个累计类型属性的场景", example = "30000H")
     @Schema(description = "临时 累计运行时间 用于运行记录模板中包含多个累计类型属性的场景", example = "30000H")
     private BigDecimal tempTotalRunTime;
     private BigDecimal tempTotalRunTime;
@@ -160,7 +194,8 @@ public class IotMaintenanceBomRespVO {
     @Schema(description = "模板中涉及多个累计运行公里数的属性集合")
     @Schema(description = "模板中涉及多个累计运行公里数的属性集合")
     private List<IotDeviceRunLogRespVO> mileageAccumulatedAttrs;
     private List<IotDeviceRunLogRespVO> mileageAccumulatedAttrs;
 
 
-
     @Schema(description = "上次保养时间")
     @Schema(description = "上次保养时间")
     private LocalDateTime lastMaintenanceDate;
     private LocalDateTime lastMaintenanceDate;
+
+
 }
 }

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

@@ -60,6 +60,7 @@ public interface IotMaintenanceBomMapper extends BaseMapperX<IotMaintenanceBomDO
     default List<IotMaintenanceBomDO> selectList(IotMaintenanceBomPageReqVO reqVO) {
     default List<IotMaintenanceBomDO> selectList(IotMaintenanceBomPageReqVO reqVO) {
         return selectList(new LambdaQueryWrapperX<IotMaintenanceBomDO>()
         return selectList(new LambdaQueryWrapperX<IotMaintenanceBomDO>()
                 .eqIfPresent(IotMaintenanceBomDO::getPlanId, reqVO.getPlanId())
                 .eqIfPresent(IotMaintenanceBomDO::getPlanId, reqVO.getPlanId())
+                .inIfPresent(IotMaintenanceBomDO::getPlanId, reqVO.getPlanIds())
                 .neIfPresent(IotMaintenanceBomDO::getPlanId, reqVO.getNotPlanId())
                 .neIfPresent(IotMaintenanceBomDO::getPlanId, reqVO.getNotPlanId())
                 .eqIfPresent(IotMaintenanceBomDO::getPlanDetailId, reqVO.getPlanDetailId())
                 .eqIfPresent(IotMaintenanceBomDO::getPlanDetailId, reqVO.getPlanDetailId())
                 .eqIfPresent(IotMaintenanceBomDO::getDeviceCategoryId, reqVO.getDeviceCategoryId())
                 .eqIfPresent(IotMaintenanceBomDO::getDeviceCategoryId, reqVO.getDeviceCategoryId())