Forráskód Böngészése

Merge remote-tracking branch 'origin/master'

lipenghui 2 napja
szülő
commit
740b229e3a

+ 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.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.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.IotMaintenanceBomSaveReqVO;
 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.dal.dataobject.iotmaintenancebom.IotMaintenanceBomDO;
 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.maintenance.IotMaintenancePlanDO;
 import cn.iocoder.yudao.module.pms.service.IotDeviceService;
 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.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.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -59,6 +65,10 @@ public class IotMaintenanceBomController {
     private IotModelTemplateAttrsService iotModelTemplateAttrsService;
     @Resource
     private IotMainWorkOrderService iotMainWorkOrderService;
+    @Resource
+    private IotMaintenancePlanService iotMaintenancePlanService;
+    @Resource
+    private AdminUserApi adminUserApi;
 
     @PostMapping("/create")
     @Operation(summary = "创建PMS 保养计划明细BOM")
@@ -409,4 +419,71 @@ public class IotMaintenanceBomController {
                         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.time.LocalDateTime;
+import java.util.Collection;
 import java.util.List;
 
 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")
     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 {
 
     @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "27423")
-    @ExcelProperty("主键")
     private Long id;
 
     @Schema(description = "保养计划id", example = "11371")
-    @ExcelProperty("保养计划id")
     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")
-    @ExcelProperty("保养计划明细id")
     private Long planDetailId;
 
     @Schema(description = "所属设备分类", example = "21283")
-    @ExcelProperty("所属设备分类")
     private Long deviceCategoryId;
 
     @Schema(description = "设备id", example = "19729")
-    @ExcelProperty("设备id")
     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 = "保养规则(量程 运行时间 自然日期) 可多选")
-    @ExcelProperty("保养规则(量程 运行时间 自然日期) 可多选")
     private String rule;
 
     @Schema(description = "保养规则-里程(0启用 1停用)", example = "2")
@@ -46,108 +64,124 @@ public class IotMaintenanceBomRespVO {
     @Schema(description = "保养规则-运行时间(0启用 1停用)", example = "2")
     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 = "上次保养运行时长(小时)")
-    @ExcelProperty("上次保养运行时长(小时)")
+    @ExcelProperty("上次保养时长(H)")
     private BigDecimal lastRunningTime;
 
-    @Schema(description = "下次保养运行时长(小时)")
-    @ExcelProperty("下次保养运行时长(小时)")
+    @Schema(description = "运行时间周期(小时)")
+    @ExcelProperty("运行时间周期(H)")
     private BigDecimal nextRunningTime;
 
+    @Schema(description = "下次保养时长(小时)")
+    @ExcelProperty("下次保养时长(H)")
+    private BigDecimal nextMaintenanceTime;
+
+    @Schema(description = "剩余时长(小时)")
+    @ExcelProperty("剩余时长(H)")
+    private BigDecimal remainMaintenanceTime;
+
     @Schema(description = "运行时长周期提前量 H")
-    @ExcelProperty("运行时长周期提前量 H")
+    @ExcelProperty("时间周期提前量(H)")
     private BigDecimal timePeriodLead;
 
     @Schema(description = "上次保养运行公里数(千米)")
-    @ExcelProperty("上次保养运行公里数(千米)")
+    @ExcelProperty("上次保养里程数(KM)")
     private BigDecimal lastRunningKilometers;
 
     @Schema(description = "下次保养运行公里数(千米)")
-    @ExcelProperty("下次保养运行公里数(千米)")
+    @ExcelProperty("运行里程周期(KM)")
     private BigDecimal nextRunningKilometers;
 
+    @Schema(description = "下次保养公里数(KM)")
+    @ExcelProperty("下次保养公里数(KM)")
+    private BigDecimal nextMaintenanceKilo;
+
+    @Schema(description = "剩余公里数(KM)")
+    @ExcelProperty("剩余公里数(KM)")
+    private BigDecimal remainMaintenanceKilo;
+
     @Schema(description = "公里数周期-提前量 km")
-    @ExcelProperty("公里数周期-提前量 km")
+    @ExcelProperty("里程周期提前量(KM)")
     private BigDecimal kiloCycleLead;
 
     @Schema(description = "上次保养自然日期(天)")
-    @ExcelProperty("上次保养自然日期(天)")
     private LocalDateTime lastNaturalDate;
 
+    @Schema(description = "上次保养自然日期(天)")
+    @ExcelProperty("上次保养日期")
+    private LocalDateTime lastNaturalDateStr;
+
     @Schema(description = "下次保养自然日期(天)")
-    @ExcelProperty("下次保养自然日期(天)")
+    @ExcelProperty("自然日周期(D)")
     private BigDecimal nextNaturalDate;
 
     @Schema(description = "自然日周期-提前量(天)")
-    @ExcelProperty("自然日周期-提前量(天)")
+    @ExcelProperty("自然日周期提前量(D)")
     private BigDecimal naturalDatePeriodLead;
 
     @Schema(description = "BOM节点 id", example = "18063")
     private Long bomNodeId;
 
-    @Schema(description = "BOM名称", example = "张三")
-    @ExcelProperty("BOM名称")
-    private String name;
-
     @Schema(description = "BOM编码")
-    @ExcelProperty("BOM编码")
     private String code;
 
     @Schema(description = "父BOM id 顶级为0", example = "18063")
-    @ExcelProperty("父BOM id 顶级为0")
     private Long parentId;
 
     @Schema(description = "子节点id 逗号分隔")
-    @ExcelProperty("子节点id 逗号分隔")
     private String childIds;
 
     @Schema(description = "层级")
-    @ExcelProperty("层级")
     private Integer level;
 
     @Schema(description = "是否叶子节点 0是 1否")
-    @ExcelProperty("是否叶子节点 0是 1否")
     private Integer leafFlag;
 
     @Schema(description = "显示顺序")
-    @ExcelProperty("显示顺序")
     private Integer sort;
 
     @Schema(description = "M维修 S保养 维修+保养", example = "2")
-    @ExcelProperty("M维修 S保养 维修+保养")
     private String type;
 
     @Schema(description = "状态 0启用  1停用", example = "2")
-    @ExcelProperty("状态 0启用  1停用")
     private Integer status;
 
     @Schema(description = "备注", example = "你说的对")
-    @ExcelProperty("备注")
     private String remark;
 
     @Schema(description = "版本")
-    @ExcelProperty("版本")
     private Integer version;
 
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
-    @ExcelProperty("创建时间")
     private LocalDateTime createTime;
 
     /**
      * 扩展属性 设备关联字段
      */
-    @Schema(description = "设备名称")
-    private String deviceName;
-    @Schema(description = "设备编码")
-    private String deviceCode;
     @Schema(description = "设备状态")
     private String deviceStatus;
     @Schema(description = "资产性质")
     private String assetProperty;
     @Schema(description = "累计运行时间", example = "30000H")
     private BigDecimal totalRunTime;
-    @Schema(description = "累计运行公里数", example = "20238km")
-    private BigDecimal totalMileage;
 
     @Schema(description = "临时 累计运行时间 用于运行记录模板中包含多个累计类型属性的场景", example = "30000H")
     private BigDecimal tempTotalRunTime;
@@ -160,7 +194,8 @@ public class IotMaintenanceBomRespVO {
     @Schema(description = "模板中涉及多个累计运行公里数的属性集合")
     private List<IotDeviceRunLogRespVO> mileageAccumulatedAttrs;
 
-
     @Schema(description = "上次保养时间")
     private LocalDateTime lastMaintenanceDate;
+
+
 }

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

@@ -2,6 +2,9 @@ package cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.hutool.core.util.ObjUtil;
 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;
@@ -12,6 +15,7 @@ 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.iotmainworkorder.vo.*;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbom.vo.IotMainWorkOrderBomPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceExportRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorder.IotMainWorkOrderDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbom.IotMainWorkOrderBomDO;
@@ -21,7 +25,9 @@ import cn.iocoder.yudao.module.pms.service.iotmainworkorderbom.IotMainWorkOrderB
 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
 import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO;
 import cn.iocoder.yudao.module.system.service.dept.DeptService;
+import cn.iocoder.yudao.module.system.service.dict.DictDataService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -61,6 +67,8 @@ public class IotMainWorkOrderController {
     private DeptService deptService;
     @Autowired
     private IotDevicePersonService iotDevicePersonService;
+    @Resource
+    private DictDataService dictDataService;
 
     @PostMapping("/create")
     @Operation(summary = "创建保养工单")
@@ -232,6 +240,17 @@ public class IotMainWorkOrderController {
         Map<Long, Long> deviceOrderPair = new HashMap<>();
         // key设备id      value正在执行的保养工单id
         Map<Long, Long> deviceRunningOrderPair = new HashMap<>();
+        // key设备状态数据字典value   value设备状态数据字典label
+        Map<String, String> deviceStatusPair = new HashMap<>();
+
+        // 施工状态 字典数据
+        List<DictDataDO> deviceStatusData = dictDataService.getDictDataListByDictType("pms_device_status");
+        if (CollUtil.isNotEmpty(deviceStatusData)) {
+            deviceStatusData.forEach(data -> {
+                deviceStatusPair.put(data.getValue(), data.getLabel());
+            });
+        }
+
         if (CollUtil.isNotEmpty(orderBoms)) {
             orderBoms.forEach(bom -> {
                 orderIds.add(bom.getWorkOrderId());
@@ -318,6 +337,14 @@ public class IotMainWorkOrderController {
         Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertListByFlatMap(orders,
                 order -> Stream.of(NumberUtils.parseLong(order.getResponsiblePerson()))));
         return BeanUtils.toBean(orders, IotMainWorkOrderRespVO.class, orderVO -> {
+            // 创建时间 格式化 yyyy-MM-dd
+            if (ObjUtil.isNotEmpty(orderVO.getCreateTime())) {
+                orderVO.setCreateTimeStr(LocalDateTimeUtil.format(orderVO.getCreateTime(), DatePattern.NORM_DATE_PATTERN));
+            }
+            // 创建时间 格式化 yyyy-MM-dd
+            if (ObjUtil.isNotEmpty(orderVO.getUpdateTime())) {
+                orderVO.setUpdateTimeStr(LocalDateTimeUtil.format(orderVO.getUpdateTime(), DatePattern.NORM_DATE_PATTERN));
+            }
             // 2.1 拼接部门信息
             findAndThen(deptMap, orderVO.getDeptId(), dept -> orderVO.setDeptName(dept.getName()));
             // 设置创建人、负责人名称
@@ -339,4 +366,86 @@ public class IotMainWorkOrderController {
                         BeanUtils.toBean(list, IotMainWorkOrderRespVO.class));
     }
 
+    @GetMapping("/exportMaintenances")
+    @Operation(summary = "导出保养查询列表 Excel")
+    @PreAuthorize("@ss.hasPermission('pms:iot-main-work-order:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportMaintenances(@Valid IotMainWorkOrderPageReqVO pageReqVO,
+                                            HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<IotDeviceRespVO> maintenances = iotMainWorkOrderService.deviceMainDistances(pageReqVO).getList();
+        // List<IotMainWorkOrderDO> list = iotMainWorkOrderService.getIotMainWorkOrderPage(pageReqVO).getList();
+        // key设备状态数据字典value   value设备状态数据字典label
+        Map<String, String> deviceStatusPair = new HashMap<>();
+
+        // 施工状态 字典数据
+        List<DictDataDO> deviceStatusData = dictDataService.getDictDataListByDictType("pms_device_status");
+        if (CollUtil.isNotEmpty(deviceStatusData)) {
+            deviceStatusData.forEach(data -> {
+                deviceStatusPair.put(data.getValue(), data.getLabel());
+            });
+        }
+        List<IotDeviceRespVO> deviceDistances = buildDeviceDistanceList(maintenances);
+        List<IotDeviceExportRespVO> deviceDistancesResult = BeanUtils.toBean(deviceDistances, IotDeviceExportRespVO.class);
+        if (CollUtil.isNotEmpty(deviceDistancesResult)) {
+            deviceDistancesResult.forEach(distance -> {
+                // 设置施工状态 label
+                if (deviceStatusPair.containsKey(distance.getDeviceStatus())) {
+                    distance.setDeviceStatusLabel(deviceStatusPair.get(distance.getDeviceStatus()));
+                }
+                // 设置工单状态 未生成工单;已生成工单未执行
+                if (distance.isShouldWorkOrder() && distance.isRunningWorkOrder()) {
+                    distance.setOrderStatus("已生成工单未执行");
+                }
+                if (distance.isShouldWorkOrder() && !distance.isRunningWorkOrder()) {
+                    distance.setOrderStatus("未生成工单");
+                }
+            });
+        }
+        // 导出 Excel
+        ExcelUtils.write(response, "保养查询.xls", "保养查询", IotDeviceExportRespVO.class,
+                deviceDistancesResult);
+    }
+
+    @GetMapping("/exportMaintenanceOrders")
+    @Operation(summary = "导出保养查询列表 Excel")
+    @PreAuthorize("@ss.hasPermission('pms:iot-main-work-order:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportMaintenanceOrders(@Valid IotMainWorkOrderPageReqVO pageReqVO,
+                                   HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        // List<IotDeviceRespVO> maintenances = iotMainWorkOrderService.deviceMainDistances(pageReqVO).getList();
+        List<IotMainWorkOrderRespVO> orders = iotMainWorkOrderService.sortedMainWorkOrderPage(pageReqVO).getList();
+        // key设备状态数据字典value   value设备状态数据字典label
+        Map<String, String> deviceStatusPair = new HashMap<>();
+
+        // 施工状态 字典数据
+        List<DictDataDO> deviceStatusData = dictDataService.getDictDataListByDictType("pms_device_status");
+        if (CollUtil.isNotEmpty(deviceStatusData)) {
+            deviceStatusData.forEach(data -> {
+                deviceStatusPair.put(data.getValue(), data.getLabel());
+            });
+        }
+        List<IotMainWorkOrderRespVO> sortedOrders = buildSortedMainWorkOrders(orders);
+        if (CollUtil.isNotEmpty(sortedOrders)) {
+            sortedOrders.forEach(order -> {
+                // 工单类型 label
+                if (order.getType() == 1) {
+                    order.setTypeName("计划生成");
+                } else {
+                    order.setTypeName("临时新建");
+                }
+                // 工单状态  待执行 已执行
+                if (order.getResult() == 1) {
+                    order.setResultName("待执行");
+                } else {
+                    order.setResultName("已执行");
+                }
+            });
+        }
+        // 导出 Excel
+        ExcelUtils.write(response, "保养工单.xls", "保养工单", IotMainWorkOrderRespVO.class,
+                sortedOrders);
+    }
+
 }

+ 25 - 23
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmainworkorder/vo/IotMainWorkOrderRespVO.java

@@ -16,19 +16,15 @@ import java.util.List;
 public class IotMainWorkOrderRespVO {
 
     @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "18795")
-    @ExcelProperty("主键id")
     private Long id;
 
     @Schema(description = "保养计划id", example = "28145")
-    @ExcelProperty("保养计划id")
     private Long planId;
 
     @Schema(description = "保养计划编号")
-    @ExcelProperty("保养计划编号")
     private String planSerialNumber;
 
     @Schema(description = "组织id", example = "8684")
-    @ExcelProperty("组织id")
     private Long deptId;
 
     @Schema(description = "分组工单id  多个责任人操作相同设备内容的工单 关联关系 uuid")
@@ -39,47 +35,53 @@ public class IotMainWorkOrderRespVO {
     private String orderNumber;
 
     @Schema(description = "工单名称 (吐哈-C14-保养计划)", example = "张三")
-    @ExcelProperty("工单名称 (吐哈-C14-保养计划)")
+    @ExcelProperty("工单名称")
     private String name;
 
+    @Schema(description = "距离保养时间 单位可能是 H D KM")
+    @ExcelProperty("距离保养")
+    private String mainDistance;
+
     @Schema(description = "工单类型(1计划生成  2临时新建)", example = "1")
-    @ExcelProperty("工单类型(1计划生成  2临时新建)")
     private Integer type;
 
+    @Schema(description = "工单类型(1计划生成  2临时新建)", example = "1")
+    @ExcelProperty("工单类型")
+    private String typeName;
+
     @Schema(description = "负责人id 多个以逗号分隔")
-    @ExcelProperty("负责人id 多个以逗号分隔")
     private String responsiblePerson;
 
     @Schema(description = "负责人id 多个以逗号分隔", example = "王五")
-    @ExcelProperty("负责人id 多个以逗号分隔")
+    @ExcelProperty("负责人")
     private String responsiblePersonName;
 
     @Schema(description = "保养费用")
-    @ExcelProperty("保养费用")
+    @ExcelProperty("保养费用(元)")
     private BigDecimal cost;
 
     @Schema(description = "保养结果(1待执行 2已执行)")
-    @ExcelProperty("保养结果(1待执行 2已执行)")
     private Integer result;
 
+    @Schema(description = "保养结果(1待执行 2已执行)")
+    @ExcelProperty("保养结果")
+    private String resultName;
+
     @Schema(description = "其他费用")
-    @ExcelProperty("其他费用")
     private BigDecimal otherCost;
 
     @Schema(description = "人工费用")
-    @ExcelProperty("人工费用")
     private BigDecimal laborCost;
 
     @Schema(description = "是否委外 0否  1是")
-    @ExcelProperty("是否委外 0否  1是")
     private Integer outsourcingFlag;
 
     @Schema(description = "实际保养开始时间")
-    @ExcelProperty("实际保养开始时间")
+    @ExcelProperty("保养开始时间")
     private LocalDateTime actualStartTime;
 
     @Schema(description = "实际保养结束时间")
-    @ExcelProperty("实际保养结束时间")
+    @ExcelProperty("保养结束时间")
     private LocalDateTime actualEndTime;
 
     @Schema(description = "备注", example = "你说的对")
@@ -91,34 +93,34 @@ public class IotMainWorkOrderRespVO {
     private String delayReason;
 
     @Schema(description = "状态 0启用  1停用", example = "2")
-    @ExcelProperty("状态 0启用  1停用")
     private Integer status;
 
     @Schema(description = "流程实例id", example = "12662")
-    @ExcelProperty("流程实例id")
     private String processInstanceId;
 
     @Schema(description = "审批状态 未提交、审批中、审批通过、审批不通过、已取消", example = "1")
-    @ExcelProperty("审批状态 未提交、审批中、审批通过、审批不通过、已取消")
     private Integer auditStatus;
 
     @Schema(description = "创建时间")
-    @ExcelProperty("创建时间")
     private LocalDateTime createTime;
 
+    @Schema(description = "创建时间")
+    @ExcelProperty("创建时间")
+    private String createTimeStr;
+
     @Schema(description = "更新时间")
-    @ExcelProperty("更新时间")
     private LocalDateTime updateTime;
 
+    @Schema(description = "更新时间 格式化 yyyy-MM-dd")
+    @ExcelProperty("填写时间")
+    private String updateTimeStr;
+
     /**
      * 扩展字段
      */
     @Schema(description = "部门名称")
     private String deptName;
 
-    @Schema(description = "距离保养时间 单位可能是 H D KM")
-    private String mainDistance;
-
     @Schema(description = "距离保养时间 单位 H D KM")
     private String mainDistanceUnit;
 

+ 159 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrydailyreport/IotRyDailyReportController.java

@@ -727,6 +727,26 @@ public class IotRyDailyReportController {
             }
         });
 
+        // key施工状态数据字典value   value施工状态数据字典label
+        Map<String, String> constructStatusPair = new HashMap<>();
+
+        // 钻井 施工状态 字典数据
+        List<DictDataDO> rigStatusDictData = dictDataService.getDictDataListByDictType("rigStatus");
+        // 修井 施工状态 字典数据
+        List<DictDataDO> repairStatusDictData = dictDataService.getDictDataListByDictType("repairStatus");
+        // 钻井施工状态
+        if ("1".equals(pageReqVO.getProjectClassification()) && CollUtil.isNotEmpty(rigStatusDictData)) {
+            rigStatusDictData.forEach(data -> {
+                constructStatusPair.put(data.getValue(), data.getLabel());
+            });
+        }
+        // 修井施工状态
+        if ("2".equals(pageReqVO.getProjectClassification()) && CollUtil.isNotEmpty(repairStatusDictData)) {
+            repairStatusDictData.forEach(data -> {
+                constructStatusPair.put(data.getValue(), data.getLabel());
+            });
+        }
+
         DataPermissionUtils.executeIgnore(() -> {
             // 查询日报关联的项目信息
             IotProjectInfoPageReqVO reqVO = new IotProjectInfoPageReqVO();
@@ -806,8 +826,30 @@ public class IotRyDailyReportController {
             // 2.1 拼接部门信息
             findAndThen(deptMap, reportVO.getDeptId(), dept -> reportVO.setDeptName(dept.getName()));
 
+            findAndThen(completedTasksPair, reportVO.getDeptId(), completedTaskCount -> reportVO.setCompletedWells(completedTaskCount));
+            // 钻井 施工状态 数据字典
+            findAndThen(constructStatusPair, reportVO.getRigStatus(), statusLabel -> {
+                if ("1".equals(pageReqVO.getProjectClassification())) {
+                    reportVO.setConstructionStatusName(statusLabel);
+                }
+            });
+            // 修井 施工状态 数据字典
+            findAndThen(constructStatusPair, reportVO.getRepairStatus(), statusLabel -> {
+                if ("2".equals(pageReqVO.getProjectClassification())) {
+                    reportVO.setConstructionStatusName(statusLabel);
+                }
+            });
+            // 创建时间 格式化 yyyy-MM-dd
+            if (ObjUtil.isNotEmpty(reportVO.getCreateTime())) {
+                reportVO.setCreateTimeStr(LocalDateTimeUtil.format(reportVO.getCreateTime(), DatePattern.NORM_DATE_PATTERN));
+            }
+
+            // 上井次完井时间 格式化时间为 yyyy-MM-dd
+            if (ObjUtil.isNotEmpty(reportVO.getLatestWellDoneTime())) {
+                reportVO.setLatestWellDoneTimeStr(LocalDateTimeUtil.format(reportVO.getLatestWellDoneTime(), DatePattern.NORM_DATE_PATTERN));
+            }
+
             // 转换用电量 单位 kWh 转换成 MWh
-            // 用电量 kWh 转换单位 MWh
             if (reportVO.getDailyPowerUsage().compareTo(BigDecimal.ZERO) > 0) {
                 BigDecimal powerW = reportVO.getDailyPowerUsage()
                         .divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP);
@@ -1100,6 +1142,25 @@ public class IotRyDailyReportController {
             }
         });
 
+        // key施工状态数据字典value   value施工状态数据字典label
+        Map<String, String> constructStatusPair = new HashMap<>();
+        // 钻井 施工状态 字典数据
+        List<DictDataDO> rigStatusDictData = dictDataService.getDictDataListByDictType("rigStatus");
+        // 修井 施工状态 字典数据
+        List<DictDataDO> repairStatusDictData = dictDataService.getDictDataListByDictType("repairStatus");
+        // 钻井施工状态
+        if ("1".equals(pageReqVO.getProjectClassification()) && CollUtil.isNotEmpty(rigStatusDictData)) {
+            rigStatusDictData.forEach(data -> {
+                constructStatusPair.put(data.getValue(), data.getLabel());
+            });
+        }
+        // 修井施工状态
+        if ("2".equals(pageReqVO.getProjectClassification()) && CollUtil.isNotEmpty(repairStatusDictData)) {
+            repairStatusDictData.forEach(data -> {
+                constructStatusPair.put(data.getValue(), data.getLabel());
+            });
+        }
+
         DataPermissionUtils.executeIgnore(() -> {
             // 查询日报关联的项目信息
             IotProjectInfoPageReqVO reqVO = new IotProjectInfoPageReqVO();
@@ -1179,8 +1240,16 @@ public class IotRyDailyReportController {
             // 2.1 拼接部门信息
             findAndThen(deptMap, reportVO.getDeptId(), dept -> reportVO.setDeptName(dept.getName()));
 
+            // 日报生成日期 格式化时间为 yyyy-MM-dd
+            if (ObjUtil.isNotEmpty(reportVO.getCreateTime())) {
+                reportVO.setCreateTimeStr(LocalDateTimeUtil.format(reportVO.getCreateTime(), DatePattern.NORM_DATE_PATTERN));
+            }
+            // 上井次完井时间 格式化时间为 yyyy-MM-dd
+            if (ObjUtil.isNotEmpty(reportVO.getLatestWellDoneTime())) {
+                reportVO.setLatestWellDoneTimeStr(LocalDateTimeUtil.format(reportVO.getLatestWellDoneTime(), DatePattern.NORM_DATE_PATTERN));
+            }
+
             // 转换用电量 单位 kWh 转换成 MWh
-            // 用电量 kWh 转换单位 MWh
             if (reportVO.getDailyPowerUsage().compareTo(BigDecimal.ZERO) > 0) {
                 BigDecimal powerW = reportVO.getDailyPowerUsage()
                         .divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP);
@@ -1246,6 +1315,18 @@ public class IotRyDailyReportController {
             // 2.8 总施工井数 完工井数
             findAndThen(totalTasksPair, reportVO.getDeptId(), totalTaskCount -> reportVO.setTotalConstructionWells(totalTaskCount));
             findAndThen(completedTasksPair, reportVO.getDeptId(), completedTaskCount -> reportVO.setCompletedWells(completedTaskCount));
+            // 钻井 施工状态 数据字典
+            findAndThen(constructStatusPair, reportVO.getRigStatus(), statusLabel -> {
+                if ("1".equals(pageReqVO.getProjectClassification())) {
+                    reportVO.setConstructionStatusName(statusLabel);
+                }
+            });
+            // 修井 施工状态 数据字典
+            findAndThen(constructStatusPair, reportVO.getRepairStatus(), statusLabel -> {
+                if ("2".equals(pageReqVO.getProjectClassification())) {
+                    reportVO.setConstructionStatusName(statusLabel);
+                }
+            });
         });
     }
 
@@ -1535,4 +1616,80 @@ public class IotRyDailyReportController {
         }
     }
 
+    @GetMapping("/exportSingleWells")
+    @Operation(summary = "导出瑞鹰 日报 单井统计 Excel")
+    @PreAuthorize("@ss.hasPermission('pms:iot-ry-daily-report:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportSingleWells(@Valid IotRyDailyReportPageReqVO pageReqVO,
+                                            HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        // 根据查询参数筛选出 符合条件 的记录id 再传入 分页查询
+        Set<Long> projectIds = new HashSet<>();
+        Set<Long> taskIds = new HashSet<>();
+        if (StrUtil.isNotBlank(pageReqVO.getContractName())) {
+            IotProjectInfoPageReqVO reqVO = new IotProjectInfoPageReqVO();
+            reqVO.setContractName(pageReqVO.getContractName());
+            List<IotProjectInfoDO> projects = iotProjectInfoService.getIotProjectInfos(reqVO);
+            if (CollUtil.isNotEmpty(projects)) {
+                projects.forEach(project -> {
+                    projectIds.add(project.getId());
+                });
+                pageReqVO.setProjectIds(projectIds);
+            }
+        }
+        if (StrUtil.isNotBlank(pageReqVO.getTaskName())) {
+            IotProjectTaskPageReqVO reqVO = new IotProjectTaskPageReqVO();
+            reqVO.setSearchKey(pageReqVO.getTaskName());
+            List<IotProjectTaskDO> tasks = iotProjectTaskService.projectTasks(reqVO);
+            if (CollUtil.isNotEmpty(tasks)) {
+                tasks.forEach(task -> {
+                    taskIds.add(task.getId());
+                });
+                pageReqVO.setTaskIds(taskIds);
+            }
+        }
+        List<IotRyDailyReportDO> list = iotRyDailyReportService.teamReports(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "瑞鹰日报单井统计.xls", "瑞鹰日报单井统计数据", IotRyDailyReportRespVO.class,
+                buildSubtotalRyDailyReports(list, pageReqVO));
+    }
+
+    @GetMapping("/exportSingleTeams")
+    @Operation(summary = "导出瑞鹰 日报 单队伍 统计 Excel")
+    @PreAuthorize("@ss.hasPermission('pms:iot-ry-daily-report:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportSingleTeams(@Valid IotRyDailyReportPageReqVO pageReqVO,
+                                  HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        // 根据查询参数筛选出 符合条件 的记录id 再传入 分页查询
+        Set<Long> projectIds = new HashSet<>();
+        Set<Long> taskIds = new HashSet<>();
+        if (StrUtil.isNotBlank(pageReqVO.getContractName())) {
+            IotProjectInfoPageReqVO reqVO = new IotProjectInfoPageReqVO();
+            reqVO.setContractName(pageReqVO.getContractName());
+            List<IotProjectInfoDO> projects = iotProjectInfoService.getIotProjectInfos(reqVO);
+            if (CollUtil.isNotEmpty(projects)) {
+                projects.forEach(project -> {
+                    projectIds.add(project.getId());
+                });
+                pageReqVO.setProjectIds(projectIds);
+            }
+        }
+        if (StrUtil.isNotBlank(pageReqVO.getTaskName())) {
+            IotProjectTaskPageReqVO reqVO = new IotProjectTaskPageReqVO();
+            reqVO.setSearchKey(pageReqVO.getTaskName());
+            List<IotProjectTaskDO> tasks = iotProjectTaskService.projectTasks(reqVO);
+            if (CollUtil.isNotEmpty(tasks)) {
+                tasks.forEach(task -> {
+                    taskIds.add(task.getId());
+                });
+                pageReqVO.setTaskIds(taskIds);
+            }
+        }
+        List<IotRyDailyReportDO> list = iotRyDailyReportService.wellReports(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "瑞鹰日报单队伍统计.xls", "瑞鹰日报单队伍统计数据", IotRyDailyReportRespVO.class,
+                buildWellRyDailyReports(list, pageReqVO));
+    }
+
 }

+ 5 - 7
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrydailyreport/vo/IotRyDailyReportRespVO.java

@@ -32,6 +32,10 @@ public class IotRyDailyReportRespVO {
     @ExcelProperty("任务")
     private String taskName;
 
+    @Schema(description = "施工状态 对应的数据字典 label")
+    @ExcelProperty("施工状态")
+    private String constructionStatusName;
+
     @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "25152")
     private Long id;
 
@@ -148,21 +152,15 @@ public class IotRyDailyReportRespVO {
     private String otherNptReason;
 
     @Schema(description = "施工开始日期")
-    @ExcelProperty("施工开始日期")
     private LocalDateTime constructionStartDate;
 
     @Schema(description = "施工结束日期")
-    @ExcelProperty("施工结束日期")
     private LocalDateTime constructionEndDate;
 
     @Schema(description = "当日生产情况生产动态", example = "1")
-    @ExcelProperty("当日生产情况生产动态")
+    @ExcelProperty("当日生产动态")
     private String productionStatus;
 
-    @Schema(description = "施工状态 对应的数据字典 label")
-    @ExcelProperty("施工状态")
-    private String constructionStatusName;
-
     @Schema(description = "目前工序")
     @ExcelProperty("目前工序")
     private String currentOperation;

+ 232 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/vo/IotDeviceExportRespVO.java

@@ -0,0 +1,232 @@
+package cn.iocoder.yudao.module.pms.controller.admin.vo;
+
+import cn.iocoder.yudao.module.pms.controller.admin.iotdevicematerial.vo.IotDeviceMaterialRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotdevicerunlog.vo.IotDeviceRunLogRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotmaintenancebom.vo.IotMaintenanceBomRespVO;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Schema(description = "管理后台 - 保养查询 导出 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class IotDeviceExportRespVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "6797")
+    private Long id;
+
+    @Schema(description = "资产编码", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("设备编码")
+    private String deviceCode;
+
+    @Schema(description = "设备名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
+    @ExcelProperty("设备名称")
+    private String deviceName;
+
+    @Schema(description = "距离保养时间 单位可能是 H D KM")
+    @ExcelProperty("距离保养")
+    private String mainDistance;
+
+    @Schema(description = "品牌", requiredMode = Schema.RequiredMode.REQUIRED)
+    private Long brand;
+
+    @Schema(description = "规格型号")
+    private String model;
+
+    @Schema(description = "所在部门", requiredMode = Schema.RequiredMode.REQUIRED, example = "8581")
+    private Long deptId;
+
+    @Schema(description = "设备状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    private String deviceStatus;
+
+    @Schema(description = "设备状态 标签", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    @ExcelProperty("设备状态")
+    private String deviceStatusLabel;
+
+    @Schema(description = "工单状态 已生成工单未执行 未生成工单", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    @ExcelProperty("工单状态")
+    private String orderStatus;
+
+    @Schema(description = "资产性质", requiredMode = Schema.RequiredMode.REQUIRED)
+    private String assetProperty;
+
+    @Schema(description = "图片", example = "https://www.iocoder.cn")
+    private String picUrl;
+
+    @Schema(description = "备注", example = "你说的对")
+    private String remark;
+
+    @Schema(description = "制造商id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1695")
+    private Long manufacturerId;
+
+    @Schema(description = "供应商id", example = "18330")
+    private Long supplierId;
+
+    @Schema(description = "生产日期", requiredMode = Schema.RequiredMode.REQUIRED)
+    private LocalDateTime manDate;
+
+    @Schema(description = "铭牌信息")
+    private String nameplate;
+
+    @Schema(description = "质保到期")
+    private LocalDateTime expires;
+
+    @Schema(description = "采购/租赁价格", example = "14766")
+    private Integer plPrice;
+
+    @Schema(description = "采购/租赁日期")
+    private LocalDateTime plDate;
+
+    @Schema(description = "折旧年限")
+    private Integer plYear;
+
+    @Schema(description = "折旧开始日期")
+    private LocalDateTime plStartDate;
+
+    @Schema(description = "已提折旧月数")
+    private Integer plMonthed;
+
+    @Schema(description = "已提折旧金额")
+    private Double plAmounted;
+
+    @Schema(description = "剩余金额")
+    private Double remainAmount;
+
+    @Schema(description = "资料分类id", example = "5597")
+    private Long infoId;
+
+    @Schema(description = "资料类型", example = "1")
+    private String infoType;
+
+    @Schema(description = "资料名称", example = "王五")
+    private String infoName;
+
+    @Schema(description = "资料备注", example = "你说的对")
+    private String infoRemark;
+
+    @Schema(description = "资料附件", example = "https://www.iocoder.cn")
+    private String infoUrl;
+
+    @Schema(description = "动态模板信息")
+    private String templateJson;
+
+    @Schema(description = "资产类别")
+    private Long assetClass;
+    @Schema(description = "资产类别名称")
+    private String assetClassName;
+    @Schema(description = "创建时间")
+    private LocalDateTime createTime;
+    @Schema(description = "部门名称")
+    @ExcelProperty("部门名称")
+    private String deptName;
+    @Schema(description = "品牌型号")
+    private String brandName;
+    @Schema(description = "制造商名称")
+    private String zzName;
+    @Schema(description = "供应商名称")
+    private String supplierName;
+    @Schema(description = "规格名称")
+    private String modelName;
+
+    @Schema(description = "责任人")
+    private String chargeName;
+
+    /**
+     * 设备关联bom相关信息
+     */
+    @Schema(description = "bom节点id")
+    private String bomNodeId;
+    @Schema(description = "bom节点名称")
+    private String name;
+    @Schema(description = "bom节点编码 累计运行时长属性名称")
+    private String code;
+    @Schema(description = "bom节点类型 累计运行公里数属性名称")
+    private String type;
+    @Schema(description = "设备分类BOM同步状态 1已同步 0未同步")
+    private Integer bomSyncStatus;
+    @Schema(description = "当前设备是否已经配置了保养BOM")
+    private boolean hasSetMaintenanceBom = false;
+
+    /**
+     * 计算字段
+     */
+    @Schema(description = "设备累计运行里程")
+    private BigDecimal totalMileage;
+    @Schema(description = "设备累计运行时间")
+    private BigDecimal totalRunTime;
+    @Schema(description = "是否在线")
+    private Integer ifInline;
+
+    @Schema(description = "最后在线时间")
+    private String lastInlineTime;
+
+    @Schema(description = "负责人姓名 逗号分隔")
+    @ExcelProperty("责任人")
+    private String responsibleNames;
+
+    @Schema(description = "排序字段")
+    private Integer sortColumn;
+
+    @Schema(description = "保养工单id")
+    private String workOrderId;
+    @Schema(description = "保养计划id")
+    private String planId;
+
+    @Schema(description = "车辆id")
+    private Long carId;
+
+    @Schema(description = "经度")
+    private Double lng;
+    @Schema(description = "纬度")
+    private Double lat;
+    private String location;
+
+    /**
+     * 扩展属性
+     */
+    @Schema(description = "模板中涉及多个累计运转时长的属性集合")
+    private List<IotDeviceRunLogRespVO> timeAccumulatedAttrs;
+
+    @Schema(description = "模板中涉及多个累计运行公里数的属性集合")
+    private List<IotDeviceRunLogRespVO> mileageAccumulatedAttrs;
+
+    @Schema(description = "启用日期")
+    private String enableDate;
+
+    @Schema(description = "设备对应的 BOM分组 最短保养距离集合")
+    private List<IotMaintenanceBomRespVO> groupBomDistances;
+
+    @Schema(description = "生产厂家")
+    private String manufacturer;
+
+    @Schema(description = "根据设备保养项规则 应该生成保养工单 标识")
+    private boolean shouldWorkOrder = false;
+
+    @Schema(description = "存在正在执行中的保养工单 标识")
+    private boolean runningWorkOrder = false;
+
+    private String vehicleName;
+    private String assetOwnership;
+    private String useProject;
+
+    @Schema(description = "保养/维修项关联的设备bom物料列表")
+    private List<IotDeviceMaterialRespVO> deviceBomMaterials;
+
+    @Schema(description = "编码分类")
+    private String yfClass;
+
+    @Schema(description = "油服设备编码")
+    private String yfDeviceCode;
+    private String carOnline;
+    private String company;
+    private String project;
+
+    private String carNo;
+    private String address;
+    private String deviceNo;
+}

+ 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) {
         return selectList(new LambdaQueryWrapperX<IotMaintenanceBomDO>()
                 .eqIfPresent(IotMaintenanceBomDO::getPlanId, reqVO.getPlanId())
+                .inIfPresent(IotMaintenanceBomDO::getPlanId, reqVO.getPlanIds())
                 .neIfPresent(IotMaintenanceBomDO::getPlanId, reqVO.getNotPlanId())
                 .eqIfPresent(IotMaintenanceBomDO::getPlanDetailId, reqVO.getPlanDetailId())
                 .eqIfPresent(IotMaintenanceBomDO::getDeviceCategoryId, reqVO.getDeviceCategoryId())